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