Autor Tema: Matriz de Leds con desplazamiento PICs 16f877 y 16hc164(reg. de desplazamiento)  (Leído 277 veces)

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

Desconectado DAVIYANKE

  • PIC10
  • *
  • Mensajes: 3
Buenas a todos, disculpen estoy haciendo una matriz de leds con desplazamiento :-), con el lenguaje assembler y los pics 16f877 y 16hc164(registro de desplazamiento) y entiendo la programacion pero tengo problemas a la hora de desplazar un determinado caracter (letra), por favor si alguien me pudiera ayudar se lo agradeceria mucho.
Quiero desplazar la letra "H" y mando los datos por los pines 0,1 PUERTO C, (pin 0 clock-->cada 1 segundo) y (pin 1 data) del pic16f877 :)
PD: adjunto el codigo en assembler, el proyecto en proteus y un pequeño video sobre mi proyecto.

list p=16f877
include <p16f877.inc>
dato1      EQU      0x22      ;DATO PARA EL RETARDO
dato2      EQU    0x23      ;DATO PARA EL DESPLAZAMIENTO
ORG         0x00

         bsf      STATUS,5
         bcf      STATUS,6
         clrf   TRISA
         clrf   TRISB
         movlw   b'11111000'
         movwf   TRISC
         ;******TIMER0 ******
         movlw   b'00000111'
         movwf   OPTION_REG

         bcf      STATUS,5
         bcf      STATUS,6
      
         clrf   PORTA
         clrf   PORTB
         clrf   PORTC
         CLRF   dato2

inicio      bcf      PORTC,0
         BSF      PORTC,1
         call   retardo

         bsf      PORTC,0
         BSF      PORTC,1
         MOVF   dato2,0
         CALL   TABLA      
         MOVWF   PORTB
         call   retardo
         INCF   dato2,1
         goto    inicio



;**************INICIO TABLA*****************
TABLA      ADDWF   PCL,1
         RETLW   b'00000000'      ;PRIMERA COLUMNA LETRA H
         RETLW   b'11100111'      ;SEGUNDA COLUMNA LETRA H
         RETLW   b'11100111'      ;TERCERA COLUMNA LETRA H
         RETLW   b'11100111'      ;CUARTA COLUMNA LETRA H
         RETLW   b'11100111'      ;QUINTA COLUMNA LETRA H
         RETLW   b'11100111'      ;SEXTA COLUMNA LETRA H
         RETLW   b'11100111'      ;SEPTIMA COLUMNA LETRA H
         RETLW   b'00000000'      ;OCTAVA COLUMNA LETRA H
;*************FIN TABLA********************



;**INICIO retardo de 1 segundo aproximadamente**
retardo      movlw   d'7'
         movwf   dato1

label_2      clrf   TMR0
         bcf      INTCON,2
         

label_1      btfss   INTCON,2
         goto   label_1
         decfsz   dato1,1
         goto   label_2
         
         return
;**FIN retardo de 1 segundo aproximadamente**


END
« Última modificación: 05 de Julio de 2021, 23:22:35 por DAVIYANKE »
David Alegria Quispe desde La Paz Bolivia

Desconectado Eduardo2

  • PIC24F
  • *****
  • Mensajes: 513
Re:Matriz de Leds con desplazamiento PICs 16f877 y 16hc164(reg. de desplazamiento)
« Respuesta #1 en: 18 de Junio de 2021, 14:43:06 »
Al pin C1 lo tenés que mantener en '1' solamente un ciclo  (para cargar el 1er registro) luego debe ir a '0'
Cuando se terminan las columnas hay que volver a barrer desde el principio y ahi seguís incrementando indefinidamente.


Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8121
Re:Matriz de Leds con desplazamiento PICs 16f877 y 16hc164(reg. de desplazamiento)
« Respuesta #2 en: 18 de Junio de 2021, 18:37:51 »
Se puede hacer de dos formas...

Como lo estas haciendo vos. El problema es que no te das cuenta como hacerlo..
Siempre vas a comenzar con 1000 0000 en el registro de desplazamiento.. Y luego mover ese 1 solo es decir el próximo paso es 0100 0000, asi hasta completar. Vamos a llamarle "un ciclo" a este movimiento.

En el primer ciclo, solo vas a activar los leds del palito de la H, cuando este en 1000 0000, y luego no vas a activar mas nada hasta que comience el otro ciclo. Este ciclo lo podes repetir varias veces para que sea mas lenta la transición.
Cuando quieras correr la H,, ahora vas a tener que tener en cuenta que cuando este en 1000 0000 vas a tener que activar los dos leds del medio, y cuando este en 0100 0000 vas a tener que activar el palito de la H..

Complicado.. Tiene sus desventajas en que si o si vas a tener que usar las entradas, porque necesitas parar en cada pulso de clock que le das.

