Forum: Mikrocontroller und Digitale Elektronik beste Lösung für Uart und Timer mit unterschiedlichen Takten


von Shean (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

Timer1 und CTC Modus geht sich nicht aus?

Damit kannst du einen Interrupt auf den Taktzyklus (bei Prescaler 1) 
genau auslösen lassen.

von spess53 (Gast)


Lesenswert?

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

von Shean (Gast)


Lesenswert?

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

von Shean (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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 :-)

von spess53 (Gast)


Lesenswert?

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

von Shean (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von ... (Gast)


Lesenswert?

Was soll die 1us pro Instruktion denn bringen ? Ein akademischer Furz ?

von Shean (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Shean (Gast)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

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