Hallo! Habe 8 DS18S20 Temperatur Sensoren die an 8 Steckverbindern hängen. Möchte beim Startup ermitteln, welche ROM-Adresse an welchem Port hängt. Hat dafür jemand eine Idee? lg
Christian A. schrieb: > Hat dafür jemand eine Idee? Einmal kurz anfassen und gucken, bei welchem Sensor der Temperaturbuckel auftaucht. 1-Wire ist ein Bus. Wie willst du da Steckplätze auseinanderhalten.
Naja so auf die Art: OneWire nur mit Steckverbinder 1 verbinden, Rom-Search durchführen, Rom merken, OneWire nur mit Steckverbinder 2 verbinden, Rom-Search, Rom merken... Bis alle durch sind dann OneWire Bus mit allen Geräten verbinden.
Christian A. schrieb: > OneWire nur mit Steckverbinder 1 verbinden, Rom-Search durchführen, Rom > merken, OneWire nur mit Steckverbinder 2 verbinden, Rom-Search, Rom > merken... Das geht natürlich, aber macht der Bus dann noch Sinn? Wenn du eh 8 Pins schalten musst, kannst du dann nicht gleich 8 Pins vom µC als 1-wire Busse nehmen?
Der Rächer der Transistormorde schrieb: > Das geht natürlich, aber macht der Bus dann noch Sinn? Wenn du eh 8 Pins > schalten musst, kannst du dann nicht gleich 8 Pins vom µC als 1-wire > Busse nehmen? Du brauchst nur 4 Pins 1x 1-Wire 3x Multiplexer
Der Rächer der Transistormorde schrieb: > Das geht natürlich, aber macht der Bus dann noch Sinn? Wenn du eh 8 Pins > schalten musst, kannst du dann nicht gleich 8 Pins vom µC als 1-wire > Busse nehmen? Die Zuordnung von Sensor-ID zu Messpunkt macht man einmal manuell bei Inbetriebnahme. Ausserdem ist es ohnehin sinnvoll, die Sensoren einzeln manuell abhängen zu können, um einen defekten Sensor identifizierbar zu machen. Ein Bus erspart Pins und Leitungen, hat aber auch Nachteile. Wie etwa einen Totalausfall aller Sensoren bei Kurzschluss von einem. Hat man mit Pins und Kabeln kein Problem, dann sind separate Leitungen besser.
Es muss eine Lösung geben. Ich bilde mir ein, bei Maxim eine App note für sowas gesehen zu haben. Ich weiss auch von Firmen, die jeweils einen kleinen 1 Wire Serial Chip auf ihre Platinen löten die alle an einem Bus hängen. Via Fernwartung ist es möglich den Bus zu scannen und so über die ID der Chips herauszufinden welche Platinen mit welchem Revisionlevel in welchem Gerät verbaut sind (Die ID's werden bei Inbetriebnahme in einer DB erfasst) Allerdings ist es vermutlich einfacher dem System die ID mitzuteilen wenn man das selbst baut. Ich kann mir vorstellen, daß solch eine Scansoftware nicht so trivial ist.
Wenn man die ID von Sensoren oder ID-Chips vor dem Einbau ins Gesamtsystem einzeln in einer Datenbank erfasst, dann löst sich das Problem in Luft auf. Im Fall von extern einzeln verdrahteten Sensoren beispielsweise kennt man dann die ID jedes angeschlossenen Sensors bereits vor der Integration in das Gesamtsystem und muss lediglich die Zuordnung von ID zu Messpunkt ins Zielsystem einkonfigurieren.
>Möchte beim Startup ermitteln, welche ROM-Adresse an welchem Port hängt.
Du hast jeden Sensor an einem eigenen Port hängen, oder interpretier ich
diesen Satz falsch?
Gibts ne Skizze?
Also, solange die Sensoren an einem Bus hängen geht das. Gibt ne APN von Atmel. Unter Bascom würde es in etwa so aussehen, so mach ich es bei meinem Datalogger mit fast beliebig vielen 1820er dran: (Codeauszug)
1 | Chip_anz = 0 |
2 | Gl_errorcount = 0 |
3 | |
4 | Do |
5 | If Chip_anz = 0 Then |
6 | Chip_data(1) = 1wsearchfirst() |
7 | Else |
8 | Chip_data(1) = 1wsearchnext() |
9 | End If |
10 | If Err = 0 Then ' wenn lesen ohne Fehler |
11 | 1wverify Chip_data(1) ' checken |
12 | If Err = 0 Then ' auch kein Fehler |
13 | Incr Chip_anz ' Anzahl erhöhen |
14 | Print #1 , "Chip " ; Chip_anz ; " ID: "; ' ID ausgeben |
15 | For Gl_count = 1 To 8 |
16 | Print #1 , Hex(chip_data(gl_count)) ; " "; |
17 | Next gl_count |
18 | Gl_errorcount = 0 |
19 | Print #1 , "" |
20 | Else |
21 | Print #1 , "ERROR VERIFY, CHIP IGNORED " ; Gl_errorcount |
22 | Err = 0 |
23 | Incr Gl_errorcount |
24 | If Gl_errorcount = 100 Then Err = 1 |
25 | End If |
26 | Else |
27 | Incr Gl_errorcount |
28 | If Gl_errorcount = 100 Then Err = 1 |
29 | End If |
30 | Loop Until Err = 1 |
31 | |
32 | Print #1 , "FOUND " ; Chip_anz ; " DEVICES" |
33 | Print #1 , "CHIP READING END{013}{010}" |
Damit bekommst du 'raus welche Seriennummern am Bus hängen, jedoch nicht wo sie sich befinden. Du must dann doch alle 'mal kurz vom Bus nehmen um zu erkennen welcher wo sitzt.
Es handelt sich um 8 Temperatursensoren die unterschiedlich positioniert sind. Daher möchte ich wissen welche ROM-ID an welchem Port hängt. Wenn ein Sensor ausfällt, soll einfach ein neuer eingesteckt werden können. (Ohne ROM-ID vorher auslesen und so weiter) Ich dachte auch schon daran einen MUX zu verwenden, um beim Startup die Sensoren einzeln ansprechen zu können. Nur der MUX ist dann immer am Bus und ich muss immer umschalten, auch beim temperaturlesen von allen Sensoren. Das finde ich eher unschön.
Wenns nur darum geht einen einzelnen zu tauschen, dann reicht es ja ganz am Anfang auf die Tippel-Tappel-Tour alle Ids zu ermitteln und dann die Zuornung per Hand zu machen. Wenn dann im laufenden Betrieb einer ersetzt wird, dann reicht ja ein Rom-Search und die neu gefundene Id kommt in die Stelle in der Tabelle an der kein Sensor geantwortet hat. Wie gesagt, geht aber nur bei einem zur gleichen Zeit.
Christian A. schrieb: > Wenn ein > Sensor ausfällt, soll einfach ein neuer eingesteckt werden können. > (Ohne ROM-ID vorher auslesen und so weiter) Dann solltest du separate Pins oder einen Multiplexer verwenden. > Das finde ich eher unschön. Tja, entweder Skylla oder Charybdis.
Christian A. schrieb: > Daher möchte ich wissen welche ROM-ID an welchem Port hängt. Wenn ein > Sensor ausfällt, soll einfach ein neuer eingesteckt werden können. > (Ohne ROM-ID vorher auslesen und so weiter) 1. Im einfachsten Fall klemmst Du die Sensoren der Reihe nach an, während der Master ständig mit ROM-Search neue Sensoren sucht. Danach hast Du im Master (EEPROM) genau die gleiche Reihenfolge stehen, wie Du sie angeschlossen hast. Tauschst Du einen Sensor aus, stimmen noch alle anderen, nur einer fehlt und einer ist neu. Da kann man dann zum Tastendruck auffordern, um den Eintrag des fehlenden mit dem des neuen zu überschreiben. 2. Jeder Sensor hat ja 2 Byte EEPROM, darin kann man dann die Meßstellennummer ablegen. Entweder man konfektioniert sie einzeln entsprechend vor. Oder der Master fordert dazu auf, einem neuen Sensor mit ungültigem Eintrag eine Nummer zuzuweisen. Es gibt bestimmt noch weitere Möglichkeiten, der Phantasie des Programmierers sind da keine Grenzen gesetzt.
Guten Morgen... ...wenn alle 8 Sensoren "steckbar" sind. ... wieso nicht einfach alle Sensoren abziehen, den ersten Aufstecken, scannen, Position notieren, nächsten aufstecken usw usf. ... dann hat man eine Zuordnung der IDs zur Position. ... das Programm sagt dann "Sensor an Position 4 defekt, bitte tauschen", weil in der Tabelle die ID eingetragen wurde. ... bei "Neustart" wird dann - wie schon erwähnt - die neue ID an die Stelle gesetzt, wo der nicht antwortende Sensor lag. (Nichts anderes macht ja der Multiplexer. Der könnte im übrigen auch 10 Positionen nutzen: 1-8 für die Sensoren einzeln, 9 für "alle Sensoren", 0xA für alle aus, wenn benötigt...)
Aus diesem Grund nehme ich pro Sensor einen eigenen Port(Pin). Die Bus-Verschaltung macht für normale Anwendungen wenig Sinn. Denn dort muss man exakt wissen welchen Sensor man gerade anspricht. Und somit muss man alle Sensoradresse vorher erfassen. Das ist ein riesiger Overhead, und ein defekter Sensor braucht eine erneute Erfassung. Darum einfach pro Sensor einen Pin (ist doch immernoch Ressourcenschonend dank 1-Wire). Dann kann jeder Sensor per PlugnPay eingesteckt werden, der Controller weiß sofort wo welcher Sensor ist und man spart sich Datenbank und Routinen fürs erfassen. Man braucht halt eine 1-Wire-Lib welche das schnelle ändern des 1-Wire-Pins erlaubt. Hab ich mir aber selber geschrieben. gruß cyblord
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.