Forum: Projekte & Code Zeit + Temperatur auf LCD mit AVR


von Peter D. (peda)


Angehängte Dateien:

Lesenswert?

Anbei das komplette Programm, Schaltplan und die Platine.

Die Uhr ist mit Sommerzeit und bis zum 31.12.2099.

Das File indexg.htm enthält eine ausführliche Erklärung der Funktion und 
aller Programmmodule.

Außerdem habe ich noch ein paar Praxistips zum einfacheren Programmieren 
gegeben und ich denke auch recht gut in diesem Programmbeispiel 
angewendet.

Daher könnte dieser Beitrag auch jene interessieren, die nichts mit dem 
AVR, LCD, 1-Wire, RTC usw. machen wollen.

Kommentare und Anregungen sind herzlich wilkommen.


Peter

von emil (Gast)


Lesenswert?

sehr schönes und hauptsache sinnvolles programm; die doku hat mir auch 
sehr gut gefallen - easy-going, verständlich und doch lernreich!

ach ja, das ist bestimmt eine meisterleistung: tiny12 hat 1024bytes rom 
und das programm belegt exakt 1024bytes :)

danke, peter, reife leistung, werde bestimmt etwas davon "klauen" :) 
nicht böse sein :)

emil

von Peter D. (peda)


Lesenswert?

@Emil

Danke.

Das mit den 1024 Bytes täuscht aber. Warscheinlich, weil ich das 
Calibrationsbyte ans Ende geschrieben habe.

Es sind in Wirklichkeit noch etwa 7% (74 Bytes) frei.


Peter

von Christian Schumann (Gast)


Lesenswert?

Hallo Peter,

