TODOPIC

Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: antimason en 05 de Febrero de 2009, 10:06:25

Título: Matriz de leds 8X8.
Publicado por: antimason en 05 de Febrero de 2009, 10:06:25
Aqui teneis el código para una matriz de leds 8x8 para representar tres animaciones, en el PROTEUS no funciona, en la vida real si.


;****************************************************************************************************************************
;                                                  TRES EFECTOS VISUALES                                                  *
;****************************************************************************************************************************



;registro a usar 74HC164.

;CLOCK= Patilla 1 PORTA,2.

;DATA= Patilla 2  PORTA,3.


;Todas las patitas del PORTB se conectaran a resistencias de 1k5 ohmios y a su vez estas resistencias a base de transistor PNP BC-327
;calculado para soportar un máximo de 15mA x 8 leds.


;las salidas del registro de desplazamiento se conectaran a resistencias de 1/4 w y serán entre 330 ohmio, 220 ohmio según veamos
;la luminosidad de los leds.


;*****************************************************************************************************************************
;PASOS A SEGUIR PARA MOSTRAR UN PATRON DE 8 BITS (1 BYTE) EN UNA MATRIZ DE LEDS 8x8 
;*****************************************************************************************************************************
;1) Apagar todas las filas.

;2) Escribir los valores correspondientes a la primer fila en el registro de desplazamiento, teniendo en cuenta que el primer
;   digito binario colocado corresponde al último LED de la fila, y el ultimo en poner al de la primer columna.

;3) Encenderla primer fila, esperar un tiempo, y volver a apagarla.

;4) Repetir los pasos 2 y 3 para las filas restantes.
;*****************************************************************************************************************************


                           
              __CONFIG _CP_OFF &_WDT_OFF &_PWRTE_ON &_XT_OSC

              LIST   P=16F84A
              INCLUDE <P16F84A.INC>

              CBLOCK  0x0C
              ENDC

EEPROM        EQU     0x1C           ;registro de control
ALMACEN       EQU     0x20           ;aquí se guarda la informacion para llevarla al registro de desplazamiento 
CONTADOR      EQU     0x21           ;contador 8 bits

DI            EQU     7              ;bit de control
DO            EQU     6              ;bit de control

                 
              ORG    0X00        ;Inicio del ensamblado desde 00
              goto   INICIO          ;Salto a la primera instruccion
              ORG    0X05        ;Ensamblar desde 05



INICIO        bsf    STATUS,RP0      ;pagina 1
              clrf   TRISB           ;portb salidas
              clrf   TRISA           ;porta salidas
              bcf    STATUS,RP0      ;pagina 0
              clrf   PORTB
              clrf   PORTA

              movlw  B'11111111'     ;todas las filas apagadas
              movwf  PORTB           ;1 en base transistores PNP y por lo tanto leds apagados


;**********************************************************************************************************************************
;BARRIDO HORIZONTAL
;**********************************************************************************************************************************      



PRINCIPAL     movlw  B'00000000'     ;dato a sacar por un registro de
                                     ;desplazamiento serie-paralelo 8 bits
              movwf  ALMACEN         ;registro donde se almacena el dato
              call   TX
FILA1         movlw  B'11111110'     ;activo fila 1 para mostrar dato del registro
              movwf  PORTB
              call   Retardo_500ms
              movlw  B'11111111'
              movwf  PORTB



              movlw  B'00000000'     ;dato a sacar por un registro de
                                     ;desplazamiento serie-paralelo 8 bits
              movwf  ALMACEN         ;registro donde se almacena el dato
              call   TX
FILA2         movlw  B'11111101'     ;activo fila 2 para mostrar dato del registro
              movwf  PORTB
              call   Retardo_500ms
              movlw  B'11111111'
              movwf  PORTB



              movlw  B'00000000'     ;dato a sacar por un registro de
                                     ;desplazamiento serie-paralelo 8 bits
              movwf  ALMACEN         ;registro donde se almacena el dato
              call   TX
FILA3         movlw  B'11111011'     ;activo fila 3 para mostrar dato del registro
              movwf  PORTB
              call   Retardo_500ms
              movlw  B'11111111'
              movwf  PORTB


             
              movlw  B'00000000'     ;dato a sacar por un registro de
                                     ;desplazamiento serie-paralelo 8 bits
              movwf  ALMACEN         ;registro donde se almacena el dato
              call   TX
FILA4         movlw  B'11110111'     ;activo fila 4 para mostrar dato del registro
              movwf  PORTB
              call   Retardo_500ms
              movlw  B'11111111'
              movwf  PORTB


             
              movlw  B'00000000'     ;dato a sacar por un registro de
                                     ;desplazamiento serie-paralelo 8 bits
              movwf  ALMACEN         ;registro donde se almacena el dato
              call   TX
FILA5         movlw  B'11101111'     ;activo fila 5 para mostrar dato del registro
              movwf  PORTB
              call   Retardo_500ms
              movlw  B'11111111'
              movwf  PORTB




              movlw  B'00000000'     ;dato a sacar por un registro de
                                     ;desplazamiento serie-paralelo 8 bits
              movwf  ALMACEN         ;registro donde se almacena el dato
              call   TX
FILA6         movlw  B'11011111'     ;activo fila 6 para mostrar dato del registro
              movwf  PORTB
              call   Retardo_500ms
              movlw  B'11111111'
              movwf  PORTB



              movlw  B'00000000'     ;dato a sacar por un registro de
                                     ;desplazamiento serie-paralelo 8 bits
              movwf  ALMACEN         ;registro donde se almacena el dato
              call   TX
FILA7         movlw  B'10111111'     ;activo fila 7 para mostrar dato del registro
              movwf  PORTB
              call   Retardo_500ms
              movlw  B'11111111'
              movwf  PORTB


             
              movlw  B'00000000'     ;dato a sacar por un registro de
                                     ;desplazamiento serie-paralelo 8 bits
              movwf  ALMACEN         ;registro donde se almacena el dato
              call   TX
FILA8
              movlw  B'01111111'     ;activo fila 8 para mostrar dato del registro
              movwf  PORTB
              call   Retardo_500ms
              movlw  B'11111111'
              movwf  PORTB


;**********************************************************************************************************************************
;PIXEL OBLICUO
;**********************************************************************************************************************************


              movlw  B'11111110'     ;dato a sacar por un registro de
                                     ;desplazamiento serie-paralelo 8 bits
              movwf  ALMACEN         ;registro donde se almacena el dato
              call   TX
COLUMNA8      movlw  B'11111110'     ;activo columna 8 para mostrar dato del registro
              movwf  PORTB
              call   Retardo_500ms
              movlw  B'11111111'
              movwf  PORTB



             
              movlw  B'11111101'     ;dato a sacar por un registro de
                                     ;desplazamiento serie-paralelo 8 bits
              movwf  ALMACEN         ;registro donde se almacena el dato
              call   TX
COLUMNA7      movlw  B'11111101'     ;activo columna 7 para mostrar dato del registro
              movwf  PORTB
              call   Retardo_500ms
              movlw  B'11111111'
              movwf  PORTB




              movlw  B'11111011'     ;dato a sacar por un registro de
                                     ;desplazamiento serie-paralelo 8 bits
              movwf  ALMACEN         ;registro donde se almacena el dato
              call   TX
COLUMNA6      movlw  B'11111011'     ;activo columna 6 para mostrar dato del registro
              movwf  PORTB
              call   Retardo_500ms
              movlw  B'11111111'
              movwf  PORTB



              movlw  B'11110111'     ;dato a sacar por un registro de
                                     ;desplazamiento serie-paralelo 8 bits
              movwf  ALMACEN         ;registro donde se almacena el dato
              call   TX
COLUMNA5      movlw  B'11110111'     ;activo columna 5 para mostrar dato del registro
              movwf  PORTB
              call   Retardo_500ms
              movlw  B'11111111'
              movwf  PORTB


             
              movlw  B'11101111'     ;dato a sacar por un registro de
                                     ;desplazamiento serie-paralelo 8 bits
              movwf  ALMACEN         ;registro donde se almacena el dato
              call   TX
COLUMNA4      movlw  B'11101111'     ;activo columna 4 para mostrar dato del registro
              movwf  PORTB
              call   Retardo_500ms
              movlw  B'11111111'
              movwf  PORTB




              movlw  B'11011111'     ;dato a sacar por un registro de
                                     ;desplazamiento serie-paralelo 8 bits
              movwf  ALMACEN         ;registro donde se almacena el dato
              call   TX
COLUMNA3      movlw  B'11011111'     ;activo columna 3 para mostrar dato del registro
              movwf  PORTB
              call   Retardo_500ms
              movlw  B'11111111'
              movwf  PORTB



              movlw  B'10111111'     ;dato a sacar por un registro de
                                     ;desplazamiento serie-paralelo 8 bits
              movwf  ALMACEN         ;registro donde se almacena el dato
              call   TX
COLUMNA2      movlw  B'10111111'     ;activo columna 2 para mostrar dato del registro
              movwf  PORTB
              call   Retardo_500ms
              movlw  B'11111111'
              movwf  PORTB


             
              movlw  B'01111111'     ;dato a sacar por un registro de
                                     ;desplazamiento serie-paralelo 8 bits
              movwf  ALMACEN         ;registro donde se almacena el dato
              call   TX
COLUMNA1      movlw  B'01111111'     ;activo columna 1 para mostrar dato del registro
              movwf  PORTB
              call   Retardo_500ms
              movlw  B'11111111'
              movwf  PORTB


;**********************************************************************************************************************************
;PIXEL OBLICUO_2
;**********************************************************************************************************************************


              movlw  B'01111111'     ;dato a sacar por un registro de
                                     ;desplazamiento serie-paralelo 8 bits
              movwf  ALMACEN         ;registro donde se almacena el dato
              call   TX
              movlw  B'11111110'     ;activo columna 8 para mostrar dato del registro
              movwf  PORTB
              call   Retardo_500ms
              movlw  B'11111111'
              movwf  PORTB



             
              movlw  B'10111111'     ;dato a sacar por un registro de
                                     ;desplazamiento serie-paralelo 8 bits
              movwf  ALMACEN         ;registro donde se almacena el dato
              call   TX
              movlw  B'11111101'     ;activo columna 7 para mostrar dato del registro
              movwf  PORTB
              call   Retardo_500ms
              movlw  B'11111111'
              movwf  PORTB




              movlw  B'11011111'     ;dato a sacar por un registro de
                                     ;desplazamiento serie-paralelo 8 bits
              movwf  ALMACEN         ;registro donde se almacena el dato
              call   TX
              movlw  B'11111011'     ;activo columna 6 para mostrar dato del registro
              movwf  PORTB
              call   Retardo_500ms
              movlw  B'11111111'
              movwf  PORTB



              movlw  B'11101111'     ;dato a sacar por un registro de
                                     ;desplazamiento serie-paralelo 8 bits
              movwf  ALMACEN         ;registro donde se almacena el dato
              call   TX
              movlw  B'11110111'     ;activo columna 5 para mostrar dato del registro
              movwf  PORTB
              call   Retardo_500ms
              movlw  B'11111111'
              movwf  PORTB


             
              movlw  B'11110111'     ;dato a sacar por un registro de
                                     ;desplazamiento serie-paralelo 8 bits
              movwf  ALMACEN         ;registro donde se almacena el dato
              call   TX
              movlw  B'11101111'     ;activo columna 4 para mostrar dato del registro
              movwf  PORTB
              call   Retardo_500ms
              movlw  B'11111111'
              movwf  PORTB




              movlw  B'11111011'     ;dato a sacar por un registro de
                                     ;desplazamiento serie-paralelo 8 bits
              movwf  ALMACEN         ;registro donde se almacena el dato
              call   TX
              movlw  B'11011111'     ;activo columna 3 para mostrar dato del registro
              movwf  PORTB
              call   Retardo_500ms
              movlw  B'11111111'
              movwf  PORTB



              movlw  B'11111101'     ;dato a sacar por un registro de
                                     ;desplazamiento serie-paralelo 8 bits
              movwf  ALMACEN         ;registro donde se almacena el dato
              call   TX
              movlw  B'10111111'     ;activo columna 2 para mostrar dato del registro
              movwf  PORTB
              call   Retardo_500ms
              movlw  B'11111111'
              movwf  PORTB


             
              movlw  B'11111110'     ;dato a sacar por un registro de
                                     ;desplazamiento serie-paralelo 8 bits
              movwf  ALMACEN         ;registro donde se almacena el dato
              call   TX
              movlw  B'01111111'     ;activo columna 1 para mostrar dato del registro
              movwf  PORTB
              call   Retardo_500ms
              movlw  B'11111111'
              movwf  PORTB
              goto   PRINCIPAL



;*******************************************************************************************************************************
;RUTINA TRANSMISIÓN BITS A REGISTRO 74HC164
;*******************************************************************************************************************************


             
TX            movlw  .8              ;pone 8 en W
              movwf  CONTADOR        ;carga contador con 8


TXLP          bcf    EEPROM,DO       ;a 0 bit DO
              btfsc  ALMACEN,0       ;mira el bit 7 de ALMACEN y salta si es 0
              bsf    EEPROM,DO       ;a 1 bit DO
              call   BITOUT
              rrf    ALMACEN,F       ;rota a izquierda ALMACEN
              decfsz CONTADOR,F      ;decrementa contador si es 0 salta
              goto   TXLP
              return
         
 

BITOUT        bsf    STATUS,RP0      ;pagina 1     
              movlw  0X00
              movwf  TRISA           ;puerta A salida
              bcf    STATUS,RP0      ;pagina 0
 
              btfss  EEPROM,DO       ;mira el bit DO y salta si vale 1
              goto   BITLOW
              bsf    PORTA,3         ;pone a 1 DATA
              goto   CLOCK

 
BITLOW        bcf    PORTA,3         ;pone a 0 DATA


;********************************************************************************************************************************
;RUTINA DE TRANSMISIÓN SEÑAL DE RELOJ A REGISTRO 74HC164
;********************************************************************************************************************************


CLOCK         bcf    PORTA,2         ;pone a 0 CLOCK
              nop                    ;espera 1 micros
              nop                    ;otro
              nop                    ;otro
              nop                    ;otro
              bsf    PORTA,2         ;pone a 1 CLOCK
              nop                    ;1 micros
              return
       

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




Título: Re: Matriz de leds 8X8.
Publicado por: antimason en 07 de Febrero de 2009, 12:31:47
El código es un poco largo, intentaré simplificarlo con el uso de tablas y mas adelante pondré la información en una memoria I2C para que sea mas sencillo todavía. En este post iré desarrollando todo el proceso, ser pacientes.
Título: Re: Matriz de leds 8X8.
Publicado por: aitopes en 07 de Febrero de 2009, 18:18:14
Hola!
¿Tenes el esquema a mano?

Saludos!
Título: Re: Matriz de leds 8X8.
Publicado por: todopic en 07 de Febrero de 2009, 20:57:20
Muy buenas Antimason!, gracias por compartir el codigo !  :-/
Además de emplear tablas, puedes usar rotación en el puerto b, para achicar código  (RLF)  :mrgreen:

Un abrazo

Norberto
Título: Re: Matriz de leds 8X8.
Publicado por: antimason en 08 de Febrero de 2009, 12:40:00
He editado el código, pues existía el pequeño fallo de que al encenderse los leds correspondientes, el resto, los que debieran permanecer apagados, poseían una leve iluminación que fastidiaba el contraste entre leds encendidos y leds apagados. Tambien he quitado el efecto "BARRIDO VERTICAL" pues al activar todas las filas al tiempo se produce una caida de tensión que hace que los leds queden con una iluminación muy apagada.
Título: Re: Matriz de leds 8X8.
Publicado por: antimason en 08 de Febrero de 2009, 12:44:01
Hola!
¿Tenes el esquema a mano?

Saludos!


La verdad es que lo hice en un folio con un bolígrafo, pero lo haré en PROTEUS y la captura la postearé aquí. Pero..............¿como se ponen imágenes en un foro?, colocar vídeos de youtube si sé hacerlo, pero lo de las fotos no lo tengo tan claro.
Título: Re: Matriz de leds 8X8.
Publicado por: antimason en 08 de Febrero de 2009, 12:47:36
Muy buenas Antimason!, gracias por compartir el codigo !  :-/
Además de emplear tablas, puedes usar rotación en el puerto b, para achicar código  (RLF)  :mrgreen:

Un abrazo

Norberto


Gracias a vosotros por tener un foro tan didáctico y explicativo de este mundillo de los PICS.
Título: Re: Matriz de leds 8X8.
Publicado por: aitopes en 08 de Febrero de 2009, 12:49:28
Hola!
Podes scanear la imagen que dibujaste con el boli...yo uso papel casi siempre para mis diseños :)

Para poner la imagen, tenes que usar la opcion que aparece abajo del cuadro en el que escribir el mensaje, el link que pone "(http://www.todopic.com.ar/foros/Themes/SoftDark/images/expand.gif)Opciones Adicionales...". Dentro de eso está

Adjuntar:          (más archivos)

Ahi buscas la imagen que scaneaste, la agregas, y queda como adjunto al mensaje.

Si luego queres que se vea en el cuerpo del mensaje, escribis [ img ] ruta_de_la_imagen [ /img ] (pero sin espacios) y listo!

Saludos!
Título: Re: Matriz de leds 8X8.
Publicado por: antimason en 08 de Febrero de 2009, 13:54:18
A ver la foto.......


Título: Re: Matriz de leds 8X8.
Publicado por: aitopes en 08 de Febrero de 2009, 17:24:19
Perfecta!

No fue tan dificil, no? :)

Ya pude ver el esquema. Gracias!
Título: Re: Matriz de leds 8X8.
Publicado por: jmcs87 en 08 de Febrero de 2009, 17:37:53
Muy bueno los efectos ..de pensar que yo empece asi  ...  con una matriz pequeña de 7x5 luego 32x7 despues 80x7 ahora voy por una de 90x8 yo tambien trabajo en asm ....

si es de ayuda dejo unos ejemplos pero creo que es mas avanzado ...
http://micros.mforos.com/1149907/8023880-desarrollo-panel-88x7-16f877-y-eeprom-24lc256/

Saludos y pon una foto del circuito funcionando  :mrgreen:

Título: Re: Matriz de leds 8X8.
Publicado por: antimason en 08 de Febrero de 2009, 18:33:30
Muy bueno los efectos ..de pensar que yo empece asi  ...  con una matriz pequeña de 7x5 luego 32x7 despues 80x7 ahora voy por una de 90x8 yo tambien trabajo en asm ....

si es de ayuda dejo unos ejemplos pero creo que es mas avanzado ...
http://micros.mforos.com/1149907/8023880-desarrollo-panel-88x7-16f877-y-eeprom-24lc256/

Saludos y pon una foto del circuito funcionando  :mrgreen:





Menudas matrices, eso si es nivel. A ver cuando llego a algo así.
Título: Re: Matriz de leds 8X8.
Publicado por: jacrmr en 08 de Febrero de 2009, 19:16:36
Citar
lo unico que puedo decir es que hacer tu propia matriz te sale mas barato ya que comprar una hecha sale 300 dolares y yo solo me e gastado un promedio de  100, claro que con la caja y el acabado puede salir algo mas (ojo me refiero a una de ese tamaño) e visto otras matrices del mismo tamaño hechas con matrices pre fabricadas de 8x8 de tres colores verde amarilli y rojo esas si estan mas caras creo que las traen de afuera son importadas ......

tengo una pregunta que dejo a continuacion....se trata sobre el metodo de usar una matriz es decir lo que mayormente e encontrado en internet es el metodo multiplexado ya sea por columnas o filas ...pero me pregunto si los paneles comerciales esos ya profecionales que vemos en las tiendas usaran esa misma tecnica, lo digo porque e leido en otros foros que lo que hacen es usar un registro por cada ocho leds o algo asi es decir los leds estan siempre encendidos ......

espero que los que sepan algo me puedan sacar la duda que tengo gracias

saludos...

Los paneles comerciales usan cada vez menos el multiplexado por varias razones (de hecho los fabricantes líderes dejaron de multiplexar pantallas desde finales de los 90s). Las razones principales son que el multiplexado interfiere con la filmación o grabación de video en pantallas que se usan en sets de tv, estadios deportivos, etc. Que los nuevos leds introducidos al mercado a principios de los 90s (GaInN) y que son la base actual de todas las pantallas de leds, no ganan eficiencia con el multiplexado (a diferencia de otros materiales como el AlGaP que tanto se utilizó), además que reducen su vida útil muchísimo se se multiplexan con corrientes apenas ligeramente mayores a la del promedio. Que debido a la gran cantidad de datos seriales que se manejan (aunque estén divididas por módulos pequeños) los nuevos ICs permiten un conexionado muy simple sin multiplexar (con expensas al costo pero con gran ganancia en calidad de imagen), ya que la norma general es que esas pantalla no llevan memorias eeprom ni generadores de caracteres ni nada de eso. De tu señal de video conectas directo al codec de video, de ahí sale tu señal en 4:2:2 o RGB, y va directo (los ICs ya vienen fabricados con esa facilidad de conexión) a tu memoria multipuertos en donde quedas independiente de la velocidad de video y puedes con un microcontrolador estar leyendo la información para enviarla serialmente a tus drivers. La ventaja de este sistema es que desligas totalmente la información que hay que desplegar de lo que tiene que hacer tu circuitería.
Título: Re: Matriz de leds 8X8.
Publicado por: jmcs87 en 08 de Febrero de 2009, 19:33:37
Gracias por la respuesta....... :)    bueno lo unico que puedo decir es que no pretendo llegar a ser fabricante  :D solo que como me parecio un proyecto muy interesante segui insistiendo y si se que multiplexando la matriz se pierde eficiencia intencidad de los leds ......pero me pregunto entonces para que vienen las matrices esas pre fabricadas  de 8x8 o 7x5 ya que e visto matrices comerciales que las usan inclusive son tri color ...........creo que la respuesta que me diste es tirando para las matrices que ya muestran video con leds rgb .........yo solo busco llegar a una matriz monocolor de gran tamaño

saludos y gracias por la info :mrgreen:
Título: Re: Matriz de leds 8X8.
Publicado por: antimason en 08 de Febrero de 2009, 20:44:20
El video del código de tres efectos:


Título: Re: Matriz de leds 8X8.
Publicado por: antimason en 08 de Febrero de 2009, 20:48:56
Aquí otro código para matriz 8x8, representa la letra "A" e invierte los leds para que se vea la "A" como una sombra. Ya subiré el vídeo.



;****************************************************************************************************************************
;                                                  EFECTOS VISUALES                                                         *
;****************************************************************************************************************************

;La vista humana puede retener información que se muestre durante 20 ó 30 ms, por eso los tiempos de encendido y apagado
;de las filas han de programarse teniendo en cuenta esto. Cuantos mayores tiempos demos cercanos a esos 20 ó 30 ms mas
;luminosos se mostraran los leds, en cambio la sensación de parpadeo será mayor. Como ejemplo de ello tenemos la superposición
;de los cuadros de las tv que funcionan a 50Hz-----> F = 1/T -----> T= 1/50 = 0,02s = 20ms

;registro a usar 74HC164.

;CLOCK= Patilla 1 PORTA,2.

;DATA= Patilla 2  PORTA,3.


;Todas las patitas del PORTB se conectaran a resistencias de 1k5 ohmios y a su vez estas resistencias a base de transistor PNP BC-327
;calculado para soportar un máximo de 15mA x 8 leds.


;las salidas del registro de desplazamiento se conectaran a resistencias de 1/4 w y serán entre 330 ohmio, 220 ohmio según veamos
;la luminosidad de los leds.


;****************************************************************************************************************************
;PASOS A SEGUIR PARA MOSTRAR UN PATRON DE 8 BITS (1 BYTE) EN UNA MATRIZ DE LEDS 8x8                                         *
;****************************************************************************************************************************
;1) Apagar todas las filas.

;2) Escribir los valores de la primer fila en el registro de desplazamiento, teniendo en cuenta que el primer
;   digito binario colocado corresponde al último LED de la fila, y el ultimo en poner al de la primer columna.

;3) Encenderla primer fila, esperar un tiempo, y volver a apagarla.

;4) Repetir los pasos 2 y 3 para las filas restantes.
;****************************************************************************************************************************


                           
              __CONFIG _CP_OFF &_WDT_OFF &_PWRTE_ON &_XT_OSC

              LIST   P=16F84A
              INCLUDE <P16F84A.INC>

              CBLOCK  0x0C
              ENDC

EEPROM        EQU     0x1C           ;registro de control
ALMACEN       EQU     0x20           ;aquí se guarda la informacion para llevarla al registro de desplazamiento 
CONTADOR      EQU     0x21           ;contador 8 bits
REPITE        EQU     0x22           ;repetición ciclos en columna

DI            EQU     7              ;bit de control
DO            EQU     6              ;bit de control

                 
              ORG    0X00        ;Inicio del ensamblado desde 00
              goto   INICIO          ;Salto a la primera instruccion
              ORG    0X05        ;Ensamblar desde 05



INICIO        bsf    STATUS,RP0      ;pagina 1
              clrf   TRISB           ;portb salidas
              clrf   TRISA           ;porta salidas
              bcf    STATUS,RP0      ;pagina 0
              clrf   PORTB
              clrf   PORTA

             

;****************************************************************************************************************************
;                                    LETRA A
;****************************************************************************************************************************      



PRINCIPAL     movlw  B'11111111'     ;todas las filas apagadas
              movwf  PORTB           ;1 en base transistores PNP y por lo tanto leds apagados



CARGA         movlw  D'60'           ;cargo registro con 60 para que se visualize letra A 1 seg
              movwf  REPITE


COMIENZA      movlw  D'231'          ;dato a sacar por un registro de
                                     ;desplazamiento serie-paralelo 8 bits
              movwf  ALMACEN         ;registro donde se almacena el dato
              call   TX
              nop
              movlw  D'254'
              movwf  PORTB
              call   Retardo_2ms
              movlw  B'11111111'
              movwf  PORTB
     

              movlw  D'195'          ;dato a sacar por un registro de
                                     ;desplazamiento serie-paralelo 8 bits
              movwf  ALMACEN         ;registro donde se almacena el dato
              call   TX
              nop
              movlw  D'253'
              movwf  PORTB
              call   Retardo_2ms
              movlw  B'11111111'
              movwf  PORTB


              movlw  D'153'          ;dato a sacar por un registro de
                                     ;desplazamiento serie-paralelo 8 bits
              movwf  ALMACEN         ;registro donde se almacena el dato
              call   TX
              nop
              movlw  D'251'
              movwf  PORTB
              call   Retardo_2ms
              movlw  B'11111111'
              movwf  PORTB


              movlw  D'153'          ;dato a sacar por un registro de
                                     ;desplazamiento serie-paralelo 8 bits
              movwf  ALMACEN         ;registro donde se almacena el dato
              call   TX
              nop
              movlw  D'247'
              movwf  PORTB
              call   Retardo_2ms
              movlw  B'11111111'
              movwf  PORTB


              movlw  D'129'          ;dato a sacar por un registro de
                                     ;desplazamiento serie-paralelo 8 bits
              movwf  ALMACEN         ;registro donde se almacena el dato
              call   TX
              nop
              movlw  D'239'
              movwf  PORTB
              call   Retardo_2ms
              movlw  B'11111111'
              movwf  PORTB


              movlw  D'153'          ;dato a sacar por un registro de
                                     ;desplazamiento serie-paralelo 8 bits
              movwf  ALMACEN         ;registro donde se almacena el dato
              call   TX
              nop
              movlw  D'223'
              movwf  PORTB
              call   Retardo_2ms
              movlw  B'11111111'
              movwf  PORTB


              movlw  D'153'          ;dato a sacar por un registro de
                                     ;desplazamiento serie-paralelo 8 bits
              movwf  ALMACEN         ;registro donde se almacena el dato
              call   TX
              nop
              movlw  D'191'
              movwf  PORTB
              call   Retardo_2ms
              movlw  B'11111111'
              movwf  PORTB


              movlw  D'153'          ;dato a sacar por un registro de
                                     ;desplazamiento serie-paralelo 8 bits
              movwf  ALMACEN         ;registro donde se almacena el dato
              call   TX
              nop
              movlw  D'127'
              movwf  PORTB
              call   Retardo_2ms
              movlw  B'11111111'
              movwf  PORTB


              decfsz REPITE,1        ;decrementa control salta si vale 0
              goto   COMIENZA
              movlw  D'60'
              movwf  REPITE



;****************************************************************************************************************************
;                                    A INVERSA
;****************************************************************************************************************************



SIGUE         movlw  D'24'           ;dato a sacar por un registro de
                                     ;desplazamiento serie-paralelo 8 bits
              movwf  ALMACEN         ;registro donde se almacena el dato
              call   TX
              nop
              movlw  D'254'
              movwf  PORTB
              call   Retardo_2ms
              movlw  B'11111111'
              movwf  PORTB
     

              movlw  D'60'           ;dato a sacar por un registro de
                                     ;desplazamiento serie-paralelo 8 bits
              movwf  ALMACEN         ;registro donde se almacena el dato
              call   TX
              nop
              movlw  D'253'
              movwf  PORTB
              call   Retardo_2ms
              movlw  B'11111111'
              movwf  PORTB


              movlw  D'102'          ;dato a sacar por un registro de
                                     ;desplazamiento serie-paralelo 8 bits
              movwf  ALMACEN         ;registro donde se almacena el dato
              call   TX
              nop
              movlw  D'251'
              movwf  PORTB
              call   Retardo_2ms
              movlw  B'11111111'
              movwf  PORTB
     

              movlw  D'102'          ;dato a sacar por un registro de
                                     ;desplazamiento serie-paralelo 8 bits
              movwf  ALMACEN         ;registro donde se almacena el dato
              call   TX
              nop
              movlw  D'247'
              movwf  PORTB
              call   Retardo_2ms
              movlw  B'11111111'
              movwf  PORTB


              movlw  D'126'          ;dato a sacar por un registro de
                                     ;desplazamiento serie-paralelo 8 bits
              movwf  ALMACEN         ;registro donde se almacena el dato
              call   TX
              nop
              movlw  D'239'
              movwf  PORTB
              call   Retardo_2ms
              movlw  B'11111111'
              movwf  PORTB
     

              movlw  D'102'          ;dato a sacar por un registro de
                                     ;desplazamiento serie-paralelo 8 bits
              movwf  ALMACEN         ;registro donde se almacena el dato
              call   TX
              nop
              movlw  D'223'
              movwf  PORTB
              call   Retardo_2ms
              movlw  B'11111111'
              movwf  PORTB


              movlw  D'102'          ;dato a sacar por un registro de
                                     ;desplazamiento serie-paralelo 8 bits
              movwf  ALMACEN         ;registro donde se almacena el dato
              call   TX
              nop
              movlw  D'191'
              movwf  PORTB
              call   Retardo_2ms
              movlw  B'11111111'
              movwf  PORTB


              movlw  D'102'          ;dato a sacar por un registro de
                                     ;desplazamiento serie-paralelo 8 bits
              movwf  ALMACEN         ;registro donde se almacena el dato
              call   TX
              nop
              movlw  D'127'
              movwf  PORTB
              call   Retardo_2ms
              movlw  B'11111111'
              movwf  PORTB


              decfsz REPITE,1        ;decrementa control salta si vale 0
              goto   SIGUE
              goto   PRINCIPAL



;****************************************************************************************************************************
;RUTINA TRANSMISIÓN BITS A REGISTRO 74HC164
;****************************************************************************************************************************



             
TX            movlw  .8              ;pone 8 en W
              movwf  CONTADOR        ;carga contador con 8


TXLP          bcf    EEPROM,DO       ;a 0 bit DO
              btfsc  ALMACEN,0       ;mira el bit 7 de ALMACEN y salta si es 0
              bsf    EEPROM,DO       ;a 1 bit DO
              call   BITOUT
              rrf    ALMACEN,F       ;rota a izquierda ALMACEN
              decfsz CONTADOR,F      ;decrementa contador si es 0 salta
              goto   TXLP
              return
         
 

BITOUT        bsf    STATUS,RP0      ;pagina 1     
              movlw  0X00
              movwf  TRISA           ;puerta A salida
              bcf    STATUS,RP0      ;pagina 0
 
              btfss  EEPROM,DO       ;mira el bit DO y salta si vale 1
              goto   BITLOW
              bsf    PORTA,3         ;pone a 1 DATA
              goto   CLOCK

 
BITLOW        bcf    PORTA,3         ;pone a 0 DATA


;****************************************************************************************************************************
;RUTINA DE TRANSMISIÓN SEÑAL DE RELOJ A REGISTRO 74HC164
;****************************************************************************************************************************


CLOCK         bcf    PORTA,2         ;pone a 0 CLOCK
              nop                    ;espera 1 micros
              nop                    ;otro
              nop                    ;otro
              nop                    ;otro
              bsf    PORTA,2         ;pone a 1 CLOCK
              nop                    ;1 micros
              return
       

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





Título: Re: Matriz de leds 8X8.
Publicado por: jacrmr en 08 de Febrero de 2009, 21:48:51
Citar
bueno lo unico que puedo decir es que no pretendo llegar a ser fabricante 


Pues creo que ya lo fuiste ¿no? porque creo que el publik que hiciste fue para una aplicación comercial ¿o me equivoco?.

Citar
......pero me pregunto entonces para que vienen las matrices esas pre fabricadas  de 8x8 o 7x5 ya que e visto matrices comerciales que las usan inclusive son tri color


Sólo por convencionalismo. La matriz de 7x5 es típica para representar cualquier caracter alfanumérico, como en el caso de los LCDs de caracteres.

Citar
...........creo que la respuesta que me diste es tirando para las matrices que ya muestran video con leds rgb .........yo solo busco llegar a una matriz monocolor de gran tamaño

No necesariamente. De hecho poniendo ceros en los coeficientes de corrección de gamma de las memorias multipuertos para los colores verde y azul te quedaría la típica matriz roja monocromática. Incluso con un publik monocromático se simplifica totalmente la escritura de los mensajes a desplegar, ya que si se visualiza una matriz de mayor tamaño como si fueran pequeños módulos de 7 por NColumnas sería complicadísimo, además de tedioso, tratar de programar los mensajes y hacer efectos. Esto ya se había tratado en el siguiente hilo:

http://www.todopic.com.ar/foros/index.php?topic=19091.msg196153#msg196153
Título: Re: Matriz de leds 8X8.
Publicado por: jmcs87 en 08 de Febrero de 2009, 22:18:54
hola Jacrmr  con decir que no pretendo llega a ser fabricante es que no pretendo vender o comercializar los paneles que hago  solo me pico poder hacer algo mas grande de lo que encuentro comunmente en internet .........como un joby me entiendes  :mrgreen:

veo que tienes muchos conocimiento de esto .......dime no te a picado hacer un panel con las caracteristicas que mencionas?

todo lo que describes en el enlace que me pusiste lo pude vivir en la practica porque el ultimo panel que estoy haciendo es de 90 x8  y cuenta con 20 efectos programables por puerto usb y capacidad de 5000 caracteres  ...podremos decir que no esta mal pero ya se que los comerciales me pasan de largo ........bueno para que el pic logre trabajar varias tareas a la vez es algo imposible ya que siempre todos nuestro progrmas son lineales , digamos que las interrupciones tratan de simular eso de la multitarea pero tiene que dejar una tarea para hacer otra cosa ....pienso que por eso dices que no se puede hacer con un simple pic esa tarea de hacer un gran panel y dejame decirte que estoy totalmente deacuerdo contigo


saludos
Título: Re: Matriz de leds 8X8.
Publicado por: jacrmr en 08 de Febrero de 2009, 22:33:41
Citar
hola Jacrmr  con decir que no pretendo llega a ser fabricante es que no pretendo vender o comercializar los paneles que hago  solo me pico poder hacer algo mas grande de lo que encuentro comunmente en internet .........como un joby me entiendes 


Claro.

Citar
veo que tienes muchos conocimiento de esto .......dime no te a picado hacer un panel con las caracteristicas que mencionas?

De hecho los hago cada vez que me piden uno. Precisamente en estos momentos estoy terminando uno monocromático de 80x32. Si me queda algo de tiempo al rato subo algunas fotos o videos.

Citar
todo lo que describes en el enlace que me pusiste lo pude vivir en la practica porque el ultimo panel que estoy haciendo es de 90 x8  y cuenta con 20 efectos programables por puerto usb y capacidad de 5000 caracteres 


¿es uno azul que subiste fotos en algún otro foro creo? Muy bueno quedó.
Título: Re: Matriz de leds 8X8.
Publicado por: jmcs87 en 08 de Febrero de 2009, 22:47:58
ya me suponia eres un conocedor en esto de los paneles ..........no podrias compartir algo de informacion de los paneles que haces o es secreto profesional ?    ..............te contere que yo tengo poco tiempo con esto de los pic  y solo me e dedicado a usarlos para estos panelitos que hago y tengo una duda los paneles que haces cuanto de energia consumen ya que supongo que usaras fuentes conmutadas .......ese es uno de los problemitas que tengo la fuente ya que a mayor cantidad de leds mayor es el consumo y ya con las justas me alcansa mi humilde fuente lineal  si pudieras dar las carcteristicas que tiene las fuentes que usas me refiero a corriente voltaje etc..?
 
Título: Re: Matriz de leds 8X8.
Publicado por: antimason en 09 de Febrero de 2009, 20:14:59
Aquí el vídeo del segundo código, notar el parpadeo perceptible a vista de cámara que no en la realidad, del multiplexado por líneas:


Título: Re: Matriz de leds 8X8.
Publicado por: jacrmr en 10 de Febrero de 2009, 08:15:41
El detalle está en que varios de los circuitos integrados que facilitan todo sólo se consiguen por contrato en base anual (como memorias multipuertos de IDT). En cuestión de fuentes de alimentación sólo uso fuentes de 3.3 volts (para leds rojos para no disipar tanta potencia). El aspecto del software, ó más bien el firmware para exportar de un video en Adobe Premiere a un PIC tan simple como el PIC16F59 sí está manejado a un nivel de propiedad intelectual y por lo mismo no podría dar más detalles al respecto. Sin embargo, los publiks que han implementado nico y Cryn no le piden nada a ningún publik comercial.
Título: Re: Matriz de leds 8X8.
Publicado por: jmcs87 en 10 de Febrero de 2009, 15:11:06
Muy bien con el video antimason ahora esperamos ver un mensajito desplazarse por tu matriz jejeje :mrgreen:

Jacrmr gracias por responder muy interesante los datos que das  ........seguire con lo mio haber hasta donde llego.....

quien sabe tal ves llegue a hacer algo interesante pra el foro.....

