mikrocontroller.net

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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Uli N. (uln)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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?

Autor: Uli N. (uln)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Problem gelöst:

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

Denn unter "16.4.6.2 SMPI FOR DEVICES WITH DMA" läßt sich finden:
When channel scanning is used (and Alternate Input Selection mode is disabled), the SMPI<3:0>
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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.