---------------------------

Otra forma de realizarlo, es cambiar el formato como lo estas haciendo. Con los mismos elementos. Y tal ves hasta usando mejor el tiempo.
El registro de desplazamiento usarlo para cargar el dato, y las salidas para controlar las columnas.

Como ahora necesitas poner si o si 8 bits. Lo podes hacer con el SPI! (si queres obviamente) Y controlas el común que se vuelve mas sencillo.
Ej.

Citar
Envío el palito de la H por SPI al registro de desplazamiento.
Enciendo el primer común (columna).

Para correrlo.
Citar
Envío los dos leds del medio. Enciendo el primer común (columna). Espero un tiempito
Envío el palito de la H. Enciendo el segundo común (columna). Espero un tiempito si debo repetirlo.

Observa que si agrego un dato mas esto es repetitivo y ciclico

Citar
Envio los dos leds del medio. Enciendo el primer comun (columna). Espero un tiempito
Envio los dos leds del medio. Enciendo el segundo comun (columna). Espero un tiempito
Envio los Palito de la H. Enciendo el tercer comun (columna). Espero un tiempito

Es decir..

Citar
Envío datos de la columna 1, enciendo la columna 1. Espero un tiempito. Apago columna 1 (para que no se vean los datos de la columna dos mientras ingresan al registro de desplazamiento)
Envío datos de la columna 2, enciendo la columna 2. Espero un tiempito. Apago columna 2
Envió datos de la columna 3, enciendo la columna 3. Espero un tiempito. Apago columna 3


Esto me permite hacerlo en un LOOP! Comenza mostrando primero la H sola. Sin moverse, que es el como te lo pase. Luego solamente es "desfazar" el indice de la tabla de la H y obtenes tu H en movimiento.

Citar
Envío datos de la columna 2, enciendo la columna 1. Espero un tiempito. Apago columna 1
Envío datos de la columna 3, enciendo la columna 2. Espero un tiempito. Apago columna 2
Envió datos de la columna 4, enciendo la columna 3. Espero un tiempito. Apago columna 3


Las ventajas de esta forma son:
- Podes usar el SPI. Por lo tanto menos pensar en que movimiento debe hacer el puerto.
- Podes usar el timer para definir cuando mostrar la otra columna. Ese tiempito a "esperar".
- Es mas simple el LOOP donde se muestra.
« Última modificación: 18 de Junio de 2021, 18:40:27 por KILLERJC »

Desconectado DAVIYANKE

  • PIC10
  • *
  • Mensajes: 3
Re:Matriz de Leds con desplazamiento PICs 16f877 y 16hc164(reg. de desplazamiento)
« Respuesta #3 en: 18 de Junio de 2021, 20:28:16 »
Al pin C1 lo tenés que mantener en '1' solamente un ciclo  (para cargar el 1er registro) luego debe ir a '0'
Cuando se terminan las columnas hay que volver a barrer desde el principio y ahi seguís incrementando indefinidamente.


gracias por responder en realidad el pin c1 alterna 0 a 1 como un clock cada un segundo :-)
David Alegria Quispe desde La Paz Bolivia

Desconectado Eduardo2

  • PIC24F
  • *****
  • Mensajes: 513
Re:Matriz de Leds con desplazamiento PICs 16f877 y 16hc164(reg. de desplazamiento)
« Respuesta #4 en: 18 de Junio de 2021, 22:32:50 »
...
gracias por responder en realidad el pin c1 alterna 0 a 1 como un clock cada un segundo :-)

Entonces ni el código ni el gif que subiste se corresponde con lo que tenés, ahí C1 está siempre en '1'

Desconectado DAVIYANKE

  • PIC10
  • *
  • Mensajes: 3
Re:Matriz de Leds con desplazamiento PICs 16f877 y 16hc164(reg. de desplazamiento)
« Respuesta #5 en: 03 de Julio de 2021, 20:28:08 »
Muchas gracias por responder :-), te comento que logre mostrar la "H" con PSI y tal como tu lo mencionaste, ahora estoy tratando de hacer el desplazamiento "desfaze", entiendo muy bien la idea pero lo logro hacerlo en asembler por favor me podrias orientar mejor en esta parte :-).
Nota: comparto lo que hice. :-), ahh utilize dos tablas para las columnas y otro para los datos.

list p=16f877a
include <p16f877a.inc>

;=================================================  ====
; constant definitions
#define CS 0x02 ; PORTA,2
;=================================================  ====


dato2      EQU    0x26      ;DATO PARA EL DESPLAZAMIENTO
dato1      EQU    0x27      ;DATO PARA EL DESPLAZAMIENTO
cblock    0x20
count1
count2
valor
endc