SAludos
Título: Re: Matriz de leds 8X8.
Publicado por: antimason en 10 de Febrero de 2009, 20:31:28
Muy bien con el video antimason ahora esperamos ver un mensajito desplazarse por tu matriz jejeje :mrgreen:

Jacrmr gracias por responder muy interesante los datos que das  ........seguire con lo mio haber hasta donde llego.....

quien sabe tal ves llegue a hacer algo interesante pra el foro.....

SAludos


Con paciencia todo llega. :mrgreen:
Título: Re: Matriz de leds 8X8.
Publicado por: antimason en 14 de Febrero de 2009, 16:45:34
Por fin, aquí el código con uso de tablas para mostrar la letra "A" y la "A" invertida o sombreada, perdonadme si es algo largo (soy un poco torpe :D), solo teneis que ir poniendo en la tabla el caracter que os dé la gana y cambiar algo en el código sobre el offset para ir mostrando lo que querais (mientras haya memoria claro). El reto siguiente es poner un mensaje desplazandose, usaré tablas para hacerlo. Luego como la memoria de programa del 16F84 no dará mucho de si intentaré colocar los datos en una memoria I2C y acceder a ella por emulación de software del protocolo I2C (por aquí andan algunos ejemplos supongo que serviran). :mrgreen:




 __CONFIG _CP_OFF &_WDT_OFF &_PWRTE_ON &_XT_OSC

              LIST   P=16F84A
              INCLUDE <P16F84A.INC>

              CBLOCK  0x0C
              ENDC

EEPROM        EQU     0x1C           ;registro de control
ALMACEN       EQU     0x20           ;aquí se guarda la informacion para llevarla al registro de desplazamiento 
CONTADOR      EQU     0x21           ;contador 8 bits
REPITE        EQU     0x22           ;repetición ciclos en columna
SALIDA        EQU     0x23           ;registro para rotación de salida PORTB
PUNTERO       EQU     0x24           ;registro para offset
FILA1         EQU     0x25           
FILA2         EQU     0x26
FILA3         EQU     0x27
FILA4         EQU     0x28
FILA5         EQU     0x29
FILA6         EQU     0x30
FILA7         EQU     0x31
FILA8         EQU     0x32
VECES         EQU     0x33           ;controla nº de veces que se produce un evento




DI            EQU     7              ;bit de control
DO            EQU     6              ;bit de control

                 
              ORG    0X00        ;Inicio del ensamblado desde 00
              goto   INICIO          ;Salto a la primera instruccion
              ORG    0X05        ;Ensamblar desde 05



INICIO        bsf    STATUS,RP0      ;pagina 1
              clrf   TRISB           ;portb salidas
              clrf   TRISA           ;porta salidas
              bcf    STATUS,RP0      ;pagina 0
              clrf   PORTB
              clrf   PORTA
              clrf   FILA1
              clrf   FILA2
              clrf   FILA3
              clrf   FILA4
              clrf   FILA5
              clrf   FILA6
              clrf   FILA7
              clrf   FILA8
              clrw



;****************************************************************************************************************************
;AQUI HAGO LA LLAMADA A LA TABLA PARA IR SACANDO LOS DATOS Y CARGAR LOS REGISTROS
;****************************************************************************************************************************

               

RESET         clrf   PUNTERO         ;comienza PUNTERO en 0
              movlw  D'2'            ;cada vez que se hace reset se carga el registro con 2
              movwf  VECES           ;para controlar el nº de veces que se muestra la A y la
                                     ;A inversa
             
             

CARGA         movf   PUNTERO,0       ;muevo contenido dígito a W
              call   TABLA           ;llamo a tabla
              movwf  FILA1           ;y cargo resultado en FILA1
              nop
              incf   PUNTERO,F       ;incremento PUNTERO como offset para tabla
              movf   PUNTERO,0       ;y lo cargo en w


 
              call   TABLA           ;llamo a tabla
              movwf  FILA2           ;y cargo resultado en FILA2
              nop
              incf   PUNTERO,F       ;incremento PUNTERO como offset para tabla
              movf   PUNTERO,0       ;y lo cargo en w


             
              call   TABLA           ;llamo a tabla
              movwf  FILA3           ;y cargo resultado en FILA3
              nop
              incf   PUNTERO,F       ;incremento PUNTERO como offset para tabla
              movf   PUNTERO,0       ;y lo cargo en w



              call   TABLA           ;llamo a tabla
              movwf  FILA4           ;y cargo resultado en FILA4
              nop
              incf   PUNTERO,F       ;incremento PUNTERO como offset para tabla
              movf   PUNTERO,0       ;y lo cargo en w


             
              call   TABLA           ;llamo a tabla
              movwf  FILA5           ;y cargo resultado en FILA5
              nop
              incf   PUNTERO,F       ;incremento PUNTERO como offset para tabla
              movf   PUNTERO,0       ;y lo cargo en w


             
              call   TABLA           ;llamo a tabla
              movwf  FILA6           ;y cargo resultado en FILA6
              nop
              incf   PUNTERO,F       ;incremento PUNTERO como offset para tabla
              movf   PUNTERO,0       ;y lo cargo en w



              call   TABLA           ;llamo a tabla
              movwf  FILA7           ;y cargo resultado en FILA7
              nop
              incf   PUNTERO,F       ;incremento PUNTERO como offset para tabla
              movf   PUNTERO,0       ;y lo cargo en w



              call   TABLA           ;llamo a tabla
              movwf  FILA8           ;y cargo resultado en FILA8
              call   REG
             
              incf   PUNTERO,F       ;incremento PUNTERO como offset para tabla
              movf   PUNTERO,0       ;y lo cargo en w
              goto   CARGA
             
             
             
;****************************************************************************************************************************
;AQUI CARGO LOS REGISTROS LLAMADOS FILA_X EN EL REGISTRO ALMACEN PARA SER SACADOS POR REGISTRO DE DESPLAZAMIENTO
;****************************************************************************************************************************



REG           movlw  D'60'           ;cargo registro con 60 para que se visualize el dato 1 seg
              movwf  REPITE

             

MUESTRATE     movf   FILA1,0
              movwf  ALMACEN         ;registro donde se almacena el dato
              call   TX         
              nop
              movlw  D'254'          ;activo fila 1
              movwf  PORTB
              call   Retardo_2ms
              movlw  B'11111111'
              movwf  PORTB




              movf   FILA2,0
              movwf  ALMACEN         ;registro donde se almacena el dato
              call   TX
              nop
              movlw  D'253'          ;activo fila 2
              movwf  PORTB
              call   Retardo_2ms
              movlw  B'11111111'
              movwf  PORTB




              movf   FILA3,0
              movwf  ALMACEN         ;registro donde se almacena el dato
              call   TX
              nop
              movlw  D'251'          ;activo fila 3
              movwf  PORTB
              call   Retardo_2ms
              movlw  B'11111111'
              movwf  PORTB




              movf   FILA4,0
              movwf  ALMACEN         ;registro donde se almacena el dato
              call   TX
              nop
              movlw  D'247'          ;activo fila 4
              movwf  PORTB
              call   Retardo_2ms
              movlw  B'11111111'
              movwf  PORTB




              movf   FILA5,0
              movwf  ALMACEN         ;registro donde se almacena el dato
              call   TX
              nop
              movlw  D'239'          ;activo fila 5
              movwf  PORTB
              call   Retardo_2ms
              movlw  B'11111111'
              movwf  PORTB




              movf   FILA6,0
              movwf  ALMACEN         ;registro donde se almacena el dato
              call   TX
              nop
              movlw  D'223'          ;activo fila 6
              movwf  PORTB
              call   Retardo_2ms
              movlw  B'11111111'
              movwf  PORTB




              movf   FILA7,0
              movwf  ALMACEN         ;registro donde se almacena el dato
              call   TX
              nop
              movlw  D'191'          ;activo fila 7
              movwf  PORTB
              call   Retardo_2ms
              movlw  B'11111111'
              movwf  PORTB




              movf   FILA8,0
              movwf  ALMACEN         ;registro donde se almacena el dato
              call   TX
              nop
              movlw  D'127'          ;activo fila 8
              movwf  PORTB
              call   Retardo_2ms
              movlw  B'11111111'
              movwf  PORTB


              decfsz REPITE,1        ;decrementa control salta si vale 0
              goto   MUESTRATE
              decfsz VECES,1         ;controla que se mostró la A y la A inversa, es decir 2 veces
                                     ;para poner offset a 0 y empezar desde el principio de la tabla
              return
              goto   RESET           ;reset en offset y comienza de nuevo
             
             





;****************************************************************************************************************************
;RUTINA TRANSMISIÓN BITS A REGISTRO 74HC164
;****************************************************************************************************************************


             
TX            movlw  .8              ;pone 8 en W
              movwf  CONTADOR        ;carga contador con 8


TXLP          bcf    EEPROM,DO       ;a 0 bit DO
              btfsc  ALMACEN,0       ;mira el bit 7 de ALMACEN y salta si es 0
              bsf    EEPROM,DO       ;a 1 bit DO
              call   BITOUT
              rrf    ALMACEN,F       ;rota a izquierda ALMACEN
              decfsz CONTADOR,F      ;decrementa contador si es 0 salta
              goto   TXLP
              return
         
 

BITOUT        bsf    STATUS,RP0      ;pagina 1     
              movlw  0X00
              movwf  TRISA           ;puerta A salida
              bcf    STATUS,RP0      ;pagina 0
 
              btfss  EEPROM,DO       ;mira el bit DO y salta si vale 1
              goto   BITLOW
              bsf    PORTA,3         ;pone a 1 DATA
              goto   CLOCK

 
BITLOW        bcf    PORTA,3         ;pone a 0 DATA


;****************************************************************************************************************************
;RUTINA DE TRANSMISIÓN SEÑAL DE RELOJ A REGISTRO 74HC164
;****************************************************************************************************************************


CLOCK         bcf    PORTA,2         ;pone a 0 CLOCK
              nop                    ;espera 1 micros
              nop                    ;otro
              nop                    ;otro
              nop                    ;otro
              bsf    PORTA,2         ;pone a 1 CLOCK
              nop                    ;1 micros
              return


;****************************************************************************************************************************
;TABLA DONDE SE GUARDA LA INFORMACIÓN A MOSTRAR
;****************************************************************************************************************************


TABLA         addwf  PCL,F
               
              retlw  D'231'         
              retlw  D'195'
              retlw  D'153'
              retlw  D'153'          ;letra A
              retlw  D'129'
              retlw  D'153'
              retlw  D'153'
              retlw  D'153'

              retlw  D'24'         
              retlw  D'60'
              retlw  D'102'
              retlw  D'102'          ;letra A inversa
              retlw  D'126'
              retlw  D'102'
              retlw  D'102'
              retlw  D'102'
 

              INCLUDE <RETARDOS.INC> ;subrutinas de control de tiempos de retardo.
              END
Título: Re: Matriz de leds 8X8.
Publicado por: antimason en 17 de Febrero de 2009, 16:51:23
;Este código desplaza la letra "A" a la izquierda hasta que desaparece y vuelve a aparecer y vuelve a desplazarse. Tiene un error y es que al desplazarse
;aparecen unos leds encendidos, ¿alguien me puede ayudar a que salga bien y se queden apagados?.





 __CONFIG _CP_OFF &_WDT_OFF &_PWRTE_ON &_XT_OSC

              LIST   P=16F84A
              INCLUDE <P16F84A.INC>

              CBLOCK  0x0C
              ENDC

EEPROM        EQU     0x0D           ;registro de control
ALMACEN       EQU     0x0E           ;aquí se guarda la informacion para llevarla al registro de desplazamiento 
CONTADOR      EQU     0x0F           ;contador 8 bits
REPITE        EQU     0x10           ;repetición ciclos en columna
SALIDA        EQU     0x11           ;registro para rotación de salida PORTB
PUNTERO       EQU     0x12           ;registro para offset
FILA1         EQU     0x13
FILA2         EQU     0x14
FILA3         EQU     0x15
FILA4         EQU     0x16
FILA5         EQU     0x17
FILA6         EQU     0x18
FILA7         EQU     0x19
FILA8         EQU     0x1A
OCHOVECES     EQU     0x1B


DI            EQU     7              ;bit de control
DO            EQU     6              ;bit de control

                 
              ORG    0X00        ;Inicio del ensamblado desde 00
              goto   INICIO          ;Salto a la primera instruccion
              ORG    0X05        ;Ensamblar desde 05



INICIO        bsf    STATUS,RP0      ;pagina 1
              clrf   TRISB           ;portb salidas
              clrf   TRISA           ;porta salidas
              bcf    STATUS,RP0      ;pagina 0
              clrf   PORTB
              clrf   PORTA
              clrf   FILA1
              clrf   FILA2
              clrf   FILA3
              clrf   FILA4
              clrf   FILA5
              clrf   FILA6
              clrf   FILA7
              clrf   FILA8
              clrw


RESET         clrf   PUNTERO         ;comienza PUNTERO en 0
             

