Forum: Mikrocontroller und Digitale Elektronik wo finde ich die CKDIV-Fuse in AVR Studio ?


von Lochrasterfan (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

wegen neuer Hardware (kein LPT-Port mehr) bin ich von meinem alten 
Parallelprogger auf den USB Prog umgestiegen und dadurch in der 
komfortablen Lage, dass ich nicht mehr mit PonyProg programmieren muss, 
sondern direkt aus dem AVRStudio (Version 4.18) proggen kann.

Jetzt bastle ich mir gerade eine Uhr mit einem ATmega 8 und frage mich, 
warum sie zu langsam läuft.

Ich verwende einen 4.194304 MHz Quarz, das ist auch in meinem Programm 
so definiert:

#define F_CPU 4194304

mein Timer-Prescaler ist folgendermaßen gesetzt:

TCCR2 = 0x04;
TIMSK |= (1<<TOIE2);

Laut Datenblatt komme ich also auf eine Interruptfrequenz von
4194304/64 = 65536 Hz

Ich habe das getestet, indem ich in der Interruptroutine ein Portpin 
toggle:

ISR(TIMER2_OVF_vect) {PORTD ^= 0x02;}

Ich würde also 32768Hz erwarten, messe mit dem Oszi aber eine Frequenz 
von 128Hz --> um den Faktor 8 zu langsam!

Jetzt habe ich natürlich als erstes die CLCKDIV-Fuse im Verdacht, aber 
ich finde sie nicht im Dialog des AVR-Studio (Vgl. Abbildung).

Noch was: unter Project -> Configuration Options -> general
ist keine Taktfrequenz eingetragen ... ändert aber auch nix, wenn ich es 
tue.

... irgendwie stehe ich auf dem Schlauch ... kann mir da jemand helfen?

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Der Mega8 hat keine CLKDIV-Fuse, er hat 4 interne Oszillatoren für 1, 2, 
4 und 8Mhz. Es muß also irgendwas in Deiner Timerroutine nicht passen. 
Oder aber Du hast nicht auf den externen Quarz gefused. Dann dürfte Dein 
Controller aber lediglich gut 4x zu langsam sein.

von Lochrasterfan (Gast)


Lesenswert?

Travel Rec. schrieb:
> Der Mega8 hat keine CLKDIV-Fuse

Danke, Travel Rec. Das erklärt schon mal, warum ich im Datenblatt nichts 
darüber finde ...

> Oder aber Du hast nicht auf den externen Quarz gefused.

Ich dachte, das hätte ich mit obiger Einstellung der SUT_CLKSEL - Fuse 
eben schon getan?

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Ja, okay - das mit dem Quarz paßt. Aber wie kommst Du auf den 
mysteriösen Teiler von 64? Der Timer2 ist 256 Counts breit (8 Bit), mit 
Vorteiler 4 macht das 1024. Dies als Teiler der CPU-Frequenz ergibt 4096 
Hz. Hmm... Haste noch mehr Code?

von Volker S. (volkerschulz)


Lesenswert?

Lochrasterfan schrieb:
> Ich würde also 32768Hz erwarten, messe mit dem Oszi aber eine Frequenz
> von 128Hz --> um den Faktor 8 zu langsam!

Bei einem Prescaler von 64 Zaehlt der Timer alle 64 Zyklen um 1 weiter. 
Der Interrupt kommt aber erst bei Ueberlauf, also bei 8-bit nach 256 
Inkrementen!

Volker

von Volker S. (volkerschulz)


Lesenswert?

Dann macht auch seine (falsche) Rechnung Sinn:

Takt = 4194304 Hz
Prescaler = 64

= Inkrementieren mit 65536 Hz

Timer = 8-Bit

= Ueberlauf mit 256 Hz

Bei jedem Ueberlauf togglen.

= Periode von 128 Hz


Volker

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Jup.

von Lochrasterfan (Gast)


Lesenswert?

... das kann ich Nachvollziehen. Super !!
Ich brauche also nicht den Überlauf-Interrupt, sondern einen Vergleich 
...

Danke euch beiden!

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Es gibt auch noch den CTC-Modus, damit kann man, in Verbindung mit der 
Output-Compare-Schaltung und dem OCRx-Register, sehr fein auflösen, wann 
der Interrupt kommen soll.

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.