Autor Tema: Matriz de leds 8X8.  (Leído 68041 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado jmcs87

  • PIC10
  • *
  • Mensajes: 44
Re: Matriz de leds 8X8.
« Respuesta #75 en: 10 de Febrero de 2010, 20:15:18 »
Hola veo que sigues con tus avances muy bien ;-) ..... ya vi q arreglaste el problema anterior :-/ :-/ .
ahora por q te sale en forma de espejo....facil, porque al cargar los datos en el registro este lo carga uno de tras de otro empujando la informacion.

ten en cuenta que para cargar la informacion en tu caso debes empesar por la columna final(en vez de empesar con byte_1 empiesa con byte_8)

saludos

te dejo el codigo modificado
Código: [Seleccionar]
; CARTEL DE LEDS. de 8x8. Pruebas de transmisión de un caracter almacenado en columnas.
; Xtal = 4 Mhz


                      list p=16F84A                      ;Microcontrolador utilizado
                      #include P16F84A.inc               ;Definicion de registros SFR

 
 __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC



                      CBLOCK 0x0C                       ;En esta posicion se declaran los registros de usuario
             
                      MASCARA                            ;mascara para operación AND con ALMACEN
                      ALMACEN                            ;Registro donde se coloca el byte para operación AND con MASCARA
                      FILA                               ;Registro que rota cada 2ms para realizar multiplexión por filas
                      CARACTER                           ;Registro que controla los 8 bytes que forman el caracter

                      ENDC


BData               equ   3                      ;pin por donde salen datos al 74HC164
BClock       equ   2                      ;pin que ejecuta el clock de transmisión de datos al registro



;****************************************************************************************************************************
;           
;****************************************************************************************************************************

Reset                 org   0x00
                      goto   Inicio          ;Salto a inicio del programa
                      org   0x05
                 

;****************************************************************************************************************************
;                  Inicio del microcontrolador
;****************************************************************************************************************************


Inicio                bsf         STATUS,RP0             ;Banco 1
                      movlw       0x00
                      movwf       TRISA                  ;puerta A salida
                      movlw       0x00
                      movwf       TRISB                  ;puerta B salida
                      movlw       b'00000110'   
                      bcf         STATUS,RP0             ;Banco 0

              clrf   PORTA                  ;limpio registros
                      clrf        MASCARA
                      clrf        FILA
                      clrf        CARACTER

                      movlw       b'11111111'            ;aseguramos todas las filas apagadas
                      movwf       PORTB
                     
                      movlw       b'11111110'            ;registro de filas empieza activada la fila 1
                      movwf       FILA
                     
                      movlw       b'00000001'            ;cargo 1 en mascara
                      movwf       MASCARA
                     
                      movlw       .8
                      movwf       CARACTER               ;8 bytes forman el caracter


;****************************************************************************************************************************
;           AQUI LLAMO A LOS BYTES QUE CONFORMAN EL CARACTER
;****************************************************************************************************************************


Dato                  call        byte_8
                      movwf       ALMACEN
                      call        TX
                      call        byte_7
                      movwf       ALMACEN
                      call        TX
                      call        byte_6
                      movwf       ALMACEN
                      call        TX
                      call        byte_5
                      movwf       ALMACEN
                      call        TX
                      call        byte_4
                      movwf       ALMACEN
                      call        TX
                      call        byte_3
                      movwf       ALMACEN
                      call        TX
                      call        byte_2
                      movwf       ALMACEN
                      call        TX
                      call        byte_1
                      movwf       ALMACEN
                      call        TX

                      movf        FILA,0                 ;muevo el contenido de FILA a PORTB
                      movwf       PORTB                  ;para activar la salida que corresponda del PORTB
                      call        Retardo_2ms            ;durante 2 ms
     


                      bcf         STATUS,C               ;evito acarreos
                      rlf         MASCARA                ;roto mascara para siguiente dato de operación AND
                      bsf         STATUS,C               ;evito acarreos
                      rlf         FILA                   ;roto fila para sigiente fila de la multiplexación
                      decfsz      CARACTER,1             ;controlo si pasaron ya los 8 bytes del caracter
                      goto        Dato                   ;no, pues siguiente dato a registro
              goto        Inicio                 ;si, pues vuelta a empezar
                     

   
