Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: AllenWalkerKHR en 30 de Junio de 2016, 00:02:16
Título: Ayuda para hacer una multiplexacion en ensamblador
Publicado por: AllenWalkerKHR en 30 de Junio de 2016, 00:02:16
Hola a todos tengo un gran problema porque en una clase me hicieron programar en ensamblador un contador del 0 hasta el 9 en un display de 7 segmentos pero ahora me pide que haga un contador desde 0 hasta 24 y no tengo ni idea. Adjunto mi codigo basico para que me apoyen porfavor. list p=16F628A #include P16F628A.inc
CONTADOR EQU 0x20 ;SE DECLARA LA VARIABLE LLAMADA CONTADOR Y SE LE ASIGNA EL ESPACIO DE MEMORIA 0X20 CONTADOR2 EQU 0X21 CONTADOR3 EQU 0X22 CONTADOR4 EQU 0X23
Reset ORG 0x00 ;AQUI COMIENZA NUESTRO PROGRAMA GOTO Inicio ;SALTO A INICIO DE MI PROGRAMA ORG 0X05
Inicio
BSF STATUS, RP0 ;NOS CAMBIAMOS AL BANCO 1, DONDE ESA TRISB CLRF PORTB BCF STATUS, RP0
MAIN CLRF CONTADOR4
BUCLE MOVF CONTADOR4,W CALL TABLA MOVWF PORTB CALL RETARDO INCF CONTADOR4, f MOVF CONTADOR4,W SUBLW D'10' ;lOS NUMEROS VAN EN HEXADECIMAL BTFSS STATUS, Z GOTO BUCLE GOTO MAIN
Título: Re:Ayuda para hacer una multiplexacion en ensamblador
Publicado por: Pinolillo16 en 30 de Junio de 2016, 03:30:11
Deberias colocarlo en de assembler, bueno te recomiendo es lo mismo que hacer uno solo con display las salidas de los dígitos son las mismas sólo los comunes son los que vas a estar mostrando cada x mili segundos, mientras más rápido los muestres menos se nota el cambio.
Por ejemplo tienes tus dígitos conectados al puerto b, y ra0 corresponde a unidades ra1 a decenas
Generas dos variables unidades y decenas. Incrementas unidades y muestras:
Activo pin ra0 y en el puerto b unidades después desactivo ra0 para activar ahora ra1 con el valor de decenas en Puerto B
Y así más rápido mejor.
Saludos
Título: Re:Ayuda para hacer una multiplexacion en ensamblador
Publicado por: KILLERJC en 30 de Junio de 2016, 08:52:51
Varias cosas en el codigo:
Código: ASM
Reset
ORG 0x00;AQUI COMIENZA NUESTRO PROGRAMA
GOTO Inicio ;SALTO A INICIO DE MI PROGRAMA
ORG 0X05
No se pone el ORG 0x05 el mismo linker se encarga de ponerlo donde debe, en otros PICs como la flia PIC18 los GOTO ocupan 2 espacios de memoria, Y si un ORG 0x08 , GOTO xxx, y luego ORG 0x09 es un error. Por ahi mejor asegurarse que si entra a la interrupcion se salga es deicr:
Código: ASM
Reset
ORG 0x00;AQUI COMIENZA NUESTRO PROGRAMA
GOTO Inicio ;SALTO A INICIO DE MI PROGRAMA
ORG 0X04
RETURN
---------------------------
Esta parte es un error de concepto:
Citar
BSF STATUS, RP0 ;NOS CAMBIAMOS AL BANCO 1, DONDE ESA TRISB CLRF PORTB BCF STATUS, RP0
Estas cambiando el registro TRIS, pero como el opcode no puede tener Todos los bits, al usarse el valor PORTB o TRISB tienen el mismo resultado, y funciona igual, pero deberias tener en claro que realmente lo que estas haciendo y que deberias hacer es:
Código: ASM
BSF STATUS, RP0 ;NOS CAMBIAMOS AL BANCO 1, DONDE ESA TRISB
Como dijo Pinolillo, mejor tener 2 variables, una llamada decena y otra unidad. El "multiplexado" es encender un display ej. unidades con su numero, luego de un tiempito apagarlo encender el otro ( decenas con su numero), esperar un ratito y apagarlo. Esto se repite, y que debe ser rapido para que el ojo humano no lo note. Demasiado rapido significaria que se va a ver con un brillo disminuido, demasiado lento y vas a ver el efecto de que uno se apaga. Entonces te propongo un programa:
Código: ASM
MAIN
CALL INCREMENTA_CONTADOR
CALL MULTIPLEXADO
CALL DELAY
GOTO MAIN
Y tendrias que hacer cada uno de esos:
Delay es de 10ms, aca tenes para generarlos: http://www.piclist.com/techref/piclist/codegen/delay.htm
Multiplexado es como te lo dije, pasa una ves, apaga los comunes de los displays, pone el valor de unidades (con la tabla como tenes realizado), y enciende el comun del display unidad, luego en la otra vuelta apaga los comunes, pone el valor de las decenas, y enciende la decena. Si pasa otra ves se repite lo anterior, podrias leer el valor del comun de la decena o de la unidad con BTFSS para saber cual es el turno de quien.
Incrementa_contador, es distinto, en nuestro loop tenemos un delay de 20ms, pero para llegar a 24 son casi medio segundo, demasiado rapido para el ojo, lo que podemos hacer es jugar con ese delay, usamos un registro mas y mantenemos la cuenta de cuantas veces entro, supongamos que cada medio segundo quiero que entre, entonces debere contar 25, cuando entra 25 veces recien ahi ejecuto mi codigo y pongo a 0 el contador para que entre de nuevo, que es el codigo? es incrementar unidades, ver si llego a 10, si llego a 10 debo ponerlo en 0 e incrementar la decena, si decena llego a 3 debo poner a 0 la decena.
-------------------------------------------------
Eso es todo, tu programa separado en 3 partes casi independientes, para que te guies.