Hallo, habe ein paar Fragen zum Temperatursensor DS1820. Er ist richtig angeschloßen und DQ über 4,7 KΩ an Vcc angeschloßen. 1. Wie muss ich das auf Low schalten verstehen? Heißt das, den µC Pin auf Ausgang und Low zu schalten, oder ist das anders gemeint? Wenn ja muss ich beim Auslesen dann erst wieder auf Eingang schalten. Soweit richtig? 2. Wie wird das Signal vom µC ausgelesen? Ich weiß dass er die Leitung auf immer wieder Low schaltet. Aber wie kann ich die einzelnen Impule registrieren? Per while, oder for Schleife solange den Pin auslesen bis er wieder dauerhaft High ist? 3. Sendet er nach dem Init automatisch regelmäßig im Sekundentakt die gemessene Temperatur? Oder muss ich die immer wieder abfragen? 4. Wie kann ich aus dem ausgelesenen Bits die Temperatur berechnen? Laut Datenblatt sendet er ein 9-Bit Signal. Das wären soweit meine Fragen (vorerst :-D).
Ein Beispiel findest Du u.a. hier: http://mcu.emea.fujitsu.com/mcu_product/mcu_all_software.htm 90xxx_hw_ds1820-v10.zip This example provides the basic routines to connect a Fujitsu microcontroller to a 1-wire device from Dallas Semiconductor. Gruß, Toemi
Hallo, zu 1. Das ist richtig zu 2. Wenn der Master seine Busleitung auf Eingang schaltet, wird das Signal entweder kurzfristig vom Pullup wieder auf "1" gezogen oder ein Slave hält das Signal für eine bestimmte Zeit weiter auf "0". Diese Zeit muß gemessen werden. zu 3. Der Slave (DS1820) sendet nichts von allein. Alle Aktivitäten gehen vom Master aus. zu 4. Die Temperatur wird im Zweierkomplement übertragen. Die Darstellung hängt vom Chip ab (DS1820, DS18B20, DS1822 etc.) und steht im Datenblatt. Gruß Joachim
Zu 3. dachte ich mir das fast schon. Also muss ich ihn jedesmal darum bitten mir die Temperatur zu sagen :-) Zu 2. ist mir das noch nicht ganz klar. Wenn ich die Zeit messe habe ich ja erst ein Bit. Brauche aber 9. Laut Datenblatt sendet er immer solche Daten: 0000 0000 0000 0000 für 0°C 0000 0000 1010 1010 für +85°C usw. Ka wie ich damit auf 9-Bit komme und wie ich die Daten sammel. Deswegen dachte ich da an eine Schleife zum auslesen und sammeln der Bits. @Werner Die Datei schaue ich mir gerade an :-)
>Ka wie ich damit auf 9-Bit komme und wie ich die Daten sammel. Deswegen >dachte ich da an eine Schleife zum auslesen und sammeln der Bits. Ach, dachtest du! Spiel mit Barbie Puppen ;)
>Ach, dachtest du! >Spiel mit Barbie Puppen ;) Schenkst du mir eine? Ich weiß leider nicht wo man sowas bekommt. Nach deiner Aussage soll ich das denken sein lassen. HILF MIR DOCH Wenn du nichts sinnvolles dazu beitragen willst, müll doch andere Themen zu. Die anderen Poster wird das sicher sehr freuen :-)
>Schenkst du mir eine? Ich weiß leider nicht wo man sowas bekommt. Nach >deiner Aussage soll ich das denken sein lassen. HILF MIR DOCH Wobei? Du glaubst doch nicht im Ernst das du hier durch zwei oder drei Fragen zum Programmierer wirst? Das Timing der 1 Wire Sensoren wirst du nicht verstehen. Und das kann dir auch keiner mal eben so beibringen.
Das Timing ist mir vollkommen klar! Darum ging es nie. Es geht mir nur um die AUSWERTUNG. Wie muss ich das umrechnen damit da sinnvolle Wert rauskommen. Aber langsam wirds durch ewigs ausprobieren schon noch was. Noch eine Sache: Falls es irgendeine fertige Funktion im µC gibt, die HEX direkt nach Binär umrechnet und umgekehrt, so möge man es mir mitteilen :-)
Der Tonfall der Antworten lässt zwar etwas zu wünschen übrig, aber deine Postings legten nahe, dass du praktisch garnichts vom Protokoll der Sensoren jenseits des einzelnen Bits verstanden hast. Was bedeutet, dass der Versuch hier zu helfen bei Adam und Eva anfangen müsste und nicht jeder schätzt die Aussicht darauf. Deshalb die etwas brüske Reaktion.
Dann sagt halt gleich dass ihr mir nicht helfen wollt. Hätte uns einiges an Zeit erspart :-) Naja auch egal. Dann probier ich halt solange bis es irgendwann funktioniert. cu
NB: Wo taucht beim DS1820 Hex auf? Das Ergebnis ist besagter 9 Bit Wert verpackt in 16 Bits, als halbe Grade. Das Protokoll vom DS1820 ist zwar auf unterster Ebene in Bits zu sehen, darüber allerdings liegt in den meisten Kommandos und Antworten eine Schicht, die in Bytes arbeitet.
Es gibt übrigens jede Menge funktionsfähigen Codes für solche Sensoren. In wahrscheinlich jeder gängigen Sprache. Wenn du also nicht des Lerneffektes wegen das unbedingt neu erfinden willst, dann such mal in der Codesammlung.
Doch es geht mir hauptsächlich um den Lerneffekt. @A.K. Im Datenblatt: 47h usw. Für die Befehle zum Sensor. Mit einer fertigen Funktion umrechnen lassen wäre einfacher und übersichtlicher als alle Hexcodes als 1 und 0 anzugeben. Einige Programme hier im Forum habe ich schon gefunden, und auch benutzt. Aber nur selbst machen bildet. Kopieren kann jeder ;)
Sorry, aber jetzt höre ich auch auf, das hat einfach keinen Sinn. Die einzige Umrechnung zwischen Hex und Binärdarstellung die weit und breit in Sicht ist nimmt dir der Compiler oder Assembler ab. Oder programmierst du den Microcontroller in einzelnen Bits? Seit sogar die PDP11er in den 70ern ihre Klaviere verloren haben ist das etwas aus der Mode gekommen. Apropos: Worin programmierst du?
>Einige Programme hier im Forum habe ich schon gefunden, und auch >benutzt. Aber nur selbst machen bildet. Kopieren kann jeder ;) Ja dann mach doch. TU ES! Wozu Fragen stellen? DU kannst es! Hopp, hopp, hopp ran ans Werk!
In C. Ich kenn bisher keine einfache Umrechnung für einen Pin. Für einen ganzen Port ist mir das klar. PORTX = 0xFF; usw. Aber wie man einen Hex-Wert auf nur einen Pin schreibt noch nicht so. PINX = 0xFF? Wohl eher nicht. Ich habe das jetzt so gelöst dass ich die einzelnen Bits per Schleife sende. Aber da gibt es garantiert eine bessere Möglichkeit. @dummy Hier--> http://www.zooplus.de/bilder/leckerlimix/fr/hunde/semimoist/1/300/47229_Dibo_Leckerli_Mix_1.jpg Ein paar Leckerlis für dich ;)
Hi Loooooool, koennte mir gut vorstellen das du mit Bascom gut arbeiten koenntest. Ich benutze es selbst weil ich mich um viele sachen nich kuemmern muss, im gegenzug ist der Code halt nich total ausgefeilt. Was solls, dafuer gibt es fertige befehle fuer 1wire etc. So habe ich das DS1820 benutzt: Gettemp: 'temperaturmessen Config 1wire = Portc.i Disable Interrupts 1wreset 'Print Err 1wwrite &HCC Waitms 1 1wwrite &H44 'wandeln 'Print Err Waitms 1 Enable Interrupts Wait 1 Disable Interrupts 'wandeln fertig 1wreset 'Print Err 1wwrite &HCC 'Print Err 1wwrite &HBE Scratch(1) = 1wread(9) 'Print Err Enable Interrupts Return Rein funktonell reicht eigentlich folgendes: Gettemp: 'temperaturmessen 1wreset 1wwrite &HCC Waitms 1 1wwrite &H44 'wandeln Waitms 1 Wait 1 'wandeln fertig 1wreset 1wwrite &HCC 1wwrite &HBE Scratch(1) = 1wread(9) Return Der doppelte(!) Absolutwert der Temperatur befindet sich dann in Scratch(1). (Daher kann des Teil vermutlich bis +127 Grad messen) Das Vorzeichen ist in Scratch(2) das entweder 0(+) oder 256(-) ist. Ob das Interrupt ausschalten wirklich hilft weiss ich nich. Die Err-Prints habe ich nach Bedarf eingebunden oder nicht, es mussten halt genug Nullen dastehen bis es mal laeuft, dann wieder auskommentieren. Auf jeden Fall ist diese Routine dafuer gedacht das ein einzelner Sensor an der Leitung ist, ich habe vorher halt in $i gespeichert welche Leitung es ist (hatte 2 Sensoren). Das zumindest ist ne gute Variante wenn man wie wir nich wirklich durchblickt. Ein weiterer Vorteil von Bascom ist z.B. das es vollkommen egal ist ob man schreibt X=12, X=&H0C oder X=&B00001100 (oder X=3*4). Interessant ist das dann bei Ausgaben, aber da kann man auch mal probieren. Und das beste ist: Du brauchst dich nich um das 1-wire-Timing scheren, es reicht das mal ueberflogen zu haben... HTH, bye uwe
achja, mehrere bits bekommt man wirklich nur auf einen pin wenn man sie hintereinander draufnetzt, es ist ja nur ein Draht, der kann Spannung haben oder nicht oder dann wieder doch usw. Am einfachsten per print variable dann kommt die ganze variable (auch wenn es ein String ist) z.B. an Pin 15 raus (Tx vom AtMega16 in DIP40 Gehaeuse)
LOOOOOOOOOOOOOOOOOL wrote: > In C. Ich kenn bisher keine einfache Umrechnung für einen Pin. Für einen > ganzen Port ist mir das klar. PORTX = 0xFF; Die Umrechnungsfunktion, die ein ganzes Byte ohne Informationsverlust in ein einziges Bit quetscht, die ist noch nicht erfunden worden. Auch nicht von Dallas. Und so wirst du nicht darum herum kommen, die Bits einzeln nacheinander im Gänsemarsch über die Leitung zu jagen. Das kannst du dann selbst programmieren oder bestehenden Code verwenden (Codesammlung, oder das eben erwähnten Basic). Tip: Deine Idee mit der schleife ist schon mal ein guter Ansatz. Wenn du dann noch AND, OR und die Shift-Operatoren von C kennenlernst, dann fällt vielleicht der Groschen.
>Die Umrechnungsfunktion, die ein ganzes Byte ohne Informationsverlust in >ein einziges Bit quetscht, die ist noch nicht erfunden worden. Auch >nicht von Dallas. Und so wirst du nicht darum herum kommen, die Bits >einzeln nacheinander im Gänsemarsch über die Leitung zu jagen. Genau dafür wollte ich ja wissen, ob es eine Funktion gibt die mir den Hexwert in einen Binärwert umwandelt. So hätte ich schon mal alle Bits gehabt. Naja geht wohl nichts am manuellen umrechnen vorbei. Zwar unübersichtlicher, aber ich versteh es schon. Dass ich nicht das ganze Byte auf einmal schicken kann ist mir schon klar. >Das kannst du dann selbst programmieren oder bestehenden Code verwenden >(Codesammlung, oder das eben erwähnten Basic). Tip: Deine Idee mit der >schleife ist schon mal ein guter Ansatz. Wenn du dann noch AND, OR und >die Shift-Operatoren von C kennenlernst, dann fällt vielleicht der >Groschen. Diese Sachen aus C kenne ich schon. Und jetzt ist mir dazu auch was eingefallen. Werde es dann gleich mal ausprobieren. @Uwe Bascom kenne ich schon, habe es aber nie selbst benutzt. Mir gefällt das irgendwie nicht, wenn schon alles fertig gecoded ist und ich fast nur ein paar Bausteine zusammenbauen darf (im übertragenenen Sinn). Ich bin dann mal weiter coden. Thx an alle und auch an dummy den heutigen Forentroll :-)
LOOOOOOOOOOOOOOOOOL wrote: > Genau dafür wollte ich ja wissen, ob es eine Funktion gibt die mir den > Hexwert in einen Binärwert umwandelt. Da gibt es nichts umzurechnen. Dir scheint das Verständis dafür zu fehlen, wie ein Computer arbeitet und was Hex/Binär/Dezimalzahlen eigentlich sind. Mit dem C Befehl unsigned char x = 0x47; steht in der Variablen "x" gleichermassen der Wert 47h als auch der Wert 73 als auch der Wert 0b01000111. Das ist alles schon da. Gleichzeitig. Das sind alles nur alternative Darstellungen des gleichen Bitmusters. Es geht also nur darum, die bereits in der Variablen vorhandenen Bits nacheinander zu übertragen.
LOOOOOOOOOOOOOOOOOL wrote: > Einige Programme hier im Forum habe ich schon gefunden, und auch > benutzt. Aber nur selbst machen bildet. Nö. Man kann sich besser dadurch bilden, indem man die Beispiele anguckt, wie es dort gemacht wird. Und dann kann man auch konkrete Fragen dazu stellen. Ist natürlich aufwendiger, als einfach zu fragen, ob es jemand einem vorkauen kann. Peter
Ich habe zwar einen DS75LV, aber hier ist mein Code, falls es sir hilft:
1 | ********************************************************************************/ |
2 | void tsens_init() { |
3 | |
4 | i2c_master_start(); // start i2c transmition |
5 | i2c_master_write(TEMP_SENS_ADDR);// set slave addr + write mode |
6 | i2c_master_write(0x01); // set pointer to conf register |
7 | i2c_master_write(0x00); // set temp output to 9-bit |
8 | i2c_master_stop(); // i2c stop condition |
9 | |
10 | }
|
11 | ********************************************************************************/ |
12 | unsigned char tsens_get_temp() { |
13 | |
14 | unsigned char u8_temp = 0; |
15 | i2c_master_start(); // start i2c transmition |
16 | i2c_master_write(TEMP_SENS_ADDR); // set slave addr + write |
17 | i2c_master_write(0x00); // set addr pointer |
18 | i2c_master_stop(); // i2c stop condition |
19 | |
20 | i2c_master_start(); // start i2c transmition |
21 | i2c_master_write(TEMP_SENS_ADDR | 1);// set slave addr + read |
22 | u8_temp = i2c_master_read(NACK); // read MS Data Byte |
23 | i2c_master_stop(); // stop i2c transmition |
24 | return u8_temp; |
25 | |
26 | }
|
A***** F***** wrote:
> Ich habe zwar einen DS75LV, aber hier ist mein Code, falls es sir hilft:
Hilft garantiert nicht.
1. sucht er 1-Wire und nicht I2C
2. was kann man mit Code anfangen, der nur nen Haufen unbekannter
Funktionen aufruft?
Überhaupt nichts!
Peter
Hallo, ich will den Faden noch einmal bei der Nachricht vom 07.10 21:55 aufnehmen. zu 3. Du must den Baustein zurücksetzten, dann selektieren und dann das Komando zur Temperaturwandlung geben. Nach ca. 800ms wird der Baustein wieder zurückgesetzt, selektiert und dann ausgelesen. Diese Abfolge gilt für jede Temperaturmessung (Im Datenblatt steht das ausführlich beschrieben) zu 4. Im "Read/Write Time Slot Timing Diagramm" des Datenblattes ist aufgezeichnet, wie der Master ein Bit liest. Dazu wird die Busleitung für mindestens 1us auf "0" gelegt. Danach (vor dem Ablauf von 15us) wird der Bus abgetastet. Liegt der Bus auf "0", dann hat der Slave eine "0" gesendet. Andernfalls eine "1". Hast Du das Diagramm im Datenblatt gefunden und verstanden? Gruß Joachim
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.