hola....estoy intentando realizar un proyecto, donde necesito de la interrupcion RB del pic18f4550 para meter datos por teclado y guardarlos como enteros, bueno hasta donde veo el programa me corre bien. el problema es a la hora de la simulacion, las resistencias pullups del pic me estropean la visualizacion del lcd, ya que el lcd lo necesito para mostrar datos que recibo por rs232, alguien que me pueda decir por que pasa esto, o es que me estoy olvidando de algo...les adjunto la simulacion(proteus 8.1)
#include <18f4550.h> //incluimos libreria de pic18f4550
#DEVICE HIGH_INTS=TRUE
#fuses XT,NOWDT,PUT,NOPROTECT,NODEBUG,NOBROWNOUT,NOLVP
# use delay(clock=4000000)//definimos un reloj de 4Mhz
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7)
#define use_portd_lcd TRUE
#define use_portb_kbd TRUE
#include <lcd.c>
#include <kbd.c>
#include <input.c>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>//incluimos libreria para uso de operaciones en memoria
int hum_max=70,hum_min=30,temp_max=25,temp_min=15,ilum_max=600,ilum_min=500;
int humedad, temperatura, iluminacion;
char cad_rx[4];
char hum_rx[3];
char temp_rx[3];
char ilum_rx[4];
char hum[3];
char temp[3];
char ilum[4];
char cad1[3];
char cad2[4];
char teclado;
int8 cont,i=0,j=0;
int8 bandera=0,bandera1=0,bandera2=0,bandera3=0;
#int_RB HIGH
void RB_isr()
{
teclado=kbd_getc();
if(teclado=='#')
{
bandera=1;
disable_interrupts(INT_RDA);
}
}
#int_RDA
void RDA_ISR() //interrupcion por recepcion
{
output_high(PIN_A0);
cad_rx[j]=getc();
if (cad_rx[j]=='\n')
{
if(cad_rx[0]=='H')
{
strcpy(hum_rx,cad_rx);
hum_rx[j+1]='\0';
bandera1=1;
}
if(cad_rx[0]=='T')
{
strcpy(temp_rx,cad_rx);
temp_rx[j+1]='\0';
bandera2=1;
}
if(cad_rx[0]=='I')
{
strcpy(ilum_rx,cad_rx);
ilum_rx[j+1]='\0';
bandera3=1;
}
disable_interrupts(INT_RDA);
}
j++;
}
void main () //inicio de programa principal
{
set_tris_a(0b0000000);//configuramos puerto a
output_low(PIN_A0);
output_low(PIN_A1);
lcd_init();
delay_ms(50);
port_b_pullups(TRUE);
kbd_init();
enable_interrupts(INT_RDA);
enable_interrupts(INT_RB);
enable_interrupts(GLOBAL);
while (TRUE) //entramos en un ciclo infinito
{
if(bandera1==1)
{
for(i=0;i<strlen(hum)-1;i++)
{
hum[i]=hum_rx[i+1];
}
hum[i]='\0';
humedad=atoi(hum);
lcd_gotoxy(5,1); //posicionamos cursor de lcd
printf(lcd_putc,"H=");//escribimos en lcd
lcd_gotoxy(7,1); //posicionamos cursor de lcd
printf(lcd_putc,"%d",humedad);//escribimos valor de temperatura en lcd
lcd_gotoxy(10,1); //posicionamos cursor de lcd
printf(lcd_putc,"%%");//escribimos en lcd
bandera1=0;
j=0;
output_high(PIN_A0);
if(humedad<hum_min)
{
puts("1");
delay_ms(10);
}
if(humedad>hum_max)
{
puts("2");
delay_ms(10);
}
enable_interrupts(INT_RDA);
}
if(bandera2==1)
{
for(i=0;i<strlen(temp)-1;i++)
{
temp[i]=temp_rx[i+1];
}
temp[i]='\0';
temperatura=atoi(temp);
lcd_gotoxy(1,2); //posicionamos cursor de lcd
printf(lcd_putc,"T=");//escribimos en lcd
lcd_gotoxy(3,2); //posicionamos cursor de lcd
printf(lcd_putc,"%d",temperatura);//escribimos valor de temperatura en lcd
lcd_gotoxy(5,2); //posicionamos cursor de lcd
printf(lcd_putc,"'C");//escribimos en lcd
bandera2=0;
j=0;
output_low(PIN_A0);
if(temperatura<temp_min)
{
puts("3");
delay_ms(10);
}
if(temperatura==19||temperatura==20)
{
puts("4");
delay_ms(10);
}
if(temperatura>temp_max)
{
puts("5");
delay_ms(10);
}
enable_interrupts(INT_RDA);
}
if(bandera3==1)
{
for(i=0;i<strlen(ilum);i++)
{
ilum[i]=ilum_rx[i+1];
}
ilum[i]='\0';
iluminacion=atoi(ilum);
lcd_gotoxy(8,2); //posicionamos cursor de lcd
printf(lcd_putc,"I=");//escribimos en lcd
lcd_gotoxy(10,2); //posicionamos cursor de lcd
printf(lcd_putc,"%u",iluminacion);//escribimos valor de temperatura en lcd
lcd_gotoxy(14,2); //posicionamos cursor de lcd
printf(lcd_putc,"lux");//escribimos en lcd
bandera3=0;
j=0;
output_low(PIN_A0);
enable_interrupts(INT_RDA);
}
if(bandera==1)//entramos para usar el teclado
{
cont=0;
while(cont<2)
{
lcd_gotoxy(1,1); //posicionamos cursor de lcd
printf(lcd_putc,"New_H_Min=");//escribimos en lcd
teclado=kbd_getc();
if(teclado!=0&&teclado!='#'&&teclado!='*')//obligamos que se ingrese numero
{
cad1[cont]=teclado;
lcd_gotoxy(13+cont,2);//posicionamos cursor de lcd
printf(lcd_putc,teclado);//escribimos valor de teclado en lcd
cont++;
}
}
cad1[cont]='\0';//ponemos 0 al final para poder convertirlo a entero
hum_min=atoi(cad1); //convertimos a entero
cont=0;
while(cont<2)
{
lcd_gotoxy(1,2); //posicionamos cursor de lcd
printf(lcd_putc,"New_H_Max=");//escribimos en lcd
delay_ms(50);
teclado=kbd_getc();
if(teclado!=0&&teclado!='#'&&teclado!='*')
{
cad1[cont]=teclado;
lcd_gotoxy(13+cont,2);//posicionamos cursor de lcd
printf(lcd_putc,teclado);//escribimos valor de humedad en lcd
cont++;
}
}
cad1[cont]='\0';
hum_max=atoi(cad1);
cont=0;
lcd_init();
while(cont<2)
{
lcd_gotoxy(1,1); //posicionamos cursor de lcd
printf(lcd_putc,"New_T_Min=");//escribimos en lcd
delay_ms(50);
teclado=kbd_getc();
if(teclado!=0&&teclado!='#'&&teclado!='*')
{
cad1[cont]=teclado;
lcd_gotoxy(13+cont,2);//posicionamos cursor de lcd
printf(lcd_putc,teclado);//escribimos valor de humedad en lcd
cont++;
}
}
cad1[cont]='\0';
temp_min=atoi(cad1);
cont=0;
while(cont<2)
{
lcd_gotoxy(1,2); //posicionamos cursor de lcd
printf(lcd_putc,"New_T_Max=");//escribimos en lcd
delay_ms(50);
teclado=kbd_getc();
if(teclado!=0&&teclado!='#'&&teclado!='*')
{
cad1[cont]=teclado;
lcd_gotoxy(13+cont,2);//posicionamos cursor de lcd
printf(lcd_putc,teclado);//escribimos valor de humedad en lcd
cont++;
}
}
cad1[cont]='\0';
temp_max=atoi(cad1);
cont=0;
lcd_init();
while(cont<3)
{
lcd_gotoxy(1,1); //posicionamos cursor de lcd
printf(lcd_putc,"New_I_Min=");//escribimos en lcd
delay_ms(50);
teclado=kbd_getc();
if(teclado!=0&&teclado!='#'&&teclado!='*')
{
cad2[cont]=teclado;
lcd_gotoxy(13+cont,2);//posicionamos cursor de lcd
printf(lcd_putc,teclado);//escribimos valor de humedad en lcd
delay_ms(50);
delay_ms(50);
cont++;
}
}
cad2[cont]='\0';
ilum_min=atoi(cad2);
cont=0;
while(cont<3)
{
lcd_gotoxy(1,2); //posicionamos cursor de lcd
printf(lcd_putc,"New_I_Max=");//escribimos en lcd
delay_ms(50);
teclado=kbd_getc();
if(teclado!=0&&teclado!='#'&&teclado!='*')
{
cad2[cont]=teclado;
lcd_gotoxy(13+cont,2);//posicionamos cursor de lcd
printf(lcd_putc,teclado);//escribimos valor de humedad en lcd
delay_ms(50);
cont++;
}
}
cad1[cont]='\0';
ilum_max=atoi(cad2);
cont=0;
lcd_init();
bandera=0;
enable_interrupts(INT_RDA);
}
}
}