Forum: Mikrocontroller und Digitale Elektronik Atmega32 Timer falscher Takt


von Felix F. (felixfelix)


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?

von AVR (Gast)


Lesenswert?

Felix F. schrieb:
> int a;

Das würde ich schon einmal volatile machen, da diese Variable immer vom 
Interrupt aktualisiert wird und somit immer wieder neu geladen werden 
muss.

von Fummler (Gast)


Lesenswert?

1
TCCR1B = 0b00000111; // ----External clock source on T1 pin. Clock on rising edge.

Wenn du mit Clockfrequez arbeiten willst solltest du den Prescaler auf 0 
stellen.

von Fummler (Gast)


Lesenswert?

und numm das sei(); aus der Endlosschleife raus.

von Fummler (Gast)


Lesenswert?

Ich meinte natürlich Prescaler auf 1 ;-)

Ich und selbstgespräche? nee.

von felixfelix (Gast)


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

von Fummler (Gast)


Lesenswert?

Sorry, hab ich falsch verstanden. Dachte der Quarz mit der der uC 
arbeitet ist 3,... MHz

von Karl H. (kbuchegg)


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)

von Frank M. (ukw) (Moderator) Benutzerseite


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

von felixfelix (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Was ist das wirklich für ein Quarz? Welche Frequenz hat der tatsächlich?

Allso hier nochmal alles genau:
Der Quarzosszillator hat 3.276800 MHz und dient als external clock an PB
F_CPU liegt bei 1 MHz. (Interner Oszillator)

von spess53 (Gast)


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

von felixfelix (Gast)


Lesenswert?

oh nein ist mir nicht bekannt gewesen.
super mit 8 mhz internem takt läuft es.
besten dank euch allen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.