Part Number:MSP432P401R
Tool/software: Code Composer Studio
I'm posting this as a related question because I accidentally clicked "This resolved my issue" on a comment on the other post when it did not actually resolve my issue.
While running the code below I get the following error:
#138 expression must be a modifiable value main.c /ADC_TEST line 77 C/C++ Problem
In reference to this line, where I am trying to turn the ADC off:
ADC14_CTL0_ENC = 0; //turn off ADC
Furthermore, when I replace that instruction with a blinking LED (for debugging purposes) and then press the button I see one ADC value reported via UART and then the LED blinks continuously, regardless of how many additional times the button is pressed. Ideally, I want the ADC to turn on again when the button is pressed a second time. ANy help would be greatly appreciated.
/* Test ADC ON by external button and OFF by Timer A */ #include "msp.h" #include "mytiming.h" volatile unsigned int UART_flag = 0; volatile unsigned int timer_flag = 0; volatile unsigned int button_flag = 0; volatile unsigned int var = 0; int millivolt = 0; void UART0_init(void); void delayMs(int n, int freq); void setFreq(int freq); int main(void) { setFreq(FREQ_3_MHZ); int mv_char_0 = 0; int mv_char_1 = 0; int mv_char_2 = 0; int mv_char_3 = 0; char uart_0; char uart_1; char uart_2; char uart_3; WDT_A->CTL = WDT_A_CTL_PW | // Stop WDT WDT_A_CTL_HOLD; // GPIO Setup P5->SEL1 |= BIT4; // Configure P5.4 for ADC P5->SEL0 |= BIT4; // Initialize Port 3 (button connections) P3->SEL0 = 0; //clear register selection P3->SEL1 = 0; //clear register selection P3->DIR = 0; P3->OUT = BIT0; P3->REN = BIT0; //enable pull up resistor P3->IES = BIT0; //interrupt on high-low transition P3->IFG = 0; //clear any pending flags P3->IE = BIT0; //enable port 3 interrupts UART0_init(); // Enable global interrupt __enable_irq(); // Enable ADC and Timer A0 interrupts in NVIC module NVIC_EnableIRQ(TA0_0_IRQn); NVIC_EnableIRQ(ADC14_IRQn); NVIC_EnableIRQ(PORT3_IRQn); // Sampling time, S&H=16, ADC14 on ADC14->CTL0 = ADC14_CTL0_SHT0_2 | ADC14_CTL0_SHP | ADC14_CTL0_ON; ADC14->CTL1 = ADC14_CTL1_RES_2; ADC14->MCTL[0] |= ADC14_MCTLN_INCH_1; /* A1 ADC input select; Vref=AVCC */ ADC14->IER0 |= ADC14_IER0_IE0; /* Enable ADC conv complete interrupt */ SCB->SCR &= ~SCB_SCR_SLEEPONEXIT_Msk; /* Wake up on exit from ISR */ while (1){ if (button_flag){ //button pushed, turn ADC on ADC14->CTL0 |= ADC14_CTL0_ENC | ADC14_CTL0_SC; //start sampling/conversion button_flag = 0; //Reset flag P3->IFG = 0; //clear any pending flags P3->IE |= BIT0; //re-enable P3.0 interrupt } if (timer_flag){ //time up, turn ADC off timer_flag = 0; ADC14_CTL0_ENC = 0; //turn off ADC } if (UART_flag) { UART_flag = 0; millivolt = (int)((var + 1.46) / 1.2361); mv_char_3 = millivolt / 1000; mv_char_2 = millivolt / 100 - (mv_char_3 * 10); mv_char_1 = millivolt / 10 - (mv_char_3 * 100 + mv_char_2 * 10); mv_char_0 = millivolt - (mv_char_1 * 10 + mv_char_3 * 1000 + mv_char_2 * 100); uart_0 = (char) mv_char_0 + '0'; uart_1 = (char) mv_char_1 + '0'; uart_2 = (char) mv_char_2 + '0'; uart_3 = (char) mv_char_3 + '0'; while(!(EUSCI_A0->IFG & 0x02)) { } EUSCI_A0->TXBUF = uart_3; while(!(EUSCI_A0->IFG & 0x02)) { } EUSCI_A0->TXBUF = uart_2; while(!(EUSCI_A0->IFG & 0x02)) { } EUSCI_A0->TXBUF = uart_1; while(!(EUSCI_A0->IFG & 0x02)) { } EUSCI_A0->TXBUF = uart_0; while(!(EUSCI_A0->IFG & 0x02)) { } EUSCI_A0->TXBUF = 0x0D; } } } // ADC14 interrupt service routine void ADC14_IRQHandler(void) { UART_flag = 1; var = ADC14->MEM[0]; } //Timer A0 interrupt service routine void TA0_0_IRQHandler(void){ timer_flag = 1; //flag when timer reaches value TA0CCTL0 &= ~CCIFG; //clear pending interrupt flag } void PORT3_IRQHandler(void) //Interrupt handler for P3.0 { button_flag = 1; //Set flag to signal button press detected //configure Timer A0 TA0CCR0 = 900000; //Timer length = 300ms TA0CCTL0 |= CCIE; TA0CTL |= TASSEL_2 | MC_1; P3->IFG = 0; //Clear P3.0 pending interrupt flag P3->IE &= ~BIT0; //Disable interrupt for P3.0 for debouncing } void UART0_init(void) { EUSCI_A0->CTLW0 |= 1; // put in reset mode for config EUSCI_A0->MCTLW = 0; // disable oversampling EUSCI_A0->CTLW0 = 0x0081; /* 1 stop bit, no parity,SMCLK,byte data */ EUSCI_A0->BRW = 26; // 3,000,000 / 115200 = 26 P1->SEL0 |= 0x0C; // P1.3, P1.2 for UART P1->SEL1 &= ~0x0C; EUSCI_A0->CTLW0 &= ~1; // take UART out of reset mode }