Forum: Mikrocontroller und Digitale Elektronik ADC12 sampled nicht


von André Kamp (Gast)


Lesenswert?

Hi,

ich stehe vor einem kleinen Problem. Und zwar habe ich mir ein Programm
geschrieben, welches jede Sekunde einemal eine Wert des ADC12
digitalisiren soll. Der Timer funktioniert auch und der Interrupt wird
auch aufgerufen. Jedoch scheint sich der MSP sich bei der
digitalisierung festzufahren oder der ADC12 ist defekt.

Code:

void init_adc(void) //initialisiert den ADC12 auf Kanal 10 Tempdiode
{
  P6SEL=0x1;             // port 6 = input

  ADC12CTL0 = ADC12ON+SHT0_0+REFON+REF2_5V;  // ADC12 anschalten, n=1,
referenz auf 2,5V setzen
  ADC12CTL1 = SHP;        // SHP benutzen
  ADC12MCTL0 = SREF_1+INCH_0; // Vr+=Vref+
  ADC12CTL0 |= ENC;       // jetzt anfangen ...
}

void init_timer(void)
{
  CCTL0 = CCIE;                             // CCR0 interrupt enabled
  CCR0 = 32768-1;                           // Counter so gewählt, daß
1 Hz Taktinterrupt ausgelöst wird
  TACTL = TASSEL_1 + MC_1;                  // ACLK, upmode
}

// Timer A0 interrupt service routine
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
  ADC12CTL0 |= ADC12SC;                   // Start conversion
  while ((ADC12IFG & BIT0)==0);
  TXBUF0 = 't';

  temps[count] = ADC12MEM0;
  count++; //Zähler hochsetzen
  if(count == 10) TACTL = MC_0; //Timer stoppen
}
UART ist richtig konfiguriert, weil ich den Timer erst durch
tastendruck starte und mir das Zeichen ausgeben lasse. Nur das t
erscheint nicht und wenn ich die while schleife umbaue, sodass er
solange er BUSY ist mir ein Zeichen über den UART sendet, spammt er
mich voll. Also kommt er aus dem BUSY nicht mehr raus. Nun die Frage
ist der ADC12 kaputt oder liegt ein konfigurationfehler vor.

vielen dank

von peter dannegger (Gast)


Lesenswert?

Was ist ein ADC12 ?

Peter

von Michael Basel (Gast)


Lesenswert?

Also ich kann hier keinen Fehler sehen.
Sicher, dass du die Initialisierung durchführst?

von André Kamp (Gast)


Lesenswert?

@Peter

Ist das A/D-Modul des MSP430 von Texas Instruments

@Michael

Ja ich rufe die init_adc() in der main-routine auf genauso wie die des
UART. Der Timer wird ja erst durch tastendruck aktiviert.

void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;             // watchdog aus
  FCTL2 = FWKEY + FSSEL0 + FN1;         // MCLK/3 for Flash Timing
Generator
  flash_ptr = (char *) startaddr;       //startwert für den Flash
festlegen
  count = 0;
  init_adc();
  init_uart();

  _BIS_SR(LPM0 + GIE);              // ab in den LPM0 mit interrupts
...
}

also ka warum sich das Ding so festfährt :(  Kann man den Thread auch
in die Sektion des MSP430 verschieben? Habe den Eindruck er wird sonst
überlesen ...

von arc (Gast)


Lesenswert?

Funktioniert denn eine der anderen Varianten?
- ADC12BUSY in ADC12CTL1 = 1 während der Wandlung
- ADC12SC in ADC12CTL0 sollte auch automatisch auf 0 gehen, wenn die
  Wandlung fertig ist
- eigene ISR für den AD-Wandler

von KoF (Gast)


Lesenswert?

müsste ADC12CTL1 = SHP; in deiner initialisierung nicht ADC12CTL0
sein???

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.