Atmega32 Timer falscher Takt

OP #2583164
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
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.
Gast
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
> 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
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
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

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.