Hi guys!
i have setup a circuit that involves two PICs. both are PIC18f452. One pic (SPI SLAVE) has a sensor on its analog input, it senses the value and sends it through SPI to SPI Master PIC. The SPI master pic then sends it to labview through serial port, now so far i was using this define statement in my program:
define adc_bits 8
but since i require more accuracy, so i made it
define adc_bits 10
and then i changed the associated variables type from byte to word to hold such a big amount of data. Now the prb is that SPI communication is not transferring the right value. this probably is due to the fact that the SSPBUF register is of 8-bits and im transferring a 16-bit value. So please look at my coding and suggest me a way how to make it possible to transfer a 16-bit data through spi. here is my coding for the SPI master
and then following is the program for SPI slaveCode: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 ' Set number of bits in result DEFINE ADC_CLOCK 2 ' Set clock source (rc = 3) DEFINE ADC_SAMPLEUS 50 ' Set sampling time in microseconds ' 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 'loop counter a VAR byte[6] 'Holds 6 characters read from slave ADCON1 = 7 'Set PORTA and PORTE to digital Low PORTE.2 'LCD R/W line low (W) Pause 100 'Wait for LCD to start up TRISC = %00010000 '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 loop: GoSub getdata 'initiate conversion and receive data 'LCDOut $fe, 1, STR a\5, DEC a[5] 'display received string Pause 10 hserout [dec a[5],13,10] 'hserout [dec a[5]] pause 10 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
PLease remember that this configuration is working well as the PIC is configured as an 8-bit adc. when i make it 10-bit, the only thing that doesnt work is SPI communication. Please tell me how to make it possibleCode:Include "Modedefs.Bas" DEFINE HSER_RCSTA 90h DEFINE HSER_TXSTA 24h DEFINE HSER_BAUD 9600 DEFINE HSER_SPBRG 25 ' Allocate RAM define osc 4 DEFINE ADC_BITS 8 ' Set number of bits in result DEFINE ADC_CLOCK 8 ' Set clock source (rc = 3) DEFINE ADC_SAMPLEUS 50 ' Set sampling time in microseconds dataout VAR byte[8] 'Data out array 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 'interrupt flag - last bit set i VAR BYTE 'loop counter TRISC = %10011111 'set PORTC I/O SSPCON1 = %00000101 'configure SPI slave, no SS CKP = 0 'clock idle low CKE = 0 'transmit on idle to active transition SSPIF = 0 'clear SPI interrupt SMP = 0 'sample in middle of data 'ADCON0 = %10000000 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] = " " loop: 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 0, dataout[5] 'Read ADC channel 0, store in 6th position of string PAUSE 50 GoSub senddata 'send "!" and string of data 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 pause 10 Next i 'next location Return letclear: IF SSPIF = 0 Then letclear 'wait for interrupt flag SSPIF = 0 'reset flag Return
regards,





Bookmarks