ATtiny2313 Timer0

Обсуждаем контроллеры компании Atmel.
Ответить
andrey_ims
Открыл глаза
Сообщения: 73
Зарегистрирован: Пн июл 01, 2013 22:38:09

ATtiny2313 Timer0

Сообщение 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 прерывания? Или нужно перед запуском таймера его каждый раз обнулять?
Реклама
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Re: ATtiny2313 Timer0

Сообщение COKPOWEHEU »

В режиме Normal сбрасывается только по переполнению, но не по сравнению
В режиме CTC сбрасывается по сравнению
Доступно ли это для Т0 не помню
Реклама
andrey_ims
Открыл глаза
Сообщения: 73
Зарегистрирован: Пн июл 01, 2013 22:38:09

Re: ATtiny2313 Timer0

Сообщение andrey_ims »

COKPOWEHEU писал(а):В режиме Normal сбрасывается только по переполнению, но не по сравнению
В режиме CTC сбрасывается по сравнению
Доступно ли это для Т0 не помню


В Т0 доступно, спасибо
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: ATtiny2313 Timer0

Сообщение urry »

это ничего не меняет. Разрешение прерывание - есть, нет - таймер тикает. если ему разрешено тикать. Кстати, в тему - на самом деле защиты от дребезга нет - флаг внешнего прерывания взводится, независимо от того, разрешены прерывания или нет.Те. к моменту окончания времени антидребезга флаг уже взведен и благополучно срабатывает при разрешении. А чистки флага нет.
Ваш капитан очевидность.
Реклама
Эиком - электронные компоненты и радиодетали
andrey_ims
Открыл глаза
Сообщения: 73
Зарегистрирован: Пн июл 01, 2013 22:38:09

Re: ATtiny2313 Timer0

Сообщение 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;     
}
...
Реклама
Аватара пользователя
Eugene.Negrobov
Мучитель микросхем
Сообщения: 472
Зарегистрирован: Ср фев 15, 2012 09:00:34
Откуда: Киев

Re: ATtiny2313 Timer0

Сообщение Eugene.Negrobov »

RC цепочку поставь, сработает лучше любого программного антидребезга.
I'm on a huge rock, flying through space!
Реклама
andrey_ims
Открыл глаза
Сообщения: 73
Зарегистрирован: Пн июл 01, 2013 22:38:09

Re: ATtiny2313 Timer0

Сообщение andrey_ims »

Eugene.Negrobov писал(а):RC цепочку поставь, сработает лучше любого программного антидребезга.

Я кондер на 2.2мкф поставил параллельно контакту. Лучше стало, но не полечило на 100%
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: ATtiny2313 Timer0

Сообщение Аlex »

andrey_ims писал(а):Спасибо, переделал:
Не переделали :)
С таким же успехом, Вы могли не использовать флаг bounce_flag, а делать проверку 0-вого бита TIMSK :)
Вы не поняли сути поста urry. После задержки (прерывания от таймера) программа вывалится в INT0, т.к. во время задержки флаг может вновь взвестись из-за дребезга.
andrey_ims
Открыл глаза
Сообщения: 73
Зарегистрирован: Пн июл 01, 2013 22:38:09

Re: ATtiny2313 Timer0

Сообщение andrey_ims »

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


Не-не. На этот раз внешнее прерывание вообще никто не запрещает. После первого прерывания, "дребезжащей" серии, я выставляю bounce-флаг, который при следующих внешних прерываниях просто не разрешает инкрементировать значение. И вот этот флаг снимается через 300мс по таймеру. К тому моменту все, что было взведено уже давно отработало в холостую, без инкремента.
Аватара пользователя
Барсик
Друг Кота
Сообщения: 3459
Зарегистрирован: Ср сен 27, 2006 16:18:57

Re: ATtiny2313 Timer0

Сообщение Барсик »

