logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Problem z powrotem z procedury przerwania

wilq696 01 Lis 2009 18:40 1076 3
REKLAMA
  • #1 7202843
    wilq696
    Poziom 10  
    witam mam następujący problem: po wykonaniu programu obsługi przerwania mikrokontroler wykonuje inny rozkaz niż powinien, oto program

    .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 R16

    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)
  • REKLAMA
  • #2 7202878
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #3 7202957
    MacGyver 7
    Poziom 21  
    Samo reti nie wystarczy. Trzeba jeszcze zainicjować wskaźnik stosu. Wstaw te linijki za etykietą START.

    ldi R17, high(RAMEND)
    ldi R16, low(RAMEND)
    out SPH, R17
    out SPL, R16

    Następnie dodaj rozkaz reti na końcu procedury obsługi przerwania i będzie działać.
  • #4 7203789
    wilq696
    Poziom 10  
    dziękuje panowie:) temat zamknięty:)
REKLAMA