ADC12 sampled nicht

Gast #311547
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
Gast #311550
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 ...
Gast #311551
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.