Forum: Mikrocontroller und Digitale Elektronik 1-Wire-Busadressen


von chris (Gast)


Lesenswert?

Hallo,
kann mir jemand erklären wie im 1wirebus die Adressen vergeben werden?
Ich kann mittels WINAVR und den entsprechenden Bibliotheken ohne
weiteres die Temperaturen von mehreren DS18x20 auslesen. Auch die
entsprechenden IDs bekomme ich heraus. Aber im Bus müssen da ja noch
die Adressen vergeben werden. Ich sehe aber keine Funktion wo dies
geschieht. Machen sich das die Sensoren selbst untereinander aus??

Ich möchte halt gerne gesondert die IDs auslesen und in einem anderen
Programm diese Manuell eingeben und dann den einzelnen Sensoren jeweils
eine spezielle Variable zuweisen.

so ungefähr:
Temperatur1 = Wert vom Sensor mit der ID 16,63,61,...
Temperatur2 = Wert vom Sensor mit der ID xxx
Hat sowas schon jemand gemacht?


Bzw. wie kann ich den einzelnen Sensoren bestimmte Busadressen
zuweisen?

Gruß,
Christian

von A.K. (Gast)


Lesenswert?

Die werden vom Hersteller vergeben.

von peter dannegger (Gast)


Lesenswert?

Die IDs sind die Adressen, d.h. mit dem Match-ROM Kommando wählst Du
einen bestimmten Sensor aus.

Peter

von chris (Gast)


Lesenswert?

Hallo nochmal,
das verstehe ich jetzt nicht. Beim 1-Wire-Bus kann ich doch maximal 255
Senoren anschließen. Bzw. ich gebe ja in der onewire.h den Adressbereich
von 0x00 bis 0xff an. Daraus hätte ich jetzt abgeleitet, daß die
Busteilnehmer noch eine Adresse im Bus zugewiesen bekommen.

Die IDs sind für mich nur so was wie eine Seriennummer. Liege ich da
falsch?

Bei WinAVR wird beim ow_search doch immer die aktuell gefundene
Busadresse in der Variable "diff" abgelegt, ausserdem gibt er die
Funktion die ID zurück bzw. beschreibt das Array id[]. Daraus wird den
Sensortyp geschlossen (z.B. DS18S20 oder DS18B20). Dann wird der Befehl
zum auslesen gesendet, die Empfangenen daten im Array SP abgelegt und
entsprechend umgerechnet.

Die ID spielt doch da nirgends eine Rolle oder?

Gruß,
Chris

von A.K. (Gast)


Lesenswert?

Die IDs sind die Adressen. Arbeitsweise, auch in den Datasheets, ANs etc
nachzulesen:
- Reset
- Per MATCH ROM die ID des gewünschten Bausteins auswählen
- Mit diesem Baustein reden.

Irgendein onewire.h beschreibt die konkrete Implementierung eines
Software-Interfaces, nicht die 1-Wire Hardware. Es gibt genug Dokus und
ANs von Dallas/Maxim und anderen.

von peter dannegger (Gast)


Lesenswert?

"Bzw. ich gebe ja in der onewire.h den Adressbereich von 0x00 bis 0xff
an."

???

Was ist denn die "onewire.h" ?

Wenn Du Dich auf ein bestimmtes Softwarebeispiel beziehst, dann mußt Du
uns das auch zeigen (z.B. als Link oder Dateianhang).
Es gibt schließlich tausende 1-wire Programme, die niemand alle kennen
kann.

Und in einer *.h-Datei wird nichts angegeben, sondern die wird
includiert und dann das zugehörende Objekt dazugelinkt.


Theoretisch kannst Du 2^48 Sensoren an einen 1-wire anschließen,
praktisch begrenzt die maximale Buslast und die Leitungslänge die
Anzahl.


Hier ist ein Beispielprogramm von mir:

http://www.mikrocontroller.net/forum/read-4-84831.html#new


Peter

von chris (Gast)


Lesenswert?

Hallo Peter,

was in deinem Beispiel die 1wire.h ist bei mir halt die onewire.h. hat
prinzipiell den gleichen inhalt. Bei dir steht ja auch wie folgt
drinnen:
#define  SEARCH_FIRST  0xFF    // start new search
und
#define LAST_DEVICE  0x00    // last device found

In deiner 1wire.c Funktion w1_rom_search zählst du dann auch von 0xff
auf 0x00 runter. Wenn du bei 0x00 angekommen bist ist der letzte
Teilnehmer gefunden. Die Grundfunktionen sind bei mir genau gleich. nur
teilweise statt char mit uint gearbeitet usw.
Aber das Prinzip ist gleich.

Zunächst mal danke an euch beide. Ich bekomme mitlerweise schon böse
Blicke von hinten zugeworfen. Muß also meine weiteren Tätigkeiten auf
nächstes Wochenende verschieben, da ich unter der Woche nicht die
Möglichkeit habe.

Ich muß mir das dann nochmals alles durch den Kopf gehen lassen.
Vielleicht komme ich ja dann doch noch drauf.


Gruß,
Chris

von peter dannegger (Gast)


Lesenswert?

"In deiner 1wire.c Funktion w1_rom_search zählst du dann auch von 0xff
auf 0x00 runter. Wenn du bei 0x00 angekommen bist ist der letzte
Teilnehmer gefunden."


Dieser Wert zählt nicht sondern geht willkürlich rauf und runter.

Er ist die Nummer des Bits, welches als nächstes gewechselt werden muß.
Muß kein Bit mehr gewechselt werden, d.h. sind alle Sensoren erkannt,
dann bleibt er Null.

Jeder Eingabewert über 56 (also z.B. 255) startet die Suche neu und
allein der Ausgabewert 0 bedeutet, daß die Suche beendet ist. Alle
anderen Werte sind im Bereich 1..55 und haben keine bestimmte Aussage.

Er ist eben nur eine interne Variable der Suchroutine.


Peter

von Profi (Gast)


Lesenswert?

Peter kennt sich sehr gut mit 1wire aus:
Du mußt wissen, dass nach dem Befehl ow-search ein Sensor selektiert
ist, eine extra Selektion ist nicht mehr notwendig.
Du kannst eine Tabelle mit allen Adressen Deiner Sensoren anlegen.
Du kannst aber auch im eeprom eines jeden Sensors eine "logische" von
Dir vergebene Nummer programmieren, damit Du nach dem Search weißt,
welcher Sensor selektiert ist.

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.