    
    ; программа мигалки на таймере T0

    .include "m328pdef.inc"

    .device ATMega328P

;======= сегмент данных (ОЗУ)
    .dseg

    ;======= переменные


;======= сегмент кода (FLASH)
    .cseg

    .def counter = r16
    .def buffer = r1

    ;======= Вектора прерываний

    .org 0          ; Сброс
    jmp reset

    .org OVF0addr   ; Переполнение Т0
    jmp T0_OVF

    
RESET: 
    ; заносим в указатель стека его конечный адрес
    ; т.к. стек растет снизу вверх
    ldi r16, low(RAMEND)
    out spl, r16
    ldi r16, high(RAMEND)
    out sph, r16


    ;старт инициализации
INIT:

    ; выключаем аналоговый компаратор
    ; для снижения энергопотребления
    ldi r16, 1<<ACD 
    out acsr, r16 

    ;настройка портов. Порт D0-выход. Пин 0 порта В-вход кнопки
    sbi ddrD,0
    clr r16
    out ddrB, r16
    sbi portB, 0
    
    ; настройка таймера Т0
    ; предделитель на 1024
    ldi r16, 0b00000101
    out TCCR0B, r16
    ldi r16, 1<<TOIE0
    ;разрешаем прерывания и обнуляем предделитель
    sts TIMSK0, r16
    sei
    ldi r16, 1<<TSM
    out GTCCR, r16
    clr r16


MAIN_LOOP:
    cpi counter, 30
    brne MAIN_LOOP

    clr counter

    sbic portD, 0
    rjmp LED_OFF

    sbi portD, 0
    rjmp MAIN_LOOP

LED_OFF:

    cbi portD, 0
    rjmp MAIN_LOOP

    
  


T0_OVF:
    
    inc counter
    reti


    

