У блозі Ноя Штала є приклад блимання світлодіода за допомогою таймера2 . За допомогою цього та інформаційного аркуша ви маєте змогу адаптувати його до того, який перерив ви хочете використовувати, тобто переривання, нормальну функцію якого ви найбільше можете дозволити відмовитись або готові змінити. Timer2 зазвичай використовується для деяких функцій ШІМ.
Його приклад наводить ATmega2560; Я можу підтвердити, що він також працює з ATmega328p. Перегляньте його сайт для більш корисних прикладів переривання Arduino.
Редагувати:
Ось моя трохи відредагована - переважно в коментарях - версія коду Ноя. Зателефонуйте Timer2init () за допомогою функції Arduino setup () після ініціалізації будь-яких пов'язаних структур даних або апаратних засобів, тому що час і час переривання почнуться, як тільки ви це зробите.
F / ex, я використовував його для мультиплексування 3-значного 7-сегментного дисплея, тому я, перш ніж ініціалізувати таймер, ініціалізував регістри вводу / виводу дисплея та списав дані дисплея в тому місці, де ISR буде шукати його.
У коментарях є таблиця деяких корисних даних про хронологію з опису та мої власні розрахунки для посилання для створення іншої схеми хронометражу.
Макрос ISR () піклується про створення коду введення та виходу переривання для ISR замість нормального входу та виходу функції та пов'язування її з належним вектором переривання. Решта цієї функції - 1) код, який потрібно запустити при кожному перериванні, і 2) код коду для скидання таймера для наступного переривання.
Як було написано, цей параметр повинен потрапляти до ескізу .pde або .ino (або файлу .cpp, якщо ви використовуєте eclipse, f / ex). Ескіз повинен #define LEDPIN, а setup () повинен викликати Timer2init (). Функція циклу може бути порожньою чи ні; світлодіод повинен почати блимати при завантаженні (ну буквально після виклику Timer2init ()).
/*
* From sample interrupt code published by Noah Stahl on his blog, at:
* http://arduinomega.blogspot.com/p/arduino-code.html
*
*/
/*** FUNC
Name: Timer2init
Function: Init timer 2 to interrupt periodically. Call this from
the Arduino setup() function.
Description: The pre-scaler and the timer count divide the timer-counter
clock frequency to give a timer overflow interrupt rate:
Interrupt rate = 16MHz / (prescaler * (255 - TCNT2))
TCCR2B[b2:0] Prescaler Freq [KHz], Period [usec] after prescale
0x0 (TC stopped) 0 0
0x1 1 16000. 0.0625
0x2 8 2000. 0.500
0x3 32 500. 2.000
0x4 64 250. 4.000
0x5 128 125. 8.000
0x6 256 62.5 16.000
0x7 1024 15.625 64.000
Parameters: void
Returns: void
FUNC ***/
void Timer2init() {
// Setup Timer2 overflow to fire every 8ms (125Hz)
// period [sec] = (1 / f_clock [sec]) * prescale * (255-count)
// (1/16000000) * 1024 * (255-130) = .008 sec
TCCR2B = 0x00; // Disable Timer2 while we set it up
TCNT2 = 130; // Reset Timer Count (255-130) = execute ev 125-th T/C clock
TIFR2 = 0x00; // Timer2 INT Flag Reg: Clear Timer Overflow Flag
TIMSK2 = 0x01; // Timer2 INT Reg: Timer2 Overflow Interrupt Enable
TCCR2A = 0x00; // Timer2 Control Reg A: Wave Gen Mode normal
TCCR2B = 0x07; // Timer2 Control Reg B: Timer Prescaler set to 1024
}
/*** FUNC
Name: Timer2 ISR
Function: Handles the Timer2-overflow interrupt
Description: Maintains the 7-segment display
Parameters: void
Returns: void
FUNC ***/
ISR(TIMER2_OVF_vect) {
static unsigned int led_state = 0; // LED state
led_state = !led_state; // toggles the LED state
digitalWrite(TOGGLE_PIN, led_state);
TCNT2 = 130; // reset timer ct to 130 out of 255
TIFR2 = 0x00; // timer2 int flag reg: clear timer overflow flag
};