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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.