Hi,
I have been trying to send data between two pics, my end goal is to use a wireless link. At the moment this link is hardwired. The code below is supposed to read a adc input, then encode it using manchester encoding and send it to a receiving pic. Code below;
Code:
@ DEVICE PIC12F683, INTRC_OSC_NOCLKOUT
' System Clock Options (Internal)
@ DEVICE PIC12F683, WDT_ON
' Watchdog Timer
@ DEVICE PIC12F683, PWRT_ON
' Power-On Timer
@ DEVICE PIC12F683, MCLR_OFF
' Master Clear Options (Internal)
@ DEVICE PIC12F683, BOD_OFF
' Brown-Out Detect
@ DEVICE PIC12F683, CPD_ON
' Data Memory Code Protect
@ DEVICE PIC12F683, PROTECT_ON
OSCCON = %01110000 ' Internal 8MHz osc
'PICBASIC PROGRAM
ANSEL = %00010000
ADCON0 = %10000001
VRCON = 0
CMCON0 = 7
DEFINE ADC_BITS 10 'Defines bit resoloution
DEFINE ADC_CLOCK 3 'Defines adc clock speed
DEFINE ADC_SAMPLEUS 50 'Defines sammple time of 50mS
'DEFINE OSCCAL_1K 1
Define OSC 8 ' Define oscilator speed
INCLUDE "modedefs.bas"
txout VAR GPIO.0 : Output txout : dataout VAR BYTE
ledcount VAR BYTE
speed var byte
Manch var byte
index var byte
led1 VAR GPIO.1 : Output led1
key VAR GPIO.5 : Input key
gpio = %00000000
led1 = 1 : pause 500 : led1 = 0
trisio.4=1
trisio.2=0
mainloop:
ansel = %00001000 'Turns on a2d two
ADCIN 3,speed
speed = speed/4
hpwm 2,speed,7000
IF key = 0 Then 'button not pressed
GoTo mainloop
EndIF
IF key = 1 Then
Pause 50 'wait 50ms for switch to debounce then check again
IF key = 1 Then 'Tx data out
call encode
dataout = $55 '($55 = manchester encoded $0)
SerOut txout, n2400, [ dataout, dataout, dataout, dataout, dataout ]
pause 10
SerOut txout, n2400, [ $aa,Manch ]
EndIF
EndIF
goto mainloop
Encode:
For Index = 0 to 7 ' loop 8-bits
Manch.0[(Index<<1)] = ~speed.0[Index] ' Encode bits 0,2,4,6,8,10,12,14 in Manch
Manch.0[(Index<<1)+1] = speed.0[Index]' Encode bits 1,3,5,7,9,11,13,15 in Manch
Next Index
Return
End
Once sent the following is supposed to receive it and decode it. The encode/decode routines for the tx'd info was an example posted on this forum.
Receiver code;
Code:
@ DEVICE PIC12F683, INTRC_OSC_NOCLKOUT
' System Clock Options (Internal)
@ DEVICE PIC12F683, WDT_ON
' Watchdog Timer
@ DEVICE PIC12F683, PWRT_ON
' Power-On Timer
@ DEVICE PIC12F683, MCLR_OFF
' Master Clear Options (Internal)
@ DEVICE PIC12F683, BOD_OFF
' Brown-Out Detect
@ DEVICE PIC12F683, CPD_ON
' Data Memory Code Protect
@ DEVICE PIC12F683, PROTECT_ON
OSCCON = %01110000 ' Internal 8MHz osc
ANSEL = %00000000
CMCON0 = 7
Define OSC 8 ' Define oscilator speed
INCLUDE "modedefs.bas"
rxin VAR GPIO.5 : Input rxin : datain VAR BYTE
Manch var word
index var byte
datain = 0
trisio.2 = 0
mainloop:
SerIn rxin, n2400, [$aa], Manch
call decode
hpwm 2,datain,7000
goto mainloop
Decode:
For Index = 0 to 7 ' loop for 8 bits
datain.0[Index] = ~Manch.0[Index<<1]' ByteOut=NOT Manch bits 0,2,4,6,8,10,12,14
Next Index
Return
End
I can send a single byte of data between two pics, any byte that gives an even spead of 1's and 0's etc for the manchester encoding works fine. If anyone can see where I have gone wrong can they let me know please. Most of the time I fine my answers on this forum, but not this time.
thanks for your time Nick
Bookmarks