www.mikrocontroller.net

Forum: Compiler & IDEs Timer1 Interrupt


Autor: Simon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ISR (TIMER1_COMPA_vect) {
  lcd_putc('X');
}

// Timer init
OCR1A = 10799;
TCNT1 = 0;
TCCR1B |= (1<<CS12)|(1<<CS10); // 1024 pre
TIMSK |= (1<<OCIE1A);


Habe ich da irgendwas vergessen? Timer1 und prescaler 1024, soll
interupt ausloesen.

Autor: Simon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oder vielleicht bin ich nur zu ungeduldig,

wieviele sekunden muss ich da warten bei 11059200 Hz

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sei() fehlt

Autor: Simon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke.
Ist aktiviert, da ich INT0 noch verwende.

Funzt jetzt auch, aber ich hab da irgendwas um die 10 sekunden.
sollte doch ansich 4 sekunden werden


11059200 / 1024 =

10800
ich zaehle bis 10799 hoch, das muesste doch ne sekunde sein

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>ich zaehle bis 10799 hoch, das muesste doch ne sekunde sein

Nicht wenn der Quarz nicht läuft. Fuses ok?

Autor: Simon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der muss doch laufen.. ich hab da noch nen UART am laufen der auch 
saubere zeichen liefert.


Ext Crystal/Resonator High Freq startup 16K + 64 ms sind eingestellt.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Der muss doch laufen.. ich hab da noch nen UART am laufen der auch
>saubere zeichen liefert.

Gibt es noch weitere wichtige Informationen?

>Funzt jetzt auch, aber ich hab da irgendwas um die 10 sekunden.
>sollte doch ansich 4 sekunden werden

Der Fehler liegt in Zeile 42 vom Code.

Autor: Lowtzow .... (lowtzow)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo

ich komme auch auf eine sekunde

du musst jedoch in der isr OCR1A = 10799; reinschreiben

#
ISR (TIMER1_COMPA_vect) {
OCR1A = 10799;
  lcd_putc('X');
}

// Timer init
OCR1A = 10799;
TCNT1 = 0;
TCCR1B |= (1<<CS12)|(1<<CS10); // 1024 pre
TIMSK |= (1<<OCIE1A);


mfg

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

Bewertung
0 lesenswert
nicht lesenswert
Simon schrieb:

> ich zaehle bis 10799 hoch, das muesste doch ne sekunde sein

An sich schon.

Der Interrupt sollte bei 1 Sekunde kommen, kommt aber bei irgendwas um 
die 10 Sekunden. Macht einen Faktor so um die 10.
Dein AVR wird ab Werk mit ca. 1Mhz getaktet. Du hast einen Quarz drann 
der bei irgendwas um die 10Mhz liegt. Macht ebenfalls einen Faktor 10.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lowtzow .... schrieb:

> du musst jedoch in der isr OCR1A = 10799; reinschreiben

Wozu soll das gut sein? Wenn sich der OCR Wert nicht verändert, muss er 
auch nicht neu geschrieben werden.

Autor: Lowtzow .... (lowtzow)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
stimmt auch wieder, ich hätte es sowieso mit CTC mode gemacht (genauer), 
wenn du schon so arbeitest würde ich es so schreiben (meine methode)
ISR(TIMER1_OVF_vect) {
TCNT1 = 54737; //65536-10799
  lcd_putc('X');
}

// Timer init

TCNT1 = 54737;
TCCR1B |= (1<<CS12)|(1<<CS10); // 1024 pre
TIMSK |= (1<<TOIE1);

mfg

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke,

wieso soll ich TCNT1 wieder vorgeben, ich wollte das eigentlich im CTC 
mode machen

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was mich bisle wundert
wenn ich OCR1A auf 100 setze, bleibt die Zeit unveraendert

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
gast schrieb:

> wieso soll ich TCNT1 wieder vorgeben, ich wollte das eigentlich im CTC
> mode machen

Dann solltest du aber den Timer auch im CTC-Modus laufen lassen, und 
nicht im Normal-Modus.

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OCR1A = 10799;
TCNT1 = 0;
TCCR1B |= (1<<CS12)|(1<<CS10); // 1024 pre


Aber tue ich das hier nicht? ->
TIMSK |= (1<<OCIE1A);

er springt ja auch den COMPA vect an

Autor: Lowtzow .... (lowtzow)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
versuchs mal mit dem ;-)
ISR(TIMER1_COMPA_vect){
  
    // dein code
    }

int main(void)
{
//Timer1 config anfang***********************************************
  TIMSK |= (1<<OCIE1A);        //Timer 1 Output Compare A Match Interrupt Enable
  OCR1A = 10799;             // von 0 bis zu diesem Wert wird gezählt => 1sek
  TCCR1B |= (1<<CS12) | (1<<CS10) |(1<<WGM12);  //CTC MODE & 1024Teiler  
     sei ();                //Globale Interrupts freigeben
//Timer1 config ende***************************************************


// restliche main blabla

}


Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du enablest den Overflow-Interrupt, aber du aktivierst nicht den 
CTC-Mode. Also nochmal ins Datenblatt schauen, und zwar konkret nach den 
WGM-Bits.

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
jetzt funzt das, sogar genau ne sekunde.

aber WGM.... ich dachte immer das waere nur fuer PWM

Autor: Lowtzow .... (lowtzow)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ctc ist halt ganz genau, weil da beginnt der timer von 0 genau beim 
überlauf!
 da bist du vielleicht erst bei der ersten programmcode zeile deiner isr 
(wenn überhaupt).

mfg

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.