MSP430: ADC12 soll DMA triggern

Gast #1341725
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);
Gast #1342279
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.
Gast #1342429
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren