Autor Tema: Ayuda ejemplo  (Leído 2468 veces)

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

Meta

  • Visitante
Ayuda ejemplo
« en: 06 de Febrero de 2008, 22:19:34 »
En este ejemplo abajo, su ecuación es esta: (A + B) - C

Si se fijan bien, en el MPLAB tendría que poner en File Registers los valores que me de la gana como:

A = 1
B = 3
C = 2

El resultado de la ecuación es un 2, guardada en la posición me memoria 0x13.

¿Cómo dejo de entrada esos valores de ahí arriba desde la memoria flash del 16F84A?
Es decir, que no tenga nada que poner yo en MPLAB para que haga la ecuación.

Esos números que se quede registrado en alguna posición de memoria. Si dejo el código de abajo. Siempre lee 0. Tengo que poner valores para ver el resultado y yo quiero ya puesto de entrada.

Código: ASM
  1. ;Tres valores están almacenados en la memoria, A, B y C. Y en las
  2. ;direcciones 10, 11 y 12h. Resolver ecuación (A + B) - C.
  3. ;Velocidad d ereloj; 4MHz
  4.         LIST    p=16F84A                ;Tipo de procesador.
  5.         INCLUDE <P16F84A.INC>   ;Definiciones de registros internos.
  6. __CONFIG        _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC
  7. ;*****************************************************************
  8.         DATO_A          EQU 0x10        ;Define la posición del dato A
  9.         DATO_B          EQU 0x11        ;Define la posición del dato B
  10.         DATO_C          EQU 0x12        ;Define la posición del dato C
  11.         RESULTADO       EQU 0x13        ;Define la posición del dato RESULTADO
  12. ;*****************************************************************
  13.         ORG 0x00        ;Vector de reset
  14.         goto INICIO
  15.         ORG 0x05        ;Salva el vector de interrupción
  16. INICIO:
  17.         movf    DATO_A,W        ;Carga el 1er sumando
  18.         addwf   DATO_B,W        ;Suma 2º operando
  19.         movwf   RESULTADO       ;Almacena resultado parcial
  20.         movf    DATO_C,W        ;Carga el sustraendo
  21.         subwf   RESULTADO,F     ;Resta el minuendo y almacena
  22. STOP
  23.         goto $
  24.         END             ;Fin del programa

Meta

  • Visitante
Re: Ayuda ejemplo
« Respuesta #1 en: 06 de Febrero de 2008, 23:19:11 »
Muchas gracias, me funciona  a la primera.

Por cierto, ¿existe la posibilidad de resetear el "File Registres" del MPLAB 8.0?
Quiero verlo desde 0 cuando lo ejecuto a ver que hace, la manera que lo logro es cerrando y volver abrir el MPLAB.

Meta

  • Visitante
Re: Ayuda ejemplo
« Respuesta #2 en: 07 de Febrero de 2008, 15:57:23 »
Gracias.

Meta escribió:
Se automodifica?, a que te refieres con eso?

Bueno me referia a que (problema solventado al poner las memorias en lugar de 0x10,0x11,0x12,0x13 en 0x20,0x21,0x22,0x23) al cargar los valores de dato_A=0x01, dato_B=0x03, dato_C=0x05, justo despues de efectuar la resta (mirandolo por el stimulus del MPLAB) el valor de dato_B se cambia a 0x04 el solo, y asi +1 en cada vuelta, alterando tambien el resultado final.

Bueno, aqui os pongo mi inventillo que os comente anteriormente.

Código: ASM
  1. ;
  2. ;
  3. ;Leer el estado de 3 interruptores conectados a RA0 - RA1 - RA2
  4. ;Si RA2 esta apagado lo detiene todo a espera de encenderlo nuevamente a modo de interruptor de
  5. ;encendido general.
  6. ;Dependiendo de las posiones de RA0 y RA1 efectuara ordenes diferentes de operaciones (A+B)-C
  7. ;El resultado de la operacion (en binario) se muestra en los LEDS conectados a las salidas en RB0-RB1-RB2
  8.  
  9. List p=16F876A ;Tipo de procesador
  10. include "P16F876A.INC" ;Definiciones de registros internos
  11. ; Definicion de variables temporales
  12. dato_A equ 0x20
  13. dato_B equ 0x21
  14. dato_C equ 0x22
  15. resultado equ 0x23
  16. temp equ 0x24
  17.  
  18. ;Ajusta los valores de la palabra de configuración durante el ensamblaje:
  19. ;Protección de código y datos=OFF, LVP=OFF, WDT=OFF y OSC=XT
  20.  
  21. __config _CP_OFF&_CPD_OFF&_LVP_OFF&_WDT_OFF&_XT_OSC
  22.  
  23.  
  24. org 0x00
  25. goto Inicio ;Vector de reset
  26. org 0x05
  27.  
  28. Inicio clrf temp
  29. clrf dato_A
  30. clrf dato_B
  31. clrf dato_C
  32. clrf resultado
  33. clrf PORTB ;Borra los latch de salida
  34. bsf STATUS,RP0 ;Selecciona banco 1
  35. clrf TRISB ;Puerta B se configura como salida
  36. movlw 0x06
  37. movwf ADCON1 ;Puerta A digital
  38. movlw b'00000111'
  39. movwf TRISA ;Puerta A se configura como entrada
  40. bcf STATUS,RP0 ;Selecciona banco 0
  41. Loop
  42. btfss PORTA,2 ;Chequea el estado del interruptor I
  43. goto apaga ;Está en OFF, sistema parado
  44.  
  45. movf PORTA,W ;Leer las entradas RA0-RA1
  46. movwf resultado ;Carga el valor anterior de W para poder verlo en el debug.
  47. andlw b'00000011' ;Máscara para las línea RA0-RA1
  48. movwf resultado
  49. btfsc STATUS,Z ;RA0 Esta a 00 ? RA0->0 RA1->0
  50. goto Valen00 ;Si
  51. movwf temp ;almacena resultado de estado original
  52. movlw b'00000001' ;almacena en W
  53. subwf temp,W ;resta temp-W (00000011-00000001=00000010)
  54. btfsc STATUS,Z ;Esta a 10 ? RA0->1 RA1->0
  55. goto Valen10 ;SI
  56. movlw b'00000010' ;
  57. subwf temp,W
  58. btfsc STATUS,Z ;Esta a 01 ? RA0->0 RA1->1
  59. goto Valen01 ;SI
  60. movlw b'00000011' ;
  61. subwf temp,W
  62. btfsc STATUS,Z ;Esta a 11 ? RA0->1 RA1->1
  63. goto Valen11 ;SI
  64. goto Loop
  65.  
  66. Valen01 movlw 0x04
  67. movwf dato_A
  68. movlw 0x05
  69. movwf dato_B
  70. movlw 0x02
  71. movwf dato_C
  72. movf dato_A,W ;Carga en W el valor de dato_A
  73. movwf resultado ;valor de W a ---> resultado para verlo
  74. addwf dato_B,W ;Suma el valor de B a W
  75. movwf resultado ;valor de W a ---> resultado para verlo
  76. movf dato_C,W ;carga en W el valor de dato_c
  77. subwf resultado,W ;resta de resultado el valor de W
  78. movwf resultado ;valor de W a ---> resultado para verlo
  79. movwf PORTB ;Reflejar en las salidas
  80. goto Loop ;Bucle sin fin
  81. Valen00
  82. movlw 0x03
  83. movwf dato_A
  84. movlw 0x04
  85. movwf dato_B
  86. movlw 0x01
  87. movwf dato_C
  88. movf dato_A,W ;Carga en W el valor de dato_A
  89. movwf resultado ;valor de W a ---> resultado para verlo
  90. addwf dato_B,W ;Suma el valor de B a W
  91. movwf resultado ;valor de W a ---> resultado para verlo
  92. movf dato_C,W ;carga en W el valor de dato_c
  93. subwf resultado,W ;resta de resultado el valor de W
  94. movwf resultado ;valor de W a ---> resultado para verlo
  95. movwf PORTB ;Reflejar en las salidas
  96. goto Loop ;Bucle sin fin
  97.  
  98. Valen10 movlw 0x01
  99. movwf dato_A
  100. movlw 0x05
  101. movwf dato_B
  102. movlw 0x02
  103. movwf dato_C
  104. movf dato_A,W ;Carga en W el valor de dato_A
  105. movwf resultado ;valor de W a ---> resultado para verlo
  106. addwf dato_B,W ;Suma el valor de B a W
  107. movwf resultado ;valor de W a ---> resultado para verlo
  108. movf dato_C,W ;carga en W el valor de dato_c
  109. subwf resultado,W ;resta de resultado el valor de W
  110. movwf resultado ;valor de W a ---> resultado para verlo
  111. movwf PORTB ;Reflejar en las salidas
  112. goto Loop ;Bucle sin fin
  113. Valen11 movlw 0x01
  114. movwf dato_A
  115. movlw 0x08
  116. movwf dato_B
  117. movlw 0x04
  118. movwf dato_C
  119. movf dato_A,W ;Carga en W el valor de dato_A
  120. movwf resultado ;valor de W a ---> resultado para verlo
  121. addwf dato_B,W ;Suma el valor de B a W
  122. movwf resultado ;valor de W a ---> resultado para verlo
  123. movf dato_C,W ;carga en W el valor de dato_c
  124. subwf resultado,W ;resta de resultado el valor de W
  125. movwf resultado ;valor de W a ---> resultado para verlo
  126. movwf PORTB ;Reflejar en las salidas
  127. goto Loop
  128. ;esta etiqueta la creo porque en el stimulus no se aprecia, pero metido
  129. ;en el entrenador, si apagamos RA2 quedan encendidos los LEDS con el
  130. ;ultimo resultado.
  131. apaga clrf PORTB
  132. goto Loop
  133. end ;Fin del programa fuente

******************************************************

Un par de cosillas:
1) Como se puede poner el codigo aqui para que quede tal y como lo tengo yo?, es que encuentro que queda un poco bastante chapucero y con poca claridad al no encolumnarse bien.
2) La etiqueta "apaga" la tuve que crear porque al apagar en interruptor de encendido general, RA2, se me quedaban los LEDS encendidos con el ultimo resultado. Existe alguna forma mas elegante de hacerlo????
3) Se puede mejorar o podeis aportar alguna cosilla mas???

Gracias

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Ayuda ejemplo
« Respuesta #3 en: 17 de Febrero de 2008, 22:21:40 »
Hola!

1) Si estás usando el MPLAB, seguro te salen mal las tabulaciones. Tendrias que configurar el tabulado desde el MPLAB. Por lo que veo no esta tabulado tu texto, asi que va a salir tal cual lo tenes vos.

2)

btfss PORTA,2 ;Chequea el estado del interruptor I
clrf   PORTB
(ver codigo debajo)

3)

Yo haría:

Código: ASM
  1. ;
  2. ;
  3. ;Leer el estado de 3 interruptores conectados a RA0 - RA1 - RA2
  4. ;Si RA2 esta apagado lo detiene todo a espera de encenderlo nuevamente a modo de interruptor de
  5. ;encendido general.
  6. ;Dependiendo de las posiones de RA0 y RA1 efectuara ordenes diferentes de operaciones (A+B)-C
  7. ;El resultado de la operacion (en binario) se muestra en los LEDS conectados a las salidas en RB0-RB1-RB2
  8.  
  9. List p=16F876A ;Tipo de procesador
  10. include "P16F876A.INC" ;Definiciones de registros internos
  11. ; Definicion de variables temporales
  12. dato_A equ 0x20
  13. dato_B equ 0x21
  14. dato_C equ 0x22
  15. resultado equ 0x23
  16. temp equ 0x24
  17.  
  18. ;Ajusta los valores de la palabra de configuración durante el ensamblaje:
  19. ;Protección de código y datos=OFF, LVP=OFF, WDT=OFF y OSC=XT
  20.  
  21. __config _CP_OFF&_CPD_OFF&_LVP_OFF&_WDT_OFF&_XT_OSC
  22.  
  23.  
  24. org 0x00
  25. goto Inicio ;Vector de reset
  26. org 0x05
  27.  
  28. Inicio
  29. bsf STATUS,RP0 ;Selecciona banco 1
  30. clrf TRISB ;Puerta B se configura como salida
  31. movlw 0x06
  32. movwf ADCON1 ;Puerta A digital
  33. movlw b'00000111'
  34. movwf TRISA ;Puerta A se configura como entrada
  35. bcf STATUS,RP0 ;Selecciona banco 0
  36. clrf PORTB
  37.  
  38. Loop
  39. btfss PORTA,2 ;Chequea el estado del interruptor I
  40. clrf PORTB ;Está en OFF, sistema parado
  41.  
  42. movf PORTA,W ;Leer las entradas RA0-RA1
  43. movwf resultado ;Carga el valor anterior de W para poder verlo en el debug.
  44. andlw b'00000011' ;Máscara para las línea RA0-RA1
  45. addwf PCL,F
  46. goto Valen00 ;Si
  47. goto Valen01 ;SI
  48. goto Valen10 ;SI
  49. goto Valen11 ;SI
  50.  
  51. Valen01
  52. movlw 0x04
  53. movwf dato_A
  54. movlw 0x05
  55. movwf dato_B
  56. movlw 0x02
  57. movwf dato_C
  58. call ABC
  59. goto Loop ;Bucle sin fin
  60.  
  61. Valen00
  62. movlw 0x03
  63. movwf dato_A
  64. movlw 0x04
  65. movwf dato_B
  66. movlw 0x01
  67. movwf dato_C
  68. call ABC
  69. goto Loop ;Bucle sin fin
  70.  
  71. Valen10
  72. movlw 0x01
  73. movwf dato_A
  74. movlw 0x05
  75. movwf dato_B
  76. movlw 0x02
  77. movwf dato_C
  78. call ABC
  79. goto Loop ;Bucle sin fin
  80.  
  81. Valen11
  82. movlw 0x01
  83. movwf dato_A
  84. movlw 0x08
  85. movwf dato_B
  86. movlw 0x04
  87. movwf dato_C
  88. call ABC
  89. goto Loop ;Bucle sin fin
  90.  
  91.  
  92. ABC
  93. comf dato_C,W
  94. addwf dato_A,W
  95. addwf dato_b,W
  96. movwf resultado
  97. movwf PORTB ;Reflejar en las salidas
  98. return
  99.  
  100. end ;Fin del programa fuente

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.


 

anything