'*******************************************************
'**** Wireless Hand Pad TX For Telescope ****
'**** Control System Ver 1.0a ****
'**** Written By Darren Quinert ****
'**** © DP & TL Computers 2000-2008 ****
'**** Parts of this code was obtained ****
'**** from ****
'**** [URL]http://www.hippy.freeserve.co.uk/picaxewf.htm[/URL] ****
'**** ****
'*******************************************************
'*******************************************************
'**** Picaxe 14M and 433 Wireless ****
'**** Module ****
'*******************************************************
'
'*******************************************************
'*******************************************************
#PICAXE 14M
setfreq m8
SYMBOL RECEIVER_CODE = 1 ' 0 .. 15
SYMBOL SENDER_CODE = 1 ' 0 .. 15
SYMBOL TX_PIN = 0
SYMBOL TX_BAUD = 2400
SYMBOL TX_LED = 1
SYMBOL POWER_ON_PIN = 2
SYMBOL POWER_UP_DELAY = 20
SYMBOL POWER_UP_LED = 3
SYMBOL SIDERIAL_RUN = 4
SYMBOL PREAMBLE_LENGTH = 5
SYMBOL MAX_DATA_LENGTH = 4
SYMBOL PREAMBLE_BYTE = $AA
SYMBOL SOM_BYTE = $C5
SYMBOL EOM_BYTE = $5C
SYMBOL POSTAMBLE_BYTE = $3A
SYMBOL dataLength = b0
SYMBOL byteNumber = b1
SYMBOL bytePtr = b2
SYMBOL byteo = b3
SYMBOL bit = b4
SYMBOL k = b5
SYMBOL crc = b6
SYMBOL POLYNOMIAL = $8C
'********************************************
'********************************************
Powerup:
let dirsc=%00000001
PAUSE 5000
Main:
let pins =%00000
if pin1=1 then let b7="1" : goto createpacket :endif 'CreatePacket1
if pin2=1 then let b7="2" : goto createpacket :endif 'CreatePacket2
if pin3=1 then let b7="3" : goto createpacket :endif 'CreatePacket3
'***************************************
'**** Checks 3 Position Switch ****
'***************************************
Checksw:
if portc pin1=1 then let b7="4" : goto createpacket :endif 'CreatePacket4
if pin0=0 then Decroutine
if pin0=1 then Focus
if pin1=0 then let b7="0" : goto createpacket :endif 'CreatePacket0
GOTO Main
'***************************************
'**** Checks 2 Position Switch ****
'***************************************
Decroutine:
if pin4=1 then let b7="5" : goto createpacket :endif 'CreatePacket5
if portc pin2=1 then let b7="6" : goto createpacket :endif 'CreatePacket6
if pin4=0 then Main
Focus:
if pin4=1 then let b7="7" : goto createpacket :endif 'CreatePacket7
if portc pin2=1 then let b7="8" : goto createpacket :endif 'CreatePacket8
if pin4=0 then Main
'**************************************
'***** Create Control State Packet ****
'**************************************
CreatePacket:
dataLength = 1
POKE $50,b7
GOTO Send
#rem
CreatePacket0:
dataLength = 1
POKE $50,"0"
GOTO Send
CreatePacket1:
dataLength = 1
POKE $50,"1"
GOTO Send
CreatePacket2:
dataLength = 1
POKE $50,"2"
GOTO Send
CreatePacket3:
dataLength = 1
POKE $50,"3"
GOTO Send
CreatePacket4:
dataLength = 1
POKE $50,"4"
GOTO Send
CreatePacket5:
dataLength = 1
POKE $50,"5"
GOTO Send
CreatePacket6:
dataLength = 1
POKE $50,"6"
GOTO Send
CreatePacket7:
dataLength = 1
POKE $50,"7"
GOTO Send
CreatePacket8:
dataLength = 1
POKE $50,"8"
GOTO Send
#endrem
'***************************
'**** Send Data Packet *****
'***************************
Send:
' On entry, 'dataLength' contains the number of bytes
' of data to send. The bytes of data are stored in SFR
' RAM from location $50 upwards.
CalculateCrc:
crc = 0
byteo = SENDER_CODE * $10 | RECEIVER_CODE
bytePtr = $50
FOR byteNumber = 1 TO dataLength
PEEK bytePtr,byteo
bytePtr = bytePtr+1
GOSUB CrcAdd
NEXT
PowerUpTransmitter:
HIGH POWER_ON_PIN
HIGH POWER_UP_LED
PAUSE POWER_UP_DELAY
SendPreamble:
TOGGLE TX_LED
FOR byteNumber = 1 TO PREAMBLE_LENGTH
SEROUT TX_PIN,TX_BAUD,(PREAMBLE_BYTE)
NEXT
SendStartOfMessage:
SEROUT TX_PIN,TX_BAUD,(SOM_BYTE)
SendReceiverAndSenderCode:
byteo = SENDER_CODE * $10 | RECEIVER_CODE
SEROUT TX_PIN,TX_BAUD,(byteo,datalength)
'SendDataLength:
'
' SEROUT TX_PIN,TX_BAUD,(dataLength)
SendData:
TOGGLE TX_LED
bytePtr = $50
FOR byteNumber = 1 TO dataLength
PEEK bytePtr,byteo
bytePtr = bytePtr+1
SEROUT TX_PIN,TX_BAUD,(byteo)
NEXT
SendChecksum:
SEROUT TX_PIN,TX_BAUD,(crc,EOM_BYTE)
'SendEndOfMessage:
'
' SEROUT TX_PIN,TX_BAUD,(EOM_BYTE)
SendPostamble:
TOGGLE TX_LED
FOR byteNumber = 1 TO MAX_DATA_LENGTH
SEROUT TX_PIN,TX_BAUD,(POSTAMBLE_BYTE)
NEXT
GOTO Main
CrcAdd:
FOR bit = 0 TO 7
k = byteo ^ crc & 1
IF k = 0 THEN CrcAdd1
k = POLYNOMIAL
CrcAdd1:
crc = crc / 2 ^ k
byteo = byteo / 2
NEXT
RETURN