CARGA         movf   PUNTERO,0        ;muevo contenido dígito a W
              call   TABLA           ;llamo a tabla
              movwf  FILA1           ;y cargo resultado en FILA1
              nop
              incf   PUNTERO,F       ;incremento PUNTERO como offset para tabla
              movf   PUNTERO,0       ;y lo cargo en w


 
              call   TABLA           ;llamo a tabla
              movwf  FILA2           ;y cargo resultado en FILA2
              nop
              incf   PUNTERO,F       ;incremento PUNTERO como offset para tabla
              movf   PUNTERO,0       ;y lo cargo en w


             
              call   TABLA           ;llamo a tabla
              movwf  FILA3           ;y cargo resultado en FILA3
              nop
              incf   PUNTERO,F       ;incremento PUNTERO como offset para tabla
              movf   PUNTERO,0       ;y lo cargo en w



              call   TABLA           ;llamo a tabla
              movwf  FILA4           ;y cargo resultado en FILA4
              nop
              incf   PUNTERO,F       ;incremento PUNTERO como offset para tabla
              movf   PUNTERO,0       ;y lo cargo en w


             
              call   TABLA           ;llamo a tabla
              movwf  FILA5           ;y cargo resultado en FILA5
              nop
              incf   PUNTERO,F       ;incremento PUNTERO como offset para tabla
              movf   PUNTERO,0       ;y lo cargo en w


             
              call   TABLA           ;llamo a tabla
              movwf  FILA6           ;y cargo resultado en FILA6
              nop
              incf   PUNTERO,F       ;incremento PUNTERO como offset para tabla
              movf   PUNTERO,0       ;y lo cargo en w



              call   TABLA           ;llamo a tabla
              movwf  FILA7           ;y cargo resultado en FILA7
              nop
              incf   PUNTERO,F       ;incremento PUNTERO como offset para tabla
              movf   PUNTERO,0       ;y lo cargo en w



              call   TABLA           ;llamo a tabla
              movwf  FILA8           ;y cargo resultado en FILA8
              nop
              movlw  D'9'
              movwf  OCHOVECES
   
             
             
             
             
;****************************************************************************************************************************
;AQUI CARGO LOS REGISTROS LLAMADOS FILA_X EN EL REGISTRO ALMACEN PARA SER SACADOS POR REGISTRO DE DESPLAZAMIENTO
;****************************************************************************************************************************



DELAY         movlw  D'60'
              movwf  REPITE


MUESTRATE     movf   FILA1,0
              movwf  ALMACEN         ;registro donde se almacena el dato
              call   TX         
              nop
              movlw  D'254'          ;activo fila 1
              movwf  PORTB
              call   Retardo_2ms
              movlw  B'11111111'
              movwf  PORTB




              movf   FILA2,0
              movwf  ALMACEN         ;registro donde se almacena el dato
              call   TX
              nop
              movlw  D'253'          ;activo fila 2
              movwf  PORTB
              call   Retardo_2ms
              movlw  B'11111111'
              movwf  PORTB




              movf   FILA3,0
              movwf  ALMACEN         ;registro donde se almacena el dato
              call   TX
              nop
              movlw  D'251'          ;activo fila 3
              movwf  PORTB
              call   Retardo_2ms
              movlw  B'11111111'
              movwf  PORTB




              movf   FILA4,0
              movwf  ALMACEN         ;registro donde se almacena el dato
              call   TX
              nop
              movlw  D'247'          ;activo fila 4
              movwf  PORTB
              call   Retardo_2ms
              movlw  B'11111111'
              movwf  PORTB




              movf   FILA5,0
              movwf  ALMACEN         ;registro donde se almacena el dato
              call   TX
              nop
              movlw  D'239'          ;activo fila 5
              movwf  PORTB
              call   Retardo_2ms
              movlw  B'11111111'
              movwf  PORTB




              movf   FILA6,0
              movwf  ALMACEN         ;registro donde se almacena el dato
              call   TX
              nop
              movlw  D'223'          ;activo fila 6
              movwf  PORTB
              call   Retardo_2ms
              movlw  B'11111111'
              movwf  PORTB




              movf   FILA7,0
              movwf  ALMACEN         ;registro donde se almacena el dato
              call   TX
              nop
              movlw  D'191'          ;activo fila 7
              movwf  PORTB
              call   Retardo_2ms
              movlw  B'11111111'
              movwf  PORTB




              movf   FILA8,0
              movwf  ALMACEN         ;registro donde se almacena el dato
              call   TX
              nop
              movlw  D'127'          ;activo fila 8
              movwf  PORTB
              call   Retardo_2ms
              movlw  B'11111111'
              movwf  PORTB

              decfsz REPITE,1        ;decrementa REPITE cuando sea O salta
              goto   MUESTRATE       ;no es 0
              call   ROTACION        ;si es 0
              decfsz OCHOVECES,1     ;acude 8 veces a rotación de bits
              goto   DELAY
              goto   RESET
             


;****************************************************************************************************************************
;RUTINA DE ROTACION DE BITS DE LOS REGISTROS "FILA_X"
;****************************************************************************************************************************


ROTACION      rlf    FILA1,1         ;roto una posición a la izquierda la trama de bits
              bsf    STATUS,C        ;borro el bit de acarreo para que no aparezca por
              nop                    ;la derecha de la matriz



              rlf    FILA2,1         ;roto una posición a la izquierda la trama de bits
              bsf    STATUS,C        ;borro el bit de acarreo para que no aparezca por
              nop                    ;la derecha de la matriz



              rlf    FILA3,1         ;roto una posición a la izquierda la trama de bits
              bsf    STATUS,C        ;borro el bit de acarreo para que no aparezca por
              nop                    ;la derecha de la matriz



              rlf    FILA4,1         ;roto una posición a la izquierda la trama de bits
              bsf    STATUS,C        ;borro el bit de acarreo para que no aparezca por
              nop                    ;la derecha de la matriz



              rlf    FILA5,1         ;roto una posición a la izquierda la trama de bits
              bsf    STATUS,C        ;borro el bit de acarreo para que no aparezca por
              nop                    ;la derecha de la matriz



              rlf    FILA6,1         ;roto una posición a la izquierda la trama de bits
              bsf    STATUS,C        ;borro el bit de acarreo para que no aparezca por
              nop                    ;la derecha de la matriz



              rlf    FILA7,1         ;roto una posición a la izquierda la trama de bits
              bsf    STATUS,C        ;borro el bit de acarreo para que no aparezca por
              nop                    ;la derecha de la matriz



              rlf    FILA8,1         ;roto una posición a la izquierda la trama de bits
              bsf    STATUS,C        ;borro el bit de acarreo para que no aparezca por
              nop                    ;la derecha de la matriz

              return


;****************************************************************************************************************************
;RUTINA TRANSMISIÓN BITS A REGISTRO 74HC164
;****************************************************************************************************************************


             
TX            movlw  .8              ;pone 8 en W
              movwf  CONTADOR        ;carga contador con 8


TXLP          bcf    EEPROM,DO       ;a 0 bit DO
              btfsc  ALMACEN,0       ;mira el bit 7 de ALMACEN y salta si es 0
              bsf    EEPROM,DO       ;a 1 bit DO
              call   BITOUT
              rrf    ALMACEN,F       ;rota a izquierda ALMACEN
              decfsz CONTADOR,F      ;decrementa contador si es 0 salta
              goto   TXLP
              return
         
 

BITOUT        bsf    STATUS,RP0      ;pagina 1     
              movlw  0X00
              movwf  TRISA           ;puerta A salida
              bcf    STATUS,RP0      ;pagina 0
 
              btfss  EEPROM,DO       ;mira el bit DO y salta si vale 1
              goto   BITLOW
              bsf    PORTA,3         ;pone a 1 DATA
              goto   CLOCK

 
BITLOW        bcf    PORTA,3         ;pone a 0 DATA


;****************************************************************************************************************************
;RUTINA DE TRANSMISIÓN SEÑAL DE RELOJ A REGISTRO 74HC164
;****************************************************************************************************************************


CLOCK         bcf    PORTA,2         ;pone a 0 CLOCK
              nop                    ;espera 1 micros
              nop                    ;otro
              nop                    ;otro
              nop                    ;otro
              bsf    PORTA,2         ;pone a 1 CLOCK
              nop                    ;1 micros
              return


;****************************************************************************************************************************
;TABLA DONDE SE GUARDA LA INFORMACIÓN A MOSTRAR
;****************************************************************************************************************************


TABLA         addwf  PCL,F
               
              retlw  D'231'         
              retlw  D'195'
              retlw  D'153'
              retlw  D'153'          ;letra A
              retlw  D'129'
              retlw  D'153'
              retlw  D'153'
              retlw  D'153'
 

              INCLUDE <RETARDOS.INC> ;subrutinas de control de tiempos de retardo.
              END
Título: Re: Matriz de leds 8X8.
Publicado por: antimason en 17 de Febrero de 2009, 17:13:09
En el siguiente video se vé la A desplazándose y el fallo que he comentado anteriormente.

Título: Re: Matriz de leds 8X8.
Publicado por: jmcs87 en 18 de Febrero de 2009, 01:02:02
bueno ..muy bueno te salio el desplazamiento  ..........voy a chequear el codigo
 :-/ :-/ :-/

Saludos :mrgreen:
Título: Re: Matriz de leds 8X8.
Publicado por: jmcs87 en 18 de Febrero de 2009, 02:45:23
antimason seguramente ya solucionaste el problema pero no esta demas .......aqui dejo la solucion
solamente se le agrego el BSF STATUS,C al principio de la rutina :mrgreen: :mrgreen:

;****************************************************************************************************************************
;RUTINA DE ROTACION DE BITS DE LOS REGISTROS "FILA_X"
;****************************************************************************************************************************


ROTACION      bsf    STATUS,C
                     rlf    FILA1,1         ;roto una posición a la izquierda la trama de bits
                     bsf    STATUS,C        ;borro el bit de acarreo para que no aparezca por
                     nop                    ;la derecha de la matriz



              rlf    FILA2,1         ;roto una posición a la izquierda la trama de bits
              bsf    STATUS,C        ;borro el bit de acarreo para que no aparezca por
              nop                    ;la derecha de la matriz



              rlf    FILA3,1         ;roto una posición a la izquierda la trama de bits
              bsf    STATUS,C        ;borro el bit de acarreo para que no aparezca por
              nop                    ;la derecha de la matriz



              rlf    FILA4,1         ;roto una posición a la izquierda la trama de bits
              bsf    STATUS,C        ;borro el bit de acarreo para que no aparezca por
              nop                    ;la derecha de la matriz



              rlf    FILA5,1         ;roto una posición a la izquierda la trama de bits
              bsf    STATUS,C        ;borro el bit de acarreo para que no aparezca por
              nop                    ;la derecha de la matriz



              rlf    FILA6,1         ;roto una posición a la izquierda la trama de bits
              bsf    STATUS,C        ;borro el bit de acarreo para que no aparezca por
              nop                    ;la derecha de la matriz



              rlf    FILA7,1         ;roto una posición a la izquierda la trama de bits
              bsf    STATUS,C        ;borro el bit de acarreo para que no aparezca por
              nop                    ;la derecha de la matriz



              rlf    FILA8,1         ;roto una posición a la izquierda la trama de bits
              bsf    STATUS,C        ;borro el bit de acarreo para que no aparezca por
              nop                    ;la derecha de la matriz

              return
Título: Re: Matriz de leds 8X8.
Publicado por: antimason en 18 de Febrero de 2009, 09:21:30
Has sido mas rápido que yo jmcs87, ya había encontrado la solución como está el código ahi abajo, el problema radicaba en que efectuaba la rotación en la primera línea antes de modificar el bit de acarreo del registro STATUS, por lo que en esa primera línea me llevaba ese acarreo y aparecían esos leds encendidos. De todas formas tú colaboración y aporte hubiera sido clave para la solución del problema. Gracias mil jmcs87.


;****************************************************************************************************************************
;RUTINA DE ROTACION DE BITS DE LOS REGISTROS "FILA_X"
;****************************************************************************************************************************


ROTACION      bsf    STATUS,C        ;borro el bit de acarreo para que no aparezca por
                                     ;la derecha
              rlf    FILA1,1         ;roto una posición a la izquierda la trama de bits
              nop                   



              bsf    STATUS,C        ;borro el bit de acarreo para que no aparezca por
                                     ;la derecha
              rlf    FILA2,1         ;roto una posición a la izquierda la trama de bits
              nop       



              bsf    STATUS,C        ;borro el bit de acarreo para que no aparezca por
                                     ;la derecha
              rlf    FILA3,1         ;roto una posición a la izquierda la trama de bits
              nop       
     


              bsf    STATUS,C        ;borro el bit de acarreo para que no aparezca por
                                     ;la derecha
              rlf    FILA4,1         ;roto una posición a la izquierda la trama de bits
              nop       



              bsf    STATUS,C        ;borro el bit de acarreo para que no aparezca por
                                     ;la derecha
              rlf    FILA5,1         ;roto una posición a la izquierda la trama de bits
              nop       



              bsf    STATUS,C        ;borro el bit de acarreo para que no aparezca por
                                     ;la derecha
              rlf    FILA6,1         ;roto una posición a la izquierda la trama de bits
              nop       
   


              bsf    STATUS,C        ;borro el bit de acarreo para que no aparezca por
                                     ;la derecha
              rlf    FILA7,1         ;roto una posición a la izquierda la trama de bits
              nop       
     


              bsf    STATUS,C        ;borro el bit de acarreo para que no aparezca por
                                     ;la derecha
              rlf    FILA8,1         ;roto una posición a la izquierda la trama de bits
              nop       
 

              return
