TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: loren en 07 de Junio de 2006, 16:08:08

Título: depurar mejor la instrucción rtlw
Publicado por: loren en 07 de Junio de 2006, 16:08:08
Hola, yo tengo hecho el típico programa que convierte las entrada binaria por la puerta A, en una salida decimal por la puerta B en un display de 7 segmentos.

DISPLAY      addwf   PCL,F      ;Se le suma los datos del registro W, proveniente de la puerta A y se vuelve a
               ;guardar en el mismo registro PCL.
      retlw   3F      ;Se define el cero para ser mostrado en el display.
      retlw   06      ;Se define el uno.
      retlw   5B      ;Se define el dos.
      retlw   4F      ;Se define el tres.
      retlw   66      ;Se define el cuatro.
      retlw   6D      ;Se define el cinco.
      retlw   7D      ;Se define el seis.
      retlw   07      ;Se define el siete.
      retlw   7F      ;Se define el ocho.
      retlw   6F      ;Se define el nueve.
         

      END         ;Se finaliza el programa.

pero el máximo valor que puedo introducir para mostrar en un sólo display es el 1001, que en decimal sería el 9, y que al sumarlo al registro pcl, me llevaría a la instrucción retlw 6F, que representaría el 9 iluminandose los segmentos que le corresponde. Pero cuando introduzco un valor en binario por la puerta A mayor que 1001, por ejemplo, 1010, no tiene instrucción asignada, por lo que cuando lo simulo, me recorre el k de memoria de instrucción hasta el final y vuelve a empezar, mostrandome el último número que yo había introducido y que no era mayor que el 9. Lo que me gustaría saber si hay alguna instrucción, que cuando me paso de 1001, sea cual sea, automáticamente me vaya siempre a un mismo lugar, y me salga en el display, por ejemplo una E de error, avisandome de que he introducido un valor mayor del que está programada.
Gracias y saludos.    
Título: Re: depurar mejor la instrucción rtlw
Publicado por: LabPIC en 07 de Junio de 2006, 16:30:30
Una instrucción espedifica no existe para lo que comentas, sin embargo lo puedes realizar por software.

Saludos LabPIC
Título: Re: depurar mejor la instrucción rtlw
Publicado por: BrunoF en 07 de Junio de 2006, 16:32:58
Hola.

movf      PORTA,W
sublw     0x09              ;9 - W -> W
movf      PORTA,W
btfss       STATUS,C
movlw    .10                 ;cargar W con Error!

call         DISPLAY

DISPLAY      addwf   PCL,F      ;Se le suma los datos del registro W, proveniente de la puerta A y se vuelve a
               ;guardar en el mismo registro PCL.Con este metodo es necesario invertir la tabla
      retlw   6F      ;Se define el nueve.
      retlw   7F      ;Se define el ocho.
      retlw   07      ;Se define el siete.      
      retlw   7D      ;Se define el seis.
      retlw   6D      ;Se define el cinco.
      retlw   66      ;Se define el cuatro.
      retlw   4F      ;Se define el tres.
      retlw   5B      ;Se define el dos.
      retlw   06      ;Se define el uno.
      retlw   3F      ;Se define el cero para ser mostrado en el display.
      retlw   XX     ;aca pone el valor para la letra "E" de Error

      END         ;Se finaliza el programa.

Exitos!
Título: Re: depurar mejor la instrucción rtlw
Publicado por: LabPIC en 07 de Junio de 2006, 17:12:01
Si lo que quieres es depurar mejor tu programa aqui esta una opción, incluyendo la parte que ha proporcionado el compañero BrunoF.

movf      PORTA,W
sublw     0x09              ;9 - W -> W
movf      PORTA,W
btfss       STATUS,C
movlw    .10                 ;cargar W con Error!
call         DISPLAY

DISPLAY   DT 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0xXX;Valores del 0 al 9

end; se finaliza el programa

Saludos LabPIC
     
Título: Re: depurar mejor la instrucción rtlw
Publicado por: BrunoF en 07 de Junio de 2006, 19:36:32
He cometido un error, porque cuando estaba respondiendote, habia hecho varias soluciones posibles, una de ellas necesitaba la tabla invertida, y en realidad, para el ejemplo que he publicado no es correcto, error que el algoritmo de LabPIC ha arrastrado por mi culpa.
Asi que lo correcto es:

movf      PORTA,W
sublw     0x09              ;9 - W -> W
movf      PORTA,W
btfss       STATUS,C
movlw    .10                 ;cargar W con Error!

call         DISPLAY