gerne würde ich diese Schaltung nachbauen (die Hardware ist schon
fertig) jedoch zickt das Programm beim compilieren :-(
Ich arbeite mit dem AVR Studio 4; die erste Fehlermeldung ist in der
Tiny12 Definitionsdatei aufgetreten :
".equ  E2END  =3F" mag er nicht; ich habe es auf $03F
umgeschrieben,bekomme dann aber folgende Fehler :


Building project...
AVRASM: AVR macro assembler 2.0.28 (build 121 Jan 11 2005 10:28:51)
Copyright (C) 1995-2005 ATMEL Corporation
C:\Dokumente und Einstellungen\Christian
Schumann\Desktop\Temptime\2temp.asm(20): Including file
'C:\Dokumente und Einstellungen\Christian
Schumann\Desktop\Temptime\lcdtrtc.h'
C:\Dokumente und Einstellungen\Christian
Schumann\Desktop\Temptime\lcdtrtc.h(2): Including file
'C:\Dokumente und Einstellungen\Christian
Schumann\Desktop\Temptime\tn12def.inc'
C:\Dokumente und Einstellungen\Christian
Schumann\Desktop\Temptime\lcdtrtc.h(62): warning: Register r23
already defined by the .DEF directive
C:\Dokumente und Einstellungen\Christian
Schumann\Desktop\Temptime\2temp.asm(20): C:\Dokumente und
Einstellungen\Christian Schumann\Desktop\Temptime\lcdtrtc.h
included from here
C:\Dokumente und Einstellungen\Christian
Schumann\Desktop\Temptime\lcdtrtc.h(71): warning: Register r31
already defined by the .DEF directive
C:\Dokumente und Einstellungen\Christian
Schumann\Desktop\Temptime\2temp.asm(20): C:\Dokumente und
Einstellungen\Christian Schumann\Desktop\Temptime\lcdtrtc.h
included from here
C:\Dokumente und Einstellungen\Christian
Schumann\Desktop\Temptime\2temp.asm(21): Including file
'C:\Dokumente und Einstellungen\Christian
Schumann\Desktop\Temptime\hardware.h'
C:\Dokumente und Einstellungen\Christian
Schumann\Desktop\Temptime\2temp.asm(22): Including file
'C:\Dokumente und Einstellungen\Christian
Schumann\Desktop\Temptime\macro.mac'
C:\Dokumente und Einstellungen\Christian
Schumann\Desktop\Temptime\2temp.asm(30): Including file
'C:\Dokumente und Einstellungen\Christian
Schumann\Desktop\Temptime\ovf0int.inc'
C:\Dokumente und Einstellungen\Christian
Schumann\Desktop\Temptime\2temp.asm(92): Including file
'C:\Dokumente und Einstellungen\Christian
Schumann\Desktop\Temptime\lcd164.inc'
C:\Dokumente und Einstellungen\Christian
Schumann\Desktop\Temptime\2temp.asm(93): Including file
'C:\Dokumente und Einstellungen\Christian
Schumann\Desktop\Temptime\1w_rtc.inc'
C:\Dokumente und Einstellungen\Christian
Schumann\Desktop\Temptime\2temp.asm(94): Including file
'C:\Dokumente und Einstellungen\Christian
Schumann\Desktop\Temptime\ds1994.inc'
C:\Dokumente und Einstellungen\Christian
Schumann\Desktop\Temptime\2temp.asm(95): Including file
'C:\Dokumente und Einstellungen\Christian
Schumann\Desktop\Temptime\gettime.inc'
C:\Dokumente und Einstellungen\Christian
Schumann\Desktop\Temptime\2temp.asm(96): Including file
'C:\Dokumente und Einstellungen\Christian
Schumann\Desktop\Temptime\1wire.inc'
C:\Dokumente und Einstellungen\Christian
Schumann\Desktop\Temptime\2temp.asm(97): Including file
'C:\Dokumente und Einstellungen\Christian
Schumann\Desktop\Temptime\outval.inc'
C:\Dokumente und Einstellungen\Christian
Schumann\Desktop\Temptime\2temp.asm(98): Including file
'C:\Dokumente und Einstellungen\Christian
Schumann\Desktop\Temptime\disptime.inc'
C:\Dokumente und Einstellungen\Christian
Schumann\Desktop\Temptime\2temp.asm(99): Including file
'C:\Dokumente und Einstellungen\Christian
Schumann\Desktop\Temptime\dispwday.inc'
C:\Dokumente und Einstellungen\Christian
Schumann\Desktop\Temptime\2temp.asm(100): Including file
'C:\Dokumente und Einstellungen\Christian
Schumann\Desktop\Temptime\dispdate.inc'
C:\Dokumente und Einstellungen\Christian
Schumann\Desktop\Temptime\2temp.asm(101): Including file
'C:\Dokumente und Einstellungen\Christian
Schumann\Desktop\Temptime\disptemp.inc'
C:\Dokumente und Einstellungen\Christian
Schumann\Desktop\Temptime\2temp.asm(102): Including file
'C:\Dokumente und Einstellungen\Christian
Schumann\Desktop\Temptime\measure.inc'
C:\Dokumente und Einstellungen\Christian
Schumann\Desktop\Temptime\2temp.asm(104): Including file
'C:\Dokumente und Einstellungen\Christian
Schumann\Desktop\Temptime\calc12_5.inc'
C:\Dokumente und Einstellungen\Christian
Schumann\Desktop\Temptime\disptime.inc(19): error: Undefined symbol:
display_clock_ret
C:\Dokumente und Einstellungen\Christian
Schumann\Desktop\Temptime\2temp.asm(98): C:\Dokumente und
Einstellungen\Christian Schumann\Desktop\Temptime\disptime.inc
included from here
C:\Dokumente und Einstellungen\Christian
Schumann\Desktop\Temptime\dispdate.inc(21): error: Undefined symbol:
display_date_ret
C:\Dokumente und Einstellungen\Christian
Schumann\Desktop\Temptime\2temp.asm(100): C:\Dokumente und
Einstellungen\Christian Schumann\Desktop\Temptime\dispdate.inc
included from here
C:\Dokumente und Einstellungen\Christian
Schumann\Desktop\Temptime\disptemp.inc(35): error: Undefined symbol:
display_temp_ret
C:\Dokumente und Einstellungen\Christian
Schumann\Desktop\Temptime\2temp.asm(101): C:\Dokumente und
Einstellungen\Christian Schumann\Desktop\Temptime\disptemp.inc
included from here
C:\Dokumente und Einstellungen\Christian
Schumann\Desktop\Temptime\measure.inc(50): error: Undefined symbol:
measure_ret
C:\Dokumente und Einstellungen\Christian
Schumann\Desktop\Temptime\2temp.asm(102): C:\Dokumente und
Einstellungen\Christian Schumann\Desktop\Temptime\measure.inc
included from here
Assembly failed, 4 errors, 2 warnings

Ich denke du arbeitest mit einem Macroassembler und habe mir schon mal
die "ASM" Batch Datei angesehen und die Pfade umgeschrieben; jedoch
leider ohne Erfolg ...

Bitte hilf mir... sonst muß ich die Hardware entsorgen ....

Thanks in advance !!

Christian

von Peter Dannegger (Gast)


Lesenswert?

Ich vermute mal, Du hast irgendwas am Quelltext geändert.

Mach mal ein komplettes Listing mit .list und .listmac und schau es Dir
in Ruhe an, warum er die Labels nicht findet.


Peter

von Christian Schumann (Gast)


Lesenswert?

Hallo Peter,

sorry to bother you again !!

Also erst mal : Geniales, kurzes Programm !!
Habe mal das Hex File "gebrannt" und die Hardware spielt
einwandfrei;
leider nur mit falschem Datum und Uhrzeit da das *.asm file noch immer
zickt und auch ich die fehlenden Labels :
display_clock_ret
display_date_ret
display_temp_ret
measure_ret
in keiner der Include Dateien finden kann; fehlt bei dem Zip_file evtl.
eine Datei ??
Ich schwöre dir den Quellcode (noch nicht) verändert zu haben !!!
All diese _ret Labels sind die Beendigung von .inc Dateien; die
müssten dann ja im *.asm File oder anderen *.inc Dateien auftauchen,
oder ??
Ein Freund von mir (mit viel AVR Erfahrung) hat die gleichen Probleme
...
Bitte schau dir dein *zip File noch mal an oder maile mir die Datei
welche die fehlenden Befehle enthält.

1000 Dank im voraus !!!

Christian
P.S. ohne vollständige Assemblierung macht mein AVR Studio 4 leider
kein *.lst File

von Christian Schumann (Gast)


Lesenswert?

Hallo Peter,
jetzt läuft's (fast).
Das Problem war wohl das Macro File welches vom doofen XP Rechner als
Macromedia File interpretiert wurde; habe es dann als *.txt File
gespeichert; diverse Sachen damit ausprobiert... anyway; nun wird's
gelesen und implementiert.
Aber ..... sobald ich versuche das Startdate, Time etc. zu verändern
hängt sich das Programm im AVR (anscheinend) auf. Das LCD wird
initialisiert und das war's ...die Assemblierung läuft fehlerfrei.
Mit den Originaldaten funktioniert's einwandfrei, aber wehe ich ändere
ein einziges Parameter ...
Hast du da 'ne Erklärung für ??
Muss der RTC erst wieder initalisiert werden wenn er mal mit anderem
Datum lief ??

Thanks in advance !!

Christian
P.S. LCD mit nur drei Ports und einem supergeilem Treiberprogramm;
danke !!! Ich werde nie wieder 11 Ports opfern müssen !!!!!

von Christian Schumann (Gast)


Lesenswert?

Hallo Peter,
sorry ich immer noch......
Also, ich habe die Return-labels manuell so gesetzt wie in deinem
listfile; nun funktioniert's 100% ig. Als Magic_key (o.ä) muss man nur
nach einer Änderung der Daten eine X-beliebige, aber andere, Zahl als
vor der Änderung eingeben; that's it !!
Ich habe (leider ohne Erfolg) versucht deinen LCD-Teiber auf einen
Mega-8 zu übertragen (4 MHz); ich kann an allen Konstanten
"herumschrauben" wie ich will und bekomme einfach die "Enable" Zeit
nicht lang genug ...
Vielelicht ein Thema für einen anderen Thread ??
Mit 2 Stück 74HCT590 und 16 Bit seriell wobei die ersten 4 bit für den
Kontrast, die zweiten 4 Bit für die LED Hintergrundbeleuchtung und die
restlichen 8 Bit für das LCD sind ??
Ein Platinenlayout kann ich gerne zur Verfügung stellen ....
Oder das LSB als Enable wenn die Bits seriell eingetroffen sind ??

Alles Gute wünscht

Christian

von Klaus O. (klaus)


Lesenswert?

Hallo Christian,
den Fehler bei ".equ  E2END  =3F" bekomme ich nicht nur bei diesem
Beispiel sondern auch bei anderen Codes, wenn ich AVR-Studio verwende.
In diesem Fall hbe ich es mal mit WAVRASM übersetzt und erhalte keinen
Fehler. Also liegt es wohl am Assembler- oder ?

Gruß Klaus

von Werner L (Gast)


Lesenswert?

Hallo Christian und Klaus,
daß Problem mit ".equ E2END ..." habe ich gelöst durch Löschen der
tn12def.inc. Seit einiger Zeit sind beim AVRStudio Partdefinitionfiles
als xml-Dateien eingeführt, die der Assembler automatisch benutzt, wenn
die entsprechende ".include" Direktive ge-setzt ist.
Danke nochmals an Christian für die Lösung des "ret"-Problems. Hat
mir
viel Zeit gespart.
Unklar ist mir noch die Sache mit dem Magic-Byte. Ich bin nicht so
sicher, daß man dieses bei Verwendung anderer Angaben für die
Start-zeit nur "irgendwie" ändern muß. Peter D. schreibt, daß es
angepaßt werden muß, also stellt sich die Frage nach dem Algoritmus.
Hat da
schon jemand dran gearbeitet?
Gruß Werner

von Peter Dannegger (Gast)


Lesenswert?

Das Magic ist nur dazu da, damit die CPU weiß, ob die RTC schon
gestartet wurde.

Wenn es nicht stimmt, wird die im Programm definierte Startzeit geladen
und die RTC gestartet.

Das Stellen der RTC erfolgt also dadurch, daß man die Uhr zum richtigen
Zeitpunkt einschaltet. Will man sie neu stellen, muß man ein anderes
Magic nehmen.

Man kann sich natürlich auch andere Stellmethoden ausdenken, das sollte
ja nur als Beispiel für eigenen Versuche dienen.


Peter

von Werner L (Gast)


Lesenswert?

Hallo,
ich habe mich mit dem Nachbau des Projekts befaßt und möchte hier
einige Tipps geben, die Probleme vermeiden helfen können.

Zunächst zur Hardware:
Die Schaltung wurde 2003 entwickelt. Mittlerweile ist der DS1820 nicht
mehr in der Produktion. Als Ersatz dürfte sich der DS18S20 anbieten,
der weitgehend kompatibel ist. Ungeeignet ist hingegen der DS18B20, da
er einen anderen Aufbau des Temperatur-Registers besitzt.
Auch hatte ich Probleme mit der Beschaffung des DS1994 (jedenfalls zu
vernünftigen Preisen). Der DS2404 kann hier als Ersatz dienen. Er
benötigt einen externen 6pF Quarz.

Sodann für Benutzer des Studio4:
Beim Assemblieren treten die oben beschriebenen Fehler auf.
Also zunächst nur der Fehler mit der tn12def.inc. Wird dieser Fehler
korrigiert entweder über
".equ  E2END  =3F" in "....=$03F" oder durch Löschen der
tn12def.inc
findet der Assembler die Label

display_clock_ret
display_date_ret
display_temp_ret
measure_ret

nicht mehr, d.h. er kann die entsprechende Zeile in dem Macro incall in
der macro.mac nicht mehr richtig interpretieren.

Meine Lösung:
Verwendung des tiny13 mit Software-Stack

Hierzu:
in der init-Routine den Stack lokalisieren
Änderung der .include Direktive in tn13....
Das Macro incall löschen in der macro.mac
in den Dateien measure.inc etc. die entsprechenden Routinen mit "ret"
abschließen
in der asm-Datei aus den Makro-Aufrufen rcall-Aufrufe machen

Damit funktioniert das Programm dann auch im Studio4 einwandfrei.
Allerdings läuft meine RTC cirka 10 Sekunden pro Tag zu schnell, was
vielleicht damit zusammen hängt, daß ich entgegen der Spezifikation
einen 12,5pF Quarz verwende.

PS: Wer im übrigen an den Hintergründen für die Merkwürdigkeiten bei
der Abarbeitung des Makros incall interessiert ist, wird vielleicht in
der nächsten Zeit hier etwas erfahren können:

http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=32820


Gruß Werner

von Werner L (Gast)


Lesenswert?

Hallo,

ich vergaß darauf hinzuweisen, daß die Timer-Register im tiny13 anders
bezeichnet sind. Dies ist auch noch zu ändern, wenn man auf diesen Chip
umsteigen möchte.

Gruß Werner

von Sanlo (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich werde den Thread mal wiederbeleben.

Erstmal danke an Peter für den Code!

Ich bin ziemlicher Anfänger und versuche gerade mich da reinzuarbeiten.
Ich habe versucht den Code für mich anzupassen.
Ich brauche aber nur den 1-wire-Teil. Ich habe versucht, das auf den
1-wire zu beschränken und mit meinem LCD zu kombinieren. Jetzt hab ich
das Programm zumindest soweit, daß ich beim Compilieren keine Fehler
mehr bekomme und im Sim. siehts auch ganz gut aus(zumindest mal der
Anfang).

Wenn ich das Programm jedoch in den ATMega16 rüberschiebe, tut sich auf
dem Display mal gar nichts. Es läuft noch nicht mal bis zum
clear-Befehl, und die Initialation und der clear des LCD funktioniert
einzeln, aber nicht in dem kompletten Programm.

Ich bin grad ratlos und stelle den Code mal hier rein, vielleicht
erbarmt sich ja jemand und schaut sich den mal an... ;-)

Vielen Dank schonmal,

->Sanlo

von sanlo (Gast)


Lesenswert?

hm... 18 Leute haben sich den Quellcode gezogen, aber keiner schreibt
nen Komentar dazu????

Ist mein Code so schlecht, daß es sich nicht lohnt darüber zu
schreiben, oder findet keiner einen Fehler? (Ich hab doch sicher einige
gemacht)

->Sanlo

von Sanlo (Gast)


Angehängte Dateien:

Lesenswert?

also da der Quellcode wohl zu schlecht und keiner Antwort wert war, hab
ich die Sache nochmal von vorn angefangen.

Jetzt bin ich soweit, dass mir mein LCD "Temp1: 20.0°C" anzeigt, aber
der Wert stimmt nicht, und ich bekomme auch keine Änderung der Anzeige
bei Temp.änd.

Bin grad ein bisschen ratlos, was wohl daran liegt, dass ich PD´s Code
nicht vollständig verstehe (z.B. ROM_search ist mir völlig
schleierhaft, ich nehms als gegeben und i.O. hin)

Ich hoffe, diesmal hat jemand den ein oder anderen Tip.

Danke

->Sanlo

von Christian Schumann (Gast)


Lesenswert?

Hallo Sanlo,

sorry, ich habe seit diesem Projekt keine weiteren AVRs mehr
programmiert; Peter's Programm ist super professionell, leider aber
nicht wirklich "anfängergeeignet".
Ich suche gerade eine Routine für 2 Stück 1-wire Temperatursensoren um
eine Differenzmessung machen zu können; d.h. dieses Projekt ohne die
Zeitkomponente ... leider fehlt mir auch die Zeit dazu ...
Falls mir was am Programm auffällt melde ich mich; falls du 'ne Lösung
hast lass es mich bitte wissen.

Hang loose

Christian

von Sanlo (Gast)


Lesenswert?

mein Projekt ist ja ohne die Zeitkomponente, und die Voraussetzungen für
mehrere DS18s20 sind auch vorhanden.

Bei mir soll es dann so aussehen, dass drei Sensoren ausgelesen und
angezeigt werden. Zwei davon werden zum Ansteuern eines Ventils
verwendet. ( Das wird dann eine Steuerung für eine Solar-Poolheizung)
Ich weiß allerdings auch noch nicht, wie ich das dann mit der Hysterese
programmiere. Aber jetzt muss erstmal das Auslesen funktionieren, jetzt
der eine und danach für alle drei Sensoren.

->Sanlo

von Peter D. (peda)


Lesenswert?

@Sanlo,

ich kann nur ZIP im Explorer öffnen (kein RAR).


Die Quarzfrequenz hast Du angepaßt (max 3,7MHz) ?

Bei über 3,7MHz müssen die Warteschleifen in w1_reset angepaßt werden
(weiteres Register nehmen).

JTAG-Fuses aus ?

w1_reset liefert present zurück ?

w1_rom_search liefert 00 .. 7F zurück ?


Peter

von Sanlo (Gast)


Angehängte Dateien:

Lesenswert?

@Peter: habs gezippt...

Die Frequenz von 1 Mhz ist bei xtal eingetragen. Dann müsste der Rest
so klappen.

ups... nachdem ich die JTAG-Fuse ausgeschaltet habe, gibt mein LCD nur
noch eine flackernde Anzeige von sich. Die Zeichen aus der Anzeige
hüpfen jetzt wild durcheinender.

Was w1_reset und w1_rom_rearch zurückgibt weiß ich leider nicht, oder
kann man das über die ser. Schnittstelle irgendwie mit Ponyprog
auslesen?

->Sanlo

von Sanlo (Gast)


Lesenswert?

Verdammt! meine Anzeige lässt sich auch durch Rücksetzten auf den
vorherigen Zustand vom JTAG nicht wiederherstellen.

von Sanlo (Gast)


Lesenswert?

hmmm... die 50us Pause in den LCD-Routinen war plötzlich zu kurz. Jetzt
klappts wieder.

->Sanlo

von Peter D. (peda)


Lesenswert?

"hmmm... die 50us Pause in den LCD-Routinen war plötzlich zu kurz."

Plötzlich gibt es nicht, Du must was geändert haben. Versuche
herauszufinden, was Du geändert hattest. Dazu ist es sinnvoll bei der
Entwicklung z.B. täglich die letzte Version zu sichern (nicht die alte
überschreiben !).


Versuche mal systematisch vorzugehen.

Bringe erstmal das LCD zum laufen, dann eine Funktion zur Zahlenausgabe
und dann kannst Du debuggen.
D.h. an den Stellen, wo Du etwas bestimmtes erwartest aber etwas
falsches vermutest, lasse Dir den Wert ausgeben.


Peter

von Sanlo (Gast)


Lesenswert?

das kuriose ist, daß ich nur JTAG verändert habe und sonst nichts.
Vorher ging das LCD super.

Ich hänge jetzt grad beim Einlesen. In measure wird die ausgelesene
Temp. doch in temp2l und temp2h abgelegt, aber in display_temp ist
"z" der Temp.wert. Da gibt es kein temp2l und temp2h???

->Sanlo

von Christian Schumann (Gast)


Lesenswert?

Hi Sanlo, hi Peter,

ich finde, dass der Thread sich langsam etwas vom Grundthemaentfernt;
inzwischen arbeitet Sanlo auf einem Mega-16 ...

Sanlo,

schau dir mal bei "avrfreaks.net" Peter's Projekt an:
(du mußt dich erst als User anmelden)

"Multiple DS18[B]20 on LCD" auf dem Tiny 12; ich denke, dass ist eine
gute Grundlage für deine Aufgabe.
Es ist ja gerade interessant auf kleinen AVRs große Projekte zu
verwirklichen.
Ansonsten nutze die Analogports des Mega-16 und gehe einfach mit
Thermosensoren drauf ... aber die 1820 sind einfach geiler.. x-cuse my
language !

Peter,

danke, dass du noch immer Threads bearbeitest !!

Viel Spass und gutes Gelingen !!

Christian

von Peter D. (peda)


Lesenswert?

"aber in display_temp ist "z" der Temp.wert."


Nein, ist es nicht !

Z ist nur der Zeiger darauf.
Schau Dir mal den LD-Befehl genau an.

Zeiger nimmt man immer dann, wenn verschiedene Werte mit der gleichen
Funktion bearbeitet werden sollen.


Peter

von Sanlo (Gast)


Lesenswert?

@Peter: also dein Code klingt für mich plausibel, ich kann keinen Fehler
finden (hätte mich auch gewundert).

Ich hab mit Sicherheit ein Timing-Problem. Ich muss wohl mal irgendwie
die Taktfrequenz checken. Rein theoretisch müsste das mit dieser
xtal-Formel super funktionieren (wenn ich sie richtig verstanden habe:
Zeit in us * Frequenz 1000000  Länge der Schleife(Anzahl Takte). Ich
hab auch auf der Befehlsliste nochmal die Anzahl der Takte überprüft,
eigentlich müsste es passen.

Aber wenn ich das mal als Probe auf die Warteschleifen vom LCD
übertrage (50 us), dann ist das viel zu kurz. Ich komme laut Formel 50
* 1000000 / 1000000 /3 gibt 16,67. Ich hab jetzt mal getestet, bis
wohin die Schleife zählen muss, um eine stabile Anzeige zu erhalten.
Das ist bei 77 Dez, oder 4d hex.

Irgendwo ist da der Wurm drin.

Die Takteinstellungen im ATMega hab ich auf Standart gelassen. d.h. 1
Mhz interner Oszi. Vielleicht stimmt damit was nicht.

Sanlo

von Sanlo (Gast)


Lesenswert?

so... der ATMega hat irgendwie ne Macke, trotz eingestellter
Standart-Werte hat er ne größere Freq.,ich hab zum Glück mehrere davon.
Ich hab jetzt einen Neuen genommen und jetzt passt das mit der
xtal-Formel.

jetzt zeigt er dauernd -110.5 °C an. Das kann ja wohl auch nicht ganz
sein...


->Sanlo

von Sanlo (Gast)


Lesenswert?

aha... der Zeiger ist schuld! Ich hab die Pointeradressen vergessen.
Wonach geht man beim Einstellen der Adressen? Welche Werte nimmt man?

->Sanlo

von Peter D. (peda)


Lesenswert?

"Wonach geht man beim Einstellen der Adressen? Welche Werte nimmt
man?"

Na genau die Adresse, wo man vorher den Wert abgelegt hat, den man nun
anzeigen will. Schau mal ins *.h-File (temp_ptr).


Peter

von Sanlo (Gast)


Lesenswert?

so jetzt zeigt er eine Temp. an, und wenn ich alle drei Sensoren
anschließe bekomme ich nur den letzten Sensor angezeigt (Vermute ich
zumindest, da es der mit der längsten Leitung ist.

Was muss ich jetzt machen, um alle drei Werte angezeigt zu bekommen?

Sorry, daß ich nerve Peter, aber dein Programm ist so komplex, daß ich
manche Sachen echt nicht verstehe.

Ich hoffe, du hast Mitleid und hilfst mir noch ein bisschen. ;-)

Danke, Sanlo

von Sanlo (Gast)


Lesenswert?

ok teilweise gefunden. Hab in lcd_data den lcd_count nicht hochgezählt.
Jetzt hab ich zwei Werte.

...und den dritten krieg ich auch noch... :-)

->Sanlo

von Sanlo (Gast)


Lesenswert?

ist das Prog nur für 2 Sens. geeignet? Ich hab jetzt zum Testen mal aus
display_temp den Teil rauskopiert, der die Temp. anzeigt, also von
"get low byte" bis zur Anzeige von "°C".

Interessanterweise zeigt er für den dritten Sensor 0.0°C an. Ich glaub,
ich werd erstmal den Sensor checken.

->Sanlo

von Peter D. (peda)


Lesenswert?

"ist das Prog nur für 2 Sens. geeignet?"

So siehts aus. Der Tiny12 hat ja nicht viel Speicher.

Und so werden die 2 letzten Lesungen gespeichert:
1
rcall   w1_byte_rd                      ;low byte
2
mov     temp2l, temp1l
3
mov     temp1l, a0
4
rcall   w1_byte_rd                      ;high byte
5
mov     temp2h, temp1h
6
mov     temp1h, a0


Sollte leicht auf 3 erweiterbar sein.
Man könnts natürlich auch für Pointer umschreiben.


Peter

von Sanlo (Gast)


Lesenswert?

juhuuuuu...

Danke Peter, du hast mir wieder den richtigen Tip gegeben. Jetzt zeigt
er alle drei Temps richtig an!

->Sanlo

von Sanlo (Gast)


Angehängte Dateien:

Lesenswert?

so fall es jemanden interessiert...

meine Variante mit Bild vom Versuchsaufbau

->Sanlo

von Dubbster (Gast)


Angehängte Dateien:

Lesenswert?

hey könnts ma da weiter helfen,versuch ds180 auszulesen,schaff des ned 
mit dem 1 wire port,muss des in c programmiern.

bitte,bin schon verzweifelt

von Peter D. (peda)


Lesenswert?

Wer mich kennt weiß, daß ich keinen Entrarer installiert hab.

Bezieht sich die Frage denn wirklich auf meinen Beispielkode ?

Ansonsten, Hijacker verkrümeln sich bitte ins Fragen-Forum.


Wie lautet überhaupt die Frage ?

Ohne konkrete Frage keine Antwort.


Peter

von Dubbster (Gast)


Lesenswert?

wie ich 1 byte dem ds1820 übermitteln kann!

von Dubbster (Gast)


Lesenswert?

hey,was könnte da nicht stimmen,wenn er immer schreibt SCON undefined 
indentifier

#include<reg517.h>
#include<stdio.h>


//---------------------------------------
// Initialize serial port
//---------------------------------------



void InitSerial(void)
{
    TMOD = 0x20;    // Timer 1=8-Bit-relod
    TH1  = 0xFD;    // TH1
  TR1   = 1;      // Timer 1 starten
  SCON = 0x52;    // Freigabe von Sender & Empfänger
}

jedoch bin ich der meinung,dass der quellcode korrekt ist!

von Peter D. (peda)


Lesenswert?

Och nö, nochn Hijacker.

Ein bischen Benimmse schadet auch in Foren nicht.


Peter

von Jens G. (jensgrumme)


Lesenswert?

Einen schönen Guten Morgen, bin seit heut morgen neu hier im Forum.

Ich beschäftige mich seit gut einer Woche mit dem Thema microcontrollern 
und habe auch schon die ersten klein Versuche sprich LED Blinken zu 
lassen und auch Lauflicht erfolgreich zu programmieren.

Besitze folgende Hardware.

Die Atmega 16, 32 und den 644. Das AtmelmStudio 6.
Habe dann noch ein LCD Modul AV 2040 von Conrad.

Jetzt wollte ich ganz gern auf dem LCD Modul Uhrzeit Datum und 
Temperatur anzeigen lassen.

Kann ich den, den hier oben zur Verfügung stehenden Quellcode benutzen, 
wie gesagt habe nur die drei Controller zur Verfügung.

Oder muss ich das Programm dann noch anpassen .

Würde mich über Antworten freuen.

Bis dahin wünsche ich euch noch ein schönes Weihnachtsfest.


Mit Freundlich Grüßen
Jens Grumme

von Christian S. (roehrenvorheizer)


Lesenswert?

Hallo,

Benutzen kanst Du den Code natürlich.
Du wirst die PORT-Ein- und Ausgänge an die von Dir aufgebaute Schaltung 
anpassen müssen sowie einige Registernamen an deine Mega-Typen anpassen 
müssen. Dabei hilft Dir die Registertabelle am Ende des Datenblattes 
weiter. Du suchst also das Register des originalen Prozessors in dessen 
Datenblatt heraus und suchst im Datenblatt des neuen Prozessors das 
Register mit der gleichen Funktionalität heraus.


Dann fehlerfrei compilieren für Deinen Prozessor und in den Flash des µC 
laden.


Gruß

von Bernd S. (Firma: Anscheinend Corner-Cases ;-)) (bernd_stein)


Lesenswert?

Hallo Peter D. (peda) und alle anderen Interessierten,

ich weiß es ist schon sehr, sehr, sehr lange her, aber weißt du noch 
welchen Algoryhtmus ( ROM Search ) du damals für dieses AVR8ASM-Projekt 
verwendest hattest oder hattest du dir selbst etwas ausgedacht ?

Diesen aus der Maxim App. Note 187 anscheinend nicht:

Beitrag "Re: DS1820 DS18S20 1-wire Suchalgorithmus Suchalgorithmen"

Bernd_Stein

: Bearbeitet durch User
von Bernd S. (Firma: Anscheinend Corner-Cases ;-)) (bernd_stein)


Lesenswert?

Hier ist doch was faul. Einsprung bei dec_out:
Bei einer dreistelligen Zahl z.B. 255, werden die Hunderter richtig 
angezeigt, für die Zehner wird Space ( $32 ) erzeugt und ...
1
;
2
;************************************************************************/
3
;*                  */
4
;*      Display values on LCD        */
5
;*                                                                      */
6
;*                                                                      */
7
;*              Author: Peter Dannegger                                 */
8
;*                      danni@specs.de                                  */
9
;*                                                                      */
10
;************************************************************************/
11
;************************************************************************/
12
;-------------------------------------------------------------------------
13
;        Display value as "00" ... "255"
14
;-------------------------------------------------------------------------
15
;input: a0 = value 0..255
16
;
17
dec_out00:
18
  set
