Портал для радиолюбителей и разработчиков электроники · с 2003 годаРеклама на сайте
Найти компонент, схему или даташит

Даташиты, справочник отечественных приборов, схемы с разбором и живой форум

AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR...

 
Опции темы

Проблемка с внешним прерыванием

Непрочитано 05.05.2014, 22:27  
akegor
Гуру портала
 
Аватар для akegor
 
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,313
Сказал спасибо: 2,633
Сказали Спасибо 12,076 раз(а) в 6,082 сообщении(ях)
akegor на пути к лучшему
По умолчанию Re: Проблемка с внешним прерыванием

Сообщение от ForcePoint Посмотреть сообщение
И не всякие putchar'ы тоже. Кстати, какой он у Вас?
Скорее всего putchar на прерываниях с буфером. Отработает после разрешения прерываний.
А вот разрешение прерываний внутри прерывания - убрать и будет счастье.
Задержка в прерывании - некрасиво, но в данном случае никому не мешает (кроме, разве что, глаз колет) и спасает от дребезга без танцев с бубном.
Реклама:
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
akegor вне форума  
Сказали "Спасибо" akegor
insiderbik (06.05.2014)
Непрочитано 06.05.2014, 07:55  
pisetsky
Прописка
 
Аватар для pisetsky
 
Регистрация: 09.06.2009
Адрес: Саров
Сообщений: 133
Сказал спасибо: 1,316
Сказали Спасибо 320 раз(а) в 78 сообщении(ях)
pisetsky на пути к лучшему
По умолчанию Re: Проблемка с внешним прерыванием

Есть еще проблема с минимальным током опроса контактов. Он зависит от типа кнопок и растет по мере эксплуатации. Раньше в справочниках его обязательно указывали.
Собственные подтягивающие резисторы могут дать слишком маленький ток, а при этом длина дребезга неприлично растет. У меня студенты в макетах (обычные черные микрокнопки, встроенный подтягивающий резистор) обнаруживали даже псевдодвойные нажатия, разнесенные на 100..150 мс, хотя, на самом деле, нажатие было одно. Но там я это делал специально, в учебных целях. Чтобы увидели своими глазами.
__________________
Качество программы измеряется в количествах "Что за..." на 10 шагов отладки...
pisetsky вне форума  
Сказали "Спасибо" pisetsky
insiderbik (06.05.2014)
Непрочитано 06.05.2014, 08:00  
insiderbik
Временная регистрация
 
Регистрация: 20.06.2009
Сообщений: 51
Сказал спасибо: 44
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
insiderbik на пути к лучшему
По умолчанию 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;
insiderbik вне форума  
Непрочитано 06.05.2014, 09:10  
vynt
Почётный гражданин KAZUS.RUN
 
Аватар для vynt
 
Регистрация: 02.03.2011
Адрес: Россия, КБР
Сообщений: 629
Сказал спасибо: 108
Сказали Спасибо 596 раз(а) в 334 сообщении(ях)
vynt на пути к лучшему
По умолчанию Re: Проблемка с внешним прерыванием

Не нужно прерываний для опроса тумблеров/кнопок. Проверять соответствующие входы в теле функции main. Несколько раз подряд, после обнаружения изменения. По мажоритарному принципу делать вывод о истинности изменения. Аналогично с "putchar" - в теле main. Не передавать очередной символ пока не передан текущий, не передавать новые 5 символов пока не будут переданы все текущие (в это время изменения на входах игнорировать или сделать FIFO очередь обработки). Прерывания настраивать один раз при включении прибора и больше не трогать (если нет сильных ЭМП это не понадобиться).
vynt вне форума  
Сказали "Спасибо" vynt
insiderbik (06.05.2014)
Непрочитано 06.05.2014, 10:43  
Boba_spb
Почётный гражданин KAZUS.RUN
 
Регистрация: 08.06.2008
Сообщений: 1,393
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
Boba_spb на пути к лучшему
По умолчанию Re: Проблемка с внешним прерыванием

Сообщение от vynt Посмотреть сообщение
Прерывания настраивать один раз при включении прибора и больше не трогать (если нет сильных ЭМП это не понадобиться).
Может надо просто научиться работать с прерываниями ?
Boba_spb вне форума  
Непрочитано 06.05.2014, 10:48  
Boba_spb
Почётный гражданин KAZUS.RUN
 
Регистрация: 08.06.2008
Сообщений: 1,393
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
Boba_spb на пути к лучшему
По умолчанию 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 ) , что прерывания не по изменению настроены, а изкому уровню. Процессор то какой пользуете?
Boba_spb вне форума  
Непрочитано 06.05.2014, 16:31  
insiderbik
Временная регистрация
 
Регистрация: 20.06.2009
Сообщений: 51
Сказал спасибо: 44
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
insiderbik на пути к лучшему
По умолчанию 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);                                   //                
                }                                    
}
insiderbik вне форума  
Непрочитано 06.05.2014, 18:39  
Boba_spb
Почётный гражданин KAZUS.RUN
 
Регистрация: 08.06.2008
Сообщений: 1,393
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
Boba_spb на пути к лучшему
По умолчанию Re: Проблемка с внешним прерыванием

В PCMSK1 - три пина заряжено - эт кто тама дрыгается?
Boba_spb вне форума  
Сказали "Спасибо" Boba_spb
insiderbik (06.05.2014)
Непрочитано 06.05.2014, 21:48  
insiderbik
Временная регистрация
 
Регистрация: 20.06.2009
Сообщений: 51
Сказал спасибо: 44
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
insiderbik на пути к лучшему
По умолчанию Re: Проблемка с внешним прерыванием

Сообщение от Boba_spb Посмотреть сообщение
В PCMSK1 - три пина заряжено - эт кто тама дрыгается?
три прерывания и на каждом по пину дрыгается. вообщем, кто поучавствовал - всем спасибо, все работает просто супер
insiderbik вне форума  
Непрочитано 07.05.2014, 08:12  
insiderbik
Временная регистрация
 
Регистрация: 20.06.2009
Сообщений: 51
Сказал спасибо: 44
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
insiderbik на пути к лучшему
По умолчанию Re: Проблемка с внешним прерыванием

Сообщение от Boba_spb Посмотреть сообщение
В PCMSK1 - три пина заряжено - эт кто тама дрыгается?
А да вы правы - просто сначала хотел под одним прерыванием все три сделать, а затем разнес на три разных прерывания, а настройки остались, но все равно работает, а от наводок подтяжка бы спасла, если бы случился какой эксцесс
insiderbik вне форума  
 
Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Есть ли лазерные принтеры с внешним БП? woroba Ремонт оргтехники 8 04.10.2012 13:53
Проблема с внешним прерыванием на ATMEGA64 Gn0me Микроконтроллеры, АЦП, память и т.д 8 23.06.2010 15:31
Проблема с прерыванием SPPeis Микроконтроллеры, АЦП, память и т.д 14 28.05.2010 11:18
проблемка с ID FT2232D serb-radio Микроконтроллеры, АЦП, память и т.д 0 05.11.2008 09:56


Часовой пояс GMT +4, время: 20:54.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.