www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATMega32 Timer-Einstellung mit CTC Modus


Autor: Björn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich möchte alle 10ms einen Interrupt mit Timer2 des ATMega32 auslösen.
Dazu habe ich die Formel des Datenblattes benutzt:
f = f_clk / ( 2  N  OCR )

f_clk ist bei mir 14,7456 MHz.
N habe ich auf 1024 gesetzt und OCR2 auf 71, da müsste eine Frequenz von 
genau 100Hz raus kommen. Es ist aber deutlich mehr (ca 3 mal zu schnell)

Hier der Initialisierungscode:
DDRB = (1<<PB0) | (1<<PB1) | (0<<PB2) | (1<<PB3) | (1<<PB4) | (0<<PB5) | (0<<PB6) | (1<<PB7);
  PORTB = (1<<PB5) | (1<<PB6);  // Pullups der Taster aktivieren
  DDRC = (1<<PC4) | (1<<PC5) | (1<<PC6);  //als Ausgang konfigurieren
  UBRRH = UBRR_VAL >> 8;
  UBRRL = UBRR_VAL & 0xFF;
     
  UCSRB = (1<<RXEN)|(1<<TXEN)| (1 << RXCIE);  //UART TX einschalten
  UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);  //8 data, 2 stop bits

  MCUCR |= (1<<ISC00);    //INT0 auf fallende und steigende Flanke triggern
  GICR |= (1<<INT0);    //INT0 wird aktiviert

  TCCR2 = 6;        // Timer2 auf FCPU/1024 einstellen
  TCCR2 |= (1 << WGM21);  // CTC Modus (Timer 2 wird bei erreichen von OCR2 zurück gesetzt
  OCR2 = 71;         // Compare Match alle 10ms
  TIMSK |= (1<<OCIE2);  // CTC-Interrupt von Timer 2 wird aktiviert

  TCCR0 = 5;  // Timer0 auf FCPU/1024 einstellen

  TIMSK |= (1<<TOIE0);    //Timer0 wird aktiviert

einiges davon wird nicht interessieren, aber besser zuviel als zuwenig.

Und hier dann der Interrupt:
ISR(TIMER2_COMP_vect){  // wird alle 10ms ausgeführt
...
}
Ich kann mir schlecht vorstellen dass die Formel falsch ist, aber ich 
wüsste nicht was ich da falsch gerechnet haben sollte. Mit OCR2 = 230 
stimmt es ca., aber ich würde schon lieber korrekt gerechnete Werte 
nehmen, statt sie empirisch ermitteln zu müssen.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>vielleicht solltest Du den H-Teil von UBRR_VAL auch in das H-Register
>laden und den L-Teil in das L-Register...

Wieso? Ist doch richtig.

MfG Spess

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

TCCR2 = 6;        // Timer2 auf FCPU/1024 einstellen

Warum schreibst DU hier nicht die Bitnamen?

1024 ist CS22 = 1, CS21 = 1, CS20 = 1
kann also nicht stimmen.

Gruß aus Berlin
Michael

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

spess53 schrieb:
> Hi
>
>>vielleicht solltest Du den H-Teil von UBRR_VAL auch in das H-Register
>>laden und den L-Teil in das L-Register...
>
> Wieso? Ist doch richtig.

Du bist einfach zu schnell, hatte ich schon bemerkt und den Post 
gelöscht...

Gruß aus Berlin
Michael

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erstens hast du bei der Formel ein "1 +" unterschlagen, zweitens 
beschreibt das f dort nicht die von dir gewünschte Interrupthäufigkeit, 
sondern die Frequenz an einem getoggelten Pin.

Ein Interrupt alle 10 ms sind 100 Interrupts pro Sekunde, daraus ergibt 
sich als OCR-Wert:
14,7456 MHz / 1024 / 100 - 1 = 143

Autor: Björn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ah danke,

alles klar.

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.