Ассемблер (ASM) для AVR в вопросах и ответах
если бы все знали мат часть, то необходимости в форумах не возникло бы априори. А вообще иногда так зацикливаешься на какой то проблеме, что просто нужен чей то взгляд со стороны, что бы опустить тебя на землю. ))
Если я чего-то не знаю, это не говорит о моем невежестве, а только о том, что раньше этот вопрос лежал вне сферы моих интересов.
- Реклама
- Сообщения: 1491
- Зарегистрирован: Ср июн 25, 2008 15:19:44
[uquote="Jetetex",url="/forum/viewtopic.php?p=3319029#p3319029"]если бы все знали мат часть, то необходимости в форумах не возникло бы априори. А вообще иногда так зацикливаешься на какой то проблеме, что просто нужен чей то взгляд со стороны, что бы опустить тебя на землю. ))[/uquote]
Категорически не соглашусь! Информация должна быть качественной. В идеале форумы должны быть информативными, а не постоянными повторениями, а подскажите-ка мне то-то. Этому персонажу лень жопу от стула оторвать, один раз книжку прочитать. Ему проще лежа на печи на диване на смартфоне настучать сиюминутный вопрос. Если мучать форум, так более содержательными вопросами...
Категорически не соглашусь! Информация должна быть качественной. В идеале форумы должны быть информативными, а не постоянными повторениями, а подскажите-ка мне то-то. Этому персонажу лень жопу от стула оторвать, один раз книжку прочитать. Ему проще лежа на печи на диване на смартфоне настучать сиюминутный вопрос. Если мучать форум, так более содержательными вопросами...
Почитал книги, порылся в интернете, но так и не нашел однозначного ответа. Нужно в Attiny 13 использовать внешнее прерывание по INT_0(что то вроде бистабильного реле- одно нажатие-вкл, второе-выкл).
Вопрос: нужно ли делать антидребезг при использовании этого прерывания (программный или аппаратный)?
Вопрос: нужно ли делать антидребезг при использовании этого прерывания (программный или аппаратный)?
Если я чего-то не знаю, это не говорит о моем невежестве, а только о том, что раньше этот вопрос лежал вне сферы моих интересов.
кнопка... там не нужно прерывание, с ним больше возни. Лучше запустить таймер с периодом в 20мс, в его прерывании один раз смотреть кнопку, ловить изменения(сранивая результаты нынешнего и предыдущего скана) и переключать то что вам надо. С прерыванием на кнопку НУЖЕН антидребезг и реализовать его достаточно просто и изящно не получится.
Это почему? А запретить прерывание от INT, запустить таймер, а по истечении времени проверить состояние. Выполнить задачу согласно состояния и разрешить прерывания по INT.
«Еще я хотел бы, чтобы наши ученые изобрели какой-то новый источник энергии, чтобы мы на коленях не ползали даже перед нашими братьями, умоляя их и выпрашивая тонну нефти или кубометр газа», — рассказал белорусский президент.
- Реклама
Планируется использование команды Sleep, а значит либо сторожевой, либо внешнее прерывание, что бы не будить контроллер без необходимости.
Но суть понятна - антидребезг нужен.
Но суть понятна - антидребезг нужен.
Если я чего-то не знаю, это не говорит о моем невежестве, а только о том, что раньше этот вопрос лежал вне сферы моих интересов.
Даже в этом случае, прерывание по порту с кнопкой пусть только будит контроллер скажем на время не более 100мс, а опрос кнопок - по таймеру. Таймер на время сна просто останавливать. Впрочем, во время глубокого сна с отключением тактирования можно и не останавливать.
То есть что то вроде:
EXT_INT0:
ldi temp,250
d1:
dec temp
brne d1
reti
при 128 кГц /8 ?
прерывание по спадающему фронту
EXT_INT0:
ldi temp,250
d1:
dec temp
brne d1
reti
при 128 кГц /8 ?
прерывание по спадающему фронту
Последний раз редактировалось Jetetex Пт мар 02, 2018 15:02:30, всего редактировалось 1 раз.
Если я чего-то не знаю, это не говорит о моем невежестве, а только о том, что раньше этот вопрос лежал вне сферы моих интересов.
Кнопка вызвала прерывание, а вот выход из прерывания либо с предварительным его запретом либо после ожидания гарантированно отпушеной кнопки.

