www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik bascom uhr-datum


Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Kay (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Teplotaxl X. (t3plot4x1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Solch langen code als Datei anhängen ;)

Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: einer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Evtl. das Print ins Hauptprogram auslagern.

Autor: Kay (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: genau (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: genau (Gast)
Datum:

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

Autor: Paul Baumann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Rolf Im forum (for_ro)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dies sollte, bis auf etwas Kosmetik, das gleiche tun wie dein Programm.
' ATMEGA8- Uhr-Datum
$regfile = "m8def.dat"
$crystal = 16000000
$baud = 115200
$sim
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 Word
Dim Imonat As Byte
Dim Itag As Byte
Dim Istunde As Byte
Dim Iminute As Byte
Dim Isekunde As Byte , Letzte_sekunde As Byte
Dim Monat_array(12) As Byte

Monat_array(1) = 31
Monat_array(2) = 28
Monat_array(3) = 31
Monat_array(4) = 30
Monat_array(5) = 31
Monat_array(6) = 30
Monat_array(7) = 31
Monat_array(8) = 31
Monat_array(9) = 30
Monat_array(10) = 31
Monat_array(11) = 30
Monat_array(12) = 31

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

If Ijahr = 2008 Or Ijahr = 2012 Or Ijahr = 2016 Or Ijahr = 2020 Or Ijahr = 2024 Then
      Monat_array(2) = 29
End If


Enable Timer1
Enable Interrupts

Do
   If Isekunde <> Letzte_sekunde Then
      If Isekunde = 60 Then
         Isekunde = 0
         Incr Iminute
      End If
      If Iminute = 60 Then
         Iminute = 0
         Incr Istunde
      End If
      If Istunde = 24 Then
         Istunde = 0
         Incr Itag
      End If
      If Itag > Monat_array(imonat) Then
           Itag = 1
           Imonat = Imonat + 1
      End If
      If Imonat = 13 Then
         Imonat = 1
         Incr Ijahr
         Monat_array(2) = 28
         If Ijahr = 2008 Or Ijahr = 2012 Or Ijahr = 2016 Or Ijahr = 2020 Or Ijahr = 2024 Then
               Monat_array(2) = 29
         End If
      End If
      If Istunde < 10 Then Print "0" ;
      Print Istunde ; ":" ;
      If Iminute < 10 Then Print "0";
      Print Iminute ; ":" ;
      If Isekunde < 10 Then Print "0";
      Print Isekunde ; " -- " ;
      If Itag < 10 Then Print "0";
      Print Itag ; "-" ;
      If Imonat < 10 Then Print "0";
      Print Imonat ; "-" ; Ijahr
      Toggle Led1
      If Led1 = 1 Then Toggle Led2
      Letzte_sekunde = Isekunde
   End If
Loop


Timer_irq:
   Timer1 = Timervorgabe
   Isekunde = Isekunde + 1
Return

Gruß

Rolf

Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke rolf. gleichmal testen.

Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rolf Im forum (for_ro)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.