Hi,
meine Routine funktioniert ja auch, allerdings nur mit all den anderen
I2C Bausteinen. Der AD Wandler will allerdings nicht und ich habe keine
Idee warum nicht.
Wäre also ein feiner Zug, wenn sich das mal jemand anschauen könnte und
mir sagen an was es liegen könnte.
Ich füge einfach noch mal die eigentliche I2C Routine ein.
#define iic_sda_d pd3_0 /* 1=Ausgang, 0=Eingang */
#define iic_sda p3_0
#define iic_scl_d pd3_3
#define iic_scl p3_3
#define TRUE 1
#define FALSE 0
void sdah(void) { iic_sda = 1; }
void sdal(void) { iic_sda = 0; }
void sclh(void) { iic_scl = 1; }
void scll(void) { iic_scl = 0; }
void starti2c(void) { sdal(); scll(); }
void stopi2c(void) { sdal(); sclh(); sdah(); }
void restarti2c(void) { sdah(); sclh(); starti2c(); }
void I2C_init(void) { prc2=1;
iic_sda_d = 1;
prc2=1;
iic_scl_d = 1;
starti2c();
stopi2c(); }
unsigned char sdain(void)
{ unsigned char dummy=0;
//prc2=1;
iic_sda_d=0;
dummy = iic_sda;
//prc2=1;
iic_sda_d=1;
return(dummy);
}
/* Ab hier sind die Funktionen nicht mehr Hardwareabhaengig! */
/* Gibt ein Byte Âber den I2C-Bus aus, war das erfolgreich, wurde */
/* dieses Byte also von einem der ICs am Bus akzeptiert, dann */
/* liefert diese Funktion ein TRUE zurÂck. */
unsigned char sendbytei2c(unsigned char daten)
{
short x; unsigned char dummy;
for (x=7;x>=0;x--)
{
if (daten & 0x80) /* Die acht Datenbits ausgeben */
sdah();
else sdal();
daten = daten << 1 ; /* Ein Bit nach links schieben */
sclh(); scll(); /* Zum n„chsten Bit takten */
}
sdah(); /* SDA zum Eingang umschalten */
sclh(); /* Ack aus Slave takten */
dummy=sdain(); /* ACK lesen */
scll();
if (dummy==FALSE) return (TRUE); else return (FALSE);
}
/* Liesst ein Byte vom I2C-Bus, es wird ausserdem das ack-bit erwartet
*/
/* Diese ACK-Bit muss immer TRUE sein, es sei denn es wird das letzte
*/
/* Datenwort von einem Device gelesen, dann muss es FALSE sein.
*/
unsigned char readbyteI2C(unsigned char ack)
{ short x; unsigned char dummy;
dummy=0;
sdah();
for (x=7;x>=0;x--)
{ sclh();
dummy=dummy << 1;
if (sdain()==TRUE) dummy=dummy|(unsigned char)0x01;
scll();
}
if (ack==TRUE) sdal(); else sdah();
sclh();
scll();
return(dummy);
}
//Max1238 schreiben
unsigned char Max1238out (void){
starti2c();
sendbytei2c(0b01101010); //Adresse
sendbytei2c(0b10100010); //Configuration Byte
sendbytei2c(0b00010111); //Configuration Byte
stopi2c();
}
//Max1238 lesen
unsigned char Max1238in (void){
unsigned char daten, daten2;
starti2c();
sendbytei2c(0b01101011); //Adresse
for (i=0; i<=10; i++){
daten = readbyteI2C(1); //Lowbyte
daten &= ~((1 << 7) | (1<<6)| (1<<5)| (1<<4) );
daten2 = readbyteI2C(1); //Highbyte
ADWandler[i]= ((daten << 8)| daten2);
}
stopi2c();
return (daten);
}
Am AIN0 liegen ca. 3,5V an. Sollte doch funktionieren, oder?
Nur warum nicht...
DANKE
Michael