---Qué otra técnica se podría usar
?
En lugar de hacer una tira interminable de IFs podés usar una tabla con los umbrales y las salidas en portA y portB.
Es lo apropiado para umbrales y salidas arbitrarias, para umbrales equiespaciados se reemplaza el bucle de comparación por una división y e incluso puede llegar a simplificarse hasta no ser necesaria una tabla.
Algo así por ejemplo (está pensada para #device adc=8 y escala cuadrática):
typedef struct {int8 umbral,lb,la;} MLEDS ;
// Umbral portB portA
// ------ ----- -----
MLEDS mled[16]={ 0, 0xFF , 0x00 ,
60, 0xFE , 0x84 ,
85, 0xFD , 0x84 ,
104, 0xFB , 0x84 ,
120, 0xF7 , 0x84 ,
134, 0xEF , 0x84 ,
147, 0xBF , 0x84 ,
159, 0xDF , 0x84 ,
170, 0x7F , 0x84 ,
180, 0xFE , 0x48 ,
190, 0xFD , 0x48 ,
199, 0xFB , 0x48 ,
208, 0xF7 , 0x48 ,
216, 0xEF , 0x48 ,
224, 0xBF , 0x48 ,
232, 0xDF , 0x48
};
y en el bucle (ojo que necesitás #use fast_io(all) ):
while(true)
{
delay_ms(100);
nivel = read_adc();
for(k=0 ; k<15 && nivel>mled[k].umbral ; k++) ;
output_b(mled[k].lb) ;
output_a(mled[k].la) ;
}
Hay forma de corregir estos errores, sin tener que cambiar la computadora
?
No son errores. Que no se ejecute en tiempo real es casi insalvable y los otros son problemas de convergencia en la parte analógica.
En estos últimos hay que abrir los ojos porque en el mejor de los casos solamente ralentizan el proceso y en el peor te tiran cualquier valor.
Cuando aparecen estos mensajes, lo que se debe hacer no es cambiar la PC sino ayudar al proceso de simulación.
Esto es:
- Todo lo que no sea indispensable para simular --> se saca.
- Todo lo analógico que pueda quedar por momentos en alta impedancia (transistores al corte, diodos sin conducir) --> se le agrega una resistencia a masa de valor 100megohm.
Obviamente todo esto solo durante simulación
