www.mikrocontroller.net

Forum: Codesammlung Mehrere DS1820/DS18B20 auslesen

Autor: peter dannegger (Gast)
Datum: 05.05.2003 00:33
Angehängte Dateien:

Da hier im Forum doch größere Probleme bei der Verwendung der Maxim
Temperatursensoren auftreten, anbei nun meine 8051-Routine auf einem
ATTINY12 in Assembler implementiert.

Eine ausführliche Beschreibung werde ich später dazustellen.


Die Sensoren werden über Parasite-Power versorgt, d.h. es reicht eine
2-Draht-Leitung aus. Dazu wird der 1-Wire-Portpin während der Wandlung
als Ausgang geschaltet.
Da die DS18B20 bis zu 750ms benötigen, wird für eine Wandlung 1s
gewartet. Während dieser Zeit können die Sensoren nicht ausgelesen
werden.

Mittels einer Taste kann zwischen den Sensoren umgeschaltet werden.

Die Temperatur wird beim DS18B20 in 0,1°C-Schritten angezeigt.


Als Pull-Up habe ich 2,2kOhm verwendet.
Das ganze habe ich mit 7 Sensoren an 20m Klingeldraht getestet.


Peter
Autor: Bastian (Gast)
Datum: 01.09.2003 23:17

Hallo Peter,

wie steuerst du einzelne ds1820 im bus über das eeprom an?
du meintest mal, man sollte jedem eine nummer geben und dann diese
ansprechen. hast du da eine routine für?


Gruss

Bastian
Autor: peter dannegger (Gast)
Datum: 02.09.2003 16:54

Code für den AVR habe ich nicht.

Wie man einen Wert speichert, steht im Datenblatt.

Und beim Auslesen der Temperatur liest man diesen Wert eben mit aus und
vergleicht ihn, ob es die gewünschte Messtelle ist.

Mann kann ihn aber auch als Index nehmen, an welcher Adresse in einer
Tabelle die Temperatur zu speichern ist.
D.h. man speichert alle Werte ab und hat sie dann in der Tabelle nach
der Nummer die im EEPROM steht sortiert vorliegen.


Peter
Autor: Bastian (Gast)
Datum: 02.09.2003 22:12

Achso, ich dachte man könnte direkt die Adresse zum ansprechen des
Sensors im EEPROM speichern.

Wenn man mehrere Sensoren am Bus hat muss man ja jeden einzeln zum
abfragen adressieren
Autor: peter dannegger (Gast)
Datum: 03.09.2003 08:40

"Wenn man mehrere Sensoren am Bus hat muss man ja jeden einzeln zum
abfragen adressieren"

Eben nicht !

Mit dem ROM-Search wird einer nach dem anderen adressiert und kann
ausgelesen werden. Aber wer der erste und wer der letzte ist, ist von
den Adressen abhängig. Es ergibt sich also eine zufällige Reihenfolge,
deshalb der Trick mit der Indexadresse im EEPROM.


Ein Beispiel:

Der Sensor für die 5.Messtelle wird beim ROM-Search z.B. als 3.
gefunden. Aber die Nummer 5 im EEPROM bewirkt, daß dessen
Temperaturwert in der Meßwerttabelle an 5. Stelle abgespeichert wird.

Nun ist er kaputt und durch einen anderen ersetzt worden, dem ebenfalls
die 5 in den EEPROM geschrieben wurde.
Der neue wird jetzt aber z.B. als 6. gefunden. Aber die Nummer 5 im
EEPROM bewirkt wieder, daß er in der Meßwerttabelle an 5. Stelle
abgespeichert wird.


Peter
Autor: Bastian (Gast)
Datum: 03.09.2003 21:48

Ich fürchte das ist im Moment noch zu komplex für mich. Das krieg ich
noch nich hin. Muss mich erstmal genauer mitm AVR und Assembler
vertraut machen. Mal sehen wann ich soweit bin mal 1Wire Routinen
richtig zum laufen zu bringen..
Autor: Spatz2222 (Gast)
Datum: 07.10.2003 09:02

Hallo Peter,

ich habe folgendes Programm ich habe ein Bus mit 5 Ds1820

diese lese ich der Reihe nach mit ROM-search aus.
funkt. auch recht gut ...

jetzt kann es aber in meinem Einsatz passieren, daß mal ein Sensor
kaputt geht oder die Strippe zum Sensor abreißt.
Nun überspringt einfach ROM-Search den def. Sensor und macht mit dem
nächsten weiter ... und da ich die Werte in ein EEProm speichere kommt
da so einiges durcheinander.
Ich will das so machen wenn der eine nicht mehr ansprechbar ist das
soll z.B. der ausgelesen Wert auf 0 gehen etc.

jetzt habe ich das mit der Adressierung über das EEProm gelesen ...
bin aber im Datenblatt nicht ganz schlau geworden !

kannst Du das mal bitte ganz grob erläutern wie man das eeprom
beschreibt und wie die Adressierung dann aussieht ?


ich mach das jetzt wie folgt : (halb Basic ...)
'****************************************************
reg_nr(1-8) = ROMsearch
Match ROM
Convert
Match ROM
Read RAM
Empf1 = Scratch(1)
'****************************************************

