¿Cómo borrar un indicador de interrupción UART manualmente?

Estoy usando un ATmega32. Tengo ISR (USART_RXC_vect) de la siguiente manera

ISR(USART_RXC_vect)
{
    char ReceivedChar ;     
    ReceivedChar = UDR; // Fetch the received byte value into the variable "ReceivedChar"

    if(ReceivedChar == '\n'){       
        RxBuffer[RxPos] = '\0' ;                    
        RxReady=0;
        USART_Cmd_Eval();            
    }
    else{
        RxBuffer[RxPos] = ReceivedChar;
        RxPos++; 
    }
}

Después de activar el ISR, llama a la siguiente función para definir qué comando se recibe desde la PC.

void USART_Cmd_Eval(void)
{
            strcpy(RxCommand,RxBuffer);

            if(strcmp(RxCommand, "c") == 0){
                    RxReady = 1;                     
                    ADC_measure();
            }   
}

Para cada comando, se llamará a la función relativa. Como lo siguiente:

void ADC_measure(void)
{
        while(RxReady ==1)
        {
                _delay_ms(50);
                // Measrung ADC values and send them to USART
        }
}

El problema es: no puedo enviar otro comando porque está atascado en la función ADC_measure. Básicamente, no quiere recibir otro comando a través de ISR, creo que seguirá abierto. Por lo tanto, creo que debería borrar el indicador de interrupción antes de llamar a ADC_measure. ¿Bien? ¿Cómo puedo hacer esto?

Respuestas (1)

Cuando se ejecuta cualquier rutina de interrupción, se borra el bit I de SREG para evitar la ejecución de la próxima interrupción. El bit es reiniciado por RETI . Es decir, también puede hacerlo manualmente SBI SREG,I (o mediante uint8_t sreg = SREG; sreg |= _BV(I); SREG = sreg; ).

¡ Pero también se puede volver a llamar a USART_RXC_vect ! No me gusta ningún _delay() en las rutinas de interrupción, ya que debe ser lo más breve posible. Deberías recodificarlo.

Muchas gracias por tu respuesta. Mi objetivo es permitir que se vuelva a llamar a USART_RXC mientras se ejecuta la función adc_meassure. Además, ¿qué retraso debería eliminarse?
USART_RXC_vect->USART_Cmd_Eval->ADC_measure->_delay_ms() e incluso hay un ciclo while largo en la función ADC_measure .
ay, tienes razon. ¿Tienes otra solución para eso? Quiero decir, ¿dónde puedo ejecutar el ciclo while después de cerrar USART_RXC y USART_Cmd_Eval?
Lo haría en el bucle del programa principal (si está usando Arduino, es loop() ). Solo para mirar la bandera RxReady , declarar como volátil y agregar algunas cosas contra las condiciones de carrera.