Akkuzustand auslesen über I2C und ATmega16

Gast #476578
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
1
void READ_BYTE_LiIO(void)
2
{
3
//Startbedingung
4
  TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);       // Startbedingung
5
  while(!(TWCR & (1<<TWINT)));                   // warte bis fertig
6

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

32
// es folgen Adressen bis 0x2C
33
     for(i=0; i<=0x7F; i++)
34
     {
35
//Daten aus Register lesen und speichern
36
          putchar(TWDR);                             // Daten aus Register übernehmen
37
          if(i<0x7F)
38
          {
39
               TWCR = (1 << TWINT) | (1 << TWEN) | (1<<TWEA);    // ACK senden
40
            //while(!(TWCR & (1<<TWINT)));                   // warte bis fertig
41
          }
42
     }
43
//Stoppbedingung
44
  TWCR = (1 << TWINT) | (1 << TWSTO) | (1 << TWEN);  // Stoppbedingungtodo=0;
45
}

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 19 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.