Apuntes teoría sensores y material de prácticas para la asignatura del curso Informática Industrial
Mostrando entradas con la etiqueta puertos. Mostrar todas las entradas
Mostrando entradas con la etiqueta puertos. Mostrar todas las entradas
17 de abril de 2011
Leer los bits 0 y 4 del puerto "P0"
Observa que la parte del programa principal es "void main(void)" porque no devuelve ningún valor. Sólo realiza una tarea: comprobar los bits 0 y 4 del puerto "P0", pero no devuelve ningún dato.
Descargar programa.
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?

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?
11 de mayo de 2010
Definir puertos como entradas o salidas
Cuando vamos a utilizar los puertos para leer sensores o manejar actuadores debemos especificar si estos puertos serán entradas o salidas, es decir, definir la dirección de los datos.
Para definir todas las líneas del puerto "P0" como entradas:
P0 = 0xFF; // todos los bits del puerto cero como entradas
Para definir un puerto como salidas, no hace falta hacer nada, en este micro, por defecto están configurados como salidas.
Puedes ver un ejemplo en el siguiente código.
Este programa lee un bit del puerto "P0" y activa una salida en el puerto "P1":
sfr P0=0x80;
sfr P1=0x90;
sbit P0_0=P0^0;
sbit P1_7=P1^7;
void main(void){
P0=0xFF; // definimos todo el puerto P0 como entradas
// el puerto P1 configurado como salida por defecto
while (1){
if (P0_0==0) P1_7=1; // comprueba nivel bit P0.0
else P1_7=0;
}}
Nota: Si no tienes en cuenta este paso definiendo la dirección de los datos, cuando simules en el compilador Keil, tendrás un error y en ocasiones el programa podrá terminar inesperadamente.
Prueba a compilar y simular este programa sin definir la dirección de los puertos y observa como al cambiar el estado de los bits en los puertos, el programa se bloquea (trabajando con la versión 2 de Keil).
Para definir todas las líneas del puerto "P0" como entradas:
P0 = 0xFF; // todos los bits del puerto cero como entradas
Para definir un puerto como salidas, no hace falta hacer nada, en este micro, por defecto están configurados como salidas.
Puedes ver un ejemplo en el siguiente código.
Este programa lee un bit del puerto "P0" y activa una salida en el puerto "P1":
sfr P0=0x80;
sfr P1=0x90;
sbit P0_0=P0^0;
sbit P1_7=P1^7;
void main(void){
P0=0xFF; // definimos todo el puerto P0 como entradas
// el puerto P1 configurado como salida por defecto
while (1){
if (P0_0==0) P1_7=1; // comprueba nivel bit P0.0
else P1_7=0;
}}
Nota: Si no tienes en cuenta este paso definiendo la dirección de los datos, cuando simules en el compilador Keil, tendrás un error y en ocasiones el programa podrá terminar inesperadamente.
Prueba a compilar y simular este programa sin definir la dirección de los puertos y observa como al cambiar el estado de los bits en los puertos, el programa se bloquea (trabajando con la versión 2 de Keil).
Suscribirse a:
Entradas (Atom)