TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: MGLSOFT en 28 de Febrero de 2004, 08:27:00
-
Necesito saber la forma de reformar la libreria de CCS para poder conectar mi LCD al portC del 16F876.
La configuracion es la siguiente:
RC4 -------> Enable -------> pin 6 del LCd
RC5 -------> RS ------------> pin 4 del LCd
RC0 -------> DB4 ----------> pin 11 del LCd
RC1 -------> DB5 ----------> pin 12 del LCd
RC2 -------> DB6 ----------> pin 13 del LCd
RC3 -------> DB7 ----------> pin 14 del LCd
Como veran la interfase es a 4 bits.


Alguien puede ayudarme ??
-
Cuando tenga un rato te lo miro más detenidamente.
-
Lo prometido es deuda. Aquí la tienes: http://miarroba.com/foros/ver.php?foroid=85505&temaid=1599315
He cambiado la asignación de pines al PORTC, por comparación con la original de CCS.
Un saludo
-
Gracias Pocher !!


Voy a probarlo..

Una duda.
de donde saco los valores hexa de los puertos ?, no lo encontre en la documentacion que tengo..
-
No te entendí, podrías ser más explícito?
-
Me referia a lo siguiente:
struct lcd_pin_map { // This structure is overlayed
boolean rs; //enable en CCS // on to an I/O port to gain
boolean rw; //rs en CCS // access to the LCD pins.
boolean enable; //rw en CCS // The bits are allocated from
boolean unused; // low order up. ENABLE will
int data : 4; // be pin B0.
} lcd;
#ifdef(__PCH__)
#ifdef use_portc_lcd
#byte lcd = 0xF82 <---
#else
#byte lcd = 0xF83 <--- // This puts the entire structure
#endif
#else
#ifdef use_portc_lcd
#byte lcd = 7
#else
#byte lcd = 8 // on to port D (at address 8)
#endif
#endif
De donde saco esos valores para todos los puertos??
Ademas:
struct lcd_pin_map {
int data : 4;
boolean enable;
boolean rs;
boolean rw;//no lo uso en realidad
boolean unused;
} lcd;
Si lo escribo asi, estara bien para mis propositos??
-
Las direcciones 0xF84 (PORTE), 0xF83 (PORTD), 0xF82 (PORTC), 0xF81 (PORTB) y 0xF80 (PORTA) son las direcciones de los registros pero solo si vas a usar un PIC de la serie 18, no es tu caso.
Respecto al cambio de orden en la estructura déjame que lo piense ahora me llaman a comer.
Un saludo
-
Buen provecho !!


-
Con solo ese cambio no te funcionarIa.
Hace falta también cambiar:
STRUCT lcd_pin_map const LCD_READ = {0,0,0,0,15}; // For read mode data pins are in
por:
STRUCT lcd_pin_map const LCD_READ = {15,0,0,0,0}; // For read mode data pins are in
Obligatorio tener el pin RW conectado, si no, no va. Para eliminarlo habría que pensar un poco más ...
Un saludo
-
Lo hice asi y anduvo bien en el PortD y el PortB, pero no podia hacerlo funcionar en el PortC (simulado en Proteus, se entiende).
Para que funcionara tuve que deshabilitar los modulos PSP y CCP1 y CCP2.
Recien alli anduvo!!

Ahora bien, estuve leyendo mas acerca del uso de la estructura del LCD y creo que si dejo de lado la funcion de leer del LCD puedo prescindir del uso del pin RW, dejandolo siempre a VDD, como siempre lo hago.
Que opinas??
-
He estado haciendo algunos cambios y no hay manera, si te sale avisa.
-
OK, si consigo que ande te digo como, sino snif, snif

-
Oye, instale el QuickBuilder DEMO en mi maquina, este me permite tomar todos los bits del port al LCD sueltos (fuera de una estructura).
Lo probare y si me anda OK pongo aqui el codigo de la libreria LCD y traducida.

-
Hola MARCOS y Pocher, pues me di el gusto de no usar el RW, con los contratiempos que trae, para esto hay que agragar retardos en lugar del chequear el BUsy Flag que varian segun la pantalla LCD y ademas cuando cambia la temperatura de esta, por lo tanto siempre se hace mas lerda la aplicacion, esto lo hice con el fin de usar un registro de despalzamiento para controlar el LCD y ahorrar mas pines aun, cansado de ver que a veces falle el inicio del LCD o se cuelgue, decidi usar directamente un 16C54, que actua como bakpak, con un pequeño programa en asm y listo, asi con 1 pin controlo el lcd, hace un tiempo me habia propuesto hacer un soft para que este micro sea esclavo I2C y en aplicaciones donde hay este bus ahorar 1 pin mas, pero no lo termine, bueno
voy a buscar la libreria y la cuelgo para que experimenten.
saludos
Ariel
-
Tengo claro como definir el puerto que voy a utilizar mediante set_tris_lcd(x), pero no entiendo donde defino los pins a utilizar, a caso es en la struct lcd_pin_map, como se hace para decir cuales son los pines que eligo, no lo termino de entender. La unica variacion entonces siempre que se utilizen el mismo orden en el puerto c que en el d es la definicion de set_tris_lcd(x), pero si deseo cambiar el orden de los pines de control como lo haría, haciendome una libreria nueva o hay alguna modificacion posible en este codigo?
-
Hola adolfoadc.
Con un ejemplo lo entenderás.
CCS define la estructura:
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;
para el siguiente orden:
E=B0 (D0)
RS=B1 (D1)
RW=B2 (D2)
D0=B4 (D4)
D1=B5 (D5)
D2=B6 (D6)
D3=B7 (D7)
Si quieres este orden:
D0=B0 (D0)
D1=B1 (D1)
D2=B2 (D2)
D3=B3 (D3)
E=B4 (D4)
RS=B5 (D5)
RW=B6 (D6)
Tendrías que definir la estructura así:
struct lcd_pin_map {
int data : 4;
boolean enable;
boolean rs;
boolean rw;
} lcd;
Además lo que escribí unos mensajes más arriba:
Con solo ese cambio no te funcionarIa.
Hace falta también cambiar:
STRUCT lcd_pin_map const LCD_READ = {0,0,0,0,15}; // For read mode data pins are in
por:
STRUCT lcd_pin_map const LCD_READ = {15,0,0,0,0}; // For read mode data pins are in
Obligatorio tener el pin RW conectado, si no, no va. Para eliminarlo habría que pensar un poco más ...
Lo pillas?
-
Si esa parte la entiendo, ya que la asignacion de los pins se hace de forma secuencial 1º,2º,3º y 4º, pero en el caso de querer utilizar los pins por ejemplo rs RE0, enable RE2 y rw RA1, tendria que hacerme una libreria nueva para poder asignar esos pin al LCD, ya que no estan en orden como ocurre con el lcd.c y ademas en puertos distintos. Es esto asi?
-
joer, joer adolfo, que rebuscaillo.
Pués sí habría que hacerlo de otra manera.
-
Si que es rebuscaillo pero muchas veces por cuestiones de diseño no puedes hacer la distribucion de pines como esta en la libreria, por eso queria saber si se podia modificar o si era mejor crearte tu propia libreria.
Siempre que pueda utilizare la distribucion que viene en la libreria, pero..... nunca se sabe
-
Les comento que intente con la libreria hecha por QuickBuilder (me quedan unos dias de la version de prueba

), pero este tambien chequea la linea de Busy Flag, por lo tanto tambien usa la opcion de leer el Display, asi que no me sirve.
Pikman:

Por favor pasame tu libreria donde no utilizas la linea de RW, please!!