TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: ASABoomer en 03 de Abril de 2015, 03:47:41
-
Saludos, me han dejado un proyecto para estas vacaciones pero estoy en la recta final, y tuve un problema al manejar dos tablas de datos, el proyecto consiste en realizar un contador ascendente y descendente, realice dos tablas, en una le sumo el valor del registro W al PCL y en otra se lo resto, pero al hacer el call para mi tabla descendente después de ir a la localidad de PCL me direcciona después a la localidad de la otra tabla lo que hace que ambos casos el contador sea descendente, no se como resolverlo, no llevo mucho metido en el lenguaje ensamblador y el empleo de tablas es obligatorio, el contador ascendente anda de maravilla. El contador (CT) en ambos casos hace su función el problema es al llamar la tabla, no se si pueda usar saltos de bits en la tabla para condicionar la operación de W con PCL, les dejo mi código: donde aparecen los :5] es donde tengo duda y los números representan el como se ve en el simulador de mpllab ide paso a paso
Utilizando un display de 7 segmentos, diseñar e implementar un contador ascendente,
;cuando el switch 1 este activo.
;Rediseñar el contador con la característica que ahora,
;cuando el switch 1 este inactivo el contador realice la cuenta en modo descendente.
;**********Configuracion del PIC**********
__CONFIG _CP_OFF & _WDT_OFF & _XT_OSC & _PWRTE_ON ;Configuracion para grabar el PIC
LIST P=16F84A ;PIC que se empleará
INCLUDE <P16F84A.INC> ;Definición de operandos/registros a incluir
;**********Definición de variables**********
CBLOCK 0x0C ; Inicia bloque de constantes en la memoria RAM apartir de la posicion 0x0C
CT ; Declaracion de variable CT (contador de programa incrementa o decrementa)
AUX ; Declaracion de variable AUX para igualar numeros.
CONT1
CONT2
CONT3
ENDC ; Termina el bloque de constantes
;**********Código deprograma**********
ORG 0
INICIO
bsf STATUS, RP0 ; Acceso a Banco 1
clrf PORTB ; TRISB se configuro como salida
movlw b'00011111' ; Guarda b'00011111' en W
movwf PORTA ; TRISA se configura como entrada
bcf STATUS, RP0 ; Acceso a Banco 0
clrf CT ; Iguala CT a 0
clrf AUX ; Iguala AUX a 0
Programa
TEST
movlw b'00001' ;
andwf PORTA, F ;
ESTADO
btfsc PORTA,0 ;
goto up
;**********Conteo en decremento**********
down
clrf PORTB
movlw d'16'
movwf CT
1:5] call decre
4 :5] movwf PORTB
call Retardo_1s
decremento
decf CT, f
movf AUX, w ;
subwf CT, f
btfsc STATUS, Z
goto down
movf CT, w
call decre
movwf PORTB
call Retardo_1s
goto decremento
;**********Conteo en incremento**********
up
clrf PORTB
clrf CT
movf CT, w
call incre
movwf PORTB
call Retardo_1s
incremento
incf CT, f ;
movlw d'16' ;
subwf CT, w ;
btfsc STATUS, C ;
goto up
movf CT, w
call incre
movwf PORTB
call Retardo_1s
goto incremento
;Tabla de incremento
incre addwf PCL,F
retlw b'00111111'; 0
3:5] retlw b'00000110'; 1
retlw b'01011011'; 2
retlw b'01001111'; 3
retlw b'01100110'; 4
retlw b'01101101'; 5
retlw b'01111101'; 6
retlw b'00000111'; 7
retlw b'01111111'; 8
retlw b'01101111'; 9
retlw b'01110111'; A
retlw b'01111100'; B
retlw b'00111001'; C
retlw b'01011110'; D
retlw b'01111001'; E
retlw b'01110001'; F
;Tabla de decremento
decre subwf PCL,F
retlw b'00111111'; 0
retlw b'00000110'; 1
retlw b'01011011'; 2
retlw b'01001111'; 3
retlw b'01100110'; 4
retlw b'01101101'; 5
retlw b'01111101'; 6
retlw b'00000111'; 7
retlw b'01111111'; 8
retlw b'01101111'; 9
retlw b'01110111'; A
retlw b'01111100'; B
retlw b'00111001'; C
retlw b'01011110'; D
retlw b'01111001'; E
2:5] retlw b'01110001'; F
;;**********Retardo**********
Retardo_1s MOVLW 0X21
MOVWF CONT3
RETA2 MOVLW 0X64
MOVWF CONT2
RETA1 MOVLW 0X64
MOVWF CONT1
RETA0 DECFSZ CONT1,1
GOTO RETA0
DECFSZ CONT2,1
GOTO RETA1
DECFSZ CONT3,1
GOTO RETA2
RETURN
END
-
Afortunadamente di con mi error :lol: la solución a mi problema es que solo se requiere una tabla para el manejo de datos, pero me surge una duda, esta condición es única del PIC 16F84A o es una limitación del lenguaje ensamblador?
-
Afortunadamente di con mi error la solución a mi problema es que solo se requiere una tabla para el manejo de datos, pero me surge una duda, esta condición es única del PIC 16F84A o es una limitación del lenguaje ensamblador?
Bienvenido al foro. No se a que limitacion te refieres, el asm no tiene ninguna limitacion, unicamente que lleva mas tiempo hacer los programas.
Cuando llamas a una tabla tienes que cargar el numero a leer en W, haciendo "movf REGISTRO,0" y a continuacion "call TABLA", y tienes que tener en cuenta que el numero a leer no puede exceder del numero de valores de la tabla, en este caso 16, nada mas.
Evidentemente solo necesitas una tabla ya que son iguales.
-
Recorda ademas de poner siempre las tablas al principio del programa, eso te va a solucionar muchos dolores de cabeza.
es decir:
ORG 0x00
GOTO INICIO
ORG 0x04
GOTO INTERRUPCION
;Tabla
;Programa
No recuerdo cuanta memoria tiene el 16F84 pero en los micros con mas memoria te vas a encontrar con que el CALL no tiene suficientes bits para direccionar toda la memoria
-
Hola ASABoomer, lamento informarte que el error es tuyo y no del asm., mira estas tablas:
;Tabla de incremento
incre addwf PCL,F
retlw b'00111111'; 0
retlw b'00000110'; 1
retlw b'01011011'; 2
retlw b'01001111'; 3
retlw b'01100110'; 4
retlw b'01101101'; 5
retlw b'01111101'; 6
retlw b'00000111'; 7
retlw b'01111111'; 8
retlw b'01101111'; 9
retlw b'01110111'; A
retlw b'01111100'; B
retlw b'00111001'; C
retlw b'01011110'; D
retlw b'01111001'; E
retlw b'01110001'; F
;Tabla de decremento
decre subwf PCL,F
retlw b'00111111'; 0
retlw b'00000110'; 1
retlw b'01011011'; 2
retlw b'01001111'; 3
retlw b'01100110'; 4
retlw b'01101101'; 5
retlw b'01111101'; 6
retlw b'00000111'; 7
retlw b'01111111'; 8
retlw b'01101111'; 9
retlw b'01110111'; A
retlw b'01111100'; B
retlw b'00111001'; C
retlw b'01011110'; D
retlw b'01111001'; E
retlw b'01110001'; F
Mas exactamente debes de mirar en el encabezado de cada tabla.
Tu llegas a las tablas con un valor XX guardado en el registro W, y este valor se lo debe de sumar al PCL para que se produzca un salto de XX posiciones.
ERROR, en una tabla sumas al PCL y en la otra restas al PCL.
Un saludo.
Atte. CARLOS.
-
decre subwf PCL,F
Joder que pasada eso no lo habia visto :shock: :shock:, gracias Chaly