Страница 238 из 400
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Ср ноя 19, 2014 08:19:10
КРАМ
BOB51 писал(а):Прицепи внешний МК

Зачем?
Вывод на символьный дисплей - столь медленный процесс, что его СПОКОЙНО можно сделать фоновым и не мешающим основному, либо вообще оставить в суперлупе...
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Ср ноя 19, 2014 11:47:00
xkp
Alexeyslav, измерять нужно не частоту а время между импульсами. Сигнал уже висит на INT0. С переполнением можно проще разобраться: там где опрос счетчика значение $FF принимать как 0.
КРАМ, а можно поподробнее? С усреднением проблем нет. У меня для этого есть отдельная подпрограмма: беру предыдущее значение и умножаю на 9, прибавляю сюда текущее значение и делю на 10, так же учитывается и остаток, который пстепенно копится и тоже попадает под усреднение. Раньше остаток я игнорировал - были потери, потом доработал подпрограмму усреднения и потери исчезли.
BOB51, Внешний МК? тоже вариант, повесить tiny13, например. Такой вариант я тоже рассматриваю. Но сначала надо мне научится считать время между импульсами, а уже потом думать в какой МК влезет программа.
КРАМ, дисплей не символьный а графический.
Да еще в устройстве помимо того что уже есть скорее всего будет индикация на семисегментных светодиодных индикаторах, по нехватке выводов скорее всего схема будет статическо-динамической. Помимо индикации в программе еще будет куча расчетов и запись/чтение EEprom (энергонезависиой памяти). Так что время то может и не хватить на все задумки... Может и придется вешать внешний МК. Но это решим потом. Хотелось бы значало все таки посчитать это время на макетке...
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Ср ноя 19, 2014 12:22:16
BOB51
Как метод замера интервала...
Возможен вариант маркер-окошек - замер равными кусочками и фильтрация по вектору из полученного количества измеренных кусочков (если нужна быстрота и не слишком высокая точность измерений).
Т.е. получил активный сигнал на линии и запустил таймерок... отсчитал "кусманчик" проверил линию - если сигнал сохранился прибавил в указателе единичку и считаю снова. как сигнал не обнаружился - прекратил счет и прыгнул по вектору из указателя. Замер с точностью половинки длительности "кусочка". (я таким манером сортировал листики в счетчике копий на копире А3/А4/A4R все что не попало в заданный диапазон =брак)

Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Ср ноя 19, 2014 13:08:00
akl
xkp писал(а):сначала надо мне научится считать время между импульсами, а уже потом думать в какой МК влезет программа.
... Может и придется вешать внешний МК. Но это решим потом. Хотелось бы значало все таки посчитать это время на макетке...
По мне, решается одним таймером Т1, у которого разрешены прерывания CAPT_T1 и OVER_T1.
Выражение для определения периода
Tx=nox/Fo/N, где
nox-число тактов частоты
Fo за время измерения периода
(N=1),
N-целое число измеряемых периодов. Чтобы получить удобочитаемые значения лучше ввести в выражение множитель. При множителе 1'000'000, например, результат будет в микросекундах. По такому принципу работает
схема отсюда.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Ср ноя 19, 2014 16:26:47
КРАМ
xkp писал(а):
КРАМ, а можно поподробнее?
Можно.
Открываете даташит на Мегу 8:

И обнаруживаете искомое.
xkp писал(а):
КРАМ, дисплей не символьный а графический.
Это не важно. Полный цикл регенерации такого дисплея при статических изображениях типа вывода числовых величин достаточно проводить с частотой не выше 2...4 Гц.
ЗЫ. То что Вы предлагаете в качестве фильтра называется БИХ. БИХ при неправильном расчете может возбуждаться. КИХ на основе кольцевого буфера ест чуть больше памяти, но всегда абсолютно устойчив.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Ср ноя 19, 2014 20:25:24
Alexeyslav
измерять нужно не частоту а время между импульсами.
Вопрос на засыпку: какой интервал между импульсами у частоты 1Гц?
Если измерять время между фронтами то можно налажать - не всегда имеется на входе чистый меандр.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт ноя 20, 2014 17:50:07
xkp
форма сигнала - прямоугольник (либо 0, либо 1), ни каких меандров, ну сейчас опять начнете собирать что время нарастания и затухания сигнала и т.п., это не критично. И ваш вопрос про интервал на частоте 1 Гц немного не корректен. Оно и ежу... эм, коту понятно что на 1 Гц время составит 1 сек. А вот на 300 Гц время измерения в 1 секунду это очень много, поэтому и написано что измерять нужно время между импульсами
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт ноя 20, 2014 19:07:42
Alexeyslav
В наихудшем случае прибор будет измерять 1 секунду - какой смысл в более быстрых измерениях если он такой интервал терпит?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт ноя 20, 2014 20:05:59
BOB51
Возможна изначально перегруженная основная программа, в которую "встраивается" дополнительная функция. В такой ситуации переписывать все заново с перепланировкой аппаратных ресурсов и программных алгоритмов весьма непросто. Зато такая ситуация чем дальше, тем чаще встречаться будет...

Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт ноя 20, 2014 21:52:27
КРАМ
Alexeyslav писал(а):В наихудшем случае прибор будет измерять 1 секунду - какой смысл в более быстрых измерениях если он такой интервал терпит?
А разрешение и точность будут разные...

Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пт ноя 21, 2014 18:59:34
Vicont
Мяу, товарищи!
Помогите, пожалуйста, разобраться в непонятном вопросе.
Читаю в даташите на МК про регистры флагов прерываний следующие тезисы:
1) Изначально во всех флаговых битах прописаны нули;
2) Когда происходит вызов прерывания, то соответствующий флаг устанавливается в 1, и МК переходит к Соответствующему Вектору Прерывания;
3) Этот флаг очищается аппаратно после выхода из подпрограммы обработки прерывания
(то есть возвращается в лог.0 ?! Верно?);
4) Этот Флаг, также, может быть очищен записью в него лог.1
Но у мя ни как не укладывается в голове:
-
Почему флаги прерываний очищаются записью лог.1 (!!!), а не лог. 0 ???
- Ведь если программно установить флаг в лог 1, разве не должен быть автоматический переход к соответствующему вектору?
P.S. Среди смайликов нашего форума, явно не хватает анимации котика, бьющегося головой об стену, который точно описал бы мое эмоциональное состояние...
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пт ноя 21, 2014 19:29:49
xkp
Решено делать как предлагалось выше на основе модуля capture. Но что то не получается...
Спойлер
Код: Выделить всё
.INCLUDE "m8DEF.INC"
.def tmp=r16
.def tmp0=r17
.cseg
;INTERRUPT VECTORS
rjmp reset ; Reset Handler
reti; rjmp EXT_INT0 ; IRQ0 Handler
reti ; rjmp EXT_INT1 ; IRQ1 Handler
reti ;rjmp TIM2_COMP ; Timer2 Compare Handler
reti ;rjmp TIM2_OVF ; Timer2 Overflow Handler
rjmp TIM1_CAPT ;Timer1 Capture Handler
reti ;rjmp TIM1_COMPA ; Timer1 CompareA Handler
reti ;rjmp TIM1_COMPB ; Timer1 CompareB Handler
reti ;rjmp TIMPINC 4 191_OVF ;Timer1 Overflow Handler
reti; rjmp look ;tim0_ovf ; Timer0 Overflow Handler
reti ;rjmp SPI_STC ; SPI Transfer Complete Handler
reti ;rjmp USART_RXC ; USART RX Complete Handler
reti ;rjmp USART_UDRE ; UDR Empty Handler
reti ;rjmp USART_TXC ; USART TX Complete Handler
reti ;rjmp ADC_inc ; ADC Conversion Complete Handler
reti ;rjmp EE_RDY ; EEPROM Ready Handler
reti ;rjmp ANA_COMP ; Analog Comparator Handler
reti ;rjmp TWSI ; Two-wire Serial Interface Handler
reti ;rjmp SPM_RDY ; Store Program Memory Ready Handler
RESET:
ldi tmp,low(RAMEND)
out spl,tmp
ldi tmp,high(RAMEND)
out sph,tmp
ldi tmp,(1<<ticie1)
out timsk,tmp
ldi tmp,(0<<icnc1)|(1<<ices1)
out tccr1b,tmp
ldi tmp,0b00000000
out ddrb,tmp
ldi tmp,0b00000000
out portb,tmp
sei
main:
rjmp main
TIM1_CAPT:
push tmp ;сохраняем данные
push tmp0 ;которые можем потерять
in tmp,sreg ;tmp, tmp0,
push tmp ;sreg
pop tmp ;восстанавливаем ранее
out sreg,tmp ;сохранённые данные
pop tmp0 ;в обратном порядке
pop tmp ;sreg,tmp,tmp0
reti
.exit
По нарастающиму фронту сигнала на ICP (PINB0), происходит срабатывание прерывания (о чем можно судить по "прыжку" программы на метку TIM1_CAPT:). Но регистр ICR1 (ICR1H:ICR1L) остается пустым...
Что не так в коде инициализации прерываний?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пт ноя 21, 2014 19:54:29
Kavka
Vicont писал(а):Но у мя ни как не укладывается в голове:
-
Почему флаги прерываний очищаются записью лог.1 (!!!), а не лог. 0 ???
- Ведь если программно установить флаг в лог 1, разве не должен быть автоматический переход к соответствующему вектору?
Потому что это не обычный регистр из которого читается то, что туда было записано.
Запись обрабатывается специальным образом на чипе.
Переход по вектору зависит не от того, что ты записываешь в этот регистр, а от содержания соответствующего бита, реального бита. А оный сбросится при записи "1" - так особым образом обрабатывается запись этого бита.
Просто такая особенность.
Разработчики так захотели

Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пт ноя 21, 2014 19:59:34
xkp
ну так а как мне сделать то что я хочу? как прочитать этот регистр?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пт ноя 21, 2014 20:15:11
Kavka
Читается как обычно, с помощью команд IN или LDS .
А в чём загвоздка, собственно?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пт ноя 21, 2014 20:31:41
Vicont
Kavka писал(а):
Потому что это не обычный регистр из которого читается то, что туда было записано.
Запись обрабатывается специальным образом на чипе.
Разработчики так захотели

