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);
}