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
volatilebooleantestbool=false;// Variable die beim Interrupt umschaltet
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?
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.
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....
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.
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?
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.
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
volatilebooleantestbool=false;// Variable die beim Interrupt umschaltet
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.
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.
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...
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 :)