lite asm-hjälp

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
$tiff
Inlägg: 4941
Blev medlem: 31 maj 2003, 19:47:52
Ort: Göteborg
Kontakt:

lite asm-hjälp

Inlägg av $tiff »

Jag blir skogstokig. Varför funkar inte min enkla kod?

AT90S8515 på ett STK500, simulerar även i AVR Studio 4:

Kod: Markera allt

.include "8515def.inc"  ;Includes the 8515 definitions file

.org $000
rjmp RESET          		;Take a Relative Jump to the RESET Label 
.org $007
rjmp ISR_TOV0				;ISR-routine fpr timer0 overflow



; ---- Startup -----	
RESET:                  ;Reset Label
   ldi r16, 0b00001110
   out WDTCR, r16		; Set Watchdog to timeout ~1,0s
   
   ser r16				; 255 to set all pins output      
   out DDRB, r16      	; @ PORTB data direction Register
   ldi r16, 0b01010010 	; Good startup value
   out PORTB, r16		; @ PORTB

; ---- Setup timer0 interrupt -----
init_timer0:
   ldi r16,0b00000101		; Timer 0 on, prescaler: 1024
   out TCCR0,r16 			; 
 
   ldi r16,1<<TOV0			;
   out TIFR,r16 			; Clear TOV0 / clear pending interrupts

   ldi r16,1<<TOIE0
   out TIMSK,r16 			; Enable Timer/Counter0 Overflow Interrupt
   SEI						; Global interrupt on


; ---- Main loop -----
Loop:                  
nop			
nop 
nop			; Do nothing - wait for interrupt
nop
nop
WDR			; Watchdog reset
rjmp Loop


; ---- ISR routine -----
ISR_TOV0:
;push r17		; Push r17 in stack
;push r16		; Push r16 in stack
;in r16,SREG
;push r16		; Push SREG in stack

in r16,PORTB 	; Read Port B
inc r16 		; Icrease by one
out PORTB,r16 	; Write Port B

;pop r16			
;out SREG,r16	; Pop SREG from stack
;pop r16		; Pop r16 from stack
;pop r17		; Pop r17 from stack

reti			; Return from ISR
Jag vill alltså bara att portB (lysdioder) ska ändra sig varje interrupt (ca 5 ggr/s med 1,23 MHz klockpuls och 1024 i prescaler på en 8-bits timer).
Det tuffar på bra i AVR Studio tills den kommer in i ISRen, sen vägrar den hoppa ut därifrån - interruptet har väl hängt sig?

Detta är mitt första någerlunda meningsfulla asm-prgogram, så det kan mycket väl smugist sig in något fundamentalt fel :vissla:
Dessutom har jag hämtat mycket inspiration från en appnote. Surt att det inte funkar då :(

Trodde det var min push-pop som var galen, men efter att ha kommenterat ut den så blev inget bättre.

Nog dax att sova lite :?
Användarvisningsbild
Icecap
Inlägg: 26647
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Jag kör inte med AVR men man ska väl resetta den bit som orsaker interrupten eller hur?

Alltså: Timern drar overflow-bitten, orsaker interrupten och ditt program måste sedan nolla den bitten i interruptrutinen.

Så fungerar det i alla fall på de andra MCU:n jag känner till.

Testa det, sen kanske det kör.
Användarvisningsbild
$tiff
Inlägg: 4941
Blev medlem: 31 maj 2003, 19:47:52
Ort: Göteborg
Kontakt:

Inlägg av $tiff »

Den resettas automatiskt när den hoppar till ISR-vektorn (007 i detta fallet).
Har även provat resetta den manuellt, hjälpte inte.
Användarvisningsbild
erixon
Inlägg: 380
Blev medlem: 27 augusti 2003, 10:21:58

Inlägg av erixon »

Du har glömt att initsiera stackpekaren

Kod: Markera allt

ldi	r16,high(RAMEND) 
out	SPH,r16
ldi	r16,low(RAMEND)	 
out	SPL,r16
Det borde fixa biffen :)
Användarvisningsbild
karlstedt
EF Sponsor
Inlägg: 966
Blev medlem: 14 oktober 2003, 16:55:23
Ort: Lund
Kontakt:

Inlägg av karlstedt »

Då jag simulerar detta hänger den sig inte i ISP, men den kör om programmet från början vilket beror på att du inte har initierat stackpekaren.
Testa med denna kod i den resetvektor

Kod: Markera allt

;***********************
 	ldi r16, low(RAMEND)
	out SPL, r16
	ldi r16, high(RAMEND)
	out SPH, r16
;***********************
Sedan vill jag nämna att det är reti som återställer interruptbiten och att spara undan SREG är inte heller nån dum idé :)

EDIT: För seg... :D
Användarvisningsbild
$tiff
Inlägg: 4941
Blev medlem: 31 maj 2003, 19:47:52
Ort: Göteborg
Kontakt:

Inlägg av $tiff »

Göött!

Nu funkar det!

>> karlstedt

Jag sparar väl undan SREG på rätt sätt i min utkommenterade kod i ISRen?
Det kvittar väl i detta fallet eftersom main_loop inte påverkar SREG, men annars är det ytterst nödvändigt.
Användarvisningsbild
karlstedt
EF Sponsor
Inlägg: 966
Blev medlem: 14 oktober 2003, 16:55:23
Ort: Lund
Kontakt:

Inlägg av karlstedt »

Japp, det ser fint ut!
Skriv svar