На ассемблере мы можем настроить таймеры так, как это невозможно сделать через Arduino API.
Пример: Таймер 1 в режиме CTC с прерыванием
#define __SFR_OFFSET 0x00
#include <avr/io.h>
.global timer1_init
timer1_init:
; Шаг 1: Настраиваем пин 9 (OC1A) как выход
SBI DDRB, 1 ; PB1 = пин 9
; Шаг 2: Настраиваем таймер 1 в режим CTC
LDI R16, (1 << WGM12) ; Режим CTC (WGM12 = 1)
STS TCCR1B, R16
; Шаг 3: Устанавливаем частоту 1 кГц
LDI R16, low(16000000 / (2 * 64 * 1000) - 1) ; OCR1AL
LDI R17, high(16000000 / (2 * 64 * 1000) - 1) ; OCR1AH
STS OCR1AL, R16
STS OCR1AH, R17
; Шаг 4: Включаем прерывание по совпадению
LDI R16, (1 << OCIE1A)
STS TIMSK1, R16
; Шаг 5: Запускаем таймер с прескалером 64
LDI R16, (1 << CS10) | (1 << CS11) ; Прескалер 64
STS TCCR1B, R16
RET
; Обработчик прерывания TIMER1_COMPA_vect
.global __vector_TIMER1_COMPA
__vector_TIMER1_COMPA:
; Инвертируем состояние пина 9
SBIS PORTB, 1 ; Если бит установлен, пропускаем следующую инструкцию
RJMP set_high
CBI PORTB, 1
RETI
set_high:
SBI PORTB, 1
RETI