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

Обсуждаем контроллеры компании Atmel.
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

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

Сообщение Demiurg »

Гефестион писал(а):Чтобы зря не опрашивать её в цикле, если она нажимается редко. Плюс не будет гемора с многократным опросом кнопки за время её нажатия, поскольку прерывания происходят только по фронтам.
Не вопрос. Исходя из этой позиции, вы сидите ждете какой-то флаг. Работа МК судя по вашему производится зря, вхолостую. Временные задержки на основе счета тактов. Времянки какие угодно. От микросекунд, до секунд. И представляете, МК работает ЗРЯ! Парадокс, не правда ли?!
Я к чему, забудьте об этом суждении. Какую бы вы программу не написали, работа МК - выполнять написанную вами программу. Не хотите ждать зря кнопку? Создайте условие, по которому если кнопки не нажата, идем выполнять другую работу. Так вы освоите псевдопараллельность работы модулей программы.
АСУ
Друг Кота
Сообщения: 3342
Зарегистрирован: Ср янв 02, 2013 08:37:35

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

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

[uquote="Гефестион",url="/forum/viewtopic.php?p=3287468#p3287468"]Так и сделал, вроде работает.[/uquote]
Вот тестовый вариант для проверки кнопок на длительный дребезг (выбраковка кнопок)… на базе тини13, тактируется от заводской установки (1,2 МГц) – фьюзы устанавливать не надо… две кнопки и два светодиода… алгоритм проверяемой кнопки выполнен как описывал выше (от внешнего прерывания)… в теле прерывания организовано так: какой первый лог уровень замечен такой светодиод и загорится… зелёный – лог. 0; красный – лог. 1… сброс свечения светодиодов осуществляется кнопкой сброс.
Схема:
1.png
(23.27 КБ) 572 скачивания
Прошивка:
Butt.zip
(254 байт) 242 скачивания
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

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

Сообщение Alexeyslav »

На чём основаны такие умозаключения? Аргументы будут?
Математика, закон Ома... кнопка - сопротивление контакта 0.1Ом, на конденсаторе в момент нажатия 5Вольт... калькулятор сами достанете? А для кнопки заявлен максимальный ток в 50мА. И усреднение тут не катит, ток разряда конденсатора будет таки потихоньку плавить конаткт и оставлять нагар. В итоге кнопка превращается в черт знает что.
Тут тоже желательно аргументированных утверждений, а не бла бла.
Все люди у нас очень терпеливые и обладают железной выдержкой. Попробуйте к примеру поработать с планетом у которого нажатие регистрируется 9 раз из 10. Через 15 минут начинаешь присматриваться к стенке, как бы его так кинуть чтобы обои не поцарапать.
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

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

Сообщение Ivanoff-iv »

Alexeyslav писал(а):планетом
:))) :))) :))) уже присматриваешься?
К кнопке ещё резистор, чтоб ток гасить..., не слишком ли много обвеса получается?
проще регулярно опрашивать, и на основе 2х или 3х подряд одинаковых замеров принимать решение...
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25204
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

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

Сообщение КРАМ »

Причем тут резистор? У кнопки по любому должен быть резистор подтяжки. Проблема в конденсаторе, который в момент нажатия находится после резистора.
И опрос не нужно делать подряд. Его нужно делать ПОСТОЯННО с интервалом чуть больше дребезга.. Но если дребезг слишком велик, можно опрашивать чаще, но фильтровать полученный битный массив. Впрочем, это не ускорит срабатывание изношенной кнопки.
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

Имхо, все эти игры с попыткой обработать нажатие кнопки через прерывание - это бирюльки. Потому что дребезг нормально таким способом не подавишь. И вешать конденсаторы - это не выход из ситуации.

Гораздо лучше делать периодический опрос состояния кнопок. Но не в главном цикле программы, как любят некоторые, судя по тем примерам кода, что я иногда встречаю. В этом случае, пока нажата кнопка, вся остальная программа, по сути, висит в ожидании.

Корректнее всего использовать аппаратный таймер. Как правило, либо есть свободный таймер, либо описываемый подход вполне сочетается с параллельным использованием какого-то уже задействованного таймера.

Допустим, таймер настроен на 1кГц. Каждую 1мс срабатывает прерывание, в нём мы просто смотрим на состояние кнопок. Если ничего не нажато - в этой итерации ничего не делаем. Если же по прерыванию мы видим, что одна из нескольких кнопкок нажата - записываем состояние кнопок в некотрой переменной (назовём её btnStatus), а также инкрементируем некоторый счётчик (btnCnt). При следующем прерывании - всё то же самое.

