www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Nur 1 Sekunde


Autor: thegoogle (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Uwe Nagel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Uwe Nagel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: thegoogle (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 !

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.