Например TDA7294

Форум РадиоКот • Просмотр темы - Проблема с прерыванием PCINT
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Сб июл 26, 2025 22:50:07

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Форум закрыт Эта тема закрыта, Вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 4 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: Проблема с прерыванием PCINT
СообщениеДобавлено: Вс сен 11, 2011 12:19:29 
Родился

Зарегистрирован: Пн авг 23, 2010 11:52:37
Сообщений: 13
Рейтинг сообщения: 0
Здравствуйте,

К пинам 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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Проблема с прерыванием PCINT
СообщениеДобавлено: Вс сен 11, 2011 15:09:27 
Открыл глаза
Аватар пользователя

Карма: 2
Рейтинг сообщений: 1
Зарегистрирован: Ср июл 06, 2011 19:11:44
Сообщений: 64
Откуда: В цветущих акациях город
Рейтинг сообщения: 0
Подозреваю что это происходит из-за глобального отключения прерываний в самом начале функции, т.к. при этом обработка прерывания завершается, и МК возвращается к выполнению главного цикла (могу и ошибаться).

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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Проблема с прерыванием PCINT
СообщениеДобавлено: Вс сен 11, 2011 18:44:43 
Родился

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

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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Проблема с прерыванием PCINT
СообщениеДобавлено: Вс сен 11, 2011 20:57:00 
Открыл глаза
Аватар пользователя

Карма: 2
Рейтинг сообщений: 1
Зарегистрирован: Ср июл 06, 2011 19:11:44
Сообщений: 64
Откуда: В цветущих акациях город
Рейтинг сообщения: 0
iustat писал(а):
Прерывание PCINT вызывается при любом изменении уровня на пине. Т.к. в первый раз (при нажатии кнопки) оно устанавливается в высокий уровень - второй раз оно будет вызвано, только если подать на этот пин низкий уровень. Ессно играться совершенно не хочется, потому необходимо вернуть состояние пина в уровень 0. А если я не отключу обработку прерывания PCINT на этих пинах, то оно будет вызвано еще раз, т.к. состояние входа мы программно изменили.
Как-то все слишком закручено у Вас получилось. :facepalm:

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

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


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Форум закрыт Эта тема закрыта, Вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 4 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y