В какой-то момент кнопка будет отпущена. В прерывании мы увидим, что btnStatus изменился. Это повод для того, чтобы 1) обнулить счётчик; 2а) если счётчик насчитал достаточно (скажем, до 100 = 100мс) - мы предыдущий btnStatus сохраняем в новой глобальной переменной (скажем, btnStatusGlobal); 2б) если счётчик не насчитал достаточно - ничего не делаем (считаем это дребезгом контактов).

Ну а основной цикл просто смотрит btnStatusGlobal, и, если в ней что-то есть, выполняет соответствующий обработчик нажатия.

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

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

Сообщение Alexeyslav »

Слишком сложно... переменные, счетчики... достаточно считать прерывания и смотреть на младшие 4 бита если они равны нулю - опрашиваем, сохраняем состояние кнопок и сравниваем с предыдущим - если есть несовпадения обновляем маску нажатия/отпускания кнопки, а обнулить маску может только основной цикл.
Как правило счетчик прерываний уже есть, поэтому никакой дополнительной шелухи не надо.
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

Ничего сложного. Минут за 30 набросал код (правда на C), который по вышеописанному принципу делает вроде как простую задачку, но с подвохами.

Вкратце - есть две кнопки, есть два светодиода. Кратковременное нажатие каждой кнопки зажигает свой светодиод на определённое время. Кнопки работают абсолютно независимо одна от другой.

Задействован лишь один - самый простой в atmega8 - таймер. Как для опроса кнопок, так и для таймаутов свечения. Ни одной функции задержки в коде нет, основной цикл программы не блокируется нигде, поэтому никакие полезные вычисления, которые могли бы где-то выполняться, выполнялись бы себе.

Добавить аналогично ещё кнопок / светодиодов - никакой проблемы.

Размер программы меньше 400 байт (на ассемблере, вероятно, и меньше был бы), исходник, hex и проект в Proteus там же.
Вложения
avrInput.7z
(13.37 КБ) 242 скачивания
АСУ
Друг Кота
Сообщения: 3342
Зарегистрирован: Ср янв 02, 2013 08:37:35

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

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

[uquote="Alexeyslav",url="/forum/viewtopic.php?p=3287622#p3287622"]Математика, закон Ома... кнопка - сопротивление контакта 0.1Ом, на конденсаторе в момент нажатия 5Вольт... калькулятор сами достанете?[/uquote]
То есть твоя схема с конденсатором убивает кнопку!? А я тут причём… не нужно свои домыслы перекладывать на других… вот схема ничего не убивает и работает как часы устраняя дребезг… верхний по схеме резистор можно задействовать в самом МК… нижний рассчитывается в зависимости от ёмкости…
1.png
(6.66 КБ) 595 скачиваний
Alexeyslav писал(а):Попробуйте к примеру поработать с планетом у которого нажатие регистрируется 9 раз из 10. Через 15 минут начинаешь присматриваться к стенке, как бы его так кинуть чтобы обои не поцарапать.
И тут придумал что-то своё и пытаешься это навесить на меня… :facepalm: ладно всё понятно.
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

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

Сообщение Ivanoff-iv »

получается: либо антидребезг занимает место в коде по методу, например, WiseLordа, либо на плате, по схеме АСУ, а тут уж самому решать - какое место нужнее...
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

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

Сообщение Demiurg »

Ну трындец...
В основном цикле.
Спойлер

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

.cseg

//************************************************************************
Reset:
//------------------------------------------------------------------------
	Clear_Registers
//------------------------------------------------------------------------

//------------------------------------------------------------------------
	clr		RCLR
	ser		r16
	mov		RSER, r16
	clr		FLAGS
//------------------------------------------------------------------------

//------------------------------------------------------------------------
	Init_Stack // Инициализация стека.
//------------------------------------------------------------------------

//------------------------------------------------------------------------
	Clear_SRAM // Очистка ОЗУ.
//------------------------------------------------------------------------

//------------------------------------------------------------------------
	Init_System_Timer // Инициализация системного таймера.
//------------------------------------------------------------------------

//------------------------------------------------------------------------
	Init_WDT
//------------------------------------------------------------------------

//------------------------------------------------------------------------
	Init_Sleep_Mode
//------------------------------------------------------------------------

//----------------------------- Отладка ----------------------------------
#if (PROJECT==DEBUG)
	sbi		KEYS_PIN_HEAT_ON_OFF, KEY_HEAT_ON_OFF
	sbi		KEYS_PIN_FAN_UP, KEY_FAN_UP
	sbi		KEYS_PIN_FAN_DOWN, KEY_FAN_DOWN

	sbi		AC_OUT_PIN, AC_OUT
