MICROCONTROLADOR PIC ENTRADAS SALIDAS DIGITALES

MICROCONTROLADOR PIC ENTRADAS SALIDAS DIGITALES

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.

microcontrolador pic registro trisb

Por ejemplo si el bit5 o bit TRISB5 del registro TRISB se pone a 0, el pin RB5 del puertoB será una salida digital; si el bit1 o bit TRISB1 se pone a 1, el pin RB1 será una entrada digital, como se observa los bits se cuentan del 0  al 7 de derecha a izquierda, esto será siempre así para cualquier otro registro.

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

Copyright © Electricidad y Electrónica. Designed by OddThemes