Hallo zusammen,
ich möchte mit einem ATmega (n Mega brauch ich für den Rest drum herum)
Temperaturen messen - maximal 4 Stück, die allerdings etwas weiter weg
vom Controller. Meine Wahl fiel auf die 1 Wire Chips von Maxim, weil das
angeblich ganz einfach is. In zwischen hab ich viel gelesen und mit
folgendes zusammengereimt:
1. wenn ich etwas von meinen 1 Wire Slaves wissen mag, dann muß ich als
erstes reseten
2. jeder DS1822 is einmalig (ROM-Code)
Allerdings weiß ich ned so recht was ich damit anfangen soll, weil von
der Logik her würde ich sagen, ich ermittle einmal alle ROM-Codes meines
Buses und sende dann ein Request für einen Sensor und dieser antwortet
dann. Die Beispiele die man so im Netz und hier findet bestätigen das
aber irgendwie nich so, jedenfalls nich bis zu dem Punkt wo ich es
verstanden habe.
Kann mich da jemand freundlicher Weise etwas aufgleisen, wenn möglich
bitte ohne Web-Server und solche Späße, habe ich alles schon gefunden,
verwirrt mich nur noch mehr. Achso und welcher Sinn besteht eigentlich
darin jeden DS1822 an einen einzelnen Port des µCs zu hängen - gibt es
etwa auch die Möglichkeit eines Art Standalone-Betriebs ohne ROM-Code,
einfach Wandlung auslösen und dann ergebnis abholen? Fände ich zwar
unschön, hört sich aber einfach an.
Besten Dank
Gruß Jens
hallo!!!
mit was programmierst du??? (asm,c...)
und ich hoffe du meinst den ds1820
du hast geschrieben:
1. wenn ich etwas von meinen 1 Wire Slaves wissen mag, dann muß ich als
erstes reseten
2. jeder DS1822 is einmalig (ROM-Code)
zu 1. is richtig also reset routine schreiben
zu 2. is auch richtig aber mit skip_rom_befehl kannst du nur einen
sensor auf einen pin ansteuern, wenn du aber den search_rom nutzt dann
fragt die software erstmal ab, wie die adressen sind, die kannst du dann
speichern im eeprom,
bzw. jetzt kannst du an einem pin ich glaub bis zu 255 sensoren dran
hängen.
guck mal auf seite 14 da ist eine übersicht und auf seite 17 ist noch
eine übersicht wie du eine sensor ansteuerst.
ein wenig geholfen???
>Meine Wahl fiel auf die 1 Wire Chips von Maxim, weil das>angeblich ganz einfach is.
Naja, sagen wir mal, so einfach wie ne LED an nem Portpin ein- und
auszuschalten sind die nun auch wieder nicht. Für C-Anfänger nur
eingeschränkt empfehlenswert.
>1. wenn ich etwas von meinen 1 Wire Slaves wissen mag, dann muß ich als>erstes reseten
Meister, das geht eindeutig aus dem Datenblatt hervor, das Du bei
www.maxim-ic.com downloaden kannst (Titel "DS1822 Econo 1-Wire Digital
Thermometer"). Zitat:
>2. jeder DS1822 is einmalig (ROM-Code)
Ja. Jedes Exemplar bekommt bei der Herstellung einen uniquen ROM-Code
eingelasert.
>Allerdings weiß ich ned so recht was ich damit anfangen soll, weil von>der Logik her würde ich sagen, ich ermittle einmal alle ROM-Codes meines>Buses und sende dann ein Request für einen Sensor und dieser antwortet>dann.
So ist es auch. Der Request ist das "Match ROM"-Command, siehe
Datenblatt.
>Kann mich da jemand freundlicher Weise etwas aufgleisen, wenn möglich>bitte ohne Web-Server und solche Späße, habe ich alles schon gefunden,
Alles, was Du wissen musst, steht im Datenblatt, das Du gut verstanden
haben solltest, wenn Du mit Programmieren anfangen willst - sonst wirst
Du Dir Frust holen.
>welcher Sinn besteht eigentlich>darin jeden DS1822 an einen einzelnen Port des µCs zu hängen - gibt es>etwa auch die Möglichkeit eines Art Standalone-Betriebs ohne ROM-Code,
<einfach Wandlung auslösen und dann ergebnis abholen?
So ist es. Nur ein Sensor am Bus = "Single-Drop-Betrieb", mehrere
Sensoren am Bus = "Multi-Drop-Betrieb". Bei vier Sensoren kannst Du
entweder
a) jeden an einem eigenen Portpin single-drop betreiben.
Hardware-Aufwand: vier µC-Pins; Software-Aufwand: geringer, da Du Dich
um die ROM-Codes der vier Sensoren nicht kümmern brauchst (Command "Skip
ROM" - siehe Datenblatt).
Oder b) alle vier an einem einzigen Portpin multi-drop betreiben.
Hardware-Aufwand: ein µC-Pin. Software-Aufwand: höher, weil Du die
Sensoren über die ROM-Codes ansprechen musst.
Jens wrote:
> Hallo zusammen,> ich möchte mit einem ATmega (n Mega brauch ich für den Rest drum herum)> Temperaturen messen - maximal 4 Stück, die allerdings etwas weiter weg> vom Controller. Meine Wahl fiel auf die 1 Wire Chips von Maxim, weil das> angeblich ganz einfach is. In zwischen hab ich viel gelesen und mit> folgendes zusammengereimt:
Ich persönlich finde 1Wire alles andere als einfach, da das Timing hier
sehr kritisch ist.
> 1. wenn ich etwas von meinen 1 Wire Slaves wissen mag, dann muß ich als> erstes reseten> 2. jeder DS1822 is einmalig (ROM-Code)
Ja, und wenn du alle an einem Bus betreibst ist das (IMHO) auch einer
der grössten Nachteile vom 1Wire Bus. Du kannst zwar rausfinden wieviele
und welche Geräte am Bus sind, du weisst aber nicht WO sie sich
befinden, ausser natürlich du betreibst jeden Slave an einer eigenen
Leitung des µC. Ansonsten musst die alle einzeln vor der Bestückung
einmal auslesen und sie manuell zuordnen.
Ich persönlich bevorzuge die LM74(SPI) oder LM75(I2C) ICs, die sind
recht einfach anzusprechen. Sie sind günstiger als die Maxim-Sensoren
und du nutzt entweder eine CS-Leitung(beim LM74) oder programmierst sie
auf eine Busaddresse(LM75). Somit weisst du auch immer WO sich der
Sensor befindet. Alle (aktuellen?) Megas haben ein SPI-Interface und die
meisten besitzen auch I2C(TWI bei Atmel) oder wenigstens das
USI-Interface mit dem man I2C rel. gut nachbauen kann (wobei ich
persönlich USI in der aktuellen Form nicht mag).
Kleiner Hinweis, wenn du mehrere LM74 nutzen willst und nicht mehr genug
Ports für die einzelnen CS-Leitungen hast, dann lohnt es sich an den SPI
Bus ein Shift-Register zu setzen über das du dann seriel die einzelnen
CS-Leitungen auswählen kannst. Mehr Infos dazu gibts auch hier:
Porterweiterungen.
Nico Erfurth wrote:
> Ich persönlich finde 1Wire alles andere als einfach, da das Timing hier> sehr kritisch ist.
Nö ist es nicht.
Alle Timings haben einen Bereich von mindestens 2:1.
Pi*Daumen und RC-Oszillator reicht völlig.
Man muß bloß beachten, daß kein Interrupt dazwischen fährt und das
Timing total versaut, das ist alles.
> Ja, und wenn du alle an einem Bus betreibst ist das (IMHO) auch einer> der grössten Nachteile vom 1Wire Bus. Du kannst zwar rausfinden wieviele> und welche Geräte am Bus sind, du weisst aber nicht WO sie sich> befinden, ausser natürlich du betreibst jeden Slave an einer eigenen> Leitung des µC. Ansonsten musst die alle einzeln vor der Bestückung> einmal auslesen und sie manuell zuordnen.
Man muß nicht so umständlich denken, es geht doch ganz einfach:
Man schließt die Sensoren der Reihe nach an. Und die Software schreibt
jeden neu erkannten in ihren EEPROM. Du mußt sie also nur in der
Reihenfolge anschließen, wie Du sie später verwenden willst.
Bei längeren Leitungen könnte ein getrennter Anschluß sinnvoll sein,
damit die Leitungskapazität nicht zu hoch wird. Die Bit-Routinen wählen
dann per Bitmaske einen von 8 Portpins aus.
> Ich persönlich bevorzuge die LM74(SPI) oder LM75(I2C) ICs,
Die haben allerdings eine sehr schwerwiegenden Nachteil, das SO-8
Gehäuse ist extrem Sensor unfreundlich.
Die DS18B20 im TO-92 kann man dagegen sehr gut in ein Rohr eingießen
oder einfach in Schlauch einschrumpfen.
Peter
...es gibt auch den DS2482S, eine I²C nach 1-Wire-Brücke, der einem
sämtliche Timingprobleme abnimmt. Als DS2482S-800 für 8 Kanäle oder
DS2482S-100 für einen.
also das Datenblatt des DS1822 hab ich studiert nur blieb mir halt so
manches unklar - klar programmieren muß ich schon selber
vielleicht läßt mein Englisch auch nach, aber das mit dem single-drop
hab ich zwar im Datenblatt gefunden, nur irgendwie eine schlüssige
Erklärung stach mir ned ins Auge, aber mal morgen probieren
also den DS1822 habe bewußt gewählt, weil da auch einige Meter Leitung
zwischen Sensor und µC sein dürfen und ISP und I^2C da is sowas ja
eigentlich nur bedingt legal und KTYs sind mir zu ungenau und n paar
Meter Leitung sind da bestimmt au ned der Renner
Also mit SEARCH-ROM kann man alle Device an einem Bus der Reihe nach
erkennen oder adressieren. Das ist wohl das einzige Kommando, mit dem
Anfänger etwas Schwierigkeiten haben.
Hat man nur ein Device, dann schickt man ein SKIP_ROM und es ist
addresiert.
Danach kann man dem adressierten Device ein Funktionsbyte schicken um
eine Wandlung zu starten oder Daten zu lesen/schreiben.
Peter
Hallo Jens!
In deinem ersten Post fragst du ob du die Wandlung für alle gleichzeitig
auslösen kannst -> reset/presence pulse, skip-rom und dann convert_t
befehl.
das geht auch bei x sensoren an einem pin gleichzeitig, dann messen alle
gleichzeitig drauf los. dann wirst du aber wohl mir parasite-power ein
problem haben, eventuell erst mit 3-draht leitung ausprobieren wenn das
nicht gleich klappt.
anschließend dann einen sensor nach dem anderen über rom-code
selektieren und auslesen.
eine andere variante findest du über die suche - ist der code von Ulrich
Radig. Trick dahinter ist dieser: im sensor sind 2 bytes die du
beschreiben kannst -> gedacht für temperaturüberwachung/alarm. wenn du
diese funktion aber nicht nutzt kannst du in diese 2 bytes schreiben was
du willst.
also auch deine eigene id für den sensor. die musst du dann natürlich 1x
je sensor vergeben und ich hab die dann einfach drauf geschrieben.
-> damit weis ich auf einen blick auf den sensor die id und weis damit
z.b. das der "3er" sensor drausen ist.
und dann gibt es dazu noch die rom-search funktion, mit der kannst du im
prinzip einen sensor nach dem anderen adressieren. d.h. du klapperst
einem nach dem anderne ab. und liest jetzt aber nicht nur die temperatur
sondern auch das user-byte wo deine id gespeichert ist.
spart platz im rom und wenn ein neuer sensor dazu kommt oder einer
ausfällt musst du nur die id im neuen sensor entsprechend setzen.
aber mach mal schritt für schritt, 1 sensor am bus per skip rom, 2 mit
rom-adressierung und wenn das mal läuft schau dir die routinen von
Ulrich an, bzw. ist das in einem anscheinend älteren datenblatt auch
besser beschrieben wie im allerneusten - lassen sich aber beide via
google finden.
Martin.