Autor Tema: Lenguaje assambler: Al usar dos tablas de datos se redirecciona mal el PCL  (Leído 2204 veces)

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

Desconectado ASABoomer

  • PIC10
  • *
  • Mensajes: 12
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
ESTOY LISTO!!... Y TU?!?!?!........

Desconectado ASABoomer

  • PIC10
  • *
  • Mensajes: 12
Re: Lenguaje assambler: Al usar dos tablas de datos se redirecciona mal el PCL
« Respuesta #1 en: 03 de Abril de 2015, 04:47:49 »
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?
ESTOY LISTO!!... Y TU?!?!?!........

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Lenguaje assambler: Al usar dos tablas de datos se redirecciona mal el PCL
« Respuesta #2 en: 03 de Abril de 2015, 05:51:00 »
Citar
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.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Lenguaje assambler: Al usar dos tablas de datos se redirecciona mal el PCL
« Respuesta #3 en: 03 de Abril de 2015, 08:21:50 »
Recorda ademas de poner siempre las tablas al principio del programa, eso te va a solucionar muchos dolores de cabeza.

es decir:

Código: ASM
  1. ORG  0x00
  2. GOTO INICIO
  3. ORG  0x04
  4. GOTO INTERRUPCION
  5.  
  6. ;Tabla
  7.  
  8. ;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

Desconectado Chaly29

  • Moderador Global
  • DsPIC33
  • *****
  • Mensajes: 4315
Re: Lenguaje assambler: Al usar dos tablas de datos se redirecciona mal el PCL
« Respuesta #4 en: 03 de Abril de 2015, 11:14:43 »
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.

La teoría es cuando se sabe todo y nada funciona. La práctica es cuando todo funciona y nadie sabe por qué.

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Lenguaje assambler: Al usar dos tablas de datos se redirecciona mal el PCL
« Respuesta #5 en: 03 de Abril de 2015, 15:18:43 »
Citar
decre    subwf    PCL,F

Joder que pasada eso no lo habia visto  :shock: :shock:, gracias Chaly


 

anything