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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren