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