Duemilanove + LCD

A riesgo de ser pesado vuelvo con mis problemas con el lcd

Arduino: Duemilanove recien estrenado con atmega 328
ide : el ultimo , creo que el 17
lcd : 2 diferentes , paralelos compatibles , en principio funcionan pues al alimentarlos + contraste se enciende la linea superior en los dos
librerias utilizadas : liquidcrystal incluida en el ide , lcd4bits bajada de la homepage y tambien el ejemplo sin libreria de la pagina de arduino en español
programas : los correspondientes como ejemplo a cada libreria , tambien he probado uno de ikkaro.com
montaje : protoboard ,todas las conexiones comprobadas hasta el aburrimiento

¿ Alguien con este arduino ha conectado el lcd ?
¿ las caracteristicas del duemilanove con respecto al diecimila no afectaran a los tiempos de iniciacion internos de las librerias ?
He leido todo el foro y algunos tuvieron algun problema parecido hace mucho tiempo
¿ lo resovieron ? ...¿ como ?
Agradeceria que alguien con experiencia me contestara
Si resuelvo el problema prometo publicarlo para ayudar a otros

Hola,

¿Es un display HD44780? Es díficil de contestar cuando no detallas modelo de lcd, diagrama de conexionado, programa de Arduino,...

Saludos

Igor R.

Hola como puse en mi post los dos lcd son compatibles paralelos , naturalmente compatibles con hd44780

El conexionado utilizo el indicado en cada programa (ejemplos contenidos en el ide), tambien baje la libreria lcd4bits la cual contiene un ejemplo,

De ikkaro.com baje un ejemplo con 8 bits,

De la pagina de arduino en español aplique el ejemplo de lcd sin librerias ,en este incluso he probado a cambiar los tiempos de los delays

Creeme que sigo al pie de la letra las conexiones diferentes en cada caso y que he buscado por la red formas y soluciones

Por eso he recabado vuestra ayuda , a ver si alguien con el duemilanove ha probado esto

De todas maneras pondre por aqui mas informacion y si quereis hacerme alguna consulta , tratare de aclararlo mas.

P.D. Muchas gracias por responder , a ver si me puedes echar una mano

Estaría bien saber el datasheet del display. Hay veces que no todos tienen el mismo pin-out aunque sean HD44780.

En teoría con la librería LiquidCrystal debería funcionarte. También en el datasheet podrás ver los tiempos para la inicialización, para saber si son los mismos que el estandar.

Yo hoy acabo de probar uno nuevo con dicha libreria con control 4 bits, y me ha funcionado sin problemas.

Si quieres que alguien pueda ayudarte, deberías detallar más info (esquema, link al datasheet, programa que has usado,....)

Saludos

Igor R.

http://www.leiritronica.pt/images/pdf/CEC2604.pdf
Me temo que no vas a sacar mucho de ahi salvo confirmar que es compatible incluso en el pinout.
El otro lleva el chip ks0066 pero que yo sepa tambien es compatible
La conexion te pongo por ejemplo el hello world del ide :

The circuit:

  • LCD RS pin to digital pin 12
  • LCD Enable pin to digital pin 11
  • LCD D4 pin to digital pin 5
  • LCD D5 pin to digital pin 4
  • LCD D6 pin to digital pin 3
  • LCD D7 pin to digital pin 2
  • 10K resistor:
  • ends to +5V and ground
  • wiper to LCD VO pin (pin 3)
    El resultado :![](http://i858.photobucket.com/albums/ab142/miguelec2007/IMG_0039.jpg/`
    ¿ Usaste el duomilanove o diecimila ?
    Tratare de poner mas informacion)

je,je,je....Siento decirte que no lo pones fácil, pero bueno....

Conexionado que yo he usado en mi LCD:

  • pin 1 Vss => Unido a masa
  • pin 2 Vdd => Unido a +5 voltios
  • pin 3 Vo => Poti de 10 Kohm (los otros dos extremos del poti a +5V y GND respectivamente)
  • pin 4 RS => Unido a pin 8 Arduino
  • pin 5 R/W => Unido a masa (no uso la opción de crear carácter)
  • pin 6 E => Unido a pin 9 Arduino
  • pin 7 DB0 => No conectado (control 4 bits)
  • pin 8 DB1 => No conectado (control 4 bits)
  • pin 9 DB2 => No conectado (control 4 bits)
  • pin 10 DB3 => No conectado (control 4 bits)
  • pin 11 DB4 => Unido a pin 10 Arduino
  • pin 12 DB5 => Unido a pin 11 Arduino
  • pin 13 DB6 => Unido a pin 12 Arduino
  • pin 14 DB7 => Unido a pin 13 Arduino
  • pin 15 A => Unido +5V a través de R=120 ohm
  • pin 16 K => Unido GND

En mi programa Arduino:
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 10, 11, 12, 13);

En lo que has puesto...no dices nada del pin R/W, ¿qué has hecho con él?

