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;
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.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
Receiver code;
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.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
thanks for your time Nick





Bookmarks