Hallo Miteinander Ich betreiben momentan meinen ATMEGA88 mit einem externen 11.0592MHz Quarz. Dies aus dem Grund, da ich per UART mit einer Baudrate von 115.2k kommuniziere und so einen Error von 0% habe. Nun brauche ich eine genaue Zeitbasis. Ich möchte, dass mein Timer für einen Schritt genau 1us braucht. Leider ist dies aber mit dem aktuellen Systemclock und den verfügbaren Prescalern nicht möglich. Ich habe schon daran gedacht, dem Timer einen externen Clock zur Verfügung zu stellen, leider habe ich aber nur einen 8MHz und keine 1MHz Quarz zur Hand. Welche Möglichkeiten hätte ich? Ich möchte den 8MHz Quarztakt nicht mit externer Hardware runterteilen. Besteht die Möglichkeit, einen externen und internen Takt zu verwenden, sprich ich verwende für UART den externen 11.0592 und für den Timer den internen 8MHz, welcher sich mit dem Vorteiler 8 auf 1MHz teilen lässt. Grüsse Shean
Timer1 und CTC Modus geht sich nicht aus? Damit kannst du einen Interrupt auf den Taktzyklus (bei Prescaler 1) genau auslösen lassen.
Hi Da muss man vielleicht Kompromisse machen: z.B 13MHz : Baudratenfehler 0,8% Timerfehler 0,0% 11MHz : Baudratenfehler 0,5% Timerfehler 0,0% MfG Spess
Würde natürlich gehen. Dafür bräuchte ich aber trotzdem einen externen Takt. Da ich sowieso zwei Takte brauche, würde ich mir lieber den mehraufwand beim Programmieren schenken, welcher beim CTC Mode anfallen würde. Klar ist der Aufwand nicht riesig, aber habs halt lieber einfach;) Hab gesehen, dass UART auch mit einem externen Clock betrieben werden kann am XCK Pin. Sollte eigentlich klappen, wenn ich den uC mit 8MHz und den UART mit externen 11.0592MHz rennen lasse, oder? Grüsse
spess53 schrieb:
> Da muss man vielleicht Kompromisse machen:
Wenn ichs schon ganz genau haben kann, dann mach ich dies auch;) Zudem
habe ich diese Quarze nicht zur Hand.
Shean schrieb: > Würde natürlich gehen. Dafür bräuchte ich aber trotzdem einen externen > Takt. Da ich sowieso zwei Takte brauche, würde ich mir lieber den > mehraufwand beim Programmieren schenken, welcher beim CTC Mode anfallen > würde. Klar ist der Aufwand nicht riesig, aber habs halt lieber > einfach;) Welcher Mehraufwand? Ein Bit im Konfigurationsregister setzen und den gewünschten Overflow-Wert einem Register zuweisen. Fertig. > Da ich sowieso zwei Takte brauche Timer 1 kann CTC Timer 2 kann CTC > Hab gesehen, dass UART auch mit einem externen Clock betrieben werden > kann am XCK Pin. Sollte eigentlich klappen, wenn ich den uC mit 8MHz und > den UART mit externen 11.0592MHz rennen lasse, oder? Und das ist kein Mehraufwand :-) In der Zeit in der du den Quarz aus dem Säckchen auspackst, hast du beide Timer längst auf CTC umgestellt :-)
Hi >Würde natürlich gehen. Dafür bräuchte ich aber trotzdem einen externen >Takt. Wieso? Der Baudratenfehler der Beispiele liegt im grünen Bereich und dein Zeitsignal stimmt 100%ig. Mit einem Takt. MfG Spess
Karl heinz Buchegger schrieb: > Und das ist kein Mehraufwand :-) > In der Zeit in der du den Quarz aus dem Säckchen auspackst, hast du > beide Timer längst auf CTC umgestellt :-) Hmm muss ja sowieso dem Timer einen zweiten Clock zur Verfügung stellen, da ich sonst nie auf 1us komme, oder stehe ich da nun auf dem Schlauch? spess53 schrieb: > Wieso? Der Baudratenfehler der Beispiele liegt im grünen Bereich und > dein Zeitsignal stimmt 100%ig. Mit einem Takt. Ja, ist mir klar. Leider habe ich aber keine entsprechenden Quarze in der Nähe. Nur einen 8MHz und den 11.0592MHz.
Shean schrieb: > Karl heinz Buchegger schrieb: >> Und das ist kein Mehraufwand :-) >> In der Zeit in der du den Quarz aus dem Säckchen auspackst, hast du >> beide Timer längst auf CTC umgestellt :-) > > Hmm muss ja sowieso dem Timer einen zweiten Clock zur Verfügung stellen, > da ich sonst nie auf 1us komme, oder stehe ich da nun auf dem Schlauch? Mein Fehler. Hab nicht richtig gelesen. Ich ging davon aus, dass du alle 1µs etwas tun willst. Du willst ja nur, dass dein Timer alle 1µs um 1 hochzählt. Prescaler 1 Modus 4, CTC (WGM12, alle anderen 0) OCR1A auf 11 und dann sollte der Timer eigentlich seinen Overflow alle 1µs erreichen (wenn ich mich nicht verrechnet habe) Hmm. Wozu brauchst du das eigentlich. Wie man sieht hat der µC gerade mal 11 Prozessortakte Zeit um alle 1µs etwas zu tun (Genau genommen 11.059 Takte. Aber so kleinlich wollen wir nicht sein). Und das wird zu wenig, als das man da noch einen Softwarezähler implementieren kann.
Was soll die 1us pro Instruktion denn bringen ? Ein akademischer Furz ?
Karl heinz Buchegger schrieb: > Prescaler 1 > Modus 4, CTC (WGM12, alle anderen 0) > OCR1A auf 11 > Das weiss ich schon, aber so bekomme ich nicht wirklich genau 1us, sondern 1.085. Und es sollte schon genau eine sein. > und dann sollte der Timer eigentlich seinen Overflow alle 1µs erreichen > (wenn ich mich nicht verrechnet habe) > > Hmm. > Wozu brauchst du das eigentlich. Wie man sieht hat der µC gerade mal 11 > Prozessortakte Zeit um alle 1µs etwas zu tun (Genau genommen 11.059 > Takte. Aber so kleinlich wollen wir nicht sein). Und das wird zu wenig, > als das man da noch einen Softwarezähler implementieren kann. Es ist nicht so, dass ich jede us etwas tun möchte. Vielmehr möchte ich eine Variable Zeitbasis generieren, indem ich zum Beispiel 500 in eine Variabel lade und die dann dazu führt, dass alle 500us ein Interrupt ausgelöst wird. Strebe halt nur eine Auflösung von 1us an, heisst aber nicht, dass jede us etwas gemacht wird.
Shean schrieb: > eine Variable Zeitbasis generieren, indem ich zum Beispiel 500 in eine > Variabel lade und die dann dazu führt, dass alle 500us ein Interrupt > ausgelöst wird. Dann ist doch CTC perfekt für dich. 500 * 11.0592 = 5529.6 also 5529 ins OCR und du hast deinen Interrupt-Takt > Strebe halt nur eine Auflösung von 1us an, heisst aber > nicht, dass jede us etwas gemacht wird. Unter einer gewissen Grenze macht es sowieso keinen Sinn mehr, weil ja nichts mehr an Taktzyklen übrig bleibt Und wegen der 0.6 Du glaubst doch nicht im Ernst, dass dein Quarz exakt 11059200 Herz hat :-) Genausowenig wie ein 8Mhz Quarz exakt 8000000 Schwingungen/Sekunde macht. Sich wegen einer halben Schwingung, die fälschlich gezählt oder nicht gezählt wird aufzuregen, bringt nichts. Da ist dein Quarz sowieso nicht genau genug.
Karl heinz Buchegger schrieb: > Und wegen der 0.6 > Du glaubst doch nicht im Ernst, dass dein Quarz exakt 11059200 Herz hat > :-) Genausowenig wie ein 8Mhz Quarz exakt 8000000 Schwingungen/Sekunde > macht. Überredet, ist wohl am einfachsten so;) Wie schade, dass man nicht einfach von idealen Bauteilen ausgehen kann, würde einem ziemlich viel Ärger ersparen;) Grüsse & Danke.
@Shean (Gast) >Überredet, ist wohl am einfachsten so;) >Wie schade, dass man nicht einfach von idealen Bauteilen ausgehen kann, >würde einem ziemlich viel Ärger ersparen;) Schade dass die Leute ausser plärren und rummosern nix können und immer in ihren akademischen Luftschlössern schweben . . .
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.