TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: carafaelet en 02 de Mayo de 2008, 08:58:54
-
Compañeros me sale un error un tanto extraño al compilar: "Invalid option: +EXPORT" cuando intento compilar el codigo que expongo mas abajo (o quiza sea un problema de lcd2.c?), como podeis ver es uno de los ejemplos de PichScool de la firma Ingeniería de Microsistemas programados. Creo que esto de +EXPORT esta relacionado con las "Inherit golbal settings" que se encuentra en el menu: project --> Build options --> nombredelprograma.c. Alguien sabe a que se puede deber este error del compilador CCS?
// EJEMPLO 16
// Autor: Mikel Etxebarria
// (c) Ingeniería de Microsistemas Programados S.L.
// www.microcontroladores.com
// Bilbao 2006
//
//El manejo de la pantalla LCD
//
//Este ejemplo pretende introducirnos en el manejo de la pantalla LCD, para la visualización
//de diferentes mensajes (p.e. Hola).
#include <16f876A.h>
//Ajusta los valores de la palabra de configuración durante el ensamblaje:
//Protección de código y datos=OFF, LVP=OFF, WDT=OFF y OSC=XT
#fuses NOPROTECT,NOCPD,NOLVP,NOWDT,XT
// Con estas directivas las funciones "input" y "output_bit" no reprograman
// el pin de la puerta cada vez que son utilizadas. Si no se indica el
// modo fast_io se asume por defecto standard_io el cual reprograma el pin
// siempre antes de ser utilizadas estas funciones.
#use fast_io (A)
#use fast_io (B)
#use delay(clock=4000000)
#include <lcd2.c> //Incluir funciones de manejo del LCD
main()
{
SETUP_ADC_PORTS(NO_ANALOGS); //Puerta A Digital
set_tris_a(0x3F); //RA0-RA5 entradas
set_tris_b(0x00); //RB0-RB7 salidas
while(1)
{
lcd_init(); // Comandos de inicialización del LCD.
lcd_enviar(LCD_COMANDO,LCD_CURSOR_BLINK); // Envía comando al LCD
lcd_putc('H'); // Envía caracter al LCD.
lcd_putc('o');
lcd_putc('l');
lcd_putc('a');
lcd_putc(' ');
sleep();
}
}
Gracias.
-
Hola.
El codigo parece estar bien (no se como sea el codigo de la libreria para la LCD).
Por que no revisas en la opcion Proyect/Build Options y miras si en la casilla "Inherit global setting" si esta la configuracion "+DF +LN +T -A +M -Z +Y=9 +EA" ?
Chao
-
Gracias MLO_, en "Inherit global setting" tengo casi el mismo código que me pones, excepto en la letra A que tiene signo positivo en vez de negativo, es decir, el codigo que tengo aqui puesto es: +DF +LN +T +A +M -Z +Y=9 +EA Puede ser esto el causante del problema? Sinceramente, no se muy bien que es exactamente lo de inherit global settings y el sentido de cada una de las letras.. :?
-
hola, yo compilo con ccs y no tengo esa libreria, por que no pruebas a poner la lcd.c que es la que viene de normal con el ccs a ver si asi te funciona.
-
Hola carafaelet, pues prueba a ver si es eso. El significado de las letricas esta en el manual del CCS .... de persistir el error, estoy de acuerdo con juanez en cambiar la libreria de la LCD..... uno nunca sabe no?
Chao
-
:( Nada, ya he probado ambas cosas y sigue saliendome el mismo error. He cambiado las iherit.. y he probado con la libreria LCD.C que viene con el compilador pero nada.. El motivo de estar hecho originalmente con una libreria lcd distinta es porque la otra esta adaptada a un lcd en concreto, a las características que vienen en el datasheet de dicho lcd, para asi poder probar y experimentar en la propia lcd y el pic. Se trata de una de estas pcb con multiples periféricos para el aprendizaje de programación de PICs..
-
Hola.
Pues, estube revisando un poco lo de las opciones del CCS para la MCU (Multiple Compilation Unit), y ahi aparece la directiva de compilacion #EXPORT. Al colocar esta directiva junto con los respectivos criterios de la funcion, me corre bien, pero al colocar una criterio de funcion diferente a los permitidos me aparece un error raro.
Deduciendo de este fallo (que la verdad el fallo es mio por no poder usar bien el MCU), busca en el codigo a ver si esta esa directiva #EXPORT y, de estar por ahi, modifica los criterios de la funcion o comentalo y prueba de esa manera.
Revisaste la info en la ayuda del CCS para el significado de las letricas? Esta en Contenido\Overview\Invoking the Command Line Compiler
PD\\
Yo acostumbro a colocar el lcd_init() fuera del loop infinito (solo inicializo la LCD una vez).
Probe el codigo de tu programa y corre bien (con la libreria LCD.C)
-
Estube viendo lo de las letricas y veo que es como una configuración del compilador que estamos usando (segun en la familia de pic que estes trabajando, PCB PCM PCH...) asi como los ficheros que quieres o que no que te genere.. En cuanto a la directiva #EXPORT no la he encontrado en el código, es más, poniendo la libreria LCD.C y la inicialización del lcd fuera del loop me sale el mismo error, por lo que me hace pensar si serà algo que esta mal en la onfiguración del compilador y en principio no de las librerias lcd, de todas formas os expongo el código modificado por si veis algo. A ver si es identico al que has probado tu MLO_
Saludos.
#include <16f876A.h>
//Ajusta los valores de la palabra de configuración durante el ensamblaje:
//Protección de código y datos=OFF, LVP=OFF, WDT=OFF y OSC=XT
#fuses NOPROTECT,NOCPD,NOLVP,NOWDT,XT
// Con estas directivas las funciones "input" y "output_bit" no reprograman
// el pin de la puerta cada vez que son utilizadas. Si no se indica el
// modo fast_io se asume por defecto standard_io el cual reprograma el pin
// siempre antes de ser utilizadas estas funciones.
#use fast_io (A)
#use fast_io (B)
#use delay(clock=4000000)
#include <LCD.C> //Incluir funciones de manejo del LCD
main()
{
SETUP_ADC_PORTS(NO_ANALOGS); //Puerta A Digital
set_tris_a(0x3F); //RA0-RA5 entradas
set_tris_b(0x00); //RB0-RB7 salidas
lcd_init(); // Comandos de inicialización del LCD.
while(1)
{
lcd_enviar(LCD_COMANDO,LCD_CURSOR_BLINK); // Envía comando al LCD
lcd_putc('H'); // Envía caracter al LCD.
lcd_putc('o');
lcd_putc('l');
lcd_putc('a');
lcd_putc(' ');
sleep();
}
}
-
Hola.
Pues si, ese es el mismo codigo que a mi si me corre!!!!! Sabes que va a tocar? reinstalar el compilador a ver que sucede.
Saludos
-
Reinstalando el compilador seguia dandome el mismo error, por lo que he obtado por cambiar de versión. Y sorpresa, me salen 4 errores, 3 de los cuales son de tres instrucciones de su propia libreria de manejo del LCD.. :shock: Los errores concretamente son:
*** Error 12 "C:\ARCHIV~1\PICC\drivers\LCD.C" Line 91(29,30): Undefined identifier -- set_tris_d
*** Error 12 "C:\ARCHIV~1\PICC\drivers\LCD.C" Line 103(30,31): Undefined identifier -- set_tris_d
*** Error 12 "C:\ARCHIV~1\PICC\drivers\LCD.C" Line 133(28,29): Undefined identifier -- set_tris_d
*** Error 12 "D:\Els Meus Documents\Picschool\Ex 16\Ejem_16.c" Line 40(5,15): Undefined identifier -- lcd_enviar
No se.. igual el error es de mi programa y no de la libreria, os ha pasado esto a alguien? concretamente lo que no admite es: set_tris_lcd , es el mismo error en las lineas 91,103 y 133. Voy a continuar a ver si encuentro el error y el que me da también en mi codigo...
-
Hola.
El error que ahi te sale (el de la LCD) es porque estas usando el PORTD para conectar la LCD y el pic que usas no tiene PORTD, prueba pasarlo al PORTB (en la libreria de la LCD esta esa opcion) :-)
El ultimo error es porque no has colocado un #define lcd_putc lcd_enviar (cambias el nombre de la funcion lcd_putc a lcd_enviar )
Saludos
-
MLO_ El error del PORTD lo solucione de forma más drástica.. cambiando el pic por un 16F877A ejjeje... que este si que lleva puerto D. Incluí tambien los defines que me has comentado y alguno mas, puesto que me aparecieron nuevos errores de este tipo, hasta que finalmente me he quedado con un error:
*** Error 51 "D:\Els Meus Documents\Picschool\Ex 16\Ejem_16.c" Line 44(27,28): A numeric expression must appear here
que concretamente se refiere a la linea:
lcd_enviar(LCD_COMANDO,LCD_CURSOR_BLINK);
Creo que puede deberse a que la libreria LCD.C no usa ninguna de las funciones: LCD_COMANDO,LCD_CURSOR_BLINK. Por otra parte si que he conseguido que funcionase con la libreria lcd2.c que es la que usaba este programa en un principio, y una vez grabado en el PIC ha funcionado correctamente. Creo que voy a tratar de aprender a trabajar con la libreria LCD.C con los programitas que hay por aqui colgados, puesto que no me dará errores de ese tipo, además de que trae mucho menos codigo.. :-)
-
Ok.
El error viene de que no estan definidos los comandos LCD_COMANDO,LCD_CURSOR_BLINK, que en si solo son numeros hexadecimales.
Hice una "modificacion" a una de las librerias de LCD, para que queden habilitados esos comandos (ademas de poder generar simbolos propios y guardarlos en la RAM de la LCD). La posteo para que pruebes con ella ok? Para utilizar los comandos se hace con la funcion LCD_COMMAND();. Hay que colocar los comandos de uno en uno.
Al fin el problema era entonces la version del compilador cierto?
// As defined in the following structure the pin connection is as follows:
// D0 enable
// D1 rs
// D2 rw
// D4 D4
// D5 D5
// D6 D6
// D7 D7
#define LCD_OFF 0x08
#define CURSOR_ON 0x0E
#define CURSOR_OFF 0x0C
#define BLINK_ON 0x0D
#define BLINK_OFF 0x0C
#define SHIFT_LEFT 0x1C
#define SHIFT_RIGHT 0x18
#define CURSOR_RIGHT 0x14
#define CURSOR_LEFT 0x10
#define CGRAM 0x40
struct lcd_pin_map { // This structure is overlayed
BOOLEAN enable; // on to an I/O port to gain
BOOLEAN rs; // access to the LCD pins.
BOOLEAN rw; // The bits are allocated from
BOOLEAN unused; // low order up. ENABLE will
int data : 4; // be pin B0.
} lcd;
#if defined use_portb_lcd
#locate lcd = getenv("sfr:PORTB") // This puts the entire structure over the port
#define set_tris_lcd(x) set_tris_b(x)
#else
#locate lcd = getenv("sfr:PORTD") // This puts the entire structure over the port
#define set_tris_lcd(x) set_tris_d(x)
#endif
#define lcd_type 2 // 0=5x7, 1=5x10, 2=2 lines
#define lcd_line_two 0x40 // LCD RAM address for the second line
BYTE const LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0xc, 1, 6};
// These bytes need to be sent to the LCD
// to start it up.
// The following are used for setting
// the I/O port direction register.
struct lcd_pin_map const LCD_WRITE = {0,0,0,0,0}; // For write mode all pins are out
struct lcd_pin_map const LCD_READ = {0,0,0,0,15}; // For read mode data pins are in
BYTE lcd_read_byte() {
BYTE low,high;
set_tris_lcd(LCD_READ);
lcd.rw = 1;
delay_cycles(1);
lcd.enable = 1;
delay_cycles(1);
high = lcd.data;
lcd.enable = 0;
delay_cycles(1);
lcd.enable = 1;
delay_us(1);
low = lcd.data;
lcd.enable = 0;
set_tris_lcd(LCD_WRITE);
return( (high<<4) | low);
}
void lcd_send_nibble( BYTE n ) {
lcd.data = n;
delay_cycles(1);
lcd.enable = 1;
delay_us(2);
lcd.enable = 0;
}
void lcd_send_byte( BYTE address, BYTE n ) {
lcd.rs = 0;
while ( bit_test(lcd_read_byte(),7) ) ;
lcd.rs = address;
delay_cycles(1);
lcd.rw = 0;
delay_cycles(1);
lcd.enable = 0;
lcd_send_nibble(n >> 4);
lcd_send_nibble(n & 0xf);
}
void lcd_init() {
BYTE i;
set_tris_lcd(LCD_WRITE);
lcd.rs = 0;
lcd.rw = 0;
lcd.enable = 0;
delay_ms(15);
for(i=1;i<=3;++i) {
lcd_send_nibble(3);
delay_ms(5);
}
lcd_send_nibble(2);
for(i=0;i<=3;++i)
lcd_send_byte(0,LCD_INIT_STRING[i]);
}
void lcd_gotoxy( BYTE x, BYTE y) {
BYTE 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;
}
}
char lcd_getc( BYTE x, BYTE y) {
char value;
lcd_gotoxy(x,y);
while ( bit_test(lcd_read_byte(),7) ); // wait until busy flag is low
lcd.rs=1;
value = lcd_read_byte();
lcd.rs=0;
return(value);
}
void lcd_command(byte cmd)
{
lcd_send_byte(0, cmd);
}
-
Si, efectivamente, al cambiar la version del compilador desaparecio el problema +EXPORT. Cambie la LCD.C por la modificada con los nuevos comandos, pero sigo teniendo el mismo problema en la misma linea.. :? Lo que no entiendo es lo de usar los comandos de uno en uno, a que te refieres a que en el codigo del programa hay que poner primer uno y despues el otro?
-
No hay mejor manera de explicar que mediante un ejemplo, cierto???
#include<18F452.h>
#fuses XT
#use delay(clock=4M)
#include "LCD.C"
#define SYMBOL_1 0
#define SYMBOL_2 1
#define SYMBOL_3 2
#define S_RIGHT 3
#define S_LEFT 4
#define S_UP 5
#define S_DOWN 6
char data_symbol_1[7] = {0b11111, 0b10001, 0b1010, 0b100, 0b1110, 0b11111, 0b11111};
char data_symbol_2[7] = {0x0e, 0x07, 0x03, 0x01, 0x03, 0x07, 0x0e};
char data_symbol_3[7] = {0x00, 0x0f, 0x1f, 0x01, 0x1f, 0x0f, 0x00};
char data_symbol_right[7] = {0x08, 0x0c, 0x0e, 0x0f, 0x0e, 0x0c, 0x08};
char data_symbol_left[7] = {0x02, 0x06, 0x0e, 0x1e, 0x0e, 0x06, 0x02};
char data_symbol_up[7] = {0x00, 0x04, 0x04, 0x0e, 0x0e, 0x0e, 0x1f};
char data_symbol_down[7] = {0x1f, 0x0e, 0x0e, 0x0e, 0x04, 0x04, 0x00};
void simbolos (void)
{
int8 i;
lcd_init();
lcd_command(LCD_OFF);
lcd_putc(SYMBOL_1);
lcd_command(CGRAM);
for(i=0;i<=7;i++)
{ lcd_send_byte(1, data_symbol_1[i]); }
for(i=0;i<=7;i++)
{ lcd_send_byte(1, data_symbol_2[i]); }
for(i=0;i<=7;i++)
{ lcd_send_byte(1, data_symbol_3[i]); }
for(i=0;i<=7;i++)
{ lcd_send_byte(1, data_symbol_right[i]); }
for(i=0;i<=7;i++)
{ lcd_send_byte(1, data_symbol_left[i]); }
for(i=0;i<=7;i++)
{ lcd_send_byte(1, data_symbol_up[i]); }
for(i=0;i<=7;i++)
{ lcd_send_byte(1, data_symbol_down[i]); }
}
void main (void)
{
simbolos();
lcd_init();
while(true)
{
lcd_gotoxy(1,1);
lcd_putc("W/c");
lcd_putc(SYMBOL_1);
lcd_putc(SYMBOL_2);
lcd_putc(SYMBOL_3);
lcd_putc(S_RIGHT);
lcd_putc(S_LEFT);
lcd_putc(S_UP);
lcd_putc(S_DOWN);
}
}
A lo de enviar los comandos de uno en uno, me refiero a que no se puede hacer lo siguiente: lcd_command(LCD_OFF | CURSOR_ON );, si no que toca enviar primero lcd_command(LCD_OFF) y luego lcd_command(CURSOR_ON).
-
:?... Ando mas mareado que un pato, os tengo que pedir un poco de paciencia antes que nada porque estoy muy verde en esto, por ello adquiri una placa de aprendizaje. A ver, lo que yo entendí es que habia que incluir todas estas funciones y declaraciones en el programa principal justo antes de la fución principal: main(). Pero no se si es lo correcto, hasta ahora habia entendido el programa principal por su cuenta y luego la libreria de la lcd donde ya se configura esta en particular para su correcto funcionamiento. Pero no entiendo el agregar tantas funciones sobre el manejo de la lcd en el programa principal (si esque es ahi donde tenia que ponerlas). Al hacer esto me han salido un monton de errores al compilar (casi me pongo a llorar, nunca me habian salido tantos! :( ), la mayoria de ellos: Expecting a declaration. Como os he dicho mucha paciencia conmigo, y muchas gracias por toda vuestar ayuda...
-
Hola.
Estamos que volamos cierto???? :mrgreen:
Normalmente se adiciona con la directiva de preprocesador #include las librerias correspondientes para hacer manejo de sus funciones en el main. En este caso, hay una libreria (en un archivo LCD.C aparte del main) la cual se incluye en el main con la directiva #include<lcd.c>. Hecho esto, se pueden utilizar todas las funciones que hay dentro de LCD.C en el programa principal.
Porque hay mas funciones en el main???? Es una forma de ordenar el codigo. Hay una funcion la cual envia los simbolos definidos por mi mismo a la LCD, a esa funcion la llamo void simbolos(void). Luego lo que hago es llamarla desde el programa principal.
Mira que en la funcion void simbolos(void) hago uso de funciones que estan en LCD.C y en el void main(void) tambien. La idea clave, para que no te enredes (o yo no te enrede!!!!) es que separes las librerias del programa principal. El programa principal es un archivo .C aparte de las librerias.
Saludos
-
Gracias por la aclaración. Lo que no entiendo es el desplegar todas esas funciones en el main, ¿no seria mas práctico incluirlas en la libreria LCD? Lo digo por tener el codigo mas estructurado.. porque a la hora de compilar el programa al incluir esas nuevas funciones me salen muchos errores y me resultaria mas facil cuando mas simple sea el codigo, ya que de momento solo pretendo hacer funcionar la libreria de la lcd con cosas lo mas sencillas posibles, para ir aprendiendo. Saludos! :-)
-
Hola.
Pues si tu quieres puedes colocar la funcion de generar simbolos nuevos en la libreria de la LCD. No deberia generarte ningun error el adicionar funciones, ya sea en el programa principal o en la libreria, si genera errores es porque las funciones que adicionaste estan mal escritas, otra forma de que de error es porque no declaras los prototipos de funciones al principio del programa (yo casi no lo hago :shock:).
La estructura seria la siguiente:
#include<18F452.h>
#fuses XT
#use delay(clock=4M)
#include "LCD.C"//libreria para el uso de la LCD
#define SYMBOL_1 0
#define SYMBOL_2 1
#define SYMBOL_3 2
#define S_RIGHT 3
#define S_LEFT 4
#define S_UP 5
#define S_DOWN 6
char data_symbol_1[7] = {0b11111, 0b10001, 0b1010, 0b100, 0b1110, 0b11111, 0b11111};
char data_symbol_2[7] = {0x0e, 0x07, 0x03, 0x01, 0x03, 0x07, 0x0e};
char data_symbol_3[7] = {0x00, 0x0f, 0x1f, 0x01, 0x1f, 0x0f, 0x00};
char data_symbol_right[7] = {0x08, 0x0c, 0x0e, 0x0f, 0x0e, 0x0c, 0x08};
char data_symbol_left[7] = {0x02, 0x06, 0x0e, 0x1e, 0x0e, 0x06, 0x02};
char data_symbol_up[7] = {0x00, 0x04, 0x04, 0x0e, 0x0e, 0x0e, 0x1f};
char data_symbol_down[7] = {0x1f, 0x0e, 0x0e, 0x0e, 0x04, 0x04, 0x00};
void simbolos (void);// Declaro el prototipo de la funcion
void main (void)//Programa principal
{
simbolos();//funcion que guarda un nuevo simbolo en la RAM de la LCD
lcd_init();// funcion de la libreria LCD.C que inicializa la LCD
while(true)
{
lcd_gotoxy(1,1);
lcd_putc("W/c");
lcd_putc(SYMBOL_1);
lcd_putc(SYMBOL_2);
lcd_putc(SYMBOL_3);
lcd_putc(S_RIGHT);
lcd_putc(S_LEFT);
lcd_putc(S_UP);
lcd_putc(S_DOWN);
}
}
void simbolos (void)// definicion de la funcion - Funcion que guarda en la RAM de la LCD nuevos simbolos
{
int8 i;
lcd_init();
lcd_command(LCD_OFF);
lcd_putc(SYMBOL_1);
lcd_command(CGRAM);
for(i=0;i<=7;i++)
{ lcd_send_byte(1, data_symbol_1[i]); }
for(i=0;i<=7;i++)
{ lcd_send_byte(1, data_symbol_2[i]); }
for(i=0;i<=7;i++)
{ lcd_send_byte(1, data_symbol_3[i]); }
for(i=0;i<=7;i++)
{ lcd_send_byte(1, data_symbol_right[i]); }
for(i=0;i<=7;i++)
{ lcd_send_byte(1, data_symbol_left[i]); }
for(i=0;i<=7;i++)
{ lcd_send_byte(1, data_symbol_up[i]); }
for(i=0;i<=7;i++)
{ lcd_send_byte(1, data_symbol_down[i]); }
}
De esta manera el codigo se vuelve mas ordenado. No se, y me gustaria saber, si te esta dando algun error en el uso de la LCD con la libreria que te pase y con el codigo aqui descrito, ya que a mi me corre normal. Adjunto la simulacion.
Saludos
-
Nada.. siguen saliendome errores... nada mas i nada menos que 100!! ajja.. Las funciones las copio tal qual estan posteadas y las pego justo antes del main, pero no hay forma. Como digo estoy muy verde en esto y me resulta muy dificil tratar los errores al tener tantas funciones, por eso preguntaba si hay alguna forma de no tener tantas fuciones. Respecto a la simulación, veo que hay un .hex como si de un hexadecimal para el pic se tratase.. es una simulacion o es el codigo ensamblado listo para programar? Lo digo porque no uso ningun programa de simulación de hardware, directamente lo grabo en el pic y lo compruebo en la placa de aprendizaje. De hecho como dije, el programa ya me corre sin problemas con la librería especifica del lcd que traia el ejemplo. La cuestion es, podria hacer funcionar la lcp con la libreria lcd.c o la tengo que optimizar para que funcione con la pantalla lcd que tengo en concreto?
-
:shock: :shock: :shock: :shock: 100!!!!!! jaja :D
Vamos por partes.
1: Las funciones para usar de la LCD no son todas las que aparecen alli, normalmente se usan las sgtes:
- lcd_init(); -> Para inicializar la LCD
- lcd_putc();-> Para colocar strings o datos Ej: lcd_putc('c'); pone 'c' en la LCD :mrgreen:
- lcd_gotoxy(x,y) -> Para ir a la direccion x:filas y:columnas
Tambien se usa el socorrido printf(lcd_putc, " v: %u", value);, donde se muestra en la LCD 'v:' y seguido a eso el valor de la variable 'value'.
2. El .hex, es para programar en el micro, la configuracion del oscilador es XT ( 4MHz ).
3. Si se puede hacer funcionar otra configuracion de pines de otra LCD con la libreria LCD.C, lo que hay que hacer es cambiar cosas en la libreria. En este caso se debe tener en cuenta cuales son los pines RW, RS, ENABLE, D4, D5, D6, D7 ( ojo, estamos hablando de la LCD configurada a 4 bits ). Tengo tambien la libreria de la LCD tipo mcc18 ( de microchip ), ellos la ponen en el puerto B y la configuracion de pines es distinta.
Si estas comenzando con esto de los micros, te aconsejo que ta hagas al ISIS, ya que es una excelente herramienta, sobre todo para toooodos esos "desmanes" que uno suele tener y cuestan pics y quemones!!! :)
Te envio el codigo fuente de la simulacion anterior, para que la compiles y vemos si genera errores listo???
Saludos.
-
Gracias por lo del ISIS, algo habia leido ya por aqui por el foro. Conzco programas como el famoso Pspice, pero este me parece mucho mas interesante porque permite la simulación de pics y de mucho hardware real que otros simuladores no tiene, que son más teóricos, como el Pspice. Respecto al programita, me sigue dando errores, todos ellos de la libreria y la mayoria del tipo: "LCDD.C" Line 75(33,34): Expecting a declaration" y algun otro como: "LCDD.C" Line 99(7,15): Undefined identifier -- delay_ms", el cual si que no le encuentro explicación porque la función delay_ms, asi como cualquier otro delay estoy cansado de usarlas y sin problemas...
-
Podrias postear los errores tal como salen? es decir todo completo, para ver que esta fallando
Saludos
-
Cuidado que vaaa...
Executing: "C:\Archivos de programa\PICC\Ccsc.exe" +FH "lcd2x16.c" +EXPORT +DF +LN +T +A +M +Z +Y=9 +EA
*** Error 100 "D:\Els Meus Documents\Picschool\Ex 16\lcd2x16.c" Line 3(5,21): USE parameter value is out of range Expecting number: 4M
*** Error 103 "D:\Els Meus Documents\Picschool\Ex 16\LCDD.C" Line 75(1,48): Constant out of the valid range 000 is reserved by the compiler
*** Error 48 "D:\Els Meus Documents\Picschool\Ex 16\LCDD.C" Line 75(12,27): Expecting a (
*** Error 43 "D:\Els Meus Documents\Picschool\Ex 16\LCDD.C" Line 75(28,29): Expecting a declaration
*** Error 43 "D:\Els Meus Documents\Picschool\Ex 16\LCDD.C" Line 75(29,30): Expecting a declaration
*** Error 43 "D:\Els Meus Documents\Picschool\Ex 16\LCDD.C" Line 75(31,32): Expecting a declaration
*** Error 43 "D:\Els Meus Documents\Picschool\Ex 16\LCDD.C" Line 75(33,34): Expecting a declaration
*** Error 43 "D:\Els Meus Documents\Picschool\Ex 16\LCDD.C" Line 75(34,38): Expecting a declaration
*** Error 43 "D:\Els Meus Documents\Picschool\Ex 16\LCDD.C" Line 75(39,40): Expecting a declaration
*** Error 43 "D:\Els Meus Documents\Picschool\Ex 16\LCDD.C" Line 75(41,42): Expecting a declaration
*** Error 43 "D:\Els Meus Documents\Picschool\Ex 16\LCDD.C" Line 75(50,51): Expecting a declaration
*** Error 43 "D:\Els Meus Documents\Picschool\Ex 16\LCDD.C" Line 75(51,53): Expecting a declaration
*** Error 43 "D:\Els Meus Documents\Picschool\Ex 16\LCDD.C" Line 75(54,55): Expecting a declaration
*** Error 43 "D:\Els Meus Documents\Picschool\Ex 16\LCDD.C" Line 75(55,56): Expecting a declaration
*** Error 43 "D:\Els Meus Documents\Picschool\Ex 16\LCDD.C" Line 75(56,57): Expecting a declaration
*** Error 43 "D:\Els Meus Documents\Picschool\Ex 16\LCDD.C" Line 75(58,61): Expecting a declaration
*** Error 43 "D:\Els Meus Documents\Picschool\Ex 16\LCDD.C" Line 75(61,62): Expecting a declaration
*** Error 43 "D:\Els Meus Documents\Picschool\Ex 16\LCDD.C" Line 75(63,64): Expecting a declaration
*** Error 43 "D:\Els Meus Documents\Picschool\Ex 16\LCDD.C" Line 75(64,65): Expecting a declaration
*** Error 43 "D:\Els Meus Documents\Picschool\Ex 16\LCDD.C" Line 75(66,67): Expecting a declaration
*** Error 43 "D:\Els Meus Documents\Picschool\Ex 16\LCDD.C" Line 75(67,68): Expecting a declaration
*** Error 43 "D:\Els Meus Documents\Picschool\Ex 16\LCDD.C" Line 75(68,69): Expecting a declaration
*** Error 12 "D:\Els Meus Documents\Picschool\Ex 16\LCDD.C" Line 99(7,15): Undefined identifier -- delay_us
*** Error 12 "D:\Els Meus Documents\Picschool\Ex 16\LCDD.C" Line 111(7,15): Undefined identifier -- delay_us
*** Error 12 "D:\Els Meus Documents\Picschool\Ex 16\LCDD.C" Line 136(5,13): Undefined identifier -- delay_ms
*** Error 12 "D:\Els Meus Documents\Picschool\Ex 16\LCDD.C" Line 139(8,16): Undefined identifier -- delay_ms
*** Error 12 "D:\Els Meus Documents\Picschool\Ex 16\LCDD.C" Line 143(24,39): Undefined identifier LCD_INIT_STRING
*** Error 12 "D:\Els Meus Documents\Picschool\Ex 16\LCDD.C" Line 161(20,28): Undefined identifier -- delay_ms
D:\Els Meus Documents\Picschool\Ex 16\lcd2x16.o ===> 28 Errors, 0 Warnings.
Halting build on first failure as requested.
BUILD FAILED: Fri May 23 16:40:41 2008
-
Hola.
La verdad no entiendo que sucede. Normalmente ese error sale si tu colacas el #include "LCDD.C" antes de la directiva #use delay(clock=4M), ya que es esta directiva la que asigna las funciones de los delays. El orden de los includes debe ser el siguiente
#include<18F452.h>// o del pic que uses
#fuses XT, NOPROTECT .....
#use delay(clock=4000000)
#include "LCDD.C"
...
...
Que microcontrolador estas usando???? , que version del compilador tienes??? Enviame la referencia para hacer un programa con ese micro, lo verifico y te lo envio a ver que sucede. Listo?
Saludos
-
El orden de los defines parece estar bien, la version de mi compilador es la 3.249 (PCWH de CCS), pero me he dado cuenta de que el codigo no exactamente el mismo que me posteaste en mensajes anteriores, por ejemplo los #define SYMBOL observese como no son iguales (He probado a poner estos defines como en el codigo anteriormente posteado pero me siguen saliendo los mismos errores), posteo a continuación el codigo para ver que puede estar mal. El pic ya lo cambie por el 18F452 por si estaba ahi el problema.
#include<18F452.h>
#fuses XT
#use delay(clock=4M)
#include "LCDD.C"
#define SYMBOL_1 0
#define SYMBOL_2 1
#define SYMBOL_3 2
#define S_RIGHT 3
#define S_LEFT 4
#define S_UP 5
#define S_DOWN 6
char data_symbol_1[7] = {0b11111, 0b10001, 0b1010, 0b100, 0b1110, 0b11111, 0b11111};
char data_symbol_2[7] = {0x0e, 0x07, 0x03, 0x01, 0x03, 0x07, 0x0e};
char data_symbol_3[7] = {0x00, 0x0f, 0x1f, 0x01, 0x1f, 0x0f, 0x00};
char data_symbol_right[7] = {0x08, 0x0c, 0x0e, 0x0f, 0x0e, 0x0c, 0x08};
char data_symbol_left[7] = {0x02, 0x06, 0x0e, 0x1e, 0x0e, 0x06, 0x02};
char data_symbol_up[7] = {0x00, 0x04, 0x04, 0x0e, 0x0e, 0x0e, 0x1f};
char data_symbol_down[7] = {0x1f, 0x0e, 0x0e, 0x0e, 0x04, 0x04, 0x00};
void simbolos (void)
{
int8 i;
lcd_init();
lcd_command(LCD_OFF);
lcd_putc(SYMBOL_1);
lcd_command(CGRAM);
for(i=0;i<=7;i++)
{ lcd_send_byte(1, data_symbol_1[i]); }
for(i=0;i<=7;i++)
{ lcd_send_byte(1, data_symbol_2[i]); }
for(i=0;i<=7;i++)
{ lcd_send_byte(1, data_symbol_3[i]); }
for(i=0;i<=7;i++)
{ lcd_send_byte(1, data_symbol_right[i]); }
for(i=0;i<=7;i++)
{ lcd_send_byte(1, data_symbol_left[i]); }
for(i=0;i<=7;i++)
{ lcd_send_byte(1, data_symbol_up[i]); }
for(i=0;i<=7;i++)
{ lcd_send_byte(1, data_symbol_down[i]); }
}
void main (void)
{
simbolos();
lcd_init();
while(true)
{
lcd_gotoxy(1,1);
lcd_putc("W/c");
lcd_putc(SYMBOL_1);
lcd_putc(SYMBOL_2);
lcd_putc(SYMBOL_3);
lcd_putc(S_RIGHT);
lcd_putc(S_LEFT);
lcd_putc(S_UP);
lcd_putc(S_DOWN);
}
}
Me da la sensación que esta tabulación de los numeros en los #define SYMBOL la provoca mi compilador al abrir el lcd2x16.c que posteaste, pero debe de haber algo mas porque como digo probe a poner estos defines como estaban en los codigos que anteriormente posteaste MLO (vease página 1 de este mismo hilo).
-
Hola.
Los #define SYMBOL son las definiciones de los diferentes simbolos, eso no influye si no en la generacion de un caracter.
Bien....el compilador que yo uso el es PCWHD 4.057 creo que por eso a mi si me acepta la definicion de 4M en lugar de 4000000, tocaria corregir eso. Por si acaso, y solo si de pronto lo olvidaste, el archivo LCDD.C debe ir en la misma carpeta donde esta el archivo lcd2x16.C.
Hagamos el ejercicio del "Hola mundo" y veamos que sucede listo?
El codigo del programa principal es:
#include<18F452.h>
#fuses XT
#use delay(clock=4000000)
#include "LCDD.C"
void main (void)
{
lcd_init();
while(true)
{
lcd_gotoxy(1,1);
lcd_putc("Hola mundo");
}
}
y la libreria LCDD.C ya la tienes, sin embargo la adjunto tambien. Recuerda, dentro de la misma carpeta deben estar los dos archivos: LCDD.C y lcd2x16.C, creas el proyecto y compilas. Adjunto tambien el archivo en proteus.
Saludos amigo.
-
Si, los dos archivos los tengo en la misma carpeta, el que no tengo en la misma carpeta es el de cabecera, es decir el 16F877A.h, pero ese creo que no es necesario que este en la misma carpeta, de hecho a mi nunca me ha dado problemas por tenerlo en otra carpeta y asi lo tengo en comun para todos los proyectos que trabajan con el mismo Pic, evitando tener que copiarlo y tenerlo en la carpeta de cada proyecto. Probado ya el nuevo código con el famoso "Hola mundo", me sigue generando errores, concretamente errores en la liberia LCDD.C. Posteo..
*** Error 103 "D:\Els Meus Documents\Picschool\Ex 16\LCDD.C" Line 75(1,48): Constant out of the valid range 000 is reserved by the compiler
*** Error 48 "D:\Els Meus Documents\Picschool\Ex 16\LCDD.C" Line 75(12,27): Expecting a (
*** Error 43 "D:\Els Meus Documents\Picschool\Ex 16\LCDD.C" Line 75(28,29): Expecting a declaration
*** Error 43 "D:\Els Meus Documents\Picschool\Ex 16\LCDD.C" Line 75(29,30): Expecting a declaration
*** Error 43 "D:\Els Meus Documents\Picschool\Ex 16\LCDD.C" Line 75(31,32): Expecting a declaration
*** Error 43 "D:\Els Meus Documents\Picschool\Ex 16\LCDD.C" Line 75(33,34): Expecting a declaration
*** Error 43 "D:\Els Meus Documents\Picschool\Ex 16\LCDD.C" Line 75(34,38): Expecting a declaration
*** Error 43 "D:\Els Meus Documents\Picschool\Ex 16\LCDD.C" Line 75(39,40): Expecting a declaration
*** Error 43 "D:\Els Meus Documents\Picschool\Ex 16\LCDD.C" Line 75(41,42): Expecting a declaration
*** Error 43 "D:\Els Meus Documents\Picschool\Ex 16\LCDD.C" Line 75(50,51): Expecting a declaration
*** Error 43 "D:\Els Meus Documents\Picschool\Ex 16\LCDD.C" Line 75(51,53): Expecting a declaration
*** Error 43 "D:\Els Meus Documents\Picschool\Ex 16\LCDD.C" Line 75(54,55): Expecting a declaration
*** Error 43 "D:\Els Meus Documents\Picschool\Ex 16\LCDD.C" Line 75(55,56): Expecting a declaration
*** Error 43 "D:\Els Meus Documents\Picschool\Ex 16\LCDD.C" Line 75(56,57): Expecting a declaration
*** Error 43 "D:\Els Meus Documents\Picschool\Ex 16\LCDD.C" Line 75(58,61): Expecting a declaration
*** Error 43 "D:\Els Meus Documents\Picschool\Ex 16\LCDD.C" Line 75(61,62): Expecting a declaration
*** Error 43 "D:\Els Meus Documents\Picschool\Ex 16\LCDD.C" Line 75(63,64): Expecting a declaration
*** Error 43 "D:\Els Meus Documents\Picschool\Ex 16\LCDD.C" Line 75(64,65): Expecting a declaration
*** Error 43 "D:\Els Meus Documents\Picschool\Ex 16\LCDD.C" Line 75(66,67): Expecting a declaration
*** Error 43 "D:\Els Meus Documents\Picschool\Ex 16\LCDD.C" Line 75(67,68): Expecting a declaration
*** Error 43 "D:\Els Meus Documents\Picschool\Ex 16\LCDD.C" Line 75(68,69): Expecting a declaration
*** Error 12 "D:\Els Meus Documents\Picschool\Ex 16\LCDD.C" Line 143(24,39): Undefined identifier LCD_INIT_STRING
D:\Els Meus Documents\Picschool\Ex 16\lcd2x16.o ===> 22 Errors, 0 Warnings.
Saludos!!
-
Hola.
Pues la verdad no entiendo que sucede, a mi me compila sin ningun error. Para salir de dudas usemos la libreria del CCS en el puerto D, entonces coloca #include <LCD.C> en lugar de #include "LCDD.C" y veamos que sucede. No deberia dar error ya que es la libreria del CCS. Con respecto al .h, no hay problema que este en otra carpeta.
Me parece muy extraño este error:
Constant out of the valid range 000 is reserved by the compiler
No se a que se deba, el resto de errores parecen ser concecuencia del primero.
Saludos
-
Efectivamente compañero con la libreria de CCS, es decir, LCD.C, compila sin problemas, pero en cambiar a LCDD.C me salen los errores posteados en el mensaje anterior.. :?
-
Saludos!
Qué tal si pruebas con la librería flex_lcd ? Por allí el maestro Diego RedPic explicó cómo usarla.... y a ver qué tal...
Nos leemos! :mrgreen:
-
Hola.
Oye Fire ... podrias tu probar el ejemplo con la libreria LCDD.C a ver que sucede? Me parece extraño que al amigo carafaelet le den esos errores y a mi no.
Saludos
-
Saludos!
Acabo de probar con el lcdd.c y este código:
#include<18F452.h>
#fuses XT
#use delay(clock=4000000)
#include "LCDD.C"
void main (void)
{
lcd_init();
while(true)
{
lcd_gotoxy(1,1);
lcd_putc("Hola mundo");
}
}
Y compila perfecto.
También probé este:
#include<18F452.h>
#fuses XT
#use delay(clock=4M)
#include "LCDD.C"
#define SYMBOL_1 0
#define SYMBOL_2 1
#define SYMBOL_3 2
#define S_RIGHT 3
#define S_LEFT 4
#define S_UP 5
#define S_DOWN 6
char data_symbol_1[7] = {0b11111, 0b10001, 0b1010, 0b100, 0b1110, 0b11111, 0b11111};
char data_symbol_2[7] = {0x0e, 0x07, 0x03, 0x01, 0x03, 0x07, 0x0e};
char data_symbol_3[7] = {0x00, 0x0f, 0x1f, 0x01, 0x1f, 0x0f, 0x00};
char data_symbol_right[7] = {0x08, 0x0c, 0x0e, 0x0f, 0x0e, 0x0c, 0x08};
char data_symbol_left[7] = {0x02, 0x06, 0x0e, 0x1e, 0x0e, 0x06, 0x02};
char data_symbol_up[7] = {0x00, 0x04, 0x04, 0x0e, 0x0e, 0x0e, 0x1f};
char data_symbol_down[7] = {0x1f, 0x0e, 0x0e, 0x0e, 0x04, 0x04, 0x00};
void simbolos (void)
{
int8 i;
lcd_init();
lcd_command(LCD_OFF);
lcd_putc(SYMBOL_1);
lcd_command(CGRAM);
for(i=0;i<=7;i++)
{ lcd_send_byte(1, data_symbol_1[i]); }
for(i=0;i<=7;i++)
{ lcd_send_byte(1, data_symbol_2[i]); }
for(i=0;i<=7;i++)
{ lcd_send_byte(1, data_symbol_3[i]); }
for(i=0;i<=7;i++)
{ lcd_send_byte(1, data_symbol_right[i]); }
for(i=0;i<=7;i++)
{ lcd_send_byte(1, data_symbol_left[i]); }
for(i=0;i<=7;i++)
{ lcd_send_byte(1, data_symbol_up[i]); }
for(i=0;i<=7;i++)
{ lcd_send_byte(1, data_symbol_down[i]); }
}
void main (void)
{
simbolos();
lcd_init();
while(true)
{
lcd_gotoxy(1,1);
lcd_putc("W/c");
lcd_putc(SYMBOL_1);
lcd_putc(SYMBOL_2);
lcd_putc(SYMBOL_3);
lcd_putc(S_RIGHT);
lcd_putc(S_LEFT);
lcd_putc(S_UP);
lcd_putc(S_DOWN);
}
}
Y también compila de lo lindo. 0 Errors, 0 Warnings.
Yo uso el mplab 7.6 y el ccs 4.032
Ok nos leemos! :mrgreen:
-
Firepic he probado la libreria de RedPic y este ha sido el resultado..
Executing: "C:\Archivos de programa\PICC\Ccsc.exe" +FH "lcd2x16.c" +DF +LN +T +A +M +Z +Y=9 +EA
*** Error 12 "D:\Els Meus Documents\Picschool\Ex 16\flex_lcd.c" Line 42(13,20): Undefined identifier LCD_DB4
*** Error 12 "D:\Els Meus Documents\Picschool\Ex 16\flex_lcd.c" Line 43(13,20): Undefined identifier LCD_DB5
*** Error 12 "D:\Els Meus Documents\Picschool\Ex 16\flex_lcd.c" Line 44(13,20): Undefined identifier LCD_DB6
*** Error 12 "D:\Els Meus Documents\Picschool\Ex 16\flex_lcd.c" Line 45(13,20): Undefined identifier LCD_DB7
*** Error 12 "D:\Els Meus Documents\Picschool\Ex 16\flex_lcd.c" Line 48(14,19): Undefined identifier LCD_E
*** Error 12 "D:\Els Meus Documents\Picschool\Ex 16\flex_lcd.c" Line 50(13,18): Undefined identifier LCD_E
*** Error 12 "D:\Els Meus Documents\Picschool\Ex 16\flex_lcd.c" Line 72(13,18): Undefined identifier LCD_E
*** Error 12 "D:\Els Meus Documents\Picschool\Ex 16\flex_lcd.c" Line 75(18,25): Undefined identifier LCD_DB4
*** Error 12 "D:\Els Meus Documents\Picschool\Ex 16\flex_lcd.c" Line 76(18,25): Undefined identifier LCD_DB5
*** Error 12 "D:\Els Meus Documents\Picschool\Ex 16\flex_lcd.c" Line 77(18,25): Undefined identifier LCD_DB6
*** Error 12 "D:\Els Meus Documents\Picschool\Ex 16\flex_lcd.c" Line 78(18,25): Undefined identifier LCD_DB7
*** Error 12 "D:\Els Meus Documents\Picschool\Ex 16\flex_lcd.c" Line 80(12,17): Undefined identifier LCD_E
*** Error 12 "D:\Els Meus Documents\Picschool\Ex 16\flex_lcd.c" Line 95(13,19): Undefined identifier LCD_RW
*** Error 12 "D:\Els Meus Documents\Picschool\Ex 16\flex_lcd.c" Line 110(12,18): Undefined identifier LCD_RS
*** Error 12 "D:\Els Meus Documents\Picschool\Ex 16\flex_lcd.c" Line 119(16,22): Undefined identifier LCD_RS
*** Error 51 "D:\Els Meus Documents\Picschool\Ex 16\flex_lcd.c" Line 120(1,5): A numeric expression must appear here
*** Error 12 "D:\Els Meus Documents\Picschool\Ex 16\flex_lcd.c" Line 126(12,18): Undefined identifier LCD_RW
*** Error 12 "D:\Els Meus Documents\Picschool\Ex 16\flex_lcd.c" Line 130(12,17): Undefined identifier LCD_E
*** Error 12 "D:\Els Meus Documents\Picschool\Ex 16\flex_lcd.c" Line 141(12,18): Undefined identifier LCD_RS
*** Error 12 "D:\Els Meus Documents\Picschool\Ex 16\flex_lcd.c" Line 144(12,18): Undefined identifier LCD_RW
*** Error 12 "D:\Els Meus Documents\Picschool\Ex 16\flex_lcd.c" Line 147(12,17): Undefined identifier LCD_E
*** Error 12 "D:\Els Meus Documents\Picschool\Ex 16\flex_lcd.c" Line 226(13,19): Undefined identifier LCD_RS
*** Error 12 "D:\Els Meus Documents\Picschool\Ex 16\flex_lcd.c" Line 228(12,18): Undefined identifier LCD_RS
23 Errors, 0 Warnings.
Es como si no reconociese los "#define xxx", no?
-
Estaba pensando tambien de postear la libreria del CCS la LCDD.C para ver si encontrabais diferencia respecto a la que tengais vosotros, es decir, por si la libreria ha cambiado algo entre version y version del compilador. Pero he visto el tema del copyright y el de la reprodución o distribución... y bla bla bla.. La puedo postear aqui en el foro o no esta permitido?
-
Una pregunta tonta carafaelet, estás adjuntando el archivo LCDD.C o FLEXLCD en el mplab?
Ok saludos, nos leemos! :mrgreen:
-
Jejej.. si si.. adjunto los archivos en la carpeta "Source files", es correcto, no? (Aparte de que evidentemente los archivos estan en la misma carpeta donde se encuentra el proyecto).
-
Estás probando con el código "Hola mundo" que te dió MLO_?
Pareciera que el mplab no consiguiera el archivo donde están las definiciones de esas variables. Qué extraño :shock:
Saludos, nos leemos! :mrgreen:
-
Hola
Yo nunca e adicionado las librerias .C con el Add Source Files en el MPLAB, ya que si lo hago, el compilador me envia errores. Yo solo adiciono desde el Proyect Wizard el archivo fuente y ya, de no tener el codigo fuente lo hago desde el MPLAB con la misma opcion Add Source Files, pero solo adiciono el main, eso si, el archivo LCDD.C siempre esta en la misma carpeta donde esta el archivo fuente, ya que yo coloco asi: #include "LCDD.C", por lo que el compilador busca en la carpeta del proyecto. El MPLAB se encarga de linkear los respectivos .h y .c utilizados.
No se si tu version del CCS carafaelet te este dando lata amigo, me parece muy extraño ya que la unica diferencia entre la libreria del CCS del LCD.C y la LCDD.C son los correpondientes #defines para configurar ciertos comandos del display, como lo son BLINK_ON, DISPLAY_ON, etc y la respectiva funcion para enviarlos lo que da lo mismo colocarlos en el programa principal :roll:.
Saludos
-
Si MLO yo tampoco suelo añadir solamente el programa principal, y el resto ya con includes pues como dices el compilador ya los va "cogiendo".. Pero probé a añadir tambien a LCDD.C cuando empezaron a salir todos estos errores, por si acaso.. pero nada. La verdad esque tiene toda la pinta de ser del compilador, pues no se entiende que no acepte su propia libreria.. y en cambio la lcd2.C que no venia con el compilador, que ha sido desarrollada, si que la acepta.. :?
Si firepic he estado probando el codigo de "hola mundo", mas sencillo imposible, pero me salen los errores donde siempre, en la libreria LCDD.C, voy a buscar a ver si hay algun ejemplo con esta lcd con los progarmas que viene de ejemplo con el compilador.. a ver que ocurre.. y os cuento..