Forum: Mikrocontroller und Digitale Elektronik Atmega16, Timer läuft zu langsam


von Matze (Gast)


Lesenswert?

Hallo,

Ich möchte den Timer1 eines Atmega16 dazu bringen jede Sekunde einen 
Interrupt zu generieren.

Dazu habe ich folgenden Code:
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
ISR(TIMER1_COMPA_vect)
4
{
5
  Uhr();
6
}
7
8
int main(void)
9
{
10
    Init();
11
    while(1)
12
    {
13
    Ausgabe();
14
    }
15
}
16
17
void Init()
18
{
19
  TCNT1H=0x00;  //Timer auf  0
20
  TCNT1L=0x00;
21
  OCR1AH=0x3D;  //=00111101
22
  OCR1AL=0x08;  //=00001000  = 15624
23
  TCCR1A=0x00;  //Kein WPM  / Keine Ansteuerung von Pins
24
  sei();
25
  TIMSK |= (1<<OCIE1A);    //Interrupt Enable
26
  TCCR1B=0x0C;  //=00001100  / CTC-Modus, Prescaler = 256, Starten
27
}

Problem ist nun das der Interrupt bei einem CPU-Takt von 4MHZ nur alle 4 
Sekunden aufgerufen wird.
Ich möchte jedoch genau eine Sekunde.

Die 4MHZ weden durch 256 geteilt = 15625 Tackte Pro Sekunde
Der Timer ist auf 15624 eingestellt, da der Timer zum Nachladen im 
CTC-Modus einen Takt benötigt.

Eventuell wird der Overflow-Interrupt des Timer 1 Aufgerufen,
Dazu müsste ich jedoch TIMSK |= (1<<TOIE1); nutzen.

Oder der Prescaler Stimmt nicht jedoch ist Bit 3 in TCCR1B für den 
CTC-Modus und Bit 2 in TCCR1B für den Prescaler von 256 zuständig.

Problem ist nun das dass Irgendwie nicht stimmen kann.

Grüße
Matze

von Karl H. (kbuchegg)


Lesenswert?

Matze schrieb:

> Problem ist nun das der Interrupt bei einem CPU-Takt von 4MHZ nur alle 4
> Sekunden aufgerufen wird.

Der Zusammenhang ist zu offensichtlich.

Überprüf mal, ob dein µC überhaupt mit 4Mhz läuft.

von spess53 (Gast)


Lesenswert?

Hi

>Problem ist nun das der Interrupt bei einem CPU-Takt von 4MHZ nur alle 4
>Sekunden aufgerufen wird.

Dann läuft dein ATMega wohl nur mit 1MHz.

MfG Spess

von Karl H. (kbuchegg)


Lesenswert?

Ps.
Wenn du an OCR1A den Wert 15624 zuweisen willst, dann schreib das so
1
  OCR1A = 15624;

warum das besser als deine Version ...
1
  OCR1AH=0x3D;  //=00111101
2
  OCR1AL=0x08;  //=00001000  = 15624
... ist, brauch ich wohl nicht näher ausführen.

von Matze (Gast)


Lesenswert?

Am Xtal-1 Eingang messe ich 3999981HZ.

von Karl H. (kbuchegg)


Lesenswert?

Matze schrieb:
> Am Xtal-1 Eingang messe ich 3999981HZ.

Quarz oder Quarzoszillator?


Das heißt noch lange nicht, dass der µC diesen Takt auch benutzt. Hast 
du den µC mittels Fuse auf Quarz oder Quarzoszillator eingestellt (je 
nachdem was du hast)

von Karl H. (kbuchegg)


Lesenswert?

>   TCCR1B=0x0C;  //=00001100  / CTC-Modus, Prescaler = 256, Starten
>
>
> Oder der Prescaler Stimmt nicht jedoch ist Bit 3 in TCCR1B
> für den CTC-Modus und Bit 2 in TCCR1B für den Prescaler von
> 256 zuständig.

Ehrlich.
Ich würds ja gerne überprüfen. Aber ich hab es mir seit ein paar Wachen 
zur Regel gemacht, das möglichst nicht mehr zu tun. Wenn du zu faul 
bist, da eine ordentliche Schreibweise zu benutzen, die man auch lesen 
kann, in dem du die Bitnamen benutzt, dann bin ich zu faul, mir aus dem 
Datenblatt die Bits in der Registerübersicht rauszusuchen, die du da 
eigentlich gesetzt hast.

Das hier
1
  TIMSK |= (1<<OCIE1A);
ist z.b. gut geschrieben. Da muss man nicht lange suchen und Hex-Zahlen 
dekodieren.

von Matze (Gast)


Lesenswert?

@ Karl Heinz

Schon das es auch einfacher geht, das Problem löst es jedoch nicht.

Es war per Fuse der Interne Oszillator ausgewählt.
Klasse, wusste noch garnicht das ich da so viele Einstellmöglichkeiten 
habe.

Ich würde es such immer "Ordentlich" schreiben, nur wie soll ich damit 
Bits ansprechen die keinen expliziten Namen haben, wie z.b. die Bits von 
TCNT1H?

Danke damit hat sich das erledigt.

von kif (Gast)


Lesenswert?

Fuses prüfen, eventuell ein CLKDIV Fuse gesetzt?

von Oliver S. (oliverso)


Lesenswert?

Matze schrieb:
> @ Karl Heinz
> nur wie soll ich damit
> Bits ansprechen die keinen expliziten Namen haben, wie z.b. die Bits von
> TCNT1H?

Gar nicht, warum auch? TCNT ist ein 16-Bit unsigned Wert, dessen Bits 
haben keine Namen, und brauchen auch keine.

Oliver

von Karl H. (kbuchegg)


Lesenswert?

Matze schrieb:

> Es war per Fuse der Interne Oszillator ausgewählt.

der läuft auf 1Mhz.
Und damit haben wir dann auch schon den Faktor 4 zu den von dir in der 
Rechnung verwendeten 4Mhz gefunden.

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.