Gudd-Head писал(а):Также, как и не на асемблере. Только не в прерывании.
поправлю чуток, задержек в прерываниях не делают.
Gudd-Head писал(а):Также, как и не на асемблере. Только не в прерывании.
GP1 писал(а):поправлю чуток, задержек в прерываниях не делают.
хорошо. а тогда такой вопрос - как грамотные люди осуществляют эту задержку на ассемблере?
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:
Код: Выделить всё
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
retGP1 писал(а):существуют различные способы, как правило конкретный метод определяется задачей, скажем определить факт нажатия - это одно, а различить короткое/длинное нажатие это совсем другое.
чаще всего кнопки опрашивают по прерываню таймера, но попадаются и по внешним прерываниям, но реже.
.. в тело прерывания по таймеру вставляете программный счетчик. Например таймер срабатывает каждые 2 мсек (500 Гц), тогда если счетчик = 25, то прошла 1/20 секунды (факт нажатия), дальше "мертвое время" и автоповтор если нужно...Necroteeth писал(а):кстати в таком случае с какой частотой стоит проверять кнопку?
Skyer писал(а):Процедура delayus осуществляет задержку на wiretemp десятков микросекунд. Где закралась ошибка? Процедуры задержки перепроверял, там все верно.
GP1 писал(а):Necroteeth
надеюсь предыдуший оратор все понятно изложил?
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Пока в голову не приходит ничего лучше, чем сравнивать прошлые 2 бита и новые 2 бита с константами (CPI с последующим BREQ на каждую константу) "0010", "1011", "1101" и "0100" в случае инкремента (условно); "0001", "0111", "1110" и "1000" в случае декремента.
Gudd-Head писал(а):Как с помощью МК определить направление вращения энкодера, покрасивее и покомпактнее?
Энкодер двухбитный в коде Грея, т.е. последовательность 00-10-11-01 в одну сторону и 00-01-11-10 в другую.
Пока в голову не приходит ничего лучше, чем сравнивать прошлые 2 бита и новые 2 бита с константами (CPI с последующим BREQ на каждую константу) "0010", "1011", "1101" и "0100" в случае инкремента (условно); "0001", "0111", "1110" и "1000" в случае декремента.
ploop писал(а):А если принимать значение в буферный регистр (как последовательный код) и сравнивать с его предыдущим значением, сдвинутым в право/влево с переносом (в закольцованном регистре)? В каком случае совпадёт, туда и движение.
eufs писал(а):Если непонятно - пиши, поясню на примере. Все получается не очень компактно(из-за таблицы), но очень быстро и просто и без условных переходв.
... тогда к чему вся эта "экономия" - даже решение "в лоб" прокатит ИМХО....Gudd-Head писал(а):...а бешеная скорость мне не нужна: по даташиту максимальная скорость вращения энкодера 100 об/мин.
... тогда к чему вся эта "экономия" - даже решение "в лоб" прокатит ИМХО....
... это понятно, но вначале надо написать рабочее, а "рацуха" уже после ... если необходимо ...ploop писал(а):Красивое, маленькое и быстрое решение всегда приятнее...