TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Thulsa Doom en 10 de Febrero de 2013, 18:06:11
-
Hola a todos, pues llevo varios días intentando que funcione un display lcd 2x16 y no hay manera.
Estoy utilizando C18 v3.41 y el MPLAB 8.88
Hago la práctica que está en el tutorial c18 que ha realizado Suky e incluso el ejemplo que está en la propia guía que tiene MPLAB y con ninguno de ellos funciona.
He probado en hacer correr el código en el proteus y en hardware y no funciona.
Esos mismos montajes los pruebo con un código realizado en CCS C y va perfecto
He probado compilar el código en dos pc diferentes y sigo con el mismo resultado.
He probado con dos cristales diferentes uno de 4MHz y otro de 20MHz y nada
El código es este:
#include <p18f4620.h>
#include "Drivers/delays.h"
#include "Drivers/xlcd.h"
#pragma config OSC=HS,FCMEN=OFF,IESO=OFF
#pragma config PWRT=ON,BOREN=OFF,BORV=0
#pragma config WDT=OFF,WDTPS=32768
#pragma config MCLRE=ON,LPT1OSC=OFF,CCP2MX=PORTC,PBADEN=OFF
#pragma config STVREN=OFF,LVP=OFF,XINST=OFF,DEBUG=OFF
#pragma config CP0=OFF,CP1=OFF,CP2=OFF,CP3=OFF
#pragma config CPB=OFF,CPD=OFF
#pragma config WRT0=OFF,WRT1=OFF,WRT2=OFF
#pragma config WRTB=OFF,WRTC=OFF,WRTD=OFF
#pragma config EBTR0=OFF,EBTR1=OFF,EBTR2=OFF
#pragma config EBTRB=OFF
void DelayFor18TCY(void){
Delay10TCYx(2);
}
void DelayPORXLCD(void){
Delay1KTCYx(15);
}
void DelayXLCD(void){
Delay1KTCYx(2);
}
void comandXLCD(unsigned char a){
BusyXLCD();
WriteCmdXLCD(a);
}
void gotoxyXLCD(unsigned char x, unsigned char y){
unsigned char direccion;
if(y != 1)
direccion = 0x40;
else
direccion = 0;
direccion += x-1;
comandXLCD(0x80 | direccion);
}
void main(void){
OpenXLCD( FOUR_BIT & LINES_5X7 );
comandXLCD(0x06);
comandXLCD(0x0C);
putrsXLCD("Probando LCD");
gotoxyXLCD(1,2);
putrsXLCD("Por Thulsa_Doom");
while(1){
}
}
Cuelgo el proyecto por si lo quieren compilar y probarlo
A ver si alguien me puede echar una mano ya no sé por donde seguir
-
Hola, creo que la falla, es que no colocas la definicion de frecuencia del cristal... esto tiene que ir, antes de las definiciones de delays y del LCD.. es decir, a continuacion que defines el tipo de micro...
Saludos!
Norberto
-
Pues no se si será eso pero así como está funciona un led que parpadea pero el LCD no.
Haciendo pruebas y modificando el código para que parpadee un led he descubierto que el programa se bloquea o se queda retenido en la instrucción de inicialización del display.
compilo el programa y lo cargo al montaje en hardware que he hecho con un ICD2 y al correrlo en modo debugger he observado que el programa se retiene al llegar a
OpenXLCD(FOUR_BIT & LINES_5X7);y de la única manera que sale es si le doy a pausa y run de nuevo, en se momento ya empieza a parpadear el led pero no sale nada en pantalla
el código modificado es este
#include <p18f4620.h>
#include "Drivers/delays.h"
#define UPPER
#include "Drivers/xlcd.h"
#pragma config OSC=HS,FCMEN=OFF,IESO=OFF
#pragma config PWRT=ON,BOREN=OFF,BORV=0
#pragma config WDT=OFF,WDTPS=32768
#pragma config MCLRE=ON,LPT1OSC=OFF,CCP2MX=PORTC,PBADEN=ON
#pragma config STVREN=OFF,LVP=OFF,XINST=OFF,DEBUG=OFF
#pragma config CP0=OFF,CP1=OFF,CP2=OFF,CP3=OFF
#pragma config CPB=OFF,CPD=OFF
#pragma config WRT0=OFF,WRT1=OFF,WRT2=OFF
#pragma config WRTB=OFF,WRTC=OFF,WRTD=OFF
#pragma config EBTR0=OFF,EBTR1=OFF,EBTR2=OFF
#pragma config EBTRB=OFF
void DelayFor18TCY(void){
Delay10TCYx(2);
}
void DelayPORXLCD(void){
Delay1KTCYx(15);
}
void DelayXLCD(void){
Delay1KTCYx(2);
}
void comandXLCD(unsigned char a){
BusyXLCD();
WriteCmdXLCD(a);
}
void gotoxyXLCD(unsigned char x, unsigned char y){
unsigned char direccion;
if(y != 1)
direccion = 0x40;
else
direccion = 0;
direccion += x-1;
comandXLCD(0x80 | direccion);
}
void main(void){
char i = 0;
ADCON1 = 0x0F;
TRISA = 0x00;
LATA = 0x00;
OpenXLCD(FOUR_BIT & LINES_5X7);
comandXLCD(0x06);
comandXLCD(0x0C);
putrsXLCD("Probando LCD");
gotoxyXLCD(1,2);
putrsXLCD("Por Thulsa_Doom");
while(1){
for(i=0;i<10;i++){
LATA = 0xFF;
Delay10KTCYx(3000);
LATA = 0x00;
Delay10KTCYx(3000);
}
}
}
No sé a que se debe que se quede retenido ahí.
subo de nuevo el código ya compilado y el proyecto entero
-
Hola, estoy seguro que ya lo has hecho pero por si acaso, debes recordar que cuando usas esa librería ( XLCD) en modo de 4 bits has de definir el nibble que usas, sea bajo o alto dentro de la librería.
/* When in 4-bit interface define if the data is in the upper
* or lower nibble. For lower nibble, comment the #define UPPER
*/
/* #define UPPER */
-
Pues si, he comentado y descomentado esa línea y el resultado es el mismo
-
Usás el pin RW conectado a tierra?
-
Buenas, pues he logardo que el código funcione en proteus pero no he conseguido que funcione en hardware.
La manera de que funcione es añadirle a la ventana del proyecto el código fuente de la librería XLCD.
Cuelgo captura del proyecto porque una imagen vale más que mil palabras
(http://img69.imageshack.us/img69/425/capturaxlcd.jpg) (http://imageshack.us/photo/my-images/69/capturaxlcd.jpg/)
Ahora ya en proteus me sale el texto en pantalla y el led parpadea pero en hardware se sigue quedando trabado en la función
OpenXLCD(FOUR_BIT & LINES_5X7);y ya no parpadea el led ni pausando y pulsando de nuevo el botón Run
-
La manera de que funcione es añadirle a la ventana del proyecto el código fuente de la librería XLCD.
Hola, #include "Drivers/xlcd.h" .. significa que "Drivers/xlcd.h" (entre comillas) se encuentra en la misma carpeta que el proyecto... quizás no la tenias ubicada en esa posición..., y por eso la escribiste dentro del programa...
-
No, yo siempre lo que hago es sacar los archivos que interviene en el proyecto y añadirlos a la carpeta del proyecto por si hago modificaciones en ellos, creo una carpeta donde los recojo y luego los llamo con las comillas, ese no es el problema porque ahora ya me funciona en el proteus pero en el harware no me va
Usás el pin RW conectado a tierra?
y No, no lo use de esa manera, no lo uso así porque el código en CCS C no falla y funciona bien
-
Ya se cual es el problema, resulta que utilizo el mimo pin para el ICD2 que para la patilla RW del display, ósea la patilla 39 (RB6) del chip, aunque lo tengo separado con una resistencia de 10k no puedo utilizarlo.
Pero ahora tengo otro problema, resulta que añadiendo los archivos fuente del XLCD a la ventana del proyecto ya funciona, pero solo funciona con un cristal de 4MHz, si intento hacer que funcione el código poniendo un cristal de 20MHz en el chip, el display no funciona, salen caracteres raros, creo que tiene que ver con el tiempo de sincronismo del display.
Según veo en el documento de librerías que tiene el MPLAB los tiempos se calculan con una formula.
void DelayPORXLCD (void)
{
Delay1KTCYx(60); // Delay of 15ms
// Cycles = (TimeDelay * Fosc) / 4
// Cycles = (15ms * 16MHz) / 4
// Cycles = 60,000
return;
}
void DelayXLCD (void)
{
Delay1KTCYx(20); // Delay of 5ms
// Cycles = (TimeDelay * Fosc) / 4
// Cycles = (5ms * 16MHz) / 4
// Cycles = 20,000
return;
}
Pero aplico la formula y sigue igual, entonces ya no se que hacer para adaptar el driver a un cristal de 20MHz a ver si alguien me echa una mano