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


von Daniel (Gast)


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
}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.