Forum: Mikrocontroller und Digitale Elektronik Uhren Tuto mit Wecker


von Claude B. (claude44)


Angehängte Dateien:

Lesenswert?

Guten Tag

Ich habe die Uhre der Tuto genohmmen, für die 8515 umgebaut, 
funktioniere einwandfrei. Dieser Uhr startet leider bei 00, und ich habe 
angefangen mit 2 Taster die Einstellung zu ermöglichen was aber auch 
scheinbar ohne Probleme lief. Ich wollte aber ein Weckfunktion einbauen, 
Die Routines dazu habe ich vorbereitet, der Summer möchte ich später mit 
ein Timmer erledigen, aber ich kanne in mein Datenblatte nicht finden 
wie ich die Anzeige der Wecker auf die 2. zeile einbringe. Kann mir 
jemand zeigen der beste Weg dafür?
Danke

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Claude B. schrieb:
> ich kanne in mein Datenblatte nicht finden
In welchem Datenblatt schaust du?
Bei den meisten HD44780 kompatiblen Displays beginnt die 2. Zeile an der 
RAM-Adresse 0x40. Du musst also einfach das Kommando SET DDRAM ADDRESS 
einfügen:
http://mil.ufl.edu/3744/docs/lcdmanual/commands.html#Sda

Und auch das Koppeln der Einstell-Taster an das Sekunden-Flag bringt 
sicher ein ungeahnt holpriges und zähes Bediengefühl....

von Claude B. (claude44)


Lesenswert?

Vielen Dank Lothar.
aber Irgend wie, ich bekommen das nicht ins gang, In die Init routine 
sind aber 2 Zeilen eingestellte. ich habe ein Texte ausgabe eingefügt, 
die nur aud die 1. Zeile anzeigt

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Claude B. schrieb:
> aber Irgend wie, ich bekommen das nicht ins gang,

 Irgendwie wundert mich das nicht.
 Hier:
1
 ; Sendet den Befehl: Cursor auf 2-te Zeile
2
lcd_Row2:
3
           ldi temp1, 0xC0
4
           rcall lcd_command
5
           rcall delay5ms
6
           ret

von Claude B. (claude44)


Angehängte Dateien:

Lesenswert?

Vielendank, ich Probiere

Marc V. schrieb:
> ; Sendet den Befehl: Cursor auf 2-te Zeile
> lcd_Row2:
>            ldi temp1, 0xC0
>            rcall lcd_command
>            rcall delay5ms
>            ret

Viellen Dank und es Funktioniert, ich hatte die delay nicht ein gefügt.

Aber jetzt, ich habe ein Zeile (Vorbereitung) eingefügt, auf die 
2.Zeile, ich möchte mein name einfügen, und zur Zeit ich bekomme auf die 
1. Zeile ( Vorberitung)  und auf die 2., Wieder ( Vorbereitung) wie 
bekomme ich das in?

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Claude B. schrieb:
> 1. Zeile ( Vorberitung)  und auf die 2., Wieder ( Vorbereitung) wie
> bekomme ich das in?

 Hier:
1
;-----------------------------------------------------
2
weiter1:  rcall  lcd_clear             ; das LCD löschen
3
    
4
;************************************************************************
5
    ldi  temp1, 0xC0
6
    rcall  lcd_command
7
    rcall  delay5ms
8
    ldi  ZL, LOW(text2*2)
9
    ldi  ZH, High(text2*2)
10
    rcall  lcd_flash_string
11
    ldi  temp1, 0x80
12
    rcall  lcd_command
13
    rcall  delay5ms
14
;************************************************************************
15
16
    mov  temp1, Stunden        ; und die Stunden ausgeben
17
    rcall   lcd_number
18
    ldi     temp1, ':'            ; zwischen Stunden und Minuten einen ':'
19
    rcall   lcd_data
20
    mov     temp1, Minuten        ; dann die Minuten ausgeben

von Claude B. (claude44)


Lesenswert?

Danke Mark für Dein Antwort, es funktioniert.
das bedeutet, dass wenn ich noch Irrgenwo in den Programm ein 2. Zeile 
einbringen möchte, ich muss diese Procedure folgen.
Was bedeutet die 0x80?
Vielen Danke

von spess53 (Gast)


Lesenswert?

Hi

>Was bedeutet die 0x80?

Befehl zum Setzen der DDRAM-Adresse:

         RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0

Set
DDRAM     0  0   1  ADD ADD ADD ADD ADD ADD ADD
address

MfG Spess

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Claude B. schrieb:
> das bedeutet, dass wenn ich noch Irrgenwo in den Programm ein 2. Zeile
> einbringen möchte, ich muss diese Procedure folgen.

 Nein.
1
    ldi  temp2, 2    ;* Cursor auf Zeile 2, Anfang
2
    rcall  SetLcdRow
3
    ldi  ZL, LOW(text*2)
