
            .include "tn2313def.inc"  ; Используем ATtiny2313
 
.equ Duration_A = 1400  ; длительность сигнала канал A (usec)
.equ Duration_B = 1600  ; длительность сигнала канал B (usec)
.equ Resolution = 20000 ; разрешение периода (usec)

; ROM ===================================================

            .CSEG                     ; ROM
            .org $000

            rjmp RESET                ; External Pin, Power-on Reset, Brown-out Reset and Watchdog Reset
            rjmp EXT_INT0             ; INT0          Внешнее прерывание 0
            reti                      ; INT1          Внешнее прерывание 1
            reti                      ; TIMER1 CAPT   Захват таймера/счетчика Т1
            reti                      ; TIMER1 COMPA  Совпадение «A» таймера/счетчика Т1
            reti                      ; TIMER1 OVF    Переполнение таймера/счетчика Т1
            reti                      ; TIMER0 OVF    Переполнение таймера/счетчика Т0
            reti                      ; USART,RX      USART, прием завершен
            reti                      ; USART,UDRE    Регистр данных USART пуст
            reti                      ; USART,TX      USART, передача завершена
            reti                      ; ANA_COMP      Аналоговый компаратор
            reti                      ; PCINT         Pin Change Interrupt
            reti                      ; TIMER1 COMPB  Совпадение «В» таймера/счетчика Т1
            reti                      ; TIMER0 COMPA  Timer/Counter0 Compare Match A
            reti                      ; TIMER0 COMPB  Timer/Counter0 Compare Match B
            reti                      ; USI START     USI Start Condition
            reti                      ; USI OVERFLOW  USI Overflow
            reti                      ; EE READY      EEPROM, готово
            reti                      ; WDT OVERFLOW Watchdog Timer Overflow
            
; -------------------- R E S E T ---------------------------------------

            .ORG   INT_VECTORS_SIZE   ; Конец таблицы прерываний
RESET:
            cli
            ldi     r16, RAMEND       ; Set Stack Pointer to top of RAM
            out     SPL, r16          ; 

INIT_ports:       
            ldi     r16, (1<<PB3)|(1<<PB4)
            out     DDRB, r16
            clr     r16
            out     PORTB, r16

INIT_ext_int:
            ldi     r16,(0b10<<ISC00) ; Прерывания по низкому уровню INT0
            out     MCUCR,r16
            ldi     r16,(1<<INT0)     ; Включаем запрос на прерывание INT0
            out     GIMSK,r16
            in      r16,EIFR
            out     EIFR,r16

Timer1_Init:
            ldi   r16, low(Duration_A-1)
            ldi   r17,high(Duration_A-1)
            out   OCR1AH, r17        ; OCR1A = 1400 usec
            out   OCR1AL, r16
            ldi   r16, low(Duration_B-1)
            ldi   r17,high(Duration_B-1)
            out   OCR1BH, r17        ; OCR1B = 1600 usec
            out   OCR1BL, r16
            ldi   r16, (0b10<<WGM10) ; Set Fast PWM mode with resolution ICR1.
            ldi   r17, (0b11<<WGM12) ; Set Fast PWM mode with resolution ICR1.
            ori   r16, (0b10<<COM1A0); Clear OC1A on Compare Match, set OC1A at ICR1
            ori   r16, (0b10<<COM1B0); Clear OC1B on Compare Match, set OC1B at ICR1
            ori   r17, (0b001<<CS10) ; Prescaler 001=1:1
            out   TCCR1A, r16        ; 
            out   TCCR1B, r17        ; Enable TCNT1
            ldi   r16, low(Resolution-1)
            ldi   r17,high(Resolution-1)
            out   ICR1H, r17
            out   ICR1L, r16
            sei

MAIN_loop:
            rjmp  MAIN_loop           ; Go again               

;-----------------------------------------------------------------

EXT_INT0:
            reti
