Manejo de puertoscon C - juan alberto segundo miranda

Primeros pasos con los MCU
MANEJO DE PUERTOS CON LENGUAJE C
INTRODUCCIÓN
Los microcontroladores (MCU) cuentan con puertos para comunicarse con su
entorno, esta comunicación es con pulsos eléctricos “1” presencia de voltaje o “0”
sin voltaje. Los puertos los podemos configurar como puerto de entrada o salida.
También podemos combinar su configuración. Para trabajar con el MCU utilizaremos
en lenguaje de programación C. Los MCU de la marca Atmel permiten programarlos
con C o en su caso lenguaje ensamblador. Nos enfocamos a C por ser un lenguaje
mucho más fácil de usar e implementar.
PRINCIPIOS DE LENGUAJE C
Iniciaremos comentando la estructura general de un programa. Para definir el
programa requerimos iniciar con las librerías del micro controlador, por ejemplo: io.h
y delay.h, a continuación se declaran variables globales, después la función “main”.
Ejemplo:
#include<avr/io.h>
#include<util/delay.h>
int i;
int main()
{
DDRD =0xFF;
return 0;
}
El lenguaje C cuenta con una sintaxis y reglas que debemos respetar, las
instrucciones finalizan con el carácter “;”, los bloques de instrucciones deben
indicarse al iniciar con “{” y al finalizar con “}”; al declarar una variable o una
función se debe especificar el tipo de dato en nuestro ejemplo “int”.
Juan Alberto Segundo Miranda
UPIICSA – IPN diciembre/2010
1
Primeros pasos con los MCU
COMENTANDO LÍNEA A LÍNEA EL EJEMPLO ANTERIOR
#include<avr/io.h>
#include<util/delay.h>
Es la declaración de las librerías a utilizar.
int i;
Es la declaración de una variable que contendrá datos del tipo entero.
int main()
Es la función principal que ejecutará nuestros comandos/instrucciones.
{
Inicia el bloque de comando/instrucciones a ejecutar.
DDRD =0xFF;
Se asigna el valor de 0xFF al parámetro de configuración del puerto D mediante
DDRD, el valor es 0xFF en notación hexadecimal, que es equivalente a 255 en
notación decimal o también a binaria 11111111.
return 0;
Finaliza la función main() regresando un valor entero cero. Podemos regresar algún
otro valor entero (ejemplos: 45 o 234 o 5), solo debe ser un valor entero, de
acuerdo a la declaración de la función main.
{
Finaliza el bloque de comandos/instrucciones de la función main().
Existen diferentes tipos de datos y para declararlos utilizamos por ejemplo:
int
entero
char carácter
float flotante
Juan Alberto Segundo Miranda
UPIICSA – IPN diciembre/2010
2
Primeros pasos con los MCU
HACIENDO USO DE LOS PUERTOS
Suponiendo que deseamos configurar el puerto D, debemos utilizar el parámetro de
DDRx, donde “x” es la letra del parámetro a configurar.
DDRD = 2;
Que es similar a:
DDRD = 00000010;
O podría ser:
DDRD = 0x02;
Considere que en nuestro ejemplo el puerto “D” tiene ocho elementos, cada
elemento puede ser configurado para recibir entrada/salida de información. En el
elemento donde tenemos un “1” indica que es salida, al contrario un “0” será de
entrada y se especifica mediante el DDRx, la “x” es la letra del puerto. Data
Direction Register (DDR) nos permite configurar la dirección en la que el registro de
acceso al MCU tendrá, entrada o salida de información, este registro regularmente
tiene 8 elementos o bits, ver el manual del MCU para confirmar.
En el caso que se desee 4 elementos de entrada y 4 elementos de salida, seria 1111
0000, y se debe tomar en cuenta que el primer uno en su representación es el más
significativo y PD7, PD6, PD5, …… PD0.
Para cuando se requiera un elemento de entrada, uno de salida, uno de entrada y
así consecutivamente seria 1010 1010 = 0xAA.
El siguiente paso es ya de acuerdo a la configuración del puerto (DDRx), se utilice la
escritura del puerto o la lectura del puerto, en dicho caso usaremos:
salida (1 en el DDRx) se usa PORTx
entrada (0 en el DDRx) se usa PINx
Para la salida, que esté presente en todos los elementos del puerto 1111 1111 se
debe utilizar PORTx y el valor que realiza la representación de tener 8 “unos” o
niveles altos.
PORTD = 0xFF;
Juan Alberto Segundo Miranda
UPIICSA – IPN diciembre/2010
3
Primeros pasos con los MCU
Para el caso de la mitad ceros y la otra mitad unos, quedaría:
PORTD = 0x0F;
En el caso de leer o conocer la entrada utilizamos PINx, por ejemplo:
int i;
i = PIND;
En la variable i se depositará los niveles “1” o “0” que estén presentes en los
elementos del puerto D.
De acuerdo a las necesidades podremos utilizar un puerto de entrada y uno de
salida o se podría utilizar en forma simultanea el mismo puerto en tiempos
diferentes.
Juan Alberto Segundo Miranda
UPIICSA – IPN diciembre/2010
4