ADC-Interrupt-Nutzung

Ich verwende in meinem Projekt mit XC16 einen dsPIC30F4011 und programmiere derzeit seinen ADC. Meine Frage ist aber auch allgemein:

Muss ich das Peripheriegerät (in diesem Fall ADC) bei jedem Interrupt aus- und wieder einschalten?

Hier ist mein Code:

void __attribute__((__interrupt__, auto_psv)) _ADCInterrupt(void) {
    ADCON1bits.ADON = 0;   //is this really necessary?
    IFS0bits.ADIF = 0;   //turn interrupt flag off
    //read buffers and save data
    ADCON1bits.ADON = 1;   //is this really necessary?
}
Was hat Sie dazu veranlasst, das überhaupt im Code zu tun?
ist glaube ich nicht //do stuffausreichend. Ohne zu sehen, was das "Zeug" ist, wird Ihnen niemand eine genaue Antwort geben können.
@MattYoung Ich verwende den ADC, um jede Eingabe automatisch zu durchlaufen. Wenn es mit dem Lesen des letzten fertig ist, löst es diesen Interrupt aus.
@DKrueger Es liest und speichert alle Puffer in einem Array, um sie bei Bedarf zu verwenden.
Lassen Sie mich meine Frage umformulieren. Warum dachten Sie, Sie müssten den ADC deaktivieren und erneut aktivieren?
@IakaNoe Ohne den Code kann dir niemand eine richtige Antwort geben. Wie können Sie wissen, ob der ADC deaktiviert und dann wieder aktiviert werden sollte, wenn Sie keine Ahnung haben, was dazwischen passiert?
@MattYoung Ich glaube, ich habe es irgendwo gelesen, aber idk
Im Allgemeinen müssen Sie Interrupts innerhalb der ISR nicht aus- und wieder einschalten. Manchmal müssen Sie das Interrupt-Statusbit des Peripheriegeräts löschen, damit es nicht sofort nach dem Verlassen in die ISR zurückspringt. Manchmal wird dieses Bit durch einfaches Lesen eines Registers in der ISR oder einfaches Springen zur ISR gelöscht.

Antworten (1)

Sie müssen Ihren ADC nicht bei jedem Interrupt ausschalten, es sei denn, Sie möchten die aktuell laufende Konvertierung abbrechen (die Konvertierung, die den Interrupt erzeugt hat, bleibt auf dem ADCBUF - siehe Abschnitt 20.5 des Datenblatts).

Allerdings würde es wenig Sinn machen, die nächste Wandlung abzubrechen und den ADC am Ende des Interrupts neu zu starten. Man könnte einfach den Autotrigger deaktivieren und den ADC am Ende des Interrupts auslösen ...

Stattdessen müssen Sie, wie Sie es getan haben, das Interrupt-Flag per Software löschen, wie im Referenzhandbuch der dsPIC-Familie ( http://ww1.microchip.com/downloads/en/DeviceDoc/70046E.pdf ) in Abschnitt 6.4 gezeigt.

IFSx: Unterbrechungs-Flag-Statusregister

Alle Interrupt-Request-Flags werden in den IFSx-Registern gehalten, wobei 'x' die Registernummer bezeichnet. Jede Unterbrechungsquelle hat ein Statusbit, das durch die jeweilige Peripherie oder ein externes Signal gesetzt und per Software gelöscht wird.