Страница 1 из 1
ATtiny2313 Timer0
Добавлено: Пт сен 13, 2013 16:54:34
andrey_ims
Всем привет!
Осваиваю таймеры микроконтроллера. Сейчас я считаю внешние прерывания от счетчика воды. Проблема в том, что у счетчика воды дребезжат контакты и я хочу после каждого прерывания делать задержку на 300мс.
Идея такова: в обработчике внешнего прерывания, я запрещаю это прерывание и разрешаю прерывание таймера. По событию таймера я запрещаю таймер и снова разрешаю внешнее прерывание. Я сделал так:
Код: Выделить всё
...
// Timer/Counter 0 initialization
TCCR0A=0x02; // Set CTC mode(interrupt on math)
TCCR0B=0x05; // Set 1/1024 clock prescaler (0,977 kHz)
TCNT0=0x00; // Default timer0 value=0
OCR0A=0xFF; // Math A register value=FF
OCR0B=0x00; // Math A register value=FF
TIMSK=0x00; // Disable timer
...
// Interrupt from water counter.
interrupt [EXT_INT0] void ext_int0_isr(void)
{
waterCounter++;
GIMSK &= (0<<INT0);
TIMSK=0x01;
}
...
//---------- 0 output compare A----------------
interrupt [TIM0_COMPA] void timer0_compa_isr(void)
{
GIMSK |= (1<<INT0);
TIMSK=0x00;
}
Вопрос в том, сбрасывается ли таймер в ноль по наступлению math прерывания? Или нужно перед запуском таймера его каждый раз обнулять?
Re: ATtiny2313 Timer0
Добавлено: Пт сен 13, 2013 20:09:05
COKPOWEHEU
В режиме Normal сбрасывается только по переполнению, но не по сравнению
В режиме CTC сбрасывается по сравнению
Доступно ли это для Т0 не помню
Re: ATtiny2313 Timer0
Добавлено: Пт сен 13, 2013 20:18:43
andrey_ims
COKPOWEHEU писал(а):В режиме Normal сбрасывается только по переполнению, но не по сравнению
В режиме CTC сбрасывается по сравнению
Доступно ли это для Т0 не помню
В Т0 доступно, спасибо
Re: ATtiny2313 Timer0
Добавлено: Пт сен 13, 2013 22:13:06
urry
это ничего не меняет. Разрешение прерывание - есть, нет - таймер тикает. если ему разрешено тикать. Кстати, в тему - на самом деле защиты от дребезга нет - флаг внешнего прерывания взводится, независимо от того, разрешены прерывания или нет.Те. к моменту окончания времени антидребезга флаг уже взведен и благополучно срабатывает при разрешении. А чистки флага нет.
Ваш капитан очевидность.
Re: ATtiny2313 Timer0
Добавлено: Вс сен 15, 2013 12:11:23
andrey_ims
urry писал(а):это ничего не меняет. Разрешение прерывание - есть, нет - таймер тикает. если ему разрешено тикать. Кстати, в тему - на самом деле защиты от дребезга нет - флаг внешнего прерывания взводится, независимо от того, разрешены прерывания или нет.Те. к моменту окончания времени антидребезга флаг уже взведен и благополучно срабатывает при разрешении. А чистки флага нет.
Ваш капитан очевидность.
Спасибо, переделал:
Код: Выделить всё
...
interrupt [EXT_INT0] void ext_int0_isr(void)
{
if (bounce_flag == 0){
bounce_flag = 1;
TIMSK=0x01;
waterCounter++;
}
}
...
interrupt [TIM0_COMPA] void timer0_compa_isr(void)
{
// Anti contact bounce.
bounce_flag = 0;
TIMSK=0x00;
}
...
Re: ATtiny2313 Timer0
Добавлено: Вс сен 15, 2013 14:57:43
Eugene.Negrobov
RC цепочку поставь, сработает лучше любого программного антидребезга.
Re: ATtiny2313 Timer0
Добавлено: Вс сен 15, 2013 15:19:55
andrey_ims
Eugene.Negrobov писал(а):RC цепочку поставь, сработает лучше любого программного антидребезга.
Я кондер на 2.2мкф поставил параллельно контакту. Лучше стало, но не полечило на 100%
Re: ATtiny2313 Timer0
Добавлено: Вс сен 15, 2013 15:24:06
Аlex
andrey_ims писал(а):Спасибо, переделал:
Не переделали

