mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Timer1 CTC Mode?


Autor: Sebastian S. (rudimentor)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich habe schon viele Beiträge gelesen komme aber nicht weiter!

Mein Problem:
Ich möchte den Timer1 eines ATmega8 im CTC Mode laufen lassen. Tut er 
aber nicht trotzt des Studiums der Beiträge und Datenblatt.
Im Datenblatt steht, das WGM13:0 4 sein muß, bzw. 0100. OCR1A habe ich 
bei einem Prescaler von 256 auf 0C34 gesetzt. Das entspricht dann bei 
einer Grundfrequenz von 31,25kHz einen Timer1 Overflow von 10Hz, 
vorrausgesetzt er fängt immer wieder bei 0 an zu zählen. Tut er aber 
nicht. Ich muß immer noch den Wert FFFF-0C34 in das TCNT1 Register 
schreiben, so dass der Timer das macht was ich möchte.

Laut Datenblatt sollte er doch TCNT1 selbstständig auf 0 setzen und bis 
OCR1A zählen. Jetzt zählt er ja die Differenz von F3CB bis FFFF? Was 
mache ich falsch?
Schon mal Danke im Vorraus....

Der Code:
#include <avr/io.h>
#include <avr/interrupt.h>
 
volatile uint8_t Interruptflag;
 
int main() {

    DDRD = 0x00; //PortD als Ausgang definiert
 
    TCCR1A &= ~(1<<WGM10);
    TCCR1A &= ~(1<<WGM11);
    TCCR1B |= (1<<WGM12);
    TCCR1B &= ~(1<<WGM13);  //CTC-Mode TOP OCR1A
    TCCR1B |= 4;      //Prescaler 256
    TIMSK |= (1<<TOIE1);    //Timer Overflow Interrupt freischalten 
    OCR1A = 0x0C34;       //Top Wert gesetzt
    TCNT1 = 0xF3CB;
         
   sei(); // Interrupts aktivieren

    while(1) {
  
  
        if (Interruptflag == 1) { // Neuer Timerzyklus ?
            Interruptflag = 0;
            PORTD ^= (1 << PD7);    // LED toggeln
        } 
     
  } 
} 
 


// Timer1 overflow Interrupt

ISR( TIMER1_OVF_vect ) {
     TCNT1 = 0xF3CB;
     Interruptflag = 1;

}

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sebastian S. schrieb:
> DDRD = 0x00; //PortD als Ausgang definiert

öhm nö?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Beim CTC MOdus hängst du dich nicht mehr an den Overflow Interrupt, weil 
der Timer technisch gesehen ja keinen Overflow mehr macht.

Du gehst an den Compare Match Interrupt.


    OCR1A = 0x0C34;       //Top Wert gesetzt
    TCNT1 = 0xF3CB;

Und die Tatsache, dass du den Zähler ausserhalb des 'erlaubten' Bereichs 
loslaufen lässt, stört dich nicht weiter?

Meine Vorgabe an dich lautet:
Du zählst jetzt von 0 bis 100. Jedesmal wenn du die 100 erreicht hast 
(und zwar exakt 100 und nur 100, nicht größer nicht kleiner, exakt 100) 
beginnst du wieder bei 0. Also los jetzt, fang bei 200 zu zählen an!

Autor: Sebastian S. (rudimentor)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh ja sorry, falsche Portzuweisung. Denoch habe ich nur eine Frequenz, 
wenn ich TCNT1 setze. Und komischerweise auch mit der falschen 
Portzuweisung! Ich habe die Portzuweisung nun auf 0xFF gesetzt, was an 
meinem obigen Problem nix ändert.

Autor: Sebastian S. (rudimentor)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Karl Heinz:

Danke für den Hinweis! Das wars! Ich habe in TIMSK jezt anstelle TOIE1 
das OCIE1A Bit gesetzt, noch den ISR Vector geändert in 
TIMER1_COMPA_vect und schon kann ich TCNT1 weglassen.
Vielen Dank!

Und Danke für Eure Geduld mit Anfängern wie mir! Tolle Internetseite!

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.