[Icestudio] Videoblog. Capítulo 34: FPGAs: Display SPI de 4 dígitos de 7 segmentos

396 views
Skip to first unread message

Obijuan

unread,
Jul 21, 2019, 9:26:37 AM7/21/19
to FPGAwars: explorando el lado libre

¡Hola!

  En este videoblog se muestra cómo utilizar el display SPI de 4 dígitos de 7 segmentos COM-1129 de SparkFun



WIKI:


Cuadérno técnico 7: Display SPI de 4 dígitos de 7 segmentos



¡Que las FPGAs libres os acompañen!

Saludos, Obijuan



Jose Pico

unread,
Jul 24, 2019, 1:39:12 PM7/24/19
to FPGAwars: explorando el lado libre
 Qué currada y cuanto valor añadido tiene todo lo que presentas.
 
 Saludos y Mil Gracias.

Democrito

unread,
Aug 6, 2019, 11:51:44 PM8/6/19
to FPGAwars: explorando el lado libre
Hola!

Después de repasar las lecciones de Obijuan y dado que no tenía ese tipo de display, decidí hacer lo mismo pero aplicado al MAX7219.

SPI7SEGDISPLAY.jpg

Nota importante: Cuando queramos manejar un periférico SPI hemos de ir al datasheet para comprobar el "modo" en el que trabaja, que hasta donde yo sé pueden ser de 4 formas. El diseño del SPI maestro de Obijuan trabaja en el Modo 0. Si el SPI esclavo trabaja en otro modo no podrán entenderse entre ellos (maestro con esclavos). Por suerte el MAX7219 también trabaja en el Modo 0.

En las primeras pruebas que hice no conseguí hacerlo funcionar, y según el datasheet del MAX7219 parece ser necesario un SPI maestro de 16bits.

datasheet.PNG


Estoy casi seguro que este problema se podría solucionar de varias formas, pero yo me decidí a tomar el módulo SPI maestro que diseñó Obijuan y modificarlo internamente para poder tener una entrada de 16bits directa.


El MAX7219 es un poco complicado de manejar. Para comenzar hay que enviarle varias instrucciones para configurarlo. Para ello hay que enviarle estas instrucciones (sin remedio) antes de hacer nada. El primer byte es el comando y el segundo es el dato.

0B, 07 // Muestra los 8 dígitos.
09, FF // Con "FF" decodifica los 8 display (en BCD).
0F, 00 // Sin test de prueba.
0A, 03 // Intensidad lumínica, rango de 0 hasta 15.
0C, 01 // Sin Shutdown.

Después ya le podemos enviar los números, pero con la particularidad de que hay que poner el número de dígito (de los 8 que tiene) y luego el número a representar. Por ejemplo, para poner "5" en el tercer display he de enviar (en hexadecimal) 03 05. Se considera como primer dígito (display) el que está todo a la derecha (lo comento como referencia para localizar los siguientes).

He hecho dos diseños básicos para verlo en funcionamiento. Este primer diseño es simplemente mostrar 8 números "fijos", y puedes modificarlos antes de subirlo a tu FPGA.

demo.PNG

En este diseño le puse un contador muy particular porque cuenta desde el 0 hasta el 15 una sola vez, el resto de las veces sólo contará desde el 5 hasta el 15 de forma indefinida (repite ese conteo continuamente). La razón se debe a que he querido evitar ejecutar los comandos de inicio de configuración (sólo lo hará una sola vez). Dichos comandos está en el modulo llamado "CMD"; el resto son las constantes numéricas que queramos representar.

El segundo ejemplo es un poco tedioso de manejar. Se trata de enviar comandos desde el puerto serie.

Serial_demo.PNG

Cada dos bytes recibidos (comando y dato) formará una palabra de 16bits. Es bastante engorroso hacerlo trabajar de esta manera, porque como dije al comienzo, lo primero de todo es enviarle las palabras de configuración, y luego ya podemos poner un número dado en el display que queramos.

Para facilitar un poco las cosas, podéis hacer lo siguiente, copiar y pegar lo que pongo más abajo (con el Script Communicator):

0f 00 0b 07 09 ff 0a 05 0c 01

Y luego, a modo de ejemplo, sacar ocho números diferentes:
01 08 02 07 03 06 04 05 05 04 06 03 07 02 08 01

Evidentemente también lo puedes hacer de uno en uno. Por ejemplo poner un 0 en el quinto display: 05 00 (posición, número)

