Hallo miteinander,
habe noch nie einen Timer init geschrieben und benötige Hilfe.
Habe einen Uhrenquarz mit 6,5536Mhz mit einem Teiler von 2 komme ich
wieder auf die bnötigten 32768 Mhz.
für meine ISR weis ich aus einem Infinieon Programm:
ISR (TIMER1_OVF_vect)
{
sekunden++;
if(sekunden == 60)
{
minuten++;
sekunden = 0;
}
if(minuten == 60)
{
stunden++;
minuten = 0;
}
if(stunden == 24)
{
stunden = 0;
}
}
später in der main kann ich in der while-Schleife dann so abfragen?
while(1)
{
if ((stunden==23)&(minuten==59)&(sekunden==59))
//Befehl was machen
}
würde mich über die benötigte Hilfe freuen.
VON THRON schrieb:> würde mich über die benötigte Hilfe freuen.
Was ist denn genau die Frage? Du sagst ja nicht, was du genau machen
möchtest - anscheinend irgendwie einen Tag registrieren...?
VON THRON schrieb:> Habe einen Uhrenquarz mit 6,5536Mhz mit einem Teiler von 2 komme ich> wieder auf die bnötigten 32768 Mhz.
Die Rechnung scheint mir auch noch etwas suspekt...
habe das komma vergessen 3,2768MHz.
Ja ich möchte jeden Tag einen wert in einem EEPROM Speichern, befehl ist
bekannt zum speichern. Mir geht es im endeffekt um die Routine des
Timers.
VON THRON schrieb:> Habe einen Uhrenquarz mit 6,5536Mhz mit einem Teiler von 2 komme ich> wieder auf die bnötigten 32768 Mhz.
hertz? Hertz hieß der gute Mann, mit großem 'H'...
1MHz = 1000000Hz
> auf die bnötigten 32768 Mhz.
Also 3,2786MHz? Für was werden die benötigt?
> aus einem Infinieon Programm:
Die Firma heißt "Infineon"...
Schreib doch einfach, WAS du mit WELCHEM uC WIE machen willst. Du
kopierst irgendwo irgendwelche Codezeilen zusammen und kapierst sie
nicht...
> später in der main kann ich in der while-Schleife dann so abfragen?
Das kann man, wenn man sich sicher ist, dass man die richtige Sekunde
erwischt. Wenn man mal (aus welchen Gründen auch immer) eine Sekunde
lang was anderes zu tun hat, war vorher 23:59:58 und nachher 0:0:0 ...
:-o
möchte eine Uhr bauen mit einem ATMEGA 644!
Jetzt denken viele wieso den großen, aber ganz einfach er hat ein großes
EEPROM wo ich genung daten speichern kann.
Die 3,2768 MHz werden für die Uhr benötigt. das habe ich jetzt aus
anderen Beitrrägen mal herausgelesen.
möchte das alle 24 Std dann der Wert gespeichert wird.
VON THRON schrieb:> würde mich über die benötigte Hilfe freuen.
Damit die ISR nicht zu lang wird, kannst du die Abfrage aus der ISR auch
in die Main-Schleife setzen. In der ISR könnte man ein Flag setzen, daß
eine Sekunde um ist, welches in Main dann ausgewertet und wieder
gelöscht wird. Man muß nur dafür sorgen, daß die Main-Schleife eine
Umlaufzeit etwas unter einer Sekunde hat, damit kein Ereignis verpasst
wird.
Du könntest die If-Abfragen noch etwas ineinander schachteln, denn
Minuten müssen erst gezählt werden, wenn die Sekunden auf Null
überlaufen, gleiches für die Stunden. Das spart etwas Programmlaufzeit,
da nicht jede Sekunde alle 3 Variablen abgefragt werden müssen.
3,2768 MHz braucht man eigentlich nur, wenn die Uhr Millisekunden zählen
soll. Ansonsten haben Uhrenquarze 32,768 kHz - das gibt nämlich geteilt
durch 2^15 einen Sekundentakt.
Wenn man aber mit so hohen Qaurzfrequenzen arbeitet, gehört ein
Vorteiler vor den Timer. Der ATMEGA kann ein paar Faktoren
hardwaremäßig, das kann man über entsprechendes Register konfigurieren,
ansonsten muß man in der ISR einen Zähler mitführen, der zur Ermittlung
der ganzen Sekunden bemutzt wird, bevor man an Minuten oder Stunden
denkt.
VON THRON schrieb:> Die 3,2768 MHz werden für die Uhr benötigt. das habe ich jetzt aus> anderen Beitrrägen mal herausgelesen.
Welche denn?
Ich hab sowas noch nie gesehen.
Wenn man Strom sparen will, werden 32kHz oft verwendet.
Ansonsten ist der exakte Wert völlig schnuppe.
Peter
VON THRON schrieb:> Jetzt denken viele wieso den großen, aber ganz einfach er hat ein großes> EEPROM wo ich genung daten speichern kann.
Wenn die Daten öfters überschrieben werden, wäre ein ein externes EEPROM
besser geeignet. I2C EEPROM, I2C RTC, ATmega8 fertig.
Wilhelm Ferkes:
Ich möchte es übersichtlich haben bin noch anfänger und habe noch nicht
die Erfahrungswerte.
Sebastian:
Das würde heisen wenn ich die Millisekunden noch mit einbeziehen würde
dann würde meine Uhr genauer werden?
Genau Hilfe benötige ich zu der Konfig.
Habe gerade einen 6,5536 MHz quarz daliegen und möchte nicht seperat
nochmal einen bestellen denke das geht dauch mit diesem oder?
> möchte eine Uhr bauen mit einem ATMEGA 644!
Und warum muß die Uhr so schnell (mit >6MHz) rennen. Da passiert doch
die meiste Zeit rein überhaupt gar nichts, in so einer Uhr.
Peter Dannegger schrieb:> Wenn man Strom sparen will, werden 32kHz oft verwendet.
Und weil diese Frequenz sehr geläufig ist.
> Ansonsten ist der exakte Wert völlig schnuppe.
Man kann mit JEDEM (ausreichend schnellen) Quarz eine genaue Uhrzeit
erhalten. Nur reicht dann ein simpler Hardware-Vorteiler evtl. nicht
mehr aus.
Lothar Miller schrieb:> Man kann mit JEDEM (ausreichend schnellen) Quarz eine genaue Uhrzeit> erhalten. Nur reicht dann ein simpler Hardware-Vorteiler evtl. nicht> mehr aus.
Der Mega644 hat einen 16Bit-Timer.
Man nehme noch ne 16Bit-Variable im Timerinterrupt und schon kann man
jedes Teilerverhältnis von 2 .. 4294967296 ganz exakt einstellen.
Einen Hardware-Vorteiler braucht man nicht, wenn man einen MC nimmt.
Peter
Peter Dannegger schrieb:> Wenn man Strom sparen will, werden 32kHz oft verwendet.> Ansonsten ist der exakte Wert völlig schnuppe.
Aber der Mensch ist ja bequem und möchte mit vernünftigen
Teilerverhältnissen irgendwann mal bei einem ganzzahligen Sekundentakt
landen...
VON THRON schrieb:> Also gebracht haben mir die Komentare bis jetzt noch nichts!
Das fängt aber bereits damit an, dass du dir über deine eigentliche
Aufgabenstellung nicht wirklich im Klaren bist.
Um's brutal zu sagen: eine einfache Uhr ist nach dem LED-Blinker so
ziemlich das einfachste Stück Firmware, was man sich in einem
Controller vorstellen kann. Eigentlich hast du das ja schon komplett
hingeschrieben (von der Initialisierung des Timers abgesehen).
Jetzt wäre der Punkt, wo du mal nicht nur Codeschnipsel anderer
Leute reinziehen solltest, sondern dir als erstes einmal darüber
im Klaren werden solltest, wie die Hardware eines Controllers zu
dem Punkt kommt, dass sie dir jede Sekunden einmal einen Interrupt
wirft. Du musst also (aus dem Datenblatt!) verstehen, wie man einem
Timer den passenden Takt und den passenden Vorteiler einstellt.
Für deine drei Variablen sekunden, minuten und stunden solltest du
nicht vergessen, diese als "volatile" zu kennzeichnen.
Matthias schrieb:> Aber der Mensch ist ja bequem und möchte mit vernünftigen> Teilerverhältnissen irgendwann mal bei einem ganzzahligen Sekundentakt> landen...
Ich bin noch bequemer als Du.
Ich rechne überhaupt nichts, sondern lasse es den Compiler ausrechnen:
Beitrag "Die genaue Sekunde / RTC"
Peter
Peter Dannegger schrieb:> Ich bin noch bequemer als Du.> Ich rechne überhaupt nichts, sondern lasse es den Compiler ausrechnen:> Beitrag "Die genaue Sekunde / RTC"
Aach, Peter, wir sind doch hier bei Anfänger, nicht bei
Fortgeschrittene. Selbstverständlich nutzt man später den Preprozessor,
wo es nur geht. Dazu ist er ja da. Ich lasse über den Preprozessor
Baudraten und Timings aus dem Quarztakt berechnen. Und wenn da nichts
vernünftiges heraus kommt, kann man sogar noch eine Errormessage
generieren. Man muß doch aber erst mal wissen, wie die Dinge zu Fuß
gehen, bevor man sie automatisiert. ;-)
Peter Dannegger schrieb:>> Nur reicht dann ein simpler Hardware-Vorteiler evtl. nicht mehr aus.> Einen Hardware-Vorteiler braucht man nicht, wenn man einen MC nimmt.
Der uC hat einen Hardwareteiler, so hatte ich das gemeint ;-)
Und wenn 16 Bit nicht reichen, dann muß Software her...
> ISR (TIMER1_OVF_vect)> {> sekunden++;
Das geht wieder nur, wenn ein Softwarevorteiler nicht nötig ist. Aber
der Link zur Uhr mit der genauen Sekunde wurde ja schon gepostet....
VON THRON schrieb:> Lothar: habe gerade keinen anderen Controller da.
Das hatte sich davor noch anders angehört:
VON THRON schrieb:> er hat ein großes EEPROM wo ich genung daten speichern kann.
Aber man braucht nicht einen 64k großen uC wegen des großen EEPROMs für
eine Uhr. Große EEPROMs gibts viel billiger als externe Bausteine...
&& schrieb:> Und das hier verfehlt mit Sicherheit auch seine Aufgabe:>>if ((stunden==23)&(minuten==59)&(sekunden==59))> Wenn dann &&
Klar geht das: was ist denn das Ergebnis der einzelnen Vergleiche?
Richtig: das Ergebnis z.B. von (stunden==23) kann nur 0 oder 1 sein. Und
dann/deshalb geht das...
Lothar Miller schrieb:> Und> dann/deshalb geht das...
Naja, ich würde mal sagen: es geht zufälligerweise hier mal gut.
Dennoch sollte der OP wohl den Unterschied zwischen bitweisem und
logischem UND sich nochmal in seinem C-Lehrbuch ansehen, man kann
sich sonst schnell mal ein blaues Auge holen.
Jörg Wunsch schrieb:> Naja, ich würde mal sagen: es geht zufälligerweise hier mal gut.
Wie definierst du in diesem Zusammenhang "Zufall"?
Es ist doch so, dass a==b nur 0 oder 1 zurückgeben kann, oder wie?
Es ist schon klar, dass & bzw. && prinzipiell was anderes machen und zum
Ziel haben...
Lothar Miller schrieb:> Wie definierst du in diesem Zusammenhang "Zufall"?
Dass er Glück gehabt hat, dass es klappt, obwohl er offensichtlich
die Operatoren verwechselt hat. Solange die Operanden stets die
Ergebnisse eines Vergleichs sind, geht das gut, wenn sie auch
anderweitig entstanden sein können (und man sie eigentlich auf
gleich/ungleich 0 testen müsste) nicht mehr.
Peter Dannegger schrieb:> Ich rechne überhaupt nichts, sondern lasse es den Compiler ausrechnen:> Beitrag "Die genaue Sekunde / RTC"
Ich bin immer wieder begeistert, was du alles für Trick und Know How auf
Lager hast und hier im Forum mit allen teilst.
Danke
Matthias