Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту

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

 
Опции темы

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

Непрочитано 05.05.2014, 16:34  
insiderbik
Временная регистрация
 
Регистрация: 20.06.2009
Сообщений: 51
Сказал спасибо: 44
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
insiderbik на пути к лучшему
По умолчанию Проблемка с внешним прерыванием

Здравствуйте, уважаемые форумчане!
Помогите разобраться с проблемкой, ниже излагаю код обработчиков прерываний CVAVR:

Код:
// Pin change 0-7 interrupt service routine
interrupt [PC_INT0] void pin_change_isr0(void)          // прерывание по изменению уровня на входе PCINT1 (ВКЛ3/ВЫКЛ3)
{
#asm("cli")                                             // глобально запрещаем прерывания
delay_ms(200);                                          // задержка на 200 мс для ликвидации эффекта дребезга контактов
#asm("sei")                                             // глобально разрешаем прерывания

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)
{
#asm("cli")                                             // глобально запрещаем прерывания
delay_ms(200);                                          // задержка на 200 мс для ликвидации эффекта дребезга контактов
#asm("sei")                                             // глобально разрешаем прерывания

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)
{
#asm("cli")                                             // глобально запрещаем прерывания
delay_ms(200);                                          // задержка на 200 мс для ликвидации эффекта дребезга контактов
#asm("sei")                                             // глобально разрешаем прерывания

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);                                   //                
                }                                    
}
Вообщем ситуация следующая: имеются три тумблера, при изменении состояния тумблера в зависимости от его необходимо послать определенный код в UART 5 раз. На деле чаще посылается 10 раз, чем 5. В чем дело, помогите разобраться?
Реклама:
insiderbik вне форума  
Непрочитано 05.05.2014, 16:41  
Boba_spb
Почётный гражданин KAZUS.RUN
 
Регистрация: 08.06.2008
Сообщений: 1,393
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
Boba_spb на пути к лучшему
По умолчанию Re: Проблемка с внешним прерыванием

Может дребезг контактов?
Boba_spb вне форума  
Сказали "Спасибо" Boba_spb
insiderbik (06.05.2014)
Непрочитано 05.05.2014, 16:59  
nml
Супер-модератор
 
Аватар для nml
 
Регистрация: 13.03.2004
Адрес: Minsk
Сообщений: 2,394
Сказал спасибо: 2,016
Сказали Спасибо 1,356 раз(а) в 591 сообщении(ях)
nml на пути к лучшему
По умолчанию Re: Проблемка с внешним прерыванием

Ну, если речь про тумблеры - зачем вообще городить систему прерываний? Скорость тут не жмет, сделать обычный программный опрос с подавлением дребезга...

И да, в прерывании делать CLI ни к чему - оно УЖЕ. И задержки в прерывании совсем некрасиво.

И SEI в прерывании тоже нехорошо - так как есть реальный шанс рекурсии, в АВРке нету контроллера прерываний.
__________________
[ жизнь приятна и красива, если выпить литр пива ]
nml вне форума  
Сказали "Спасибо" nml
insiderbik (06.05.2014)
Непрочитано 05.05.2014, 17:56  
ForcePoint
Почётный гражданин KAZUS.RUN
 
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 7,457
Сказал спасибо: 3,225
Сказали Спасибо 3,511 раз(а) в 2,392 сообщении(ях)
ForcePoint на пути к лучшему
По умолчанию Re: Проблемка с внешним прерыванием

Ну и putchar (через UART?) в прерывани - тоже серьезный моветон.
А по сути вопроса - схема какая? Может "подтяжку" забыли или мала она? Что за тумблеры, может у них дребезг более 200 мс?

Последний раз редактировалось ForcePoint; 05.05.2014 в 18:01.
ForcePoint вне форума  
Сказали "Спасибо" ForcePoint
insiderbik (06.05.2014)
Непрочитано 05.05.2014, 21:12  
insiderbik
Временная регистрация
 
