Memoria 24lc 64 y adc interno del pic18f4455

hola, lo q pasa es q estoy intentando guardar la conevrsion de un lm35 en la memoria, pero cuando uso el adc y el protocolo i2c al mismo tiempo el programa se me bloquea, pero usandolos indicidualmente funcionan, alguin me podria decir como hacer para solucionar esto, muchas gracias,
pd:este es el codigo
#include "C:\Users\pavilion\Documents\inetntandocosa\memoria2.h"
int16 dir=0;
int dirh,dirl;
int a,b,c,d,i=0;
int conversion;

void escribireeprom(int direccionh,int direccionl,int dato){
i2c_start();
i2c_write(0xa0);
i2c_write(direccionl);
i2c_write(direccionh);
i2c_write(dato);
i2c_stop();
}

int leereeprom(int direccionh,int direccionl){
int cosa;
i2c_start();
i2c_write(0xa0);
i2c_write(direccionl);
i2c_write(direccionh);
i2c_start();
i2c_write(0xa1);
cosa=i2c_read(0);
i2c_stop();
return cosa;
}

int adcx(int canal){
int valu;
setup_adc_ports(AN0_TO_AN11|VSS_VDD );
setup_adc(ADC_CLOCK_INTERNAL );
set_adc_channel(canal );//1
delay_us(20);
Read_ADC(ADC_START_ONLY);
delay_us(20);
valu=read_adc(ADC_READ_ONLY);
setup_adc( ADC_OFF );
return(valu);
}

void mandar(int variable){ // funcion que me manda por serail un numero de 3 digitos
int impreso[3];
impreso[0]=variable%10;
variable=variable/10;
impreso[1]=variable%10;
variable=variable/10;
impreso[2]=variable%10;
putc(impreso[2]+0x30);
putc(impreso[1]+0x30);
putc(impreso[0]+0x30);
putc(',');
}

void main()
{
set_tris_b(0b10000000);
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_OFF|ADC_TAD_MUL_0);
setup_psp(PSP_DISABLED);
setup_wdt(WDT_OFF);
setup_timer_0(RTCC_INTERNAL);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
setup_oscillator(False);

for(;;){
a=input(PIN_b0);
b=input(pin_d0);
d=input(pin_d1);

if(a==0){ //Aqui guardo un valor arbitario en la memoria
dir=dir+1;
i=i+1;
mandar(i);
dirh=(dir&0xff00);
dirl=(dir&0x00ff);
escribireeprom(dirh,dirl,i*(i-1));
OUTPUT_HIGH(PIN_b7);
OUTPUT_low(PIN_d2);
delay_ms(1000);
}

if(b==0){ //leo la memoria y mando por serial
for(dir=i;dir>0;dir--){
delay_ms(100);
dirh=(dir&0xff00);
dirl=(dir&0x00ff);
c=leereeprom(dirh,dirl);
mandar(c);
}
OUTPUT_low(PIN_b7);
OUTPUT_HIGH(PIN_d2);
delay_ms(1);
}



if(d==0){ //hago la conversion
delay_ms(1000);
conversion=adcx(7);
mandar(conversion);
}

}

}



como dije el programa funciona bien mientars solo utilice una de las 2( i2c o adc) al usar las 2 se bloquea
 
Atrás
Arriba