Vous êtes sur la page 1sur 94

MANUAL DE PRCTICAS

Manual de Prcticas
PROGRAMACIN DE SISTEMAS INTEGRADOS EMBEBIDOS OPTATIVA I. INGENIERA EN MECATRNICA

Contenido
INTRODUCCIN. .................................................................................................................................. 1 Conexin bsica............................................................................................................................... 1 Alimentacin ............................................................................................................................... 1 Seal de reinicio .......................................................................................................................... 2 Seal de reloj ............................................................................................................................... 2 Cristal de cuarzo .......................................................................................................................... 2 Resonador cermico.................................................................................................................... 3 Oscilador RC ................................................................................................................................ 3 Oscilador externo ........................................................................................................................ 3 Componentes adicionales ............................................................................................................... 4 Interruptores y botones de presin ............................................................................................ 4 Rel .............................................................................................................................................. 5 Diodos LED................................................................................................................................... 6 Quemar con rapidez .................................................................................................................... 6 Quemar lentamente .................................................................................................................... 7 Algo para recordar ...................................................................................................................... 7 Display LED .................................................................................................................................. 7 Optoacopladores ....................................................................................................................... 10 Display LCD ................................................................................................................................ 10 Pines del display LCD ................................................................................................................. 11 Pantalla LCD............................................................................................................................... 11 Memoria LCD ............................................................................................................................. 12 Memoria DDRAM ...................................................................................................................... 12 Memoria CGROM ...................................................................................................................... 13 Memoria CGRAM ...................................................................................................................... 14 i

MANUAL DE PRCTICAS Comandos bsicos del visualizador LCD .................................................................................... 15 Qu es una bandera de ocupado (busy flag)? ......................................................................... 16 Conectar al visualizador LCD ..................................................................................................... 16 Inicializar al visualizador LCD..................................................................................................... 17 Unidad I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES ............................................. 18 Prctica 1.1 Conexiones bsicas y encendido de leds ................................................................... 18 Descripcin P1.1: ....................................................................................................................... 18 Cdigo P1.1: .............................................................................................................................. 18 Circuito P1.1: ............................................................................................................................. 19 Actividades P1.1: ....................................................................................................................... 19 Prctica 1.2 Oscilador interno y ciclos de repeticin .................................................................... 19 Descripcin P1.2: ....................................................................................................................... 19 Cdigo P1.2: .............................................................................................................................. 20 Circuito P1.2: ............................................................................................................................. 21 Actividades P1.2 ........................................................................................................................ 21 Prctica 1.3 Ciclos anidados .......................................................................................................... 21 Descripcin P1.3: ....................................................................................................................... 21 Cdigo P1.3: .............................................................................................................................. 22 Circuito P1.3: ............................................................................................................................. 23 Actividades P1.3 ........................................................................................................................ 23 Prctica 1.4 Temporizador TMR0 e interrupciones ...................................................................... 23 Descripcin P1.4: ....................................................................................................................... 23 Cdigo P1.4: .............................................................................................................................. 23 Circuito P1.4: ............................................................................................................................. 25 Actividades P1.4 ........................................................................................................................ 25 Prctica 1.5 Uso de botones y subrutinas ..................................................................................... 25 Descripcin P1.5: ....................................................................................................................... 25 Cdigo P1.5: .............................................................................................................................. 26 Circuito P1.5: ............................................................................................................................. 27 Actividades P1.5 ........................................................................................................................ 27 Prctica 1.6 Temporizador TMR0 como contador, variables y relevadores ................................. 27 Descripcin P1.6: ....................................................................................................................... 27 ii

MANUAL DE PRCTICAS Cdigo P1.6: .............................................................................................................................. 28 Circuito P1.6: ............................................................................................................................. 29 Actividades P1.6 ........................................................................................................................ 29 Prctica 1.7 Macros y rutinas para evitar el rebote de botones ................................................... 29 Descripcin P1.7: ....................................................................................................................... 29 Cdigo P1.7: .............................................................................................................................. 30 Circuito P1.7: ............................................................................................................................. 32 Actividades P1.7 ........................................................................................................................ 32 Prctica 1.8 Temporizador TMR1 e interrupciones ...................................................................... 33 Descripcin P1.8: ....................................................................................................................... 33 Cdigo P1.8: .............................................................................................................................. 33 Circuito P1.8: ............................................................................................................................. 34 Actividades P1.8 ........................................................................................................................ 34 Prctica 1.9 Temporizador TMR2 y configuracin del oscilador ................................................... 34 Descripcin P1.9: ....................................................................................................................... 34 Cdigo P1.9: .............................................................................................................................. 35 Circuito P1.9: ............................................................................................................................. 36 Actividades P1.9 ........................................................................................................................ 36 Prctica 1.10 Modulo CCP 1 como generador de seales tipo PWM ........................................... 36 Descripcin P1.10: ..................................................................................................................... 36 Cdigo P1.10: ............................................................................................................................ 37 Circuito P1.10: ........................................................................................................................... 39 Actividades P1.10 ...................................................................................................................... 39 Prctica 1.11 Uso del convertidor analgico-digital (ADC) .......................................................... 39 Descripcin P1.11: ..................................................................................................................... 39 Cdigo P1.11: ............................................................................................................................ 40 Circuito P1.11: ........................................................................................................................... 40 Actividades P1.11 ...................................................................................................................... 41 Prctica 1.12 Uso de la memoria EEPROM ................................................................................... 41 Descripcin P1.12: ..................................................................................................................... 41 Cdigo P1.12: ............................................................................................................................ 41 Circuito P1.12: ........................................................................................................................... 43 iii

MANUAL DE PRCTICAS Actividades P1.12 ...................................................................................................................... 43 Prctica 1.13 Contador de dos dgitos multiplexado .................................................................... 43 Descripcin P1.13: ..................................................................................................................... 43 Cdigo P1.13: ............................................................................................................................ 44 Circuito P1.13: ........................................................................................................................... 47 Actividades P1.13 ...................................................................................................................... 47 Prctica 1.14 Generacin de sonidos usando macros .................................................................. 47 Descripcin P1.14: ..................................................................................................................... 47 Cdigo P1.14: ............................................................................................................................ 47 Circuito P1.14: ........................................................................................................................... 49 Actividades P1.14 ...................................................................................................................... 50 Prctica 1.15 Uso del display de cristal lquido (LCD) ................................................................... 50 Descripcin P1.15: ..................................................................................................................... 50 Cdigo P1.15: ............................................................................................................................ 50 Circuito P1.15: ........................................................................................................................... 54 Actividades P1.15 ...................................................................................................................... 54 Prctica 1.16 Comunicacin serial RS232...................................................................................... 54 Descripcin P1.16: ..................................................................................................................... 54 Cdigo P1.16: ............................................................................................................................ 55 Circuito P1.16: ........................................................................................................................... 57 Actividades P1.16 ...................................................................................................................... 58 Unidad II PROGRAMACIN DE MICROCONTROLADORES CON ELEMENTOS DE LENGUAJE C .......... 59 Prctica 2.1 Encendido de leds y configuraciones bsicas. ........................................................... 59 Descripcin P2.1: ....................................................................................................................... 59 Circuito P2.1: ............................................................................................................................. 59 Cdigo P2.1: .............................................................................................................................. 59 Prctica 2.2 Oscilador interno y mezcla de lenguaje ensamblador y C............................................ 60 Descripcin P2.2: ....................................................................................................................... 60 Circuito P2.2: ............................................................................................................................. 61 Cdigo P2.2: .............................................................................................................................. 61 Prctica 2.3 Temporizador TMR0 como contador, variables y relevadores ................................. 62 Descripcin P2.3: ....................................................................................................................... 62 iv

MANUAL DE PRCTICAS Circuito P2.3: ............................................................................................................................. 62 Cdigo P2.3: .............................................................................................................................. 63 Prctica 2.4 Temporizadores TMR0, TMR1 y TMR2 e interrupciones .......................................... 63 Descripcin P2.4: ....................................................................................................................... 63 Circuito P2.4: ............................................................................................................................. 64 Cdigo P2.4: .............................................................................................................................. 64 Prctica 2.5 Uso del watchdog timer (perro guardin) ............................................................. 67 Descripcin P2.5: ....................................................................................................................... 67 Circuito P2.5: ............................................................................................................................. 67 Cdigo P2.5: .............................................................................................................................. 67 Prctica 2.6 Modulo CCP 1 como generador de seales tipo PWM ............................................. 68 Descripcin P2.6: ....................................................................................................................... 68 Circuito P2.6: ............................................................................................................................. 68 Cdigo P2.6: .............................................................................................................................. 69 Prctica 2.7 Uso del convertidor analgico-digital (ADC) ............................................................ 69 Descripcin P2.7: ....................................................................................................................... 69 Circuito P2.7: ............................................................................................................................. 70 Cdigo P2.7: .............................................................................................................................. 70 Prctica 2.8 Uso de la memoria EEPROM ......................................................................................... 71 Descripcin P2.8: ....................................................................................................................... 71 Circuito P2.8: ............................................................................................................................. 71 Cdigo P2.8: .............................................................................................................................. 72 Prctica 2.9 Contador de dos dgitos multiplexado ...................................................................... 72 Descripcin P2.9: ....................................................................................................................... 72 Circuito P2.9: ............................................................................................................................. 73 Cdigo P2.9: .............................................................................................................................. 73 Prctica 2.10 Uso del display de cristal lquido (LCD) ................................................................... 74 Descripcin P2.10: ..................................................................................................................... 74 Circuito P2.10: ........................................................................................................................... 75 Cdigo P2.10: ............................................................................................................................ 75 Prctica 2.11 Comunicacin serial RS232...................................................................................... 76 Descripcin P2.11: ..................................................................................................................... 76 v

MANUAL DE PRCTICAS Circuito P2.11: ........................................................................................................................... 77 Cdigo P2.11: ............................................................................................................................ 77 Prctica 2.12 Generacin de sonidos utilizando una librera ........................................................ 78 Descripcin P2.12: ..................................................................................................................... 78 Circuito P2.12: ........................................................................................................................... 78 Cdigo P2.12: ............................................................................................................................ 78 Unidad III CONTROL Y MONITOREO DE SISTEMAS AUTOMTICOS .................................................. 80 Prctica 3.1 Control de un motor de DC mediante un puente H .................................................. 80 Descripcin P3.1: ....................................................................................................................... 80 Circuito P3.1: ............................................................................................................................. 80 Cdigo P3.1: .............................................................................................................................. 81 Prctica 3.2 Control de un motor de pasos ................................................................................... 81 Descripcin P3.2: ....................................................................................................................... 81 Circuito P3.2: ............................................................................................................................. 82 Cdigo P3.2: .............................................................................................................................. 83 Prcticas 3.3 Control de un servo motor....................................................................................... 83 Descripcin P3.3: ....................................................................................................................... 83 Circuito P3.3: ............................................................................................................................. 84 Cdigo P3.3: .............................................................................................................................. 84 Prctica 3.4 Control de temperatura tipo ON/OFF ....................................................................... 85 Descripcin P3.4: ....................................................................................................................... 85 Circuito P3.4: ............................................................................................................................. 85 Cdigo P3.4: .............................................................................................................................. 85 Prctica 3.5 Modulo remoto de medicin y control. 3 sensores, 2 actuadores, comunicacin mediante RS232, modo de control remoto mediante PC, modo de control local mediante botones. ........................................................................................................................................ 85 Descripcin P3.5: ....................................................................................................................... 85 Circuito P3.5: ............................................................................................................................. 86 Cdigo P3.5: .............................................................................................................................. 86 Formato de reportes ......................................................................................................................... 87 Criterios y ponderaciones de evaluacin .......................................................................................... 88

vi

INTRODUCCIN

INTRODUCCIN.
El propsito de este manual es proporcionar la informacin bsica que se necesita saber para ser capaz de utilizar microcontroladores con xito en la prctica. Por eso, este manual no contiene ningn programa demasiado elaborado, tampoco dispone de un esquema de dispositivo con soluciones extraordinarias. Por el contrario, la intensin de este manual es mostrar el gran potencial y la facilidad con la que se programan y manejan los microcontroladores. El manual contiene una serie de ejemplos cuyo objetivo es brindar de herramientas al lector para el desarrollo de aplicaciones de propsito especfico, como la realizacin de proyecto finales de muy buena calidad.

Conexin bsica
Para que un microcontrolador funcione apropiadamente es necesario proporcionar lo siguiente: Alimentacin; Seal de reinicio; y Seal de reloj.

Como se muestra en la figura anterior, se trata de circuitos simples, pero no tiene que ser siempre as. Si el dispositivo destino se utiliza para controlar mquinas costosas o para mantener funciones vitales, todo se vuelve mucho ms complicado. Alimentacin Aunque el PIC16F887 es capaz de funcionar a diferentes voltajes de alimentacin, no es recomendable probar la ley de Murphy. Lo ms adecuado es proporcionar un voltaje de alimentacin de 5V en CD. El circuito anterior, utiliza un regulador de voltaje positivo de tres terminales LM7805. Es un regulador integrado y barato que proporciona una estabilidad de voltaje 1

INTRODUCCIN de alta calidad y suficiente corriente para habilitar el funcionamiento apropiado del controlador y de los perifricos (aqu suficiente significa una corriente de 1A). Seal de reinicio Para que un microcontrolador pueda funcionar apropiadamente, un uno lgico (VCC) se debe colocar en el pin de reinicio. El botn de presin que conecta el pin MCLR a GND no es necesario. Sin embargo, este botn casi siempre est proporcionado ya que habilita al microcontrolador volver al modo normal de funcionamiento en caso de que algo salga mal. Al pulsar sobre el botn RESET, se lleva un voltaje de 0V al pin MCLR, el microcontrolador se reinicia y la ejecucin de programa comienza desde el principio. Se utiliza una resistencia de 10k para impedir un corto circuito a tierra al presionar este botn. Seal de reloj A pesar de tener un oscilador incorporado, el microcontrolador no puede funcionar sin componentes externos que estabilicen su funcionamiento y determinen su frecuencia (velocidad de operacin del microcontrolador). Dependiendo de los elementos utilizados as como de las frecuencias el oscilador puede funcionar en cuatro modos diferentes: LP - Cristal de bajo consumo; XT - Cristal / Resonador; HS - Cristal/Resonador de alta velocidad; y RC - Resistencia / Condensador.

Como es casi imposible construir un oscilador estable que funcione a un amplio rango de frecuencias, el microcontrolador tiene que saber a qu cristal est conectado, para poder ajustar el funcionamiento de sus componentes internos. sta es la razn por la que todos los programas utilizados para escribir un programa en el chip contienen una opcin para seleccionar el modo de oscilador. Cristal de cuarzo Al utilizar el cristal de cuarzo para estabilizar la frecuencia, un oscilador incorporado funciona a una frecuencia determinada, y no es afectada por los cambios de temperatura y de voltaje de alimentacin. Esta frecuencia se etiqueta normalmente en el encapsulado del cristal. Aparte del cristal, los condensadores C1 y C2 deben estar conectados como se muestra en el siguiente esquema. Su capacitancia no es de gran importancia. Por eso, los valores proporcionados en la siguiente tabla se deben tomar como recomendacin y no como regla estricta.

INTRODUCCIN Resonador cermico Un resonador cermico es ms barato y muy similar a un cuarzo por la funcin y el modo de funcionamiento. Por esto, los esquemas que muestran su conexin al microcontrolador son idnticos. No obstante, los valores de los condensadores difieren un poco debido a las diferentes caractersticas elctricas. Refirase a la tabla que est a continuacin.

Estos resonadores se conectan normalmente a los osciladores en caso de que no sea necesario proporcionar una frecuencia extremadamente precisa. Oscilador RC Si la frecuencia de operacin no es de importancia, entonces no es necesario utilizar los componentes caros y adicionales para la estabilizacin. En vez de eso, basta con utilizar una simple red RC, mostrada en la siguiente figura. Como aqu es utilizada slo la entrada del oscilador local, la seal de reloj con la frecuencia Fosc/4 aparecer en el pin OSC2. sta es la frecuencia de operacin del microcontrolador, o sea la velocidad de ejecucin de instrucciones.

Oscilador externo Si se requiere sincronizar el funcionamiento de varios microcontroladores o si por alguna razn no es posible utilizar ninguno de los esquemas anteriores, una seal de reloj se puede generar por un oscilador externo. Refirase a la siguiente figura.

INTRODUCCIN A pesar del hecho de que el microcontrolador es un producto de la tecnologa moderna, no es tan til sin estar conectado a los componentes adicionales. Dicho de otra manera, el voltaje llevado a los pines del microcontrolador no sirve para nada si no se utiliza para llevar a cabo ciertas operaciones como son encender/apagar, desplazar, visualizar, etc.

Componentes adicionales
Esta parte trata los componentes adicionales utilizados con ms frecuencia en la prctica, tales como resistencias, transistores, diodos LED, visualizadores LED, visualizadores LCD y los circuitos de comunicacin RS-232. Interruptores y botones de presin Los interruptores y los botones de presin son dispositivos simples para proporcionar la forma ms simple de detectar la aparicin de voltaje en un pin de entrada del microcontrolador. No obstante, no es tan simple como parece... Uno de los principales problemas es el rebote de contacto. El rebote de contacto es un problema comn en los interruptores mecnicos.

Al tocarse los contactos, se produce un rebote por su inercia y elasticidad. Por consiguiente, la corriente elctrica es rpidamente pulsada en lugar de tener una clara transicin de cero a la corriente mxima. Por lo general, esto ocurre debido a las vibraciones, los desniveles suaves y la suciedad entre los contactos. Este efecto no se percibe normalmente al utilizar estos componentes en la vida cotidiana porque el rebote ocurre demasiado rpido para afectar a la mayora de los dispositivos elctricos. Sin embargo, pueden surgir problemas en algunos circuitos lgicos que responden lo suficientemente rpido de manera que malinterpreten los pulsos producidos al tocarse los contactos como un flujo de datos. De todos modos, el proceso entero no dura mucho (unos pocos micro o milisegundos), pero dura lo suficiente para que lo detecte el microcontrolador. Al utilizar slo un botn de presin como una fuente de seal de contador, en casi 100% de los casos ocurren los errores. El problema se puede resolver con facilidad al conectar un simple circuito RC (filtro) para suprimir rpidos cambios de voltaje. Como el perodo del rebote no est definido, los valores de los componentes no estn precisamente determinados. En la mayora de los casos es recomendable utilizar los valores que se muestran en la siguiente figura. 4

INTRODUCCIN

