Ассемблер (ASM) для AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Ответить
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Как простой выход из ситуации - перед сном прерывание разрешать, а после сна запрещать.
Контактная информация:
Реклама
Модератор
Аватара пользователя
Сообщения: 19100
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Сообщение Starichok51 »

Alexeyslav писал(а):если кнопка не нажата
тогда с какого хера он проснулся?
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Реклама
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

От помехи, например.
Контактная информация:
Друг Кота
Сообщения: 3342
Зарегистрирован: Ср янв 02, 2013 08:37:35

Сообщение АСУ »

[uquote="Demiurg",url="/forum/viewtopic.php?p=3322287#p3322287"]Уточнение, прерывание, которое настроено на низкий уровень.[/uquote]
Это и так понятно, так как другие варианты не разбудят МК.
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Почему не разбудят? Уточнения же небыло что это сон с отключением тактового генератора.
Контактная информация:
Реклама
Друг Кота
Сообщения: 3342
Зарегистрирован: Ср янв 02, 2013 08:37:35

Сообщение АСУ »

Потому что в 90% случаях режим сна используется для экономии энергопотребления в мобильных устройствах, а это PowerDown…
Реклама
Встал на лапы
Сообщения: 117
Зарегистрирован: Пн дек 08, 2014 19:45:24
Откуда: Воронеж

Сообщение Голимый »

Добрый день, у меня похожая ситуация с кнопкой.
Решил испробовать прерывание PCINT у Attiny13A, и написал простенькую программу с кнопкой (с PB3 на общий, и подтяжка 47К сверху) и светодиод с PB0 на общий.
Поскольку, PCINT это прерывание по смене состояния вывода, решил сделать так. Для борьбы с дребезгом, при в ходе в прерывание запрещаются прерывания, и запускается задержка на 50 мс, пока кнопка дребезжит. Далее, проверяется состояние кнопки, и если кнопка нажата (PB3 = 0), происходит выход, и возврат в главный цикл. Когда кнопка отпускается, происходит новое прерывание, но так как кнопка отжата (PB3=1), происходит переход на выполнение команд смены состояния выхода.
Выглядит все красиво, но на практике не работает. Точнее, работает еще хуже, чем если вообще никак не бороться с дребезгом. Однако, если "нажимать кнопку" от источника без дребезга (генератор на другом МК), то все работает идеально, и в связи с этим подозреваю что, либо по каким-то причинам не отрабатывает задержка, либо при нажатии или отпускании кнопки происходит больше чем одно прерывание, которое МК откладывает "на потом". Об этом говорит то, что если сделать большую задержку (1сек), то при нажатии на кнопку, светодиод загорается на секунду и гаснет.
Никак не могу понять что с этим делать, помогите разобраться. Может, просто элементарно ступил где-то.
Вложения
PCINT_check.asm
(1.55 КБ) 250 скачиваний
Трудное детство, стальные игрушки.
Встал на лапы
Сообщения: 106
Зарегистрирован: Чт сен 10, 2015 06:59:03
Откуда: Гродно, BY

Сообщение trofim2 »

1. Сохранить при входе в прерывание SREG и R17..R19 (при необходимости)
2. Очистить запрос на прерывание PCIF в GIFR
Встал на лапы
Сообщения: 117
Зарегистрирован: Пн дек 08, 2014 19:45:24
Откуда: Воронеж

Сообщение Голимый »

[uquote="trofim2",url="/forum/viewtopic.php?p=3324165#p3324165"]1. Сохранить при входе в прерывание SREG и R17..R19 (при необходимости)
2. Очистить запрос на прерывание PCIF в GIFR[/uquote]
Нет, не помогает
Трудное детство, стальные игрушки.
Встал на лапы
Сообщения: 106
Зарегистрирован: Чт сен 10, 2015 06:59:03
Откуда: Гродно, BY

Сообщение trofim2 »

