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

Обсуждаем контроллеры компании Atmel.
OKF
Это не хвост, это антенна
Сообщения: 1385
Зарегистрирован: Вт июн 07, 2011 08:03:18

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

Сообщение OKF »

[uquote="Gudd-Head",url="/forum/viewtopic.php?p=4653504#p4653504"]Что за вертикальные счётчики?[/uquote]
Это для экономии переменных в случае нескольких кнопок. Представь, к примеру, 3-х байтный массив. Каждый разряд которого будет счётчиком на 8. Таких счётчиков будет максимум 8. Для горизонтальных, при 8-ми кнопках, понадобилось бы 8 байт. Но считали бы они до 255.
Аватара пользователя
shonty
Мучитель микросхем
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

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

Сообщение shonty »

Не совсем понятно :dont_know: И к сожалению почитать про вертикальные счётчики ничего не нашёл :dont_know:
И вообще, это про ASM?

иначе:
OKF писал(а):Это для экономии переменных
дело опять движется к холивару есть ли в ASM-е переменные :shock:
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

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

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

я правильно понял, что на 8 счетчиков занято 3 регистра, в первом побитно хранятся 1 (0е биты) всех счётчиков, во втором - 2 (1е биты), в третьем 4 (2е биты).
и если мне надо узнать сколько в 3м счетчике, то мне нужно из всех 3х регистров достать 3й бит и собрать из него значение, расположив эти биты по порядку...

допустим регистры (или память) таким методом мы сэкономим... но расчётов сколько...?

не проще было запихать по 2 счётчика в байт - да, израсходовалось бы на регистр больше, но работать было бы намного проще...

Добавлено after 8 minutes 50 seconds:
я предпочитаю сквозной счётчик (баловаться так бальваться терминами :) ) он один на всю клавиатуру и сбрасывается при изменении состояния любой кнопки, а как дотикал до нужного значения - дребезг кончился, можно опросить кнопки.
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Аватара пользователя
shonty
Мучитель микросхем
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

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

Сообщение shonty »

Ivanoff-iv писал(а):(баловаться так бальваться терминами )
поддерживаю :) :beer:
тоже напридумываю терминов)) и буду тут завуалированно изъясняться :)

Добавлено after 8 minutes 37 seconds:
и...
вы можете со мной сколько угодно не соглашаться, но паралельный счётчик в диагональной проекции намного эффективнее всего выше приведённого))
phalanx
Нашел транзистор. Понюхал.
Сообщения: 158
Зарегистрирован: Сб апр 24, 2021 18:42:11

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

Сообщение phalanx »

[uquote="shonty",url="/forum/viewtopic.php?p=4653586#p4653586"]Не совсем понятно :dont_know: И к сожалению почитать про вертикальные счётчики ничего не нашёл...[/uquote]
https://embedders.org/blog/gdi/debouncing.html
Последний раз редактировалось phalanx Ср ноя 27, 2024 14:43:14, всего редактировалось 1 раз.
OKF
Это не хвост, это антенна
Сообщения: 1385
Зарегистрирован: Вт июн 07, 2011 08:03:18

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

Сообщение OKF »

[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=4653654#p4653654"]я правильно понял, что на 8 счетчиков занято 3 регистра, в первом побитно хранятся 1 (0е биты) всех счётчиков, во втором - 2 (1е биты), в третьем 4 (2е биты).
и если мне надо узнать сколько в 3м счетчике, то мне нужно из всех 3х регистров достать 3й бит и собрать из него значение, расположив эти биты по порядку...

допустим регистры (или память) таким методом мы сэкономим... но расчётов сколько...?[/uquote]
Мужики. Ко мне какие вопросы? Человек спросил - я ответил. Не я же их придумал. https://embedders.org/blog/gdi/debouncing.html - для тех кто не может найти.
ВО! Значит, мыслим одинаково.)
Аватара пользователя
shonty
Мучитель микросхем
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

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

Сообщение shonty »

понятно теперь. это чисто сишные приёмы.

Добавлено after 8 minutes 26 seconds:
в асме всего 2 варианта (если не ошибаюсь) - тикать в аппаратном таймере или тикать в программном цикле.
(в слове "тикать" - ударение на 1-й слог)
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

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

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

Прикольно, истинно параллельная обработка всех подключенных к одному порту кнопок...
и нет, это не обязательно С, это и на асме легко делается... на асме же есть логические операторы... 8)

Не знаю, кому плюсик ставить? - поставлю обоим! Метод интересный.
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Аватара пользователя
Just_Fluffy
Вымогатель припоя
Сообщения: 532
Зарегистрирован: Ср июн 29, 2022 16:25:45

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

Сообщение Just_Fluffy »

shonty, Так у Paktok-а на вертикальных счетчиках не переменные. Там расход регистров большой :) :) :)
[шутка]Интересно, если взять планарный датчик, расход регистров уменьшится?[/шутка]

Вообще, антидребезг такая интересная штука... Я применяю 2 подхода.
1. Кольцевой массив. Каждый интервал времени в ячейку массива с индексом i читается состояние кнопки/кнопок. Потом индекс увеличивается (если выходит за пределы массива - то обнуляется).
После каждого чтения сравниваются между собой все элементы массива. Если все одинаковы - значит состояние кнопок устаканилось - и можно анализировать полученные данные.
Метод хорош, когда интервал чтения позволяет устранить дребезг за N чтений и это N меньше числа кнопок.
2. "Гистерезисный" счетчик.
Для каждой кнопки выделяется 1 байт. Старший бит - флаг нажатой кнопки. Младшие 7 - счетчик.
Обработчик дребезга вызывается с определенной периодичностью. В обработчик передается физическое состояние кнопки и ссылка на счетчик.
В обработчике старший бит выделяется во временную переменную флага, в счетчике бит временно обнуляется.
Далее, если физическая кнопка нажата - смотрим, если значение счетчика меньше заданного предела, то увеличиваем его. Если значение достигло заданного предела - смотрим, если флаг во временной переменной не поднят - генерируем событие нажатия кнопки. Потом поднимаем флаг во временной переменной.
Если физическая кнопка не нажата, то смотрим - если счетчик больше нуля - уменьшаем его. Если после уменьшения счетчик стал нулевой, смотрим - если флаг во временной переменной поднят - генерируем событие отпускания кнопки. Потом сбрасываем флаг временной переменной.
Далее новое значение флага объединияется со счетчиком и всё. На выходе обработчик отдает три значения - ничего не произошло, кнопку нажали, кнопку отпустили.

Добавлено after 10 minutes 35 seconds:
упс. Пока ответ писала - отвлекли. И пока написала - тут уже целый диспут ))))
Белая и Пушистая
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

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

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

тоже раньше использовал "кольцевой буфер на 8 элементов" = переменную Х типа статик чар
алгоритм:
сдвигаем содержимое переменной Х влево;
заносим в младший бит состояние кнопки;
проветяем результат(Х==...
0х00 - кнопка отпущена состояние (или нажата, смотря как подключена)
0х80 - кнопка отпущена событие
0хFF - кнопка нажата состояние
0х7F - кнопка нажата событие
)

потом делал типа гистерезисной: если кнопка нажата счётчик прирастал, иначе - уменьшался причем если уменьшался и был больше половины ёмкости переменной, то уменьшался до середины ёмкости, если меньше, но не равен 1, то уменьшался на 1.
с увеличением так-же, но в дтугую сторону.
если счётчик ==0 - кнопка деактивирована (например не отработано её событие или состояние программы неподходящее).
такой счётчик длиннее предыдущего и позволял отличать короткие нажатия от длинных и от удержания кнопки (в зависимости от требований просто вносились дополнительные условия проверяющие состояние кнопки и содержимое счётчика, дополнительных флагов не требовалось, просто условие по счётчику было жёстким и выполнялось только 1 раз за нажатие - дальше счётчик уходил с этого значения и событие больше не генерировалось)

далее я ушёл к единому для всей клавиатуры счётчику - и память экономит и позволяет отрабатывать комбинации нажатий кнопок.
хранится счёт и 2 состояния клавиатуры (предыдущей итерации и предыдущее стабильное).
если текущее состояние соответствует предыдущему и счётчик не полон - приращаем его
если состояние кнопок изменилось - сбрасываем.
перед сбросом и приращением счётчика ставим условия, генерирующие события клавиатуры (нажатия. отпускания, удержания отдельных кнопок или их сочетаний...)
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Аватара пользователя
Just_Fluffy
Вымогатель припоя
Сообщения: 532
Зарегистрирован: Ср июн 29, 2022 16:25:45

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

Сообщение Just_Fluffy »

Ivanoff-iv, Ваша идея с глобальным счетчиком мне понравилась, когда вы про нее еще днем написали.
Но мне надо ее осмыслить...
Пока я пришла для себя к независимым счетчикам для каждой кнопки. Т.е. байт на счетчик, байт на конфиг. В особо тяжелых случаях еще и с индивидуальными пределами для разных кнопок.
Есть у меня библиотечка со структурой и парой функций. При инициализации для кнопки сохраняется конфиг (какие события она должна генерить - нажатие, отпускание, долгое нажатие, повтор... Если индивидуальные тайминги - то еще 2 байта добавляется) и потом просто в таймерной задаче в функцию-обработчик передаются физические нажатия и на выходе получаем событие кнопки.
Да, каждая кнопка индивидуальна. Это не всегда удобно. Но я уже давно перестала гоняться за экономией байтов ради экономии. Использование ОЗУ и и флеша должно быть разумно достаточным. При том, что часто за экономию ОЗУ приходится расплачиваться увеличением и/или усложнением кода.
Белая и Пушистая
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

