3 Stimmen

Wie werden Interrupts in Arduino behandelt?

Ich denke über eine Anwendung nach, bei der es mehrere Interrupts pro Sekunde aus zwei verschiedenen Quellen (separate Interrupts) geben könnte, die jeweils eine Funktion ausführen, die einfach eine Zahl zu einem Zähler addiert. Ich brauche meine void loop() um mit diesen Daten eine einfache Analyse durchzuführen. Ich frage mich, ob die Unterbrechungen asynchron laufen, während die Hauptschleife läuft, oder ob sie die Hauptschleife mitten in der Verarbeitung anhalten?

Meine Hauptschleife erfordert die millis() Funktion ordnungsgemäß zu funktionieren, was, wie ich weiß, bei einer Unterbrechung per E-Mail nicht möglich ist. die Arduino-Referenz und wenn die Interrupts synchron laufen, muss ich andere Lösungen in Betracht ziehen.

5voto

A.H. Punkte 60629

Ich bin mir nicht sicher, was Sie damit meinen, dass Interrupts synchron oder asynchron ablaufen.

Wenn ein Interrupt auftritt, wird das Hauptprogramm angehalten und die Interrupt Service Routine (ISR) in einem Modus ausgeführt, in dem keine neuen Interrupts erkannt werden. Beim Verlassen der ISR wird das Hauptprogramm an der Stelle fortgesetzt, an der es unterbrochen wurde.

Eine echte parallele Ausführung ist auf dem Arduino nicht möglich, da der ATMega eine Single-Core-CPU ist und nur eine Sache zur gleichen Zeit ausführen kann. Aber er kann schnell schalten :-) Deshalb:

Meine Hauptschleife erfordert die Funktion millis(), damit sie ordnungsgemäß funktioniert,

Solange Sie nicht anrufen millis() innerhalb des ISR ist dies in Ordnung, denn Ihre ISR ist

eine Funktion, die einfach eine Zahl zu einer Zählung addiert

und daher sehr schnell. Dies wird nicht stören millis() genug, um von jemandem bemerkt zu werden.

1voto

TheFuzzyGiggler Punkte 929

Alle externen Hardware-Interrupts sind asynchron, das ist im Allgemeinen die ganze Idee hinter Interrupts. Nun, wenn Sie fragen, wie Sie das in Ihre Schleife zu codieren, werde ich keine Hilfe sein, weil es eine lange Zeit, seit ich mit einem ATMega-Chips oder einem Arduino gespielt ist. Aber sieh dir den Link an. Speziell Abschnitt 12 über Interrupts. Das setzt voraus, dass du einen Ardunio mit einem ATMega128 verwendest, was die neuesten sind, glaube ich.

Aber die gleichen Konzepte funktionieren für fast alle ATMega-Chips, insbesondere für die in den Arduino-Boards verwendeten. Die Dokumentation enthält auch Beispielcode, mit dem man arbeiten kann. Es ist ein unverzichtbares Dokument, wenn Sie das Beste aus dem Chip herausholen wollen.

ATMega 168 Dokumentation

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X