beste Lösung für Uart und Timer mit unterschiedlichen Takten

Gast #1640364
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
Gast #1640395
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
#1640402
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 :-)
Gast #1640411
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.
#1640440
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.
Gast #1640462
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.
#1640464
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.
Gast #1640478
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren