Smart battery mit i2cmaster.h

Hallo zusammen,

ich habe folgendes problem. Wenn ich folgendes Programm auf den Arduino uno lade dan bekomme ich keine anzeige im seriellen Monitor.

#include <i2cmaster.h>

int dev = 0x0B<<1;
int data_low = 0;
int data_high = 0;
int pec = 0;

void setup()
{
Serial.begin(9600);
Serial.print("Hallo");
i2c_init(); //Initialise the i2c bus

}

void getvoltage()
{
  i2c_start_wait(dev+I2C_WRITE);
  i2c_write(0x09);
  i2c_rep_start(dev+I2C_READ);
  data_low = i2c_readAck(); //Read 1 byte and then send ack
  data_high = i2c_readAck(); //Read 1 byte and then send ack
  pec = i2c_readNak();
  i2c_stop();

  double tempDataVoltage = 0x0000;
  tempDataVoltage = (data_high) *256 + data_low;
  double voltage = tempDataVoltage/3*10;
  //Serial.print("Spannung=");Serial.println(tempDataVolatge,HEX);
  Serial.print("Spannung in mV =");Serial.println(voltage,0);
}

void gettemperature()
{
  i2c_start_wait(dev+I2C_WRITE);
  i2c_write(0x08);
  i2c_rep_start(dev+I2C_READ);
  data_low = i2c_readAck(); //Read 1 byte and then send ack
  data_high = i2c_readAck(); //Read 1 byte and then send ack
  pec = i2c_readNak();
  i2c_stop();

  double tempDataTemperature = 0x0000;
  tempDataTemperature = (data_high) *256 + data_low;
  //Serial.print("Temperatur=");Serial.println(tempDataTemperature,HEX);
  double temperature=((tempDataTemperature/10)-273.15);
  Serial.print("Temperatur in Grad Celsius=");Serial.println(temperature,2);
}

void loop()
{

getvoltage();
gettemperature();
Serial.println("--------------------------------------------");
}

Aber wenn ich einen ganz einfachen sketch wie z.b.

void setup()
{ Serial.begin(9600);
Serial.print(“Hallo”);
}

void loop()
{}

mache dann zeigt er mir das hallo auch an !

Weis einer Rat, denn ich bin am verzweifeln !

MFG

Wieso verwendest du nicht die Wire Library?

Wenn du nach

   Serial.print("hallo");

ein

   delay(6);

einfügst, siehst du dann das "hallo" im SerialMonitor ?

Falls ja, kannst du dieses delay ja mal versuchsweise in loop mehr oder weniger weit hinten einbauen, bis du die Stelle findest, die deinen Arduino killt.

Nur so eine Idee ...

Hallo danke für die schnellen Antworten.

Also warum ich die Wire libary nicht benutze ist. Ich habe es auch schon ausprobiert, aber es hat nicht funktioniert. Bis ich gelesen habe das ich für diesen SM-Bus die I2Cmaster libary benötige.

Der eingebaute Chip ist ein PIC140000

Das mit der delay idee hat leider auch nicht funktioniert :(

Bin für jeden weiteren Tipp dankbar :D

Einmal mehr fehlt der Link zur verwendeten Bibliothek.

Wenn ich vermuten darf, dann verwendest Du diese Bibliothek: http://homepage.hispeed.ch/peterfleury/avr-software.html.

Die ist nicht für die Arduino-IDE gedacht, sondern für eine AVR-Umgebung. Auch wenn der Arduino-Microcontroller von Atmel ist, genau wie die Chips, die der Bibliotheksautor verwendet, kannst Du nicht einfach so die Bibliothek transferieren und davon ausgehen, dass dann alles schon richtig gemacht wird. Der Code wird von der IDE compiliert und globaler Code ausgeführt, bevor setup() aufgerufen wird.

Danke pylon für deine Erklärung. Das erklärt wohl einiges! Und ja genau dort habe ich die Libary her!!

Das dumme ist jetzt stehe ich wieder am anfang und weis nicht weiter.

Könnte mir einer einen denkanstoss geben ?

Selber anpacken und lernen. Es sollte nicht so schwer sein, deinen Code anzupassen an die Wire lib. Komplette Referenzen zur Arduino Wire Lib durch arbeiten und schaun, ob entsprechende Funktionsaufrufe 1:1 geändert werden können.

Bis ich gelesen habe das ich für diesen SM-Bus die I2Cmaster libary benötige.

Der SMbus ist eine Sub-Menge der I2C-Spezifikation, somit sollte die Wire-Bibliothek in den meisten Fällen damit zurecht kommen. Hast Du eine Dokumentation für Dein Device?

Könnte mir einer einen denkanstoss geben ?

Vereinfacht:

i2c_start_wait(I2C_WRITE) = Wire.beginTransaction i2c_write = Wire.write i2c_rep_start(I2C_READ) = Wire.endTransaction(false) + Wire.requestFrom i2c_readXXX = Wire.read i2c_stop brauchst Du nicht, das wird von den Wire-Methoden selbst erledigt.

Dies Übersetzungtabelle braucht noch etwas Hirnschmalz, um angewandt zu werden, also nicht einfach drauf los schiessen.

Hey danke erstmal für die Vielen Antorten.

Also um mal mehr Infos in den Raum zu werfen.

hier der verbaute microchip --> http://ww1.microchip.com/downloads/en/DeviceDoc/40122b.pdf

und hier das Pdf das ich vom Smart battery hersteller bekommen habe . http://smbus.org/specs/smbus110.pdf

Das erste ist das Datenblatt des eingesetzten Microcontrollers, das zweite die SMbus Spezifikation. Eigentlich solltest Du eine Dokumentation bekommen haben, die beschreibt, wie sich die Firmware, die aufgespielt wurde, verhält. Wie konntest Du denn den geposteten Sketch erstellen? Woher wusstest Du z.B. die I2C-Adresse?

Hallo,

die Adresse habe ich direkt vom Hersteller bekommen. 0x16 aber die im oben genannten sketch, habe ich mittels i2C-scanner ausgelesen.Habe auch schon beide probiert (Ohne erfolg ).

Hier die mail vom Hersteller !

Dear Christian,

The battery communications is the same using the Microchip or Bq chipset.

The battery address is (Hex16) with the various registers detailed in the data sheet.

I have provided a link to a page on our website you may find useful.

www.inspired-energy.com/capabilities/clientsupport.htm

Auf der referenzierten Seite ist folgender Link relevant:

Protokoll-Spezifikation (Register-Beschreibung)

Die Adresse 0x16 ist wahrscheinlich die 8-bit-Adresse, die Arduino-Bibliothek will aber eine 7-bit-Adresse haben. Hast Du's mit 0x0b (= 0x16 >> 1) schon mal versucht? Wenn ja, zeige uns den Sketch, den Du verwendet hast.