witam mam następujący problem: po wykonaniu programu obsługi przerwania mikrokontroler wykonuje inny rozkaz niż powinien, oto program
według mnie program powinien działać następująco:
-ustawienie trybu pracy,prescalera itp.
-wykonywanie pustej pętli (oczekiwanie na przerwanie,wywołane zrówananiem wartości rejestrów)
-wykonanie procedury przerwania( negacja wyjścia PORTA)
-powrót do pętli pustej (kolejne oczekiwanie na przerwanie)
wszystko działa dobrze oprócz tego miejsca kiedy wraca z podprogramu( nie wraca do pętli LOOP)
.INCLUDE "m16def.inc"
.CSEG ;segment programu
.ORG 0x000
RJMP START
.ORG 0x00E
RJMP LED
START: ;podprogram inicjalizacji trybu CTC
LDI R16,(0<<WGM11)|(0<<COM1A0) ;uaktywnienie CTC,
LDI R16,(0<<CS12)|(1<<CS11)|(1<<CS10)|(0<<WGM13)|(1<<WGM12);prescaler,włączenie timera
OUT TCCR1B,R16
LDI R16,1<<OCF1A
OUT TIFR,R16 ;kasowanie bitu OCF1A, kasowanie bieżącego przerwania
LDI R16,1<<OCIE1A
OUT TIMSK,R16 ;odblokowanie przerwania od trybu porównania
LDI R16,0x04
OUT OCR1AL,R16 ;częstotliwość porównania
LDI R16,0XFF
OUT DDRA,R16 ;ustawienie trybu wyjściowego
SEI ;zezwolenie na przerwania
LOOP:
JMP LOOP
LED: ;procedura obsługi przerwania trybu porównania
PUSH R16
IN R16,SREG ;zapamiętanie rejestru statusu oraz R16
PUSH R16
IN R16,PORTA ;czytaj stan portu A
COM R16 ;zaneguj bity rejestru R16
OUT PORTA,R16 ;zapisz R16 do portu A
POP R16
OUT SREG,R16 ;odtworzenie rejestru statusu i R16
POP R16według mnie program powinien działać następująco:
-ustawienie trybu pracy,prescalera itp.
-wykonywanie pustej pętli (oczekiwanie na przerwanie,wywołane zrówananiem wartości rejestrów)
-wykonanie procedury przerwania( negacja wyjścia PORTA)
-powrót do pętli pustej (kolejne oczekiwanie na przerwanie)
wszystko działa dobrze oprócz tego miejsca kiedy wraca z podprogramu( nie wraca do pętli LOOP)