Autor Tema: ciclo if e incremento de registro  (Leído 3831 veces)

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

Desconectado germanpic

  • PIC10
  • *
  • Mensajes: 5
ciclo if e incremento de registro
« en: 16 de Noviembre de 2003, 15:46:00 »
Hola a todos,

 Tengo problemas cuando uso el rombo del condicional "if"
 En cuanto comparo dentro un registro llamese "contador", el cual es incrementado x veces por ejemplo para prender y apagar x veces un led-en este caso practico. Mi problema es que el ciclo de comparacion"if" se sigue comparando y mi programa deberia terminar despues de que mi registro"contador" se incremento x veces. Por lo tanto mi led se prende y apaga indefinidamente.
  He revisado el codigo que se genera en assembler y aparentemente todo esta correcto. He verificado si mi registro se incrementa y asi es. Aparantemente el problema radica cuando se hace la comparacion en el Rombo "if".
 Ya he agotado todas las pruebas para este sencillo ejemplo, pero sigo sin resolverlo.
  Agredeceria la opinion de alguien. Para descartar un problema de el Niple.

  Saludos                   germanpic

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
RE: ciclo if e incremento de registro
« Respuesta #1 en: 17 de Noviembre de 2003, 07:20:00 »
Por que no pones el ejemplo, para evaluarlo?
Levantalo al foro de archivos.
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado _Canito_

  • PIC12
  • **
  • Mensajes: 74
RE: ciclo if e incremento de registro
« Respuesta #2 en: 17 de Noviembre de 2003, 07:25:00 »
Hola German,

Para incrementar y evaluar un registro tenes varias maneras de hacerlo:

- utilizando la instruccion INCFSZ

- Utilizando la instruccion INCF y Comparar Registro.

- Utilizando la instruccion DECFSZ

SI estás utilizando el primer método (que sospecho que así es), la instrucción INCFSZ incrementa el registro y evalúa si el resultado es = 0.
En este caso si quieres ejecutar un codigo, por ejemplo, 10 veces debes inciar el contador desde 246 para que al cabo de 10 incrementos se produzca el desbordamiento del registro, el registro comienza a contar desde 0.

Es decir que la instrucción INCFSZ seguira incrementando hasta que le registro llegue a 0.

El bloque se interpreta de la siguiente manera:

Si el registro se desborda y vuelve a 0, sale por la flecha SI.
Mientras el registro no se desborda, sale por la flecha NO.

Osea que, lo que evalúa el bloque es; si el registro se desborda o no.
(Lo mismo que hace la instruccion INCFSZ, en todos los bloques de instrucción no modificamos la interpretación de la función que tienen en ASM).

La segunda manera de controlar la cantidad de veces de veces que se repite un ciclo es incrementando el registro (con INCF) y luego evaluando si el registro es = a 10 (por ejemplo).

El bloque de evaluacion d eregistro lo encuentras en Rutinas Basicas/ Funciones Logicas / Comparar registro.

Este bloque se evalúa si el regitro llego a 10.
Si llego, sale por el SI, sino , sle por el NO.

Si estás utilizando este metodo no te olvides de reiniciar el contador a 0 una vez que llegaste a 10. para esto debes poner una asignacion CONTADOR = 0  en la salida del SI.


Por ultimo tenes la instruccion DECFSZ.
Creo es la manera mas practica de hacerlo.
El concepto es el mismo que la instruccion INCFSZ pero en lugar de ingrementar un registro lo decrementa.

Aca el bloque decrementa el registro y evalua si llego a 0.

En este momento estoy viendo la manera de diseñar un bloque contador que se ejecute x cantidad de veces y que sea facil de usar e interpretar y que el valor de la cuenta sea a 16 bits.


Espero haber despejado tus dudas.

Un saludo
canito