14
Objetivo Diseñar un programa en lenguaje C para realizar un desplazamiento de bits a través de un puerto del microcontrolador AT89LP6440, con la característica de poder definir la dirección del desplazamiento mediante una entrada digital. En el sistema físico se conectarán LEDs al puerto del microcontrolador para observar el desplazamiento mientras que la entrada digital será dada mediante un interruptor tipo fototransistor óptico. Introducción En este reporte se presenta la metodología seguida para el diseño de un algoritmo encargado de generar el desplazamiento de un bit a través de un registro en el microcontrolador AT89LP6440 pudiendo establecer la dirección en la que se hará el corrimiento del bit mediante una entrada al sistema; el algoritmo es posteriormente codificado mediante el lenguaje C para establecer las condiciones de operación en instrucciones que puedan ser ejecutadas por el microcontrolador mencionado, seguido de esto el sistema completo es simulado utilizando el software Proteus v7 para comprobar su funcionamiento. Finalmente el archivo generado mediante el lenguaje C es “grabado” en la memoria ROM del microcontrolador y el sistema es implementado físicamente, utilizando un fototransistor como el dispositivo que dará la entrada al sistema que determinará la dirección del corrimiento; la comprobación del funcionamiento del sistema es de forma visual, pudiendo observar el corrimiento de LEDs en la dirección determinada por el fototransistor. Marco Teórico En esta sección del reporte se presentan los aspectos básicos de teoría requeridos para comprender tanto el desarrollo del algoritmo para el corrimiento de LEDs bidireccional, como para la implementación del sistema físico.

Corrimiento Direccionado

Embed Size (px)

Citation preview

Page 1: Corrimiento Direccionado

ObjetivoDiseñar un programa en lenguaje C para realizar un desplazamiento de bits a través de un puerto del microcontrolador AT89LP6440, con la característica de poder definir la dirección del desplazamiento mediante una entrada digital. En el sistema físico se conectarán LEDs al puerto del microcontrolador para observar el desplazamiento mientras que la entrada digital será dada mediante un interruptor tipo fototransistor óptico.

IntroducciónEn este reporte se presenta la metodología seguida para el diseño de un algoritmo encargado de generar el desplazamiento de un bit a través de un registro en el microcontrolador AT89LP6440 pudiendo establecer la dirección en la que se hará el corrimiento del bit mediante una entrada al sistema; el algoritmo es posteriormente codificado mediante el lenguaje C para establecer las condiciones de operación en instrucciones que puedan ser ejecutadas por el microcontrolador mencionado, seguido de esto el sistema completo es simulado utilizando el software Proteus v7 para comprobar su funcionamiento. Finalmente el archivo generado mediante el lenguaje C es “grabado” en la memoria ROM del microcontrolador y el sistema es implementado físicamente, utilizando un fototransistor como el dispositivo que dará la entrada al sistema que determinará la dirección del corrimiento; la comprobación del funcionamiento del sistema es de forma visual, pudiendo observar el corrimiento de LEDs en la dirección determinada por el fototransistor.

Marco TeóricoEn esta sección del reporte se presentan los aspectos básicos de teoría requeridos para comprender tanto el desarrollo del algoritmo para el corrimiento de LEDs bidireccional, como para la implementación del sistema físico.

I/O del microcontrolador AT89LP6440Las entradas y salidas E/S (en inglés I/O Input/Output) son los puertos o vías por donde fluye la comunicación entre un sistema y los datos que se van a manejar. Los puertos I/O de un microcontrolador son utilizados para establecer conexión con los distintos dispositivos que se van a controlar a través de éste, su configuración previa definirá el comportamiento del puerto y dependiendo de ésta, serán las funciones que podrán ser realizadas a través de él [1].

Page 2: Corrimiento Direccionado

Práctica #2

Figura 1. Pines correspondientes a los puertos en el microcontrolador AT89LP6440.

El microcontrolador AT89LP6440 cuenta con cinco puertos de ocho pines físicos (exceptuando el puerto cuatro que cuenta con 6 pines) siendo posible configurar entre 35 y 38 pines. Estos puertos pueden ser configurados en cuatro diferentes modos de operación: “quasi-bidirectional” (estándar 8051 para puertos de salida), “push-pull output”, “open-drain output” e “input-only”. El estado inicial de los puertos, después de reiniciar el microcontrolador, puede ser “input-only” o “quasi-bidirectional” dependiendo de si se encuentra habilitada o no la variable denominada “Tristate-Port User Fuse”. Las entradas análogas siempre están al inicio en modo “input-only” [2]. Las características básicas de los modos de configuración son las siguientes:

Quasi-bidirectional: este modo tiene una función similar a la del estándar 8051. Un puerto configurado en este modo puede ser utilizado como entrada y salida sin la necesidad de reconfigurar el puerto.

Input-only Mode: esta configuración pone las salidas en estado de alta impedancia para capturar correctamente las entradas al sistema, además cuenta con un circuito para rechazar el ruido.

Open-drain Output: este modo “apaga” la condición pull-up, lo que hace necesario que se tenga esta condición de forma externa para su correcto funcionamiento, típicamente se utiliza una resistencia conectada a la fuente del sistema. Este modo es el mismo que se utilizaría como salida en el modo “Quasi-bidirectional”

Push-pull Output: esta configuración sigue la estructura pull-down del modo “open-drain” y “quasi-bidirectional” de salida, pero proporciona una corriente constante de pull-up cuando el puerto está a nivel lógico uno, eliminando así la necesidad de una resistencia de pull-up para mantener la corriente en el pin.

Sistemas con Microprocesador 3 de febrero de 2014

Page 3: Corrimiento Direccionado

Práctica #2

Programación de puertos en el microcontrolador AT89LP6440Independientemente del lenguaje de programación que se utilice, es necesario configurar los registros asociados con los puertos físicos del microcontrolador; por lo tanto se requiere de dos registros para configurar uno de los cuatro modos de operación posibles, lo cual consiste simplemente en asignar un valor determinado (dependiendo del modo deseado) a los registros PxM0 y PxM1 (donde x corresponde al puerto), estos valores son presentados en la siguiente figura [2].

Figura 2. Valores requeridos para configurar los diferentes modos de operación de los puertos I/O.

Para comprender correctamente esta asignación se presenta el siguiente ejemplo, se desea configurar todo el puerto dos en el modo “Push-pull Output”, para realizar esto es necesario modificar completamente los registros asociados P2M0 y P2M1 y establecer los siguientes valores (siguiendo la tabla de arriba).

P2M00 0 0 0 0 0 0 0

P2M11 1 1 1 1 1 1 1

Lo que es igual, en lenguaje C, a:P2M0 = 0x00P2M1 = 0xFF

Si se desea configurar el pin 2 y 5 del puerto uno en modo “Input Only” se deben modificar los registros asociados a este puerto P1M0 y P1M1 como sigue:

P1M0X X 1 X X 1 X X

P1M1X X 0 X X 0 X X

Lo que es igual, en lenguaje C, a:P1M0 |= 0x24

P1M1 &= 0xDB

Esto último modifica sólo las posiciones requeridas para configurar los pines deseados. Para cualquier otro caso se sigue la misma metodología, simplemente es necesario modificar las posiciones de los registros correspondientes a los pines que se desean configurar en algún modo de operación determinado, o en su defecto modificar los registros completos para afectar a todo el puerto.

Sistemas con Microprocesador 3 de febrero de 2014

Page 4: Corrimiento Direccionado

Práctica #2

FototransistorUn fototransistor es normalmente sensible a la luz infrarroja, ésta incide sobre la región de la base generando portadores en ella, llevándolo al estado de conducción y permitiendo el paso de corriente desde el colector al emisor, además de amplificar la corriente ligeramente debido a su efecto de ganancia [3].

El fototransistor puede trabajar como sigue:

Como transistor normal con la corriente de base ib (modo común)

Como fototransistor, cuando la luz que incide en la base hace que entre en modo de conducción (conducción entre colector y emisor).

El componente utilizado en esta práctica puede ser considerado un optoacoplador, éste es un dispositivo de emisión y recepción que funciona como un interruptor activado mediante la luz emitida por un diodo LED que satura un componente optoelectrónico, en este caso un fototransistor; combinando en un solo dispositivo semiconductor dos componentes conectados de forma óptica. Su funcionamiento es simple (la explicación es en base a la imagen de abajo) el voltaje y la resistencia en serie con el LED generan una

corriente en el LED emisor cuando se cierra el interruptor S1. Si la corriente proporciona

un nivel adecuado de luz, al incidir sobre el fototransistor, éste se saturará generando una

corriente en R2, de esta forma el voltaje de salida será igual a cero con S1 cerrado y V 2

con S1 abierto [4].

Figura 3. Configuración básica de un optoacoplador. El funcionamiento se resume en la tabla 1.

Tabla 1. Descripción del funcionamiento de un optoacoplador en base a la figura 3.¿LED emitiendo luz (energizado)? ¿Voltaje a la salida?

SI, LED encendido Voltaje de salida igual a cero V o=0vNO, LED apagado Voltaje de salida igual a V 2 V o=V 2

Sistemas con Microprocesador 3 de febrero de 2014

Page 5: Corrimiento Direccionado

Práctica #2