[uquote="Голимый",url="/forum/viewtopic.php?p=3324191#p3324191"][uquote="trofim2",url="/forum/viewtopic.php?p=3324165#p3324165"]2. Очистить запрос на прерывание PCIF в GIFR[/uquote]
Нет, не помогает[/uquote]
При выходе из прерывания
akl
Друг Кота
Сообщения: 4470
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Ответили выше, удалил.
Последний раз редактировалось akl Вт мар 06, 2018 14:13:01, всего редактировалось 1 раз.
Встал на лапы
Сообщения: 117
Зарегистрирован: Пн дек 08, 2014 19:45:24
Откуда: Воронеж

Сообщение Голимый »

[uquote="trofim2",url="/forum/viewtopic.php?p=3324200#p3324200"]При выходе из прерывания[/uquote]

Спасибо, все работает.
Простите, вы не могли бы объяснить почему есть разница в каком месте обработчика происходит сброс флага?
Трудное детство, стальные игрушки.
Встал на лапы
Сообщения: 106
Зарегистрирован: Чт сен 10, 2015 06:59:03
Откуда: Гродно, BY

Сообщение trofim2 »

При входе в прерывание флаг сбрасывается автоматически, но если прерывание длительное, возможно повторное взведение флага при наличии дребезга во время выполнение прерывания.
Модератор
Аватара пользователя
Сообщения: 19100
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Сообщение Starichok51 »

в комментарии перепутаны вход с выходом:
ldi temp, (1<<PB0)|(0<<PB3) ;PB0 - вход, PB3 - выход

int_isr: cli ;Запрет прерываний
когда МК находится в прерывании, ВСЕ прерывания и так уже запрещены. лишняя команда.

return: sei ;Разрешение прерываний
reti ;Выход
reti разрешает прерывания, дополнительно их разрешать не надо. опять лишняя команда.

не знаю, как ты считал задержку, но у меня там никак не получается 50 мс...

навскидку, не вижу причин, чтобы не работало.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Встал на лапы
Сообщения: 117
Зарегистрирован: Пн дек 08, 2014 19:45:24
Откуда: Воронеж

Сообщение Голимый »

[uquote="Starichok51",url="/forum/viewtopic.php?p=3324524#p3324524"]в комментарии перепутаны вход с выходом:
ldi temp, (1<<PB0)|(0<<PB3) ;PB0 - вход, PB3 - выход[/uquote]
Да, действительно ошибся.
когда МК находится в прерывании, ВСЕ прерывания и так уже запрещены. лишняя команда.
reti разрешает прерывания, дополнительно их разрешать не надо. опять лишняя команда.
Я слышал о таком, но оставил на всякий случай. Вдруг, чего-то не так услышал.
не знаю, как ты считал задержку, но у меня там никак не получается 50 мс...
Считала программа, я сам весьма туманно представляю как такое рассчитывается. Но скажем, секундные задержки вполне адекватны.
Трудное детство, стальные игрушки.
Модератор
Аватара пользователя
Сообщения: 19100
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Сообщение Starichok51 »

какая программа считала задержку? и какую тактовую частоту ты задавал этой программе?
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Встал на лапы
Сообщения: 117
Зарегистрирован: Пн дек 08, 2014 19:45:24
Откуда: Воронеж

Сообщение Голимый »

Частота 9 600 000, CKDIV8 выключен.
Программа вот эта
Вложения
avr_loop.PNG
(9.51 КБ) 588 скачиваний
Трудное детство, стальные игрушки.
akl
Друг Кота
Сообщения: 4470
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Ассемблер сам справляется с такими примитивами. :)
Спойлер

Код: Выделить всё

;----- Подпрограмма задержки -----
.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 
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Это не ассемблер справляется, а препроцессор.
Контактная информация:
akl
Друг Кота
Сообщения: 4470
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

СпойлерИзображение
На картинке не вижу где avrasm32, будучи запущенный из командной строки, обращается к препроцессору.
Вложения
avrasm32.PNG
(22.71 КБ) 460 скачиваний
Ответить

Вернуться в «AVR»