erstellt 03.10.2008
Einfache  Uhr mit Atmega 8

Hier nun einmal der Versuch mit einem Atmega 8 eine Uhr zu realisieren. Sicherlich gibt es viele Möglichkeiten eine Uhr zu realisieren , ich fange hier aber erst einmal mit einer einfach zu realisierende , allerdings nicht allzu genauen Uhr an. Aber hier kommt es in erster Linie auf den Weg dorthin an. Später dann kann man sich immer noch mit den etwas genaueren Uhren befassen. Um also eine Uhr sein eigen nennen zu können , müssen wir erst einmal einen Takt von 1 Hz erzeugen.
 
Plan vergrößern
Programm in Basic

Led am Ausgang Port BD.5 blinkt im 1 Herz Rhythmus
Timer wird auf einen bestimmten Wert voreingestellt um auf eine 1 Hz Zeitbasis zu kommen.
Dazu wird erst einmal die Frequenz des Quarz 3686400 durch 1024 geteilt ist in diesem Fall 3600.
Dieser Wert wird vom Höchsten Zählwert subtrahiert
Also 1024 minus 3600 bleibt 61935 übrig
Dieser Wert wird voreingestellt

Display an folgenden Ports:
Enable = Port B.5
RS = Port B.4
DB7 = Port B.3
DB6 = Port B.2
DB5 = Port B.1
DB4 = Port B.0

Taster für Stunden stellen an Port D.3
Taster für Minuten stellen an Port D.2
Led Rot an Port D.5
Led Blau an Port D7


Kommentar in Blau
$regfile "m8def.dat"
Definiert denAtmega als Atmega8
$baud = 9600 Gibt die Baudzahl für die Rs232 Kommunikation mit einem Terminal Programm an
$crystal = 3686400
Gibt die Quarzfrequenz an in Herz
Config Lcd = 16 * 2
definiert das LCD Display in Art und Größe
Dim Sekunde As Word
Variable "Sekunde" wird als Word gesetzt
Dim Minute as Word Variable "Minute" wird als Word gesetzt
Dim Sunde as Word Variable "Stunde " wird als Word gesetzt
DDRd=&B10100000
Datenrichtungsregister setzt Port D5 und d.7 als Ausgang ,alle anderen als Eingang
Portd=&B00001100
PullUp Widerstand an Portd.2 und d.3 aktivieren
Config Timer1 = Timer , Prescale = 1024
Bestimmt das Timer 1 verwendet wird und teilt Takt durch 1024
Enable Timer1
startet Timer 1
On Timer1 Test
Hier wird dem Timer gesagt das er zum Programmpunkt 'Test" springen soll wenn der Timer einen Überlauf meldet
Enable Interrupts
Hier wird der Interrupt aktiviert
   Timer1 = 61935
Voreinstellung des Timers
Uhr Voreinstellung
 Sekunde = 0 Variable Sekunde wird hier auf den Wert Null gesetzt
 Minute = 0 Variable Minute wird hier auf Null gesetzt
 Stunde = 0
Variable Stunde wird hier auf Null gesetzt
Hier kommt das Hauptprogramm rein
 Do
Anfang einer Schleife die mit Loop zurück springt
 Portd.5=0
Led Rot aus
 Portd.7=0Led Blau aus
Anzeige der Stunden, Minuten, Sekunden auf dem Display
 cls
Display löschen
locate 1,15 Cursor im Display auf Zeile 1., und Spalte15 setzen
Lcd Sekunde
Inhalt der Variable "Sekunde" auf dem LCD anzeigen
Locate 1,12 Cursor im Display auf Zeile 1, Spalte12setzen
Lcd ":" Doppelpunkt auf Display zeigen
 Locate 1,10Cursor im Display auf Zeile 1., und Spalte10 setzen
 Lcd MinuteMinuten auf Display anzeigen
 Locate 1,8Cursor im Display auf Zeile 1., und Spalte 8 setzen
 Lcd ":" Doppelpunkt auf Display anzeigen
 Locate 1,6Cursor im Display auf Zeile 1., und Spalte6 setzen
 Lcd Stunde Inhalt der Varable "Stunde" auf Display anzeigen
 Locate 1,1Cursor im Display auf Zeile 1., und Spalte1 setzen
 Lcd "Uhr"Das Wort " Uhr " auf Display ausgeben
Cursor off NoblinkCursor ausblenden
Waitms 50Pause von 50 Millisekunden
Anzeigen der Stunden , Minuten, Sekunden auf dem Terminal
Print "Uhrzeit " ; "";Stunde ; ":" ; Minute ; ":" ; Sekunde Anzeigen der Uhrzeit über Terminal ( RS232)
Stunden  , Minuten , Sekunden beim Überlauf wieder auf Null setzen
if Sekunde > 59 then Minute = Minute +1 Wenn Sekunde über 59 dann auch Minute hochzählen
if Sekunde > 59 then Sekunde = 0 Wenn Sekunde über 59 dann wieder bei Null anfangen
if Minute > 59 then Stunde = Stunde + 1
if Minute > 59 then Minute = 0
If Stunde > 23 then Stunde = 0
Minuten einstellen
if Pind.2 = 0 then Wenn Taster an Pin D.2 gedrückt ist
Waitms 50 50ms Warten damit Tastenprellen unterdrückt wird
if Pind.2 = 0 Wenn PinD.2 gedrückt dann
incr Stunde Stunde um eins hochzählen
if Pind.2 =0 then Portd.7=1 wenn PinD.2 gedrückt dann Led an Portd.7 an ( Led Blau)
Else sonst
Portd.7 = 0 Led an Portd.7 aus
End if Ende der 1.if Anweisung
End if Ende der 2.If Anweisung
Stunde einstellen
if Pind.3=0 then Wenn Taster an Pind.3 gedrückt ist
waitms 50 50ms warten damit Tastenprellen unterdrückt wird
if Pind.3 = 0 then wenn Pind.3 gedrückt dann
incr Minute Minute um eins hochzählen
if Pind.3 = 0 then Portd.7=1 wenn Pind.3 gedrückt dann Portd.7 an (Led Blau)
Else sonst
Portd.7=0 Portd.7 aus
end if Ende der 1.If Anweisung
end if Ende der 2. If Anweisung
Uhr komplett auf Null stellen
if Pind.2 = 0 and Pind.3 = 0 then Wenn Taster an Pind.2 und Taster an Pind.3 gedrückt dann
Sekunde = 0 Sekunde auf Null stellen
Minute = 0 Minute auf Null stellen
Stunde = 0 Stunde auf Null stellen
Portd.7 = 1 und Portd.7 Blaue Led einschalten
waitms 50 Pause
end if Ende der If Anweisung


Loop Schleifenrücksprung zum Anfang " Do"
end Programm Ende


Sprungmarke von Timer 1 
Test:
Hier wird vom Befehl " On Timer1 Test" hingesprungen
Sekunde = incr Sekunde wird jeweils um 1 hochgezählt
Timer1 = 61935 'Timer soll ab 61935 hochzählen
Portd.5 = 1 Port d.5 einschalten ( Rote Led)
Return
Rücksprung zum Befehl vom Timer1
Programm laden

Wir haben nun festgestellt, das die hier vorgestellte Uhr , nicht das richtige Format anzeigt   (00:00:00) !
Wir werden das mit dem folgenden Programm ändern, indem wir mit dem hinzugekommenden Befehl  ( FORMAT ) die Struktur der Ausgabe  auf eine übliche abändern.Das in blauen Hintergrund, sind die neu hinzugefügten Zeilen. Das mit grünem Hintergrund sind ausgewechselte Zeilen

Uhr 2
   
' läßt Led (Rot)am Ausgang Port BD.5 im 1 Herz Rythmus blinken
'
' Timer wird auf einen bestimmten Wert voreingestellt
' Um auf eine 1 Hz Zeitbasis zu kommen.
' Dazu wird erst einmal die Frequenz des Quarz durch 1024 geteilt
' ist in diesem Fall 3600.
' Diser Wert wird vom Höchsten Zählwert subtrahiert
' Also 1024 minus 3600 bleibt 61935 übrig
' Dieser Wert wird voreingestellt
'
' Über Taster an D2 werden die Stunden eingestellt
' Über Taster an D3 werden die Minuten eingestellt
' Beim drücken beider Taster gleichzeitig, wird Uhr auf Null zurückgestellt

'---------------- Pinbelegung--------------------------------------------------
' Display an folgenden Ports
' Enable = Port B.5
' RS     = Port B.4
' DB7    = Port B.3
' DB6    = Port B.2
' DB5    = Port B.1
' DB4    = Port B.0
' Taster an Port D.2
' Taster an Port D.3
' Led    an Port D.5 Rot
' Led    an Port D.7 Blau
   Uhr

