Ich probiere gerade eine Sekunde mithilfe von Timern hinzubekommen bin aber nicht sicher ob ich auf dem richtigen weg bin. Bei 4 MHz und einem Teiler von 1024 komme ich auf ca 3960. Bedeutet das, das wenn der Timer auf 3960 steht eine sekunde um ist ? Kann ich das auch mit dem 8 bit timer realisieren ?
Du kommst auf 3906, 4MHz / 1024. Aber das ist der Takt, mit dem der Timer arbeitet. Wenn du einen 8-bit Timer nimmst, must du diesen Wert noch einmal durch 256 teilen. Das wäre dein Überlauf-Interrupt. Um die Sekunde exakt hinzubekommen, must du dir ansehen, was der Compiler daraus macht und dann den nachladewert des Timers anpassen. Michael
Um die Sekunde genauer hinzubekommen ist es einfacher einen 'krummen' Quarz zu nehmne. Hier würden sin 4,194304MHz anbieten, das sind genau 2^22Hz. Mit Vorteiler 1024 und 8-Bit Timer gibt das eine Interruptrate von 16Hz. Also einfach 16 Interrupts abzählen und dann ist die Sekunde rum! Da spart man sich solche Spässe mit dem Nachladen, denn das ist tatsächlich davon abhängig, was der Compiler daraus macht. Also besteht auch die Gefahr, dass die nächste Compilerversion was anderes tut und die Uhr falsch geht.
@ Uwe, du must den Assemblercode trotzdem untersuchen, da der Einsprung in die Interrupt-Routine, das pushen und poppen mitgerechnet werden muß. Atmel gibt für die Classiks und Megas min. 4 Taktzyklen an, bevor die Interrupt-routine angesprungen werden kann(PC retten usw.). Das sollte eigentlich mitgerechnet werden. Michael
@Michael, das wird doch nichts ! Die Interrupteinsprungzeit ist doch nie konstant ! Und wenn dann noch andere Interrupts benutzt werden, geht Deine Sekunde völlig nachm Mond. Am besten, Du machst es so, wie ich es in der Codesammlung erläutert habe. Aber auch jeder andere Weg, der unabhängig von der Interrupteinsprungzeit ist, geht. Gut, wenn man sich noch an die Bruchrechnung erinnern kann. Peter
Jetzt weis ich nicht, was der OP mit der Sekunde eigentlich machen will... Ich dachte an eine Uhr! Und da kommt es jetzt eigentlich nicht darauf an, ob die Sekunde jedesmal gaaaanz genau stimmt, es reicht, wenn die Sekunde im Mittel stimmt. Die paar µs Schwankung merkt sowieso keiner, und die konstante Verzögerung beim pushen interessiert überhaupt nicht. Der Timer läuft völlig unabhängig vom Programmablauf (kein Reload) und löst nach jeweils exakt 1/16s einen Interrupt aus. Dieser wird natürlich nicht sofort bearbeitet, sondern erst, wenn der gerade laufende Befehl beendet ist. Dann wird noch gepusht, das dauert aber jedesmal gleich lang. Natürlich darf man den Interrupt nicht längere Zeit disablen. Was ganz anderes ist es, wenn die Sekunde eine Torzeit sein soll, während der eingehende Takte gezählt werden sollen (Frequenzzähler). Dann muss die Sekunde so genau wie möglich stimmen. Dann ist aber ein Prozessor nicht unbedingt die ideale Signalquelle.
@Michael puh da steckt ja wirklich einiges hinter, den tip mit dem ungeraden Quarz fand ich übrigends nicht schlecht. Jetzt aber nochmal kurz wäre es evtl. mögl den Zähler 18 mal bis 217 zählen zu lassen ( =3906 ) da wäre dann doch eine sek. Ich versteh den sinn des durch 256 Teilen nicht ganz !
Das durch 256 teilen (bei einem 8-bit Timer) bedeutet einen Überlauf Interrupt. Da ist der Zählerstand 0. bei deinem beispiel müßtest du das Timerregister mit 39 laden und nach dem 18. mal die Sekunde inkrementieren. Frohes Schaffen. Michael
@Uwe "(Frequenzzähler). Dann muss die Sekunde so genau wie möglich stimmen." Wozu ? So schlecht rechnet ein MC nun wieder auch nicht. Mein Frequenzmesser nimmt immer 0,5s + ein vielfaches der Eingangsfrequenz. Dann ist f_X = f_Quarz * m / n wobei m, n die beiden Zählerwerte sind. Peter
@thegoogle, was gefällt Dir denn an meinem Beispiel nicht ? Da ist doch alles erklärt und auch warum Du jeden x-beliebigen Quarz nehmen kannst. Die "krummen" Quarze braucht man ausschließlich für die Baudrate, da die im PC auch aus einem "krummen" Quarz erzeugt wird. 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.