Hallo,
ich habe ein Problem mit dem ADC12 des MSP430FG4618 DevBoard.
Ich habe eine Interruptroutine für den ADC-Conversion Vorgang
programmiert, die allerdings nicht mehr verlassen wird, d.h. es wird
nicht mehr in den Main-Loop des Programms zurückgekehrt. Hat jemand eine
Idee, woran das liegen könnte?
Hier erst mal meine init-routine:
1 | void init_adc() {
|
2 | P6SEL = 0x0F;
|
3 | ADC12CTL0 = ADC12ON + MSC + SHT0_2; // Turn on ADC12, set sampling time
|
4 | ADC12CTL1 = SHP + CONSEQ_1; // Use sampling timer, single sequ
|
5 | ADC12MCTL0 = INCH_0; // ref+=AVcc, channel = A0
|
6 | ADC12MCTL1 = INCH_1; // ref+=AVcc, channel = A1
|
7 | ADC12MCTL2 = INCH_2; // ref+=AVcc, channel = A2
|
8 | ADC12MCTL3 = INCH_3 + EOS; // ref+=AVcc, channel = A3, end seq
|
9 | ADC12IE = 0x08; // Enable interrupt
|
10 | ADC12CTL0 |= ENC; // Conversion enabled
|
11 | }
|
Die wird aufgerufen durch:
1 | WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
|
2 | FLL_CTL0 |= XCAP18PF; // Set LoadCap
|
3 | init_adc();
|
4 | _BIS_SR(CPUOFF + GIE);
|
und hier jetzt die Routine selbst - die aber eigentlich nicht viel
macht, außer eine Ausgabe auf die Serielle Schnittstelle zu schreiben:
1 | __interrupt void ADC_ISR (void);
|
2 | ADC12_ISR(ADC_ISR)
|
3 | __interrupt void ADC_ISR (void) {
|
4 | printUART("ADC-IR\r\n",sizeof("ADC-IR\r\n"));
|
5 | _BIC_SR_IRQ(CPUOFF);
|
6 | _NOP();
|
7 | }
|
Im Main-Loop steht noch folgendes:
1 | while (true){
|
2 | P2OUT ^= 0x02;
|
3 | DC12CTL0 |= ADC12SC;
|
4 | for (i = 0; i < 20000; i++);
|
5 | }
|
Hat vielleicht jemand eine Idee? Wie gesagt - wird die
Interrupt-Routine, des ADCs nicht verlassen, bzw. dauert so lange, dass
bevor ins Hauptprogramm zurückgesprungen werden kann, wieder die Routine
aufgerufen wird.
Ich kenn mich leider mit dem TI nicht so gut aus, daher wäre - falls es
ein Zeitproblem wäre - die Frage, wie ich die Aufrufzeit der ISR
bestimmen kann. Also wie kann ich einstellen, mit welcher Frequenz der
Interrupt "gefeuert" wird?
Danke GALDO