ADC10 MSP430FR5739

Gast #2795256
Lesenswert?

Hallo,
versuche grade bei dem oben genannten uC den ADC zum laufen zu bringen 
leider funktioniert er nicht so wie ich will, er schreibt einfach keinen 
Wert in den ADC10MEM0 speicher und setzt den ADC10SC nicht automatisch 
zurück. Ich hoffe Ihr könnt meinen Denkfehler finden bzw. mir noch ein 
paar Ratschläge geben. Angelegt ist VCC an P1.2.

// Includes
#include "msp430fr5739.h"

// Definitions
#define dv 0.0034765625

// Global Variables
unsigned int delay=0, status=0, i=0, cache=0, cache1=360;
double volt=0;

// Function Definitions#
void ADC_init();
void Clock_init();

// main
int main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;

  Clock_init();
  ADC_init();

  // BEAK_TRIG @ P3.0
  P3DIR |= BIT0 ;
  P3OUT |= BIT0 ; // Beak low

  // Lamp Charge Time
  TA0CCTL0 = CCIE ; // Enable Interrupt CCR0
  TA0CCR0 = 65536-1 ; // 1/24MHz*65536= 0.00273066666
  TA0CTL |= TASSEL_1 + MC_1 + TACLR ; // ACLK, up to CCR0, clear TA0R

  // Delay
  TA1CCTL0 = CCIE; // Enable Interrupt CCR0
  TA1CCR0 = cache1-1; // delay start with 360 = 15us
  TA1CTL |= TASSEL_1 + MC_1 + TACLR; // ACLK, up to CCR0, clear TA1R

  __enable_interrupt();

  P3OUT &=~ BIT0 ; // Beak high

  for(;;)
  {
  }// wait for interrupt
}

// Function

// Clock initalisieren
void Clock_init()
{
  PJSEL1 &= ~BIT4 ;
  PJSEL0 |= BIT4 ;
  CSCTL0_H = 0xA5 ; // Unlock register
  CSCTL2 = SELM__XT1CLK + SELS__XT1CLK ; // XT1=SMCLK=MCLK
  CSCTL4 = XTS + XT1DRIVE_3 ; // High Frequency
  CSCTL3 = 0; // No Division
  CSCTL5 &=~ XT1OFFG;
  CSCTL0_H = 0x01; // Lock register
  for(unsigned int i=0 ;i==60000; i++)
  {
  }
}

//ADC initialisieren
void ADC_init()
{
  P1SEL1 |= BIT2 ;
  P1SEL0 |= BIT2 ;
  ADC10CTL0 = ADC10SHT_2 + ADC10ON ; // Sample and Hold cycles 16, 
enable ADC
  ADC10CTL1 = ADC10SSEL_3 ; // SMCLK
  ADC10MCTL0 = ADC10INCH_2 ; // P1.2
}

// Interrupt Service Routine

// Lamp Charge Time
#pragma vector = TIMER0_A0_VECTOR
__interrupt void T0_CCR0_ISR()
{
  if(++i==17);
  {
    i=0;
    TA1CCTL0 |= CCIE; // start Delay Interrupt
    P3OUT &=~ BIT0; // Beak high
  }
}

// Delay
#pragma vector = TIMER1_A0_VECTOR
__interrupt void T1_CCR0_ISR()
{
  while (ADC10CTL1 & ADC10BUSY); // coversion ?
  ADC10CTL0 |= ADC10ENC + ADC10SC ;// start conversion

  TA1CCTL0 &=~ CCIE; //Disable Delay Interrupt
  P3OUT |= BIT0; // Beak low

  if(ADC10MEM0>cache)
  {
    cache=ADC10MEM0;
    switch(status)
    {
    case 0: delay = cache1;
            cache1 += 2; // raise delay
            TA1CCR0 = cache1-1;
            break;
    case 1: volt = cache*dv; // convert memory in volt
            break;
    }
  }
  if(cache1==482)//20us
  {
    TA1CCR0 = delay-1 ;
    cache=0;
    cache1=216;
    status=1;
  }
}
Gast #2796129
Lesenswert?

Habe mir schon Beispiele angesehen, finde aber, das es zu dieser Familie 
nicht viele gibt. (z.B bei noccy.com)
Allerdings werde ich da nicht schlau draus die meisten Arbeiten mit dem 
ADC interrupt, den ich bei mir nicht verwende müsste ja auch ohne gehen.
Gast #2796820
Lesenswert?

Habe nochmal genau nach den TI-Beispielen geschaut. Wie der Zufall es so 
will waren es genau die gleichen Beispiele (der Autor hatte Sie bestimmt 
von TI hochgeladen).
Vll stell ich mich auch nur blöd an bei der Programmierung, finde es 
aber mit dem G2231 irgendwie einfacher da hat es wenigstens 
funktioniert.
Habe nähmlich schon das nächste Problem aber erstmal recherchieren.
Ich bedanke mich schonmal für die Antworten, dass sich zumindestens 
jemand meinen Probleme annimmt.

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