ADC konfigurieren

Gast #3596431
Lesenswert?

Hallo, ich hätte eine kurze Frage zum AD-Wandler in PICs. Und zwar 
möchte ich in vier verschiedenen Interrupts jeweils eine Spannung 
einlesen, d.h. bei Interrupt 1 soll AN0 eingelesen werden, bei Interrupt 
2 AN1, usw.. Kann ich das so machen, dass ich einfach in dem jeweiligen 
Interrupt mit
1
AD1CHSObits.CHSOSA =
 den gewünschten analogen Eingang zuweise, bevor ich durch Setzen des 
SAMP-Bits das Sampeln und Konvertieren starte? An einer anderen Stelle 
im Programm möchte ich dann noch zwei analoge Spannungen einlesen. Da 
ich auf eine Auflösung von 12 Bit angewiesen bin, muss ich das 
sequentiell machen. Habe mir das wie folgt überlegt:
1
AD1CHSObits.CHSOSA = 0b00100;
2
AD1CON1bits.SAMP = 1;
3
while (!AD1CON1bits.DONE);
4
wert1 = ADC1BUF0;
5
AD1CHSObits.CHSOSA = 0b00101;
6
AD1CON1bits.SAMP = 1;
7
while (!AD1CON1bits.DONE);
8
wert2 = ADC1BUF0;
So könnte ich mir ein zusätzliches Umkonfigurieren des ADCs (CH0 und CH1 
sequentiell einlesen) sparen. Kann ich das so machen oder führt das zu 
irgendwelchen Problemen? Schonmal im Voraus vielen Dank für die Hilfe..
Gast #3597972
Lesenswert?

sorry, habe vergessen das zu erwähnen.. es ist ein dsPIC33.

ich dachte, dass ich mit der Abfrage des DONE-Bits sichergestellt habe, 
dass die vorherige Konvertierung abgeschlossen ist. Und das muss ich ja 
auch in der ISR gewährleisten, oder wie wäre es sonst noch möglich eine 
AD-Wandlung während eines Interrupts durchzuführen?
#3597985
Lesenswert?

Man kann natürlich auch im Interrupt auf das DONE-Bit warten, das ist 
aber keine saubere Programmierung, denn Delays oder das Warten auf 
irgendwelche Ereignisse haben in der ISR nichts zu suchen.
Woher kommen deine Interrupts?
Wenn es Timer sind, könnte es möglich sein diese so zu konfigurieren, 
dass die AD Wandlung vollendet ist, wenn ein neues Interrupt kommt.
Der ADC kann auch ein Interrupt auslösen und man kann ihn deshalb auch 
ohne while(…) benutzen.

ab2301 schrieb:
> oder wie wäre es sonst noch möglich eine
> AD-Wandlung während eines Interrupts durchzuführen?
Die Wandlung nur Starten und das Ergebnis mit dem ADC-Interrupt 
auslesen.
Gast #3597991
Lesenswert?

AD1 ist ein ADC. Einen ADC in vier Interrupts und auch noch
irgendwo im Programm zu bedienen bedeutet einiges an Aufwand
um sicherzustellen das da nichts durcheinander kommt.

Ich würde das sein lassen.
#3598162
Lesenswert?

der dsPIC33 sollte das ohne grosse hilfe(code) können.
schau mal in die CE120 und CE121(ohne DMA) rein.

ps: microchip dot com , dann dein dsPIC33xyz ins suchfeld eingeben, dann 
Documentaion&Software, alle CE's sind unten, sehr hilfreiches material 
im vergleich zu den ReferenceManuals.
#3598236
Lesenswert?

Du kannst auch bei den 4 Interrupts den Channel einstellen und die 
Wandlung starten (ggf. vorher prüfen, ob grade eine Wandlung 
durchgeführt wird). Sind dann 2 Zeilen bzw. 4 Zeilen C-code. Dazu ein 
Interrupt vom ADC, der guckt, welcher Channel gewandelt wurde und dann 
die Daten iwo speichert. Der ADC Interrupt sollte dann eine höhere 
Priorität haben.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren