Hallo,
habe ein paar Fragen zum Temperatursensor DS1820. Er ist richtig
angeschloßen und DQ über 4,7 KΩ an Vcc angeschloßen.
1. Wie muss ich das auf Low schalten verstehen? Heißt das, den µC Pin
auf Ausgang und Low zu schalten, oder ist das anders gemeint? Wenn ja
muss ich beim Auslesen dann erst wieder auf Eingang schalten. Soweit
richtig?
2. Wie wird das Signal vom µC ausgelesen? Ich weiß dass er die Leitung
auf immer wieder Low schaltet. Aber wie kann ich die einzelnen Impule
registrieren? Per while, oder for Schleife solange den Pin auslesen bis
er wieder dauerhaft High ist?
3. Sendet er nach dem Init automatisch regelmäßig im Sekundentakt die
gemessene Temperatur? Oder muss ich die immer wieder abfragen?
4. Wie kann ich aus dem ausgelesenen Bits die Temperatur berechnen? Laut
Datenblatt sendet er ein 9-Bit Signal.
Das wären soweit meine Fragen (vorerst :-D).
Ein Beispiel findest Du u.a. hier:
http://mcu.emea.fujitsu.com/mcu_product/mcu_all_software.htm
90xxx_hw_ds1820-v10.zip
This example provides the basic routines to connect a Fujitsu
microcontroller to a 1-wire device from Dallas Semiconductor.
Gruß,
Toemi
Hallo,
zu 1.
Das ist richtig
zu 2.
Wenn der Master seine Busleitung auf Eingang schaltet, wird das Signal
entweder kurzfristig vom Pullup wieder auf "1" gezogen oder ein Slave
hält das Signal für eine bestimmte Zeit weiter auf "0". Diese Zeit muß
gemessen werden.
zu 3.
Der Slave (DS1820) sendet nichts von allein. Alle Aktivitäten gehen vom
Master aus.
zu 4.
Die Temperatur wird im Zweierkomplement übertragen. Die Darstellung
hängt vom Chip ab (DS1820, DS18B20, DS1822 etc.) und steht im
Datenblatt.
Gruß
Joachim
Zu 3. dachte ich mir das fast schon. Also muss ich ihn jedesmal darum
bitten mir die Temperatur zu sagen :-)
Zu 2. ist mir das noch nicht ganz klar. Wenn ich die Zeit messe habe ich
ja erst ein Bit. Brauche aber 9. Laut Datenblatt sendet er immer solche
Daten:
0000 0000 0000 0000 für 0°C
0000 0000 1010 1010 für +85°C
usw.
Ka wie ich damit auf 9-Bit komme und wie ich die Daten sammel. Deswegen
dachte ich da an eine Schleife zum auslesen und sammeln der Bits.
@Werner Die Datei schaue ich mir gerade an :-)
>Ka wie ich damit auf 9-Bit komme und wie ich die Daten sammel. Deswegen>dachte ich da an eine Schleife zum auslesen und sammeln der Bits.
Ach, dachtest du!
Spiel mit Barbie Puppen ;)
>Ach, dachtest du!>Spiel mit Barbie Puppen ;)
Schenkst du mir eine? Ich weiß leider nicht wo man sowas bekommt. Nach
deiner Aussage soll ich das denken sein lassen. HILF MIR DOCH
Wenn du nichts sinnvolles dazu beitragen willst, müll doch andere Themen
zu. Die anderen Poster wird das sicher sehr freuen :-)
>Schenkst du mir eine? Ich weiß leider nicht wo man sowas bekommt. Nach>deiner Aussage soll ich das denken sein lassen. HILF MIR DOCH
Wobei? Du glaubst doch nicht im Ernst das du hier durch
zwei oder drei Fragen zum Programmierer wirst?
Das Timing der 1 Wire Sensoren wirst du nicht verstehen.
Und das kann dir auch keiner mal eben so beibringen.
Das Timing ist mir vollkommen klar! Darum ging es nie.
Es geht mir nur um die AUSWERTUNG. Wie muss ich das umrechnen damit da
sinnvolle Wert rauskommen. Aber langsam wirds durch ewigs ausprobieren
schon noch was.
Noch eine Sache: Falls es irgendeine fertige Funktion im µC gibt, die
HEX direkt nach Binär umrechnet und umgekehrt, so möge man es mir
mitteilen :-)
Der Tonfall der Antworten lässt zwar etwas zu wünschen übrig, aber deine
Postings legten nahe, dass du praktisch garnichts vom Protokoll der
Sensoren jenseits des einzelnen Bits verstanden hast. Was bedeutet, dass
der Versuch hier zu helfen bei Adam und Eva anfangen müsste und nicht
jeder schätzt die Aussicht darauf. Deshalb die etwas brüske Reaktion.
Dann sagt halt gleich dass ihr mir nicht helfen wollt. Hätte uns einiges
an Zeit erspart :-) Naja auch egal. Dann probier ich halt solange bis es
irgendwann funktioniert. cu
NB: Wo taucht beim DS1820 Hex auf? Das Ergebnis ist besagter 9 Bit Wert
verpackt in 16 Bits, als halbe Grade.
Das Protokoll vom DS1820 ist zwar auf unterster Ebene in Bits zu sehen,
darüber allerdings liegt in den meisten Kommandos und Antworten eine
Schicht, die in Bytes arbeitet.
Es gibt übrigens jede Menge funktionsfähigen Codes für solche Sensoren.
In wahrscheinlich jeder gängigen Sprache. Wenn du also nicht des
Lerneffektes wegen das unbedingt neu erfinden willst, dann such mal in
der Codesammlung.
Doch es geht mir hauptsächlich um den Lerneffekt.
@A.K. Im Datenblatt: 47h usw. Für die Befehle zum Sensor. Mit einer
fertigen Funktion umrechnen lassen wäre einfacher und übersichtlicher
als alle Hexcodes als 1 und 0 anzugeben.
Einige Programme hier im Forum habe ich schon gefunden, und auch
benutzt. Aber nur selbst machen bildet. Kopieren kann jeder ;)
Sorry, aber jetzt höre ich auch auf, das hat einfach keinen Sinn. Die
einzige Umrechnung zwischen Hex und Binärdarstellung die weit und breit
in Sicht ist nimmt dir der Compiler oder Assembler ab. Oder
programmierst du den Microcontroller in einzelnen Bits? Seit sogar die
PDP11er in den 70ern ihre Klaviere verloren haben ist das etwas aus der
Mode gekommen. Apropos: Worin programmierst du?
>Einige Programme hier im Forum habe ich schon gefunden, und auch>benutzt. Aber nur selbst machen bildet. Kopieren kann jeder ;)
Ja dann mach doch. TU ES! Wozu Fragen stellen?
DU kannst es! Hopp, hopp, hopp ran ans Werk!
In C. Ich kenn bisher keine einfache Umrechnung für einen Pin. Für einen
ganzen Port ist mir das klar. PORTX = 0xFF; usw. Aber wie man einen
Hex-Wert auf nur einen Pin schreibt noch nicht so. PINX = 0xFF? Wohl
eher nicht. Ich habe das jetzt so gelöst dass ich die einzelnen Bits per
Schleife sende. Aber da gibt es garantiert eine bessere Möglichkeit.
@dummy Hier-->
http://www.zooplus.de/bilder/leckerlimix/fr/hunde/semimoist/1/300/47229_Dibo_Leckerli_Mix_1.jpg
Ein paar Leckerlis für dich ;)
Hi Loooooool,
koennte mir gut vorstellen das du mit Bascom gut arbeiten koenntest. Ich
benutze es selbst weil ich mich um viele sachen nich kuemmern muss, im
gegenzug ist der Code halt nich total ausgefeilt. Was solls, dafuer gibt
es fertige befehle fuer 1wire etc.
So habe ich das DS1820 benutzt:
Gettemp: 'temperaturmessen
Config 1wire = Portc.i
Disable Interrupts
1wreset
'Print Err
1wwrite &HCC
Waitms 1
1wwrite &H44 'wandeln
'Print Err
Waitms 1
Enable Interrupts
Wait 1
Disable Interrupts 'wandeln fertig
1wreset
'Print Err
1wwrite &HCC
'Print Err
1wwrite &HBE
Scratch(1) = 1wread(9)
'Print Err
Enable Interrupts
Return
Rein funktonell reicht eigentlich folgendes:
Gettemp: 'temperaturmessen
1wreset
1wwrite &HCC
Waitms 1
1wwrite &H44 'wandeln
Waitms 1
Wait 1 'wandeln fertig
1wreset
1wwrite &HCC
1wwrite &HBE
Scratch(1) = 1wread(9)
Return
Der doppelte(!) Absolutwert der Temperatur befindet sich dann in
Scratch(1). (Daher kann des Teil vermutlich bis +127 Grad messen)
Das Vorzeichen ist in Scratch(2) das entweder 0(+) oder 256(-) ist.
Ob das Interrupt ausschalten wirklich hilft weiss ich nich. Die
Err-Prints habe ich nach Bedarf eingebunden oder nicht, es mussten halt
genug Nullen dastehen bis es mal laeuft, dann wieder auskommentieren.
Auf jeden Fall ist diese Routine dafuer gedacht das ein einzelner Sensor
an der Leitung ist, ich habe vorher halt in $i gespeichert welche
Leitung es ist (hatte 2 Sensoren).
Das zumindest ist ne gute Variante wenn man wie wir nich wirklich
durchblickt.
Ein weiterer Vorteil von Bascom ist z.B. das es vollkommen egal ist ob
man schreibt X=12, X=&H0C oder X=&B00001100 (oder X=3*4). Interessant
ist das dann bei Ausgaben, aber da kann man auch mal probieren.
Und das beste ist: Du brauchst dich nich um das 1-wire-Timing scheren,
es reicht das mal ueberflogen zu haben...
HTH, bye uwe
achja, mehrere bits bekommt man wirklich nur auf einen pin wenn man sie
hintereinander draufnetzt, es ist ja nur ein Draht, der kann Spannung
haben oder nicht oder dann wieder doch usw.
Am einfachsten per
print variable
dann kommt die ganze variable (auch wenn es ein String ist) z.B. an Pin
15 raus (Tx vom AtMega16 in DIP40 Gehaeuse)
LOOOOOOOOOOOOOOOOOL wrote:
> In C. Ich kenn bisher keine einfache Umrechnung für einen Pin. Für einen> ganzen Port ist mir das klar. PORTX = 0xFF;
Die Umrechnungsfunktion, die ein ganzes Byte ohne Informationsverlust in
ein einziges Bit quetscht, die ist noch nicht erfunden worden. Auch
nicht von Dallas. Und so wirst du nicht darum herum kommen, die Bits
einzeln nacheinander im Gänsemarsch über die Leitung zu jagen.
Das kannst du dann selbst programmieren oder bestehenden Code verwenden
(Codesammlung, oder das eben erwähnten Basic). Tip: Deine Idee mit der
schleife ist schon mal ein guter Ansatz. Wenn du dann noch AND, OR und
die Shift-Operatoren von C kennenlernst, dann fällt vielleicht der
Groschen.
>Die Umrechnungsfunktion, die ein ganzes Byte ohne Informationsverlust in>ein einziges Bit quetscht, die ist noch nicht erfunden worden. Auch>nicht von Dallas. Und so wirst du nicht darum herum kommen, die Bits>einzeln nacheinander im Gänsemarsch über die Leitung zu jagen.
Genau dafür wollte ich ja wissen, ob es eine Funktion gibt die mir den
Hexwert in einen Binärwert umwandelt. So hätte ich schon mal alle Bits
gehabt. Naja geht wohl nichts am manuellen umrechnen vorbei. Zwar
unübersichtlicher, aber ich versteh es schon. Dass ich nicht das ganze
Byte auf einmal schicken kann ist mir schon klar.
>Das kannst du dann selbst programmieren oder bestehenden Code verwenden>(Codesammlung, oder das eben erwähnten Basic). Tip: Deine Idee mit der>schleife ist schon mal ein guter Ansatz. Wenn du dann noch AND, OR und>die Shift-Operatoren von C kennenlernst, dann fällt vielleicht der>Groschen.
Diese Sachen aus C kenne ich schon. Und jetzt ist mir dazu auch was
eingefallen. Werde es dann gleich mal ausprobieren.
@Uwe Bascom kenne ich schon, habe es aber nie selbst benutzt. Mir
gefällt das irgendwie nicht, wenn schon alles fertig gecoded ist und ich
fast nur ein paar Bausteine zusammenbauen darf (im übertragenenen Sinn).
Ich bin dann mal weiter coden. Thx an alle und auch an dummy den
heutigen Forentroll :-)
LOOOOOOOOOOOOOOOOOL wrote:
> Genau dafür wollte ich ja wissen, ob es eine Funktion gibt die mir den> Hexwert in einen Binärwert umwandelt.
Da gibt es nichts umzurechnen. Dir scheint das Verständis dafür zu
fehlen, wie ein Computer arbeitet und was Hex/Binär/Dezimalzahlen
eigentlich sind.
Mit dem C Befehl
unsigned char x = 0x47;
steht in der Variablen "x" gleichermassen der Wert 47h als auch der Wert
73 als auch der Wert 0b01000111. Das ist alles schon da. Gleichzeitig.
Das sind alles nur alternative Darstellungen des gleichen Bitmusters.
Es geht also nur darum, die bereits in der Variablen vorhandenen Bits
nacheinander zu übertragen.
LOOOOOOOOOOOOOOOOOL wrote:
> Einige Programme hier im Forum habe ich schon gefunden, und auch> benutzt. Aber nur selbst machen bildet.
Nö.
Man kann sich besser dadurch bilden, indem man die Beispiele anguckt,
wie es dort gemacht wird. Und dann kann man auch konkrete Fragen dazu
stellen.
Ist natürlich aufwendiger, als einfach zu fragen, ob es jemand einem
vorkauen kann.
Peter
A***** F***** wrote:
> Ich habe zwar einen DS75LV, aber hier ist mein Code, falls es sir hilft:
Hilft garantiert nicht.
1. sucht er 1-Wire und nicht I2C
2. was kann man mit Code anfangen, der nur nen Haufen unbekannter
Funktionen aufruft?
Überhaupt nichts!
Peter
Hallo,
ich will den Faden noch einmal bei der Nachricht vom 07.10 21:55
aufnehmen.
zu 3.
Du must den Baustein zurücksetzten, dann selektieren und dann das
Komando zur Temperaturwandlung geben. Nach ca. 800ms wird der Baustein
wieder zurückgesetzt, selektiert und dann ausgelesen.
Diese Abfolge gilt für jede Temperaturmessung (Im Datenblatt steht das
ausführlich beschrieben)
zu 4.
Im "Read/Write Time Slot Timing Diagramm" des Datenblattes ist
aufgezeichnet, wie der Master ein Bit liest.
Dazu wird die Busleitung für mindestens 1us auf "0" gelegt.
Danach (vor dem Ablauf von 15us) wird der Bus abgetastet.
Liegt der Bus auf "0", dann hat der Slave eine "0" gesendet. Andernfalls
eine "1".
Hast Du das Diagramm im Datenblatt gefunden und verstanden?
Gruß
Joachim