19
  mov  a3, a0
20
  subi  a3, 100
21
  brcs  _dou2    ;if < 100
22
;-------------------------------------------------------------------------
23
;        Display value as "0" ... "255"
24
;-------------------------------------------------------------------------
25
;input: a0 = value 0..255
26
;used:  a0, a1, a2, a3
27
;
28
dec_out:
29
  mov  a3, a0
30
  clt      ;to suppress preceding zero
31
  ldi  a0, '0' - 1
32
_dou1:  inc  a0
33
  subi  a3, 100
34
  brcc  _dou1
35
  rcall  _dou6    ;output hundrets
36
_dou2:  ldi  a0, '0' + 10
37
_dou3:  dec  a0
38
  subi  a3, -10
39
  brcs  _dou3
40
  rcall  _dou6    ;output tens
41
  subi  a3, -'0'
42
  mov  a0, a3    ;output ones
43
_dou4:  set
44
_dou5:  rjmp  lcd_data
45
;
46
_dou6:  brts  _dou5    ;check preceding zero
47
  cpi  a0, '0'
48
  brne  _dou4
49
  ret
50
;-------------------------------------------------------------------------
Bernd_Stein

[Mod: Formatierung angepasst]

: Bearbeitet durch Moderator
von hacker-tobi (Gast)


Lesenswert?

Hi Peter,

ich weiss nicht ob es schon jemand gemeldet hat. In den Komentaren in 
GETTIME.INC ist ein Fehler. Du schreibst bei der Zeitumstellung von 
September

  cpi  month, 10
  brne  _iti4      ;not march / september: no change
  clt        ;prepare for winter if september

vergleichst es dann aber -korrekterweise- mit Oktober ;)
Ist also nur im Kommentar falsch beschrieben.

Beitrag #6904096 wurde vom Autor gelöscht.
Beitrag #6904101 wurde vom Autor gelöscht.
von Joachim B. (jar)


Angehängte Dateien:

Lesenswert?

Bernd S. schrieb:
> Hier ist doch was faul. Einsprung bei dec_out:

hacker-tobi schrieb:
> ich weiss nicht ob es schon jemand gemeldet hat. In den Komentaren in
> GETTIME.INC ist ein Fehler.

man kann dem Peter eine PN schicken!
Er muss ja hier nicht immer mitlesen!

simpel ist doch, kleines Steckbrett, Arduino nano328, LCD5110, RTC 3231 
oder DS18B20

von Frank M. (ukw) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

Bernd S. schrieb:
> Hier ist doch was faul.

Bitte verwende die Tags [ code ] bzw. [ /code ] (ohne Leerzeichen), um 
den Code zu formatieren. Sonst sieht das nämlich so aus wie im 
angehängten Bild - zumindest auf mobilen Geräten.

