Timer2 Atmega32

Gast #4129454
Lesenswert?
• ▲
▼
Hi,

ich verzweifle hier mit meinem ATMega32 Timer :(

Fuses bzgl. Quarz sollten Passen (mach ich z. B. _delay_ms(500)  und 
messe das mit dem Oszi an einem Ausgang) stimmt alles.

Hier mein Code (nur die relevanten Auszüge - ich will via CTC alle eine 
Sekunde die Var "xx" inkrementieren):

1
#define F_CPU 16e6
2

3
//INCLUDEs
4
#include <avr/io.h>
5
...
6
#include <avr/interrupt.h>
7

8
volatile uint32_t xx = 0;
9
uint8_t yy = 0;
10

11
...
12

13
int main (void)
14
{  
15
  //Timer2
16
  TCCR2 = (1<<WGM01); // CTC Modus
17
  TCCR2 |= (1<<CS02) | (1<<CS00); // Prescaler 1024
18
  OCR2 = 625-1;
19
  TIMSK |= (1<<OCIE2); //Compare Interrupt erlauben
20
  sei(); //global Interrupts aktivieren
21

22
  //Definition ein und Ausgänge
23
  ....
24
  
25
  while(1)
26
  {
27
    //hier toggelt ein Pin zum Test und Messen mit dem Oszi, nur leider viel zu schnell 
28
  }
29
}
30

31
ISR (TIMER2_COMP_vect)
32
{
33
  if (++yy == 25) 
34
  {
35
    yy = 0;
36
    if (++xx > 86399) //irgendwann von vorne beginnen
37
      xx = 0;
38
  }
39
}

Ich bekomme keine Fehlermeldung, nur stimmt das Timing leider nicht.

Ich rechne so:
16MHz / 1024 (Prescaler) = 15625Hz
Ich lasse jetzt bis 624 (625-1) zählen.
15625Hz / 625 = 25Hz  >> sollte die ISR also 25mal in der Sekunde 
aufrufen.
Nun noch die Hilfsschleife, die nur jeden 25sten durchlauf meine Var 
"xx" inkrementiert (und bei erreichen eines max. Wertes wieder NULL 
setzt)

Oder habe ich einen Denkfehler??
DANKE
Gast #4129472
Lesenswert?
• ▲
▼
Wenn man Hardwaremodule umzieht sollte man auch ins Datenplatt schauen

>   //Timer2
           ^
>   TCCR2 = (1<<WGM01); // CTC Modus
        ^          ^
>   TCCR2 |= (1<<CS02) | (1<<CS00); // Prescaler 1024
        ^          ^           ^                 ^^^^
>   OCR2 = 625-1;
       ^   ^^^
>   TIMSK |= (1<<OCIE2); //Compare Interrupt erlauben

HTH
Gast #4129492
Lesenswert?
• ▲
▼
Das ist für mich nachvollziehbar.

Hab mal einen Quarz gehabt der nicht wollte, ums verrecken nicht.

Hab da die Kerkos statt 22pF mit 22nF eingesetzt.

Hab dann erst mal Pause gemacht, dann gings wieder :-)
Gast #4129696
Lesenswert?
• ▲
▼
Tobias schrieb:

> Danke - ich war mir sicher mit Timer2 :(

Wie kann man sich sicher sein, wenn man offensichtlich niemals auch 
nur andeutungsweise das zutreffende Datenblatt (oder auch nur irgendein 
AVR8-Datenblatt) gelesen hat?

Das soll wohl ein Insider-Witz eines gelernten Copy&Paste-Programmierers 
sein?

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.