Hallo! Hier ist ein Prg für ein Thermometer mit 7 Segment LED Anzeige. Vielleicht kann es auch ein anderer brauchen! MfG Paul
Und das funktioniert wirklich ? Ich kann nirgends die mindestens 500ms Wartezeit für die Wandlung entdecken und das Busy-Waiting ist ja auch auskommentiert. Wenns also doch funktioniert widerspricht es jedenfalls völlig den in dem Datenblatt angegebenen Methoden. Auch dürfte das Digit0 wesentlich heller leuchten, da ja dann immer die Mainloop länger dauert wegen der 1-wire Sachen. Deshalb multiplexe ich immer im Timerinterrupt. Peter
Hallo Peter! Ja, das funktioniert wirklich! ...und ganz ohne Assembler :-))) Ich konnte nach dem Testen die Busy Abfrage herausnehmen, da es offenbar mit dem Wandeln im DS1820 schneller geht als angegeben. Mit dem letzten Digit hast Du recht; es ist ein kelin wenig heller. Aber es ist scön, wenn einer das PRG im Kopf durchforstet und es nicht nur einfach so hinnimmt! MfG Paul
Ich vermute mal, der DS18S20 ignoriert weitere Startbefehle während der Wandlung und hat ein extra Latch, daß die alte Wandlung ausgibt, solange die neue noch läuft. Da das aber alles undokumentiert ist, würde ich es lieber nicht so machen. Die alten DS1820 hatten jedenfalls während einer Wandlung nur Mist ausgegeben. Für eine 1/10 Grad Anzeige sollte man außerdem nur alle 5s oder noch länger wandeln, da sonst der erhöhte Stromverbrauch während der Wandlung eine merkbare Eigenerwärmung verursacht (+0,1..0,3°). Peter
Hallo Peter! Ich habe mir ein Präzisionsthermometer geliehen, welches am gleichen Messort 0,1 Grad weniger anzeigt. Die Linearität ist im ganzen Bereich gleich gut. Somit bin ich ganz zufrieden mit dem Resultat. Ich habe das Display aus einer alten Personenwaage. Weil es so schön gross ist, (5 cm hohe Ziffern) habe ich halt das Thermometer gebaut. Ich baue schon seit etlichen Jahren Ekeltronikkram, aber noch nicht sehr viel mit MC s. Da ja die Syntax von Assemblern immer eine andere ist, arbeite ich lieber mit Basic oder Pascal. Du schriebst, dass Du lieber im Timerinterrupt multiplext. Davon riet mir mein Arzt auf Befragen ab. Er empfahl statt dessen intravaginale Injektionen! MfG Paul
"0,1 Grad weniger anzeigt" Das ist aber purer Zufall, der Fehler darf ja bis zu +/-1° betragen. Die Eigenerwärmung kriegst Du aber nur so raus, daß Du den Sensor längere Zeit (>30min) im Standby, d.h. ohne Wandlung an ruhiger Luft betreibst und danach die Wandlungen aktivierst. Dann wirst Du ab der 1. Messung ein Ansteigen beobachten und daß ist dann der Fehler durch die Eigenerwärmung. Wenn Dein Arzt was von Timerinterrupts versteht, dann hat er den falschen Beruf und Du solltest ihn schleunigst wechseln. Er kann ja nicht mal Dein Geschlecht erkennen (intravaginale Injektionen!). Peter
Man sollte die Kirche im Dorf lassen. Ich finde es toll, wenn ein Hobbyelektroniker sein Programm ins Netz stellt. Vielleicht ist es Zufall, vielleicht wurde der DS18S20 verbessert, auf jeden Fall scheint es zu funktionieren. Am einfachsten ist es, wenn es der Zweifler selbst ausprobiert und dann sein Ergebnis mitteilt. Mit Pauschalaussagen ist niemanden gedient.
@Henning "Am einfachsten ist es, wenn es der Zweifler selbst ausprobiert und dann sein Ergebnis mitteilt. Mit Pauschalaussagen ist niemanden gedient." Ich habs ausprobiert und dabei besagte Eigenerwärmung beobachtet. Es geht ja auch aus dem Datenblatt hervor: Standby: 1µA Active: 1,5mA Und 5V * 1,5mA = 7,5mW sind schon beträchtlich. Das wird Dir auch jeder bestätigen, der andere Sensoren (z.B. PT100) nimmt. Es sei denn, man will die Erwärmung absichtlich haben, z.B. um die Strömungsgeschwindigkeit zu messen. Peter
@Henning: Wem wäre dann geholfen, wenn Codebeispiele hier vorgestellt werden, von denen man nicht sicher sein kann, daß sie funktionieren? Einem Anfänger ohne Referenzwissen? sicher nicht. Einem ders sowieso schon besser weiß? der braucht das Codebeispiel nicht. Also kritische Betrachtung ist enorm wichtig. Peter konnte sogar die Nebenwirkungen (LED heller) aus dem Code rauslesen. Und das das Originalprogramm sich nicht um das Timing/Ausleseintervalle usw. kümmert, mag in diesem Falle funktionieren - im Nachbaufalle aber evtl. nicht! ---- (QuadDash).
Hallo Männer und Frauen! Ich habe das Prg für ein simples Zimmerthermometer geschrieben. Es erhebt keinen Anspruch auf absolute Genauigkeit und Perfektion. Ich denke, +/- 0,1 Grad reichen für das Wohnzimmer.:-)) Wenn sich aber jemand berufen fühlt, Verbesserungen und ent- sprechende Änderungen einzuarbeiten: Feuer frei! Es werden ohnehin nicht viele Codebeispiele in das Forum gestellt; da dachte ich mir nichts Böses. Mfg Paul
@Paul, "Ich habe das Prg für ein simples Zimmerthermometer geschrieben. Es erhebt keinen Anspruch auf absolute Genauigkeit und Perfektion." das hat ja auch niemand verlangt. Aber es muß schon erlaubt sein, Verbesserungsmöglichkeiten zu benennen. Ob Du sie auch ausprobierst ist allein Deine Sache. Ich freue mich jedenfalls immer, wenn jemand was zu meinen Beispielen schreibt und besonders, wenn er anderer Meinung ist oder Verbesserungen findet, denn nur dadurch kann man lernen. Und wenn Du nicht weißt, was "multiplexen im Timerinterrupt" bedeutet, dann brauchst Du das nur zu sagen, das nimmt Dir keiner übel. Aber dann blöde Sprüche abzulassen, das ist nicht schön :-( Das hat auch nichts mit Assembler zu tun, auch in Bascom kann man Interrupts benutzen. Peter
@Peter Peter, ich wollte Dir nicht in irgendeiner Art auf den Schlips treten. Ich habe auch nichts gegen Kritik und Anregungen. So habe ich das nicht gemeint und gewollt. Auch weiss ich, was ein Timerinterrupt ist, wie man ihn in Bascom programmiert und multiplexen konnte ich in meinem PRG auch genug :-) Ich habe ein lebhaftes Vorstellungsvermögen, deshalb habe ich mir vorgestellt, wie DU im Timerinterrupt multiplext (ROTFL). Siehe Deine erste Antwort. Das war nicht so bierernst zu sehen. MfG Paul
So, das Gerät existiert nun in 4-facher Ausführung und die Messwerte sind am gleichen Ort auch gleich hoch. (Bis auf den unvermeidlichen Digitfehler in der Kommastelle). @ QAUDDASH:Es ist also reproduzierbar. MfG Paul
@Paul sollte dich nicht abschrecken hier zu posten. meine Codes sind zB. auch nicht immer eingerückt wie es sein sollte, soll ja helfen.... Und das Programm "funst" auch bei mir, zwar mit LCD aber auch wunderbar. Tschaui
Hallo Stromi! Na da bin ich ja entzückt. (Wie Kojak sagen würde) :_)) MfG Paul
Hallo Paul Baumann Habe dieses Programm mal mit Bascom 1.11.9.0 compiliert und es erscheinet ein Fehler für Fourdigitdisplay = Format(str(decigrades) , "00") + 'Format(str(tfrac) , "00") kann es sein das dies aus der neueren Version herrührt und die damalige Version dies nicht erkannte. Programm ist ja auch schon 5 jahre alt. gruß mike
Möglich ist alles. :-) Nein, im Ernst: WAS für eine Fehlermeldung gibt es denn? Mit der Version 1.11.8.1 habe ich es ebn noch einmal fehlerfrei kompilieren können. MfG Paul
Hallo Paul Also: Error: 213 Line 50 String expected for assigment[STR(DECIGRADES)] Error: 13 Line 50 Incalid datatype[[0011]200] Error: 124 Line 50 Loop expected wenn ich die Zeile rauskommentiere ,compiliert er es,aber dann fehlt ja was. danke Mike
Keine Ahnung, was bei Dir passiert. :-( Ich habe Dir mal die .hex-Datei angehangen, die ich eben noch einmal daraus "hergestellt" habe. MfG Paul
Habe mir eben noch mal das Demo geladen ist 1.11.8.7 Jetzt kommt nur der Fehler 13 Invalid datatype[200]. Die Älteren Demo´s habe ich leider nicht,hatte mir mal Bascom gekauft,letztes Jahr und dacht das ich so auf dem neuesten Stand bin und alle bugs die bisher enthalten sind beseitigt. mfg Mike
Nein, das ist wie bei jeder Software: kleinere Bugs werden nach und nach durch größere ersetzt. ;-)) MfG Paul
wohl wahr, hoffe das ich das Thermometer so hin bekommen.Wenn nicht melde ich mich noch einmal. mfg Mike
Hallo Paul, schönes Projekt! Hatte das mal vor paar Jahren mit einen Nokia Display wie hier beschrieben gemacht http://comwebnet.weimars.net/index.php?option=com_content&task=view&id=37&Itemid=49 ist auch in Bascom, hatte mir da im Netz eine Tabelle gefunden welches eine Auflösung von 0,1 Grad versprach, obwohl der Sensor +-0,5 Grad Messen kann (DS18S20). Musstest du was kalibiren oder eine Konstante einbauen? Weil +-0,1 Grad ist schon was!
Die Routine stammt aus dem Datenblatt vom Onkel Dallas/Maxim. Ich habe es mal angehängt. MfG Paul
Hallo, mike wrote: > Fourdigitdisplay = Format(str(decigrades) , "00") + > 'Format(str(tfrac) , "00") Hier bekommst du den Fehler wegem des "+"-Zeichens am Ende der Zeile. Wenn du den zweiten Teil auskommentieren willst, dann mach das ' vor das + Den Format Fehler bekommt man, weil Bascom früher erlaubt hat, als Input für die Format Funktion nicht nur einen String, sondern auch eine Funktion, die einen String zurückgibt, zu verwenden. Heute geht das nicht mehr. Du musst also so schreiben: Temp_str = str(decigrades) Fourdigitdisplay = Format(Temp_str , "00") Temp_str = str(tfrac) Fourdigitdisplay = Fourdigitdisplay + Format(Temp_str , "00") @avr_nix Warum denkst du , dass der DS18s20 nur 0,5° Auflösung hat? Er hat tatsächlich 1/16 ° Auflösung, überträgt diese aber nicht in den Bytes 1 und 2, sondern im Byte 7. Musst du dir im Datenblatt mal durchlesen. Die besagte Tabelle verspricht ja nicht die Auflösung, die muss der Sensor schon liefern und tut es auch. Gruß Rolf
Danke für die Antwort: Habe jetzt das mal getestet.Musste aber noch Temp_str = str(tfrac) auskommentieren. str(tfrac) ist ja nicht declariert und ich weiss auch nicht wozu.Wenn ich das so mache funzt es. was auch noch dazu kommt ist der unterstich der entfernt werden musste,sehe ich das so richtig. Temp_str = str(decigrades) in Tempstr = str(decigrades) mfg Mike
Hallo Mike, ja, es muss Tempstr heissen, weil die Variable ja so deklariert ist. Hatte ich aus dem File Thermometer0_1.bas falsch in Erinnerung. Ich schätze mal, dass der Autor mit tfrac den Nachkommateil meinte, der aber jetzt im Programm nicht mehr enthalten ist. Gruß Rolf
Ich hatte "Tempstr" im Text. Wenn Du die Änderung von Rolf nehmen willst, mußt Du natürlich alles andere auch "Temp_str" nennen. MfG Paul
Danke,muss morgen erst mal die Hartware aufbauen. Dann wird sich herausstellen,ob es funktioniert. Habe ja auch die HEX von Paul Baumann bekommen, denke das diese 100% läuft.Er hat ja schon einige Anzeigen am laufen. mfg Mike
Hallo , So habe mir das Thermometer mal auf dem Steckbrett aufgebaut. Funktioniert prima,habe auch eine kleine änderung vorgenommen. Jetzt leuchten die Segmente gleich hell und ein kleines Gradzeichen im oberen Teil wird bei mir angezeigt.Okay eine kleine einschränkung, die mich aber nicht stört,ist,die anzeige wird nach rund 20 sek. immer kurz (1/10 tel sek. denke ich)dunkel geschalten. Habe so mit einfachen mitteln die Erwärmung des Sensors eliminiert und eine gleichbleibende helligkeit. Danke nochmal an "Peter" und "Rolf Im forum" Gruß Mike
Entschuldige : Nicht Peter soll es sein . der Dank geht an "Paul Baumann". Dies wollt ich nur noch klarstellen. Wenn mein projekt fertig ist gibt es auch noch ein Bild. Mike
Ich hatte erst eine Sequenz drin, die darauf wartete, daß der DS1820 "FF" zurückgibt, als Zeichen dafür, daß er mit dem Wandeln fertig ist. Er ist aber wesentlich schneller fertig damit, als es im Datenblatt steht. Dadurch konnte ich das auskommentieren. Der Meßwert blieb der Gleiche. Ich nehme an, daß der Onkel Dallas/Maxim auf "Nummer sicher" gehen wollte. Wurst-Käse Fall, oder wie das heißt. ;-) MfG Paul
Hallo Paul, und der Rest des Forums.Paul habe mal dein Thermometer nachgebaut und auch gleichzeitig erweitert,man kann jetzt Mini- und Maximal-temperatur abfragen.Die Anzeige ist gleichmässig hell und die DS1820 abfrage wird auch etwa alle 5 Sekunden abgefragt.Das aufrufen der Mini bzw. Maxi-temp.wird auch rund 5 Sekunden angezeigt,der wechsel ist natürlich auch möglich innerhalb der 5 sek.Denke das du damit einverstanden bist, das ich dein Programm benutzt habe und ein klein wenig verändert. Habe mit diesem Teil wieder einen menge gelernt,danke. mfg Mike Köppl
Na freilich bin ich einverstanden. Deswegen habe ich ja den Quelltext veröffentlicht, damit man ihn verändern und auf seine Bedürfnisse zuschneiden kann. Daß das "C" für Celsius bei mir heller leuchtet als die anderen Segmente hatte ich absichtlich so gemacht, damit man gleich sieht, daß das ein Thermometer ist. MfG Paul
Das könnte was sein, was ich mal nachbauen könnte freu Habt ihr die Segmentanzeige direkt an den AVR gehängt, oder über ein Treiberarray wie das ULN2003? In der bas-Datei steht das leider nicht genau drin. Gruß und vielen Dank für die Anregung Max
Ja, die Anzeigen hängen direkt (über entsprechende Segmentvorwiderstände) und 4 Treibertransistoren am MC. Es wird wohl bei neueren sog. Low-Current Anzeigen auch ohne die Transistoren gehen. Natürlich muß dann die Invertierung (der NOT-Befehl) raus. MfG Paul
Ok, danke für die Antwort. Besser ist es dann über 4 PNP-Transistoren oder? Desweiteren habe ich gerade mal geguckt, ob es schon Anzeigen gibt, bei denen die Segmente bereits zusammengefasst sind, damit ich diese multiplexen kann und nicht alle einzeln verdrahten muss....habe aber leider nichts gefunden.
>Besser ist es dann über 4 PNP-Transistoren oder? Das hängt davon ab, ob Du Anzeigen mit gemeinsamer Anode oder gemeinsamer Kathode hast. Vierstellige Anzeigeelemente gibt es in rauhen Mengen. ;-) Zum Bleistift: http://www.conrad.de/Bauelemente-Bausatze/4_digit_led.sap ...oder Du gehst zum freundlichen Fernsehmann, läßt Dir einen alten Sat-Receiver geben und veranstaltest ein schönes Schlachtfest. :-) MfG Paul
"...oder Du gehst zum freundlichen Fernsehmann, läßt Dir einen alten Sat-Receiver geben und veranstaltest ein schönes Schlachtfest. :-)" Habe ich mir auch schon gedacht, da ich da ja arbeite^^ Aber in den alten zB GRundig sind einzelne drin, die über ein IC angesteuert werden.
Hallo Paul! Tolles Programm!!! Super!!! Ich habe auch noch eine Änderung: meine Anzeige flackert etwas und deswegen habe ich die 6ms rausgenommen... nun leuchten die Segmente nach.... deshalb direkt unter die ehemaligen 6ms: Portb = 0 'um das Ghosting zu vermeiden mfg, Tobias
Hallo, gibt es eine einfache Möglichkeit die Zahlen umzudrehen? Also wenn ich in die Variable Decigrades = 1234 schreibe steht auf der Anzeige 4321 - wie kann ich das ändern? Tobias
Klar. ;-) Die Basisanschlüsse der Digit-Treiber sind bei Dir in der falschen Reihenfolge angeschlossen. Der 4. muß der 1. sein der 2. der 3. der 3. der 2. und der 1. der 4. MfG Paul
ja - naja ich dachte man könnte das software mäßig "mal eben" ändern... hatte diesen Teil geändert aber ohne Erfolg... old: Incr Digit If Digit = 4 Then Digit = 0 End If und so hab ich geändert... decr Digit If Digit = 0 Then Digit = 4 End If aber das geht leider nicht...
Dann mußt Du vorher DIGIT auf den Startwert 4 einstellen, denn die Variable hat ja jetzt beim Start 0. MfG Paul
also wenn ich nur den Startwert ändere ändert sich auf der anzeige nichts an der Reihenfolge. Das muss ich mir noch mal überlegen woran das liegt. Tobias
ok - ich habe die Anzeigen getauscht ;-) das war dann doch das einfachste. Kann man die führenden Nullen entfernen und durch ein Leerzeiche im String oder so ersetzen? Tobias
If Val(tempstr) = 0 Then 'Führende Nullen wegblenden If Digit = 0 Then : Portd.2 = 1 : Portb = 1 End If End If Setz das mal vor die SELECT CASE- Anweisung. Ich kann es jetzt nicht in Natura testen, weil das Thermometer nicht hier ist. Auf Deutsch: Wenn der Ziffernwert Null ist UND das erste Digit ist dran, dann mache die Segmente aus und steuere den 1.Transistor nicht an. MfG Paul
Hallo Paul, nun wird die ertse 0 ausgeblendet. Die anderen Nullen natürlich noch nicht. Kannst du mir den Code bitte noch etwas erklären? __ If Val(tempstr) = 0 Then 'Führende Nullen wegblenden If Digit = 0 Then : Portd.2 = 1 : Portb = 1 End If End If ____ Steht in Val(tempstr) nicht der String mit 4 Stellen drin? also zum Beispiel 0012? wie kann ich das dann mit 0 vergleichen? Gibt es nicht eine Möglichkeit zu sagen wenn Val(tempstr) = "00##" then die beiden ersten Digits abschalten? mfg, Tobias
oh Denkfehler: in Val(tempstr) steht immer nur die aktuelle Stelle drin
Hab es nun so versucht - etwas aufwendig aber es geht... Dim Digit0 As Bit 'Merker =0 wenn 1. Stelle =0 Dim Digit1 As Bit 'Tausenderstelle If Val(tempstr) = 0 Then 'Führende Null wegblenden If Digit = 0 Then : Portc.1 = 0 : Digit0 = 0 ': Portb =0 'C.1=Digit Transistor End If End If 'Hunderterstelle If Val(tempstr) = 0 Then 'Führende Null wegblenden If Digit = 1 And Digit0 = 0 Then : Portc.2 = 0 : Digit0 = 1 :Digit1 = 0 'C.2=Digit Transistor End If End If 'Zehnerstelle If Val(tempstr) = 0 Then 'Führende Null wegblenden If Digit = 2 And Digit1 = 0 Then : Portc.3 = 0 :Digit1 = 1 'C.3=Digit Transistor End If End If gruß, Tobias ps wenn jemand eine "sauberere Idee hat gerne posten
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.