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

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

Сообщение Demiurg »

[uquote="BOB51",url="/forum/viewtopic.php?p=3287181#p3287181"]http://img.radiokot.ru/files/20529/1g6cmrs760.JPG
и НИКАКИХ АНТИДРЕБЕЗГОВ
:hunger:[/uquote]
Что это?
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 15789
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Емкостная кнопка на основе TP223
TTP223-BA6_SPEC_V2.1.pdf
(157.96 КБ) 226 скачиваний
готовая платка от братьев-китайцев за 50 рубчиков (в наших краях).
С обратной стороны простая гладкая поверхность для касания.
Допускает 2-3 милиметра пластика над рабочей стороной.
ПРОВЕРЕНО МАКЕТНЫМИ ПЫТКАМИ
:hunger: :hunger:
Реклама
Это не хвост, это антенна
Сообщения: 1495
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

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

Сообщение Alexeyslav »

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

Кондер на 0.1мкф паралельно кнопке только СНИЖАЕТ вероятность дребезга, а дополнительно эффективно убивает кнопку повышая её дребезг до безумных величин, вплоть до полной неработоспособности кнопки и даже кондер уже не спасает.
так во втором нажатие кнопки будет зафиксировано
Ну да ну да.... скорей пользователь девайс разобъёт после пары дней глючащей кнопки. даже антивандальное исполнение не спасёт.
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Сообщения: 3342
Зарегистрирован: Ср янв 02, 2013 08:37:35

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

[uquote="Alexeyslav",url="/forum/viewtopic.php?p=3287260#p3287260"]Кондер на 0.1мкф паралельно кнопке только СНИЖАЕТ вероятность дребезга, а дополнительно эффективно убивает кнопку повышая её дребезг до безумных величин, вплоть до полной неработоспособности кнопки и даже кондер уже не спасает.[/uquote]
На чём основаны такие умозаключения? Аргументы будут?
Alexeyslav писал(а):
так во втором нажатие кнопки будет зафиксировано
Ну да ну да.... скорей пользователь девайс разобъёт после пары дней глючащей кнопки. даже антивандальное исполнение не спасёт.
Тут тоже желательно аргументированных утверждений, а не бла бла.
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2022
Зарегистрирован: Вт фев 09, 2010 02:04:53
Откуда: Санкт-Петербург

Сообщение Гефестион »

[uquote="Demiurg",url="/forum/viewtopic.php?p=3286528#p3286528"]Начинаем вот с чего. Зачем вам вешать кнопку на внешнее прерывание?[/uquote] Чтобы зря не опрашивать её в цикле, если она нажимается редко. Плюс не будет гемора с многократным опросом кнопки за время её нажатия, поскольку прерывания происходят только по фронтам.

Добавлено after 1 minute 56 seconds:
[uquote="АСУ",url="/forum/viewtopic.php?p=3287012#p3287012"]Не буду спрашивать зачем тебе это нужно… раз спросил значит нужно! Один из вариантов довольно прост: при нажатии на кнопку – возникает прерывание. В теле прерывания проверяешь состояния логического уровня на входе (в твоём варианте PinB.7).
• Если на ноге лог. 0 значит кнопка нажата – поднимаем флаг сработки кнопки (потом можно в основном теле программы обрабатывать необходимое действие по данному флагу), затем выходим из прерывания.
• Если на ноге лог. 1 – то сразу выходим из прерывания без каких либо действий.
Сброс флага кнопки производишь после выполнения необходимых действий по данному флагу.[/uquote]
Спасибо! Так и сделал, вроде работает. Кнопки зашунтировал конденсаторами 0,1мкФ, дребезга почти нет.
Фак, кот грызёт провод! Сейчас его ударит либо током, либо тапком! ))
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Гефестион писал(а):Чтобы зря не опрашивать её в цикле, если она нажимается редко. Плюс не будет гемора с многократным опросом кнопки за время её нажатия, поскольку прерывания происходят только по фронтам.
Хорошие кнопки с кондерами могут и не дребезжать, сталкивался с таким, вот только не знаю на долго ли их хватит без дребезга
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Это не хвост, это антенна
Сообщения: 1495
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

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

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

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

Сообщение Alexeyslav »

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

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

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

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

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

Сообщение WiseLord »

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

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

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

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

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

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

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

Сообщение Alexeyslav »

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

Сообщение WiseLord »

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

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

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

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

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

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

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

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

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

Сообщение 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 КБ) 238 скачиваний
Контактная информация:
Друг Кота
Сообщения: 3342
Зарегистрирован: Ср янв 02, 2013 08:37:35

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

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

Сообщение 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 КБ) 247 скачиваний
Ответить

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