Dejo adjunto las dos "demos" y un zip con los módulos que he modificado o creado.

Saludos!



demoMax7219.ice
Serial_demo.PNG
Modulos.zip

Democrito

unread,
Aug 7, 2019, 12:00:14 AM8/7/19
to FPGAwars: explorando el lado libre
Perdón, en el anterior post subí una imagen en vez del ICE. Adjunto el ICE que falta, el Serial-SPI de 16 bits.
SerialSPI16master.ice

charli va

unread,
Aug 7, 2019, 1:45:23 AM8/7/19
to fpga-wars-explora...@googlegroups.com
Muchas gracias Demócrito!!!! 

El mié., 7 ago. 2019 a las 6:00, Democrito (<spo...@gmail.com>) escribió:
Perdón, en el anterior post subí una imagen en vez del ICE. Adjunto el ICE que falta, el Serial-SPI de 16 bits.

--
Has recibido este mensaje porque estás suscrito al grupo "FPGAwars: explorando el lado libre" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a fpga-wars-explorando-el...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/fpga-wars-explorando-el-lado-libre/ff665799-2217-4153-b2fd-c9ffe24198be%40googlegroups.com.

Juan Gonzalez Gomez

unread,
Aug 7, 2019, 1:58:36 AM8/7/19
to FPGA-WARS: explorando el lado libre
Woala! Qué pasada demócrito! 😍😍

Muchas gracias! 

Estos días estoy con poca conexión a Internet. En cuanto esté operativo subo tu módulo spi a la colección Jedi

Saludos, Obijuan

Jose Pico

unread,
Aug 8, 2019, 6:34:28 AM8/8/19
to FPGAwars: explorando el lado libre
Muy bueno!

Gracias

Diego Harosteguy

unread,
Aug 9, 2019, 4:05:00 PM8/9/19
to FPGAwars: explorando el lado libre
Hola!, que bueno democrito, yo tambien estoy trabajando hace algunas semanas con este modulo max7219, pero con resultados escasos jaja.
Gracias por allanar el camino.

Saludos.

           Diego,

Democrito

unread,
Aug 11, 2019, 11:27:29 PM8/11/19
to FPGAwars: explorando el lado libre
Hola de nuevo!

Antes de nada daros las gracias por vuestros comentarios y pruebas.

He diseñado un circuito que automatiza la configuración del MAX7912, que no es otra cosa que enviarle las 5 palabras de 16bits para dejar ese chip configurado como controlador de displays de 8 dígitos (este chip también puede funcionar para controlar una matriz de 8x8 leds, pero no es este el caso).

El circuito me ha quedado así:

iniMAX7912.PNG


He puesto una salida llamada "iniTIC" que da un tic de reloj una vez que termina de ejecutar los comandos de configuración. Se ejecuta muy rápidamente. Como decía, una vez realizada esa faena ya lo podemos manejar con mucha comodidad, tan sólo hemos de poner la posición y el número que deseemos representar.

He utilizado una máquina de estado tipo contador. Ejecuta los 5 tics necesario para poder recorrer una pequeña ROM con los comandos que configura el MAX7912. Cuando termina de enviar los comandos de configuración, un multiplexor conmuta la entrada de la ROM a la entrada general, que es por donde entrarán los datos a partir de ese momento.

Voy a poner ahora, cosas que se me olvidaron en el post anterior. Los siguiente comando+datos tiene esta función:

En byte de datos (los 8 bits más bajos de los 16 que enviamos), sabemos que 00 es un 0, 01 es un 1, 06 es un 6... pues si ponemos 0F apaga el display.
Ejemplo -----> Apagar el display número 6, pues enviamos:

060F

Para poner el punto es igual de sencillo. Cuando enviamos un número siempre es un" 0" y el número a representar. Pues para enviar un número con el punto hay que poner 8 en vez de 0.
Ejemplo -----> Enceder quinto display y representar el número 1 y además ponga el punto:

0581

Ese "8" en el ejemplo anterior es lo que pone el punto, si lo cambias a 0, se apagaría dicho punto.

Lo mismo podemos hacer para apagar un display dado pero que sí esté el punto.
Ejemplo ------> Apagar el segundo display pero que quede encendido el punto.

028F

Me acabo de dar cuenta que con una imagen gráfica se entenderá mejor.

crokis.PNG

En realidad, cuando ponemos 0 u 8 para que vaya sin o con punto, el MAX7912 sólo se fija en el bit D7.

Adjunto tres ICEs:

iniMAX7912.ICE        Es el modulo principal. Por dentro ya está automatizado la configuración del MAX7912.

SerialMAX7912.ICE   Para manejar los displays desde el puerto serie, ahora sí que es cómodo y rápido hacer pruebas de representaciones numéricas.

SerialRX16bits.ICE   Es el módulo del receptor serie de 16bits.

Saludo.
iniMax7912.ice
SerialMAX7912.ice
SerialRX16bits.ice

Democrito

unread,
Aug 16, 2019, 1:13:14 PM8/16/19
to FPGAwars: explorando el lado libre
He descubierto un bug que afecta a los adjuntos anteriores del anterior post. No inicializa el MAX7912 de forma correcta. Y no me di cuenta porque se había quedado configurado de otras veces anteriores y di por hecho que funcionaba bien al cargar de nuevo el circuito.

Creo saber de dónde viene el problema, pero hasta este domingo no podré hacer mucha cosa porque he de atender a cuestiones personales.

Un millón de disculpas.

Saludos.


charli va

unread,
Aug 16, 2019, 1:43:42 PM8/16/19
to fpga-wars-explora...@googlegroups.com
Ni te preocupes democrito! Faltaría más !

Mil gracias a ti por el esfuerzo!

--
Has recibido este mensaje porque estás suscrito al grupo "FPGAwars: explorando el lado libre" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a fpga-wars-explorando-el...@googlegroups.com.

Democrito

unread,
Aug 23, 2019, 10:43:38 AM8/23/19
to FPGAwars: explorando el lado libre
Ya he conseguido dar con el problema. En esencia no había ninguno por parte del circuito, lo que sucedía era que el MAX7912 necesita un tiempo mínimo para inicializarse antes de poder recibir información externa. Le he dado 250ms para ello. Por otro lado, he ampliado un poco la parte de configuración, que para evitar que salgan al comienzo números, rayas y puntos aleatorios, lo que he hecho es que salga inicialmente todo limpio y lo único que se enciende son los puntos de todos los dígitos. Esto último es modificable dentro de la tabla llamada CMD.

Copio de nuevo información importante (y ampliada) para no tener que mirar en los post anteriores y adjunto los circuitos corregidos:

Este chip puede funcionar a 10MHz como máximo y lo estamos haciendo trabajar a unos cómodos 2MHz.

He puesto una salida llamada "iniTIC" que da un tic de reloj una vez que termina de ejecutar los comandos de configuración. Realizado esto ya podemos poner la posición y el número que deseemos representar. Todo ello se ejecuta en menos de medio segundo.

Cómo enviar un número (o vacío), con o sin punto a un dígito dado:

En realidad, cuando ponemos 0 u 8 para que vaya con punto o sin él, el MAX7912 sólo se fija en el bit D7.

Lo más sencillo es hacerlo desde el puerto serie. Si no quieres tener problemas y te funcione a la primera, descárgate el Script Communicator. Desde allí, a modo de ejemplo le vamos a enviar los números "01234567" (copia y pega esto). El circuito que hay que usar es el SerialMAX7912.ICE

01 07 02 06 03 05 04 04 05 03 06 02 07 01 08 00

El dígito del todo a la derecha es el dígito nº1 (el primero) y el de todo a la izquierda es el nº8 (el último).

Adjunto tres ICEs:

iniMAX7912.ICE        Es el modulo principal. Por dentro ya está automatizado la configuración del MAX7912.
(Corregido)

SerialMAX7912.ICE   Para manejar los displays desde el puerto serie, para hacer un testeo rápido de representaciones numéricas. (Corregido)

SerialRX16bits.ICE   Es el módulo del receptor serie de 16bits.
(Sin cambios)
iniMax7912.ice
SerialMAX7912.ice
SerialRX16bits.ice

Obijuan

unread,
Aug 23, 2019, 10:50:47 AM8/23/19
to FPGAwars: explorando el lado libre
¡Muchísimas gracias Demócrito! :-)

¡Gracias por compartirlo! Me encanta cómo has planteado (y solucionado) el tema de la automatización de la configuración. Lo has hecho de una forma muy elegante y ocultando los detalles para el usuario que lo quiera manejar. ¡Me encanta la idea! Esto mismo se puede aplicar al resto de periféricos y dispositivos que necesitan una configuración inicial: LCDs, modems, etc. Sin duda que lo usaré. Muchísimas gracias :-)

Saludos, Obijuan




Reply all
Reply to author
Forward
0 new messages