Forum: Mikrocontroller und Digitale Elektronik Uhr-Tutorial


von Thomas E. (feldweg)


Lesenswert?

Hi an alle Bastler,

das erste Uhrbeispiel im Tutorial 
http://www.mikrocontroller.net/articles/AVR-Tutorial:_Uhr#Das_erste_Programm 
habe ich zwei Tage nicht zum laufen gebracht.
Problem war folgendes: Auf dem LCD hat es zuert 00:00:01 angezeigt, 
anschliesend 00:00:000:00:02 dann 00:00:03 und schließlich 
00:00:03????????????

Ich habe ewig jeden Schritt durchdacht bis ich darauf gekommen bin, dass 
in der loop-Schleife vor "rcall lcd_clear" das "rcall lcd_init" fehlt.
Ab da an ging es dann perfekt.

Meine Frage ist nun: Warum rcall lcd_init ????
Das Display wurde doch bereits initialisiert. Oder bin ich ein 
Einzelfall???

Mfg Thomas

PS: ich finde das Tutorial spitze!!!

von luxx (Gast)


Lesenswert?

mal anders:
ein rcall lcd_clear hätte es auch getan,
du hast vergessen, dass wenn die neue uhrzeit kommt dass display 
überschrieben werden muss!

von Thomas E. (feldweg)


Lesenswert?

bei mir hat das rcall lcd_clear nicht gereicht. Ich habe genau den Code 
wie im Tutorial verwendet aber es hat nicht funktioniert. Die Uhrzeit 
wird ja überschrieben. Das lcd_clear bewirkt ja ein löschen des 
Displays, was ich auch eigentlich wollte, nur hat es nicht 
funktioniert...
Könnte es sein dass der Wert in temp1 trotz  ldi   temp1, 0b00000001 
nicht geändert wird und die Sekundenabzählung hier den Effekt bewirken?
Ich habe das Display EA W162B-N3LW

von Asterix-007 (Gast)


Lesenswert?

Moin Männers,

das sieht so aus, als ob du vergessen hast den Cursor wieder zurück "auf 
Anfang" zu setzen. Mit der Init-Routine wird das warscheinlich getan!

Also:
1. LCD löschen
2. Cursor auf Anfang setzen.

Ich habe mir allerdings den Code nicht angesehen, ist nur eine 
Vermutung!

Viel Glück

Asterix-007

von Thomas E. (feldweg)


Lesenswert?

Hab es ausprobiert und den Curser auf Anfang gesetzt, es bleibt jetzt 
bei 00:00:03      ?    stehen. War auch zu erwarten, dass dies nicht 
funktioniert da irgendetwas temp1 verändert und es unabhängig von der 
Position ist.
Trozdem merce für den Vorschlag :-)

Mfg Thomas

von fubu1000 (Gast)


Lesenswert?

Hallo,
welche Lcd_Routinen benutzt du denn ?
Liegt sicher an denen, weil der Code im Tutorial zu 99,99% funzen 
dürfte.
Wahrscheinlich veränderst du die Register r16 bis r19 in denen.

Gruss

von Kachel-Heinz (Gast)


Lesenswert?

LCD_Clear benutze ich nur bei LCD_Init, denn es dauert gegenüber anderen 
LCD-Zugriffen recht lange. Ansonsten lösche ich die Texte durch 
Überschreiben der vorherigen Ausgabe (notfalls auch mit Leerzeichen). 
Bau Dir ein ordentliches Locate-Makro, mit dem Du per 
Set-DD-RAM-Address-Kommando die Ausgabeposition komfortabel einstellen 
kannst und formatiere Deine Ausgabetexte so, dass jeder Text exakt den 
dafür vorgesehenen Platz ausfüllt (und damit den vorherigen Text restlos 
überschreibt).

Das Tutorial ansich ist gut. Die darin gezeigten Routinen dienen dem 
Verständnis beim Anfänger, sind also bewusst recht einfach gehalten. 
Somit sind sie (die Routinen) allerdings nicht unbedingt optimal. Da ist 
also auch die Kreativität des Benutzers gefragt, der sich nach dem 
Lesen, Verstehen und Testen der Tut-Routinen seine eigenen Routinen 
bastelt, die seinen Bedürfnissen entsprechen und die er dann auch 
versteht.

KH

von Thomas E. (feldweg)


Lesenswert?

Hi,

danke erst mal... war wäre man ohne gute Menschen

das mit der Locate-Routine ist ne gute Idee, aber dafür gibts ja auch 
extra den Befehl hier: 
http://www.mikrocontroller.net/articles/AVR-Tutorial:_LCD#Display_RAM_Address_Set:_0b1aaaaaaa

Ich verwende den Code im Tutorial, habe nur eine leichte Änderung in 
lcd_routines vorgenommen und alles ab lcd_number gelöscht und die 
Registerdefinitionen oben gelöscht

Ich bin mittlererweile der Ansicht das mein LCD irgendwelchen Blödsinn 
macht. Weil in lcd_clear wird ja der Wert im Stack gespeichert und 
anschließend geändert, was sich auch im AVR-Studio4 zeigt bei mir.
Nur das LCD macht dies anscheinend nicht.
Ich habe lcd_command in lcd_clear ausgegliedert und dann spinnt es nicht 
mehr sondern speichert den Wert jeweils immer hintereinander, also 
00:00:01:00:00:02:00:00:03usw.
hat dieses Problem schon mal wer gehabt?

von Peter D. (peda)


Lesenswert?

Thomas Eichstetter wrote:

> hat dieses Problem schon mal wer gehabt?

Dein Hauptproblem ist, daß keiner weiß, was Du da überhaupt machst.

Zu sagen, der Code ist irgendwie ähnlich zu irgendeinem Tutorial, reicht 
nicht!

Du mußt endlich mal Deinen exakten Code inklusive aller verwendeten 
LCD-Unterfunktionen als Anhang senden.

Selbstverständliche Angaben wie MC-Bezeichnung, MC-Takt gehören 
natürlich auch dazu.

Dann kann man auch mal nen Blick drauf werfen, wo der Fehler ist.

Ansonsten bleibt alles nur Rätselraterei.


Peter

von Thomas E. (feldweg)


Angehängte Dateien:

Lesenswert?

Ja du hast Recht, also hier das UHR1.asm

Ich verwende 4MHz interner Takt des Atmega8
Programmierstation ist das STK500
Entwicklungsumgebung AVR-Studio4

Ganz unten habe ich die Zahlenübersetzung geändert, weil im Tutorial das 
temp2 as Speicherort gewählt wird, jedoch die Routine temp1 verlangt

Und bei dem zweiten lcd_init habe ich eine Bemerkung dahintergeschrieben

Mit freundlichem Gruß
Thomas

von Thomas E. (feldweg)


Angehängte Dateien:

Lesenswert?

Das ist die Routine

von fubu1000 (Gast)


Lesenswert?

Hallo,
also bei lcd_clear und home musste auf jeden schonmal temp2(r17 glaub 
ich) sichern, da in der delay_5ms benutzt wird.

Die andere Routine schau ich mir später an.

Gruss

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.