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

[Atmega8][assembler] Przerwanie z timera 0 nie działa

dondu 07 Lis 2010 04:32 2368 2
REKLAMA
  • #1 8712081
    dondu
    Moderator na urlopie...
    Coś nie bardzo wychodzi mi wywołanie przerwania INT0 po przepełnieniu Timera0.

    Poniżej kod (usunąłem zbędną funkcję wyświetlającą, która działa poprawnie).

    Program powinien:
    - po restarcie wyświetlić korpkę (robi to poprawnie)
    - po każdym przerwaniu wyświetlać kursor (i to nie działa bo nie ma przerwania).

    Nie istotne jest że każde przerwanie ponownie wyświetla 9. To tylko przykład dla stwierdzenia, czy przerwanie działa czy nie.

    
    .include "m8def.inc"	;ATMega8
    
    
    .CSEG
    
    
    .org $0000			
    		rjmp Reset 	
    .org INT0addr
    		rjmp przerwanie_Int0
    
    
    
    
    Reset:
    
    		; ustaw stos na końcu pamięci RAM
    		ldi 	r16,	low(RAMEND) 		
    		out 	SPL,	r16
    		ldi 	r16, 	high(RAMEND)
    		out 	SPH, 	r16
    
    
    		;inicjuj timer 0
    		ldi 	r17, 	1 << CS02
    		out 	TCCR0, 	r17
    
    
    		;włącz przerwania z timera 0
    		in r16, TIMSK
    		sbr r16, 1 << TOIE0
    		out TIMSK, r16
    		sei
    
    
    		ldi 	r16,	16            ;znak do wyświetlenia: kropka
    		rcall	wyswietl_R16
    
    loop:
    
    		;kręć się 
    		rjmp 	loop 
    
    ;-----------------------------------------------
    
    przerwanie_Int0:	
          ;wyświetl kursor
    		ldi 	r16,	9 ;znak do wyświetlenia: kursor
    		rcall	wyswietl_R16
    		reti
    ;-----------------------
    
    wyswietl_R16:
    		;wyswietla znak z R16
    
    ... tutaj obsługa wyświetlania (działa poprawnie)
    
    		ret
    
  • REKLAMA
  • Pomocny post
    #2 8712101
    dj_west
    Poziom 17  
    Bo jak ma działać?
    Widać kolega nie do końca rozumie mechanizm przerwań, skoro czeka na przerwanie INT0, a włącza przerwanie przepełnienia Timera0. Adresem przerwania przepełnienia Timera0 jest OVF0addr, a nie INT0addr. Przerwanie od INT0 wyzwalane jest ZEWNĘTRZNIE zboczem lub stanem na fizycznym wejściu INT0 mikrokontrolera, a nie Timerem. Skąd ten pomysł w ogóle?

    Zmiana INT0addr na OVF0addr załatwia sprawę bezboleśnie.

    Pozdrawiam!
REKLAMA