Forum: Mikrocontroller und Digitale Elektronik MSP430G2553 / DHT12 Sensoranbindung / Initialsierung anfangs fehlerhaft


von Andreas V. (Firma: IGL) (andreas_va)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich möchte Temperaturwerte von einem Feuchtigkeitssensor über einen 
MSP430 auslesen.

Der DHT12 Sensor lässt sich über einen MCP2221-Adaper einwandfrei 
auslesen:
> I2C Write, Address = 5C, Data: 00 Delay = 0
OK
> I2C Read, Address = 5C, Read 5 bytes, Delay = 0
OK
< 29 09 1B 07 54

Erklärung:
29h 09h = 41,9%
1Bh 07h = 27,7°C
54 CRC

Ich habe einen DHT12 Sensor an die Pins 1.6, 1.7, Vcc und Gnd an den 
Launchpad MSP-EXP430G2 angeschlossen. Die Spannung beträgt 3.5V. I2C 
Frequenz ca. 85 bis 100 KHz. Compiler ist IAR 6.4.

Lese ich nun den DHT12 Sensor über den Launchpad aus, dann bekomme ich 
zunächst keine Antwort. Siehe Bild FehlerNACK.jpg.

Debugge ich den Code (siehe main.c) mehrfach langsam durch dann funzt 
alles; und zwar ab dann immer! (siehe Bild Ohne Fehler.jpg, main.c) 
Initialisierung fehlerhaft?

Welchen Denkfehler begehe ich?
Dank in voraus!

von A. B. (Gast)


Lesenswert?

Vor/während Initialisierung des I2C-Interfaces irgendwelche 
undefinierten Zustände. Abhilfe:

https://www.st.com/resource/en/application_note/cd00004295.pdf

von Andreas V. (Gast)


Lesenswert?

Soll das heissen ich soll das Interface des MSP430 mehrfach 
initialisieren? Oder soll ich auf das NACK reagieren? Aber wie soll denn 
das funzen?

von A. B. (Gast)


Lesenswert?

Andreas V. schrieb:
> Soll das heissen ich soll das Interface des MSP430 mehrfach
> initialisieren? Oder soll ich auf das NACK reagieren? Aber wie soll denn
> das funzen?

Nein, dass heißt nur, dass es sich empfiehlt, bei einem Fehler oder 
(einfach auf Verdacht) bei der Initialisierung (egal woher/warum), diese 
Sequenz (manuell ...) durchzuführen. Beim Controller legt man doch auch 
ein Reset an. Da die I2C-Chips i. d. R. keinen Reset-Pin haben, muss man 
es halt irgendwie anders machen.

von Joe F. (easylife)


Lesenswert?

Was für Pullup Widerstände sind an SCL und SDA bestückt?

von Andreas V. (Gast)


Lesenswert?

Joe F. schrieb:
> Was für Pullup Widerstände sind an SCL und SDA bestückt?

Anfangs hatte ich 1k Widerstände drinnen.
Momentan sind 10k Widerstände beschaltet.

von Joe F. (easylife)


Lesenswert?

Warum auf 10K geändert?
2.2K ist Standard. Bei 100Khz und 3.5V dürften auch noch 4.7K gehen, 
aber 10K würde ich nicht machen.

von Andreas V. (Gast)


Lesenswert?

Joe F. schrieb:
> Warum auf 10K geändert?

Mit 1k funzte die Initialisierung nicht. Da änderte ich die Pullups auf 
10k, weil ich davon ausging dass 1k vieleicht etwas zu klein sein 
könnten und die Belastung zu gross wird. Ich wollte nur auf Nummer 
sicher gehen.

Ergebnis: keine Änderung!

Zwischen  1k und 100k sollte bei der Geschwindigkeit von 100kbit doch 
alles funktionieren...

Ein Veruch mit 2.2k (Standard? Bei Low Power?) ist es in jedem Fall 
wert.

von Joe F. (easylife)


Lesenswert?

Andreas V. schrieb:
> 100k

auf keinen Fall.
Um sicher zu gehen: Signale mit dem Oszilloskop angucken.
Wenn die zu "rund" werden, ists nicht gut. Der Logic-Analyzer ist 
hierfür kein geeignetes Maß. Er kann eine niedrigere Threshold haben als 
I2C master oder slave.

