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
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
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.
hi, ich sehe gerade das der mega8 keine anschlüsse für einen extra Uhrenquarz besitzt. Dann vergiss was ich gesagt habe. gruß Kay
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?
@Kay - der Uhrenquarz kommt an die ganz normalen Quarzanschlüsse, das geht auch mit einem Mega8.
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
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
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...
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
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
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
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?
> 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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.