DISPLAY      addwf   PCL,F      ;Se le suma los datos del registro W, proveniente de la puerta A y se vuelve a
               ;guardar en el mismo registro PCL.Con este metodo es necesario invertir la tabla     
      retlw   3F      ;Se define el cero para ser mostrado en el display.
      retlw   06      ;Se define el uno.
      retlw   5B      ;Se define el dos.
      retlw   4F      ;Se define el tres.
      retlw   66      ;Se define el cuatro.
      retlw   6D      ;Se define el cinco.
      retlw   7D      ;Se define el seis.
      retlw   07      ;Se define el siete.
      retlw   7F      ;Se define el ocho.
      retlw   6F      ;Se define el nueve.
      retlw   XX     ;aca pone el valor para la letra "E" de Error

      END         ;Se finaliza el programa.


tomando el codigo de LabPIC, quedaria asi:

movf      PORTA,W
sublw     0x09              ;9 - W -> W
movf      PORTA,W
btfss       STATUS,C
movlw    .10                 ;cargar W con Error!
call         DISPLAY

DISPLAY   DT 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0xXX

end; se finaliza el programa

Saludos.
Título: Re: depurar mejor la instrucción rtlw
Publicado por: loren en 10 de Junio de 2006, 07:16:49
Hola, muchas gracias a todos. al final lo he hecho con una ligera variación a como decís, más que nada a para aprender a utilizar estas intrucciones. Ya que veo más claro hacerlo con la instrución addlw, pero que es practicamente a como me habeis comentado.
Gracias y saludos.

INICIO      movf    PUERTAA,W   ;Se carga los datos de la puerta A en W.
      addlw   b'11110110'     ;Se le suma 246 al registro W, y si es mayor que 9, se produce acarreo.
      movf    PUERTAA,W   ;Se vuelve a carga los valores de la puerta A en W.
      btfsc   ESTADO,C   ;Se comprueba si el señalizador C ha sido levantado.
      movlw   0A              ;Si el señalizador se ha activado se carga W con ¡Error!
      call    DISPLAY      ;Se llama a la subrutina de transformación de binario a decimal
      movwf   PUERTAB      ;Se carga los datos del registro de trabajo W en la puerta B y se      visualiza en
               ;el display.
      
      goto   INICIO      ;Se vuelve a la etiqueta INICIO para volver a leer la puerta A.
      

DISPLAY      addwf   PCL,F      ;Se le suma los datos del registro W, proveniente de la puerta A y se vuelve a
               ;guardar en el mismo registro PCL.
      retlw   3F      ;Se define el cero para ser mostrado en el display.
      retlw   06      ;Se define el uno.
      retlw   5B      ;Se define el dos.
      retlw   4F      ;Se define el tres.
      retlw   66      ;Se define el cuatro.
      retlw   6D      ;Se define el cinco.
      retlw   7D      ;Se define el seis.
      retlw   07      ;Se define el siete.
      retlw   7F      ;Se define el ocho.
      retlw   6F      ;Se define el nueve.
      retlw   79      ;Se define el código error.   

      END         ;Se finaliza el programa.
Título: Re: depurar mejor la instrucción rtlw
Publicado por: loren en 10 de Junio de 2006, 07:49:35
Hola, una aclaración con la instrucción sublw. Cuando utilizamos la instrucción ADDLW y ADDWF, se produce una acarreo cuando pasa se pasa de FF a 00, es decir, se activa C, cuando el valor del archivo es cero, se activa Z, y cuando se produce acarreo en el cuarto bit del archivo se activa el señalizador DC. Pero no tengo claro, como lo hace con las instrucción SUBLW y SUBWF.
Gracias y saludos.
Título: Re: depurar mejor la instrucción rtlw
Publicado por: maunix en 10 de Junio de 2006, 09:56:46
Hola, una aclaración con la instrucción sublw. Cuando utilizamos la instrucción ADDLW y ADDWF, se produce una acarreo cuando pasa se pasa de FF a 00, es decir, se activa C, cuando el valor del archivo es cero, se activa Z, y cuando se produce acarreo en el cuarto bit del archivo se activa el señalizador DC. Pero no tengo claro, como lo hace con las instrucción SUBLW y SUBWF.
Gracias y saludos.

Aquí te subo un código con una tabla que te será muy útil para que comprendas el sublw.

Código: ASM
  1. ;------------------------------------------------------------
  2. ;       RESTA
  3. ;------------------------------------------------------------
  4. ;
  5. ;       REG1    w       C       Z       DC
  6. ;     ----------------------------------------
  7. ;        4      2       1       0       1               (1)
  8. ;        4      4       1       1       1               (2)
  9. ;        4      6       0       0       0               (3)
  10. ;
  11.  
  12.  
  13. ;       Ejemplo (1)      
  14.  
  15.         movlw   .4
  16.         movwf   REG1
  17.  
  18.         movlw   .2
  19.  
  20.         subwf   REG1,w          ;REG1 > w
  21.                                 ; C = 1
  22.                                 ; Z = 0
  23.         nop


Saludos