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.
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
> 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?
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!'