Forum: Mikrocontroller und Digitale Elektronik Attiny2313 Timer1-Interrupt löst nur beim 1. mal aus.


von Matze (Gast)


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

von Peter II (Gast)


Lesenswert?

was soll denn das werden

> TCCR1B &= (0<<CS11);

diese anweisung ist zwar kein Fehler aber ziemlich unsinnig. Es macht

TCCR1B = 0;

wenn das gewollst ist, dann schreibe es auch so.

von Little Helper (Gast)


Lesenswert?

Und genau das ist nicht gewollt.
Durch "TCCR1B &= (0<<CS11);" deaktivierst Du den Timer gleich wieder.

von Dietrich L. (dietrichl)


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

von Christian (Gast)


Lesenswert?

Meistens sind diese Bits eh mit 0 initialisiert.
Ich würde nur die setzen, die wirklich nötig sind.

von Matze (Gast)


Lesenswert?

Hab das Problem gelöst, und initialisiere res Register direkt mir 
Hex-Werten.

0x08=Stoppen
0x0d=Starten

Danke für eure Hilfe
Grüße
Matze

von Peter II (Gast)


Lesenswert?

Matze schrieb:
> Hab das Problem gelöst, und initialisiere res Register direkt mir
> Hex-Werten.
>
> 0x08=Stoppen
> 0x0d=Starten

das ist doch keine Lösung, lerne lieber wie man bits ordentlich löscht.

http://www.mikrocontroller.net/articles/Bitmanipulation

von Little Helper (Gast)


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))

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.