man könnte zwar die Adressen der einzelnen Ds1820 vorher im Programm
speichern jedoch würde das viel RAM verbrauchen ...


Gruß Tobias
Autor: peter dannegger (Gast)
Datum: 08.10.2003 12:13

@Tobias,

ich habs ja oben schon versucht zu erklären:

Wenn Du nach Auslesen der Temperatur noch die 2 nächsten Bytes liest,
sind das die beiden EEPROM-Bytes, die du frei verwenden kannst, z.B.
als Meßstellennummer.

Und diese EEPROM-Bytes must Du eben irgendwann einmal entsprechend
beschrieben haben. Wie man das macht geht am besten aus dem
Flußdiagramm im Datenblatt hervor.


Peter
Autor: Spatz2222 (Gast)
Datum: 08.10.2003 12:33

gut die zwei Byte zu beschreiben sollte kein Problem sein ...
jedoch wie jetzt Adressieren ? mit ROM-Search und dann abfragen ob z.B.
das z.B. Sendor 3 ist oder so ? oder kann man den dirket adressieren
über diese 2 Bytes ?

aber ich denke mal nicht ...


Aber die Antwort hat schon weitergeholfen Danke !


Gruß Tobias
Autor: peter dannegger (Gast)
Datum: 08.10.2003 14:25

"jedoch wie jetzt Adressieren ? mit ROM-Search und dann abfragen ob
z.B.
das z.B. Sendor 3 ist oder so ?"

Ganz genau !

Um nur einen bestimmten Sensor auszulesen must Du dann solange
ROM-Searchen, bis der richtige gefunden ist.


Peter
Autor: Spatz2222 (Gast)
Datum: 08.10.2003 22:25

Peter ich Danke Dir... - hat mir sehr geholfen !

also noch einen schönen Abend !
Autor: Peter-Christian Carstens (Gast)
Datum: 15.10.2003 15:39

Hi, habe es mit 8051 Assembler hingekriegt, eine DS2401 Seriennummer
oder einen DS1821 Temperatursensor auszulesen. Brauche jetzt mal eine
8051-Assembler Routine "ROM-Search" die mir alle Seriennummern
anzeigt die auf dem Bus sind. Flussdiagramm dazu habe ich aber ist mir
doch ein wenig zu mühselig dass alles umzusetzen..
Mit besten Grüssen
Autor: peter dannegger (Gast)
Datum: 15.10.2003 22:49
Angehängte Dateien:

@Peter-Christian

Anbei die 1-Wire Funktionen in 8051 Assembler.

Der Aufruf erfolgt genauso wie im C-Programm.


Peter
Autor: Tobias (Gast)
Datum: 05.11.2003 17:48

Hallo alle,
ich bin auf der Suche nach einem DS1820, der in einem Wandgehäuse
montiert ist und mit Schraubklemmen o.ä. an ein Kabel angeschlossen
werden kann.
Habt Ihr eine Ahnung, wo es sowas fertig zu kaufen gibt?
Liebe Grüße
Tobias
Autor: SIMON AMIR (Gast)
Datum: 15.12.2003 12:16

I want to buy 300 parts of DS1820 , 3pin ,pr35 package.
Autor: Elektrikser (Gast)
Datum: 20.09.2004 18:00

Hallo Peter,
führe mir gerade deinen Code für den Attiny12 zu Gemüte. Ich habe es
zwar geschafft einen einzelnen DS1820 mit einem Atmega8L auszulesen und
als Thermometer zu verwenden, aber jetzt will ich mehrere an einem Bus
hängen. Ich programmiere in AVR-GCC. Ich habe aber das ROM-Search noch
nicht ganz begriffen. Du hast in deinem ersten Post geschrieben:
"Eine ausführliche Beschreibung werde ich später dazustellen."
Das würde mir vielleicht ein ganz schönes Stück weiterhelfen, oder eine
bessere Kommentierung :-)
Der Ablauf, wie ich ihn verstehe:
-Reset
-Such-Kommando senden: 0xF0
-Erstes Bit lesen
-Zweites Bit lesen (Komplement-Bit)
-Master sendet erstes Bit zurück ->derjenige Busteilnehmer, der diesen
Wert hat, bleibt noch aktiv, der Rest wartet.

Das mache ich dann mit allen 63-Bit,bis einer übrig bleibt, oder?
Also immer 2 Bit empfangen und eines senden.
Habe ich das, kann ich ihm in seinen Scratchpad eine Nummer vergeben.
Dann mache ich diese Sucherei solange, bis ich alle gefunden habe und
ihnen eine Nummer vergeben habe.
Habe ich das richtig verstanden, oder gibt es noch einen anderen Weg?

Gruß Elektrikser
Autor: mthomas (Gast)
Datum: 21.09.2004 02:44

Hilft nicht direkt weiter, aber: Wenn man etwas Controller-Speicher frei
hat (z.B. im AVR-EEPROM), kann man sich auch die eindeutigen ROM-Codes
(Family-Code, Seriennummer, evtl. auch CRC) "merken" und muss nicht
in das Scratchpad des DS18x20 schreiben. Indizierung dann ueber den
gespeicherten Code. Etwas komplexer zu programmieren, aber koennte
einfacher handhabbar sein, falls ein (oder mehr) defekter(e) Sensor(en)
ausgetauscht werden mu(e)ss(en).

