Hallo Freunde der Elektronik, ich habe vor, mir ein Thermometer zu bauen und habe mir dazu folgendes überlegt: Ich lege mir einen temperaturabhängigen Widerstand zu und baue einen Spannungsteiler. So fällt über dem temperaturabhängigen Widerstand nicht die gesamte Spannung ab, sondern nur eine ganz bestimmte. Diese Spannung geht an den AD Wandler des Mega 8, der sie digital in zweit Registern speichert (Vor und Nachkommatelle). In einem weiteren Schritt gehe ich in etwa so vor: Jeder Spannung wird ja eine bestimmte Temperatur zugeordnet sein. Diese wird ja gemessen, in der Form: 4,9 also einer Zahl vor und nach dem Komma. Im ersten Schritt prüfe ich die Zahl vor der Kommastelle. Je nachdem, wie groß sie ist, springe ich in einen bestimmten Bereich, indem dann (unter Voraussetzung, dass die erste Stelle bekannt ist und das ist sie, sonst wäre garnicht in diesen Bereich gesprungen) anhand der Nachkommastelle eine eindeutige Temperatur zugeordnet werden und zwar über ein Bitmuster bzw. dieser db. Zuordnung. Ist das Vorgehen so sinnvoll? Welchen Widerstand nimmt man em geeignetesten? Möglicherweise könntet ihr mir ein genaues Produkt empfehlen, mein Postbote beschwert sich schon :-( (und meine Portokasse^^)
Hallo, nein, ist nicht sinnvoll. Du willst die Temperatur haben, die einem Widerstandswert entspricht, soweit ok. Diesen Widerstandwert bestimmst Du über den ADC als Spannungsmessung eines Spannungsteilers, auch ok. Warum willst Du aber erst vom Wandlerwert auf eine Spannung umrechnen und diese dann auf die Temperatur? Der ADC liefert einen Wertebereich, der vom Temperaturbereich und vom Spannungsteiler abhängig ist. Annahme: der Spannungsteiler liefert bei 0 Grad 200 und bei +40 Grad 750 (Zahlen sind Beispiele!!!). Dann muß Du den Wertebereich von 200 bis 750 auf 0...40 umrechnen. Die Spannung in Volt, die als Wert dazugehört, interessiert doch garnicht. Als Fühler z.B. KTY81-210, die sind recht linear und die Unterlagen gut verfügbar. Andere Möglichkeit ist ein LM35, der liefert 10mV/Grad, geht in einfachster Schaltung allerdings nur ab 2 Grad aufwärts, sonst ist eine negative Hilfspannung nötig. Gruß aus Berlin Michael
ich wuerde auch einen i2c/spi/1wire sensor empfehlen. das ganze geraffel mit ntc/ptc oder aehnlichem macht nur unnoetige arbeit und ist am ende doch sehr ungenau. klar kann man da viel hin und her rechnen und kalibrieren, aber das muss man dann auch fuer jeden sensor einzeln machen. die streuung ist einfach zu gross. ich hab am anfang auch die paar euros sparen wollen und dafuer am ende halt doppelt bezahlt...
Hallo, @... DS1820 ist ein 1-wire-Sensor. jochen hat bis jetzt noch eine Abneigung gegen Datenblätter, da ist das 1-wire-Protokoll vielleicht nicht sofort das Richtige. ;-) Gruß aus Berlin Michael
Mir gefällt der KTY81-210 am besten, da ich mir die Datenblätter angesehen habe und der DS1820 naja... Wenn man an den AD eine Spannung anlegt, wird ja eine Stufe ausgegeben, in der diese Spannung liegt. Du meinst also anhand dieser Stufe auf die Temperatur schließen? So könnte ich das einmal versuchen. Also dann bestelle ich mal den KTY81-210 muss ich sonst noch was bestimmtes mitbestellen? Widerstände 100 ohm 1 kohm und 10 kohm habe ich da.
Hallo, bestell Dir doch noch 10k und/oder 5k (4,7k) Einstellregler dazu. Dann kannst Du erstmal 100 Ohm (als Schutzwiderstand gegen auf 0 gedrehten Einstellregler), 5k Regler von +5V zum ADC und den KTY von ADC nach GND als Teiler nehmen. Den Regler kannst Du dann so einstellen, daß am ADC bei Zimmertemperatur die halbe Referenzspannung anliegt. Dann bist Du zum experimentieren erstmal in einem sinnvollen Bereich. Über Auflösung (1/0,5/0,1 Grad), Bereich und Genauigkeit kannst Du dann immernoch nachdenken. Die Rechnerei ist ja prinzipiell nicht anders als mit Deiner Spannung, nur die Werte sind andere. Gruß aus Berlin Michael
> und der DS1820 naja...
Was stört dich daran? Du mußt nicht mit Spannungsteilern hantieren,
Werte umrechnen, auf Nichtlinearitäten und begrenzte ADC-Auflösung
achten, kalibrieren u.s.w. und bekommst ohne viel Aufwand ein sehr
genaues Ergebnis. Für den Betrieb an einem µC ziemlich ideal. Der
einzige Nachteil ist der höhere Preis.
Verstehe ich die Funktion von DS1820 richtig? Und zwar schließe ich den an den Mega8 an und im DS1820 sind weitere Register, in denen dann direkt die Temperatur gespeichert wird. Vom KTY81-210 habe ich mir das Datenblatt nun mal angesehen. Da sind Tabellen, in denen Angaben bei MIN, TYP und MAX sind. Ist mit "TYP" ein Durchschnittswert gemeint? Was bedeutet die Angabe I(cont) = 1 mA? Brauche ich einen konstanten Strom von 1 mA? Aber eigentlich müsste man das doch mit normalen Spannungsteilern ohne konstanten Strom hinbekommen, oder irre ich?
> Und zwar schließe ich den an den Mega8 an und im DS1820 sind weitere > Register, in denen dann direkt die Temperatur gespeichert wird. Genau. Du mußt nur noch die Register auslesen und fertig. >Da sind Tabellen, in denen Angaben bei MIN, TYP und MAX sind. Ist mit > "TYP" ein Durchschnittswert gemeint? Ja. Es ist der "typische" Wert. > Was bedeutet die Angabe I(cont) = 1 mA? Daß die angegebenen Werte bei einem konstanten Strom von 1 mA gemessen wurden. > Brauche ich einen konstanten Strom von 1 mA? Nein, aber wenn ein anderer Strom fließt, kann sich der Wert ändern. Dazu gibt es im Datenblatt ein Diagramm, das den Effekt des Stroms auf den Widerstandswert zeigt. Letztendlich erwärmt sich der Widerstand auch durch den Stromfluß, was seinen Wert ja auch wieder beeinflußt.
Das heißt dann ich müsste, wenn ich keinen konstanten Strom nehme, am besten erstmal messen? Ich habe jetzt die beiden Sensoren bestellt. Jetzt finde ich doch den DS1820 von der Handhabung her besser. Das Datenblatt verstehe ich allerdings garnicht. An welchen Pin des Mega 8 schließe ich ihn an und wie heißt dann das Register, in dem die Temperatur drin steht? Wie erkenne ich negative Werte?
Das Thema DS1820 ist hier schon 1000mal durchgekaut worden. Einfach "DS1820" in die Forumsuche eingeben... [MeineMeinung] Abgesehen davon wäre es für Dich als Anfänger evtl. besser, wenn Du zunächst mal die AD-Wandler-Geschichte soweit weiterverfolgst, bis Du sie komplett verstanden hast. Jetzt mit nem One-Wire-Sensor anzufangen, der zwar komfortabel den Temperaturwert direkt ausgibt, dessen Datenblatt Du aber genauso wenig verstehst, wie andere Datenblätter, ist wahrscheinlich nicht der richtige Weg. Gerade als Anfänger sollte man nicht bei etwas, bei dem man gerade anfängt, es zu verstehen, aufhören und das nächste Thema anfangen. Der DS1820 ist ne feine Sache, und es ist sicher nichts dagegen einzuwenden, wenn Du ihn bestellst, aber lass ihn erst mal beiseite und versuch es wirklich mal, mit dem ADC was vernünftiges einzulesen. Sonst kommste völlig durcheinander [/MeineMeinung]
> das ganze geraffel mit ntc/ptc oder aehnlichem macht nur unnoetige arbeit und ist am ende doch sehr ungenau Mein Fazit nach Google-Studium: Das "Geraffel" ist eher genauer, als die meisten digitalen Sensoren (deren gute Genauigkeit ist meistens nur in einem engen Temperaturbereich zu haben, beim DS1820 beispielsweise bis 85 Grad, danach z.B. 2% Fehler, entspricht mehr als 2 Grad Fehler), man erhält eine schnellere Reaktion auf Temperaturänderungen (z.B. KTY11-n: TO92-mini oder SOT23 statt TO-92 oder grösser -> T60 = 1 Sekunde statt zum Beispiel 4 Sekunden) und die Sensoren decken einen grösseren Temperaturbereich ab: statt z.B. bei 125 Grad ist erst bei 150 oder noch viel höheren Temperaturen Schluzs (PT100/1000). Ich persönlich setze bei meinem nächsten Projekt einen KTY11-5 ein und nehme einen DS18S20 zum Kalibieren des KTY11 im unteren Temperaturbereich, um mir das Hantieren mit Eiswasser zu ersparen und weil der KTY11 in Spannungsteiler-Schaltung dort besonders nichtlinear ist (um 50 Grad), wo der DS18S20 gut ist und dort gut ist (um und über 100 Grad), wo der DS18S20 schlecht ist.
@Johannes: Ich würde das gerne über den AD Wandler machen, aber ich finde keine Informationen, mit denen ich sicher sagen kann: Bei einer temperatur von x Grad liefert der AD Wandler den Wert y. Die Angaben im Datenblatt beziehen sich ja nur auf einen konstanten Strom und aus den Diagrammen kann ich diese Info auch nicht erkennen. Mit dem digitalen Sensor kann ich in diesem Forum auch keine Infos finden, nach denen man sagen kann: Die Inistalisierung geht über folgenden Code, der da und da einzufügen ist. Das Ergebnis der Temperatur ist dann im Register xy auszulesen. Hätte jemand solche Informationen?
> Das heißt dann ich müsste, wenn ich keinen konstanten Strom nehme, am > besten erstmal messen? Du könntest bei verschiedenen Temperaturen mit einem Referenzthermometer messen und mit deinem KTY. Dann kannst du eine Tabelle aufbauen für die Umrechnung. Damit hättest du - vorausgesetzt das Referenzthermometer ist genau - alle Effekte auf einmal erschlagen. Aber der Effekt des Stroms auf den Wert ist ja laut Diagramm relativ gering, wenn du im mittleren Temperaturbereich bleibst und der Strom unter 1 mA liegt. > Jetzt finde ich doch den DS1820 von der Handhabung her besser. > Das Datenblatt verstehe ich allerdings garnicht. Vielleicht war "nur noch die Register auslesen und fertig" etwas kurz gefaßt. Die Daten kommen über ein auf 1-wire aufsetzendes Protokoll rein, das auf der Mikrocontroller-Seite natürlich auch erkannt werden muß. Das muß man dann implementieren, was für jemanden mit Erfahrung kein Problem ist, aber wenn du das Datenblatt nicht verstehst und 1-wire für dich bisher nur eine spezielle Art von Maschendrahtzaun war, wird's natürlich schon schwieriger. Im Prinzip wird es mit dem KTY einfacher sein, überhaupt mal was zu messen als mit dem DS1820. Dafür ist der DS1820, wenn er erstmal tut, ohne weiteres Zutun auf ein halbes Grad genau, was bei dem KTY nicht ganz so einfach ist.
Hallo, das waren auch meine Gedanken, ihm KTY oder LM35 nahezulegen. Genauigkeiten usw. sind doch zum Lernen erstmal sowas von egal. Wenn ich weiß, daß mein Termometer nur auf 0,5 Grad auflösen kann und 1 Grad abweichen kann, reicht das doch erstmal vollig. Man muß doch sowieso erstmal mit den Zusammenhängen klarkommen. Außerdem sind diese Teile Cent-Artikel, wenn am Schluß doch der KTY in der Schachtel landet, na und? Man bekommt auch einen KTY in einem sinnvollen Bereich genau genug, mit Rechnerei und/oder Tabellen. Das übt Programmieren, weil man diese Erkenntnisse sowieso alle naselang wieder irgendwie gebrauchen kann. Auch nur meine Meinung. PS: in meiner C64-Zeit war es schon so, daß als erstes immer ein tolles Game programmiert werden sollte. Wenn ich dann gesagt habe, derjenige solle mal eine Uhr in Basic schreiben, muß nicht genau gehen, nur überhaupt, kam ein "nur eine Uhr???". Wenn es jemand doch gemacht hat, verstand er hinterher, wie Bedingungen abgefragt werden, wozu Stringformatierungen gut sind usw. usw. Der meiner Meinung nach unschaätzbare Vorteil ist, daß man es lernz mit dem Werkzeug "Programmiersprache" umzugehen, daß man nicht bei jedem befehl in tiefes Nachdenken versinkt, daß man auch fremden Code lesen und verstehen kann. Sonst verbringt man richtigen Projekten die Zeit an völlig falscher Stelle. Die Kunst ist das Zerlegen und Umsetzen eines Projektes in seine Teilaufgaben und Abläufe, das Schreiben des Programms ist Handwerk. Das Handwerk muß man irgendwann im Schlaf beherrschen. ;) Gruß aus Berlin Michael
> DS1820, wenn er erstmal tut, ohne weiteres Zutun auf ein halbes Grad genau Das stimmt nicht (siehe ein paar Kommentare weiter oben). Der DS1820 hat zwar eine Temperaturzone, in der er so genau ist, aber wenn man damit beispielsweise eine Boiler-Heizung ausmessen will, muss man mit mehreren Grad Fehler rechnen, die es bei einer guten PT1000-Schaltung nicht gibt. Das liegt auch daran, dass beim PT1000 nur der Sensor in der Messzone liegt und beim digitalen Sensor gleich die ganze Schaltung gekocht wird.
jochen wrote: > @Johannes: > Ich würde das gerne über den AD Wandler machen, aber ich finde keine > Informationen, mit denen ich sicher sagen kann: Bei einer temperatur von > x Grad liefert der AD Wandler den Wert y. Die Angaben im Datenblatt > beziehen sich ja nur auf einen konstanten Strom und aus den Diagrammen > kann ich diese Info auch nicht erkennen. In dem Fall: Einr der schönen Teile beim Basteln ist es doch wenn man Dinge ausprobieren kann und sich selbst Verfahren ausknobeln kann. Den Sensor in Eiswasser hängen. Ist für den Hausgebrauch als 0° Normal sicher genau genug. Wert vom ADC auslesen und aufschreiben Den Sensor in kochendes Wasser legen. Ist für den Hausgebrauch sicherlich auch genau genug für ein 100° Normal. Ebenfalls Wert auslesen und aufschreiben. Dann vielleicht noch einen dritten Wert: Sensor in die Achselhöhle. Das sollte (ebenfalls für den Hausgebrauch) als Normal für 36° mehr als ausreichend sein. Damit hast du 3 Werte. Dann gehts an Excel und es wird erst mal ein bischen gespielt. Mal sehen ob man eine Gerade zwischen Anfangspunkt (0°) und Endpunkt (100°) legen kann und wie gut die 36° auf dieser Geraden liegen. Wenn du zum Schluss kommst: Nicht so toll, dann probiert mal halt mal eine Parabel da reinzulegen. Dann such ich mir noch eine andere bekannte Temperatur, die ich leicht nachmessen kann (zb. Thermometer in den Kühlschrank legen) und seh mal nach, was mein ADC dazu sagt. etc. Oder: ev. hast du eine Wetterstation mit einem Thermometer. Aktuelle Temp dort ablesen und wieder den ADC mal messen lassen. > > Mit dem digitalen Sensor kann ich in diesem Forum auch keine Infos > finden, nach denen man sagen kann: Die Inistalisierung geht über > folgenden Code, der da und da einzufügen ist. Das Ergebnis der > Temperatur ist dann im Register xy auszulesen. Hätte jemand solche > Informationen? Die stehen im Datenblatt. Jochen: Es hilft nichts. Du musst Datenblätter lesen. Oder willst du zeitlebens davon abhängig sein, dass dir irgendjemand alles vorkaut und auf einem Silbertablett präsentiert :-) In dem Fall solltest du darüber nachdenken, ob Naturwissenschaften und Technik wirklich das richtige Hobby für dich sind. Sicher: Es gibt eine Menge Dinge, die man besser erfragen muss und bei denen absolute Genauigkeit notwendig ist. Aber genausogut gibt es viele Freiräume in der Kreativität angesagt ist. Sich Methoden auszudenken wie man einen Spannungsteiler mit einem Temp-Sensor anhand der konkret vor einem liegenden Hardware kalibrieren könnte, fällt eindeutig in den zweiten Bereich (zumindest für den Hausgebrauch).
> Den Sensor in Eiswasser hängen Wie macht ihr das in der Praxis? Den Senor für diese Gelegenheit wasserdicht verpacken? Nur teilweise eintauchen? Oder destilliertes Wasser und rein damit (so scheint es der Hersteller des DS1820 zu machen ("We assemble the DS1820 in a non-hermetic plastic package and calibrate the parts in a liquid bath. Liquid is free to enter the cavity above the die in the non-hermetic package, putting a nominal stress on the die (and resistors). The device is calibrated under this very controlled environment").
Nein, ich habe das Problem nur unterschätzt und habe nicht daran gedacht, dass dort ein spezielles Prodokoll zum Einsatz kommt, das erst einmal verstanden werden muss. Das mit dem Ausprobieren macht natürlich Spaß und ist der für den Anfang besser geeignete Weg. Ich dachte das mit dem digitalen Sensor wäre anschließen und auslesen und das wars. Wie kann ich denn den Wert vom ADC auslesen, wenn der AD Wandler gerade in Betrieb ist. Klar über den Umweg von Segmentanzeigen geht das alles, nur dann brauch ich ja erstmal ein Programm, dass ich zum experimentieren nehme. Und zwar müsste dieses Programm dann die Zahlen von 0 bis 255 auf drei Segmentanzeigen ausgeben, das ist auch wieder viel Arbeit. Kann ich nicht, ähnlich wie im Simulationsprogramm, während des Betriebes mir die Inhalte der Register am Computer ausgeben lassen?
Dietmar E wrote: >> Den Sensor in Eiswasser hängen > > Wie macht ihr das in der Praxis? Sensor in Plastiktüte. Wasserglas. Eiswürfel rein. Etwas warten, bis das Eis anfängt zu schmelzen und Sensor in der Tüte ins Schmelzwasser. Bleibt solange drinnen, bis sich der ADC Wert nicht mehr verändert. Beim kochenden Wasser musst du halt drauf aufpassen, dass das Plastik damit klarkommt.
> Kann ich nicht, ähnlich wie im Simulationsprogramm, während des > Betriebes mir die Inhalte der Register am Computer ausgeben lassen? Du kannst die Werte über eine serielle Schnittstelle als Text an den PC übertragen und dann mit einem Terminalprogramm dort anzeigen.
jochen wrote: > Das mit dem Ausprobieren macht natürlich Spaß und ist der für den Anfang > besser geeignete Weg. Ich dachte das mit dem digitalen Sensor wäre > anschließen und auslesen und das wars. Ist es auch. > Wie kann ich denn den Wert vom ADC auslesen, wenn der AD Wandler gerade > in Betrieb ist. Klar über den Umweg von Segmentanzeigen geht das alles, > nur dann brauch ich ja erstmal ein Programm, dass ich zum > experimentieren nehme. Oh Gott, oh Gott. Man muss ein Programm schreiben :-) > Und zwar müsste dieses Programm dann die Zahlen > von 0 bis 255 auf drei Segmentanzeigen ausgeben, das ist auch wieder > viel Arbeit. Ach wo. Ist doch der halbe Spass am ganzen Projekt. > > Kann ich nicht, ähnlich wie im Simulationsprogramm, während des > Betriebes mir die Inhalte der Register am Computer ausgeben lassen? Doch, kannst du. Erinnerst du dich noch an das von dir so geschmähte AVR-Tutorial? Das macht ganz genau das: Den ADC einlesen und den Wert per UART an zb. einen PC verschicken. * Programm in den AVR brennen * am PC ein Termialprogramm starten * die beiden mittels seriellem Kabel verbinden * wenn die UART Parameter richtig eingestellt sind, müssten jetzt schon Zahlen im Terminal durchlaufen * wenn nicht, im UART Kapitel mal nachschlagen und ev. nur die UART in Betrieb nehmen und den Fehler suchen * am AVR mal ein Poti als Spannungsteiler anschliessen und beobachten wie sich die Zahlen im Terminal verändern wenn am Poti gedreht wird * dann Temp-Sensor mit Widerstand als Spannungsteiler oder aber (besser) Temp-Sensor mit Konstantstromquelle an den ADC anhängen und wieder im Terminal die Zahlenwerte beobachten. Den Sensor mal mit der Hand erwärmen oder Feuerzeug drunterhalten. Die Werte müssen sich deutlich verändern * Erste Kalibierwerte aufnehmen (Eis, Dampf, etc ...) * ...
Du fängst eigentlich rückwärts an. Du willst Temperaturen messen, weißt aber noch nicht, wie du überhaupt was ausgeben kannst. Erstmal solltest du mit etwas anfangen, das überprüfbar ist. Also zuerst irgendwas anzeigen, übertragen oder auch einfach nur mal eine LED zum Blinken bringen. Wenn das tut und du einen Wert irgendwo sehen kannst, kannst du anfangen, mit dem ADC mal irgendwelche Werte zu messen, zuerst einfach von einem Poti. Wenn auch das geht, schließt du den Sensor an und machst damit weiter. Das Projekt wird also in mehrere Schritte zerlegt, von denen jeder einzelne getestet werden kann. Sobald der Teil tut, kannst du ihn benutzen, um zum nächsten Teil weiterzukommen. Wenn du umgekehrt anfängst, wird's schwieriger, weil alles auf einmal tun muß.
Danke für die Antworten! @Magnus das habe ich schon hinter mir, Leds blinken zu lassen ich hab sogar auch schon - danke der Hilfe hier- eine Uhr gebaut, die ziemlich exakt geht. Ich dachte nur man kann sich diese 3 Segmentanzeigen sparen, kann man ja auch wenn man das über den PC macht. Ich danke.
Hallo, mein immernoch für solche Zwecke benutzter UART-Baukasten kann folgendes: send_byte sendet über den UART den Inhalt von Register TEMP_A send_text sendet einen Text aus dem Flash, Startadresse stehz in ZH/ZL, textende ist \0. send_hex_byte codiert den Inhalt von TEMP_A als hex-Darstellung und ruft dann eben 3x send_byte auf ($xx). send_hex_word codiert den Inhalt von ZH/ZL als hex-Darstellung und ruft dann 5x send_byte auf es gibt noch send_ram, das sendet mit Zeiger in ZH/ZL 256Byte in 16er Gruppen mit der relativen Adresse am Zeilenanfang als Tabelle. Läßt sich immer schnell reinkleben, passenden Text in Tabelle im Flash dazu und da, wo man es braucht, eben PUSH TEMP_A PUSH ZL PUSH ZH LDI ZH,high(2*debug_text_1) LDI ZL,low(2*debug_text_1) RCALL send_text MOV TEMP_A,gewünschtes Register oder LDS TEMP_A, gewünschte Ram-Adresse RCALL send_hex POP ZH POP ZL POP TEMP_A wer will, kann noch 2-3 Macros drum basteln, dann hat man beim Einfügen nur eine Zeile zu schreiben... Gesendet wird meist mit 19200, manchmal auch 38400, wenn der AVR mit 16MHz getaktet ist, PC-seitig Hyperterminal (immer vorhanden) oder TeraTerm (schöner) oder HTerm (umfangreicher). Gruß aus Berlin Michael
Kann ich den AVR in das myavr USB Set Stecken und mit Hyperterminal und USB darauf zugreifen? Das wird auch als COM aufgeführt. Jedenfalls bekomme ich, wenn ich das Progrmam aus dem Tutorial drauf brenne und es so mache nichts angezeigt.
Hallo, wie wäre es mit Nachschauen beim Hersteller? http://www.myavr.de/faq.php?akt_kategorie=Board%202.x Keine Ahnung, ob das Dein Board ist... Gruß aus Berlin Michael
jochen wrote: > Kann ich den AVR in das myavr USB Set Stecken und mit Hyperterminal und > USB darauf zugreifen? Wenn in Deinem Programm die serielle Schnittstelle des AVR korrekt initialisiert wird, dann möglicherweise ja...
Ich bekomme am PC immer die Buchstaben ppqyw, ppqyx, ppqyv ppqyt angezeigt, sie wechseln ständig durch. Wie erreiche ich, dass reinweg der Wert ovn adlow bzw adhigh dort steht?
Hier mal ein Auszug von dem was kommmt: pprvy pprvv pprvt pprvq ppruy ppruv pprut ppruq pprty pprtx pprtw gewünscht ist aber der Inhalt von adhiigh/low.
@Jochen: Du machst den ADC und den damit ermittelten Wert komplizierter als er ist. Der ADC lässt sich (grob gesehen) im 10-Bit-Mode und im 8-Bit-Mode betreiben. 10-Bittig lässt Du das Resultat rechtsbündig formatieren und liest ADCL und ADCH aus. ADCL enthält dir unteren 8 Bit, ADCH die oberen 2. 8-Bittig erreichst Du, indem Du "den Schalter" ADLAR in ADMUX "einschaltest" (also das Bit ADLAR im I/O-Register ADMUX setzt), worauf der ADC in ADCL die unteren 2 Bit (an Bitposition 6 und 7, also mit Werten 0, 64, 128 und 192) speichert und die oberen 8 Bit in ADCH. Somit braucht man nur ADCH auslesen, um den 8-Bit-Wert zu bekommen. Die unteren 2 Bit in ADCL werden einfach ignoriert. Nun betrachtest Du den ADC-Wert (mit Vor- und Nachkommastelle) als etwas Heiliges. Ist es aber nicht. Betrachte den Wert doch einfach mal als sowas wie Prozente, aber nicht zur Basis 100 (dezimal), sondern zur Basis 256 oder 1024. Dezimal kannst Du (mit 2 Stellen) 00% bis 99% darstellen, also 0/100 bis 99/100. 8-bittig sind es dann 0/256 bis 255/256 und 10-bittig 0/1024 bis 1023/1024. Wieviel Volt das sind, interessiert Dich nur, wenn Du Spannung messen willst. Interessiert Dich aber die Temperatur, dann ist der Weg über die Spannung (als darstellbarer Zahlenwert sinnfrei, dann rechnet man eben gleich mit den (Digital-)Prozenten. Warum also so kompliziert, wenn es doch sooooo einfach ist. Ich hatte vor ein paar Monaten ein Thermometer mit Schaltfunktion für meinen E-Boiler gebaut, da der darin verbaute Thermostat kaputt war. Das Ding hat ein LCD 2x16, Mega48, 4 Taster und als Sensor einen Kapillarheißleiter 24k, den es mal bei Pollin im Hunderterpack für ein oder zwei Euro gab. Das Ding hat zwar noch eine einstellbare Zeitsperre, funktioniert also nur eine gewisse Zeit (halbe Stunde) nach Einschalten des Hauptschalters, löst ein Alarmsignal aus, wenn die einstellbare Temperatur erreicht ist und die Heizung ausgeschaltet wird und bietet ein Menü zum Einstellen von Temperatur, Timeout und Alarmton-Parameter. Die eigentliche Mess-Schaltung ist ein einfacher Spannungsteiler mit dem Heißleiter an der Masse-Seite und einem Widerstand von 110k gegen einen Portpin, der per Software auf H geschaltet wird. Der ADC-Wert wird nur 8-bittig gemessen und als Index auf eine Tabelle im Flash genutzt, aus der der zugehörige Temperaturwert ausgelesen wird. Da ich auch hier nicht mit Kanonen auf Spatzen schießen wollte, genügt mir eine Auflösung der Anzeige von einem Grad. Das Ding arbeitet sehr präziese und spart nebenbei noch Strom. Ist mir nach Duschen, schalte ich den Hauptschalter (schwerer PN-Schalter) des Boilers ein und widme mich anderen Dingen. Jault die Alarmsirene, dann ist das Wasser warm, ich schalte den Hauptschalter aus und dusche. Sollte ich aus irgendwelchen Gründen den Alarm verpassen, so sperrt ein Timeout das Wiedereinschalten der Heizung bei Abkühlung des Wassers und schaltet zur Schonung des Kleinlautsprechers auch den Alarm ab. Das Programm ist allerdings noch etwas verwurschtelt, da es ohne genau vorgegebenes Konzept entstand und einige male abgeändert wurde. ...
Hallo, abgesehen davon, daß es eher nach falscher Baudrate aussieht... ADH/ADL sind Register, in denen Werte zwischen 0 und 255 vorkommen können. Ein Terminalprogramm erwartet Textzeichen in ASCII, also einer vereinbarten Interpretaion der Werte. So wird zum Beispiel der Wert 65 oder 0x41 oder 0b00100001 als Buchstabe A interpretiert und so auf dem Bildschirm dargestellt. Wenn Du also im Terminalprogramm lesbare Werte haben willst, mußt Du diese auf dem AVR passend kodieren und schicken... Also z.B. 128 als Registerinhalt ist ja 0b10000000, Du mußt aber die ASCII-Daten senden, das wäre dann 0x31 für die 1, 0x32 für die 2 und 0x38 für die 8. Findest Du beispielsweise auch hier: http://www.mikrocontroller.net/articles/AVR-Tutorial:_LCD#Zahlen_ausgeben Das Du statt lcd_data dann die UART-Routine aufrufen muß, sollte logisch erscheinen. Gruß aus Berlin Michael
jochen wrote: > Hier mal ein Auszug von dem was kommmt: > > pprvy > pprvv > pprvt > > > gewünscht ist aber der Inhalt von adhiigh/low. Die Zeilenumbrüche kommen in der Form? Das wäre an und für sich korrekt. Die Ausgabe sieht grundsätzlich (wenn wir mal von den Buchstaben absehen) so aus wie sie aussehen sollte: Die Zahlen 5-stellig und jede Zahl in einer eigenen Zeile Ich tippe mal, dass bei der Übernahme des Programms ein Fehler passiert ist. Prüf das noch mal gegen das Tutorium
Danke für Eure Antworten ist echt sehr nett. Ich glaub damit befasse ich mich ein anderes mal und löte mir eben 3 Segmentanzeigen zusammen.
> pprvy > pprvv > pprvt Wenn wir mal davon ausgehen, dass die ersten beiden Stellen in jeder Zahl eine 0 darstellen, dann ergibt sich: p hat den ASCII Code 0x70, binär also 0111 0000 0 hat den ASCII Code 0x30, binär also 0011 0000 r hat den ASCII Code 0x72, binär also 0111 0010 2 het den ASCII Code 0x32, binär also 0011 0010 Die Frage ist jetzt, warum ist bei dir Bit 6 gesetzt. Kontrollier noch mal die Hyperterminal Einstellungen. Sie muessen stehen auf: 8 Bit, no parity (keine Parität) Stopbits 1, Protokoll: kein
jochen wrote: > Danke für Eure Antworten ist echt sehr nett. Ich glaub damit befasse ich > mich ein anderes mal Keine gute Idee. Du brauchst irgend etwas wo du vernünftig ausgeben kannst. 7-Segment ist schön, aber sobald was anderes als Zahlen im Spiel sind, bist du schnell am Ende.
Die Einstellung "Portokoll" kommt bei mir nicht vor. Den Rest habe ich, wie du genannt hast. Zudem kommt noch "Bits pro Sekunde", da hab ich wie im Tutorial beschrieben 9600 ausgewählt. Bei Flussstuerung ist voreingestellt "Hardware". Wenn ich die Bits pro Sekunde verändere, kommen andere, teilweise kryptische Zeichen. Evtl liegt es daran?
Ja, da hast du recht, 50 würde die ersteinmal nicht mitmachen. Dann müsste ich z.B. 50 durch zehn teilen und habe 5,0 eine bekommt die 5, die andere die 0. Aber mit UART wäre natürlich besser.
jochen wrote: > Die Einstellung "Portokoll" kommt bei mir nicht vor. > Den Rest habe ich, wie du genannt hast. > Zudem kommt noch "Bits pro Sekunde", da hab ich wie im Tutorial > beschrieben 9600 ausgewählt. Bei Flussstuerung ist voreingestellt > "Hardware". > > Wenn ich die Bits pro Sekunde verändere, kommen andere, teilweise > kryptische Zeichen. Evtl liegt es daran? die 9600 stimmen schon. Wie gesagt: grundsätzlich scheint die Baudrate richtig zu sein. Nur hat sich da ein Bit hineingeschummelt, das da nicht da sein sollte. Du betreibst den µC mit einem Quarz?
Mach mal folgende Modifikation: ziemlich am Anfang des Programms findet sich die Sequenz:
1 | ;UART Initalisierung |
2 | |
3 | sbi UCSRB, TXEN ; enable transmit |
4 | ldi temp1, quartz / (baud * 16) - 1 |
5 | out UBRRL, temp1 ; BAUD Rate |
6 | |
7 | ; ADC initialisieren: Single Conversion, Vorteiler 128 |
modifizier das mal zu
1 | ;UART Initalisierung |
2 | |
3 | ldi temp1, LOW( quartz / (baud * 16) - 1 ) |
4 | out UBRRL, temp1 ; BAUD Rate |
5 | ldi temp1, HIGH( quartz / (baud * 16) - 1 ) |
6 | out UBRRH, temp1 |
7 | |
8 | ; Frame-Format: 8 Bit |
9 | ldi temp1, (1<<URSEL)|(3<<UCSZ0) |
10 | out UCSRC, temp1 |
11 | |
12 | sbi UCSRB, TXEN ; enable transmit |
13 | |
14 | ; ADC initialisieren: Single Conversion, Vorteiler 128 |
Das funktioniert leider auch nicht, es erscheint pprpt pprpt pprpu pprpu pprpu pprpu pprpu pprpu pprpr pprps pprpt pprps pprpu pprpu pprpv pprpv pprpu pprpt pprpu pprpu was ich sehe, dort wurde .equ quartz = 4000000 angegeben, ich habe aber einen mit 3,6 MHZ. Könnte es daran liegen?
jochen wrote: > was ich sehe, dort wurde .equ quartz = 4000000 angegeben, ich habe aber > einen mit 3,6 MHZ. Könnte es daran liegen? Oh, Mann. Du lässt aber auch nichts aus.
Sorry, mein eigentliches Augenmerk liegt auf dem Thermometer. Und nicht auf dem UART Programm. Es steht jetzt 00255 00255 00256 00255 00250 00255 00256 00254 00254 00254 00254 00254 00254 00254 00254 wenn ich keinerlei Spannung anlege. Das ist allerdings nur ein Auszug, die Liste geht fortlaufend nach unten. Wie interpretiere ich diese Zahlen, welches byte (low / high) ist was?
Hallo, > Sorry, mein eigentliches Augenmerk liegt auf dem Thermometer. Und nicht > auf dem UART Programm. Falls Du einen Führerschein hast, hast Du da nach dem Crash auch zum Fahrlehrer gesagt: Sorry, mein eigentliches Augenmerk liegt auf dem Gaspedal. Und nicht auf der Bremse. Zu Deiner Frage: so, wie Du es in der UART-Routine rausschickst kommt es auch an,da überlasse ich im Moment doch lieber Karl heinz Buchegger das Wort, er kennt das Tutorial wesentlich besser und hat auch wesentlich mehr Geduld. PS: Karl heinz Buchegger: lag ich mit falscher Baudrate ganz am Anfang wenigstens nicht so falsch... ;) Gruß aus Berlin Michael
Es tut mir wahnsinnig leid, ja. Ich denke, nun werde ich das Thermometer selber hinbekommen. Ich überlege mir durch Experimente eine Formel, mit der ich anhand des Spannungsabfalls auf eine Temperatur komme. Dabei mache ich einen Spannungsteiler aus dem bestellten temperaturabhängigen Widerstand und einem normalen Widerstand.
Michael U. wrote: > PS: Karl heinz Buchegger: lag ich mit falscher Baudrate ganz am Anfang > wenigstens nicht so falsch... ;) Was mich stutzig gemacht hat war, dass die Baudrate offenbar nicht allzusehr daneben liegen kann. Sonst wären die CR/LF nicht korrekt gekommen. Daher habe ich leichtsinnigerweise mal angenommen, dass das stimmen muesste. Aber jetzt ist es natürlich klar. Wenn die Clock Frequenz um 400 kHz daneben liegt, dann stimmen die ersten Bits. Bei CR/LF (alle 1 Bits im lower Nibble) hat sich die Abweichung noch nicht weit genug aufsummiert um eine Rolle zu spielen. Erst beim Bit 6 (mglw. auch schon 5) ist die Abweichung im Timing dann gross genug, dass die Gegenstelle ausser Tritt kommt. Ist schon in mein Gedächtnis eingebrannt: Wenn von den höherwertigen Bits eines anscheinend kippt, kann die Clock Frequenz ein klein wenig daneben sein. Ich gebe es gerne zu: Du hattest absolut Recht. (Sowas habe ich allerdings auch noch nie gesehen. Dagegen war ja der Bascom-Alex von vor ein paar Monaten noch ein richtig fixer Schnellgneiser)
Michael Wilhelm wrote: > Die 256 würde mich stutzig machen. > Nicht unbedingt. Diese Aussage: 'wenn ich keinerlei Spannung anlege' würde ich ruhig wörtlich nehmen. Offener Eingang -> der ADC sampelt alles Mögliche was seine kleine Antenne so auffischt.
>Wie interpretiere ich diese >Zahlen, welches byte (low / high) ist was? Das in Verbindung mit 256 hat mich stutzig gemacht. Wenn da noch das ganze in High und Low unterteilt war, hat eine 256 dort nichts zu suchen. MW
Michael Wilhelm wrote: >>Wie interpretiere ich diese >>Zahlen, welches byte (low / high) ist was? > > Das in Verbindung mit 256 hat mich stutzig gemacht. Wenn da noch das > ganze in High und Low unterteilt war, hat eine 256 dort nichts zu > suchen. > Ist es nicht. Das sind schon Dezimalzahlen. Die benutzte Routine wandelt unsigned 16-Bit Zahlen nach Dezimal 'for the safety and comfort of everyone!'
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.