Autor Tema: depurar mejor la instrucción rtlw  (Leído 2622 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado loren

  • PIC10
  • *
  • Mensajes: 24
depurar mejor la instrucción rtlw
« 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.    

Desconectado LabPIC

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 143
Re: depurar mejor la instrucción rtlw
« Respuesta #1 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
¡¡¡Viva México cabrones!!!

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: depurar mejor la instrucción rtlw
« Respuesta #2 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!
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado LabPIC

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 143
Re: depurar mejor la instrucción rtlw
« Respuesta #3 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
     
« Última modificación: 07 de Junio de 2006, 20:00:52 por LabPIC »
¡¡¡Viva México cabrones!!!

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: depurar mejor la instrucción rtlw
« Respuesta #4 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.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado loren

  • PIC10
  • *
  • Mensajes: 24
Re: depurar mejor la instrucción rtlw
« Respuesta #5 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.

Desconectado loren

  • PIC10
  • *
  • Mensajes: 24
Re: depurar mejor la instrucción rtlw
« Respuesta #6 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.

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: depurar mejor la instrucción rtlw
« Respuesta #7 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
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)


 

anything