Lectura y comparación de registros de 10 bits en arquitectura de 32 bits

Actualmente estoy programando en C ADC de 10 bits dentro de un microcontrolador basado en ARM32 de 9 bits. Este ADC de 10 bits está guardando valor analógico digitalizado en Registro de 10 bits llamado "ADC_DATA_REG" que usa los bits 9-0 (LSB). Tengo que leer el valor de este registro y compararlo con un Constante de 32 bits denominada "CONST". Mi intento se ve así, pero no funciona. que me estoy perdiendo aqui? ¿Debería utilizar operaciones por turnos? Esta es la primera vez que me ocupo de esto, por lo que cualquier ejemplo será bienvenido.

El siguiente código se ha editado con respecto a comentarios y respuestas y todavía no funciona. También agregué una declaración while que verifica si la bandera ADC_INT_STATUS está levantada antes de leer ADC_DATA_REG. La bandera mencionada indica una interrupción que está pendiente tan pronto como ADC finalice la conversión y los datos estén listos para leer de ADC_DATA_REG. Resulta que los datos permanecen en 0 incluso después de asignarle el valor del registro ADC_DATA_REG, por eso mi LED está siempre encendido. Y también significa que recibí una interrupción y debería haber datos en ADC_DATA_REG, en cambio parece que no hay ...

#define CONST 0x1FF
unsigned int data = 0;

while (!(ADC_INT_STATUS_REG & ADC_INT_STATUS))
data = ADC_DATA_REG; 

if ((data & 0x3FF)> CONST){ 
   //code to turn off the LED 
} 
else{ 
   //code to turn on the LED 
}

preguntado el 08 de noviembre de 11 a las 13:11

Enmascare los bits de valor: if ((data & 0x3ff)> CONST) {} -

"no está funcionando" ¿cómo exactamente? ¿Obtiene un error de compilación, un error de tiempo de ejecución o resultados incorrectos? -

Edité el código anterior e implementé todas las propuestas que me diste, pero aún así mis datos permanecen en 0 todo el tiempo y mi LED está siempre encendido incluso si giro el potenciómetro. -

Parece que te falta un ;, por lo que while se repite en la bandera ANTES de leer los DATOS. -

1 Respuestas

No escribe cómo ADC_DATA_REG obtiene el valor de 10 bits. Pero supongo que es solo una lectura de alguna dirección IO. En este caso, la lectura de la dirección devuelve 32 bits. En su caso, solo los 10 inferiores son válidos (o interesantes). Los otros 22 bits pueden ser cualquier cosa (por ejemplo, bits de estado, basura, ...), por lo que antes de continuar con los datos, debe poner a cero los primeros 22 bits.

En caso de que el valor de 10 bits esté firmado, también debe realizar una extensión de signo y corregir su tipo de datos (sé que el puerto IO no está firmado, pero tal vez el valor de 10 bits que devuelve el adc no lo esté). Entonces tu comparación debería funcionar.

respondido 08 nov., 11:18

Inicialicé los datos con 0 ahora y también enmascaré los bits, pero el problema persiste. - 71GA

Además, si ADC_DATA_REG (o las otras dos reglas) se # define como (* (unsigned *) memory_address_of_ADC_DATA_REG), puede ser necesario un volátil: (* (volatile unsigned *) memory_address_of_ADC_DATA_REG). Y luego las direcciones pueden ser incorrectas, la lógica para leer / escribir datos puede ser incorrecta, el ADC puede no estar configurado / inicializado correctamente ... Es difícil saber qué es exactamente / puede estar equivocado sin conocer el sistema. - Alexey Frunze

Lo definí en un archivo .h separado como #define ADC_DATA_REG (*((volatile unsigned int *) 0x13002008)) pero es un buen comentario TY. - 71GA

+1 @Alex, buen comentario. Otra cosa tal vez sea el orden de los bytes. El host y el dispositivo pueden tener una comprensión diferente del orden de bytes, y los 10 lsb pueden estar en algún lugar, donde no los espera. - flolo

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.