das ist kein Quarz. Im Chip werkelt ein normaler RC-Oczillator, dessen Frequenz auf Grund von Bauteiltoleranzen halt irgendwo zw. den angegebenen Werten liegen kann (8MHz +-10%). Den kannst Du aber noch selbst kalibieren um genauere Werte zu bekommen.
Ich benötige eine "genaue" Kalibrierung lediglich für eine serielle Kommunikation.
Wenn das Programm Einfluss auf den RC Quarz haben kann, müsste eine Kalibrierung wie folgt möglich sein:
Der PC sendet über seine serielle Schnittstelle die Zahl 10101010b (170d) an einen PIN des Chips.
Mit Start und Stopbit ergibt sich also an einem Eingangspin des Chips die Folge 0101010101 die sich ständig wiederholt.
Das Programm im Chip versucht nun den RC Quarz so zu steuern bis die Abstände zwischen 01 und 10 alle gleich sind.
Bei 57600 Baud sind das exakt 52us. D.h. die Empfangsroutine im Chip zählt die Anzahl der Prozessorzyklen die ausgeführt werden können solange das Eingangssignal (die 0en und 1en) sich nicht ändert.
Aufgrund dieser Informationen kalibriert sich der Chip selbst auf eine möglichst genaue serielle Kommunikation, beispielsweise für 57600Baud,
Indem später für das senden und Empfangen von Daten versucht wird die Anzahl der "Wartezyklen" entsprechend auszuführen.
Doch was wenn sich nach der Kalibrierung die Temperatur ändert? Ich kann der Doku leider nichts über Temperaturschwankungen des RC Gliedes entdecken.
ein Abgleich des internen RC-Oszillator ist meines Erachtens nicht vom Anwenderprogramm möglich. Die entsprechende Fuses für den RC-Oszillator werden über den Programmer gesetzt.
Die serielle Kommunikation wird bei einem Error von 10% auch nicht mehr sicher funktionieren. Daher empfehle ich einen externen Quarz einzusetzen (Kostet auch nicht die Welt).
Der RC-Oszillator wird NUR vom Anwenderprogramm Abgeglichen ..
(leider) man kommt nur Extern an die von Atmel Eingetragenen werte z.b. über das AVR Studio.. unter "Advanced" muss dann bei "Calibrate 4 Frequenz" die Frequenz ausgewählt werden .. dann nen "Read Cal. Byte"..
dann ins E² oder ins Flash damit an ne stelle wo man will ..
und im Anwenderprogramm bessergesagt in der Initialisierung dann mittels OSCCAL = deinortwoshaltwar; <-- Flash oder E² .. und es is Abgeglichen ..
oder ihr merkt euch die zahl die das AVR Studio euch gegeben hat und bindet diese dann in das Programm direkt mit ein...
dann z.b.
OSCCAL = 0xA3 ;
aber ACHTUNG !!! Die werte sind vom Werk einprogrammiert (also von Atmel selbst) diese Werte können (nicht müssen) Unterschiedlich sein .. es kann auch sein das es bei manchen Bausteinen garnicht benötigt wird. ..
Ach ja .. und wenn man sich nen Programmschreibt wie du oben schon Sagtest das die Zeitenausmisst .. klappt das natürlich auch nur ist dies wesentlich aufwendiger ...
wenn echt irgendwie 30ppm genau sein willst .. nutze besser nen Externen Quarz..
Lesezeichen