4 de junio de 2010

Problema de puertos con sentencias "if"

Usando un sistema MCS-51, se pretende controlar un sistema de entradas y salidas según la tabla siguiente:











Observa que las entradas están asociadas al puerto “P0” y corresponden a los bits 5, 6 y 7 (los tres de la parte alta). Las salidas están asociadas al puerto “P1” y corresponden a los bits 0, 1 y 4. Puedes resolver el problema usando “sbits” o desplazando la posición de los bits.

Se pide escribir un programa en C que resuelva el requerimiento. Define los registros “sfr” necesarios y el bloque principal del programa. Comprueba con Keil que funciona.

El procedimiento para resolverlo va a ser definir los “sbits” necesarios (entradas y salidas). Puedes ver como se han definido los "sfr" y "sbits" necesarios:




Para detectar cada una de las combinaciones de entrada, utilizamos sentencias “if”. Como hay sólo cuatro casos, no es excesivamente complicado hacerlo de esta manera:

En la figura anterior tienes cuatro condiciones “if” que supervisan los cuatro estados a detectar en las entradas. Son sentencias independientes, cada una “vigila” una combinación única. Si en las entradas aparece una entrada no contemplada en alguna sentencia “if” sencillamente, el programa no hace absolutamente nada, no la tiene en cuenta. Esta acción de omisión puede generar un problema.

Imagina que se ha detectado la entrada “000”, el programa la detecta con el primer “if” y activa las salidas “000”. Ahora las entradas cambian a “011”, una combinación que no detecta ningún “if”, el programa no hace nada y las salidas mantienen la activación anterior. Aquí está el problema, nuestro programa está manteniendo activas unas salidas cuando detecta una combinación de entradas inexistente, es decir, se activan las salidas cuando no toca.

Para resolver este problema, hay que asegurarse de que el programa detecte el caso “ninguno de los anteriores”. Esto se consigue agrupando las sentencias “else if” en un bloque único donde se comprueban una a una las condiciones y si ninguna cumple, se activa la sentencia “else” final. La condición final pondrá una determinada combinación en las salidas (a determinar). Esto contesta a la nota que se plantea al final del problema:



Nota: Como última consideración, ¿qué pasaría si después de detectar la combinación “000”, en las entradas apareciera un “011”, una entrada no contemplada?

No hay comentarios: