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] = 'void USART_Cmd_Eval(void)
{
strcpy(RxCommand,RxBuffer);
if(strcmp(RxCommand, "c") == 0){
RxReady = 1;
ADC_measure();
}
}
' ;
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 ADC_measure(void)
{
while(RxReady ==1)
{
_delay_ms(50);
// Measrung ADC values and send them to USART
}
}
Para cada comando, se llamará la función relativa. Como siguiendo:
ISR(USART_RXC_vect)
{
char ReceivedChar ;
ReceivedChar = UDR; // Fetch the received byte value into the variable "ReceivedChar"
if(ReceivedChar == '\n'){
RxBuffer[RxPos] = 'void USART_Cmd_Eval(void)
{
strcpy(RxCommand,RxBuffer);
if(strcmp(RxCommand, "c") == 0){
RxReady = 1;
ADC_measure();
}
}
' ;
RxReady=0;
USART_Cmd_Eval();
}
else{
RxBuffer[RxPos] = ReceivedChar;
RxPos++;
}
}
El problema es: no puedo enviar otro comando porque está bloqueado en la función ADC_measure. Básicamente, no quiere recibir otro comando a través de ISR, creo que continuará abierto. Por lo tanto, creo que debería borrar el indicador de interrupción antes de llamar a ADC_measure. ¿Derecha? ¿Cómo puedo hacer esto?