'@ Device wdt_off
'Include "Modedefs.Bas"
DEFINE OSCCAL_1K 1
DEFINE OSC 4
' INTERRUPT SETTINGS
RBIF VAR INTCON.0 ' PORTB[4..7] Change Interrupt Flag
RBIE VAR INTCON.3 ' PORTB[4..7] Change Interrupt Enable
RBPU VAR OPTION_REG.7 ' PortB pullups (1=disabled, 0=enabled)
GIE VAR INTCON.7 ' Global interrupt enable/disable
' SWITCHED with btn io for new perf board
IOC = %00001001 ' Only PIN 0 (prev 2) interrupt is enabled
GIE= 0 ' Turn OFF global interrupts
WHILE GIE=1:GIE=0:WEND ' And make sure they are off
RBPU=0 ' Enable PortB Pullup Resistors
RBIE=1 ' Enable PortB[4..7] interrupt
ADCON0 = 131 '7 '%10001110
ADCON0.7 = 1 ' Right justify for 10-bit
ANSEL = %00000000 ' all gpio digital
CMCON= 7 '%00000111 ' comparators off
n_2400 CON 16780 ' baud mode for serin2 (2400-8-N-1 inverted)
n_9600 CON 16468 ' baud mode for serin2 (9600-8-N-1 inverted)
progBtn VAR gpio.2: TrisIO.2 = 1 ' ***SWITCHED with btn io for new perf board***
tx VAR gpio.1 : trisio.1 = 1
btn VAR gpio.0 : trisio.0 = 1
tilt VAR gpio.3 : TrisIO.3=1
TrisIO.4=0
testLED VAR gpio.5 : trisio.5 = 0 : testLED = 0
tiltPrev VAR BYTE
tiltPrev = tilt
tiltcount VAR BYTE
tilttimer VAR WORD
tilttimer =0
keyListLen VAR BYTE
keyListLen = 6
keyToSend VAR BYTE
keyToSend = 1
keyToSend_r VAR BYTE
pBtn VAR BYTE
pBtn = 0
counter VAR WORD
counter = 0
'inbyte var byte(4) ' incoming string
i VAR BYTE
sleepCounter VAR WORD
ID VAR BYTE
ID = 4
transmitID VAR BYTE
transmitID = 0
sendNullOnce VAR BYTE
main:
' if the 'tilt' pin has changed since last checked..
IF tilt <> tiltPrev THEN
tiltcount = tiltcount + 1 ' increase tilt count..
sleepCounter = 0 ' make sure pic doesn't fall asleep (sleep code not shown here)
' 'blast' the same RF 20 times to ensure the receiver captures the transmission.
FOR i = 0 TO 20
' protocol:
' "B" -> special wait character on receiver's end.
' transmitID -> unique ID for this transmition, so reciever can identify if a tranmission belowns to the same 'blast'.
' tiltcount -> sends this twice so receiver can compare the data for error-checking.
SEROUT2 tx, n_2400, ["B", transmitID, tiltcount,tiltcount]
' during the 'blast', if the tilt has changed, increase tiltCount during the blast
' note to self - a litte bug here.. the TX will receive an accumilated value instead of a count.
IF tilt <> tiltPrev THEN
tiltcount = tiltcount + 1
transmitID = transmitID + 1
transmitID = transmitID//100
ENDIF
tiltPrev = tilt
NEXT
' set a new ID for the next transmission.
transmitID = transmitID + 1
transmitID = transmitID//100
tiltcount = 0
ENDIF
tiltPrev = tilt
IF btn <> pBtn THEN
counter = 0
sleepCounter = 0
pBtn = btn
IF btn = 1 THEN
FOR i = 0 TO 20
IF btn = 0 THEN
GOSUB main
ENDIF
keyToSend_r = keyToSend + 128
SEROUT2 tx, n_2400, ["B", ID, keyToSend_r, keyToSend_r, "E"]
'serout2 tx, n_2400, ["B0101"]
NEXT
ELSE
IF progBtn = 0 THEN
keyToSend = keyToSend + 1
keyToSend = keyToSend//keyListLen
ENDIF
FOR i = 0 TO 10
IF btn = 1 THEN
GOSUB main
ENDIF
SEROUT2 tx, n_2400, ["B",ID, keyToSend, keyToSend, "E"]
'serout2 tx, n_2400, ["B0110"]
NEXT
ENDIF
ENDIF
IF counter//101 = 0 THEN
sleepCounter = 0
IF btn = 1 THEN
'serout2 tx, n_2400, ["B", ID, "0", keyToSend]
'serout2 tx, n_2400, ["B0101"]
SEROUT2 tx, n_2400, ["B", ID, keyToSend_r, keyToSend_r, "E"]
ELSE
SEROUT2 tx, n_2400, ["B",ID, keyToSend, keyToSend, "E"]
'serout2 tx, n_2400, ["B", ID, "1",keyToSend]
'serout2 tx, n_2400, ["B0110"]
ENDIF
ENDIF
IF counter < 1000 THEN
counter = counter + 1
ENDIF
sleepCounter = sleepCounter +1
IF sleepCounter > 1100 THEN
sleepCounter = 0
tiltcount = 0
' tilttimer = 0
'testLED = 0
RBIF=0 ' Clear the PORTB[4..7] interrupt flag
@ SLEEP
ENDIF
GOSUB main