Code:
#CONFIG
CONFIG OSC = IRCIO67 ; Internal oscillator block, port function on RA6 and RA7
CONFIG FCMEN = OFF ; Fail-Safe Clock Monitor disabled
CONFIG IESO = OFF ; Oscillator Switchover mode disabled
CONFIG PWRT = ON ; PWRT enabled
CONFIG BOREN = OFF ; Brown-out Reset disabled in hardware and software
CONFIG BORV = 3 ; VBOR set to 2.1V
CONFIG WDT = OFF ; WDT disabled (control is placed on the SWDTEN bit)
CONFIG WDTPS = 512 ; 1:512
CONFIG PBADEN = OFF ; PORTB<4:0> pins are configured as digital I/O on Reset
CONFIG LPT1OSC = OFF ; Timer1 configured for higher power operation
CONFIG MCLRE = OFF ; RE3 input pin enabled; MCLR disabled
CONFIG STVREN = ON ; Stack full/underflow will cause Reset
CONFIG LVP = OFF ; Single-Supply ICSP disabled
CONFIG BBSIZ = 1024 ; 1K words (2K bytes) boot block
CONFIG XINST = OFF ; Instruction set extension and Indexed Addressing mode disabled (Legacy mode)
CONFIG DEBUG = OFF ; Background debugger disabled, RB6 and RB7 configured as general purpose I/O pins
CONFIG CP0 = OFF ; Block 0 (000800-001FFFh) not code-protected
CONFIG CP1 = OFF ; Block 1 (002000-003FFFh) not code-protected
CONFIG CP2 = OFF ; Block 2 (004000-005FFFh) not code-protected
CONFIG CP3 = OFF ; Block 3 (006000-007FFFh) not code-protected
CONFIG CPB = OFF ; Boot block (000000-0007FFh) not code-protected
CONFIG CPD = OFF ; Data EEPROM not code-protected
CONFIG WRT0 = OFF ; Block 0 (000800-001FFFh) not write-protected
CONFIG WRT1 = OFF ; Block 1 (002000-003FFFh) not write-protected
CONFIG WRT2 = OFF ; Block 2 (004000-005FFFh) not write-protected
CONFIG WRT3 = OFF ; Block 3 (006000-007FFFh) not write-protected
CONFIG WRTC = OFF ; Configuration registers (300000-3000FFh) not write-protected
CONFIG WRTB = OFF ; Boot block (000000-0007FFh) not write-protected
CONFIG WRTD = OFF ; Data EEPROM not write-protected
CONFIG EBTR0 = OFF ; Block 0 (000800-001FFFh) not protected from table reads executed in other blocks
CONFIG EBTR1 = OFF ; Block 1 (002000-003FFFh) not protected from table reads executed in other blocks
CONFIG EBTR2 = OFF ; Block 2 (004000-005FFFh) not protected from table reads executed in other blocks
CONFIG EBTR3 = OFF ; Block 3 (006000-007FFFh) not protected from table reads executed in other blocks
CONFIG EBTRB = OFF ; Boot block (000000-0007FFh) not protected from table reads executed in other blocks
#ENDCONFIG
DEFINE OSC 32
INCLUDE "DT_INTS-18.bas" ; Base Interrupt System
INCLUDE "ReEnterPBP-18.bas" ; Include if using PBP interrupts
OSCCON = %01110000 '8MHz INTOSC
OSCTUNE.6 = 1 'PLLEN enabled
LATA = % 00000000
LATB = % 00000000
LATC = % 00000000
TRISA = % 00000000
TRISB = % 00000000
TRISC = % 11000000
ADCON1 = 15
RCSTA = $90 ' Enable serial port & continuous receive
TXSTA = $24 ' Enable transmit, BRGH = 1
SPBRG = 64 ' 9600 Baud @ 32MHz, 0.04%
SPBRGH = 3
BAUDCON.3 = 1 ' Enable 16 bit baudrate generator
IC_TX var PORTC.6 'DEBUG OUT
IC_RX var PORTC.7 'INPUT
RED1 var PORTC.1
RED2 var PORTC.2
RED3 var PORTA.6
RED4 var PORTB.4
RED5 var PORTA.7
RED6 var PORTB.0
GREEN1 var PORTB.5
GREEN2 var PORTB.1
GREEN3 var PORTB.2
GREEN4 var PORTB.3
GREEN5 var PORTC.3
GREEN6 var PORTC.4
GREEN7 var PORTC.5
GREEN8 var PORTC.0
BLUE1 var PORTA.5
BLUE2 var PORTA.4
BLUE3 var PORTA.3
BLUE4 var PORTA.2
BLUE5 var PORTA.1
BLUE6 var PORTA.0
BLUE7 var PORTB.7
BLUE8 var PORTB.6
PA1 VAR WORD
BUFFERB VAR BYTE[10]
MOOD VAR BYTE
MOODCAP VAR BYTE
rxb_B_C VAR BYTE
INTFLAG VAR BYTE
MOODCHANGE VAR BYTE
maxq con 32
prnb var byte[maxq]
spos var byte bank0
rpos var byte bank0
HEAD VAR BYTE [32]
I VAR BYTE
J VAR BYTE
K VAR BYTE
@milies = _TICKS ; LOW 16
@seconds = _TICKS+1 ;UPPER 16
FLG var byte
milies var word ext ;4mS TICKS
seconds var word ext ;COUNTS IN SECONDS 3.906mS*256
now var word
seconds_changed VAR FLG.0
TICKS var byte[3] ;24 BIT TIME KEEPING ticks[1]+[2] is in seconds
Timer3Reload CON 49914 ;3906uS 1/256 second @32mHz clk div2
clear
'---[INT - interrupt handler]---------------------------------------------------
ASM
INT_LIST macro ; IntSource, Label, Type, ResetFlag?
INT_Handler RX_INT, _RXB, PBP, yes
INT_Handler TMR3_INT, TICK, ASM, YES
INT_Handler TX_INT , _do_tx, asm,no
endm
INT_CREATE ; Creates the interrupt processor
ENDASM
pause 1000
ARRAYWRITE head, ["READY", 13,10 ]
GOSUB MYPRINT
pause 400
GOSUB setrgb1
pause 400
START:
rxb_B_C = 0
MOOD = 1
MOODCHANGE = 1
MOODCAP = 1
RCSTA.4 = 0 ;clear any rcsta error
RCSTA.4 = 1
INTCON = $C0
PIR2.1=0
@ INT_ENABLE RX_INT
@ INT_ENABLE TMR3_INT
PIE2.1=1
t3con = $11
main:
GOsub get_now
GOsub MOODCHECK
IF INTFLAG = 1 THEN
INTFLAG = 0
rxb_B_C = 0
RCSTA.4 = 0 ;clear any rcsta error
RCSTA.4 = 1
@ INT_ENABLE RX_INT
ARRAYREAD BUFFERB,10,dud,[wait("MCU-"), DEC1 MOODCAP ]
IF MOODCAP != MOOD THEN MOODCHANGE = 1
ARRAYWRITE head, [10,"NEW MOOD ",DEC MOODCAP, 13,10]
GOSUB MYPRINT
endif
if MOODCHANGE = 1 then
IF MOODCAP < 6 THEN
MOOD = MOODCAP
MOODCHANGE = 0
gosub clr_rgb
ELSE
MOODCHANGE = 0
GOTO DUD
endif
endif
PAUSE 10
goto main
dud:
ARRAYWRITE head, ["DUD MOOD", 13,10]
GOSUB MYPRINT
goto main
END
MOODCHECK:
SELECT CASE MOOD
CASE 1
GOsub RED
CASE 2
GOsub GREEN
CASE 3
GOsub BLUE
CASE 4
GOsub SHUTDOWN
CASE 5
PA1 = NOW
MOOD = 6
GOsub LIGHT_ONTEST
CASE 6
IF NOW - PA1 > 250 THEN
GOsub LIGHT_OFFTEST
MOOD = 7
PA1 = NOW
ENDIF
CASE 7
IF NOW - PA1 > 250 THEN MOOD = 5
END SELECT
return
LIGHT_ONTEST:
gosub red
gosub BLUE
gosub GREEN
return
LIGHT_OFFTEST:
gosub clr_rgb
return
RED: ; PORTC.1 PORTC.2 PORTA.6 PORTB.4 PORTA.7 PORTB.0
LATA = LATA | 192
LATB = LATB | 17
LATC = LATC | 6
return
SHUTDOWN:
gosub clr_rgb
return
GREEN: ; PORTB.5 PORTB.1 PORTB.2 PORTB.3 PORTC.3 PORTC.4 PORTC.5 PORTC.0
LATB = LATB | 46
LATC = LATC | 57
return
BLUE: ; PORTA.5 PORTA.4 PORTA.3 PORTA.2 PORTA.1 PORTA.0 PORTB.7 PORTB.6
LATA = LATA | 63
LATB = LATB | 192
return
setrgb1:
LATA = 32
LATB = 32
LATC = 2
RETURN
clr_rgb:
LATA = 0
LATB = 0
LATC = LATC & ~63
RETURN
RXB:
WHILE PIR1.5
BUFFERB[rxb_B_C] = RCREG
IF (rxb_B_C >= 9)|| (BUFFERB[rxb_B_C] == 13) THEN
PIE1.5 = 0
INTFLAG = 1
BUFFERB[rxb_B_C] = 0
else
rxb_B_C = rxb_B_C + 1
endif
WEND
@ INT_RETURN
asm
TICK ;isr
BANKSEL T3CON
MOVE?CT 0, T3CON, TMR3ON ; stop timer
MOVLW LOW(_Timer3Reload) ; Add TimerReload
ADDWF TMR3L,F
BTFSC STATUS,C
INCF TMR3H,F
MOVLW HIGH(_Timer3Reload)
ADDWF TMR3H,F
MOVE?CT 1, T3CON, TMR3ON ; start timer
MOVLW LOW( _TICKS) ;inc 24
movwf FSR0L
MOVLW HIGH( _TICKS)
movwf FSR0H
BCF STATUS,Z
incfsz POSTINC0,F
BRA I24D
BANKSEL _FLG
BSF _FLG ,0 ;seconds_changed
incfsz POSTINC0,F
BRA I24D
incf INDF0,F
I24D
INT_RETURN
endASM
do_tx:
asm
BANKSEL _rpos
movf _spos,W ;if rpos==spos then buffer is empty
subwf _rpos,W
btfsC STATUS,Z
bra LX
txb movlw High _prnb ;Store the High byte of buffer to FSR0H
movwf FSR0H
movlw Low _prnb ; Get the Low byte of buffer
addwf _rpos,W ; Add rpos to pointer
movwf FSR0L ; Store Low byte of pointer in FSR0
movf INDF0,W
btfsc STATUS,Z ; if its not a null send it
bra ex_prn
movwf TXREG
incf _rpos,F ; Increment rpos
movf _rpos,W ; Move new rpos to W
sublw _maxq -1 ; Subtract rposfrom buffer_size
btfsS STATUS, C ; If rpos > buffer_size
clrf _rpos ; Clear rpos
BRA ex_prn
LX ;if buffer empty turn ofF interrupt
bcf PIE1,TXIF
ex_prn
;RST?RP
INT_RETURN
endasm
MYPRINT:
J=0
WHILE HEAD[J]
INTCON=0
I=SPOS+1
K=RPOS
INTCON=$C0
IF ((I)==K) || ((I== MAXQ )&& (K==0) ) THEN
PAUSE 1
ELSE
PRNB[SPOS]= HEAD[J]
SPOS=SPOS+1
IF SPOS=MAXQ THEN SPOS=0
PIE1.4=1
J=J+1
ENDIF
WEND
RETURN
get_now:
pie2.1 = 0
NOW = milies
pie2.1 = 1
return
Bookmarks