Ассемблер (ASM) для AVR в вопросах и ответах
Как простой выход из ситуации - перед сном прерывание разрешать, а после сна запрещать.
- Реклама
тогда с какого хера он проснулся?Alexeyslav писал(а):если кнопка не нажата
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
От помехи, например.
- Сообщения: 3342
- Зарегистрирован: Ср янв 02, 2013 08:37:35
[uquote="Demiurg",url="/forum/viewtopic.php?p=3322287#p3322287"]Уточнение, прерывание, которое настроено на низкий уровень.[/uquote]
Это и так понятно, так как другие варианты не разбудят МК.
Это и так понятно, так как другие варианты не разбудят МК.
Почему не разбудят? Уточнения же небыло что это сон с отключением тактового генератора.
- Реклама
- Сообщения: 3342
- Зарегистрирован: Ср янв 02, 2013 08:37:35
Потому что в 90% случаях режим сна используется для экономии энергопотребления в мобильных устройствах, а это PowerDown…
Добрый день, у меня похожая ситуация с кнопкой.
Решил испробовать прерывание PCINT у Attiny13A, и написал простенькую программу с кнопкой (с PB3 на общий, и подтяжка 47К сверху) и светодиод с PB0 на общий.
Поскольку, PCINT это прерывание по смене состояния вывода, решил сделать так. Для борьбы с дребезгом, при в ходе в прерывание запрещаются прерывания, и запускается задержка на 50 мс, пока кнопка дребезжит. Далее, проверяется состояние кнопки, и если кнопка нажата (PB3 = 0), происходит выход, и возврат в главный цикл. Когда кнопка отпускается, происходит новое прерывание, но так как кнопка отжата (PB3=1), происходит переход на выполнение команд смены состояния выхода.
Выглядит все красиво, но на практике не работает. Точнее, работает еще хуже, чем если вообще никак не бороться с дребезгом. Однако, если "нажимать кнопку" от источника без дребезга (генератор на другом МК), то все работает идеально, и в связи с этим подозреваю что, либо по каким-то причинам не отрабатывает задержка, либо при нажатии или отпускании кнопки происходит больше чем одно прерывание, которое МК откладывает "на потом". Об этом говорит то, что если сделать большую задержку (1сек), то при нажатии на кнопку, светодиод загорается на секунду и гаснет.
Никак не могу понять что с этим делать, помогите разобраться. Может, просто элементарно ступил где-то.
Решил испробовать прерывание PCINT у Attiny13A, и написал простенькую программу с кнопкой (с PB3 на общий, и подтяжка 47К сверху) и светодиод с PB0 на общий.
Поскольку, PCINT это прерывание по смене состояния вывода, решил сделать так. Для борьбы с дребезгом, при в ходе в прерывание запрещаются прерывания, и запускается задержка на 50 мс, пока кнопка дребезжит. Далее, проверяется состояние кнопки, и если кнопка нажата (PB3 = 0), происходит выход, и возврат в главный цикл. Когда кнопка отпускается, происходит новое прерывание, но так как кнопка отжата (PB3=1), происходит переход на выполнение команд смены состояния выхода.
Выглядит все красиво, но на практике не работает. Точнее, работает еще хуже, чем если вообще никак не бороться с дребезгом. Однако, если "нажимать кнопку" от источника без дребезга (генератор на другом МК), то все работает идеально, и в связи с этим подозреваю что, либо по каким-то причинам не отрабатывает задержка, либо при нажатии или отпускании кнопки происходит больше чем одно прерывание, которое МК откладывает "на потом". Об этом говорит то, что если сделать большую задержку (1сек), то при нажатии на кнопку, светодиод загорается на секунду и гаснет.
Никак не могу понять что с этим делать, помогите разобраться. Может, просто элементарно ступил где-то.
- Вложения
-
- PCINT_check.asm
- (1.55 КБ) 250 скачиваний
Трудное детство, стальные игрушки.
1. Сохранить при входе в прерывание SREG и R17..R19 (при необходимости)
2. Очистить запрос на прерывание PCIF в GIFR
2. Очистить запрос на прерывание PCIF в GIFR
[uquote="trofim2",url="/forum/viewtopic.php?p=3324165#p3324165"]1. Сохранить при входе в прерывание SREG и R17..R19 (при необходимости)
2. Очистить запрос на прерывание PCIF в GIFR[/uquote]
Нет, не помогает
2. Очистить запрос на прерывание PCIF в GIFR[/uquote]
Нет, не помогает
Трудное детство, стальные игрушки.
[uquote="Голимый",url="/forum/viewtopic.php?p=3324191#p3324191"][uquote="trofim2",url="/forum/viewtopic.php?p=3324165#p3324165"]2. Очистить запрос на прерывание PCIF в GIFR[/uquote]
Нет, не помогает[/uquote]
При выходе из прерывания
Нет, не помогает[/uquote]
При выходе из прерывания
Ответили выше, удалил.
Последний раз редактировалось akl Вт мар 06, 2018 14:13:01, всего редактировалось 1 раз.
[uquote="trofim2",url="/forum/viewtopic.php?p=3324200#p3324200"]При выходе из прерывания[/uquote]
Спасибо, все работает.
Простите, вы не могли бы объяснить почему есть разница в каком месте обработчика происходит сброс флага?
Спасибо, все работает.
Простите, вы не могли бы объяснить почему есть разница в каком месте обработчика происходит сброс флага?
Трудное детство, стальные игрушки.
При входе в прерывание флаг сбрасывается автоматически, но если прерывание длительное, возможно повторное взведение флага при наличии дребезга во время выполнение прерывания.
в комментарии перепутаны вход с выходом:
ldi temp, (1<<PB0)|(0<<PB3) ;PB0 - вход, PB3 - выход
int_isr: cli ;Запрет прерываний
когда МК находится в прерывании, ВСЕ прерывания и так уже запрещены. лишняя команда.
return: sei ;Разрешение прерываний
reti ;Выход
reti разрешает прерывания, дополнительно их разрешать не надо. опять лишняя команда.
не знаю, как ты считал задержку, но у меня там никак не получается 50 мс...
навскидку, не вижу причин, чтобы не работало.
ldi temp, (1<<PB0)|(0<<PB3) ;PB0 - вход, PB3 - выход
int_isr: cli ;Запрет прерываний
когда МК находится в прерывании, ВСЕ прерывания и так уже запрещены. лишняя команда.
return: sei ;Разрешение прерываний
reti ;Выход
reti разрешает прерывания, дополнительно их разрешать не надо. опять лишняя команда.
не знаю, как ты считал задержку, но у меня там никак не получается 50 мс...
навскидку, не вижу причин, чтобы не работало.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
[uquote="Starichok51",url="/forum/viewtopic.php?p=3324524#p3324524"]в комментарии перепутаны вход с выходом:
ldi temp, (1<<PB0)|(0<<PB3) ;PB0 - вход, PB3 - выход[/uquote]
Да, действительно ошибся.
ldi temp, (1<<PB0)|(0<<PB3) ;PB0 - вход, PB3 - выход[/uquote]
Да, действительно ошибся.
Я слышал о таком, но оставил на всякий случай. Вдруг, чего-то не так услышал.когда МК находится в прерывании, ВСЕ прерывания и так уже запрещены. лишняя команда.
reti разрешает прерывания, дополнительно их разрешать не надо. опять лишняя команда.
Считала программа, я сам весьма туманно представляю как такое рассчитывается. Но скажем, секундные задержки вполне адекватны.не знаю, как ты считал задержку, но у меня там никак не получается 50 мс...
Трудное детство, стальные игрушки.
какая программа считала задержку? и какую тактовую частоту ты задавал этой программе?
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Частота 9 600 000, CKDIV8 выключен.
Программа вот эта
Программа вот эта
- Вложения
-
- avr_loop.PNG
- (9.51 КБ) 588 скачиваний
Трудное детство, стальные игрушки.
Ассемблер сам справляется с такими примитивами.
Спойлер
Код: Выделить всё
;----- Подпрограмма задержки -----
.equ Fo=9600000
;<442 сек
DELAY_ms:
LDI R17,BYTE4(50*Fo/1000/6-1)
LDI R18,BYTE3(50*Fo/1000/6-1)
LDI R19,BYTE2(50*Fo/1000/6-1)
LDI R20,BYTE1(50*Fo/1000/6-1)
LOOP_ms:
SUBI R20,BYTE1(1)
SBCI R19,BYTE2(1)
SBCI R18,BYTE3(1)
SBCI R17,BYTE4(1)
BRNE LOOP_ms
RET
;<1,7 сек
DELAY_us:
LDI R17,BYTE3(50*Fo/1000000/5-1)
LDI R18,BYTE2(50*Fo/1000000/5-1)
LDI R19,BYTE1(50*Fo/1000000/5-1) ;50us
LOOP_us:
SUBI R19,BYTE1(1)
SBCI R18,BYTE2(1)
SBCI R17,BYTE3(1)
BRNE LOOP_us
RET
;<6,8 мсек
DEL_us:
LDI R18,BYTE2(50*Fo/1000000/4-2)
LDI R19,BYTE1(50*Fo/1000000/4-2) ;50us
LP:
SUBI R19,BYTE1(1)
SBCI R18,BYTE2(1)
BRNE LP
RET
Это не ассемблер справляется, а препроцессор.
Спойлер
- Вложения
-
- avrasm32.PNG
- (22.71 КБ) 460 скачиваний


