Forum: Compiler & IDEs Uhrenquarz am ATmega 644


von Horst B. (Gast)


Lesenswert?

Hallo Zusammen,

habe folgendes Problem. Wollte einen Uhrenquarz an den Pins TOSC1/2 
betreiben. Nutze hierzu den Timer2/B.

Auszug aus dem Quellcode:

int main(void)
{
 ASSR|=(1<<EXCLK)|(1<<AS2);
 TCCR2B=(1<<CS22)|(1<<CS21)|(1<<CS20); Teiler 1024
 TCNT=255;
 TIMSK2|=(1<<TOIE2);

 sei();

 while(1)
 {
 //Leer
 }
 return 0;
}

ISR (TIMER2_OVF_vect)
{
//mach was
}

Wenn ich das ASSR auskommentiere, dann läuft der Timer einwandfrei.
Dann nutzt er also den CPU Takt / 1024

Der Quarz ist an TOSC1/2 angeschlossen und über 2x22P C an Masse.
Wo liegt mein Fehler. Hat vielleicht einer schon mal das Problem gehabt.
Mit dem Oszilloskop kann ich keine Schwingung am Quarz messen. Ich bin 
echt ratlos. Woran kann das liegen das der Quarz nicht anschwingt??
Den vollständigen Code hab ich leider nicht hier. Falls notwendig kann 
ich das heute abend noch mal einstellen.
Das Ganze wird mit 5V betrieben.
Danke im Voraus!!

von Stefan E. (sternst)


Lesenswert?

Horst Badberg schrieb:

>  ASSR|=(1<<EXCLK)|(1<<AS2);

Schau nochmal ins Datenblatt. Das ist nicht die richtige Konfiguration 
für einen externen Quarz.

von (prx) A. K. (prx)


Lesenswert?

Und dann schau anschliessend noch mal in das Kapitel zum asynchronen 
Timer, aber richtig tief und gründlich, denn da gibt's auch bei richtig 
gesetzten Bits ein paar Fallen.

von MWS (Gast)


Lesenswert?

Uhrenquarze werden ohne Kondensatoren nach Masse angeschlossen und EXCLK 
darf nicht gesetzt werden, siehe DB, ist nur für ext. zugeführten Clock.

von Horst B. (Gast)


Lesenswert?

Man seid ihr alle schnell!! Hut ab.
Danke für die Antworten.

ASSR|=(1<<AS2); hatte ich schon getestet. Läuft auch nicht! Werde das 
mal mit ohne Kondensatoren testen. Wenn es dann nicht läuft, dann kaue 
ich das DB heute mal durch.
Ich berichte!!!
LG Horst

von Denny S. (nightstorm99)


Lesenswert?

Hallo!

Das gleiche bastel ich auch gerade und bei mir siehr es so aus:
1
// ASYNCRONEN TIMER2
2
ASSR   = (1<<AS2);
3
_delay_ms(100);
4
TCCR2B = (1<<CS22) | (1<<CS20);  // TEILER 128 für 1sek
5
TIFR2   = (1<<TOV2);             // Interrupts löschen (*)
6
TIMSK2 = (1<<TOIE2);


Grüße Denny

von MWS (Gast)


Lesenswert?

>> ASSR|=(1<<AS2)

Wenn außerhalb der Main kein Zugriff auf das ASSR stattfindet, wäre es 
sicherer die Veroderung wegzulassen:

ASSR=(1<<AS2)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Denny S. schrieb:

> ASSR   = (1<<AS2);
> _delay_ms(100);

Ist -- je nach Quarz -- schon recht knapp.  Manche brauchen da auch
schon mal 300...500 ms, bis sie stabil schwingen.  Sollte man einfach
im Hinterkopf behalten, man muss ja diese Zeit nicht unbedingt
tottreten.

von Horst B. (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

es ist genauso, wie Denny es beschrieben hat.
Bei mir müssen dieKondensatoren auf alle Fälle dran, sonst schwingt der 
Quarz nicht!!
Vielen, vielen Dank an alle die geholfen haben.
Als Anhang meine main.c So funktioniert es bei mir.
Ein Semikolon fehlt in der main.c (wo der Prescalerwert gewählt wird)

von Detlev T. (detlevt)


Lesenswert?

Hallo Horst Badberg,

das Thema "Uhrenquarz am ATMEGA644" hatte ich auch gerade, wenn auch nur 
hypothetisch. Im Datenblatt steht dazu, dass man einen Quarz mit einer 
Kapazität von 6pF allein anschließen soll, bei höheren Kapazitäten aber 
die Schaltung mit den zusätzlichen Kondensatoren braucht.

Gruß, DetlevT

von Horst B. (Gast)


Lesenswert?

Hallo Detlev,

danke für den Hinweis. Denke das dieser Tread auf alle Fälle auch 
anderen weiterhilft. Denke so soll es in einem Forum sein.

LG Horst

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.