Resulta que tengo el siguiente código, pretende ser el control de una incubadora y resulta que cuando desactivo las resistencias pull-up para el puerto B deja de funcionar la pantalla LCD y si las activo lo que no me funciona es el control dimmer, esto lo hago en el proteus y no se si esta mal el código o puede ser fallo del proteus.
#include <16F876.h>
#include <internal_eeprom.c>
#use delay(clock=4000000)
#fuses XT,NOWDT,NOPUT,NOLVP,NOBROWNOUT,NOCPD,NOWRT,NODEBUG
#define use_portb_lcd TRUE
#include "flex_lcd_.c"
#include <sht11.h>
int16 contador;
//************ variables dimmer ****************************
int pasada2=0;
long int muestra2=0;
int j=0;
int contadora2=1;
int intervalador2=1;
int auxiliar2=0;
//**********************************************************
//******************** dimmer ******************************
// Interrupción del TIMER1, encargado de calcular el tiempo de un semiciclo constantemente.
#INT_TIMER1
void temporizador()
{
set_timer1(0);
}
// Interrupción del TIMER0, provoca el retardo deseado antes de la excitación
#INT_timer0
void tempo()
{
output_high(PIN_C4); // Ha transcurrido el tiempo, activo la salida
}
// Interrupción Externa, provocada por el paso por 0V de la señal de entrada
#INT_EXT
void externa()
{
if (j==0){
output_high(PIN_B1);
j=1;
ext_int_edge(H_TO_L); // Cambio la detección del flanco, para que la proxima sea de bajada
}
else {
output_low(PIN_B1);
j=0;
ext_int_edge(L_TO_H); // La próxima interrupción será de subida
}
if (pasada2==0){
enable_interrupts(INT_TIMER1); // Activo la cuenta
set_timer1(0); // Comenzando desde cero
pasada2=1;
}
else if (pasada2==1){
muestra2=get_timer1(); // Tiempo medido entre dos pasos por 0 sucesivos
set_timer1(0); // Inicio el Timer1 para una nueva cuenta
intervalador2=(muestra2/8); // Equiparo los preescaler, y por tanto las unidades de tiempo de TIMER1 y timer0.
// 8 unidades de TIMER1 equivalen a 1 de timer0
auxiliar2=(intervalador2/4); // Divido el tiempo de un semiciclo en 4 (por ejemplo).
intervalador2=256-auxiliar2; // Este es el valor final a cargar el el timer0, con esto retardo la señal 1/4 de su semiperido
enable_interrupts(INT_timer0);
//set_timer0(intervalador);
set_timer0(200);
output_low(PIN_C4); // Pongo a 0 la salida, y comienza el retardo
}
}
//*********************************************************************
// Interrupción del TIMER2, encargado de calcular el tiempo de un semiciclo constantemente.
#INT_TIMER2
void INTERRUPTION()
{
contador ++;
set_timer2(0);
}
//#byte port_c=0x07
//******************************************************************************
// input(pin_C0) Pulsador de menu y ok
// input(pin_C1) Pulsador de flecha abajo (mas)
// input(pin_C2) Pulsador de flecha arriba (menos)
//******************************************************************************
short actualizar;
typedef union
{
int16 i;
float f;
} valor;
valor humedad, temperatura;
byte errorsht11,checksum;
unsigned test=1;//, i;
int8 testado;
float T, H;
int16 X, Y, V, X1;
// RUTINA SONDA
void sonda(){
errorsht11=0;
errorsht11+=sht11_medicion((byte*) &humedad.i, &checksum, HUMI); //measure humidity
errorsht11+=sht11_medicion((byte*) &temperatura.i, &checksum, TEMP); //measure temperature
if(errorsht11!=0) //in case of an error: connection reset
{
printf(lcd_putc,"\n\rerror:%U", errorsht11);
sht11_hard_reset();
}
else
{
humedad.f=(float)humedad.i; //converts integer to float
temperatura.f=(float)temperatura.i; //converts integer to float
sht11_calculos(&humedad.f, &temperatura.f); //calculate humidity, temperature
}
//lcd_gotoxy(1,1);
//printf(lcd_putc," Temp. Humedad");
//lcd_gotoxy(0,2);
//printf(lcd_putc," %2.2f",temperatura.f);
IF (temperatura.f < (read_float_eeprom(1))) output_high(pin_A0);
IF (temperatura.f > (read_float_eeprom(1))) output_low(pin_A0);
IF (humedad.f < (read_float_eeprom(10)-1)) output_high(pin_A1);
IF (humedad.f > (read_float_eeprom(10)+1)) output_low(pin_A1);
lcd_send_byte(1,0b11011111);
//printf(lcd_putc,"C %2.2f%%HR",humedad.f);
actualizar=true;
delay_ms(100);
}
// RUTINA MENU PRINCIPAL
void menus()
{
switch (testado){
case 1:
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("1 Temperatura");
break;
case 2:
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("2 Humedad");
break;
case 3:
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("3 Volteo");
break;
case 4:
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("4 Salir");
break;
}
}
// RUTINA MENU SECUNDARIO
void menus2()
{
switch (testado){
case 1:
delay_ms(100);
T=read_float_eeprom(1);
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("Set Grados ");
lcd_putc(223);
//for(i=200;i!=255;i++)
//{
//lcd_gotoxy(1,1);
//lcd_putc(i);
//printf(lcd_putc,"%u",i);
//delay_ms(1000);
//};
lcd_putc("C");
lcd_gotoxy(5,2);
printf(lcd_putc,"%1.1f",T);
while(input(pin_C0))
{
delay_ms(50);
if (!input(pin_C1)) //veo si se presiono xxxxx
{
delay_ms(50);
while (!input(pin_C1)); //si es asi, espero a que se libere
T=T+0.10;
if (T>40) T=15.00;
lcd_gotoxy(5,2);
printf(lcd_putc,"%1.1f",T);
}
if (!input(pin_C2)) //veo si se presiono xxxxx
{
delay_ms(50);
while (!input(pin_C2)); //si es asi, espero a que se libere
T=T-0.10;
if (T<15) T=40.00;
lcd_gotoxy(5,2);
printf(lcd_putc,"%1.1f",T);
}
}
while (!input(pin_C0));
write_float_eeprom(1,T);
break;
case 2:
delay_ms(100);
H=read_float_eeprom(10);
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("Set Humedad %");
lcd_gotoxy(5,2);
printf(lcd_putc,"%1.1f",H);
while(input(pin_C0))
{
delay_ms(50);
if (!input(pin_C1)) //veo si se presiono xxxxx
{
delay_ms(50);
while (!input(pin_C1)); //si es asi, espero a que se libere
H=H+0.10;
if (H>90) H=20.00;
lcd_gotoxy(5,2);
printf(lcd_putc,"%1.1f",H);
}
if (!input(pin_C2)) //veo si se presiono xxxxx
{
delay_ms(50);
while (!input(pin_C2)); //si es asi, espero a que se libere
H=H-0.10;
if (H<20) H=90.00;
lcd_gotoxy(5,2);
printf(lcd_putc,"%1.1f",H);
}
}
while (!input(pin_C0));
write_float_eeprom(10,H);
break;
case 3:
delay_ms(100);
V=read_eeprom(20);
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("Set Volteo minu-");
lcd_gotoxy(1,2);
lcd_putc("tos");
lcd_gotoxy(5,2);
printf(lcd_putc,"%3lu",V);
while(input(pin_C0))
{
delay_ms(50);
if (!input(pin_C1)) //veo si se presiono xxxxx
{
delay_ms(50);
while (!input(pin_C1)); //si es asi, espero a que se libere
V++;
if (V>120) V=0;
lcd_gotoxy(5,2);
printf(lcd_putc,"%3lu",V);
}
if (!input(pin_C2)) //veo si se presiono xxxxx
{
delay_ms(50);
while (!input(pin_C2)); //si es asi, espero a que se libere
V--;
if (V==-1) V=120;
if (V<0) V=120;
lcd_gotoxy(5,2);
printf(lcd_putc,"%3lu",V);
}
}
while (!input(pin_C0));
write_eeprom(20,V);
contador = 0;
break;
case 4:
test=0;
break;
}
}
// RUTINA PULSADOR
void pulsador()
{
menus();
delay_ms(100);
while(input(pin_C0))
{
delay_ms(50);
if (!input(pin_C1)) //veo si se presiono xxxxx
{
delay_ms(50);
while (!input(pin_C1)); //si es asi, espero a que se libere
testado++;
if(testado>4){testado=1;}
menus();
}
if (!input(pin_C2)) //veo si se presiono xxxxx
{
delay_ms(50);
while (!input(pin_C2)); //si es asi, espero a que se libere
testado--;
if(testado==0){testado=4;}
menus();
}
}
while (!input(pin_C0));
menus2();
//pulsador();
}
void main()
{
//*********************************************************************************************************************
setup_timer_2(T2_DIV_BY_16,255,16);
set_timer2(0);
setup_timer_1(T1_INTERNAL | T1_DIV_BY_8);
setup_timer_0(RTCC_INTERNAL | RTCC_DIV_64); // Programacion timer0
ENABLE_INTERRUPTS(GLOBAL); // Habilita todas las interrupciones.
ENABLE_INTERRUPTS(INT_TIMER2);
ENABLE_INTERRUPTS(INT_EXT);
ENABLE_INTERRUPTS(INT_RTCC); // Habilita interrupcion timer0.
ENABLE_INTERRUPTS(INT_TIMER1);
//*********************************************************************************************************************
ext_int_edge(L_TO_H);
// port_b_pullups(true);
setup_adc_ports(NO_ANALOGS);
actualizar=true;
lcd_init();
sht11_hard_reset();;
testado=1;
while(true)
{
V=read_eeprom(20);
X1=V*10;
X=1*X1;
Y=2*X1;
IF (contador > X){
OUTPUT_HIGH(PIN_A2);
}
IF (contador > Y){
OUTPUT_LOW(PIN_A2);
contador = 0;
}
//lcd_gotoxy(0,2);
//printf(lcd_putc,"%5lu",contador);
//printf(lcd_putc,"%4lu",X);
//printf(lcd_putc,"%4lu",Y);
//SET_RTCC(131);// RESET_RTCC;
if (actualizar)
{
sonda();
lcd_gotoxy(1,1);
printf(lcd_putc," Temp. Humedad");
lcd_gotoxy(0,2);
printf(lcd_putc," %2.2f",temperatura.f);
printf(lcd_putc,"C %2.2f%%HR",humedad.f);
}
if (!input(pin_C0))
{
delay_ms(50);
while (test){pulsador();}
}
test=1;
testado=1;
}
}