www.mikrocontroller.net

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


Autor: Shean (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Timer1 und CTC Modus geht sich nicht aus?

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

Autor: spess53 (Gast)
Datum:

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

Autor: Shean (Gast)
Datum:

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

Autor: Shean (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: spess53 (Gast)
Datum:

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

Autor: Shean (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: ... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was soll die 1us pro Instruktion denn bringen ? Ein akademischer Furz ?

Autor: Shean (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Shean (Gast)
Datum:

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

Autor: Falk Brunner (falk)
Datum:

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

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.