TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: sebastian.m en 16 de Febrero de 2010, 14:00:12

Título: Problemas con PIC18LF13K50 y libreria flex_lcd.c
Publicado por: sebastian.m en 16 de Febrero de 2010, 14:00:12
Buenas Tardes a todos. Soy nuevo en esto de publicar en los foros asi que por favor tengan un poco de paciencia conmigo.
Bueno la idea es que estoy utilizando un PIC18LF13K50 porque estoy haciendo un trabajo con zigbee. Para esto necesito visualizar unos datos por lcd utilizando los pines RB5,RB6,RB7 para E,RW,RS respectivamente y los pines RC2:RC5 para D4:D7 respectivamente, y para hacer esto utilizo la libreria flex_lcd.c. Utilizo estos pines pues los otros los tengo ocupados con otras funciones. El problema es que ni siquiera logro mostrar un simple mensaje de "hola" por el lcd.

Al compilar el programa en ccs me compila bien sin ningun problema , pero cuando simulo en proteus me saca un error que no entiendo muy bien. Si alguien me puede ayudar le agradeceria inmensamente.

En el archivo adjunto esta el error que me saca el proteus

PD:el PIC18LF13K50 solo tiene los pines PORTA (RA0,RA1,RA3,RA5) PORTB(RB4:RB7) PORTC(RC0:RC7) no se si esto influya en algo

ESTE ES EL CODIGO DEL PROGRAMA

#include <18LF13K50.h>
#use delay(clock=4000000)
#define LCD_DB4   PIN_C4
#define LCD_DB5   PIN_C5
#define LCD_DB6   PIN_C6
#define LCD_DB7   PIN_C7

#define LCD_RS    PIN_B7
#define LCD_RW    PIN_B6
#define LCD_E     PIN_B5

#include <flex_lcd.c>      //Incluye la libreria para manejo de lcd

void main()

{
    lcd_init();
    lcd_putc("hola");

}

ESTA ES LA LIBRERIA FLEX_LCD.C QUE UTILIZO

// flex_lcd.c

// Change these pins to fit your own board.

//#define LCD_DB4 PIN_C4
//#define LCD_DB5 PIN_C5
//#define LCD_DB6 PIN_C6
//#define LCD_DB7 PIN_C7

//#define LCD_RS PIN_C0
//#define LCD_RW PIN_C1
//#define LCD_E  PIN_C2

// If you only want a 6-pin interface to your LCD, then
// connect the R/W pin on the LCD to ground, and comment
// out the following line.

//#define USE_LCD_RW 1

//========================================

#define lcd_type 2 // 0=5x7, 1=5x10, 2=2 lines
#define lcd_line_two 0x40 // LCD RAM address for the 2nd line


int8 const LCD_INIT_STRING[4] =
{
  0x20 | (lcd_type << 2), // Func set: 4-bit, 2 lines, 5x8 dots
  0xc, // Display on
  1, // Clear display
  6 // Increment cursor
};


//-------------------------------------
void lcd_send_nibble(int8 nibble)
{
  // Note: !! converts an integer expression
  // to a boolean (1 or 0).
  output_bit(LCD_DB4, !!(nibble & 1));
  output_bit(LCD_DB5, !!(nibble & 2));
  output_bit(LCD_DB6, !!(nibble & 4));
  output_bit(LCD_DB7, !!(nibble & 8));

  delay_cycles(1);
  output_high(LCD_E);
  delay_us(2);
  output_low(LCD_E);
}

//-----------------------------------
// This sub-routine is only called by lcd_read_byte().
// It's not a stand-alone routine. For example, the
// R/W signal is set high by lcd_read_byte() before
// this routine is called.

#ifdef USE_LCD_RW
int8 lcd_read_nibble(void)
{
  int8 retval;
  // Create bit variables so that we can easily set
  // individual bits in the retval variable.
  #bit retval_0 = retval.0
  #bit retval_1 = retval.1
  #bit retval_2 = retval.2
  #bit retval_3 = retval.3

  retval = 0;

  output_high(LCD_E);
  delay_cycles(1);

  retval_0 = input(LCD_DB4);
  retval_1 = input(LCD_DB5);
  retval_2 = input(LCD_DB6);
  retval_3 = input(LCD_DB7);

  output_low(LCD_E);

  return(retval);
}
#endif

//---------------------------------------
// Read a byte from the LCD and return it.

#ifdef USE_LCD_RW
int8 lcd_read_byte(void)
{
  int8 low;
  int8 high;

  output_high(LCD_RW);
  delay_cycles(1);

  high = lcd_read_nibble();

  low = lcd_read_nibble();

  return( (high<<4) | low);
}
#endif

