Hallo
Habe mir den Stromsensor INA 219 gekauft. Das Datenblatt habe ich
gefunden und bin beim studieren. Anschluss und Adresse ist auch klar.
Wenn ich im Netz nach Beispielen oder Anwendung dazu suche bekomme ich
fast ausschliesslich die Sachen Sparkfun oder was mit Arduino.
Da ich nur mit C programmiere finde ich so gut keine Beispiele.
Hat jemand von euch was dazu oder wo finde ich was dazu?
LG Henry
Henry schrieb:> Da ich nur mit C programmiere finde ich so gut keine Beispiele.
Beispiele für I²C-Handling in C gibt es genug; wie der INA219 gesteuert
werden muss und was als Wandlungsergebnis raus kommt, steht im
Datenblatt. Was hast du gegen den Arduino Code und was hindert dich
daran, die paar Zeilen in C nachzustricken.
Hallo Wolfgang
Habe damals mit einem simplen Atm 128 mit C angefangen. Zufällig bin ich
nicht zum Arduino gekommen. Eigentlich bin ich heute fast froh darüber.
Habe mehrmals versucht mich mit dem Arduino anzufreunden. Leider hat das
Teil einige von meinen Programmen so nicht verstanden. Die Libs scheinen
nicht so gut zu sein. Das grössere Problem liegt bei mir in der Zeit.
Arbeite mit TFT Displays (Farbe) mit dem Bus. Das Display hat eine
Reaktionszeit von ca. 6 Mikrosekunden. Da kommt der Arduino nicht so
richtig mit. Kann mit dem alten C scheinbar viel machen zu können.
Leider sind einge Sachen bei mir unklar. Wenn ich das Datenblatt richtig
verstanden habe, kommt das Ergbnis als 16 Bit mit MSB und LSB. In
einigen Sachen von Arduino und vom Hersteller steht was Einstellung oder
sogar Kalibrierung. Das andere Problem ist der Code selber. Wenn ich
Beispiel im Netz finde kann es so um die 500 Zeilen Code haben. Wozu so
viel?
Bei anderen Sachen mache es in 30 Zeilen mit Umrechnung.
LG Henry
PS: ich verwende kein delay (meistens)
@Henry
Was hat dein Aufsatz denn jetzt mit dem Thema zutun?
Arduino ist auch nur C und dabei open source. D.h. wenn man C kann,
sollte es möglich sein, dessen library zum Ansprechen des INA219
umzubauen bzw. sie als Hilfe nehmen um zu verstehen, wie die
Kommunikation funktioniert.
Henry schrieb:> Die Libs scheinen nicht so gut zu sein.
Die "Mach-was-das-so-wie-ich-will"-Funktion ist genauso kompliziert wie
der automatische Blinker bei Audi, BMW etc.
Henry schrieb:> Das Display hat eine Reaktionszeit von ca. 6 Mikrosekunden.
Was hat das mit dem INA-Problem zutun?
Henry schrieb:> Wenn ich das Datenblatt richtig> verstanden habe, kommt das Ergbnis als 16 Bit mit MSB und LSB
Jepp. Das erste der beiden Bytes ist das MSB.
Henry schrieb:> Wenn ich Beispiel im Netz finde kann es so um die 500 Zeilen Code haben.> Wozu so viel?
Mit Display-Ausgabe oder anderem Spielkram.
Vielleicht hat auch einfach ein Anfänger sein Werk veröffentlicht, weil
er der Meinung ist, dass das der Welt gefehlt hat.
> Bei anderen Sachen mache es in 30 Zeilen mit Umrechnung.
Das mit der Reaktionszeit hat mit Arduino zu tun. Da scheinbar vorrangig
delay benutzt wird ist die Zeit einfach zu langsam um auf das Display zu
reagieren. In anderen Beiträgen wird hier auf das "Grottenschlechte" IDE
von Arduino verwiesen.
Wozu auf das schlechte gehen wemm es etwas besserens gibt. AVR oder
Studio sei mal dahin gestellt ob es soviel besser ist. Sicher hat jede
Sparche oder Programm seine Vor- oder Nachteile.
LG Henry
Henry schrieb:> Da kommt der Arduino nicht so richtig mit.
Liegt es am Prozessor oder am Code?
IMHO die meisten Arduinos nutzen einen ATmega328, manche einen SAM3X8E
ARM und den ESP8266 bzw. den ESP32 von Espressif kann man auch wie einen
Arduino benutzen. Letzter haben aber einiges im Hintergrund laufen, was
evtl. das Timing kaputt macht.
Auf den INA219 kannst du maximal im High Speed Mode des I2C zugreifen
(Umschaltung s. Datenblatt 8.5.6.1 High-Speed I2C Mode).
Vielleicht hilft dir der folgende Thread weiter, der die Wire-Bibliothek
beim Arduino umgeht und für den Zugriff direkt auf den C-Code aufsetzt.
https://electronics.stackexchange.com/questions/29457/how-to-make-arduino-do-high-speed-i2cHenry schrieb:> PS: ich verwende kein delay (meistens)
Das wäre ja auch noch schöner ;-)
Henry schrieb:> Wozu auf das schlechte gehen wemm es etwas besserens gibt
Wenn man damit schnell mal Sachen testen kann?!
Es gibt da z.B. den I²C-Bus-Scanner, der sämtliche Geräte anzeigt, die
am Bus erkannt werden.
Wenn man ein System komplett neu entwickelt, und mit irgendwelchen
Sensoren ausstattet, die man nur vom Datenblatt kennt, dann ist es ganz
praktisch, wenn man die mit einem System testen kann, wo zumindest die
Schnittstellengeschichte schon mal funktioniert.
Einen Scanner für den I2C Bus habe ich (nicht Arduino) in C geschrieben.
Anzeige ist auf einem Display mit 4x16 Zeichen. Das ist immer der erste
Test um zu schauen was los ist.
Verwende den Atm 128 und für grössere Sachen den SAM21D. Bin am ESP 32
dran. Ist aber eine andere Klasse für mich und brauche noch Zeit um es
zu verstehen.
Trotzdem bleibt die Frage nach dem INA 219 und ein paar Beispiele dazu.
LG Henry
Henry schrieb:> Trotzdem bleibt die Frage nach dem INA 219 und ein paar Beispiele dazu.
Alles, was spezifisch beim Handling des INA219 spezifisch ist, kannst du
doch ohne Probleme aus den weit verbreiteten Bibliotheken abgucken und
dabei deine Basis-I2C-Routinen verwenden. Optimieren auf dein Timing
kannst du immer noch, wenn die grundlegende Funktionalität erstmal
gegeben und verstanden ist.
https://github.com/adafruit/Adafruit_INA219
Henry schrieb:> Wozu so viel?
Willst Du hier den Troll geben oder eine Lösung haben?
Wenn Du wirklich C programmieren kannst, dürftest Du aus einer
Arduino-Library die notwendigen Beispiele herausziehen können.
Habe das PDF mit den Daten des Herstellers soweit gelesen. Wie weit ich
es verstanden habe ist eine andere Sache.
Wenn ich richtig gelesen habe hat der INA219 5 Register zur Einstellung
und zum lesen. Muss ich zuerst die Regsiter setzen und kann auslesen?
Die Ausgabe erfolgt als erstes im MSB und dann im LSB.
1
ret=i2c_start(ina219);// Start Lesen des LM75
2
if(ret==0)
3
{// Wenn LM75 ein OK sendet...
4
msb_strom=i2c_readAck();//...speichere oberes Bit
5
lsb_strom=i2c_readNak();//...speichere unteres Bit
6
}
7
else// Fehlererkennung
8
{// Wenn LM75 kein OK sendet
9
lcd_command(LCD_CLEAR);// Leere Display
10
lcd_printlc(1,13,"READ");// "Lesevorgang"
11
lcd_printlc(2,13,"NOK");// "Nicht OK (NOK)"
12
}
Mit diesem Code kann ich überprüfen ob mein Slave vorhanden ist und MSB
und LSB auslesen.
1
stromfassung();// Unterprg Strom.auslesung
2
strom_wrd=(msb_strom<<8|lsb_strom);// Zusammensetzung von o. & u. Byte
3
strom=msb_strom;// Umwandlung in ein Signed Char
damit wird dann strom_wrd gebildet und kann dann verarbeitet werden
Bleibt die Frage mit den Registern.
LG Henry
Möchte nicht als Troll hingestellt werden. Leider habe ich Probleme mit
dem Code in deinem Beispiel. Der ist in C++ geschrieben. Arbeite aber
mit C und es gibt dabei doch unterschiede die ich nicht verstehe.
LG Henry
Henry schrieb:> Arbeite aber mit C und es gibt dabei doch unterschiede die ich nicht> verstehe.
Dann stell genau zu diesen Problemen Fragen.
Einfach nur zu sagen "Ich brauche ein Beispiel in C für den INA219."
klingt nach "Kann mir mal jemand die Schnürsenkel binden?!".
Henry schrieb:> Bleibt die Frage mit den Registern.
Welche? (kann natürlich sein, dass ich das mal wieder überlesen habe)
Der Sensor verwendet 16-Bit-Register, also immer zwei Bytes.
Und immer zuerst das MSB und dann das LSB im Datenstrom.
STK500-Besitzer schrieb:> Einfach nur zu sagen "Ich brauche ein Beispiel in C für den INA219."
Hatte gedacht das ich es so gesagt habe.
STK500-Besitzer schrieb:>> Bleibt die Frage mit den Registern.
Welche Register hat der INA219 und welches Regsiter dient wozu?
Jetzt die richtigen Fragen gestellt?
LG Henry
Henry schrieb:> Welche Register hat der INA219 und welches Regsiter dient wozu?
Siehe Datenblatt.
Laß Dir doch mal die Werte der ersten drei Register ausgeben und prüfe
auf Plausibilität.
> Das mit der Reaktionszeit hat mit Arduino zu tun.> Da scheinbar vorrangig delay benutzt wird ist die Zeit> einfach zu langsam um auf das Display zu reagieren.
Das Display ist ein Ausgabegerät, mir ist unklar, worauf du da reagieren
möchtest. Ob und wie intensiv jemand die delay Funktion verwendet, gibt
das Arduino Framework nicht vor.
> In anderen Beiträgen wird hier auf das "Grottenschlechte"> IDE von Arduino verwiesen.
Anstatt die Meinung anderer zu wiederholen, solltest Du dir besser deine
eigene Meinung durch praktische Erfahrung aufbauen. Die IDE von Arduino
ist in erster Linie einfach, Anfänger-freundlich, und ganz sicher nicht
schlecht. Sie funktioniert zuverlässig (sehr viel zuverlässiger als z.B.
das Atmel Studio), sie tut was sie soll.
Wenn du eine komplexe IDE bevorzugst: Bitte, dann verwende sie. Heule
dann aber nicht herum, dass Dich die vielen Einstellmöglichkeiten
verwirren oder dass du mit irgend einer Tastenkombination etwas verbockt
hast und nun nicht mehr zurück findest.
Das Arduino Framework unterstützt die Verwendung anderer IDE
ausdrücklich, und zwar gleich doppelt. Du kannst Arduino als Compiler in
deine IDE einbinden, oder du nutzt deine IDE nur als "besseren"
Text-Editor und verwendest weiterhin die Arduino IDE zum Kompilieren und
Flashen.
> wenn ich im Netz nach Beispielen oder Anwendung dazu suche bekomme> ich fast ausschliesslich die Sachen Sparkfun oder was mit Arduino.
Was wohl daran liegt, dass dieser Chip im Arduino Umfeld beliebt
geworden ist. Die Hersteller von Arduino Shields veröffentlichen dazu
passende Programmierbeispiele, damit sie ihre Hardware besser verkaufen
können.
Wenn du das als Nachteil empfindest (finde ich Unsinnig, aber egal),
dann entscheide Dich für einen anderen Chip. Aber erwarte nicht, dass
der Chip-Hersteller großartige Programmierbeispiele liefert. Das hat er
nämlich nicht nötig, denn er verkauft seine Chips in großen Mengen an
Firmen, die das selbst hinbekommen oder für entsprechenden Support
bezahlen.
Außerdem sind die wenigen Programmbeispiele der Chip-Hersteller zu 95%
Wahrscheinlichkeit nicht in der Sprache oder der IDE verfasst, die du
gerade sehen möchtest.
#define ina219 0x80 // Leseadresse des INA219 0x81
10
11
i2c_start(ina219+1);// Auslesen Adresse + 1
12
Data_1=i2c_readAck();// liest Eingang MSB
13
Data_2=i2c_readNak();// liest Eingäng LSB
14
i2c_stop();
Mit diesen beiden kann ich Spannung und Strom auslesen:
1
#define INA219_SHUNT_V 0x01
2
#define INA219_BUS_VOLT 0x02
Wenn ich das richtig verstanden habe, kann ich mit SHUNT_V die Spannung
über den Shunt lesen und mit BUS_VOLT die die Spannung am Shunt lesen.
Wie kann ich einstellen was gelesen werden soll?
Kommen beide Werte als 16 Bit?
Was kommt ich am Power lesen?
LG Henry
Stefan U. schrieb:> Du kannst Arduino als Compiler in> deine IDE einbinden, oder du nutzt deine IDE nur als "besseren"> Text-Editor und verwendest weiterhin die Arduino IDE zum Kompilieren und> Flashen.
Was hat Arduino mit Compiler zu tun. Die Arduino IDE verwendet den GCC
> Was hat Arduino mit Compiler zu tun?
Warscheinlch bist Du gewohnt, make zu benutzen. Arduino hat dafür einen
eigenen spezifischen Ersatz.
Der avr-gcc muss mehrfach mit unterschiedlichen Parametern aufgerufen
werden, um die einzelnen Dateien zu compilieren und zu linken. Um diese
Ablaufsteuerung kümmern sich Kommandozeilentools, welche die Arduino IDE
aufruft.
Henry schrieb:> Wie kann ich einstellen was gelesen werden soll?
Datenblatt lesen: http://www.ti.com/lit/ds/symlink/ina219.pdf
Seite 16
> Kommen beide Werte als 16 Bit?
Ja.
> Was kommt ich am Power lesen?
Erstmal 0x0000.
Schreib Dir mal zwei Funktionen, damit Du Struktur in Deinen Code
bekommst: