Forum: Mikrocontroller und Digitale Elektronik Timer1 FastMode Overflow Interrupt


von Markus T. (1lc)


Angehängte Dateien:

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

von Fern Schätzer (Gast)


Lesenswert?

sei();

zum globalen Interrupt enablen?

von Markus T. (1lc)


Lesenswert?

bringt leider auch nichts.

von Einer K. (Gast)


Lesenswert?

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?

von Markus T. (1lc)


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.

von Einer K. (Gast)


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

von Peter D. (peda)


Lesenswert?

Markus T. schrieb:
> Das habe ich nur enabled als eventueller Zusatz.

Lies mal in der Arduino-Doku nach, was bei Interrupts ohne Handler 
passiert.
Generell macht man sowas nicht.

von m.n. (Gast)


Lesenswert?

Markus T. schrieb:
> ISR(TIMER1_OVF_vect){
>   testbool=true;
> }

Gestern stand dort noch:

ISR(TIMER1_OVF_vect){
  testbool != testbool;
}

Was ist denn nun das getestete Programm?

von Einer K. (Gast)


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.

von Markus T. (1lc)


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
}

von Veit D. (devil-elec)


Lesenswert?

Hallo,

wenn du mit der Arduino IDE programmierst, dann nulle/resete vorher alle 
Register vom verwendeten Timer bzw. mache die erste Zuweisung zu einem 
Register OHNE ODER. Die IDE belegt die Timereinstellungen vor. 
Irgendwann fällt dir das sonst auf die Füße.

von Markus T. (1lc)


Lesenswert?

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.

von chris (Gast)


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

von Markus T. (1lc)


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

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.