ISR problem

mal ne frage, an wass kann es liegen, dass bei meinem sketch der timer Interrupt NICHT von meinem extern ausgelösten Interrupt unterbrochen wird?

Programm mit Timer.txt (22.3 KB)

Interrupts können sich standardmäßig nicht gegenseitig unterbrechen. Beim Eintritt in eine ISR werden die Interrupts global abgeschaltet. Es ist auch in den meisten Fällen keine gute die Idee die dann wieder zu aktivieren wie du das machst.

Es ist ja nicht so dass ein Interrupts verloren geht wenn er während einer anderen ISR eintritt. Das jeweilige Interrupts Flag wird trotzdem gesetzt. Und dann abgearbeitet wenn die ISR zu Ende ist. Interrupts gehen erst unter wenn während einer ISR mehrere Interrupts auf dem gleichen Vektor ausgelöst werden.

ähm ok, und wie kann ich die unterbrechung dann anders realisieren?

Was willst du überhaupt machen? Für viele Sachen braucht man gar keine Interrupts.

naja ich möchte per Knopfdruck, das Programm anhalten( Pausieren)

bzw dadurch, den I2C (PCA9685)bei meinem motorshield in den Schlafmodus befördern und dann mit einem zweiten Knopfdruck wieder wecken

Die Sleep Modes sind auch einer der wenigen Punkte wo es überhaupt sinnvoll ist Taster per Interrupt abzufragen.

Wie das geht wird hier gezeigt:
http://www.gammon.com.au/forum/?id=11497
(bei "Waking from sleep with a signal)

Ansonsten fragt man Taster einfach per Polling ab. Die sind so langsam dass man dazu im Normalfall keine Interrupts braucht. Also Taster per Hand abfragen und schlafen legen und dann per Interrupt aufwachen.

Die sind so langsam dass man dazu im Normalfall keine Interrupts braucht.

Ja!

Und anderseits feuern sie beim Prellen eine ganze Serie Interrupts.
Der Prozessor wird in der Zeit durch Interrupts blockiert.

eine frage,
weisst du wo ich diese poll header file +source file herbekomme?

Polling bedeutet einfach dass man einen Taster ständig mit digitalRead() abfragt!

Man kann höchstens für das Entprellen die Bounce Library verwenden:

Wenn du sowas nicht weißt, dann solltest du mit Interrupts vorsichtiger umgehen. Anders als man vielleicht denkt ist das kein Anfänger-Thema

Den PCA9685 in Sleep zu versetzen hat wenig Sinn, wenn der Arduino noch läuft.Da ist es einfacher die LED auf 0 zu dimmen. Einen Arduino in Sleep modus versetzen hat wenig Sinn da die Stromersparnis relativ gering ist.

Grüße Uwe