Ich habe Deinen Beitrag mal angepaast, siehe oben.

: Bearbeitet durch Moderator
von Bernd S. (Firma: Anscheinend Corner-Cases ;-)) (bernd_stein)


Angehängte Dateien:

Lesenswert?

1
;************************************************************************/
2
;*                                 */
3
;*      Display values on LCD        */
4
;*                                                                      */
5
;*              Author: Peter Dannegger                                 */
6
;*                      danni@specs.de                                  */
7
;* mit Aenderungen f. Temperatursensor ( DS18B20 ) von Unbekannt        */
8
;************************************************************************/
9
;************************************************************************/
10
;-------------------------------------------------------------------------
11
;      Anzeige ohne fuehrende Nullen 
12
;-------------------------------------------------------------------------
13
;input: a = value 0..255
14
;used:  a, b, c
15
;
16
_dec_out:
17
 tst   a                ;Negativer Wert ?
18
 brpl  _positiv         ;Nein -> springen
19
 mov   c,a              ;Wert sichern
20
 ldi   a,$10            ;Cursor einen nach links um bei Minus Anzeige..
21
 rcall _lcd_cmd         ;..noch formatiert zu bleiben
22
 ldi   a,'-'
23
 rcall _dou4            ;Zeichen ausgeben
24
 mov   a,c              ;gesicherten Wert zurueck holen
