ADC / DMA / dsPIC33FJ128MC706A / MPLAB X v5.15

OP #5959495
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?
Angehängte Dateien:
OP #5961306
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.
Angehängte Dateien:

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 7 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.