Forum: Mikrocontroller und Digitale Elektronik Bestimmung welcher One Wire Sensor an welchem Steckverbinder hängt?


von Christian A. (ferrice)


Lesenswert?

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

von Michael A. (Gast)


Lesenswert?

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.

von Christian A. (ferrice)


Lesenswert?

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.

von Der Rächer der Transistormorde (Gast)


Lesenswert?

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?

von icke (Gast)


Lesenswert?

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

von (prx) A. K. (prx)


Lesenswert?

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.

von Christian B. (luckyfu)


Lesenswert?

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.

von (prx) A. K. (prx)


Lesenswert?

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.

von spontan (Gast)


Lesenswert?

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

von Joachim R. (bastelbaer)


Lesenswert?

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}"

von Einhart P. (einhart)


Lesenswert?

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.

von Christian A. (ferrice)


Lesenswert?

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.

von temp (Gast)


Lesenswert?

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.

von (prx) A. K. (prx)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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.

von Funk (Gast)


Lesenswert?

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

von Cyblord -. (cyblord)


Lesenswert?

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
Noch kein Account? Hier anmelden.