mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik CTC Timer Ein- und Auschalten


Autor: limbo! (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute!

Hab da ein kleines Problem. Ich will eine 7-Segment Stoppuhr 
programmieren, die den CTC Counter verwendet. Ein und ausgeschalten wird 
das ganze über den externen Interrupt INT0. Mit einem normalen Counter 
hat das ganze schon funktioniert. Allerdings war das viel zu ungenau. 
Also wollte ich es mit CTC versuchen.
Das Problem: Beim Betätigen der Taste kommt er zwar in die ISR von INT0 
aber startet den Timer nicht!

Hier mal der relevante Code:

ISR(INT0_vect)
{
  if(OCIE1A)      //Wenn timerinterrupt läuft
  {
    TIMSK= (0 << OCIE1A);  //Timerinterrupt ausschalten
  }else
  {
    TIMSK= (1 << OCIE1A);  //ansonsten Timerinterrupt einschalten
  }
  _delay_ms(20); //Schalterentprellen
}


int main (void) {

//*****************
// Initialisierung
//*****************

   DDRB = 0xFF;   //PORTB auf Ausgang setzen (7-Segmente)
   DDRC = 0xFF;    //PORTC auf Ausgang für Segmentwahl

   //Interrupt konfigurieren
   MCUCR = (1<<ISC01);  //Int0 auf fallende Flanke konfigurieren
   GICR = (1<<INT0);  //Int0 aktivieren

   //Timer Configurerien
   OCR1A = 39999;
   TCCR1B=( 1 << WGM12 ) | ( 1 << CS10 );
   TIMSK= (0 << OCIE1A);

   sei();


Was mach ich falsch?

Grüße
Markus

Autor: MeinerEiner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Evtl. könnten es die beiden Zeilen sein:
   TIMSK= (0 << OCIE1A);  //Timerinterrupt ausschalten
   TIMSK= (1 << OCIE1A);  //ansonsten Timerinterrupt einschalten

Würd ich anders schreiben:

    TIMSK &= ~(1 << OCIE1A);  //Timerinterrupt ausschalten
    TIMSK |=  (1 << OCIE1A);  //ansonsten Timerinterrupt einschalten

Und ne delay hat in ner ISR nix zu suchen.
Wird die ISR aufgerufen, während sie noch läuft, gibts Chaos.


Ausserdem ist die Abfrage if(OCIE1A) immer wahr, da OCIE1A ein fester 
Wert ist und sich nie ändern wird.

Autor: limbo! (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Aja vielen Dank für deine Antwort.
Das delay wurde jetzt gelöscht - funktioniert auch ohne.
Obwohl das
TIMSK= (0 << OCIE1A);  //Timerinterrupt ausschalten
TIMSK= (1 << OCIE1A);  //ansonsten Timerinterrupt einschalten

funktioniert, hab ich es jetzt umgeschrieben auf deine Art.

Und das if(OCIE1A) wurde jetzt auf if(TIMSK == 0b00010000) umgeändert. 
Jetzt klappt alles ganz toll!

Vielen Dank für die Hilfe!
Grüße
Markus

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

Bewertung
0 lesenswert
nicht lesenswert
limbo! schrieb:

> Das delay wurde jetzt gelöscht - funktioniert auch ohne.
> Obwohl das
> TIMSK= (0 << OCIE1A);  //Timerinterrupt ausschalten
> TIMSK= (1 << OCIE1A);  //ansonsten Timerinterrupt einschalten
>
> funktioniert,

aber nur zufällig.
Eine 0 kann man nach links schieben sooft man will, sie bleibt immer 
eine 0.

> TIMSK= (0 << OCIE1A);  //Timerinterrupt ausschalten

ist also nichts anderes als
  TIMSK = 0;

Dein Glück ist, dass du noch keine anderen BIts in TIMSK benutzt hast.


> Und das if(OCIE1A) wurde jetzt auf if(TIMSK == 0b00010000) umgeändert.
> Jetzt klappt alles ganz toll!

Autsch.
Weiter unten hast du das so schön geschrieben. Warum nicht hier?

   if( TIMSK & ( 1 << OCIE1A ) )

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.