Спасибо. В даташитах таких подробностей не пишут.
А можно ли флаговые биты как-нибудь установить программно, чтобы выполнения некой команды, произошел переход по вектору прерывания, без наступления соответствующего события?
Или же, из-за особенностей таких регистров, установка битов происходит ТОЛЬКО при наступления некого события?
P.S. Хотя... Если подумать, то тоже самое можно реализовать просто, непосредственно вызвав обработчик прерывания командой
rcall, вообще не обращаясь к регистру флагов и векторам, как к посредникам...

Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пт ноя 21, 2014 20:42:39
xkp
наверное я не правильно вопрос задал. как читать то я знаю. но в регистре значение $0000. Как сделать что бы в регистр записывалось значение счетчика (наверное счетчика)?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пт ноя 21, 2014 20:53:05
Kavka
xkp писал(а):Но регистр ICR1 (ICR1H:ICR1L) остается пустым...
Читаете сначала ICR1L, потом ICR1H? Иначе результат непредсказуем.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пт ноя 21, 2014 20:54:57
xkp
Я пока их не читал. Запустил программу (ту что выше в спойлере) в эмуляторе АВРстудии. При наступлении прерывания регистр остается пустым.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пт ноя 21, 2014 20:55:58
Vicont
xkp, еще я обратил внимание, что в Вашем исходном коде определен только 1 РОН - .def tmp=r16, хотя далее встречается некая переменная tmp0, которую без инициализации компилятор не переварит.