Timer1 для подсчёта внешних импульсов

Eprinter
Offline
Зарегистрирован: 16.02.2018

Доброго дня!

Возникла задача отсчитывать заданное оператором число импульсов с датчика потока (частота десятки/сотни Гц) и производить серию переключений. Решил попробовать реализовать на таймере, прерывание по совпадению. Почитал разные похожие решения, получился следующий тестовый код:

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 импульсов переменная а должна увеличиваться, однако тишина. Что-то или напутал, или недоделал, подскажите куда копать.

Eprinter
Offline
Зарегистрирован: 16.02.2018

Упс... заработало... :) Всего-то сделал, что перенёс инициализацию из подпрограммы в модуль 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();
}

Поторопился. Не знаю, как удалить тему...