no puede leer y almacenar en la variable global en la función O puede, pero se produce un error al leer el sensor ds18b20

0

Estoy utilizando Atmega8 con CVAVR 2.05.0 e intento modificar ligeramente la forma en que funciona la biblioteca ds18b20. Quiero almacenar las temperaturas de los sensores en una matriz global y comenzar la conversión de todos los sensores a la vez, para evitar los retrasos inútiles y hacer algo útil. Por ahora, en "Configuración de proyecto - Compilador C - Generación de código - (s) printf Las características" están configuradas en "flotante, ancho, precisión".

Encontréunproblema(loprobéenProteus7.7SP2yenatmega8real)-sillamolecturadetemperaturaenfuncióndentrodeprintfcomoesto:

printf("t%i read=%.4f \n\r", i, ds18b20_read_temperature(&rom_code_ds18b20[i][0]));

funciona bien, excepto que no puede leer la variable global dentro de la función. Pero si antes de esa impresión puse una asignación a una matriz flotante global como esta:

    temperatures[i] = i + 0.275;
    printf("t%i read=%.4f \n\r", i, ds18b20_read_temperature(&rom_code_ds18b20[i][0]));

Comienzo a recibir errores (-9999) para cada lectura de los sensores segundo y tercero, sin importar lo que se encuentre en una asignación, si es una asignación a global varible. Pero comienza a leer los valores de la matriz global.

Firs Intenté leer la matriz flotante global en main - funciona bien. Luego traté de hacer la misma lectura de temperatura en main - otra vez, dentro de printf funciona bien, pero si intento asignar el resultado de la lectura a la variable local t1 y luego printf esos t1 - Tengo cero.

Aquí hay un ejemplo de salida "buena" (sin asignación antes de impresiones, pero sin lectura de variable global en la función):

Aquíhayunejemplodesalida"incorrecta" (poner asignar antes de imprimir, la variable global comienza a leer normalmente, pero se pierden 2 y 3 sensores (ver esos -9999?)):

¿Dóndeestáelproblema?¿Ohayalgoquedeberíasabersobreladefiniciónoelusodematricesy/ofunciones?

Sobrelavariableglobalencontrésolo sobre problemas dentro de interrupciones , se recomendó usar volatile. Intentado volátil - sin efecto. También probé punteros (no estoy familiarizado con ellos, pero con la ayuda de un amigo ...) - lo mismo - no hay lectura global en la función y "perder lecturas del sensor".

También después de compilar el proyecto recibo advertencias:

  

Advertencia: C: ... \ my_reading_ds18b20 \ my_reading_ds18b20.c (261): el índice de la matriz está fuera de rango   Advertencia: C: ... \ my_reading_ds18b20 \ my_reading_ds18b20.c (263): el índice de la matriz está fuera de rango   Advertencia: C: ... \ my_reading_ds18b20 \ my_reading_ds18b20.c (265): el índice de la matriz está fuera de rango

Verifiqué esa variable number_of_sensors = 3 (con printf), así que no entiendo por qué recibo esta advertencia. Tal vez porque esta varible se establece con preprocesador?

Aquí está mi archivo .c : observe las líneas 80, 251, 252

enlace

(con comentarios e impresión "debug". Si algo no está claro, pregúntame)

Y aquí (si es necesario) archivo .prj : enlace

Llamo su atención de que NO se trata de leer dsb18b20 : esa función es de la biblioteca y funciona bien, pero se trata de problemas derivados de la variable flotante global. ¡Realmente necesito almacenar esos valores para su uso posterior!

ACTUALIZACIÓN1: Parece que el problema en todo, excepto t1..t4, estaba en la configuración de la variable número de sensores , porque si se cambia la matriz de inicialización temperaturas flotantes [número_de_sensores] a temperaturas de flotación [4] todos los problemas anteriores han desaparecido. Así que parece que no puedo obtener el número de sensores definidos por la forma en que lo he usado. ¿Hay alguna otra forma excepto cambiar automáticamente el número de sensores según las opciones utilizadas?

    
pregunta nekit_p

1 respuesta

0

De esos mensajes de advertencia, parece que hay un problema con el primer índice de la matriz rom_code_ds18b20 [i] [0] - parece que "number_of_sensors" no se está configurando correctamente.

    
respondido por el Peter Bennett

Lea otras preguntas en las etiquetas