Tenes un problema ... y es que crees que la interrupcion podes hacer cualquier cosa, y meter delays etc. Antes de tratar eso voy a intentar omitir esta linea de programa:
lcd_puts("Danielito te amo");
La cual asume un gran amor por vos mismo
, y que me parecio raro encontrar algo asi cuando compartis el proyecto. Ahora si que lo evitamos, vamos al tema de las interrupciones:
Tenes que entender que es una interrupcion, la idea de una interrupcion es que al ocurrir se ejecute rapidamente y luego continue el programa principal, sin afectarlo en "tiempos", es decir deberia ser lo mas rapido posible, y ademas cuando hay en proceso una interrupcion deshabilita las demas globalmente, esto es de vital importancia si queres hacer funcionar algo. NUNCA pero NUNCA tardes en una interrupcion, por que mientras mas tardas, mas tardas cualquier otra interrupcion. Veamos tu codigo y voy a remarcar en negrita lo que tarda y que no deberia estar en una interrupcion:
(Lo puse en un quote para poder marcarlo en negrita)
ISR(TIMER1_OVF_vect){
PORTB |=(1<<PB1);
cli();
ADCSRA |=((1<<ADEN)|(1<<ADSC));//enciendo y inicio la conversion
while(ADCSRA&(1<<ADSC)); //me quedo esperando a que termine la conversion
ADCSRA&=~(1<<ADEN); //Apago el conversor despues de terminada la conversion
Valor_adc=ADC; //ADC es un registro de 16 Bits formados por ADCL y ADCH
temp1=(float)Valor_adc*(240)/1024;
//temp1=temp1-9.5;
sprintf(mensaje_temp_1,"Temp1 %.1f C",temp1);
_delay_ms(100);
PORTB &=~(1<<PB1);
_delay_ms(100);
PORTB |=(1<<PB1);
ADMUX |= ((1<<MUX0)|(1<<MUX2)); // canal de entrada 5 pin28 del micro
ADCSRA |=((1<<ADEN)|(1<<ADSC));//enciendo y inicio la conversion
while(ADCSRA&(1<<ADSC)); //me quedo esperando a que termine la conversion
ADCSRA&=~(1<<ADEN); //Apago el conversor despues de terminada la conversion
Valor_adc_1=ADC; //ADC es un registro de 16 Bits formados por ADCL y ADCH
temp2=(float)Valor_adc_1*(240)/1024;
//temp2=temp2-9.5;
sprintf(mensaje_temp_2,"Temp2 %.1f C",temp2);
ADMUX&=~((1<<MUX0)|(1<<MUX2));//selecciono nuevamente canal 0
_delay_ms(100);
PORTB &=~(1<<PB1);
lcd_clrscr();
lcd_puts(mensaje_temp_1);
if (Valor_adc > 143)
{
PORTB |=(1<<PB0);
}
else{
PORTB &=~(1<<PB0);
}
lcd_gotoxy(0,1);
lcd_puts(mensaje_temp_2);
_delay_ms(1000);
TCNT1= 57722; //1 seg
//TCNT1= 26472; //5 seg
sei();
}
Resumen, lo que vos deberias estar haciendo en la rutina principal lo estas haciendo en la interrupcion, y ese es tu problema.
Tratas de crear una interrupcion de 1 segundo y aun asi tenes puesto en delays 1.4s sin contar las operaciones con flotantes que son "intensivos" en un Microcontrolador que no poseen modulo para esto, divisiones, multiplicaciones, y tambien LCD que suelen tenes bastantes delays entre medio solo para enviar datos al LCD, ni contar lo que se tarda en convertir de un flotante a un string. Y si fuera el colmo, 2 while dentro.
Es decir solo tenes que realizar operaciones simples. Nada mas. tal ves activar un flag ( un bit ) para avisarle al programa principal que hago lo que debe hacer.
Otra de las cosas es que no tenes que desactivar y activar las interrupciones con cli() y sei(), el mismo micro cuando entra a una interrupcion se desactiva la interrupcion global, es decir pone a 0 el bit de las interupciones globales haciendo que dentro de la interrupcion no pueda existir OTRA interrupcion que lo saque de alli. Cuando se termina la interrupcion hay una instruccion especial que ademas de volver a donde estaba activa las interrupciones globales, asi que nunca nunca pongas un cli() o sei() dentro de la interrupcion. El mismo micro y el compilador se encargan de esto.
Intenta mover eso a tu rutina principal ( el while(1) ) e intentar depender menos de los delays, esos 2 consejos van a llevar que tu prorgama y cualquier programa funcione mucho mejor.