Forum: Mikrocontroller und Digitale Elektronik Ein paar Fragen zum DS1820


von LOOOOOOOOOOOOOOOOOL (Gast)


Lesenswert?

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).

von Werner W. (toemi)


Lesenswert?

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

von JoachimB (Gast)


Lesenswert?

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

von LOOOOOOOOOOOOOOOOOL (Gast)


Lesenswert?

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 :-)

von dummy (Gast)


Lesenswert?

>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 ;)

von LOOOOOOOOOOOOOOOOOL (Gast)


Lesenswert?

>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 :-)

von dummy (Gast)


Lesenswert?

>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.

von LOOOOOOOOOOOOOOOOOL (Gast)


Lesenswert?

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 :-)

von (prx) A. K. (prx)


Lesenswert?

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.

von LOOOOOOOOOOOOOOOOOL (Gast)


Lesenswert?

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

von (prx) A. K. (prx)


Lesenswert?

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.

von (prx) A. K. (prx)


Lesenswert?

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.

von LOOOOOOOOOOOOOOOOOL (Gast)


Lesenswert?

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 ;)

von (prx) A. K. (prx)


Lesenswert?

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?

von dummy (Gast)


Lesenswert?

>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!

von LOOOOOOOOOOOOOOOOOL (Gast)


Lesenswert?

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 ;)

von uwe (Gast)


Lesenswert?

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

von uwe (Gast)


Lesenswert?

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)

von (prx) A. K. (prx)


Lesenswert?

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.

von LOOOOOOOOOOOOOOOOOL (Gast)


Lesenswert?

>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 :-)

von (prx) A. K. (prx)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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

von A. F. (artur-f) Benutzerseite


Lesenswert?

Ich habe zwar einen DS75LV, aber hier ist mein Code, falls es sir hilft:
1
********************************************************************************/
2
void tsens_init() {
3
4
  i2c_master_start();    // start i2c transmition
5
  i2c_master_write(TEMP_SENS_ADDR);// set slave addr + write mode
6
  i2c_master_write(0x01);    // set pointer to conf register
7
  i2c_master_write(0x00);    // set temp output to 9-bit
8
  i2c_master_stop();    // i2c stop condition
9
10
}
11
********************************************************************************/
12
unsigned char tsens_get_temp() {  
13
 
14
  unsigned char u8_temp = 0;          
15
  i2c_master_start();      // start i2c transmition
16
  i2c_master_write(TEMP_SENS_ADDR);  // set slave addr + write 
17
  i2c_master_write(0x00);      // set addr pointer
18
  i2c_master_stop();      // i2c stop condition
19
  
20
  i2c_master_start();      // start i2c transmition
21
  i2c_master_write(TEMP_SENS_ADDR | 1);// set slave addr + read 
22
  u8_temp = i2c_master_read(NACK);   // read MS Data Byte
23
  i2c_master_stop();      // stop i2c transmition
24
  return u8_temp;      
25
26
}

von Peter D. (peda)


Lesenswert?

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

von JoachimB (Gast)


Lesenswert?

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

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.