ATmega644 CTC Timer1 Problem

Gast #3980466
Lesenswert?
• ▲
▼
Ich wollte einen CTC Timer einstellen, der jede ms in die 
ISR(TIMER1_COMPA_vect) springt.

Das ist der Code:
1
TCCR1B |= (1<<WGM12) | (1<<CS11) | (1<<CS12); //Prescaler 64
2
  TCNT1 = 0;
3
  OCR1A = 249;
4
  TIMSK1 |= (1 << OCIE1A);

Leider funktioniert es aus mir unerklärlichen Gründen nicht. Es wird die 
ISR nicht aufgerufen.

Jede Hundertstelsekunde klappt aber:
1
TCCR1B |= (1<<WGM12) | (1<<CS12); //Prescaler 256
2
  TCNT1 = 0;
3
  OCR1A = 624;
4
  TIMSK1 |= (1 << OCIE1A);

Kann mir das jemand erklären. Ich steh voll auf dem Schlauch!
#3980518
Lesenswert?
• ▲
▼
prinzmi,

gibt es für den ATmega644 auch eine Taktfrequenz?

Ich gehe mal von 16MHz aus.

Es liegt natürlich an dieser Zeile, die keinen 1:64 Teiler einstellt.
1
TCCR1B |= (1<<CS11) | (1<<CS12); //Prescaler 64
das wäre natürlich diese Maske:
1
TCCR1B |= (1<<CS11) | (1<<CS10);
Gast #3980614
Lesenswert?
• ▲
▼
Ach du meine Güte!!! Da sitze ich fast eine Stunde über dem Datenblatt 
und dann sehe ich den Wald vor lauter Bäumen nicht.

Uwe S. schrieb:
> das wäre natürlich diese Maske:TCCR1B |= (1<<CS11) | (1<<CS10);

Steht natürlich eindeutig im Datenblatt. Keine Ahnung warum ich das 
immer falsch gelesen habe.
Vielen Dank.
#3980724
Lesenswert?
• ▲
▼
Kai Mauer schrieb:
> Das kann in's Auge gehen, denn dort ist der Atmega8 gemeint,

da habe ich ja mit dem Wechsel vom m328p zum 1284p Glück gehabt, da 
passt es.

Sogar bei den Timer3 liegt alles an "seinem" Platz so das sich die 
#defines leicht ändern liessen.
1
#if defined(__AVR_ATmega328P__) || defined(M1284P_TIM1)
2
  #define   TIMSKx              TIMSK1
3
  #define   OCIExA              OCIE1A
4
  #define   TIMERx_COMPA_vect   TIMER1_COMPA_vect  // ATmega
5
  #define   TCCRxA              TCCR1A
6
  #define   COMxA0              COM1A0
7
  #define   OCRxA               OCR1A
8
  #define   TCCRxB              TCCR1B
9
  #define   WGMx2               WGM12
10
  #define   CSx0                CS10
11

12
  #define ARDUINO_LED      5
13
  #define DDR_ARDUINO_LED  DDRB
14
  #define PORT_ARDUINO_LED PORTB
15
  #define ARDUINO_LED_ON   PORT_ARDUINO_LED|=(1<<ARDUINO_LED)
16
  #define ARDUINO_LED_OFF  PORT_ARDUINO_LED&=~(1<<ARDUINO_LED)
17

18
#elif defined(__AVR_ATmega1284P__)
19
  #define   TIMSKx              TIMSK3
20
  #define   OCIExA              OCIE3A
21
  #define   TIMERx_COMPA_vect   TIMER3_COMPA_vect  // ATmega
22
  #define   TCCRxA              TCCR3A
23
  #define   COMxA0              COM3A0
24
  #define   OCRxA               OCR3A
25
  #define   TCCRxB              TCCR3B
26
  #define   WGMx2               WGM32
27
  #define   CSx0                CS30
28
  #define ARDUINO_LED      7
29
  #define DDR_ARDUINO_LED  DDRB
30
  #define PORT_ARDUINO_LED PORTB
31
  #define ARDUINO_LED_ON   PORT_ARDUINO_LED|=(1<<ARDUINO_LED)
32
  #define ARDUINO_LED_OFF  PORT_ARDUINO_LED&=~(1<<ARDUINO_LED)
33

34

35
#endif

Kai Mauer schrieb:
> Die Bits sind ja leider nicht in jedem Falle in den gleiche Registern.

stimmt, man muss immer schauen!
#3981131
Lesenswert?
• ▲
▼
Thomas Eckmann schrieb:
> Das ist ein Atmega8. Alao passt da gar nichts.

müde? sauer? oder bloß unsympatisch?

Joachim B. schrieb:
> TCCR1B |= (1<<CS11) | (1<<CS10);

schaue ich ins 644 Datenblatt
http://www.atmel.com/Images/doc2593.pdf
steht dort auf Seite 127:

ICNC1 ICES1 – WGM13 WGM12 CS12 CS11 CS10 TCCR1B

und auf Seite 128:
Table 14-6.
Clock Select Bit Description
CSn2 CSn1 CSn0 Description
0    0    0    No clock source (Timer/Counter stopped).
0    0    1    clk I/O /1 (No prescaling)
0    1    0    clk I/O /8 (From prescaler)
0    1    1    clk I/O /64 (From prescaler)
1    0    0    clk I/O /256 (From prescaler)
1    0    1    clk I/O /1024 (From prescaler)

Thomas Eckmann schrieb:
> Alao passt da gar nichts.

doch weil viele Megas sich an die Registernamen halten (prüfen muss man 
natürlich ob es für jeden Mega gilt).

also der gewünschte Vorteiler 64 kann mit CS10 und CS11 gesetzt werden, 
nicht anderes war dort beschrieben und das ist RICHTIG,
egal ob es aus dem Atmega8 Datenblatt stammt oder aus dem 644p 
Datenblatt.

Also wer oder was willst du sein?

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 11 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.