Forum: Mikrocontroller und Digitale Elektronik ADC10 MSP430FR5739


von Dragofolio (Gast)


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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Jetzt kommt die bei Problemen mit MSP430-Peripherie übliche 
Standardfrage, ob Du Dir die zu der von Dir verwendeten Familie 
passenden Codebeispiele von TI angesehen hast ...

Und diese Zeile solltest Du Dir auch noch mal ganz genau ansehen:

>  for(unsigned int i=0 ;i==60000; i++)

von Dragofolio (Gast)


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.

von Dragofolio (Gast)


Lesenswert?

Durch änderung der Zeile
> ADC10CTL1 = ADC10SSEL_3 + ADC10SHP ;
funktioniert es soweit.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Dragofolio schrieb:
> Habe mir schon Beispiele angesehen, finde aber, das es zu dieser Familie
> nicht viele gibt. (z.B bei noccy.com)

Es geht nicht um irgendwelche Beispiele von irgendwo, sondern um die 
von TI höchstselbst.

von Dragofolio (Gast)


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.

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.