Forum: Mikrocontroller und Digitale Elektronik Sensor I²C Problem


von Johannes H. (flughafen)


Angehängte Dateien:

Lesenswert?

Hallo,

hab hier grad etwas Probleme nen Luftmengensensor zum laufen zu 
bekommen. Geht um einen Honeywell Zephyr 
http://sensing.honeywell.com/honeywell%20zephyr%E2%84%A2%20digital%20airflow%20sensors%20haf%20series%20%28high%20accuracy%29

Der Sensor liefert nach senden der Adresse 2 Bytes und soll 
vorrübergehend einfach auf einem LCD ausgegeben werden, verwende nen 
Arduino mit LCD Shield als Platform, jedoch mit Standard AVR 
Entwicklungsumgebung. Programmaufbau beschränkt sich auf I2C Adresse 
Schicken, 2 Bytes lesen, Wert an LCD Senden.

IMG_0690 zeigt den Testaufbau, Pinzuordnung/Sensorkennschlüssel wurde 
mehrmals überprüft, SDA Pullup 1k. Bekomme auch schon Daten zurück, 
dabei gibts jetzt mehrere Probleme:

Bild Scope 0 zeigt den Datenverkehr (SDA/SCL) mit AVR Hardware TWI 
Schnittstelle. Statt Adresse 0x49 reagiert der Sensor auf Adresse 0x93 
(0x49 um ein Bit nach links geschoben) aber sendet immerhin Daten 
zurück. Die Pegel sehen dabei allerdings schon abenteuerlich aus.

Bild Scope 1 zeigt die Bit-Banging Variante (bitbang.txt) mit Adresse 
0x49, Scope 2 mit 0x93, bei der der Sensor reagiert, ich schätze indem 
er SDA zum ACK auf LOW ziehen will und dadurch ganz komische Sachen 
verursacht.

Hab jetzt schon verschiedene Timings, Pausen, Taktraten, Pullups etc. 
versucht, aber mir kommts so vor als gäbs irgendwo nen größeren Fehler 
den ich nicht finde. Ohne niederohmigen Pullup (1k) zieht der Sensor im 
übrigen schon beim anschließen die Datenleitung auf max. 2,5V... hoffe 
wirklich jemand sieht da einfach einen simplen Fehler den ich übersehen 
habe.

Gruß Johannes

von EinGast (Gast)


Lesenswert?

Mit der Hardware-TWI ist das zwar alles schön und gut, aber ich würde 
trotzdem mal auf 4,7k-Widerstände gehen und PFleurys 
SW-I2C-Implementation nehmen. 2,5V-Pegel sind zwar nicht toll, aber 
immer noch in Ordnung.

von Karl H. (kbuchegg)


Lesenswert?

> Statt Adresse 0x49 reagiert der Sensor auf Adresse 0x93 (0x49 um ein Bit nach 
links geschoben)

Ist normal. Im I2C wird mit Bit 0 mitgeteilt ob du schreiben oder lesen 
willst.

D.h. man muss bei den Datenblättern immer aufpassen, ob die Adressangabe 
schon diese Verschiebung um 1 Bit beeinhaltet oder nicht.

von schwarzGast (Gast)


Lesenswert?

Johannes H. schrieb:
> Statt Adresse 0x49 reagiert der Sensor auf Adresse 0x93
> (0x49 um ein Bit nach links geschoben)

Die Adresse wird oft um eins verschoben angegeben, da das letzte Bit 
lediglich read/~write anzeigt.

Bei SCA kommt normalerweise auch ein Pullup rein, wobei die Pegel laut 
Oszi gut aussehen.

von Pete K. (pete77)


Lesenswert?

Hast Du Dir die Startup-Sequence im Datenblatt auf Seite 2 angeschaut?

Geschwindigkeit mal auf max 100kHz setzen und Pullups einfügen.

Und 1ms zwischen den Reads warten.

Was ist denn jetzt genau das Problem? Evtl. auch LCD-Probleme?

von Johannes H. (flughafen)


Angehängte Dateien:

Lesenswert?

Karl Heinz Buchegger schrieb:
>> Statt Adresse 0x49 reagiert der Sensor auf Adresse 0x93 (0x49 um ein Bit nach
> links geschoben)
>
> Ist normal. Im I2C wird mit Bit 0 mitgeteilt ob du schreiben oder lesen
> willst.
>
> D.h. man muss bei den Datenblättern immer aufpassen, ob die Adressangabe
> schon diese Verschiebung um 1 Bit beeinhaltet oder nicht.

Ok, stimmt ;) Hatte bisjetzt nur ICs, bei denen die Adresse mit 0 am 
Ende angegeben war.