//	sbi		FIRE_SENS_PIN, FIRE_SENS
//	sbi		OVERHEAT_SENS_PIN, OVERHEAT_SENS
#endif
//==================

	sei

//==================
Main:
	wdr
	rcall	Service_Timers
	rcall	KBD_DRV
	rcall	Proc_Emerg_Sens
	rcall	Proc_Heater
	rcall	Proc_Fan
	rcall	Proc_ADC
	rcall	Proc_Pump
	rcall	Proc_Heat_Err
	rjmp	Main
//==================
Спойлер

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

.macro Scan_Keys
	clrb	FSM_FLAGS, KEYS_PRESSED_FLG
	in		r16, Keys_Pin
	com		r16
	andi	r16, Keys_Mask
	cpi		r16, 0
	breq	Scan_Keys_End
	setb	FSM_FLAGS, KEYS_PRESSED_FLG
Scan_Keys_End:
	Save_Keys_Current
.endmacro

//==================
Kbd_Drv_Save_Val:
	std		Y+DISP_KEYS, FSM_STATE
	std		Y+DISP_KEYS_FLAGS, FSM_FLAGS
	ret
//==================

//==================
Define_Keys:
	sbrs	FSM_FLAGS, DEFINE_KEYS_FLG
	ret
Define_Keys_A:
	clrb	FSM_FLAGS, DEFINE_KEYS_FLG
	ldz		Table_Keys_Code*2
	Read_Keys_Current
Define_Keys_Cycle:
	lpm		r17, Z+
	cpi		r17, 0xFF
	brne	Define_Keys_Cycle_A
	ret
Define_Keys_Cycle_A:
	cp		r16, r17
	breq	Define_Keys_Equal
	lpm		r17, Z+
	rjmp	Define_Keys_Cycle
Define_Keys_Equal:
	lpm		r16, Z
	std		Y+DISP_KEYS_BUF, r16
	ret
//==================

//==================
KBD_DRV:
	pushiwl		Kbd_Drv_Save_Val
	pushiwl		Define_Keys

	ldy			_KEYS
	ldd			FSM_STATE, Y+DISP_KEYS
	ldd			FSM_FLAGS, Y+DISP_KEYS_FLAGS

	Scan_Keys // Макрос сканирование кнопок. Дефайнами подставляются нужные функции. Порт\Матрица\Несколько портов.
	Proc_FSM	Tab_FSM_KBD_DRV

Keys_Init:
	ser			r16
	mov			KEYS_PREV, r16
	mov			KEYS_CURRENT, r16
	std			Y+DISP_KEYS_BUF, r16
	Set_State	_KEYS_NONE
	ret

Keys_None:
	sbrs		FSM_FLAGS, KEYS_PRESSED_FLG	// Если что-то нажато, то пропуск команды.
	ret
	Read_Keys_Current
	Save_Keys_Prev // Сохранение текущего состояния клавиатуры.
	Set_Timer	Par_Tim_Debounce_Delay // Установка задержки устранения дребезга.
	Set_State	_KEYS_DOWN
	ret

Keys_Down:
	Proc_Timer	Par_Tim_Debounce_Delay
	brtc		Keys_Down_End
	sbrs		FSM_FLAGS, KEYS_PRESSED_FLG
	rjmp		Keys_Set_None
	Comp_Last_Curr_Keys
	breq		Keys_Down_A
	rjmp		Keys_Set_None
Keys_Down_A:
	setb		FSM_FLAGS, DEFINE_KEYS_FLG
	rjmp		Keys_Set_Wait_Up
Keys_Down_End:
	ret

Keys_Set_None:
	Set_State	_KEYS_NONE
	ret

Keys_Set_Wait_Up:
	Set_State	_KEYS_WAIT_UP
	ret

Keys_WAIT_UP:
	sbrc		FSM_FLAGS, KEYS_PRESSED_FLG
	ret
	Set_Timer	Par_Tim_Debounce_Delay
	Set_State	_KEYS_UP
	ret

Keys_UP:
	Proc_Timer	Par_Tim_Debounce_Delay
	brtc		Keys_UP_End
	sbrc		FSM_FLAGS, KEYS_PRESSED_FLG
	rjmp		Keys_Set_Wait_Up
	Set_State	_KEYS_NONE
Keys_UP_End:
	ret