Si se necesita una estabilidad completa, entonces hay que tomar medidas radicales. La salida del circuito, mostrado en la siguiente figura (biestable RS, tambin llamado flip flop RS), cambiar de estado lgico despus de detectar el primer pulso producido por un rebote de contacto. Esta solucin es ms cara (interruptor SPDT), pero el problema es resuelto.

Aparte de estas soluciones de hardware, hay tambin una simple solucin de software. Mientras el programa prueba el estado de circuito lgico de un pin de entrada, si detecta un cambio, hay que probarlo una vez ms despus de un cierto tiempo de retardo. Si el programa confirma el cambio, esto significa que un interruptor/botn de presin ha cambiado de posicin. Las ventajas de esta solucin son obvias: es gratuita, se borran los efectos del rebote de contacto y se puede aplicar a los contactos de una calidad ms baja tambin. Rel Un rel es un interruptor elctrico que se abre y se cierra bajo el control de otro circuito electrnico. Por eso est conectado a los pines de salida del microcontrolador y utilizado para encender/apagar los dispositivos de alto consumo tales como: motores, transformadores, calefactores, bombillas, etc. Estos dispositivos se colocan casi siempre lejos de los componentes sensibles de la placa. Hay varios tipos de rels, pero todos funcionan de la misma manera. Al fluir la corriente por la bobina, el rel funciona por medio de un electromagneto, abriendo y cerrando uno o ms conjunto de contactos. Similar a los optoacopladores no hay conexin galvnica (contacto elctrico) entre los circuitos de entrada y salida. Los rels requieren con frecuencia tanto un voltaje ms alto y una corriente ms alta para empezar a funcionar. Tambin hay rels miniatura que se pueden poner en marcha por una corriente baja obtenida directamente de un pin del microcontrolador.

INTRODUCCIN

La figura que sigue muestra la solucin utilizada con ms frecuencia.

Para prevenir la aparicin de un alto voltaje de autoinduccin, causada por una parada repentina del flujo de corriente por la bobina, un diodo polarizado invertido se conecta en paralelo con la bobina. El propsito de este diodo es de cortar este pico de voltaje. Diodos LED Probablemente sepa todo lo que necesita saber sobre los diodos LED, pero tambin debe pensar en los jvenes... A ver, cmo destruir un LED? Bueno... muy fcil.

Quemar con rapidez Como cualquier otro diodo, los LED tienen dos puntas -un nodo y un ctodo. Conecte un diodo apropiadamente a la fuente de alimentacin y va a emitir luz sin ningn problema. Ponga al diodo al revs y conctelo a la misma fuente de alimentacin (aunque sea por un momento). No emitir luz - nunca ms!

INTRODUCCIN Quemar lentamente Hay un lmite de corriente nominal, o sea, lmite de corriente mxima especificada para cada LED que no se deber exceder. Si eso sucede, el diodo emitir luz ms intensamente de lo normal, pero slo por un perodo corto de tiempo. Algo para recordar De manera similar, todo lo que tiene que hacer es elegir una resistencia para limitar la corriente mostrada a continuacin. Dependiendo del voltaje de alimentacin, los efectos pueden ser espectaculares.

Display LED Bsicamente, un display LED no es nada ms que varios diodos LED moldeados en la misma caja plstica. Hay varios tipos de display y algunos de ellos estn compuestos por varias docenas de diodos incorporados que pueden mostrar diferentes smbolos. No obstante, el display utilizado con ms frecuencia es el de 7 segmentos. Est compuesto por 8 LED. Los siete segmentos de un dgito estn organizados en forma de un rectngulo para visualizar los smbolos, mientras que el segmento adicional se utiliza para el propsito de visualizar los puntos decimales. Para simplificar la conexin, los nodos y los ctodos de todos los diodos se conectan al pin comn as que tenemos display de nodo comn y display de ctodo comn, respectivamente. Los segmentos estn etiquetados con letras de la a a la g y dp, como se muestra en la siguiente figura. Al conectarlos, cada diodo LED se trata por separado, lo que significa que cada uno dispone de su propia resistencia para limitar la corriente.

Aqu se presentan varias cosas importantes que se deben tener en cuenta al momento de comprar un display LED: 1. Como se ha mencionado, dependiendo de si nodos o ctodos estn conectados al pin comn, tenemos display de nodo comn y display de ctodo comn. Visto de afuera, parece que no hay ninguna diferencia entre estos display, pues se le recomienda comprobar cul se va a utilizar antes de instalarlo. 7

INTRODUCCIN 2. Cada pin del microcontrolador tiene un lmite de corriente mxima que puede recibir o dar. Por eso, si varios visualizadores estn conectados al microcontrolador, es recomendable utilizar as llamados LED de bajo consumo que utilizan solamente 2mA para su funcionamiento. Los segmentos del visualizador estn normalmente etiquetados con letras de la a a la g, pero no hay ninguna regla estricta de cules pines del display estarn conectados. Por eso es muy importante comprobarlo antes de empezar a escribir un programa o disear un dispositivo. Los visualizadores conectados al microcontrolador normalmente ocupan un gran nmero de los pines de E/S valiosos, lo que puede ser un problema sobre todo cuando se necesita visualizar los nmeros compuestos por varios dgitos. El problema se vuelve ms obvio si, por ejemplo, se necesita visualizar dos nmeros de seis dgitos (un simple clculo muestra que en este caso se necesitan 96 pines de salida). La solucin de este problema se denominada multiplexin. Aqu se produce una ilusin ptica basada en el mismo principio de funcionamiento de una cmara de pelcula. Un slo dgito est activo a la vez, pero se tiene la impresin de que todos los dgitos de un nmero estn simultneamente activos por cambiar tan rpidamente de las condiciones de encendido/apagado.

Veamos la figura anterior. Primero se aplica un byte que representa unidades al puerto PORT2 del microcontrolador y se activa el transistor T1 a la vez. Despus de poco tiempo, el transistor T1 se apaga, un byte que representa decenas se aplica al puerto PORT2 y el transistor T2 se activa. Este proceso se est repitiendo cclicamente a alta velocidad en todos los dgitos y transistores correspondientes. Lo decepcionante es que el microcontrolador es slo un tipo de computadora miniatura diseada para interpretar el lenguaje de ceros y unos, lo que se pone de manifiesto al visualizar cualquier dgito. Concretamente, el microcontrolador no conoce cmo son unidades, decenas, centenas, ni 8

INTRODUCCIN diez dgitos a los que estamos acostumbrados. Por esta razn, cada nmero a visualizar debe pasar por el siguiente procedimiento: Antes que nada, un nmero de varios dgitos debe ser dividido en unidades, centenas, etc.; en una subrutina especfica. Luego, cada uno de estos dgitos se debe almacenar en los bytes particulares. Los dgitos se hacen reconocibles al realizar "enmascaramiento". En otras palabras, el formato binario de cada dgito se sustituye por una combinacin diferente de los bits por medio de una subrutina simple. Por ejemplo, el dgito 8 (0000 1000) se sustituye por el nmero binario 0111 1111 para activar todos los LEDs que visualizan el nmero 8. El nico diodo que queda inactivo aqu est reservado para el punto decimal. Si un puerto del microcontrolador est conectado al visualizador de tal manera que el bit 0 active el segmento 'a', el bit 1 active el segmento 'b', el bit 2 active el segmento 'c' y as sucesivamente, entonces la tabla que sigue muestra la "mscara" para cada dgito.

Adems de los dgitos del 0 a 9, hay algunas letras -A, C, E, J, F, U, H, L, b, c, d, o, r, t - que se pueden visualizar al enmascarar. En caso de que se utilicen los display de nodo comn, todos los unos contenidos en la tabla anterior se deben sustituir por ceros y viceversa. Adems, los transistores PNP se deben utilizar como controladores.

INTRODUCCIN Optoacopladores Un optoacoplador es un dispositivo frecuentemente utilizado para aislar galvnicamente el microcontrolador de corriente o voltaje potencialmente peligroso de su entorno. Los optoacopladores normalmente disponen de una, dos o cuatro fuentes de luz (diodos LED) en su entrada mientras que en su salida, frente a los diodos, se encuentra el mismo nmero de los elementos sensibles a la luz (foto-transistores, foto-tiristores, foto-triacs). El punto es que un optoacoplador utiliza una corta ruta de transmisin ptica para transmitir una seal entre los elementos de circuito, que estn aislados elctricamente. Este aislamiento tiene sentido slo si los diodos y los elementos foto-sensitivos se alimentan por separado. As, el microcontrolador y los componentes adicionales y caros estn completamente protegidos de altos voltajes y ruidos que son la causa ms frecuente de destruccin, dao y funcionamiento inestable de los dispositivos electrnicos en la prctica. Los optoacopladores utilizados con ms frecuencia son aqullos con foto-transistores en sus salidas. En los optoacopladores con la base conectada al pin 6 interno (tambin hay optoacopladores sin ella), la base puede quedarse desconectada.

La red RC representada por una lnea quebrada en la figura anterior indica una conexin opcional de la base de transistores dentro del optoacoplador, que reduce los efectos de ruidos al eliminar los pulsos muy cortos. Display LCD Este componente est especficamente fabricado para ser utilizado con los microcontroladores, lo que significa que no se puede activar por los circuitos integrados estndar. Se utiliza para visualizar los diferentes mensajes en un visualizador de cristal lquido miniatura. El modelo descrito aqu es el ms utilizado en la prctica por su bajo precio y grandes capacidades. Est basado en el microcontrolador HD44780 (Hitachi) integrado y puede visualizar mensajes en dos lneas con 16 caracteres cada una. Puede visualizar todas las letras del alfabeto, letras de alfabeto griego, signos de puntuacin, smbolos matemticos, etc. Tambin es posible visualizar smbolos creados por el usuario. Entre otras caractersticas tiles es el desplazamiento automtico de mensajes (a la izquierda y a la derecha), aparicin del cursor, retroiluminacin LED, entre otras.

10

INTRODUCCIN

Pines del display LCD A lo largo de la placa impresa del display LCD se encuentran los pines que le permiten estar conectado al microcontrolador. Hay 14 pines en total marcados con nmeros (16 si hay retroiluminacin). Su funcin se muestra en la tabla que sigue:

Pantalla LCD Una pantalla LCD puede visualizar dos lneas con 16 caracteres cada una. Cada carcter consiste en 5x8 o 5x11 pxeles. En la imagen siguiente se muestra un display de 5x8 pxeles que es el ms comn.

El contraste del visualizador depende del voltaje de alimentacin y de si los mensajes se visualizan en una o dos lneas. Por esta razn, el voltaje variable 0-Vdd se aplica al pin marcado como Vee. Un potencimetro trimer se utiliza con frecuencia para este propsito. Algunos de los display LCD 11

INTRODUCCIN tienen retroiluminacin incorporada (diodos LED azules o verdes). Al utilizarlo durante el funcionamiento, se debe de conectar una resistencia en serie a uno de los pines para limitar la corriente (similar a diodos LED).

Si no hay caracteres visualizados o si todos los caracteres estn oscurecidos al encender el visualizador, lo primero que se debe hacer es comprobar el potencimetro para ajustar el contraste. Est ajustado apropiadamente? Lo mismo se aplica si el modo de funcionamiento ha sido cambiado (escribir en una o en dos lneas). Memoria LCD El display LCD dispone de tres bloques de memoria: DDRAM Display Data RAM (RAM de datos de visualizacin); CGRAM Character Generator RAM (generador de caracteres RAM); y CGROM Character Generator ROM (generador de caracteres ROM)

Memoria DDRAM La memoria DDRAM se utiliza para almacenar los caracteres a visualizar. Tiene una capacidad de almacenamiento de 80 caracteres. Algunas localidades de memoria estn directamente conectadas a los caracteres en el visualizador. Todo funciona muy simple: basta con configurar el display para incrementar direcciones automticamente (desplazamiento a la derecha) y establecer la direccin inicial para el mensaje que se va a visualizar (por ejemplo 00 hex). Luego, todos los caracteres enviados por las lneas D0-D7 se van a visualizar en el formato de mensaje al que nos hemos acostumbrado -de la izquierda a la derecha. En este caso, la visualizacin empieza por el primer campo de la primera lnea ya que la direccin inicial es 00hex. Si se enva ms de 16 caracteres, todos se memorizarn, pero slo los primeros 16 sern visibles. Para visualizar los dems, se debe utilizar el comando shift. Virtualmente, parece como si el visualizador LCD fuera una ventana, desplazndose de la izquierda a la derecha sobre las localidades de memoria con diferentes caracteres. En realidad, as es cmo se cre el efecto de desplazar los mensajes sobre la pantalla. 12

INTRODUCCIN

Si se habilita ver el cursor, aparecer en la localidad actualmente direccionada. En otras palabras, si un carcter aparece en la posicin del cursor, se va a mover automticamente a la siguiente localidad direccionada. Esto es un tipo de memoria RAM as que los datos se pueden escribir en ella y leer de ella, pero su contenido se pierde irrecuperablemente al apagar la fuente de alimentacin. Memoria CGROM La memoria CGROM contiene un mapa estndar de todos los caracteres que se pueden visualizar en la pantalla. A cada carcter se le asigna una localidad de memoria:

13

INTRODUCCIN Las direcciones de las localidades de memoria CGROM corresponden a los caracteres ASCII. Si el programa que se est actualmente ejecutando llega al comando enviar el carcter P al puerto, el valor binario 0101 0000 aparecer en el puerto. Este valor es el equivalente ASCII del carcter P. Al escribir este valor en un LCD, se visualizar el smbolo de la localidad 0101 0000 de la CGROM. En otras palabras, se visualizar el carcter P. Esto se aplica a todas las letras del alfabeto (minsculas y maysculas), pero no se aplica a los nmeros. Como se muestra en el mapa anterior, las direcciones de todos los dgitos se desplazan por 48 en relacin con sus valores (direccin del dgito 0 es 48, direccin del dgito 1 es 49, direccin del dgito 2 es 50 etc.). Por consiguiente, para visualizar los dgitos correctamente es necesario aadir el nmero decimal 48 a cada uno antes de enviarlos en un LCD.

Qu es un cdigo ASCII? Desde su aparicin hasta hoy en da, las computadoras han sido capaces de reconocer solamente nmeros, y no las letras. Esto significa que todos los datos que una computadora intercambia con un perifrico, reconocidos como letras por los humanos, en realidad estn en el formato binario (el teclado es un buen ejemplo). En otras palabras, a cada carcter le corresponde la combinacin nica de ceros y unos. El cdigo ASCII representa una codificacin de caracteres basada en el alfabeto ingls. El ASCII especifica una correspondencia entre los smbolos de caracteres estndar y sus equivalentes numricos. Memoria CGRAM Adems de los caracteres estndar, el visualizador LCD puede visualizar smbolos definidos por el usuario. Esto puede ser cualquier smbolo de 5x8 pxeles. La memoria RAM denominada CGRAM de 64 bytes lo habilita. 14

INTRODUCCIN

Los registros de memoria son de 8 bits de anchura, pero slo se utilizan los 5 bits ms bajos. Un uno lgico (1) en cada registro representa un punto oscurecido, mientras que 8 localidades agrupadas representan un carcter. Esto se muestra en la siguiente figura:

Los smbolos estn normalmente definidos al principio del programa por una simple escritura de ceros y unos en la memoria CGRAM as se crean las formas deseadas. Para visualizarlos basta con especificar su direccin. Preste atencin a la primera columna en el mapa de caracteres CGROM. No contiene direcciones de la memoria RAM, sino los smbolos de los que se est hablando aqu. En este ejemplo visualizar 0 significa visualizar sonrisa, visualizar 1 significa - visualizar ancla, etc. Comandos bsicos del visualizador LCD Todos los datos transmitidos a un display LCD por las salidas D0-D7 sern interpretados como un comando o un dato, lo que depende del estado lgico en el pin RS: RS = 1 - Los bits D0 - D7 son direcciones de los caracteres a visualizar. El procesador LCD direcciona un carcter del mapa de caracteres y lo visualiza. La direccin DDRAM especifica la localidad en la que se va a visualizar el carcter. Esta direccin se define antes de transmitir el carcter o la direccin del carcter anteriormente transmitido ser aumentada automticamente. RS = 0 - Los bits D0 - D7 son los comandos para ajustar el modo del visualizador.

15

INTRODUCCIN En la siguiente tabla se muestra una lista de comandos reconocidos por el LCD:

Qu es una bandera de ocupado (busy flag)? En comparacin al microcontrolador, el LCD es un componente extremadamente lento. Por esta razn, era necesario proporcionar una seal que, al ejecutar un comando, indicara que el display estaba listo para recibir el siguiente dato. Esta seal denominada bandera de ocupado (busy flag) se puede leer de la lnea D7. El visualizador est listo para recibir un nuevo dato cuando el voltaje en esta lnea es de 0V (BF=0). Conectar al visualizador LCD Dependiendo de cuntas lneas se utilizan para conectar un LCD al microcontrolador, hay dos modos de LCD, el de 8 bits y el de 4 bits. El modo apropiado se selecciona en el inicio del funcionamiento en el proceso denominado inicializacin. El modo de LCD de 8 bits utiliza los pines D0-D7 para transmitir los datos, como hemos explicado anteriormente. El propsito principal del modo de LCD de 4 bits es el ahorrar los valiosos pines de E/S del microcontrolador. Slo los 4 bits ms altos (D4-D7) se utilizan para la comunicacin, mientras que los dems pueden quedarse desconectados. Cada dato se enva al LCD en dos pasos -primero se envan 4 bits ms altos (normalmente por las lneas D4 - D7), y luego los 4 bits ms bajos. La inicializacin habilita que el LCD conecte e interprete los bits recibidos correctamente.

16

INTRODUCCIN

Pocas veces se leen los datos del LCD (por lo general se transmiten del microcontrolador al LCD) as que, con frecuencia, es posible guardar un pin de E/S de sobra. Es simple, basta con conectar el pin L/E a Tierra. Este ahorro del pin tiene su precio. Los mensajes se visualizarn normalmente, pero no ser posible leer la bandera de ocupado ya que tampoco es posible leer los datos del display. Afortunadamente, hay una solucin simple. Despus de enviar un carcter o un comando es importante dar al LCD suficiente tiempo para hacer su tarea. Debido al hecho de que la ejecucin de un comando puede durar aproximadamente 1.64ms, el LCD tarda como mximo 2ms en realizar su tarea. Inicializar al visualizador LCD Al encender la fuente de alimentacin, el LCD se inicia automticamente. Esto dura aproximadamente 15ms. Despus de eso, el LCD est listo para funcionar. Asi mismo, el modo de funcionamiento est configurado por defecto de la siguiente manera: Display est borrado. Modo o DL = 1 - Bus de datos de 8 bits o N = 0 - LCD de una lnea o F = 0 - Carcter de 5 x 8 puntos Visualizador/Cursor encendido/apagado o D = 0 - Display apagado o U = 0 - Cursor apagado o B = 0 - Parpadeo del cursor apagado Introduccin de caracteres o ID = 1 Direcciones visualizadas se incrementan automticamente en 1 o S = Desplazamiento del visualizador desactivado

17

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES

Unidad I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES


Prctica 1.1 Conexiones bsicas y encendido de leds
Descripcin P1.1: El propsito de esta prctica es mostrar el circuito bsico, tambin llamado sistema mnimo, y el proceso de programacin de un microcontrolador (uC) PIC16F887. El PIC16F887 es el uC que se utilizar en todas las prcticas de este manual a menos que se indique lo contrario. Cabe resaltar que los Microcontroladores PIC16F877, PIC16F877A, PIC16F887 y PIC16F917 son compatibles entre s. El PIC16F887 puede ser considerado como una nueva y mejor versin del PIC16F877, as mismo el PIC16F917 es similar al PIC16F877A, pero adems incorpora un mdulo manejador de LCD. El circuito y el programa nicamente realizan la funcin de encender algunos leds conectados al puerto B del microcontrolador (uC) PIC16F887. Cdigo P1.1:
;************************************************ ; Nombre : P1_1.asm ; Fecha : Enero 10,2013 ; Alumno : ; Grupo : IMEC ;************************************************ ; Descripcion : Prueba del microcontrolador ;************************************************ list p=16f887 #include <p16f887.inc> errorlevel -302 __CONFIG _CONFIG1, _HS_OSC & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOR_ON & _IESO_ON & _FCMEN_ON & _LVP_OFF __CONFIG _CONFIG2, _BOR40V & _WRT_OFF ORG Banksel clrf banksel movlw movwf end 0x0000 TRISB TRISB PORTB B'01010101' PORTB

18

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES Circuito P1.1:

Actividades P1.1: Explicar el cdigo del programa comentando que hace y/o para que funcione cada lnea, se puede usar el simulador y buscar los comandos en internet. Por ltimo implemente la prctica.

Prctica 1.2 Oscilador interno y ciclos de repeticin


Descripcin P1.2: Esta prctica es una continuacin de la prctica P1.1. En esta prctica se busca hacer que los leds conectados al puerto B parpadeen (blink). Para conseguir que los leds parpadeen se disea el siguiente algoritmo: 1. En el puerto B se carga la combinacin binaria 01010101 2. Se permanece en el ciclo 1 durante un tiempo determinado (delay) 3. Se reemplaza la combinacin binaria existente en el puerto B con la combinacin 10101010 4. Se permanece en el ciclo 2 durante un tiempo determinado 5. Por ltimo se regresar al paso 1 y se repite todo el proceso nuevamente. Al realizar los cambios de combinacin binaria en el puerto B, se aprecia el efecto del parpadeo, el proceso mencionado anteriormente se necesita llevar a cabo de una manera lenta para lograr ser vista por el ojo humano. Esto se consigue utilizando el oscilador interno LFINTOSC del microcontrolador el cual tiene una frecuencia de 31 kHz mucho ms lenta que la del oscilador externo, el cual tiene conectado el cristal de 8 MHz. La fuente de la seal de reloj es cambiada durante la ejecucin del programa, on the fly. Para verificar que esto realmente est sucediendo, antes de energizar el uC es necesario desconectar el cristal de 8 MHz. Qu paso? El uC no debe de hacer nada ya que la configuracin de este requiere el uso del cristal al momento de iniciar a ejecutar el programa. En cambio, si el cristal se

19

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES desconecta despus de que el uC ya inicio la ejecucin del programa esto no debe de afectar el funcionamiento del uC de ninguna manera. Cdigo P1.2:
;************************************************ ; Nombre : P1_2.asm ; Fecha : Enero 10,2013 ; Alumno : ; Grupo : IMEC ;************************************************ ; Descripcin : Parpadear leds Puerto B ;************************************************ list p=16f887 #include <p16f887.inc> errorlevel -302 __CONFIG _CONFIG1, _HS_OSC & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOR_ON & _IESO_ON & _FCMEN_ON & _LVP_OFF __CONFIG _CONFIG2, _BOR40V & _WRT_OFF ;************************************************************************ ;************* DEFINING VARIABLES *************************************** cblock 0x20 ; Bloque de variables inicia en dir. 20h counter1 ; La variable "counter1" en la dir. 20h endc ;************************************************************************ org 0x0000 ; Direccin de la primera instruccin banksel OSCCON bcf bcf bcf bsf OSCCON,6 OSCCON,5 OSCCON,4 OSCCON,0 ; Selecciona el banco de memoria que ; contiene el registro OSCCON ; Selecciona el oscilador interno LFINTOSC ; con la frecuencia de 31KHz ; uC usa el oscilador interno ; Selecciona el banco que contiene a TRISB ; Todos los pines del PORTB configurados ; como salidas ; Selecciona el banco que contiene a PORTB

banksel TRISB clrf TRISB banksel PORTB

loop ; etiqueta con el nombre de "loop" movlw B'01010101' ; Numero binario 01010101 se carga en W movwf PORTB ; Numero binario se mueve al PORTB movlw h'FF' ; Numero hFF se carga en W movwf counter1 ; Numero se mueve a la variable "counter1" loop1 ; etiqueta con el nombre de "loop1" decfsz counter1 ; Variable "counter1" se decrementa en 1 goto loop1 ; Si "counter1" es 0, continuar. ; de lo contrario volver a "loop1" movlw B'10101010' ; Numero BIN 10101010 se carga en W movwf PORTB ; Numero se mueve a PORTB movlw h'FF' ; Numero hFF se carga en W movwf counter1 ; Numero se mueve a la variable "counter1" loop2 ; etiqueta con el nombre de "loop2" decfsz counter1 ; Variable "counter1" se decrementa en 1 goto loop2 ; Si "counter1" es 0, continuar. ; de lo contrario volver a "loop2" goto loop ; Volver a la etiqueta "loop" end ; Fin del Programa

20

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES

Circuito P1.2:

Actividades P1.2 Implementar la prctica en el simulador y ver cuales registros son modificados para la configuracin y operacin de la prctica, por ltimo implemente el sistema en fsico.

Prctica 1.3 Ciclos anidados


Descripcin P1.3: En la prctica anterior se pudo observar que el microcontrolador ejecuta las instrucciones muy rpido y en ocasiones es necesario hacerlo que vaya ms lento. El uso del oscilador interno LF, como se hace en la prctica P1.2, debe de ser la ltima opcin. Una mejor manera de realizarlo es utilizar ciclos anidados en el programa. En esta prctica, la variable counter1 se decrementa una unidad 255 veces, es decir el programa contar de 255 a 0 antes de salir del ciclo interior loop1. El programa contar 255 veces de 255 a 0 en cada ciclo exterior loop. Lo anterior quiere decir que entre dos parpadeos consecutivos de leds hay 255 x 255 pulsos del cristal oscilador. De manera ms precisa el nmero de pulsos entre dos parpadeos consecutivos es de aproximadamente de 196000, esto es debido a que la ejecucin de las instrucciones de brinco (goto) y de decremento requieren de un cierto nmero de pulsos para ser ejecutadas. La instruccin de decremento DECFSZ se realiza en 1 o 2 ciclos. La instruccin de brinco GOTO se realiza en 2 ciclos tambin. Si suponemos que la instruccin DECFSZ se realiza en un ciclo y la instruccin GOTO en 2 ciclos, eso son tres ciclos. Si estas dos instrucciones, que se realizan en 3 21

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES ciclos, se realizan 255*255 veces eso equivale: 255 * 255 * 3 = 195075, aproximadamente 196000 instrucciones como se haba comentado antes. Cdigo P1.3:
;************************************************ ; Nombre : P1_3.asm ; Fecha : Enero 10,2013 ; Alumno : ; Grupo : IMEC ;************************************************ ; Descripcion : Parpadear leds Puerto B , Ciclos anidados ;************************************************ list p=16f887 #include <p16f887.inc> errorlevel -302 __CONFIG _CONFIG1, _HS_OSC & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOR_ON & _IESO_ON & _FCMEN_ON & _LVP_OFF __CONFIG _CONFIG2, _BOR40V & _WRT_OFF ;************* DEFINING VARIABLES ***************************************** cblock 0x20 ; Block of variables starts at address 20h counter1 ; Variable "counter1" at address 20h counter2 ; Variable "counter2" at address 21h endc ;************************************************************************** org 0x0000 ; Address of the first program instruction banksel TRISB ; Selects bank containing register TRISB clrf TRISB ; Clears TRISB banksel loop movlw movwf movlw movwf PORTB ; Selects bank containing register PORTB

B'11110000' ; Binary number 11110000 is moved to W PORTB ; Number is moved to PORTB h'FF' ; Number hFF is moved to W counter2 ; Number is moved to variable "counter2"

loop2 movlw h'FF' ; Number hFF is moved to W movwf counter1 ; Number is moved to "counter1" loop1 decfsz counter1 ; Decrements "counter1" by 1. If result is 0 goto loop1 ; skip next instruction decfsz goto movlw movwf movlw movwf loop4 movlw movwf loop3 decfsz goto decfsz goto goto end counter2 ; Decrements "counter2" by 1. If result is 0 loop2 ; skip next instruction B'00001111' ; Binary number 00001111 is moved to W PORTB ; Number is moved to PORTB h'FF' ; Number hFF is moved to W counter2 ; Number is moved to variable "counter2"

h'FF' ; Number hFF is moved to W counter1 ; Number is moved to variable "counter1" counter1 ; Decrements "counter1" by 1. If result is 0 ; skip next instruction loop3 counter2 ; Decrements "counter2" by 1. If result is 0 loop4 ; skip next instruction loop ; Jump to label loop ; End of program

22

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES Circuito P1.3: Igual al de la prctica P1.2 Actividades P1.3 Implementar la prctica en el simulador y ver cuales registros son modificados para la configuracin y operacin de la prctica, por ltimo implemente el sistema en fsico.

Prctica 1.4 Temporizador TMR0 e interrupciones


Descripcin P1.4: En la prctica anterior se puede apreciar la desventaja de realizar retardos de tiempo (delays) utilizando ciclos. En casos como el de la prctica anterior, el microcontrolador est captivo y no hace nada ms que esperar a que pase el tiempo. Esa prdida de tiempo es inaceptable y es necesario encontrar otro mtodo para realizar retardos de tiempo. En este ejemplo se hace uso de los temporizadores (timers) y de interrupciones (interrupts) y se hace un vnculo entre ambos de manera prctica. Para este ejemplo es necesario realizar un retardo de tiempo lo suficientemente largo para apreciar el cambio en los leds del PORTB. En esta ocasin el temporizador TMR0, con un pre-escalador (prescaler), es utilizado para ese propsito. La interrupcin ocurre cada vez que ocurre un sobre-flujo (overflow) el registro del temporizador. La interrupcin incrementa el valor mostrado en el PORTB en uno. Todo el proceso es realizado detrs de cmaras (behind the scenes), esto permite que el microcontrolador haga otras cosas mientras espera a que en el registro del temporizador se genere una interrupcin por sobre-flujo y se interrumpa momentneamente la ejecucin del programa principal. En este ejemplo hay que poner atencin a ciertos detalles: Aun y cuando no es necesario en este caso, los contenidos de los registros ms importantes (W, STATUS and PCLATH) deben de guardarse al inicio de cada rutina de interrupcin. La interrupcin causa que la bandera apropiada se active (set), en este ejemplo la bandera que se activa es TMR0IF, y que el bit GIE se desactive (clear). Al finalizar la rutina de interrupcin no hay que olvidar regresar el bit GIE y la bandera a los valores que tenan anteriormente. Finalmente es crucial que los registros importantes sean devueltos a los valores que tenan antes de entrar a la rutina de interrupcin.

Cdigo P1.4:
;************************************************ ; Nombre : P1_4.asm ; Fecha : Enero 10,2013 ; Alumno : ; Grupo : IMEC ;************************************************ ; Descripcion : Temporizador TMR0 e interrupciones ;************************************************ list p=16f887

23

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES

#include <p16f887.inc> errorlevel -302 __CONFIG _CONFIG1, _HS_OSC & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOR_ON & _IESO_ON & _FCMEN_ON & _LVP_OFF __CONFIG _CONFIG2, _BOR40V & _WRT_OFF ;**************** DEFINING VARIABLES **************************************** cblock 0x20 w_temp pclath_temp status_temp endc ; Block of variables starts at address 20h ; Variable at address 20h ; Variable at address 21h ; Variable at address 22h

;************************ START OF PROGRAM ********************************** org 0x0000 ; Address of the first program instruction goto main ; Go to label "main" ;************************ INTERRUPT ROUTINE ********************************* org 0x0004 ; Interrupt vector movwf w_temp ; Saves value in register W movf STATUS ; Saves value in register STATUS movwf status_temp movf PCLATH ; Saves value in register PCLATH movwf pclath_temp banksel PORTB incf PORTB ; Selects bank containing PORTB ; Increments register PORTB by 1

banksel INTCON ; Selects bank containing INTCON bcf INTCON,TMR0IF ; Clears interrupt flag TMR0IF movf movwf movf movwf swapf swapf bsf retfie pclath_temp,w ; PCLATH is given its original content PCLATH status_temp,w ; STATUS is given its original content STATUS w_temp,f ; W is given its original content w_temp,w INTCON,GIE ; Global interrupt enabled ; Return from interrupt routine

;************************ MAIN PROGRAM ************************************** main ; Start of the main program banksel ANSEL clrf ANSEL clrf ANSELH banksel TRISB clrf TRISB ; Bank containing register ANSEL ; Clears registers ANSEL and ANSELH ; All pins are digital ; Selects bank containing register TRISB ; All port B pins are configured as outputs

banksel OPTION_REG ; Bank containing register OPTION_REG bcf OPTION_REG,T0CS ; TMR0 counts pulses from oscillator bcf OPTION_REG,PSA ; Prescaler is assign to timer TMR0 bsf bsf bsf OPTION_REG,PS0 ; Prescaler rate is 1:256 OPTION_REG,PS1 OPTION_REG,PS2

banksel INTCON ; Bank containing register INTCON bsf INTCON,TMR0IE ; TMR0 interrupt overflow enabled

24

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES


bsf INTCON,GIE ; Global interrupt enabled

banksel PORTB ; Bank containing register PORTB clrf PORTB ; Clears port B loop goto loop ; Remain here end ; End of program

Circuito P1.4:

Actividades P1.4 Implementar la prctica en el simulador y ver cuales registros son modificados para la configuracin y operacin de la prctica, de preferencia con la hoja de datos del microcontrolador para identificar que hace cada registro, por ltimo implemente el sistema en fsico.

Prctica 1.5 Uso de botones y subrutinas


Descripcin P1.5: En los ejemplos anteriores el microcontrolador simplemente ejecuta el programa sin la posibilidad de poder interactuar de alguna manera con este. En la realidad dispositivos trabajando de esta manera, son poco comunes. Para agregarle ms funcionalidad al programa que ejecuta un microcontrolador es necesario utilizar las entradas con las que este cuenta. Este ejemplo es bastante sencillo en realidad. Al inicio del programa, justo despus de definir las variables, los pines del microcontrolador son configurados utilizando los registros TRISA y TRISB. Los pines del PORTA son configurados como entrada utilizando el registro TRISA, aun y cuando esto no es necesario ya que la configuracin inicial de los pines del PORTA es de entradas.

25

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES El programa inicia activando un bit del PORTB y luego el contenido de este registro es constantemente desplazados un lugar hacia la izquierda (utilizando la instruccin RLF, Rotate Left f through Carry). Esto produce la impresin de que el diodo led encendido se mueve. Presionando el botn STOP detiene el movimiento y el programa se mantiene en el loop3. El retardo de tiempo en esta ocasin es realizado en una subrutina llamada DELAY. Cdigo P1.5:
;************************************************ ; Nombre : P1_5.asm ; Fecha : Enero 10,2013 ; Alumno : ; Grupo : IMEC ;************************************************ ; Descripcion : Uso de botones y subrutinas ;************************************************ list p=16f887 #include <p16f887.inc> errorlevel -302 __CONFIG _CONFIG1, _HS_OSC & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOR_ON & _IESO_ON & _FCMEN_ON & _LVP_OFF __CONFIG _CONFIG2, _BOR40V & _WRT_OFF ;************* DEFINING VARIABLES ******************************************* cblock 0x20 counter1 counter2 endc ; Block of variables starts at address 20h ; Variable "counter1" at address 20h ; Variable "counter2" at address 21h ; Block of variables ends

;************************ MAIN PROGRAM ************************************** org 0x0000 banksel ANSEL clrf ANSEL clrf ANSELH ; Address of the first program instruction ; Selects bank containing register ANSEL ; Clears registers ANSEL and ANSELH to ; configure all inputs as digital

banksel TRISB ; Selects bank containing register TRISB clrf TRISB ; All port B pins are configured as outputs movlw B'00000010' movwf TRISA ; Pin RA1 is input banksel PORTB ; Selects bank containing register TRISB movlw B'00000001' ; Writes 1 to register W movwf PORTB ; Number is moved to PORTB loop rlf PORTB ; Port B bits rotates by one place left call DELAY ; Calls subroutine "DELAY" loop3 btfss PORTA,1 ; Tests the first port A bit goto loop3 ; "0" is applied to pin.Go to label "loop3" goto loop ; "1" is applied to pin.Go to label "loop" ;************************ SUBROUTINES *************************************** DELAY clrf counter2 ; Clears variable "counter2" loop1 clrf counter1 ; Clears variable "counter1" loop2 decfsz counter1 ; Decrements variable "counter1" by 1

26

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES


goto decfsz goto return end loop2 ; Result is not 0. Go to label loop2 counter2 ; Decrements variable "counter2" by 1 loop1 ; Result is not 0. Go to lab loop1 ; Return from subroutine "DELAY" ; End of program

Circuito P1.5:

Actividades P1.5 Implementar la prctica en el simulador y vea cuales registros son modificados para la configuracin y operacin de la prctica, por ltimo implemente el sistema en fsico.

Prctica 1.6 Temporizador TMR0 como contador, variables y relevadores


