Forum: Mikrocontroller und Digitale Elektronik atmega168 timer 1 CTC mode 12


von Vlad T. (vlad_tepesch)


Lesenswert?

hi,

ich hab mal ne Frage bezüglich des timer 1 ctc mode 12.
Ich bin mir nicht sicher, ob ich das Datenblatt richtig verstehe:


Ich hab das so verstanden, dass der Timer von 0 - ICR1 läuft,
und dass man die OCR1A und OCR1B Ausgänge weiterhin benutzen kann.
(nur ebend mit der verringerten Auflösung)

Ist das falsch?
Ich habe den timer mit ICR=800 (prescaler 1, Takt: 8Mhz  --> 10kHz) 
laufen

der ist fix.
jetzt möchte ich den OCR1A Pin für eine PWM benutzen.

Die Frage ist, ist denn der CTC mode ein PWM-Mode oder nicht?
Sprich, welche Tabelle gilt für die Compare-Output-Modes.
Ich hätte angenommen die erste.
Dh, man müsste den Pin im Compare setzen und im overflow/capture löschen 
(COM1A1:0 = 3).
Das funktioniert nur nicht, selbst wenn man im capture nciht löscht, 
geht die LED nie an.

Toggeln (COM1A1:0 = 1) bringt ja auch nix, da er dann immer im Compare 
toggelt und somit nur die PWM-Grundfrequenz halbiert wird, ohne das 
Tastverähltnis (50:50) zu beeinflussen.


Die Frage ist, ist mein Verständnis des Timers falsch, oder mach ich im 
Code was falsch?

hier mal der Testcode:
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <util/delay.h>
4
#include <stdint.h>
5
6
7
ISR(TIMER1_CAPT_vect)
8
{
9
  PORTB &= ~(1<<PIN1);
10
}
11
12
int main (void)
13
{ 
14
  DDRB |= (1<<PIN1);
15
16
  ICR1    = 800;                  // compare value 10kHz
17
  TCCR1B  = (1 << WGM13)|(1 << WGM12) | (1 << CS10);             // switch CTC Mode on, set prescaler to 1
18
  TIMSK1  = (1 << ICIE1);                                          // ICIE1: Interrupt if timer reaches the Top (ICR1 register)
19
20
  TCCR1A  = (1<<COM1A1); // set on match, clear on overflow
21
22
  while(1)
23
  {
24
    OCR1A = (OCR1A+5)%800;
25
    _delay_ms(10);
26
  }
27
}

Gruß und Danke,
Vlad


edit:
1
  TCCR1A  = (1<<COM1A1); // set on match, clear on overflow
hier fehlt das COM1A0-Bit, dann geht die LED auch an.e
1
  TCCR1A  = (1<<COM1A1)|(1<<COM1A0); // set on match, clear on overflow

Die Helligkeit ändert sich aber trotzdem nicht.

von Vlad T. (vlad_tepesch)


Lesenswert?

Hat denn niemand einen Tip?

von Stefan B. (stefan) Benutzerseite


Angehängte Dateien:

Lesenswert?

Ausser aus "akademischem Interesse" verstehe ich nicht, warum du keinen 
PWM Modus nimmst und stattdessen mit diesem CTC Modus und dann noch mit 
zwei Compare Match Registern arbeitest.

Die Problematik sehe ich darin, dass ein Compare Match bei OCR1A und bei 
ICR1 den TCNT1 auf 0 zurücksetzen. Wenn du z.B. mit OCR1A die ON 
Halbperiode festlegen willst und mit ICR1 die OFF Halbperiode, kommt 
eine nicht zum Zug, weil die schnellere ihr laufend den TCNT1-Ast 
absägt...

Aufgrund dieser Überlegung habe ich versucht, das zu umgehen. Das 
Compare Match Register für gerade nicht benutzte Halbperiode wird dafür 
auf einen sehr hohen Wert gesetzt. Dazu werden allerdings zwei ISRs 
gebraucht. Und aus ist es mit dem Setzen des OC1A per Hardware... Das 
Beispiel für einen Atmega8 (habe leider keinen Atmega168) ist im Anhang.

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.