Problema con el bucle while

3

Estoy intentando leer los valores externos de ADC AD7798 mediante el controlador ATmega32-A. En la hoja de datos, el registro de estado Bit 7 ( SR7 ) indica que la conversión ha finalizado o no:

  

Bit de Listo. Se borra cuando los datos se escriben en el registro de datos. Conjunto   después de leer el registro de datos o después de un período de tiempo antes de la   El registro de datos se actualiza con un nuevo resultado de conversión para indicar a   El usuario no debe leer los datos de conversión. También se establece cuando la parte   Se coloca en modo de apagado. El final de una conversión se indica por   el pin DOUT / RDY. Este pin puede ser usado como una alternativa al estado.   regístrese para monitorear el ADC para datos de conversión.

Ahora quiero escribir código para verificar si el registro de estado MSB (Bit7) es 0 o no. Entonces, cuando es 0 , solo entonces puedo emitir un comando de lectura.

He escrito un código como este:

unsigned char CheckStatus(void)
{
            char adcStatus; 
            spi(0x40);
            adcStatus = spi(0xFF);
            while((adcStatus & 0x80)!=0x80);                         
            return adcStatus;
}

Pero no está funcionando.

Mi explicación de código:

  1. Emitir el comando de lectura para leer el registro de estado de ADC.
  2. Leyendo el valor del registro de estado de ADC y almacenado en adcStatus variable.
  3. La comprobación del bit MSB no es igual a 1 . (No estoy seguro de si este bucle while es correcto o no).

Quiero verificar si el registro de estado MSB no es igual a 1 , de modo que pueda emitir el comando de lectura ( 0x58 ) para leer los valores de ADC. Si el registro de estado MSB es igual a 1 , no puedo leer los valores de ADC.

¿Qué estoy haciendo mal?

    
pregunta verendra

1 respuesta

9

Debe volver a leer el registro de estado de ADC dentro de el bucle; de lo contrario, solo estás volviendo a probar el bit que leíste la primera vez. Además, debe invertir el sentido de la prueba: desea repetir la prueba si el bit es "1" y abandonar el bucle una vez que cambia a "0". También puede ser necesario cambiar la selección de chip al ADC en cada lectura, como se muestra en los comentarios a continuación.

unsigned char CheckStatus(void)
{
  unsigned char adcStatus;
  do {
    /* TBD: assert chip select here? */
    spi(0x40);
    adcStatus = spi(0xFF);
    /* TBD: negate chip select here? */
  } while ((adcStatus & 0x80) == 0x80);                         
  return adcStatus;
}
    
respondido por el Dave Tweed

Lea otras preguntas en las etiquetas