TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: GAME en 20 de Enero de 2008, 11:21:15

Título: [C18] escritura de un byte con distintos puertos para LCD
Publicado por: GAME en 20 de Enero de 2008, 11:21:15
Llevo un par de dias full time buscando como asignar distintos puertos a una variable data del LCD. Definida en la libreria XLCD.h del mcc18.
El caso es el siguiente en la libreria la variable datos se define:

#define DATA_PORT      PORTB
#define TRIS_DATA_PORT TRISB


Mi intención debido a un problema de puertos y organización física es organizarlo de este modo:

Pin D0(lcd) PORBTbits.RB0
Pin D1(lcd) PORTBbits.RB1
Pin D2(lcd) PORTBbits.RB2
Pin D3(lcd) PORTBbits.RB3
Pin D4(lcd) PORTBbits.RB4
Pin D5(lcd) PORTBbits.RB5
Pin D6(lcd) PORTAbits.RA1
Pin D7(lcd) PORTAbits.RA0


y asignarlo a DATA_PORT.
He buscado en varios foros pero no he encontrado nada, he creado distintas estructuras pero no funciona, el compilador no las acepta.
Título: Re: [C18] escritura de un byte con distintos puertos para LCD
Publicado por: jfh900 en 20 de Enero de 2008, 11:32:40
Busca la librería flex_lcd dentro del foro, que funciona de esa forma (permite definir cada pin de cualquier puerto como conexión de cualquier pin del LCD) y adáptala a tu compilador.

Un saludo
Título: Re: [C18] escritura de un byte con distintos puertos para LCD
Publicado por: GAME en 20 de Enero de 2008, 11:47:52
Siempre se puede modificar el codigo entero, mi idea que parecía simple al principio es asignar distintos bits a un byte, en este caso DATA_PORT. Es interesante aprender a modificar los bits sin tener que recurrir al ensamblador.
Por otra parte la libreria que me comentas utiliza 4 bits de datos en vez de 8.
Título: Re: [C18] escritura de un byte con distintos puertos para LCD
Publicado por: jfh900 en 20 de Enero de 2008, 12:04:52
Te indico la librería para que estudies y cojas la filosofia de como está desarrollada para que lo apliques a la que tú tienes.

Efectivamente la mayoría de los LCD's pueden trabajar con 4 u 8 bits de datos.

Un saludo
Título: Re: [C18] escritura de un byte con distintos puertos para LCD
Publicado por: GAME en 20 de Enero de 2008, 12:12:30
Otra opcion es poner las patas de datos que no utilice a masa. Es possible ponerlas a traves del puerto del microprocesador o puede dar lugar a fallos?
Me explico:
Las patas RB0-->RB3 las utilizo como bus de datos y el resto las configuro en modo salida y las pongo a 0 logico.
Título: Re: [C18] escritura de un byte con distintos puertos para LCD
Publicado por: GAME en 20 de Enero de 2008, 14:11:22
He estado mirando distintos post y e encontrado que utilizando estructuras del tipo union se puede hacer pero no llego a entender como se podría asignarle los puertos.

Citar
typedef union {
   unsigned char byte;
   struct {
        unsigned bit0:1;
        unsigned bit1:1;
        unsigned bit2:1;
        unsigned bit3:1;
        unsigned bit4:1;
        unsigned bit5:1;
        unsigned bit6:1;
        unsigned bit7:1;
   };
}DataBinario;

void initlcd (void)
{   
DataBinario DATA;

DATA.byte = 0x20;

   DATA.bit0 = PORTBbits.RB0;
   DATA.bit1 = PORTBbits.RB1;
   DATA.bit2 = PORTBbits.RB2;
   DATA.bit3 = PORTBbits.RB3;
   DATA.bit4 = PORTBbits.RB4;
   DATA.bit5 = PORTBbits.RB5;
   DATA.bit6 = PORTAbits.RA1;
   DATA.bit7 = PORTAbits.RA2;

}

Tendría que asignar cada bit el puerto. Pero esto se haria en tiempo real?

Título: Re: [C18] escritura de un byte con distintos puertos para LCD
Publicado por: GAME en 20 de Enero de 2008, 19:53:16
Sigo sin conseguir crear el byte correctamente. Hay alguien que conozca como estructurar bien las uniones que me pueda explicar, es simple pero hay que seguir unas reglas que desconozco y hay muy poca información.
Un SaluDo
Título: Re: [C18] escritura de un byte con distintos puertos para LCD
Publicado por: jfh900 en 20 de Enero de 2008, 20:44:31
Yo lo veo bien creado. Lo único que veo que esta mal es crear la variable:

DataBinario DATA;

Dentro de la función void initlcd (void), ya que esto la crea local a la función y no deja manejarla en el resto de las funciones.

Un saludo
Título: Re: [C18] escritura de un byte con distintos puertos para LCD
Publicado por: GAME en 20 de Enero de 2008, 21:31:22
Vaya tienes razon tantas horas delante del ordenador ha quemado mis neuronas  :shock: .
Ahun asi no lo consigo declarar como globales, creo que me estoy equivocando.
Seguire intentandolo
En cuanto lo consiga publicare el programa que creo que sera de gran utilidad

Un Saludo
Título: Re: [C18] escritura de un byte con distintos puertos para LCD
Publicado por: maunix en 22 de Enero de 2008, 10:03:14
He estado mirando distintos post y e encontrado que utilizando estructuras del tipo union se puede hacer pero no llego a entender como se podría asignarle los puertos.

Game, el problema que quieres resolver no es tan simple.  Lo que tu tienes que haces es editar el .h del micro que estés usando y luego recompilar la librería junto con su .asm asociado.

Como sugerencia, es más simple que hagas un #define de un pin y así te alivias de esto.

Por ejemplo

#define LCD_E  LATAbits.LATA0 

Con eso le dices al compilador que el enable es el pin LATA0 .

Si te fijas en la librería xlcd.h de microchip hacen algo similar.

Saludos