нет, сразу же выходишь с прерывания и ВСЁ. В прерывании ничего делать не надо. Его задача - пробудить контроллер, а дальше будут работать обычные механизмы отработки нажатия кнопок и т.д.
После команды SLEEP обнулить таймер, чтобы с нуля пошел считать и если кнопка реально была нажата то через 10-20мс вы об этом узнаете, если кнопка не нажата и ничего не надо больше делать считаете по таймеру 5...10 переполнений и снова в SLEEP.
После команды SLEEP обнулить таймер, чтобы с нуля пошел считать и если кнопка реально была нажата то через 10-20мс вы об этом узнаете, если кнопка не нажата и ничего не надо больше делать считаете по таймеру 5...10 переполнений и снова в SLEEP.
- Сообщения: 3342
- Зарегистрирован: Ср янв 02, 2013 08:37:35
[uquote="Alexeyslav",url="/forum/viewtopic.php?p=3321116#p3321116"]нет, сразу же выходишь с прерывания и ВСЁ. В прерывании ничего делать не надо. Его задача - пробудить контроллер, а дальше будут работать обычные механизмы отработки нажатия кнопок и т.д.[/uquote]
Если ничего не делать, то прерывание по INT будет постоянно отрабатывать пока не будет отпущена кнопка… такое дрыганье не есть гуд.
Если ничего не делать, то прерывание по INT будет постоянно отрабатывать пока не будет отпущена кнопка… такое дрыганье не есть гуд.
- Сообщения: 1491
- Зарегистрирован: Ср июн 25, 2008 15:19:44
Уточнение, прерывание, которое настроено на низкий уровень. А не по спаду или фронту.
Как простой выход из ситуации - перед сном прерывание разрешать, а после сна запрещать.
тогда с какого хера он проснулся?Alexeyslav писал(а):если кнопка не нажата
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
От помехи, например.
- Сообщения: 3342
- Зарегистрирован: Ср янв 02, 2013 08:37:35
[uquote="Demiurg",url="/forum/viewtopic.php?p=3322287#p3322287"]Уточнение, прерывание, которое настроено на низкий уровень.[/uquote]
Это и так понятно, так как другие варианты не разбудят МК.
Это и так понятно, так как другие варианты не разбудят МК.
Почему не разбудят? Уточнения же небыло что это сон с отключением тактового генератора.
- Сообщения: 3342
- Зарегистрирован: Ср янв 02, 2013 08:37:35
Потому что в 90% случаях режим сна используется для экономии энергопотребления в мобильных устройствах, а это PowerDown…
Добрый день, у меня похожая ситуация с кнопкой.
Решил испробовать прерывание PCINT у Attiny13A, и написал простенькую программу с кнопкой (с PB3 на общий, и подтяжка 47К сверху) и светодиод с PB0 на общий.
Поскольку, PCINT это прерывание по смене состояния вывода, решил сделать так. Для борьбы с дребезгом, при в ходе в прерывание запрещаются прерывания, и запускается задержка на 50 мс, пока кнопка дребезжит. Далее, проверяется состояние кнопки, и если кнопка нажата (PB3 = 0), происходит выход, и возврат в главный цикл. Когда кнопка отпускается, происходит новое прерывание, но так как кнопка отжата (PB3=1), происходит переход на выполнение команд смены состояния выхода.
Выглядит все красиво, но на практике не работает. Точнее, работает еще хуже, чем если вообще никак не бороться с дребезгом. Однако, если "нажимать кнопку" от источника без дребезга (генератор на другом МК), то все работает идеально, и в связи с этим подозреваю что, либо по каким-то причинам не отрабатывает задержка, либо при нажатии или отпускании кнопки происходит больше чем одно прерывание, которое МК откладывает "на потом". Об этом говорит то, что если сделать большую задержку (1сек), то при нажатии на кнопку, светодиод загорается на секунду и гаснет.
Никак не могу понять что с этим делать, помогите разобраться. Может, просто элементарно ступил где-то.
Решил испробовать прерывание PCINT у Attiny13A, и написал простенькую программу с кнопкой (с PB3 на общий, и подтяжка 47К сверху) и светодиод с PB0 на общий.
Поскольку, PCINT это прерывание по смене состояния вывода, решил сделать так. Для борьбы с дребезгом, при в ходе в прерывание запрещаются прерывания, и запускается задержка на 50 мс, пока кнопка дребезжит. Далее, проверяется состояние кнопки, и если кнопка нажата (PB3 = 0), происходит выход, и возврат в главный цикл. Когда кнопка отпускается, происходит новое прерывание, но так как кнопка отжата (PB3=1), происходит переход на выполнение команд смены состояния выхода.
Выглядит все красиво, но на практике не работает. Точнее, работает еще хуже, чем если вообще никак не бороться с дребезгом. Однако, если "нажимать кнопку" от источника без дребезга (генератор на другом МК), то все работает идеально, и в связи с этим подозреваю что, либо по каким-то причинам не отрабатывает задержка, либо при нажатии или отпускании кнопки происходит больше чем одно прерывание, которое МК откладывает "на потом". Об этом говорит то, что если сделать большую задержку (1сек), то при нажатии на кнопку, светодиод загорается на секунду и гаснет.
Никак не могу понять что с этим делать, помогите разобраться. Может, просто элементарно ступил где-то.
- Вложения
-
- PCINT_check.asm
- (1.55 КБ) 238 скачиваний
Трудное детство, стальные игрушки.


