Mehrere DS18S20 auslesen Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte
Autor |
|
|
|
BID = 643179
Kleinspannung Urgestein
Beiträge: 13359 Wohnort: Tal der Ahnungslosen
|
|
Hallo!
Also erst mal für diejenigen,die das nicht aus dem Handgelenk wissen.
Der DS18S20 ist ein (halbwegs genauer) 1-Wire Temperatursensor.
Datenblatt hab ich mal angehängt.
Einen davon auslesen und dessen Wert mit Nachkommastell auf Display anzeigen hab ich ja schon geschafft.
Ich geb zu,das ich mir die Code-Schnippsel aus dem Net zusammengeklaut habe,da ich allein zu dämlich dafür bin.Aber man muß ja nicht alles wissen,es reicht wenn man weiß wo es geschrieben steht.
So,nun kommt natürlich die nächste Schwierigkeitsstufe.
Mehrere davon (es sollen zum Schluß mal drei werden)
Nun hab ich soweit mitbekommen,das die Vorgehnsweise wohl immer die gleiche ist.
Die (einmalige) ID der Sensoren auslese,in einem Array speichern und damit dann den Sensor ansprechen und zur Herausgabe seines Meßwertes zu überreden.
Ist aber nach meinem Gefühl etwas aufwändig und Ressourcenverschwendung.
Außerdem tippt man sich die Finger wund.
Bei zwei oder drei mag das ja noch gehen,aber ich hab mir sagen lassen,das am 1-Wire auch 100 oder so gehen würden.
Na dann erst...
Nun hab ich in einem von den 3000 schlauen Foren gelesen,das da einer das anders löst.Nur leider hat er nicht genau verraten wie.
Seine Aussage war diese:
Jeder DS18S20 hat 2 Byte EEProm,die eigentlich dafür da sind um einen (Benutzerdefinierten) min/max Wert einzutragen,bei welchen der Sensor ein Alarmsignal auslöst/auslösen kann.
(wie man auf den EEProm was schreibt,bekomme ich evtl. noch hin,aber da bin ich mir auch noch nicht so ganz sicher)
Nun meinte der Typ,das es reicht wenn man in diesen Speicher eine einmalige "Meßstellennummer" schreibt,und den Sensor damit anspricht.Somit könnte man sich das ganze ID Auslesungs und Sende gewurschtel sparen.
So,nun die 1.000.000 € Frage:
Geht das ?,Wenn ja wie?
Falls es geht,kann das einer so erklären,das es ein alter minderbemittelter Mann mit rudimentären Bascomkenntnissen auch begreift?
_________________
Manche Männer bemühen sich lebenslang, das Wesen einer Frau zu verstehen. Andere befassen sich mit weniger schwierigen Dingen z.B. der Relativitätstheorie.
(Albert Einstein) |
|
BID = 643743
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
|
Soo,
Das geht über den Befehl ROM SEARCH.
Hier weitere Links, die ich gefunden habe (nachdem ich das Datenblatt komplett gelesen habe ).
Du kommst aber nicht drumrum, zu Beginn die entsprechenden Sensoren mit ihrer Nummer zu beschreiben! Später, also nach einmaliger Beschreibung des ROMs kannst du dann indirekt über die Nummer adressieren - bzw. es antwortet einer mit Temperaturwert und dem Inhalt aus dem EEPROM (deiner Nummer).
Die kannst du dann gleich als Index für eine Tabelle (-> Array) benutzen.
Alternativ könnte man die ID (8 Byte) auch in einer Tabelle anlegen und mithilfe eines Indizes die ID auslesen und den entsprechenden Wert in eine Tabelle mit gleichem Index schreiben, in C etwa so:
char sensor1[8] = {ID0, ..., ID7};
char sensor2[8] = {ID0, ..., ID7};
char *sensors[] = {&sensor1[0], &sensor2[0]};
char temperatur[sizeof(sensors / 8)];
for(i=0;i<(sizeof sensors)/8; i++)
temperatur[i] = lese_temperatur(sensors[i]);
/* sprich: der Temperaturwert von Sensor i wird im Vektor temperatur mit dem Index i gespeichert */
Vektor, Feld, Array -> alles dasselbe.
Es kommt nun aber v.a. drauf an, wie das System gestaltet ist: kommen keine neuen Sensoren hinzu, kann man die IDs einmalig auslesen und im EEPROM in einer Tabelle speichern. Will man das dynamisch haben, dann wird es schwieriger, da zu jedem Systemstart der Bus gescannt werden muss.
Hier die Links:
1.
2.
Sorry, in Basic kann ich den Sachverhalt nicht richtig kodieren. Es geht auch ums Prinzip, wie man die Sensoren indiziert auslesen kann.
_________________
[ Diese Nachricht wurde geändert von: DonComi am 28 Okt 2009 16:52 ] |
|
BID = 643828
Kleinspannung Urgestein
Beiträge: 13359 Wohnort: Tal der Ahnungslosen
|
Danke erst mal!
Einen von den Links kannte ich schon,der andere war allerdings neu für mich.
Dort machen die Jungs das in etwa so,wie ich mir das auch zusammengereimt habe.Nur leider halt in C und/oder Assembler.
Lass mich mal zusammenfassen,ob ich das jetzt wenigstens vom Prinzip her begriffen habe.
Das ich die IDs erst mal auslesen muß ist klar.Sonst weiß ja keiner wer wer ist...
Wenn ich die hab,ordne ich jeder eine "Meßstellennummer" zu,die ich dann in den EEProm des jeweiligen schreibe.
Das müßte/sollte man aber nach einem einmaligen Durchlauf wieder rausnehmen(so keine Sensoren dazukommen/erneuert werden),da er das soinst bei jedem Programmstart macht und die Speicherzellen des Sensors sich nach einer gewissen ZAhl an schreibzugriffen ins Nirvana begeben.
Soweit richtig bisher?
Wenn ich das im Griff hab,brauch ich dann später nur einmal das Kommando zum messen und konvertieren senden und nur einmal warten bis die Jungs sich da ausgekäst haben.(Bei Nicht-Parasite-Modus reichen da nach meinen "Tests" 300ms.)
Dann kann ich die daten in einem "Rutsch" lesen ,und kann sie anhand der Meßstellennummer verarbeiten und sortieren.Und ich müßte ja eigentlich auch nur die ersten vier Bytes der Sensoren auslesen.Im ersten steht die Temp.,im zweiten das Vorzeichen und im dritten/vierten dann "meine" Nummer.
Richtig???
Wie ich das dann allerdings programmiertechnisch löse steht auf einem völlig anderen Blatt.Mit Arrays etc. steh ich nämlich nicht erst seit gestern auf Kriegsfuß.
Aber der Winter ist lang,und ne neue Arbeit vorläufig nicht in Sicht.
_________________
Manche Männer bemühen sich lebenslang, das Wesen einer Frau zu verstehen. Andere befassen sich mit weniger schwierigen Dingen z.B. der Relativitätstheorie.
(Albert Einstein)
|
BID = 643833
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Im Prinzip richtig.
Dazu auch nochmals den Skip ROM Befehl aus dem Datenblatt studieren .
Da steht Näheres.
Arrays sind prinzipiell (n-dimensionale) Datenfelder mit Index.
Also ist z.B. strenggenommen ein String auch ein Array, also ein Datenfeld.
Lass dich von den Dimensionen nicht abschrecken. Meistens verwendet man eindimensionale, also mit nur einem Index.
In BASIC kann man ein Datenfeld des Typs Byte so erzeugen:
Dim Bytefeld(6) As Byte
Es wird ein 1*6 großes Feld aus Bytes angelegt, der Index beginnt bei 0.
Ich denke, das kann man gut lernen.
Edit:
Der enorme Vorteil ist, dass man schön drüber iterieren kann:
For I = 0 to 2 Step 1
Temperatur(I) = Lese_Sensor(I)
End For
Hier soll es allerdings etwas anders laufen, nämlich: man fragt, irgendein Sensor antwortet mit Temperatur und seiner Nummer (genaugenommen dem Kam aus dem EEPROM).
Du ließt diesen Kram ein und ordnest anhand dieser Nummer die gelesene Temperatur ein:
_________________
[ Diese Nachricht wurde geändert von: DonComi am 29 Okt 2009 0:09 ]
|
BID = 643838
Kleinspannung Urgestein
Beiträge: 13359 Wohnort: Tal der Ahnungslosen
|
Zitat :
DonComi hat am 29 Okt 2009 00:03 geschrieben :
|
Dazu auch nochmals den Skip ROM Befehl aus dem Datenblatt studieren .
Da steht Näheres.
|
Toll.
Wenn mich einer fragt ob ich englisch kann,antworte ich immer mit:
Yes,a paar Brocken.
Wenn sich mal einer finden würde,der Datenblätter in die einzig mir verständliche Sprache übersetzt,dann würde ich demjenigen jeden Tag ein Gebet widmen.
Offtopic :
| Dazu fällt mir einer von Michael Mittermeier ein.
Bei seinem Amerikaaufenthalt wurde er von einem minderbemittelten Ami gefragt,warum es in Europa so viele verschiedene Sprachen gibt.
Seine Antwort:
Weil Deutschland zweimal den Krieg verloren hat...
|
Zitat :
|
In BASIC kann man ein Datenfeld des Typs Byte so erzeugen:
Dim Bytefeld(6) As Byte
|
Ja,das kenn und kann ich.Aber was man damit dann im Einzelfall so alles anstellen kann...
Zitat :
|
Ich denke, das kann man gut lernen.
|
Ich werd mir Mühe geben.Kann aber dauern.
Manchmal hab ich das Gefühl,das ich von den paar Prozent Gehirn die der Standartmensch so zu nutzen im Stande ist eher im unteren Drittel angesiedelt bin.
Zitat :
|
Hier soll es allerdings etwas anders laufen, nämlich: man fragt, irgendein Sensor antwortet mit Temperatur und seiner Nummer (genaugenommen dem Kram aus dem EEPROM).
Du ließt diesen Kram ein und ordnest anhand dieser Nummer die gelesene Temperatur ein:
|
Genau das ist Sinn und Zweck der Übung.
ICh hab das ja (zumindest mit zwei Sensoren) auch irgendwie ans laufen bekommen.Und nebenbei noch,das jeder der Sensoren bzw. dessen gelieferten Werte einen "PWM-Kanal" steuern und die jeweilige Temp. auf LCD ausgeben können.
Aber bisher läuft das so:
Am Programmanfang werden die IDs der Sensoren ausgelesen und gespeichert.
Jedesmal wenn ins Unterprogramm zum messen gesprungen wird,wird die ID des Sensors gesendet,gewartet bis der mit messen und konvertieren fertig ist,der Wert in verständliche Dezimalzahlen mit Nachkommastelle umgerechnet und angezeigt.Dann das ganze Spiel für den nächsten.
Also macht der arme Mega8 eigentlich die ganze Zeit nichts anderes,als 1-Wire und zu warten bis die ganzen Kumpels da sich ausgemurkst haben.
Nicht das das im Moment stört,das Programm,die Lüfter und das LCD tun so wie ich will.(Zur Zeit erst mal nur auf meinem umgebauten Pollin-AVR-Evoboard .(du kannst dich an das Photo entsinnen?))
Und normalerweise wäre diese "Lüfterregelung" jetzt ja schon "einbaufertig"
Aber mein Ehrgeiz hat mir gesagt,das das wohl auch noch einfacher gehn muß.
Und vielleicht kommt Jornbyte ja auch mal daher,wenn man ihn gebrauchen könnte...
_________________
Manche Männer bemühen sich lebenslang, das Wesen einer Frau zu verstehen. Andere befassen sich mit weniger schwierigen Dingen z.B. der Relativitätstheorie.
(Albert Einstein)
|
BID = 644024
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Ja nun, ist wohl vor allem davon abhängig, ob man es schonmal gemacht hat.
Ich habs halt noch nicht gemacht, daher kann ich nur rein theoretisch helfen.
---
Es müsste übrigens der Skip ROM Befehl sein!
Mein Fehler.
Wie das genau geht, weiß ich auch nicht.
Vielleicht fragst du dazu mal Peter Dannegger? Vielleicht sendet er die den Quellkode vorbei. Daraus kann man zumindest ableiten, wie er vorgeht.
Das Datenblatt erweckt den Eindruck, dass der Skip ROM Befehl nur an einem Gerät funktioniert. Scheint aber nicht der Fall zu sein.
_________________
|
BID = 644067
ElektroNicki Inventar
Beiträge: 6429 Wohnort: Ugobangowangohousen
|
[quote]
Kleinspannung schrieb am 2009-10-29 01:06 :
Zitat :
|
Wenn mich einer fragt ob ich englisch kann,antworte ich immer mit:
Yes,a paar Brocken.
Wenn sich mal einer finden würde,der Datenblätter in die einzig mir verständliche Sprache übersetzt,dann würde ich demjenigen jeden Tag ein Gebet widmen.
|
Welchen Teil vom Datenblatt hättest du denn gerne übersetzt?
(LK: Englisch, Französisch, Physik )
_________________
|
|
Zum Ersatzteileshop
Bezeichnungen von Produkten, Abbildungen und Logos , die in diesem Forum oder im Shop verwendet werden, sind Eigentum des entsprechenden Herstellers oder Besitzers. Diese dienen lediglich zur Identifikation!
Impressum
Datenschutz
Copyright © Baldur Brock Fernsehtechnik und Versand Ersatzteile in Heilbronn Deutschland
gerechnet auf die letzten 30 Tage haben wir 19 Beiträge im Durchschnitt pro Tag heute wurden bisher 12 Beiträge verfasst © x sparkkelsputz Besucher : 182414963 Heute : 6949 Gestern : 7797 Online : 381 27.11.2024 21:37 4 Besucher in den letzten 60 Sekunden alle 15.00 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
|
xcvb
ycvb
0.0306928157806
|