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

[Attiny12][ASM][AVR Studio] Przerwanie/Timer/ i nie działa

Alucardrol 28 Gru 2009 18:32 2109 2
REKLAMA
  • #1 7448189
    Alucardrol
    Poziom 10  
    Witam
    Wpadłem na problem i mam spory problem z rozwiązaniem. Chciałem zbudować włącznik led do autka zdalnie sterowanego, zasilanie idzie z odbiornika (5V) i sygnał PWM w zakresie ok. 700us - 2300us. W programie mam próg ustawiony ok. 1500us. Gdy włącze układ to robi się dyskoteka (diody migają na przemian), a gdy przekrzywie drążek w jedną stronę to zapala się jedna dioda.

    Impuls podawany na PINB.1 (INT0)
    Wyjście PINB.0 (jedna dioda) , PINB.1 (druga dioda)
    Kwarc 4MHz


    W symulatorze przetestowałem i chodzi dobrze, natomiast pojawia się komunikat HW stack overflow at 0x0014. W sumie jest to mój pierwszy program w asm, i z tego co mi się wydaje podczas robienia skoków przez rjmp nie jest używany stos do zapamiętania aktualnej lini programu, więc jakoś się nie przejmowałem tym komunikatem, ale dziś wszystko zlutowałem, programuje a tu nie działa.

    Prosiłbym o pomoc, ewentualnie jakieś wskazówki.

    Kod:

    
    .nolist
    .include "tn12def.inc" 
    .list	 	
    .listmac	 
    .cseg 
    
    .org 0x000 
       	rjmp konfig
    
    .org INT0addr 
       	rjmp przerwanie 
     
    .org OVF0addr
    	reti
    .org ERDYaddr
    	reti
    .org ACIaddr
    	reti 
    
    konfig:
    	cli
    	ldi r16,0x05     
    	out DDRB,r16      ; pinb.0 i pind.2 wyjście, pinb.1 wejscie
    	ldi r16,0x04
    	out PORTB,r16     ; wszystkie stan początkowy 0
    	ldi r16,0x03
    	out MCUCR,r16     ;int0 zboczem rosnącym
    	ldi r16,0x40
    	out GIMSK,r16     ;zezwól na przerwania int0
    
    loop:
    	sei
    	in r17,TCNT0      ;przepisz stn licznika do r17
    	ldi r16,0x00
    	out TCCR0,r16     ;timer stop
    	cpi r17, 0x5E      
    	brsh wlacz
    	cpi r17, 0x5E
    	brlo wylacz
    	rjmp loop
    
    przerwanie:
    	ldi r16,0x00      ; zeruj timer
    	out TCNT0,r16
    	ldi r16,0x03
    	out TCCR0,r16     ;włącz timer /64  
    	sei
    sprawdz:
    	in r16,PINB      
    	andi r16,0x02     ;pinb.1  sprawdzanie czy skończył się impuls
    	cpi r16, 0x00     
    	brne sprawdz
    	ldi r16,0x00
    	out TCCR0,r16       ;stop timer
    	rjmp loop
    
    
    wlacz:
    	sbi portb,0
    	cbi portb,2
    	rjmp loop
    
    wylacz:
    	sbi portb,2
    	cbi portb,0
    	rjmp loop
    .exit
    


    Pozdrawiam
  • REKLAMA
  • Pomocny post
    #2 7448629
    kamyczek
    Poziom 38  
    Brakuje inicjalizacji stosu i powrotu z obsługi przerwania (reti).
  • #3 7448665
    Alucardrol
    Poziom 10  
    W sumie okazało się że działa już po wpisaniu reti zamiast rjmp. Wielkie dzięki.
REKLAMA