Hab's nochmal mit 4,7k Widerständen versucht, damit startet das Ding 
allerdings garnicht. Mit 1k gehts, richtig gelesen wird wohl grad 
trotzdem nicht. Frequenz ist aktuell 40kHz, Messung alle 200ms.

Die Fluery Libs benutz ich schon, hab mal das Haupt-Programm in den 
Anhang gepackt (sensor.txt). Scope 4 Zeigt die aktuelle Rückgabe, frage 
mich grad ob die 0x92 vom Sensor kommen oder irgeindwie noch 
TWDR-Leichen von senden sind... werd nochmal rumtesten.

Finde die Pegel immernoch etwas komisch... wie auf dem Scope Bild zu 
sehen, ist die SDA Leitung selbst mit 1k schon auf 3,8V unten.

von Nachbar (Gast)


Lesenswert?

Sag mal du hast da so ein schönes Scope, hast du die "Serial Bus" Option 
mit gekauft? Wenn ja, mach sie mal an. Sparen wir uns das olle Bit 
zählen. (Rechts gibts nen knopf mit "Serial")
Irgendwie sind auch die steigenden Flanken zu Steil, der Clock hat das 
typische Open-Drain und die Data sieht zu sauber aus, sicher das da 
alles richtig läuft?

von Johannes H. (flughafen)


Angehängte Dateien:

Lesenswert?

Nen schönes Scope wär schön ;D ist nen 2000er Agilent, bei dem die 
Serieldekodier-Funktion nicht dazugekauft werden kann (und ja den Knopf 
dafür gibts trotzdem...)

Hab spaßeshalber mal nen sriellen Widerstand (200 Ohm) zwischen Sensor 
und µC gehauen, um zu sehen, wer denn von beiden was LOW zieht. Wie auf 
dem Bild zu sehen zieht der Sensor definitiv das ACK Low, bei den beiden 
i2c_readAck() funktionen gibt jedoch der Master den Pegel vor und sendet 
munter das TWDR... nen Test mit TWDR Änderung vor den Lese-Funktionen 
hat das auch bestätigt, leider grad kein Bild gemacht.

Hoffe es ist ok, wenn ich hier häppchenweise den Fortschritt ins Fourm 
spamme.

Hat die Pin I/O Initialisierung eigentlich irgend eine Auswirkung, oder 
wird die überschrieben, sobald man das TWI Modul aktiviert? Kurze Tests 
mit unterschiedlichen DDR/PORT definitionen kamen immer zum gleichen 
Ergebnis.

von Spess53 (Gast)


Lesenswert?

Hi

>Hat die Pin I/O Initialisierung eigentlich irgend eine Auswirkung,

Nein.

>oder wird die überschrieben, sobald man das TWI Modul aktiviert?

Ja.

MfG Spess

von Peter R. (pnu)


Lesenswert?

Stimmt überhaupt die Zahl der SCL Impulse?

Im mittleren Bild sieht man schön, wie vom slave beim 9.Impuls das 
ACK-Signal abgegeben wird. Offensichtlich schafft er es bei 1k pullup 
aber nicht, die Leitung auf L zu ziehen.

Der zehnte Impuls hat hier doch nichts zu suchen.

Vom Zeitablauf auf dem Scope-Bild nicht genau zu sehen: laufen die 
Änderungen auf SDA "gleichzeitig" mit der Flanke von SCL?

Das darf nicht sein, Änderungen von SDA sind nur im L-Zustand von SCL 
erlaubt. Bei "gleichzeitig" könnte das, je nach Laufzeit schief gehen. 
Im Zweifelsfalle noch ein paar NOPs dazwischen legen.

Hier könnte SDA im L-Zustand wechseln. Das würde als Start oder 
Stop-Signal gelesen.

von Johannes H. (flughafen)


Lesenswert?

Erstmal Sorry für meine Blödheit, waren ehrlichgesagt doch 
Anfängerfehler die das Problem verursacht haben. 0x92 ist natürlich die 
Write Adresse, was den Versuch etwas zu Lesen sinnlos macht. Mit 0x93 
wird gelesen. Noch das zweite i2c_readAck in ein i2c_readNak geändert 
und es funktioniert (seihe Bild, noch mit seriellem Widerstand).

Der verhältnismäßig niederohmige Pullup verwundert mich aber immernoch, 
der wird trotzdem gebraucht.

Auf die Lösung kam ich im übrigen als ich mir nach dem i2c_start das 
TWSR in einer Variable gespeichert und später auf dem LCD ausgegeben 
habe. Darin war mit 0x18 = "Start zum Schreiben" alles gesagt.

Aber gut, vielen Dank nochmal für die schnelle Hilfe!

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.