Attiny2313 Timer1-Interrupt löst nur beim 1. mal aus.

Gast #3282629
Lesenswert?

Hallo,
Bin grade dabei einen Würfel mit einem Attiny 2313 zu programmieren.
Dabei soll Zuerst ein taster gedrückt, --> Loswürfeln.
Wird der Taster losgelassen, so bleibt der Würfel langsam stehen.
Wenn er steht, binkt das Ergebniss.
Nach einiger zeit soll er sich selbts wieder abschalten.

Diese zeit soll durch einen Timer eingestellt werden.

Beim 1. Würfeln beim anlegen der Spannung würfelt er richtig, danach 
hört er nicht mehr auf zu blinken.
--> ISR Wird nicht mehr aufgerufen.

Nun muss es einen bedeutenden Unterschied zwischen der ersten 
Initialisierung:
1
  TCCR1A  &= (0<<COM1A0)|(0<<COM1A1);  // CTC Modus
2
  TCCR1B &= (0<<ICNC1)|(0<<ICES1)|(0<<CS11);  // Prescaler 1024
3
  TCCR1B |= (1<<WGM12)|(1<<CS10)|(1<<CS12);  
4
  OCR1A = 0x0020;
5
  TIMSK |= (1<<OCIE1A);      //Compare Interrupt Enable
6
       sei();                     //Globale Interrupts ein

Und allen weiteren Initialisierungen geben:
1
      TCCR1A &= (0<<COM1A0)|(0<<COM1A1);      // CTC Modus
2
      TCCR1B &= (0<<ICNC1)|(0<<ICES1);    
3
      TCCR1B |= (1<<WGM12);
4
      TCNT1=0x0000;                //Zähler rücksetzen 
5
      OCR1A = 0x0020;
6
      TIMSK |= (1<<OCIE1A);            //Compare Interrupt Enable
7
      sei();                    //Globale Interrupts ein
8
      TCCR1B |= (1<<CS10)|(1<<CS12);        // Timer Starten
9
      TCCR1B &= (0<<CS11);

Ich finde ihn nicht.
Muss ich eventuell irgendein Bit, das bei jedem das bein Aufruf der ISR 
gesetzt wird immer wieder zurücksetzen? oder Ähnliches?

Grüße
Matze
#3282665
Lesenswert?

Matze schrieb:
> Nun muss es einen bedeutenden Unterschied zwischen der ersten
> Initialisierung:
...
> Und allen weiteren Initialisierungen geben:

Wieso gibt es 2 Initialisierungen?

Üblicherweise wird am Anfang vor der Endlosschleife einmal "richtig" 
initialisiert, später ggf. nur einige Parameter geändert. Dann ist auch 
übersichtlicher, was man tut und warum man das tut.

Gruß Dietrich
Gast #3282727
Lesenswert?

Peter II schrieb:
> das ist doch keine Lösung, lerne lieber wie man bits ordentlich löscht.

Das ist ziemlich streng von Dir und so nicht richtig.
Eine Lösung ist, wenn es funktioniert.
Dass es nicht die schickste Lösung ist, stimme ich zu.

Für den ThreadOwner die Zusammenfassung:
Bits setzen:   REGISTER |= (1<<BIT1_NAME) | (1<<BIT2_NAME)
Bits loeschen: REGISTER &= ~((1<<BIT1_NAME) | (1<<BIT2_NAME))

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren