поправлю чуток, задержек в прерываниях не делают.Gudd-Head писал(а): Также, как и не на асемблере. Только не в прерывании.
Ассемблер (ASM) для AVR в вопросах и ответах
- Реклама
Я это и имел в видуGP1 писал(а):поправлю чуток, задержек в прерываниях не делают.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Грамотные люди паяют кондёр на 0,1мкФ параллельно кнопке, и забывают про них. А когда действительно понадобится обработать дребезг, у них уже будет накоплен опыт программирования, и проблем это не составит.хорошо. а тогда такой вопрос - как грамотные люди осуществляют эту задержку на ассемблере?
Я делаю так (на каждую кнопку)
1. флаг нажатия (устанавливается при нажатии)
2. флаг необходимости действия при нажатии
3. Флаг необходимости действия при отпускании
4. Счетчик антидребезга (регистр, память, не важно)
Далее при опросе кнопок такой алгоритм: проверяем флаг нажатия, если небыло и кнопка нажата - увеличиваем счетчик. Как досчитает - ставим флаг действия по нажатию. При отпускании - снимаем флаг нажатия и устанавливаем флаг действия по отпусканию.
Флаги действий снимаются (или нет для повторяющихся действий) уже в обработчике этих действий.
Такой простенький флаговый автомат. Звучит сложно, но на самом деле работает быстро, надёжно, и, самое главное, писать дальнейший код просто приятно - проверяй флаги действий и всё.
во! отличная мысль! спасибо!ploop писал(а): алгоритм: проверяем флаг нажатия, если небыло и кнопка нажата - увеличиваем счетчик. Как досчитает - ставим флаг действия по нажатию.
кондер на той макетке уже некуда лепить, поэтому хотел программно
Пример кода (без счетчика, я кондёры люблю
Куда добавить догадаетесь)
Код: Выделить всё
; rx1 - флаги нажатия кнопок
; rx2 - флаги действий. Младшие 4 бита - действий по нажатию, старшие - по отпусканию.
; как раз один регистр на 4 кнопки.
sbic btn1_pin,btn1_bit
rjmp bt01 ; если кнопка нажата
sbrc rx1,3 ; проверяем, была ли она нажата ранее
rjmp bt02 ; если да - выходим
ori rx2,(1<<3) ; если нет - устанавливаем действие по нажатию
ori rx1,(1<<3) ; и факт нажатия
rjmp bt02
bt01: ; если не нажата
sbrs rx1,3 ; и не была нажата ранее
rjmp bt02 ; выходим
andi rx1,~(1<<3) ; иначе сбрасываем факт нажатия
ori rx2,(1<<7) ; ставим действие по отпусканию
bt02:
- Реклама
- Сообщения: 31
- Зарегистрирован: Пт фев 18, 2011 20:37:34
Здравствуйте. В очередной раз прошу помощи с инициализацией датчика DS18B20 на асме. Где здесь может быть ошибка?
Процедура delayus осуществляет задержку на wiretemp десятков микросекунд. Где закралась ошибка? Процедуры задержки перепроверял, там все верно.
Код: Выделить всё
Init_1W:
cbi wireport, wirebit ; 0->DDR = Z
sbis wirepin, wirebit
rjmp presence_fault
sbi wireport, wirebit
ldi wiretemp, 49
rcall delayus
cbi wireport, wirebit
ldi wiretemp, 6
rcall delayus
ldi wiretemp, 250
presence_wait:
sbis wirepin, wirebit
rjmp presence_ok
rcall delay1us
dec wiretemp
brne presence_wait
presence_fault:
clz
ldi wiretemp,0b10000000
out PortC,wiretemp
ret
presence_ok:
sez
ldi wiretemp, 48
rcall delayus
retПроцедура delayus осуществляет задержку на wiretemp десятков микросекунд. Где закралась ошибка? Процедуры задержки перепроверял, там все верно.
кстати в таком случае с какой частотой стоит проверять кнопку? я все-таки решил переделать программу, чтобы INT0 вообще не использовалсяGP1 писал(а):существуют различные способы, как правило конкретный метод определяется задачей, скажем определить факт нажатия - это одно, а различить короткое/длинное нажатие это совсем другое.
чаще всего кнопки опрашивают по прерываню таймера, но попадаются и по внешним прерываниям, но реже.
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
.. в тело прерывания по таймеру вставляете программный счетчик. Например таймер срабатывает каждые 2 мсек (500 Гц), тогда если счетчик = 25, то прошла 1/20 секунды (факт нажатия), дальше "мертвое время" и автоповтор если нужно...Necroteeth писал(а):кстати в таком случае с какой частотой стоит проверять кнопку?
Necroteeth
надеюсь предыдуший оратор все понятно изложил?
Skyer
Почему вы думаете
что если вам лень писать коменты, то у остальных возникнет желание разбирать ваш кривой код?
надеюсь предыдуший оратор все понятно изложил?
Skyer
Почему вы думаете
что если вам лень писать коменты, то у остальных возникнет желание разбирать ваш кривой код?
Время на команды перехода и т.п. тоже учли?Skyer писал(а):Процедура delayus осуществляет задержку на wiretemp десятков микросекунд. Где закралась ошибка? Процедуры задержки перепроверял, там все верно.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
если честно, то не очень...GP1 писал(а):Necroteeth
надеюсь предыдуший оратор все понятно изложил?
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
Necroteeth писал(а):если честно, то не очень...
Код: Выделить всё
.equ cnt = r16
......
timer_ovf:
push ....
push ....
ldi TCNT0,... ; перезагрузка таймера
............
sbis PINx,X ; кнопка нажата?
rjmp press_key
;нет нажатия - сброс счетчика
clr cnt
rjmp no_time
press_key:
inc cnt
cpi cnt,25 ; время удержания вышло?
brne no_time
; фиксируем факт нажатия
........
no_time:
pop ...
pop ...
retiКак с помощью МК определить направление вращения энкодера, покрасивее и покомпактнее?
Энкодер двухбитный в коде Грея, т.е. последовательность 00-10-11-01 в одну сторону и 00-01-11-10 в другую.
Пока в голову не приходит ничего лучше, чем сравнивать прошлые 2 бита и новые 2 бита с константами (CPI с последующим BREQ на каждую константу) "0010", "1011", "1101" и "0100" в случае инкремента (условно); "0001", "0111", "1110" и "1000" в случае декремента.
Энкодер двухбитный в коде Грея, т.е. последовательность 00-10-11-01 в одну сторону и 00-01-11-10 в другую.
Пока в голову не приходит ничего лучше, чем сравнивать прошлые 2 бита и новые 2 бита с константами (CPI с последующим BREQ на каждую константу) "0010", "1011", "1101" и "0100" в случае инкремента (условно); "0001", "0111", "1110" и "1000" в случае декремента.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
А если принимать значение в буферный регистр (как последовательный код) и сравнивать с его предыдущим значением, сдвинутым в право/влево с переносом (в закольцованном регистре)? В каком случае совпадёт, туда и движение.Пока в голову не приходит ничего лучше, чем сравнивать прошлые 2 бита и новые 2 бита с константами (CPI с последующим BREQ на каждую константу) "0010", "1011", "1101" и "0100" в случае инкремента (условно); "0001", "0111", "1110" и "1000" в случае декремента.
1. Предыдущую и текущую комбинацию объединяем в одно слово.Gudd-Head писал(а):Как с помощью МК определить направление вращения энкодера, покрасивее и покомпактнее?
Энкодер двухбитный в коде Грея, т.е. последовательность 00-10-11-01 в одну сторону и 00-01-11-10 в другую.
Пока в голову не приходит ничего лучше, чем сравнивать прошлые 2 бита и новые 2 бита с константами (CPI с последующим BREQ на каждую константу) "0010", "1011", "1101" и "0100" в случае инкремента (условно); "0001", "0111", "1110" и "1000" в случае декремента.
2. Для полученных кодов делаем табличку. То есть, полученный код - адрес в таблице. Данные в таблице по тем адресам, которые соответствуют приращению константы, которую крутим энкодером - 01, которые соответствуют уменьшению - $ff, по остальным адресам нули.
3. Все. По прерыванию(или еще как-то) считываем значение с порта на котором висит энкодер. Получаем элемент таблицы. константу которую крутим суммируем (add) с элементом таблицы.
Если непонятно - пиши, поясню на примере. Все получается не очень компактно(из-за таблицы), но очень быстро и просто и без условных переходв.
C0FFEE=12648430
Думал о закольцованом регистре, но т.к. он закольцован через бит С, регистр получается кагбэ девятибитнымploop писал(а):А если принимать значение в буферный регистр (как последовательный код) и сравнивать с его предыдущим значением, сдвинутым в право/влево с переносом (в закольцованном регистре)? В каком случае совпадёт, туда и движение.
Тогда таблицу придётся делать для всех возможных комбинаций, т.е. 2^4 = 16 байт для хранения, по сути, всего двух бит (0 или ±1). Как-то нерационально, а бешеная скорость мне не нужна: по даташиту максимальная скорость вращения энкодера 100 об/мин.eufs писал(а):Если непонятно - пиши, поясню на примере. Все получается не очень компактно(из-за таблицы), но очень быстро и просто и без условных переходв.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- Сообщения: 10
- Зарегистрирован: Чт апр 14, 2011 12:41:50
Привет всем... есть два вопроса 
вопрос номер раз:
имеется времянка(в аттаче)... имеется стк500(атмега16)... задание таково..необходимо сделать такие временные диаграммы и показать их с помощью спец. девайса(логического анализатора), то есть атмега должна эмулировать сигналы видеокамеры(такое вот заданице)... в общем то не могу понять как мне это организовать... как быть с clk... если есть у кого время... помогите пожалуйста разобраться... это важно...
ну а второй вопрос...
Необходимо разработать микропроцессорное устройство, в котором микроконтроллер непрерывно генерирует периодический сигнал с периодом T и длительностью импульса t машинных циклов. Во время выполнения этой задачи МК реагирует на прерывания двух типов. Обработчик каждого из прерываний подсчитывает количество прерываний данного типа и, когда оно достигает шести, запрещает прерывание от данного источника. На время обработки прерывания генерация сигнала приостанавливается.
Период импульса Т 1100 машинных циклов (305 мкс*)
Длительность импульса t 340 машинных циклов (94 мкс*)
Источники прерывания
Запрос на прерывание от внешнего источника INT0
Запрос на прерывание от внутреннего источника INT1
исходник добавил... но не могу понять как он работает... и работает ли... проверить на анализаторе его временно не могу... поэтому если есть возможность ответьте плиз
вопрос номер раз:
имеется времянка(в аттаче)... имеется стк500(атмега16)... задание таково..необходимо сделать такие временные диаграммы и показать их с помощью спец. девайса(логического анализатора), то есть атмега должна эмулировать сигналы видеокамеры(такое вот заданице)... в общем то не могу понять как мне это организовать... как быть с clk... если есть у кого время... помогите пожалуйста разобраться... это важно...
ну а второй вопрос...
Необходимо разработать микропроцессорное устройство, в котором микроконтроллер непрерывно генерирует периодический сигнал с периодом T и длительностью импульса t машинных циклов. Во время выполнения этой задачи МК реагирует на прерывания двух типов. Обработчик каждого из прерываний подсчитывает количество прерываний данного типа и, когда оно достигает шести, запрещает прерывание от данного источника. На время обработки прерывания генерация сигнала приостанавливается.
Период импульса Т 1100 машинных циклов (305 мкс*)
Длительность импульса t 340 машинных циклов (94 мкс*)
Источники прерывания
Запрос на прерывание от внешнего источника INT0
Запрос на прерывание от внутреннего источника INT1
исходник добавил... но не могу понять как он работает... и работает ли... проверить на анализаторе его временно не могу... поэтому если есть возможность ответьте плиз
- Вложения
-
- ccc.txt
- (1.63 КБ) 171 скачивание
-
- vremyanka.JPG
- (25.02 КБ) 435 скачиваний
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
... тогда к чему вся эта "экономия" - даже решение "в лоб" прокатит ИМХО....Gudd-Head писал(а):...а бешеная скорость мне не нужна: по даташиту максимальная скорость вращения энкодера 100 об/мин.
Красивое, маленькое и быстрое решение всегда приятнее, чем "в лоб"... тогда к чему вся эта "экономия" - даже решение "в лоб" прокатит ИМХО....
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
... это понятно, но вначале надо написать рабочее, а "рацуха" уже после ... если необходимо ...ploop писал(а):Красивое, маленькое и быстрое решение всегда приятнее...