ORG      0x00         
      bcf      STATUS,5   ;ACCESO AL BANCO 0
      bcf      STATUS,6   ;ACCESO AL BANCO 0
      CLRF   TRISB      ;PUERTO B COMO SALIDA
      CLRF   TRISA      ;PUERTO A COMO SALIDA
      ;CLRF   TRISD      ;PUERTO A COMO SALIDA
      ;MOVLW   b'00000001'
      ;MOVWF   dato2   
      movlw   0x20      ;
      movwf    SSPCON      ;PARA EL SPI
      bsf      STATUS,5   ;ACCESO AL BANCO 1
      bcf      STATUS,6   ;ACCESO AL BANCO 1
      MOVLW   b'11000000'
      MOVWF   SSPSTAT
      ;clrf   SSPSTAT      ;PARA EL SPI

      movlw   b'00010000'   ;C3(CLOCK COMO SALIDA),C4(COMO ENTRADA) Y C5(SALIDA DE DATOS)
      movwf   PORTC      ;
      CLRF   PORTB      ;LIMPIO EL PUERTO B
      CLRF   PORTA      ;LIMPIO EL PUERTO A
      ;CLRF   PORTD      ;LIMPIO EL PUERTO A
      bcf      STATUS,5   ;ACCESO AL BANCO 0
      bcf      STATUS,6   ;ACCESO AL BANCO 0
      CLRF   dato2      ;LIMPIO EL DATO_2
      CLRF   dato1      ;LIMPIO EL DATO_1

      MOVLW   b'00000000'
      MOVWF   dato2
      MOVLW   b'00000000'
      MOVWF   valor
      ;MOVWF   count2

MAIN    bcf    PORTA,CS        ;ENABLE CHIP SELECT OUTPUT LOW
      ;movf   valor,dato2
      MOVF    dato2,0      ;
      CALL      TABLA      ;VOY A TABLA Y CARGO LOS DATOS
      movwf    SSPBUF        ;MUEVO LOS DATOS A EL BUF
   Char2
   bsf    STATUS,RP0
   btfss    SSPSTAT,BF ; datas transfer complete?
   goto    Char2
   incf   dato2,1
   bcf STATUS,RP0 ;change bank
      INCF   dato2,1      ;INCREMENTO DATO_2 PARA LA TABLA
      MOVF    dato1,0      ;
      CALL    TABLA_2      ;VOY A TABLA_2 PARA ENCERDER LAS COLUNMAS
      MOVWF   PORTB      ;MUEVO LAS COLUMNAS AL PUERTO B
         
      call    DELAY      ;ESPERO UN MOMENTITO
      CLRF    PORTB      ;LIMPIO EL PUERTO B
      INCF      dato1,1        ;INCREMENTO DATO_1 PARA LA TABLA_2       
      bsf    PORTA,CS       ; DISBLE CHIP SELECT
      ;btfsc   PORTA,CS
      ;incf   valor,1
;incf   valor,1
      goto    MAIN
   
   
DELAY                        ;SUBRUTINA DELAY (ESPERO UN MOMENTITO)
      loop1 decfsz count1,1       
      goto loop1
      ;decfsz count2,1       
      ;goto loop1
      return

;**************INICIO TABLA*****************
TABLA    ADDWF   PCL,1
         RETLW   b'11111111'      ;PRIMERA COLUMNA LETRA H
         RETLW   b'11111111'      ;SEGUNDA COLUMNA LETRA H
         RETLW   b'00000000'      ;TERCERA COLUMNA LETRA H
         RETLW   b'00000000'      ;CUARTA COLUMNA LETRA H
         RETLW   b'11100111'      ;QUINTA COLUMNA LETRA H
         RETLW   b'11100111'      ;SEXTA COLUMNA LETRA H
         RETLW   b'00000000'      ;SEPTIMA COLUMNA LETRA H
         RETLW   b'00000000'      ;OCTAVA COLUMNA LETRA H
;*************FIN TABLA********************
   

;**************INICIO TABLA_2*****************
TABLA_2  ADDWF   PCL,1
         RETLW   b'00000001'      ;ENCIENDO LA PRIMERA COLUMNA
         RETLW   b'00000010'      ;ENCIENDO LA SEGUNDA COLUMNA
         RETLW   b'00000100'      ;ENCIENDO LA TERCERA COLUMNA
         RETLW   b'00001000'      ;ENCIENDO LA CUARTA COLUMNA
         RETLW   b'00010000'      ;ENCIENDO LA QUINTA COLUMNA
         RETLW   b'00100000'      ;ENCIENDO LA SEXTA COLUMNA
         RETLW   b'01000000'      ;ENCIENDO LA SEPTIMA COLUMNA
         RETLW   b'10000000'      ;ENCIENDO LA OCTAVA COLUMNA
;*************FIN TABLA_2********************
END
« Última modificación: 05 de Julio de 2021, 23:21:35 por DAVIYANKE »
David Alegria Quispe desde La Paz Bolivia