Hi,
ich verwende einen PIC18F2480 und einen externen AD-Wandler AD7790 (
http://www.analog.com/UploadedFiles/Data_Sheets/AD7790.pdf), die ich über SPI verbinde.
Leider funktioniert es bei mir nicht. Hier mal mein Code:
#include <18f2480.h>
#device ADC=10
#use delay(clock=8000000)
#fuses NOWDT,HS,NOPUT,NOPROTECT,NOBROWNOUT,NOLVP
#define SPI_MODE_0_0 (SPI_L_TO_H | SPI_XMIT_L_TO_H)
#define SPI_MODE_0_1 (SPI_L_TO_H)
#define SPI_MODE_1_0 (SPI_H_TO_L)
#define SPI_MODE_1_1 (SPI_H_TO_L | SPI_XMIT_L_TO_H)
#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7,BRGH1OK,stream=debug)
#define SPANNUNG_REF 4
#define KOMPERATOR_REF 0
#define LUFTBLASENSENSOR 1
#define SPI_CS PIN_C2
#define SPI_CLOCK PIN_C3
#define SPI_DO PIN_C4
#define SPI_DIN PIN_C5
#define CREAD 0x38 // continous read
void main()
{
int8 ad_in1;
int8 ad_in2;
setup_spi(SPI_MASTER | SPI_MODE_1_1 | SPI_CLK_DIV_64);
//setup_spi(SPI_MASTER|0x4010|SPI_CLK_DIV_4|SPI_SS_DISABLED);
setup_adc(adc_off);
//SET_TRIS_C( 0x90 );
//output_high(SPI_CS);
output_high(SPI_CLOCK);
output_high(SPI_DO);
output_high(SPI_DIN);
while (TRUE)
{
while (!input(SPI_DO))
{
//warten auf SPI_DO high
};
spi_write(CREAD);
delay_us(50);
while(input(SPI_DO))
{
printf("warten auf Dout low");
};
output_high(SPI_DIN);
delay_us(50);
while(!input(SPI_DIN))
{
//warten auf SPI_DIN high
};
ad_in1 = spi_read(0);
ad_in2 = spi_read(0);
fprintf(debug,"%u ;", ad_in1, ad_in2);
while(!input(SPI_DO))
{
printf("warten bis DOUT high");
};
output_high(SPI_CS);
}
}
Wenn ich mal mit input_stat(PIN_C4) meine Pins auf Ein- und Ausgänge überprüfe, stelle ich fest, dass PIN C3 ein Eingang und PIN C4 ein Ausgang ist. Dies dürfte aber nicht richtig sein oder? Richtig angeschlossen habe ich alles.
Wenn ich den Status abfrage, ob ein Pin high oder low ist, verwende ich
while(input());
Setzt dieser Befehl einen Ausgang wieder zu einem Eingang?
Wie kann ich sonst den Pegelstatus prüfen?
Mein Programm bleibt immer vor dem spi_read Befehl in der while Schleife hängen.
while(!input(SPI_DIN))
{
//warten auf SPI_DIN high
};
Warum ist SPI_DIN nicht high? Laut Datenblatt vom AD7790(Seite 15) sollte das doch so sein oder?
Danke!