Título: Re: Matriz de leds 8X8.
Publicado por: antimason en 18 de Febrero de 2009, 09:23:31
Siguiente objetivo es efectuar un scroll completo de un mensaje pasante de forma que sin llegar a desaparecer del todo por la izquierda la primera letra aparezca la segunda, luego tercera etc, etc.
Título: Re: Matriz de leds 8X8.
Publicado por: antimason en 18 de Febrero de 2009, 09:44:08
Aquí el video de la "A" con el funcionamiento correcto.

Título: Re: Matriz de leds 8X8.
Publicado por: antimason en 24 de Febrero de 2009, 15:43:40
Hey que no me he olvidado del hilo, pero con el trabajo no dispongo de mucho tiempo para seguir adelante, paciencia y ya llegarán los siguientes avances. El próximo objetivo es un mensaje pasante a lo ancho de la matriz recogido de una tabla.
Título: Re: Matriz de leds 8X8.
Publicado por: antimason en 25 de Febrero de 2009, 09:44:07
Manos a la obra, como a nivel de software no lo veo fácil e decidido realizar cambios a nivel hardware. Actualmente los datos entran de izquierda a derecha pero a una velocidad que hace que no se note (salvo que el código emplee un delay importante y sí lo veríamos), y como lo que se pretende es mostrar un mensaje pasante que entre desde la derecha de la matriz y salga por la izquierda he decidido invertir la forma en que se activan las columnas desde las salidas del 74ls164, de forma que aunque el registro seguirá trabajando como ahora (de izquierda a derecha) la matriz lo hará al contrario, es decir, de derecha a izquierda. De está forma irá ingresando un caracter por la derecha hasta que se muestre entero e irá siendo "empujado" por los datos que le metamos a continuación de otro caracter hasta ir desapareciendo y quedar el otro caracter que será "empujado" por el siguiente y así siempre. Bueno, no se me ha ocurrido otra forma, a lo mejor se puede hacer sin estos cambios y de una manera sencilla pero si alguien puede dar luz que la dé. Os dejo el dibujo en datos adjuntos de las reformas a emprender a nivel hardware. Manos y soldador a la obra.
Título: Re: Matriz de leds 8X8.
Publicado por: antimason en 25 de Febrero de 2009, 18:30:21
Perdonar, pero he cometido un error, la solución anterior es válida pero solo para una trama de 8 bites que esten en el registro y sean empujadas por otra trama de 8 bites, pero para formar un caracter como ya sabemos usamos 8 tramas de 8 bites cada una que se meten al registro a una velocidad que para nuestro ojo es imperceptible y ademas se redibujan una y otra vez en función del tiempo que queremos que esté presente el caracter, de forma que nos quedamos como estábamos. Seguiremos estrujando el código a ver como se hace y disculpad el error.
Título: Re: Matriz de leds 8X8.
Publicado por: antimason en 07 de Marzo de 2009, 12:06:02
E voila, aquí está el scrolling, de momento os dejo el video, y os dejaré en suspense respecto al código, os haré sufrir un poquito :mrgreen:, que malo soy ¿verdad?, os lo pondré a lo largo de este mes asi que teneis que ser pacientes porque os mantendré un poquito en tensión y expectantes, :D. Es curioso que en todo internet no exista un proyecto de PE a PA que explique como hacer una matriz de leds con su código y todo para PIC en asembler, pues aquí lo teneis en mi post, y me encanta ayudaros (aunque os lo dé mascado y digerido), pero de eso se trata, de compartir lo de unos y lo de otros para que esto sea la GRAN ESCUELA DE LOS PICS. Perdonad los caracteres que aparecen en mayusculas en la matriz, pero todavía no he hecho los caracteres de letras minúsculas. Aquí está:

Título: Re: Matriz de leds 8X8.
Publicado por: jim_17 en 07 de Marzo de 2009, 16:58:28
Muy bueno antimanson !! Permiteme hacerte una pequeña sugerencia, en las letras W y M, intenta hacer un poco mas gruesa la parte del medio, o modificarlas de alguna manera ya que hasta que no he visto el video un par de veces no había sabido identificar esas letras jeje.

Salu2.
Título: Re: Matriz de leds 8X8.
Publicado por: jmcs87 en 07 de Marzo de 2009, 21:52:08
muy bueno antimason.. .. :-/ :-/ supongo que seguiras con uno mas grande

saludos
Título: Re: Matriz de leds 8X8.
Publicado por: antimason en 08 de Marzo de 2009, 03:41:55
Muy bueno antimanson !! Permiteme hacerte una pequeña sugerencia, en las letras W y M, intenta hacer un poco mas gruesa la parte del medio, o modificarlas de alguna manera ya que hasta que no he visto el video un par de veces no había sabido identificar esas letras jeje.

Salu2.

Tomaré en cuenta tú sugerencia.
Título: Re: Matriz de leds 8X8.
Publicado por: antimason en 08 de Marzo de 2009, 03:43:02
muy bueno antimason.. .. :-/ :-/ supongo que seguiras con uno mas grande

saludos


Eso no lo dudes :mrgreen:.
Título: Re: Matriz de leds 8X8.
Publicado por: antimason en 10 de Marzo de 2009, 19:55:46
Mientras esperais paciente y ansiosamente el código os dejo otro video molon, el número 1 me ha salido algo descentrado, tendré que centrarlo. :mrgreen: :-/


Título: Re: Matriz de leds 8X8.
Publicado por: jmcs87 en 11 de Marzo de 2009, 00:29:04
 :shock: :shock: te estas volviendo un mostro en esto muy bien :mrgreen: :mrgreen:
Título: Re: Matriz de leds 8X8.
Publicado por: antimason en 17 de Marzo de 2009, 08:43:31
Aquí teneis el código, os saldrá el mensaje "HOLA MUNDO". :-/ :mrgreen: :D
Título: Re: Matriz de leds 8X8.
Publicado por: pengordon en 16 de Junio de 2009, 23:37:32

Hola... primero que todo, felicitaciones por el proyecto. Yo estoy tratando de implementarlo, pero me surge una duda, más bien un problema... con el último programa que nos falicitaste (HOLA MUNDO), arme el circuito en proteus y no me muestra nada el display de led, eso si en los pines del 74HC164 hay tension pero no encienden los led.

Ojala me puedas ayudar en eso...
Gracias
Saludos.
Título: Re: Matriz de leds 8X8.
Publicado por: antimason en 21 de Junio de 2009, 20:17:46
pengordon te he respondido en privado, saludos. :-/
Título: Re: Matriz de leds 8X8.
Publicado por: pengordon en 21 de Junio de 2009, 21:15:16

gracias Antimason... yo tambien te he enviado un mensaje por privado... ojala lo puedas leer

Saludos
Título: Re: Matriz de leds 8X8.
Publicado por: Fulguitron en 25 de Junio de 2009, 04:42:17
          Vaya currada, yo tambien estoy empezando con la matriz de 8x8 con un pic 16F877A y mi ilusión sería hacer un juego tipo PONG, alguien tiene algún código para a ver como empezar???
Título: Re: Matriz de leds 8X8.
Publicado por: antimason en 25 de Junio de 2009, 13:47:03
          Vaya currada, yo tambien estoy empezando con la matriz de 8x8 con un pic 16F877A y mi ilusión sería hacer un juego tipo PONG, alguien tiene algún código para a ver como empezar???



Pues yo no tengo nada, lo siento.
Título: Re: Matriz de leds 8X8.
Publicado por: bmvalarezo en 26 de Junio de 2009, 01:33:14
Pregunta la multiplexacion la realizas pr filas o por columnas y usas un registro de despalzamiento y un eeprom verdad?????????????
Título: Re: Matriz de leds 8X8.
Publicado por: antimason en 26 de Junio de 2009, 11:09:23
Pregunta la multiplexacion la realizas pr filas o por columnas y usas un registro de despalzamiento y un eeprom verdad?????????????


- Multiplexación por filas
- Uso un registro de desplazamiento
- Uso la memoria de programa del PIC 16F84A
Título: Re: Matriz de leds 8X8.
Publicado por: huskee en 20 de Septiembre de 2009, 19:58:26
hola
primero gracias por la informacion
Soy nuevo en esto de programar pics y me pidieron un mensaje en 3 matrices de 8x8 he probado la rutina de transmision al registro 74164 de bits y esa creo que solo sirve si se usa solo para una matriz  haber si me podrian ayudar para que sirva para 3 osea 24 columnas
gracias por su atencion
Título: Re: Matriz de leds 8X8.
Publicado por: antimason en 28 de Septiembre de 2009, 18:23:37
hola
primero gracias por la informacion
Soy nuevo en esto de programar pics y me pidieron un mensaje en 3 matrices de 8x8 he probado la rutina de transmision al registro 74164 de bits y esa creo que solo sirve si se usa solo para una matriz  haber si me podrian ayudar para que sirva para 3 osea 24 columnas
gracias por su atencion



Creo que la clave para hacer una matriz de 8x16 bits radica en esta parte del código.
Donde pone TX y cargamos a CONTADOR con 8, ¿Por qué crees que se carga con ese valor el CONTADOR?, pues sencillo es, porque el registro 74HC164 es de 8
BITS, si colocas DOS REGISTROS 74HC164 supongo que deberas cargar al CONTADOR con 16. Haz pruebas y cuenta que tal te ha ido. Saludos.


;****************************************************************************************************************************
;RUTINA TRANSMISIÓN BITS A REGISTRO 74HC164
;****************************************************************************************************************************


TX            movlw     .8              ;pone 8 en W                         (EN VEZ DE 8 PON 16)
              movwf     CONTADOR        ;carga contador con 8      (AQUI DEBES CARGAR 16)

TXLP          bcf       EEPROM,DO       ;a 0 bit DO
              btfsc     ALMACEN,0       ;mira el bit 7 de ALMACEN y salta si es 0
              bsf       EEPROM,DO       ;a 1 bit DO
              call      BITOUT
              rrf       ALMACEN,F       ;rota a izquierda ALMACEN
              decfsz    CONTADOR,F      ;decrementa contador si es 0 salta
              goto      TXLP
              return
         
 

BITOUT        bsf       STATUS,RP0      ;pagina 1     
              movlw     0X00
              movwf     TRISA           ;puerta A salida
              bcf       STATUS,RP0      ;pagina 0
 
              btfss     EEPROM,DO       ;mira el bit DO y salta si vale 1
              goto      BITLOW
              bsf       PORTA,3         ;pone a 1 DATA
              goto      CLOCK

 
BITLOW        bcf       PORTA,3         ;pone a 0 DATA
 
