Прерывание по таймеру (на примере Atmega8)

Тема в разделе "Микроконтроллеры AVR", создана пользователем DrProg, 19 ноя 2015.

  1. DrProg

    DrProg Вечный нерд

    Возможно и эта информация будет полезна для начинающих. Лично я, в свое время, был бы благодарен за этот простой пример, он здорово сэкономил бы мне время для освоения.

    Прерывание по таймеру с периодом 1 сек для случая тактовой частоты МК 8МГц (запуск таймера и обработчик прерывания):
    Код (C++):
    void setup() {
      pinMode(13, OUTPUT);// настройка светодиода для примера работы прерывания

      TCCR1A = 0;         // настройка таймера 1, канала А
      TCCR1B = 04;        // предделитель CLK/256;
      OCR1A = 0x7A11;     // прерывание раз в секунду
      TIMSK = 0b00010000; // запуск таймера по совпадению 1А
      sei();              // разрешаем прерывания (запрещаем: cli(); )
    }

    void loop() {
                           // в примере loop пуст
    }



    ISR(TIMER1_COMPA_vect)  //обработчик прерывания по совпадению 1А
    {
      digitalWrite(13, !digitalRead(13));  // пример обработки прерывания (переключает состояние светодиода)
      TCNT1 = 0;            //обнуляем регистр TCNT1
    }
     
    Последнее редактирование: 19 ноя 2015
    ИгорьК и Tomasina нравится это.
  2. Tomasina

    Tomasina Сушитель лампочек Модератор

    А как другие интервалы?
     
  3. DrProg

    DrProg Вечный нерд

    Ну это принципиальный пример, чтобы вообще сдвинуться с места в понимании как оно работает. Не знаю надо ли копировать сюда таблицу с предделителем и формулу для подсчета тиков в зависимости этого предделителя и частоты работы МК. Кстати, удобные калькуляторы есть для Андроида (и для других осей наверняка), я ими пользуюсь чтобы каждый раз вручную не пересчитывать значение OCR.
     
    ИгорьК нравится это.
  4. DrProg

    DrProg Вечный нерд

    Библиотеки это не "тру". )
    Тем более они, как правило, жестко привязаны к конкретному таймеру, запустить более одного уже сложновато. Да и какой смысл, если запуск через регистры занимает всего пять строчек? Не намного сложнее, разве что один раз подсчитать циферки. А еще можно считать не только время, но и внешние события, например количество оборотов колеса без отрыва от основной программы. Библиотеки такого не умеют.
     
    ИгорьК нравится это.