;****************************************************************************************************************************
;                 Rutina envia bit
;****************************************************************************************************************************



TX                    movlw       b'11111111'
                      movwf       PORTB
                      movf        ALMACEN,0
              andwf   MASCARA,0 ;Hacemos ALMACEN (AND) MASCARA para determinar el bit a enviar.
              subwf   MASCARA,0 ;[ALMACEN (AND) MASCARA] - MASCARA, si esto es cero el bit a enviar es 1, sino 0.
              bcf   PORTA,BData ;Primero cargamos un 0.
              btfsc   STATUS,Z ;La operacion anterior es 0?
              bsf   PORTA,BData ;Si, cargamos un 1 en el bit
   

                      bcf         PORTA,BClock           ;pone a 0 CLOCK
                      nop                                ;espera 1 micros (a 4Mhz)
                      nop                                ;otro
                      nop                                ;otro
                      nop                                ;otro
                      bsf         PORTA,BClock           ;pone a 1 CLOCK
                      nop                                ;1 micros
                      return`
                           
;****************************************************************************************************************************
;                                                     CARACTER
;****************************************************************************************************************************

byte_1                movlw       b'11111111'
                      return

byte_2                movlw       b'10000001'
                      movwf       ALMACEN
                      return

byte_3                movlw       b'10000001'
                      movwf       ALMACEN
                      return

byte_4                movlw       b'10000001'
                      movwf       ALMACEN
                      return

byte_5                movlw       b'10000001'
                      movwf       ALMACEN
                      return

byte_6                movlw       b'10000001'
                      movwf       ALMACEN
                      return

byte_7                movlw       b'11111111'
                      movwf       ALMACEN
                      return

byte_8                movlw       b'11111111'
                      movwf       ALMACEN
                      return

                     
                      INCLUDE <RETARDOS.INC>             ;subrutinas de control de tiempos de retardo.
                      END
                   

« Última modificación: 10 de Febrero de 2010, 20:22:58 por jmcs87 »

Desconectado antimason

  • PIC12
  • **
  • Mensajes: 81
Re: Matriz de leds 8X8.
« Respuesta #76 en: 11 de Febrero de 2010, 07:13:53 »
jmcs87, agradezco tu respuesta, pero aunque en este caso valdría lo que propones, imagínate que los datos los voy cogiendo de una memoría externa de forma secuencial.........¿como me apañaría?, tú solución se me hace algo dificil en ese caso.

Desconectado jmcs87

  • PIC10
  • *
  • Mensajes: 44
Re: Matriz de leds 8X8.
« Respuesta #77 en: 11 de Febrero de 2010, 14:01:38 »
En el caso de usar memoria externa lo que hago es sacar la data que quiero mostrar a la ram del pic y de ahi pasarla al letrero, es mas recomendable esta opcion que estar haciendolo directamente con la eprom.

Saludos :mrgreen:

Desconectado tannke

  • PIC16
  • ***
  • Mensajes: 176
Re: Matriz de leds 8X8.
« Respuesta #78 en: 11 de Febrero de 2010, 15:56:05 »
Buenas a todos, es de las primeras veces que escribo en este foro, creo que la tercera. Bueno, estaba yo liado aprendiendo a programar para los PICS y el proyecto que estoi liado ahora es esto de las matrices de Led's, buscando algo de información me topé con este post que lo veo muy interesante.

Bueno lo que vengo ha hacer es a dejaros aqui lo que he hecho hasta ahora por si os puede servir de algo, o si veis alguna modificación que le pueda hacer. El proyecto no esta testeado al 100% (fisicamente), ya que en el ISIS no hay manera y ahora no dispongo ni de leds suficientes ni tiempo para ir a la ciudad para comprarlos.

Parcialmente si esta comprovado y en teoria deberia funcionar.

Adjunto un programa que realice en C# para generar caracteres para la memoria I2C, por defecto vienen unas mayusculas bastante cutres, podeis modificarlas y adjuntar mas caracteres. En el tu escribes la frase que quieras visualizar en la matriz y este te genera el *.hex para el I2C, tambien lleva un pequeño simulador...

El esquema utilizado lo podreis ver dentro del programa en la pestaña ayuda, podreis comprobar que no utilizo registro de desplazamiento sino que uso un multiplexor (es lo que tenia a mano).

Este es el codigo para el Pic16F84a:
Código: [Seleccionar]
;**************************************************  MATRIZ LEDS 8X8  ********************************************************************
;
;
;
;ZONA DE DATOS******************************************************************************************************************************

__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

LIST P=16F84A
INCLUDE <P16F84A.INC>

CBLOCK 0x0C
UNO
DOS
TRES
CUATRO
CINCO
SEIS
SIETE
OCHO
Datomov
VarRep
ENDC

Rep EQU .5 ;numero de refrescos antes de solicitar otra columna


;ZONA DE CODIGOS****************************************************************************************************************************

ORG 0
Inicio
bsf STATUS,RP0 ;accedo a banco 1
clrf PORTB ;port b como salida
movlw b'11000' ;del puerto a, los 2 bits altos como entrada
movwf PORTA ;los 3 bajos como salida
bcf STATUS,RP0 ;acces a banc 0
clrf PORTB
clrf PORTA

Puestacero
clrf UNO
clrf DOS
clrf TRES
clrf CUATRO
clrf CINCO
clrf SEIS
clrf SIETE
clrf OCHO
movlw Rep
movwf VarRep
call I2CReset
Principal

movf PORTA,W ;cargo el contenido del puerto a
andlw b'11000' ;me quedo con los dos bits altos
iorlw b'00000' ;dejo los 2bits altos como estaban i cambio los otros 3
movwf PORTA ;resultado a Puerto A
movf UNO,W ;muevo a W el contenido de la variable UNO
call RetardoMOV ;llamo a la subrutina que se encarga de mandar W al pueto B y el tiempo que se mantiene encendido

movf PORTA,W ;desde aqui igual para las demas columnas
andlw b'11000'
iorlw b'00001'
movwf PORTA
movf DOS, W
call RetardoMOV

movf PORTA,W
andlw b'11000'
iorlw b'00010'
movwf PORTA
movf TRES, W
call RetardoMOV

movf PORTA,W
andlw b'11000'
iorlw b'00011'
movwf PORTA
movf CUATRO, W
call RetardoMOV

movf PORTA,W
andlw b'11000'
iorlw b'00100'
movwf PORTA
movf CINCO, W
call RetardoMOV

movf PORTA,W
andlw b'11000'
iorlw b'00101'
movwf PORTA
movf SEIS, W
call RetardoMOV

movf PORTA,W
andlw b'11000'
iorlw b'00110'
movwf PORTA
movf SIETE, W
call RetardoMOV

movf PORTA,W
andlw b'11000'
iorlw b'00111'
movwf PORTA
movf OCHO, W
call RetardoMOV

decfsz VarRep, F ;compruebo si ha hecho los refrescos predefinidos
goto Principal ;si no es asi vuelvo a repetir


;subrutina per passar sa lletre
; AQUI ES DONDE CARGAMOS LOS NUEVOS DATOS
Pasalletre
movlw Rep ;recargamos el refresco
movwf VarRep ;
call Tablas ;llamamos a la memoria I2C para que nos envie el nuevo Byte

movlw b'11111111' ;aqui compruebo si datomov es 11111111, si es asi lo entiendo como final
subwf Datomov,W ;y reinicio la memoria
btfsc STATUS,Z
goto Puestacero

rlf Datomov, F ;Hago rotar el Byte recibido a izquierdas, el bit
rlf UNO, F ;de mayor peso entra en el carry, a continuacion
rlf Datomov, F ;hago rotar la primera variable (el bit de mayor peso lo desecho) y el que
rlf DOS, F ;estaba en el carry entra como bit de menor peso
rlf Datomov, F ;
rlf TRES, F ;Esto lo hago con todas las variables de columnas
rlf Datomov, F
rlf CUATRO, F
rlf Datomov, F
rlf CINCO, F
rlf Datomov, F
rlf SEIS, F
rlf Datomov, F
rlf SIETE, F
rlf Datomov, F
rlf OCHO, F ;ya hemos movido el caracter un punto a la izquierda

goto Principal

;subrutina retardo y mover dato a puerto B
RetardoMOV
movwf PORTB
call Retardo_5ms ;tiempo que permanece encendido cada led,
return
;Aqui leemos un byte de la memoria
Tablas
call I2C_EnviaStart ;enviamos la condicion start de protocolo I2C
movlw b'10100001' ;direccion Memoria en modo lectura
call I2C_EnviaByte ;la enviamos
call I2C_LeeByte ;LEEMOS EL SIGUIENTE BYTE
movwf Datomov ;lo movemos a la variable
call I2C_EnviaStop ;enviamos el Stop
return


;Indica a la memoria I2C desde donde empezar a leer
I2CReset
call I2C_EnviaStart ;enviamos la condicion start de protocolo I2C
movlw b'10100000' ;direccion Memoria en modo escritura
call I2C_EnviaByte ;la enviamos
movlw b'00000000' ;pagina donde empezar a leer/escribir
call I2C_EnviaByte ;la enviamos
movlw b'00000000' ;direccion donde empezar a leer/escribir
call I2C_EnviaByte ;la enviamos
call I2C_EnviaStop ;enviamos el Stop, no queremos escribir
return

INCLUDE<BUS_I2C.INC>
INCLUDE<RETARDOS.INC>
END

Las librerias estan sacadas del libro "Microcontrolador Pic16f84 desarroyo de proyectos" con el que estoy iniciandome.

Espero les guste o les sirva. Tambien agradeceria si algo no lo hago bien o lo que sea (estoi aprendiendo :P)

Saludos
« Última modificación: 11 de Febrero de 2010, 16:21:59 por tannke »

Desconectado antimason

  • PIC12
  • **
  • Mensajes: 81
Re: Matriz de leds 8X8.
« Respuesta #79 en: 12 de Febrero de 2010, 09:52:30 »
Que bien, felicidades tannke por tu aportación, y el programa para realizar caracteres y pasar directamente el texto a una memoria externa está fenomenal, gracias por tu estupenda contribución. :-/ :-/

Desconectado tannke

  • PIC16
  • ***
  • Mensajes: 176
Re: Matriz de leds 8X8.
« Respuesta #80 en: 12 de Febrero de 2010, 10:02:51 »
Muchas gracias, espero les sea util, resubo el programa porque vi un par de fallos, como el de no dejar utilizar la tecla backspace para borrar la frase, y he puesto una opción nueva para invertir los caracteres, ya sea para mostrar las letras invertidas o para que los que enciendan los caracteres con CEROS y no con unos.

Pudiendo hacer mas pruebas he visto que con el codigo para el pic parpadean un poco los leds, lo he solucionado cambiando los valores:

Rep      EQU   .5      por      Rep      EQU   .15

y

call    Retardo_5ms     por      call    Retardo_2ms


es ir jugando con estos valores para conseguir la velocidad de desplazamiento deseado y que no se note el parpadeo.
saludos

Desconectado antimason

  • PIC12
  • **
  • Mensajes: 81
Re: Matriz de leds 8X8.
« Respuesta #81 en: 12 de Febrero de 2010, 19:29:28 »
2ms es el tiempo típico de temporización en el barrido de cada fila, por cierto por lo que he podido ver en tu proyecto tu multiplexas las filas con (valga la redundancia) un multiplexador, y activas los datos de las columnas por el PORTB. Aprovecho de nuevo la ocasión para felicitarte por el programa que has compartido con nosotros.

Desconectado antimason

  • PIC12
  • **
  • Mensajes: 81
Re: Matriz de leds 8X8.
« Respuesta #82 en: 13 de Febrero de 2010, 16:50:25 »
tannke, tu programa no permite editar el caracter del "espacio", pues yo necesito que sea un espacio de 8x8 y al editarlo y guardarlo no lo guarda como 8x8, para ello he recurrido a un truco que es asignar el espacio de 8x8 al caracter +, y así me he apañado. Y tambien decirte que el programa que has hecho se ve que es para caracteres hechos por columnas y no por filas, pero no es problemático adaptarlo a caracteres por filas pues he editado los caracteres girados 90º y ademas en forma de "espejo", es decir invertidos, saludos. :-/
« Última modificación: 13 de Febrero de 2010, 16:54:52 por antimason »

Desconectado tannke

  • PIC16
  • ***
  • Mensajes: 176
Re: Matriz de leds 8X8.
« Respuesta #83 en: 13 de Febrero de 2010, 20:55:46 »
Aiba! razon tienes con lo del espacio, ni me di cuenta y no se ni donde puede estar el fallo... ahora mismo lo buscaré. Al principio al leer pensaba que seria porque antes no tenia el guardar actibado hasta que se cambiaba algun bite (ya que hasta que alguno no cambia no se genera el codigo hexa) ya que poniendo o quitando columnas no lo implemente pq tenia que cambiar medio codigo y opté por desactivar el guargar hasta que hubiera un cambio de bite.

Hasta que encuentre el fallo, lo que si puedes hacer si tienes el office es habrir manualmente el archivo Libreria. Y ya dentro puedes modificarlo manualmente poniendo en la columna dato los 16 ceros y en Datoinv las 16 F. Las otras 2 columnas no las toques, ya que podria dar luego algun error raro en el programa.

La contraseña es 0423.


Sobre lo segundo, tb tienes razón ya que yo hago el barrido por columnas. Lo que si voy ha hacer (haber como lo meto) es en las opciones intentar poner las (creo que serian todas) "Invertir 0 por 1" "Modo columna o fila" y "espejo".

Saludos y gracias


EDIT: Bueno lo primero ha sido una pijadilla que no tuve en cuenta (algunos problemas que tuve con el espacio en la base de datos acces...) aqui te lo resubo.
Una cosa, guarda tu archivo "Libreria" ahi es donde estan todos los caracteres, lo digo porque si ya los editastes no tener que hacerlo cada vez que corrija algun fallo.

Para lo segundo ya si voi a tardar algo mas (ahun tengo que pensar como lo implemento). saludos
« Última modificación: 13 de Febrero de 2010, 21:16:47 por tannke »

Desconectado tannke

  • PIC16
  • ***
  • Mensajes: 176
Re: Matriz de leds 8X8.
« Respuesta #84 en: 15 de Febrero de 2010, 15:25:39 »
Bueno, de nuevo por aqui, he hecho una nueva actualización. En esta he puesto en las opciones poder elegir el tipo de barrido a utilizar, el modo invertido (ceros por unos) y el modo espejo.

Ademas le he añadido una opcion para actualizar para no tener que volver a subir el archivo en la pagina (por si fuera necesario modificar algo mas)

Lo unico malo de este es que no he podido utilizar la misma libreria que las anteriores por lo que si utilizais esta version tendres que volver a editar los caracteres...
pero bueno, si os sirve el anterior es tonteria poneros este :)

Por cierto, hoy he podido pasarme por la ciudad a comprar los diodos y algunos componentes mas. Ahora voi a liarme ha hacer la placa y luego a empezar a soldar leds, haber como se ve el pryecto :)

Un saludo!!

Desconectado antimason

  • PIC12
  • **
  • Mensajes: 81
Re: Matriz de leds 8X8.
« Respuesta #85 en: 15 de Febrero de 2010, 19:49:11 »
Bueno, de nuevo por aqui, he hecho una nueva actualización. En esta he puesto en las opciones poder elegir el tipo de barrido a utilizar, el modo invertido (ceros por unos) y el modo espejo.

Ademas le he añadido una opcion para actualizar para no tener que volver a subir el archivo en la pagina (por si fuera necesario modificar algo mas)

Lo unico malo de este es que no he podido utilizar la misma libreria que las anteriores por lo que si utilizais esta version tendres que volver a editar los caracteres...
pero bueno, si os sirve el anterior es tonteria poneros este :)

Por cierto, hoy he podido pasarme por la ciudad a comprar los diodos y algunos componentes mas. Ahora voi a liarme ha hacer la placa y luego a empezar a soldar leds, haber como se ve el pryecto :)Un saludo!!


Luego nos pones un video que lo veamos. :-/

Desconectado tannke

  • PIC16
  • ***
  • Mensajes: 176
Re: Matriz de leds 8X8.
« Respuesta #86 en: 19 de Febrero de 2010, 06:50:28 »
Buenas a todos de nuevo, bueno decirles que tube un pequeño descuido montando la matriz... cuando puse la placa en el acido justo me llamaron al telefono y ahi se quedo  :oops: jeje. Ahora tengo una bonita placa de fibra con algunos pegotillos de cobre por ahi...
A todo esto me decidi a montarla si o si con lo que tenia y la acabé armando en una placa de puntos. El resultado no es muy profesional pero almenos puedo andar ya haciendo las prubas.

Aqui les dejo el vido de la primera prueba (con exito). El video está cortado, el mensaje dura mas de 10 minutos (usando el 7% de la memoria) y se hacian bastante pesado leerlo y a esa velocidad


Desconectado antimason

  • PIC12
  • **
  • Mensajes: 81
Re: Matriz de leds 8X8.
« Respuesta #87 en: 19 de Febrero de 2010, 09:38:20 »
Felicidades, ¿el código que usaste es el mismo que posteaste aquí o reformaste algo?. :-/ :-/

Desconectado tannke

  • PIC16
  • ***
  • Mensajes: 176
Re: Matriz de leds 8X8.
« Respuesta #88 en: 19 de Febrero de 2010, 11:21:01 »
es el mismo nada mas cambie las variables de refresco, que ya comente unas lineas mas atras (las 15 repeticiones) y (los 2ms que me dijistes que era el tiempo optimo)

bueno, tambíen cambié en la parte cuando comprueba el dato entrante de la memoria si era 0xFF (b'11111111') reiniciaba el ciclo. En este caso lo he cambiado por 0x00(B'00000000') ya que activo los leds con '0' (ceros).

lo malo de esta manera de detectar el final es que no puedo encender ninguna columa entera ya que me reinicia el bucle... tendré que encontrar alguna otra manera de detectar que ya ha llegado al final del mensaje para reiniciar.

Saludos

Desconectado antimason

  • PIC12
  • **
  • Mensajes: 81
Re: Matriz de leds 8X8.
« Respuesta #89 en: 22 de Febrero de 2010, 11:11:51 »
Hola, os dejo una hoja de excel con caracteres numéricos y alfabéticos y su código para filas y columnas en formato hexadecimal, debeis tener instalado la función BIN.A.HEX en vuestro excel, sino no podreis ver la conversión. Por cierto, para los expertos de excel, ¿como hago para que en esta hoja que he subido cuando ponga 1 ó 0 se sombree la casilla sin tener que hacerlo luego al margen?, los 1 están como podeis ver sombreados en color verde y los 0 en blanco.