Título: Re: Matriz de leds 8X8.
Publicado por: miguel valdivia en 30 de Septiembre de 2009, 22:17:24
gracias amigo antimason por tu matriz esta super explicita pero me paso lo mismo que pengordon ,
no me funciono en proteus , yo tengo el 7.5..me prodias decir que paso ?????
saludos de chile :-/ :-/
Título: Re: Matriz de leds 8X8.
Publicado por: antimason en 24 de Octubre de 2009, 19:50:44
Perdona por la tardanza en mi respuesta, el trabajo, mi hijo etc..............bien, con el PROTEUS yo tambien tuve problemas, y decididamente para el tema de las matrices pasé a la acción montando un circuito real y probando los códigos que me daban fallo en PROTEUS pero que en la realidad en circuito íban de maravilla, no sé porque ocurren esos fallos con PROTEUS por lo que estoy igual que tú, saludos. A ver si alguno se atreve con la matriz de 8 filas x 16 columnas.
Título: Re: Matriz de leds 8X8.
Publicado por: mauriciocartagena en 25 de Noviembre de 2009, 01:15:20
Hola antimason agradeciendo de ante mano la ayuda, mira soy nuevo en el foro y he estado mirando los videos que publicaste en el foro con junto con los codigos, yo tengo algo de experiencia en la programacion de microcontroladores y me me entro las ganas de construir un pasa mensajes de 8x32 y la verdad que los programas que publicaste me han ayudado mucho pero lo que no puedo hacer todavia es el desplasamiento de los caracteres sobre el display de leds y quisiera ver la posibilidad si me pudieras ayudar a terminarlo talvez con informacion sobre el criterios o metodos que se utilizan para ese fin o tal vez con algun equeno programita que me ayude.
Título: Re: Matriz de leds 8X8.
Publicado por: Suky en 25 de Noviembre de 2009, 01:19:05
Revisa el siguiente link (http://www.ucontrol.com.ar/forosmf/programacion-en-asm/mis-primeros-programas-pic16f84a-y-pic16f628a/msg17048/#msg17048), seguramente va a darte una idea de como implementarlo.


Saludos!
Título: Re: Matriz de leds 8X8.
Publicado por: mauriciocartagena en 25 de Noviembre de 2009, 01:22:09
Hola a todos, siento mucho no haber saludado antes, lo que psao fue es que todavia no manejo bien las probiedades del foro para publicar los mensajes asi que pidos las respectivas disculpas.

En realidada la ayuda que pido no solo es para antimason si para todos aquellos que quieran ayudarme con lo que se pueda.

Título: Re: Matriz de leds 8X8.
Publicado por: mauriciocartagena en 25 de Noviembre de 2009, 01:32:31
Gracias Suky en este momento lo revisare luego les cuento si me va bien o mal.

Saludos y nuevamente gracisa!!!!
Título: Re: Matriz de leds 8X8.
Publicado por: miguel valdivia en 13 de Diciembre de 2009, 10:32:18
gracias por tu respuesta antimason el proteus que uso es 7.5 pero ahora quiero armarlo en pcb y tope en algo.
yo trabajo con protel 99se pero al diseñar la placa me di cuenta que en la conexion de los led no entendí si los transistores controlan las columnas o las filas y si van a los anodos de los o a los cátodos y lo mismo con los 74hc164.
Osea  si cada fila y  columna es catodo o anodo común 
saludos desde chile y gracias
Título: Re: Matriz de leds 8X8.
Publicado por: antimason en 21 de Enero de 2010, 13:18:19
Hola, aquí dejo el esquema supermasticado de mi montaje, observareis que tambien posee una memoria 24LC256 pues tambien está preparado para usar dicha memoria.
Título: Re: Matriz de leds 8X8.
Publicado por: todopic en 22 de Enero de 2010, 00:37:34
Hola Amigos!, muy buena Antimason, yo estoy implementando una matriz de 10x15, y para generar las tablas, realicé este programita...
si quieres, lo adapto a 8x8  :mrgreen:
ANIMATRIX (http://www.todopic.com.ar/foros/index.php?topic=29170.msg241708#new)
Norberto
Título: Re: Matriz de leds 8X8.
Publicado por: antimason en 22 de Enero de 2010, 01:37:39
Hola Amigos!, muy buena Antimason, yo estoy implementando una matriz de 10x15, y para generar las tablas, realicé este programita...
si quieres, lo adapto a 8x8  :mrgreen:
ANIMATRIX (http://www.todopic.com.ar/foros/index.php?topic=29170.msg241708#new)
Norberto




Perfecto si lo haces para caracteres 8x8, ¿no podrías hacer tambien que sacase el dato hexadecimal de filas y columnas para poder implementar los caracteres en un memoria externa?. Gracias.
Título: Re: Matriz de leds 8X8.
Publicado por: antimason en 22 de Enero de 2010, 13:12:33
Resumiendo este hilo, se empezó colocando una animación, luego se creo un caracter que aparecía en la matriz, luego se consiguió desplazar el caracter por la matriz, mas tarde se usaron tablas para crear un texto largo que se desplazase por la matriz y quedaba pendiente el uso de una memoria externa para almacenar miles de caracteres y tener mas juego. Pues aquí os dejo el video de una animación creada con tres caracteres almacenados en memoria externa 24LC254, y que simulan el movimiento de un perrito.

Título: Re: Matriz de leds 8X8.
Publicado por: antimason en 22 de Enero de 2010, 13:16:51
Aquí os dejo el archivo .bin que hay que grabar en la memoria externa, el archivo asm con el código, y los archivos .INC, de las rutinas del protocolo I2C y de las rutinas de tiempo.
Título: Re: Matriz de leds 8X8.
Publicado por: antimason en 28 de Enero de 2010, 11:31:33
Hola, he adaptado el código de Suky: http://www.ucontrol.com.ar/forosmf/programacion-en-asm/mis-primeros-programas-pic16f84a-y-pic16f628a/msg17048/#msg17048, hecho para un PIC 16F628A y matriz 8x32, a mi matriz 8x8 basada en un PIC 16F84A, el resultado no es todo lo bueno que debiera, debido a que Suky en su código hace uso del reset (Strobe) del registro de desplazamiento y yo tengo ese reset en mi circuito a Vcc, por lo que no hago uso de la función reset. Tendría que hacer un arreglo en las pistas para habilitarlo y por ejemplo poner la patita RA4 como salida de reset teniendo en cuenta que la entrada reset de mi registro está invertida, es decir, la ausencia de señal provoca el reset y la presencia anula el reset. Los caracteres usados por Suky que pone en la tabla los he invertido debido a las caracteristicas constructivas de mi matriz, es decir, para visualizar un dato debo envíar al registro un 0 y no un 1. Aquí el video y los códigos original y el adaptado para que los compareis y podais sacar vuestras conclusiones.

Título: Re: Matriz de leds 8X8.
Publicado por: antimason en 30 de Enero de 2010, 12:48:19
Rectifico algo que dije en el post anterior, STROBE, no es RESET. STROBE es la función que poseen algunos registros que cuando se activa es cuando sacan por sus salidas paralelo los datos previamente cargados. Saludos.
Título: Re: Matriz de leds 8X8.
Publicado por: jmcs87 en 30 de Enero de 2010, 23:34:04
muy bueno antimason :mrgreen: lo que me pregunto es porque en el video no se ve bien definido las letras? ...al parecer hay leds que no deberian prender

Saludos
Título: Re: Matriz de leds 8X8.
Publicado por: antimason en 31 de Enero de 2010, 05:59:03
muy bueno antimason :mrgreen: lo que me pregunto es porque en el video no se ve bien definido las letras? ...al parecer hay leds que no deberian prender

Saludos


Ese asunto es el que me ocupa actualmente y estoy detras de él, ¿tendrá que ver que en mi matriz la salida del portb para activar las filas debe ponerse a 0? ¿tendrá algo que ver que yo uso registros de desplazamiento sin función STROBE?.........en fin, a ver si alguien puede ayudar.
Título: Re: Matriz de leds 8X8.
Publicado por: alogic.on en 31 de Enero de 2010, 06:50:06
Rectifico algo que dije en el post anterior, STROBE, no es RESET. STROBE es la función que poseen algunos registros que cuando se activa es cuando sacan por sus salidas paralelo los datos previamente cargados. Saludos.
no uso los mismos registros pero puede darte alguna idea
lo que no entiendo es si no utilizas el strobe, como haces para sacar los datos del serie al paralelo :shock: yo utilizo los 74595 por que se pueden enlazar en cascada y lo que hago es tirar en serie la trama clock/dato, clock/dato....x64 y despues activar el estrobe, bueno yo lo llamo latch, para sacar los datos por el p. paralelo de los registros, pero si lo dejo fijo en un estado no salen hasta que no vuelve de alto a bajo el nivel del strobe/latch, podrias para no complicarte mucho en modificar el circuito, cortar la pista de la pcb del strobe, y tirar un modesto cablecillo hasta una salida del pic. por que si van saliendo los datos al paralelo segun los tiras en serie, es normal que se vean otros led encendidos aparte de los que deberian, menos por que es muy poco tiempo hasta que los pone en su sitio, pero algo se iluminan. tambien puedes intentar desactivar las filas hasta que esten las columnas colocadas, o desactivar las columnas hasta que esten colocadas las filas, no se si se me entiende :oops:. de esta forma "creo" no se encenderia ningun otro led mientras salen los datos en serie por el paralelo, aunque le veo mejor ponerle el cablecillo y usar el strobe. asi los tengo colocados para que las salidas de clock y data sean tambien el latch y clock de otros registros 74165 estos tambien se pueden poner en cascada, los uso para ampliar entradas, utilizan una entrada al pic para recibir los datos. usea con 4 pines del pic manejas todos los registros de entrada y salida que necesites

un saludo

Título: Re: Matriz de leds 8X8.
Publicado por: antimason en 31 de Enero de 2010, 18:14:11
Rectifico algo que dije en el post anterior, STROBE, no es RESET. STROBE es la función que poseen algunos registros que cuando se activa es cuando sacan por sus salidas paralelo los datos previamente cargados. Saludos.
no uso los mismos registros pero puede darte alguna idea
lo que no entiendo es si no utilizas el strobe, como haces para sacar los datos del serie al paralelo :shock: yo utilizo los 74595 por que se pueden enlazar en cascada y lo que hago es tirar en serie la trama clock/dato, clock/dato....x64 y despues activar el estrobe, bueno yo lo llamo latch, para sacar los datos por el p. paralelo de los registros, pero si lo dejo fijo en un estado no salen hasta que no vuelve de alto a bajo el nivel del strobe/latch, podrias para no complicarte mucho en modificar el circuito, cortar la pista de la pcb del strobe, y tirar un modesto cablecillo hasta una salida del pic. por que si van saliendo los datos al paralelo segun los tiras en serie, es normal que se vean otros led encendidos aparte de los que deberian, menos por que es muy poco tiempo hasta que los pone en su sitio, pero algo se iluminan. tambien puedes intentar desactivar las filas hasta que esten las columnas colocadas, o desactivar las columnas hasta que esten colocadas las filas, no se si se me entiende :oops:. de esta forma "creo" no se encenderia ningun otro led mientras salen los datos en serie por el paralelo, aunque le veo mejor ponerle el cablecillo y usar el strobe. asi los tengo colocados para que las salidas de clock y data sean tambien el latch y clock de otros registros 74165 estos tambien se pueden poner en cascada, los uso para ampliar entradas, utilizan una entrada al pic para recibir los datos. usea con 4 pines del pic manejas todos los registros de entrada y salida que necesites

un saludo




Yo uso el registro 74HC164 que solo tienen clock, data, y reset, y en los anteriores códigos enviaba la trama en serie de 8 bits a dicho registro y una vez hecho esto activaba la fila correspondiente así quedaba asegurado que sólo los leds correspondientes se encendieran. El problema es que el código de Suky que he adaptado a mi matriz está pensado para usar registros con esa función de STROBE, y claro, al usarlo con registros que no tienen STROBE da ese fallo de leds que debieran estar apagados estar parcialmente encendidos. A ver si puedo retocar mas el código para asegurar que la fila sólo se encienda cuando esten cargados la trama de bits en el registro. Saludos.
Título: Re: Matriz de leds 8X8.
Publicado por: MLO__ en 31 de Enero de 2010, 20:24:32
Hola.

Con el 74hc164 hay que apagara todas las filas para enviar los datos, cuando hallas terminado de enviarlos, habilitas la fila correspondiente. Antes de la rutina de enviar los datos a los registros de desplazamiento, deberias poner a 0 el registro del puerto controlador de las filas.

Saludos
Título: Re: Matriz de leds 8X8.
Publicado por: antimason en 02 de Febrero de 2010, 06:59:25
Solucionado, hay que ver lo que es usar unos registros u otros, lo que te puede cambiar el resultado, ya está adaptado el código para su uso con registros 74HC164, gracias MLO por tu colaboración y tambien a alogic.on  


Título: Re: Matriz de leds 8X8.
Publicado por: MLO__ en 02 de Febrero de 2010, 14:42:39
Excelente.

Muy bien trabajo antimason

Saludos
Título: Re: Matriz de leds 8X8.
Publicado por: antimason en 02 de Febrero de 2010, 16:52:02
A ver si alguien me pasa una rutina para que caracteres almacenados en columnas en vez de en filas pueda pasarlos a un registro de desplazamiento, creo haber leido algo de que se coge el byte de la primera columna y se se hace AND con la primera fila, si el resultado es diferente a 0 se envíaba un 1 a DATA del registro, pero claro, ENVÍA UN SÓLO DATO, sea 1 ó 0, pero ¿como se envían los 7 bits restantes?, y los demás bytes de un caracter de 8x8. ¿O sea, como enviaría este caracter a un registro?:

00000000
00000000
11111100
00010010
00010010    ;letra A de 7x5
00010010
11111100
00000000
Título: Re: Matriz de leds 8X8.
Publicado por: antimason en 10 de Febrero de 2010, 19:27:44
A ver si alguien me pasa una rutina para que caracteres almacenados en columnas en vez de en filas pueda pasarlos a un registro de desplazamiento, creo haber leido algo de que se coge el byte de la primera columna y se se hace AND con la primera fila, si el resultado es diferente a 0 se envíaba un 1 a DATA del registro, pero claro, ENVÍA UN SÓLO DATO, sea 1 ó 0, pero ¿como se envían los 7 bits restantes?, y los demás bytes de un caracter de 8x8. ¿O sea, como enviaría este caracter a un registro?:

00000000
00000000
11111100
00010010
00010010    ;letra A de 7x5
00010010
11111100
00000000


Bueno, como hasta ahora siempre había almacenado los datos a mostrar en la matriz en forma de FILAS, ahora quiero desarrollar desplazamientos de mensajes almacenados en forma de COLUMNAS. Ya he realizado una primera prueba con un dibujo estático y da un fallo, queda como efecto "ESPEJO", es decir, queda invertido el resultado respecto al dato almacenado, si esperaba esto en la matriz:

11111111
10000011
10000011
10000011
10000011
10000011
10000011
11111111

En cambio me da esto:

11111111
11000001
11000001
11000001
11000001
11000001
11000001
11111111

Ahí dejo el código y la foto de la simulación en PROTEUS por si alguien me puede ayudar y me dice donde está el fallo.
Título: Re: Matriz de leds 8X8.
Publicado por: jmcs87 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
                   

Título: Re: Matriz de leds 8X8.
Publicado por: antimason 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.
Título: Re: Matriz de leds 8X8.
Publicado por: jmcs87 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:
Título: Re: Matriz de leds 8X8.
Publicado por: tannke 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
Título: Re: Matriz de leds 8X8.
Publicado por: antimason 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. :-/ :-/
Título: Re: Matriz de leds 8X8.
Publicado por: tannke 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
Título: Re: Matriz de leds 8X8.
Publicado por: antimason 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.
Título: Re: Matriz de leds 8X8.
Publicado por: antimason 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. :-/
Título: Re: Matriz de leds 8X8.
Publicado por: tannke 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
Título: Re: Matriz de leds 8X8.
Publicado por: tannke 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!!
Título: Re: Matriz de leds 8X8.
Publicado por: antimason 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. :-/
Título: Re: Matriz de leds 8X8.
Publicado por: tannke 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

Título: Re: Matriz de leds 8X8.
Publicado por: antimason en 19 de Febrero de 2010, 09:38:20
Felicidades, ¿el código que usaste es el mismo que posteaste aquí o reformaste algo?. :-/ :-/
Título: Re: Matriz de leds 8X8.
Publicado por: tannke 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
Título: Re: Matriz de leds 8X8.
Publicado por: antimason 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.
Título: Re: Matriz de leds 8X8.
Publicado por: antimason en 22 de Febrero de 2010, 13:39:47
Subo este código que está mejorado respecto al que puse por aquí de "HOLA MUNDO", este no usa interrupción por desbordamiento del TMR0 como aquel si usaba. Lo podeis simular bien en PROTEUS pero tened en cuenta que aunque en PROTEUS veais bien los caracteres, en el Hardware de mi matriz se verían invertidos, vamos, como efecto "sombra". Pronto subiré otro código pasamensajes pero con almacenamiento externo, es decir, con memoria externa I2C.
Título: Re: Matriz de leds 8X8.
Publicado por: antimason en 10 de Marzo de 2010, 18:22:32
tankee, te propongo otra modificacion de tu programa y se trata de que cuando escribas en memoria puedas elegir la pagina y posicion a partir de donde escribir el mensaje. Seria muy util porque te permitiria crear un mensaje almacenarlo en la pagina y posicion deseada, a continuacion por ejemplo saltar a un efecto de animacion en alguna rutina de animacion y volver a la memoria a por el siguiente mensaje conociendo la pagina y posicion donde lo hayamos almacenado y visualizarlo etc. A ver que te parece la idea.
Título: Re: Matriz de leds 8X8.
Publicado por: tannke en 15 de Marzo de 2010, 05:31:00
Buenas de nuevo. antimason, voy a ver como lo coloco, creo que una manera seria en el botón "Generar" cambiarlo por "Generar en" y debajo colocar un espacio para elegir las posiciones de memoria.
Llevaba unos dias sin entrar, he estado liado con otro proyecto, me compré un modulo web "ez web lynx" y he estado peleando con el conectandolo a un pic para hacer un par de movidillas.

Voy al lio, haber que puedo hacer con la mejora (aprobechare ahora que tengo un par horilas).
En cuanto lo denga digo cosas. Un saludo
Título: Re: Matriz de leds 8X8.
Publicado por: antimason en 16 de Marzo de 2010, 07:54:08
Esperaremos ansiosos el resultado. :-/
Título: Re: Matriz de leds 8X8.
Publicado por: Strepto en 19 de Marzo de 2010, 08:38:02
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.

El caso es que hasta hoy no habia leido este post tuyo y tiene gracia, porque con las letras que subiste hice eso mismo que preguntas, para no solo tener los bytes correspondientes, sino que tambien una referencia grafica de como queda.

Para conseguir eso que preguntas, es tan facil como añadir un formato condicional a las celdas deseadas. De todos modos, subo el archivo modificado con activacion por 0 y activacion por 1 para que todo aquel que lo quiera verlo, disfrutarlo y modificar las letras a su gusto.

Un saludo!
Título: Re: Matriz de leds 8X8.
Publicado por: MarkKnopfler81 en 19 de Marzo de 2010, 09:56:43
Hola tannke, excelente tu proyecto!

Yo asignaría una parte de la memoria (al principio) para guardar una tabla con la posicion de cada mensaje y el largo, o solamente el largo de cada mensaje uno detras de otro, pero de esta forma, para saber donde se ubica, por ejemplo, el mensaje 10 deberias leer los 9 anteriores e ir sumando posiciones.

también se podría asignar otra parte de memoria para programar el orden en que los mensajes aparecen y cuanto tardan, efectos, esas cosas......

Son ideas, no se si te servirán...

saludos.
Título: Re: Matriz de leds 8X8.
Publicado por: antimason en 19 de Marzo de 2010, 11:22:11
Strepto, no consigo abrir con el excel el archivo que has subido, saludos.
Título: Re: Matriz de leds 8X8.
Publicado por: Strepto en 19 de Marzo de 2010, 15:41:47
Strepto, no consigo abrir con el excel el archivo que has subido, saludos.

No se que office usaras, pero yo tengo instalado el 2007 y si usas alguna version anterior puede que no te deje abrirlo. Para ello creo recordar que microsoft tiene colgado un parche en su web para poder visualizar documentos del office 2007 con office anteriores.

Espero que sea eso. Un saludo!

P.D: Si no, puedes probar con este que he subido ahora, que lo he guardado de forma que sea compatible con versiones anteriores.
Título: Re: Matriz de leds 8X8.
Publicado por: Strepto en 22 de Julio de 2010, 12:11:28
Como ayer me aburria en casa y me apetecia recordar un poco el funcionamiento del VB 6, me puse a programar algo que podria ser util. Aqui os dejo un programa para que podais crear vuestras imagenes 8x8 y recibais el codigo de la fila o columna. (Es lo mismo que el excel pero en programa).

Espero que les guste
Título: Re: Matriz de leds 8X8.
Publicado por: cict electronic en 22 de Septiembre de 2010, 18:23:12
Perdona por la tardanza en mi respuesta, el trabajo, mi hijo etc..............bien, con el PROTEUS yo tambien tuve problemas, y decididamente para el tema de las matrices pasé a la acción montando un circuito real y probando los códigos que me daban fallo en PROTEUS pero que en la realidad en circuito íban de maravilla, no sé porque ocurren esos fallos con PROTEUS por lo que estoy igual que tú, saludos. A ver si alguno se atreve con la matriz de 8 filas x 16 columnas.
:oops:

que bien este foro no he encontrado alguno asi yo estoy iniciandome en el tema de las matrices de led ya tengo armado una de 8x 32 pero no me funciona el programa, me sale el mismo mensaje en cada bloque de ocho leds ya cambie el tx de 8 a 32 y sigue igual alguien me podiria ayudadr con esto, todos los ejemplos de 8x8 funcionan bien en la practica gracias.
Título: Re: Matriz de leds 8X8.
Publicado por: tomasgrosso en 28 de Octubre de 2010, 17:19:24
Estube leyengo algo de lo tuyo, esta muy bueno.
Fijate si podes subir algo con alguna matriz de leds de 7 x 32. y en lo posible en BASIC..

Saudos atte Tomas
Título: Re: Matriz de leds 8X8.
Publicado por: antimason en 24 de Julio de 2011, 10:38:21
Hola, llevaba tiempo sin pasar por aquí, os subo un código para 8x32, con ello quedaran resueltas las dudas que alguno me habeis planteado de como adaptar mi código para carteles mas largos, lo he simulado con ISIS 7 aunque con una matriz de 8x16 y funciona PERFECTAMENTE. Compararlo con mi anterior archivo "MIO2.asm" para sacar conclusiones y sacar la lógica que he seguido para ampliar el cartel. Chao.
Título: Re: Matriz de leds 8X8.
Publicado por: antimason en 24 de Julio de 2011, 10:51:47
Solicito a los moderadores una chincheta a este hilo, mas de 16000 visitas merecen una, pues suscita gran interes este tema de las matrices de leds.
Título: Re: Matriz de leds 8X8.
Publicado por: chekrockk en 12 de Agosto de 2011, 03:31:20
muy muy buenos aportes amigo.....que bueno que hay gente como TU que comparte su trabajo con la comunidad.yo e realizado una matriz de 7x7 pero utilizo otro tipo de codigo, el cual aveces se complica un poco mas jajaja.

saludos espero luego me puedas dar algunos tips de como mejorar mi codigo. gracias.
Título: Re: Matriz de leds 8X8.
Publicado por: Alumno en 18 de Agosto de 2011, 16:43:41
bueno alguna vez yo hice una matriz de 16 x 160 y realmente se ve espectacular y se simula bien en proteus, ahora que recuerdo con amigos tambien hicimos una pantalla grafica de 128x64 con puro leds muy grande y la simulacion en el proteus se vuelvo lento pero se nota bien las imagenes, logos y animaciones que se grabaron, el chip que usamos para el barrido fue el 4094
Título: Re: Matriz de leds 8X8.
Publicado por: Demonays en 30 de Septiembre de 2011, 23:04:06
Wow me encanto todo el post, lo he leido todo, y he descargado todos los archivos, soy un novato en la programacion de pics, apenas he logrado encender algunas secuencias de leds, como la del auto fantastico y cosas por el estilo, cosas sencillas, y bueno el profesor nos esta enseñando a `programar el pic16f877 con un cristal de 20Mhz, y se ha antojado de mandarnos a hacer una matriz de leds del tamaño que queramos, que se muestre un mensaje desplazandose (como un cartel de de esos lineales de publicidad), y uff no tengo idea de como trabajar tablas en ensamblador y menos de como hacer para que se muevan, me podre a analizar sus aportes, y si alguno tiene algun manual donde pueda entender la logica de matrices en pics y usando ensamblador, pues bienvenida sea la ayuda jejeje  :lol: , de verdad un millon de gracias por todos los aportes, ahora me voy de inmediato a estudiarlos jejejjeje y entenderlos, para poder ir modificando y haciendo mis propios experimentos jejejjeje, espero poder aportarles luego con fotos o video, estoy emocionado  :mrgreen:  :-/  Saludos a todos !!!!!!!!!!!!!!!!!!!!!!!!!

P.D.: el de 8 x 32 se ve interesante, pero primero quiero experimentar el arreglo sencillo de 8x8 y ver si logro resultados  :mrgreen: !!!!!!!!!!!!!!!

P.D.: No se utilizar el proteus, pero montare todo en el protoboard y hare las pruebas alli, nos vemos luego  :-)
Título: Re: Matriz de leds 8X8.
Publicado por: cosmic en 28 de Agosto de 2012, 23:53:17
Hola amigos.
Creo que ustedes tienen este tema bien molido, pero a mi personalmente me esta dando duro. :z) :z)
Tengo un código, donde muestro una letra A, pero no he podido desplazarla por la matriz.
Si gustan ayudarme con el tema, lo subo para que vean.
Si alguien tiene a bien ayudarme le agradesco mucho.. :oops: :oops:
Título: Re: Matriz de leds 8X8.
Publicado por: jserrano51 en 21 de Septiembre de 2015, 02:51:37
Hola a todos.
Quisiera saber si alguien me podría explicar como genero letras en la matrix 8x8 usando el pic 16f877a. Tengo planteado un circuito en proteus usando el pic al cual conecto directamente el portb y c a la matrix 8x8 en el cual he generado secuencias, barridos y espirales pero no he logrado generar letras.
Estoy usando lenguaje assembler atraves de mplab.
Gracias!
Título: Re: Matriz de leds 8X8.
Publicado por: KILLERJC en 21 de Septiembre de 2015, 11:00:30
Fijate hay un post con un programita hecho en VB6 que te dice los valores de columna/filas a enviar.

Si queres tener almacenada mas de una, entonce vas a tener que guardarlas en memoria y luego ir pidiendo poco a poco una por una
Título: Re: Matriz de leds 8X8.
Publicado por: jserrano51 en 22 de Septiembre de 2015, 00:54:04
Gracias Killer! Soy completamente nuevo en este tema de los pics y disculpa si mis preguntas son muy básicas. A qué tipo de memoria te refieres? Podrías profundizar un poco más la respuesta  :oops: gracias de nuevo
Título: Re: Matriz de leds 8X8.
Publicado por: KILLERJC en 22 de Septiembre de 2015, 02:02:53
Me refiero a la memoria de programa, que es ademas de la EEPROM, las 2 memorias no volatiles que hay. Como almacenarlas depende del PIC que tengas.
Como podrias tenerlo en tablas como podrias poner los datos directamente si es que puede leer la memoria.