4
    ldi  ZH, High(text*2)
5
    rcall  lcd_flash_string  ;* " Vorbereitung   " ausgeben
6
7
    ldi  temp2, 1    ;* Cursor auf Zeile 1, Anfang
8
    rcall  SetLcdRow
9
    ldi  ZL, LOW(text2*2)
10
    ldi  ZH, High(text2*2)
11
    rcall  lcd_flash_string  ;* " Claude Bochard " ausgeben
12
    ret
13
14
 ; Sendet den Befehl: Cursor auf Zeile in temp2
15
SetLcdRow:
16
    ldi  temp1, 0x80
17
    cpi  temp2, 1
18
    breq  slr_0
19
    ldi  temp1, 0xC0
20
slr_0:
21
    rcall  lcd_command
22
    rjmp  delay5ms

Claude B. schrieb:
> Was bedeutet die 0x80?

Lothar M. schrieb:
> Bei den meisten HD44780 kompatiblen Displays beginnt die 2. Zeile an der
> RAM-Adresse 0x40.

 Demzufolge ist:

 0x80 = RAM Adresse für Zeile 1 +  Kommando SET DDRAM ADDRESS.
 0xC0 = RAM Adresse für Zeile 2 +  Kommando SET DDRAM ADDRESS

von Claude B. (claude44)


Lesenswert?

Vielen Dank Marc
für dieser Ausfühliche Antworte, Ich werde Gleich probieren

von Claude B. (claude44)


Lesenswert?

Ich komme wieder auf meiner klein Uhr, die nicht richtig tickt, wie 
kanne ich diese Einstellen, und wie kann ich die sekunden einstellen, 
gibt es ein Trick?
Danke

von Nils S. (kruemeltee) Benutzerseite


Lesenswert?

Claude B. schrieb:
> Ich komme wieder auf meiner klein Uhr, die nicht richtig tickt, wie
> kanne ich diese Einstellen

Die Uhr läuft falsch?
-> 
https://www.mikrocontroller.net/articles/AVR_-_Die_genaue_Sekunde_/_RTC

Wenn du die Sekunden einstellen willst, brauchst du keinen Trick, 
sondern eine Taste, die die Sekunden heraufzählt.

von Claude B. (claude44)


Lesenswert?

Nils S. schrieb:
> Wenn du die Sekunden einstellen willst, brauchst du keinen Trick,
> sondern eine Taste, die die Sekunden heraufzählt.

Was ich aber gemacht habe,
1.Probleme die Uhr läuft langsmer
2. Die Sekunden Steigen in 1 Sekundentackt, was mein Uhr damit nicht 
eingestell werden kann

Danke für die Link, ich werde versuchen

von Nils S. (kruemeltee) Benutzerseite


Lesenswert?

Taster mit Timer Interrupt von ca. 20mS auslesen.
1
timer_isr() {
2
     if(button_secondsup) {
3
          seconds++;
4
          if(seconds == 60) {
5
                minutes++;
6
                seconds = 0;
7
          }
8
          ...
9
     }
10
}

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Claude B. schrieb:
> 1.Probleme die Uhr läuft langsmer

 Um wieviel langsamer ?

von Claude B. (claude44)


Lesenswert?

Marc V. schrieb:
> Um wieviel langsamer ?

Um die Heft,ungefähr, nicht gemessen und auskommentiert aber wie schon 
gesagt, die sekunden Steigen von 1 pro sekunde, was mir gar nicht nütze

Nils S. schrieb:
> Taster mit Timer Interrupt von ca. 20mS auslesen.

Also ei 2. Timer benutzen?
und dann in der Sekunden_up runtine als Timer(2) routine??
sekunden_up:
    inc  Sekunden
    cpi  Sekunden, 60
    brne  return
    clr  Sekunden
    Ret  (oder iret)
kein Berücksichtigung der Minuten

: Bearbeitet durch User
von Claude B. (claude44)


Lesenswert?

Nils S. schrieb:
> Die Uhr läuft falsch?
> ->
> https://www.mikrocontroller.net/articles/AVR_-_Die_genaue_Sekunde_/_RTC

Ich habe dieser angesehen, um dieser zu Bauen leider muss mein Programm 
ganz neue geschrieben werden, Ich bin aber auch nicht in der Lage das zu 
tun, Vielen dank

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Claude B. schrieb:
> Marc V. schrieb:
>> Um wieviel langsamer ?
>
> Um die Heft,ungefähr, nicht gemessen und auskommentiert aber wie schon

 Dann läuft deine Mega mit 2MHz, oder ?

von Claude B. (claude44)


Lesenswert?

Für die

Nils S. schrieb:
> Die Uhr läuft falsch?

exakt, ich habe auch nur 2MHz eingestellt. noch dazu das Programm 
umgestellt mit CTC-mode, für die Einstellung, bis Morgen warten

Danke

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.