El dispositivo utilizado en esta práctica es el switch interruptor de corriente mediante un fototransistor QVE00832 el cual tiene las siguientes características principales [5]:

No hay contacto entre el interruptor (LED separado del fototransistor) Empaquetado opaco Transistor normalmente abierto Corriente continua de 60 mA Consumo de energía de 150 mW Voltaje máximo de emisor de 1.5 V Corriente máxima en colector de 14 mA

Figura 4. Fototransistor QVE00832 (dispositivo físico a la izquierda y esquemático a la derecha)

Figura 5. Diagrama de conexión del QVE00832 [5].

Material 1 Cristal de 12MHz 1 Capacitor de cerámica de 15 pF. 1 Capacitor electrolítico 10 μF 8 Resistencias 220Ω 2 Resistencias 10Ω 1 Resistencia 10k Ω 1 Push Botton 8 LEDs 1 Fototransitor QVE00832 1 Microcontrolador AT89LP6440 Fuente de Voltaje de 3.3 V (Arduino UNO) Protoboard

Sistemas con Microprocesador 3 de febrero de 2014

Page 6: Corrimiento Direccionado

Práctica #2

DesarrolloEl objetivo principal es lograr que un corrimiento de LEDs conectados al puerto uno del microcontrolador AT89LP6440, logre cambiar de dirección dependiendo de una entrada digital. Lo necesario para lograr esto es explicado a continuación.

Descripción del algoritmoEl algoritmo utilizado para cumplir el objetivo es prácticamente el mismo que se diseñó en la práctica pasada, el corrimiento de LEDs se realiza de la misma forma, esto se traduce a poner los bits en nivel alto o bajo en el registro correspondiente al puerto uno del microcontrolador. Inicialmente se pone el bit de mayor peso (o menor peso) en estado lógico uno, mientras los demás permanecen en estado lógico cero, esto se mantiene durante un periodo de tiempo en milisegundos, después de esto el bit en estado lógico uno es desplazado mediante la función ≪ o ≫ que simplemente recorre el registro un número definido de posiciones (en este caso una posición a la vez), al hacer esto el bit en nivel lógico uno pasa a tener un estado lógico cero y el bit siguiente de mayor peso (o menor peso) pasa a estar en estado lógico uno; esto está dentro de un ciclo infinito (“while”) por lo que al darse una iteración el bit en el registro se va desplazando siempre una posición.

Aunado a esto es importante determinar el momento adecuado para reiniciar el registro, ya que al darse un desplazamiento en éste y tener el bit en nivel lógico uno en la posición de mayor peso (o menor peso) el registro se desplazará y quedará sin ningún bit en estado lógico uno, para esto simplemente se utiliza una decisión (“if”) que verifica si el bit de mayor peso (o menor peso) está en uno lógico, de ser así reinicia el registro. Este algoritmo se repite indefinidamente, recorriendo un bit en el registro y reiniciándolo cuando es necesario, dando la apariencia de que el bit se desplaza y regresa al inicio al salir del registro.

Para establecer la dirección del desplazamiento, en el algoritmo, simplemente se verifica el valor de la entrada lógica en cada iteración del ciclo infinito ya mencionado, si el valor de la entrada es cero, el desplazamiento es del bit de mayor peso al de menor peso, si la entrada cambia a nivel alto, el desplazamiento se invierte. Cabe mencionar que al verificar la entrada lógica se utiliza una decisión doble (“if”) por lo que al no cumplirse un caso se ejecuta el otro, es decir, la sección de instrucciones utilizada para hacer el desplazamiento en el registro, es la misma en ambos casos dependientes de la entrada al sistema, solamente cambia la dirección del desplazamiento y por ende la verificación para el reinicio del registro, por lo que puede reutilizarse código en esta sección.

Código desarrollado en lenguaje CEl código utilizado para realizar el algoritmo explicado se presenta a continuación, el cual es prácticamente el utilizado en la práctica 1 [6], el código está comentado, facilitando la comprensión del mismo.

El código se divide en cuatro secciones principales: definición de librerías, inicialización de puertos (entradas y salidas) y variables, funciones de propósito específico y la función

Sistemas con Microprocesador 3 de febrero de 2014

Page 7: Corrimiento Direccionado

Práctica #2

principal (“main”). La utilización de funciones de propósito específico es con el fin de reutilizar código o simplificar operaciones, logrando un código más eficiente y organizado.

//Header Files#include <at89lp6440.h>