//----------------------------------------
// Send a byte to the LCD.
void lcd_send_byte(int8 address, int8 n)
{
  output_low(LCD_RS);

#ifdef USE_LCD_RW
while(bit_test(lcd_read_byte(),7)) ;
#else
delay_us(60);
#endif

  if(address)
  output_high(LCD_RS);
  else
  output_low(LCD_RS);

  delay_cycles(1);

#ifdef USE_LCD_RW
output_low(LCD_RW);
delay_cycles(1);
#endif

  output_low(LCD_E);

  lcd_send_nibble(n >> 4);
  lcd_send_nibble(n & 0xf);
}

//----------------------------
void lcd_init(void)
{
  int8 i;

  output_low(LCD_RS);

#ifdef USE_LCD_RW
output_low(LCD_RW);
#endif

  output_low(LCD_E);

  delay_ms(15);

  for(i=0 ;i < 3; i++)
  {
    lcd_send_nibble(0x03);
    delay_ms(5);
  }

  lcd_send_nibble(0x02);

  for(i=0; i < sizeof(LCD_INIT_STRING); i++)
  {
    lcd_send_byte(0, LCD_INIT_STRING);

    // If the R/W signal is not used, then
    // the busy bit can't be polled. One of
    // the init commands takes longer than
    // the hard-coded delay of 60 us, so in
    // that case, lets just do a 5 ms delay
    // after all four of them.
#ifndef USE_LCD_RW
delay_ms(5);
#endif
}

}

//----------------------------

void lcd_gotoxy(int8 x, int8 y)
{
  int8 address;

  if(y != 1)
  address = lcd_line_two;
  else
  address=0;

  address += x-1;
  lcd_send_byte(0, 0x80 | address);
}

//-----------------------------
void lcd_putc(char c)
{
  switch(c)
  {
    case '\f':
      lcd_send_byte(0,1);
      delay_ms(2);
      break;

    case '\n':
      lcd_gotoxy(1,2);
      break;

    case '\b':
      lcd_send_byte(0,0x10);
      break;

    default:
      lcd_send_byte(1,c);
      break;
  }
}

//------------------------------
#ifdef USE_LCD_RW
char lcd_getc(int8 x, int8 y)
{
  char value;

  lcd_gotoxy(x,y);

  // Wait until busy flag is low.
  while(bit_test(lcd_read_byte(),7));

  output_high(LCD_RS);
  value = lcd_read_byte();
  output_low(lcd_RS);

  return(value);
}
#endif

void lcd_setcursor_vb(short visible, short blink) {
  lcd_send_byte(0, 0xC|(visible<<1)|blink);
}






Título: Re: Problemas con PIC18LF13K50 y libreria flex_lcd.c
Publicado por: MarkKnopfler81 en 09 de Marzo de 2010, 08:12:02
Buenas sebastian.m
Hace unos dias del post pero por si te sirve....
El problema que veo es que estás definiendo los pines de Data para C<4:7> y tu comentas que utilizas los pines C<2:5>

Prueba a cambiar esto:
Código: [Seleccionar]
#define LCD_DB4   PIN_C4
#define LCD_DB5   PIN_C5
#define LCD_DB6   PIN_C6
#define LCD_DB7   PIN_C7

por esto:

Código: [Seleccionar]
#define LCD_DB4   PIN_C2
#define LCD_DB5   PIN_C3
#define LCD_DB6   PIN_C4
#define LCD_DB7   PIN_C5

Saludos.
Título: Re: Problemas con PIC18LF13K50 y libreria flex_lcd.c
Publicado por: fidodido18 en 09 de Marzo de 2010, 11:29:02
para mi el problema esta en que declaras dos veces los pines de control del LCD, es decir lo declaras en el programa principal y después en la librería de diferentes formas.
Código: [Seleccionar]
#define LCD_RS    PIN_B7
#define LCD_RW    PIN_B6
#define LCD_E     PIN_B5
Título: Re: Problemas con PIC18LF13K50 y libreria flex_lcd.c
Publicado por: MarkKnopfler81 en 09 de Marzo de 2010, 11:44:33
para mi el problema esta en que declaras dos veces los pines de control del LCD, es decir lo declaras en el programa principal y después en la librería de diferentes formas.
Código: [Seleccionar]
#define LCD_RS    PIN_B7
#define LCD_RW    PIN_B6
#define LCD_E     PIN_B5


No fidodido18, fijate que en la librería está comentado:

Código: [Seleccionar]
//#define LCD_RS PIN_C0
//#define LCD_RW PIN_C1
//#define LCD_E  PIN_C2

saludos.
Título: Re: Problemas con PIC18LF13K50 y libreria flex_lcd.c
Publicado por: sebastian.m en 09 de Marzo de 2010, 18:14:07
amigos muchas gracias por sus ayudas pero ya tenia tiempo de solucionado el problema. Al final resulto ser un problema de ruido, por lo que agregue un poco de hardware para quitar el ruido e hice una limpieza de los puertos antes de empezar y con esto quedo solucionado. De todas formas muchas gracias a todos