TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: DAVIYANKE en 18 de Junio de 2021, 11:57:15
-
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
-
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.
-
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.
Envío el palito de la H por SPI al registro de desplazamiento.
Enciendo el primer común (columna).
Para correrlo.
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
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..
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.
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.
-
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 :-)
-
...
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'
-
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