TUTORIAL II – parte A OBJETIVOS • Conocer el manejo de puertos

Anuncio
Nelson David Muñoz C.
Politecnico CJIC
http://mecatronica.jimdo.com/
1
TUTORIAL II – parte A
OBJETIVOS
•
•
•
•
•
Conocer el manejo de puertos del microcontrolador 16F877A, registros
TRIS y PORT.
Familiarizarse con las principales instrucciones del lenguaje y la estructura
de un programa en C.
Afianzar conceptos relacionados con la simulación en el MPLAB.
Realizar la implementación en un microcontrolador por medio del uso de la
tarjeta programadora.
Conocer los elementos mínimos necesarios para realizar el montaje de un
sistema microcontrolado.
MARCO TEÓRICO
-
Puertos de entrada / salida (I/O ports):
Una de las características de los microcontroladores es el hecho de poseer
puertos que pueden servir tanto como entradas de datos como salida de los
mismos.
Observemos el diagrama de pines del microcontrolador 16F877A:
Los pines indicados por R más una letra y un número indican pines que pueden
ser usados como pines de I/O, el resto de pines son el oscilador, la
alimentación y el reset (Master clear). Nótese algunos pines de I/O poseen
varios nombres (Por ejemplo RA0 / AN0) lo que indica que dicho pin puede ser
Nelson David Muñoz C.
Politecnico CJIC
http://mecatronica.jimdo.com/
1
Nelson David Muñoz C.
Politecnico CJIC
http://mecatronica.jimdo.com/
2
usado como puerto de I/O (RA0) o puede ser usado por un periférico del
microcontrolador (AN0 conversor análogo digital).
En total el 16F877A tiene cinco puertos denominados como Puerto A al Puerto
E, cada puerto está compuesto por de 3 a 8 pines de I/O de esta forma:
PORT A
PORT B
RA0
RA1
RA2
RA3
RA4
RA5
RB0
RB1
RB2
RB3
RB4
RB5
RB6
RB7
PORT C
PORT D
RC0
RC1
RC2
RC3
RC4
RC5
RC6
RC7
RD0
RD1
RD2
RD3
RD4
RD5
RD6
RD7
PORTE
RE0
RE1
RE2
CONFIGURACIÓN DE PUERTOS (Registros Tris):
Antes de poder usar los puertos del microcontrolador debemos configurarlos ya
sea como una entrada de datos o como una salida de los mismos. Para
realizar esto se recurre a los registros TRIS de la siguiente forma:
Cada puerto tiene un registro TRIS asociado, por ejemplo el PORTA se
configura usando el registro TRISA, el PORTD se configura usando el TRISD y
así sucesivamente.
Los TRIS son registros de 8 bits, cada uno de sus bits configura un pin de dicho
puerto. Por ejemplo: en el registro TRISD el bit menos significativo (bit 0)
configura el pin RD0, el bit 7 del registro TRISA configura el pin RA7 y así
sucesivamente.
Un uno en un registro TRIS indica que el pin asociado se comportará como una
entrada y un 0 indica que dicho pin se comportará como una salida.
Ejemplos:
TRISB= 0b10101011;
Acá se está configurando a RB7, RB5, RB3, RB1 y RB0 como entradas
mientras que RB6, RB4 y RB2 serán salidas. El prefijo 0b indica que los datos
que vamos a ingresar al registro están en binario.
Nelson David Muñoz C.
Politecnico CJIC
http://mecatronica.jimdo.com/
2
Nelson David Muñoz C.
Politecnico CJIC
http://mecatronica.jimdo.com/
3
TRISD=0b00001111;
Se configuraron como entradas los pines RD0 a RD3 y como salidas los pines
RD4 a RD7.
TRISC=255;
Acá se configura todo el puerto C como entrada en todos sus pines, obsérvese
que no se usó prefijo y por lo tanto el dato se interpreta como decimal,
recuérdese que al convertir decimal a binario tenemos 255 = 0b11111111.
TRISC=0xFF;
Igualmente se configuró el puerto C como entrada todos sus pines, esta ves se
utilizaron datos en formato hexadecimal (prefijo 0x). Recuérdese 255 = 0xFF.
El compilador también nos permite configurar solamente un pin (bit) del registro
TRIS sin modificar el resto del registro de esta forma:
TRISC7=1; Configura el pin RC7 como una entrada, sin modificar la
configuración del resto de pines del puerto C.
A tener en cuenta:
- Al iniciar o resetear el microcontrolador pone todos los pines como
entradas.
- Al configurar los puertos que manejan menos de 8 bits (PORTA y
PORTE) debe tenerse cuidado, en el 16F877 los bits TRISE3-7 deben
siempre mantenerse en cero.
MANEJO DE LOS PUERTOS:
Para escribir o leer a un puerto se utilizan los registros PORT, igualmente que
los TRIS existe uno para cada puerto y cada bit del registro corresponde a un
pin del puerto.
Ejemplos:
PORTA=0b1110001;
Suponiendo que el puerto A está todo como salidas,
se colocarán en 1 lógico (+5V) los pines RA7, RA6, RA5 y RA1, el resto irán a
cero lógico (0V).
PORTB = 255;
están como salidas.
Pone todos los pines del puerto B en alto si estos
RB7=1;
Igualmente que con los TRIS en los PORT se puede
modificar un bit sin modificar todo el registro, para ello se utiliza el nombre del
pin.
Nelson David Muñoz C.
Politecnico CJIC
http://mecatronica.jimdo.com/
3
Nelson David Muñoz C.
Politecnico CJIC
RB6=0;
http://mecatronica.jimdo.com/
4
Lleva a cero el pin 6 del puerto RB.
PORTB = PORTD;
Suponiendo que PORTD está como entrada y
PORTB está como salida se copiaría el PORTD en el PORTB.
A tener en cuenta:
- Para poder usar el puerto A como puerto de I/O se debe deshabilitar el
convertidor análogo digital que por defecto tiene los pines como
análogos, para ello se debe agregar esta instrucción: ADCON1=6; mas
detalles veremos cuando usemos el convertidor A/D.
APLICACIÓN: JUEGO DE LUCES
Como aplicación al manejo de puerto como salida de datos realizaremos el
siguiente proyecto para ser implementado usando la tarjeta programadora.
Para esto colocaremos 8 leds en las salidas del puerto B del microcontrolador
de modo que se enciendan al poner un uno lógico en dichos pines.
Deseamos generar la siguiente secuencia de luces (las casillas en negro
indican leds encendidos):
RB7
RB6
RB5
RB4
RB3
RB2
RB1
RB0
RB7
RB6
RB5
RB4
RB3
RB2
RB1
RB0
RB7
RB6
RB5
RB4
RB3
RB2
RB1
RB0
RB7
RB6
RB5
RB4
RB3
RB2
RB1
RB0
RB7
RB6
RB5
RB4
RB3
RB2
RB1
RB0
Y se repita indefinidamente.
A continuación se ilustra el código en C que efectúa dicha secuencia, se indica
con comentario cada línea:
#include <pic.h> //Incluyo libreria con definición de registros del PIC
#include "delay.h" //Incluyo libreria para manejar los retardos
#include "delay.c"
Nelson David Muñoz C.
Politecnico CJIC
http://mecatronica.jimdo.com/
4
Nelson David Muñoz C.
void main (void)
{
TRISB=0;
Politecnico CJIC
http://mecatronica.jimdo.com/
5
//Indico que aca comienza mi programa
//Configuración de puertos
//Todo el puerto B son salidas
while(1)
//Ciclo infinito para repetir la secuencia
{
PORTB=255;
//Primer paso de la secuencia todos prendidos
DelayMs(200);
//Retardo para visualización.
PORTB=0;
//Todos apagados
DelayMs(200);
//Retardo para visualización.
RB0=1;
RB7=1;
DelayMs(200);
//Retardo para visualización.
RB1=1;
RB6=1;
DelayMs(200);
//Retardo para visualización.
RB5=1;
RB2=1;
DelayMs(200);
//Retardo para visualización.
}
}
Iguales resultados se obtendrían con el siguiente código:
#include <pic.h> //Incluyo libreria con definición de registros del PIC
#include "delay.h" //Incluyo libreria para manejar los retardos
#include "delay.c"
void main (void)
{
TRISB=0;
//Indico que aca comienza mi programa
//Configuración de puertos
//Todo el puerto B son salidas
while(1)
//Ciclo infinito para repetir la secuencia
{
PORTB=255;
//Primer paso de la secuencia todos prendidos
DelayMs(200);
//Retardo para visualización.
PORTB=0; //Todos apagados
DelayMs(200);
//Retardo para visualización.
PORTB=0b10000001;
DelayMs(200);
//Retardo para visualización.
PORTB=0b11000011;
DelayMs(200);
//Retardo para visualización.
PORTB=0b11100111;
DelayMs(200);
//Retardo para visualización.
}
}
Nelson David Muñoz C.
Politecnico CJIC
http://mecatronica.jimdo.com/
5
Nelson David Muñoz C.
Politecnico CJIC
http://mecatronica.jimdo.com/
6
Retardos: Dado que la velocidad de ejecución de un microcontrolador es
relativamente rápida (1us por instrucción a 4Mhz) no podríamos observar la
ejecución de la secuencia, para ello utilizamos los retardos. Un retardo es
simplemente un conjunto de instrucciones que se ejecutan repetitivamente para
crear un tiempo muerto en la ejecución del programa.
El compilador PICClite en la librería Delay.h provee las funciones DelayMs() y
DelayUs() las cuales generan retardos de milisegundos y microsegundos
respectivamente, el parámetro pasado a dichas funciones debe estar entre 0 y
255. El cálculo de retardos en estas funciones está basado en un reloj de 4Mhz
para distintas frecuencias deben escalarse. Recordar incluir delay.h y delay.c
en la carpeta del proyecto.
LECTURA DE PUERTOS:
A continuación se ilustra un código que hace uso de la lectura de puertos, en el
se verifica cada vez que va a comenzar la secuencia anterior si el pin RC0 está
en uno o no, si el pin está en uno se continua la secuencia, si no lo está no se
ejecuta secuencia hasta que se coloque en uno:
#include <pic.h> //Incluyo libreria con definición de registros del PIC
#include "delay.h" //Incluyo libreria para manejar los retardos
void main (void)
//Indico que aca comienza mi programa
{
//Configuración de puertos
TRISB=0;
//Todo el puerto B son salidas
TRISC0=1;
//El pin RC0 es una entrada
while(1)
//Ciclo infinito para repetir la secuencia
{if(RC0==1)
{
PORTB=255;
//Primer paso de la secuencia todos prendidos
DelayMs(200);
//Retardo para visualización.
PORTB=0; //Todos apagados
DelayMs(200);
//Retardo para visualización.
PORTB=0b10000001;
DelayMs(200);
//Retardo para visualización.
PORTB=0b11000011;
DelayMs(200);
//Retardo para visualización.
PORTB=0b11100111;
DelayMs(200);
//Retardo para visualización.
}
}
}
Nelson David Muñoz C.
Politecnico CJIC
http://mecatronica.jimdo.com/
6
Nelson David Muñoz C.
Politecnico CJIC
http://mecatronica.jimdo.com/
7
DIAGRAMA DE CONEXIONES:
Obsérvese la conexión de los led y el swiche en PORTB y RC0
respectivamente, además de esto está el montaje de la alimentación del
microcontrolador, +5V en los pines 32 y 11 (Vdd) y tierra en los pines 31 y 12.
El master clear se debe mantener en un nivel alto para no resetear al
microcontrolador (puede colocarse un pulsador para realizar el reset cuando se
desee) por medio de una resistencia. El oscilador (cristal) se debe conectar en
los pines 13 y 14 además se recomienda utilizar condensadores de 22pF entre
los pines del cristal y tierra para mejorar la estabilidad de este.
Nelson David Muñoz C.
Politecnico CJIC
http://mecatronica.jimdo.com/
7
Descargar