PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Hilfe bei Quarz an Mega16



Blamaster
30.03.2008, 12:08
Hi,

ich betreibe momentan einen 16MhZ Quarz an einem Mega 16 mit 22pF.

Auf dem Mega16 läuft ein Programm was sekündlich einen Interrupt aufruft und die Variabele I erhöht. Es soll also im Sekundentakt hochgezählt werden. Anfangs läuft das auch ohne Probleme, nur nach ca. einer Minute hat man dann schon ca. 2 sekunden rückstand. (parallel gemessen mit einer Stoppuhr).


Nun steht im Datenblatt des Quarz Cl:20pF und wenn ich es richtig verstanden habe ist da ja ein ca. 40pF Kondensator mit gemeint oder ?

Kann es also an meinem 22pF Kondensator liegen, das diese ungenauigkeit beim zählen entsteht ?

mfg Blamaster

python_rocks
30.03.2008, 12:35
Nun steht im Datenblatt des Quarz Cl:20pF und wenn ich es richtig verstanden habe ist da ja ein ca. 40pF Kondensator mit gemeint oder ?
Hallo Blamaster!

Wenn "pF" dabei steht, dann ist damit exakt dieser Wert damit gemeint. 2 pF auf oder ab macht keinen Unterschied.

Du brauchst den Quarz, zwei 22 pF Keramikkondensatoren und die richtige Einstellung der Fuse-Bits. Vergiss nicht, auch das Bit CKOPT auf 0 (=ein) zu setzen. Das braucht man bei Frequenzen ab 8 Mhz.

Noch etwas kann sein. Wenn du im Interrupt-Handler viel Code abarbeiten lässt, dann kann es sein, dass der Interrupt-Handler noch nicht damit fertig ist, obwohl der Interrupt schon wieder neu ausgelöst wurde. So kann sich die Zeit immer mehr hochschaukeln.

Dass ein Quarz so ungenau ist, dass man das schon nach zwei Minuten merkt, glaube ich nicht.

mfg
Gerold
:-)

PS: Zeig mal ein wenig Code her. Vielleicht hast du dich irgendwo vertan.

LLiinnuuxx
30.03.2008, 12:37
Bezüglich deiner Vermutung, dass der Kondensator Schuld hat habe ich keine Ahnung, aber solange es sich immer um den selben Versatz handelt könntest du diesen bereits in der Software berücksichtigen. Wenn eine Minute beim AVR halt 62 Sekunden hat dann musst du alle 1,03333 Sekunden deinen Zähler eins hochzählen.

Um noch genauer zu sein könntest du auch mal einen Tag lang die AVR laufen lassen und dann mal den genauen Versatz berechnen.


LLiinnuuxx

PS: Ok ist nicht wirklich die Antwort auf deine Frage aber ist auch eine Lösung

An alle anderen:
Noch nicht gelöst

Blamaster
30.03.2008, 13:59
Vielen Dank. Werde die Zeit jetzt nochmal auf längere Zeit messen.

Besserwessi
30.03.2008, 14:51
Wenn nach einer minute schon 2 Sekunden abweichung da sind, dann ist das reichlich viel abweichung für den Quarz. So stark läßt sich normalerweise die Frequenz eines Quarzes gar nicht mit den Kondesatore verändern.

Ist den sicher das die Software simmt, und nicht eventuell noch der interne RC läuft ?

Blamaster
30.03.2008, 15:00
Also im Pony prog sind momentan häkchen bei folgenden Einträgen:

OCDEN
CKOPT
EESAVE
BOOTSZ1
BOOTSZ0
BOOTRST
CKSEL0

Am Code dürfte es eigentlich auch nicht liegen, denn in der interrupt routine wird nichts anderes gemacht, als I um eins erhöht. Und ich glaube kaum das ein Avr dafür eine Sekunde braucht :-k

Hab jetzt mal weiter zählen lassen bis die stoppuhr bei 40 minuten war. Immernoch der Zeitverzug von 2 sek. Tritt also nach ca. einer Minute ein, bleibt dann aber relativ konstant.

mfg blamaster

Blamaster
30.03.2008, 15:20
Ui doch nicht ! Hat nach 4 Minuten ca 3 Minuten verzug.

McJenso
30.03.2008, 15:43
Hallo,

1 Minute 2 Sekunden
4 Minuten 3Minuten Verzug
Also die Abweichung ist nicht linear? Ist sie den reproduzierbar?
Hast du nach vier Minuten immer 3 Minuten Verzug?
Ich tippe entweder auf ein EMV Problem oder im Programm stimmt was nicht. 16 oder 32 Bit Variablen und Interrupts z.B. sind nicht so ganz ohne.
Ich kann mir nicht vorstellen, dass das am Takt liegt.

Gruß

Jens

python_rocks
30.03.2008, 16:18
Also im Pony prog sind momentan häkchen bei folgenden Einträgen:

OCDEN
CKOPT
EESAVE
BOOTSZ1
BOOTSZ0
BOOTRST
CKSEL0
Hallo Blamaster!

Ich würde CKSEL0 ausschalten. Du lässt dem Ding ja keine Zeit zum Warmlaufen. Aber ansonsten sollte es damit schon funktionieren.

Also liegt das Problem am Quellcode. Lass uns doch mal ein wenig Quellcode sehen.

mfg
Gerold
:-)

Blamaster
30.03.2008, 18:32
Problem scheint in den Griff bekommen zu sein :)

Ich hatte im timerinterrupt dem Timer nicht nochmal den Timerwert zugewiesen -.-

Nun läuft es seit 10 Minuten ohne verzug.

mfg Blamaster

Edit. Was genau bewirkt eigentlich CKSEL0 ?

python_rocks
30.03.2008, 19:00
Nun läuft es seit 10 Minuten ohne verzug.
[...]
Edit. Was genau bewirkt eigentlich CKSEL0 ?
Hallo Blamaster!

Das freut mich!

CKSEL0, SUT1 und SUT0 bestimmen gemeinsam, wie lange dem µC Zeit gelassen wird um hochzustarten. Quarze und Oscillatoren brauchen ein wenig Zeit, bevor sich die richtige Frequenz einstellt.

Im ATmega16-Datenblatt auf Seite 25 findest du die Auflistung.

mfg
Gerold
:-)

Blamaster
30.03.2008, 19:25
Vielen Dank :)

mfg Blamaster

LLiinnuuxx
31.03.2008, 06:13
freut mich das ihr eine Lösung gefunden habt :-p

einen schönen Tag noch
euer LLiinnuuxx