Счетчики какие-то... По-моему, бред. Тупое считывание каждые 50 мс состояния хоть 8, хоть 16, хоть 32 бит-кнопок гарантирует отсутствие ложных (из-за дребезга) срабатываний, при единственном условии: нажатие длится не менее этих 50 мс, что для кнопок однозначно соблюдается.

Добавлено after 1 minute 52 seconds:
Хотя лично я зря не жоплюсь и считываю раз в 100 мс, и уже лет пять, как ни разу не пожалел об этом. А поначалу тоже всякие интервалы защитные соблюдал... Как вспомню, так вздрогну
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
OKF
Это не хвост, это антенна
Сообщения: 1385
Зарегистрирован: Вт июн 07, 2011 08:03:18

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

Сообщение OKF »

Это если кнопки большие - пускатели там и т.п. Тогда и 200 можно. И ни о чём не жалеть.)
Аватара пользователя
shonty
Мучитель микросхем
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

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

Сообщение shonty »

Можно с другого ракурса на вопрос взглянуть: дребезг же из ниоткуда не берётся :dont_know:
Если возник дребезг - значит было нажатие на кнопку.
И напрашивается вопрос: а стОит ли ждать, пока эти переходные процессы в кнопке устаканятся?

Добавлено after 4 minutes 33 seconds:
ps: я опрос порта по максимуму использую, а задержку ставлю перед возвращением из процедуры. Чисто по тактильным ощущениям подбираю.

Добавлено after 3 minutes 13 seconds:
что бы серийного срабатывания не было.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

[uquote="OKF",url="/forum/viewtopic.php?p=4653819#p4653819"]Это если кнопки большие - пускатели там и т.п. Тогда и 200 можно. И ни о чём не жалеть.)[/uquote]
Любые кнопки, как органы управления человеком. Или вы Брюс Ли и можете кнопку нажать на 10 мс и каждые 20 мс?!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
OKF
Это не хвост, это антенна
Сообщения: 1385
Зарегистрирован: Вт июн 07, 2011 08:03:18

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

Сообщение OKF »

Смотря для каких целей кнопки. Если в играх то да, или печатать. Думаю, даже быстрее 20мс. А если серьёзно, то мелкие кнопки совсем дребезжащие. Да и изнашиваются. Вон, в данный момент на мышке правая кнопка все нервы портит в Протеусе.(
Аватара пользователя
shonty
Мучитель микросхем
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

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

Сообщение shonty »

shonty писал(а):Если возник дребезг - значит было нажатие на кнопку.
И напрашивается вопрос: а стОит ли ждать, пока эти переходные процессы в кнопке устаканятся?
shonty писал(а):ps: я опрос порта по максимуму использую, а задержку ставлю перед возвращением из процедуры. Чисто по тактильным ощущениям подбираю.
Описывать всякие алгоритмы можно до бесконечности..
Попробую проиллюстрировать как у меня..
Скачал график дребезга и дорисовал в ГИМП ход обработки нажатия (интервалы примерные):

Изображение

И зачем мне ждать, когда перестанут дребезжать контакты, если процесс обработки с задержкой возвращения по времени превышает дребезг?

Добавлено after 8 minutes 5 seconds:
Если по нажатию кнопки просто диодом моргнуть, то тут да, диод изморгается, но и то это можно скомпенсировать постзадержкой, или интервал опроса увеличить (как ARV писал)
А если выполнять какие либо более серьёзныне действия, то они перекроют весь дребезг + постзадержка по вкусу.
Аватара пользователя
Just_Fluffy
Вымогатель припоя
Сообщения: 532
Зарегистрирован: Ср июн 29, 2022 16:25:45

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

Сообщение Just_Fluffy »

shonty, А если это помеха? Или кто то попой сел на клавиатуру? Какая кнопка опросилась или успела нажаться первой - та и обрабатывается?
Я, кроме дребезга, в обработке кнопок исключаю мультинажатия, если они не предусмотрены функционалом.
Белая и Пушистая
Martian
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32
Контактная информация:

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

Сообщение Martian »

[uquote="Just_Fluffy",url="/forum/viewtopic.php?p=4653869#p4653869"]А если это помеха? Или кто то попой сел на клавиатуру?[/uquote] ввести captcha для подтверждения, что это пользователь, а не его (или чья-то) задница или помехи.
Аватара пользователя
shonty
Мучитель микросхем
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

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

Сообщение shonty »

Just_Fluffy писал(а):Или кто то попой сел на клавиатуру? Какая кнопка опросилась или успела нажаться первой - та и обрабатывается?
Ну не знаю :dont_know:
У меня опрос с минимальным интервалом. Поэтому мультинажатие от попы исключено :dont_know:

А так да.. пришлось бы ещё и дребезг попы обрабатывать))

Добавлено after 6 minutes 45 seconds:
Если серьёзно, то по поводу мультинажатия согласен.., только если оно предусмотрено, то обрабатывать нужно.
Но при минимальном интервале опроса одновременно 2 кнопки нажать.. это невероятно :dont_know:
Ответить

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