MICROCONTROLADOR AVR ENTRADAS SALIDAS DIGITALES

MICROCONTROLADOR AVR ENTRADAS SALIDAS DIGITALES  

microcontrolador avr entradas salidas digitales atmega88

Los pines del microcontrolador AVR pueden tener múltiples funciones, eso va depender del microcontrolador AVR que se utilice, en esta ocasión se verá el uso de estos pines como entradas o salidas digitales, será necesario tener siempre el PDF de la hoja de datos del microcontrolador que se utilice. 

Los pines de los microcontroladores AVR 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 ATMEGA88 tiene dos puertos de 8 pines cada uno el puertoB y el puertoD, mientras que el puertoC tiene 7 pines, la cantidad de puertos también variará dependiendo del modelo del microcontrolador AVR.

Cada uno de los pines del microcontrolador AVR 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  PB0,PB1, PB2, PB3, PB4, PB5, PB6, PB7.

Para la manipulación de los pines de microcontrolador AVR  ATMEGA88 como entradas salidas digitales, se cuenta con los registros DDRx, el PORTx y e PINx.

En adelante se tomará como ejemplo el microcontrolador AVR  ATMEGA88, 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 AVR.

La hoja de datos del ATMEGA88 se puede descargar desde aquí, la programación de los pines como entradas salidas digitales del microcontrolador AVR se realizará en lenguaje C con el XC8.

ENTRADAS SALIDAS DIGITALES AVR, EL REGISTRO DDRx

Mediante el registro DDRx se elige si los pines del microcontrolador AVR 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 B, entonces la x será B, si es un pin del puerto D, entonces la x será D, para los microcontroladores AVR de 8 bits, el registro DDRx está conformado por 8 bits; cada uno de esos bits controlará un pin del puerto al que pertenezca el registro DDRx 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 AVR se comporte como una salida digital, se tendrá que poner a 1 el bit correspondiente es su registro DDRx.

Para elegir que un pin de un puertoX del microcontrolador AVR se comporte como una entrada digital, se tendrá que poner a 0 el bit correspondiente es su registro DDRx.

La siguiente es una imagen del registro DDRB de un microcontrolador AVR.

microcontrolador avr entradas salidas digitales ddrb


Por ejemplo si el bit5 o bit DDB5 del registro DDRB se pone a 1, el pin PB5 del puertoB será una salida digital; si el bit1 o bit DDB1 se pone a 0, el pin PB1 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 DDRx, 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 entradas digitales

DDRB=0b00000000; //en binario

DDRB=0;                   //en decimal

DDRB=0x00;             //en hexadecimal

//todos los pines del puertoB como salidas digitales

DDRB=0b11111111; //en binario

DDRB=255;              //en decimal

DDRB=0xff;             //en hexadecimal

//algunos pines como entradas y otros como salidas digitales

DDRB=0b10101010; //en binario

DDRB=170;              //en decimal

DDRB=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 DDRB, pero en el XC8 se procede de la misma forma para cualquier otro registro del microcontrolador AVR 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 DDRB será aplicable a cualquier otro registro del microcontrolador AVR.

MICROCONTROLADORES AVR PROGRAMACIÓN BIT POR BIT DE UN REGISTRO

Se tomará para el ejemplo el caso del registro DDRB, pero el proceder será el mismo para cualquier otro registro.

Por ejemplo  si se quiere utilizar solo el pin PB0 como entrada digital, entonces el bit0 del registro DDRB se tendrá que poner a 0, para lograr esto se procede así:

DDRB &=~ (1<<0);//aquí se esta diciendo que el bit 0 del registro DDRB 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

DDRB=DDRB&~(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 DDRB, con lo que se logra que el bit0 del registro DDRB mediante la operación AND se ponga a 0, los demás bits del registro DDRB 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 DDRB, mediante esta operación se logra que el bit0 del registro DDRB se ponga a 0 y así establecer que el pin PB0 será utilizado como una entrada digital.

Por ejemplo si se necesita que el pin PB5 sea una entrada digital, se puede proceder así

DDRB &= ~(1<<5);//viene del lenguaje C

DDRB=DDRB&~(0b00100000);//forma completa de la anterior

Si se quiere por ejemplo que los pines PB1, PB4 y PB7 sean entradas digitales, esto en una sola línea utilizando el operador de bits OR | sería así:

DDRB &=~ ((1<<1) | (1<<4) | (1<<7)); //viene del lenguaje C

Por ejemplo  si se quiere utilizar solo el pin PB0 como salida digital, entonces el bit0 del registro DDRB se tendrá que poner a 1, para lograr esto se procede así:

DDRB |= (1<<0);//aquí se esta diciendo que el bit 0 del registro DDRB 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

DDRB=DDRB|(0b00000001);

Se realiza la operación OR entre el número binario y registro DDRB, con lo que se logra que el bit0 del registro DDRB 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 DDRB 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 DDRB, mediante esta operación se logra que el bit0 del registro DDRB se ponga a 1 y así establecer que el pin PB0 será utilizado como una salida digital.

Por ejemplo si se necesita que el pin pB5 sea una salida digital, se puede proceder así

DDRB |=(1<<5);//viene del lenguaje C

DDRB=DDRB|(0b00100000);//forma completa de la anterior

Si se quiere por ejemplo que los pines PB1, PB4 y PB7 sean salidas digitales, esto en una sola lìnea utilizando el operador de bits OR | sería así:

DDRB |=((1<<1) | (1<<4) | (1<<7));//viene del lenguaje C


ENTRADAS SALIDAS DIGITALES AVR, EL REGISTRO PORTx

Cuando algún pin o pines del microcontrolador AVR 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 DDRB 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 O 0V, mientras que por los pines pares se obtendrán unos o altos o 5V.

PORTB=0b01010101;

si se quiere que solo por el pin PB3 salga un 1 O 5V será así

PORTB |= (1<<3);//viene del lenguaje C

si se quiere que por los pines PB5 y PB2 salgan unos sería así:

PORTB |= ((1<<2)|(1<<5));//viene del lenguaje C


Cuando algún pin o pines del microcontrolador AVR se han configurado como entradas digitales mediante los bits del registro PORTx se activarán unas resistencias pull up internas que el microcontrolador AVR tiene en cada pin en sus puertos.

Por ejemplo si todos los pines del puerto B son utilizados como entradas digitales se puede

y se hace lo siguiente:

PORTB=0b11111111; //en binario, también se puede hacer en decimal o hexadecimal.

se estarán habilitando todas las resistencias pull up internas correspondientes a puertoB

Si por el contrario se hace:

PORTB |= (1<<3);//viene del lenguaje C

Se estará habilitando solo la resistencia pull up correspondiente al pin PB3.

Es muy importante tener en cuenta que el microcontrolador AVR tiene un registro llamado MCUCR, ver la hoja de datos del ATMEGA88, este registro tiene un un bit llamado PUD que es el bit4 en este caso, si este bit se pone a 1, las resistencias pull up se desactivan definitivamente, no haciendo caso al registro PORTx, cuando sus pines son utilizados como entradas digitales.

ENTRADAS SALIDAS DIGITALES AVR, EL REGISTRO PINx

mediante los bits del registro PINx 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í

uint8_t estados;//variable entera sin signo de 8 bits

estados=PINB;//en la variable de 8 bits se guarda los estados de los pines del PUERTO B


ENTRADAS SALIDAS DIGITALES AVR CIRCUITO EJEMPLO

El siguiente es un ejemplo de como programar algunos pines del microcontrolador ATMEGA88 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.

Entradas salidas digitales AVR x


Se programan 2 pines como salidas digitales y un pin como entrada digital, en los pines utilizados como salidas digitales se conectarán 2 leds que parpadearán en forma alternada, en la entrada  digital se tendrá un pulsador mediante el cual se enviarán ceros a dicha entrada, el microcontrolador AVR al detectar estos ceros, cambiará el tiempo  de parpadeo de los leds.

Los pines PB1 y PB2 serán las salidas digitales y el pin PD7 será la entrada digital.

El código realizado en el XC8 para el  ejemplo es el siguiente:



#define F_CPU 20000000UL //velocidad del oscilador 20MHz
#include <avr/io.h>//necesario para las definciones de los registros
                            //y pines del AVR
#include <util/delay.h>//necesario para poder hacer pausas con delay

uint16_t tiempo=500;//variable que controlará el tiempo

int main(void) {
    DDRB|=(1<<1);//pin PB1 como salida digital
    DDRB|=(1<<2);//pin PB2 como salida digital
    
    PORTB&=~(1<<1);//pin PB1 inicia apagado
    PORTB|=(1<<2);//pin PB2 inicia encendido
    
    DDRD&=~(1<<7);//pin  PD7 como entrada digital
    PORTD|=(1<<7);//habilita resistencia interna pull up del pin PD7
        
    while (1) {//ciclo principal del programa
        PORTB^=(1<<1);//pin PB1 cambia de estado
        PORTB^=(1<<2);//pin PB2 cambia de estado
        
        for(uint16_t i=0;i<tiempo; i++){//pausa para ver los cambios en los leds 
            _delay_ms(1);//pausa de 1ms
        }

        if(!(PIND&(1<<7))){//si al pin PD7 le llega un 0
            _delay_ms(100);//pausa necesaria para que no afecten los rebotes
            
            tiempo-=50;//el tiempo de alternancia de los leds disminuirá
            if(tiempo<=0){//si tiempo se hace menor o igual a 0
                tiempo=500;//la variable tiempo se vuelve iniciar a 1000
            }
        }
        
    }
}


Todo el proceso seguido está comentado en el siguiente vídeo.



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