Lo primero agradecerte tu atencion , R/W si te fijas en el ejemplo de la pagina de arduino en español esta conectado. En los otros ejemplos los del IDE no lo nombran pero hice pruebas conectandolo a masa.
Gracias por pasarme el listado de las conexiones , acabo de conectarlo segun indicas excepto 15 y 16 anodo y catodo pues en mi lcd estan aparte y la iluminacion no me es necesaria y he puesto en el ejemplo que viene en el IDE "hello World" la definicion de pines ( LiquidCrystal lcd(8, 9, 10, 11, 12, 13); )
El include ya lo pone , la definicion tambien pero la cambio por la tuya pues se corresponde con la conexion.
Compilo y subo el programa a la placa y sorpresa hace lo mismo que siempre en los dos lcd ,Una hermosa linea superior con todos sus pixeles encendidos, compruebo las conexiones , muevo cables para detectar algun mal contacto , reseteo ,y lo mismo.
Mi programa ( el del IDE ) :

/*
LiquidCrystal Library - Hello World

Demonstrates the use a 16x2 LCD display. The LiquidCrystal
library works with all LCD displays that are compatible with the
Hitachi HD44780 driver. There are many of them out there, and you
can usually tell them by the 16-pin interface.

This sketch prints "Hello World!" to the LCD
and shows the time.

The circuit:

  • LCD RS pin to digital pin 12
  • LCD Enable pin to digital pin 11
  • LCD D4 pin to digital pin 5
  • LCD D5 pin to digital pin 4
  • LCD D6 pin to digital pin 3
  • LCD D7 pin to digital pin 2
  • 10K resistor:
  • ends to +5V and ground
  • wiper to LCD VO pin (pin 3)

Library originally added 18 Apr 2008
by David A. Mellis
library modified 5 Jul 2009
by Limor Fried (http://www.ladyada.net)
example added 9 Jul 2009
by Tom Igoe
modified 25 July 2009
by David A. Mellis

*/

// include the library code:
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(8, 9, 10, 11, 12, 13);

void setup() {
// set up the LCD's number of rows and columns:
lcd.begin(16, 2);
// Print a message to the LCD.
lcd.print("hello, world!");
}

void loop() {
// set the cursor to column 0, line 1
// (note: line 1 is the second row, since counting begins with 0):
lcd.setCursor(0, 1);
// print the number of seconds since reset:
lcd.print(millis()/1000);
}

Naturalmente he adaptado y probado casi todos los programas de ejemplo que vienen en el IDE.

A que lo has probado en una diecimila o placa con atmega 168 o inferior, la logica me dice que deberia ser igual pero empiezo a pensar que no.
Tengo experiencia con pics y lenguajes basic para ellos , algo de asm y no me habia pasado esto nunca.

Te agradeceria cualquier idea , muchas gracias

Preguntaba R/W porque no lo ponías. Si lo conectas, tienes que especificarlo en el código.

La verdad, que no sé que te puede estar pasando. Lo único que se me ocurre, que hagas un pequeño programa que vas poniendo a HIGH cada una de las salidas que usas para el display (ej: 8,9,10,11,12 y 13) con un delay suficiente para que tengas tiempo de medir con el multímetro en el display. (Asi te aseguras que dichos pines te funcionan y que está llegando al display la señal).

Si usas un protoboard, mirar que no te esté fallando.... Aunque si haces el programita, te sacará de dudas....

La verdad que el datasheet de Cebek no tiene nada de info (para comprobar que los delay y secuencia de encendido es compatible HD44780). De todas formas, especifica que es compatible, asi que...

Cuando pruebas la libreria lcd4bits, si usas diferentes pines a los del ejemplo, tienes que borrar el archivo *.o antes de compilar. Si no lo han cambiado de como estaba antes, los pines de datos tienen que ser consecutivos para que te funcionen (es fácil modificar ésto de la libreria).

Siento no poder ayudarte más.... (en teoría el 328 es lo mismo que 168 pero con doble de memoria, no creo que venga de ahi).

Ánimo!!! Al final será una pijada, que te está volviendo loco.... :wink:

Esta noche consulte con la almohada y pense lo de comprobar los pines y ahora lo he hecho , todos correctos ,aparte todo lo que he probado con la placa me ha funcionado ( leds ,ldr , buzzer , serial , servos , etc ).

La protoboard la he probado con los lcd en dos posiciones diferentes

El cableado al principio lo realizaba con cable flexible y ultimamente con hilo rigido que se vende especificamente para estas placas

Voy a comprobar en el ejemplo sin librerias que esta en la pagina de arduino en español los tiempos y compararlos con los que figuran en los libros que tengo de cuando trasteaba con los pic

Aclarame si puedes lo del archivo *.o en lcd4bits

No se como agradecerte tu ayuda y el tiempo que has gastado conmigo

Si te fijas en la carpeta dónde tengas LCD4BITS (Arduino/hardware/libraries/LCD4bit/) tendrás:
LCD4Bit.h
LCD4Bit.cpp
LCD4Bit.o

También dispones de un readme.txt que te explica lo que te cuento:
After a successful build of this library, a new file named "LCD4Bit.o" will appear in "Arduino/lib/targets/libraries/LCD4Bit". This file is the built/compiled library code.

