linea8

Microcontroladores
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


linea8

 

 

 

PUERTOS DE ENTRADA Y SALIDA EN UN MICROCONTROLADOR

 

Estructura básica realizada  para utilizar los puertos de un  microcontrolador

Figura 1.- Diagrama a bloques utilizado para el manejo de puertos en el microcontrolador ATMEGA32

 

 

PRACTICAS  REALIZADAS

PRACTICA #1: Duplique la lectura.

PRACTICA #2: Despliegue de la lectura mayor de tres puertos.

PRÁCTICA #3: Luces.

 

OBJETIVOS GENERALES:

 

INTRODUCCIÓN

La programación para el manejo de puertos es hasta cierto punto sencilla ya que esta  basada en el lenguaje de programación orientada a objetos C, de ahí el nombre del  software utilizado ICC AVR el cual sirve para programar el microcontrolador, los pasos a seguir en este tipo de programación es la siguiente;

 

  1. Se crea un proyecto para que dentro de esté, se escriba el programa; el programa se  guarda con la extensión “.C”, verbigracia duplica.c

 

  1. El primer paso para realizar el programa es escribir el nombre del microcontrolador a utilizar con la siguiente expresión , en este caso es # include  <iom32.h> ya que se esta trabajando con el microcontrolador ATMEGA32 (la función de esta librería es que el software reconozca instrucciones como DDR ó PIN que sirven para configurar y leer los puertos respectivamente)

 

  1. Se declaran las variables a utilizar ya sea de tipo carácter  ( char ), entero (int), etc.  //Para declarar una variable es de la siguiente forma char fabi, miri;  Int e;

 

  1. Se escribe la función que indica  el cuerpo del programa  el cual inicia con VOID MAIN ( ), qué es eso de " void main"  Es algo que debe existir siempre, e indica el punto en el que realmente comenzará a funcionar el programa. Después de "void main" van dos llaves {  }, que delimitan lo que realmente es el cuerpo del programa.

 

  1. Se escribe un ciclo para que la función del programa se realice varias veces , puede ser un FOR, WHILE, DO WHILE

 

  1. Se configuran los puertos en  notación hexadecimal, si es de entrada se declaran en ceros y si es de salida en unos, (recuerda que cada puerto tiene 8 bits y que cada bit puede ser en forma indistinta de entrada o salida) para declararlos se usa el siguiente código DDRX, donde X es el puerto a utilizar A,B,C ó D.

Ejemplo: DDRA=0 este puerto es declarado de entrada; DDRB=0xFF este es de salida.

 

  1. Se lee el puerto con el siguiente código PINX y se almacena en una variable. Ejemplo: lecta=PINA (así es la estructura  para indicarle al software,que quiero conocer el valor del puerto a)

 

  1. Se escribe funciones especificas que se requieren,  que realice el  programa

 

  1. Se corre el programa con shift+F9

 

IMPORTANTE

Antes de correr el programa debes de ingresar a tools  y elegir la opción in system programming; ahí debes elegir el tipo de tarjeta con el que se esta trabajando y el puerto serial (com1, com2, com3, etc.),

 

 

Debes elegir el tipo de tarjeta con el que se esta trabajando y si estas trabajando con la STK500 debes elegir el   puerto serial com1, com2, com3, etc., ó si estas trabajando la  STK-200/300 debes elegir  el puerto paralelo LTP1,  LTP2,  LTP3

 

 

También debes ingresar a project y elegir options para indicarle al software que microcontrolador se va a utilizar.

 

 

 

 

 

 

 

Componentes básicos de la tarjeta STK500 de ATMEL

 

 

 

 

 

 

 

PRACTICA 1

 Duplique la lectura.

Objetivos:

·        Al tener un valor por el puerto A duplicar su valor y escribirlo por el puerto B.

·        Conocer los diferentes caminos para lograr el duplicado de valores.

 

 

 

            Lea el puerto A duplique la lectura y escriba el resultado en el puerto B          

 

 

 

