Autor Tema: Problema comparador en ensamblador  (Leído 1592 veces)

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

Desconectado kaiserwald18

  • PIC10
  • *
  • Mensajes: 6
Problema comparador en ensamblador
« en: 26 de Marzo de 2016, 02:18:28 »
Buenas :) tengo un pequeño problema que no he podido solucionar.
Estoy haciendo un programa donde genero números al azar (desplegados en un display de 7 segmentos) y con un teclado 4x4 comparo el numero al azar con la tecla presionada. Hasta ahí todo va bien, la primer vez que hago la comparación (y si es correcta) se incrementa una variable que posteriormente se muestra en el puertoB pero al volver a hacer la comparación la variable ya no se aumenta, siempre muestra un bit en el puertoB.

He intentado de todo pero no logro hacer que siga haciendo las comparaciones, necesito que se haga 5 veces para comparar 5 números. La primer vez lo hace pero la segunda ya no aumenta a variable.

Realmente no se que hacer, lo que necesito es que compare los números las veces que sean (los números se generan al pulsar un botón, un numero por cada vez que se presione) y que la variable que acumula se incremente cada que la comparación sea correcta.
Si me pudieran ayudar se los agradecería mucho   :)

Adjunto mi código y la simulación en proteus.

 

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 7679
Re:Problema comparador en ensamblador
« Respuesta #1 en: 26 de Marzo de 2016, 05:36:18 »
Un par de cosas antes de ir al problema. Consejos sobre programacion y otras cosas mas:

Código: ASM
  1.         CBLOCK 0X20
Estas en un PIC18 , eso dejalo para los PIC16, los PIC18 su memoria de datos comienza en 0x00, ya que todos los SFR estan al final.
Recomendable tambien que mires ACCESS y BANK, observaras que ahora las instrucciones aceptan un parametro mas que es la 'a'



Código: ASM
  1.         ORG       00H
  2.         CLRF     TRISA
Soy de la costumbre de que si o si hay que poner todos los vectores , aunque no se utilizen, y si no los usas poneles un RETURN, asi:

Código: ASM
  1.         ORG       00H
  2.         GOTO    Configuracion
  3.         ORG       08H
  4.         RETURN
  5.         ORG       18H
  6.         RETURN
De esa forma si por si las dudas activas o se activa una interrupcion simplemente vuelve a donde estaba y listo. Observa tambien que no pongo ninguna ORG debajo del RETURN de 0x18, eso NO se hace por las dudas lo digo, ya que vi a varios.



Código: ASM
  1. MOVF    DAT,0
Podrias haber usado W y F, es mas intuitivo y facil de recordar, estos estan incluidos en el .inc, es decir:

Código: ASM
  1. MOVF    DAT, W
Mover registro a W



Código: ASM
  1. CONT
  2. DAT
  3. X
  4. REP
  5. m
  6. n
  7. o
  8. CP
  9. VLA
  10. VALTC2

Tanto para vos en un futuro como para mucha gente que pueda ver tu codigo, usa nombres significativos en los registros. Si cuesta inicialmente escribir un poco de mas, pero luego con solo leer el programa sabes de que se trata. Yo ahora tengo que descifrar que hace cada registro gracias a esto, y tal ves encontrar el problema que me tomaba 10min, me lleva 30min. Ojo no lo digo por que soy peresozo y quiero hacerte tener laburo a vos, si vos dejas este codigo 2 meses y volves vas a sufrir igual. Pero como es corto tal ves no sea problema. En fin es una costumbre mejor adquirirla en todos los lenguajes, algunos compiladores con el Ctrl+espacio si escribis unas letras te lo autocompleta o te da las opciones, no se si en ASM ocurre igual, pero en C si.



Ahora el problema.

Código: ASM
  1. INCR
  2.                 INCF    RESULTADO,0

Si hubieras usado W y F te hubieras dado cuenta mas rapido... 0 es W y 1 es F, resumen siempre estas incrementando RESULTADO y poniendo ese valor en W, lo cual RESULTADO siempre tiene el mismo valor.

Solucion:

Código: ASM
  1. INCR
  2.                 INCF    RESULTADO, F
  3.                 MOVFF   RESULTADO, RESU
  4.                 RETURN
  5.  

Hay codigo que esta por demas, hay registros que estan por demas y no tiene sentido como lo es REP asi como esta en el programa, al menos con el valor 1. Pero si no fuera 1 lo pondria en otro lado y no en la rutina principal, sino al comienzo de GEN fuera del loop, donde tenes el NOP ese sin sentido.

Tambien hay cosas buenas como el formato del programa, es decir la creacion del loop principal y ese manejo, falta pulir unos detalles como los anteriores para que todo sea casi perfecto. (Por que despues te das cuenta que estas recien en la base de la montaña :P )
« Última modificación: 26 de Marzo de 2016, 05:40:40 por KILLERJC »

Desconectado kaiserwald18

  • PIC10
  • *
  • Mensajes: 6
Re:Problema comparador en ensamblador
« Respuesta #2 en: 26 de Marzo de 2016, 16:41:33 »
Un par de cosas antes de ir al problema. Consejos sobre programacion y otras cosas mas:

Código: ASM
  1.         CBLOCK 0X20
Estas en un PIC18 , eso dejalo para los PIC16, los PIC18 su memoria de datos comienza en 0x00, ya que todos los SFR estan al final.
Recomendable tambien que mires ACCESS y BANK, observaras que ahora las instrucciones aceptan un parametro mas que es la 'a'



Código: ASM
  1.         ORG       00H
  2.         CLRF     TRISA
Soy de la costumbre de que si o si hay que poner todos los vectores , aunque no se utilizen, y si no los usas poneles un RETURN, asi:

Código: ASM
  1.         ORG       00H
  2.         GOTO    Configuracion
  3.         ORG       08H
  4.         RETURN
  5.         ORG       18H
  6.         RETURN
De esa forma si por si las dudas activas o se activa una interrupcion simplemente vuelve a donde estaba y listo. Observa tambien que no pongo ninguna ORG debajo del RETURN de 0x18, eso NO se hace por las dudas lo digo, ya que vi a varios.



Código: ASM
  1. MOVF    DAT,0
Podrias haber usado W y F, es mas intuitivo y facil de recordar, estos estan incluidos en el .inc, es decir:

Código: ASM
  1. MOVF    DAT, W
Mover registro a W



Código: ASM
  1. CONT
  2. DAT
  3. X
  4. REP
  5. m
  6. n
  7. o
  8. CP
  9. VLA
  10. VALTC2

Tanto para vos en un futuro como para mucha gente que pueda ver tu codigo, usa nombres significativos en los registros. Si cuesta inicialmente escribir un poco de mas, pero luego con solo leer el programa sabes de que se trata. Yo ahora tengo que descifrar que hace cada registro gracias a esto, y tal ves encontrar el problema que me tomaba 10min, me lleva 30min. Ojo no lo digo por que soy peresozo y quiero hacerte tener laburo a vos, si vos dejas este codigo 2 meses y volves vas a sufrir igual. Pero como es corto tal ves no sea problema. En fin es una costumbre mejor adquirirla en todos los lenguajes, algunos compiladores con el Ctrl+espacio si escribis unas letras te lo autocompleta o te da las opciones, no se si en ASM ocurre igual, pero en C si.



Ahora el problema.

Código: ASM
  1. INCR
  2.                 INCF    RESULTADO,0

Si hubieras usado W y F te hubieras dado cuenta mas rapido... 0 es W y 1 es F, resumen siempre estas incrementando RESULTADO y poniendo ese valor en W, lo cual RESULTADO siempre tiene el mismo valor.

Solucion:

Código: ASM
  1. INCR
  2.                 INCF    RESULTADO, F
  3.                 MOVFF   RESULTADO, RESU
  4.                 RETURN
  5.  

Hay codigo que esta por demas, hay registros que estan por demas y no tiene sentido como lo es REP asi como esta en el programa, al menos con el valor 1. Pero si no fuera 1 lo pondria en otro lado y no en la rutina principal, sino al comienzo de GEN fuera del loop, donde tenes el NOP ese sin sentido.

Tambien hay cosas buenas como el formato del programa, es decir la creacion del loop principal y ese manejo, falta pulir unos detalles como los anteriores para que todo sea casi perfecto. (Por que despues te das cuenta que estas recien en la base de la montaña :P )

Hermano muchisimas gracias, tienes razon sobre usar W y F siempre me pierdo ahí, recien comence a programar en asm, aun me falta mucho aprender. Tengo registros y variables que no se usan porque esto es una parte del codigo principal, lo extraje porque era donde tenia el problema. De verdad me has ayudado mucho, GRACIAS  :mrgreen: :mrgreen: :mrgreen:


 

anything