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

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

Сообщение akl »

Гефестион Имелось ввиду другое. С какими флагами в SREG программа войдет в обработчик неизвестно, поэтому смысл breq Decr после команды SBIS неясен.

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

           sbis PIND,3
           RJMP Decr
;           sbis portD,3
;           breq Decr ; 
           inc Steps
           rjmp uart_snt
Decr:           dec Steps
Вы не можете командой CLI помешать установке флага требования прерывания INT0 из-за дребезга. Поэтому команда SEI в обработчике вновь вызовет
оный...
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2022
Зарегистрирован: Вт фев 09, 2010 02:04:53
Откуда: Санкт-Петербург

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

Кстати, если в прерывании не сбросить флаг I, в это время может произойти другое прерывание (например, по таймеру) ? или пока не будет reti, все прерывания запрещаются автоматически?
Фак, кот грызёт провод! Сейчас его ударит либо током, либо тапком! ))
Реклама
akl
Друг Кота
Сообщения: 4447
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Если прерывание локально разрешено, то при возникновении оного и переходе в обработчик флаг I сбрасывается аппаратно. При выходе по RETI - устанавливается также аппаратно. В отличие от команды RET, которая I флаг не меняет.
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2022
Зарегистрирован: Вт фев 09, 2010 02:04:53
Откуда: Санкт-Петербург

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

Возник очередной вопрос. Подключил кнопку на PB7, разрешил прерывания PCIE и PCINT7. Т.е. любое изменение логического состояния на этой ноге будет вызывать прерывание. К сожалению, в отличие от входов INT0, INT1 для PCIE нельзя настроить срабатывание только по фронту или срезу, т.е. кнопка выдаст два прерывания: при нажатии и отпускании. Как сделать так, чтобы кнопка срабатывала только один раз? Как я понял из предыдущих сообщений, запрещать прерывания бессмысленно, т.к. если флаг соответствующего прерывания установился, то как только прерывания будут разрешены (даже если через несколько секунд), это прерывание произойдёт.
Фак, кот грызёт провод! Сейчас его ударит либо током, либо тапком! ))
Реклама
Эиком - электронные компоненты и радиодетали
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

Начинаем вот с чего. Зачем вам вешать кнопку на внешнее прерывание? Это требуется только в одном случае. Энергосбережение. Будить МК при нажатии на кнопку. Развиваем дальше тему. Кнопка - человекоинтерфейс. То есть медленный. Реакция десятки миллисекунд. Исходим из целесообразности. На куа, спрашивается, вам реакция в доли-единицы микросекунд? Если вы просто физически ничего не успеете сделать? Простой пример. Можете почитать в интернете. Есть такой прикол с денежной купюрой или карандашом. Один человек держит купюру или карандаш, отпускает. Второй человек должен поймать. Так вот. Это практически физически невозможно. Потому что реакция обычного, нетренированного человека - 0,2 с.
Кстати, нашел эту статью.
Контактная информация:
Реклама
Опытный кот
Аватара пользователя
Сообщения: 708
Зарегистрирован: Пт ноя 30, 2007 14:40:44

Сообщение Серый_ »

Практика показывает обратное. При тяжёлой программе реакция на кнопку будет флегматичной (а энкодер будет давать "прокруты"). Соответственно, если есть 2 лишних INT = одно на кнопку, другое на 1 из электродов энкодера.
Реклама
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

[uquote="Серый_",url="/forum/viewtopic.php?p=3286690#p3286690"]Практика показывает обратное. При тяжёлой программе реакция на кнопку будет флегматичной (а энкодер будет давать "прокруты"). Соответственно, если есть 2 лишних INT = одно на кнопку, другое на 1 из электродов энкодера.[/uquote]
Это значит, что плохая практика. Я давным-давно использую следующий подход: дробить процессы, так, чтобы итерация основного цикла происходила с запасом за системный тик. Скажем, 1 мс.
Я даже вычисления наловчился дробить. Вычисление квадратного корня со стандартной библиотекой происходит за 2 с чем-то миллисекунды. Это непозволительно долго. Точно не помню, что я там сделал, в общем сделал некоторые переменные статическими, и раздробил вычисление. Чтобы следовать принципу: итерация основного цикла с запасом за 1 мс.
Контактная информация:
Друг Кота
Сообщения: 3342
Зарегистрирован: Ср янв 02, 2013 08:37:35

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

[uquote="Гефестион",url="/forum/viewtopic.php?p=3286503#p3286503"]Как сделать так, чтобы кнопка срабатывала только один раз?[/uquote]
Не буду спрашивать зачем тебе это нужно… раз спросил значит нужно! Один из вариантов довольно прост: при нажатии на кнопку – возникает прерывание. В теле прерывания проверяешь состояния логического уровня на входе (в твоём варианте PinB.7).
• Если на ноге лог. 0 значит кнопка нажата – поднимаем флаг сработки кнопки (потом можно в основном теле программы обрабатывать необходимое действие по данному флагу), затем выходим из прерывания.
• Если на ноге лог. 1 – то сразу выходим из прерывания без каких либо действий.
Сброс флага кнопки производишь после выполнения необходимых действий по данному флагу.

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

Сообщение Alexeyslav »

Этот вариант чреват дребезгом/пропуском нажатия кнопки. Возникло прерывание от нажатия... и пока мы читаем значение на пине процесс дребезга допустим разомкнет кнопку и мы прочитаем "1" - нажатия вроде бы как и небыло...

Поэтому... прерывания на кнопки использоват ТОЛЬКО для пробудки контроллера, а в остальном - сканировать их с периодом в 20мс. И дребезг в таком варанте не страшен пока он длится МЕНЬШЕ 20мс - а это уже очень убитые кнопки.
Контактная информация:
Друг Кота
Сообщения: 3342
Зарегистрирован: Ср янв 02, 2013 08:37:35

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

Поставив на порт кнопки кондёр в пределах 0,1 мкФ, и при любом дребезге МК проверит вход раньше чем на нём изменится логическое состояние от дребезга контактов.
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

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

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

Но даже если не ставить кондёр, то нажатие кнопки пропустить не получится, так как не в первом прерывании так во втором нажатие кнопки будет зафиксировано.
Друг Кота
Аватара пользователя
Сообщения: 15590
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

http://img.radiokot.ru/files/20529/1g6cmrs760.JPG
и НИКАКИХ АНТИДРЕБЕЗГОВ
:hunger:
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 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]
Что это?
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 15590
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Емкостная кнопка на основе TP223
TTP223-BA6_SPEC_V2.1.pdf
(157.96 КБ) 214 скачиваний
готовая платка от братьев-китайцев за 50 рубчиков (в наших краях).
С обратной стороны простая гладкая поверхность для касания.
Допускает 2-3 милиметра пластика над рабочей стороной.
ПРОВЕРЕНО МАКЕТНЫМИ ПЫТКАМИ
:hunger: :hunger:
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 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 »

Гефестион писал(а):Чтобы зря не опрашивать её в цикле, если она нажимается редко. Плюс не будет гемора с многократным опросом кнопки за время её нажатия, поскольку прерывания происходят только по фронтам.
Хорошие кнопки с кондерами могут и не дребезжать, сталкивался с таким, вот только не знаю на долго ли их хватит без дребезга
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Ответить

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