Стараюсь сделать программу " бегущий огонь " , остановился на ниже приведенной .
Программа запускается , но останавливается на " бесконечном цикле " ( есть гипотеза что не выполняется прерывание ) . С чем это может быть связано ? ( точнее в чем ошибка ).
МК ATmega8 , частота 8 МГц , схема без кварцевого резонатора ( код взят с данного сайта ).
Исходный код программы :
Код: Выделить всё
.include "m8def.inc"
.def Temp=R16
.def Temp1=R17
.org 0
.cseg
rjmp Reset ;вектора прерываний
rjmp INT_0
rjmp INT_1
rjmp Timer1_capt1
rjmp Timer1_comp1
rjmp Timer1_OVF1
rjmp Timer0_OVF0
rjmp UART_RX
rjmp UART_UDRE
rjmp UART_TX
rjmp ANA_COMP
;Reset:
INT_0:
INT_1:
Timer1_capt1:
;Timer1_comp1:
Timer1_OVF1:
Timer0_OVF0:
UART_RX:
UART_UDRE:
UART_TX:
ANA_COMP:
reti
;****************************************************
; ИНИЦИАЛИЗАЦИЯ
;****************************************************
Reset: ldi Temp,0b11111111 ;настройка портов
out DDRB,Temp
ldi Temp,0b01000000 ;разрешить прерывание компаратора
out TIMSK,Temp
ldi Temp,0b00000100 ;тактовый сигнал = CK/256
out TCCR1B,Temp
ldi Temp,0x27 ;инициализация компаратора
out OCR1AH,Temp
ldi Temp,0x10
out OCR1AL,Temp
LDI R16,Low(RAMEND) ;установка указателя стека
OUT SPL,R16
LDI R16,High(RAMEND)
OUT SPH,R16
ldi Temp1,0b00000001 ;инициализация индикатора
ldi Temp,0 ;обнуление таймера
out TCNT1H,Temp
out TCNT1L,Temp
sei ;разрешить прерывания
;****************************************************
; ОСНОВНОЙ ЦИКЛ
;****************************************************
Inf: rjmp Inf ;бесконечный цикл
;****************************************************
; ОБРАБОТЧИК ПРЕРЫВАНИЯ КОМПАРАТОРА
;****************************************************
Timer1_comp1:
ldi Temp,0 ;обнуление таймера
out TCNT1H,Temp
out TCNT1L,Temp
Shift: cpi Temp1,0b10000000 ;сравнить с крайним знач.
breq Init ;если равно - загрузка нач. знач.
lsl Temp1 ;иначе - сдвиг влево
rjmp Output ;перейти на вывод в порт
Init: ldi Temp1,0b00000001 ;загрузить нач. значение
Output: out PortB,Temp1 ;вывод в порт
reti ;выход из обработчика


