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

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

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

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

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

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

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.RU
 
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 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,378
Сказал спасибо: 1,948
Сказали Спасибо 1,327 раз(а) в 578 сообщении(ях)
nml на пути к лучшему
По умолчанию Re: Проблемка с внешним прерыванием

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

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

И SEI в прерывании тоже нехорошо - так как есть реальный шанс рекурсии, в АВРке нету контроллера прерываний.
__________________
[ жизнь приятна и красива, если выпить литр пива ]
nml вне форума  
Сказали "Спасибо" nml
insiderbik (06.05.2014)
Непрочитано 05.05.2014, 17:56  
ForcePoint
Почётный гражданин KAZUS.RU
 
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 6,792
Сказал спасибо: 2,912
Сказали Спасибо 3,120 раз(а) в 2,111 сообщении(ях)
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.RU
 
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
Boba_spb на пути к лучшему
По умолчанию Re: Проблемка с внешним прерыванием

Сообщение от insiderbik Посмотреть сообщение
Дребезг то он и в африке дребезг - против него кли и сеи через задержку
Это где Вас этому учили?
Boba_spb вне форума  
Сказали "Спасибо" Boba_spb
insiderbik (06.05.2014)
Непрочитано 05.05.2014, 22:09  
ForcePoint
Почётный гражданин KAZUS.RU
 
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 6,792
Сказал спасибо: 2,912
Сказали Спасибо 3,120 раз(а) в 2,111 сообщении(ях)
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.RU
 
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 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, время: 00:09.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot