Autor Tema: Me ayudan con este programa porfa?  (Leído 3466 veces)

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

Desconectado NicaUnlock

  • PIC10
  • *
  • Mensajes: 20
Me ayudan con este programa porfa?
« en: 26 de Diciembre de 2012, 22:19:03 »
Gente como veran soy muy nuevo en esto de los micros  :( fijense que tengo una gran interrogante con este codigo... Este ejemplo es de un libro que tengo como pueden ver. La pregunta es: porque dice supune que PORTA es menor? a que se refieren con ese supone?? es decir, no se supone que por el puerto A estan entrando datos? porq suponen?

Muchas Gracias por la ayuda y mil disculpas por la novatada :'(

Saludos a todos!

;************************************ Saltos_05.asm *************************************
;
;   ===================================================================
;     Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
;     E. Palacios, F. Remiro y L. López.      www.pic16f84a.com
;      Editorial Ra-Ma.  www.ra-ma.es
;   ===================================================================
;
; Compara el dato del puerto de entrada PORTA con un "NUMERO". Tres posibilidades:
;   - Si (PORTA) = NUMERO se encienden todos los LEDs de salida.
;   - Si (PORTA) > NUMERO se activan los LEDs pares de salida.
;   - Si (PORTA) < NUMERO se encienden los LEDs del nibble alto y se apagan los del bajo.
;
; Hay que destacar que al no haber instrucciones de comparación, estas se realizan
; mediante restas.

; ZONA DE DATOS **********************************************************************

   LIST      P=16F84A
   INCLUDE      <P16F84A.INC>
   __CONFIG   _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC

NUMERO   EQU   d'13'         ; Por ejemplo, este número a comparar.

; ZONA DE CÓDIGOS ********************************************************************

   ORG    0            ; El programa comienza en la dirección 0.
Inicio
   bsf      STATUS,RP0      ; Acceso al Banco 1.
   clrf   TRISB         ; Las líneas del Puerto B se configuran como salida.
   movlw   b'00011111'      ; Las 5 líneas del Puerto A se configuran como entrada.
   movwf   TRISA
   bcf      STATUS,RP0      ; Acceso al Banco 0.
Principal
   movlw   NUMERO         ; Carga el número a comparar.
   subwf   PORTA,W         ; (PORTA) - NUMERO --> (W).
   movlw   b'11110000'      ; Supone (PORTA) es menor.
   btfss   STATUS,C                      ; ¿C=1?, ¿(W) positivo?, ¿(PORTA) >= NUMERO?.
   goto   ActivaSalida                   ; No. C=0, por tanto (PORTA) < NUMERO.
   movlw   b'11111111'      ; Supone que son iguales.
   btfsc   STATUS,Z                      ; ¿Z=0?, ¿son distintos?.
   goto   ActivaSalida                   ; No. Son iguales ya que Z = 1.
   movlw   b'01010101'      ; Sí, por tanto (PORTA) > NUMERO.
ActivaSalida
   movwf   PORTB         ; Resultado se visualiza por el puerto de salida.
   goto    Principal                      ; Crea un bucle cerrado e infinito.

   END                  ; Fin del programa.

;   ===================================================================
;     Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
;     E. Palacios, F. Remiro y L. López.      www.pic16f84a.com
;      Editorial Ra-Ma.  www.ra-ma.es
;   ===================================================================


Desconectado Darkman_A

  • PIC18
  • ****
  • Mensajes: 288
Re: Me ayudan con este programa porfa?
« Respuesta #1 en: 26 de Diciembre de 2012, 23:48:56 »
Hola NicaUnlock.
En lo que en realidad esta haciendo es adelantarse a una posible salida. Como decimos aca (no se si en tu pais) esta "abriendo el paragua". Fijate...

Principal
   movlw   NUMERO         ; Carga el número a comparar.
   subwf   PORTA,W         ; (PORTA) - NUMERO --> (W).

Como dice en el comentario resta un valor a otro y lo guarda en W. Lo que le interesa en realidad es lo que quedo en el Carry
   movlw   b'11110000'      ; Supone (PORTA) es menor.
Uno se preguntaria que hace aca !!. Si guardo el valor de la resta en W y ahora carga un valor en W esta eliminando lo que obtuvo en la resta. El tema es que solo le interesa lo que quedo en el carry. Ademas, y a lo que venia tu pregunta, lo que esta haciendo es considerar una de las posibles salidas (mayor, menor o igual). No sabe si esta bien, pero es una de las tres posibles. Y como te decia que habria el paraguas, esta preparando un valor que luego le va a pasar a PortB. Si se da que el valor de PortA es menor que NUMERO entonces se adelanto un paso. Sino lo descarta y vuelve a suponer. El esta suponiendo el valor que va a necesitar pasarle a PORTB, no la diferencia entre el PortA y NUMERO.
   btfss   STATUS,C                      ; ¿C=1?, ¿(W) positivo?, ¿(PORTA) >= NUMERO?.
Aca verifica si PortA es mayor que numero. Ves, no supone nada, esta chequeando el carry para ver si es menor o no. Lo que llama suponer es precargar un valor que luego le va a pasar al portB. Si se da la condicion de C=1 salta la linea que sigue.
Supongamos que C=0 y por lo tanto no salta y ejecuta esta linea ...
   goto   ActivaSalida                   ; No. C=0, por tanto (PORTA) < NUMERO.
Como dice en el comentario, PortA < Numero y hace un goto ActivaSalida, y en ActivaSalida hace movwf   PORTB, por lo tanto en portB esta cargando el valor b'11110000' que habia cargado anteriormente en W.
Ahora supongamos que el carry no era igual a 0, sino que valia 1. Por lo tanto la linea goto ActivaSalida no se ejecuta. El programador sabe ahora que PortA no es menor que numero, pero el habia precargado un valor en W para ese caso, como no le sirve lo descarta y carga un (posible) valor nuevo.
   movlw   b'11111111'      ; Supone que son iguales.
Se juega a que van a ser iguales.  En la siguiente instruccion es cuando en realida hace el chequeo y chequea si son distintos. Salta una instruccion si Z=0
   btfsc   STATUS,Z                      ; ¿Z=0?, ¿son distintos?.
Si Z=1, no salta , ademas significa que PortA y Numero son iguales. Para esa condicion ya habia cargado W con el valor b'11111111'. Por lo tanto solo tiene que ir a  ActivaSalida y mostrarlo.
Este pedacito final te lo dejo a vos.
   goto   ActivaSalida                   ; No. Son iguales ya que Z = 1.
   movlw   b'01010101'      ; Sí, por tanto (PORTA) > NUMERO.
ActivaSalida
   movwf   PORTB         ; Resultado se visualiza por el puerto de salida.
   goto    Principal                      ; Crea un bucle cerrado e infinito.

Si mi explicacion fue muy ploma o no se entendio algo volve a consultar que lo vemos de otra forma.
Saludos.

« Última modificación: 26 de Diciembre de 2012, 23:55:59 por Darkman_A »

Desconectado NicaUnlock

  • PIC10
  • *
  • Mensajes: 20
Re: Me ayudan con este programa porfa?
« Respuesta #2 en: 27 de Diciembre de 2012, 14:06:20 »
Hola Darkman_A, primeramente quiero agradecerte por el tiempo que le diste a hacer tan buena respuesta  ((:-)). Ahora tengo otras preguntas, veras no entiendo muy bien aun el ensamblador :( fijate que lo que no logro aun encajar en mi mente es eso que entra por el puerto A q lo esta suponiendo, es decir... Lo puedo eso simular en Isis proteus? es que yo me imagino eso en la vida real y sinceramente no se como :( osea me imagino al usuario presionando pulsadores o X cosa el problema es q no se como pasar ese programa a la vida real, por otro lado los valores, b'01010101' y b'11111111' los puedo cambiar?

He visto en otros programas que cuando declaras variables tipo NUMERO   EQU   d'13' no es este el caso ya que d'13' es el numero a comparar pero si he visto en otros programs que pone por ej. AUXILIAR EQU 0X0C se supone q ponen 0C porq ahi inicia el registro de proposito general pero yo lo he cambiado hasta 0X00 o simplemente 0 y funciona a la perfeccion.

Te agradezco nuevamente por tu excelente ayuda! estaré ansioso  esperando tu respuesta  :)

Desconectado Darkman_A

  • PIC18
  • ****
  • Mensajes: 288
Re: Me ayudan con este programa porfa?
« Respuesta #3 en: 27 de Diciembre de 2012, 16:28:11 »
Hola.
Si podes simularlo en Proteus.
El tema del ejercicio entiendo que es asi.  El autor ha decidido utilizar el puerto A como entrada y el puerto B como salida. Los puertos, seguro que sabrás, son de entrada y salida y vos determinas si va a ser de entrada o va a ser de salida cuando programas ( con TRISA o TRISB , lo que corresponda en cada caso). En el puerto A ha conectado pulsadores o switchs para poder cambiar en nivel logico de esta entrada (cambiar la tension de las patitas del puerto A). El puerto A ( el puerto fisico o sea las patitas) esta relacionado con un registro en el micro. Si cambio el nivel de la pata RA0 me cambia el valor correspondiente del bit RA0 en el registro. En el microcontrolador 16f84 estan disponibles las patitas RA0 a RA4 (las patitas físicas del micro) y el registro PortA esta definido de RA0 a RA7, pero solo se puede utilizar RA0 a RA5 porque no vas a poder ingresar ni sacar datos por las patas RA6 y RA7 (por que no existen como terminales).
En el ejercicio del libro el programador puso leds en el puerto B para mostrar la salida. Son esos valores que vos decias como b'01010101' y b'11111111' . Esos valores los podes cambiar a tu gusto.  Por ejemplo con 11111111 te va a prender los 8 leds conectados a puerto B (fijate como estan conectados). Si queres que te prenda un solo led en el, por ejemplo, el puerto B patita 7 (o sea la octava porque se comienza a contar de cero) tendrias que escribir b'10000000' en el puerto B. Lo mejor para aprender es jugar con estos valores y con el programa. Hacete un programita que si varias el valor que entra por puerto A pin 0 (RA0) te prenda o apague un led en RB0 ,por ejemplo.

Cambiamos de tema. Vemos que es EQU.
EQU es una directiva del compilador. O sea que la interpreta el compilador y no tiene que ver con el PIC. Podria existir o no independientemente del microcontrolador.
Es una facilidad que te da el programador que hizo el compilador,o sea, es una "ayudita" que te dio "el tipo que hizo el compilador".
Lo que hace es relacionar un valor numerico con una palabra, por ejemplo :  Valor EQU 0x04
Supongamos que yo tengo que hacer referecia a un valor numerico como un registro. Los registros para el compilador se representan con valores numericos. Vos quizas no lo veas asi porque esta usando el archivo 16F684A.inc donde estan definidos estos valores. Por ejemplo el PortA corresponde con el registro 0x05. Yo al programar podria poner el valor 0x05 en todo mi programa sin escribir una sola vez PortA y al compilarlo no tendria problema. Ahora si quisiera usar PortA antes tendria que hacer : PortA EQU 0x05  ,si no me daria error al compilar (vos no lo pones porque ya esta en ese archivo inc. Buscalo y pegale una mirada. Lo podes editar).
Se usan palabras para hacer mas facil la lectura del programa. Es mas entendible si encontra escrito PortB que si ves escritro 0x06.
Tambien lo podes usar para expresar un valor. Supongamos que quiero contar hasta 5, podria escribir : Cuento EQU 5  y usar la palabra Cuento como un valor constante en todo el programa. Cuando compilo el compilador reemplaza donde encuentra escrito la palabra Cuento por el valor 5. Ahora supongamos que escribi un programa kilometrico donde uso la palabra Cuento 89898348893494398439 veces y ahora se me ocurre contar hasta 10. Solo tengo que hacer Cuento EQU 10 compilar y listo. Si en cambio hubiese usado el numero en lugar de la palabra tendria que reemplazar el 10 donde estaba el 5 ..... 89898348893494398439 veces.
Por eso digo que es una ayudita. No tiene nada que ver con el código de tu programa, es para hacer mas facil la vida del programador.  Es darle una etiqueta (un nombre) a un valor.
Depende donde lo uses importa o no si cambias el valor o no. Mirando los ejemplos que te di. Si el valor de EQU que cambias como en el caso del contador, obvio que va ha hacer que cuente distinto, quizas no pase nada. Ahora si el equ representaba un port como por ejemplo PortB EQU 0x06 y pones PortB EQU 0x20, no vas a tener salida. En el mejor de los caso vas a estar escribiendo en un registro de usos generales en la direccion 0x20 y el estado de los leds no van a cambiar. En algun caso quizas te de error o no compile.
Espero que haya quedado legible y me pudieras seguir.
Saludos.

Desconectado NicaUnlock

  • PIC10
  • *
  • Mensajes: 20
Re: Me ayudan con este programa porfa?
« Respuesta #4 en: 27 de Diciembre de 2012, 17:34:55 »
Ufff vos sos un maestro!!  ((:-)) Te agradezco por toda la ayuda!! ahora si quede clarito como el agua   :)

Saludos y muchas gracias nuevamente.

Desconectado Darkman_A

  • PIC18
  • ****
  • Mensajes: 288
Re: Me ayudan con este programa porfa?
« Respuesta #5 en: 27 de Diciembre de 2012, 17:42:23 »
De nada NicaUnlock.
Me alegro que me hayas entendido, a veces me enrrosco solo cuando explico. :lol:  .Trato que no pase, pero a veces .......  
Un gusto. Cualquier cosa volve a consultar.
Saludos
« Última modificación: 28 de Diciembre de 2012, 10:47:27 por Darkman_A »