www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik [AtMega32] Timer Geschwindigkeit falsch


Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich probiere gerade den Timer an meinem AtMega32 korrekt zu verwenden.
Ich habe einen Systemtakt von 16MHz. Entspricht das dem clkI/O, der für 
den Timertakt verwendet wird? Im Datenblatt finde ich dazu keine 
definitive Aussage...

Die wichtigen Code-Teile:
int main(void)
{  
  // Timer konfigurieren
  TCCR1A = (1<<WGM12); // CTC Modus
  TCCR1B |= (1<<CS11) | (1<<CS10); // Prescaler 64

  // ((16000000/64)/1000) = 250
  OCR1A = 250-1; // Aufruf alle 1ms

  // Compare Interrupt erlauben
  TIMSK |= (1<<OCIE1A);

  // Global Interrupts aktivieren
  sei();
    while(1)
    {
        char lcdBuffer[20];
        for (int i=0; i<20; i++)
            lcdBuffer[i] = ' ';
        sprintf(lcdBuffer, "Zeit: %02d.%03d", sekunde, millisekunden); 
        lcd_line(lcdBuffer);
    }
}

ISR (TIMER1_COMPA_vect)
{
  millisekunden++;
  if(millisekunden == 1000)
  {
    sekunde++;
    millisekunden = 0;
  }
}

Normalerweise sollten die Sekunden/Millisekunden Angaben nun korrekt 
hochlaufen, sie tun dies allerdings viel zu langsam. (geschätzt Faktor 
800 oder so)

Wo mache ich einen Fehler? Ich habe mich schon mehrmals durchs 
Datenblatt gewühlt, kann aber nix finden...

Viele Grüße,
Daniel

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

du musst den Timer in der Interruptroutine neu laden..


Gruß Daniel

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

> TCCR1A = (1<<WGM12); // CTC Modus

WGM12 befindet sich im Register TCCR1B

MfG Spess

Autor: Grrrr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bitte kompilierbaren Code posten.

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Daniel schrieb:
> du musst den Timer in der Interruptroutine neu laden..

Nein, das macht der Controller selbst ;)

spess53 schrieb:
>> TCCR1A = (1<<WGM12); // CTC Modus
>
> WGM12 befindet sich im Register TCCR1B

Genau daran lags, vielen Dank! Dämlicher Fehler, da hätt ich noch ewig 
dran gesucht.

Grrrr schrieb:
> Bitte kompilierbaren Code posten.

Werde ich demnächst machen.

Autor: Rene K. (draconix)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was auch gerne vergessen wird beim Atmega16 / 32 in Verbindung mit einem 
16Mhz Quarz: Fusebit CKOPT setzen!

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.