Descripcin P1.6: En este ejemplo el temporizador TMR0 es usado como contador. La idea es conectar la entrada del contador a un botn de tal manera que se cuente un pulso cada vez que se presione el botn. Cuando el nmero de pulsos contados es igual al nmero en el registro TEST, un nivel lgico de 1 (5 V DC) aparece en el pin 3 del PORTD. Dado que este voltaje activa un relevador electromecnico, este bit es llamado Relay. En este ejemplo, el registro TEST contiene el nmero 5. En realidad, puede ser cualquier nmero. En lugar del relevador, el microcontrolador puede activar algn otro dispositivo y en lugar de botones se pueden usar sensores.

27

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES Cdigo P1.6:


;************************************************ ; Nombre : P1_6.asm ; Fecha : Enero 10,2013 ; Alumno : ; Grupo : IMEC ;************************************************ ; Descripcion : Temporizador TMR0 como contador, variables y relevadores ;************************************************ list p=16f887 #include <p16f887.inc> errorlevel -302 __CONFIG _CONFIG1, _HS_OSC & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOR_ON & _IESO_ON & _FCMEN_ON & _LVP_OFF __CONFIG _CONFIG2, _BOR40V & _WRT_OFF ;************* DEFINING VARIABLES ******************************************* TEST equ B'00000101' ; 00000101 = TEST #define RELAY PORTD,3 ; Pin PORTD,3 = RELAY ;************************ MAIN PROGRAM ************************************** org 0x0000 ; Address of the first program instruction banksel TRISB ; Selects bank containing register TRISB clrf TRISB ; All port B pins are configured as outputs clrf TRISD ; All port D pins are configured as outputs movlw B'00010000' ; This number is written to W register movwf TRISA ; Only the forth pin of port A is input banksel OPTION_REG ; Bank containing OPTION_REG register bsf OPTION_REG,T0CS ; Pin RA4 is supplied with pulses bsf OPTION_REG,PSA ; Prescaler rate is 1:1 banksel PORTB ; Selects bank containing PORTB register

clrf TMR0 ; Clears timer register bcf PORTD,3 ; Pin PORTD,3 = 0 loop movfw TMR0 ; Timer register is moved to W register movwf PORTB ; W register is moved to PORTB xorlw TEST ; Operation exclusive OR between ; W register and number TEST (00000101) btfsc STATUS,Z ; If numbers are equal, result is 0 and bsf PORTD,3 ; bit STATUS,Z = 1. Bit PORTD,3 is set goto loop ; and jump to label loop is executed end ; End of program

28

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES Circuito P1.6:

Actividades P1.6 Implementar la prctica en el simulador y ver cuales registros son modificados para la configuracin y operacin de la prctica, por ltimo implemente el sistema en fsico.

Prctica 1.7 Macros y rutinas para evitar el rebote de botones


Descripcin P1.7: Probablemente se habr dado cuenta en el ejemplo anterior, que el microcontrolador no siempre funciona como se espera. Es decir, cuando pulsaba el botn, el nmero en el puerto B no siempre se incrementaba en 1. Esto se debe a que los botones mecnicos hacen varios contactos sucesivos (rebote) cuando se activan. Como usted bien supone, el microcontrolador registra y cuenta cada uno de ellos. Hay varias maneras de resolver este problema. En esta prctica se utiliza un retardo en el programa para evitar el conocido rebote. Bsicamente, se trata de un procedimiento simple: Si se detecta el cambio de entrada (se pulsa el botn), el programa ofrece una demora breve, es decir, el programa espera a que el botn sea liberado, omitiendo los rebotes producto del botn mecnico. Slo despus de esto, el programa llega a la conclusin de que el botn fue activado e incrementa la variable en 1. En este mismo caso, el pulsador se pone a prueba por medio de un macro llamado botn. Adems, esta macro contiene un retardo de programa que se proporciona por medio de otro macro llamado pausems.

29

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES

El programa principal es relativamente simple y permite que la variable "CNT", se incremente y decremente mediante dos pulsadores (push-bottons). Esta variable se copian al puerto B y afecta el LED (El 1 lgico enciende el LED, mientras que el 0 lgico lo apaga). Cdigo P1.7:
;************************************************ ; Nombre : P1_7.asm ; Fecha : Enero 10,2013 ; Alumno : ; Grupo : IMEC ;************************************************ ; Descripcion : Macros y rutinas para evitar el rebote de botones ;************************************************ ;************* DEFINING VARIABLES ************************* cblock 0x20 ; Block of variables starts at address 20hex

HIcnt LOcnt LOOPcnt cnt endc ; End of block of variables ;********************************************************************** ORG 0x000 ; Reset vector nop goto main ; Go to program start (label "main") ;********************************************************************** include "pause.inc" include "button.inc" ;********************************************************************** main banksel ANSEL ; Selects bank containing ANSEL clrf ANSEL ; All pins are digital clrf ANSELH banksel TRISB bsf TRISA, 0 bsf TRISA, 1 clrf TRISB banksel PORTB clrf cnt Loop button PORT,0,0,Increment button PORT,1,0,Decrement goto Loop Increment incf cnt, f movf cnt, w movwf PORTB goto Loop Decrement decf cnt, f movf cnt, w movwf PORTB goto Loop end ; End of program

30

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES

Macro pausems ARCHIVO: pause.inc


; Todo este cdigo va en un archivo llamado pause.inc ;********************************************************************** pausems MACRO arg1 local Loop1 local dechi local Delay1ms local Loop2 local End movlw High(arg1) ; Higher byte of argument is moved to HIcnt movwf HIcnt movlw Low(arg1) ; Lower byte of argument is moved to LOcnt movwf LOcnt Loop1 movf LOcnt, f ; Decrements HIcnt and LOcnt while btfsc STATUS, Z ; needed and calls subroutine Delay1ms goto dechi call Delay1ms decf LOcnt, f goto Loop1 dechi movf HIcnt, f btfsc STATUS, Z goto End call Delay1ms decf HIcnt, f decf LOcnt, f goto Loop1 Delay1ms: ; Delay1ms provides delay of movlw .100 ; 100*10us=1ms movwf LOOPcnt ; LOOPcnt<-100 Loop2: nop nop nop nop nop nop nop decfsz LOOPcnt, f goto Loop2 ; Execution time of Loop2 return ; is 10 us End ENDM ;**********************************************************************

Macro button ARCHIVO: button.inc


; Todo este cdigo va en un archivo llamado button.inc ;**************************************************** button MACRO port,pin,hilo,label local Pressed1 ; All labels are local local Pressed2 local Exit1 local Exit2

31

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES


IFNDEF #define ENDIF debouncedelay ; Enables debounce time to be defined in main program debouncedelay .10

IF (hilo == 0) ; If pull-up used btfsc port, pin ; If "1", push-button is pressed goto Exit1 pausems debouncedelay ; Wait for 10ms debounce Pressed1 btfss port, pin goto Pressed1 pausems debouncedelay ; Wait until released and goto label ; jump to specified address Exit1 ELSE ; If pull-down used btfss port, pin goto Exit2 ; If "0", push-button is released pausems debouncedelay ; Wait for 10ms debounce Pressed2 btfsc port, pin goto Pressed2 pausems debouncedelay ; Wait until released and goto label ; jump to specified address Exit2 ENDIF ENDM ;**********************************************************************

Circuito P1.7:

Actividades P1.7 Implementar la prctica en el simulador y ver cuales registros son modificados para la configuracin y operacin de la prctica, por ltimo implemente el sistema en fsico.

32

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES

Prctica 1.8 Temporizador TMR1 e interrupciones


Descripcin P1.8: El temporizador TMR1 de 16-bit se utiliza en este ejemplo. Al usar los registros TMR1L y TMR1H, se produce una interrupcin y el nmero en el puerto B se incrementa. Esto ya se ha visto en los ejemplos anteriores. La diferencia est en el retraso del programa, que es un poco ms largo en esta ocasin porque la tasa de prescaler es ajustada en 1:8. Cdigo P1.8:
;************************************************ ; Nombre : P1_8.asm ; Fecha : Enero 10,2013 ; Alumno : ; Grupo : IMEC ;************************************************ ; Descripcion : Temporizador TMR1 e interrupciones ;************************************************ ;************* DEFINING VARIABLES ******************************************* cblock 0x20 w_temp pclath_temp status_temp endc ; Block of variables starts at address 20h ; Variable at address 20h ; Variable at address 21h ; Variable at address 22h

;************************ PROGRAM START ************************ org 0x0000 ; Address of the first program instruction goto main ; Jump to label "main" ;************************ INTERRUPT ROUTINE ********************************** org 0x0004 ; Interrupt vector movwf w_temp ; Save register W movf movwf movf movwf STATUS ; Save register STATUS status_temp PCLATH ; Save register PCLATH pclath_temp ; Selects bank containing PORTB ; Register PORTB is incremented by 1

banksel PORTB incf PORTB movf movwf movf movwf swapf swapf

pclath_temp,w ; PCLATH is given its original content PCLATH status_temp,w ; STATUS is given its original content STATUS w_temp,f ; W is given its original content w_temp,w

banksel PIR1 ; Selects bank containing PIR1 bcf PIR1,TMR1IF ; Clears interrupt flag TMR1IF bsf retfie INTCON,GIE ; Global interrupt enabled ; Return from interrupt routine

;************************ MAIN PROGRAM *************************************** main ; Start of main program banksel ANSEL ; Selects bank containing register ANSEL clrf ANSEL ; Clears registers ANSEL and ANSELH

33

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES


clrf ANSELH ; All pins are digital ; Selects bank containing register TRISB ; All port B pins are configured as outputs

banksel TRISB clrf TRISB

banksel T1CON ; Selects bank containing register T1CON bcf T1CON,TMR1CS ; TMR1 counts pulses generated by oscillator bsf bsf bsf T1CON,T1CKPS0 ; Prescaler rate is 1:8 T1CON,T1CKPS1 T1CON,TMR1ON ; Turns on timer TMR1

banksel PIE1 ; Selects bank containing register PIE1 bsf PIE1,TMR1IE ; TMR1 interrupt overflow enabled bsf INTCON,PEIE ; Peripheral modules interrupt enabled Timer TMR1 belongs to peripheral modules bsf INTCON,GIE ; Global interrupt enabled banksel PORTB ; Selects bank containing register PORTB clrf PORTB ; Clears port B loop goto loop ; Remain here end ; End of program

Circuito P1.8:

Actividades P1.8 Implementar la prctica en el simulador y ver cuales registros son modificados para la configuracin y operacin de la prctica, por ltimo implemente el sistema en fsico.

Prctica 1.9 Temporizador TMR2 y configuracin del oscilador


Descripcin P1.9: Este ejemplo ilustra el uso del temporizador TMR2. El microcontrolador utiliza el oscilador interno HFINTOSC con la frecuencia de 500 kHz. Todo el programa funciona de la siguiente manera: Despus del perodo de tiempo definido por el registro PR, el prescaler y postscaler han expirado, 34

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES lo cual produce una interrupcin. La rutina de la interrupcin decrementa el contenido del registro PR y simultneamente incrementa el contenido del puerto B. Puesto que el nmero en el registro PR, el cual determina cuando se producen las interrupciones, est constantemente decrementando su valor, las interrupciones se producirn cada vez durante perodos ms cortos de tiempo. En otras palabras, la cuenta se lleva a cabo cada vez ms rpido. Un nuevo ciclo de conteo ms corto comienza despus de cada desbordamiento del registro PR. Cdigo P1.9:
;************************************************ ; Nombre : P1_9.asm ; Fecha : Enero 10,2013 ; Alumno : ; Grupo : IMEC ;************************************************ ; Descripcion : Temporizador TMR2 y configuracin del oscilador ;************************************************ ;************* DEFINING VARIABLES ************************************************ cblock 0x20 w_temp pclath_temp status_temp endc ; Block of variables starts at address 20h ; Variable at address 20h ; Variable at address 21h ; Variable at address 22h

;************************ PROGRAM START ****************************************** org 0x0000 ; Address of the first program instruction goto main ; Jump to label "main" ;************************ INTERRUPT ROUTINE ************************************** org 0x0004 ; Interrupt vector movwf w_temp ; Save register W movf movwf movf movwf STATUS ; Save register STATUS status_temp PCLATH ; Save register PCLATH pclath_temp

banksel PORTB ; Selects bank containing PORTB incf PORTB ; Increments PORTB register by 1 banksel PR2 ; Selects bank containing PR2 decf PR2 ; PR2 is decremented by 1 movf pclath_temp,w ; PCLATH is given its original state movwf PCLATH movf status_temp,w ; STATUS is given its original state movwf STATUS swapf w_temp,f ; W is given its original state swapf w_temp,w banksel PIR1 ; Selects bank containing PIR1 bcf PIR1,TMR2IF ; Clears interrupt flag TMR2IF bsf retfie INTCON,GIE ; Global interrupt enabled ; Return from interrupt routine

;************************ MAIN PROGRAM ******************************************* main ; Start of the main program banksel OSCCON ; Selects bank containing register OSCCON bcf OSCCON,6 ; Selects internal oscillator HFINTOSC with bsf OSCCON,5 ; frequency of 500KHz bsf OSCCON,4

35

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES


bsf OSCCON,0 ; Microcontroller uses internal oscillator ; Selects bank containing register ANSEL ; Clears registers ANSEL and ANSELH ; All pins are digital ; Selects bank containing register TRISB ; All port B pins are configured as outputs

banksel ANSEL clrf ANSEL clrf ANSELH banksel TRISB clrf TRISB clrf PR2 banksel T2CON movlw H'FF' movwf T2CON clrf PORTB

; Selects bank containing register T2CON ; Sets all control register bits ; prescaler=1:16, postscaler=1:16 TMR2=ON

banksel PIE1 ; Selects bank containing register PIE1 bsf PIE1,TMR2IE ; TMR2 interrupt enabled bsf NTCON,PEIE ; Peripheral modules interrupt enabled ; Timer TMR2 belongs to peripheral modules bsf INTCON,GIE ; Global interrupt enabled loop goto loop ; Remain here end ; End of program

Circuito P1.9:

Actividades P1.9 Implementar la prctica en el simulador y ver cuales registros son modificados para la configuracin y operacin de la prctica, por ltimo implemente el sistema en fsico.

Prctica 1.10 Modulo CCP 1 como generador de seales tipo PWM


Descripcin P1.10: Puesto que los mdulos CCP tienen una amplia gama de posibilidades que se utilizan habitualmente en la prctica. Este ejemplo ilustra el uso del mdulo CCP1 en modo PWM. Los bits 36

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES del registro CCP1CON determinan que el mdulo funciona como un PWM de salida nica. Los mismos bits determinan la frecuencia PWM para ser de 4.88 kHz. Para hacer las cosas ms interesantes, la duracin de los pulsos en la salida P1A (PORTC, 2) se puede cambiar por medio de push-buttons simblicamente llamado "OSCURO" y "BRILLO". Los push-buttons son probados en una rutina de interrupcin iniciada por el temporizador TMR1. Cualquier cambio afecta el diodo LED para que la intensidad de la luz de este cambie. Es importante tener en cuentan que el puerto B no utiliza resistencias externas, porque utiliza las resistencias internas pull-up. Todo el proceso de generacin de la seal PWM se lleva a cabo "detrs de bambalinas", lo cual permite que el microcontrolador haga otras cosas. Cdigo P1.10:
;************************************************ ; Nombre : P1_10.asm ; Fecha : Enero 10,2013 ; Alumno : ; Grupo : IMEC ;************************************************ ; Descripcion : Modulo CCP 1 como generador de seales tipo PWM ;************************************************ ;************* DEFINING VARIABLES ******************************************* cblock 0x20 ; Block of variables starts at address 20h w_temp ; Variable at address 20h pclath_temp ; Variable at address 21h status_temp ; Variable at address 22h endc #define DARK PORTB,0 ; Push-button "DARK" is connected to PORTB,0 pin #define BRIGHT PORTB,1 ; Push-button "BRIGHT" is connected to PORTB,1 pin ;************************ PROGRAM START ************************************* org goto 0x0000 main ; First program instruction address ; Jump to label "main"

;************************ INTERRUPT ROUTINE ********************************* org movwf movf movwf movf movwf banksel btfss decf btfss incf movf movwf movf movwf swapf swapf 0x0004 w_temp ; Interrupt vector ; Save register W

STATUS ; Save register STATUS status_temp PCLATH ; Save register PCLATH pclath_temp CCPR1L DARK CCPR1L BRIGHT CCPR1L

; Tests push-button "DARK" ; Push-button is pressed - decrement CCP1L by 1 ; Testing push-button "BRIGHT" ; Push-button is pressed - increment CCP1L by 1

pclath_temp,w ; PCLATH is given its original content PCLATH status_temp,w ; STATUS is given its original content STATUS w_temp,f ; W is given its original content w_temp,w

banksel PIR1 ; Selects bank containing PIR1 bcf PIR1,TMR1IF ; Clears interrupt flag TMR1IF

37

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES

bsf bsf bsf retfie

TMR1H,7 ; Accelerates timer TMR0 counting TMR1H,6 ; INTCON,GIE ; Global interrupt enabled ; Return from interrupt routine

;************************ MAIN PROGRAM ************************************** main ; Start of the main program banksel ANSEL ; Selects bank containing register ANSEL clrf ANSEL ; Clears registers ANSEL and ANSELH clrf ANSELH ; All pins are digital banksel OPTION_REG ; Selects bank containing register ANSEL bcf OPTION_REG,7 ; Pull-up resistors enabled bsf WPUB,0 ; Pull-up resistors enabled bsf WPUB,1 ; on port B pins 0 and 1 banksel TRISC clrf TRISC banksel bcf bcf bcf bsf ; Selects bank containing register TRISC ; All port C pins are configured as outputs

T1CON ; Selects bank containing register T1CON T1CON,TMR1CS ; TMR1 operates as a timer T1CON,T1CKPS0 ; Prescaler rate is 1:8 T1CON,T1CKPS1 T1CON,TMR1ON ; Activates timer TMR1

banksel PIE1 ; Selects bank containing register PIE1 bsf PIE1,TMR1IE ; Interrupt TMR1 is enabled bsf INTCON,PEIE ; Peripheral modules interrupts are enabled bsf INTCON,GIE ; Global interrupt enabled movlw banksel movwf movlw banksel movwf banksel movlw movwf loop goto end B'11111101' ; Prescaler TMR2 = 1:4 T2CON T2CON B'11111111' ; Number in register PR2 PR2 PR2 CCP1CON B'00001100' ; Bits to configure CCP1 module CCP1CON loop ; Remain here ; End of program

38

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES Circuito P1.10:

Actividades P1.10 Implementar la prctica en el simulador y ver cuales registros son modificados para la configuracin y operacin de la prctica, por ltimo implemente el sistema en fsico.

Prctica 1.11 Uso del convertidor analgico-digital (ADC)


