Geschätztes Forum, ein DS1115 (16bit ADC) möchte ich auslesen. Komme mit dem Datenblatt nicht klar. 1. TRANSMITTER_START (TWI Adesse 0x48) 2. senden 0b00000000 (Conversion register) 3. RECEIVER_START (TWI Adesse 0x48) 4. MASTER_RECEIVER_BYTE 5. Byte0 auslesen und anzeigen (Anzeige 0x7F) 6. MASTER_RECEIVER_BYTE 7. Byte1 auslesen und anzeigen (Anzeige 0xFF) 8. MASTER_RECEIVER_BYTE 9. Byte2 auslesen und anzeigen (Anzeige 0xFF) 4. MASTER_RECEIVER__LAST_BYTE 5. Byte3 auslesen und anzeigen (Anzeige 0xFF) Der TWI-BUS scheint felerfrei zu funktionieren, doch es kommen keine ADC-Daten, was mache ich falsch ? Danke Bernhard
Wie immer: Es ist ein Fehler in Zeile 42! Hast du den Mux konfiguriert? Hast du die PGA-Stufe konfiguriert? Hast Single Shot oder Continous Mode ausgewählt? Kriegst du ein ACK auf dem Bus? Klappt das Auslesen der Status-Register? Hast du mit einem Oszilloskop auf den Bus geschaut oder vermutest du nur?
Bernhard S. schrieb: > Der TWI-BUS scheint felerfrei zu funktionieren, Scheint. Kannst Du mit irgendwelchen anderen I2C-Bausteinen kommunizieren? Oder hast Du Dir das ganze mit einem Oszilloskop angesehen? Ist Deine Hardware korrekt aufgebaut? (I2C braucht Pullups an beiden Leitungen, manch einer vergisst die). Und was hat das mit Assembler zu tun?
Harald K. schrieb: > Ist Deine Hardware korrekt aufgebaut? (I2C braucht Pullups an beiden > Leitungen, manch einer vergisst die). Der Slaves wird korrekt erkannt und antwortet auch, hab die internen Pullups verwendet, bei einer niedrigen Taktrate). Scheint kein Harwarefehler zu sein........
Bernhard S. schrieb: > Scheint kein Harwarefehler zu sein........ Was hast du angeschlossen und wie hast du es angeschlossen? Vielleicht ist das Ergebnis ja sogar korrekt...
Für ca. 10 Euro bekommt man einen Logic Analyzer. Es muss kein Oszi sein für den I²C Basis Kram. Tu dir heute schon den Gefallen für morgen und bestell einen. Unendlich nützlich auch für SPI, CAN, OneWire, adressierbare LED, UART etc. Dann SIEHST du was passiert und musst es nicht mehr erahnen. Fällt unter Werkzeug. Einen Nagel schlägst du ja auch nicht mit der Hand ein. https://www.amazon.de/Heevhas-Analyzer-Device-Mini-USB-Kabel-Testhaken/dp/B0D8Q886W9
Bernhard S. schrieb: >> Ist Deine Hardware korrekt aufgebaut? (I2C braucht Pullups an beiden >> Leitungen, manch einer vergisst die). > > Der Slaves wird korrekt erkannt und antwortet auch, hab die internen > Pullups verwendet, bei einer niedrigen Taktrate). Falsch! Die internen Pull Ups liegen meist im ZWEISTELLIGEN kOhm Bereich! Mach da 2x 4k7 dran und teste nochmal!
:
Bearbeitet durch User
Nun sind 1k Widerstände an SCL und SDA, das Anzeigeergebnis blieb vorerst gleich, konnte aber mit einer wesentlich höheren Taktrate arbeiten und plötzlich änderten sich die ausgelesenen Bytes. Kann es sein, das mit einer relatv hohen Taktrate gearbeitet werde muss ? Eine zu niedrige Taktrate ---> Fehler ???
Bernhard S. schrieb: > Kann es sein, das mit einer relatv hohen Taktrate gearbeitet werde muss > ? Was hast DU bezüglich dieses Themas im Original-Datenblatt des Bausteins gelesen? Ich habe übrigens erst vor wenigen Tagen diesen Baustein verwendet und habe selbstverständlich auch das Datenblatt gelesen. Somit könnte ich diese Frage auch unmittelbar beantworten, aber damit würde ich ja nur belohnen, dass Leute wie Du zu faul sind, mal die Primärliteratur zu Rate zu ziehen. Welche Kommandos hast Du ganz konkret für die Initialisierung des ADS1115 geschickt? Und woher hast Du diese konkreten Informationen?
> Was hast DU bezüglich dieses Themas im Original-Datenblatt des > Bausteins gelesen? lt. Datenblatt SCL 0,01...3,4 MHz > Welche Kommandos hast Du ganz konkret für die Initialisierung des > ADS1115 geschickt? Ich sende keinerlei Initialisierung, vielleicht ist das der Fehler ?
Bernhard S. schrieb: > Ich sende keinerlei Initialisierung, vielleicht ist das der Fehler ? Nö, Initialisieren ist nur unnützes Zeugs für Warmduscher.
Bernhard S. schrieb: > Ich sende keinerlei Initialisierung, vielleicht ist das der Fehler ? Wie gesagt: Sebastian R. schrieb: > Hast du den Mux konfiguriert? > Hast du die PGA-Stufe konfiguriert? > Hast Single Shot oder Continous Mode ausgewählt? Der ADC macht von allein einfach so keine Messungen, du musst vorher einiges einstellen. Was hat dich zur Annahme verleitet, eine Initialisierung sei nicht notwendig?!
:
Bearbeitet durch User
Sebastian R. schrieb: > Der ADC macht von allein einfach so keine Messungen, du musst vorher > einiges einstellen Danke Sebastian für die Tipps, werde eine Initialisierung vornehmen. Die Config Register kann ich erfolgreich lesen und schreiben :-)
Paul B. schrieb: > Es muss kein Oszi sein > für den I²C Basis Kram. Naja, um zu sehen, wie die Signalflanken aussehen, ist ein Oszilloskop schon ganz gut - und das ist ein Thema, wenn die Pullups nicht passen. Ein LA kann so etwas nicht anzeigen (jedenfalls nicht ein Simpel-LA wie die Nachbauten der ersten Saleae-Geräte). Und ein LA hat recht sicher andere Schaltschwellen, ab der er Signale definiert als Low oder High erkennt als die I2C-Eingangsstufe des ungenannten µC des Threadstarters.
Paul B. schrieb: > Für ca. 10 Euro bekommt man einen Logic Analyzer. Es muss kein Oszi sein > für den I²C Basis Kram. Ganz im Gegenteil kann man sich heutzutage eher den LA sparen als ein Oszilloskop, denn ein einfacher LA lässt kaum Rückschlüsse auf die Signalintegrität (Flankensteilheit, saubere Signalpegel) zu. Insbesondere sieht man auch nicht, wann ein Bus freigegeben wird und ggf. der Signalpegel wegdriftet bzw. einen nichtbinären Ruhepegel einnimmt (z.B. EIA-485). Halbwegs aktuellen Oszilloskope können zudem auch einfache Protokolle wie z.B. I2C, SPI, usw. (auch) auf den Analogkanälen dekodieren.
Andreas S. schrieb: > Ganz im Gegenteil kann man sich heutzutage eher den LA sparen als ein > Oszilloskop Besser ein LA für 10€ auf dem Tisch, als ein Oszi im Online Shop.
Harald K. schrieb: > Naja, um zu sehen, wie die Signalflanken aussehen, ist ein Oszilloskop > schon ganz gut - und das ist ein Thema, wenn die Pullups nicht passen. Ja, wenn man die Signalqualität untersuchen will braucht man das Oszi. Der TE schrieb ja das er Antworten bekommt, daher sah ich das Problem eher in der Software und dabei hilft der LA (oder auch ein Oszi mit Decoder) ungemein. Aber das Oszi bestellt sich eben nicht ganz so leicht wie ein 10€ LA ;). Andreas S. schrieb: > Ganz im Gegenteil kann man sich heutzutage eher den LA sparen als ein > Oszilloskop Wenn du mal größere Datenströme verarbeitest ist das am Oszi einfach nur nervig. Wir haben auf Arbeit ein 20K€ R&S, ein super Gerät, aber dekorieren von Bussystemen erfolgt bei uns ausschließlich über PC + LA. Keiner hat Bock 100 Umdrehungen am Encoder Rad zu drehen oder sich mit dem Touchscreen und den Zoomtasten bis zu der interessanten Stelle zu quälen. Es hat beides seine Berechtigung für den jeweilgen Zweck. Ich hab auch jahrelang per Oszi decodiert, würde ich heute nicht mehr machen und ich ärgere mich die 10€ nicht schon vor 5 Jahren investiert zu haben. Ich war bis dahin auch von der technischen Überlegenheit des Oszis überzeugt und hab den billigen LA "belächelt". Heute kommt das Oszi fast nur noch zum Einsatz wenn das Signal völlig unbekannt ist oder eben wie hier die Signalqualität ermittelt/geprüft werden muss. Aber es ist ja zum Glück jeden frei in der Wahl seiner Arbeitsmittel ;).
Paul B. schrieb: > Es hat beides seine Berechtigung für den jeweilgen Zweck. Ich hab auch > jahrelang per Oszi decodiert, würde ich heute nicht mehr machen und ich > ärgere mich die 10€ nicht schon vor 5 Jahren investiert zu haben. Ich > war bis dahin auch von der technischen Überlegenheit des Oszis überzeugt > und hab den billigen LA "belächelt". Heute kommt das Oszi fast nur noch > zum Einsatz wenn das Signal völlig unbekannt ist oder eben wie hier die > Signalqualität ermittelt/geprüft werden muss. Mir geht es ähnlich, aber quasi von Amazon dazu "gezwungen". :-) Vor einigen Jahren gab es hier einige Diskussionen zu den pico USB Oszis und immer wieder auch das Hantek 6022be als Alternative. Da habe ich mehrfach die Angebote/Daten bei Amazon nachgesehen und plötzlich wurde mir ein 6022bl (also mit 16-Kanal LA) für lächerliche 33,-€ offeriert. Direkt nach meinem Kauf schnellte der Preis auf 93,-€ hoch und ich nahm an, dass man sich auf Irrtum berufen würde. Aber nix da, 3 Tage später kam das Paket. In der SW kann ich jederzeit zwischen LA- und Oszibetrieb umschalten und alle Teile passen mit in die Laptoptasche. Wenn die 20 Mhz und relativ primitive SW reichen, ein liebenswerter Begleiter.
Problem: Die beiden Config Register kann ich auslesen. Nach dem Einschalten werden die korrekten Default-Werte des Config Registers 8583h angezeigt. Anschließend setze ich das MODE-Bit auf 1, lese das Conversion Register (2Bytes) aus, erhalte aber nur als Egebnis 0000h, als würde der ADC nicht arbeiten. Was mache ich falsch ?
Wenn du das nicht aus dem Datenblatt auf die Reihe bekommst, dann schaue dir doch mal den Treiber mit Beispielen von Adafruit für Arduino an. Ist zwar in Englisch und in C, aber das wirst schon noch nach Assembler und Deutsch übersetzen können. https://github.com/adafruit/Adafruit_ADS1X15
ADS1115 initialisieren : TWI-Transmitter-Start (Adresse 0x48) write 01h (Config Register) Mode-Bit =1 (Bit setzen, alle anderen Bits wie Default) Config Register write (MSB) Config Register write (LSB) ADS115 ADC auslesen : TWI-Transmitter-Start (Adresse 0x48) write 00h (Conversion Register) TWI-Reciver-Start (Adresse 0x48) Read Byte0 (ADC-Ergebnis) Read Byte1 (ADC-Ergebnis) Ergebnis: 0000h Mit diesem Verfahren versuche ich die ADC-Werte auszulesen, erfolglos , was mache ich falsch ?
:
Bearbeitet durch User
Bernhard S. schrieb: > was mache ich falsch ? Du startest die Wandlung nicht. Starte die Wandlung, dann lies zurück.
Paul B. schrieb: > Du startest die Wandlung nicht. Starte die Wandlung, dann lies zurück. Wie starte ich die Wandlung ?
Bernhard S. schrieb: > Paul B. schrieb: >> Du startest die Wandlung nicht. Starte die Wandlung, dann lies zurück. > > Wie starte ich die Wandlung ? In dem du das Mode Bit auf 1 setzt. Sollte das, wie in deinem Fall, nicht klappen, dann nimmt man sich den oben erwähnten 10€ LA und schaut nach was man wirklich sendet statt ohne den Quellcode zu zeigen zu fragen was man falsch macht... Deine Hardware scheint zu stehen, lad den Quellcode hoch und hoffe das es hier noch paar Assembler Freaks gibt oder frag ChatGPT was mit deinem Quellcode nicht stimmt. Woher sollen wir denn wissen was du sendest, wenn du uns nur sagst was du denkst was du sendest und es nicht zeigst?
Was soll der ADS1115 machen, welcher Kanal, welche Auflösung? Das muss ihm mitgeteilt werden. siehe https://cicciocb.com/annexhelp/V1.423/ unter ADS1115 Die von Christoph vorgeschlagene sehr gute Anleitung https://wolles-elektronikkiste.de/ads1115 ist ja scheinbar nichts für dich Der ADS1115 ist auch in der Forumsbibliothek nicht unbekannt
:
Bearbeitet durch User
Bernhard S. schrieb: > Wie starte ich die Wandlung ? Durch ansprechen. In der einfachsten Form start send $9e (Schreibadresse) start send $9f (Leseadresse) read byte (evt zweites lesen, falls benötigt) stop Damit arbeitet er mit den Default Werten. Nun wird die Konversationszeit nicht gewartet so das er den letzten Wert ausgibt. Heißt das erste byte (Word) ist ungültig, da er beim ersten Ansprechen erst beginnt zu konvertieren. Wird ein einzelner Wert benötigt muss vor dem zweiten Start die Konversationszeit (37?ms) gewartet werden.
Bernhard S. schrieb: > was mache ich falsch ? Wie hast du denn das PGA und den MUX eingestellt? Achim H. schrieb: > Wird ein einzelner Wert benötigt muss vor dem zweiten Start die > Konversationszeit (37?ms) gewartet werden. Man kann auch das "Wandlung ist fertig"-Statusbit nutzen und nicht hoffen, dass 37ms stimmen.
:
Bearbeitet durch User
Achim H. schrieb: > Durch ansprechen. > In der einfachsten Form > start > send $9e (Schreibadresse) > start > send $9f (Leseadresse) Der ADS1115 kann lt. Table 7-2. im Datenblatt je nach Beschaltung auf einer der I2C Target Adressen 0x48 ... 0x4B liegen. Dein $9e bzw $9f ist sicher etwas anderes, als die I2C-Adresse. Die besitzt lt. I2C-Spezifikation 7 Bit (3.1.10 The target address and R/W bit "This address is seven bits long ..."). https://www.nxp.com/docs/en/user-guide/UM10204.pdf
Rainer W. schrieb: > Achim H. schrieb: >> Durch ansprechen. >> In der einfachsten Form >> start >> send $9e (Schreibadresse) >> start >> send $9f (Leseadresse) > > Der ADS1115 kann lt. Table 7-2. im Datenblatt je nach Beschaltung auf > einer der I2C Target Adressen 0x48 ... 0x4B liegen. Richtig. > Dein $9e bzw $9f ist sicher etwas anderes, als die I2C-Adresse. Auch richtig. > Die > besitzt lt. I2C-Spezifikation 7 Bit (3.1.10 The target address and R/W > bit "This address is seven bits long ..."). Naja, das ist dann reine Prinzipienreiterei. Aus vielen Gründen ist es sinnvoll, im Code die eigentliche I2C-Adresse und das R/W-Bit zusammenzufassen. Bleibt dann eigentlich nur die Streitfrage, wie man diese zusammengefasste Sache nennt. Sie ebenfalls als "I2C-Adresse" aufzufassen ist recht üblich, wenn auch im Sinne der Specs formal falsch. Der springende Punkt ist hier aber eigentlich: auch die "zusamengefassten I2C-Adressen" 0x9e/0x9f können unmöglich gültige I2C-Adressen für einen ADS1115 enthalten. Weil 0x9e/0x9f durch zwei einfach mal 0x4f ergibt, was eindeutig außerhalb des für den ADS1115 möglichen Bereichs von 0x48..0x4b liegt.
Interessant, da frag ich mich was die mir als 'ADS1115' verkauft haben? Ein Echter geht nach Datenblatt wirklich nur bis $96/7. Dem sollte auch mitgeteilt werden ob er kontinuierlich oder Einzeln misst. Per Default ist er auf 'Single-shot' und würde mit meiner Methode wohl nichts (keine Messwerte) ausgeben?
Achim H. schrieb: > Interessant, da frag ich mich was die mir als 'ADS1115' verkauft haben? Zeig ein Bild. Hinz wird dir zumindest explizit sagen können, dass es ein Fake ist. Möglicherweise sogar, welcher ADC da zum ADS1115 umgelabelt wurde. Ich kann das nicht, jedenfalls nicht ohne aufwendige Recherche. Zumal durchaus ein mehrdeutiger Ausgang der Recherche möglich wäre. Trotz der bekannten I2C-Adresse des Fakes...
Ob S. schrieb: > Bleibt dann eigentlich nur die Streitfrage, wie man > diese zusammengefasste Sache nennt. Im Zweifelsfall ist es das erste übertragene Byte oder das Adressierungsbyte. Es ist jedenfalls keine Lösung, einen Begriff, der in der I2C-Spezifikation genau festgelegt ist, im gleichen Kontext noch für etwas anderes zu verwenden. Bei dir hast du doch auch nicht zwei verschiedene Hausnummer an der Tür stehen, eine fürs Reingehen und eine andere fürs Rausgehen ;-)
Rainer W. schrieb: > Bei dir hast du doch auch nicht zwei verschiedene Hausnummer an der Tür > stehen, eine fürs Reingehen und eine andere fürs Rausgehen ;-) Doch, bei mir könnte ich zur Nummer 5 hereingehen und zur Nummer 7 heraus.
Rainer W. schrieb: > Im Zweifelsfall ist es das erste übertragene Byte oder das > Adressierungsbyte. Aha. "I2C-Adressierungsbyte" ist ja so viel besser als "I2C-Adresse"... Aber OK. Für Formalismus-Fetischisten ist sowas natürlich überaus wichtig, weit wichtiger als die Sache selber. Es sei dir also gegönnt, diesen Begriff zu verwenden. Alle anderen verstehen natürlich, dass eine offensichtlich (schon durch den Kontext der Unterscheidung für Lese- und Schreibzugriffe) "I2C-Adresse" natürlich in deiner Nomenklatur "I2C-Adressierungsbyte" genannt werden will.
Es funktioniert ! Wolfgang, Verfasser folgender Internetseite: https://wolles-elektronikkiste.de/ads1115 gab mir wertvolle Hinweise. Welcher Fehler lag vor ? AIN0 und AIN1 muss beschaltet sein, es wird eine Differenzmessung beider Pins durchgeführt, ich hatte alle Eingänge AIN0...AIn3 auf eine Potential gelegt, somit entstand keine Differenz und der ADC meldete 0000h. Bei Gelegenheit werde ich dieses kleine Projekt für einen ATmega8 und Assembler ASM für Euch veröffentlichen. Danke nochmals ^^
Bernhard S. schrieb: > Welcher Fehler lag vor ? > > AIN0 und AIN1 muss beschaltet sein, > es wird eine Differenzmessung beider Pins durchgeführt, Und das stand nicht im DB des ADS1115? Kaum vorstellbar...
Bernhard S. schrieb: > es wird eine Differenzmessung beider Pins durchgeführt, > ich hatte alle Eingänge AIN0...AIn3 auf eine Potential gelegt, Gut, dass wir meine Nachfrage nach drei Tagen dann mal klären konnten... Sebastian R. schrieb: > Was hast du angeschlossen und wie hast du es angeschlossen? Vielleicht > ist das Ergebnis ja sogar korrekt...
Bernhard S. schrieb: > AIN0 und AIN1 muss beschaltet sein, > es wird eine Differenzmessung beider Pins durchgeführt, > ich hatte alle Eingänge AIN0...AIn3 auf eine Potential gelegt, > somit entstand keine Differenz und der ADC meldete 0000h. Ja und, du hast sie doch beschaltet, indem du sie verbunden hast. Und wenn du eine Differenzmessung parametrierst, muss auch die Eingangsspannung unterschiedlich sein, wenn du was sehen willst. Das gleiche Ergebnis würdest du auch bei einer Singe-Input-Messung bekommen, wenn du keine Spannung anlegst. Und ob wegen sieben Zeilen in C ein Projekt nötig ist, ist auch fraglich. Ok, du programmierst ja in Assembler, da sind es ein paar Zeilen mehr. Man kann sich seine Lebenszeit auch unnütz verkleinern.
Hab das kleine Assembler-Projekt mal veröffentlicht: Beitrag "ADS1115 Initialisierung ADC auslesen ATmega8 Assembler ASM"
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.