Forum: Mikrocontroller und Digitale Elektronik bascom uhr-datum


von Sven (Gast)


Lesenswert?

Hi,
bin totaler neuling in yC und programmieren. habe aber paar kleine 
sachen jetzt schon probiert. leider klappt es bei meiner uhr nicht so 
wie es soll und ich weiss leider nicht weiter. hoffe bei euch finde ich 
hilfe.

hier der code. könnte man besser schreiben, aber ich wollte es erstmal 
nur probieren. leider geht sie nach paar stunden um paar minuten nach.

' ATMEGA8- Uhr-Datum
$regfile = "m8def.dat"
$crystal = 16000000
$baud = 9600

Config Timer1 = Timer , Prescale = 256                      'Timer 
Konfigurieren
Config Pind.2 = Output
Config Pind.3 = Output


Led1 Alias Portd.2
Led2 Alias Portd.3


On Timer1 Timer_irq

Const Timervorgabe = 3036

Dim Ijahr As Integer
Dim Imonat As Integer
Dim Itag As Integer
Dim Istunde As Integer
Dim Iminute As Integer
Dim Isekunde As Integer


Ijahr = 2008
Imonat = 9
Itag = 25
Istunde = 10
Iminute = 7
Isekunde = 0



Enable Timer1
Enable Interrupts

Do
If Isekunde = 60 Then
   Isekunde = 0
   If Iminute = 60 Then
   Iminute = 0
   If Istunde = 24 Then
   Istunde = 0
   If Ijahr = 2008 Or Ijahr = 2012 Or Ijahr = 2016 Or Ijahr = 2020 Or 
Ijahr = 2024 Then

   'schaltjahr
   If Imonat = 1 Then                  'januar
      If Itag = 31 Then
        Itag = 1
        Imonat = Imonat + 1
      Else
        Itag = Itag + 1
      End If
      Else
      If Imonat = 2 Then              'februar
      If Itag = 29 Then
      Itag = 1
      Imonat = Imonat + 1
      Else
      Itag = Itag + 1
      End If
      Else
      If Imonat = 3 Then
      If Itag = 31 Then
      Itag = 1
      Imonat = Imonat + 1
      Else
      Itag = Itag + 1
      End If
      Else
      If Imonat = 4 Then
      If Itag = 30 Then
      Itag = 1
      Imonat = Imonat + 1
      Else
      Itag = Itag + 1
      End If
      Else
      If Imonat = 5 Then
      If Itag = 31 Then
      Itag = 1
      Imonat = Imonat + 1
      Else
      Itag = Itag + 1
      End If
      Else
      If Imonat = 6 Then
      If Itag = 30 Then
      Itag = 1
      Imonat = Imonat + 1
      Else
      Itag = Itag + 1
      End If
      Else
      If Imonat = 7 Then
      If Itag = 31 Then
      Itag = 1
      Imonat = Imonat + 1
      Else
      Itag = Itag + 1
      End If
      Else
      If Imonat = 8 Then
      If Itag = 31 Then
      Itag = 1
      Imonat = Imonat + 1
      Else
      Itag = Itag + 1
      End If
      Else
      If Imonat = 9 Then
      If Itag = 30 Then
      Itag = 1
      Imonat = Imonat + 1
      Else
      Itag = Itag + 1
      End If
      Else
      If Imonat = 10 Then
      If Itag = 31 Then
      Itag = 1
      Imonat = Imonat + 1
      Else
      Itag = Itag + 1
      End If
      Else
      If Imonat = 11 Then
      If Itag = 30 Then
      Itag = 1
      Imonat = Imonat + 1
      Else
      Itag = Itag + 1
      End If
      Else
      If Imonat = 12 Then
      If Itag = 31 Then
      Itag = 1
      Imonat = 1
      Ijahr = Ijahr + 1
      Else
      Itag = Itag + 1
      End If
      Else

      End If
                                                                End If
                                                            End If
                                                        End If
                                                    End If
                                                End If
                                            End If
                                        End If
                                    End If
                                End If
                            End If
                        End If
                    Else
                        'kein schaltjahr
                        If Imonat = 1 Then
                            If Itag = 31 Then
                                Itag = 1
                                Imonat = Imonat + 1
                            Else
                                Itag = Itag + 1
                            End If
                        Else
                            If Imonat = 2 Then
                                If Itag = 28 Then
                                    Itag = 1
                                    Imonat = Imonat + 1
                                Else
                                    Itag = Itag + 1
                                End If
                            Else
                                If Imonat = 3 Then
                                    If Itag = 31 Then
                                        Itag = 1
                                        Imonat = Imonat + 1
                                    Else
                                        Itag = Itag + 1
                                    End If
                                Else
                                    If Imonat = 4 Then
                                        If Itag = 30 Then
                                            Itag = 1
                                            Imonat = Imonat + 1
                                        Else
                                            Itag = Itag + 1
                                        End If
                                    Else
                                        If Imonat = 5 Then
                                            If Itag = 31 Then
                                                Itag = 1
                                                Imonat = Imonat + 1
                                            Else
                                                Itag = Itag + 1
                                            End If
                                        Else
                                            If Imonat = 6 Then
                                                If Itag = 30 Then
                                                    Itag = 1
                                                    Imonat = Imonat + 1
                                                Else
                                                    Itag = Itag + 1
                                                End If
                                            Else
                                                If Imonat = 7 Then
                                                    If Itag = 31 Then
                                                        Itag = 1
                                                        Imonat = Imonat 
