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. |
|
---|---|
Programm in Basic |
|
Led am Ausgang Port BD.5 blinkt im 1 Herz Rhythmus
Display an folgenden Ports: Taster für Stunden stellen an Port D.3 |
|
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=0 | Led 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,10 | Cursor im Display auf Zeile 1., und Spalte10 setzen |
Lcd Minute | Minuten auf Display anzeigen |
Locate 1,8 | Cursor im Display auf Zeile 1., und Spalte 8 setzen |
Lcd ":" | Doppelpunkt auf Display anzeigen |
Locate 1,6 | Cursor im Display auf Zeile 1., und Spalte6 setzen |
Lcd Stunde | Inhalt der Varable "Stunde" auf Display anzeigen |
Locate 1,1 | Cursor im Display auf Zeile 1., und Spalte1 setzen |
Lcd "Uhr" | Das Wort " Uhr " auf Display ausgeben |
Cursor off Noblink | Cursor ausblenden |
Waitms 50 | Pause 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 |
' 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 Word | Variable 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 + 1 | Wenn 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 |