timer - прерывания от таймера

В примере timer демонстрируется использование класса, реализующего функции 16-битного таймера-счётчика 1, для управления временем задержки мигающего светодиода с помощью потенциометра.

Исходный код примера:

/* 
 * timer.cpp 
 * 
 *  VE_AVR_Library Timer/Counter LED Blinking Using ADC Control Example. 
 * 
 *  Created on: 11.05.2012 
 *  Author: andrey 
 */ 
#include <ve_avr.h> 
#include <misc/ve_led.h> 
#include <misc/ve_pot.h>  

#define LED              DEV_GPIOB, 7       // Светодиод LED подключен к выводу PB7 микроконтроллера 
#define LED_POT_CHANNEL  AnalogMux::CH_ADC0 // Потенциометр LED_POT_CHANNEL подключен к выводу ADC0
                                            // микроконтроллера  
volatile bool bLedOn = false;     // Флаг состояния светодиода LED (false - выключен) 
volatile uint16_t potValue;       // Значение напряжение потенциометра LED_POT_CHANNEL умноженное на 64  

int main() 
{
   DEV_POWER.adcOn();     // Включаем питание АЦП
   DEV_POWER.timer1On();  // Включаем питание таймера-счётчика 1

   led::setup(LED);       // Предварительная настройка вывода светодиода LED

   Pot pot;
   pot.setup(LED_POT_CHANNEL);     // Предварительная настройка канала АЦП LED_POT_CHANNEL
   potValue = pot.getValue() << 6; // Первый опрос АЦП
 
   // Предварительная настройка таймера-счётчика 1
   DEV_TIMER1.setClockSelect(TimerW::Prescaler_64);    // Рабочая частота CLKIO/64 (например 16 МГц / 64 = 250 кГц)
   DEV_TIMER1.setWaveGenMode(TimerW::FastPWM_OCRA);    // Режим быстрого ШИМ со сравнением TCNT1 == OCR1A
   DEV_TICTRL1.outCompIntEnableA();                    // Разрешить прерывание сравнения (TIMER1_COMPA_vect)

   enableInterrupts();                                 // Разрешить прерывания
   while(true) {
      potValue = pot.getValue() << 6;   // Опрос состояния потенциометра и рассчёт времени задержки
      if (bLedOn)                       // Если светодиод LED должен светиться
         led::on(LED);                  // включить светодиод LED
      else                              // и наоборот
         led::off(LED);
   }
}
  
ISR(TIMER1_COMPA_vect)                  // Обработчик прерывания TIMER1_COMPA_vect 
{
   DEV_TIMER1.setOutputCompareA(potValue); // Установить интервал времени до следующего прерывания
   bLedOn = ! bLedOn;                      // Переключить состояние светодиода через флаг состояния 
}

Следующий пример: usart - передача данных по последовательному порту USART.

Предыдущий пример: adc - считывание значения напряжения потенциометра.

Скачать библиотеку VE_AVR.

Автор: Андрей Шаройко <vanyamboe@gmail.com>