If you choose to modify the code for this library (i.e. "LCD4Bit.cpp" or "LCD4Bit.h"), then you must first 'unbuild' this library by deleting the "LCD4Bit.o" file. The new "LCD4Bit.o" with your code will appear after the next press of "verify"

Si abres el *.cpp verás lo de que DB0-DB4 deben ser consecutivos, si quieres modificar ésto:

void LCD4Bit::pushNibble(int value){
int val_nibble= value & 0x0F; //clean the value. (unnecessary)

// for (int i=DB[0]; i <= DB[3]; i++) {
// digitalWrite(i,val_nibble & 01);
// val_nibble >>= 1;
// }

// MODIFICACIÓN PARA QUE PUEDAN SER NO CONSECUTIVOS
for (int i=0; i <= 3; i++) {
digitalWrite(DB*,val_nibble & 01);*

  • val_nibble >>= 1;*
  • }*
  • pulseEnablePin();*
    }
    [/color]
    Saludos
    Igor R.

De todas formas, ésto es en la versión de la librería que tengo yo (hace 1 año).

No sé si ahora han cambiado....

:wink:

He leido lcd4bits.ccp y creo que es esto:

DB4--------pin7
DB5--------pin8
DB6--------pin9
DB7--------pin10
RS----------pin12
RW---------pin11 o a masa
Enable-----pin2
Configurar en el encabezado del programa para 2 lineas

Seguramente ya lo probe en su momento , pero esta tarde volvere a intentarlo y te contare

Si funciona , lo primero que mostrara no sera "hola mundo" sino "gracias Igor"

Prueba conseguida , GRACIAS IGOR :smiley: :smiley: :smiley:

Con RW a masa me funciona en el lcd de cebek el powertip 1602L :smiley:
No mw funciona en el otro KS0066 :-?

Seguire haciendo pruebas y estudiare el uso de esta libreria :-?
La verdad es que era mi ultimo cartucho , iba a guardarlos ya en el cajon :cry:

Espero que esto sirva de ayuda para otros miembros del foro :-*

Muchas gracias Igor :wink:

Me alegro!!! :wink:

El de cebek es un powertip??? Yo tengo un lcd Powertip funcionando (PC1202LRS-AWA-B) con la libreria LCD4bits, no he probado con LiquidCrystal....

De todas formas, para otro día, es mejor dar cuantos más datos mejor. Es díficil "adivinar"....je,je,je

A jugar con el lcd.... ;D

Saludos

Igor R.

Por cierto... lo prometido es deuda.... una foto del LCD que ponga "Gracias Igor" ;D ;D ;D

¿ como puedo postear fotos ?
¿ como puedo cambiar el titulo del post para incluir solucionado?

A ver si la puedes ver:

Ando peleandome para aprender las llamadas de esta libreria , me da que la liquidcrystal es mejor.
en esta en la segunda linea me produce un parpadeo cuando se reinicia el loop , aparte tengo que aprender a reconvertir variables en caracteres
algo como char* , pero bueno , tiempo al tiempo
Muchas gracias , dejo el programa para quien quiera

// ejemplo de uso de la libreria LCD4Bit
#include <LCD4Bit.h> // llamada a la libreria

LCD4Bit lcd=LCD4Bit(2);// definicion de numero de lineas del lcd

void setup(){
lcd.init();// inicializacion del lcd

}

void loop() {

lcd.clear();// limpiar pantalla
lcd.cursorTo(1,2);// linea 1 , caracter 2
lcd.printIn("GRACIAS IGOR");
lcd.cursorTo(2,5);// linea 2 , caracter 5
lcd.printIn("Miguel");
delay(2000);// le doy bastante tiempo para evitar parpadeo

}

ja,ja,ja

Muy bueno!!

Pistas con tus problemas:

  • Busca acerca de itoa y sprintf. (Recuerda que detrás de Arduino-Wiring hay C y puedes usarlo)
    La librería utilizado en Arduino es:
    AVR Libc Home Page

  • El parpadeo es porque estás refrescando todo el rato, ten en cuenta que estos lcd, una vez pasado los datos a su memoria, no necesitas refrescar. El lcd.clear en setup() reducirá tu parpadeo.... Bueno, en realidad todo en setup() iría perfecto (sólo se ejecuta una vez).

Cuidado con itoa, si quieres mostrar decimales y tu primera cifra decimal es un 0...

Yo he usado esta librería en varias cosillas, y sin problemas. :smiley:

Ánimo!!

Igor R.

:smiley: :smiley: :wink: ;D ;D :smiley: :smiley:

Para quien este siguiendo este hilo , esto le ayudara :

http://electrolabo.com/arduino/Mostrar%20valores%20en%20LCD%20con%20Arduino.pdf

¿ Que significa en este array los segundos corchetes y el 15 de dentro, no deberia tener solo el primer indicador [ 6 ] ? es del ejemplo que viene con la libreria lcd4bits

//some messages to display on the LCD
char msgs[6][15] = {"apple", "banana", "pineapple", "mango", "watermelon", "pear"};
int NUM_MSGS = 6;

Y el char*?

int pick = random(NUM_MSGS);
char* msg = msgs[pick];