Kommentar in Blau
$baud = 9600 ' Geschwindigkeit der RS 232 Schnittstelle
$regfile "m8def.dat"  'Definiert den Atmega als Atmega 8
$crystal = 3686400 'Gibt die Quarzfrequenz an in Herz
Config Lcd = 16 * 2'definiert das LCD Display in Art und Größe
Dim Sekunde As Word 'Variable in der Sekunden gespeichert werden
Dim Minute As WordVariable in der Minuten gespeichert werden
Dim Stunde As Word  'Variable in der Stunden gespeichert werden
Dim S1 As String * 2  'Benötigt für Formatumwandlung der Stunden
Dim S2 As String * 2   'Benötigt für Formatumwandlung der Minuten
Dim S3 As String * 2    'Benötigt für Formatumwandlung der Sekunden
Ddrd = &B10100000 ' Port d.5 und d.7 als Ausgang,alle anderen als Eingang definieren
Portd = &B00001100  ' PullUp von Portd2 und Portd.3 aktivieren
Config Timer1 = Timer , Prescale = 1024   'Bestimmt das Timer 1 verwend  wird und teilt Takt durch 1024
Enable Timer1   'startet Timer 1
On Timer1 Test     'Hier wird dem Timer gesagt das er zum Programmpunkt Test springen soll wenn der Timer einen Überlauf meldet
Enable Interrupts 'Hier wird der Interuppt aktiviert
Timer1 = 61935    ' Voreinstellung des Timers
 Uhr Voreinstellung 
Sekunde = 0
Minute = 0
Stunde = 0
 Hier fängt das Hauptprogramm an 
Do    ' Schleifenanfang
Portd.5 = 0  ' Led Rot aus
Portd.7 = 0' Led blau aus
Cls   ' Display löschen
 Formatkonvertierung für Uhrzeit 
' Hier wird unter Zuhilfenahme der Variablen , die Uhrzeit in einen String mit 2 Zeichen umgewandelt, damit Sekunden , Minuten und Stunden , jeweils mit einer Vorangestellten Null angezeigt werden.
S1 = Str(stunde) S1 ist nun die Variable für Stunde
S1 = Format(s1 , "00")
S2 = Str(minute) '  S2 ist nun die Variable für Minuten
S2 = Format(s2 , "00")
S3 = Str(sekunde)
S3 = Format(s3 , "00") ' S3 ist nun die Variable für Sekunden
 Anzeige der Stunden , Minuten, Sekunden auf Display 
Locate 1 , 15 ' Position auf Display
Lcd S3
Locate 1 , 12
Lcd ":"
Locate 1 , 10
Lcd S2
Locate 1 , 8
Lcd ":"
Locate 1 , 6      
Lcd S1 ' Sekunde auf Display anzeigen
Locate 1 , 1
Lcd "Uhr"
Cursor Off Noblink            ' Cursor Ausblenden
Waitms 50       ' Pause 50 ms



Print "Uhrzeit" ; " " ; S1 ; ":" ; S2 ; ":" ; S3  Anzeigen  der Stunden, Minuten, Sekunden auf Terminal 
Stunden Minuten Sekunden beim Überlauf auf Null setzen


 If Sekunde > 59 Then Minute = Minute + 1Wenn Sekunde größer als 59 dann setzt Minute um eins höher
If Minute > 59 Then Stunde = Stunde + 1
If Sekunde > 59 Then Sekunde = 0
If Minute > 59 Then Minute = 0
If Stunde > 23 Then Stunde = 0
Stunden stellen
 If Pind.2 = 0 Then
Waitms 50
If Pind.2 = 0 Then
 Incr Stunde 
 If Pind.2 = 0 Then Portd.7 = 1
 Else
Portd.7 = 0
 End If
End If
Uhr einstellen Stunde 
If Pind.3 = 0 Then
Waitms 50
If Pind.3 = 0 Then
Incr Minute
If Pind.3 = 0 Then Portd.7 = 1
Else
Portd.7 = 0
End If
End If
Uhr komplett auf Null stellen 
If Pind.2 = 0 And Pind.3 = 0 Then
Sekunde = 0
Minute = 0
Stunde = 0
Portd.7 = 1' Blaue Led beim Tastendruck einschalten
Waitms 50
End If
 Loop' Schleifenende
End' Programmende
Ende Hauptprogramm 


'
 Test:Sprungmarke von Timer 1
Incr Sekunde  ' Zählt Sekunde immer um einen Wert hoch
Timer1 = 61935    ' Timer soll ab 61935 hochzählen
Portd.5 = 1  ' Läßt rote Led blinken
 Return

Hier das Programm als Basic downloaden !
Hier der Schaltplan als SPlan Datei

Hier der Betrachter für die Splan Datei

Aktualisiert 14.02.2019