Ejemplo de librería lcd_sdcc_sgr.h

Ver el tema anterior Ver el tema siguiente Ir abajo

Ejemplo de librería lcd_sdcc_sgr.h

Mensaje por JosePablo el Sáb 28 Mar 2009 - 5:26

Hola.

Compañero no tendras por ahi un ejemplo de como usar esta librería? Estoy tratando de compilar y me da el siguiente error:

sdcc -mpic16 -p18f4550 -V --debug -I/home/jose/EbertoPiklab/SDCC/ -c LCD.c
+ "/usr/bin/sdcpp" -nostdinc -Wall -std=c99 -I"/home/jose/EbertoPiklab/SDCC/" -Dpic18f4550 -D__18f4550 -DSTACK_MODEL_SMALL -obj-ext=.o -DSDCC_MODEL_SMALL -DSDCC=270 -DSDCC_pic16 -D__pic16 -I"/usr/bin/../share/sdcc/include/pic16" -I"/usr/share/sdcc/include/pic16" -I"/home/jose/EbertoPiklab/SDCC/" "LCD.c"
error 20: Undefined identifier 'DATOT'
lcd_sdcc_sgr.h:107: error 20: Undefined identifier 'DATOT'
lcd_sdcc_sgr.h:107: error 20: Undefined identifier 'RW'
lcd_sdcc_sgr.h:109: error 20: Undefined identifier 'EN'
lcd_sdcc_sgr.h:110: error 20: Undefined identifier 'DATOP'
lcd_sdcc_sgr.h:111: error 20: Undefined identifier 'EN'
lcd_sdcc_sgr.h:113: error 20: Undefined identifier 'EN'
lcd_sdcc_sgr.h:114: error 20: Undefined identifier 'DATOP'
lcd_sdcc_sgr.h:115: error 20: Undefined identifier 'EN'
lcd_sdcc_sgr.h:122: error 20: Undefined identifier 'RS'
lcd_sdcc_sgr.h:135: error 20: Undefined identifier 'RW'
error 20: Undefined identifier 'DATOT'
lcd_sdcc_sgr.h:135: error 20: Undefined identifier 'DATOT'
error 20: Undefined identifier 'DATOP'
lcd_sdcc_sgr.h:137: error 20: Undefined identifier 'DATOP'
error 20: Undefined identifier 'DATOP'
lcd_sdcc_sgr.h:138: error 20: Undefined identifier 'DATOP'
lcd_sdcc_sgr.h:139: error 20: Undefined identifier 'EN'
lcd_sdcc_sgr.h:140: error 20: Unde
lcd_sdcc_sgr.h:140: error 20: Undefined identifier 'EN'
error 20: Undefined identifier 'DATOP'
lcd_sdcc_sgr.h:144: error 20: Undefined identifier 'DATOP'
error 20: Undefined identifier 'DATOP'
lcd_sdcc_sgr.h:145: error 20: Undefined identifier 'DATOP'
lcd_sdcc_sgr.h:146: error 20: Undefined identifier 'EN'
lcd_sdcc_sgr.h:147: error 20: Undefined identifier 'EN'
lcd_sdcc_sgr.h:154: error 20: Undefined identifier 'RS'
lcd_sdcc_sgr.h:160: error 20: Undefined identifier 'RS'
lcd_sdcc_sgr.h:172: error 20: Undefined identifier 'DATOT'
lcd_sdcc_sgr.h:173: error 20: Undefined identifier 'DATOP'

*** Salida con estado: 1 ***

