TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: narcosystem en 18 de Agosto de 2004, 06:06:00

Título: lcd no funciona
Publicado por: narcosystem en 18 de Agosto de 2004, 06:06:00
hola foreros, estoy quemadisimo, me he cambiado al 18f452 y no soy capaz de hacer que funcione un lcd de la marca Ampire, he modificado las librerias que vienen con el CCS con las direcciones del 18f452 y por supuesto con el mapa de pines que utilizo y soy incapaz de mostrar las dos lineas, si que puedo sin embargo mostrar una u otra linea independientemente, es decir en dos programas distintos. (esto no hay quien lo entienda, estoy al borde de la desesperacion mas absoluta)Si se os ocurre que puede estar pasando por favor,AYUDADMEEEE!

adjunto codigo que no funciona:

#include "18F452.h"
#use delay(clock=20000000)
#include "puertos.h"
#include "lcd_18f.h"


void main(void){

   
   inicia_puertos();   //configura puertos
     inicia_lcd();      //inicia el lcd

      printf(lcd_putc,"fhola";
      lcd_gotoxy(1,2);
      printf(lcd_putc,"mundo";


   while(1){
 
      }
}


esta es la parte que he cambiado del lcd.c


struct lcd_pin_map {
           int     data : 4;
           boolean enable;
           boolean rs;

        } lcd;

#byte lcd = 0xF80                  // puerto A
#byte pcon = 0xFD0      //Nos indica el ultimo reset

#define set_tris_lcd(x) set_tris_a(x)
#define lcd_linea_dos 0x40    // Dirección de segunda linea


STRUCT lcd_pin_map const LCD_WRITE = {0,0,0}; // Modo escritura, todo salidas


y esta es la configuracion de los puertos


#use fast_IO(a) //Nos permite configurar a nosotros los registros
#use fast_IO(b)   
#use fast_IO(c)
#use fast_IO(d)
#use fast_IO(e)

#byte porta=0xF80
#byte portb=0xF81
#byte portc=0xF82
#byte portd=0xF83
#byte porte=0xF84

void inicia_puertos(void)
{
   set_tris_a(0b00000000);    //lcd
   set_tris_b(0b00000011);    //  pulsadores
   
}



Gracias de antemano por vuestra ayuda.
Título: RE: lcd no funciona
Publicado por: Modulay en 18 de Agosto de 2004, 08:41:00
Resulta muy extraño que cuando escribes en la primera línea lo haga sin problemas y sin embargo con la segunda no te funcione.
Creo que te estás complicando un poco la vida con tantos ficheros de cabecera,al fin y al cabo,estás usando las rutinas de "lcd.c" ¿no?
Si vas a manejar irremisiblemente el lcd con el puerto A,podemos buscar la manera de añadir unas líneas al código de lcd.c para que,con añadir en nuestro programa principal la línea #define use_portX_lcd(siendo X el puerto que vayamos a usar),sea suficiente y no haya que recurrir al uso de ficheros .h adicionales.
Prueba a añadir #define lcd_type 2 a tu código,es posible que esa sea la causa de que no te reconozca la segunda línea del lcd.
Si no funciona,veo mejor optar por hacer las cosas que te he comentado.
Ya nos cuentas.
Un saludo
Título: RE: lcd no funciona
Publicado por: narcosystem en 18 de Agosto de 2004, 13:19:00
No si lo curioso de todo es que puedo escribir en las dos lineas, pero una sola vez en el programa, lo que no puedo hacer es mostrar las dos a la vez, curiosisimo.
Título: RE: lcd no funciona
Publicado por: narcosystem en 19 de Agosto de 2004, 03:11:00
esto sigue sin funcionar, ahora no se que he hecho pero no sale ya nada en el lcd, se queda el cursor parpadeando en la primera linea. esto es lo que he modificado en el lcd.c


struct lcd_pin_map {
            int     data : 4;                 // 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
                                       // be pin A0.
        } lcd;



#if defined(__PCH__)
#if defined use_porta_lcd
   #byte lcd = 0xF80                   // This puts the entire structure
#else
   #byte lcd = 0xF83                   // This puts the entire structure
#endif
#else
#if defined use_portb_lcd
   #byte lcd = 6                  // on to port B (at address 6)
#else
   #byte lcd = 8                 // on to port D (at address 8)
#endif
#endif

#if defined use_porta_lcd
   #define set_tris_lcd(x) set_tris_a(x)
#else
   #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

Título: RE: lcd no funciona
Publicado por: Modulay en 19 de Agosto de 2004, 05:31:00
He modificado la librería lcd.c para que pueda funcionar con cualquiera de los puertos.
Hazte con ella aqui ,modifica la estructura del mapa de pines según tu conexionado y prueba este programa a ver que tal:
Codigo:

#include <18F452.h>
#use delay(clock=20000000)
#fuses HS,NOWDT,NOPUT,NOLVP,NOBROWNOUT,NOWRT
#define use_porta_lcd TRUE
#include "lcd.c"


void main()
   {
   lcd_init();
   printf(lcd_putc,"fhola");
   lcd_gotoxy(1,2);
   printf(lcd_putc,"mundo");
   for(;;) {}
   }




Supongo que tendrás el pin RW del lcd puesto a masa ¿no?
Título: RE: lcd no funciona
Publicado por: pocher en 19 de Agosto de 2004, 13:06:00
He probado en PROTEUS la rutina de CCS lcd.c para un 18F452 con pines de control en RB0..RB2 y pines de datos en RB4..RB7 y "funciona relativamente bien" mostrando caracteres en las 2 líneas (pero tarda demasiado), eso sí para una frecuencia de 4MHz. Para 20MHz o 40MHz no funciona bien.

Habría que comprobar todo esto físicamente para ver que va bien.
Título: RE: lcd no funciona
Publicado por: Modulay en 19 de Agosto de 2004, 13:13:00
Te refieres a la modificación que hice?
Voy a probar con el resto de puertos,no me fío demasiado de proteus
Título: RE: lcd no funciona
Publicado por: pocher en 19 de Agosto de 2004, 13:23:00
No me refiero a la rutina original de CCS lcd.c sin tocarle nada, únicamente habilitando el define del PORTB
Título: RE: lcd no funciona
Publicado por: Modulay en 19 de Agosto de 2004, 13:34:00
No te entiendo pocher
Título: RE: lcd no funciona
Publicado por: MGLSOFT en 19 de Agosto de 2004, 16:49:00
Perdon por la intromision, pero es posible que la rutina no funcione bien en Proteus solamente.
No se olviden que los delays que tiene son calculados nuevamente en funcion del reloj que pongan, por lo tanto no pueden variar....
Título: RE: lcd no funciona
Publicado por: pikman en 19 de Agosto de 2004, 19:35:00
Bueno, yo tengo harta experiencia en discutir con el 18F452, tanto con el proteus y con el ICD pocas cosas que he mirgrado del 16F877 andan de buenas a primeras, con respecto al LCD el error esta en el DRIVER de CCS que el que lo hizo le puso unos delay_cicles (1); que hacen un retardo de 1 microsegundo a 4 mhz, pero cuando uno pone el 18F452 a 40 Mhz ( xtal de 10 Mhz con H4 ) se pudre todo y el LCD NO ANDA MAS, entonces cambiar el DELAY_CICLES (1); POR DELAY_US(1); o 3 microsegundos mejor y empieza a funcionar el LCD, hay otras cosas como por ejemplo el MSSP que hace lo que se le antoja, pero solo cuando uso CCS, modifique una rutina en ASM para I2C y  la inserte en el codigo de C y tuti viento in popa, inclusive va a 100 KHz cosa que no puedo lograr con CCS.

saludos

Ariel
 

Título: RE: lcd no funciona
Publicado por: Modulay en 20 de Agosto de 2004, 01:05:00
Vamos a probar a cambiar esos retardos que comentais.
Otra cosa...según parece,narcosystem tiene conectado el lcd al puerto A,con el pin RW supuestamente a masa.Yo he probado a hacer lo mismo y el display parece que se inicializa bien pero no representa nada de nada,y sólo con volver a poner RW comandado por el pic ya va bien.Alguien ha probado esa configuración de RW?
Título: RE: lcd no funciona
Publicado por: Modulay en 20 de Agosto de 2004, 01:34:00
Ya están modificados los retardos.
http://miarroba.com/foros/ver.php?temaid=2216077&foroid=256746
He probado con 16F876 a 10Mhz y va bien.Con 18F258 a 10Mhz tb va bien,pero si le pongo el cristal de 40Mhz funciona,pero los delays que le pongo al programa para que se vea en el lcd un texto de forma intermitente parece que se hacen más largos,es decir la ejecución se hace más lenta.
Título: RE: lcd no funciona
Publicado por: MGLSOFT en 20 de Agosto de 2004, 06:20:00
La linea RW permite leer o escribir desde y hacia el display, segun el nivel que se le de.
La rutina de CCS lo que hace es leer luego de enviar un comando, para saber cuando esta listo el display para recibir un nuevo dato.
Si se exceden los tiempos entre envios el display tambien anda, no todo lo bien que esperamos....
Hay rutinas que hacen que el display trabaje sin el uso de la linea RW, el basic de PBP trabaja sin ella, por ejemplo.

Pero el experto en LCD´s, que me ayudo a mi a resolverlo en CCS es el Maestro PIKMAN, por lo cual le dejo a El la explicacion...

Una ultima cosa:
No utilizen la rutina original de CCS sin usar la linea de RW, porque cometen errores muy grandes, ya que esa rutina trabaja  bien leyendo el display...
Título: RE: lcd no funciona
Publicado por: Modulay en 21 de Agosto de 2004, 08:32:00
Bueno pues ante la imposibilad de comandar el lcd con el puerto a,volveeeeemos a hacerle la cirugía al lcd.c modificado.
Saludos
Título: RE: lcd no funciona
Publicado por: narcosystem en 02 de Septiembre de 2004, 04:05:00
Hola a todos, perdonad pero es  que he estado de vacaciones en la playita, que no solo de micros vive el hombre jeje. Bueno ya he probado algunas cosillas pero esto sigue sin rular. Las conexiones fisicas no las puedo cambiar porque la placa que uso es un circuito hibrido, es decir serigrafiado  sobre sustrato ceramico y una vez montado no se puede tocar practicamente nada. La linea R/W la tengo conectada a masa y el resto de conexiones son las siguientes:

RA0-->DATOS 7 del lcd
RA1-->DATOS 6
RA2-->DATOS 5
RA3-->DATOS 4
RA4--> ENABLE
RA5--> RS
RW A MASA

Bueno a ver si alguno consigue algo. gracias a todos por contestar tan rapido.


Título: RE: lcd no funciona
Publicado por: Modulay en 02 de Septiembre de 2004, 04:25:00
Usando ese puerto lo veo complicado
Título: RE: lcd no funciona
Publicado por: narcosystem en 02 de Septiembre de 2004, 05:40:00
¿Por que es mas complicado que con cualquier otro????
Título: RE: lcd no funciona
Publicado por: Modulay en 02 de Septiembre de 2004, 06:18:00
Lee lo que escribió mglsoft y verás por qué
Saludos
Título: RE: lcd no funciona
Publicado por: gauchosuizo en 02 de Septiembre de 2004, 15:49:00
hola gente

yo tambien quiero colaborar un poco con un programa para el lcd. Lo unico es que los comentarios estan en aleman y no tuve tiempo de traducirlos. Cualquier cosa, lo hago el fin de semana. Otra cosa: el programa es para un 16F873 pero cambiando el include y poniendo los pines deseados tiene que funcionar como un relojito .


Codigo:

#include <lcd.h> // Hier wird die Headerdatei des Hauptprogrammes eingebunden
#include <lcdanzeige.c> // Hier wird die Datei für die Routinen der LCD-Anzeige eingebunden

unsigned char wert; // eine Zählvariable

// Beginn des Hauptprogrammes
void main() {

set_tris_a(0); // Port A als Ausgang definieren
set_tris_b(0); // Port B als Ausgang definieren
set_tris_c(0); // Port C als Ausgang definieren

lcd_init(); // Initialisierung der LCD-Anzeige

LCD_BLANK();

lcd_gotoxy(1,1); // weitere Routine von lcd16x2.c, bewegt den Cursor zu den Koordinaten x,y

lcd_putc("cHallo Welt2"; // Dieser Befehl gibt die Zeichen (Text) an das Display.
lcd_putc("Ein Test";

delay_ms(500); // pausiert 500ms
wert=0; // setzt Zählvariable auf 0

while (1) { // Endlosschleife

/* Mit dem Befehl "printf" wird die Variable in ASCII-Code umgewandelt und mit der Routine lcd_putc auf die Anzeige geschrieben. */
printf(lcd_putc,"fWert: %03u",wert);

wert++; // Zählvariable wird um 1 erhöht

delay_ms(200); // Pause200ms
} // Ende der Endlosschleife
} // Hauptprogramm Ende

Die Headerdatei vom Hauptprogramm (lcd.h):

#include <16F873.h> // Ein PIC-Typ wird ausgewählt
#use delay(clock=4000000) // Die Taktfrequenz beträgt 4 MHz
/* Watchdogtimer wird abgeschaltet und Oszillatoroption wird konfiguriert. Wenn man Pin RB3 am PIC16F873 als digital I/O verwenden möchte muss das LVP ausgeschaltet sein */
#fuses HS,NOWDT,NOLVP

/* Hier wird eine Struktur definiert, sie beeinhalten Port B
(Signal RW wird hier nicht mehr benötigt) */
struct port_b_layout
{
short unused; // freier Portpin
short rs; // LCD RS
short unused2; // freier Portpin ( war vorher Pin R/W)
short enable; // LCD ENABLE
int lcddata:4; // LCD-Daten D4...D7
} portb;

/* Hier wird portb als Byte mit der Zahl 5 definiert. Die Zahl zeigt nur die Adresse von Port B im Special Function Register des PICs.*/
#byte portb=5

/* Hier definiere ich einen NOP, und nehme dafür das NOP im Assembler. Es wird gebraucht um einige Pausen zwischen zwei Befehlen zu setzen.*/
#define NOP() { #asm nop #endasm }

Routinen für die LCD-Anzeige (lcdanzeige.c):

/* Hier kann der Typ der Anzeige definiert werden
( 0=5x7, 1=5x10, 2=2 lines )*/
#define lcd_type 2

/*verschiedene Eigenschaften der LCD-Anzeige
0x0C = Display an
0x01 = Display löschen
0x06 = Adresspointer inkrementieren und Displayinhalt nicht verschieben */
byte CONST LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0x0C, 0x01, 6};

/* Diese Routine versendet jeweils ein Nibble an das Display.
Ein Nibble besteht immer aus 4 Bits. Bei einer Anzeige im 4-Bit Modus werden immer erst die hochwertigen Bits und danach niederwertigen Bits an das Display übertragen. */
void lcd_send_nibble( byte n )
{
portb.lcddata = n;
nop();
portb.enable = 1;
delay_us(4);
portb.enable = 0;
}

/* Hier wird das komplette Byte übertragen. Hier wird das BUSY-Flag nicht abgefragt, sondern pausiert 2ms bis dahin ist das Display wieder bereit. Danach wird das Byte getrennt und zwei Nibbles (Nibble=4 Bit) werden übertragen.*/
void lcd_send_byte( byte address, byte n ) {
portb.rs = 0;
delay_ms(2);
portb.rs = address;
nop();
portb.enable = 0;
lcd_send_nibble(n >> 4);
lcd_send_nibble(n & 0xf);
}


/* Initialisierung des LCD-Displays. Die verschiedenen Eigenschaften der Anzeige werden hier übertragen.*/
void lcd_init()
{
byte i;
portb.rs = 0;
portb.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);
}

/* Hier wird die Anzeige auf bestimmte Koordinaten gesetzt.
Die Routine ist auch für 4-Zeilen Display geeignet.*/
void lcd_gotoxy( byte x, byte y)
{
byte address;

if (y==1) address=0;
if (y==2) address=0x40;
if (y==3) address=0x10;
if (y==4) address=0x50;
address+=x-1;
lcd_send_byte(0,0x80|address);
}

/* Hier wird der Text auf das Display geschrieben. Es wird auch überprüft ob bestimmte Spezialfunktionen angegeben sind. (Wichtig : Die Ausgabe die Variablen kann diese Routine nicht richtig ausgeben, weil die erst umgewandelt werden müssen. In der Variante 2 wird dies berücksichtigt) */
void lcd_putc( char f)
{
switch (f)
{
case "c" : lcd_send_byte(0,1);
delay_ms(2);
break;
case "1" : lcd_gotoxy(1,1); break;
case "2" : lcd_gotoxy(1,2); break;
case "3" : lcd_gotoxy(1,3); break;
case "4" : lcd_gotoxy(1,4); break;
default : lcd_send_byte(1,f); break;
}
}

Título: RE: lcd no funciona
Publicado por: pocher en 03 de Septiembre de 2004, 04:52:00
MGLSOFT ¿Podrías poner un programita que saque algo por pantalla, con esa rutina y que no use la línea R/W?

Pikman respecto a la velocidad de respuesta de la LCD para frecuencias superiores a 4MHz sigue funcionando lenta (en PROTEUS, no tengo placa base para PIC18), incluso cambiando el delay_cicles por delay_us.

Gauchosuizo no he probado el programa, pero funciona sin conectar la línea R/W?

Un saludo
Título: RE: lcd no funciona
Publicado por: gauchosuizo en 03 de Septiembre de 2004, 09:10:00
hola

si Pocher, funciona sin RW. RW hay que conectarlo a masa.
Título: RE: lcd no funciona
Publicado por: pocher en 03 de Septiembre de 2004, 11:32:00
He montado los tres ficheros por separado pero me tira error en el fichero lcdanzeige.c en línea 48: lcd_send_byte(0,LCD_INIT_STRING) ---> Bad expression syntax

Podrías pasarme los tres ficheros por separado en un privado?
Título: RE: lcd no funciona
Publicado por: Modulay en 03 de Septiembre de 2004, 11:41:00
Eso es porque el codigo no se pegó bien al llevar íes entre corchetes.Se las come y donde debe ir como parámetro LCD_INIT_STRING[indice] se te come el indice,por eso tira ese error,al mandarle todo un array en vez de un byte
Título: RE: lcd no funciona
Publicado por: pocher en 03 de Septiembre de 2004, 11:58:00
Sí ese era el error de sintaxis, ahora dice que no encuentra la función LCD_BLANK(); Quitándola compila sin errores ... voy a ver si funciona.
Título: RE: lcd no funciona
Publicado por: pocher en 03 de Septiembre de 2004, 12:14:00
Bueno pués sí funciona, había otro error por ahí.
Título: RE: lcd no funciona
Publicado por: narcosystem en 24 de Septiembre de 2004, 03:00:00
hola a todos, por fin consegui que se vieran cositas en el Lcd, utilizando el puerto A, el problema era que tenia la señal de enable en el pin 4 y no me habia dado cuenta de que necesitaba una señal de pull up. Por otro lado el bootloader que estaba usando no dejaba que el programa funcionara correctamente. este bootloader es el de la pagina de microchipc. Bueno gracias a todos los que habeis contestado.