Timer1 для подсчёта внешних импульсов
- Войдите на сайт для отправки комментариев
Пт, 16/02/2018 - 09:32
Доброго дня!
Возникла задача отсчитывать заданное оператором число импульсов с датчика потока (частота десятки/сотни Гц) и производить серию переключений. Решил попробовать реализовать на таймере, прерывание по совпадению. Почитал разные похожие решения, получился следующий тестовый код:
volatile int a;
void counterInit (void) //инициализация таймера/счётчика
{
TCNT1 = 0;
TCCR1A = 0;
TCCR1B = (1<<WGM12)|(1<<CS12)|(1<<CS11); // CTC | Ext.clk src on T1 pin falling edge
OCR1A = 50;
TIMSK1 = 0b00000010; // OCIEA
sei();
}
ISR(TIMER1_COMPA_vect) //обработчик прерывания по совпадению А
{
a++;
}
По задумке, каждые 50 импульсов переменная а должна увеличиваться, однако тишина. Что-то или напутал, или недоделал, подскажите куда копать.
Упс... заработало... :) Всего-то сделал, что перенёс инициализацию из подпрограммы в модуль void setup()
void setup() { BW_pc = EEPROM.read(0); //читаем проценты из епром pinMode(LED_BUILTIN, OUTPUT); pinMode(A0, INPUT_PULLUP); //низкий уровень в баке pinMode(A1, INPUT_PULLUP); //средний уровень в баке pinMode(A2, INPUT_PULLUP); //высокий уровень в баке pinMode(A3, INPUT_PULLUP); //аналоговый вход для кнопок pinMode(5, INPUT_PULLUP); //вход счётчика импульсов LC.shutdown(0, false); //Отключение энергосберегающего режима LC.setIntensity(0, 7); //Установка яркости свечения сегментов в дисплее // counterInit; //инициализация таймера-счётчика but_old = BUTTON_NONE; but_num = 0; a = 5; TCNT1 = 0; TCCR1A = 0; TCCR1B = (1<<WGM12)|(1<<CS12)|(1<<CS11); // CTC | Ext.clk src on T1 pin falling edge OCR1A = 50; TIMSK1 = 0b00000010; // OCIEA sei(); }Поторопился. Не знаю, как удалить тему...