void inicializacion(void){ //Puerto 1 como salida cada bit define un pin //el bit de menor peso configura el puerto P1.0 el siguiente el P1.1 //y así sucesivamente P1M0 = 0x00; P1M1 = 0xFF; //P0.0 como entrada P0M0 = 0x01; P0M1 = 0x00;}//Función para introducir un retardo en la ejecución del programavoid delay(void){ unsigned int i; //definiendo variable para ciclo for for(i = 0; i < 65000; i++) //Ciclo for sin función alguna {}}

void reinicio(v_final, v_inicial){ delay(); //retardo en ejecución//Verificando si un bit específico (v_final) es igual en el puerto P1 if( (P1&v_final) == v_final ) { P1 = v_inicial; //Reiniciando el puerto P1 delay(); //retardo en ejecución }}

void main(void){ inicializacion(); //estableciendo configuración de puertos P1 = 0x01; //asignando valor a puerto P1 while(1) { if( (P0&0x01) == 0x01) //verificando valor de P0.0 para determinar dirección { reinicio(0x80, 0x01); //reiniciando puerto P1 P1 = P1 << 1; //corrimiento de un bit a la izquierda } else { reinicio(0x01, 0x80); //reiniciando puerto P1 P1 = P1 >> 1; //corrimiento de un bit a la derecha } }}

Sistemas con Microprocesador 3 de febrero de 2014

Page 8: Corrimiento Direccionado

Práctica #2

Circuito físico implementadoPrimeramente se presenta el circuito utilizado para dar la entrada al sistema que definirá la dirección del desplazamiento de LEDs, éste consta del dispositivo QVE00832, que como ya se mencionó, puede ser considerado como un optoacoplador que utiliza un LED para estimular a un fototransistor mediante luz. El diagrama del circuito se presenta en la imagen de abajo.

El funcionamiento de este circuito es simple, si algún cuerpo opaco está entre el LED y el transistor, la luz del primero no será recibida por el segundo y por ende el transistor estará “apagado” dando a la salida un nivel alto indicando que el desplazamiento es hacia la izquierda; por el contrario si no existe algo que obstruya la luz del LED sobre el fototransistor, éste último conducirá corriente cerrando el circuito, dando un cero lógico a la entrada del sistema.

Figura 6. Circuito para la entrada al sistema, compuesto principalmente por un QVE00832.

A continuación se presenta el diagrama del sistema completo implementado físicamente para probar el programa generado mediante lenguaje C para el corrimiento de LEDs bidireccional utilizando un fototransistor para definir la dirección del desplazamiento.

Sistemas con Microprocesador 3 de febrero de 2014

Page 9: Corrimiento Direccionado

Práctica #2

Figura 7. Circuito físico implementado, utilizando un el componente QVE00832 como entrada.

ResultadosCiertamente los resultados obtenidos de la implementación del código en lenguaje C diseñado son meramente visibles, es decir, no se pueden realizar tablas o gráficas para comprobar su funcionamiento, por tal motivo sólo se presentan algunas capturas del circuito físico en donde se puede apreciar la conexión de los dispositivos de entrada y salida, tales como el fototransistor y varios LEDs. También se puede observar que la fuente de alimentación para el sistema es un Arduino UNO, el cual es utilizado con la finalidad de obtener el voltaje de 3.3v requerido para su funcionamiento.

Sistemas con Microprocesador 3 de febrero de 2014

Page 10: Corrimiento Direccionado

Práctica #2

Figura 8. Conexión física del sistema, se puede observar la alimentación de 3.3v mediante el Arduino UNO y los LEDs utilizados para el desplazamiento en una dirección determinada por una

entrada al sistema.

Figura 9. En esta imagen se puede apreciar el fototransistor utilizado para dar la entrada al sistema y determinar la dirección del desplazamiento.

Bibliografía[1] Entrada/Salida. Wikipedia. <http://es.wikipedia.org/wiki/Entrada/salida>. (Consultado el 2 de febrero de 2014)

[2] Hoja de datos Microcontrolador AT89LP6440. <http://www.atmel.com/devices/at89lp6440.aspx>. (Consultado 2 de febrero de 2014)

[3] Fototransistor. Wikipedia. <http://es.wikipedia.org/wiki/Fototransistor>. (Consultado el 2 de febrero de 2014)

Sistemas con Microprocesador 3 de febrero de 2014

Page 11: Corrimiento Direccionado

Práctica #2

[4] Optoacoplador. Wikipedia. <http://es.wikipedia.org/wiki/Fototransist>. (Consultado el 2 de febrero de 2014)

[5] Hoja de datos QVE00832. <http://www.alldatasheet.es/datasheet-pdf/pdf/54388/FAIRCHILD/QVE00832.html>. (Consultado 2 de febrero de 2014)

[6] Valenzuela De La Cruz, Víctor Manuel. Práctica #1 - Corrimiento de LEDs. Universidad Autónoma de Ciudad Juárez. México. 2014

Sistemas con Microprocesador 3 de febrero de 2014