Например TDA7294

Форум РадиоКот :: Просмотр темы - Проблема с прерыванием PCINT
Форум РадиоКот
https://radiokot.ru/forum/

Проблема с прерыванием PCINT
https://radiokot.ru/forum/viewtopic.php?f=20&t=54375
Страница 1 из 1

Автор:  iustat [ Вс сен 11, 2011 12:19:29 ]
Заголовок сообщения:  Проблема с прерыванием PCINT

Здравствуйте,

К пинам PORTB5, PORTB6, PORTB7 подключены кнопки. При нажатии на кнопку, на соответствующий пин подается логическая 1. Необходимо при нажатии любой из них вызывать прерывание. Симулирую в протеус. Дело в том что при первом нажатии любой из кнопок - прерывание отрабатывает. Когда же пытаешься нажать на эту кнопку второй, третий.. раз, то прерывание не вызывается и регистр InterrCount не инкрементируется.

Подскажите что не так, или может это очередной глюк протеуса. Контроллер attiny2313

Инициализирую прерывание таким вот образом (это в RESET):

Код:
   outi PCMSK, (1<<PCINT5)|(1<<PCINT6)|(1<<PCINT7)   ; vkliuciaem prerivanie na opredelennih pinah
   outi GIMSK, (1<<PCIE)  ;vkliuciaem prerivanie


Обработчик прерываний:

Код:
EXTERN_OVF:
   cli

   inc InterrCount  ; incrementiruem registr pri kajdom vizove prerivaniya

   out PORTD, InterrCount

   outi PCMSK, (0<<PCINT5)|(0<<PCINT6)|(0<<PCINT7)   ; otkliuciaem prerivanie na pinah, cito bi vernuti pin v pred. sostoianie
        outi PINB, (0<<PINB5)|(0<<PINB6)|(0<<PINB7) ; menyaem sostoianie PIN
   outi PCMSK, (1<<PCINT5)|(1<<PCINT6)|(1<<PCINT7)   ; vkliuciaem prerivanie obratno

       sei

reti

Автор:  alexx82 [ Вс сен 11, 2011 15:09:27 ]
Заголовок сообщения:  Re: Проблема с прерыванием PCINT

Подозреваю что это происходит из-за глобального отключения прерываний в самом начале функции, т.к. при этом обработка прерывания завершается, и МК возвращается к выполнению главного цикла (могу и ошибаться).

PS. Решительно не могу понять, зачем нужна эта фигня:
Код:
   outi PCMSK, (0<<PCINT5)|(0<<PCINT6)|(0<<PCINT7)   ; otkliuciaem prerivanie na pinah, cito bi vernuti pin v pred. sostoianie
        outi PINB, (0<<PINB5)|(0<<PINB6)|(0<<PINB7) ; menyaem sostoianie PIN
   outi PCMSK, (1<<PCINT5)|(1<<PCINT6)|(1<<PCINT7)   ; vkliuciaem prerivanie obratno

Автор:  iustat [ Вс сен 11, 2011 18:44:43 ]
Заголовок сообщения:  Re: Проблема с прерыванием PCINT

Прерывание PCINT вызывается при любом изменении уровня на пине. Т.к. в первый раз (при нажатии кнопки) оно устанавливается в высокий уровень - второй раз оно будет вызвано, только если подать на этот пин низкий уровень. Ессно играться совершенно не хочется, потому необходимо вернуть состояние пина в уровень 0. А если я не отключу обработку прерывания PCINT на этих пинах, то оно будет вызвано еще раз, т.к. состояние входа мы программно изменили. В общем как-то так. Но вообще я их добавил, т.к. без них не работало. И при пошаговом проходе в AVR Studio увидел что неплохо бы их добавить.

А глобальное отключение прерываний здесь не при чем, т.к. 1 раз прерывание вызывается. Даже более того, у нас 3 кнопки и прерывание вызывается, если нажать на каждую кнопку по разу. Если на кнопку, которую мы уже нажимали нажать еще раз - прерывание не вызывается (в Proteus)

Автор:  alexx82 [ Вс сен 11, 2011 20:57:00 ]
Заголовок сообщения:  Re: Проблема с прерыванием PCINT

iustat писал(а):
Прерывание PCINT вызывается при любом изменении уровня на пине. Т.к. в первый раз (при нажатии кнопки) оно устанавливается в высокий уровень - второй раз оно будет вызвано, только если подать на этот пин низкий уровень. Ессно играться совершенно не хочется, потому необходимо вернуть состояние пина в уровень 0. А если я не отключу обработку прерывания PCINT на этих пинах, то оно будет вызвано еще раз, т.к. состояние входа мы программно изменили.
Как-то все слишком закручено у Вас получилось. :facepalm:

На самом деле не нужно так извращаться. Во-первых нужно подумать об антидребезге. Если он реализован аппаратно, то без вопросов. А во-вторых, не нужно ничего никуда возвращать. Нужно просто проигнорировать прерывание в том случае, когда при его вызове на всех пинах нули, поскольку PCINT срабатывает как по фронту, так и по спаду. Иначе он будет срабатывать и при отпускании кнопки.

И кстати, не нужно ориентироваться на протеус - микроконтроллеры он эмулирует как говно.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/