25
 neg   a                ;In positives Aquivalent umwandeln
26
_positiv:
27
 mov   c, a             ;Wert f. weiterverarbeitung kopieren
28
 subi  c, 100           ;Hunderter ermitteln
29
 brcc  _hunderter  ;if > = 100, die hunderter Stelle auswerten..
30
 ldi   a,' '            ;..ansonsten die hunderter Stelle durch Space ersetzen..
31
 rjmp  _dou2            ;..und dies ausgeben
32
_hunderter:
33
 mov   c, a             ;Wert wieder neu laden und..
34
 ldi   a, '0' - 1       ;..Hunderter zaehlen..
35
_dou1:  
36
 inc   a                ;..wobei die Ziffer in ASCII umgewandelt wird
37
 subi  c, 100           ;100 subtrahieren
38
 brcc  _dou1            ;< 100 -> Nein -> weiter zaehlen
39
_dou2: 
40
 rcall _dou4    ;output hundrets
41
_zehner:
42
 ldi   a, '0' +10       ;Zehnerstelle in ASCII umwandeln..
43
_dou3:  
44
 dec   a                ;..und ASCII rueckwaerts von '9'
45
 subi  c, -10           ;Zehner x +10
46
 brcs  _dou3            ;Zehner gezaehlt ? NEIN -> weiter zaehlen
47
 rcall _dou5    ;output tens
48
 subi  c,-'0'           ;Einerstelle in ASCII uberfuehren
49
 mov   a, c    ;output ones
50
_dou4:  
51
 rjmp  _lcd_data        ;ASCII-Zeichen ausgeben
52
_dou5:  
53
 cpi   a, '0'           ;Ist die Ziffer eine Null ?..
54
 brne  _dou4            ;..Nein -> Ziffer ausgeben..
55
 ldi   a,' '            ;..ansonsten erst durch Space ersetzen und..
56
 rjmp  _dou4            ;..jetzt ausgeben
57
;-------------------------------------------------------------------------

Mich stört ein wenig, dass das Minuszeichen nicht direkt an dem Wert 
steht, aber da ich durch PeDa's Code sowieso nicht ganz durchblicke muss 
ich wohl damit leben.

Formatierung sieht in der Vorschau fast gut aus, das muss jetzt reichen, 
habe keine Lust immer zu gucken wie es in diesem Fenster aussieht und 
dann in der Vorschau.

Bernd_Stein

von Bernd S. (Firma: Anscheinend Corner-Cases ;-)) (bernd_stein)


Lesenswert?

Ganz blöde Idee.
Man denke jetzt mal an 101°C -> 1 1°C.


Bernd_Stein

von Bernd S. (Firma: Anscheinend Corner-Cases ;-)) (bernd_stein)


Angehängte Dateien:

Lesenswert?

Bernd S. schrieb:
> Ganz blöde Idee.
> Man denke jetzt mal an 101°C -> 1 1°C.
>
Ok, diesen Fehler konnte ich mit Hilfte des T-Flags, korrigieren.
Bleibt leider immer noch der Schönheitsfehler mit dem Minuszeichen, 
welches nicht direkt vor dem Wert steht. Außer natürlich es ist ein 
hunderter Wert.

Ach, übrigens - auch wenn am Ende, bzw. überhaupt kein RET-Befehl steht, 
ist diese Routine mit einem RCALL,- oder CALL-Befehl aufzurufen.
1
;************************************************************************/
2
;*                                                               */
3
;*      Display values on LCD                                      */
4
;*                                                                      */
5
;*              Author: Peter Dannegger                                 */
6
;*                      danni@specs.de                                  */
7
;* mit Aenderungen f. Temperatursensor ( DS18B20 ) von Unbekannt        */
8
;************************************************************************/
9
;************************************************************************/
10
;-------------------------------------------------------------------------
11
;        Anzeige ohne fuehrende Nullen 
12
;-------------------------------------------------------------------------
13
;input: a = value 0..255
14
;used:  a, b, c
15
;
16
_dec_out:
17
 tst   a                ;Negativer Wert ?
18
 brpl  _positiv         ;Nein -> springen
19
 mov   c,a              ;Wert sichern
20
 ldi   a,$10            ;Cursor einen nach links um bei Minus Anzeige..
21
 rcall _lcd_cmd         ;..noch formatiert zu bleiben
22
 ldi   a,'-'
23
 rcall _dou4            ;Zeichen ausgeben
