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
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
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
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
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
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..
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
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
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
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
Datum: 08.10.2003 22:25
Peter ich Danke Dir... - hat mir sehr geholfen ! also noch einen schönen Abend !
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
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
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
Datum: 15.12.2003 12:16
I want to buy 300 parts of DS1820 , 3pin ,pr35 package.
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
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.
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
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
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
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)
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
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
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
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
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)