Вам же написали:
urry писал(а):...флаг внешнего прерывания взводится, независимо от того, разрешены прерывания или нет... А чистки флага нет.
Т.е. флаг INT0 взведётся повторно от дребезга задолго до окончания вашего времени задержки.

Надо сделать так:

В обработчике прерывания INT0:
Инкрементировать Ваш счётчик импульсов.
Обнулить счётчик времени задержки
Запретить прерывание INT0

После истечения времени задержки:
Запретить все прерывания глобально
Очистить флаг прерывания INT0
Разрешить прерывание INT0
Разрешить все прерывания глобально

Если время задержки проверяется внутри обработчика прерывания от таймера, то с глобальными прерываниями заморачиваться не надо.
andrey_ims
Открыл глаза
Сообщения: 73
Зарегистрирован: Пн июл 01, 2013 22:38:09

Re: ATtiny2313 Timer0

Сообщение andrey_ims »

Барсик писал(а):Вам же написали:
urry писал(а):...флаг внешнего прерывания взводится, независимо от того, разрешены прерывания или нет... А чистки флага нет.



Повторяю, что после исправления, я НЕ ЗАПРЕЩАЮ внешние прерывания вообще! Я, внутри внешнего прерывания, в зависимости от флага выставляемого таймером, либо провожу инкремент счетчика, либо нет.
По поводу вашего решения - я не могу себе позволить запрещать все прерывания, они мне нужны.
andrey_ims
Открыл глаза
Сообщения: 73
Зарегистрирован: Пн июл 01, 2013 22:38:09

Re: ATtiny2313 Timer0

Сообщение andrey_ims »

В свете последних сведений о работе водомера, программный дребезг решено убрать.
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: ATtiny2313 Timer0

Сообщение vitalik_1984 »

И что же это за сверхсекретные сведения???
andrey_ims
Открыл глаза
Сообщения: 73
Зарегистрирован: Пн июл 01, 2013 22:38:09

Re: ATtiny2313 Timer0

Сообщение andrey_ims »

vitalik_1984 писал(а):И что же это за сверхсекретные сведения???


:-) Не секретные, а печальные.
Я почему-то был уверен, что геркон в водомере замыкается ненадолго, в виде щелчка. Оказалось, он замыкается достаточно надолго, в моем случае на 4 литра.
Т.е. если сразу после замыкания закрыть воду, то контакт остается замкнутым сколько угодно долго. Еще печальнее то, что осциллографа у меня нет, поэтому пробую все вслепую.

Защита от дребезга в виде параллельного кондера убирает дребезг только на замыкании, а при размыкании дребезг "сглаживается" в еще один короткий импульс.
Я попробовал убрать программную задержку и просто делить значение счетчика пополам. Сейчас вот тестирую. Пока похоже на правду.

А программную задержку возможно применю к другому внешнему прерыванию - от фототранзистора. Т.к. счетчик вспышек с электросчетчика чуть-чуть убегает вперед.

Вообще интересно, какую погрешность в работе можно считать хорошим результатом?

Вот еще нашел интересный документ
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: ATtiny2313 Timer0

Сообщение vitalik_1984 »

я где то видел, что лепят магнит на колесико, которое крутится под стеклом, вроде как должно точнее получаться. Снаружи можно датчик холла или геркон.
Teplotexnik
Первый раз сказал Мяу!
Сообщения: 26
Зарегистрирован: Вт сен 17, 2013 01:59:48

Re: ATtiny2313 Timer0

Сообщение Teplotexnik »

нам немного помогло то, что вокруг датчиков надели пластиковые трубки для уменьшения колебаний воды. решайте саму проблему, а не ее последствия.
andrey_ims
Открыл глаза
Сообщения: 73
Зарегистрирован: Пн июл 01, 2013 22:38:09

Re: ATtiny2313 Timer0

Сообщение andrey_ims »

Кому интересно, я все же закончил
http://habrahabr.ru/post/194402/
Ответить

Вернуться в «AVR»