Extraño comportamiento en LCD XC8

Hola,

Estoy aprendiendo a manejar un LCD 16x2 y haciendo un programa que muestre un texto que se desplaza de izquierda a derecha, el texto estará oculto e irá apareciendo desde la izquierda y desaparecerá por la derecha, lo curioso es que una vez el texto se muestra por completo (coordenada 1,1) se para unos 3 segundos para luego seguir desplazándose hasta desaparecer por la derecha.

Como compilador uso XC8 y el pic 16F84A.

La pregunta evidente es... porque se para???
Tampoco entiendo porque tengo que poner el doble de desplazamientos para ocultar el texto en la izquierda (16 desplazamientos en negativo) cuando el texto son 8 caracteres.

Uso la librería de http://www.micros-designs.com.ar/libreria-generica-en-c-control-lcd/. Funciona perfecta aunque tengo dudas de como hacer borrar pantalla, yo lo hago inicializando el LCD cada vez, es recomendable hacerlo así??

También he visto en algunos ejemplos que se suele usar printf junto con los propios comandos de la librería LCD y en otras ocasiones sólo printf. Que ventajas tiene?? El motivo es para poder usar los comandos \f, \n etc que permiten mayor control del LCD??

Adjunto mi código:

PHP:
/* 
 * File:   main.c
 * Author: nimio
 *
 * 16F84A
 *
 * MOSTRAR FRASE POR EL LCD 16x2 E IR MOVIÉNDOLA POR LA PRIMERA FILA Y AL ACABAR
 * MOSTRARLA POR LA SEGUNDA FILA.
 *
 * Created on 30 de marzo de 2013, 3:33
 */

#include <xc.h>
#include "LCD/LCDGeneric.h"

#define _XTAL_FREQ 4000000

#pragma config FOSC=XT, WDTE=OFF, PWRTE=ON, CP=OFF


void main(void) {

    signed char x=-16; // VARIABLES PARA LAS COORDENADAS DE ESCRITURA EN LCD.
                      // x CON SIGNO PARA USAR NÚMEROS NEGATIVOS
                      // Y PODER MOSTRAR EL FINAL DEL MENSAJE.
    char y=1; 

   do {

        while (x<=16) {
            vInitLCD(); // INICIALIZACIÓN LCD Y BORRADO.
            x++;
            vGotoxyLCD(x,y); // POSICIÓN DE ESCRITURA EN LCD.
            
            vPuts_LCD("Probando");
            
            __delay_ms(300);
        }
        x=-16;
        
    } while(1);
    
}

Gracias por la atención.

1 Saludo.
 
Añado otro ejemplo con otro aparente fenómeno anómalo.

En este caso el texto se desplaza de izquierda a derecha por la primera línea usando 2 funciones, una para cada sentido de desplazamiento y a parte de tener el mismo problema que comento en el primer post, ahora, cuando acaba de rotar hacia la izquierda y va a volver a empezar visualiza antes el mensaje en las coordenadas 1,1 (x,y) durante un instante y sigue con el programa normalmente.

He visto que si en vez de hacer que aparezca el texto desde la izquierda ya se muestra en las coordenadas 1,1 no hay ningún tipo de problema, así que algo hay con lo de pasar de 0 en la coordenada x, o con los números negativos.

CÓDIGO:

PHP:
/* 
 * File:   main.c
 * Author: nimio
 *
 * 16F84A
 * XC8 COMPILER
 *
 * MOSTRAR FRASE POR EL LCD 16x2 E IR MOVIÉNDOLA DE DERECHA A IZQUIERDA POR LA PRIMERA FILA Y AL ACABAR
 * MOSTRARLA POR LA SEGUNDA FILA DE DERECHA A IZQUIERDA Y VUELTA A EMPEZAR.
 *
 * SE USARÁN DOS FUNCIONES PARA ROTAR A LA DERECHA Y A LA IZQUIERDA.
 *
 * Created on 3 de abril de 2013, 23:27
 */

#include <xc.h>
#include "LCD/LCDGeneric.h"

#define _XTAL_FREQ 4000000

#pragma config FOSC=XT, WDTE=OFF, PWRTE=ON, CP=OFF


// VARIABLES GLOBALES:

signed char x=-16; // VARIABLES PARA LAS COORDENADAS DE ESCRITURA EN LCD.
                      // x CON SIGNO PARA USAR NÚMEROS NEGATIVOS
                      // Y PODER MOSTRAR EL FINAL DEL MENSAJE.
char y=1;


// FUNCIONES DE ROTACIÓN:

void derecha(void) {
    
    while (x<=16) {
            vInitLCD(); // INICIALIZACIÓN LCD Y BORRADO.
            x++;
            vGotoxyLCD(x,y); // POSICIÓN DE ESCRITURA EN LCD.

            vPuts_LCD("Probando");

            __delay_ms(300);
        }
    
}

void izquierda(void) {
    
    while (x>=-16) {
            vInitLCD(); // INICIALIZACIÓN LCD Y BORRADO.
            x--;
            vGotoxyLCD(x,y); // POSICIÓN DE ESCRITURA EN LCD.

            vPuts_LCD("Probando");

            __delay_ms(300);
        }

}


// PROGRAMA:

void main(void) {

    
    while(1) {
        
    derecha();
    izquierda();
    
    }
}


Alguna sugerencia?

Gracias nuevamente.

1 Saludo.
 
Por que inicias constantemente al LCD? (vInitLCD();), esto por lo general se hace una sola vez... deberia estar en la configuraciòn antes del while(1). Para borrar el LCD basta con enviar el caracter (\f). Revisa las funciones del LCD.

No uses una variable con signo, no trabaja de esa forma... +1 en binario es (00000001) y -1 en binario es (10000001), con eso ya sabes donde està apuntando el valor de X en la funcion Izquierda.

Otra sugerencia es que envies caracter por caracter, esto desde una constante en string o usando punteros.

Saludos.
 
Hola ByAxel, primeramente gracias por responder:

Lo inicio porque es la única forma que tengo de borrar el LCD ya que no se como usar correctamente \f. Tal como sugieres he revisado las funciones y efectivamente aparece \f asociado a vLCD_Putc(); pero no consigo que funcione, podrías decirme como sería la sintaxis? he probado vLCD_Putc("\f"); sustituyendo vInitLCD(); en las funciones y poniendo vInitLCD() antes de while(1) y me deja en toda la pantalla la primera letra de la palabra durante el desplazamiento a derechas.

Probaré a asignar valores binarios a x como recomiendas, a ver si me aclaro!

Lo de enviar carácter por carácter te refieres a enviar el texto a visualizar letra por letra??? suena poco práctico y anula la comodidad de poner el texto entre comillas y ya está. Que ventajas aporta??


Gracias por tu tiempo.

Sigo investigando y comento.

Saludos.
 
Hola.
El \f es como un caracter, para enviarlo como tal, usa vLCD_Putc('\f'); mira que no esta entre comillas, si no entre ('').

Lo del binario solo era para ilustrar como es un número positivo y uno negativo; para lo que quieres sugiero que no uses negativos ya que es como escribir vGotoxyLCD(-5,1); y con -5 a donde en el LCD seria?... Me extraña que al compilar no te avice de estos detalles con (char - signed char - unsigned char) hay diferencias.

Saludos
 
Hola.

Efectivamente \f ya funciona con '', gracias por la aclaración.

Lo del binario he probado y nada, a parte de que probando... no se como hacer números negativos, aún así las pruebas no han funcionado (o no he sabido hacerlo).

Lo de las coordenadas yo lo veo (sin tener ni idea) como un puntero que va cambiando de posición e indica donde se inicia el texto dando por hecho que al LCD le da igual que se pase de sus límites, el LCD reproducirá el texto restante, si es el caso, que quede entre sus límites. Así que hice la suposición de que con números negativos en x podría hacer que en el LCD, inicialmente en blanco, vaya apareciendo el texto desde la izquierda hacia la derecha. Y funciona (compila OK), pero al llegar a la coordenada x=1 se para el texto un instante y sigue desplazándose tal como tengo programado, esto a la ida y vuelta del texto, cuando x pasa de 16 no hay problema alguno. Confío que cuando solucione esto también se solucione un efecto similar justo cuando salta de línea para hacer lo mismo.

Lo de los punteros lo he estado mirando por encima, aún no me he metido con ellos, pero me parece algo complicado para hacer mostrar un simple mensaje, pero todo esto desde mi desconocimiento.

Sigo investigando.

1 Saludo
 
Atrás
Arriba