Von Peter Dannegger wurde im Thread
http://www.mikrocontroller.net/forum/read-4-84831....
"fertiger" avr-gcc-Code bereitgestellt.

Bei der Gelegenheit: Danke dafuer, Peter.
Autor: Elektrikser (Gast)
Datum: 21.09.2004 15:43

O.K. dann habe ich das falsche erwischt.
Werde mir das mal ansehen. Ich habe mittlerweile das AN162 bei Dallas
gefunden. Das hilft auch schon weiter, obwohl es ein C-Code für ein
8051er ist. Aber so viel scheint sich da nicht zu ändern. Der Code für
den Rom-Search ist dort schon größer als meine Auswertung des einen
DS18S20.
Jetzt hilft nur noch try and error.

Gruß Elektrikser
Autor: Peter Dannegger (Gast)
Datum: 21.09.2004 17:12

"Jetzt hilft nur noch try and error."

Warum ?

Das was Du oben geschrieben hast, ist doch vollkommmen richtig.
So macht es auch mein Programm.


Peter
Autor: Elektrikser (Gast)
Datum: 21.09.2004 21:58

In C bin ich noch ein relativ blutiger Anfänger. (Mein Einstieg war
Assembler mit den 8051ern.) Aber ich habe es mir in den Kopf gesetzt
und jetzt wird es probiert. Dafür, dass ich vor fünf oder sechs Wochen
damit richtig angefangen habe, geht es gar nicht mal so schlecht.

Keine Angst, wenn ich Bahnhof verstehe, melde ich mich wieder! :-)

Gruß Elektrikser
Autor: Elektrikser (Gast)
Datum: 25.09.2004 16:25

Hallo Peter,

Ich habe mir jetzt dein Programm für den AVR angesehen (den Link, den
mthomas gepostet hat: 1wire.zip). Ich habe noch ein Verständnisproblem,
vielleicht hilfst du mir:
"uchar w1_rom_search( uchar diff, uchar idata *id )"

Die Funktion habe ich im groben verstanden, komme aber mit der Übergabe
der Funktion nicht klar. idata hast du in der main.h definiert. *id ist
ja ein Zeiger, der in der Tempmeas.c durch den Aufruf:
"diff = w1_rom_search( diff, id );"
auf die erste Adresse des ersten Feldes von id[8] zeigt. Soweit ok.
Was bezweckt dieses idata? Warum schreibst du nicht einfach uchar *id?


Gruß Gerd G. (Elektrikser)
Autor: peter dannegger (Gast)
Datum: 25.09.2004 20:16

Das Programm habe ich ursprünglich für den 8051 geschrieben, für den AVR
hab ich "idata" einfach drin gelassen.

Der 8051 hat verschiedene Speicherbereiche, "idata" ist besonders
schnell und codesparend zugreifbar und erlaubt auch viele Operationen
direkt auszuführen, ist aber auf 256 Byte beschränkt.

"data" ist für häufige und lokale Variablen, "idata" für kleine
Datenfelder und "pdata" oder "xdata" für selten benötigte Variablen
oder große Felder (bis 64kB).

Beim 8051 kann man also durch geschickte Auswahl des Speichersegments
besonders schnelle und codesparende Programme schreiben.


Peter
Autor: Elektrikser (Gast)
Datum: 25.09.2004 20:44

Aber bringt das beim AVR etwas? Wo kann ich darüber Infos bekommen?
Naja, werde dein Programm compilieren und mal damit rumspielen. Später
werde ich das ROM-Search mal in mein Programm einbauen.

Danke für die Hilfe,

Gerd
Autor: Elektrikser (Gast)
Datum: 28.09.2004 13:27

Danke Peter,
für deine Hilfe. Mit Hilfe deines Programmes habe ich das jetzt zum
Laufen gebracht.
Gruß gerd
Autor: Peter Dannegger (Gast)
Datum: 28.09.2004 13:41

"Aber bringt das beim AVR etwas?"

Nein, der kann ja sowas nicht.
Deshalb wird es dort auch durch nichts ersetzt:

#define idata

Ist einfacher, als sämtliche Quelltexte umzueditieren.


Peter
Autor: Elektrikser (Gast)
Datum: 28.09.2004 22:57

Habe es mir schon gedacht. Aber da hatte ich diese Zeile in der main.h
überlesen gehabt.
Muß mir das beim 8051er ansehen. Ich programmiere da zwar immer noch
mit Assembler, aber das mit dem Speicherbereich ist interessant. Werde
mal meine Unterlagen wälzen, mal sehen was ich da so finde. Irgendwie
scheint mir da was entgangen zu sein....

Gruß Gerd G. (Elektrikser)

Antwort schreiben

Die Angabe einer Email-Adresse ist freiwillig. Wenn Sie automatisch per Email über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate

Hinweis: der Originalbeitrag ist mehr als 6 Monate alt.
Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net