Код: Выделить всё
.cseg
.def count = r20
.def line0 = r21
.def line1 = r22
.def line2 = r23
.def line3 = r24
.org 0
rjmp init
.org 1
rjmp impulse
.org 3 ;Задание адреса прерывания по переполнению таймера 0
rjmp timer0_ovf ;Безусловный переход к метке timer0_ovf
init:
ldi line0, (1<<0)
ldi line1, (1<<2)
ldi line2, (1<<3)
ldi line3, (1<<4)
ser r16 ; all bits into 1
out DDRB, r16
clr r16
out PORTB, r16
ldi r16, RAMEND;Загрузка в регистр r16 адреса верхней границы ОЗУ
out SPL, r16 ;Копирование значения из r16 в регистр указателя стека SPL
ldi r16, (1<<INT0) ; toggle interupt int0
out GIMSK, r16
clr r30
sei
main: ;Основной цикл программы
rjmp main ;Вернуться к метке main
impulse:
cli
out TIMSK0,r30 ; timer's stopped
out PORTB, r30
cpi count, $14
brlo khz5; if count < 20
cpi count, $3C
brsh more15; if count > 60
cpi count, $14 ;if >20
brsh more5
cpi count, $28; if >40
brsh more10
clr count
ldi r16, (1<<CS00);
out TCCR0B,r16 ;Копирование значения из регистра r16 в регистр TCCR0B
ldi r16, (1<<TOIE0) ;Загрузка в регистр r16 "1", смещенной на TOIE0 (переполнение таймера 0)
out TIMSK0,r16 ;Копирование значения из регистра r16 в регистр TIMSK0
ldi r16, RAMEND;Загрузка в регистр r16 адреса верхней границы ОЗУ
out SPL, r16 ;Копирование значения из r16 в регистр указателя стека SPL
sei
reti
timer0_ovf:
inc count
reti
more5:
cpi count, $28
brlo khz10
reti
more10:
cpi count, $3C
brlo khz15
reti
khz5:
out PORTB, line0
reti
khz10:
out PORTB, line1
reti
khz15:
out PORTB, line2
reti
more15:
out PORTB, line3
reti
only pure true norwegian blackx 