: Bearbeitet durch User
von Joe F. (easylife)


Lesenswert?

Auch ist das Timing deines I2C Masters schlecht.
SDA und SCL sollten sich nicht gleichzeitig ändern.
Hier besteht die Gefahr, dass ungewollte start/stopp Konditionen 
"erkannt" werden. Bei der Interpretation solcher grenzwertigen Zustände 
können sich I2C-Slave und Analyzer durchaus unterscheiden.
Sniffe mal mit, wie die es mit dem MCP2221 aussieht, evtl. ist da 
einfach das Timing besser (SCL=low, SDA wird geändert, SCL geht high, 
SCL geht wieder low, und erst dann wird SDA wieder geändert).

http://i2c.info/i2c-bus-specification

: Bearbeitet durch User
von Andreas V. (Firma: IGL) (andreas_va)


Angehängte Dateien:

Lesenswert?

Joe F. schrieb:
> Um sicher zu gehen: Signale mit dem Oszilloskop angucken.
> Wenn die zu "rund" werden, ists nicht gut. Der Logic-Analyzer ist
> hierfür kein geeignetes Maß. Er kann eine niedrigere Threshold haben als
> I2C master oder slave.

Ich hab es mal mit dem Oszi nachgemessen!
Das Diagramm sieht doch ziemlich rund aus...

von Joe F. (easylife)


Lesenswert?

Sieht aber noch relativ gut aus.
Ich vermute eher, dass es die gleichzeitig fallenden Flanken von SDA und 
SCL sind.
Wenn der Slave SDA nur geringfügig früher fallen sieht, detektiert er 
eine repeated-start condition.

von Andreas V. (Firma: IGL) (andreas_va)


Angehängte Dateien:

Lesenswert?

Ich habe den Client resetted und dann funzt es mit der Ausgabe 
Oszi3.jpg.
Ob das jetzt immer so funktioniert....

von Andreas V. (Firma: IGL) (andreas_va)


Angehängte Dateien:

Lesenswert?

Was mir auffällt ist der Peak am Ende des Signals...

: Bearbeitet durch User
von Joe F. (easylife)


Lesenswert?

Andreas V. schrieb:
> Ich habe den Client resetted und dann funzt es mit der Ausgabe
> Oszi3.jpg.
> Ob das jetzt immer so funktioniert....

Nur bei Vollmond und Windstille.
Miss doch mal mit dem MCP2221, wie die Signal da aussehen.
Die gleichzeitig fallenden Flanken, du weisst schon...

Andreas V. schrieb:
> Was mir auffällt ist der Peak am Ende des Signals...

Das ist eine kurze tri-state Phase auf dem Bus (durch den Pullup in 
Richtung high gezogen), wenn der Master die Leitung für das ACK 
freigibt, und der Slave die 0 noch nicht angelegt hat.

: Bearbeitet durch User
von Andreas V. (Firma: IGL) (andreas_va)


Angehängte Dateien:

Lesenswert?

