mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Atmega8L und Uart: internen Takt nachtrimmen. Eure Meinung?


Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

Ich habe einen Atmega8 an einen Rondostat HR20e Heizkörperthermostat 
gehängt und will vom Thermostat mit seriell Daten empfangen (9600 Baud).

Erste Versuche mit dem internen Oszillator auf 2Mhz ergaben nur Müll am 
Uart. Da ich keine passenden Quarze da hatte und unbedingt weiter machen 
wollte, habe ich den Takt nachgetrimmt.

1.) Aktuellen Takt gemessen
Dazu Endlosschleife (avr-gcc) bei deaktivierten Interrupts:
- Pin high setzen
- _delay_ms(50)
- pin low
- _delay_ms(50).
Frage dazu: Ist das geeignet (genau genug) um den tatsächlichen Takt zu 
messen und wie kann kann man das besser machen?

2.) Intervall per DSO gemessen (=120ms)

3.) Kallibrierungsbyte angepasst so dass das gemessene Intervall 100ms 
beträgt.

4.) Lötkolben und Kältespray auf den Atmega losgelassen, keine 
Veränderung am Takt festgestellt (verstehe ich nicht, das hätte man doch 
sehen müssen...?)

5.) Kommunikation getestet, geht :)

6.) Um bei Abweichungen eine größere Toleranz zu erreichen:
Im Makefile F_CPU auf 1843200 gesetzt (Baudratenquarz) und Schritte 1-5 
wiederholt, also den internen 2Mhz Takt auf 1,8432Mhz "verstellt".

Die Übertragung läuft seit 2 Tagen im 4 Minutentakt ohne Aussetzer.


Was meint ihr, kann das klappen oder wird es Probleme geben?
Die Temperaturen ändern sich ja doch erheblich so nah am Heizkörper.

Gruß,
Chris

Autor: Zwölf Mal Acht (hacky)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alternativ kann man auch einen Uhrenquarz anhaengen und auf diesen 
Synchronisieren. Der Aufwand Quarzgenauigkeit zu erreichen ist etwas 
gross, wenn ich den Preis eines Quarzes, etwa 0.2 Euro, einsetze.
Heisst, ich wuerde mir diese Klimmzuege nicht antun und einen Quarz 
einsetzen.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und wenn einem Quarze zu aufwendig sind, dann gibt es noch die 
Keramikschwinger als Dreibein mit integrierten Kondensatoren.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Chris (Gast)

>wollte, habe ich den Takt nachgetrimmt.

Schon mal ne gute Idee! Mal endlich einer der nicht blind auf den 
RC-Oszillator vertraut.

>Frage dazu: Ist das geeignet (genau genug) um den tatsächlichen Takt zu
>messen

Naja, eigentlich schon.

> und wie kann kann man das besser machen?

Timer mit Output Compare/PWM Funktion benutzen und einen Takt mit ~50% 
Tastverhältnis erzeugen. Ist absolut präzise, egal was die CPU macht.

>2.) Intervall per DSO gemessen (=120ms)

DSO ist hart an der Grenze der Messgenauigkeit. Dafür ist es nicht 
wirklich gedacht. Ein Einfacher Freqeunzzähler ist das deutlich besser, 
selbst die aus einem einfachen Multimeter.

>4.) Lötkolben und Kältespray auf den Atmega losgelassen, keine
>Veränderung am Takt festgestellt (verstehe ich nicht, das hätte man doch
>sehen müssen...?)

Nöö, dein Oszi misst wenn es hoch kommt mit 1% Auflösung, Laut 
Datenblatt driftet der RC-Oszillator um ca. 1,2%/20K.

>Die Übertragung läuft seit 2 Tagen im 4 Minutentakt ohne Aussetzer.

Das wird sie solange, wie die Temperatur nicht mehr als sagen wir +/-20K 
schankt oder die Spannung um 0,1V oder mehr sich ändert.

>Die Temperaturen ändern sich ja doch erheblich so nah am Heizkörper.

Dann wird es eng. Nimm einen Quarz.

MfG
Falk

Autor: g457 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Frage dazu: Ist das geeignet (genau genug) um den tatsächlichen Takt zu
> messen [..]

Gute Frage. Das wirst Du wahrscheinlich selbst feststellen falls es 
Probleme gibt an der Heizung.. Und wenn nicht dann wars genau genug :-)

> [..] und wie kann kann man das besser machen?

Ich würde dafür die 'Toggle OCn on compare match'-Funktionalität des 
Timers verwenden, die ist genauer (im Sinne von fester mit dem Takt 
verdrahtet).

Atmel hat übrigens auch (mindestens) eine AppNote (AVR053: "Calibration 
of the internal RC oscillator") die sich mit dem Thema beschäftigt 
(selbige AppNote läuft aber in die 'andere' Richtung, also Referenztakt 
von aussen angelegt und der µC dreht so lange am Rad bis es passt).

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Hinweise.

@prx: Diese 3beiner (Keramikresonatoren) kannte ich noch gar nicht... 
wird getestet :)

@Falk: Ich habe hier so einen "Gigaherz Frequenzzähler", ein etwas 
älterer Bausatz. Mal schauen was der sagt.

Autor: Dieter M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da besonders der interne Oszillator temperaturabhängig, wäre wohl schon 
ein regelmäßiger Neuabgleich in kurzen Abständen sinnvoll.
Idee zum drüber Nachdenken:
Peter Dannegger hat in seinem Bootloader eine Autobaud-routine. 
Funktioniert bei mir mit 115,2kbaud mit internem RC-Oszillator 
hervorragend. (Respekt und Dank nochmal an Peter!)
Vielleicht ist das ja ein Ansatz.
Gruß, Dieter

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eben eine Frage des Aufwands... Da ich mit dem Modul eh die Temperatur 
erfasse, könnte man das einbeziehen. Oder man lässt eine Uhr mitlaufen, 
vergleicht deren Zeit mit der (ungenauen...) Uhr des Rondostats und 
errechnet aus dem Delta die Taktabweichung, oder....

Fürs erste lasse ich das so, mal gespannt ob es Probleme gibt. Dann 
kommen die Keramikresonatoren rein.

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab es bei mir so gemacht:
Eine Routine versucht eine Kommunikation aufzubauen, danach wird das 
Kalibrierbyte inkrementiert. Wenn die Kommunikation mit den 
Kalibrierbytes 50 bis 70 funktioniert, dann nutze ich für das 
Hauptprogramm als Kalibrierbyte 60.

Autor: Klaus 2m5 (klaus2m5)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Leute, was macht ihr nur für Klimmzüge, wenn es doch mit einem einfachen 
Quarz getan wäre. Überlegt mal, wieviel Arbeitszeit jede dieser 
"Lösungen" verdampft, geschweige denn die Zeit für die unzähligen 
Beiträge in diesem Forum zu genau diesem Thema.

*** Kopfschüttel ***

Autor: Peter Diener (pdiener) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich finde das Thema schon interessant. Nicht, um Quarze an Stellen 
einzusparen, wo man locker welche einbauen könnte, sondern für 
Anwendungen wo man keine einbauen kann (z.B. wegen mechanischer 
Stoßfestigkeit).

Ich würde im konkreten Fall mittels Capture-Input und einem Timer die 
Bitzeiten der uart-Gegenstelle messen und den eigenen Takt so anpassen, 
dass es passt.

Grüße,

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.