Atmega32 Timer falscher Takt

OP #2583164
Lesenswert?

Hallo,

Ich versuche Grad mit einem Atmega32 und einem Quarzoszillator mit 
3,276800Hz einen 1Hz Takt zu erzeugen. Dazu benutze ich den 16-bit 
timer.
1
#include <avr/io.h>
2
#include <util/delay.h>
3
#include <avr/interrupt.h>
4
int a;
5

6

7
int main(void)
8
  {
9
TIMSK = (1<<TOIE1);   // enable TCNT1 overflow
10
TCCR1A = 0x00; // normal operation page 148 (mode0);
11
TCNT1=0x0000; // 16bit counter register
12
TCCR1B = 0b00000111; // ----External clock source on T1 pin. Clock on rising edge.
13
  
14
 
15
    DDRD  = 0b11111111;
16
    DDRB  = 0b11111100;
17
    DDRA  = 0b11111111;
18
    DDRC  = 0b11111111;
19

20
     sei(); // Global Interrupts aktivieren
21
    while(1)
22
    {sei();}
23

24
  
25

26
}
27
ISR(TIMER1_OVF_vect)
28

29

30
{
31
a++;
32
if (a==25)
33
{a=0;
34
PORTA ^= ( 1 << PA2); // toggle a2 im sekundentakt
35
}
36
}

theoretisch soll es dann mit 3,276800Hz/(2^16)=50Hz die 
Interrupt-routine ausgelöst werden und so bei jedem 25. mal pin A2 
toggeln.
--> 1Hz
Stattdessen bekomme ich jetzt aber 1/12,.. Hz. Was mach ich denn falsch?
Gast #2583199
Lesenswert?

danke für eure Hilfe

Fummler schrieb:
> Wenn du mit Clockfrequez arbeiten willst solltest du den Prescaler auf [1]
> stellen.

Hm, aber prescaler verwende ich doch garnicht, ich arbeite ja nicht mit 
dem Systemtakt sondern externer Takt an B1

-variable ist jetzt volatile
-sei() ist aus der Schleife

leider keine Verbesserung
#2583228
Lesenswert?

> 3,276800Hz

Was ist das wirklich für ein Quarz? Welche Frequenz hat der tatsächlich?

Ich kann mir nicht vorstellen, dass es einen 3 Komma 2768 Herz Quarz 
gibt. (Also: Bischen mehr als 3 Schwingungen in der Sekunde)

(und bitte gewöhn dir an: In der Programmierung benutzen wir einen 
Dezimalpunkt, so wie ihn jede ernst zu nehmende Programmiersprache 
benutzt. Tausenderpunkte (oder im anglikalen Bereich: Kommas) ist was 
für Kaufleute aber nicht für Techniker. Das stiftet alles nur 
Verwirrung)
Moderator Persönliche Seite #2583286
Lesenswert?

Felix F. schrieb:

> Ich versuche Grad mit einem Atmega32 und einem Quarzoszillator mit
> 3,276800Hz einen 1Hz Takt zu erzeugen. Dazu benutze ich den 16-bit
> timer.

Welchen Wert hat F_CPU?

Zur Variablen a: Da sie nur in der ISR verwendet wird, definiere sie 
innerhalb der ISR als static. Das volatile kannst Du Dir dann sparen, 
macht das ganze einen Tick effizienter. Ausserdem reicht uint8_t, da sie 
niemals größer als 25 werden kann. Das spart nicht nur weiteren Code, 
sondern auch nochmals CPU-Zeit.

Gruß,

Frank
Gast #2583651
Lesenswert?

Hi

>Der Quarzosszillator hat 3.276800 MHz und dient als external clock an PB
>F_CPU liegt bei 1 MHz. (Interner Oszillator)

Dir ist aber bekannt, das die Frequenz an PB1 maximal Fcpu/2 sein darf?

MfG Spess

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