С таким же успехом, Вы могли не использовать флаг
bounce_flag, а делать проверку 0-вого бита
TIMSK
Вы не поняли сути поста
urry. После задержки (прерывания от таймера) программа вывалится в INT0, т.к. во время задержки флаг может вновь взвестись из-за дребезга.
Re: ATtiny2313 Timer0
Добавлено: Вс сен 15, 2013 15:32:27
andrey_ims
Аlex писал(а):Не переделали

С таким же успехом, Вы могли не использовать флаг
bounce_flag, а делать проверку 0-вого бита
TIMSK
Вы не поняли сути поста
urry. После задержки (прерывания от таймера) программа вывалится в INT0, т.к. во время задержки флаг может вновь взвестись из-за дребезга.
Не-не. На этот раз внешнее прерывание вообще никто не запрещает. После первого прерывания, "дребезжащей" серии, я выставляю bounce-флаг, который при следующих внешних прерываниях просто не разрешает инкрементировать значение. И вот этот флаг снимается через 300мс по таймеру. К тому моменту все, что было взведено уже давно отработало в холостую, без инкремента.
Re: ATtiny2313 Timer0
Добавлено: Пн сен 16, 2013 18:33:25
Барсик
Вам же написали:
urry писал(а):...флаг внешнего прерывания взводится, независимо от того, разрешены прерывания или нет... А чистки флага нет.
Т.е. флаг INT0 взведётся повторно от дребезга задолго до окончания вашего времени задержки.
Надо сделать так:
В обработчике прерывания INT0:
Инкрементировать Ваш счётчик импульсов.
Обнулить счётчик времени задержки
Запретить прерывание INT0
После истечения времени задержки:
Запретить все прерывания глобально
Очистить флаг прерывания INT0
Разрешить прерывание INT0
Разрешить все прерывания глобально
Если время задержки проверяется внутри обработчика прерывания от таймера, то с глобальными прерываниями заморачиваться не надо.
Re: ATtiny2313 Timer0
Добавлено: Вт сен 17, 2013 13:29:38
andrey_ims
Барсик писал(а):Вам же написали:
urry писал(а):...флаг внешнего прерывания взводится, независимо от того, разрешены прерывания или нет... А чистки флага нет.
Повторяю, что после исправления, я НЕ ЗАПРЕЩАЮ внешние прерывания вообще! Я, внутри внешнего прерывания, в зависимости от флага выставляемого таймером, либо провожу инкремент счетчика, либо нет.
По поводу вашего решения - я не могу себе позволить запрещать все прерывания, они мне нужны.
Re: ATtiny2313 Timer0
Добавлено: Вт сен 17, 2013 13:34:35
andrey_ims
В свете последних сведений о работе водомера, программный дребезг решено убрать.
Re: ATtiny2313 Timer0
Добавлено: Вт сен 17, 2013 21:46:45
vitalik_1984
И что же это за сверхсекретные сведения???
Re: ATtiny2313 Timer0
Добавлено: Ср сен 18, 2013 09:08:25
andrey_ims
vitalik_1984 писал(а):И что же это за сверхсекретные сведения???

Не секретные, а печальные.
Я почему-то был уверен, что геркон в водомере замыкается ненадолго, в виде щелчка. Оказалось, он замыкается достаточно надолго, в моем случае на 4 литра.
Т.е. если сразу после замыкания закрыть воду, то контакт остается замкнутым сколько угодно долго. Еще печальнее то, что осциллографа у меня нет, поэтому пробую все вслепую.
Защита от дребезга в виде параллельного кондера убирает дребезг только на замыкании, а при размыкании дребезг "сглаживается" в еще один короткий импульс.
Я попробовал убрать программную задержку и просто делить значение счетчика пополам. Сейчас вот тестирую. Пока похоже на правду.
А программную задержку возможно применю к другому внешнему прерыванию - от фототранзистора. Т.к. счетчик вспышек с электросчетчика чуть-чуть убегает вперед.
Вообще интересно, какую погрешность в работе можно считать хорошим результатом?
Вот еще нашел интересный
документ
Re: ATtiny2313 Timer0
Добавлено: Ср сен 18, 2013 11:49:52
vitalik_1984
я где то видел, что лепят магнит на колесико, которое крутится под стеклом, вроде как должно точнее получаться. Снаружи можно датчик холла или геркон.
Re: ATtiny2313 Timer0
Добавлено: Ср сен 18, 2013 18:27:35
Teplotexnik
нам немного помогло то, что вокруг датчиков надели пластиковые трубки для уменьшения колебаний воды. решайте саму проблему, а не ее последствия.
Re: ATtiny2313 Timer0
Добавлено: Пт сен 20, 2013 09:35:08
andrey_ims
Кому интересно, я все же закончил
http://habrahabr.ru/post/194402/