Регистрация: 20.06.2009
Сообщений: 51
Сказал спасибо: 44
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
insiderbik на пути к лучшему
По умолчанию Re: Проблемка с внешним прерыванием

Сообщение от ForcePoint Посмотреть сообщение
Ну и putchar (через UART?) в прерывани - тоже серьезный моветон.
А по сути вопроса - схема какая? Может "подтяжку" забыли или мала она? Что за тумблеры, может у них дребезг более 200 мс?
Тумблеры обычные советские МТ-1, попробовал больше задержку - не помогает. Подтяжка внутриконтроллерная, замыкание тумблером напрямую на корпус. Когда вылетает 10 слов, что в 9ти переключениях тумблеров из 10, то слова идут подряд без всякой задержки.
insiderbik вне форума  
Непрочитано 05.05.2014, 21:16  
insiderbik
Временная регистрация
 
Регистрация: 20.06.2009
Сообщений: 51
Сказал спасибо: 44
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
insiderbik на пути к лучшему
По умолчанию Re: Проблемка с внешним прерыванием

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

Сообщение от nml Посмотреть сообщение
Ну, если речь про тумблеры - зачем вообще городить систему прерываний? Скорость тут не жмет, сделать обычный программный опрос с подавлением дребезга...

И да, в прерывании делать CLI ни к чему - оно УЖЕ. И задержки в прерывании совсем некрасиво.

И SEI в прерывании тоже нехорошо - так как есть реальный шанс рекурсии, в АВРке нету контроллера прерываний.
Просто хотелось все красиво соорудить с прерываниями по изменению уровня. Мне и 10 слов подходит - все работает на ура, но разобраться просто хотелось бы в чём косяк то.

По вашему в обработчике прерывания они глобально запрещаются сами и разрешаются при выходе?????
insiderbik вне форума  
Непрочитано 05.05.2014, 22:08  
Boba_spb
Почётный гражданин KAZUS.RUN
 
Регистрация: 08.06.2008
Сообщений: 1,393
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
Boba_spb на пути к лучшему
По умолчанию Re: Проблемка с внешним прерыванием

Сообщение от insiderbik Посмотреть сообщение
Дребезг то он и в африке дребезг - против него кли и сеи через задержку
Это где Вас этому учили?
Boba_spb вне форума  
Сказали "Спасибо" Boba_spb
insiderbik (06.05.2014)
Непрочитано 05.05.2014, 22:09  
ForcePoint
Почётный гражданин KAZUS.RUN
 
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 7,457
Сказал спасибо: 3,225
Сказали Спасибо 3,511 раз(а) в 2,392 сообщении(ях)
ForcePoint на пути к лучшему
По умолчанию Re: Проблемка с внешним прерыванием

Сообщение от insiderbik Посмотреть сообщение
Подтяжка внутриконтроллерная,
Попробуйте внешнюю, 2.2-4.7 кОм
Сообщение от insiderbik Посмотреть сообщение
Дребезг то он и в африке дребезг - против него кли и сеи через задержку
Методологически неверно. Задержки в прерываниях категорически недопустимы.
И не всякие putchar'ы тоже. Кстати, какой он у Вас?
Сообщение от insiderbik Посмотреть сообщение
По вашему в обработчике прерывания они глобально запрещаются сами и разрешаются при выходе?????
Не по-нашему, а по документации на контроллер AVR.
ForcePoint вне форума  
Сказали "Спасибо" ForcePoint
insiderbik (05.05.2014)
Непрочитано 05.05.2014, 22:20  
Boba_spb
Почётный гражданин KAZUS.RUN
 
Регистрация: 08.06.2008
Сообщений: 1,393
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
Boba_spb на пути к лучшему
По умолчанию Re: Проблемка с внешним прерыванием

Еще б показали как настроены прерывания - по уровню,изменеию уровня ,аль фронту какого? Может от туды чудеса то и лезут?
Boba_spb вне форума  
Сказали "Спасибо" Boba_spb
insiderbik (06.05.2014)
 
Опции темы

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

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, время: 01:19.


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