MICROCONTROLADOR PIC ENTRADAS SALIDAS DIGITALES
En esta ocasión se verá el uso de los pines del microcontrolador PIC como entradas salidas digitales, estos pines pueden tener múltiples funciones, por lo que será necesario tener siempre a mano la hoja de datos del microcontrolador PIC utilizado.
Los pines de los microcontroladores PIC normalmente vienen agrupados en grupos de 8 pines, a cada uno de estos grupos se les llama puerto, algunos puertos pueden tener menos de 8 pines, por ejemplo para el PIC16F88 tiene dos puertos de 8 pines cada uno el puertoA y el puertoB, mientras el PIC16F84A, tiene también 2 puertos pero en el puertoA solo tiene 5 pines mientras en el puertoB tiene 8 pines, la cantidad de puertos también variará dependiendo del modelo del microcontrolador PIC, por ejemplo el PIC18F4550 tiene 5 puertos.
Cada uno de los pines del microcontrolador PIC a ser utilizados como entradas salidas digitales tienen un nombre propio relacionado con el puerto al que pertenecen y al número de orden del bit con el cual se programará, por ejemplo para el puertoB se tienen los pines RB0,RB1, RB2, RB3, RB4, RB5, RB6, RB7.
Para la manipulación de los pines de microcontrolador PIC como entradas salidas digitales, dependiendo del PIC, este cuenta con los registros TRISx y el PORTx para el PIC16F88, en cambio para el PIC18F4550 se tienen los registros TRISx, LATx y el PORTx, las x dependen del puerto a utilizar.
En adelante se tomará como ejemplo el microcontrolador PIC16F88, pero lo que aquí se comente en cuanto al uso de los pines como entradas salidas digitales, es muy similar para los demás microcontroladores PIC.
La hoja de datos del PIC16F88 se puede descargar desde aquí, la programación de los pines como entradas salidas digitales del microcontrolador PIC se realizará en lenguaje C con el XC8.
ENTRADAS SALIDAS DIGITALES PIC, EL REGISTRO TRISx
Mediante el registro TRISx se elige si los pines del microcontrolador PIC serán entradas digitales o salidas digitales, la x representa el puerto al cual pertenezcan los pines a utilizar como entradas o salidas digitales, por ejemplo si es un pin del puerto A, entonces la x será A, si es un pin del puerto E, entonces la x será E, para los microcontroladores PIC de 8 bits, el registro TRISx está conformado por 8 bits; cada uno de esos bits controlará un pin del puerto al que pertenezca el registro TRISx para que este pin se comporte como una entrada digital o como una salida digital.
Para elegir que un pin de un puertoX del microcontrolador PIC se comporte como una salida digital, se tendrá que poner a 0 el bit correspondiente es su registro TRISx.
Para elegir que un pin de un puertoX del microcontrolador PIC se comporte como una entrada digital, se tendrá que poner a 1 el bit correspondiente es su registro TRISx.
La siguiente es una imagen del registro TRISB de un microcontrolador PIC.
Este registro se puede programar para que todos los pines del puertoB sean salidas digitales o para que todos los pines sean entradas digitales o una mezcla de ambos.
En el XC8 la programación del registro TRISx, así como cualquier otro registro, se puede hacer en binario, en decimal o hexadecimal.
Para el puertoB por ejemplo en el XC8, la forma de configurar los pines del puertoB como entradas o como salidas digitales se hace como se muestra a continuación:
//todos los pines del puertoB como salidas digitales
TRISB=0b00000000; //en binario
TRISB=0; //en decimal
TRISB=0x00; //en hexadecimal
//todos los pines del puertoB como entradas digitales
TRISB=0b11111111; //en binario
TRISB=255; //en decimal
TRISB=0xff; //en hexadecimal
//algunos pines como entradas y otros como salidas digitales
TRISB=0b10101010; //en binario
TRISB=170; //en decimal
TRISB=0xaa; //en hexadecimal
La forma binaria tiene la ventaja de que deja ver con que valores 0 o 1 se están programando los bits del registro utilizado, el valor asignado al registro está comprendido entre 0 y 255 porque el registro es de 8 bits.
Se ha comentado la forma de proceder en el XC8 para el caso del registro TRISB, pero en el XC8 se procede de la misma forma para cualquier otro registro del microcontrolador PIC que se quiera utilizar.
Muchas veces será necesario programar los bits de los registros bit por bit, no todos de una vez como se ha visto, esto en el XC8 que está basado en el lenguaje C se realiza mediante operaciones de bits; es muy importante dominar las operaciones de bits ya que facilita bastante la programación de los microcontroladores; lo que se comente en adelante para la manipulación de los bits del registro TRISB será aplicable a cualquier otro registro del microcontrolador PIC.
MICROCONTROLADORES PIC PROGRAMACIÓN BIT POR BIT DE UN REGISTRO
Se tomará para el ejemplo el caso del registro TRISB, pero el proceder será el mismo para cualquier otro registro.
Por ejemplo si se quiere utilizar solo el pin RB0 como salida digital, entonces el bit0 del registro TRISB se tendrá que poner a 0, para lograr esto se procede así:
TRISB &=~ (1<<0);//aquí se esta diciendo que el bit 0 del registro TRISB se ponga a 0 donde & es el operador de bits AND, ~ es la negación y (1<<0) es un número binario de 8 bits donde el bit0 se ha puesto a 1, lo anterior es lo mismo que hacer lo siguiente
TRISB=TRISB&~(0b00000001);
Se niega el número binario con lo que el bit0 se pone a 0 y todos sus demás bits se ponen a 1, luego se realiza la operación AND con el registro TRISB, con lo que se logra que el bit0 del registro TRISB mediante la operación AND se ponga a 0, los demás bits del registro TRISB mantendrán sus valores en la operación AND, ya que los otros bits del número binario se pusieron a 1 en la negación, por último el resultado de la operación se le asigna al registro TRISB, mediante esta operación se logra que el bit0 del registro TRISB se ponga a 0 y así establecer que el pin RB0 será utilizado como una salida digital, en el XC8 esto mismo se puede programar de la siguiente manera:
TRISBbits.TRISB0=0;
Por ejemplo si se necesita que el pin RB5 sea una salida digital, se puede proceder así
TRISB &= ~(1<<5);//viene del lenguaje C
TRISB=TRISB&~(0b00100000);//forma completa de la anterior
TRISBbits.TRISB5=0;//En el XC8
Si se quiere por ejemplo que los pines RB1, RB4 y RB7 sean salidas digitales, esto en una sola línea utilizando el operador de bits OR | sería así:
TRISB &=~ ((1<<1) | (1<<4) | (1<<7)); //viene del lenguaje C
y en el XC8 también se puede hacer así
TRISBbits.TRISB1=0;
TRISBbits.TRISB4=0;
TRISBbits.TRISB7=0;
Por ejemplo si se quiere utilizar solo el pin RB0 como entrada digital, entonces el bit0 del registro TRISB se tendrá que poner a 1, para lograr esto se procede así:
TRISB |= (1<<0);//aquí se esta diciendo que el bit 0 del registro TRISB se ponga a 1 donde | es el operador de bits OR, y (1<<0) es un número binario de 8 bits donde el bit0 se ha puesto a 1, lo anterior es lo mismo que hacer lo siguiente
TRISB=TRISB|(0b00000001);
Se realiza la operación OR entre el número binario y registro TRISB, con lo que se logra que el bit0 del registro TRISB se ponga a 1 si antes estaba a 0 y si ya estaba a 1 se mantendrá a 1, los demás bits del registro TRISB mantendrán sus valores en la operación OR, ya que los otros bits del número binario están a 0, por último el resultado de la operación se le asigna al registro TRISB, mediante esta operación se logra que el bit0 del registro TRISB se ponga a 1 y así establecer que el pin RB0 será utilizado como una entrada digital, en el XC8 esto mismo se puede programar de la siguiente manera:
TRISBbits.TRISB0=1;
Por ejemplo si se necesita que el pin RB5 sea una entrada digital, se puede proceder así
TRISB |=(1<<5);//viene del lenguaje C
TRISB=TRISB|(0b00100000);//forma completa de la anterior
TRISBbits.TRISB5=1;//En el XC8
Si se quiere por ejemplo que los pines RB1, RB4 y RB7 sean entradas digitales, esto en una sola linea utilizando el operador de bits OR | sería así:
TRISB |=((1<<1) | (1<<4) | (1<<7));//viene del lenguaje C
y en el XC8 también se puede hacer así
TRISBbits.TRISB1=1;
TRISBbits.TRISB4=1;
TRISBbits.TRISB7=1;
ENTRADAS SALIDAS DIGITALES PIC, EL REGISTRO PORTx
Cuando algún pin o pines del microcontrolador PIC se han configurado como salidas digitales mediante la programación de los bits del registro PORTx se indica si por la salida digital se tendrá un alto o un bajo que es lo mismo que un 1 o un 0.
Por ejemplo utilizando el compilador XC8 con la siguiente línea de código se pondrán todos los pines del puerto B como altos o a 1 o a 5V, si previamente mediante el registro TRISB se han configurado todos los pines del puerto B como salidas digitales.
PORTB=0b11111111; //en binario, también se puede hacer en decimal o hexadecimal.
mediante la siguiente lìnea de código se logra que por los pines impares del puerto B se obtendrán ceros o bajos , mientras que por los pines pares se obtendrán unos o altos.
PORTB=0b01010101;
si se quiere que solo por el pin RB3 salga un 1 será así
PORTB |= (1<<3);//viene del lenguaje C
en el XC8 también puede ser así
PORTBbits.RB3=1;
si se quiere que por los pines RB5 y RB2 salgan unos sería así:
PORTB |= ((1<<2)|(1<<5));//viene del lenguaje C
en el XC8 también puede ser así
PORTBbits.RB2=1;
PORTBbits.RB5=1;
Cuando algún pin o pines del microcontrolador PIC se han configurado como entradas digitales mediante los bits del registro PORTx se pueden leer los estados del los pines del puerto, esto es se puede leer si al pin del puerto x le está llegando una alto o un bajo, se puede leer bit por bit o todo el puerto a la vez, para esto será necesario crear variables donde se guardarán los estados leídos.
Por ejemplo si todos los pines del puerto B son utilizados como entradas digitales se puede
proceder así
unsigned char estados;//variable entera sin signo de 8 bits
estados=PORTB;//en la variable de 8 bits se guarda los estados de los pines del PUERTO B
ENTRADAS SALIDAS DIGITALES PIC CIRCUITO EJEMPLO
El siguiente es un ejemplo de como programar algunos pines del microcontrolador PIC16F88 como entradas salidas digitales, la siguiente es la imagen del circuito utilizado, este circuito ha sido realizado en los vídeos publicados en el canal de youtube de mrelberni.
Se trata de programar 2 pines como salidas digitales y un pin como entrada digital, el pin utilizado como entrada digital controlará uno de los pines utilizados como salida digital, la otra salida digital trabajará sin control.
Los pines RA1 y RB4 serán las salidas digitales y el pin RB1 será la entrada digital, el pin RA1 cambiará de estado cada 100ms, mientras el pin RB4 cambiará de estado solo cuando a la entrada RB1 le llegue un 0.
Todo el proceso seguido están comentados en los siguientes vídeos.
Entradas salidas digitales PIC parte 1, Microcontrolador PIC
Entradas salidas digitales PIC parte 2, Microcontrolador PIC
Entradas salidas digitales PIC parte 3, Microcontrolador PIC
Entradas salidas digitales PIC parte 4, Microcontrolador PIC
El código realizado en el XC8 para el ejemplo es el siguiente:
// Bits de configuración
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON // Power-up Timer Enable bit (PWRT enabled)
#pragma config MCLRE = ON // (RA5/MCLR/VPP pin function is MCLR)
#pragma config BOREN = OFF // Brown-out Reset Enable bit (BOR disabled)
#pragma config LVP = OFF //(RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EE Memory Code Protection bit (Code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off)
#pragma config CCPMX = RB0 // CCP1 Pin Selection bit (CCP1 function on RB0)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
// CONFIG2
#pragma config FCMEN = OFF // Fail-Safe Clock Monitor disabled)
#pragma config IESO = OFF //(Internal External Switchover mode disabled)
// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.
#define _XTAL_FREQ 20000000 //frecuencia del cristal utilizado
#include <xc.h>
void main(void) {
ANSEL=0; //para asegurar que los pines serán entradas o salidas digitales
//TRISAbits.TRISA1=0;
TRISA&=~(1<<1);//pin RA1 como salida digital
TRISB&=~(1<<4);//pin RB4 como salida digiral
//TRISBbits.TRISB1=1;
TRISB|=(1<<1);//pin RB1 como entrada digital
PORTA&=~(1<<1);//sale un 0 en el pin RA1
PORTB&=~(1<<4);//sale un 0 en el pin RB4
while(1){
PORTA^=(1<<1);//el pin RA1 cambia de estado
//if(PORTBbits.RB1==0){
if(!(PORTB&(1<<1))){//si por el pin RB1 llega un 0
PORTB^=(1<<4);//el pin RB4 cambia de estado
}
__delay_ms(100);//pausa de 100ms
}
return;
}
Esperamos de todo corazón ser de vuestra ayuda, no olviden suscribirse al canal de mrelberni, darle me gusta a los vídeos, compartirlos, que de esa manera nos ayudan a continuar, desde ya muchas gracias.
SIGUIENTE
Publicar un comentario