Atmega16, Timer läuft zu langsam

Gast #3563569
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
#3563595
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.
Gast #3563598
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.