<< Chapter < Page | Chapter >> Page > |
When the ADC10 ends the conversion, an interrupt is requested. While variable
min is lower than 60, the temperature is written to flash memory. The memory pointer is increased by two (word). When
min = 60
, the system stops operation.
Adjust the DCO frequency to 1 MHz by software using the calibrated DCOCTL and BCSCTL1 register settings stored in information memory segment A.
if (CALBC1_1MHZ == 0xFF || CALDCO_1MHZ == 0xFF)
{while(1); // If calibration constants erased
// do not load, trap CPU!!}DCOCTL = CALDCO_1MHZ; // Set DCO to 1 MHz
Set MCLK and SMCLK to 1 MHz. Use the internal very low power VLOCLK source clock to ACLK/8 clock signal as low frequency oscillator (12 kHz):
BCSCTL1 = DIVA_3; // ACLK = 1.5 kHz
BCSCTL3 = LFXT1S_2; // Set VLOCLK (12 kHz)
The ADC10’s input channel is the integrated temperature sensor (A10) and it uses the signal V REF+ (1.5 V) as reference voltage. The ADC10 clock source is ADC10OSC, the clock signal being ADC10CLK/4. Configure the ADC10 sample-and-hold time: 64xADC10CLKs, to perform a single-channel single-conversion and enable its interrupts. What are the values to write to the configuration registers?
ADC10CTL1 = INCH_10 + ADC10DIV_3; // Temp Sensor (A10),
// ADC10CLK/4,// clock source: ADC10OSC
ADC10CTL0=SREF_1 + ADC10SHT_3 + REFON + ADC10ON +ADC10IE;// Internal reference voltage Vref+ = 1.5 V
// ADC10 sample-and-hold time: 64 x ADC10CLKs// Reference-generator voltage = 1.5 V
// ADC10 on + ADC10 interrupt enable//*********************************************************// ADC10 Interrupt Service Routine
//*********************************************************#pragma vector=ADC10_VECTOR
__interrupt void ADC10ISR(void){
unsigned int temperature;
if (min<= 60)
{temperature = ((ADC10MEM - 673) * 423) / 1024;
write_int_flash(memo_ptr,temperature);memo_ptr += 2;
}else
{_NOP();
}}
Configure Timer_A register to enable an interrupt once every second. Use the ACLK clock signal as the clock source. This timer is configured in up counter mode in order to count until the TAR value reaches the TACCR0 value.
TACCTL0 = CCIE; // TACCR0 interrupt enabled
TACCR0 = 1500; // this count corresponds to 1 secTACTL = TASSEL_1 | MC_1 | ID_0;// ACLK, up mode to TACCR0//**********************************************************
// Timer_A Interrupt Service Routine//**********************************************************
#pragma vector=TIMERA0_VECTOR__interrupt void TimerA0_ISR (void)
{counter++;
P1OUT ^= 0x01; // LED toogleif (counter == 60){
min++;counter = 0;
ADC10CTL0 |= ENC + ADC10SC; // Sampling/Conversion start}
}
After compiling the project, start the debug session and before running the application, put a breakpoint at the line of code with the
_NOP()
instruction. Go to breakpoint properties and set action to
Write data to file . Name the file as
Temp.dat and define the
data format as
integer . The data starts at address
0x01040
, with a length of
3C
. Run the application and let the temperature data logger acquire the values for 1 hour. Use a heater or a fan to force temperature variations during the measurement period. When execution reaches the breakpoint, the file will be available in your file system. Construct a graph in Excel or a similar tool, in order to plot the temperature variation obtained by the data logger.
This example and many others are available on the MSP430 Teaching ROM.
Request this ROM, and our other Teaching Materials here (External Link)
Notification Switch
Would you like to follow the 'Teaching and classroom laboratories based on the “ez430” and "experimenter's board" msp430 microcontroller platforms and code composer essentials' conversation and receive update notifications?