Unterbricht ein externer Interrupt ADC oder unterbricht ADC Stall?

Ich arbeite an einer RTC-Anwendung mit einem 1-Hz-Takt, der an den externen Interrupt-Pin eines PIC16f887 angeschlossen ist. Ich habe auch kontinuierliche ADC-Operationen, die zusammen mit dem 1-Hz-Takt stattfinden.

Meine Frage ist, ob der ADC oder der Interrupt Priorität erhalten würde, wenn beide gleichzeitig auftreten? Was ist, wenn der Interrupt während einer ADC-Operation auftritt? Wird die Operation angehalten, damit der Interrupt ausgeführt werden kann? Dies würde offensichtlich die Lesung ungültig machen. Oder wartet der Interrupt darauf, dass der ADC beendet wird?

Antworten (4)

Nein, der auftretende Interrupt hat keine Auswirkung auf den A/D. Der A/D läuft von der Befehlsuhr oder seiner eigenen Uhr, je nachdem, wie Sie ihn einrichten. Beide laufen während eines Interrupts weiter, es sei denn, Sie führen absichtlich einen SLEEP-Befehl aus, um die Prozessoruhr anzuhalten.

Der 1-Hz-Interrupt könnte höchstens die Interrupt-Routine verzögern, die die durchgeführte A/D-Wandlung verarbeitet, wenn Sie dies überhaupt mit Interrupts tun. Es ist nicht erforderlich, dass A/D-Ergebnisse unter Verwendung von Interrupts gehandhabt werden. Selbst wenn dies der Fall ist, führt der A/D seine Umwandlung durch und schreibt das Ergebnis in ADRESH:ADRESL, unabhängig davon, ob der Prozessor eine Unterbrechung annimmt oder nicht. Tatsächlich befindet sich der Prozessor selbst nicht wirklich in einem Interrupt. Das ist nur eine Software-Abstraktion. Wenn die richtigen Bedingungen für einen Interrupt erfüllt sind, führt der Prozessor einen Aufruf an Speicherplatz 4 aus und schaltet das GIE-Bit in INTCON aus. Das ist alles. Der Rest liegt an der Firmware.

Sobald der A/D eine Wandlung beendet hat, steht das Ergebnis in ADRESH:ADRESL zur Verfügung. Es liegt an der Firmware, was damit zu tun ist. Der Wert bleibt dort, bis eine neue Konvertierung abgeschlossen ist. Wenn die Firmware keine neue Konvertierung beginnt, bis sie das Ergebnis der vorherigen gelesen hat, kann nichts verloren gehen. Wenn automatisch eine neue Konvertierung gestartet wird, können die vorherigen Daten verloren gehen, wenn die Firmware nicht rechtzeitig zum Lesen von ADRESH:ADRESL gekommen ist. Betrachten Sie die Erfassungs- und Umwandlungszeit des A/D und die Befehlsrate, und Sie werden sehen, dass es im Allgemeinen viele Befehlszyklen gibt, um ein Umwandlungsergebnis zu erhalten, selbst wenn eine neue Umwandlung automatisch durch den speziellen Ereignisauslöser eines CCP gestartet wird Modul. Stellen Sie nur sicher, dass der Clock-Tick-Interrupt-Code nicht so lang ist, dass er länger dauert als der A/D benötigt, um ein neues Ergebnis zu erzielen. Das sollte einfach sein. Jede langwierige Verarbeitung wird am besten gehandhabt, indem ein Flag gesetzt wird und der Vordergrundcode darauf zugreifen kann, wenn er dazu kommt. Der Unterbrechungscode sollte nur die unmittelbare Wartung des Geräts handhaben.

Ich hatte nicht viel praktische Erfahrung mit der PIC-Familie, aber ich kann Ihnen sagen, was in einem AVR-Chip passieren würde. Ich vermute, dass sie sehr ähnlich sind. Das ADC-Modul in Ihrem Mikroprozessor arbeitet parallel zu Ihrer Programmroutine. Der ADC aktualisiert seinen Messwert nach der Konvertierung. Sollte zwischen dem Initialisieren des ADC-Lesens und dem Aktualisieren des Ausgangs ein Interrupt auftreten, geschieht die folgende Sequenz:

  1. In Ihrer main()Funktion wird der ADC-Messwert initialisiert.
  2. Die ADC-Wandlung beginnt
  3. Parallel zu:
    1. Der Interrupt wird aufgerufen
    2. Die ADC-Wandlung endet, das Ergebnis wird in einem speziellen Register gespeichert
  4. Der Interrupt endet schließlich, Ihr Prozessor kehrt zum main()ADC-Leseergebnis zurück und liest es.

Dies ist nicht die am besten geeignete Verwendung für Wellenformdiagramme, aber ich hoffe, es zeigt diese Sequenz gut genug für Sie:

Geben Sie hier die Bildbeschreibung ein

Natürlich können Sie Interrupts während der Konvertierung deaktivieren und danach wieder aktivieren, dafür gibt es eine Anleitung (auf AVR).
Wenn ich mich richtig erinnere, passiert das auch auf diesem PIC.
@jippie In der Tat, guter Punkt! Wenn das ADC-Lesen zeitkritisch ist oder der Interrupt lange dauern kann, ist SEI()dies CEI()praktisch.

Der von Ihnen verwendete PIC hat nur einen Interrupt, der effektiv das ODER einer Reihe von Interrupt-Quellen ist. Wenn zwei Unterbrechungsquellen gleichzeitig auftreten, ist die Wirkung immer noch, dass eine Unterbrechung auftritt. Es liegt an Ihrer Interrupt-Routine, die Interrupt-Quellen zu handhaben UND zu löschen, die sie handhaben möchte. Wenn eine der Interrupt-Quellen noch aktiv ist, wenn die Interrupt-Routine endet, wird ein neuer Interrupt auftreten und die Interrupt-Routine wird immer wieder aufgerufen, bis alle (aktivierten) Interrupt-Quellen gelöscht sind.

Im Allgemeinen ist es Sache des Designers, Interrupts zu priorisieren

Wenn Ihnen in Ihrem speziellen Fall etwas Wichtigeres als der ADC wichtig ist, können Sie die ADC-Messung aufgeben. Aber normalerweise toleriert eine 1-Hz-Taktaktualisierung, dass sie für einen variablen Zeitraum ignoriert wird, während der ADC abgeschlossen wird.