und da bleibt`s hängen!

von Joe F. (easylife)


Lesenswert?

Bis zu 3x wiederhole ich mich, aber nicht öfter:
gleichzeitig fallende Flanken.

von Andreas V. (Firma: IGL) (andreas_va)


Lesenswert?

Joe F. schrieb:
> gleichzeitig fallende Flanken.

Aber was mache ich dagegen?

Da wo der Peak auftritt wird das Signal manchmal high und dann bekomme 
ich einen NACK statt ACK.
Vergleich Oszi4.jpg und Oszi5.jpg.

Bei NACK bleibt der µC hängen.

von Andreas V. (Firma: IGL) (andreas_va)


Angehängte Dateien:

Lesenswert?

Joe F. schrieb:
> Nur bei Vollmond und Windstille.
> Miss doch mal mit dem MCP2221, wie die Signal da aussehen.
> Die gleichzeitig fallenden Flanken, du weisst schon...

Mit dem MCP2221 sieht das Bild jetzt erst mal fast identisch aus.
Nur ist das Signal an der Stelle des Peaks Low!

Ich vermute mal das ist ein Schwingquarz/Kreis Problem (Toleranzen)...

von Joe F. (easylife)


Lesenswert?

Andreas V. schrieb:
> Aber was mache ich dagegen?

SDA nur ändern, während CLK low ist.

Und messen, ob das der Grund ist (Vergleichsmessung mit MCP2221, da 
funktioniert es ja einwandfrei).

Andreas V. schrieb:
> Da wo der Peak auftritt wird das Signal manchmal high und dann bekomme
> ich einen NACK statt ACK.

Ja. Der Slave hat die Adresse nicht richtig mitbekommen und ACKt nicht.

> Vergleich Oszi4.jpg und Oszi5.jpg.
>
> Bei NACK bleibt der µC hängen.

Das kann man ja ändern (timeout, retry...)

: Bearbeitet durch User
von Jürgen W. (Firma: MED-EL GmbH) (wissenwasserj)


Lesenswert?

Hallo Andreas!

Erstens: Vergiß bitte das Geschwafel von Joe F bzgl. der fallenden 
Flanken - das ist gem. I2C-Spec. zulässig und das Thema somit erledigt.

Hinsichtlich Pullups: Wenn ich das Datenblatt auf die Schnelle richtig 
gelesen habe, hat der Sensor schon 4k7-Pullups drin. Da der MSP430 nicht 
mehr als 100kHz bei I2C kann (warum auch immer so wenig), sind auch 
schon 10kOhm ok - aber achte darauf, daß Dir dein Oszi-Kabel nicht 
unnötig hohe Kapazitäten einbringt; sofern Du mit 15pF-Tastkopf 
arbeitest, sollte das aber kein Problem sein).

Der Spike, den Du am Ende des Signal siehst, entsteht durch die 
Reaktionszeit des Sensors, d.h. er zieht für ACK den SDA-Pin auf Masse, 
sobald SCL=0 ist - das ergibt dann halt ein paar 100ns, in denen durch 
den Pull-up die SDA-Spannung etwas ansteigt.

Bzgl. schrittweisem Debuggen: Die IAR Workbench hat, sobald Du den 
Debugger startest, einen Menüpunkt "Emulator->Advanced->Clock Control". 
Beim schrittweisen Debuggen kann es also sein, daß die Clocks Stück für 
Stück abgearbeitet werden und Du somit ein Timing-Problem nicht erkennen 
kannst - schau Dir die Einstellungen dazu an.

Was sind übrigens die Variablen "IFG2" und "IE2"? Ich kann's mir zwar 
denken, aber gehört da nicht UCB0IFG und UCB0IE hin?
Beim Empfangen solltest Du außerdem das RXIFG-Flag löschen.
Nach dem Senden des Adreßbytes schickst du außerdem jedesmal eine 
Stop-Bedingung hinterher - das solltest Du aus der ISR-Routine 
herausnehmen und Stop bzw. Repeated Start im Hauptprogramm ausführen 
lassen.
Bzgl. Deiner ISR-Routine: Die scheint nur für TX-Flags zu sein, oder? 
Ich bin mir da nicht sicher, weil meine Anwendungen meist in Assembler 
geschrieben sind.
Du sollest außerdem das Lesen nicht byteweise organisieren, sondern 
einfach ein Array machen und einen rxByteCnt hinaufzählen lassen. Das 
Ende wird ja ohnehin durch das NACK vom Sensor angezeigt.


Ein paar stilistische Anmerkungen:
* Bitte die einleitenden geschweifte Klammer in eine separate Zeile 
geben - das sieht ordentlicher aus.
* Benutze für Variablen am besten lowerCamelCase - Du vermischt aktuell 
die typischen großgeschriebenen Konstanten mit großgeschriebenen 
Variablen.
Beispiel TXByteCtr => txByteCnt (ich bevorzuge Cnt statt Ctr für 
Counter).

von Joe F. (easylife)


Lesenswert?

Jürgen W. schrieb:
> Erstens: Vergiß bitte das Geschwafel von Joe F bzgl. der fallenden
> Flanken - das ist gem. I2C-Spec. zulässig und das Thema somit erledigt.

Sorry, aber deine Ausdrucksweise ist vollkommen unangemessen.
Zeige mir, wo die Spec. sagt, dass das zulässig ist.

Ich zeige dir das Gegenteil:
I2C Spec: https://www.nxp.com/docs/en/user-guide/UM10204.pdf
1
3.2.3:
2
Data validity
3
The data on the USDA line must be stable during the HIGH period of the clock. The HIGH or LOW state of the data line can only change when the clock signal on the USCL line is LOW (see Figure 23). One clock pulse is generated for each data bit transferred.

Wenn du dir Fig 24. anguckst, siehst du warum es eine schlechte Idee ist 
beide Flanken "gleichzeitig" fallen zu lassen.
Wenn aufgrund von parasitären Kapazitäten SCL auch nur einen Ticken 
langsamer fällt, entsteht hier unbeabsichtigt eine START condition.
Bie Fast-Mode slaves reichen hier bereits 0.6us um das Kriterium einer 
repeated START condition zu erfüllen (Table 10, tSU;STA).

Bei tHD;DAT steht für I2C-bus devices zwar 0, aber Anmerkung [3] sagt:
1
A device must internally provide a hold time of at least 300 ns for the SDA signal (with respect to the VIH(min) of the SCL signal) to bridge the undefined region of the falling edge of SCL.

D.h. die interne hold time reicht u.U. gerade mal für 300ns.
Wenn SCL also mehr als 300 ns ggü. SDA verzögert ist kommt man schon in 
einen kritischen Bereich.

Ich spreche diese Thema deswegen an, weil es eben nicht einfach nur auf 
meinem Mist gewachsen ist.
Ich hatte genau diese Probleme schon zig mal in der Praxis.

Das traurige ist, dass sehr viele I2C Libraries für uCs genau diesen 
Mist machen (gleichzeitig fallende Flanken), und massenhaft Leute dann 
rumweinen, weil es nicht funktioniert.
Meine Theorie ist, dass genau dadurch auch der schlechte Ruf von I2C 
herrührt. Mistige Master-Implementierungen.

: Bearbeitet durch User
von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Joe F. schrieb:
> Das traurige ist, dass sehr viele I2C Libraries für uCs genau diesen
> Mist machen

Der 'G2453 macht I2C in Hardware, mit der USCI_B0. Das wird auch von der 
vorliegenden Software genutzt.

Das aber wiederum würde bedeuten, daß die Hardwareimplementierung von TI 
hier fehlerhaft ist.

Hmm.

von Joe F. (easylife)


Lesenswert?

Rufus Τ. F. schrieb:
> Das aber wiederum würde bedeuten, daß die Hardwareimplementierung von TI
> hier fehlerhaft ist.

Es heisst zumindest, dass die Hardwareimplementierung von TI schlecht 
ist (tHD,DAT=0ns).
I2C slaves, die intern eine hold-time implementiert haben, werden bei 
optimalem PCB Layout funktionieren. Mit parasitären Kapazitäten auf SCL 
wird es da schnell kritisch. Und das möchte man eigentlich nicht haben.
SMBus slaves sind dadurch ebenfalls nicht ansprechbar.

Wenn ich mal 2 beliebige Datenblätter von Maxim rausfische:
https://datasheets.maximintegrated.com/en/ds/MAX31629.pdf
https://datasheets.maximintegrated.com/en/ds/MAX7367-MAX7369.pdf
Dort steht in der Tabelle bei tHD;DAT zwar jeweils 0us, in der Anmerkung 
4 jedoch:
"A master device must provide a hold time of at least 300ns for the SDA 
signal (referred to the VIL of the SCL) in order to bridge the undefined 
region of SCL’s falling edge."

Das verstehe ich so, dass der Master die 300ns einhalten muss.
Meine Erfahrungen aus der Praxis bestätigen dies.

Das Diagramm zum verwendeten Sensor DHT12 macht keine Angaben zu 
tHD;DAT,
allerdings legen die Diagramme nahe, dass die Flanken NICHT synchron 
fallen sollen.
http://www.robototehnika.ru/file/DHT12.pdf

: Bearbeitet durch User
von Andreas V. (Firma: IGL) (andreas_va)


Lesenswert?

Hallo Jürgen,
Dein Post hat es in sich! Dafür brauchte ich Zeit.

Jürgen W. schrieb:
> Erstens: Vergiß bitte das Geschwafel von Joe F bzgl. der fallenden
> Flanken - das ist gem. I2C-Spec. zulässig und das Thema somit erledigt.

Es ist heiss. Bleibt alle cool! Aber ob Spezikikations konform oder 
nicht: Ich kann für die fallenden Flanken nicht den Grund für das 
Problem finden.
Der MCP2221 verhält sich an dieser Stelle exakt genauso!

Jürgen W. schrieb:
> Hinsichtlich Pullups: Wenn ich das Datenblatt auf die Schnelle richtig
> gelesen habe, hat der Sensor schon 4k7-Pullups drin. Da der MSP430 nicht
> mehr als 100kHz bei I2C kann (warum auch immer so wenig), sind auch
> schon 10kOhm ok - aber achte darauf, daß Dir dein Oszi-Kabel nicht
> unnötig hohe Kapazitäten einbringt; sofern Du mit 15pF-Tastkopf
> arbeitest, sollte das aber kein Problem sein).

Das Einzige was ich dazu finden kann:
1.Typical application circuit recommended cable length is shorter than 
the 20 Meter use 5.1K Pull-up  resistor,  is  greater  than  20  Meters 
lower  the  pullup  resistor  value  according  to  actual situation.
2. Each numerical readout of temperature and humidity is the result of 
the last measurement, to get real-time data, need to read twice in a 
row, but not recommended > > to read several times in succession, each 
read sensor spacing is greater > than 2 Seconds to obtain accurate 
data...

und

DHT12 A simplified single bus communication. That only a single bus 
cable, system of data exchange,Control is done by a single bus 
communication. Devices (hosts) through a drain or a three State port is 
connected to the data cable to allow device does not send data will be 
released when the bus, while letting the other device uses the bus; 
usually require add-ins a single bus around 4.7KΩ Pull-up resistor, so 
that when the bus is idle by default high State.

Von intern verschalteten Pullups ist nichts zu lesen. Haben wir 
unterschiedliche Infoquellen? :-) Allerdings fand ich auf der Rückseite 
der Sensorplatine zwei Widerstände....

Jürgen W. schrieb:
> Da der MSP430 nicht
> mehr als 100kHz bei I2C kann (warum auch immer so wenig), sind auch
> schon 10kOhm ok
Der MSP430 kostete 1,99€ und kommt fast ohne externe Beschaltung aus. 
Man darf nicht zu viel erwarten!

Jürgen W. schrieb:
> aber achte darauf, daß Dir dein Oszi-Kabel nicht
> unnötig hohe Kapazitäten einbringt; sofern Du mit 15pF-Tastkopf
> arbeitest, sollte das aber kein Problem sein).

Ich kürzte alle Kabel und entfernte alle Messgeräte. Ich habe 
Schrödingers Haustier vergessen!!! Mein bester Tastkopf dürfte 
25pF(200MHz) haben.

Jürgen W. schrieb:
> Der Spike, den Du am Ende des Signal siehst, entsteht durch die
> Reaktionszeit des Sensors, d.h. er zieht für ACK den SDA-Pin auf Masse,
> sobald SCL=0 ist - das ergibt dann halt ein paar 100ns, in denen durch
> den Pull-up die SDA-Spannung etwas ansteigt.

Hängt das auch mit den Kapazitäten zusammen? Entschärfe ich das durch 
eine kleinere Taktfrequenz?

Jürgen W. schrieb:
> Bzgl. schrittweisem Debuggen: Die IAR Workbench hat, sobald Du den
> Debugger startest, einen Menüpunkt "Emulator->Advanced->Clock Control".
> Beim schrittweisen Debuggen kann es also sein, daß die Clocks Stück für
> Stück abgearbeitet werden und Du somit ein Timing-Problem nicht erkennen
> kannst - schau Dir die Einstellungen dazu an.

Da waren alle Optionen(ACL, SMCLK, TACLK) angekreuzt.

Jürgen W. schrieb:
> Was sind übrigens die Variablen "IFG2" und "IE2"? Ich kann's mir zwar
> denken, aber gehört da nicht UCB0IFG und UCB0IE hin?
 IE = Interrupt Enable
IFG = Interrupt Flag
So habe ich halt alle IE's eingeschaltet! Oder? Deine Lösung scheint 
eleganter zu sein. Da habe ich noch nachzuarben...

Jürgen W. schrieb:
> Bzgl. Deiner ISR-Routine: Die scheint nur für TX-Flags zu sein, oder?
> Ich bin mir da nicht sicher, weil meine Anwendungen meist in Assembler
> geschrieben sind.
> Du sollest außerdem das Lesen nicht byteweise organisieren, sondern
> einfach ein Array machen und einen rxByteCnt hinaufzählen lassen. Das
> Ende wird ja ohnehin durch das NACK vom Sensor angezeigt.

Eigentlich sollte das nicht nur für TX sein. Ich wollte es erst einmal 
simple halten. Da habe ich noch nachzuarben...

Jürgen W. schrieb:
> Ein paar stilistische Anmerkungen:
> * Bitte die einleitenden geschweifte Klammer in eine separate Zeile
> geben - das sieht ordentlicher aus.
> * Benutze für Variablen am besten lowerCamelCase - Du vermischt aktuell
> die typischen großgeschriebenen Konstanten mit großgeschriebenen
> Variablen.
> Beispiel TXByteCtr => txByteCnt (ich bevorzuge Cnt statt Ctr für
> Counter).

Es ist schön dass solche "Kleinigkeiten" heute noch bemerkt werden!!!!! 
Das ist alles nur zusammenkopiert und mir kraust es dabei auch! Mea 
Culpa!!! Das ändere ich noch.

: Bearbeitet durch User
von Andreas V. (Firma: IGL) (andreas_va)


Lesenswert?

Ich belebte die Katze wieder und ließ die Pullups weg. Zwei Sekunden 
warten!
Die Otionen (ACL, SMCLK, TACLK) deselektierte ich.
Seit dem funzt die Schaltung recht zuverlässig! Ein Watchdog ist dennoch 
angebracht denke ich...

von Step by Step (Gast)


Lesenswert?

Ich würde auch erst einmal eine stabilere Umgebung herstellen:
Kein Lowpower Mode
Definierten Takt konfigurieren
Delay entfernen
...

von Andreas V. (Firma: IGL) (andreas_va)


Lesenswert?

Step by Step schrieb:
> Ich würde auch erst einmal eine stabilere Umgebung herstellen:
> Definierten Takt konfigurieren
> Delay entfernen
> ...

Ja! Aber Low Power will ich schon haben...

: Bearbeitet durch User
von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Wieso eigentlich soll der 'G2553 nur 100 kHz I2C-Takt unterstützen?

Der kann natürlich auch mit 400 kHz betrieben werden - das zumindest 
steht im Datenblatt auf Seite 35 (Tabelle USCI, I2C Mode, Parameter 
fscl).

: Bearbeitet durch User
von Step by Step (Gast)


Lesenswert?

Du sollst auch low power haben. Aber erst, wenn I2C funktioniert.

Nimm den Kram ersteinmal raus.

von Andreas V. (Firma: IGL) (andreas_va)


Lesenswert?

Rufus Τ. F. schrieb:
> Der kann natürlich auch mit 400 kHz betrieben werden - das zumindest
> steht im Datenblatt auf Seite 35 (Tabelle USCI, I2C Mode, Parameter
> fscl).

Natürlich kann er das. Allerdings ist das Betrieb an den max. Ratings.

UCB0BR0 = 12;    // fSCL = SMCLK/12 = ~100kHz

Die folgende Zeile takted auf 400kHz:

UCB0BR0 = 3;     // fSCL = SMCLK/3 = ~400kHz

Ob das die Schaltung stabiler macht und ob die Sensoren das mitmachen 
sei darhingestellt.

Der DHT12 steigt bei mir bei mehr als 375000 bps aus (auch beim 
MCP2221).

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Andreas V. schrieb:
> Allerdings ist das Betrieb an den max. Ratings.

Magst Du mir das erklären? In Deinem Beispiel beträgt SMCLK gerade mal 
1.2 MHz, was hat das mit irgendwelchen "max. Ratings" zu tun?

Was verstehe ich hier nicht?

von Andreas V. (Firma: IGL) (andreas_va)


Lesenswert?

Step by Step schrieb:
> Du sollst auch low power haben. Aber erst, wenn I2C funktioniert.
>
> Nimm den Kram ersteinmal raus.

Warum?

Wie gesagt:
Seit dem Entfernen der externen Pull-ups, kürzen der Leitungen und 
Enternung aller Messgeräte funktioniert der Sensor sehr viel 
stabiler(fast zu 100%).

Manchmal bleibt das Program noch am Ende der Funktion Transmit 
hängen....

von Joe F. (easylife)


Lesenswert?

Andreas V. schrieb:
> Seit dem Entfernen der externen Pull-ups, kürzen der Leitungen und
> Enternung aller Messgeräte funktioniert der Sensor sehr viel
> stabiler(fast zu 100%)

Weist alles eindeutig auf ein Timing-Problem auf dem Bus hin.

von Andreas V. (Firma: IGL) (andreas_va)


Lesenswert?

Rufus Τ. F. schrieb:
> Magst Du mir das erklären? In Deinem Beispiel beträgt SMCLK gerade mal
> 1.2 MHz, was hat das mit irgendwelchen "max. Ratings" zu tun?
>
> Was verstehe ich hier nicht?

Seite 35 der MSP430G2553 Spezifikation:
f_SCL clock-frequency 3V  0 - 400 kHz

400kHz ist somit die absolut max. Clock-Frequenz SCL/I2C(eher 
theoretisch).

0Hz als min. Frequenz kann ich nicht bestätigen ;-), da ich erst ab 25 
Hz brauchbare Ergebnisse bekomme.

Ähnlich sehe ich das mit den 400kHz. 200 kHz kann ich mir durchaus 
vostellen. Wie das da mit dem Energieverbrauch aussieht kann ich 
momentan noch nicht abschätzen.

Optimiert ist das Bauteil somit für 100 kHz bis 200 kHz(So sehe ich das 
zumindest momentan).

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Andreas V. schrieb:
> Seite 35 der MSP430G2553 Spezifikation:

Das sind nicht die "absolute maximum ratings". Interpretier' das nicht 
falsch.

400 kHz sind hier eine zulässige Frequenz, man sollte nur keine höhere 
verwenden.

von Andreas V. (Firma: IGL) (andreas_va)


Lesenswert?

Rufus Τ. F. schrieb:
> 400 kHz sind hier eine zulässige Frequenz, man sollte nur keine höhere
> verwenden.

Ja! Aber wenn man die Taktfrequenz durch zwei teilt dann ist man schon 
bei 600kHz. 400kHz teste ich bei Gelegenheit. 100kHz funzen jedenfalls 
sicher.

Bei 5 Datenbytes pro 10 Minuten die ich vom DHT12 holen will sollten 
100kHz nicht das Problem sein.

: Bearbeitet durch User
von Jürgen W. (Firma: MED-EL GmbH) (wissenwasserj)


Lesenswert?

Bzgl. der Frequenz: Asche auf mein Haupt - da hab' ich wohl irgendeinen 
langsamen Sensor im Kopf gehabt.

In allen anderen Timing-Belangen: Die I2C-Spec hat eine Set-up-time für 
die Daten definiert, bevor die positive SCL-Flanke 30% erreicht - ich 
kenne die I2C-Realisierungen zwar nicht auswendig, aber das spricht für 
ein Master-Slave-FF am Dateneingang eines I2C-Gerätes.

Bitte beachten: die Anstiegszeit als der wichtigere Parameter ist sowohl 
für SDA als auch SCL bei 100kHz und 400kHz max. 300ns:

0,7=1-exp(-t2/tau) => t1 = -Tau*ln(0,3)
0,3=1-exp(-t1/tau) => t2 = -Tau*ln(0,7)
300ns >= t2-t1
300ns >= Tau*ln(0,7/0,3)
Tau <= 300ns/0,8473 = 354ns

Also, 4k7 als PU sind schon ok, 3k3 wären evtl. noch günstiger; bei 
kurzen Leitungen auf der Leiterplatte mit <50pF gehen, wie oben 
beschrieben, auch 10kOhm - das ist allerdings wirklich schon die Grenze.

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.