AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
05.05.2014, 16:34
|
|
Временная регистрация
Регистрация: 20.06.2009
Сообщений: 51
Сказал спасибо: 44
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Проблемка с внешним прерыванием
Здравствуйте, уважаемые форумчане!
Помогите разобраться с проблемкой, ниже излагаю код обработчиков прерываний 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. В чем дело, помогите разобраться?
|
|
|
|
05.05.2014, 16:41
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: Проблемка с внешним прерыванием
Может дребезг контактов?
|
|
|
Сказали "Спасибо" Boba_spb
|
|
|
05.05.2014, 16:59
|
|
Супер-модератор
Регистрация: 13.03.2004
Адрес: Minsk
Сообщений: 2,378
Сказал спасибо: 1,948
Сказали Спасибо 1,327 раз(а) в 578 сообщении(ях)
|
Re: Проблемка с внешним прерыванием
Ну, если речь про тумблеры - зачем вообще городить систему прерываний? Скорость тут не жмет, сделать обычный программный опрос с подавлением дребезга...
И да, в прерывании делать CLI ни к чему - оно УЖЕ. И задержки в прерывании совсем некрасиво.
И SEI в прерывании тоже нехорошо - так как есть реальный шанс рекурсии, в АВРке нету контроллера прерываний.
__________________
[ жизнь приятна и красива, если выпить литр пива ]
|
|
|
|
05.05.2014, 17:56
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 6,792
Сказал спасибо: 2,912
Сказали Спасибо 3,120 раз(а) в 2,111 сообщении(ях)
|
Re: Проблемка с внешним прерыванием
Ну и putchar (через UART?) в прерывани - тоже серьезный моветон.
А по сути вопроса - схема какая? Может "подтяжку" забыли или мала она? Что за тумблеры, может у них дребезг более 200 мс?
Последний раз редактировалось ForcePoint; 05.05.2014 в 18:01.
|
|
|
Сказали "Спасибо" ForcePoint
|
|
|
05.05.2014, 21:12
|
|
Временная регистрация
Регистрация: 20.06.2009
Сообщений: 51
Сказал спасибо: 44
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Проблемка с внешним прерыванием
Сообщение от ForcePoint
|
Ну и putchar (через UART?) в прерывани - тоже серьезный моветон.
А по сути вопроса - схема какая? Может "подтяжку" забыли или мала она? Что за тумблеры, может у них дребезг более 200 мс?
|
Тумблеры обычные советские МТ-1, попробовал больше задержку - не помогает. Подтяжка внутриконтроллерная, замыкание тумблером напрямую на корпус. Когда вылетает 10 слов, что в 9ти переключениях тумблеров из 10, то слова идут подряд без всякой задержки.
|
|
|
|
05.05.2014, 21:16
|
|
Временная регистрация
Регистрация: 20.06.2009
Сообщений: 51
Сказал спасибо: 44
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Проблемка с внешним прерыванием
Сообщение от Boba_spb
|
Может дребезг контактов?
|
Дребезг то он и в африке дребезг - против него кли и сеи через задержку
|
|
|
|
05.05.2014, 21:21
|
|
Временная регистрация
Регистрация: 20.06.2009
Сообщений: 51
Сказал спасибо: 44
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Проблемка с внешним прерыванием
Сообщение от nml
|
Ну, если речь про тумблеры - зачем вообще городить систему прерываний? Скорость тут не жмет, сделать обычный программный опрос с подавлением дребезга...
И да, в прерывании делать CLI ни к чему - оно УЖЕ. И задержки в прерывании совсем некрасиво.
И SEI в прерывании тоже нехорошо - так как есть реальный шанс рекурсии, в АВРке нету контроллера прерываний.
|
Просто хотелось все красиво соорудить с прерываниями по изменению уровня. Мне и 10 слов подходит - все работает на ура, но разобраться просто хотелось бы в чём косяк то.
По вашему в обработчике прерывания они глобально запрещаются сами и разрешаются при выходе?????
|
|
|
|
05.05.2014, 22:08
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: Проблемка с внешним прерыванием
Сообщение от insiderbik
|
Дребезг то он и в африке дребезг - против него кли и сеи через задержку
|
Это где Вас этому учили?
|
|
|
Сказали "Спасибо" Boba_spb
|
|
|
05.05.2014, 22:09
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 6,792
Сказал спасибо: 2,912
Сказали Спасибо 3,120 раз(а) в 2,111 сообщении(ях)
|
Re: Проблемка с внешним прерыванием
Сообщение от insiderbik
|
Подтяжка внутриконтроллерная,
|
Попробуйте внешнюю, 2.2-4.7 кОм
Сообщение от insiderbik
|
Дребезг то он и в африке дребезг - против него кли и сеи через задержку
|
Методологически неверно. Задержки в прерываниях категорически недопустимы.
И не всякие putchar'ы тоже. Кстати, какой он у Вас?
Сообщение от insiderbik
|
По вашему в обработчике прерывания они глобально запрещаются сами и разрешаются при выходе?????
|
Не по-нашему, а по документации на контроллер AVR.
|
|
|
Сказали "Спасибо" ForcePoint
|
|
|
05.05.2014, 22:20
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: Проблемка с внешним прерыванием
Еще б показали как настроены прерывания - по уровню,изменеию уровня ,аль фронту какого? Может от туды чудеса то и лезут?
|
|
|
Сказали "Спасибо" Boba_spb
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 00:09.
|
|