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: habe gerade keinen anderen Controller da. Ich möchte die Uhr so Simple wie möglich gestalten das ich sie als anfänger auch verstehe.
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
ISR (TIMER1_OVF_vect) { sekunden++; if(sekunden == 60) { minuten++; sekunden = 0; } if(minuten == 60) { stunden++; minuten = 0; } if(stunden == 24) { stunden = 0; } if ((stunden==23)&(minuten==59)&(sekunden==59)) { losgehts = 1; schreibdas = irgendwelchedaten(); } } losgehts = 0; while(1) { if (losgehts) { schreiben(schreibdas); losgehts = 0; } beliebiger_sonstiger_kram(); }
Und das hier verfehlt mit Sicherheit auch seine Aufgabe:
>if ((stunden==23)&(minuten==59)&(sekunden==59))
Wenn dann &&
Gruß
ISR (TIMER1_OVF_vect) { sekunden++; if (sekunden == 60) { minuten++; sekunden = 0; if (minuten == 60) { stunden++; minuten = 0; if (stunden == 24) { stunden = 0; losgehts = 1; } } } } int main ( void ) { losgehts = 0; while(1) { if (losgehts == 1) { schreiben(schreibdas); losgehts = 0; } beliebiger_sonstiger_kram(); } }
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
void timer1_init() { OCR1A = 6400; // Vergleichswert setzen TCCR1A = 0; // Modus einstellen, Clear Timer on Compare-Mode TCCR1B = (1<<CS12) |(1<<CS10) | (1<<WGM12); //Teiler und Modus einstellen, Teiler 1024 //CTC-Mode TIMSK0 |= (1<< OCIE1A);// Interrupt zulassen bei TIMER1 sei(); } was passt da noch nicht!
die ganze sache ist echt fein doch lässt sich die Uhr nicht stellen, irgendwie bekomme ich es einfach nicht hin. habe schon alles mögliche ausprobiert! Versuche das ganze über C# zumachen. //Sendefunktion der Zeit zum stellen string Time = DateTime.Now.ToLongTimeString(); private void Uhrstellen(object sender, EventArgs e) { string help; serialPort1.Open(); serialPort1.Write("c"); help = Time.Substring(0, 2); serialPort1.Write(help + "\n"); help = Time.Substring(3, 2); serialPort1.Write(help + "\n"); help = Time.Substring(6, 2); serialPort1.Write(help + "\n"); help = serialPort1.ReadTo("\n"); serialPort1.Close(); } volatile unsigned char stunden; volatile unsigned char minuten; volatile unsigned char sekunden; //Empfangsroutine beim Empfangen ISR_Rx() if ( verb == 0x63) //Bei c folgende Funktion ausführen { cli(); zeitstellen(); sei(); } ISR (TIMER1_COMPA_vect) { sekunden++; if (sekunden == 60) { minuten++; sekunden = 0; } if (minuten == 60) { stunden++; minuten = 0; } if (stunden == 24) { stunden = 0; } if ((stunden == 23)&&(minuten == 25)&&(sekunden == 59)) { speichern = 1; } } void zeitstellen() { uart_gets(text,25); stunden = atoi(text); uart_gets(text1,25); minuten = atoi(text1); uart_gets(text2,25); sekunden = atoi(text2); //Test Ausgabe Uhr richtige Zeichenfolge uart_puts("aktuelle Uhrzeit: "); uart_puts(dtostrf( stunden, 1,0,string )); uart_puts(":"); uart_puts(dtostrf( minuten, 1,0,string )); uart_puts(":"); uart_puts(dtostrf( sekunden,1,0,string)); uart_puts("\n"); zum beenden }
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.