Servus!
Irgendwo habe ich aber noch ein kleines Problem beim empfangen der Bits
vom DS1820. Leider kann ich immer nur Mist auslesen -> 11100000 usw.
Convert wurde gesendet, genau auch der Befehl zum Temperatur messen.
Aber irgendwie stimmt da was mit den Timings noch nicht so ganz.
Wahrscheinlich zwischen letzten Befehl senden und auslesen. Oder auch
beim Empfang der einzelnen Bits!? Entweder zulange oder zu kurz
gewartet. Ich weiß es nicht.
Das Datenblatt ist mir dabei auch nicht sehr hilfreich, zumindest finde
ich es einfach nicht genau. Im Forum hier, finden sich auch immer wieder
unterschiedliche Zeiten.
Wenn ich zwischen den einzelnen Bits empfangen ein _delay_us(80); drin
habe, kommt auch ein ziemlich wirrer Code raus, egal bei welchem Byte.
Wenn ich es weg lasse, kommt anderer sinnloser Code raus.
Das 1. Byte soll laut Datenblatt ja nur 0x00 oder 0xFF sein, und sonst
nichts dazwischen.
Das Resetsignal wird korrekt empfangen, er ist also richtig
eingebaut und antwortet auch. Genauso empfange ich ja auch 1er und 0er
nur falsch.
Ich hatte das ganze gestern schon mal gepostet, aber irgendwie finde
ich, passt es so gar nicht mehr zum Ausgangsproblem. Siehe->
Beitrag "Code gibt immer den gleichen Binärcode aus"
> Selektierst du jedes Device per ID?
Nein, es ist nur einer angeschlossen.
Wie lange wartest du vom letzten Befehl(0xBE) senden, bis zum auslesen
der jeweiligen Bytes, und zwischen jedem Byte?
@Gast: Ich habe mir mal exemplarisch das Senden angesehen.
Der ganze Bitzyklus sollte normalerweise gut 60µs dauern, plus Erholzeit
der Leitung. Du ziehst aber bei 0 für 90µs runter. Auch die 7µs sind
etwas hoch, zumal die inhärente Verzögerung des Steuercodes drum herum
auch mitzählt. Zum "Ausgleich" ist der Slot dann bei "1" zu kurz, nur
rund 30µs.
Nach der 0-Phase sollte zudem explizit etwas Luft gelassen werden, damit
der Widerstand die Leitung hochziehen kann - was bei längerer Leitung
ein paar µs dauert. Dieser Aspekt fehlt übrigens auch in Peter
Danneggers Code.
Üblicherweise kombiniert man übrigens Senden und Empfangen in einer
Routine, weil es fast der gleiche Vorgang ist. Für den Empfang "sendet"
man dann 0xFF.
Weiter im Text: Hier wohl unkritisch aber trotzdem falsch: wire_low()
zieht u.U. kurz hoch bevor es runter geht. Generell wenn bei AVRs Open
Drain realisiert werden soll: erst Ausgangsregister auf 0 setzen, dann
auf Ausgang stellen, keinesfalls andersrum.
Soweit mal Thx. Ich habe den Code mal so geändert wie beschrieben.
Aber die Frage habe ich von oben noch:
>Wie lange wartest man vom letzten Befehl(0xBE) senden, bis zum auslesen>der jeweiligen Bytes, und zwischen jedem Byte?
1
senden(0xBE);//Temp messen
2
_delay_us(?);// Wartezeit nach dem senden (bisher 50)
3
intwert1=empfang();
4
//_delay_us(?); // Zeit zum 2. Byte empfangen (bisher nicht vorhanden)
5
intwert2=empfang();
Diese beiden Delays stimmen wahrscheinlich noch nicht, und besonders die
sind mir nicht ganz klar.
Zu empfang():
- Es wird zu früh gesampelt. Empfohlen wird ja knapp unter 15µs
- Auch hier den 60µs Zyklus fahren, nicht warten bis inaktiv.
Und wenn du das hast, wirst du sehen, dass es einfacher ist, beim Senden
auf Verdacht nach knapp 15µs zu sampeln und als Ergebnis zu
akkumulieren. Also die selbe Routine für beides verwenden.
Hab nochmal reingesehen. Die 90µs sind durchaus ok, vor allem wenn der
eigene Takt arg ungenau ist. Aber unter 60µs darf der Bitzyklus nicht
liegen, egal ob 1 oder 0 oder Lesen oder Schreiben.
Der Takt ist ziemlich genau, von einem externen Quarz mit 12 MHz.
Soweit empfange ich jetzt die korrekte Temperatur. :-) Thx dafür an
alle.
Aber das 2. Byte empfange ich noch nicht ganz korrekt. Meist sowas wie
11100000 oder 00001111. Eigentlich sollte das doch 00000000 oder
11111111 sein, oder?