mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Akkuzustand auslesen über I2C und ATmega16


Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich möchte meine LiIonen-Akku über die I2C-Schnittstelle mit einem 
ATmega16 verbinden und dessen Register auslesen. In der 
Akkuschutzschaltung wurde ein GAS-GAUGE-IC von der Firma TI verwendet. 
Typ ist der BQ27200. Auf der Seite 25 und 26 wird das Protokoll 
beschrieben (im Anhang).
Nun habe ich entsprechend diese Seite meine Routine aufgebaut. Das 
Ergebnis kann leider nicht stimmen, da der interne Speicher des BQ27200 
von 0x00-0x7F geht und meine Werte wiederholen sich bei 0x47.

Schaut mal bitte über meinen c-Code und vergleicht es mit dem Protokoll:
putchar() übergibt dem UART das gelesene Zeichen aus dem TWDR-Register 
von der TWI-Schnittstelle

Protokoll b) quick-read
void READ_BYTE_LiIO(void)
{
//Startbedingung
  TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);       // Startbedingung
  while(!(TWCR & (1<<TWINT)));                   // warte bis fertig

//ADDR[6..0]-ADDR.7=0
  TWDR = 0xAB;                     // Adresse
  TWCR = (1 << TWINT) | (1 << TWEN);             // senden
  while(!(TWCR & (1<<TWINT)));                   // warte bis fertig

//Umschalten auf Daten-Empfangen
  TWCR = (1 << TWINT) | (1 << TWEN);             // senden
  while(!(TWCR & (1<<TWINT)));                   // warte bis fertig

//Daten aus Register lesen und speichern
     putchar(TWDR);                                // Daten aus Register übernehmen

//Stoppbedingung
  TWCR = (1 << TWINT) | (1 << TWSTO) | (1 << TWEN);  // Stoppbedingungtodo=0;
}


Protokoll c) 1-byte read
void READ_BYTE_ADRESS_LiIO(void)
{
//Startbedingung
  TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);       // Startbedingung
  while(!(TWCR & (1<<TWINT)));                   // warte bis fertig

//ADDR[6..0]-ADDR.7=0
  TWDR = 0xAA;                     // Adresse
  TWCR = (1 << TWINT) | (1 << TWEN);             // senden
  while(!(TWCR & (1<<TWINT)));                   // warte bis fertig
//CMD[7..0]
  TWDR = 0x03;                     // Daten
  TWCR = (1 << TWINT) | (1 << TWEN);             // senden
  while(!(TWCR & (1<<TWINT)));                   // warte bis fertig

//Startbedingung
  TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);       // Startbedingung
  while(!(TWCR & (1<<TWINT)));                   // warte bis fertig

//ADDR[6..0]-ADDR.7=0
  TWDR = 0xAB;                     // Adresse
  TWCR = (1 << TWINT) | (1 << TWEN);             // senden
  while(!(TWCR & (1<<TWINT)));                   // warte bis fertig

//Umschalten auf Daten-Empfangen
  TWCR = (1 << TWINT) | (1 << TWEN);             // senden
  while(!(TWCR & (1<<TWINT)));                   // warte bis fertig

//Daten aus Register lesen und speichern
         putchar(TWDR);                                // Daten aus Register übernehmen

//Stoppbedingung
  TWCR = (1 << TWINT) | (1 << TWSTO) | (1 << TWEN);  // Stoppbedingungtodo=0;
}

Protokoll d) incremental-raed Start Adresse: 0x00
void READ_RAM_LiIO(void)
{
     unsigned char i;
//Startbedingung
  TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);       // Startbedingung
  while(!(TWCR & (1<<TWINT)));                   // warte bis fertig

//ADDR[6..0]-ADDR.7=0
  TWDR = 0xAA;                     // Adresse
  TWCR = (1 << TWINT) | (1 << TWEN);             // senden
  while(!(TWCR & (1<<TWINT)));                   // warte bis fertig

//CMD[7..0]
  TWDR = 0x80;                     // Daten
  TWCR = (1 << TWINT) | (1 << TWEN);             // senden
  while(!(TWCR & (1<<TWINT)));                   // warte bis fertig

//Startbedingung
  TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);       // Startbedingung
  while(!(TWCR & (1<<TWINT)));                   // warte bis fertig

//ADDR[6..0]-ADDR.7=0
  TWDR = 0xAB;                     // Adresse
  TWCR = (1 << TWINT) | (1 << TWEN);             // senden
  while(!(TWCR & (1<<TWINT)));                   // warte bis fertig

//Empfang starten
//Umschalten auf Daten-Empfangen
  TWCR = (1 << TWINT) | (1 << TWEN);             // senden
  while(!(TWCR & (1<<TWINT)));                   // warte bis fertig

// es folgen Adressen bis 0x2C
     for(i=0; i<=0x7F; i++)
     {
//Daten aus Register lesen und speichern
          putchar(TWDR);                             // Daten aus Register übernehmen
          if(i<0x7F)
          {
               TWCR = (1 << TWINT) | (1 << TWEN) | (1<<TWEA);    // ACK senden
            //while(!(TWCR & (1<<TWINT)));                   // warte bis fertig
          }
     }
//Stoppbedingung
  TWCR = (1 << TWINT) | (1 << TWSTO) | (1 << TWEN);  // Stoppbedingungtodo=0;
}

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.