Autor Tema: problema al activar resistencias pullups de PIC18F4550  (Leído 2791 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado clavo182

  • PIC10
  • *
  • Mensajes: 15
problema al activar resistencias pullups de PIC18F4550
« 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)
Código: [Seleccionar]
#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);
     }
     
   }
   
}

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:problema al activar resistencias pullups de PIC18F4550
« Respuesta #1 en: 30 de Noviembre de 2015, 19:06:47 »
Si podes proveer una imagen con el esquematico creo que seria mas util para todos. Ya que muchos (como yo ) no usan Proteus

Desconectado clavo182

  • PIC10
  • *
  • Mensajes: 15
Re:problema al activar resistencias pullups de PIC18F4550
« Respuesta #2 en: 01 de Diciembre de 2015, 09:11:01 »
Esta son las imagenes, cuando estan desactivado y activados las resistencias pullups

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:problema al activar resistencias pullups de PIC18F4550
« Respuesta #3 en: 01 de Diciembre de 2015, 09:26:52 »
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 )
« Última modificación: 01 de Diciembre de 2015, 09:30:05 por KILLERJC »

Desconectado clavo182

  • PIC10
  • *
  • Mensajes: 15
Re:problema al activar resistencias pullups de PIC18F4550
« Respuesta #4 en: 01 de Diciembre de 2015, 09:56:47 »
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