Timer1 FastMode Overflow Interrupt

OP #5473958
Lesenswert?

Hallo Mikrokontrollerforum-Benutzer,
Ich arbeite mich zur Zeit ein bisschen in Interruptbehandlungen ein und 
wollte das mit dem Arduino UNO einfach mal versuchen (da sehr 
zugängliche Hardware und wenig IDE Einstellungen nötig)

Ich habe es schon geschafft mit dem Timer1 im Normal-Mode einen 
Interrupt auszulösen (Timer1 OVF).

Ebenfalls habe Ich es geschafft mit dem Timer1 im Compare Match (CTC) 
Mode einen Interrupt auszulösen (Timer1 COMPA)

Nun bin Ich dabei den FastPWM Mode zum laufen zu bekommen und Ich will 
einen Interrupt auslösen sobald der Timer1 sein TOP-Value (=0x00FF oder 
255) erreicht hat.
Leider funktioniert dies nicht, Ich habe auch nochmal alles gecheckt, 
von den Registern müsste alles richtig eingestellt sein.

Verstehe Ich da etwas falsch im Datenblatt?
Hier ist es: 
http://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-42735-8-bit-AVR-Microcontroller-ATmega328-328P_Datasheet.pdf

Und hier ist mein Code:
In der Interruptroutine habe Ich extra kein Serial.print benutzt,da die 
Interrupt-Routine ja möglichst kurz sein soll.


1
volatile boolean testbool=false; // Variable die beim Interrupt umschaltet
2

3
void setup() {
4
pinMode(9,OUTPUT);
5
pinMode(10,OUTPUT);
6
Serial.begin(115200); // Serial SETUP
7
TCCR1A = 0; 
8
TCCR1B = 0;
9
TCCR1A |= (1<<WGM10) | (1<<COM1A1) | (1<<COM1B1); // setup... non-Inverting PWM Mode
10
TCCR1B |= (1<<CS10) | (1<<WGM12); //prescaler = 1, FastPWM 8-Bit Mode
11
TIMSK1 |= (1<<OCIE1A) | (1<<TOIE1); //enable OCR1A Interrupt ... enable Timer1 Overflow Interrupt
12
OCR1A=200;
13
}
14

15
ISR(TIMER1_OVF_vect){
16
  testbool=true;
17
}
18

19
void loop() {
20
  Serial.println("Im Loop angekommen");
21
  if(testbool==true)
22
  {
23
    Serial.println("Interrupt wurde ausgelöst");
24
    testbool=false;
25
  }
26
  else
27
  {
28
    /**
29
     * DO NOTHING
30
     */
31
  }
32
  
33
}

Vielleicht kann mir ja jemand helfen :)
Angehängte Dateien:
OP #5474090
Lesenswert?

Arduino Fanboy D. schrieb:
> Fern Schätzer schrieb:
>> zum globalen Interrupt enablen?
>
> Arduino, da sind Interrupt enabled.
> Werden schließlich auch von Serial und delay()/millis() benötigt.
>
> Markus T. schrieb:
>> OCIE1A
> Fehlt dann nicht noch eine Compare ISR?

Das habe ich nur enabled als eventueller Zusatz. Es sollte ja auch ohne 
funktionieren, das steht ja im Datenblatt (siehe Overflow.png).
Der Timer läuft ja immer von 0 bis zur TOP Value (255) und hört nicht 
auf wenn er dem Compare-Value gleicht.
Gast #5474122
Lesenswert?

1
Bit 1 – OCIE1A Timer/Counter 1, Output Compare A Match Interrupt Enable
2
When this bit is written to '1', and the I-flag in the Status register is set (interrupts globally enabled), the
3
timer/counter 1 output compare A match interrupt is enabled. The corresponding interrupt vector is
4
executed when the OCF1A flag, located in TIFR1, is set.

