Часть 15: Ассемблер для таймеров и прерываний

На ассемблере мы можем настроить таймеры так, как это невозможно сделать через 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

Вам также может понравиться

About the Author: ардуинчиков

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *