Subrutin återvänder till toppen, inte dit den anropades
Postat: 24 mars 2009, 11:47:14
Jag har två subrutiner, en delay och en med ett Lysdiods mönster.
Anledningen till att lysdiods mönstret är i en subrutin är att jag har tänkt att ha flera olika mönster. (det ska bli en 9pixlars tavla)
När jag började hade jag Mönstret i huvudkoden, alltså inte i en subrutin och då fungerade det perfekt. När jag nu lagt den i en subrutin så körs den bara en gång och sedan stannar alla dioder i lysande läge.
När jag kör koden i MPLAB Sim så funkar allt fint till "return" instruktionen i monster_1 subrutinen. Då hoppar den tillbaka till toppen av koden, alldeles från början.
Någon som förstår vad jag menar?
Koden:
Anledningen till att lysdiods mönstret är i en subrutin är att jag har tänkt att ha flera olika mönster. (det ska bli en 9pixlars tavla)
När jag började hade jag Mönstret i huvudkoden, alltså inte i en subrutin och då fungerade det perfekt. När jag nu lagt den i en subrutin så körs den bara en gång och sedan stannar alla dioder i lysande läge.
När jag kör koden i MPLAB Sim så funkar allt fint till "return" instruktionen i monster_1 subrutinen. Då hoppar den tillbaka till toppen av koden, alldeles från början.
Någon som förstår vad jag menar?
Koden:
Kod: Markera allt
processor 16f628a
include <p16f628a.inc>
__config _INTOSC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _LVP_OFF
banksel TRISB ;select bank 1
movlw b'00000000' ;set PortB all outputs
movwf TRISB
movwf TRISA ;set PortA all outputs
banksel PORTA ;select bank 0
clrf PORTA
clrf PORTB ;set all outputs low
cblock H'20'
d1
d2
d3
endc
Start
goto monster_1
goto Start
;-------- Subrutiner -------------------
monster_1
movlw b'11111111'
movwf PORTB
call Delay
movlw b'11111110'
movwf PORTB
call Delay
movlw b'11111100'
movwf PORTB
call Delay
movlw b'11111000'
movwf PORTB
call Delay
movlw b'11110000'
movwf PORTB
call Delay
movlw b'11100000'
movwf PORTB
call Delay
movlw b'11000000'
movwf PORTB
call Delay
nop
return
Delay
; Delay = 0.5 seconds
; Clock frequency = 4 MHz
; Actual delay = 0.5 seconds = 500000 cycles
; Error = 0 %
;499994 cycles
movlw 0x03
movwf d1
movlw 0x18
movwf d2
movlw 0x02
movwf d3
Delay_0
decfsz d1, f
goto $+2
decfsz d2, f
goto $+2
decfsz d3, f
goto Delay_0
;6 cycles
goto $+1
goto $+1
goto $+1
nop
return
nop
end