Estoy tratando de compilar lo siguiente:
/* ----------------------------------------------------------------------- */
/* Template source file generated by piklab */
#include <pic18f4550.h>
#include "lcd_sdcc_sgr.h"
/* ----------------------------------------------------------------------- */
/* Bits de configuración: adapte los parámetros a su necesidad */
code char at __CONFIG1L CONFIG1L = _PLLDIV_NO_DIVIDE__4MHZ_INPUT__1L & _CPUDIV__OSC1_OSC2_SRC___1__96MHZ_PLL_SRC___2__1L & _USBPLL_CLOCK_SRC_FROM_OSC1_OSC2_1L;
code char at __CONFIG1H CONFIG1H = _OSC_EC__EC_CLKO_RA6___USB_EC_1H & _FCMEN_OFF_1H & _IESO_OFF_1H;
code char at __CONFIG2L CONFIG2L = _PUT_OFF_2L & _BODEN_ON_2L & _BODENV_2_0V_2L & _VREGEN_OFF_2L;
code char at __CONFIG2H CONFIG2H = _WDT_ON_2H & _WDTPS_1_32768_2H;
code char at __CONFIG3H CONFIG3H = _CCP2MUX_RC1_3H & _PBADEN_PORTB_4_0__CONFIGURED_AS_ANALOG_INPUTS_ON_RESET_3H & _LPT1OSC_OFF_3H & _MCLRE_MCLR_ON_RE3_OFF_3H;
code char at __CONFIG4L CONFIG4L = _STVR_ON_4L & _LVP_ON_4L & _ENICPORT_OFF_4L & _ENHCPU_OFF_4L & _BACKBUG_OFF_4L;
code char at __CONFIG5L CONFIG5L = _CP_0_OFF_5L & _CP_1_OFF_5L & _CP_2_OFF_5L & _CP_3_OFF_5L;
code char at __CONFIG5H CONFIG5H = _CPB_OFF_5H;
code char at __CONFIG6L CONFIG6L = _WRT_0_OFF_6L & _WRT_1_OFF_6L & _WRT_2_OFF_6L & _WRT_3_OFF_6L;
code char at __CONFIG6H CONFIG6H = _WRTC_OFF_6H & _WRTB_OFF_6H;
code char at __CONFIG7L CONFIG7L = _EBTR_0_OFF_7L & _EBTR_1_OFF_7L & _EBTR_2_OFF_7L & _EBTR_3_OFF_7L;
code char at __CONFIG7H CONFIG7H = _EBTRB_OFF_7H;

void main() {
/* << agregue el código >> */

}

Como puede apreciar no hace nada, la idea es solo compilarlo así e ir añadiendo las funciones paso a paso en principio debería compilar pero me da el error ya antes mencionado.
Gracias y disculpa las molestías, de paso es la primera vez que trato de escribir un programa en sdcc asi que por favor tene paciencia. Very Happy

JosePablo
Participante
Participante

Mensajes: 22
Fecha de inscripción: 10/01/2009
Edad: 33
Localización: Costa Rica

Volver arriba Ir abajo

Re: Ejemplo de librería lcd_sdcc_sgr.h

Mensaje por Pikitin el Sáb 28 Mar 2009 - 6:54

Hola JosePablo.

La librería lcd_sdcc_sgr.h es para PIC16F y creo que tu estás usando PIC18F... no?

Si es así esa no te vá a servir, mira en este post a ver si encuentras algo:
http://pic-linux.forosactivos.net/sdcc-f1/librerias-y-ejemplos-para-sdcc-t1.htm

Para 18F hay bastantes cosas por la web, si encuentras algo y compruebas que funciona estaría bién que postearas el link o el código de la librería.

De todas formas el error que te dá es por no definir los pines que controlan el lcd, en caso de que quieras usarla con 16F, aquí tienes un ejemplo:
http://pic-linux.forosactivos.net/sdcc-f1/lcd-44780-4-bits-para-pic16f-driver-y-ejemplo-t5.htm

En cualquier caso al principio del archivo tienes una sección que la puedes copiar y pegar a tu programa para definir los pines.


Saludos.

Pikitin
veterano
veterano

Mensajes: 623
Fecha de inscripción: 26/11/2008

http://linuxmicros.blogspot.com/

Volver arriba Ir abajo

Librería probado en 18F4550

Mensaje por JosePablo el Miér 1 Abr 2009 - 23:29

Hola.
Ya la probé en un pic 18F4550 y funciona bastante bien. El único problema que me da es que al inicializar el LCD, se muestra una serie de caractéres estaños. Yo lo probe haciendo lo siguiente:

void main() {
char hi[]= " CONTROL REMOTO";
char bye[]=" DETECTADO";
lcd_init();
while(true){
lcd_clear();
lcd_linea(hi, 1);
lcd_linea(bye, 2);
delay_ms(2000);
}
}


