THANKS TO YOU ALL FOR TRYING TO HELP.
I have thrown together some wobbly code to try and explain what i'm trying to do.
I know it might not be the best way, but i can't seem to wrap my head around the whole idea. I just want to be able to use pause in a way that I won't sit and wait for the time to elapse.
in the mainloop here, i have 4 blocks (which could be doing many different things aside from toggling pins). Each block has a pause somewhere set by the value loaded in DELAYREGx
Then in the ISR INTERUPTING EVERY 1ms;
MYISR1:
IF DELAYREG1>0 THEN
DELAYREG1=DELAYREG1-1
IF DELAYREG1=0 THEN
DELAY1flag=1
ENDIF
ENDIF
IF DELAYREG2>0 THEN
DELAYREG2=DELAYREG2-1
IF DELAYREG2=0 THEN
DELAY2flag=1
ENDIF
ENDIF
IF DELAYREG3>0 THEN
DELAYREG3=DELAYREG3-1
IF DELAYREG3=0 THEN
DELAY3flag=1
ENDIF
ENDIF
IF DELAYREG4>0 THEN
DELAYREG4=DELAYREG4-1
IF DELAYREG4=0 THEN
DELAY4flag=1
ENDIF
ENDIF
; END OF ISR
;
Then in the mainloop,
MAINLOOP:
BLOCK0:
IF LED0_UPDATE THEN
HIGH PORTB.0 ;IS IT TIME TO UPDATE LED0?
@ myPAUSE 1000,1 ;MAKE PORTB.0 HIGH FOR 1000 ms USING DELAYREG1
LED0_UPDATE=0 ;BUT DON'T WAIT FOR THE TIME TO ELAPSE
GOTO BLOCK1
ENDIF
IF DELAY1flag THEN ;WILL BE SET IN THE ISR ATFTER 1 SECOND
LOW PORTB.0 ;HAVE WE COME TO THE END OF 1 SECOND?
ENDIF ;END OF myPAUSE
BLOCK1:
IF LED1_UPDATE THEN
HIGH PORTB.1 ;IS IT TIME TO UPDATE LED1
@ myPAUSE 4000,2 ;MAKE PORTB.1 HIGH FOR 4000 ms USING DELAYREG2
LED1_UPDATE=0 ;BUT DON'T WAIT FOR THE TIME TO ELAPSE
GOTO BLOCK2
ENDIF
IF DELAY2flag THEN ;WILL BE SET IN THE ISR ATFTER 4 SECOND
LOW PORTB.1 ;HAVE WE COME TO THE END OF 4 SECOND?
ENDIF ;END OF myPAUSE
BLOCK2:
IF LED2_UPDATE THEN
HIGH PORTB.2 ;IS IT TIME TO UPDATE LED2
@ myPAUSE 2000,3 ;MAKE PORTB.2 HIGH FOR 2000 ms USING DELAYREG3
LED2_UPDATE=0 ;BUT DON'T WAIT FOR THE TIME TO ELAPSE
GOTO BLOCK3
ENDIF
IF DELAY3flag THEN ;WILL BE SET IN THE ISR ATFTER 2 SECOND
LOW PORTB.2 ;HAVE WE COME TO THE END OF 2 SECOND?
ENDIF ;END OF myPAUSE
BLOCK3:
IF LED3_UPDATE THEN
HIGH PORTB.3 ;IS IT TIME TO UPDATE LED3
@ myPAUSE 400,4 ;MAKE PORTB.3 HIGH FOR 400 ms USING DELAYREG4
LED3_UPDATE=0 ;BUT DON'T WAIT FOR THE TIME TO ELAPSE
GOTO BLOCK0
ENDIF
IF DELAY1flag THEN ;WILL BE SET IN THE ISR ATFTER 0.4 SECOND
LOW PORTB.3 ;HAVE WE COME TO THE END OF 0.4 SECOND?
ENDIF ;END OF myPAUSE
GOTO MAINLOOP
Here is what i mean by using pbp within ASM macro;
ASM
MACRO myPAUSE msec,subID
movlw msec
movwf delay_temp
movlw subID
movwf KeepTrack
ENDASM
SELECT CASE KeepTrack
CASE 1
DELAYREG1=delay_temp
DELAY1flag=0
CASE 2
DELAYREG2=delay_temp
DELAY2flag=0
CASE 3
DELAYREG3=delay_temp
DELAY3flag=0
CASE 4
DELAYREG4=delay_temp
DELAY4flag=0
CASE ELSE
@ NOP
END SELECT
@ ENDM
I hope someone might understand and help me...
thanks.
Bookmarks