Gast
#2795256
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;
}
}