Forum: Mikrocontroller und Digitale Elektronik ATmega644 CTC Timer1 Problem


von prinzmi (Gast)


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!

von Uwe (de0508)


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);

: Bearbeitet durch User
von Joachim B. (jar)


Lesenswert?

prinzmi schrieb:
> Das ist der Code:TCCR1B |= (1<<WGM12) | (1<<CS11) | (1<<CS12);
> //Prescaler 64

wo hast du das her?

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

stimmt natürlich, siehe auch

http://modelleisenbahn-steuern.de/controller/atmega8/12-13-2-tccr1b-atmega8.htm

von prinzmi (Gast)


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.

von Kai M. (kai_mauer)


Lesenswert?

Joachim B. schrieb:
> stimmt natürlich, siehe auch
>
> http://modelleisenbahn-steuern.de/controller/atmega8/12-13-2-tccr1b-atmega8.htm

Das kann in's Auge gehen, denn dort ist der Atmega8 gemeint, nicht der 
644.
Die Bits sind ja leider nicht in jedem Falle in den gleiche Registern.

von Joachim B. (jar)


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!

: Bearbeitet durch User
von Thomas E. (thomase)


Lesenswert?


von Joachim B. (jar)


Lesenswert?

Thomas Eckmann schrieb:
> Unsinn.

warum? war der erste Sucheintrag und passte

Thomas Eckmann schrieb:
> Sondern siehe:
>
> http://www.atmel.com/Images/doc8152.pdf

klar es gibt mehr als einen Weg, muss ja nicht Rom sein.

Dein Unsinn ist Unsinn :p

: Bearbeitet durch User
von Thomas E. (thomase)


Lesenswert?

Joachim B. schrieb:
> warum? war der erste Sucheintrag und passte

Das ist ein Atmega8. Alao passt da gar nichts.

mfg.

von Joachim B. (jar)


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?

: Bearbeitet durch User
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.