Hola a todos. Tengo un problema, lo que quiero hacer es por uno de los puertos ADC por ejemplo AN0 del PIC, conectar 8 Pulsadores y cada uno tiene un preset calibrado a un valor, para que esto según el valor en otro puerto del PIC me enciende un LED.
Pulsador 1 led 1, pulsador 2 led 2 y así. El problema que a veces me enciende y a veces no, es inestable.
¿Por qué es eso? Hice una rutina que se llama Rangos que según el rango me retorna un valor que va de 0 a 7, eso después lo utilizo en una rutina Switch para que seleccione el LED a encender, pero repito, a veces enciende y a veces no.
Mas abajo en el programa van a ver que están las subrutinas de GrabaEEPROM, LEEEEPROM, i2c_envia, porque utilizo el PCF8574.
Osea Lee el conversor ADC, busco el rango en rangos_ADC() y luego lo guardo en la EEPROM, para más tarde leerlo y luego enviarlo por I2C al PCF8574, que éste luego me enciende el LED.
Se puede omitir todo esto para no hacerse un enredo en la cabeza del que me va a ayudar.
Lo que necesito, es que cuando lea el pulsador y me retorne por medio de Rangos_ADC un valor entre 0 y 7 y me encienda un LED, cosa que a veces lo enciende y otras no, como que es inestable.
Lo mas triste que en el Proteus anda pero en la vida real no.
¿Para qué es todo esto? Es para poner pulsadores en la casa e ir encendiendo las luces.
Lo bueno es que por cada ADC puedo conectar ocho pulsadores y según el rango de tensión que entrega cada pulsador me enciende la luz del lugar.
Por eso son 8 los valores que me entrega Rangos ADC. ¿Me expliqué bien en todo?
Código:
int8 ADDRE[6] = {0x40,0x42,0x44,0x46,0x48,0x4A}; //Array no la uso ocupa mas memoria
void TodasLasSalidas (char dato)
{ int i;
for(i=AD0;i<=AD5;++i)
i2c_envia(ADDRE[i],dato); //Ponea cero el Integrado 1
}//FIN TodasLasSalidas
int BCD(int y)
{
unsigned int r=1,i;
for(i=1;i<y;i++)
r*=2;
return r;
}
void i2c_envia(char addr,char data)
{
i2c_start();
i2c_write(addr);
i2c_write(data);
i2c_stop();
}
int rangos_adc(int16 dato)
{
if((dato>204)&&(dato<307)) //1V-1.5V
return 0;
if((dato>307)&&(dato<409)) //1.5V-2V
return 1;
if((dato>409)&&(dato<511)) //2V-2.5V
return 2;
if((dato>511)&&(dato<614)) //2.5V-3V
return 3;
if((dato>614)&&(dato<716)) //3V-3.5V
return 4;
if((dato>716)&&(dato<818)) //3.5V-4V
return 5;
if((dato>818)&&(dato<920)) //4V-4.5V
return 6;
if((dato>920)&&(dato<1023)) //4.5V-5V
return 7;
return -1;
}//FIN RANGO ADC
void grabaEEPROM(char addr, char dato)
{
int val;
val = read_eeprom(addr);
delay_us(10);
if(val!=0)
dato = 0;
write_eeprom(addr,dato);
delay_us(10);
}
int leeEPROM(char dato)
{
int i,val;
val=0;
for(i=dato;i<=(dato+7);++i)
val += read_eeprom(i);
return val;
// write_eeprom(0x80,dato);
// i2c_envia(addr,val);
}
void main()
{
int i;
int v;
int16 m=0;
setup_adc_ports(sAN0|sAN1|sAN2|sAN3|sAN4);
setup_adc(ADC_CLOCK_INTERNAL);
eeprom_ini();
TodasLasSalidas(0);
while(TRUE)
{
//TODO: User Code
set_adc_channel(AD0);
delay_us(20);
for(i=1;i<=10;++i){
m=read_adc();
delay_us(20);
}
v=rangos_adc(m);
while(read_adc()) delay_us(20); //Espera que se suelte la tecla
switch(v){
case 0: grabaEEPROM(0,BCD(1)); //i2c_envia(ADDRE[0],1);
break;
case 7: grabaEEPROM(7,BCD(8));// i2c_envia(ADDRE[0],2);
break;
default: i=leeEPROM(0); i2c_envia(ADDRE[0],i);
break;
}//FIN SWITCH*/
}//FIN WHILE
}