hi guys!
im using SPI between the two pics. here is my program for SPI master
Code:'**************************************************************** '* Name : UNTITLED.BAS * '* Author : [select VIEW...EDITOR OPTIONS] * '* Notice : Copyright (c) 2008 [select VIEW...EDITOR OPTIONS] * '* : All Rights Reserved * '* Date : 7/5/2008 * '* Version : 1.0 * '* Notes : * '* : * '**************************************************************** Include "Modedefs.Bas" DEFINE HSER_RCSTA 90h DEFINE HSER_TXSTA 24h DEFINE HSER_BAUD 9600 DEFINE HSER_SPBRG 25 define OSC 4 ' Set LCD Data port DEFINE LCD_DREG PORTD ' Set starting Data bit (0 or 4) if 4-bit bus DEFINE LCD_DBIT 0 ' Set LCD Register Select port DEFINE LCD_RSREG PORTC ' Set LCD Register Select bit DEFINE LCD_RSBIT 0 ' Set LCD Enable port DEFINE LCD_EREG PORTC ' Set LCD Enable bit DEFINE LCD_EBIT 1 ' Set LCD bus size (4 or 8 bits) DEFINE LCD_BITS 8 ' Set number of lines on LCD DEFINE LCD_LINES 2 ' Set command delay time in us DEFINE LCD_COMMANDUS 2000 ' Set data delay time in us DEFINE LCD_DATAUS 50 SSPEN VAR SSPCON1.5 'SSP Enable bit CKP VAR SSPCON1.4 'Clock Polarity Select SMP VAR SSPSTAT.7 'Data input sample phase CKE VAR SSPSTAT.6 'Clock Edge Select bit SSPIF VAR PIR1.3 'SPI interrupt flag i VAR BYTE j var byte as var byte[5] com VAR byte[2] sen var byte[6] teds1 var byte[10] teds2 var byte[10] teds3 var byte[10] op1 var byte teds_out var byte[25] sen0 var byte[10] sen_all var byte[20] a var byte[10] TRISC = %10010000 'set PORTC I/O SSPEN = 1 'enable SPI pins CKP = 0 'clock idle low CKE = 0 'transmit on idle to active transition SSPIF = 0 'clear buffer full status SMP = 0 'sample in middle of data SSPCON1.0 = 0 SSPCON1.1 = 0 SSPCON1.2 = 0 SSPCON1.3 = 0 main: pause 100 j=0 hserout["initialized....",13,10] pause 1000 hserin [wait("x"),str com\2] pause 100 hserout["you entered",str com\3,13,10] pause 100 goto loop loop: if j>10 then main high portB.0 pause 25 low portB.0 pause 25 GoSub getdata 'initiate conversion and receive data LCDOut $fe, 1, STR a\5, DEC a[5] 'display received string Pause 100 hserout [dec a[4]," ",dec a[5]," ",dec a[6],13,10] pause 100 j=j+1 goto loop 'do it forever getdata: SSPBUF = "?" 'send ? to start conversion GoSub letclear 'wait for buffer to clear IF SSPBUF<>"!" Then getdata 'wait for reply (!) For i = 0 to 5 'loop for 6 characters SSPBUF = 0 'write to SSPBUF to start clock GoSub letclear 'wait for receipt a[i] = SSPBUF 'store received character in array Next i 'get next character Return letclear: IF SSPIF = 0 Then letclear 'wait for SPI interupt flag PauseUs 25 '25uS fudge factor SSPIF = 0 'reset flag Return
and here is my SPI slave code
Code:'**************************************************************** '* Name : UNTITLED.BAS * '* Author : [select VIEW...EDITOR OPTIONS] * '* Notice : Copyright (c) 2008 [select VIEW...EDITOR OPTIONS] * '* : All Rights Reserved * '* Date : 7/5/2008 * '* Version : 1.0 * '* Notes : * '* : * '**************************************************************** Include "Modedefs.Bas" DEFINE HSER_RCSTA 90h DEFINE HSER_TXSTA 24h DEFINE HSER_BAUD 9600 DEFINE HSER_SPBRG 25 define osc 4 DEFINE ADC_BITS 8 DEFINE ADC_CLOCK 8 DEFINE ADC_SAMPLEUS 50 ' Set LCD Data port DEFINE LCD_DREG PORTD ' Set starting Data bit (0 or 4) if 4-bit bus DEFINE LCD_DBIT 0 ' Set LCD Register Select port DEFINE LCD_RSREG PORTC ' Set LCD Register Select bit DEFINE LCD_RSBIT 0 ' Set LCD Enable port DEFINE LCD_EREG PORTC ' Set LCD Enable bit DEFINE LCD_EBIT 1 ' Set LCD bus size (4 or 8 bits) DEFINE LCD_BITS 8 ' Set number of lines on LCD DEFINE LCD_LINES 2 ' Set command delay time in us DEFINE LCD_COMMANDUS 2000 ' Set data delay time in us DEFINE LCD_DATAUS 50 out VAR BYTE[8] out2 var byte[8] out3 var byte[8] teds var byte[20] teds_out var byte[11] sen0 var byte[10] sen_all var byte[20] i var byte j var byte op1 var byte SSPEN VAR SSPCON1.5 CKP VAR SSPCON1.4 SMP VAR SSPSTAT.7 CKE VAR SSPSTAT.6 SSPIF VAR PIR1.3 SCL Var PortB.6 SDA Var PortB.7 TRISC = %11011111 'set PORTC I/O SSPCON1 = %00000101 'configure SPI slave, no SS CKP = 0 CKE = 0 SSPIF = 0 SMP = 0 ADCON1 = $00 INTCON3.3=1 INTCON2.7=0 INTCON2.5=0 INTCON3.0=0 INTCON3.6=1 '*************************************** ' PicBasic Pro SPI slave program (see SPImast.bas for connections) ' Allocate RAM dataout VAR BYTE[8] 'Data out array 'ADCON1 = $00 'PORTA.0 analog, rest PORTA and PORTE pins to digital dataout[0] = "A" 'Preset output data to "ADC= " dataout[1] = "D" dataout[2] = "C" dataout[3] = "=" dataout[4] = " " find: if INTCON3.0=1 THEN loop HIGH PORTC.1 PAUSE 100 LOW PORTC.1 PAUSE 100 goto find loop: INTCON3.3=0 INTCON3.0=0 SSPEN = 0 'disable/enable SSP to reset port SSPEN = 1 GoSub letclear 'wait for byte received IF (SSPBUF <> "?") Then loop 'wait for ? to start conversion ADCIN 1, dataout[5] 'Read ADC channel 0, store in 6th position of string pause 50 GoSub senddata 'send "!" and string of data INTCON3.3=1 pause 10 GoTo loop 'do it forever senddata: GoSub letclear 'wait until buffer ready SSPBUF = "!" 'send reply For i = 0 to 5 'loop for 6 array locations GoSub letclear 'wait until buffer ready SSPBUF = dataout[i] 'send array variable Next i 'next location Return letclear: IF SSPIF = 0 Then letclear 'wait for interrupt flag SSPIF = 0 'reset flag Return
The problem is coming with SPI master. It is connected with serial port to Labview. when the circuit is switched on it displayes
Initialized...
(then it ask to enter two string data)
then it displays
You pressed (string data that we entered)
and then it displays sensor reading 11 times.
I have put the condition that when j>10 then goto main and ask for the string data again.
But this doesnt work. It displays sensor data correctly 11 times, and then initialized is displayed and then it halts, i enter the values but nothing happens. Please tell me what is the problem with this,
I shall be thankful to u for this




Bookmarks