Ein kleiner Versuch einen möglichen Suchalgorithmus auf einem 1-Wire Bus darzustellen. Die APPLICATION NOTE 187 "1-Wire Search Algorithm" - Maxim war in manchen Punkten etwas verwirrend. Programmablauf: - MASTER sendet ein RESET - MASTER sendet F0h - MASTER empfängt BIT(A) - MASTER empfängt BIT(B) - MASTER berechnet und sendet das Antwortbit Mit dem Antwortbit ist es möglich, SLAVES "ruhigzustellen", d.h. weitere Bits werden von den betroffenen Slaves nicht mehr gesendet, bis ein RESET erfolgt. Beispiel: Master empfängt vom SLAVE-1 eine 0 Master empfängt vom SLAVE-2 eine 1 Master sendet eine 0 SLAVE-2 hat Pause ! Dieser Suchmechanismus funktioniert nicht nur bei Temperatursensoren. Bernhard
Einige Programmierbeispiele: Beitrag "DS1820 DS18s20 Digital Thermometer 1-wire Beispiele ATmega8 Assembler"
Was willst du damit sagen? An sich ist sowas ja nicht allzu kompliziert, im Prinzip läufts wie ne Traversierung eines nicht-vollständigen binären Baumes ab.
Von 10 (DS18s20) Slaves habe ich den ROM Code ausgelesen und die Bytes untersucht bei denen "Diskrepanzen" zwischen (A) und (B) auftreten. Und einen möglichen Suchalgorithmus dargestellt. Beim ersten Suchlauf antwortet der Master mit einer "NULL" wenn Diskrpanzen auftreten. Beim zweiten Suchlauf wird die letzte "Null" vom ersten Suchlauf duch eine "1" ersetzt und auf weitere Diskrpanzen in diesem Suchlauf mit einer NULL geantwortet. Die Suchläufe stoppen, wenn in einem Suchlauf nur noch "1" als Antwort kamen. Bernhard
Bernhard S. schrieb: > Die APPLICATION NOTE 187 "1-Wire Search Algorithm" - Maxim war in > manchen Punkten etwas verwirrend. Kannst Du das näher erläutern? Ich finde, sie bringt es genau auf den Punkt. Ich wüßte auch nicht, wie man es anders machen sollte. Hier meine Implementation des Algorithmus: Beitrag "DS1820, DS18B20 in C" Jeder Aufruf gibt die gefundene ID zurück und die Nummer des letzten Diskrepanz-Bits. Beides wird dann für die nächste Suche benötigt. Der gefundene Sensor ist dadurch adressiert und kann ausgelesen werden. Gibt es kein Diskrepanz-Bit mehr, dann hat man alle Sensoren gefunden. Peter
Peter Dannegger schrieb: > Kannst Du das näher erläutern? > Ich finde, sie bringt es genau auf den Punkt. > Ich wüßte auch nicht, wie man es anders machen sollte. Du hast bestimmt Recht, doch zum damaligen Zeitpunkt war mir die ganze Problematik etwas suspekt (ist es auch jetzt noch). Daraufhin erstellte ich mir ein paar Zahlenbeispiele und suchte nach einem Suchalgorithmus. Ich habe aber momentan den verdacht, dass ich das Fahrrad nocheinmal erfand. Ich fasse nochmal zusammen: - jeder Suchlauf gibt eine gültige ROM ID aus - beim ersten Suchlauf antwortet der Master bei jeder Diskrepanz mit einer "0" - die letzte "0", also die letzte Diskrepanz, eines Suchlaufes wird beim darauffolgenden Suchlauf durch eine "1" ersetzt (rote Pfeile). Entstehen dadurch neue Diskrepanzen, dann wird konsequent mit einer "0" geantwortet - im neuen Suchlauf müssen die führenden "1en" beibehalten werden, die vorher schon auf "1" gesetzt wurden (blaue Pfeile). - die Suche endet, wenn in einem Suchlauf nur noch "1en" auf Diskrepanzen geantwordet wurde. Vielleicht erkennt man das Verahren in der PDF. > Jeder Aufruf gibt die gefundene ID zurück und die Nummer des letzten > Diskrepanz-Bits. > Beides wird dann für die nächste Suche benötigt. > Der gefundene Sensor ist dadurch adressiert und kann ausgelesen werden. > Gibt es kein Diskrepanz-Bit mehr, dann hat man alle Sensoren gefunden. Unterscheidet sich "Dein" Suchmechanismus von "meinem"? Bernhard
Ich habe mir erlaubt, den Search Algorithmus zu überarbeiten. Inwiefern er sich der AN187 ähnelt oder unterscheidet, kann ich nicht sagen. Beispiel eines 1wire Testers (Master) Beitrag "1wire Slave Tester ATmega8 Assembler"
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.