Herkese selamlar. PIC18F4550 ile harici ADC entegresi olan MCP3301 ile SPI iletişim protokolünü kullanarak veri almaya çalışıyorum fakat bunu bir türlü başaramadım, Mikroc derleyicisinde yazmış olduğum kod ve kurduğum devre şu şekilde, yardımlarınızı bekliyorum, herkese iyi çalışmalar diliyorum.
sbit LCD_RS at RD2_bit;
sbit LCD_EN at RD3_bit;
sbit LCD_D4 at RD4_bit;
sbit LCD_D5 at RD5_bit;
sbit LCD_D6 at RD6_bit;
sbit LCD_D7 at RD7_bit;
sbit LCD_RS_Direction at TRISD2_bit;
sbit LCD_EN_Direction at TRISD3_bit;
sbit LCD_D4_Direction at TRISD4_bit;
sbit LCD_D5_Direction at TRISD5_bit;
sbit LCD_D6_Direction at TRISD6_bit;
sbit LCD_D7_Direction at TRISD7_bit;
char temp = 0;
char temp1 = 0;
int veri = 0;
int result = 0;
char text[7] = " ";
char sign_bit = 0;
int ADC_Output() {
BF_bit = 0;
LATA.B5 = 0; // Select ADC chip
SPI1_Write(0x0000);
while(BF_bit); // wait first 8 bit recieve
temp = (SPI1_Read(SSPBUF) & 0b00011111); // read first 8 bit
SPI1_Write(0x0000);
while(BF_bit); // wait second 8 bit recieve
temp1 = SPI1_Read(SSPBUF); // read second 8 bit
LATA.B5 = 1; // Deselect ADC chip
veri = (int)(temp << 8 | temp1); // Combine 8 bits
sign_bit = (char)veri>>12;
if(sign_bit) veri *= -1;
else veri *= 1;
return veri;
}
void main() {
ADCON0 = 0x00;
ADCON1 = 0x0F; //
CMCON = 0x07; // Comparators are disabled
TRISB.B0 = 1; // SDI pin is input
TRISB.B1 = 0; // SCK pin is output
TRISA.B5 = 0; // Slave select pin is output
TRISD = 0x00;
LATA = 0x00;
LATB = 0x00;
LATC = 0x00;
LATD = 0x00;
LATA.B5 = 1; // Deselect ADC chip
// *********SPI options**********
SMP_bit = 1; // Input data sampled at end of data output time
SSPBUF = 0; // SSPBUF is empty
BF_bit = 0; // Receive not complete, SSPBUF is empty
CKE_bit = 1; // Transmit occurs on transition from active to Idle clock state
CKP_bit = 0; // Idle state for clock is a low level
WCOL_bit = 0; // No collision
SSPOV_bit = 0; // No overflow
SSPEN_bit = 1; // Enables serial port and configures SCK, SDO, SDI and SS as serial port pins
SSPM3_bit = 0; // SPI Master, CLK = Fosc/4
SSPM2_bit = 0;
SSPM1_bit = 0;
SSPM0_bit = 0;
SPI1_Init_Advanced(_SPI_MASTER_OSC_DIV4, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_HIGH_2_LOW);
Lcd_Init();
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1,1,"MCP3301 ADC:");
while(1){
result = ADC_Output();
IntToStr(result,text);
Lcd_Out(2,1,text);
delay_ms(20);
}
}
(https://thumb.ibb.co/hUNMVo/circuit_Diagram.jpg) (https://ibb.co/hUNMVo)