Du erlaubst den Compare Interrupt
Du installierst aber keine dafür zuständige ISR
Obwohl du weißt, dass der Interrupt aufgerufen wird

Uns sagst dann:
> Es sollte ja auch ohne funktionieren
Interessant!

Ich werde den Thread weiter beobachten....
Gast #5474326
Lesenswert?

Markus T. schrieb:
> In der Interruptroutine habe Ich extra kein Serial.print benutzt,da die
> Interrupt-Routine ja möglichst kurz sein soll.

Das "tun" ist richtig, aber die Begründung falsch.


Die richtige Begründung:
In ISRs sind per default keine Interrupts erlaubt.
Serial benötigt aber aktivierte Interrupts.
Mit der Diskrepanz ist der Grundstein für eine totale Blockade gelegt.
OP #5475203
Lesenswert?

Vielen Dank für die ganzen Antworten, Ich dachte schon Ich habe mich im 
Datenblatt geirrt obwohl Ich da solange drin gestöbert habe.

Ich wusste nur nicht dass man zu jedem Interrupt den man enabled hat 
auch eine Routine braucht... Wie gesagt,Ich arbeite mich in das Thema 
ein, hätte Ich mir aber auch denken können.

Habe einfach den OCR1A Interrupt disabled und jetzt klappts.

Danke an alle.

PS an m.n, habe den Code umgeändert da Ich dachte dass dort der Fehler 
in der Interruptroutine läge und habe nicht bedacht dass Ich vorher eine 
andere Version im Forum gepostet habe.

Naja hier nochmal der Code der auch funktioniert für Interessierte und 
Leser die mal das selbe / ähnliche Problem haben werden
1
volatile boolean testbool=false; // Variable die beim Interrupt umschaltet
2

3
void setup() {
4
pinMode(9,OUTPUT);
5
pinMode(10,OUTPUT);
6
Serial.begin(115200); // Serial SETUP
7
TCCR1A = 0; 
8
TCCR1B = 0;
9
TCCR1A |= (1<<WGM10) | (1<<COM1A1) | (1<<COM1B1); // setup... non-Inverting PWM Mode
10
TCCR1B |= (1<<CS10) | (1<<WGM12); //prescaler = 1, FastPWM 8-Bit Mode
11
TIMSK1 |= (1<<TOIE1); // ... enable Timer1 Overflow Interrupt
12
}
13

14
ISR(TIMER1_OVF_vect){
15
  testbool=true;
16
}
17

18
void loop() {
19
  Serial.println("Im Loop angekommen");
20
  if(testbool==true)
21
  {
22
    Serial.println("Interrupt wurde ausgelöst");
23
    testbool=false;
24
  }
25
  else
26
  {
27
    /**
28
     * DO NOTHING
29
     */
30
  }
31
  
32
}
Gast #5476083
Lesenswert?

Markus T. schrieb:
> werde Ich machen. Der große Vorteil der Arduino IDE für mich ist, dass
> man keinerlei Zeit investieren muss um den Microkontroller überhaupt
> erstmal einzurichten.

Damit versteht man aber auch nur die Hälfte wie die Kiste tickt und 
Fragen wie deine würden erst gar nicht aufkommen.
Zumal keiner dich hindert, deine eigene/n Bibliothek/en für diesen zu 
schreiben...
OP #5484606
Lesenswert?

chris schrieb:
> Markus T. schrieb:
>> werde Ich machen. Der große Vorteil der Arduino IDE für mich ist, dass
>> man keinerlei Zeit investieren muss um den Microkontroller überhaupt
>> erstmal einzurichten.
>
> Damit versteht man aber auch nur die Hälfte wie die Kiste tickt und
> Fragen wie deine würden erst gar nicht aufkommen.
> Zumal keiner dich hindert, deine eigene/n Bibliothek/en für diesen zu
> schreiben...

Man hat leider nicht die Zeit in jedem Gebiet ein Experte zu werden :)

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