TODOPIC

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

   __CONFIG _INTOSC_OSC_NOCLKOUT & _MCLRE_ON & _WDT_OFF & _CP_OFF & _BODEN_ON & _PWRTE_ON & _LVP_OFF

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

TABLA:
   ADDWF   PCL,f
   RETLW   b'11000000'
   RETLW   b'11111001'
   RETLW   b'10100100'
   RETLW   b'10110000'
   RETLW   b'10011001'
   RETLW   b'10010010'
   RETLW   b'10000010'
   RETLW   b'11111000'
   RETLW   b'10000000'
   RETLW   b'10010000'

RETARDO
   MOVLW   0X01
   MOVWF   CONTADOR

CICLO
   MOVLW   0XFF
   MOVWF   CONTADOR2

CICLO2
   MOVLW   0XFF
   MOVWF   CONTADOR3

CICLO3
   DECFSZ   CONTADOR3
   GOTO   CICLO3

   DECFSZ   CONTADOR2
   GOTO   CICLO2
         
   DECFSZ   CONTADOR
   GOTO   CICLO   
   RETURN

   END
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
  1. Reset
  2.    ORG 0x00     ;AQUI COMIENZA NUESTRO PROGRAMA
  3.    GOTO Inicio   ;SALTO A INICIO DE MI PROGRAMA
  4.    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
  1. Reset
  2.    ORG 0x00     ;AQUI COMIENZA NUESTRO PROGRAMA
  3.    GOTO Inicio   ;SALTO A INICIO DE MI PROGRAMA
  4.    ORG   0X04
  5.    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
  1. BSF    STATUS, RP0  ;NOS CAMBIAMOS AL BANCO 1, DONDE ESA TRISB
  2.    CLRF   TRISB
  3.    BCF      STATUS, RP0

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

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
  1. MAIN
  2.     CALL   INCREMENTA_CONTADOR
  3.     CALL   MULTIPLEXADO
  4.     CALL   DELAY
  5.     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.