#include<iom32v.h>    //Librería exclusiva del ATMEGA32
char lecta;
void main()
{

 while (1) {
// configurar puertos a,b
   DDRA=0;
   DDRB=0XFF;
 
// Lectura porta
         
         lecta=PINA;
        
// duplica porta
           
lecta*=2;

// escribe portb
         PORTB=lecta;
           
             }
}

 

#include<iom32v.h>    //Librería exclusiva del ATMEGA32
char lecta;
void main()
{

 while (1) {
// configurar puertos a,b
   DDRA=0;
   DDRB=0XFF;
 
// Lectura porta
         
         lecta=PINA;
        
// escribe portb
         PORTB=lecta<<1;
           
             }
}

 

 

Para resolver la problemática existen dos formas posibles de solución la primera que podemos observar es multiplicar la lectura por dos, (lecta *=2) y desplegar el valor por el puerto B el cual en este caso lo conectamos a los leds de la STK500.

 

La otra forma es desplazar un lugar a la izquierda la lectura, esto se logra con la expresión <<1, la lógica consiste que tenemos 8 bits, cuyos valores en decimal son los siguientes, podemos observar que si te desplazas a la izquierda los valores se van duplicando lo que resuelve la problemática.

 

128

64                      

32

16

8

4

2

1

 

 

 

PRACTICA 2.

                          Despliegue de la lectura mayor de tres puertos.

Objetivo:

·        Al tener un valor por el puerto A, B y C comparar los tres valores y desplegar por los leds del puerto D el valor más alto.

 

 

El microcontrolador leerá tres de sus cuatro puertos y desplegara por el puerto D la lectura más grande hecha en los otros tres puertos.

 

Programa realizado en ICCAVR

#include<iom32v.h>    //Librería exclusiva del ATMEGA32

Char lecta, lectb, lectc:

Void main(){

// configurar puertos

DDRA=0;

            DDRB=0;

            DDRC=0;

            DDRD=0 x FF;

// lectrura de puertos

            Lecta = PINA;

            Lectb = PINB;

            Lectc = PINC;

// comparaciones

            If 

                  (lecta>lectb&lecta>lectc) than

                    portd=lecta

If 

                  (lectb>lecta&lectb>lectc) than

                    portd=lectb

If 

                  (lectc>lectb&lectc>lecta) than

                    portd=lectc

}

 

 

 

 

PRACTICA 3. Luces.

 

 

 #include<iom32v.h>
char lecta;
int i,x;
void delay (char t);

void main()
{
while (1)
         {
       DDRA=0;
       DDRB=0xFF;
       lecta=PINA;
/////////////////////////////////////////boton1
                   if (lecta==0xFE){
                                for (lecta=2;lecta<255;lecta++)
                                           {
                               lecta*=2;
                                PORTB=lecta;
                       delay(20);
                             
                                      }                   
                             }
/////////////////////////////////////////boton2                      
                        if(lecta==0xFD){
                               for(lecta=255;lecta>0;lecta--)
                                   {
                                lecta*2;
                                PORTB=lecta;
                                delay(20);
                                lecta=lecta/2;
                                                 }
                                    }
             
////////////////////////////////////////boton3
if (lecta==0XFB){
                  for (lecta=2;lecta<255;lecta++)
                                           {
                             lecta*=2;
                             PORTB=lecta;
                    delay(15);
                                        }
                        for(lecta=255;lecta>0;lecta--)
                                   {
                             lecta*2;
                             PORTB=lecta;
                             delay(15);
                             lecta=lecta/2;
                                                 }
                              }
             
//////////////////////////////////////boton 4
                        if (lecta==0XF7){
                         for (lecta=2;lecta<255;lecta++)
                              lecta*=2;
                             PORTB=lecta;
                    delay(10);
                           for(lecta=1;lecta>0;lecta--)
                              lecta*2;
                             PORTB=lecta;
                             delay(10);
                             lecta=lecta/2;
                                         }                   
          }
//while 1
      }
// main
  void delay (char t)
  {
 int i; 
 while (t>0)
 {
   for (i=0;i<5000;i++);
  t--;
                                    }
                            }

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Hosted by www.Geocities.ws

1