TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: clavo182 en 30 de Noviembre de 2015, 18:03:19
-
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);
}
}
}
-
Si podes proveer una imagen con el esquematico creo que seria mas util para todos. Ya que muchos (como yo ) no usan Proteus
-
Esta son las imagenes, cuando estan desactivado y activados las resistencias pullups
-
Y esto ocurre por que comentas o no esta linea:
port_b_pullups(TRUE);
????
El pull-up no deberia tener ningun efecto sobre el LCD, ya que este se maneja por otro puerto.
Con lo cual termina siendo 2 cosas:
- CCS , en alguna de sus librerias causa error algo, o esta generando mal el codigo por que falta definir no se que.
- Proteus, hace cualquier cosa. Lo cual es raro, ya que sino no deberia funcionar para nada.
Las causas son esas 2, solo por poner un registro a 1 ( y un bit mas a veces ) no te deberia modificar lo demas, te pedi los esquemas por que pense que utilizabas los mismos pines de portb para el teclado y LCD. Y no quedaba claro como estaba conectado, pero ahora que lo veo, no hay otra opcion. ( Tambien notar que RB1 y RB0 siguen en "alta impedancia" un absurdo total )
-
si, ya que sino pongo port_b_pullups(TRUE) todo va bien con el LCD, pero no tengo teclado...y si activo port_b_pullups(TRUE) ya tambien me quedo sin LCD...yo tambien creo que hay algo malo con las librerias de LCD o KBD que estoy usando