Descripcin P1.11: El convertidor A/D del PIC16F887 es usado en este ejemplo. Todo es muy simple. Una seal analgica variable se aplica en el pin AN2, mientras que el resultado de la conversin se muestra en el puerto B como un nmero binario. Con el fin de simplificar el programa tanto como sea posible, slo se muestran los 8 bits menos significativos del resultado de la conversin. La tierra GND se utiliza como tensin de referencia Vref- (negativa), mientras que la tensin de referencia positiva es aplicada sobre la entrada AN3. Esto permite escalar la medicin de voltaje, es decir, permite "estirar y encoger" el rango de voltaje a medir. Para aclarar esto, el convertidor A/D siempre genera un resultado binario de 10-bits, lo que significa que se detectan un total de 1024 niveles de voltaje. La diferencia entre los dos niveles de voltaje no es siempre la misma. Cuanto menor sea la diferencia entre Vref+ y Vref-, menor ser la diferencia entre dos de los niveles de 1024. En consecuencia, el convertidor A/D ser capaz de detectar pequeos cambios en el voltaje. 39

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES

Cdigo P1.11:
;************************************************ ; Nombre : P1_11.asm ; Fecha : Enero 10,2013 ; Alumno : ; Grupo : IMEC ;************************************************ ; Descripcion : Uso del convertidor analgico-digital (ADC) ;************************************* ;************************ PROGRAM START ************************************* org 0x0000 ; Address of the first program instruction

banksel TRISB ; Selects bank containing register TRISB clrf TRISB ; All port B pins are configured as outputs movlw B'00001100' movwf TRISA ; Pins RA2 and RA3 are configured as inputs banksel ANSEL ; Selects bank containing register ANSEL movlw B'00001100' ; Inputs AN2 and AN3 are analog while movwf ANSEL ; all other pins are digital clrf ANSELH banksel ADCON1 ; Selects bank including register ADCON1 bsf ADCON1,ADFM ; Right justification of result bcf ADCON1,VCFG1 ; Voltage Vss is used as Vref bsf ADCON1,VCFG0 ; RA3 pin voltage is used as Vref+ banksel ADCON0 ; Selects bank containing register ADCON0 movlw B'00001001' ; AD converter uses clock Fosc/2, AD channel movwf ADCON0 ; on RA2 pin is used for conversion and AD converter is enabled loop banksel ADCON0 btfsc ADCON0,1 ; Tests bit GO/DONE goto loop ; Conversion in progress, remain in loop banksel ADRESL movf ADRESL,w ; Lower byte of conversion result is copied to W banksel PORTB movwf PORTB ; Byte is copied to PORTB bsf ADCON0,1 ; Starts new conversion goto loop ; Jump to label "loop" end ; End of program

Circuito P1.11:

40

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES Actividades P1.11 Implementar la prctica en el simulador y ver cuales registros son modificados para la configuracin y operacin de la prctica, por ltimo implemente el sistema en fsico.

Prctica 1.12 Uso de la memoria EEPROM


Descripcin P1.12: Este ejemplo se muestra como escribir y leer en la memoria incorporada EEPROM. El programa trabaja de la siguiente manera. El programa principal lee constantemente lo que hay alojado en la direccin 5 (decimal) de la memoria EEPROM. El valor alojado en la memoria es mostrado en el puerto D. El programa principal adems verifica el estado de tres push-buttons (botones) conectados al puerto A. Los botones "INCREMENT" y "DECREMENT" tienen el mismo propsito, que los del programa 7 El incremento y decremento de la variable "cnt" que despus se visualiza en el puerto B. El tercer botn "MEMO" permite que la variable sea escrita en la memoria EEPROM. Para comprobarlo, basta con pulsar este botn y apagar el dispositivo. Cuando el dispositivo se vuelva a encender, el programa mostrar el valor de la variable en el puerto D (en el momento de la escritura, este valor se mostraba en el puerto B). Cdigo P1.12:
;************************************************ ; Nombre : P1_12.asm ; Fecha : Enero 10,2013 ; Alumno : ; Grupo : IMEC ;************************************************ ; Descripcion : Uso de la memoria EEPROM ;************************************* ;*********** Defining variables in program ********************************** cblock 0x20 ; Block of variables starts at address 20h HIcnt LOcnt LOOPcnt cnt endc

; End of block

;**************************************************************************** ORG 0x000 ; Reset vector nop goto main ; Go to start of the program (label "main") ;**************************************************************************** include "pause.inc" include "button.inc" ;**************************************************************************** main banksel ANSEL ; Selects bank containing ANSEL clrf ANSEL clrf ANSELH ; All pins are digital banksel TRISB bsf TRISA, 0 bsf TRISA, 1 bsf TRISA, 2 clrf TRISB clrf TRISD banksel PORTB clrf PORTB

; Input pin ; Input pin ; Input pin ; All port B pins are outputs ; All port D pins are outputs ; PORTB=0

41

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES


clrf PORTD ; PORTD=0 clrf cnt ; cnt=0 Loop banksel PORTA button PORTA,0,0,Increment button PORTA,1,0,Decrement button PORTA,2,0,Save banksel EEADR movlw .5 ; Reads EEPROM memory location movwf EEADR ; at address 5 banksel EECON1 bcf EECON1,EEPGD bsf EECON1,RD ; Reads data from EEPROM memory banksel EEDATA movfw EEDATA ; Moves data to W banksel PORTD movwf PORTD ; Data is moved from W to PORTD goto Loop Increment ; Increments number on port B incf cnt, f movf cnt, w movwf PORTB goto Loop Decrement ; Decrements number on port B decf cnt, f movf cnt, w movwf PORTB goto Loop Save ; Copies data from port B to EEPROM banksel EEADR ; memory location at address 5 movlw .5 movwf EEADR ; Writes address banksel PORTB movfw PORTB ; Copies port B to register W banksel EEDAT movwf EEDAT ; Writes data to temporary register banksel EECON1 bcf EECON1,EEPGD bsf EECON1,WREN ; Write enabled bcf btfsc goto INTCON,GIE INTCON,GIE $-2 ; All interrupts disabled

movlw 55h movwf EECON2 movlw H'AA' movwf EECON2 bsf EECON1,WR btfsc goto bsf bcf goto end EECON1,WR $-1 ; Wait for write to complete

INTCON,GIE ; Interrupt enabled EECON1,WREN Loop ; Tests push-buttons again ; End of program

42

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES Circuito P1.12:

Actividades P1.12 Implementar la prctica en el simulador y ver cuales registros son modificados para la configuracin y operacin de la prctica, por ltimo implemente el sistema en fsico.

Prctica 1.13 Contador de dos dgitos multiplexado


Descripcin P1.13: En este ejemplo, el microcontrolador funciona como un contador de dos dgitos. Concretamente, la variable Dval se decrementa (lo suficientemente lento como para ser visible) y su valor se muestra en 2 displays de 7 segmentos (99-0). El desafo es convertir el nmero binario a decimal en los 2 displays (decenas y unidades). Adems, puesto que los segmentos de los displays de LED estn conectados en paralelo (al mismo puerto del PIC), es necesario asegurar un cambio rpido con el fin de dar la impresin de que ambos displays emiten luz simultnea (multiplexacin por divisin de tiempo). Es importante recordar que en electrnica, la multiplexacin permite que varias seales analgicas sean procesadas por un solo convertidor analgico-digital (ADC). En este caso, la multiplexacin por divisin de tiempo se lleva a cabo por el temporizador TMR0, mientras que la conversin de nmero binario a nmero decimal se realiza en un macro "digbyte". 43

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES El contador puede ponerse en su valor inicial (99) en cualquier momento pulsando el botn "RESET COUNTER". Cdigo P1.13:
;************************************************ ; Nombre : P1_13.asm ; Fecha : Enero 10,2013 ; Alumno : ; Grupo : IMEC ;************************************************ ; Descripcion : Contador de dos dgitos multiplexado ;************************************* ;**************************************************************************** ; DEFINING VARIABLES IN PROGRAM w_temp EQU 0x7D ; Variable for saving W register status_temp EQU 0x7E pclath_temp EQU 0x7F CBLOCK Digtemp Dig0 Dig1 Dig2 Dig3 Dval One ENDC poc_vr include EQU .99 "Digbyte.inc" 0x20 ; Variable for saving STATUS register ; Variable for saving PCLATH register

; Block of variables starts at address 20h

; Variables for displaying digits - LSB

; Variables for displaying digits - MSB ; Counter value ; Auxiliary variable which determines which display is to be switched on ; End of block of variables ; Initial counter value is 99

;**************************************************************************** ORG 0x0000 ; First instruction address goto main ; Jump to label "main" ;**************************************************************************** ORG 0x0004 ; Interrupt vector address movwf movf movwf movf movwf w_temp ; Move w register to w_temp register STATUS,w ; Move STATUS register to status_temp status_temp ; register PCLATH,w ; Move PCLATH register to pclath_temp pclath_temp ; register

; Start of interrupt routine... BANKSEL TMR0 movlw .100 movwf TMR0 bcf INTCON, T0IF bcf bcf btfsc goto goto Lsdon incf PORTA, 0 PORTA, 1 One, 0 Lsdon Msdon

One, f

44

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES


movlw HIGH (Bcdto7seg) movwf PCLATH digbyte Dval movf Dig1, w call Bcdto7seg ; Place L1 mask on the PORTD movwf PORTD bsf PORTA, 1 goto ISR_end Msdon incf One, f movlw HIGH (Bcdto7seg) movwf PCLATH digbyte Dval movf Dig0, w call Bcdto7seg ; Place LO mask on the PORTD movwf PORTD bsf PORTA, 0 goto ISR_end ; End of interrupt routine... ISR_end movf movwf movf movwf swapf

pclath_temp,w ; PCLATH register is given its original PCLATH ; state status_temp,w ; STATUS register is given its original STATUS ; state w_temp,f ; W register is given its original ; state w_temp,w ; Return from interrupt routine ; Selects bank containing ANSEL ; All pins are digital

swapf retfie main banksel ANSEL clrf ANSEL clrf ANSELH

BANKSEL TRISA movlw b'11111100'

; RA0 and RA1 are configured as outputs and used for 7-segment display multiplexing RA2 is input ;push-button for initialization

movwf TRISA clrf TRISD BANKSEL OPTION_REG movlw b'10000110' ; TMR0 is incremented each 32us (Fclk=8MHz) movwf OPTION_REG BANKSEL PORTA movlw poc_vr movwf Dval ; Dval contains counter value movlw b'00000001' ; Initializes variable specifying display movwf One ; to switch on movwf PORTA movlw .100 movwf TMR0 ; TMR0 interrupt appr.every 10ms bsf INTCON, GIE ; Global interrupt enabled bsf INTCON, T0IE ; Timer TMR0 interrupt enabled bcf INTCON, T0IF Loop btfss One, 3 ; Falling edge encountered? goto Dec ; Yes! Go to Dec btfss PORTA, 2 ; Counter reset button pressed? goto Reset ; Yes! Go to Reset goto Loop ; Decrement Dval counter by 1

45

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES


Dec btfss One, 3 goto Dec movf Dval, f btfsc STATUS, Z ; Is Dval equal to 0? goto Loop ; If it is, go to loop and wait for T2 decf Dval, f ; If Dval not equal to 0, decrement it by 1 goto Loop Reset btfss PORTA, 2 ; Wait for rising edge goto Reset movlw poc_vr movwf Dval ; Write initial value to counter goto Loop ;**************************************************************************** ORG 0x0300 ; Lookup table is at the top of third page, but can be placed at some other place, it is important to have it ; all on one page Bcdto7seg addwf PCL, f DT 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f ;**************************************************************************** END ; End of program

Macro digbyte Archivo:Digbyte.inc


; Todo este cdigo va en un archivo llamado Digbyte.inc ;**************************************************** digbyte MACRO arg0 LOCAL Exit0 LOCAL Exit1 LOCAL Exit2 clrf clrf clrf clrf movf movwf movlw Exit2 incf subwf btfsc goto decf addwf Exit1 movlw incf subwf btfsc goto decf addwf Exit0 movf movwf ENDM Dig0 Dig1 Dig2 Dig3 arg0, w Digtemp .100 Dig2, f Digtemp, f STATUS, C Exit2 Dig2, f Digtemp, f .10 Dig1, f Digtemp, f STATUS, C Exit1 Dig1, f Digtemp, f Digtemp, w Dig0

46

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES Circuito P1.13:

Actividades P1.13 Implementar la prctica en el simulador y ver cuales registros son modificados para la configuracin y operacin de la prctica, por ltimo implemente el sistema en fsico.

Prctica 1.14 Generacin de sonidos usando macros


Descripcin P1.14: La generacin de sonido es una tarea comnmente asignada al microcontrolador. Bsicamente, todo se trata de generar una secuencia de pulsos en el pin de salida. Al hacer esto, la proporcin de la duracin del cero lgico (0) contra el uno lgico (1) determina la altura del tono y cambiando los diferentes tonos, surgen diferentes melodas. En este ejemplo, cualquier accin de los push-buttons T1 y T2 genera un sonido. Las instrucciones correspondientes se almacenan en una macro "beep" que contiene dos argumentos: la frecuencia y la duracin. Cdigo P1.14:
;************************************************ ; Nombre : P1_14.asm ; Fecha : Enero 10,2013 ; Alumno : ; Grupo : IMEC ;************************************************ ; Descripcion : Generacin de sonidos usando macros ;************************************* ;******************* Defining variables in program ******************** cblock 0x20 HIcnt ; Auxiliary variables for macro pausems LOcnt LOOPcnt PRESCwait Beep_TEMP1 ; Belongs to macro "BEEP" Beep_TEMP2 Beep_TEMP3

47

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES


endc #define BEEPport PORTD, 2 #define BEEPtris TRISD, 2 expand ;********************************************************************** ORG 0x0000 ; RESET vector address goto main ; Jump to program start (label - main) ;********************************************************************** ; remaining code goes here include "pause.inc" include "button.inc" include "beep.inc" main banksel ANSEL ; Selects bank containing ANSEL clrf ANSEL ; All outputs are digital clrf ANSELH banksel movlw movwf banksel BEEPinit Loop button button goto Play1 BEEP BEEP BEEP BEEP goto TRISD b'11111011' ; PORTA D initialization TRISD PORTD ; Macro "Beep" PORTD,0,0,Play1 ; Push-button 1 PORTD,1,0,Play2 ; Push-button 2 Loop ; First tone 0xFF, 0x02 0x90, 0x05 0xC0, 0x03 0xFF, 0x03 Loop ; Speaker pin

Play2 ; Second tone BEEP 0xBB, 0x02 BEEP 0x87, 0x05 BEEP 0xA2, 0x03 BEEP 0x98, 0x03 goto Loop ;********************************************************************** END ; End of program

Macro beep Archivo: beep.inc


BEEPinit MACRO bcf STATUS, RP0 bcf STATUS, RP1 bcf BEEPport bsf STATUS, RP0 bcf STATUS, RP1 bcf BEEPtris movlw b'00000111' ; TMR0 prescaler rate 1:256 movwf OPTION_REG ; OPTION <- W bcf STATUS, RP0 bcf STATUS, RP1 ENDM BEEP MACRO freq, duration bcf STATUS, RP0

48

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES


bcf STATUS, RP1 movlw freq movwf Beep_TEMP1 movlw duration movwf Beep_TEMP2 call BEEPsub ENDM ;********************************************************************** ; Subroutines BEEPsub clrf TMR0 ; Counter initialization bcf INTCON, T0IF bcf BEEPport BEEPa bcf INTCON, T0IF ; Clears TMR0 Overflow Flag BEEPb bsf BEEPport call B_Wait ; Logic one "1" duration bcf BEEPport call B_Wait ; Logic zero "0" duration btfss INTCON, T0IF ; Check TMR0 Overflow Flag, goto BEEPb ; skip next if set decfsz Beep_TEMP2, f ; Is Beep_TEMP2 = 0 ? goto BEEPa ; Go to BEEPa again return B_Wait movf Beep_TEMP1, w movwf Beep_TEMP3 B_Waita decfsz Beep_TEMP3, f goto B_Waita return

Circuito P1.14:

49

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES Actividades P1.14 Implementar la prctica en el simulador y ver cuales registros son modificados para la configuracin y operacin de la prctica, por ltimo implemente el sistema en fsico.

Prctica 1.15 Uso del display de cristal lquido (LCD)


Descripcin P1.15: Este ejemplo ilustra el uso de la pantalla LCD alfanumrica. El programa en s es muy simple ya que se utilizan las macros (por lo general el esfuerzo de crear macros vale la pena al final). Se muestran dos mensajes escritos en 2 lneas en la pantalla LCD. El segundo mensaje se destina a mostrar la temperatura actual. Dado que no hay ningn sensor instalado, la medicin no se lleva a cabo realmente, simplemente el valor de la variable "temp" aparece en la pantalla. Cdigo P1.15:
;************************************************ ; Nombre : P1_15.asm ; Fecha : Enero 10,2013 ; Alumno : ; Grupo : IMEC ;************************************************ ; Descripcion : Utilizacin del display de cristal lquido (LCD) ;************************************* ; DEFINING VARIABLES IN PROGRAM CBLOCK HIcnt LOcnt LOOPcnt LCDbuf LCDtemp LCDportBuf Digtemp Dig0 Dig1 Dig2 Dig3 temp ENDC 0x20 ; Block of variables starts at address 20h ; Belongs to macro "pausems"

; Belongs to functions "LCDxxx" ; LCD Port Buffer ; Belongs to macro "digbyte"

; End of block

LCDport EQU PORTB ; LCD is on PORTB (4 data lines on RB0-RB3) RS EQU 4 ; RS line connected to RB4 EN EQU 5 ; EN line connected to RB5 ;********************************************************************** ORG 0x0000 ; Reset vector address nop goto main ; Go to beginning of the program (label "main") ;********************************************************************** include "LCD.inc" include "digbyte.inc" include "pause.inc" ;********************************************************************** main banksel ANSEL ; Selects bank containing ANSEL

50

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES


clrf clrf ANSEL ANSELH ; All pins are digital

bcf STATUS,RP0 ; Bank0 active only bcf STATUS,RP1 movlw .23 movwf temp ; Move arbitrary value to variable is to be displayed on LCD lcdinit ; LCD initialization Loop lcdcmd 0x01 ; Instruction to clear LCD lcdtext 1, "UTCH" ; Write text from the beginning of the first line lcdtext 2, "CAZADORES" ; Write text from the beginning of the second line pausems .2000 ; 2 sec. delay lcdcmd 0x01 ; Instruction to clear LCD lcdtext 1, "Temperatura1" ; Write text from the beginning of the first line lcdtext 2, "temp=" ; Write text from the beginning of the second line lcdbyte temp ; Write variable (dec.) lcdtext 0, " C" ; Write text after cursor pausems .2000 ; 2 sec. delay goto Loop ;********************************************************************** end ; End of program

