mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik MSP430: ADC12 soll DMA triggern


Autor: Schnapphase (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich möchte Daten vom ADC12 über den DMA Controller abgreifen und möchte 
daher einen DMA Transfer mit dem ADC12IFG triggern. Leider funktioniert 
die Sache nicht. Der DMA wird beim Programmstart einmal getriggert und 
das wars dann - danach werden keine DMA Transfers mehr ausgelöst.

Der ADC12 wird vom Timer B getriggert - wenn ich den DMA auch vom Timer 
B triggern lasse, funktioniert die ganze Sache reibungslos. Aber so 
solls ja eigentlich nicht sein, ich will, dass der ADC12 den DMA 
triggert.

Liegt das vielleicht daran, dass ich eine ISR für den ADC12 definiert 
habe? Ohne die ISR hängt sich das Programm allerdings auf, wenn ein 
Interrupt vom ADC12 kommt...

Weiß jemand Rat?

Hier mal der Code für die Geschichte:
// *** ADC12 ***

ADC12CTL0 = ADC12SHT0_6 | ADC12MSC | ADC12ON;     // S&H Zeit setzen | Multiple Conversions aktivieren | ADC12 aktivieren 
ADC12CTL1 = ADC12SHS_3 | ADC12SHP | ADC12CONSEQ_1;  // Timer B als S&H Quelle | SAMPCON auf Timer-Modus | Sequence of channels                                                  
ADC12CTL2 = ADC12RES_0;                  // 8 Bit Modus
    
ADC12MCTL0 = ADC12INCH_1 | ADC12EOS;        // 3 Kanäle auf 3 Register legen
    
__delay_cycles(200000);      // Warten, bis das Beschleunigungssensor bereit ist
    
// Interrupts aktivieren
ADC12IFG = 0;               // Ausstehende Interrupts löschen
ADC12IE = BIT0;        // End of Sample markiert bei MEM2, also löst BIT2 den Interrupt aus

ADC12CTL0 |= ADC12ENC;
  
// *** DMA ***

DMA0SA = (void (*)())&ADC12MEM0;       // Source address
DMA0DA = (void (*)())&AccArray;        // Destination address
    
DMA0SZ = 0x01;                         // Block size
                           
DMACTL0 = DMA0TSEL_24;                 // ADC12IFGx trigger
     
DMA0CTL = ( DMADT_4 | DMASWDW | DMASRCINCR_0  | DMADSTINCR_0 | DMAEN);  

Autor: Tobias Korrmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es gibt bei TI sehr gute Beispile für diesen Anwendungsfall. Schau doch 
einfach dort mal nach.

Autor: S. Z. (szimmi)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Guggst Du im Anhang.
Ich schätze mal, Dein Problem liegt daran, dass Du
DMA0SZ = 0x01;
schreibst. Da macht er denke ich nach einer Wandlung Schluss.

Autor: Schnapphase (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Es gibt bei TI sehr gute Beispile für diesen Anwendungsfall. Schau doch
einfach dort mal nach.

Also ich habe die Application Notes durchgeschaut und nichts gefunden :(

> Ich schätze mal, Dein Problem liegt daran, dass Du DMA0SZ = 0x01; schreibst. Da 
macht er denke ich nach einer Wandlung Schluss.

Ja genau das soll er ja auch machen. Ich habe ja auch die DMADT_4 Bits 
gesetzt. Das heißt, der ADC12 soll den DMA ständig triggen, 1 Byte zu 
transferieren. Das stimmt auch alles, schließlich funktioniert es mit 
dem Timer B als Trigger ja auch.

Autor: Tobias Korrmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es Gibt da ne ganze Menge Code Examples
http://focus.ti.com/mcu/docs/mcuprodcodeexamples.t...

Autor: Schnapphase (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achso - ja das habe ich gesehen. Da gibts aber nur sehr wenig zum DMA. 
Und das habe ich mir angeschaut, und bin der Meinung, ich habe das 
eigentlich genau so umgesetzt.

Die Frage bleibt also - wie muss ich meinen ADC12 konfigurieren, damit 
er den DMA triggert?

Autor: Tobias Korrmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falsche Frage. Du must fragen wie du deinen DMA Konfigurieren musst 
damit er vom ADC getrigert wird.

Ich würde jetzt ertstmal ds Beispiel von TIn zum Laufen bringen. (da 
weiß man wenigstens das es laufen sollte. Wobei es auch dort ausnahmen 
gibt)
Wenn der Beispielcode funktioniert kannst du den ja umschreiben damit 
auch der Rest deiner Anforderungen abgedeckt wird.

Das Wäre zumindesten meine Herangehensweise.
Etwas nehmen von dem man weiß das es laufen sollte und dann soweit 
ändern wie man es leber braucht.

Autor: Schnapphase (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe den Beispielcode von TI genommen und es mal probiert. Den Code 
muss ich aber für meinen MSP430 umschreiben. Mit dem gegebenen 
DMA1TSEL_6 Trigger funktioniert es auch, nur ist das bei meinem 5438 der 
Timer B. Der ADC12 wäre bei mir der DMA1TSEL_24 - und damit 
funktionierts nicht.

Autor: Schnapphase (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Problem gelöst.

Ich dachte in meiner infantilen Einfältigkeit: "Es schadet doch bestimmt 
nicht, dass ADC12IE Bit zu setzen, schließlich will ich ja auch 
Interrupts vom ADC12 reagieren" - ähm, nein. Ein Blick ins Handbuch 
hätte mir da ein wenig Arbeit und Zeit erspart -.-

Trotzdem danke an alle ;)

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.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

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