Hallo
Zur Messung der Stromaufnahme mit einem INA219 verwende ich das
Programm:
1
// Strommessung
2
i2c_start(adr_ina219);// Angabe Adresse
3
i2c_write(01);// Strom
4
i2c_stop();
5
6
i2c_start(adr_ina219+1);// Auslesen Adresse + 1
7
msb_strom=i2c_readAck();//...speichere oberes Bit
8
lsb_strom=i2c_readNak();//...speichere unteres Bit
9
i2c_stop();
10
11
strom_wrd=(msb_strom<<8|lsb_strom);// Zusammensetzung von o. & u. Byte
12
strom_anz=strom_wrd/4;
13
14
itoa(strom_anz,Buffer,10);
15
lcd_printlc(2,9," ");
16
lcd_printlc(2,9,Buffer);
Da ich für strom_anz ein uint16_t verwende dürfte eigentlich kein
negativer Wert angezeigt werden. Die Anzeige schwankt aber zwischen -1
und -4 teilweise sogar bis 16000. Kommt das durch itoa? Wie ändern
Das auslesen der Register und Berechnung habe ich so gemacht. Gibt es
eine bessere Methode dazu?
( C, AVR GCC, Atmega)
LG Pt
Hallo Peter,
itoa(...) konvertiert eine integer Zahl mit Vorzeichen, die hat ein
Vorzeichen, zu ihrer ASCII Darstellung.
"Convert an integer to a string."
utoa(...) konvertiert eine integer Zahl ohne Vorzeichen...
"Convert an unsigned integer to a string."
Alles klar?
Sorry, muss mal fragen um es zu verstehen.
Karl M. schrieb:> Du weißt schon, dass hier immer 0 heraus kommt?(msb_strom << 8)
Das Stromregister des INA219 besrhet aus einem 16 Bit Wort. Das lade ich
durch 2 x 8 Bit und füge es zu einem 16 Bit wieder zusammen. Durch das
Bit verschieben wird aus den 2 x 8 einmal 16 gebildet. Sorry wieso null?
Peter schrieb:> Sorry, muss mal fragen um es zu verstehen.>> Karl M. schrieb:>> Du weißt schon, dass hier immer 0 heraus kommt?(msb_strom << 8)>> Das Stromregister des INA219 besrhet aus einem 16 Bit Wort. Das lade ich> durch 2 x 8 Bit und füge es zu einem 16 Bit wieder zusammen. Durch das> Bit verschieben wird aus den 2 x 8 einmal 16 gebildet. Sorry wieso null?
Nun man kann 8 bit um 8 Stellen nach links in eine (interne) 8 bit
Variable verschieben, dann ist das Ergebnis immer 0.
Du kennst Dich mit "C" aus?
Soweit ja, habe auch das C buch neben mir zu liegen, Leider gibt es auf
diese Probleme keine Antwort. itoa und utoa stehn gar nicht drin. Werde
da mal Tante Google bemühen. Habe gearde utao eingesetzt, bringt aber
keine Veränderung. Der INA219 ist im Leeerlauf dabei erscheint 0 bzw.
16383. Schliesse ich einen Verbraucher z.B. Led an,wird der Strom
korrekt dargestellt
Hallo Peter,
utoa(...) und itoa(...) sind Standard C Funktionen, der Link mit den
Beschreibungen zu diesen steht ja oben.
Um dies nutzen zu können muss man <stdlib.h> einbinden.
Wie? mit #inlcude <stdlib.h>!
Dann kann man auch alle weitern aus dieser Bibliothek nutzen:
https://www.microchip.com/webdoc/AVRLibcReferenceManual/ch20s10s01.html
Ich schrieb ja schon, dass die Berechnung NUR ein 8 Bit Ergebnis
liefert.
Das liegt am fehlenden Cast auf unsigned 16 Bit, das auf die Variable
|msb_strom| anzuwenden ist.
Karl M. schrieb:> Du kennst Dich mit "C" aus?
Vielleicht solltest du auch mal wieder dein C Buch lesen, speziell das
Kapitel "integral promotion"
Peters Problem liegt woanders... vermutlich an einer falschen/fehlenden
Initialisierung des INA. Nebenbei bemerkt liefert der INA negative
Werte, uint16_t ist also schon mal falsch.
Michael R. schrieb:> Vielleicht solltest du auch mal wieder dein C Buch lesen, speziell das> Kapitel "integral promotion"
Das Teil scheint im Netz auf richtig Aktion zu stossen. Viele dafür und
viele dagegen. Muss gestehen, es ist auch für mich zu hoch.
Michael R. schrieb:> Peters Problem liegt woanders... vermutlich an einer falschen/fehlenden> Initialisierung des INA. Nebenbei bemerkt liefert der INA negative> Werte, uint16_t ist also schon mal falsch.
Lazût Angabe im Datenblatt ist der INA beim einschalten in einer
Grundstellung. Dabei können die Daten ohne init ausgelesen werden. Wenn
er die Werte negative Werte bringt, warum schwankt er den Nullpunkt.
Lege ich einen Verbraucher an, geht die Anzeige sofort ins positive und
zeigt korrekt an. Hatte eigentlci angenommen, wenn kein Strom fliesst
dann ist die Anzeige 0.
Hat noch jemand eine Idee dazu?
LG Peter
Peter schrieb:>> Vielleicht solltest du auch mal wieder dein C Buch lesen, speziell das>> Kapitel "integral promotion">> Das Teil scheint im Netz auf richtig Aktion zu stossen. Viele dafür und> viele dagegen. Muss gestehen, es ist auch für mich zu hoch.
Der Rat mit "Buch lesen" war auch auf Karl bezogen. Dein Code ist
prinzipiell richtig.
"dafür und dagagen sein" macht wenig Sinn, wenn es darum geht wie sich
ein C-Compiler standardkonform zu verhalten hat ;-)
Peter schrieb:> Hatte eigentlci angenommen, wenn kein Strom fliesst> dann ist die Anzeige 0.
Bissel rauschen darf er. Stark schwanken kann daher kommen, dass die
Eingänge "in der Luft" hängen. Schaltplan?
Sorry einen Schaltplan habe ich nicht. Ist eigentlich das Modul von
Sparkfunk auf einer kleinen Platine mit so ca. 2x2 cm und mein Aufbau
dazu um an den Bus zu kommen (Kabel mit Stecker). An den offenen Eingang
habe ich gar nicht gedacht. Könnte möglich sein.