Forum: Mikrocontroller und Digitale Elektronik Thermometerbau mit MEGA 8


von jochen (Gast)


Lesenswert?

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^^)

von ... (Gast)


Lesenswert?


von Michael U. (Gast)


Lesenswert?

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

von fnah (Gast)


Lesenswert?

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...

von fnah (Gast)


Lesenswert?


von fnah (Gast)


Lesenswert?


von Michael U. (Gast)


Lesenswert?

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

von jochen (Gast)


Lesenswert?

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.

von fnah (Gast)


Lesenswert?


von Michael U. (Gast)


Lesenswert?

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

von Rolf Magnus (Gast)


Lesenswert?

> 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.

von jochen (Gast)


Lesenswert?

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?


von Rolf Magnus (Gast)


Lesenswert?

> 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.

von jochen (Gast)


Lesenswert?

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?

von Johannes M. (johnny-m)


Lesenswert?

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]

von Dietmar E (Gast)


Lesenswert?

> 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.

von jochen (Gast)


Lesenswert?

@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?

von Rolf Magnus (Gast)


Lesenswert?

> 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.

von Michael U. (Gast)


Lesenswert?

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

von Dietmar E (Gast)


Lesenswert?

> 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.

von Karl H. (kbuchegg)


Lesenswert?

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).

von Dietmar E (Gast)


Lesenswert?

> 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").

von jochen (Gast)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Rolf Magnus (Gast)


Lesenswert?

> 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.

von Karl H. (kbuchegg)


Lesenswert?

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 ...)
* ...

von Rolf Magnus (Gast)


Lesenswert?

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ß.

von jochen (Gast)


Lesenswert?

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.

von Michael U. (Gast)


Lesenswert?

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

von jochen (Gast)


Lesenswert?

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.

von Michael U. (Gast)


Lesenswert?

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

von Johannes M. (johnny-m)


Lesenswert?

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...

von jochen (Gast)


Lesenswert?

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?

von jochen (Gast)


Lesenswert?

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.

von Hannes L. (hannes)


Lesenswert?

@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.

...

von Michael U. (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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

von jochen (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

> 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

von Karl H. (kbuchegg)


Lesenswert?

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.

von jochen (Gast)


Lesenswert?

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?

von jochen (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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?


von Karl H. (kbuchegg)


Lesenswert?

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

  

von jochen (Gast)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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.


von jochen (Gast)


Lesenswert?

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?

von Michael Wilhelm (Gast)


Lesenswert?

Die 256 würde mich stutzig machen.

MW

von jochen (Gast)


Lesenswert?

Ist der Gesamtwert.... danke

von Michael U. (Gast)


Lesenswert?

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

von jochen (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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)

von Karl H. (kbuchegg)


Lesenswert?

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.


von Michael Wilhelm (Gast)


Lesenswert?

>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

von Karl H. (kbuchegg)


Lesenswert?

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
Noch kein Account? Hier anmelden.