Forum: Mikrocontroller und Digitale Elektronik Nur 1 Sekunde


von thegoogle (Gast)


Lesenswert?

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 ?

von Michael (Gast)


Lesenswert?

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

von Uwe Nagel (Gast)


Lesenswert?

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.

von Michael (Gast)


Lesenswert?

@ 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

von Peter D. (peda)


Lesenswert?

@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

von Uwe Nagel (Gast)


Lesenswert?

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.

von thegoogle (Gast)


Lesenswert?

@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 !

von Michael (Gast)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

@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

von Peter D. (peda)


Lesenswert?

@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
Noch kein Account? Hier anmelden.