Страница 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/