+ 1
                                                    Else
                                                        Itag = Itag + 1
                                                    End If
                                                Else
                                                    If Imonat = 8 Then
                                                        If Itag = 31 
Then
                                                            Itag = 1
                                                        Imonat = Imonat 
+ 1
                                                        Else
                                                            Itag = Itag 
+ 1
                                                        End If
                                                    Else
                                                        If Imonat = 9 
Then
                                                        If Itag = 30 
Then
                                                                Itag = 1
                                                        Imonat = Imonat 
+ 1
                                                            Else
                                                            Itag = Itag 
+ 1
                                                            End If
                                                        Else
                                                        If Imonat = 10 
Then
                                                          If Itag = 31 
Then
                                                                 Itag = 
1
                                                       Imonat = Imonat + 
1
                                                                Else
                                                            Itag = Itag 
+ 1
                                                                End If
                                                            Else
                                                        If Imonat = 11 
Then
                                                        If Itag = 30 
Then
                                                               Itag = 1
                                                      Imonat = Imonat + 
1
                                                                    Else
                                                          Itag = Itag + 
1
                                                                    End 
If
                                                                Else
                                                         Imonat = 12 
Then
                                                      If Itag = 31 Then
                                                                  Itag = 
1
                                                            Imonat = 1
                                                          Ijahr = Ijahr 
+ 1
                                                                      Else
                                                           Itag = Itag + 
1
                                                                    End 
If
                                                                    Else

                                                                    End 
If
                                                                End If
                                                            End If
                                                        End If
                                                    End If
                                                End If
                                            End If
                                        End If
                                    End If
                                End If
                            End If
                        End If
                    End If

                Else
                    Istunde = Istunde + 1
                End If
            Else
                Iminute = Iminute + 1
            End If
        Else
            'Isekunde = Isekunde + 1
        End If

   Loop

'Dies ist der Programmteil, der in dem von ihnen gewählten
'Intervall aufgerufen wird

   Timer_irq:
   Timer1 = Timervorgabe

'Hier könnte nun ihre beliebige IRQ-Routine stehen
'Dabei sollte man darauf achten das diese nicht mehr Zeit
'benötigt, als das Intervall zuläßt

   Print Istunde ; ":" ; Iminute ; ":" ; Isekunde ; " -- " ; Itag ; "-" 
; Imonat ; "-" ; Ijahr
   Isekunde = Isekunde + 1


'Der Zustand der LED wir umgekehrt, wodurch sich blinken in der halben 
Frequenz ergibt
'Hohe Frequenzen sind natürlich nicht mehr sichtbar
   If Led1 = 1 Then
      Led2 = 1
      Led1 = 0
   Else
      Led1 = 1
      Led2 = 0
   End If




   Return


sry wegen der formatierung, wusste leider nicht wie man den code richtig 
einfügen kann und der zeilenumbruch hat alles verschoben.

danke schonmal im vorraus.
sven

von Kay (Gast)


Lesenswert?

Hi,

mal ne blöde frage:

Warum benutzt Du nicht Softclock und ein 32kh quarz? Dann kannste Dir 
die ganze programmiererei sparen und mit den werten $time und $date 
arbeiten.

gruß Kay

von Teplotaxl X. (t3plot4x1)


Lesenswert?

Solch langen code als Datei anhängen ;)

von Sven (Gast)


Lesenswert?

hatte den 16mhz hier rumliegen und wollte porto wegen ner kleinen 
bestellung sparen. muss nicht umbedingt die genauste uhr sein. nur als 
zeitstempel für ne aufzeichnung. also wenn im jahr 10 minuten 
nachstellen muss ist das ok. :o)

ok, werde das nächste mal anhängen.

von einer (Gast)


Lesenswert?

Evtl. das Print ins Hauptprogram auslagern.

von Kay (Gast)


Lesenswert?

hi,

ich sehe gerade das der mega8 keine anschlüsse für einen extra 
Uhrenquarz besitzt. Dann vergiss was ich gesagt habe.

gruß Kay

von genau (Gast)


Lesenswert?

Ja, mit "Config Clock.." und Uhrenquarz bist Du wirklich mit wenigen 
Zeilen fertig, auch das ganze Datum/Schaltjahrzeugs. Ansonsten, dreh mal 
an Deiner Timerkonstante - wie hast Du die berechnet?

von genau (Gast)


Lesenswert?

@Kay - der Uhrenquarz kommt an die ganz normalen Quarzanschlüsse, das 
geht auch mit einem Mega8.

von Paul Baumann (Gast)


Lesenswert?

So habe ich es bei meiner Uhr auch gemacht und sie läuft genau. Es sind
aber zu viele Sachen in der Interruptroutine.

Mit "Toggle" könnte man die LED's dort auch schnaggeln lassen und die 
Ausgaberoutine frißt Dir dort die Zeit.

Als "schmuzige" Lösung könntest Du versuchen, die "Timervorgabe" zu 
verändern. Das ist aber nicht die feine englische Art.

MfG Paul

von Sven (Gast)


Lesenswert?

danke erstmal für die vielen antworten.

die berechnungen zum quarz und so, habe ich mit dem prog mAVR gemacht. 
die led's brauch ich net wirklich. war mehr dazu gedacht um zu sehen ob 
die ungefähr im sekundentakt blinkern. werde ich mal weglassen und die 
ausgabe mit in die hauptschleife nehmen.

ok mal schauen wie es morgen mit der zeit aussieht.

achja, kann mir jemand genau sagen was ich bestellen müsste bei reichelt 
zwecks dem uhrenquarz.

danke nochmal.
sven

von Rahul (Gast)


Lesenswert?

Kennt Bascom keine Felder?
So wie ich es sehe, fehlt in dem Programm der Übergang von einer Sekunde 
zur Minute. In dem Moment, wo die Sekunden = 60 sind, müssten die 
Minuten um eins hochgezählt werden. Kann aber auch sein, dass ich es 
übersehen habe...

von Rolf I. (for_ro)


Lesenswert?

Dies sollte, bis auf etwas Kosmetik, das gleiche tun wie dein Programm.
1
' ATMEGA8- Uhr-Datum
2
$regfile = "m8def.dat"
3
$crystal = 16000000
4
$baud = 115200
5
$sim
6
Config Timer1 = Timer , Prescale = 256                      'Timer Konfigurieren
7
Config Pind.2 = Output
8
Config Pind.3 = Output
9
10
11
Led1 Alias Portd.2
12
Led2 Alias Portd.3
13
14
15
On Timer1 Timer_irq
16
17
Const Timervorgabe = 3036
18
19
Dim Ijahr As Word
20
Dim Imonat As Byte
21
Dim Itag As Byte
22
Dim Istunde As Byte
23
Dim Iminute As Byte
24
Dim Isekunde As Byte , Letzte_sekunde As Byte
25
Dim Monat_array(12) As Byte
26
27
Monat_array(1) = 31
28
Monat_array(2) = 28
29
Monat_array(3) = 31
30
Monat_array(4) = 30
31
Monat_array(5) = 31
32
Monat_array(6) = 30
33
Monat_array(7) = 31
34
Monat_array(8) = 31
35
Monat_array(9) = 30
36
Monat_array(10) = 31
37
Monat_array(11) = 30
38
Monat_array(12) = 31
39
40
Ijahr = 2008
41
Imonat = 9
42
Itag = 25
43
Istunde = 10
44
Iminute = 7
45
Isekunde = 0
46
47
If Ijahr = 2008 Or Ijahr = 2012 Or Ijahr = 2016 Or Ijahr = 2020 Or Ijahr = 2024 Then
48
      Monat_array(2) = 29
49
End If
50
51
52
Enable Timer1
53
Enable Interrupts
54
55
Do
56
   If Isekunde <> Letzte_sekunde Then
57
      If Isekunde = 60 Then
58
         Isekunde = 0
59
         Incr Iminute
60
      End If
61
      If Iminute = 60 Then
62
         Iminute = 0
63
         Incr Istunde
64
      End If
65
      If Istunde = 24 Then
66
         Istunde = 0
67
         Incr Itag
68
      End If
69
      If Itag > Monat_array(imonat) Then
70
           Itag = 1
71
           Imonat = Imonat + 1
72
      End If
73
      If Imonat = 13 Then
74
         Imonat = 1
75
         Incr Ijahr
76
         Monat_array(2) = 28
77
         If Ijahr = 2008 Or Ijahr = 2012 Or Ijahr = 2016 Or Ijahr = 2020 Or Ijahr = 2024 Then
78
               Monat_array(2) = 29
79
         End If
80
      End If
81
      If Istunde < 10 Then Print "0" ;
82
      Print Istunde ; ":" ;
83
      If Iminute < 10 Then Print "0";
84
      Print Iminute ; ":" ;
85
      If Isekunde < 10 Then Print "0";
86
      Print Isekunde ; " -- " ;
87
      If Itag < 10 Then Print "0";
88
      Print Itag ; "-" ;
89
      If Imonat < 10 Then Print "0";
90
      Print Imonat ; "-" ; Ijahr
91
      Toggle Led1
92
      If Led1 = 1 Then Toggle Led2
93
      Letzte_sekunde = Isekunde
94
   End If
95
Loop
96
97
98
Timer_irq:
99
   Timer1 = Timervorgabe
100
   Isekunde = Isekunde + 1
101
Return

Gruß

Rolf

von Sven (Gast)


Lesenswert?

danke rolf. gleichmal testen.

von Sven (Gast)


Lesenswert?

hab jetzt aus ner alten uhr den uhrenquarz genommen. kann mir jemand 
erklären wie ich den anschliessen muss? habe leider keine ahnung mit nem 
uhrenquarz und den 16mhz oder kann ich dann nur einen nehmen?

wollte gern das der m8 weiter mit den 16mhz läuft und den 32khz nur für 
die uhr.

sven

von Rolf I. (for_ro)


Lesenswert?

Wie oben schon gepostet, liegen beim Mega8 die XTAL und die TOSC 
Eingänge beide auf den Pins PB.6 und PB.7. Folglich kannst du nicht 
beides anschließen.
Intern kannst du glaube ich nur bis 8MHz takten.
Genauer wird es durch den Uhrenquarz auch nicht wirklich. Nur kannst du 
damit Bascom unterstützt (Config Clock=Soft) Uhr und Datumsbefehle und 
Variablen benutzen.

Gruß

Rolf

von Sven (Gast)


Lesenswert?

ok, danke dir wieder mal. :o) wenn es auch nicht genauer wird lasse ich 
es so. konnte es leider noch nicht testen. leider zuwenig zeit jetzt 
gehabt.

aber nochmal ne ganz andere frage. bei bascom gebe ich doch mit waitms 
die wartezeit in millisekunden an bis er weiter befehle ausführt oder im 
code weiter geht. aber ich verstehe jetzt nicht genau warum man einen 
uhrenquarz brauch wenn man doch mit waitms hochzählen könnte!?

oder bezieht sich das waitms auf die quarzgeschwindigkeit und ist 
ungenau?

von Otto (Gast)


Lesenswert?

> aber ich verstehe jetzt nicht genau warum man einen
> uhrenquarz brauch wenn man doch mit waitms hochzählen könnte!?

Weil nach Anschluss eines Uhrenquarzes die Variablen $time und $date
die Uhrzeit enthalten und Du ausser der Ausgabe NICHTS mehr 
programmieren mußt......

siehe auch den Post von "genau":

> Ja, mit "Config Clock.." und Uhrenquarz bist Du wirklich
> mit wenigen Zeilen fertig, auch das ganze Datum/Schaltjahrzeugs.

Otto

von Peter D. (peda)


Lesenswert?

Sven wrote:

> code weiter geht. aber ich verstehe jetzt nicht genau warum man einen
> uhrenquarz brauch wenn man doch mit waitms hochzählen könnte!?

Ein Wait wartet, wie der Name ja schon sagt, erst ab dem Zeitpunkt, an 
dem Du es aufrufst.
D.h. Du kannst damit nur genau messen, wenn ein Wait direkt nach dem 
nächsten erfolgt, also keinerlei weiterer Code in Deinem Programm ist.
Ein Programm ohne Code wäre allerdings ziemlich sinnlos.

Jeder Code verzögert um seine Ausführungszeit den nächsten Wait-Aufruf 
und daher geht Deine Uhr hoffnungslos nach.


Ein Timer zählt dagegen nach dem Überlauf einfach weiter.
Es ist dann egal, wie lange Deine Software braucht, sie muß nur vor dem 
nächsten Überlauf fertig sein.


Peter

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.