| AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
Проблемка с внешним прерыванием
05.05.2014, 22:27
|
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,313
Сказал спасибо: 2,633
Сказали Спасибо 12,076 раз(а) в 6,082 сообщении(ях)
|
Re: Проблемка с внешним прерыванием
Сообщение от ForcePoint
|
|
И не всякие putchar'ы тоже. Кстати, какой он у Вас?
|
Скорее всего putchar на прерываниях с буфером. Отработает после разрешения прерываний.
А вот разрешение прерываний внутри прерывания - убрать и будет счастье.
Задержка в прерывании - некрасиво, но в данном случае никому не мешает (кроме, разве что, глаз колет) и спасает от дребезга без танцев с бубном.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
06.05.2014, 07:55
|
|
|
Прописка
Регистрация: 09.06.2009
Адрес: Саров
Сообщений: 133
Сказал спасибо: 1,316
Сказали Спасибо 320 раз(а) в 78 сообщении(ях)
|
Re: Проблемка с внешним прерыванием
Есть еще проблема с минимальным током опроса контактов. Он зависит от типа кнопок и растет по мере эксплуатации. Раньше в справочниках его обязательно указывали.
Собственные подтягивающие резисторы могут дать слишком маленький ток, а при этом длина дребезга неприлично растет. У меня студенты в макетах (обычные черные микрокнопки, встроенный подтягивающий резистор) обнаруживали даже псевдодвойные нажатия, разнесенные на 100..150 мс, хотя, на самом деле, нажатие было одно. Но там я это делал специально, в учебных целях. Чтобы увидели своими глазами.
__________________
Качество программы измеряется в количествах "Что за..." на 10 шагов отладки...
|
|
|
|
Сказали "Спасибо" pisetsky
|
|
|
06.05.2014, 08:00
|
|
|
Временная регистрация
Регистрация: 20.06.2009
Сообщений: 51
Сказал спасибо: 44
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Проблемка с внешним прерыванием
Сообщение от Boba_spb
|
|
Еще б показали как настроены прерывания - по уровню,изменеию уровня ,аль фронту какого? Может от туды чудеса то и лезут?
|
Вот так вот настроено, входные 3 пина настроены как входы с подтягивающим резистором:
|
Код:
|
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// Interrupt on any change on pins PCINT0-7(1): On
// Interrupt on any change on pins PCINT8-14(13): On
// Interrupt on any change on pins PCINT16-23(18): On
EICRA=0x00;
EIMSK=0x00;
PCICR=0x07;
PCMSK0=0x02;
PCMSK1=0x32;
PCMSK2=0x04;
PCIFR=0x07; |
|
|
|
|
06.05.2014, 09:10
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 02.03.2011
Адрес: Россия, КБР
Сообщений: 629
Сказал спасибо: 108
Сказали Спасибо 596 раз(а) в 334 сообщении(ях)
|
Re: Проблемка с внешним прерыванием
Не нужно прерываний для опроса тумблеров/кнопок. Проверять соответствующие входы в теле функции main. Несколько раз подряд, после обнаружения изменения. По мажоритарному принципу делать вывод о истинности изменения. Аналогично с "putchar" - в теле main. Не передавать очередной символ пока не передан текущий, не передавать новые 5 символов пока не будут переданы все текущие (в это время изменения на входах игнорировать или сделать FIFO очередь обработки). Прерывания настраивать один раз при включении прибора и больше не трогать (если нет сильных ЭМП это не понадобиться).
|
|
|
|
06.05.2014, 10:43
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 08.06.2008
Сообщений: 1,393
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: Проблемка с внешним прерыванием
Сообщение от vynt
|
|
Прерывания настраивать один раз при включении прибора и больше не трогать (если нет сильных ЭМП это не понадобиться).
|
Может надо просто научиться работать с прерываниями ?
|
|
|
|
06.05.2014, 10:48
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 08.06.2008
Сообщений: 1,393
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: Проблемка с внешним прерыванием
Сообщение от insiderbik
|
Вот так вот настроено, входные 3 пина настроены как входы с подтягивающим резистором:
|
Код:
|
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// Interrupt on any change on pins PCINT0-7(1): On
// Interrupt on any change on pins PCINT8-14(13): On
// Interrupt on any change on pins PCINT16-23(18): On
EICRA=0x00;
EIMSK=0x00;
PCICR=0x07;
PCMSK0=0x02;
PCMSK1=0x32;
PCMSK2=0x04;
PCIFR=0x07; |
|
Что - то, похоже (на AVR писал всегда на ASMe ) , что прерывания не по изменению настроены, а изкому уровню. Процессор то какой пользуете?
|
|
|
|
06.05.2014, 16:31
|
|
|
Временная регистрация
Регистрация: 20.06.2009
Сообщений: 51
Сказал спасибо: 44
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Проблемка с внешним прерыванием
Сообщение от Boba_spb
|
|
Что - то, похоже (на AVR писал всегда на ASMe ) , что прерывания не по изменению настроены, а изкому уровню. Процессор то какой пользуете?
|
все там правильно настроено. процессор atmega88pa. в майне не делал опрос, потому что он другие функции там выполняет. ошибку нашел. сейчас скину код прерываний:
|
Код:
|
// Pin change 0-7 interrupt service routine
interrupt [PC_INT0] void pin_change_isr0(void) // прерывание по изменению уровня на входе PCINT1 (ВКЛ3/ВЫКЛ3)
{
delay_ms(200); // задержка на 200 мс для ликвидации эффекта дребезга контактов
PCIFR.0 = 1; // сбрасываем флаг прерывания PC_INT0
if (PINB.1 == 1) // если ВКЛ3, то:
{
putchar(33); // 5 раз отправляем в передатчик USART число 33 для включения 3й нагрузки
putchar(33); //
putchar(33); //
putchar(33); //
putchar(33); //
}
if (PINB.1 == 0) // если ВЫКЛ3, то:
{
putchar(133); // 5 раз отправляем в передатчик USART число 133 для выключения 3й нагрузки
putchar(133); //
putchar(133); //
putchar(133); //
putchar(133); //
}
}
// Pin change 8-14 interrupt service routine
interrupt [PC_INT1] void pin_change_isr1(void) // прерывание по изменению уровня на входе PCINT13 (ВКЛ2/ВЫКЛ2)
{
delay_ms(200); // задержка на 200 мс для ликвидации эффекта дребезга контактов
PCIFR.1 = 1; // сбрасываем флаг прерывания PC_INT1
if (PINC.5 == 1) // если ВКЛ2, то:
{
putchar(22); // 5 раз отправляем в передатчик USART число 22 для включения 2й нагрузки
putchar(22); //
putchar(22); //
putchar(22); //
putchar(22); //
}
if (PINC.5 == 0) // если ВЫКЛ2, то:
{
putchar(222); // 5 раз отправляем в передатчик USART число 222 для выключения 2й нагрузки
putchar(222); //
putchar(222); //
putchar(222); //
putchar(222); //
}
}
// Pin change 16-23 interrupt service routine
interrupt [PC_INT2] void pin_change_isr2(void) // прерывание по изменению уровня на входе PCINT18 (ВКЛ1/ВЫКЛ1)
{
delay_ms(200); // задержка на 200 мс для ликвидации эффекта дребезга контактов
PCIFR.2 = 1; // сбрасываем флаг прерывания PC_INT2
if (PIND.2 == 1) // если ВКЛ1, то:
{
putchar(11); // 5 раз отправляем в передатчик USART число 11 для включения 1й нагрузки
putchar(11); //
putchar(11); //
putchar(11); //
putchar(11); //
}
if (PIND.2 == 0) // если ВЫКЛ1, то:
{
putchar(111); // 5 раз отправляем в передатчик USART число 111 для выключения 1й нагрузки
putchar(111); //
putchar(111); //
putchar(111); //
putchar(111); //
}
} |
|
|
|
|
06.05.2014, 18:39
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 08.06.2008
Сообщений: 1,393
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: Проблемка с внешним прерыванием
В PCMSK1 - три пина заряжено - эт кто тама дрыгается?
|
|
|
|
Сказали "Спасибо" Boba_spb
|
|
|
06.05.2014, 21:48
|
|
|
Временная регистрация
Регистрация: 20.06.2009
Сообщений: 51
Сказал спасибо: 44
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Проблемка с внешним прерыванием
Сообщение от Boba_spb
|
|
В PCMSK1 - три пина заряжено - эт кто тама дрыгается?
|
три прерывания и на каждом по пину дрыгается. вообщем, кто поучавствовал - всем спасибо, все работает просто супер
|
|
|
|
07.05.2014, 08:12
|
|
|
Временная регистрация
Регистрация: 20.06.2009
Сообщений: 51
Сказал спасибо: 44
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Проблемка с внешним прерыванием
Сообщение от Boba_spb
|
|
В PCMSK1 - три пина заряжено - эт кто тама дрыгается?
|
А да вы правы - просто сначала хотел под одним прерыванием все три сделать, а затем разнес на три разных прерывания, а настройки остались, но все равно работает, а от наводок подтяжка бы спасла, если бы случился какой эксцесс
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 20:54.
|
|