mikrocontroller.net

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


Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht 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:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <stdint.h>


ISR(TIMER1_CAPT_vect)
{
  PORTB &= ~(1<<PIN1);
}

int main (void)
{ 
  DDRB |= (1<<PIN1);

  ICR1    = 800;                  // compare value 10kHz
  TCCR1B  = (1 << WGM13)|(1 << WGM12) | (1 << CS10);             // switch CTC Mode on, set prescaler to 1
  TIMSK1  = (1 << ICIE1);                                          // ICIE1: Interrupt if timer reaches the Top (ICR1 register)

  TCCR1A  = (1<<COM1A1); // set on match, clear on overflow

  while(1)
  {
    OCR1A = (OCR1A+5)%800;
    _delay_ms(10);
  }
}

Gruß und Danke,
Vlad


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

Die Helligkeit ändert sich aber trotzdem nicht.

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat denn niemand einen Tip?

Autor: Stefan B. (stefan) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.