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


von Schnapphase (Gast)


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:
1
// *** ADC12 ***
2
3
ADC12CTL0 = ADC12SHT0_6 | ADC12MSC | ADC12ON;     // S&H Zeit setzen | Multiple Conversions aktivieren | ADC12 aktivieren 
4
ADC12CTL1 = ADC12SHS_3 | ADC12SHP | ADC12CONSEQ_1;  // Timer B als S&H Quelle | SAMPCON auf Timer-Modus | Sequence of channels                                                  
5
ADC12CTL2 = ADC12RES_0;                  // 8 Bit Modus
6
    
7
ADC12MCTL0 = ADC12INCH_1 | ADC12EOS;        // 3 Kanäle auf 3 Register legen
8
    
9
__delay_cycles(200000);      // Warten, bis das Beschleunigungssensor bereit ist
10
    
11
// Interrupts aktivieren
12
ADC12IFG = 0;               // Ausstehende Interrupts löschen
13
ADC12IE = BIT0;        // End of Sample markiert bei MEM2, also löst BIT2 den Interrupt aus
14
15
ADC12CTL0 |= ADC12ENC;
16
  
17
// *** DMA ***
18
19
DMA0SA = (void (*)())&ADC12MEM0;       // Source address
20
DMA0DA = (void (*)())&AccArray;        // Destination address
21
    
22
DMA0SZ = 0x01;                         // Block size
23
                           
24
DMACTL0 = DMA0TSEL_24;                 // ADC12IFGx trigger
25
     
26
DMA0CTL = ( DMADT_4 | DMASWDW | DMASRCINCR_0  | DMADSTINCR_0 | DMAEN);

von Tobias Korrmann (Gast)


Lesenswert?

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

von S. Z. (szimmi)


Angehängte Dateien:

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.

von Schnapphase (Gast)


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.

von Tobias Korrmann (Gast)


Lesenswert?


von Schnapphase (Gast)


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?

von Tobias Korrmann (Gast)


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.

von Schnapphase (Gast)


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.

von Schnapphase (Gast)


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 ;)

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