//==================
Table_Keys_Code:
.db		1<<KEY_HEAT_ON_OFF, KEY_COD_HEAT_ON_OFF
.db		1<<KEY_FAN_UP, KEY_COD_FAN_UP
.db		1<<KEY_FAN_DOWN, KEY_COD_FAN_DOWN
end_array
//==================
Сделано по принципу, описанному в статье. Прикреплено.
Вложения
08.rar
(107.57 КБ) 226 скачиваний
АСУ
Друг Кота
Сообщения: 3342
Зарегистрирован: Ср янв 02, 2013 08:37:35

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

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

[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3287911#p3287911"]получается:[/uquote]
Я борюсь с дребезгов в 90% случаях программными методами, но бывает когда по разным причинам приходится прибегать к старому методу RC цепочки которой пользовался в былые времена для рассыпухи.
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

[uquote="Гефестион",url="/forum/viewtopic.php?p=3286503#p3286503"]Возник очередной вопрос. Подключил кнопку на PB7, разрешил прерывания PCIE и PCINT7. Т.е. любое изменение логического состояния на этой ноге будет вызывать прерывание... Как сделать так, чтобы кнопка срабатывала только один раз?[/uquote]Как вариант использования PCINT для опроса кнопки с антидребезгом. Идея в накоплении состояния нажатой кнопки счетчиком за 128 тактов опроса. Если есть дребезг счетчик сбрасывается и счет начинается снова. Индикатором служит реверсирование состояния лапы PD0 при нажатии кнопки. Посмотрел на макете, правда кнопка у меня заведена на PB4 с резистором подтяжки 1,1к. Каждый раз при нажатии кнопки происходит смена состояния лапы PD0. При отпускании кнопки смены состояния нет.
TEST_KEY_PCINT.zip
(1.03 КБ) 236 скачиваний
dgrett
Вымогатель припоя
Сообщения: 615
Зарегистрирован: Вс дек 28, 2014 21:54:05

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

Сообщение dgrett »

Удалил
Я всё-всё узнAю и стану профессором.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15553
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

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

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

Сообщение Alexeyslav »

вот схема ничего не убивает и работает как часы устраняя дребезг… верхний по схеме резистор можно задействовать в самом МК… нижний рассчитывается в зависимости от ёмкости…
Боюсь разочаровать, но схема ваша не устраняет дребезг полностью, а лишь уменьшет его вероятность. Периодически, кнопку будет таки глючить несмотря на все предпринятые решения.
Чем больше величина нижнего резистора, тем хуже схема давит дребезг. А он не может быть маленьким - ибо ток через кнопку надо ограничить.

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

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

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

[uquote="Alexeyslav",url="/forum/viewtopic.php?p=3288551#p3288551"]Периодически, кнопку будет таки глючить несмотря на все предпринятые решения.[/uquote]
Теоретические предположения – это хорошо. Только вот теория должна подтверждаться практическими фактами на железе. Если таковые факты есть (+ осциллограммы и т.п.) – с удовольствием взгляну. Если таковых нет, буду тогда тебя считать лишь теоретиком не более того.
Alexeyslav писал(а):Представьте, куда эти резисторы и конденсаторы ставить в матричную клавиатуру?
Опять ты «о своём, о девичьем» (С)
А если клавиатура на герконах!? Как в былые времена… :)
Alexeyslav писал(а):Зачем такие пляски с дополнительными деталями на каждую кнопку, если отлично справляется простой до гениальности программный способ подавления дребезга.
Бывают (у меня довольно часто) ситуации, когда свободной памяти для написания кода для подавления дребезга просто нет… часто это относится к девайсам на тини13… брать из-за этого более ёмкий МК или поставить дополнительные RC цепочки – я в большинстве случаях выбираю второе, так как это дешевле на порядок, да и кнопка может быть удалена от девайса на значительном расстоянии (несколько метров). Ты же в свою очередь поступай как считаешь нужным – я свой опыт тебе не навязываю. :wink:
trofim2
Встал на лапы
Сообщения: 106
Зарегистрирован: Чт сен 10, 2015 06:59:03
Откуда: Гродно, BY

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

Сообщение trofim2 »

А что, у герконов нет дребезга?
АСУ
Друг Кота
Сообщения: 3342
Зарегистрирован: Ср янв 02, 2013 08:37:35

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

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

О чём думаем когда читаем пост!?
trofim2
Встал на лапы
Сообщения: 106
Зарегистрирован: Чт сен 10, 2015 06:59:03
Откуда: Гродно, BY

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

Сообщение trofim2 »

Думаем о подавлении дребезга и тех несчастных, которые во вновь разрабатываемых устройствах использует больше половины памяти. Как в дальнейшем можно модифицировать данное устройство, если не делать халтуру?
Ответить

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