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.