lite asm-hjälp
Postat: 22 januari 2005, 07:58:30
Jag blir skogstokig. Varför funkar inte min enkla kod?
AT90S8515 på ett STK500, simulerar även i AVR Studio 4:
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
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
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
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

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
