Code:
#CONFIG
__config _CONFIG1, _HS_OSC & _WDT_OFF & _MCLRE_OFF & _LVP_OFF & _CP_OFF
__CONFIG _CONFIG2, _WRT_OFF & _BOR21V
#ENDCONFIG
DEFINE INTHAND ticker
ANSEL=0 'all analogue ports to digital
ANSELH=0 'all analogue ports to digital
TRISA=%00101011 '(0=output, 1=input)
TRISB=%00100001 '(0=output, 1=input)
TRISC=%00000000 '(0=output, 1=input)
TRISE=%00001000 '(0=output, 1=input)
OPTION_REG=%11000101
PIN_OUT var PORTC.3 'serial out pin
LED var portA.2
wsave var byte $70 SYSTEM
ssave var byte SYSTEM
psave var byte SYSTEM
taskflag var byte
taskswitch var byte
ro_counter var byte
ibit var byte
address var word
icount var word
define OSC 20
intcon =$c0
pir1.0=0
pie1.0=1
serout2 PIN_OUT,32,["THERMAL START",13,10] '19200bps
T1CON=$31
main:
if taskflag then
taskflag = 0
taskswitch = taskswitch + 1
if taskswitch == 4 then taskswitch = 0
select case taskswitch
CASE 0
gosub task0
serout2 PIN_OUT,32,["A",dec ibit,"-",dec icount,"-",dec address,13,10]
serout2 PIN_OUT,32,["B",dec ibit,"-",dec icount,"-",dec address,13,10]
case 1
gosub task1
icount=icount+1
serout2 PIN_OUT,32,["C",dec ibit,"-",dec icount,"-",dec address,13,10]
address=address+16
serout2 PIN_OUT,32,["D",dec ibit,"-",dec icount,"-",dec address,13,10]
case 2
gosub task2
ro_counter =ro_counter +1
if ro_counter == 16 then
serout2 PIN_OUT,32,["READOUT",13,10]
ro_counter =0
endif
case 3
gosub task3
end select
endif
goto main
task0:
'do voltage stuff
return
task1:
'do current stuff
return
task2:
'do other stuff
return
task3:
LED = ! led
return
END
asm
ticker ;tmr1 isr
banksel _taskflag
bsf _taskflag,0
banksel PIR1
bcf PIR1,0
movf psave,W ; restore PCLATH
movwf PCLATH
swapf ssave,W ; restore STATUS
movwf STATUS
swapf wsave,F ; restore W (swap avoids changing STATUS)
swapf wsave,W
RETFIE
endasm
Bookmarks