Über I2C den Akkuwert aus dem Atmel auslesen
Hallo zusammen,
ich versuche mich derzeit zum ersten mal am I2C Bus. Mein Vorhaben ist, dass ich den digitalen 10 Bit Akkuwert aus dem RP6 bzw. aus dem Atmel auf der Hauptplatine auslesen möchte. Ich habe auf einer Erweiterungsplatine einen PIC18F2550 mit 8Mhz Keramik Resonator, welcher mit SDL(RB0) und SDC(RB1) am I2C Bus des RP6 hängt (Die Pins sind als Eingang geschaltet). In den RP6 habe ich das Beispielprogramm RP6Base_I2CSlave.hex geladen.
Durch das Handbuch des RP6 und meinen sonstigen Kenntnissen über den I2C Bus habe ich mir das Vorhaben folgendermaßen (vereinfacht dargestellt) vorgestellt:
- Vom Master (PIC) zum Slave (AVR) sende ich die Adresse des Slave (dez.: 10)
Hier die Zeile zur Slave Adresse aus der RP6Base_I2CSlave.c Datei:
Code:
// The Slave Address on the I2C Bus can be specified here:
#define RP6BASE_I2C_SLAVE_ADR 10
- Vom Master zum Slave sende ich ein String: I2C_REG_ADC_UBAT_L
- Vom Slave lese ich nun den Low-Wert ein
- Das selbe nochmal mit dem High-Wert
Hinweis: Ich programmiere meinen PIC in C mit dem C18 Compiler und verwende die Librarie i2c.h
Das Problem: Meine beiden Variablen (AKKUL und AKKUH) bleiben leer.
Hier ist mein Codeausschnitt:
Code:
//I2C
IdleI2C(); //Warten bis der IIC Bus frei ist
StartI2C(); //I2C Bus starten
WriteI2C(10); //Adresse des ATMEL senden
IdleI2C(); //Warten bis der IIC Bus frei ist
StartI2C(); //I2C Bus starten
putsI2C("I2C_REG_ADC_UBAT_L"); //Befehl zum Auslesen der Akku Variablen senden
AKKUL=ReadI2C();
StopI2C(); //I2C Bus stoppen
IdleI2C(); //Warten bis der IIC Bus frei ist
StartI2C(); //I2C Bus starten
WriteI2C(10); //Adresse des ATMEL senden
IdleI2C(); //Warten bis der IIC Bus frei ist
StartI2C(); //I2C Bus starten
putsI2C("I2C_REG_ADC_UBAT_H"); //Befehl zum Auslesen der Akku Variablen senden
AKKUH=ReadI2C();
StopI2C(); //I2C Bus stoppen
Ich würde mich sehr über Eure Hilfe freuen..
Mit freundlichen Grüßen
Nico
Liste der Anhänge anzeigen (Anzahl: 1)
Aktueller Stand:
Ich hatte in der Init des PICs einen Fehler: Beim Power on wurde fälschlicherweise ein Steuerbefehl (unbeabsichtigt) auf dem Bus ausgelöst und zwar indem ich zum Start die Port-Pins SDA und SDC als Ausgang definiert habe. Hier wurde kurzzeitig SCL und SDA zur selben Zeit auf Masse gezogen - das habe ich behoben. Mit dem Oszi konnte ich jetzt zumindest schon mal feststellen, dass die Adresse (0x0A bzw. dez.: 10) anscheinend richtig übertragen wird, siehe Anhang:
Anhang 19810
Ich werde weiter machen, melde mich mit Neuigkeiten.
Gruß Nico
Liste der Anhänge anzeigen (Anzahl: 1)
Der Slave schickt irgendwie kein ACK:
Es wird korrekt die Adresse (0x0A) übertragen, mit dem 8.Bit die "0", sprich nachfolgender Befehl ist schreibend. Danach müsste der Slave doch die SDA Leitung auch LOW ziehen um das ACK zu signalisieren. Warum tut er das nicht?
Anhang 19811