Archivo LCD.inc
; Esto va en un archivo que lleva el nombre de LCD.inc ;********************************************************************** ; Initialization must be done by using macro lcdinit before accessing LCD ;********************************************************************** lcdinit MACRO bcf STATUS, RP0 ; Bank0 bcf STATUS, RP1 clrf LCDportBuf movf LCDportBuf, w movwf LCDport bsf STATUS, RP0 ; Bank1 bcf STATUS, RP1 clrf TRISB ; LCDport with output LCD bcf STATUS, RP0 ; Bank0 bcf STATUS, RP1 ; Function set (4-bit mode change) movlw b'00100000' movwf LCDbuf swapf LCDbuf, w movwf LCDportBuf bcf LCDportBuf, RS movf LCDportBuf, w movwf LCDport bsf LCDportBuf, EN movf LCDportBuf, w movwf LCDport bcf LCDportBuf, EN movf LCDportBuf, w movwf LCDport call Delay1ms ; 1 ms delay ; Function set (display mode set) lcdcmd b'00101100' call Delay1ms ; 1 ms delay ; Display ON/OFF Control lcdcmd b'00001100'

51

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES


call Delay1ms ; 1 ms delay

; Entry Mode Set lcdcmd b'00000110' call Delay1ms ; 1 ms delay ; Display Clear lcdcmd b'00000001' pausems .40 ; 40 ms delay ; Function set (4-bit mode change) movlw b'00100000' movwf LCDbuf swapf LCDbuf, w movwf LCDportBuf bcf LCDportBuf, RS movf LCDportBuf, w movwf LCDport bsf LCDportBuf, EN movf LCDportBuf, w movwf LCDport bcf LCDportBuf, EN movf LCDportBuf, w movwf LCDport call Delay1ms ; 1 ms delay ; Function set (display mode set) lcdcmd b'00101100' call Delay1ms ; 1 ms delay ; Display ON/OFF Control lcdcmd b'00001100' call Delay1ms ; 1 ms delay ; Entry Mode Set lcdcmd b'00000110' call Delay1ms ; 1 ms delay ; Display Clear lcdcmd b'00000001' pausems .40 ; 40 ms delay ENDM ;********************************************************************** ; lcdcmd sends command to LCD (see the table on the previous page) ; lcdclr is the same as lcdcmd 0x01 ;********************************************************************** lcdcmd MACRO LCDcommand ; Send command to LCD movlw LCDcommand call LCDcomd ENDM LCDcomd movwf bcf movf movwf goto LCDdata movwf bsf movf movwf goto LCDwr swapf

LCDbuf LCDportBuf, RS LCDportBuf, w LCDport LCDwr LCDbuf LCDportBuf, RS LCDportBuf, w LCDport LCDwr LCDbuf, w

52

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES


call SendW movf LCDbuf, w call SendW return SendW andlw 0x0F movwf LCDtemp movlw andwf movf iorwf movf movwf call bsf movf movwf bcf movf movwf call return 0xF0 LCDportBuf, f LCDtemp, w LCDportBuf, f LCDportBuf, w LCDport Delay1ms LCDportBuf, EN LCDportBuf, w LCDport LCDportBuf, EN LCDportBuf, w LCDport Delay1ms

;********************************************************************** ; lcdtext writes text containing 16 characters which represents a ; macro argument. The first argument select selects the line in which ; text writing is to start. If select is 0, text writing starts from ; cursor current position. ;********************************************************************** lcdtext MACRO select, text ; This macro writes text from cursor current position. Text is specified in argument consisting ;of 16 characters local Message local Start local Exit local i=0 goto Start Message DT text ; Create lookup table from arguments DT 0 Start IF (select == 1) lcdcmd b'10000000' ELSE IF (select == 2) lcdcmd b'11000000' ENDIF ENDIF WHILE (i<16) call Message+i addlw 0 bz Exit call LCDdata i=i+1 ENDW Exit ENDM ;********************************************************************** ; This macro writes value in size of 1 byte on LCD excluding leading zeros ;********************************************************************** lcdbyte MACRO arg0 digbyte arg0 ; A hundred is in Dig2, A ten is in Dig1 and one in Dig0 movf Dig2, w addlw 0x30 call LCDdata ; Repeat conditional program compiling 16 times ; Read lookup table and place value in W ; until 0 is read ; Call routine displaying W on LCD

53

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES


movf Dig1, w ; If digit is 0 move cursor addlw 0x30 call LCDdata movf Dig0, w ; If digit is 0 move cursor addlw 0x30 call LCDdata ENDM ;********************************************************************** ; 1ms Delay Delay1ms: movlw .200 movwf LOOPcnt Delay10us: nop ;1us nop ;1us nop ;1us nop ;1us nop ;1us nop ;1us nop ;1us decfsz LOOPcnt, f ;1us goto Delay10us ;2us return

Circuito P1.15:

Actividades P1.15 Implementar la prctica en el simulador y ver cuales registros son modificados para la configuracin y operacin de la prctica, por ltimo implemente el sistema en fsico.

Prctica 1.16 Comunicacin serial RS232


Descripcin P1.16: Este ejemplo ilustra el uso del mdulo EUSART del microcontrolador. La conexin al PC se activa a travs de protocolo estndar de comunicacin RS232 (serie). El programa trabaja de la siguiente manera: Cada byte recibido a travs de la comunicacin en serie se muestra mediante diodos LED conectados al puerto B y se devuelve automticamente al transmisor. Si se produce un error en la recepcin, se indica poniendo a todos los LED encendidos. La forma ms fcil de probar el 54

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES funcionamiento del dispositivo en la prctica es utilizar el programa estndar de Windows llamado Hyper Terminal. Cdigo P1.16:
;************************************************ ; Nombre : P1_16.asm ; Fecha : Enero 10,2013 ; Alumno : ; Grupo : IMEC ;************************************************ ; Descripcion : Comunicacin serial RS232 ;************************************* ; DEFINING VARIABLES IN PROGRAM w_temp EQU 0x7D status_temp EQU 0x7E pclath_temp EQU 0x7F ; Variable for saving W register ; Variable for saving STATUS register ; Variable for saving PCLATH w register

cblock 0x20 ; Block of variables starts at address 20 h Port_A ; Variable at address 20 h Port_B ; Variable at address 21 h RS232temp ; Variable at address 22 h RXchr ; Variable at address 23 h endc ; End of block of variables ;********************************************************************** ORG 0x0000 ; Reset vector nop goto main ; Go to beginning of program (label "main") ;********************************************************************** ORG 0x0004 ; Interrupt vector address movwf w_temp ; Save value of W register movf STATUS,w ; Save value of STATUS register movwf status_temp movf PCLATH,w ; Save value of PCLATH register movwf pclath_temp ;********************************************************************** ; This part of the program is executed in interrupt routine banksel PIE1 btfss PIE1, RCIE goto ISR_Not_RX232int banksel PIE1 btfsc PIR1, RCIF call RX232_int_proc ISR_Not_RX232int movf pclath_temp,w movwf PCLATH ; PCLATH is given its original value movf movwf swapf swapf status_temp,w STATUS ; STATUS is given its original value w_temp,f w_temp,w ; W is given its original value

retfie ; Return from interrupt routine ;********************************************************************** RX232_int_proc ; Check if error has occurred banksel RCSTA movf RCSTA, w movwf RS232temp btfsc RS232temp, FERR goto RX232_int_proc_FERR btfsc RS232temp, OERR goto RX232_int_proc_OERR

55

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES


goto RX232_int_proc_Cont

RX232_int_proc_FERR bcf RCSTA, CREN ; To clear FERR bit, receiver is first ; switched off and on afterwards nop ; Delay ... nop bsf RCSTA, CREN movf RCREG, w ; Reads receive register and clears FERR bit bsf Port_A, 0 ; Switches LED on ( UART error indicator) movf Port_A, w movwf PORTA goto RS232_exit RX232_int_proc_OERR bcf RCSTA, CREN ; Clears OERR bit nop ; Delay ... nop bsf RCSTA, CREN movf RCREG, w ; Reads receive register and clears FERR bit bsf Port_A, 1 ; Switches LED on ( UART error indicator) movf Port_A, w movwf PORTA goto RS232_exit RX232_int_proc_Cont movf RCREG, W movwf RXchr movwf PORTB movwf TXREG

; Reads received data

; Sends data back to PC

RS232_exit return ; Return from interrupt routine ;********************************************************************** ; Main program main banksel ANSEL clrf ANSEL clrf ANSELH

; Selects bank containing ANSEL ; All inputs are digital

;--------------------------------------; Port configuration ;--------------------------------------banksel TRISA movlw b'11111100' movwf TRISA movlw b'00000000' movwf TRISB ;--------------------------------------; Setting initial values ;--------------------------------------banksel PORTA movlw b'11111100' movwf PORTA movwf Port_A movlw b'00000000' movwf PORTB movwf Port_B ;--------------------------------------; USART - setting for 38400 bps ;--------------------------------------banksel TRISC bcf TRISC, 6 ; RC6/TX/CK = output bsf TRISC, 7 ; RC7/RX/DT = input

56

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES


banksel BAUDCTL bsf BAUDCTL, BRG16 banksel SPBRG movlw .51 ; baud rate = 38400 ( Fosc/(4*(SPBRG+1)) ) Error +0.16% movwf SPBRG clrf SPBRGH banksel TXSTA bcf TXSTA, TX9 ; Data is 8-bit wide bsf TXSTA, TXEN ; Data transmission enabled bcf TXSTA, SYNC ; Asynchronous mode bsf TXSTA, BRGH ; High-speed Baud rate banksel RCSTA bsf RCSTA, SPEN ; RX/DT and TX/CK outputs configuration bcf RCSTA, RX9 ; Select mode for 8-bit data receive bsf RCSTA, CREN ; Receive data enabled bcf RCSTA, ADDEN ; No address detection, ninth bit may be used as parity bit movf RCSTA, W movf RCREG, W ;--------------------------------------; Interrupts enabled ;--------------------------------------banksel PIE1 bsf PIE1, RCIE ; USART Rx interrupt enabled bsf bsf INTCON, PEIE ; All peripheral interrupts enabled INTCON, GIE ; Global interrupt enabled

;--------------------------------------; Remain here ;--------------------------------------goto $ end ; End of program

Circuito P1.16:

57

UNIDAD I ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES Actividades P1.16 Implementar la prctica en el simulador y ver cuales registros son modificados para la configuracin y operacin de la prctica, por ltimo implemente el sistema en fsico.

58

UNIDAD II PROGRAMACIN DE MICROCONTROLADORES CON ELEMENTOS DE LENGUAJE C

Unidad II PROGRAMACIN ELEMENTOS DE LENGUAJE C

DE

MICROCONTROLADORES

CON

Prctica 2.1 Encendido de leds y configuraciones bsicas.


Descripcin P2.1: El propsito de esta prctica es encender varios diodos LED en el puerto B del microcontrolador. Utilice este ejemplo para examinar cmo es un programa real en lenguaje C. La siguiente figura muestra el esquema de conexin elctrico. Circuito P2.1:

Al encender la fuente de alimentacin, los diodos LED en el puerto B emiten luz y se apagan contantemente (11 veces), luego encienden de forma intercalada (efecto serie navidea), lo que indica que el microcontrolador est conectado correctamente y que funciona normalmente. En este ejemplo se muestra cmo escribir una cabecera correctamente. Lo mismo se aplica a todos los programas descritos en esta seccin. Para no repetir, en los siguientes ejemplos no vamos a escribir la cabecera. Se considera estar en el principio de cada programa, marcada como "Cabecera". Cdigo P2.1:
/* * Este es el Header * Nombre del programa : p2_1.c * Grupo: IMEC81N * Descripcion: Programa simple para demostrar el funcionamiento de un uC encendiendo y apagando leds conectados al puerto B. * Configuracion:

59

UNIDAD II PROGRAMACIN DE MICROCONTROLADORES CON ELEMENTOS DE LENGUAJE C


* Microcontroladores: PIC16F887 * Kit de desarrollo: sistema mnimo * Oscilador: HS, 8.0 MHz * Notas: Construir el sistema mnimo en un protoboard */ int k; void main() { //Aqu inicia el programa ANSEL = 0; ANSELH = 0; TRISB = 0; PORTB = 0XFF; delay_ms(1000); PORTB = 0; for(k=1; k<20; k++) { switch(PORTB) { //Revisamos el estado del puerto case 0x00: //Si est apagado PORTB = 0xFF; //Encendemos los leds delay_ms(400); break; case 0XFF://Si est encendido PORTB = 0x00; //Apagamos los leds delay_ms(600); } } PORTB = 0b01010101; //Encendemos los leds de forma intercalada while(1) { PORTB = ~PORTB; //Se invierte el estado del puerto, efecto serie navidea delay_ms(200); } }

Prctica 2.2 Oscilador interno y mezcla de lenguaje ensamblador y C


Descripcin P2.2: En realidad, esto es una continuacin del ejemplo anterior, pero se ocupa de un problema un poco ms complicado. El propsito es hacer que los LEDs en el puerto B parpadeen ms lentamente. Se puede realizar al introducir un valor suficientemente grande para el parmetro del tiempo de retardo en la funcin Delay. No obstante, hay otra manera ms eficiente para ejecutar el programa lentamente. Es importante recordar que este microcontrolador tiene un oscilador incorporado LFINTOSC que funciona a una frecuencia de 31kHz. Ahora lleg la hora de darle una oportunidad. El programa se inicia con el bucle do-while y se queda all por 20 ciclos. Despus de cada iteracin, llega el tiempo de retardo de 100ms, indicado por un parpadeo relativamente rpido de los LED en el puerto B. Cuando el programa salga de este bucle, el microcontrolador se inicia al utilizar el oscilador LFINTOSC como una fuente de seal de reloj. Los LEDs parpadean ms lentamente

60

UNIDAD II PROGRAMACIN DE MICROCONTROLADORES CON ELEMENTOS DE LENGUAJE C aunque el programa ejecuta el mismo bucle do-while con un tiempo de retardo 10 veces ms corto. Con el propsito de hacer evidentes algunas situaciones potencialmente peligrosas, se activan los bits de control por medio de las instrucciones en ensamblador. Dicho de manera sencilla, al entrar o salir una instruccin en ensamblador en el programa, el compilador no almacena los datos en un banco actualmente activo de la RAM, lo que significa que en esta seccin de programa, la seleccin de bancos depende del registro SFR utilizado. Al volver a la seccin de programa escrito en C, los bits de control RP0 y RP1 deben recuperar el estado que tenan antes de la aventura en ensamblador. En este programa, el problema se resuelve utilizando la variable auxiliar saveBank, lo que guarda el estado de estos dos bits. Circuito P2.2:

Cdigo P2.2:
/* ***Header *********************************************/ int k = 0; char saveBank; void main() { ANSEL = 0; ANSELH = 0; TRISB = 0; PORTB = 0; do { PORTB = ~PORTB; Delay_ms(100); k++; } while(k<20);

// Todos los pines I/O configurados como digitales //Analog select register/high register // Todo el Puerto B se configura como salida // Todo el Puerto B se inicializa en 0

// Se invierte el estado lgico del puerto B // Retardo de 100ms // Se incrementa el contador k // Se repite el ciclo mientras k<20

61

UNIDAD II PROGRAMACIN DE MICROCONTROLADORES CON ELEMENTOS DE LENGUAJE C


k=0; // Se reinicia la variable k saveBank = STATUS & 0b01100000; // Se guarda el estado de RP0 y RP1 (bits 5 y 6 del registro status) nicamente asm { bsf STATUS,RP0 bcf STATUS,RP1 bcf OSCCON,6 bcf OSCCON,5 bcf OSCCON,4 bsf OSCCON,0 } // Se inicia secuencia en ensamblador // Se selecciona el banco de memoria que contiene el registro OSCCON // Se selecciona el oscilador interno LFINTOSC // de 31KHz de frecuencia // El microcontrolador usa el oscilador interno // Fin de la secuencia en ensamblador

STATUS &= 0b10011111; // Los bits RP0 y RP1 regresan a su estado original STATUS |= saveBank; do { PORTB = ~PORTB; // Invierte el estado lgico del puerto Delay_ms(10); // Retardo de 10 ms k++; // Se incrementa k } while(k<20); // Se repite mientras que k<20 }

Prctica 2.3 Temporizador TMR0 como contador, variables y relevadores


Descripcin P2.3: En cuanto a los ejemplos anteriores, el microcontrolador ha ejecutado el programa sin haber sido afectado de ninguna forma por su entorno. En la prctica, hay pocos dispositivos que funcionen de esta manera (por ejemplo, un simple controlador de luz de nen). Los pines de entrada se utilizan tambin en este ejemplo. El temporizador Timer0 se utiliza como un contador. La entrada del contador est conectada a un botn externo, as que cada vez que se presiona el botn, el temporizador Timer0 cuenta un pulso. Cuando el nmero de pulsos coincida con el nmero almacenado en el registro TEST, un 1 lgico (5V) aparecer en el pin PORTD.3. Este voltaje activa un rel electromecnico, y por eso este bit se le denomina REL en el programa. Circuito P2.3:

62

UNIDAD II PROGRAMACIN DE MICROCONTROLADORES CON ELEMENTOS DE LENGUAJE C Cdigo P2.3:


/*Header******************************************************/ void main() { char TEST = 5; // Constante TEST = 5 enum outputs {RELAY = 3}; // Constante RELAY = 3 ANSEL = 0; // Todos los pines I/O configurados como digitales ANSELH = 0; TRISA = 0xFF; // Se configuran los pines del puerto A como entradas TRISD = 0b11110111; //El Pin RD3 se configura como salida, mientras que el resto como entradas PORTD = 0; // Se inicializa el puerto D OPTION_REG.F5 = 1; OPTION_REG.F3 = 1; TMR0 = 0; // El contador TMR0 recibe pulsos a travs del pin RA4 //El prescaler se establece a razn 1:1

// Se reinicia el timer/contador TMR0

do { if (TMR0 == TEST) // Es igual el nmero del timer con la constante TEST? (PORTD.RELAY = 1); // Si es as. Activa la salida del Relay } while (1); // Ciclo infinito }

Slo una constante de enumeracin REL se utiliza en este ejemplo. Se le asigna un valor mediante la declaracin.
enum salidas {REL = 3}; // Constante REL = 3

Si varios pines del puerto PORTD estn conectados a los rels, la expresin anterior se puede escribir de la siguiente manera tambin:
enum salidas {REL=3, CALENTADOR, MOTOR=6, SURTIDOR};

A todas las constantes, precedidas por las constantes con valores asignados (REL=3 y MOTOR=6), se les asignan automticamente los valores de las constantes precedentes, incrementados en 1. En este ejemplo, a las constantes CALENTADOR y SURTIDOR se les asignan los valores 4 y 7, es decir (CALENTADOR=4 y SURTIDOR=7), respectivamente.

Prctica 2.4 Temporizadores TMR0, TMR1 y TMR2 e interrupciones


Descripcin P2.4: Al analizar los ejemplos anteriores, es importante notar la desventaja de proporcionar tiempo de retardo por medio de la funcin delay. En estos casos, el microcontrolador se queda esttico y no hace nada. Simplemente espera que transcurra una cierta cantidad de tiempo. Tal prdida de tiempo es un lujo inaceptable, por lo que se deber aplicar otro mtodo. Al igual que en las prcticas 1.4 y 1.8, en este ejemplo se utilizarn los temporizadores y las interrupciones. El esquema se queda inalterado, y el desafo sigue siendo presente. Es necesario 63

UNIDAD II PROGRAMACIN DE MICROCONTROLADORES CON ELEMENTOS DE LENGUAJE C proporcionar un tiempo de retardo suficiente largo para darse cuenta de los cambios en el puerto. Para este propsito se utiliza el temporizador Timer0 con el pre-escalador asignado. Siempre que se genere una interrupcin con cada desbordamiento en el registro del temporizador, la variable cnt se aumenta automticamente en 1 al ejecutarse cada rutina de interrupcin. Cuando la variable llega al valor 400, el puerto PORTB se incrementa en 1. Todo el procedimiento se lleva a cabo entre bastidores, lo que habilita al microcontrolador para hacer otra tarea. Circuito P2.4:

Cdigo P2.4:

/*Cabecera******************************************************/ unsigned cnt; // Definir la variable cnt

void interrupt() { cnt++; // Con una interrupcin la cnt se incrementa en 1 TMR0 = 96; // El valor inicial se devuelve en el temporizador TMR0 INTCON = 0x20; // Bit T0IE se pone a 1, el bit T0IF se pone a 0 } void main(){ OPTION_REG = 0x84; // Pre-escalador se le asigna al temporizador TMR0 ANSEL = 0; // Todos los pines de E/S se configuran como digitales ANSELH = 0; TRISB = 0; // Todos los pines de puerto PORTB se configuran como salidas PORTB = 0x0; // Reiniciar el puerto PORTB TMR0 = 96; // Temporizador T0 cuenta de 96 a 255 INTCON = 0xA0; // Habilitada interrupcin TMR0 cnt = 0; // A la variable cnt se le asigna un 0 do { // Bucle infinito if (cnt == 400) { // Incrementar el puerto PORTB despus 400 interrupciones

64

UNIDAD II PROGRAMACIN DE MICROCONTROLADORES CON ELEMENTOS DE LENGUAJE C


PORTB = PORTB++; // Incrementar nmero en el puerto PORTB en 1 cnt = 0; // Reiniciar la variable cnt } } while(1); }

Siempre que se produzca un desbordamiento en el registro del temporizador TRM0, ocurre una interrupcin.
/*Cabecera******************************************************/ unsigned short cnt; // Definir la variable cnt void interrupt() { cnt++ ; // Con una interrupcin la cnt se incrementa en 1 PIR1.TMR1IF = 0; // Reiniciar el bit TMR1IF TMR1H = 0x80; // El valor inicial se devuelve en los registros TMR1L = 0x00; // del temporizador TMR1H y TMR1L } void main() { ANSEL = 0; // Todos los pines de E/S se configuran como digitales ANSELH = 0; TRISB = 0; // Pines del puerto PORTB se configuran como salidas PORTB = 0xF0; // Valor inicial de los bits del puerto PORTB T1CON = 1; // Configurar el temporizador TMR1 PIR1.TMR1IF = 0; // Reiniciar el bit TMR1IF TMR1H = 0x80; // Ajustar el valor inicial del temporizador TMR1 TMR1L = 0x00; PIE1.TMR1IE = 1; // Habilitar la interrupcin al producirse un desbordamiento cnt = 0; // Reiniciar la variable cnt INTCON = 0xC0; // Interrupcin habilitada (bits GIE y PEIE) do { // Bucle infinito if (cnt == 76) { // Cambiar el estado del puerto PORTB despus de 76 interrupciones PORTB = ~PORTB; // Nmero en el puerto PORTB est invertido cnt = 0; // Reiniciar la variable cnt } } while (1); }

65

UNIDAD II PROGRAMACIN DE MICROCONTROLADORES CON ELEMENTOS DE LENGUAJE C En este caso, una interrupcin se habilita despus de que se produce un desbordamiento en el registro del temporizador TMR1 (TMR1H, TMR1L). Adems, la combinacin de los bits que vara en el puerto POTRB difiere del ejemplo anterior.
/*Cabecera******************************************************/ unsigned short cnt; // Definir la variable cnt void Reemplazar() { PORTB = ~PORTB; // Definir nueva funcin Reemplazar } // Funcin invierte el estado del puerto void interrupt() { if (PIR1.TMR2IF) { // Si el bit TMR2IF = 1, cnt++ ; // Incrementar variable la cnt en 1 PIR1.TMR2IF = 0; // Reiniciar el bit y TMR2 = 0; // Reiniciar el registro TMR2 } } void main() { // main cnt = 0; // Reiniciar la variable cnt ANSEL = 0; // Todos los pines de E/S se configuran como digitales ANSELH = 0; TRISB = 0; // Todos los pines del puerto PORTB se configuran como salidas PORTB = 0b10101010; // Estado lgico en los pines del puerto PORTB T2CON = 0xFF; // Configurar el temporizador T2 TMR2 = 0; // Valor inicial del registro del temporizador TMR2 PIE1.TMR2IE = 1; // Interrupcin habilitada INTCON = 0xC0; // Bits GIE y PEIE se ponen a 1 while (1) { // Bucle infinito if (cnt > 30) { // Cambiar el estado del puerto PORTB despus de ms de 30 interrupciones Reemplazar(); // Funcin Reemplazar invierte el estado del puerto PORTB cnt = 0; // Reiniciar la variable cnt } } }

En este ejemplo, una interrupcin ocurre despus de que se produce un desbordamiento en el registro del temporizador TMR2. Para invertir el estado lgico de los pines del puerto se utiliza la funcin Reemplazar.

66

UNIDAD II PROGRAMACIN DE MICROCONTROLADORES CON ELEMENTOS DE LENGUAJE C

Prctica 2.5 Uso del watchdog timer (perro guardin)


Descripcin P2.5: Este ejemplo muestra cmo NO se debe utilizar el temporizador perro-guardin. Un comando utilizado para reiniciar este temporizador se omite a propsito en el bucle del programa principal, lo que habilita al temporizador perro guardin ganar la batalla del tiempo y reiniciar al microcontrolador. Por consiguiente, el microcontrolador se va a reiniciar sin parar, lo que indicar el parpadeo de los LED del puerto B. Circuito P2.5:

Cdigo P2.5:
/*Cabecera******************************************************/ void main() { OPTION_REG = 0x0E; // Pre-escalador se le asigna al temporizador WDT (1:64) asm CLRWDT; // Comando en ensamblador para reiniciar el temporizador WDT TRISB = 0; // Todos los pines del puerto PORTB se configuran como salidas PORTB = 0x0F; // Valor inicial del registro PORTB Delay_ms(300); // Tiempo de retardo de 30mS PORTB = 0xF0; // Valor del puerto PORTB diferente del inicial while (1); } // Bucle infinito. El programa se queda aqu hasta que el temporizador WDT reinicie al microcontrolador

Para que este ejemplo funcione apropiadamente, es necesario habilitar al temporizador perroguardin al seleccionar la opcin Tools/mE Programmer/Watchdog Timer - Enabled.

67

UNIDAD II PROGRAMACIN DE MICROCONTROLADORES CON ELEMENTOS DE LENGUAJE C

Prctica 2.6 Modulo CCP 1 como generador de seales tipo PWM


Descripcin P2.6: Este ejemplo muestra el uso del mdulo CCP1 en modo PWM. Para hacer las cosas ms interesantes, la duracin de los pulsos en la salida P1A (PORTC,2) se puede cambiar por medio de los botones de presin simblicamente denominados OSCURO y CLARO. La duracin ajustada se visualiza como una combinacin binaria en el puerto PORTB. El funcionamiento de este mdulo est bajo el control de las funciones pertenecientes a la librera especializada PWM. Aqu se utilizan las tres de ellas: 1. PWM1_init tiene el prototipo: void Pwm1_Init(long freq); El parmetro freq ajusta la frecuencia de la seal PWM expresada en hercios. En este ejemplo equivale a 5kHz. 2. PWM1_Start tiene el prototipo: void Pwm1_Start(void); 3. PWM1_Set_Duty tiene el prototipo: void Pwm1_Set_Duty(unsigned short duty_ratio); El parmetro duty_ratio ajusta la duracin de pulsos en una secuencia de pulsos. La librera PWM tambin contiene la funcin PWM_Stop utilizada para deshabilitar este modo. Su prototipo es: void Pwm1_Stop(void); Circuito P2.6:

68

UNIDAD II PROGRAMACIN DE MICROCONTROLADORES CON ELEMENTOS DE LENGUAJE C Cdigo P2.6:


/*Cabecera******************************************************/ // Definir las variables ciclo_de_trabajo_actual, // ciclo_de trabajo_anterior unsigned short ciclo_de_trabajo_actual; unsigned short ciclo_de trabajo_anterior; void initMain() { ANSEL = 0; // Todos los pines de E/S se configuran como digitales ANSELH = 0; TRISA = 255; // Todos los pines del puerto PORTA se configuran como entradas PORTA = 255; // Estado inicial del puerto PORTA TRISB = 0; // Todos los pines del puerto PORTB se configuran como salidas PORTB = 0; // Estado inicial del puerto PORTB TRISC = 0; // Todos los pines del puerto PORTC se configuran como salidas PORTC = 0; // Estado inicial del puerto PORTC PWM1_Init(5000); // Inicializacin del mdulo PWM (5KHz) } void main() { initMain(); ciclo_de_trabajo_actual = 16; // Valor inicial de la variable ciclo_de_trabajo_actual ciclo_de trabajo_anterior = 0; // Reiniciar la variable ciclo_de trabajo_anterior PWM1_Start(); // Iniciar el mdulo PWM1 while (1) { // Bucle infinito if (Button(&PORTA, 0,1,1)) // Si se presiona el botn conectado al RA0 ciclo_de_trabajo_actual++ ; // incrementar el valor de la variable current_duty if (Button(&PORTA, 1,1,1)) // Si se presiona el botn conectado al RA1 ciclo_de_trabajo_actual-- ; // decrementar el valor de la variable current_duty if (old_duty != ciclo_de_trabajo_actual) { // Si ciclo_de_trabajo_actual y ciclo_de trabajo_anterior no son iguales PWM1_Set_Duty(ciclo_de_trabajo_actual); // ajustar un nuevo valor a PWM, ciclo_de trabajo_anterior = ciclo_de_trabajo_actual; // Guardar el nuevo valor PORTB = ciclo_de trabajo_anterior; // y visualizarlo en el puerto PORTB } delay_ms(200); // Tiempo de retardo de 200mS } }

Para que este ejemplo funcione apropiadamente, es necesario marcar las siguientes libreras en la ventana Library Manager antes de compilar el programa: PWM Button

Prctica 2.7 Uso del convertidor analgico-digital (ADC)


Descripcin P2.7: El convertidor A/D del microcontrolador PIC16F887 se utiliza en este ejemplo. Hace falta decir que todo es pan comido? Una seal analgica variable se aplica al pin AN2, mientras que el resultado de la conversin de 10 bits se muestra en los puertos PORTB y PORTD (8 bits menos significativos en el puerto PORTD y 2 bits ms significativos en el puerto PORTB). La Tierra (GND)

69

UNIDAD II PROGRAMACIN DE MICROCONTROLADORES CON ELEMENTOS DE LENGUAJE C se utiliza como voltaje de referencia bajo Vref-, mientras que el voltaje de referencia alto se aplica al pin AN3. Esto habilita que la escala de medicin se estire y encoja. En otras palabras, el convertidor A/D siempre genera un resultado binario de 10 bits, lo que significa que reconoce 1024 niveles de voltaje en total (210=1024). La diferencia entre dos niveles de voltaje no es siempre la misma. Cuanto menor sea la diferencia entre Vref+ y Vref-, tanto menor ser la diferencia entre dos de los 1024 niveles. Como hemos visto, el convertidor A/D es capaz de detectar pequeos cambios de voltaje (investigue cual es el mnimo). Circuito P2.7:

Cdigo P2.7:
/*Cabecera******************************************************/ unsigned int temp_res; void main() { ANSEL = 0x0C; // Pines AN2 y AN3 se configuran como analgicos TRISA = 0xFF; // Todos los pines del puerto PORTA se configuran como entradas ANSELH = 0; // Los dems pines se configuran como digitales TRISB = 0x3F; // Pines del puerto PORTB, RB7 y RB6 se configuran como salidas TRISD = 0; // Todos los pines del PORTD se configuran como salidas ADCON1.F4 = 1 ; // Voltaje de referencia es llevado al pin RA3. do { temp_res = ADC_Read(2); // Resultado de la conversin A/D es copiado a temp_res PORTD = temp_res; // 8 bits menos significativos se mueven al puerto PORTD PORTB = temp_res >> 2; // 2 bits ms significativos se mueven a los bits RB6 y RB7 } while(1); // Bucle infinito }

70

UNIDAD II PROGRAMACIN DE MICROCONTROLADORES CON ELEMENTOS DE LENGUAJE C Para que este ejemplo funcione apropiadamente, es necesario marcar la librera ADC en la ventana Library Manager antes de compilar el programa: ADC

Prctica 2.8 Uso de la memoria EEPROM


Descripcin P2.8: Este ejemplo muestra cmo escribir y leer la memoria EEPROM incorporada. El programa funciona de la siguiente manera. El bucle principal lee constantemente el contenido de localidad de la memoria EEPROM en la direccin 5 (decimal). Luego el programa entra en el bucle infinito en el que el puerto PORTB se incrementa y se comprueba el estado de entradas del puerto PORTA.2. En el momento de presionar el botn denominado MEMO, un nmero almacenado en el puerto PORTB ser guardado en la memoria EEPROM, directamente ledo y visualizado en el puerto PORTD en forma binaria. Circuito P2.8:

71

UNIDAD II PROGRAMACIN DE MICROCONTROLADORES CON ELEMENTOS DE LENGUAJE C Cdigo P2.8:


/*Cabecera******************************************************/ void main() { ANSEL = 0; // Todos los pines de E/S se configuran como digitales ANSELH = 0; TRISB = 0; // Todos los pines del puerto PORTB se configuran como salidas PORTB = 0; // Valor inicial del puerto PORTB TRISD = 0; // Todos los pines del puerto PORTD se configuran como salidas PORTD = 0; // Valor inicial del puerto PORTD TRISA = 0xFF; // Todos los pines del puerto PORTA se configuran como entradas PORTD = EEPROM_Read(5); // Leer la memoria EEPROM en la direccin 5 do { PORTB = PORTB++; Delay_ms(100);

// Incrementar el puerto PORTB en 1 // Tiempo de retardo de 100mS

if (PORTA.F2) EEPROM_Write(5,PORTB); // Si se pulsa el botn MEMO, guardar el puerto PORTB PORTD = EEPROM_Read(5); // Leer el dato escrito do { while (PORTA.F2); } } while(1); }

// Quedarse en este bucle hasta que el botn est pulsado

// Bucle infinito

Para comprobar el funcionamiento de este circuito, basta con pulsar el botn MEMO y apagar el dispositivo. Despus de reiniciar el dispositivo, el programa visualizar el valor guardado en el puerto PORTD. Acurdese de que en el momento de escribir, el valor fue visualizado en el puerto PORTB. Para que este ejemplo funcione apropiadamente, es necesario marcar la librera EEPROM en la ventana Library Manager antes de compilar el programa: EEPROM

Prctica 2.9 Contador de dos dgitos multiplexado


Descripcin P2.9: En este ejemplo el microcontrolador funciona como un contador de dos dgitos. La variable i se incrementa (suficientemente lenta para ser visible) y su valor se visualiza en un display de dos dgitos LED (99-0). El punto es habilitar una conversin de un nmero binario en uno decimal y partirlo en dos dgitos (en decenas y unidades). Como los segmentos del visualizador LED se conectan en paralelo, es necesario asegurar que alternen rpidamente para tener una impresin de que emiten la luz simultneamente (multiplexin por divisin en tiempo). En este ejemplo, el temporizador TMR0 est encargado de la multiplexin por divisin en tiempo, mientras que la funcin mask convierte un nmero binario a formato decimal.

72

UNIDAD II PROGRAMACIN DE MICROCONTROLADORES CON ELEMENTOS DE LENGUAJE C Circuito P2.9:

Cdigo P2.9:
/*Cabecera******************************************************/ unsigned short mask(unsigned short num); unsigned short digit_no, digit10, digit1, digit, i; void interrupt() { if (digit_no == 0) { PORTA = 0; // Apagar ambos visualizadores PORTD = digit1; // Colocar mscara para visualizar unidades en el puerto PORTD PORTA = 1; // Encender el visualizador para las unidades (LSD) digit_no = 1; }else{ PORTA = 0; // Apagar ambos visualizadores PORTD = digit10; // Colocar mscara para visualizar decenas en el puerto PORTD PORTA = 2; // Encender el visualizador para las decenas (MSD) digit_no = 0; } TMR0 = 0; // Reiniciar el contador TMRO INTCON = 0x20; // Bit T0IF=0, T0IE=1 } void main() { OPTION_REG = 0x80; // Ajustar el temporizador TMR0 TMR0 = 0; INTCON = 0xA0; // Deshabilitar las interrupciones PEIE,INTE,RBIE,T0IE PORTA = 0; // Apagar ambos visualizadores TRISA = 0; // Todos los pines del puerto PORTA se configuran como salidas PORTD = 0; // Apagar todos los segmentos del visualizador TRISD = 0; // Todos los pines del puerto PORTD se configuran como salidas do { for (i = 0; i<=99; i++) { // Contar de 0 a 99 digit = i % 10u; digit1 = mask(digit); // Preparar la mscara para visualizar unidades digit = (char)(i / 10u) % 10u; digit10 = mask(digit); // Preparar la mscara para visualizar decenas delay_ms(1000); } } while (1); // Bucle infinito }

73

UNIDAD II PROGRAMACIN DE MICROCONTROLADORES CON ELEMENTOS DE LENGUAJE C Archivo : mask.c


/*Cabecera******************************************************/ unsigned short mask(unsigned short num) { switch (num) { case 0 : return 0x3F; //Aqu se guardan las combinaciones para que los nmeros del 0 9 se muestren en los displays case 1 : return 0x06; case 2 : return 0x5B; case 3 : return 0x4F; case 4 : return 0x66; case 5 : return 0x6D; case 6 : return 0x7D; case 7 : return 0x07; case 8 : return 0x7F; case 9 : return 0x6F; } }

Para que este ejemplo funcione apropiadamente, es necesario incluir el archivo mask.c en el proyecto (aparte del archivo example9.c) en la ventana Project Manager antes de compilar el programa: Example9.mcppi - Sources - Add File To Project mask.c example9.c

Prctica 2.10 Uso del display de cristal lquido (LCD)


Descripcin P2.10: Este ejemplo muestra cmo utilizar un visualizador LCD alfanumrico. Las libreras de funciones simplifican este programa, lo que significa que al final el esfuerzo para crear el software vale la pena. Un mensaje escrito en dos lneas aparece en el visualizador: UTCH Optativa I Ejemplo LCD 74

UNIDAD II PROGRAMACIN DE MICROCONTROLADORES CON ELEMENTOS DE LENGUAJE C Dos segundos ms tarde, el mensaje en la segunda lnea cambia, y se visualiza el voltaje presente en la entrada del convertidor A/D (el pin RA2). Por ejemplo: UTCH Optativa I voltage:3.141V

En un dispositivo real se puede visualizar temperatura actual o algn otro valor medido en vez de voltaje. Circuito P2.10:

Cdigo P2.10:

/*Cabecera*****************************************************/ sbit LCD_RS at RB4_bit; // Conexiones del mdulo LCD sbit LCD_EN at RB5_bit; sbit LCD_D4 at RB0_bit; sbit LCD_D5 at RB1_bit; sbit LCD_D6 at RB2_bit; sbit LCD_D7 at RB3_bit; sbit LCD_RS_Direction at TRISB4_bit; sbit LCD_EN_Direction at TRISB5_bit; sbit LCD_D4_Direction at TRISB0_bit; sbit LCD_D5_Direction at TRISB1_bit; sbit LCD_D6_Direction at TRISB2_bit; sbit LCD_D7_Direction at TRISB3_bit; // Final de las conexiones del mdulo LCD unsigned char ch; // Declarar variables unsigned int adc_rd; char *text; long tlong; void main() { INTCON = 0; ANSEL = 0x04; TRISA = 0x04; ANSELH = 0;

// Todas las interrupciones deshabilitadas // Pin RA2 se configura como una entrada analgica // Los dems pines se configuran como digitales

Lcd_Init(); // Inicializacin del visualizador LCD Lcd_Cmd(_LCD_CURSOR_OFF); // Comando LCD (apagar el cursor)

75

UNIDAD II PROGRAMACIN DE MICROCONTROLADORES CON ELEMENTOS DE LENGUAJE C


Lcd_Cmd(_LCD_CLEAR); // Comando LCD (borrar el LCD)

text = "UTCH Optativa I"; // Definir el primer mensaje Lcd_Out(1,1,text); // Escribir el primer mensaje en la primera lnea text = "Ejemplo LCD"; Lcd_Out(2,1,text); ADCON1 = 0x82; TRISA = 0xFF; delay_ms(2000); text = "voltaje:"; // Definir el segundo mensaje // Escribir el segundo mensaje en la segunda lnea // Voltaje de referencia para la conversin A/D es VCC // Todos los pines del puerto PORTA se configuran como entradas

// Definir el tercer mensaje

while (1) { adc_rd = ADC_Read(2); // Conversin A/D. Pin RA2 es una entrada. Lcd_Out(2,1,text); // Escribir el resultado en la segunda lnea tlong = (long)adc_rd * 5000; // Convertir el resultado en milivoltios tlong = tlong / 1023; // 0..1023 -> 0-5000mV ch = tlong / 1000; // Extraer voltios (miles de milivoltios) del resultado Lcd_Chr(2,9,48+ch); // Escribir resultado en formato ASCII Lcd_Chr_CP('.'); ch = (tlong / 100) % 10; // Extraer centenas de milivoltios Lcd_Chr_CP(48+ch); // Escribir resultado en formato ASCII ch = (tlong / 10) % 10; // Extraer decenas de milivoltios Lcd_Chr_CP(48+ch); // Escribir resultado en formato ASCII ch = tlong % 10; // Extraer unidades de milivoltios Lcd_Chr_CP(48+ch); // Escribir resultado en formato ASCII Lcd_Chr_CP('V'); delay_ms(1); } }

Para que este ejemplo funcione apropiadamente, es necesario marcar las siguientes libreras en la ventana Library Manager antes de compilar el programa: ADC LCD

Prctica 2.11 Comunicacin serial RS232


Descripcin P2.11: Este ejemplo muestra cmo utilizar el mdulo USART del microcontrolador. La conexin a una PC se habilita por medio del estndar de comunicacin RS-232. El programa funciona de la siguiente manera. Cada byte recibido por medio de la comunicacin serial se visualiza al utilizar los LED conectados al puerto B y despus se devuelve automticamente al transmisor. Si ocurre un error en recepcin, se lo indicar al encender el diodo LED. La manera ms fcil es comprobar el funcionamiento del dispositivo en la prctica utilizando un programa estndar de Windows denominado Hyper Terminal.

76

UNIDAD II PROGRAMACIN DE MICROCONTROLADORES CON ELEMENTOS DE LENGUAJE C Circuito P2.11:

Cdigo P2.11:

/*Cabecera******************************************************/ unsigned short i; void main() { UART1_Init(19200); // Inicializar el mdulo USART (8 bits, tasa de baudios 19200, no hay bit de paridad) while (1) { if (UART1_Data_Ready()) { // si se ha recibido un dato i = UART1_Read(); // leerlo UART1_Write(i); // enviarlo atrs } } }

Para que este ejemplo funcione apropiadamente, es necesario marcar la librera UART en la ventana Library Manager antes de compilar el programa:
UART

77

UNIDAD II PROGRAMACIN DE MICROCONTROLADORES CON ELEMENTOS DE LENGUAJE C

Prctica 2.12 Generacin de sonidos utilizando una librera


Descripcin P2.12: Las seales de audio se utilizan con frecuencia cuando se necesita llamar la atencin del usuario, confirmar que alguno de los botones se ha pulsado, avisar que se ha llegado hasta los valores mnimos o mximos, etc. Pueden ser una simple seal de pitido as como melodas de una duracin ms larga o ms corta. En este ejemplo se muestra la generacin de sonido por medio de funciones que pertenecen a la librera Sound. Adems de estas funciones, la funcin Button que pertenece a la misma librera se utiliza para probar los botones de presin. Circuito P2.12:

Cdigo P2.12:
/*Cabecera******************************************************/ void Tone1() { Sound_Play(659, 250); // Frecuencia = 659Hz, duracin = 250ms } void Tone2() { Sound_Play(698, 250); // Frecuencia = 698Hz, duracin = 250ms } void Tone3() { Sound_Play(784, 250); // Frecuencia = 784Hz, duracin = 250ms } void Melody1() { // Componer una meloda divertida 1 Tone1(); Tone2(); Tone3(); Tone3(); Tone1(); Tone2(); Tone3(); Tone3(); Tone1(); Tone2(); Tone3();

78

UNIDAD II PROGRAMACIN DE MICROCONTROLADORES CON ELEMENTOS DE LENGUAJE C


Tone1(); Tone2(); Tone3(); Tone3(); Tone1(); Tone2(); Tone3(); Tone3(); Tone3(); Tone2(); Tone2(); Tone1(); } void ToneA() { // Tono A Sound_Play( 880, 50); } void ToneC() { // Tono C Sound_Play(1046, 50); } void ToneE() { // Tono E Sound_Play(1318, 50); } void Melody2() { // Componer una meloda divertida 2 unsigned short i; for (i = 9; i > 0; i--) { ToneA(); ToneC(); ToneE(); } } void main() { ANSEL = 0; ANSELH = 0; TRISB = 0xF0;

// Todos los pines de E/S son digitales // Pines RB7-RB4 se configuran como entradas

Sound_Init(&PORTB, 3); // RB3 se configura como salida Sound_Play(1000, 500); while (1) { if (Button(&PORTB,7,1,1)) // RB7 genera Tono1 Tone1(); while (PORTB & 0x80) ; // Esperar que se suelte el botn if (Button(&PORTB,6,1,1)) // RB6 genera Tono2 Tone2(); while (PORTB & 0x40) ; // Esperar que se suelte el botn if (Button(&PORTB,5,1,1)) // RB5 genera meloda 2 Melody2(); while (PORTB & 0x20) ; // Esperar que se suelte el botn if (Button(&PORTB,4,1,1)) // RB4 genera meloda 1 Melody1(); while (PORTB & 0x10) ; // Esperar que se suelte el botn } }

Para que este ejemplo funcione apropiadamente, es necesario marcar las siguientes libreras en la ventana Library Manager antes de compilar el programa: Button Sound

79

UNIDAD III CONTROL Y MONITOREO DE SISTEMAS AUTOMTICOS

Unidad III CONTROL Y MONITOREO DE SISTEMAS AUTOMTICOS


Prctica 3.1 Control de un motor de DC mediante un puente H
Descripcin P3.1: Control de la velocidad y direccin de un motor de DC. El control es por medio de un puente H construido con transistores tipo MOSFET y sus drivers respectivos. El control del motor debe de ser remoto y local. Control local por medio de 7 botones: Ir en la direccin de las manecillas del reloj (ClockWise, CW) Ir en la direccin contraria a las manecillas del reloj (Counter ClockWise , CCW) Aumentar velocidad (lmite mximo 100%) Disminuir velocidad (lmite mnimo 0%) Arrancar motor , CW, velocidad 50% Detener motor de manera inmediata. Detener motor suavemente (descenso gradual).

Control remoto por medio del puerto series (protocolo RS232), por medio de las siguientes secuencias de bytes: ATINT, arrancar motor ATSTx , detener motor, donde si x=0 detener suavemente, x=1 detener inmediatamente. ATDCW, direccin del motor CW ATDCC, direccin del motor CCW ATSxyz, La velocidad se fija al xyz%, donde xyz es un nmero en el rango del 000 al 100.

Circuito P3.1: [Dibuje aqu el circuito esquemtico. El circuito debe de estar completo]

80

UNIDAD III CONTROL Y MONITOREO DE SISTEMAS AUTOMTICOS

Transistor: IRF640 o Transistor MOSFET canal N o equivalente.

Driver: 4011 CMOS Quad NAND Gate IC, alimentado con +12 V DC. 4049 CMOS Hex Inverting Buffer IC. NOTA: Los transistores MOSFET canal N se activa con un voltaje positivo en la terminal de Gate. Cdigo P3.1: [Escriba aqu el cdigo que implemento]

Prctica 3.2 Control de un motor de pasos


Descripcin P3.2: Control del movimiento, la direccin y el nmero de pasos a avanzar de un motor de pasos. El control del motor debe de ser remoto y local. Control local por medio de 5 botones: Ir en la direccin de las manecillas del reloj (ClockWise, CW) continuamente. Ir en la direccin contraria a las manecillas del reloj (Counter ClockWise , CCW) continuamente. Avanzar un paso CW Avanzar un paso CCW Detener motor, solo si esta en modo continuo.

Control remoto por medio del puerto series (protocolo RS232), por medio de las siguientes secuencias de bytes: ATCMx, modo continuo, donde si x=0 avanzar CW, x=1 avanzad CCW. ATSTP, detener motor. ATMxyz, El motor se mueve en la direccin (x=0 CW, x=1 CCW) un nmero de pasos yz, donde yz es un nmero en el rango de 0-99.

81

UNIDAD III CONTROL Y MONITOREO DE SISTEMAS AUTOMTICOS Circuito P3.2: [Dibuje aqu el circuito esquemtico. El circuito debe de estar completo]

Step 1 2 3 4

wire 1 low high high low

wire 2 high high low low

82

UNIDAD III CONTROL Y MONITOREO DE SISTEMAS AUTOMTICOS

Step 1 2 3 4

wire 1 High low low high

wire 2 low high high low

wire 3 high high low low

wire 4 low low high high

Cdigo P3.2: [Escriba aqu el cdigo que implemento]

Prcticas 3.3 Control de un servo motor


Descripcin P3.3: Control del movimiento de un servo motor. El control del motor debe de ser remoto y local. Control local por medio de 3 botones: Movimiento en direccin de las manecillas del reloj (ClockWise, CW), el servo motor debe de avanzar solo un grado, o la mnima resolucin posible. Movimiento en direccin contraria a las manecillas del reloj (Counter ClockWise , CCW), el servo motor debe de avanzar solo un grado, o la mnima resolucin posible. Volver a la posicin central o neutral. NOTA: Suponer que el movimiento del servo motor est limitado a 180 grados, 90 grados en sentido positivo y 90 grados en sentido negativo. NOTA: Verificar esto, cada servo es diferente el servo que utilice puede estar limitado a solo 120 grados, entonces se tendran 60 grados en cada sentido.

Control remoto por medio del puerto series (protocolo RS232), por medio de las siguientes secuencias de bytes: ATSIP, el servo motor regresa a su posicin central o neutral. ATMxyz, El motor se mueve en la direccin (x=0 CW, x=1 CCW) un numero de grados yz, donde yz es un numero en el rango de 0-90 (0-60 segn sea el caso).

El siguiente diagrama de tiempos de una seal tipo PWM para el control de un servo motor es solo ilustrativa. Las seales de control de los servos motores no siguen un estndar verdadero. Lo nico 83

UNIDAD III CONTROL Y MONITOREO DE SISTEMAS AUTOMTICOS estandarizado es que el circuito de control del servo motor espera recibir un pulso cada 20 ms (periodo). La duracin del pulso debe de ser entre 0.7 ms y 2.0 ms. Si la duracin del pulso est entre 0.7 y 1.0 ms el servo se mover hacia la derecha (CW). Si la duracin del pulso est entre 1.7 y 2.0 ms el servo se mover hacia la izquierda (CCW). Si la duracin del pulso est entre 1.3 y 1.5 ms el servo se mover a su posicin central o neutral.

Para ms informacin consultar: http://www.ermicro.com/blog/?p=771 Circuito P3.3: [Dibuje aqu el circuito esquemtico. El circuito debe de estar completo] Cdigo P3.3: [Escriba aqu el cdigo que implemento]

84

UNIDAD III CONTROL Y MONITOREO DE SISTEMAS AUTOMTICOS

Prctica 3.4 Control de temperatura tipo ON/OFF


Descripcin P3.4: Control de temperatura tipo ON/OFF con histresis de una caja. La temperatura baja (TLow) y la temperatura alta (THigh) podrn ser ajustadas mediante dos botones cada una. Los botones harn las siguientes funciones: Botn TLow_Up aumenta el valor de la temperatura baja. Botn TLow_Down disminuye el valor de la temperatura baja. Botn THigh_Up aumenta el valor de la temperatura alta. Botn THigh_Down disminuye el valor de la temperatura alta. Botn On/Off el control de temperatura se activa/desactiva

Se debe de usar un sensor de temperatura (sugerencia LM35) para realizar las mediciones, un foco incandescente (pudiera ser una resistencia) como fuente de calor y un ventilador que sirva para disminuir la temperatura de la caja. El control debe comparar la temperatura medida en el interior de la caja, en caso de que la temperatura sea mayor THigh se debe encender el ventilador, este debe estar encendido hasta que la temperatura sea menor a TLow, y as sucesivamente. Circuito P3.4: [Dibuje aqu el circuito esquemtico. El circuito debe de estar completo] Cdigo P3.4: [Escriba aqu el cdigo implementado]

Prctica 3.5 Modulo remoto de medicin y control. 3 sensores, 2 actuadores, comunicacin mediante RS232, modo de control remoto mediante PC, modo de control local mediante botones.
Descripcin P3.5: Se debe de realizar un circuito y programa que permita realizar la medicin remota de 3 variables o sensores (pueden ser cualquier tipo de sensores pero cada uno de diferente variable, preprense para justificar la seleccin de estos sensores). La medicin de estos tres sensores permitir realizar el control de algn tipo de proceso (el proceso ustedes lo pueden idear, pero de igual manera hay que preparar una justificacin de este) mediante dos actuadores. Los actuadores deben de ser de tipos diferentes, es decir, elctricos, electroneumticos, electrohidrulicos, o electromecnicos. El control de los dos actuadores puede realizarse de manera remota mediante la comunicacin con una PC utilizando el protocolo RS232, o localmente mediante el uso de botones.

85

UNIDAD III CONTROL Y MONITOREO DE SISTEMAS AUTOMTICOS Las mediciones de los sensores de deben de mostrar localmente utilizando un display tipo LCD o display tipo 7 segmentos. Circuito P3.5: [Dibuje aqu el circuito esquemtico. El circuito debe de estar completo] Cdigo P3.5: [Escriba aqu el cdigo que implemento]

86

REPORTE Y EVALUACIN

Formato de reportes
Todas las prcticas deben de ir acompaadas de un reporte. El reporte debe de entregarse escrito a mano (diagramas y cdigo fuente tambin). Cada reporte debe de contener los siguientes componentes:

El reporte tambin lleva su contraparte electrnica. Esta es una carpeta comprimida, en formato ZIP, que contenga las siguientes subcarpetas: SourceCode, aqu va la carpeta del proyecto generado por la IDE y el compilador utilizados. Schematics, aqu van los diagramas esquemticos de los circuitos realizados. Deben de estar en formato PDF.

Este reporte deber de ser subido a la seccin del curso en la plataforma.

87

REPORTE Y EVALUACIN

Criterios y ponderaciones de evaluacin


Unidad I
Calificacin = ((Calif. Examen) * (Prcticas_Realizadas /16) * 0.5) + ((Reportes_Revisados/16) * 0.5)

Unidad II
Calificacin = ((Calif. Examen) * (Prcticas_Realizadas /12) * 0.5) + ((Reportes_Revisados/12) * 0.5)

Unidad III
Calificacin = ((Calif. Examen) * (Prcticas_Realizadas /5) * 0.5) + ((Reportes_Revisados/5) * 0.5)

88

Vous aimerez peut-être aussi