agregé este método a la librería:

void lcd_linea(unsigned char *car, char lin)
{
switch(lin){
case(1):
lcd_comand(linea1);
lcd_car(car);
break;
case(2):
lcd_comand(linea2);
lcd_car(car);
break;
}
}

y utilicé este método que tomé de otro ejemplo:

void delay_ms(long ms)
{
long i;
while (ms--){
for (i=0; i < 330; i++){
;
}
}
}

no estoy seguro de los tiempos de retardo (delay), no me parece que estén bien ajustados. Si alguién tiene alguna idea de como ajustarlos de manera más precisa se le agradece el comentario. De paso como se hace para hacer un método delay_cyles(num);, supongo que en ensamblador pero no soy muy diestro en ensamblador del PIC.
Gracias

JosePablo
Participante
Participante

Mensajes: 22
Fecha de inscripción: 10/01/2009
Edad: 33
Localización: Costa Rica

Volver arriba Ir abajo

Re: Ejemplo de librería lcd_sdcc_sgr.h

Mensaje por arcachofo el Jue 2 Abr 2009 - 1:55

Hola JosePablo.

Me alegro de que la librería funcione más o menos bien en PIC18F.

La mayoría de los problemas con el lcd suelen venir por los tiempos, esta librería pretende ser independiente de la velocidad del reloj utilizado, lo cual la puede hacer inexacta para ciertas velocidades, pero está hecha teniendo en cuenta los tiempos recomendados y a mí me ha funcionado a varias velocidades (menos a 4 MHz).
Para eso hay una rutina en asm que dá una pausa mínima de 9 ciclos de instrucción y otra que calcula cuantas pausas de estas hacen falta para hacer un delay en ms.
Estas funciones están justo al principio de la sección "FUNCIONES" (ver código a continuación).

Para eso es necesario conocer la velocidad de reloj para calcular los delays, que se tiene que defir en el programa:

#define FREQ 8000 // 8000 KHz = 8 Mhz, LA FRECUENCIA EN KHz.

Si has definido esto en tu programa con la velocidad de reloj utilizada, en principio debería funcionar.
Yo no conozco el asm de los 18F, pero supongo que serán compatibles, otra opción sería usar las funciones de delay que tiene SDCC para pic18f.


Código:

//----------------------- CONFIGURAR VARIABLES ---------------------------
//------------------------------------------------------------------------
unsigned char d;
unsigned char n;
unsigned char coms = FREQ / 4000;
unsigned char u9 = FREQ / 2000;
unsigned char pa = FREQ / 400;

//----------------------------- FUNCIONES --------------------------------
//------------------------------------------------------------------------

void pausa( unsigned char a )           
{    a;                //tiempo = (4a + 1)µs a>=2, para 4MHz
    _asm                // "a" ya está en w
    sublw 1   
    bucle:
    addlw 1
    btfss STATUS,0
    goto bucle
    _endasm;
}

void espera_ms( unsigned int ms )
{
    ms = ms * coms;
    while (ms > 0 )
    {
        pausa(247);
        ms--;
    }
}

La función: espera_ms( nº_de_ms ), se puede usar en el programa

Viendo de nuevo el código, creo que sería mejor cambiar estas tres lineas:
unsigned char coms = FREQ / 4000;
unsigned char u9 = FREQ / 2000;
unsigned char pa = FREQ / 400;

Por estas:
#define coms = FREQ / 4000;
#define u9 = FREQ / 2000;
#define pa = FREQ / 400;

No es necesario usar variables para eso.. no?

Otra cosa:
Esta función te dará delays distintos para distintas velocidades de reloj... no?:

void delay_ms(long ms)
{
long i;
while (ms--){
for (i=0; i < 330; i++){
;
}
}
}



Aquí tienes información acerca de la Inicialización del LCD:
http://www.geocities.com/dinceraydin/lcd/initalization.htm

arcachofo
Participante Activo
Participante Activo

Mensajes: 91
Fecha de inscripción: 26/11/2008

Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba

- Temas similares

Permisos de este foro:
No puedes responder a temas en este foro.