LCD INTERRUPCION

Hola, les agradecería alguna ayuda con un par de problemas que tengo en un programita:
El programa muestra en un LCD los datos recibidos de un encoger óptico.
El primer problema era que los datos en el LCD se muestran bien hasta que jiro el encoder unas 4 o 5 cinco posiciones (a veces mas a veces menos) el programa del encoder esta bien porque mostrando los datos por el puerto serie lo hace perfecto (bueno casi pero eso viene después) en este punto la pantalla empieza a mostrar caracteres raros por todos lados pero en la posición donde quiero mostrar los datos se siguen viendo estos, como que aparte de los datos se inventa caracteres? ahora bien, estoy usando las dos interrupciones (creo que esto puede tener algo que ver!) y lo que quiero saber es por que mi problema se soluciona cuando modifico el codigo y le pongo un lcd.begin(16, 2); justo antes de mostrar los datos, por mas que yo lo haya puesto antes si no lo pongo justo antes de mostrar los datos me aparecen estos errores?.

Bien paso el codigo poniendo en rojo la instruccion que me soluciona el problema.

Agradecería info porque me gusta saber el por que de las cosas??

Pido disculpas por no postear el autor de la mayoría de este código, no recuerdo de donde lo saque, hace mucho que lo empecé y en esa época era muy desprolijo y no le daba importancia a eso.

int encoder0PinA = 2;
int encoder0PinB = 3;
volatile int encoder0Pos = 0;
volatile int encoder0PinALast = LOW;
volatile int n = LOW;
int valNew = 0;
int valOld = 0;
volatile int m = LOW;
#include <LiquidCrystal.h>
LiquidCrystal lcd(13,12,8,9,10,11);

void setup()
{
lcd.begin(16, 2);
pinMode (encoder0PinA,INPUT);
pinMode (encoder0PinB,INPUT);
Serial.begin (9600);
attachInterrupt(1, CountA, CHANGE);
attachInterrupt(0, StateB, FALLING);
}

void loop()
{
encoder0PinALast = n;
valNew = encoder0Pos;
if (valNew != valOld) {
Serial.print (encoder0Pos, DEC);
valOld = valNew;
Serial.print ("/");

lcd.begin(16, 2);
lcd.setCursor(0, 1);
lcd.print(encoder0Pos,DEC);
}
}

void CountA()
{
n = digitalRead(encoder0PinA);
if ((encoder0PinALast == LOW) && (n == HIGH)) {
if (m == LOW) {
encoder0Pos--;
}
else {
encoder0Pos++;
}
}
}
void StateB()
{
m = digitalRead(encoder0PinB);
}

Hola
Aunque no controlo mucho esto, pero veo que posicionas los datos en la columna de abajo del display porque pones:

lcd.setCursor(0, 1);

Supongo que es lo que quieres porque si la idea es escribir en la columna de arriba seria lcd.setCursor(0, 0);

No pones en ningun lado lo de limpiar el display:

lcd.clear();

que igual puedes sustituir la definicion cada vez que escribes.

Y por ultimo, a mi me pasa en la comunicacion con el arduino y un modem, que me presenta caracteres raros que son el retorno de carro y el avance de linea, que en mi codigo, para eliminarlos he hecho que si detecta uno de estos caracteres, imprima un espacio, asi el codigo se ve limpio en el display, te pongo el fragmento de mi codigo:

void lectura(){
  // when characters arrive over the serial port...
  if (Serial.available()) {
    // wait a bit for the entire message to arrive
    delay(100);
    // read all the available characters
    char dato= ' ';
    while (Serial.available() > 0) {
      // display each character to the LCD
      dato=(Serial.read());
      if (dato==13 || dato==10){
         lcd.write(' ');
      }
      else{
      lcd.write(dato);
      }
    }
  }
}

Un saludo

Hola Heke, muchas gracias por tu respuesta!! Te comento que soy consciente de que estoy imprimiendo en la segunda línea??

Con respecto a lo de que no estoy limpiando el LCD quisiera saber que necesidad hay de que haga esto aparte de que cuando por ej. muevo el encoder en la dirección de las agujas del reloj y llego a al numero 10 (los voy imprimiendo en el display) y luego giro en sentido contrario el encoder? me va a quedar el 0 (del diez que nunca limpie!). ¿pero hay alguna otra razón??

Sigo sin entender por que me aparecen estos caracteres raros y me desaparecen cundo agrego esa linea de código!

Te agradezco mucho tu ayuda!

Fernando, creo que si sustituyes la linea que has puesto en rojo:
"lcd.begin(16, 2);" por la que te dije de limpiar el display "lcd.clear();" te puede funcionar tambien.

Esto es suposicion pero, es posible que tuvieras que limpiar el buffer del puerto serie con el "serial.flush()" lo de los caracteres raros, si no son retornos de linea o CR, solo se me ocurre que llene el display y como no tiene funcion de autoscroll machaque datos. Pero es solo suposicion.

Esto es intentando imaginar porque no se como pilula el encoder, si te manda numeros en negativo o algo, o es que pierde sincronizacion, o llena buffer, o es solo el display.

Probablemente la orde que tu le das de "lcd.begin(16, 2);" lo que haga es inicializar el display aparte de definirlo, por eso veas bien los caracteres, pero ya te digo, es solo un intento de imaginar, no te puedo decir a ciencia cierta.

Un saludo y suerte con ello

PD: Se me olvidaba, en este enlace que te dejo tienes los datos extendidos del display compatible hitachi aparte de la tabla de caracteres a ver si consigues identificar que codigos son: