Autor Tema: Problema con directiva IF  (Leído 2241 veces)

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

Desconectado kurdo22

  • PIC10
  • *
  • Mensajes: 48
Problema con directiva IF
« en: 13 de Octubre de 2004, 18:34:00 »


   Tengo un problema con la directiva IF. Siempre me coge el caso ELSE, aunque el IF sea verdadero. Lo he simulado y se me va al ELSE. He comprobado que el registro que comparo tiene el dato igual al que quiero comparar y nada. A continuacion os dejo el programa a ver si podeis decirme algo.

Por lo que he podido ver en la documetacion el IF compara una expresion, y creo que yo comparo una variable. ¿Puede estar ahi el problema? De ser asi, ¿como declaro una expresion, o son lo mismo?


   LIST P=18F8720                ;Tipo de procesador
   INCLUDE <P18F8720.INC>        ;Definicion de registros internos

TXDATO                     equ 0x19
RXDATO                     equ 0x1A

CONTADOR                   equ 0x12

CABECERA_PAQUETE_H         equ 0x1B   ;Variables TELECOMANDO
CABECERA_PAQUETE_L         equ 0x1C
FIN_PAQUETE_H              equ 0x1D
FIN_PAQUETE_L              equ 0x1E
ESTADO_H                   equ 0x1F  
ESTADO_L                   equ 0x20


INICIO

.....
.....

IF CABECERA_PAQUETE_L==H"44" ; Solicitud de Telemetría            
        goto SOLICITUD_TELEMETRIA            
        ELSE    
        goto SOLICITUD_DATOS       ;En caso de telecomando erroneo
        ENDIF                           ;se envia telemetría

.....
.....

SOLICITUD_TELEMETRIA

....
....

SOLICITUD_DATOS

....
....


Desconectado Elena2000

  • PIC24F
  • *****
  • Mensajes: 722
RE: Problema con directiva IF
« Respuesta #1 en: 14 de Octubre de 2004, 05:52:00 »
Hola

Lo primero: ojo con repetir mensajes...... no está bien hacer eso, porque mira que necehvel ya te había contestado a la misma pregunta en el otro tema que has posteado también.... Procura no repetir mensajes, anda, que sino el foro es un lío.

Imagino que estás programando en basic, no? pues además hubiera sido bueno que tu mensaje estuviera en el subforo de basic. En fin, no te mosquees, es sólo para intentar que entre todo el foro funcione "guay".

Bueno, anda, lee el mensaje de nechevel que te ha dado una pista de cúal es tu error.
Por si acaso no lo pillas, date cuenta de que al introducir el valor de referencia en la expresión IF, estás metiendo un carácter que el compilador interpreta como inicio de comentario. Mira:
Codigo:

IF CABECERA_PAQUETE_L==H"44" ; Solicitud de Telemetría


a partir de la coma, ", el compilador se piensa que es un comentario, y en realidad establece la comparación así:
Codigo:

IF CABECERA_PAQUETE_L==H  


no se verifica y por tanto en programa entra en el else.

Ya nos contarás.

Desconectado kurdo22

  • PIC10
  • *
  • Mensajes: 48
RE: Problema con directiva IF
« Respuesta #2 en: 14 de Octubre de 2004, 08:31:00 »


    Muy buenas, antes de nada gracias. Simplemente decir que estoy programando en ensambador, por si eso influye, y decir que si he repetido el mensaje es porque en el otro ya lo habia dado por finiquitado y ante la duda de que nechevel no volviera a entrar en el lo puse en el principal.

   Un saludo y gracias

Desconectado Elena2000

  • PIC24F
  • *****
  • Mensajes: 722
RE: Problema con directiva IF
« Respuesta #3 en: 14 de Octubre de 2004, 08:42:00 »
Qué idiota soy........ pues claro que es ensamblador.... seré imbécil, joe.
Como sólo me fijé en la línea que te daba lata, la del IF, lo demás ni me cosqué .... pensé que era basic, y claro...... Soy tonta, si.

No sabes cómo lo siento, perdona porfa.

Desconectado Elena2000

  • PIC24F
  • *****
  • Mensajes: 722
RE: Problema con directiva IF
« Respuesta #4 en: 14 de Octubre de 2004, 09:53:00 »
Hola Kurdo22, aquí estoy otra vez.... A ver si reparo la metedura de gamba de antes.

Se me ocurre que puedes probar a cambiar las directivas, a ver si en la simulación se verifican las condiciones. Puedes hacer esto:

Codigo:

movf  CABECERA_PAQUETE_L,W     ;el dato entra en el registro de trabajo
sublw 0x44   ;esto es como if ((CABECERA_PAQUETE_L-0x44) != 0)
goto  SOLICITUD_DATOS       ;En caso de telecomando erroneo
goto    SOLICITUD_TELEMETRIA       ;  aquí se verificaría tu else



Ya me contarás, ¿vale? yo las directivas IF/ELSE no las uso nunca en ensamblador, utilizo las operaciones orientadas a bits y el truquillo ese que te he puesto arriba... A ver si te sirve.

Desconectado nechevel

  • PIC10
  • *
  • Mensajes: 24
RE: Problema con directiva IF
« Respuesta #5 en: 14 de Octubre de 2004, 19:20:00 »
Hola Elena.
La solución que propones me parce acertada pero pienso que te faltó chequear el bit z del registro status. Creo que debe quedar así:
movf CABECERA_PAQUETE_L,W ;el dato entra en el registro de trabajo
sublw 0x44 ;esto es como if ((CABECERA_PAQUETE_L-0x44) != 0)
btfss status,z
goto SOLICITUD_DATOS ;En caso de telecomando erroneo
goto SOLICITUD_TELEMETRIA

Por favor corrígeme si me equivoco.

Saludos.

Desconectado Elena2000

  • PIC24F
  • *****
  • Mensajes: 722
RE: Problema con directiva IF
« Respuesta #6 en: 15 de Octubre de 2004, 04:06:00 »
Yo creo que no hace falta, Nechevel. La directiva sublw ya chequea la bandeza Z, y produce el salto de instrucción en caso de verificarse o no que ese bit esté en nivel alto. Creo...

Desconectado Elena2000

  • PIC24F
  • *****
  • Mensajes: 722
RE: Problema con directiva IF
« Respuesta #7 en: 15 de Octubre de 2004, 04:34:00 »
Hola again,

Acabo de probar a incluir el chequeo del bit Z y funciona, nechevel. También me funciona de la otra manera, es decir sin poner el test del bit, pero creo que poniéndolo está más correcto. Sip.

Gracias, nechevel.
Elena

Desconectado kurdo22

  • PIC10
  • *
  • Mensajes: 48
RE: Problema con directiva IF
« Respuesta #8 en: 15 de Octubre de 2004, 12:01:00 »
 

    Esto es una maravilla, muchas gracias. Permitirme sugeriros otra forma que he encontrado. Es con la instruccion cpfseq (compara y salta si son iguales). Es una intruccion del 18F8720, el que estoy utilizando, que otros pic anteriores no traen. Es muy util. Un saludo y gracias de nuevo

Conectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7912
RE: Problema con directiva IF
« Respuesta #9 en: 15 de Octubre de 2004, 14:44:00 »
Cuando el problema no me sale utilizo la instruccion lpumylt.
Es una instruccion no documentada que sirve para toda la linea de PICs, tambien de Motorola y otros integrados.....

















Significa:
Le Pego Un Martillazo Y Lo Tiro !!!
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado manex_1987

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1127
RE: Problema con directiva IF
« Respuesta #10 en: 16 de Octubre de 2004, 12:37:00 »
Oye MGL y como funciona?

Yo he puesto

Codigo:

PACIENCIA_CHECK:
btfss FLAG_PACIENCIA
lpumylt PORTA
return



y lo unico que veo es humo y mas humo... he pensado que puede ser problema del 7805 porque no le he puesto condensadores en la entrada y en la salida pero nose nose...



 

anything