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 - считывание значения напряжения потенциометра.
- blink -- мигающий светодиод
- button -- обработка нажатий кнопки
- adc -- считывание значения напряжения потенциометра
- timer -- прерывания от таймера
- usart -- передача данных по последовательному порту USART
- EEPROM -- чтение и запись данных в память EEPROM
- LEDfade - управление яркостью светодиода с помощью ШИМ
Автор: Андрей Шаройко <vanyamboe@gmail.com>