24
 mov   a,c              ;gesicherten Wert zurueck holen
25
 neg   a                ;In positives Aquivalent umwandeln
26
 _positiv:
27
 mov   c, a             ;Wert f. weiterverarbeitung kopieren
28
 subi   c, 100           ;Hunderter ermitteln
29
 brcc   _hunderter        ;if > = 100, die hunderter Stelle auswerten..
30
 ldi   a,' '            ;..ansonsten die hunderter Stelle durch Space ersetzen..
31
 clt                    ;Keine Hunderter vorahanden
32
 rjmp  _dou2            ;..und dies ausgeben
33
_hunderter:
34
 set                    ;Hunderter vorhanden
35
 mov   c, a             ;Wert wieder neu laden und..
36
 ldi   a, '0' - 1       ;..Hunderter zaehlen..
37
_dou1:  
38
 inc   a                ;..wobei die Ziffer in ASCII umgewandelt wird
39
 subi   c, 100           ;100 subtrahieren
40
 brcc   _dou1            ;< 100 -> Nein -> weiter zaehlen
41
_dou2: 
42
 rcall _dou4          ;output hundrets
43
_zehner:
44
 ldi   a, '0' +10       ;Zehnerstelle in ASCII umwandeln..
45
_dou3:  
46
 dec   a                ;..und ASCII rueckwaerts von '9'
47
 subi   c, -10           ;Zehner x +10
48
 brcs   _dou3            ;Zehner gezaehlt ? NEIN -> weiter zaehlen
49
 rcall _dou5          ;output tens
50
 subi  c,-'0'           ;Einerstelle in ASCII uberfuehren
51
 mov   a, c             ;output ones
52
_dou4:
53
 rjmp  _lcd_data        ;ASCII-Zeichen ausgeben
54
_dou5:  
55
 cpi   a, '0'           ;Ist die Zehnerziffer eine Null ?..
56
 brne   _dou4            ;..Nein -> Zehnerziffer ausgeben..
57
 brts  _dou4            ;Waren vorher Hunderter vorhanden ? Ja ->  Null ausgeben
58
 ldi   a,' '            ;..Nein -> Null durch Space ersetzen und..
59
 rjmp  _dou4            ;..jetzt ausgeben
60
 ;------------------------------------------------------------------------------

Bernd_Stein

: Bearbeitet durch User
von Veit D. (devil-elec)


Lesenswert?

Hallo,

wegen deiner Frage
Beitrag "Re: Assembler lernen für Mikrocontroller-Programmierung"

Entweder die Anzahl der Ziffern vorm Komma ermitteln und dann vor deren 
Ausgabe '-' oder Leerzeichen ausgeben. Oder die Ziffern in einen Buffer 
schreiben und vor dessen Ausgabe '-' oder Leerzeichen ausgeben. Dazu 
passend vorher die Spalte berechnen/korrigieren.

von Bernd S. (Firma: Anscheinend Corner-Cases ;-)) (bernd_stein)


Angehängte Dateien:

Lesenswert?

Veit D. schrieb:
> Hallo,
>
> wegen deiner Frage
> Beitrag "Re: Assembler lernen für Mikrocontroller-Programmierung"
>
> Entweder die Anzahl der Ziffern vorm Komma ermitteln und dann vor deren
> Ausgabe '-' oder Leerzeichen ausgeben. Oder die Ziffern in einen Buffer
> schreiben und vor dessen Ausgabe '-' oder Leerzeichen ausgeben. Dazu
> passend vorher die Spalte berechnen/korrigieren.
>
Ok, die vorhandene Routine kann ich also hierzu nicht anpassen bzw. nur 
mit grösserem Aufwand.

Habe mal wieder einen Fehler korrigiert.
Wenn vorher ein negativer Wert angezeigt wurde und danach ein positiver 
an dieser Stelle, blieb das Minuszeichen weiterhin angezeigt.

Bernd_Stein

von Veit D. (devil-elec)


Lesenswert?

Hallo,

Assembler kann ich nicht. Kann nur C/C++. Vielleicht kannste folgendes 
in Assembler umsetzen. Lege dir einen Buffer für die maximal mögliche 
Zeichenlänge an. Damit wäre das stehen lassen von alten Zeichen 
automatisch behoben. Dann die Anzahl der Ziffern ermitteln. Position vor 
der ersten Ziffer ermitteln und ggf. '-' einfügen. Also am Besten von 
hinten nach vorn in den Buffer die Ziffern und Komma schreiben. Den Rest 
davor mit Leerzeichen auffüllen. Damit hätte man alles sortiert im 
Buffer stehen. Damit bleibt die Cursorposition auf dem Display immer 
gleich. Damit wird immer alles auf dem Display ab Cursorposition 
überschrieben. Wäre das machbar?

von c-hater (Gast)


Lesenswert?

Veit D. schrieb:

> Vielleicht kannste folgendes
> in Assembler umsetzen.
[...]

Dein Hilfsbedürfnis in allen Ehren, aber bei Bernd S. verpufft das 
vollkommen nutzlos.

OK, wenn du selber kein Assembler kannst, kannst du seine Werke 
sicherlich nicht kompetent einschätzen, aber zum Vergleich: was würdest 
du von einem C-Programmierer halten, der nach nachweislich mindestens 10 
Jahren(!!!) Praxis immer noch nicht in der Lage ist, so eine einfache 
Aufgabe alleine zu lösen?

Genau...

Und das ist auch von Bernd S. und seinen 
Assembler-Programmierfähigkeiten zu halten...

von Veit D. (devil-elec)


Lesenswert?

Hallo,

wenn das verpuffen würde wäre es in der Tat sehr Schade. Bernd kann ich 
nicht einschätzen. Ich kann nur einschätzen wie das Forum tickt. Gibt es 
überhaupt keine Antworten, dann ist das Problem bzw. dessen Lösung zu 
einfach und es fordert niemanden heraus. Was dann schon zum Eigenen 
umdenken führte.  ;-)

@ Bernd, nur Mut, rein in die Kartoffeln ...

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.