Serout/serin issues, advice required
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
BiPhase modulation beats Manchester 95% of the time.
If your system loses or gains half a bit time due to noise, clock slip, whatever, then Manchester goes out of sync and stays out for the rest of the message. BiPhase on the other hand is brought back into sync with the arrival of the very next '1' bit. BiPhase does not propagate errors. The code for biphase is virtually identical to manchester. Manchester needs very high accuracy clocks at both ends. BiPhase is much more tolerant of clock differences. The downside of biphase is that the channel needs a somewhat wider bandwidth.
Search for biphase code in the forum. I have posted on it before.
HTH
BrianT