Forum: Compiler & IDEs ADC / DMA / dsPIC33FJ128MC706A / MPLAB X v5.15


von Uli N. (uln)


Angehängte Dateien:

Lesenswert?

Ich versuche gerade, bei einer bestehenden Applikation das mit 50kHz, im 
"scatter/gather mode" laufende ADC sampling, bei dem die zugehörende 
DMA-Interrupt-Routine 50% der Prozessorzeit frisst umzubauen - 
letztendlich möchte ich im "conversion order mode" die fünf AD-Kanäle 
acht mal wandeln, bevor die DMA-Interrupt-Routine dann mit 6,25KHz 
aufgerufen wird.
In einem ersten Schritt wollte ich erst mal die fünf AD-Kanäle einmal im 
"conversion order mode" wandeln und nach wie vor mit 50kHz in der 
DMA-Inbterrupt-Routine bearbeiten, aber nicht einmal das funktioniert, 
mir scheint, es wird fünfmal der gleiche AD-Kanal gewandelt (Bild links 
"conversion order mode", Bild rechts "scatter/gather mode"). Hat jemand 
eine Tipp, was ich noch falsch mache (im Internet finde ich für den 
"conversion order mode" nur Beispiele, bei dem ein einzelner Kanal 
mehrfach gewandelt wird.)? Oder verstehe ich das Datenblatt falsch und 
der Controller unterstützt im "conversion order mode" gar nicht das 
Wandlen von mehreren AD-Kanälen?

von Uli N. (uln)


Angehängte Dateien:

Lesenswert?

Problem gelöst:

Unter "Register 16-2: ADxCON2: ADCx Control Register 2" ist zu finden:
1
bit 5-2 SMPI<3:0>: Sample and Conversion Operation bits (1,2)
2
    For devices with DMA:
3
    1111 = Increments the DMA address after completion of every 16th sample/conversion operation
4
    1110 = Increments the DMA address after completion of every 15th sample/conversion operation
5
    .
6
    .
7
    .
8
    0001 = Increments the DMA address after completion of every 2nd sample/conversion operation
9
    0000 = Increments the DMA address after completion of every sample/conversion operation

Stimmig zu sein scheint daher, was man in Microchip Beispielen mit 
verwendetem "conversion order mode" findet - "SMPI must be 0" - möchte 
man doch, dass das nächste "conversion result" einen int16 weiter 
abgespeichert wird.
1
    AD1CON2bits.SMPI    = 0;  // SMPI must be 0

Doch das ist falsch - SMPI muss gleich der Anzahl der zu scannenden 
Eingänge minus 1 gesetzt werden!
1
    AD1CON2bits.SMPI    = NumberOfInputsToScan - 1;

Denn unter "16.4.6.2 SMPI FOR DEVICES WITH DMA" läßt sich finden:
1
When channel scanning is used (and Alternate Input Selection mode is disabled), the SMPI<3:0>
2
bits should be set to the number of inputs being scanned minus one (i.e., SMPI<3:0> = N - 1).

So gesetzt, werden auch alle fünf Kanäle gescannt. Wird der DMA zudem so 
programmiert, dass die Ergebnisse acht solcher Scan Sequenzen gesammelt 
werden, erhält man einen DMA-Interrupt nach jeweils 40 Wandlungen, die 
dann mit einer Interruptfrequenz von 6,25kHz auftreten.

: Bearbeitet durch User
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.