Forum: Mikrocontroller und Digitale Elektronik ADC konfigurieren


von ab2301 (Gast)


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..

von Max H. (hartl192)


Lesenswert?

ab2301 schrieb:
> AD-Wandler in PICs
In welchem PIC?

ab2301 schrieb:
> Kann ich das so machen [...] Konvertieren starte?
Du solltest sicher gehen, dass die vorherige Wandlung vollendet ist.


Ein "while(!AD1CON1bits.DONE);" hat in der ISR (wie ein Delay) 
eigentlich nichts zu suchen...

: Bearbeitet durch User
von ab2301 (Gast)


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?

von Max H. (hartl192)


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.

von holger (Gast)


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.

von Peter C. (peter_c49)


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.

von Michael S. (rbs_phoenix)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.