0 évaluation0% ont trouvé ce document utile (0 vote)
77 vues251 pages
El documento habla sobre la historia y evolución de los microcontroladores. Explica que los primeros sistemas electrónicos requerían múltiples chips especializados, lo que los hacía grandes y complejos. Luego, el avance en la miniaturización permitió integrar todo lo necesario en un solo chip llamado microcontrolador, haciendo los sistemas más pequeños, baratos y fáciles de programar. Ahora los microcontroladores pueden encontrarse en muchos dispositivos electrónicos como ascensores y submarinos.
El documento habla sobre la historia y evolución de los microcontroladores. Explica que los primeros sistemas electrónicos requerían múltiples chips especializados, lo que los hacía grandes y complejos. Luego, el avance en la miniaturización permitió integrar todo lo necesario en un solo chip llamado microcontrolador, haciendo los sistemas más pequeños, baratos y fáciles de programar. Ahora los microcontroladores pueden encontrarse en muchos dispositivos electrónicos como ascensores y submarinos.
El documento habla sobre la historia y evolución de los microcontroladores. Explica que los primeros sistemas electrónicos requerían múltiples chips especializados, lo que los hacía grandes y complejos. Luego, el avance en la miniaturización permitió integrar todo lo necesario en un solo chip llamado microcontrolador, haciendo los sistemas más pequeños, baratos y fáciles de programar. Ahora los microcontroladores pueden encontrarse en muchos dispositivos electrónicos como ascensores y submarinos.
El mundo de los microcontroladores - Captulo 1 - Libro: Microcontroladores PIC - Programacin en BASIC
Captulo 1: Mundo de los microcontroladores
La situacin actual en el campo de los microcontroladores se ha producido gracias al desarrollo de la tecnologa de fabricacin de los circuitos integrados. Este desarrollo ha permitido construir las centenas de miles de transistores en un chip. Esto fue una condicin previa para la fabricacin de un microprocesador. Las primeras microcomputadoras se fabricaron al aadirles perifricos externos, tales como memoria, lneas de entrada/salida, temporizadores u otros. El incremento posterior de la densidad de integracin permiti crear un circuito integrado que contena tanto al procesador como perifricos. As es cmo fue desarrollada la primera microcomputadora en un solo chip, denominada ms tarde microcontrolador. 1.1 Introduccin 1.2 Nmeros, nmeros, nmeros... 1.3 Detalles importantes 1.4 Microcontroladores PIC Los principiantes en electrnica creen que un microcontrolador es igual a un microprocesador. Esto no es cierto. Difieren uno del otro en muchos sentidos. La primera y la ms importante diferencia es su funcionalidad. Para utilizar al microprocesador en una aplicacin real, se debe de conectar con otros componentes, en primer lugar con la memoria. Aunque el microprocesador se considera una mquina de computacin poderosa, no est preparado para la comunicacin con los dispositivos perifricos que se le conectan. Para que el microprocesador se comunique con algn perifrico, se deben utilizar los circuitos especiales. As era en el principio y esta prctica sigue vigente en la actualidad.
Por otro lado, al microcontrolador se le disea de tal manera que tenga todas las componentes integradas en el mismo chip. No necesita de otros componentes especializados para su aplicacin, porque todos los circuitos necesarios, que de otra manera correspondan a los perifricos, ya se encuentran incorporados. As se ahorra tiempo y espacio necesario para construir un dispositivo. Para entender con ms facilidad las razones del xito tan grande de los microcontroladores, vamos a prestar atencin al siguiente ejemplo. Hace unos 10 aos, disear un dispositivo electrnico de control de un ascensor de un edificio de varios pisos era muy difcil, incluso para un equipo de expertos. Ha pensado alguna vez en qu requisitos debe cumplir un simple ascensor? Cmo lidiar con la situacin cuando dos o ms personas llaman al ascensor al mismo tiempo? Cul llamada tiene la prioridad? Cmo solucionar las cuestiones de seguridad, de prdida de electricidad, de fallos, de uso indebido? Lo que sucede despus de resolver estos problemas bsicos es un proceso meticuloso de disear los dispositivos adecuados utilizando un gran nmero de los chips especializados. Este proceso puede tardar semanas o meses, dependiendo de la complejidad del dispositivo. Cuando haya terminado el proceso, llega la hora de disear una placa de circuito impreso y de montar el dispositivo.Un dispositivo enorme! Es otro trabajo difcil y tardado. Por ltimo, cuando todo est terminado y probado adecuadamente, pasamos al momento crucial y es cuando uno se concentra, respira profundamente y enciende la fuente de alimentacin. Esto suele ser el punto en el que la fiesta se convierte en un verdadero trabajo puesto que los dispositivos electrnicos casi nunca funcionan apropiadamente desde el inicio. Preprese para muchas noches sin dormir, correcciones, mejoras... y no se olvide de que todava estamos hablando de cmo poner en marcha un simple ascensor. Cuando el dispositivo finalmente empiece a funcionar perfectamente y todo el mundo est satisfecho, y le paguen por el trabajo que ha hecho, muchas compaas de desarrollo estarn interesadas en su trabajo. Por supuesto, si tiene suerte, cada da le traer una oferta de trabajo de un nuevo inversionista. Sin embargo, si lo requieren para trabajar en el control de los elevadores de un nuevo edificio que tiene cuatro pisos ms de los que ya maneja su sistema de control. Sabe cmo proceder? Cree acaso que se pueden controlar las demandas de sus clientes? Pensamos que usted va a construir un dispositivo universal que se puede utilizar en los edificios de 4 a 40 pisos, una obra maestra de electrnica. Bueno, incluso si usted consigue construir una joya electrnica, su inversionista le esperarar delante de la puerta pidiendo una cmara en el ascensor o una msica relajante en caso de fallo de ascensor. O un ascensor con dos puertas. De todos modos, la ley de Murphy es inexorable y sin duda usted no podr tomar ventaja a pesar de todos los esfuerzos que ha hecho. Por desgracia, todo lo que se ha dicho hasta ahora sucede en la realidad. Esto es lo que dedicarse a la ingeniera electrnica realmente significa. Es as como se hacan las cosas hasta aparicin de los microcontroladores diseados - pequeos, potentes y baratos. Desde ese momento su programacin dej de ser una ciencia, y todo tom otra direccin ... El dispositivo electrnico capaz de controlar un pequeo submarino, una gra o un ascensor como el anteriormente mencionado, ahora est incorporado en un slo chip. Los microcontroladores ofrecen una amplia gama de aplicaciones y slo algunas se exploran normalmente. Le toca a usted decidir qu quiere que haga el microcontrolador y cargar un programa en l con las instrucciones apropiadas. Antes de encender el dispositivo es recomendable verificar su funcionamiento con ayuda de un simulador. Si todo funciona como es debido, incorpore el microcontrolador en el sistema. Si alguna vez necesita cambiar, mejorar o actualizar el programa, hgalo. Hasta cundo? Hasta quedar satisfecho. Eso puede realizarse sin ningn problema.
Saba usted que todas las personas pueden ser clasificadas en uno de 10 grupos, en los que estn familiarizados con el sistema de numeracin binario y en los que no estn familiarizados con l. Si no entendi lo anterior significa que todava pertenece al segundo grupo. Si desea cambiar su estado, lea el siguiente texto que describe brevemente algunos de los conceptos bsicos utilizados ms tarde en este libro (slo para estar seguro de que estamos hablando en los mismos trminos). 1.2 NMEROS, NMEROS, NMEROS... La matemtica es una gran ciencia! Todo es tan lgico y simple... El universo de los nmeros se puede describir con slo diez dgitos. No obstante, realmente tiene que ser as? Necesitamos exactamente esos 10 dgitos? Por supuesto que no, es slo cuestin del hbito. Acurdese de las lecciones de la escuela. Por ejemplo, qu significa el nmero 764? Cuatro unidades, seis decenas y siete centenas. Muy simple! Se podra expresar de una forma ms desarrollada? Por supuesto que s: 4 + 60 + 700. An ms desarrollado? S: 4*1 + 6*10 + 7*100. Podra este nmero parecer un poco ms cientfico? La respuesta es s otra vez: 4*100 + 6*101 + 7*102. Qu significa esto realmente? Por qu utilizamos exactamente estos nmeros 100, 101 y 102 ? Por qu es siempre el nmero 10? Es porque utilizamos 10 dgitos diferentes (0, 1, 2...8, 9). En otras palabras, es porque utilizamos el sistema de numeracin en base 10, es decir el sistema de numeracin decimal.
SISTEMA DE NUMERACIN BINARIO Qu pasara si utilizramos slo dos nmeros 0 y 1? Si slo pudiramos afirmar (1) o negar (0) que algo existe. La respuesta es nada especial, seguiramos utilizando los mismos nmeros de la misma manera que utilizamos hoy en da, no obstante ellos pareceran un poco diferentes. Por ejemplo: 11011010.Cuntas son realmente 11011010 pginas de un libro? Para entenderlo, siga la misma lgica como en el ejemplo anterior, pero en el orden invertido. Tenga en cuenta que se trata de aritmtica con slo dos dgitos 0 y 1, es decir, del sistema de numeracin en base 2 (sistema de numeracin binario).
Evidentemente, se trata del mismo nmero representado en dos sistemas de numeracin diferentes. La nica diferencia entre estas dos representaciones yace en el nmero de dgitos necesarios para escribir un nmero. Un dgito (2) se utiliza para escribir el nmero 2 en el sistema decimal, mientras que dos dgitos (1 y 0) se utilizan para escribir aquel nmero en el sistema binario. Ahora est de acuerdo que hay 10 grupos de gente? Bienvenido al mundo de la aritmtica binaria! Tiene alguna idea de dnde se utiliza? Excepto en las condiciones de laboratorio estrictamente controladas, los circuitos electrnicos ms complicados no pueden especificar con exactitud la diferencia entre dos magnitudes (dos valores de voltaje, por ejemplo), si son demasiado pequeos (ms pequeos que unos pocos voltios). La razn son los ruidos elctricos y fenmenos que se presentan dentro de lo que llamamos entorno de trabajo real (algunos ejemplos de estos fenmenos son los cambios imprevisibles de la tensin de alimentacin, cambios de temperatura, tolerancia a los valores de los componentes etc...) Imagnese una computadora que opera sobre nmeros decimales al tratarlos de la siguiente manera: 0=0V, 1=5V, 2=10V, 3=15V, 4=20V... 9=45V!? Alguien dijo bateras? Una solucin mucho ms fcil es una lgica binaria donde 0 indica la ausencia de voltaje, mientras que 1 indica la presencia de voltaje. Es ms fcil de escribir 0 o 1 en vez de no hay voltaje o hay voltaje. Mediante el cero lgico (0) y uno lgico (1) la electrnica se enfrenta perfectamente y realiza con facilidad todas las operaciones aritmticas. Evidentemente, se trata de electrnica que en realidad aplica aritmtica en la que todos los nmeros son representados con slo dos dgitos y donde slo es importante saber si hay voltaje o no. Por supuesto, estamos hablando de electrnica digital.
SISTEMA DE NUMERACIN HEXADECIMAL En el principio del desarrollo de las computadoras era evidente que a la gente le costaba mucho trabajar con nmeros binarios. Por eso, se estableci un nuevo sistema de numeracin, que utilizaba 16 smbolos diferentes. Es llamado el sistema de numeracin hexadecimal. Este sistema est compuesto de 10 dgitos a los que estamos acostumbrados (0, 1, 2, 3,... 9) y de seis letras del alfabeto A, B, C, D, E y F. Cul es el propsito de esta combinacin aparentemente extraa? Basta con mirar cmo todo en la historia de los nmeros binarios encaja perfectamente para lograr una mejor comprensin del tema.
El mayor nmero que puede ser representado con 4 dgitos binarios es el nmero 1111. Co-rresponde al nmero 15 en el sistema decimal. En el sistema hexadecimal ese nmero se representa con slo un dgito F. Es el mayor nmero de un dgito en el sistema hexadecimal. Se da cuenta de la gran utilidad de estas equivalencias? El mayor nmero escrito con ocho dgitos binarios es a la vez el mayor nmero de dos dgitos en el sistema hexadecimal. Tenga en cuenta que una computadora utiliza nmeros binarios de 8 dgitos. Acaso se trata de una casualidad? CDIGO BCD El cdigo BCD (Binary-Coded Decimal - Cdigo binario decimal) es un cdigo binario utilizado para representar a los nmeros decimales. Consiste en nmeros binarios de 4 dgitos que representan los primeros diez dgitos (0, 1, 2, 3...8, 9). Aunque cuatro dgitos pueden hacer 16 combinaciones posibles en total, el cdigo BCD normalmente utiliza a las primeras diez. CNVERSIN DE SISTEMAS DE NUMERACIN El sistema de numeracin binario es el que utilizan los microcontroladores, el sistema decimal es el que nos resulta ms comprensible, mientras que el sistema hexadecimal presenta un balance entre los dos. Por eso, es muy importante aprender cmo convertir los nmeros de un sistema de numeracin a otro, por ejemplo, cmo convertir una serie de ceros y unos a una forma de representacin comprensible para nosotros. Conversin de Nmeros Binarios a Decimales Los mismos dgitos en un nmero binario tienen ponderaciones diferentes lo que depende de sus posiciones dentro del nmero que estn representando. Adems, cada dgito puede contener 1 o 0, y su ponderacin se puede determinar con facilidad al contar su posicin empezando por la derecha. Para hacer una conversin de un nmero binario a decimal es necesario multiplicar los dgitos (0 o 1) con su ponderacin de posicin (20, 21, 22, 23 etc.) y sumar todos los resultados. La magia de la conversin de un nmero binario a decimal funciona de maravilla... Tiene duda? Veamos el siguiente ejemplo:
Cabe destacar que es necesario utilizar slo dos dgitos binarios para representar a todos los nmeros decimales de 0 a 3. Para los nmeros mayores, se deben utilizar los dgitos binarios adicionales. Por consiguiente, para representar los nmeros de 0 a 7 es necesario utilizar tres dgitos binarios, para representar los nmeros de 0 a 15 - cuatro dgitos etc. Dicho de manera sencilla, el mayor nmero binario que se puede representar utilizando n dgitos se obtiene al elevar la base 2 a la potencia n. Luego, al resultado se le resta 1. Por ejemplo, si n=4: 2 4 - 1 = 16 - 1 = 15 Por consiguiente, al utilizar 4 dgitos binarios, es posible representar los nmeros decimales de 0 a 15, que son 16 valores diferentes en total. CONVERSIN DE NMEROS HEXADECIMALES A DECIMALES Para realizar una conversin de un nmero hexadecimal a decimal, cada dgito hexadecimal debe ser multiplicado con el nmero 16 elevado al valor de su posicin. Despus, el resultado obtenido se debe sumar. Por ejemplo:
CONVERSIN DE NMEROS HEXADCIMALES A BINARIOS No es necesario realizar ningn clculo para convertir un nmero hexadecimal a binario. Los dgitos hexadecimales se reemplazan simplemente por los cuatro dgitos binarios apropiados. Ya que el dgito hexadecimal mximo es equivalente al nmero decimal 15, es necesario utilizar cuatro dgitos binarios para representar un dgito hexadecimal. Por ejemplo:
La siguiente es tabla comparativa que contiene los valores de nmeros 0-255 representados en tres sistemas de numeracin diferentes. Esto es probablemente la manera ms fcil de entender lgica comn aplicada a todos los sistemas de numeracin.
MARCAR LOS NMEROS El sistema de numeracin hexadecimal, junto con los sistemas binario y decimal, se consideran los ms importantes para nosotros. Es fcil realizar una conversin de cualquier nmero hexadecimal a binario, adems es fcil de recordarlo. Sin obstante, estas conversiones pueden provocar una confusin. Por ejemplo, qu significa en realidad la sentencia: Es necesario contar 110 productos en una cadena de montaje? Dependiendo del sistema en cuestin (binario, decimal o hexadecimal), el resultado podra ser 6, 110 o 272 productos, respectivamente. Por consiguiente, para evitar equivocaciones, diferentes prefijos y sufijos se aaden directamente a los nmeros. Los prefijos $ y 0x marcan los nmeros hexadecimales. Por ejemplo, el nmero hexadecimal 10AF se puede escribir como $10AF o 0x10AF. De manera similar, los nmeros binarios normalmente obtienen el prefijo %. Si un nmero no tiene ni sufijo ni prefijo se considera decimal. Desafortunadamente, esta forma de marcar los nmeros no es estandarizada, por consiguiente depende de la aplicacin concreta.
BIT La teora dice que un bit es la unidad bsica de informacin...Vamos a olvidarlo por un momento y demostrar qu es eso en la prctica. La respuesta es - nada especial- un bit es un slo dgito binario. Similar a un sistema de numeracin decimal en el que los dgitos de un nmero no tienen la misma ponderacin (por ejemplo, los dgitos en el nmero 444 son los mismos pero tienen los valores diferentes), el significado de un bit depende de la posicin que tiene en nmero binario. En este caso no tiene sentido hablar de unidades, centenas etc. en los nmeros binarios, sus dgitos se denominan el bit cero (el primer bit a la derecha), el primer bit (el segundo bit a la derecha) etc. Adems, ya que el sistema binario utiliza solamente dos dgitos (0 y 1), el valor de un bit puede ser 0 o 1. No se confunda si se encuentra con un bit que tiene el valor 4, 16 o 64. Son los valores re-presentados en el sistema decimal. Simplemente, nos hemos acostumbrado tanto a utilizar los nmeros decimales que estas expresiones llegaron a ser comunes. Sera correcto decir por ejemplo, el valor del sexto bit en cualquier nmero binario equivale al nmero decimal 64. Pero todos somos humanos y los viejos hbitos mueren difcilmente. Adems, cmo le suena nmero uno-uno-cero-uno-cero...? BYTE Un byte consiste en 8 bits colocados uno junto al otro. Si un bit es un dgito, es lgico que los bytes representen los nmeros. Todas las operaciones matemticas se pueden realizar por medio de ellos, como por medio de los nmeros decimales comunes. Similar a los dgitos de cualquier nmero, los dgitos de un byte no tienen el mismo significado. El bit del extremo izquierdo tiene la mayor ponderacin, por eso es denominado el bit ms significativo (MSB). El bit del extremo derecho tiene la menor ponderacin, por eso es denominado el bit menos significativo (LSB). Puesto que los 8 dgitos de un byte se pueden combinar de 256 maneras diferentes, el mayor nmero decimal que se puede representar con un byte es 255 (una combinacin representa un cero). Un nibble o un cuarteto representa una mitad de byte. Dependiendo de la mitad del nmero en cuestin (izquierda o derecha), se les denomina nibbles altos o bajos, respectivamente.
Usted seguramente ha pensado alguna vez en cmo es la electrnica dentro de un circuito integrado digital, un microcontrolador o un microprocesador. Cmo son los circuitos que realizan las operaciones matemticas complicadas y toman decisiones? Saba que sus esquemas, aparentemente complicadas consisten en slo unos pocos elementos diferentes, denominados circuitos lgicos o compuertas lgicas? 1.3 DETALLES IMPORTANTES El funcionamiento de estos elementos es basado en los principios establecidos por el matemtico britnico George Boole en la mitad del siglo 19 - es decir, antes de la invencin de la primera bombilla. La idea principal era de expresar las formas lgicas por medio de las funciones algebraicas. Tal idea pronto se transform en un producto prctico que se convirti ms tarde en lo que hoy en da conocemos como circuitos lgicos Y (AND), O (OR) o NO (NOT). El principio de su funcionamiento es conocido como algebra de Boole. CIRCUITOS LGICOS Algunas instrucciones de programa funcionan de la misma manera que las compuertas lgicas. A continuacin vamos a explicar el principio de su funcionamiento. Compuerta Y (AND)
Una compuerta lgica Y dispone de dos o ms entradas y de una salida. En este caso la compuerta utilizada dispone de slo dos entradas. Un uno lgico (1) aparecer en su salida slo en caso de que ambas entradas (A y B) sean llevadas a alto (1). La tabla a la derecha muestra la relacin entre las entradas y salidas de la compuerta Y.
El principio de funcionamiento es el mismo cuando la compuerta disponga de ms de dos entradas: la salida proporciona un uno lgico (1) slo si todas las entradas son llevadas a alto (1). Cualquier otra combinacin de voltajes de entrada proporcionar un cero lgico (0) en su salida. Utilizada en el programa, la operacin Y lgico es realizada por una instruccin de programa, de la que vamos a hablar ms tarde. Por ahora basta con conocer que Y lgico en un programa se refiere a la realizacin de este tipo de operacin sobre los bits correspondientes de dos registros diferentes. Compuerta O (OR)
De manera similar, la compuerta O tambin dispone de dos o ms entradas y de una salida. Si la compuerta dispone de slo dos entradas, es aplicable lo siguiente: la salida proporciona un uno lgico (1) si una u otra entrada (A o B) es llevada a alto (1). En caso de que la compuerta O disponga de ms de dos entradas, es aplicable lo siguiente: La salida proporciona un uno lgico (1) si por lo menos una entrada es llevada a alto (1). Si todas las entradas estn a cero lgico (0), la salida estar a cero lgico (0) tambin.
En un programa, la operacin O lgico se realiza de la misma manera que la operacin Y lgico. Compuerta NO (NOT) La compuerta lgica NO dispone de una sola entrada y una sola salida, por lo que funciona muy simplemente. Cuando un cero lgico (0) aparezca en su entrada, la salida proporciona un uno lgico (1) y viceversa. Esto significa que esta compuerta invierte las seales por s mismas y por eso es denominada inversor.
En el programa la operacin lgica NO se realiza sobre un byte. El resultado es un byte con los bits invertidos. Si los bits de un byte se consideran nmero, el valor invertido es un complemento a ese nmero. El complemento de un nmero es el valor que se aade al nmero hasta llegar al mayor nmero binario de 8 dgitos. En otras palabras, la suma de un dgito de 8 nmeros y de su complemento es siempre 255.
COMPUERTA XOR (O EXCLUSIVA)
La compuerta XOR (O EXCLUSIVA) es un poco complicada en comparacin con las dems. Representa una combinacin de todas las compuertas anteriormente descritas. La salida proporciona un uno lgico (1) slo si sus entradas estn en estados lgicos diferentes.
En el programa, esta operacin se utiliza con frecuencia para comparar dos bytes. La resta se puede utilizar con el mismo propsito (si el resultado es 0, los bytes son iguales). A diferencia de la resta, la ventaja de esta operacin lgica es que no es posible obtener los resultados negativos.
REGISTRO Un registro o una celda de memoria es un circuito electrnico que puede memorizar el estado de un byte.
REGISTROS SFR A diferencia de los registros que no tienen ninguna funcin especial y predeterminada, cada microcontrolador dispone de un nmero de registros de funciones especiales (SFR), con la funcin predeterminada por el fabricante. Sus bits estn conectados a los circuitos internos del microcontrolador tales como temporizadores, convertidores A/D, osciladores entre otros. Esto significa que directamente manejan el funcionamiento de estos circuitos, o sea del microcontrolador. Imagnese ocho interruptores que manejan el funcionamiento de un circuito pequeo dentro del microcontrolador. Los registros SFR hacen exactamente lo mismo.
En otras palabras, el estado de los bits de registros se fija dentro de programa, los registros SFR dirigen los pequeos circuitos dentro del microcontrolador, estos circuitos se conectan por los pines del microcontrolador a un dispositivo pe-rifrico utilizado para... Bueno, depende de usted. PUERTOS DE ENTRADA/SALIDA (E/S) Para hacer til un microcontrolador, hay que conectarlo a un dispositivo externo, o sea, a un perifrico. Cada microcontrolador tiene uno o ms registros (denominados puertos) conectados a los pines en el microcontrolador. Por qu se denominan como puertos de entrada/salida? Porque usted puede cambiar la funcin de cada pin como quiera. Por ejemplo, usted desea que su dispositivo encienda y apague los tres seales LEDs y que simultneamente monitoree el estado lgico de 5 sensores o botones de presin. Uno de los puertos debe estar configurado de tal manera que haya tres salidas (conectadas a los LEDs) y cinco entradas (conectadas a los sensores). Eso se realiza simplemente por medio de software, lo que significa que la funcin de algn pin puede ser cambiada durante el funcionamiento.
Una de las caractersticas ms importantes de los pines de entrada/salida (E/S) es la corriente mxima que pueden entregar/recibir. En la mayora de los microcontroladores la corriente obtenida de un pin es suficiente para activar un LED u otro dispositivo de baja corriente (10-20mA). Otra caracterstica importante de los pines es que pueden disponer de los resistores pull-up. Estos resistores conectan los pines al polo positivo del voltaje de la fuente de alimentacin y su efecto se puede ver al configurar el pin como una entrada conectada a un interruptor mecnico o a un botn de presin. Las ltimas versiones de los microcontroladores tienen las resistencias pull-up configurables por software. Cada puerto de E/S normalmente est bajo el control de un registro SFR especializado, lo que significa que cada bit de ese registro determina el estado del pin correspondiente en el el microcontrolador. Por ejemplo, al escribir un uno lgico (1) a un bit del registro de control (SFR), el pin apropiado del puerto se configura automticamente como salida. Eso significa que el voltaje llevado a ese pin se puede leer como 0 o 1 lgico. En caso contrario, al escribir 0 al registro SFR, el pin apropiado del puerto se configura como salida. Su voltaje (0V o 5V) corresponde al estado del bit apropiado del registro del puerto (0 o 1 lgico, respectivamente). UNIDAD DE MEMORIA La unidad de memoria es una parte del microcontrolador utilizada para almacenar los datos. La manera ms fcil de explicarlo es compararlo con un armario grande con muchos cajones. Si marcamos los cajones claramente, ser fcil acceder a cualquiera de sus contenidos al leer la etiqueta en la parte delantera del cajn. De manera similar, cada direccin de memoria corresponde a una localidad de memoria. El contenido de cualquier localidad se puede leer y se le puede acceder al direccionarla. La memoria se puede escribir en la localidad o leer.
Hay varios tipos de memoria dentro del microcontrolador:
Memoria ROM (Read Only Memory) - memoria de slo lectura La memoria ROM se utiliza para guardar permanentemente el programa que se est ejecutando. El tamao de programa que se puede escribir depende del tamao de esta memoria. Los microcontroladores actuales normalmente utilizan el direccionamiento de 16 bits, que significa que son capaces de direccionar hasta 64 Kb de memoria, o sea 65535 localidades. Por ejemplo, si usted es principiante, su programa exceder pocas veces el lmite de varios cientos de instrucciones. Hay varios tipos de memoria ROM.
ROM de mscara (enmascarada) - MROM La ROM enmascarada es un tipo de ROM cuyo contenido es programado por el fabricante. El trmino de mscara viene del proceso de fabricacin, donde las partes del chip se plasman en las mascaras utilizadas durante el proceso de fotolitografa. En caso de fabricacin de grandes series, el precio es muy bajo. Olvide la idea de modificarla... OTP ROM (One Time Programmable ROM) - ROM programable una sola vez La memoria programable una sola vez permite descargar un programa en el chip, pero como dice su nombre, una sola vez. Si se detecta un error despus de descargarlo, lo nico que se puede hacer es descargar el programa correcto en otro chip.
UV EEPROM (ROM Erasable programmable ROM) - ROM programable borrable por rayos ultravioleta
El encapsulado de este microcontrolador tiene una ventana reconocible en la parte alta. Eso permite exponer la superficie del chip de silicio a la luz de ultravioleta y borrar el programa completamente en varios minutos. Luego es posible descargar un nuevo programa en l. La instalacin de esta ventana es complicada, lo que por supuesto afecta al precio. Desde nuestro punto de vista, desgraciadamente, de manera negativa... Memoria Flash Este tipo de memoria se invent en los aos 80 en los laboratorios de la compaa INTEL, como forma desarrollada de la memoria UV EPROM. Ya que es posible escribir y borrar el contenido de esta memoria prcticamente un nmero ilimitado de veces, los microcontroladores con memoria Flash son perfectos para estudiar, experimentar y para la fabricacin en pequea escala. Por la gran popularidad de esta memoria, la mayora de los microconroladores se fabrican con tecnologa flash hoy en da. Si usted va a comprar un microcontrolador, ste es en definitiva la opcin perfecta! MEMORIA RAM (Random AcMemoria RAM (Random Access Memory) - memoria de acceso aleatorio Al apagar la fuente de alimentacin, se pierde el contenido de la memoria RAM. Se utiliza para almacenar temporalmente los datos y los resultados inmediatos creados y utilizados durante el funcionamiento del microcontrolador. Por ejemplo, si el programa ejecuta la adicin (de cualquier cosa) es necesario tener un registro que representa lo que se llama suma en vida cotidiana. Con tal propsito, uno de los registros de la RAM es denominado suma y se utiliza para almacenar los resultados de la adicin. Memoria EEPROM (Electrically Erasable Programmable ROM) - ROM programable y borrable elctricamente El contenido de la EEPROM se puede cambiar durante el funcionamiento (similar a la RAM), pero se queda permanentemente guardado despus de la prdida de la fuente de alimentacin (similar a la ROM). Por lo tanto, la EEPROM se utiliza con frecuencia para almacenar los valores creados durante el funcionamiento, que tienen que estar permanentemente guardados. Por ejemplo, si usted ha diseado una llave electrnica o un alarma, sera estupendo permitir al usuario crear e introducir una contrasea por su cuenta. Por supuesto, la nueva contrasea tiene que estar guardada al apagar la fuente de alimentacin. En tal caso una solucin perfecta es el microcontrolador con una EEPROM embebida. INTERRUPCIN La mayora de programas utilizan interrupciones durante ejecucin de programa regular. El propsito del microcontrolador generalmente consiste en reaccionar a los cambios en su entorno. En otras palabras, cuando ocurre algo, el microcontrolador reacciona de alguna manera... Por ejemplo, al apretar el botn del mando a distancia, el microcontrolador lo registra y responde al comando cambiando de canal, subiendo o bajando el volumen etc. Si el microcontrolador pasar la mayora del tiempo comprobando varios botones sin parar - las horas, los das, esto no sera nada prctico. Por lo tanto, el microcontrolador aprendi un truco durante su evolucin. En vez de seguir comprobando algn pin o bit, el microconrolador deja su trabajo de esperar a un experto que reaccionar slo en caso de que suceda algo digno de atencin. La seal que informa al procesador central acerca de tal acontecimiento se denomina INTERRUPCIN. BUS El bus est formado por 8, 16 o ms cables. Hay dos tipos de buses: el bus de direcciones y el bus de datos. El bus de direcciones consiste en tantas lneas como sean necesarias para direccionar la memoria. Se utiliza para transmitir la direccin de la CPU a la memoria. El bus de datos es tan ancho como los datos, en este caso es de 8 bits o cables de ancho. Se utiliza para conectar todos los circuitos dentro del microcontrolador. UNIDAD CENTRAL DE PROCESAMIENTO (Central processor unit - CPU) Como indica su nombre, esto es una unidad que controla todos los procesos dentro del microcontrolador. Consiste en varias unidades ms pequeas, de las que las ms importantes son: Decodificador de instrucciones. Es la parte que descodifica las instrucciones del programa y acciona otros circuitos basndose en esto; Unidad lgica aritmtica (Arithmetical Logical Unit - ALU) realiza todas las operaciones matemticas y lgicas sobre datos. El conjunto de instrucciones que es diferente para cada familia de microcontrolador expresa las capacidades de este circuito; y Acumulador o registro de trabajo. Es un registro SFR estrechamente relacionado con el funcionamiento de la ALU. Es un tipo de escritorio de trabajo utilizado para almacenar todos los datos sobre los que se debe realizar alguna operacin (sumar, mover). Tambin almacena los resultados preparados para el procesamiento futuro. Uno de los registros SFR, denominado Registro Status (PSW), est estrechamente relacionado con el acumulador. Muestra el estado de un nmero almacenado en el acumulador (el nmero es mayor o menor que cero etc.) en cualquier instante dado. El acumulador es denominado registro de trabajo (working register), o sea, registro W o solamente W.
COMUNICACIN SERIE La conexin paralela entre el microcontrolador y los perifricos a travs de los puertos de entrada/salida es una solucin perfecta para las distancias cortas - hasta varios metros. No obstante, cuando es necesario establecer comunicacin entre dos dispositivos a largas distancias no es posible utilizar la conexin paralela. En vez de eso, se utiliza la conexin en serie.
Hoy en da, la mayora de los microcontroladores llevan incorporados varios sistemas diferentes para la comunicacin en serie, como un equipo estndar. Cul de estos sistemas se utilizar en un caso concreto, depende de muchos factores, de los que ms importantes son: Con cuntos dispositivos el microcontrolador tiene que intercambiar los datos? Cul es la velocidad del intercambio de datos obligatoria? Cul es la distancia entre los dispositivos? Es necesario transmitir y recibir los datos simultneamente?
Una de las cosas ms importantes en cuanto a la comunicacin en serie es el Protocolo que debe ser estrictamente observado. Es un conjunto de reglas que se aplican obligatoriamente para que los dispositivos puedan interpretar correctamente los datos que intercambian mutuamente. Afortunadamente, los microcontroladores se encargan de eso automticamente, as que el trabajo de programador/usuario es reducido a la escritura y lectura de datos. VELOCIDAD DE TRANSMISIN DE DATOS La velocidad de transmisin de datos (data rate) es el trmino utilizado para denotar el nmero de bits transmitidos por segundo [bps]. Fjese que este trmino se refiere a bits, y no a bytes! El protocolo normalmente requiere que cada byte se transmita junto con varios bits de control. Eso quiere decir que un byte en un flujo de datos serial puede consistir en 11 bits. Por ejemplo, si velocidad de transmisin serial es 300 bps un mximo de 37 y un mnimo de 27 bytes se pueden transmitir por segundo.
Los sistemas de comunicacin serial ms utilizados son: I 2 C (Inter Integrated Circuit) - Circuito Inter-Integrado Circuito inter-integrado es un sistema para el intercambio de datos serial entre los microcontroladores y los circuitos integrados de nueva generacin. Se utiliza cuando la distancia entre ellos es corta (el receptor y el transmisor estn normalmente en la misma placa de circuito impreso). La conexin se establece por medio de dos lneas - una se utiliza para transmitir los datos, mientras que la otra se utiliza para la sincronizacin (la seal de reloj). Como se muestra en la figura, un dispositivo es siempre el principal (master - maestro), el que realiza el direccionamiento de un chip subordinado (slave - esclavo) antes de que se inicie la comunicacin. De esta manera un microcontrolador puede comunicarse con 112 dispositivos diferentes. La velocidad de transmisin de datos es normalmente 100 Kb/seg (el modo estndar) o 10 Kb/seg (modo de velocidad de transmisin de datos baja). Recientemente han aparecido los sistemas con la velocidad de transmisin de datos de 3.4 Mb/sec. La distancia entre los dispositivos que se comunican por el bus I2C est limitada a unos metros.
SPI (SERIAL PERIPHERAL INTERFACE BUS) - BUS SERIAL DE INTERFAZ DE PERIFRICOS Un bus serial de interfaz de perifricos es un sistema para la comunicacin serial que utiliza tres de cuatro lneas - para recibir los datos, para transmitir los datos, para sincronizar y (opcional) para seleccionar el dispositivo con el que se comunica. Esto es la conexin full duplex, lo que significa que los datos se envan y se reciben simultneamente. La velocidad de transmisin de datos mxima es mayor que en el mdulo de conexin I2C.
UART (UNIVERSAL ASYNCHRONOUS RECEIVER/TRANSMITTER) - TRANSMISOR - RECEPTOR ASNCRONO UNIVERSAL Este tipo de conexin es asncrona, lo que significa que no se utiliza una lnea especial para transmitir la seal de reloj. En algunas aplicaciones este rasgo es crucial (por ejemplo, en mandar datos a distancia por RF o por luz infrarroja). Puesto que se utiliza slo una lnea de comunicacin, tanto el receptor como el transmisor reciben y envan los datos a velocidad misma que ha sido predefinida para mantener la sincronizacin necesaria. Esto es una manera simple de transmitir datos puesto que bsicamente representa una conversin de datos de 8 bits de paralelo a serial. La velocidad de transmisin no es alta, es hasta 1 Mbit/sec.
OSCILADOR
Los pulsos uniformes generados por el oscilador permiten el funcionamiento armnico y sncrono de todos los circuitos del microcontrolador. El oscilador se configura normalmente de tal manera que utilice un cristal de cuarzo o resonador cermico para estabilizacin de frecuencia. Adems, puede funcionar como un circuito autnomo (como oscilador RC). Es importante decir que las instrucciones del programa no se ejecutan a la velocidad impuesta por el mismo oscilador sino varias veces ms despacio. Eso ocurre porque cada instruccin se ejecuta en varios ciclos del oscilador. En algunos microcontroladores se necesita el mismo nmero de ciclos para ejecutar todas las instrucciones, mientras que en otros el tiempo de ejecucin no es el mismo para todas las instrucciones. Por consiguiente, si el sistema utiliza el cristal de cuarzo con una frecuencia de 20 MHZ, el tiempo de ejecucin de una instruccin de programa no es 50 nS, sino 200, 400 o 800 nS dependiendo del tipo del microcontrolador. CIRCUITO DE ALIMENTACIN Hay que mencionar dos cosas dignas de atencin con relacin al circuito de la fuente de alimentacin de microcontroladores: Brown out es un estado potencialmente peligroso que ocurre al apagar el microcontrolador o en caso de que el voltaje de la fuente de alimentacin salga de unos mrgenes debido al ruido elctrico. Como el microcontrolador dispone de varios circuitos que funcionan a niveles de voltaje diferentes, ese estado puede causar un comportamiento descontrolado. Para evitarlo, el microcontrolador normalmente tiene un circuito incorporado para el brown out reset. El circuito reinicia inmediatamente el microcontrolador si el voltaje de alimentacin cae por debajo del lmite. El pin de reset (reinicio), marcado frecuentemente con MCLR (Master Clear Reset), sirve para el reinicio externo del microcontrolador al aplicar un cero (0) o un uno (1) lgico dependiendo del tipo del microcontrolador. En caso de que el circuito brown out no est incorporado, un simple circuito externo para el brown out reset se puede conectar al pin MCLR. TEMPORIZADORES/CONTADORES El oscilador del microcontrolador utiliza cristal de cuarzo para su funcionamiento. Aunque no se trata de la solucin ms simple, hay muchas razones para utilizarlo. La frecuencia del oscilador es definida con precisin y muy estable, as que siempre genera los pulsos del mismo ancho, lo que los hace perfectos para medicin de tiempo. Tales osciladores se utilizan en los relojes de cuarzo. Si es necesario medir el tiempo transcurrido entre dos eventos, basta con contar los pulsos generados por este oscilador. Esto es exactamente lo que hace el temporizador.
La mayora de los programas utiliza estos cronmetros electrnicos en miniatura. Generalmente son registros SFR de 8 o 16 bits cuyo contenido se aumenta automticamente con cada pulso. Una vez que se llena el registro, se genera una interrupcin! Si el temporizador utiliza el oscilador de cuarzo interno para su funcionamiento, es posible medir el tiempo entre dos eventos (el valor de registro en el momento de iniciar la medicin es T1, en el momento de finalizar la medicin es T2, el tiempo transcurrido es igual al resultado de la resta T2 - T1). Si los registros se aumentan con los pulsos que vienen de la fuente externa, tal temporizador se convierte en un contador. Esto es una explicacin simple de su funcionamiento. Es un poco ms complicado en prctica. CMO FUNCIONAN LOS TEMRPORIZADORES? En prctica, los pulsos generados por el oscilador de cuarzo son llevados al circuito una vez por cada ciclo de mquina directamente o por el pre-escalador, lo que aumenta el nmero en el registro del temporizador. Al incorporar al cuarzo que oscila con una frecuencia de 4 MHz se aplica lo siguiente: si una instruccin (un ciclo de mquina) dura cuatro perodos del oscilador de cuarzo, este nmero ser cambiado un milln de veces por segundo (cada microsegundo).
Es fcil de medir los intervalos de tiempo cortos de la manera descrita anteriormente (hasta 256 microsegundos porque es el mayor nmero que un registro puede contener). Esta obvia desventaja se puede superar de varias maneras: al utilizar el oscilador ms lento, por medio de registros con ms bits, del pre-escalador o de la interrupcin. Las primeras dos soluciones tienen algunas debilidades as que se recomienda utilizar el pre-escalador y/o la interrupcin.
UTILIZAR UN PRE-ESCALADOR EN EL FUNCIONAMIENTO DEL TEMPORIZADOR Un pre-escalador es un dispositivo electrnico utilizado para dividir la frecuencia por un factor predeterminado. Esto quiere decir que se necesita llevar 1, 2, 4 o ms pulsos a su entrada para generar un pulso a la salida. La mayora de los microcontroladores disponen de uno o ms pre-escaladores incorporados y su tasa de divisin puede ser cambiada dentro del programa. El pre- escalador se utiliza cuando es necesario medir los perodos de tiempo ms largos.
UTILIZAR UNA INTERRUPCIN EN EL FUNCIONAMIENTO DEL TEMPORIZADOR Si el registro del temporizador es de 8 bits, el mayor nmero que se puede escribir en l es 255. En los registros de 16 bits es el nmero 65.535. Si se excede este nmero, el temporizador se reinicia automticamente y el conteo comienza de nuevo en cero. Esto es denominado desbordamiento o sobreflujo (overflow). Permitido por el programa, el desbordamiento puede provocar una interrupcin, lo que abre completamente nuevas posibilidades. Por ejemplo, el estado de registros utilizados para contar segundos, minutos o das puede ser implementado en una rutina de interrupcin. El proceso entero (excepto la rutina de interrupcin) se lleva a cabo internamente, lo que permite que los circuitos principales del microcontrolador funcionen regularmente.
La figura anterior describe el uso de una interrupcin en el funcionamiento del temporizador. Al asignarle un pre-escalador al temporizador, se producen retrasos de duracin arbitraria con mnima interferencia en la ejecucin del programa principal. CONTADORES Si un temporizador se suministra por los pulsos ingresados por el pin de entrada en el microcontrolador, se produce un contador. Evidentemente, es el mismo circuito electrnico capaz de funcionar en dos modos diferentes. La nica diferencia es que los pulsos para contar se ingresan por el pin de entrada y que su duracin (anchura) no es definida. Por eso, no se pueden utilizar para medicin de tiempo, sino que se utilizan para otros propsitos, por ejemplo: contar los productos en la cadena de montaje, nmero de rotaciones del eje de un motor, pasajeros etc. (dependiendo del sensor utilizado). TEMPORIZADOR PERRO GUARDIN (WATCHDOG) El perro guardin es un temporizador conectado a un oscilador RC completamente independiente dentro del microcontrolador.
Si el perro guardin est habilitado, cada vez que cuenta hasta el mximo valor en el que ocurre el desbordamiento del registro se genera una seal de reinicio del microcontrolador y la ejecucin de programa inicia en la primera instruccin. El punto es evitar que eso ocurra al utilizar el comando adecuado.
La idea se basa en el hecho de que cada programa se ejecuta en varios bucles, ms largos o cortos. Si las instrucciones que reinician el temporizador perro guardin se colocan en lugares estratgicos del programa, aparte los comandos que se ejecutan regularmente, el funcionamiento del perro guardin no afectar a la ejecucin del programa. Si por cualquier razn (con frecuencia por los ruidos elctricos) el contador de programa se queda atrapado dentro de un bucle infinito, el valor del registro continuar aumentado por el temporizador perro guardin alcanzar el mximo valor, el registro se desbordar y, aleluya! Ocurre el reinicio y el programa ser ejecutado desde el principio!
CONVERTIDOR A/D
Las seales externas son muy diferentes de las que entiende el microcontrolador (solamente 0V y 5V), as que deben ser convertidas para que el microcontrolador pueda entenderlas. Un convertidor analgico-digital es un circuito electrnico encargado de convertir las seales continuas en nmeros digitales discretos. En otras palabras, este circuito convierte un nmero real en un nmero binario y se lo enva a la CPU para ser procesado. Este mdulo se utiliza para medir el voltaje en el pin de entrada (voltaje analgico). El resultado de esta medicin es un nmero (el valor digital) utilizado y procesado ms tarde en el programa.
ARQUITECTURA INTERNA Todos los microcontroladores actuales utilizan uno de dos modelos bsicos de arquitectura denominados Harvard y von-Neumann. Son dos maneras diferentes del intercambio de datos entre la CPU y la memoria. ARQUITECTURA DE VON-NEUMANN
Los microcontroladores que utilizan la arquitectura von-Neumann disponen de un solo bloque de memoria y de un bus de datos de 8 bits. Como todos los datos se intercambian por medio de estas 8 lneas, este bus est sobrecargado, y la comunicacin por si misma es muy lenta e ineficaz. La CPU puede leer una instruccin o leer/escribir datos de/en la memoria. Los dos procesos no pueden ocurrir a la vez puesto que las instrucciones y los datos utilizan el mismo bus. Por ejemplo, si alguna lnea de programa dice que el registro de la memoria RAM llamado SUM debe ser aumentado por uno (instruccin: incf SUMA), el microcontrolador har lo siguiente: 1. Leer la parte de la instruccin de programa que especifica QU es lo que debe realizar (en este caso es la instruccin para incrementar incf) 2. Seguir leyendo la misma instruccin que especifica sobre CUL dato lo debe realizar (en este caso es el contenido del registro SUMA) 3. Despus de haber sido incrementado, el contenido de este registro se debe escribir en el registro del que fue ledo (direccin del registro SUMA) El mismo bus de datos se utiliza para todas estas operaciones intermedias al intercambiar los datos entre la CPU y la memoria.
ARQUITECTURA DE HARVARD
Los microcontroladores que utilizan esta arquitectura disponen de dos buses de datos diferentes. Uno es de 8 bits de ancho y conecta la CPU con la memoria RAM. El otro consiste en varias lneas (12, 14 o 16) y conecta a la CPU y la memoria ROM. Por consiguiente, la CPU puede leer las instrucciones y realizar el acceso a la memoria de datos a la vez. Puesto que todos los registros de la memoria RAM son de 8 bits de ancho, todos los datos dentro del microcontrolador que se intercambian son de la misma anchura. Durante el proceso de la escritura de programa, slo se manejan los datos de 8 bits. En otras palabras, todo lo que usted podr cambiar en el programa y a lo que podr afectar ser de 8 bits de ancho. Todos los programas escritos para estos microcontroladores sern almacenados en la memoria ROM interna del microcontrolador despus de haber sido compilados a cdigo mquina. No obstante, estas localidades de memoria ROM no tienen 8, sino 12, 14 o 16 bits. 4, 6 o 8 bits adicionales representan una instruccin que especifica a la CPU qu hacer con los datos de 8 bits. Las ventajas de esta arquitectura son las siguientes: Todos los datos en el programa son de un byte (8 bits) de ancho. Como un bus de datos utilizado para lectura de programa tiene unas lneas ms (12, 14 o 16), tanto la instruccin como el dato se pueden leer simultneamente al utilizar estos bits adicionales. Por eso, todas las instrucciones se ejecutan en un ciclo salvo las instrucciones de salto que son de dos ciclos. El hecho de que un programa (la ROM) y los datos temporales (la RAM) estn separados, permite a la CPU poder ejecutar dos instrucciones simultneamente. Dicho de manera sencilla, mientras que se realiza la lectura o escritura de la RAM (que marca el fin de una instruccin), la siguiente instruccin se lee por medio de otro bus. En los microcontroladores que utilizan la arquitectura de von-Neumann, nunca se sabe cunta memoria ocupar algn programa. Generalmente, la mayora de las instrucciones de programa ocupan dos localidades de memoria (una contiene informacin sobre QU se debe realizar, mientras que la otra contiene informacin sobre CUL dato se debe realizar). Sin embargo, esto no es una frmula rgida, sino el caso ms frecuente. En los microcontroladores que utilizan una arquitectura Harvard, el bus de la palabra de programa es ms ancho que un byte, lo que permite que cada palabra de programa est compuesto por una instruccin y un dato. En otras palabras, una localidad de memoria - una instruccin de programa.
JUEGO DE INSTRUCCIONES
El nombre colectivo de todas las instrucciones que puede entender el microcontrolador es llamado Juego de Instrucciones. Cuando se escribe un programa en ensamblador, en realidad se especifican instrucciones en el orden en el que deben ser ejecutadas. La restriccin principal es el nmero de instrucciones disponibles. Los fabricantes normalmente elijen entre una de dos soluciones opuestas y disean los microcontroladores que aplican el mayor o el menor nmero posible de instrucciones. En otras palabras, elijen entre dos juegos de instrucciones - RISC o CISC, respectivamente. RISC (REDUCED INSTRUCTION SET COMPUTER) - COMPUTADORA CON JUEGO DE INSTRUCCIONES REDUCIDAS En este caso la idea es que el microcontrolador reconoce y ejecuta slo operaciones bsicas (sumar, restar, copiar etc...) Las operaciones ms complicadas se realizan al combinar stas. Por ejemplo, multiplicacin se lleva a cabo al realizar adicin sucesiva. Es como intentar explicarle a alguien con pocas palabras cmo llegar al aeropuerto en una nueva ciudad. Sin embargo, no todo es tan oscuro. Por ltimo, no es tan difcil explicar dnde est el aeropuerto si se utilizan las palabras adecuadas tales como: a la derecha, a la izquierda, el kilmetro etc. CISC (COMPLEX INSTRUCTION SET COMPUTER) - COMPUTADORAS CON JUEGO DE INTRUCCIONES COMPLEJO CISC es opuesto a RISC! Los microcontroladores diseados para reconocer ms de 200 instrucciones diferentes realmente pueden realizar muchas cosas a alta velocidad. No obstante, uno debe saber cmo utilizar todas las posibilidades que ofrece un lenguaje tan rico, lo que no es siempre tan fcil... CMO ELEGIR UN MICROCONTROLADOR? Bueno, si usted es principiante, y ha tomado decisin de trabajar con los microcontroladores. Felicitaciones por la eleccin! No obstante, a primera vista, no es fcil la eleccin del microcontrolador ms adecuado como parece a la primera vista. El problema no es el pequeo rango de dispositivos a elegir, sino todo lo contrario!
Antes de empezar a disear un dispositivo basado en un microcontrolador, tome en cuenta lo siguiente: cuntas entradas/lneas son necesarias para su funcionamiento, realizara el dispositivo otras operaciones adems encender/apagar un rel, necesita algn modulo especializado tal como el de comunicacin en serie, convertidor A/D etc. Cuando usted tiene una clara imagen de lo que quiere, el rango de seleccin se reduce considerablemente, y le queda pensar en el precio. Va a tener varios dispositivos? Varios cientos? Un milln? De todos modos ahora es ms claro. Si est pensando en todas estas cosas por primera vez, todo le parecer un poco confuso. Por esa razn, vaya paso a paso. Antes que nada, seleccione al fabricante, es decir, la familia de microcontroladores que ofrece. Luego, aprenda a trabajar con un modelo particular. Slo aprenda lo que necesite aprender, no entre demasiado en detalles. Resuelva el problema especfico y le pasar una cosa increble - ser capaz de manejar cualquier modelo que pertenece a la misma familia...
Ms o menos, todo se parece a montar en bicicleta: despus de varias cadas inevitables en el principio, ser capaz de mantener el equilibrio y montar en cualquier otra bicicleta. Por supuesto, nunca se olvida tanto de montar en bicicleta, como de la destreza de programacin! 1.4 MICROCONTROLADORES PIC El nombre verdadero de este microcontrolador es PICmicro - controlador de interfaz perifrico (Peripheral Interface Controller), conocido bajo el nombre PIC. Su primer antecesor fue creado en 1975 por la compaa General Instruments. Este chip denominado PIC1650 fue diseado para propsitos completamente diferentes. Aproximadamente diez aos ms tarde, al aadir una memoria EEPROM, este circuito se convirti en un verdadero microcontrolador PIC.
Si est interesado en aprender ms sobre eso, siga leyendo. La idea principal de este libro es proporcionar la informacin necesaria al usuario para que sea capaz de utilizar los microcontroladores en la prctica. Para evitar explicaciones pesadas y las historias infinitas sobre las caractersticas tiles de los microcontroladores diferentes, este libro describe el funcionamiento de un modelo particular que pertenece a la clase media alta. Es PIC16F887 - bastante poderoso para ser digno de atencin y bastante simple para poder ser utilizado por cualquiera. As, los siguientes captulos describen este microcontrolador en detalle y tambin se refieren a la familia PIC entera.. Todos los microcontroladores PIC utilizan una arquitectura Harvard, lo que quiere decir que su memoria de programa est conectada a la CPU por ms de 8 lneas. Hay microcontroladores de 12, 14 y 16 bits, dependiendo de la anchura del bus. La siguiente tabla rmuestra las caractersticas principales de estas tres categoras de los microcontroladores PIC.
Familia ROM [Kbytes ] RAM [bytes ] Pine s Frecuenci a de reloj[MHz] Entrada s A/D Resoluci n del convertid or A/D Compa r- adores Temporizador es de 8/16 bits Com. serial Salida s PWM Otros Arquitectura de la gama baja de 8 bits, palabra de instruccin de 12 bits PIC10FXXX 0.375 - 0.75 16 - 24 6 - 8 4 - 8 0 - 2 8 0 - 1 1 x 8 - - - PIC12FXXX 0.75 - 1.5 25 - 38 8 4 - 8 0 - 3 8 0 - 1 1 x 8 - - EEPRO M PIC16FXXX 0.75 - 3 25 - 134 14 - 44 20 0 - 3 8 0 - 2 1 x 8 - - EEPRO M PIC16HVXX X 1.5 25 18 - 20 20 - - - 1 x 8 - - Vdd = 15V Arquitectura de la gama media de 8 bits, palabra de instruccin de 14 bits PIC12FXXX 1.75 - 3.5 64 - 128 8 20 0 - 4 10 1 1 - 2 x 8 1 x 16 - 0 - 1 EEPRO M PIC12HVXX X 1.75 64 8 20 0 - 4 10 1 1 - 2 x 8 1 x 16 - 0 - 1 - PIC16FXXX 1.75 - 14 64 - 368 14 - 64 20 0 - 13 8 or 10 0 - 2 1 - 2 x 8 1 x 16 USART I2C SPI 0 - 3 - PIC16HVXX X 1.75 - 3.5 64 - 128 14 - 20 20 0 - 12 10 2 2 x 8 1 x 16 USART I2C SPI - - Arquitectura de la gama alta de 8 bits, palabra de instruccin de 16 bits PIC18FXXX 4 - 128 256 - 3936 18 - 80 32 - 48 4 - 16 10 or 12 0 - 3 0 - 2 x 8 2 - 3 x 16 USB2.0 CAN2.0 USART I2C SPI 0 - 5 - PIC18FXXJX X 8 - 128 1024 - 3936 28 - 100 40 - 48 10 - 16 10 2 0 - 2 x 8 2 - 3 x 16 USB2.0 USART Etherne t I2C SPI 2 - 5 - PIC18FXXKX X 8 - 64 768 - 3936 28 - 44 64 10 - 13 10 2 1 x 8 3 x 16 USART I2C SPI 2 - Como se puede ver en la tabla de la pgina anterior, salvo los monstruos de 16 bits PIC 24FXXX y PIC 24HXXX - todos los microcontroladores tienen la arquitectura Harvard de 8 bits y pertenecen a una de las tres grandes grupos. Por eso, dependiendo del tamao de palabra de programa existen la primera, la segunda y la tercera categora de microcontroladores, es decir microcontroladores de 12, 14 o 16 bits. Puesto que disponen del ncleo similar de 8 bits, todos utilizan el mismo juego de instrucciones y el esqueleto bsico de hardware conectado a ms o menos unidades perifricas. Los microcontroladores PIC con palabras de programa de 14 bits parecen ser la mejor opcin para los principiantes. Aqu est el porqu... JUEGO DE INSTRUCCIONES El juego de instrucciones para los microcontroladores 16F8XX incluye 35 instrucciones en total. La razn para un nmero tan reducido de instrucciones yace en la arquietectura RISC. Esto quiere decir que las instrucciones son bien optimizadas desde el aspecto de la velocidad operativa, la sencillez de la arquitectura y la compacidad del cdigo. La desventaja de la arquitectura RISC es que se espera del programador que haga frente a estas instrucciones. Por supuesto, esto es relevante slo si se utiliza el lenguaje ensamblador para la programacin. Este libro se refiere a la programacin en el lenguaje de alto nivel Basic, lo que significa que la mayor parte del trabajo ya fue hecho por alguien ms. As, slo se tienen que utilizar instrucciones relativamente simples. TIEMPO DE EJECUCIN DE INSTRUCCIONES Todas las instrucciones se ejecutan en un ciclo. La nicas excepciones pueden ser las instrucciones de ramificacin condicional o las instrucciones que cambian el contenido del contador de programa. En ambos casos, dos ciclos de reloj son necesarios para la ejecucin de la instruccin, mientras que el segundo ciclo se ejecuta como un NOP (No operation). Las instrucciones de un ciclo consisten en cuatro ciclos de reloj. Si se utiliza un oscilador de 4 MHz, el tiempo nominal para la ejecucin de la instruccin es 1mS. En cuanto a las instrucciones de ramificacin, el tiempo de ejecucin de la instruccin es 2S. Juego de instrucciones de los microcontroladores PIC de 14 bits: I NSTRUCCI N DESCRI PCI N OPERACI N BANDERA CLK * Instrucciones para la transmisin de datos MOVLW k Mover literal a W k -> w
1
MOVWF f Mover el contenido de W a f W -> f
1
MOVF f,d Mover el contenido de f a d f -> d Z 1 1, 2 CLRW Borrar el contenido de W 0 -> W Z 1
CLRF f Borrar el contenido de f 0 -> f Z 1 2 SWAPF f,d Intercambiar de nibbles en f f(7:4),(3:0) -> f(3:0),(7:4) 1 1, 2 Instrucciones aritmtico - lgicas ADDLW k Sumar literal a W W+k -> W C, DC, Z 1
ADDWF f,d Sumar el contenido de W y f W+f -> d C, DC ,Z 1 1, 2 SUBLW k Restar W de literal k-W -> W C, DC, Z 1
SUBWF f,d Restar W de f f-W -> d C, DC, Z 1 1, 2 ANDLW k AND W con literal W AND k -> W Z 1
ANDWF f,d AND W con f W AND f -> d Z 1 1, 2 IORLW k OR inclusivo de W con literal W OR k -> W Z 1
IORWF f,d OR inclusivo de W con f W OR f -> d Z 1 1, 2 XORWF f,d OR exclusivo de W con literal W XOR k -> W Z 1 1, 2 XORLW k OR exclusivo de W con f W XOR f -> d Z 1
INCF f,d Sumar 1 a f f+1 -> f Z 1 1, 2 DECF f,d Restar 1 a f f-1 -> f Z 1 1, 2 RLF f,d Rotar F a la izquierda a travs del bit de Acarreo
C 1 1, 2 RRF f,d Rotar F a la derecha a travs del bit de Acarreo C 1 1, 2 COMF f,d Complementar f f -> d Z 1 1, 2 Instrucciones orientadas a bit BCF f,b Poner a 0 el bit b del registro f 0 -> f(b)
1 1, 2 BSF f,b Poner a 1 el bit b del registro f 1 -> f(b)
1 1, 2 Instrucciones de control de programa BTFSC f,b Saltar si bit b de registro f es 0 Skip if f(b) = 0
1 (2) 3 BTFSS f,b Saltar si bit b de reg. f es 1 Skip if f(b) = 1
1 (2) 3 DECFSZ f,d Disminuir f en 1. Saltar si el resultado es 0. f-1 -> d skip if Z = 1
1 (2) 1, 2, 3 INCFSZ f,d Incrementar f en 1. Saltar si el resultado es 1. f+1 -> d skip if Z = 0
1 (2) 1, 2, 3 GOTO k Saltar a una direccin k -> PC
2
CALL k Llamar a una subrutina PC -> TOS, k -> PC
2
RETURN Retornar de una subrutina TOS -> PC
2
RETLW k Retornar con literal en W k -> W, TOS -> PC
2
RETFIE Retornar de una interupcin TOS -> PC, 1 -> GIE
2
Otras instrucciones NOP No operacin TOS -> PC, 1 -> GIE
1
CLRWDT Reiniciar el temporizador perro guardin 0 -> WDT, 1 -> TO, 1 -> PD TO, PD 1
SLEEP Poner en estado de reposo 0 -> WDT, 1 -> TO, 0 -> PD TO, PD 1
*1 Si un registro de E/S est modificado, el valor utilizado ser el valor presentado en los pines del microcontrolador. *2 Si la instruccin se ejecuta en el registro TMR y si d=1, el pre-escalador ser borrado. *3 Si el contador de programa est modificado o el resultado de prueba es un uno lgico (1), la instruccin tiene una duracin de dos ciclos. El segundo ciclo se ejecuta como un NOP
Arquitectura de los microcontroladores PIC de 8 bits. Cules de estos mdulos pertenecern al microcontrolador, depender del tipo de microcontrolador. Captulo 2: Programacin de los microcontroladores Usted seguramente sabe que no solo es suficiente conectar el microcontrolador a los otros componentes y encender una fuente de alimentacin para hacerlo funcionar, verdad? Hay que hacer algo ms. se necesita programar el microcontrolador para que sea capaz de hacer algo til. Este captulo trata de la programacin en Basic, por lo que vamos a presentar lo bsico que tiene que saber para escribir un programa. Le puede parecer complicado, sobre todo si no tiene experiencia en este campo. no se rinda, respire profundamente y empiece a programar... 2.1 LENGUAJES DE PROGRAMACIN 2.2 CARACTERSTICAS PRINCIPALES DEL LENGUAJE DE PROGRAMACIN BASIC 2.3 COMPILADOR MIKROBASIC PRO FOR PIC 2.1 LENGUAJES DE PROGRAMACIN
El microcontrolador ejecuta el programa cargado en la memoria Flash. Esto se denomina el cdigo ejecutable y est compuesto por una serie de ceros y unos, aparentemente sin significado. Dependiendo de la arquitectura del microcontrolador, el cdigo binario est compuesto por palabras de 12, 14 o 16 bits de anchura. Cada palabra es interpretada por la CPU como una instruccin a ser ejecutada durante el funcionamiento del microcontrolador. Como es ms fcil trabajar con el sistema de numeracin hexadecimal, el cdigo ejecutable se representa con frecuencia como una serie de los nmeros hexadecimales denominada cdigo Hex. A todas las instrucciones que el microcontrolador puede reconocer y ejecutar se le denominan colectivamente Juego de instrucciones. En los microcontroladores PIC con las palabras de programa de 14 bits de anchura, el conjunto de instrucciones tiene 35 instrucciones diferentes.
Normalmente los programas se escriben en el lenguaje ensamblador cuando se requiere controlar completamente la ejecucin de programa. Como el proceso de escribir un cdigo ejecutable era considerablemente arduo, en consecuencia fue creado el primer lenguaje de programacin denominado ensamblador (ASM). El proceso de programacin se hizo un poco ms complicado. Por otro lado, el proceso de escribir un programa dej de ser una pesadilla. Las instrucciones en ensamblador consisten en las abreviaturas con significado. Un programa denominado ensamblador instalado en la PC compila las instrucciones del lenguaje ensamblador a cdigo mquina (cdigo binario). Este programa compila instruccin a instruccin sin optimizacin. La ventaja principal del lenguaje ensamblador es su simplicidad y el hecho de que a cada instruccin cle orresponde una localidad de memoria. Como permite controlar todos los procesos puestos en marcha dentro del microcontrolador, este lenguaje de programacin todava sigue siendo popular. Por otro lado, los programas se ejecutan siempre a alta velocidad y en la mayora de casos no es necesario saber en detalle qu ocurre dentro del microcontrolador. A pesar de todos los lados buenos del lenguaje ensamblador, los programadores siempre han necesitado un lenguaje de programacin similar al lenguaje utilizado en el habla cotidiana. Por ltimo, los lenguajes de programacin de alto nivel (Basic entre otros) fueron creados. La ventaja principal de estos lenguajes es la simplicidad de escribir un programa. Varias instrucciones en ensamblador se sustituyen por una sentencia en Basic. El programador ya no tiene que conocer el conjunto de instrucciones del microcontrolador utilizado. Ya no es posible conocer exactamente cmo se ejecuta cada sentencia, de todas formas ya no importa. Aunque siempre se puede insertar en el programa una secuencia escrita en ensamblador.
El proceso de escribir un programa en Basic. Al seleccionar la opcin apropiada, el programa ser compilado en el ensamblador y luego en el cdigo hex que ser cargado en el microcontrolador. Similar al lenguaje ensamblador, un programa especializado e instalado en la PC se encarga de compilar un programa a cdigo mquina. A diferencia del ensamblador, los compiladores para los lenguajes de programacin de alto nivel crean un cdigo ejecutable que no es siempre tan corto como el cdigo escrito en ensamblador.
La figura anterior describe el proceso de la compilacin de programa escrito en Basic en cdigo hex. Ejemplo de un programa simple escrito en Basic:
VENTAJAS DE LOS LENGUAJES DE PROGRAMACIN DE ALTO NIVEL Si alguna vez ha escrito un programa para un microcontrolador PIC en lenguaje ensamblador, probablemente sepa que la arquitectura RISC carece de algunas instrucciones. Por ejemplo, no hay instruccin apropiada para multiplicar dos nmeros. Por supuesto, este problema se puede resolver gracias a la aritmtica que permite realizar las operaciones complejas al descomponerlas en un gran nmero de operaciones ms simples. En este caso, la multiplicacin se puede sustituir con facilidad por adicin sucesiva (a x b = a + a + a + ... + a). Ya estamos en el comienzo de una historia muy larga... No hay que preocuparse al utilizar uno de estos lenguajes de programacin de alto nivel como es Basic, porque el compilador encontrar automticamente la solucin a ste problema y otros similares. Para multiplicar los nmeros a y b, basta con escribir a*b.
2.2 CARACTERSTICAS PRINCIPALES DEL LENGUAJE DE PROGRAMACIN BASIC Similar al uso de cualquier lengua que no est limitada a los libros y a las revistas, el lenguaje de programacin Basic no est estrechamente relacionado a un tipo particular de ordenador, procesador o sistema operativo. Esto puede ser un problema, ya que Basic vara ligeramente dependiendo de su aplicacin (como diferentes dialectos de una lengua). Por consiguiente, en este libro no vamos a darle una descripcin detallada de todas las caractersticas de Basic, sino presentar una aplicacin muy concreta de Basic, lenguaje de programacin utilizado en el compilador mikroBasic PRO for PIC. El Basic es un lenguaje de programacin simple y fcil de entender. Para utilizarlo correctamente, basta con conocer slo unos pocos elementos bsicos en los que consiste cada programa. Estos son: Identificadores Comentarios Operadores Expresiones Instrucciones Constantes Variables Smbolos Directivas Etiquetas Procedimientos y funciones Mdulos
Aqu est un ejemplo de cmo no se debe escribir un programa. Los comentarios no estn incluidos, nombres de etiquetas no tienen significado, secciones del cdigo no estn agrupadas...Este programa funciona correctamente, pero slo el programador que lo escribi conoce su propsito y modo de ejecucin (como mximo uno o dos das). En la siguiente figura se muestra la estructura de un programa simple escrito en Basic, destacando las partes en las que consiste. Esto es un ejemplo de cmo se debe escribir un programa. Las diferencias son ms que obvias...
ESTRUCTURA DE PROGRAMA Similar a los otros lenguajes de programacin, Basic dispone de un conjunto de reglas estrictamente definidas que se deben observar al escribir un programa. Para escribir un programa en Basic, es necesario instalar un software que proporciona el entorno de trabajo apropiado y entiende estas reglas en la PC... Al escribir una carta, se necesita un programa para procesar palabras. En este caso, se necesita el compilador mikroBasic PRO for PIC. A diferencia de la mayora de programas a los que est acostumbrado a manejar, el proceso de escribir programas en el compilador no empieza por seleccionar la opcin File>New, sino Project>New. Por qu? Bueno, usted escribe un programa en un documento con extensin .mbas (mikroBasic). Una vez que se ha escrito el programa, el mismo se debe compilar en cdigo HEX para crear un nuevo documento con extensin .hex. Al mismo tiempo el compilador generar automticamente varios documentos aparte de se. Por ahora el propsito de estos documentos no importa. Por supuesto, hay algo para conectarlos todos. Usted ya lo adivina - se trata de un proyecto. El programa que escribe es slo una parte del proyecto.
Slo para estar seguro de que estamos hablando en los mismos trminos... A partir de ahora la palabra mdulo se refiere a un documento con extensin .mbas. El texto que contiene se refiere a un programa. Cada proyecto escrito en el compilador mikroBasic PRO for PIC es de extensin .mbppi (microBasic Project for PIC) y consiste en un mdulo como mnimo (mdulo principal - Main Module). Cada proyecto en el mikroBasic PRO for PIC requiere un solo mdulo principal. Lo identifica la palabra clave program y ordena al compilador por dnde empezar el proceso de la compilacin. Al crear con xito un proyecto vaco en Project Wizard, el mdulo principal (main module) ser visualizado automticamente en la ventana Code Editor: program MyProject ' El mdulo principal es denominado MyProject main: ' Procedimiento principal ... '* ... '* Escribir el cdigo de programa aqu ... '* end. A la palabra clave program no le puede preceder nada, excepto comentarios. Como hemos mencionado anteriormente, el proyecto puede incluir a otros mdulos que, a diferencia del mdulo principal, empiezan por la palabra clave module. module MyModule ' Mdulo auxiliar Auxiliary es denominado MyModule ... '* ... '* Implementos ... '* end. Para que el compilador pueda reconocer todos los mdulos que pertenecen a un proyecto, es necesario especificarlos en el mdulo principal por medio de la palabra clave include seguida por un nombre del mdulo entre comillas. La extensin de estos ficheros no se debe incluir. Se permite slo un mdulo por clusula include. El nmero de las clusulas include no est limitado, pero todas ellas deben estar especificadas inmediatamente despus del nombre del programa (mdulo principal). Ejemplo:
program MyProgram ' Inicio de programa (mdulo principal denominado MyProgram) ' Otros mdulos incluidos son: include "utils" ' Mdulo utils include "strings" ' Mdulo strings include "MyUnit" ' Mdulo MyUnit ... ORGANIZACIN DEL MDULO PRINCIPAL El mdulo principal se puede dividir en dos secciones: declaraciones y el cuerpo de programa. Qu es una declaracin en la programacin? Una declaracin es un proceso de definir las propiedades de los identificadores que se utilizarn en el programa. Como la mayora de los dems lenguajes de programacin, Basic tambin requiere que todos los identificadores estn declarados antes de ser utilizados en el programa. Si no es as, el compilador no puede interpretarlos correctamente. Ejemplo de la declaracin de una variable denominada distancia: dim distance as float ' Declarar la variable distancia Como se puede ver, es una variable de punto flotante, o sea un nmero con posicin decimal opcional. Las otras dos variables estn declaradas y nombradas velocidad y tiempo. Ahora, se pueden utilizar en el siguiente programa: Esto es un ejemplo de cmo escribir el mdulo principal correctamente:
ORGANIZACIN DE OTROS MDULOS Los otros mdulos empiezan por la palabra clave module. Cada mdulo consiste en tres secciones: include, interface e implementation. Solo la seccin implementation es obligatoria. Empieza por la palabra clave implements. Vea el siguiente ejemplo:
IDENTIFICADORES Los identificadores son los nombres arbitrarios asignados a los objetos bsicos del lenguaje teles como constantes, variables, funciones, procedimientos etc. A alguien se le ocurri utilizar la palabra identificador en vez de utilizar el nombre. As de simple. Aqu estn las reglas a observar al utilizar los identificadores. Los identificadores pueden incluir cualquiera de los caracteres alfabticos A-Z (a-z), los dgitos 0-9 y el carcter subrayado '_'. El primer carcter de un identificador no puede ser un dgito. Ningn identificador puede contener caracteres especiales tales como ! [{ # $ % & etc. Basic no es sensible a la diferencia entre minsculas y maysculas, lo que significa que FIRST, first y First son identificadores idnticos. El smbolo ^ (signo de intercalacin) se utiliza para denotar un operador exponencial, el smbolo * (asterisco) se utiliza para denotar la multiplicacin, mientras que los dems smbolos tienen el significado comn. Las palabras clave ya utilizadas por el compilador no deben ser utilizadas como identificadores. Lista alfabtica de las palabras clave en Basic: Abstract And Array As At Asm Assembler Automated Bdata Begin Bit Case Cdecl Class Code Compact Const Constructor Contains Data Default Deprecated Destructor Dispid Dispinterface Div Do Downto Dynamic Else End Except Export Exports External Far File Finalization Finally For Forward Function Goto Idata If Ilevel Implementation In Index Inherited Initialization Inline Interface Io Is Label Large Library Message Mod Name Near Nil Not Object Of On Or Org Out Overload Override Package Packed Pascal Pdata Platform Private Procedure Program Property Protected Public Published Raise Read Readonly Record Register Reintroduce Repeat Requires Resourcestring Rx Safecall Sbit Set Sfr Shl Shr Small Stdcall Stored String Stringresource Then Threadvar To Try Type Unit Until Uses Var Virtual Volatile While With Write Writeonly Xdata Xor Una lista de identificadores que no deben ser utilizados en el programa COMENTARIOS Los comentarios son las partes del programa utilizados para aclarar las instrucciones de programa o para proporcionar ms informacin al respecto. En Basic, cualquier texto que sigue a un apstrofo (') se considera un comentario, Los comentarios no se compilan al cdigo ejecutable. El compilador es capaz de reconocer los caracteres especiales utilizados para designar dnde los comentarios comienzan y terminan y no hace nada de caso al texto entre ellos durante la compilacin. Aunque los comentarios no pueden afectar a la ejecucin de programa, son tan importantes como cualquier otra parte de programa. Aqu est el porqu... Con frecuencia es necesario mejorar, modificar, actualizar, simplificar un programa... No es posible interpretar incluso los programas simples sin utilizar los comentarios.
ETIQUETAS Las etiquetas proporcionan el modo ms fcil de controlar el flujo de programa. Se utilizan para denotar las lneas particulares en el programa donde se deben ejecutar la instruccin de salto y la subrutina apropiada. Todas las etiquetas deben terminar por : as que el compilador las puede reconocer con facilidad.
CONSTANTES Las constantes son los nmeros o caracteres cuyo valor no puede ser cambiado durante la ejecucin de programa. A diferencia de las variables, las constantes se almacenan en la memoria ROM del microcontrolador para guardar el mayor espacio posible de la memoria RAM. El compilador reconoce las constantes por sus nombres y el prefijo const. Cada constante se declara bajo un nombre nico que debe ser un identificador vlido. Las constantes pueden ser en formatos decimal, hexadecimal o binario. El compilador los distingue por su prefijo. Si una constante no lleva prefijo, se considera decimal por defecto. FORMATO PREFI J O EJ EMPLO Decimal
const MAX = 100 Hexadecimal 0x o $ const MAX = 0xFF Binario Punto flotante const MAX = %11011101 Las constantes se declaran en la parte de declaracin del programa o de la rutina. La sintaxis es la siguiente: const nombre_de_constante [as type] = valor Los nombres de las constantes se escriben normalmente con maysculas. El tipo de una constante se reconoce automticamente por su tamao. En el siguiente ejemplo, la constante MINIMUM se considera un entero con signo y ocupa dos bytes de la memoria Flash (de 16 bits): const MINIMUM = -1000 ' Declarar la constante MINIMUM El tipo de constante se especifica opcionalmente. En la ausencia de tipo, el compilador lo considera el menor tipo conveniente al valor de constante. const MAX as longint = 10000 const MIN = 1000 ' Compilador supone el tipo word const SWITCH = "n" ' Compilador supone el tipo char En el siguiente ejemplo, una constante denominada T_MAX se declara de modo que tenga el valor fraccional 32.60. Ahora, el programa puede comparar la temperatura anteriormente medida con la constante con el nombre con significado en vez del nmero 32.60. const T_MAX = 32.60 ' Declarar temperatura T_MAX const T_MAX = 3.260E1 ' Otra forma de declarar la constante T_MAX Una constante de cadena consiste en una secuencia de caracteres. Debe estar encerrada entre comillas. Un espacio en blanco se puede incluir en la constante de cadena y representa un carcter. Las constantes de cadena se utilizan para representar cantidades no numricas tales como nombres, direcciones, mensajes etc. const Message_1 = "Press the START button" ' Mensaje 1 para LCD const Message_2 = "Press the RIGHT button" ' Mensaje 2 para LCD const Message_3 = "Press the LEFT button" ' Mensaje 3 para LCD En este ejemplo, al enviar la constante Message_1 al LCD, el mensaje press the START button aparecer en la pantalla. VARIABLES Una variable es un objeto nombrado capaz de contener un dato que puede ser modificado durante la ejecucin de programa. Cada variable se declara bajo un nombre nicoque debe ser un identificador vlido. Por ejemplo, para sumar dos nmeros (nmero1 + nmero2) en el programa, es necesario tener una variable para representar qu es lo que llamamos suma en vida cotidiana. En este caso, nmero1, nmero2 y suma son variables. La sintaxis es la siguiente: dim nombre_de_variable as type Las variables en Basic son de un tipo, lo que significa que es necesario especificar el tipo de dato que se asignar a la variable. Las variables se almacenan en la memoria RAM y el espacio de memoria ocupado (en bytes) depende de su tipo. Aparte de las declaraciones de una sola variable, las variables del mismo tipo, se pueden declarar en forma de una lista. Aqu, lista de identificadores es una lista de identificadores vlidos delimitados por comas, mientras que tipo puede ser cualquier tipo de dato. dim i, j, k as byte 'Definir variables i, j, k dim counter, temp as word 'Definir variables contador y temp
SMBOLOS Los smbolos en Basic permiten crear los macros simples sin parmetros. Cualquier lnea de cdigo se puede reemplazar por un solo identificador. Los smbolos pueden aumentar legibilidad y reutilizacin de cdigo cuando se utilizan correctamente.
Los smbolos deben ser declarados al principio del mdulo, bajo el nombre del mdulo y la directiva opcional include. El mbito de un smbolo es siempre limitado al mdulo en el que ha sido declarado. symbol nombre_de_smbolo = cdigo Aqu, nombre_de_smbolo debe ser un identificador vlido que se utilizar por todo el cdigo. El especificador cdigo puede ser cualquier lnea de cdigo (literales, asignaciones, llamadas de funcin etc.) symbol MAXALLOWED = 216 ' Smbolo MAXALLOWED para el valor numrico symbol OUT = PORTA ' Smbolo OUT para SFR symbol MYDELAY = Delay_ms(762) ' Smbolo MYDELAY para llamada de procedimiento dim cnt as byte ' Variable cnt main: if cnt > MAXALLOWED then ' Programa comprueba si cnt > 216 cnt = 0 ' Si lo es, OUT.1 = 0 ' los siguientes tres comandos MYDELAY ' se ejecutarn
end if ... ' Si no lo es, el programa contina aqu Los smbolos no se almacenan en la memoria RAM. El compilador reemplaza los smbolos por las lneas del cdigo apropiadas asignadas durante la declaracin. TIPOS DE DATOS EN BASIC Hay varios tipos de datos que se pueden utilizar en el lenguaje de programacin Basic. La siguiente tabla muestra el rango de valores que estos datos pueden tener cuando se utilizan en su forma bsica . TI PO DE DATO DESCRI PCI N TAMAO ( NMERO DE BI TS) RANGO DE VALORES bit Un bit 1 0 o 1 sbit Un bit 1 0 o 1 byte, char Carcter 8 0 ... 255 short Entero con signo corto
-127 ... 128 word Entero sin signo 16 0 ... 65535 integer Entero con signo 16 -32768 ... 32767 longword Palabra de 32 bits 32 0 ... 4294967295 longint Palabra de 32 bits asignada 32 -2147483648 ... 2147483647 float Punto flotante 32 1.17549435082*10 -38 ... 6.80564774407*10 38
CONVERSIN DE TIPOS DE DATOS AUTOMTICA El compilador automticamente realiza la conversin implcita en los siguientes casos: si una sentencia requiere una expresin del tipo particular, y se utiliza la expresin de tipo diferente; si un operador requiere un operando de tipo particular, y se utiliza un operando de tipo diferente; si una funcin requiere un parmetro formal de tipo particular, y se le asigna el objeto de tipo diferente; y si el resultado de una funcin no corresponde al tipo del valor devuelto de la funcin declarada. PROMOCIN Cuando los operandos son de tipos diferentes, mediante la conversin implcita se realiza la promocin de tipo ms bajo a tipo ms alto, de la siguiente manera: bit byte short, byte/char integer, word, longint, longword integer, word longint, longword short, byte/char, integer, word, longint, longword float
RECORTE DE DATOS En las sentencias de asignacin y en las sentencias que requieren una expresin de tipo particular, el valor correcto ser almacenado en el destino slo si el resultado de expresin no excede al rango del destino. Al contrario, si el resultado de la expresin resulta en un tipo ms complejo de lo esperado, los datos que exceden se recortarn, o sea los bytes ms altos se pierden. dim i as byte 'Variable i ocupa un solo byte de la memoria RAM dim j as word ' Variable j ocupa dos bytes de la memoria RAM
... j = $FF0F i = j ' i se convierte en $0F, el byte ms alto $FF se pierde CONVERSIN DE DATOS EXPLCITA La conversin explcita se puede ejecutar bajo cualquier expresin en cualquier punto al escribir la palabra clave de tipo deseado (byte, word, short, integer, longint, float...) delante de la expresin que ser convertida. La expresin debe estar encerrada entre parntesis. La conversin explcita no puede ser realizada bajo el operando de la izquierda del operador de asignacin. a = word(b) ' Conversin explcita de la expresin b word(b) = a ' Compilador informa de un error Como no afecta a la representacin binaria de los datos, un caso especial es una conversin entre tipos de datos con signo y sin signo. dim a as byte dim b as short '... b = -1 a = byte(b) ' a is 255, not -1 ' El dato no cambia su representacin binaria %11111111 ' pero el compilador la interpreta de la manera diferente
OPERADORES Un operador es un smbolo que denota una operacin aritmtica, lgica u otra operacin particular. Cada operacin se realiza sobre uno o ms operandos (variables o constantes) en una expresin. Adems, cada operador dispone de la ejecucin de prioridad y de la asociatividad. Si una expresin contiene ms de un operando, los operandos se ejecutarn en orden de su prioridad. Hay 4 categoras de prioridad en Basic. Los operadores que pertenecen a la misma categora tienen igual prioridad. Si dos o ms operandos tienen el mismo nivel de prioridad, las operaciones se realizan de izquierda a derecha. Los parntesis se utilizan para definir la prioridad de la operacin dentro de la expresin. A cada categora se le asigna una de dos reglas de asociatividad: de izquierda a derecha o de derecha a izquierda. Refirase a la siguiente tabla: PRI ORI DAD OPERADORES ASOCI ATI VI DAD Alta @ not + - de derecha a izquierda
* / div mod and << >> de izquierda a derecha
+ - or xor de izquierda a derecha Baja = <> < > <= >= de izquierda a derecha OPERADORES ARITMTICOS Los operadores aritmticos se utilizan para realizar operaciones aritmticas. Estas operaciones se realizan sobre los operandos numricos y siempre devuelven los resultados numricos. Las operaciones binarias se realizan sobre dos operandos, mientras que las operaciones unitarias se realizan sobre un operando. Todos los operadores aritmticos se asocian de izquierda a derecha. OPERADOR OPERACI N + Adicin - Resta * Multiplicacin / Divisin - punto flotante div Divisin - redondear mod Remanente
DIVISIN POR CERO Si un cero (0) se utiliza explcitamente como el segundo operando en la operacin de divisin (x div 0), el compilador informa de un error y no generar un cdigo. En caso de una divisin implcita, o sea, en el caso de que el segundo operando sea un objeto cuyo valor es 0 (x div y, w y=0), el resultado ser indefinido. OPERADORES RELACIONALES Los operadores relacionales se utilizan para comparar dos variables y determinar la validez de su relacin. En mikroBasic, todos los operadores relacionales devuelven 255 si la expresin es evaluada como verdadera (true). Si una expresin es evaluada como falsa (false), el operador devuelve 0. Lo mismo se aplica a las expresiones tales como si la expresin es evaluada como verdadera, entonces... OPERADOR SI GNI FI CADO EJ EMPLO CONDI CI N DE VERACI DAD > es mayor que b > a si b es mayor que a >= es mayor o igual que a >= 5 si a es mayor o igual que 5 < es menor que a < b si a es menor que b <= es menor o igual que a <= b si a es menor o igual que b = es igual que a = 6 si a es igual que 6 <> no es igual que a <> b si a no es igual que b OPERADORES LGICOS DE MANEJO DE BITS Los operadores lgicos de manejo de bits se realizan sobre los bits de un operando. Se asocian de izquierda a derecha. La nica excepcin es el complemento not que realiza un desplazamiento de derecha a izquierda. Los operadores de manejo de bits se enumeran en la siguiente tabla: OPERANDO SI GNI FI CADO EJ EMPLO RESULTADO << desplazamiento a la izquierda A = B << 2 B = 11110011 A = 11001100 >> desplazamiento a la derecha A = B >> 3 B = 11110011 A = 00011110 and Y lgico para manejo de bits C = A and B A=11100011 B=11001100 C = 11000000 or O lgico para manejo de bits C = A or B A=11100011 B=11001100 C = 11101111 not NO lgico para manejo de bits A = not B B = 11001100 A = 00110011 xor EXOR lgico para manejo de bits C = A xor B A = 11100011 B = 11001100 C = 00101111 Los operadores de manejo de bits y (and), o (or) y xor realizan las operaciones lgicas sobre los pares de bits de operandos apropiados. El operador not complementa cada bit de un solo operando. $1234 and $5678 ' resultado es $1230 porque: ' $1234 : 0001 0010 0011 0100 ' $5678 : 0101 0110 0111 1000 ' ---------------------------- ' y : 0001 0010 0011 0000 ... eso es, $1230 $1234 or $5678 'equivale a $567C $1234 xor $5678 ' equivale a $444C not $1234 ' equivale a $EDCB OPERADORES DE DESPLAZAMIENTO Hay dos operadores de desplazamiento de bits en mikroBasic. Son el operador << que realiza un desplazamiento de bits a la izquierda y el operador >> que realiza un desplazamiento de bits a la derecha. Los operadores de desplazamiento de bits tienen dos operandos cada uno. El operando izquierdo es un objeto que se desplaza, mientras que el derecho indica el nmero de posiciones a mover el objeto. Los dos operandos deben ser de tipo entero. El operando derecho debe ser el valor positivo. Al desplazar a la izquierda los bits que salen por la izquierda se pierden, mientras que los nuevos bits a la derecha se rellenan con ceros. Por lo tanto, el desplazamiento del operando que carece de signo a la izquierda por n posiciones equivale a multiplicarlo por 2 n si todos los bits descartados son ceros. Lo mismo se puede aplicar a los operandos con signo si todos los bits descartados son iguales que el signo de bit. dim num as word ' declarar la variable num como word num = 1 ' asignarle el valor decimal 1 (00000000 00000001 bin.) num << 5 ' equivale a 32 (00000000 00100000 bin.) Al desplazar a la derecha los bits que salen por la derecha se pierden, mientras que los nuevos bits a la izquierda se rellenan con ceros (en caso del operando sin signo) o con el signo de bit (en caso del operando con signo). El desplazamiento del operando a la derecha por n posiciones equivale a dividirlo por 2 n . dim num as integer ' declarar variable num como signed integer num = 0xFF56 'asignarle el valor hex FF56 (11111111 01010110 bin.) num >> 4 ' equivale a 0xFFF5 (11111111 11110101 bin.) SENTENCIAS CONDICIONALES Las condiciones son ingredientes comunes de un programa. Las condiciones permiten ejecutar una o varias sentencias dependiendo de validez de una expresin. En otras palabras, Si se cumple la condicin (...), se debe hacer (...). De lo contrario, se debe hacer (...). Una sentencia condicional puede ser seguida por una sola sentencia o por un bloque de sentencias a ser ejecutadas. SENTENCIA CONDICIONAL IF La sintaxis en una forma simple de la sentencia if es: if expresin then operaciones end if Si el resultado de la expresin es verdadero (distinto de 0), las operaciones se realizan y el programa contina con la ejecucin. Si el resultado de la expresin es falso (0), las operaciones no se realizan y el programa contina inmediatamente con la ejecucin. El operador if se puede utilizar en combinacin con el operador else: if expresin then operaciones1 else other operaciones2 end if Si el resultado de la expresin es verdadero (distinto de 0), las operaciones1 se realizan. De lo contrario, las operaciones2 se realizan. Despus de realizar estas operaciones, el programa contina con la ejecucin. SENTENCIAS IF ANIDADAS La sentencia if anidada necesita una atencin adicional. Es una sentencia utilizada dentro de otra sentencia if. Siguiendo la regla, se descomponen empezando por la sentencia if ms anidada, mientras que cada sentencia else se enlaza a la ms cercana sentencia if disponible a la izquierda.
SENTENCIA CASE STATEMENT La sentencia select case es una sentencia condicional de ramificacin mltiple. Consiste en una expresin (condicin) selector y una lista de los valores posibles de la expresin. La sntaxis de la sentencia select case es la siguiente: El especificador selector es una expresin evaluada como un valor entero. Los especificadores value_1...value_n representan los valores posibles del selector. Pueden ser literales, constantes o expresiones de constantes. Los especificadores statements_1 ...statements_n pueden ser cualquier sentencia. La clusula case else es opcional. Primero se evala el valor de la expresin selector. Despus se compara con todos los valores disponibles. Si los valores son iguales (selector y uno de valores), se ejecutarn las sentencias que siguen a los valores iguales y termina la sentencia select case. En el caso de que coincidan los valores mltiples se ejecutarn las sentencias que siguen a los primeros valores iguales. Si no coincide ningn valor con el selector, se ejecutarn las sentencias_por_defecto en la clusula case else (si hay alguna).
Ejemplo de la sentencia select case: select case decimal_digit 'El valor del dgito decimal se est comprobando case 0 mask = %01111110 'Visualizar "0" case 1 mask = %00110000 'Visualizar "1" case 2 mask = %01101101 case 3 mask = %01111001 case 4 mask = %00110011 case 5 mask = %01011011 case 6 mask = %01011111 case 7 mask = %01110000 case 8 mask = %01111111 case 9 mask = %01111011 end select
Esta rutina de programa convierte los dgitos decimales en la combinacin binaria apropiada en el puerto para visualizarlos en el LED. BUCLES DE PROGRAMA Algunas instrucciones (operaciones) deben ejecutarse ms de una vez en el programa. Un conjunto de comandos que se repiten es denominado un bucle de programa. Cuntas veces se ejecutar, es decir cunto tiempo el programa se quedar en el bucle, depende de las condiciones de salir del bucle. BUCLE WHILE El bucle while aparece cuando el nmero de iteraciones no est especificado. Es necesario comprobar la condicin de iteracin antes de ejecutar un bucle. En otras palabras, el bucle while se ejecuta una vez cumplidas todas las condiciones necesarias para su ejecucin. La sintaxis del bucle while se parece a lo siguiente: while expresin sentencias wend El especificador sentencias representa un grupo de sentencias que se ejecutan repetidamente hasta que el valor del especificador expresin que representa una expresin siga siendo verdadero. En otras palabras, el programa se queda en el bucle hasta que la expresin llegue a ser falsa. El valor de la expresin se comprueba antes de que se ejecute la siguiente iteracin. Si el valor de la expresin es falso antes de entrar el bucle, no se ejecuta ninguna iteracin, esto es las sentencias no se ejecutarn nunca. El programa contina con la ejecucin desde el fin del bucle while (desde las instrucciones que siguen a la instruccin wend). Un tipo especial del bucle de programa es un bucle infinito. Se forma si la condicin para salir del bucle sigue sin cambios dentro del bucle. La ejecucin es simple en este caso ya que el resultado es siempre verdadero (1 siempre ser diferente de 0), lo que significa que el programa se queda en el bucle: while 1 ' Se puede escribir verdadero en vez de 1 ... ' Las expresiones se ejecutarn repetidamente (bucle infinito) ... wend BUCLE FOR El bucle for se utiliza cuando el nmero de iteraciones est especificado. La sintaxis del bucle for es la siguiente: for contador = valor_inicial to valor_final [step valor_de_paso] sentencias next contador La variable contador se incrementa por el valor de paso con cada iteracin de bucle. El parmetro valor_de_paso es un valor entero opcional, que es igual a 1 si es omitido. Antes de ejecutar la primera iteracin el contador se pone al valor_inicial y se incrementa hasta llegar o exceder al valor_ final. Con cada iteracin se ejecutan las sentencias. Las expresiones valor_inicial y valor_final deben ser compatibles con el contador. El especificador sentencia puede ser cualquier sentencia que no afecta al valor del contador. El parmetro valor_de_paso puede ser negativo, lo que permite contar atrs. for k=1 to 5 ' La variable k se incrementa cinco veces (de 1 a 5) y operation ' cada vez sigue ejecutndose la "operacin" ... next k Un conjunto de instrucciones (operacin) se ejecutar cinco veces. Despus, al comprobar que k<5 sea falsa (despus de 5 iteraciones k=5) y el programa saldr del bucle for. BUCLE DO La sentencia do se utiliza cuando el nmero de iteraciones no est especificado. El bucle se ejecuta repetidamente hasta que la expresin siga siendo verdadero. La sintaxis del bucle do es la siguiente: do sentencias loop until expresin En este caso, el especificador sentencias representa un grupo de sentencias que se ejecutarn hasta que la expresin siga siendo verdadera. Las condiciones del bucle se comprueban al final del bucle, as que el bucle se ejecuta al menos una vez, sin reparar en si la condicin es verdadera o falsa. En el siguiente ejemplo, el programa se queda en el bucle do hasta que la variable a alcance 1E06 (un milln de iteraciones). a = 0 ' Establecer el valor inicial do a = a+1 ' Operacin en marcha loop until a <= 1E06 ' Comprobar la condicin
ESCRIBIR CDIGO EN LENGUAJE ENSAMBLADOR
A veces el proceso de escribir un programa en Basic requiere las partes del cdigo escritas en ensamblador. Esto permite ejecutar algunas partes del programa de una forma definida con precisin en un perodo de tiempo exacto. Por ejemplo, cuando se necesita que los pulsos muy cortos (de unos microsegundos) aparezcan peridicamente en un pin del microcontrolador. En tales casos la solucin ms simple sera escribir el cdigo ensamblador en la parte del programa que controla la duracin de pulsos. El comando asm se utiliza para introducir una o ms instrucciones en ensamblador en el programa escrito en Basic: asm instrucciones en ensamblador ... end asm Las instrucciones en ensamblador pueden utilizar los objetos (constantes, variables, rutinas etc.) anteriormente declarados en Basic. Por supuesto, como el programa entero est escrito en Basic, sus reglas se aplican al declarar estas constantes y variables. Veamos al siguiente ejemplo:
MATRICES Una matriz es una lista organizada y limitada de variables del mismo tipo denominadas elementos. Este tipo es denominado tipo bsico. Cada elemento es referenciado por un ndice nico as que los diferentes elementos pueden tener el mismo valor. Para declarar una matriz, es necesario especificar el tipo de sus elementos (denominado tipo de matriz), su nombre y el nmero de sus elementos encerrados entre corchetes: dim nombre_de_matriz as tipo_de_componente [nmero_de_componentes] Los elementos de una matriz se identifican por su posicin. Los ndices van desde 0 (el primer elemento de una matriz) a N-1 (N es el nmero de elementos contenidos en la matriz). El compilador tiene que saber cuntas localidades de memoria debe alojar al declarar una matriz. Por eso, el tamao de una matriz no puede ser variable. Para explicar con ms claridad, una matriz puede ser pensada como una lista ms o menos larga o corta de variables del mismo tipo en la que a cada una se le asigna un nmero ordinal que siempre empieza por cero. A esta matriz se le denomina vector. En la tabla de la derecha se muestra una matriz denominada estante que contiene 100 elementos. ELEMENTOS DE LA MATRI Z CONTENI DO DE ELEMENT OS estante[0] 7 estante[1] 23 estante[2] 34 estante[3] 0 estante[4] 0 estante[5] 12 estante[6] 9 ... ... ... ... estante[99] 23 En este caso, el contenido de una variable (elemento) representa un nmero de productos que contiene el estante. A los elementos se les puede acceder por medio de la indexacin, o sea, al especificar sus ndices encerrados entre corchetes: dim shelf as byte [100] ' Declarar la matriz "estante" con 100 elementos shelf *4+ = 12 ' 12 elementos estn colocados en el estante *4+ temp = shelf [1] ' Variable estante [1] se copia a la variable temp En las matrices de constantes, a los elementos se les pueden asignar sus contenidos durante la declaracin de matriz. En el siguiente ejemplo, una constante de matriz denominada CALENDARIO se declara y a cada elemento se le asigna un nmero especfico de das: const CALENDARIO as byte [12]= (31,28,31,30,31,30,31,31,30,31,30,31) El nmero de los valores asignados no debe exceder la longitud de la matriz especificada, solo puede ser menor. En este caso, a los elementos de sobra se les asignarn ceros. SENTENCIA GOTO La sentencia goto le permite hacer un salto absoluto a otro punto en el programa. Esta caracterstica se debe utilizar con precaucin ya que su ejecucin puede causar un salto incondicional sin hacer caso a todos los tipos de limitaciones de anidacin. El punto destino es identificado por una etiqueta, utilizada como un argumento para la sentencia goto. Una etiqueta consiste en un identificador vlido seguido por dos puntos (:). La sintaxis de la sentencia goto es: goto: nombre_de_etiqueta La sentencia ejecuta un salto al especificador nombre_de_etiqueta que representa una etiqueta. La sentencia goto puede preceder o seguir a una etiqueta. Por lo tanto, no es posible hacer un salto hacia o desde un procedimiento o funcin. La sentencia goto se puede utilizar para salir de cualquier nivel de las estructuras anidadas. No es recomendable saltar a bucles u otras sentencias estructuradas, ya que se pueden producir resultados inesperados. SENTENCIA GOSUB Una subrutina es una parte del cdigo dentro de un programa largo ejecutado a peticin. Realiza una tarea especfica, es relativamente independiente del resto del cdigo. El intrprete del compilador salta a la subrutina, la ejecuta y vuelve al programa principal. Las palabras clave gosub y return se utilizan en Basic para denotar el inicio y el final de la subrutina: gosub nombre_de_etiqueta ... ... ... nombre_de_etiqueta: ... return Las subrutinas se consideran difciles de mantener, leer y manejar, igual que la sentencia goto. Es recomendable utilizarla solo si no hay otra solucin. ACCESO A LOS BITS INDIVIDUALES El compilador mikroBasic PRO for PIC instalado en la PC, incluye una lista de los microcontroladores PIC soportados, con todos los registros, sus direcciones exactas y los nombres de bits. El compilador le permite acceder a los bits individuales de estos registros por sus nombres, sin especificar sus posiciones (el compilador ya las conoce). Hay muchas formas de acceder y modificar a un bit individual dentro de un registro. Por ejemplo, vamos a acceder al bit GIE (Global Interrupt Enable - Habilitacin global de interrupciones) por ejemplo. Es el sptimo bit del registro INTCON. A este bit se le puede acceder por su nombre, al escribir lo siguiente: INTCON.GIE = 0 ' Poner a cero el bit GIE Para denotar la posicin de bit en un registro en lugar de un nombre de bit se pueden utilizar una variable, una constante, una llamada a funcin o una expresin encerrada entre parntesis. Adems, para acceder a los bits individuales se utilizan las constantes globales predefinidas B0, B1, , B7, o 0, 1, 7, donde 7 se considera el bit ms significante. INTCON.B0 = 0 ' Poner a cero el bit 0 del registro INTCON ADCON0.5 = 1 ' Poner a uno el bit 5 del registro ADCON0 i = 5 STATUS.(i+1) = 1 ' Poner a uno el bit 6 del registro STATUS Por fin, a un bit deseado se le puede acceder al utilizar un nombre alias. En este caso, es el GIE_bit: GIE_bit = 1 ' Poner a uno el bit GIE TIPO SBIT El compilador mikroBasic PRO for PIC tiene un tipo de dato sbit. Esto es un tipo de dato ms corto que se refiere a un solo bit. Si al tipo sbit se le asigna una variable, el bit apropiado de un registro ser cambiado al cambiar esta variable sin especificar el nombre y la localidad del registro. La variable sbit se comportar como un puntero. Para declarar la variable sbit, basta con escribir: dim Nombre_de_bit as sbit at Nombre_de_registro.Posicin_de_bit program MyProgram ' Mdulo principal ... dim Output1 as sbit at PORTB.0 ' Variable Output1 es de tipo sbit ... Output1 = 1 ' Pin del puerto PORTB.0 est a uno (5V) Si una variable de tipo sbit no est definida en el mismo mdulo donde se utiliza, la palabra clave external debe ser utilizada. Adems, el especificador de memoria apropiado se debe aadir: dim nombre_de_bit as sbit sfr external
module MyModule ' Esto no es el mdulo principal y el bit Output1 ... ' no est definido aqu dim Output1 as sbit sfr external ... Output1 = 1 ' Pin PORTB.0 (definido en el ejemplo anterior como Output1) est a uno (5V) TIPO BIT El compilador mikroBasic PRO for PIC proporciona un tipo de dato bit que se puede utilizar para declarar las variables. dim bf as bit A diferencia de variables de tipo sbit, solo el nombre de bit est declarado aqu, mientras que el compilador almacena una variable bit en algunos de los registros libres de la RAM. Como se puede ver, no es necesario especificar un bit de algn registro especfico. La localidad exacta de la variable de tipo bit es desconocida al usuario. Los tipos Bit y sbit se utilizan con los siguientes limitaciones: No pueden ser utilizados para las listas de argumentos y como valores devueltos de funciones No pueden ser utilizados como un miembro de estructuras No pueden ser utilizados como elementos de matrices No pueden ser inicializados No se puede apuntar a ellos Sus direcciones no se pueden leer, por eso el operador unitario @ no se puede utilizar con variable de este tipo dim ptr as ^bit ' invlido dim arr as array[5] of bit ' invlido
FUNCIONES Y PROCEDIMIENTOS Las funciones y los procedimientos, denominados bajo el nombre comn de rutinas, son subprogramas (bloques de sentencias autnomos) que ejecutan ciertas tareas a base de un nmero de los parmetros de entrada. Las funciones devuelven un valor despus de la ejecucin, mientras que los procedimientos no devuelven un valor. PROCEDIMIENTOS Un procedimiento es un bloque de cdigo nombrado, o sea, una subrutina con algunas caractersticas adicionales. Por ejemplo, puede aceptar parmetros. Los procedimientos se declaran de la siguiente manera: sub procedure nombre_de_procedimiento (lista_de_parmetros) [ declaraciones locales ] cuerpo de procedimiento end sub El especificador nombre_de_procedimiento representa un nombre de procedimiento y debe ser un indentificador vlido. La lista_ de_parmetros entre parntesis representa una lista de parmetros formales declarados de manera similar a variables. En mikroBasic PRO for PIC, los parmetros se le pasan a un procedimiento por valor. Para pasar los parmetros por direccin, es necesario aadir la palabra clave byref al principio de la declaracin de los parmetros. Las declaraciones locales son declaraciones opcionales de variables y constantes que se refieren slamente al procedimiento dado. El cuerpo de procedimiento es una secuencia de sentencias que se ejecutarn despus de llamar al procedimiento. Una llamada a procedimiento se realiza al especificar su nombre seguido por los parmetros actuales colocados en el mismo orden que los parmetros formales correspondientes. Despus de llamar a procedimiento, todos los parmetros formales se crean como los objetos locales inicializados por los valores de los argumentos actuales. 'Aadir dos nmeros sub procedure add (dim byref sum as word, dim x, y as byte) sum = x + y ' aadir los nmeros x e y y almacenar el resultado en la variable sum end sub ' fin del subprocedimiento Ahora, podemos llamar al procedimiento add para hacer clculo del peso total de una carga, por ejemplo: add (peso_bruto, peso_neto, peso_tara) FUNCIONES Las funciones deben estar declaradas apropiadamente para ser interpretadas correctamente durante el proceso de la compilacin. sub function nombre_de_funcin (lista_de_parmetros) as valor_devuelto [ declaraciones locales ] cuerpo de funcin end sub Cada declaracin contiene los siguientes elementos: Nombre_de_funcin es un identificador utilizado para llamar a funcin (nombre_de_funcin en el ejemplo) Tipo de resultado (valor devuelto) es un tipo de dato de los datos devueltos (tipo_devuelto en el ejemplo) Declaracin de los parmetros: cada parmetro consiste en una variable, constante, puntero o matriz precedidos por su tipo de dato especificado similar a una declaracin de variable regular (lista_de_parmetros en este ejemplo). Se utilizan para pasar la informacin de la funcin al llamarla. Declaraciones locales son declaraciones opcionales de variables y constantes que se refieren solamente a la funcin dada. Cuerpo de funcin es una secuencia de sentencias que sern ejecutadas despus de llamar a la funcin. Aqu est un ejemplo de cmo definir y utilizar la funcin power: 'funcin que hace clculo de xn basado en los parmetros de entrada x y n (n > 0) sub function power(dim x, n as byte) as longint ' x y n son bytes, resultado es longint dim i as byte ' i es un byte result = 1 ' resultado = 1 si n = 0 if n > 0 then for i = 1 to n result = result*x next i end if end sub Ahora, podemos llamar a la funcin power para hacer clculo de 3 12 por ejemplo: tmp = power(3, 12) ' Hacer clculo de 3*12 LIBRERAS DE FUNCIONES Y PROCEDIMIENTOS Las declaraciones de todas las funciones y procedimientos utilizados en Basic se almacenan normalmente en los ficheros de mdulo especial y se les denominan libreras. Antes de utilizar una librera en el programa, es necesario especificar el mdulo apropiado por medio de la clusula include al principio de programa. Esto es una regla general. Si escribe un programa en el compilador mikroBasic PRO for PIC basta con marcar la librera deseada en la lista y el mdulo apropiado ser automticamente incluido en el proyecto. El compilador ya contiene un gran nmero de estas libreras. Si el compilador encuentra una funcin o procedimiento desconocidos durante la ejecucin de programa, primero va a buscar su declaracin en las libreras anteriormente marcadas. RUTINAS INTEGRADAS EN EL COMPILADOR MIKROBASIC PRO FOR PIC Aparte de las libreras de funciones y procedimientos, el compilador mikroBasic PRO for PIC proporciona un conjunto de las funciones integradas y tiles: Lo Hi Higher Highest Inc Dec Chr Ord SetBit ClearBit TestBit Delay_us Delay_ms Vdelay_Advanded_ms Vdelay_ms Delay_Cyc Clock_KHz Clock_MHz Reset ClrWdt DisableContextSaving SetFuncCall SetOrg GetDateTime GetVersion Las rutinas Delay_us y Delay_ms se generan en la parte del programa de la que se llaman. Vdelay_ms, Delay_Cyc y Get_Fosc_kHz son las rutinas actuales en Basic. Sus fuentes se pueden encontrar en el archivo Delays.mbas ubicado en el archivo uses del compilador. PREPROCESADOR Un preprocesador es una parte integral de cada compilador. Su funcin es de reconocer y ejecutar las instrucciones del preprocesador. Qu son instrucciones del preprocesador? Son instrucciones especiales que no pertenecen al lenguaje Basic, sino que estn integrados en el compilador. Antes de compilar, el compilador inicia al preprocesador que pasa por el programa en bsqueda de estas instrucciones. Si encuentra una, el preprocesador las sustituir por otro texto que, dependiendo del tipo de comando, puede ser un archivo (comando include) o slo una corta sentencia de caracteres (comando define). Entonces, el proceso de compilar puede empezar. Las instrucciones pueden estar en cualquier parte del programa fuente y se refieren solamente a la parte del programa en la que aparecen hasta el final del programa. DIRECTIVA DEL PREPROCESADOR INCLUDE Muchos programas repiten con frecuencia el mismo conjunto de comandos un par de veces. Para escribir un programa ms rpidamente, estos comandos y declaraciones se agrupan normalmente en los mdulos particulares que se pueden incluir en el programa con facilidad por medio de la directiva include. Para decir con ms precisin, la directiva include importa el texto del otro documento en el programa, sea un conjunto de comandos o bien un conjunto de comentarios etc.
COMPILACIN CONDICIONAL Las directivas de la compilacin condicional se utilizan generalmente para facilitar la modificacin y compilacin de los programas fuente para los diferentes microcontroladores. El compilador mikroBasic PRO for PIC soporta a la compilacin condicional. Todas las directivas de la compilacin condicional deben terminar dentro del mdulo en el que han empezado. DIRECTIVAS #IF, #ELIF, #ELSE, Y #ENDIF Las directivas condicionales #if, #elif, #else y #endif se ejecutan de manera similar a las sentencias condicionales comunes en Basic. Si una expresin escrita despus de #if tiene un valor distinto de cero, las lneas de programa que siguen a la directiva #if sern interpretadas como un cdigo de programa vlido y compiladas en cdigo hex. La sintaxis es la siguiente: #if constant_expression_1 'Si expresin_de_constante_1 no es cero, <section_1> 'seccin_1 ser compilada [#elif constant_expression_2 'Si expresin_de_constante_2 no es cero, <section_2>] 'seccin_2 ser compilada ... [#elif constant_expression_n 'Si expresin_de_constante_n no es cero, <section_n>] 'seccin_n ser compilada [#else 'Si no se compila ninguna de las secciones anteriores <final_section>] 'seccin_final ser compilada #endif 'Final de la directiva #if Cada directiva #if en un archivo fuente debe terminar por una directiva #endif de cierre correspondiente. Entre las directivas #if y #endif puede haber cualquier nmero de las directivas #elif, pero slo se permite una directiva #else. Si est presente la directiva #else, debe ser la ltima directiva antes de la directiva #endif. Seccin puede ser cualquier cdigo de programa reconocido por el compilador o preprocesador. El preprocesador selecciona una seccin al evaluar la expresin_de_constante que sigue a cada directiva #if o #elif hasta encontrar una expresin_de_constante verdadera (distinta de cero). Si todas las expresiones-constantes son evaluadas como falsas o no aparecen ninguna directiva #elif, el preprocesador selecciona la seccin_final que sigue a la clusula #else. Si se omite la clusula #else y todas las expresiones_constantes en el bloque #if son evaluadas como falsas, no se seleccionar ninguna seccin para un procesamiento posterior. Por ltimo, resulta que solamente una seccin del cdigo ser compilada, aunque est vaca. PUNTEROS Como ya hemos mencionado, a cada objeto en el programa (variable, procedimiento, subrutina etc.) se le asigna una direccin de memoria particular. Al declarar una variable en el programa el compilador le asigna automticamente una localidad de la memoria RAM libre. Durante la programacin, estas direcciones no son visibles para los programadores. La posibilidad de acceder a los diferentes objetos por sus nombres (identificadores) en vez de por sus direcciones es una de las ventajas principales de los lenguajes de programacin de alto nivel. En realidad, es ms fcil manejar las palabras (nombres) que los nmeros. Adems, el compilador se encarga de los objetos asociados y de sus direcciones. Direccionar los objetos al especificar sus nombres es denominado direccionamiento directo.
Sin embargo, a veces se necesita utilizar las direcciones de localidades de memoria. En este caso se utilizan los punteros - variables que almacenan la direccin de memoria de un objeto. Entonces, es posible acceder a los objetos que utilizan solamente los punteros. Por eso esta forma de direccionar es denominada direccionamiento indirecto. Antes de utilizar un puntero es necesario declarar su tipo de datos. Solo hay que anteponer el signo de intercalacin (^) al tipo. dim pointer_p as ^word ' puntero_p apunta al dato de tipo word Se le recomienda almacenar una varible en una localidad de memoria RAM especfica, luego se debe utilizar la directiva absolute en el programa de la siguiente manera: dim variable_a as word absolute 12 ' variable_a ocupar una palabra ' (16 bits) en la direccin 12 Para acceder a los datos en la localidad de memoria del puntero, necesita posponer el signo de la intercalacin (^) al nombre del puntero. Veamos el ejemplo de la declaracin del anteriormente mencionado puntero puntero_p , que apunta a la palabra (en este caso, es anteriormente definida variable_a almacenada en la direccin 12 en la RAM). A la variable apuntada variable_a se le asigna el valor 26: dim pointer_p as ^word 'Puntero_p a punta al dato de tipo word ... ... pointer_p = 12 'Puntero_p apunta a la direccin de memoria 12 ... puntero_p^ = 26 'Variable a en la localidad de memoria 12 tiene valor 2 'Similar a la directiva absolute utilizada para las variables, la 'directiva org especifica la direccin inicial de una rutina en la 'memoria ROM. Se aade a la declaracin de la rutina. Por ejemplo: sub procedure proc(dim par as word) org 0x200 ' El procedimiento empezar ... ' en la direccin 0x200 end sub En este caso, al puntero puntero_p se le asigna el valor 12 (puntero_p =12), lo que significa que la direccin de memoria 12 est especificada.
Si quiere cambiar el valor de una variable apuntada, basta con cambiar el valor del puntero y posponer el signo de intercalacin (^) al valor. Veamos la figura a la derecha: a la variable variable_a en la direccin 12 se le asigna el valor 26 por medio del puntero puntero_p. Los punteros pueden apuntar a los datos almacenados en cualquier espacio de memoria disponible y pueden residir en cualquier espacio de memoria disponible menos en el espacio de memoria de programa (ROM). @ OPERADOR El operador @ devuelve la direccin de un objeto, o sea, crea un puntero sobre su operando. Las siguientes reglas se aplican al operando @: Si X es una variable, @X devuelve la direccin de X. Si F es una rutina (funcin o procedimiento), @F crea un puntero a F. dim temp as word ptr_b as ^byte ptr_arr as ^byte[10] arr as byte[10] main: ptr_b = @arr ' operador @ devolver ^byte temp = @arr ' operador @ devolver ^byte ptr_arr = @arr ' operador @ devolver ^byte[10] end. Si la variable X es de tipo matriz, el operador @ devolver el puntero a su primer elemento bsico, excepto en el caso de que la parte izquierda de la expresin en la que se utiliza X sea el puntero a matriz. En este caso, el operador @ devolver el puntero a matriz, y no a su primer elemento bsico. Estructura de programa en mikroBasic PRO for PIC: 1. Cada programa normalmente empieza con un comentario que proporciona informacin sobre el propsito del programa, fecha de programa, programador, versin, cambios a la versin anterior etc. Estos comentarios (cabecera) no son obligatorios, pero es una buena costumbre escribirlos y tenerlos en el programa. 2. Cada programa empieza con una directiva de programa seguida por el nombre de programa. 3. Si el programa contiene otros mdulos, aparte del mdulo principal, sus nombres se deben especificar al utilizar la directiva include (una directiva inlcude para cada mdulo). Por consiguiente, si el compilador durante la compilacin del mdulo principal llega a un objeto que no es declarado (funcin, variable etc.), primero va a buscar su declaracin dentro de los mdulos declarados. Si no encuentra la declaracin apropiada, el compilador informar de error. 4. La directiva include (si hay alguna) es seguida por la parte de cdigo que sirve de declarar variables, constantes, procedimientos, subprogramas, funciones y otros objetos que se utilizarn ms tarde en el programa. Estas declaraciones se utilizan para reservar los registros de la memoria RAM para almacenar los datos as como para ensear al compilador cmo ejecutar una funcin o un procedimiento. Por ejemplo, un dato de tipo byte ocupa un solo registro, mientras que un dato de tipo float ocupa cuatro registros. 5. El programa principal empieza con la directiva main: (siempre seguida por dos puntos). Tambin es llamada cuerpo de programa. 6. Cada programa termina con la directiva end. (siempre seguida por un punto). 2.3 COMPILADOR MIKROBASIC PRO FOR PIC Todo lo que usted ha ledo hasta ahora sobre la programacin en Basic es slo teora. Es til saberlo, pero no se olvide de que este lenguaje de programacin no est tan relacionado con algo concreto y tangible. Podr experimentar muchos problemas con los nombres exactos de los registros, sus direcciones, nombres de los bits de control particulares, y muchos ms al empezar a escribir su primer programa en Basic. El punto es que usted necesita ms que una teora para que el microcontrolador haga algo til. Teniendo en cuenta de que Es mejor prevenir que curar, hay que avisarle de todas las cosas por resolver antes de que empiece a escribir un programa para el microcontrolador. Antes que nada, necesita un programa instalado en la PC que eniende el lenguaje de programacin a utilizar y que proporciona un entorno de trabajo apropiado. No hay un compilador apropiado para un tipo de compilador, tampoco para todos los microcontroladores. Normalmente se utiliza un software para programar los similares microcontroladores de un fabricante. En las secciones anteriores hemos presentado el lenguaje mikroBasic, especialmente diseado para programar los PIC. Ahora, cuando sabe lo suficiente sobre ese lenguaje, es hora de presentar el software que utilizar para desarrollar y editar los proyectos. Este software se le denomina Entorno de desarrollo integrado (Integrated Developement Environment - IDE) e incluye todas las herramientas necesarias para desarrollar los proyectos (editor, depurador etc.). Como implica su nombre, mikroBasic PRO for PIC est pensado para escribir los programas para los microcontroladores PIC en Basic. Este compilador contiene las informaciones de arquitectura de los microcontroladores PIC (registros, sus direcciones exactas, mdulos de memoria, funcionamiento de sus mdulos, juego de instrucciones, disposicin de pines etc.). Adems incluye las herramientas apropiadas para programar los microcontroladores PIC. Lo primero que tiene que hacer al iniciar el compilador es seleccionar el chip y frecuencia de operacin de la lista. Esto no es un final, sino un comienzo. Por fin puede empezar a escribir el programa en Basic. El proceso de crear y ejecutar un proyecto contiene los siguientes pasos: 1. Crear un proyecto (nombre de proyecto, configuracin de proyecto, dependencias entre archivos); 2. Editar un programa; 3. Compilar el programa y correccin de errores; 4. Depurar (ejecutar el programa paso a paso para asegurarse de que se ejecutan las operaciones deseadas); 5. Programar un microcontrolador (cargar el archivo .hex generado por el compilador en el microcontrolador utilizando el programador PICflash). INSTALAR MIKROBASIC PRO FOR PIC La instalacin del mikroBasic PRO for PIC es similar a la instalacin de cualquier programa en Windows. Todo el procedimiento se lleva a cabo por medio de los wizards (asistentes de instalacin):
Basta con seguir las instrucciones y pulsar sobre Next, OK, Next, Next... En general, es el mismo procedimiento menos la ltima opcin: 'Do you want to install PICFLASH v7.11 programmer?'. Para qu sirve este software? Como ya hemos dicho, el compilador compila un programa escrito en Basic en cdigo hex. El siguiente paso es cargar ese cdigo en el microcontrolador. Por eso es necesario instalar el programador PICFLASH. Hgalo! Una vez ms: Next, OK, Next, Next...
Una vez completada la instalacin del PICFLASH, el sistema operativo le preguntar a instalar otro programa similar. Es un software para programar una familia de los microcontroladores PIC que funcionan en modo de bajo consumo (3.3 V). Salte este paso. El ltimo paso - la instalacin del controlador (driver)!
Un controlador es un programa que permite al sistema operativo comunicarse con un perifrico. En este caso, este dispositivo es el programador (hardware) del sistema de desarrollo. Lo necesita seguramente. Pulse sobre Yes.
El controlador a instalar depende del sistema operativo utilizado. En este caso, el ordenador utiliza el sistema operativo de 32 bits Windows XP. Seleccione la carpeta Win 2000, XP, 2003 32-bit que contiene el controlador apropiado e inicie la instalacin. Otra vez, Next, OK, Next, Next...Bueno, todo est instalado para iniciar a programar!
IDE DEL MIKROBASIC PRO FOR PIC Al iniciar el IDE del compilador mikroBasic PRO for PIC por primera vez, aparecer una ventana como se muestra a continuacin:
Desgraciadamente, una descripcin detallada de todas las opciones disponibles de este IDE nos tomara mucho tiempo. Por eso vamos a describir slo lo ms importante del compilador mikroBasic PRO for PIC. De todos modos, para obtener ms informacin presione el botn de Ayuda (Help) [F1]. En el captulo cuatro se presentan varios ejemplos y se da una explicacin detallada de cmo crear un nuevo proyecto y escribir un programa.
PROJECT MANAGER (Administrador de proyecto)
Un programa escrito en el compilador mikroBasic PRO for PIC no es un archivo autnomo, sino que forma parte de un proyecto que incluye un cdigo hex, un cdigo ensamblador y otros archivos. Algunos de ellos se requieren para compilar el programa, mientras que otros se crean durante el proceso de compilacin. La ventana Project Manager le permite manejar todos los ficheros del proyecto. Basta con pulsar con el botn derecho del ratn sobre una carpeta y seleccionar la opcin que necesita para su proyecto.
LIBRARY MANAGER
Las libreras contienen un gran nmero de funciones listas para ser utilizadas. Las libreras en mikroBasic proporcionan muchas facilidades para escribir programas para los microcontroladores PIC. El compilador debe conocer todas las dependencias del archivo fuente de mikroBasic para compilarlo apropiadamente. Abra la ventana Library Manager, y marque las que quiere utilizar en el programa. Al marcar una librera, se aade automticamente al proyecto y se enlaza durante el proceso de la compilacin. As, no necesita incluir las libreras manualmente en sus archivos del cdigo fuente por medio de la directiva del preprocesador #include. Por ejemplo, si su programa utiliza un LCD no hace falta escribir nuevas funciones ya que al seleccionar la librera Lcd, usted podr utilizar funciones listas para ser utilizadas de la librera Lcd en su programa. Si esta librera no est seleccionada en la ventana Library Manager, cada vez que intente utilizar una funcin de la librera LCD, el compilador le informar de un error. Una descripcin de cada librera est disponible al pulsar con el botn derecho del ratn sobre su nombre y seleccionar la opcin Help.
CODE EXPLORER (Explorador de cdigo)
La ventana Code Explorer le permite localizar funciones y procedimientos dentro de los programas largos. Por ejemplo, si usted busca una funcin utilizada en el programa, basta con pulsar dos veces sobre su nombre en esta ventana, y el cursor estar automticamente posicionado en la lnea apropiada en el programa.
PROJECT SETTINGS (Configuracin de proyectos)
Al compilar un proyecto, el compilador genera el archivo .hex que se cargar en el microcontrolador. Estos archivos sern diferentes ya que depende del tipo del microcontrolador as como del propsito de la compilacin. Por esta razn es necesario ajustar algunos parmetros de proyectos utilizando la ventana Project Settings. Device (dispositivo): Al seleccionar el tipo del microcontrolador a utilizar permite al compilador extraer el archivo de definicin asociado. El archivo de definicin de un microcontrolador contiene la informacin especfica de sus registros SFR, de sus direcciones de memoria y algunas variables de programacin especficas a ese tipo del microcontrolador. Es obligatorio crear un archivo .hex compatible. Oscillator (oscilador): Se debe especificar la velocidad de operacin del microcontrolador. Por supuesto, este valor depende del oscilador utilizado. El compilador la necesita para compilar rutinas, lo que requiere informacin del tiempo (por ejemplo, la funcin Delay_ms). Ms tarde, el programador necesitar esta informacin tambin. La velocidad de operacin se configura de modo que permita al oscilador interno del microcontrolador funcionar a una frecuencia seleccionada. Build/Debugger Type: Todo el proceso de compilar (building) est compuesto por anlisis sintctico (parsing), compilar, enlazar (linking) y generar los archivos .hex. El tipo de compilacin le permite ajustar el modo de compilacin. Dependiendo del modo seleccionado, difieren los archivos generados a cargar en el microcontrolador. Build type - release: Al elegir esta opcin, el compilador no puede afectar ms a la ejecucin de programa despus de la compilacin. El programa a cargar en el microcontrolador no ser modificado de ninguna manera. Build type - ICD debug: El archivo .hex generado contiene los datos adicionales que permiten el funcionamiento del depurador. Una vez completado el proceso de la compilacin y cargado el programa en la memoria del microcontrolador, el compilador se queda conectado al microcontrolador por medio del cable USB y el programador, y todava puede afectar a su funcionamiento. Una herramienta denominada mikroICD (Depurador en circuito - In Circuit Debugger) permite ejecutar el programa paso a paso y proporcionar un acceso al contenido actual de todos los registros del microcontrolador. El simulador software se puede utilizar en ambos modos de compilacin para el propsito de depurar. Le permite simular su programa al reproducir el comportamiento del microcontrolador. El simulador no utiliza los dispositivos reales para simular el funcionamiento del microcontrolador, as que algunas operaciones no pueden ser reproducidas (por ejemplo, interrupcin). De todos modos, resulta ms rpido depurar un programa por medio de un simulador. Adems, no se requiere ningn dispositivo destino. Note que es posible modificar cualquier configuracin en cualquier momento mientras se edita el programa. No se olvide de recompilar y reprogramar su dispositivo despus de modificar una configuracin. EDITAR Y COMPILAR PROGRAMAS CODE EDITOR (Editor de cdigo) El proceso de escribir y editar programas se debe realizar dentro de la ventana principal del IDE denominada Code Editor. Un gran nmero de opciones utilizadas para configurar sus funciones y el diseo se encuentran en el men Tools/Options [F12]. Al escribir el programa no se olvide de los comentarios. Los comentarios son muy importantes para depurar y mejorar el programa. Adems, aunque el compilador no tenga las restricciones de formateo, siempre debe seguir a las mismas reglas de editar (como en los ejemplos proporcionados en este libro). Como no hay limitaciones de extensin, no vacile en utilizar los espacios en blanco para hacer su cdigo ms legible.
Al escribir un programa, compile su cdigo de forma regular con el propsito de corregir cunto ms errores de sintaxis. Asimismo usted puede compilar su programa cada vez que se complete la redaccin de una nueva funcin as como probar su comportamiento al utilizar modo de depuracin. De este modo, resulta ms fcil solucionar los errores de programa. De lo contrario, usted tendr que editar el programa entero. COMPILAR Y SOLUCIONAR ERRORES Para compilar su cdigo, pulse sobre la opcin Build en el men Project. En realidad, el proyecto entero se ha compilado, y si la compilacin se ha realizado con xito, se generarn los archivos de salida (asm, .hex etc.). Una compilacin se ha realizado con xito si no se ha encontrado ningn error. Durante el proceso de compilacin se generan muchos mensajes que se visualizan en la ventana Messages. Estos mensajes consisten en informacin, advertencia y errores. Cada error encontrado se asocia con su lnea de programa y su descripcin. Como un error en su cdigo puede generar mucho ms errores, simplemente debe intentar solucionar el primer error en la lista y despus recompile su programa. En otras palabras, es recomendable solucionar los errores uno a uno.
En el ejemplo anterior el programa informa de un error de sintaxis en la lnea 80. La compilacin le permite corregir su programa por medio de solucionar todos los errores en mikroBasic. Cuando todos los errores se solucionen, su programa est listo para ser cargado en el microcontrolador. De todas formas, su tarea todava no est terminada, porque an no sabe si su programa se comporta como se esperaba o no. DEPURAR EL PROGRAMA Como ya hemos visto, hay dos modos de depurar: un depurador software que simula el funcionamiento del microcontrolador (modo por defecto) y depurador hardware (mikroICD) que lee directamente el contenido de la memoria del microcontrolador. El procedimiento de depuracin es el mismo sin reparar en el modo elegido. En caso de elegir la opcin ICD debug, hay que cargar el programa en el microcontrolador antes de depurarlo. La depuracin es un paso muy importante ya que permite probar el programa despus de una compilacin realizada con xito, o solucionar los errores descubiertos mientras se ejecuta el programa. Para iniciar la depuracin, pulse sobre la opcin Start debugger del men Run. El editor del cdigo ser ligeramente modificado automticamente y aparecer una ventana denominada Watch Values. El principio de depuracin se basa en ejecutar el programa paso a paso y monitorear el contenido de los registros y los valores de las variables. De este modo, es posible comprobar el resultado de un clculo y ver si algo inesperado ha ocurrido. Al ejecutar el programa paso a paso, podr localizar los problemas con facilidad. Durante una depuracin el programa ser modificado, por lo que usted siempre debe recompilar el programa despus de cada correccin, y reiniciar el depurador para comprobar qu ha sido modificado.
SIMULADOR SOFTWARE Si quiere ser un programador y dedicarse a programar los microcontroladores, tenga en cuenta de que los programas nunca funcionan al primer intento. Por eso, empiece a funcionar un simulador. El simulador es una parte integral del compilador utilizado para simular el funcionamiento del microcontrolador.
Antes de empezar a utilizar el simulador, seleccione el modo de funcionamiento en la ventana Project Settings (Build type - release), compile el programa y pulse sobre la opcin Run /Start Debugger. El compilador se pone automticamente en el modo de simulacin. En este modo se monitorea el estado de todos los bits de registros y se le permite ejecutar el programa paso a paso durante el monitoreo del funcionamiento del microcontrolador en la pantalla. Hay varios iconos, utilizados para el funcionamiento del simulador, que aparecern en la barra de herramientas cuando el compilador entre en este modo.
Estos iconos tienen el siguiente significado: Step Into: Ejecuta una sola instruccin. Cuando la instruccin es una llamada a una subrutina, el depurador har un salto a la subrutina y se detendr despus de ejecutar la primera instruccin dentro de la subrutina. Step Over: Se ejecuta una sola instruccin. Cuando la instruccin es una llamada a una subrutina, el depurador no har un salto a la subrutina, sino que se ejecutar toda la subrutina. El depurador se detiene a la primera instruccin despus de la llamada a la subrutina. Parece como si se saltara una lnea de programa aunque se ha ejecutado toda la subrutina. El estado de todos los registros ser cambiado. Este comando se ejecuta cuando es necesario acelerar la ejecucin de los bucles de programa largos. Run To Cursor: El programa se ejecuta hasta la lnea en la que se encuentre el cursor. Step out: Se ejecutan las dems instrucciones dentro de la rutina. El depurador se detiene inmediatamente al salir de la subrutina. Los puntos de ruptura hacen el proceso de depurar los programas de una manera ms eficiente, puesto que permiten ejecutar el programa a toda velocidad y detenerlo automticamente en una lnea especfica (punto de ruptura). Eso resulta muy til, permitindole comprobar slo las partes crticas del programa y no perder el tiempo probando todo el programa lnea a lnea. Para aadir o quitar un punto de ruptura basta con pulsar sobre la lnea apropiada en el lado izquierdo del editor del cdigo, o presionar [F5]. Una pequea ventana denominada Breakpoints muestra dnde estn los puntos de ruptura. Note que las lneas designadas como puntos de ruptura estn marcadas en rojo.
La lnea que se est ejecutando actualmente est marcada en azul. Es posible leer el contenido de registros y variables seleccionados en la ventana Watch Values en cualquier momento. Para saltar directamente a los puntos de ruptura, utilice el comando Run/Pause Debugger.
VENTANA WATCH VALUES
El depurador software y hardware tienen la misma funcin de monitorear el estado de los registros durante la ejecucin del programa. La diferencia es que el depurador software simula ejecucin de programa en una PC, mientras que el depurador ICD (depurador hardware) utiliza el microcontrolador. Cualquier cambio de estado lgico de los pines se indica en el registro (puerto) apropiado. Como la ventana Watch Values permite monitorear el estado de todos los registros, resulta fcil comprobar si un pin est a cero o a uno. La ltima modificacin est marcada en rojo en la ventana Watch Values. Esto le permite localizar la modificacin en el archivo list durante el proceso de la depuracin. Para visualizar esta ventana es necesario seleccionar la opcin View/Windows/Watch Values. Entonces usted puede hacer una lista de re-gistros/variables que quiere monitorear.
STOPWATCH (Cronmetro)
Si quiere saber cunto tiempo tarda un microcontrolador en ejecutar una parte del programa, seleccione la opcin Run/View Stopwatch. Aparecer una ventana como se muestra en la figura a la derecha.Cmo funciona un cronmetro? Eso es pan comido...El tiempo que tarda un comando (step into, step over, run/pause etc.) en ejecutarse por el depurador se mide automticamente y se visualiza en la ventana Stopwatch. Por ejemplo, se mide tiempo para ejecutar un programa, tiempo para ejecutar el ltimo paso etc. DEPURADOR EN CIRCUITO La otra forma de comprobar la ejecucin de programa es al utilizar el depurador mikroICD (depurador en circuito). El mikroICD (depurador en circuito) es una parte integral del programador PICflash. Se utiliza con el propsito de probar y depurar los programas. El proceso de probar y depurar se realiza al monitorizar los estados de todos los registros dentro del microcontrolador durante su funcionamiento en entorno real. Para habilitar la depuracin, es necesario seleccionar las opciones Build Type-ICD Debug y Debugger-mikroICD antes de cargar el programa en el microcontrolador. Tan pronto como se inicie el depurador mikroICD, aparecer una ventana como se muestra en la siguiente Figura. El depurador mikroICD se comunica con el microcontrolador PIC por sus pines utilizados para la programacin. Por eso no se pueden utilizar como pines de E/S durante la ejecucin de la depuracin de programa. Durante la operacin del depurador mikroICD, el programador y la PC deben estar conectados al utilizar un cable USB.
Opciones del depurador mikroICD: Start Debugger [F9] Run/Pause Debugger [F6] Stop Debugger [Ctrl+F2] Step Into [F7] Step Over [F8] Step Out [Ctrl+F8] Toggle Breakpoint [F5] Show/Hide Breakpoints [Shift+F4] Clear Breakpoints [Ctrl+Shift+F4] Cada de estos comandos se activa por medio de los atajos de teclado o al pulsar sobre el icono apropiado en la ventana Watch Values. El depurador mikroICD tambin ofrece funciones tales como ejecutar el programa paso a paso, detener la ejecucin de programa para monitorear el estado de los registros actualmente activos por medio de los puntos de ruptura, monitorear los valores de algunas variables etc. El siguiente ejemplo muestra una ejecucin de programa paso a paso utilizando el comando Step Over.
Paso1:
En este ejemplo la lnea de programa 31 est marcada por el azul, lo que quiere decir que es la siguiente en ser ejecutada. El estado actual de todos los registros dentro del microcontrolador se puede visualizar en la ventana Watch Values del mikroICD.
Paso 2:
Despus de ejecutar el comando Step Over [F8] el microcontrolador ejecutar la lnea de programa 31. La siguiente lnea en ser ejecutada (32) est marcada por el azul. El estado de los registros cambiados durante la ejecucin de esta instruccin se puede visualizar en la ventana Watch Values. CARGAR EL PROGRAMA EN EL MICROCONTROLADOR Si ha solucionado todos los errores en su cdigo y cree que su programa est listo para ser utilizado, el siguiente paso es cargarlo en el microcontrolador. El programador PICflash se utiliza para este propsito. Es una herramienta diseada para programar todos los tipos de microcontroladores PIC. Est compuesto por dos partes: La parte hardware se utiliza para poner en el bfer un cdigo hexadecimal (el programa a ser cargado en el microcontrolador) y para programar el microcontrolador por medio de niveles de voltaje especficos. Durante el proceso de la programacin, un nuevo programa se escribe en la memoria flash del microcontrolador, mientras que el programa anterior se borra automticamente. La parte de software se encarga de enviar el programa (archivo .hex) a la parte hardware del programador por medio de un cable USB. Se activa al pulsar sobre la opcin mE_Programmer del men Tools o al pulsar [F11]. Por consiguiente, es posible modificar algunas configuraciones del programador y controlar el funcionamiento de la parte hardware (Cargar, Escribir, Verificar...).
Se puede reprogramar el microcontrolador tantas veces como se necesite. HERRAMIENTAS DEL COMPILADOR El compilador mikroBasic PRO for PIC proporciona herramientas que en gran medida simplifican el proceso de escribir el programa. Todas estas herramientas se encuentran en el men Tools. En la siguiente seccin vamos a darle una breve descripcin de todas ellas.
TERMINAL USART
El terminal USART representa una sustitucin para la estndar Windows Hyper Terminal. Se puede utilizar para controlar el funcionamiento del microcontrolador que utiliza la comunicacin USART. Tales microcontroladores estn incorporados en un dispositivo destino y conectados al conector RS232 de la PC por medio de un cable serial. La ventana USART terminal dispone de opciones para configurar la comunicacin serial y visualizar los datos enviados/recibidos.
EDITOR EEPROM
Al seleccionar la opcin EEPROM Editor del men Tools, aparecer una ventana como se muestra en la siguiente figura. As es cmo funciona la memoria EEPROM del microcontrolador. Si quiere cambiar de su contenido despus de cargar el programa en el microcontrolador, sta es la forma correcta de hacerlo. El nuevo contenido es un dato de un tipo especfico (char, int o double), primero debe seleccionarlo, introducir el valor en el campo Edit Value y pulsar sobre Edit. Luego, pulse sobre el botn Save para guardarlo como un documento con extensin .hex. Si la opcin Use EEPROM in Project est activa, los datos se cargarn automticamente en el microcontrolador durante el proceso de la programacin. VENTANA ASCII CHART Si necesita representar numricamente un carcter ASCII, seleccione la opcin ASCII chart del men Tools. Aparecer una tabla, como se muestra en la figura que est a continuacin.
Usted probablemente sabe que cada tecla de teclado est asociada con un cdigo (cdigo ASCII). Como se puede ver, los caracteres que representan los nmeros tienen valores diferentes. Por esta razn, la instruccin de programa para visualizar el nmero 7 en un LCD no visualizar este nmero, sino el equivalente a la instruccin BEL. Si enva el mismo nmero en forma de un carcter a un LCD, obtendr el resultado esperado - nmero 7. Por consiguiente, si quiere visualizar un nmero sin convertirlo en un carcter apropiado, es necesario aadir el nmero 48 a cada dgito en el que consiste el nmero a visualizar. EDITOR DE SIETE SEGMENTOS Un editor de siete segmentos le permite determinar con facilidad el nmero a poner en un puerto de salida con el propsito de visualizar un smbolo deseado. Por supuesto, se da por entendido que los pines del puerto deben estar conectados a los segmentos del visualizador de manera apropiada. Basta con colocar el cursor en cualquier segmento del visualizador y pulsar sobre l. Se visualizar inmediatamente el nmero a introducir en el programa.
LCD CUSTOM CHARACTER (Caracteres LCD definidos por el usuario) Adems de los caracteres estndar, el microcontrolador tambin puede visualizar los caracteres creados por el programador. Al seleccionar la herramienta LCD custom character, se evitar un pesado trabajo de crear funciones para enviar un cdigo apropiado a un visualizador. Para crear un smbolo, pulse sobre los cuadros pequeos en la ventana LCD custom character, luego seleccione la posicin y la fila y pulse sobre el botn generate. El cdigo apropiado aparece en otra ventana. No es necesita pulsar ms. Copy to Clipboard (copiar al portapapeles) - Paste (pegar)...
GENERADOR DE MAPA DE BITS PARA UN LCD GRFICO El generador de mapa de bits para un LCD grfico es una herramienta insustituible en caso de que el programa que escribe utilice el visualizador LCD (GLCD). Esta herramienta le permite visualizar un mapa de bits con facilidad. Seleccione la opcin Tools/Glcd Bitmap Editor aparecer la ventana apropiada. Para utilizarlo, seleccione el tipo de visualizador a utilizar y cargue un mapa de bits. El mapa de bits debe ser monocromtico y tener la resolucin apropiada del visualizador (128 x 64 pxeles en este ejemplo). El procedimiento a seguir es igual que en el ejemplo anterior: Copy to Clipboard...
Un cdigo generado que utiliza herramientas para controlar los visualizadores LCD y GLCD contiene funciones de la librera Lcd. Si las utiliza en el programa, no se olvide de marcar la caja de chequeo junto a esta librera en la ventana Library Manager. As el compilador ser capaz de reconocer estas funciones correctamente.
LIBRERAS
Uno de los elementos ms importantes del compilador mikroBasic PRO for PIC es Library Manager, que por supuesto merece nuestra atencin. Para que una funcin o un procedimiento realice una cierta tarea al escribir un programa, basta con encontrarla/encontrarlo en una de las libreras incluidas en el compilador y utilizarla. Una librera representa un archivo llamado cabecera. Contiene un conjunto de variables y constantes escritas en mikroBasic. Cada librera tiene un propsito especfico. Por ejemplo, para que un procedimiento genere una seal de audio, abra la librera Sound en la ventana Library Manager y pulse dos veces sobre el procedimiento apropiado Sound_Play. Una descripcin detallada de este procedimiento aparece en la pantalla. Copelo en su programa y ajuste los parmetros apropiados. Al marcar esta librera, sus funciones estarn disponibles y no ser necesario utilizar la librera include.
El mikroBasic PRO for PIC incluye las libreras miscelneas y las libreras para el hardware. LIBRERAS MISCELNEAS Las libreras miscelneas contienen algunas funciones de propsito general: LI BRAR A DESCRI PCI N Button Library Eliminar la influencia del rebote de contacto Conversions Library Rutinas para conversiones de nmeros en cadenas y BCD/decimal C Type Library Probar y convertir los caracteres String Library Automatizar las tareas relacionadas con las cadenas Time Library Rutinas para calcular el tiempo en el formato de tiempo UNIX Trigon Library Funciones trigonomtricas LIBRARIES LIBRERAS PARA EL HARDWARE Las libreras para el hardware incluyen las funciones utilizadas para controlar el funcionamiento de los mdulos hardware: LI BRAR A DESCRI PCI N ADC Library Utilizada para el funcionamiento del convertidor A/D CAN Library Utilizada para las operaciones con el mdulo CAN CANSPI Library Utilizada para las operaciones con el mdulo CAN externo (MCP2515 o MCP2510) Compact Flash Library Utilizada para las operaciones con las tarjetas de memoria Compact Flash EEPROM Library Utilizada para las operaciones con la memoria EEPROM incorporada Ethernet PIC18FxxJ60 Library Utilizada para las operaciones con el mdulo Ethernet incorporado Flash Memory Library Utilizada para las operaciones con la memoria Flash incorporada Graphic Lcd Library Utilizada para las operaciones con el mdulo LCD grfico con resolucin 128x64 IC Library Utilizada para las operaciones con el mdulo de comunicacin serial I 2 C incorporado Keypad Library Utilizada para las operaciones con el teclado (botones de presin 4x4) Lcd Library Utilizada para las operaciones con el LCD (de 2x16 caracteres) Manchester Code Library Utilizada para la comunicacin utilizando el cdigo Manchester Multi Media Card library Utilizada para las operaciones con las tarjetas multimedia MMC flash OneWire Library Utilizada para las operaciones con los circuitos utilizando la comunicacin serial One Wire Port Expander Library Utilizada para las operaciones con el extensor de puertos MCP23S17 PS/2 Library Utilizada para las operaciones con el teclado estndar PS/2 PWM Library Utilizada para las operaciones con el mdulo PWM incorporado RS-485 Library Utilizada para las operaciones con los mdulos utilizando la comunicacin serial RS485 Software IC Library Utilizada para simular la comunicacin I 2 C con software Software SPI Library Utilizada para simular la comunicacin SPI con software Software UART Library Utilizada para simular la comunicacin UART con software Sound Library Utilizada para generar las seales de audio SPI Library Utilizada para las operaciones con el mdulo SPI incorporado SPI Ethernet Library Utilizada para la comunicacin SPI con el mdulo ETHERNET (ENC28J60) SPI Graphic Lcd Library Utilizada para la comunicacin SPI de 4 bits con el LCD grfico SPI Lcd Library Utilizada para la comunicacin SPI de 4 bits con el LCD (de 2x16 caracteres) SPI Lcd8 Library Utilizada para la comunicacin SPI de 8 bits con el LCD SPI T6963C Graphic Lcd Library Utilizada para la comunicacin SPI con el LCD grfico UART Library Utilizada para las operaciones con el mdulo UART incorporado USB HID Library Utilizada para las operaciones con el mdulo USB incorporado
Captulo 4: Ejemplos El propsito de este captulo es de proporcionar la informacin bsica que necesita saber para ser capaz de utilizar microcontroladores con xito en la prctica. Por eso, este captulo no contiene ningn programa muy elaborado, tampoco dispone de un esquema de dispositivo con soluciones extraordinarias. Por el contrario, los siguientes ejemplos son la mejor prueba de que escribir un programa no es un privilegio ni cosa de talento, sino una habilidad de poner las piezas juntas del rompecabezas al utilizar directivas. Tenga la seguridad de que el diseo y el desarrollo de los dispositivos generalmente siguen al mtodo probar- corregir-repetir. Por supuesto, cunto ms ahonde sobre el tema, ms se complica, ya que tanto los nios como los arquitectos de primera lnea, ponen las piezas juntas del rompecabezas. 4.1 CONEXIN BSICA 4.2 COMPONENTES ADICIONALES 4.3 EJEMPLO 1 - Escribir cabecera, configurar pines de E/S, utilizar la funcin Delay 4.4 EJEMPLO 2 - Utilizar instrucciones en ensamblador y el oscilador interno LFINTOSC... 4.5 EJEMPLO 3 - Timer0 como un contador, declarar variables nuevas, utilizar smbolos, utilizar rels... 4.6 EJEMPLO 4 - Utilizar los temporizadores Timer0, Timer1 y Timer2. Utilizar interrupciones, declarar nuevos procedimientos... 4.7 EJEMPLO 5 - Utilizar el temporizador perro - guardin 4.8 EJEMPLO 6 - Mdulo CCP1 como generador de seal PWM 4.9 EJEMPLO 7 - Utilizar el convertidor A/D 4.10 EJEMPLO 8 - Utilizar memoria EEPROM 4.11 EJEMPLO 9 - Contador de cuatro dgitos LED, multiplexin 4.12 EJEMPLO 10 - Utilizar el visualizador LCD 4.13 EJEMPLO 11 - Comunicacin serial RS232 4.14 EJEMPLO 12 - Medicin de temperatura por medio del sensor DS1820. Uso del protocolo 1-wire... 4.15 EJEMPLO 13 - Generacin de sonido, librera de sonido... 4.16 EJEMPLO 14 - Utilizar el visualizador LCD grfico 4.17 EJEMPLO 15 - Utilizar el panel tctil... 4.18 EJEMPLO 16 - Utilizar el teclado 4x4 4.1 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 las mquinas caras 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 DC. Este circuito, mostrado en la pgina anterior, utiliza un regulador de voltaje positivo de tres terminales LM7805. Es un regulador integrado y barato que proporciona una estabilidad de voltaje 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, el pin MCLR se lleva un voltaje de 0V, el microcontrolador se reinicia y la ejecucin de programa comienza desde el principio. Una resistencia de 10k se utiliza 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 estabilizan su funcionamiento y determinan 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 - Crystal / Resonator; HS - Cristal/Resonador de alta velocidad; y RC - Resistencia / Condensador.
Por qu son estos modos importantes? 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. Vea la figura de la izquierda. 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.
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 C1 y C2 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 de reloj del microcontrolador, 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.
4.2 COMPONENTES ADICIONALES 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. 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 los 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...Es por un 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. El rebote ocurre demasiado rpido, asi que no es posible percibirlo al utilizar estos componentes en la vida cotidiana. Sin embargo, pueden surgir problemas en algunos circuitos analgicos y 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 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.
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. RELS
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. La figura que sigue muestra la solucin utilizada con ms frecuencia en caso de conectar un rel a los dispositivos alimentados por la red elctrica.
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 LEDs 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! 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 intensiva, 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 de voltaje de alimentacin, los efectos pueden ser espectaculares.
VISUALIZADOR LED
Bsicamente, un visualizador LED no es nada ms que varios diodos LED moldeados en la misma caja plstica. Hay varios tipos de los visualizadores y algunos de ellos estn compuestos por varias docenas de diodos incorporados que pueden visualizar diferentes smbolos. No obstante, el visualizador utilizado con ms frecuencia es el visualizador de 7 segmentos. Est compuesto por 8 LEDs. 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 visualizadores de nodo comn y visualizadores de ctodo comn, respectivamente. Los segmentos estn etiquetados con letras de a a 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 le presentamos unas cosas importantes a las que debe prestar atencin al comprar un visualizador LED: Como hemos mencionado, dependiendo de si nodos o ctodos estn conecta dos al pin comn, tenemos visualizadores de nodo comn y visualizadores de ctodo comn. Visto de afuera, parece que no hay ninguna diferencia entre estos visualizadores, pues se le recomienda comprobar cul se va a utilizar antes de instalarlo. 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 LEDs de Bajo consumo que utilizan solamente 2mA para su funcionamiento. Los segmentos del visualizador estn normalmente etiquetados con letras de a a g, pero no hay ninguna regla estricta a cules pines del visualizador estarn conectados. Por eso es muy importante comprobarlo antes de empezar a escribir un programa o disear un dispositivo.
Los visualizadores LED 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 es denominada multiplexin. Aqu es cmo se ha hecho una ilusin ptica basada en el mismo principio de funcionamiento como 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 di-seada 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 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 de estos dgitos se debe almacenar en los bytes particulares. Los dgitos se hacen reconocibles al realizar enmascaramiento. En otras pa-labras, 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 etc, entonces la tabla que sigue muestra la mscara para cada dgito.
D GI TOS A VI SUALI ZAR SEGMENTOS DEL VI SUAL I ZADOR
dp a b c d e f g 0 0 1 1 1 1 1 1 0 1 0 0 1 1 0 0 0 0 2 0 1 1 0 1 1 0 1 3 0 1 1 1 1 0 0 1 4 0 0 1 1 0 0 1 1 5 0 1 0 1 1 0 1 1 6 0 1 0 1 1 1 1 1 7 0 1 1 1 0 0 0 0 8 0 1 1 1 1 1 1 1 9 0 1 1 1 1 0 1 1 Adems de los dgitos de 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 visualizadores 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. 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 alto voltaje 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 R/C 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. VISUALIZADOR 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 de 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 etc.
Pines del visualizador LCD A lo largo de un lado de una placa impresa pequea del visualizador 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: FUNCI N NMERO NOMBRE ESTADO LGI CO DESCRI PCI N Tierra 1 Vss - 0V Alimentacin 2 Vdd - +5V Contraste 3 Vee - 0 - Vdd Control de 4 RS 0 D0 D7 considerados como comandos funcionamiento 1 D0 D7 considerados como datos 5 R/W 0 1 Escribir los datos (del microcontrolador al LCD) Leer los daots (del LCD al microcontrolador) 6 E Transicin de 1 a 0 Acceso al visualizador LCd deshabilitado Funcionamiento normal Datos/comandos se estn transmitiendo al LCD Datos / comandos 7 D0 0/1 Bit 0 LSB 8 D1 0/1 Bit 1 9 D2 0/1 Bit 2 10 D3 0/1 Bit 3 11 D4 0/1 Bit 4 12 D5 0/1 Bit 5 13 D6 0/1 Bit 6 14 D7 0/1 Bit 7 MSB Pantalla LCD Una pantalla LCD puede visualizar dos lneas con 16 caracteres cada una. Cada carcter consiste en 5x8 o 5x11 pxeles. Este libro cubre un visualizador de 5x8 pxeles que es utilizado con ms frecuencia.
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 visualizadores LCD 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 visualizador 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 almacenar 80 caracteres. Algunas localidades de memoria estn directamente conectadas a los caracteres en el visualizador.
El principio de funcionamiento de la memoria DDRAM muy simple: basta con configurar el visualizador 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.
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.
Como sugiere su nombre, la memoria DDRAM 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:
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 a 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 pe-rifrico, 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 deno-minada CGRAM de 64 bytes lo habilita.
Los registros de memoria son de 8 bits de anchura, pero slo se utilizan 5 bits ms bajos. Un uno lgico (1) en cada registro representa un punto oscurecido, mientras que 8 localidades agrupados representan un carcter. Esto se muestra en la siguiente figura:
Los smbolos estn normalmente definidos al principio del programa por una simple escri-tura de ceros y unos de la memoria CGRAM as que 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 visualizador 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. En la siguiente tabla se muestra una lista de comandos relacionados con la operacin del LCD: COMANDO RS RW D7 D6 D5 D4 D3 D2 D1 D0 TI EMPO DE EJ ECUCI N Borrar el visualizador 0 0 0 0 0 0 0 0 0 1 1.64mS Poner el cursor al inicio 0 0 0 0 0 0 0 0 1 x 1.64mS Modo de entrada 0 0 0 0 0 0 0 1 I/D S 40uS Activar/desactivar el visualizador 0 0 0 0 0 0 1 D U B 40uS Desplazar el cursor/visualizador 0 0 0 0 0 1 D/C R/L x x 40uS Modo de funcionamiento 0 0 0 0 1 DL N F x x 40uS Establecer la direccin CGRAM 0 0 0 1 Direccin CGRAM 40uS Establecer la direccin DDRAM 0 0 1 Direccin DDRAM 40uS Leer la bandera BUSY(ocupado)(BF) 0 1 BF Direccin DDRAM - Escribir en la CGRAM o en la DDRAM 1 0 D7 D6 D5 D4 D3 D2 D1 D0 40uS Leer la CGRAM o la DDRAM 1 1 D7 D6 D5 D4 D3 D2 D1 D0
I/D 1 = Incremento (por 1) R/L 1 = Desplazamiento a la derecha 0 = Decremento (por 1) 0 = Desplazamiento a la izquierda
S 1 = Desplazamiento del visualizador activado DL 1 = Bus de datos de 8 bits 0 = Desplazamiento del visualizador desactivado 0 = Bus de datos de 4 bits
D 1 = Visualizador encendido N 1 = Visualizar en dos lneas 0 = Visualizador encendido 0 = Visualizar en una lnea
U 1 = Cursor activado F 1 = Carcter de 5x10 puntos 0 = Cursor desactivado 0 = Carcter de 5x7 puntos
B 1 = Parpadeo del cursor encendido D/C 1 = Desplazamiento del visualizador 0 = Parpadeo del cursor apagado 0 = Desplazamiento del cursor 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 visualizador 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 el 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 en la pgina anterior.
El propsito principal del modo de LCD de 4 bits es de 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.
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 visualizador. 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 el visualizador LCD Al encender la fuente de alimentacin, el LCD se reinicia automticamente. Esto dura aproximadamente 15mS. Despus de eso, el LCD est listo para funcionar. Asimismo, el modo de funcionamiento est configurado por defecto de la siguiente manera: 1. Visualizador est borrado 2. Modo DL = 1 - Bus de datos de 8 bits N = 0 - Datos se visualizan en una lnea F = 0 - Formato fuente de caracteres es 5 x 8 pxeles 3. Visualizador/Cursor encendido/apagado D = 0 - Visualizador apagado U = 0 - Cursor apagado B = 0 - Parpadeo del cursor apagado 4. Introduccin de caracteres ID = 1 Direcciones visualizadas se incrementan automticamente en 1 S = 0 Desplazamiento del visualizador desactivado Por lo general, el reinicio automtico se lleva a cabo sin problemas. En la mayora de los casos, pero no siempre! Si por cualquier razn, el voltaje de alimentacin no llega a su m-ximo valor en 10mS, el visualizador se pone a funcionar de manera completamente imprevisible. Si la unidad de voltaje no es capaz de cumplir con las condiciones o si es necesario proporcionar un funcionamiento seguro, se aplicar el proceso de inicializacin. La inicializacin, entre otras cosas, reinicia de nuevo al LCD, al habilitarle un funcionamiento normal.
Hay dos algoritmos de inicializacin. Cul se utilizar depende de si la conexin al microcontrolador se realiza por el bus de datos de 4 o 8 bits. En ambos casos, despus de inicializacin slo queda especificar los comandos bsicos y despus, ser posible enviar los mensajes al visualizador LCD. Refirase a la Figura que sigue para el procedimiento de inicializacin por el bus de datos de 8 bits:
Esto no es un error! En este algoritmo el mismo valor se enva sucesivamente tres veces al visualizador LCD enva sucesivamente. El procedimiento de inicializacin por el bus de datos de 4 bits:
Vamos a hacerlo en mikroBasic... ' En mikroBasic for PIC, basta con escribir slo una funcin para realizar todo el ' proceso de la inicializacin del LCD. Antes de llamar esta funcin es necesario ' delarar los bits LCD_D4-LCD_D7, LCD_RS y LCD_EN.
... sub procedure Lcd_Init ' Inicializar el LCD
... EJEMPLOS PRCTICOS
El proceso de crear un proyecto nuevo es muy simple. Seleccione la opcin New Project del men Project como se muestra en la Figura de la derecha.
Aparecer una ventana que le guiar a travs del proceso de creacin de un proyecto nuevo. La ventana de entrada de este programa contiene una lista de acciones a realizar para crear un proyecto nuevo. Pulse el botn Next. El proceso de creacin de un proyecto nuevo consiste en cinco pasos: 1. Seleccione el tipo de microcontrolador a programar. En este caso se trata del PIC16F887. 2. Seleccione la frecuencia de reloj del microcontrolador. En este caso el valor seleccionado es 8 MHz. 3. Seleccione el nombre y la ruta del proyecto. En este caso, el nombre del proyecto es First_Project. Est guardado en la carpeta C:\My projects. Al nombre del proyecto se le asigna automticamente la extensin .mbppi. Se crear en el proyecto el archivo fuente con el mismo nombre (First_Project .mbas). 4. Si el nuevo proyecto consiste de varios archivos fuente, se necesita especificarlos y pulse sobre el botn Add para incluirlos. En este ejemplo no hay archivos fuente adicionales. 5. Por ltimo, se necesita confirmar todas las opciones seleccionadas. Pulse sobre Finish. Despus de crear el proyecto, aparecer una ventana blanca en la que debe escribir el programa. Vea la siguiente figura:
Una vez creado el programa, es necesario compilarlo en un cdigo .hex. Seleccione una de las opciones para compilar del men Project: Para crear un archivo .hex, seleccione la opcin Build (Ctrl+F9) del men Project o pulse sobre el icono Build de la barra de herramientas Project. Por medio de la opcin Build All Projects (Shift+F9) se compilan todos los archivos del proyecto, libreras (si el cdigo fuente contiene alguna de ellas) y los archivos def para el microcontrolador utilizado. La opcin Build + Program (Ctrl+F11) es importante ya que permite al compilador mikroBasic PRO for PIC cargar automticamente el programa en el microcontrolador despus de la compilacin. El proceso de la programacin se realiza por medio del programador PICFlash. Todos los errores encontrados durante la compilacin aparecern en la ventana Messages. Si no hay errores en el programa, el compilador mikroBasic PRO for PIC generar los correspondientes archivos de salida. 4.3 EJEMPLO 1 Escribir cabecera, configurar pines de E/S, utilizar la funcin Delay El nico propsito de este programa es de encender varios diodos LED en el puerto PORTB. Utilice este ejemplo para examinar cmo es un programa real. La siguiente figura muestra el esquema de conexin, mientras que el programa se encuentra en la siguiente pgina.
Al encender la fuente de alimentacin, cada segundo, el diodo LED en el puerto PORTB emite luz, 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 este libro. 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.
Para hacer este ejemplo ms interesante, vamos a habilitar que los LEDs conectados al puerto PORTB parpadeen. Hay varios modos de hacerlo: 1. Tan pronto como se encienda el microcontrolador, todos los LEDs emitirn la luz por un segundo. La funcin Delay se encarga de eso en el programa. Slo se necesita ajustar la duracin del tiempo de retardo en milisegundos. 2. Despus de un segundo, el programa entra en el bucle for, y se queda all hasta que la variable k sea menor que 20. La variable se incrementa en 1 despus de cada iteracin. Dentro del bucle for, el ciclo de trabajo es 5:1 (500mS:100mS). Cualquier cambio de estos estados lgicos hace todos los LEDs parpadear. 3. Al salir del bucle for, el estado lgico del puerto POTRB cambia (0xb 01010101) y el programa entra en el bucle infinito while y se queda all hasta que 1=1 (bucle infinito). El estado lgico del puerto PORTB se invierte cada 200mS.
4.4 EJEMPLO 2 Utilizar instrucciones en ensamblador y el oscilador interno LFINTOSC... En realidad, esto es una continuacin del ejemplo anterior, pero se ocupa de un problema un poco ms complicado... El propsito es hacer los LEDs en el puerto PORTB parpadear lentamente. Se puede realizar al introducir un valor suficiente grande para el parmetro del tiempo de retardo en la funcin Delay. No obstante, hay otra manera ms eficiente para ejecutar el programa lentamente. Acurdese de 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 da cada iteracin, llega el tiempo de retardo de 100ms, indicado por un parpadeo relativamente rpido de los LEDs en el puerto PORTB. 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 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 Basic, los bits de control RP0 y RP1 deben recuperar el estado que tenan antes de introducir la secuencia en ensamblador. En este caso se utiliza la variable auxiliar saveBank para guardar el estado de estos dos bits. 'Cabecera ********************************************* program example_2 ' Nombre de programa dim k as byte ' Variable k es de tipo byte dim saveBank as byte ' Variable saveBank es de tipo byte main: ' Inicio del programa k = 0 ' Valor inicial de la variable k ANSEL = 0 ' Todos los pines de E/S se configuran como digitales ANSELH = 0 PORTB = 0 ' Todos los pines del puerto PORTB se ponen a 0 TRISB = 0 ' Pines del puerto PORTB se configuran como salidas
do PORTB = not PORTB ' Invertir el estado lgico del puerto PORTB Delay_ms(100) ' Tiempo de retardo de 100mS k = k+1 ' Incrementar k en 1 loop until k=20 ' Quedarse en bucle hasta que k<20
k=0 ' Reiniciar variable k saveBank = STATUS and %01100000 ' Guardar el estado de los bits RP0 y RP1 ' (bits 5 y 6 del registro STATUS) asm ' Inicio de una secuencia en ensamblador bsf STATUS,RP0 ' Seleccionar el banco de memoria que contiene el bcf STATUS,RP1 ' registro OSCCON bcf OSCCON,6 ' Seleccionar el oscilador interno LFINTOSC bcf OSCCON,5 ' de frecuencia de 31KHz bcf OSCCON,4 bsf OSCCON,0 ' Microcontrolador utiliza oscilador interno end asm ' Final de la secuencia en ensamblador
STATUS = STATUS and %10011111 ' Bits RP0 y RP1 recuperan el estado original STATUS = STATUS or saveBank
do PORTB = not PORTB ' Invertir el estado lgico del puerto PORTB Delay_ms(10) ' Tiempo de retardo de 10 mS k = k+1 ' Incrementar k en 1 loop until k=20 ' Quedarse en el bucle hasta que k<20
stay_here: goto stay_here ' Bucle infinito
end. ' Final de programa Usted ha notado que la seal de reloj ha sido cambiado al vuelo. Para asegurarse de eso, quite el cristal de cuarzo antes de encender al microcontrolador. El microcontrolador no podr empezar a funcionar porque la Palabra de Configuracin cargada en el programa requiere proporcionar el cristal de cuarzo. Al quitar el cristal ms tarde durante el funcionamiento, no pasar nada, o sea, eso no afectar nada al microcontrolador. 4.5 EJEMPLO 3 Timer0 como un contador, declarar variables nuevas, utilizar smbolos, utilizar rels... 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. En la siguiente figura se muestra un esquema, mientras que el programa est en la siguiente pgina. Todo sigue siendo muy simple. El temporizador TMR0 se utiliza como un contador. La entrada del contador est conectada a un botn de presin, 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 uno 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. En este ejemplo, el registro TEST almacena el nmero 5. Por supuesto, eso puede ser cualquier nmero obtenido al calcular o definido como una constante. Adems, el microcontrolador puede activar algn otro dispositivo en vez de rel, mientras que el sensor se puede utilizar en vez del botn de presin. Este ejemplo muestra una de las aplicaciones ms comunes del microcontrolador en la industria; al realizar una cosa el suficiente nmero de veces, otra cosa debe estar encendida o apagada.
' Cabecera ****************************************************** program example_3 ' Nombre del programa symbol RELAY = PORTD.3 ' Pin del puerto PORTD.3 es denominado REL dim TEST as byte ' Variable TEST es de tipo byte main: ' Inicio del programa TEST = 5 ' Constante TEST = 5 ANSEL = 0 ' All I/O pins are configured as digital ANSELH = 0 PORTA = 0 ' Reiniciar el puerto PORTA TRISA = 0xFF ' Todos los pines de E/S se configuran como digitales PORTD = 0 ' Reiniciar el puerto PORTD TRISD = %11110111 ' Pin RD3 se configura como una salida, mientras que los ' dems se configuran como entradas OPTION_REG.5 = 1 ' Contador TMR0 recibe los pulsos por el pin RA4 OPTION_REG.3 = 1 ' Valor del pre-escalador es 1:1 TMR0 = 0 ' Reiniciar el temporizador/contador TMR0
while 1 if TMR0 = TEST then ' Coincide el nmero en el temporizador con la constante TEST? RELAY = 1 ' Nmeros coinciden. Poner el bit RD3 a uno (salida REL) end if wend ' Quedarse en el bucle infinito
end. ' Final de programa Slo un smbolo (REL) se utiliza aqu. Se le asigna el tercer pin del puerto PORTD en la declaracin. symbol RELAY = PORTD.3 ' Smbolo REL = PORTD.3 4.6 EJEMPLO 4 Utilizar los temporizadores Timer0, Timer1 y Timer2. Utilizar interrupciones, declarar nuevos procedimientos... Al analizar los ejemplos anteriores, es probable que se haya fijado en 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. Se acuerda usted del captulo de los temporizadores? Se acuerda de lo de interrupciones? Este ejemplo los conecta de una manera prctica. El esquema se queda inalterada, y el desafo sigue siendo presente. Es necesario proporcionar un tiempo de retardo suficiente largo para darse cuenta de los cambios en el puerto. Para este propsito se utiliza el temporizador TMR0 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 50, el puerto PORTB se incrementa en 1. Todo el procedimiento se lleva a cabo entre bastidores, lo que habilita al microcontrolador hacer otra tarea.
' Cabecera****************************************************** program example_4a ' Inicio del programa dim cnt as byte ' Definir la variable cnt como un byte
sub procedure interrupt ' Este subprocedimiento determina qu se lo que se ' debe hacer cuando se genere una interrupcin cnt = cnt + 1 ' Interrupcin causa que la cnt se incremente 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 end sub ' Final de la rutina de interrupcin
main: ' Inicio del programa 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
while 1 ' Bucle infinito if cnt = 50 then ' Incrementar el puerto PORTB despus 50 interrupciones PORTB = PORTB + 1 ' Incrementar nmero en el puerto PORTB en 1 cnt = 0 ' Reiniciar la variable cnt end if wend
end. ' Final de programa
Siempre que se produzca un desbordamiento en el registro del temporizador TRM0, ocurre una interrupcin. 'Cabecera****************************************************** program example_4b ' Nombre del programa dim cnt as byte ' Definir la variable cnt
sub procedure interrupt ' Definir el subprocedimiento de interrupcin cnt = cnt+1 ' Interrupcin causa que la cnt se incremente 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 end sub ' Final de la rutina de interrupcin
main: ' Inicio del programa ANSEL = 0 ' Todos los pines de E/S se configuran como digitales ANSELH = 0 PORTB = 0xF0 ' Valor inicial de los bits del puerto PORTB TRISB = 0 ' Los pines del puerto PORTB se configuran como salidas T1CON = 1 ' Configurar el temporizador TMR1 PIR1.TMR1IF = 0 ' Reiniciar el bit TMR1IF TMR1H = 0x80 ' Poner el valor inicial para el 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)
while 1 ' Bucle infinito if cnt = 76 then ' Cambiar el estado del puerto PORTB despus de 76 interrupciones PORTB = not PORTB ' Nmero en el puerto PORTB est invertido cnt = 0 ' Reiniciar la variable cnt end if wend
end. ' Final de programa
En este caso, una interrupcin se habilita despus de que se produzca un desbordamiento en el registro del temporizador TMR1 (TMR1H, TMR1L). Adems, la combinacin de los bits que vara en el puerto POTRB difiere de la en el ejemplo anterior. 'Cabecera****************************************************** program example_4c ' Nombre del programa dim cnt as byte ' Definir la variable cnt como un byte
sub procedure Replace ' Definir el procedimiento Reemplazar PORTB = not PORTB ' Definir el nuevo procedimiento Reemplazar end sub ' Procedimiento invierte el estado del puerto
sub procedure interrupt ' Definir el subprocedimiento de interrupcin if PIR1.TMR2IF then ' Si el bit TMR2IF = 1, cnt = cnt +1 ' Incrementar variable la cnt en 1 PIR1.TMR2IF = 0 ' Reiniciar el bit y TMR2 = 0 ' Reiniciar el registro TMR2 end if end sub ' Final de la rutina de interrupcin
main: ' Inicio del programa cnt = 0 ' Reiniciar la variable cnt ANSEL = 0 ' Todos los pines de E/S se configuran como digitales ANSELH = 0 PORTB = %10101010 ' Estado lgico en los pines del puerto PORTB TRISB = 0 ' Todos los pines del puerto PORTB se configuran como salidas 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 then ' Cambiar el estado del puerto PORTB despus de ms de 30 interrupciones Replace ' Subprocedimiento Reemplazar invierte el estado del puerto PORTB cnt = 0 ' Reset variable cnt end if wend
end. ' Final de programa
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 el procedimiento Reemplazar, que normalmente no pertenece al lenguaje mikroBasic. 4.7 EJEMPLO 5 Utilizar el temporizador perro - guardin 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 LEDs del puerto PORTB.
'Cabecera ****************************************************** program example_5 ' Nombre de programa main: ' Inicio del programa OPTION_REG = 0x0E ' Pre-escalador se le asigna al temporizador WDT (1:64) asm CLRWDT ' Comando en ensamblador para reiniciar el temporizador WDT end asm PORTB = 0x0F ' Valor inicial del registro PORTB TRISB = 0 ' Todos los pines del puerto PORTB se configuran como salidas 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 wend ' temporizador WDT reinicie al microcontrolador end. ' Final de programa Para que este ejemplo funcione apropiadamente, es necesario habilitar al temporizador perro-guardin al seleccionar la opcin Tools/mE Programmer/Watchdog Timer - Enabled.
4.8 EJEMPLO 6 Mdulo CCP1 como generador de seal PWM 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: sub procedure PWM1_Init(const freq as longint) 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: sub procedure PWM1_Start() 3. PWM1_Set_Duty tiene el prototipo: sub procedure PWM1_Set_Duty(dim duty_ratio as byte) 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: sub procedurePWM1_Stop()
' Cabecera ****************************************************** program example_6 ' Nombre de programa dim current_duty, old_duty, oldstate as byte ' Definir las variables current_duty ' old_duty y oldstate main: ' Inicio del programa ANSEL = 0 ' Todos los pines de E/S se confguran como digitales ANSELH = 0 PORTA = 255 ' Estado inicial del puerto PORTA TRISA = 255 ' Todos los pines del puerto PORTA se configuran como entradas PORTB = 0 ' Estado inicial del puerto PORTB TRISB = 0 ' Todos los pines del puerto PORTB se configuran como salidas PORTC = 0 ' Estado inicial del puerto PORTC TRISC = 0 ' Todos los pines del puerto PORTC se configuran como salidas PWM1_Init(5000) ' Inicializacin del mdulo PWM (5 KHz) current_duty = 16 ' Valor inicial de la variable current_duty old_duty = 0 ' Reiniciar la variable old_duty PWM1_Start() ' Inicializacin del mdulo PWM1
while 1 ' Bucle infinito if oldstate and Button(PORTA, 0,1,1) then ' Si se presiona el botn conectado al RA0 current_duty = current_duty + 1 ' incrementar el valor de la variable current_duty if Button(PORTA, 0, 1, 1) then oldstate = 255 end if end if
if oldstate and Button(PORTA, 1,1,1) then ' Si se presiona el botn conectado al RA1 current_duty = current_duty - 1 ' decrementar el valor de la variable current_duty if Button(PORTA, 1, 1, 1) then oldstate = 255 end if end if
if old_duty <> current_duty then ' Si current_duty y old_duty no son iguales PWM1_Set_Duty(current_duty) ' ajustar un nuevo valor a PWM, old_duty = current_duty ' guardar el nuevo valor PORTB = old_duty ' y visualizarlo en el puerto PORTB end if
Delay_ms(200) ' Tiempo de retardo 200mS wend
end. ' Final de programa Para que este ejemplo funcione apropiadamente, es necesario marcar las siguientes libreras en la ventana Library Manager antes de compilar el programa: PWM Button
4.9 EJEMPLO 7 Utilizar el convertidor A/D 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 POTRB y PORTD (8 bits menos significativos en el puerto PORTD y 2 bits ms significativos en el puerto PORTB). La Tierra (GND) se utiliza como voltaje de referencia bajo Vref-, mientras que VCC se utiliza como voltaje de referencia positivo. Si se utiliza el voltaje variable como Vref+ (refirase a la lnea punteada), se habilita estirar y encojer la escala de medicin.
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. Cunto menor sea la diferencia entre Vref+ y Vref-, tanto menor ser la diferencia entre dos de 1024 niveles. Como hemos visto, el convertidor A/D es capaz de detectar pequeos cambios de voltaje. 'Cabecera****************************************************** program example_7 ' Nombre de programa dim temp_res as word ' Variable temp_res es de tipo word main: ' Inicio del programa ANSEL = 0x0C ' Pin AN2 se configura como analgico 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.B4 = 0 ' Voltaje de referencia positivo es VCC.
while 1 ' Bucle infinito 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 wend
end. ' Final de programa Para que este ejemplo funcione apropiadamente, es necesario marcar la librera ADC en la ventana Library Manager antes de compilar el programa: ADC
4.10 EJEMPLO 8 Utilizar memoria EEPROM 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. 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 en la direccin 5, directamente ledo y visualizado en el puerto PORTD en forma binaria.
'Cabecera****************************************************** program example_8 ' Nombre de programa main: ' Inicio del programa ANSEL = 0 ' Todos los pines de E/S se configuran como digitales ANSELH = 0 PORTB = 0 ' Valor inicial del puerto PORTB TRISB = 0 ' Todos los pines del puerto PORTB se configuran como salidas PORTD = 0 ' Valor inicial del puerto PORTB TRISD = 0 ' Todos los pines del puerto PORTD se configuran como salidas TRISA = 0xFF ' Todos los pines del puerto PORTA se configuran como entradas PORTD = EEPROM_Read(5) ' Leer la memoria EEPROM en la direccin 5
while 1 ' Bucle infinito PORTB = PORTB + 1 ' Incrementar el puerto PORTB en 1 Delay_ms(100) ' Tiempo de retardo de 100mS while not PORTA.B2 ' Quedar en este bucle hasta que el botn est pulsado if not PORTA.B2 then EEPROM_Write(5,PORTB) ' Si se pulsa el botn MEMO, guardar el puerto PORTB PORTD = EEPROM_Read(5) ' Leer el dato escrito end if wend wend
end. ' Final de programa Para que este ejemplo funcione apropiadamente, es necesario marcar la librera EEPROM en la ventana Library Manager antes de compilar el programa: EEPROM Para comprobar el funcionamiento de este programa, basta con pulsar el botn MEMO y apagar el microcontrolador. Despus de reiniciar el dispositivo, el programa visualizar en el puerto PORTD el valor guardado en la memoria EEPROM en la direccin 5. Acurdese de que en el momento de escribir, el valor fue visualizado en el puerto PORTB . 4.11 EJEMPLO 9 Contador de cuatro dgitos LED, multiplexin En este ejemplo el microcontrolador funciona como un contador de dos dgitos. La variable i se incrementa (suficiente lentamente para ser visible) y su valor se visualiza en un visualizador de cuatro dgitos LED (9999-0). El punto es habilitar una conversin de un nmero binario en un decimal y partirlo en cuatro dgitos (en miles, centenas, 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.
'Cabecera****************************************************** program example_9 ' Nombre de programa dim shifter, portd_index as byte ' Variables shifter y portd_index son de tipo byte digit, number as word ' Variables digit y number son de tipo word portd_array as word[4] ' Matriz portd_array tiene 4 miembros de tipo word sub function mask (dim num as Word) as Word ' Subrutina para enmascarar select case num ' utilizada para convertir case 0 result = $3F ' nmeros binarios en la case 1 result = $06 ' combinacin de bits apropiada case 2 result = $5B ' que se visualizar en el LED case 3 result = $4F case 4 result = $66 case 5 result = $6D case 6 result = $7D case 7 result = $07 case 8 result = $7F case 9 result = $6F end select ' Final de la sentencia Case end sub ' Final de la subrutina
sub procedure interrupt ' Inicio de la rutina de interrupcin PORTA = 0 ' Apagar todos los visualizadores de 7 segmentos PORTD = portd_array [portd_index] ' Enviar el valor apropiado al puerto PORTD PORTA = shifter ' Encender el visualizador apropiado de 7 segmentos shifter = shifter << 1 ' Mover shifter al siguiente dgito
if (shifter > 8) then shifter = 1 end if
Inc(portd_index) ' Incrementar portd_index
if (portd_index > 3) then portd_index = 0 ' Encender el primero, apagar el cuarto visualizador de 7 segmentos end if
TMR0 = 0 ' Reiniciar el valor del TIMER0 T0IF_bit = 0 ' Borrar la bandera de interrupcin del Timer0 end sub ' Final de la rutina de interrupcin
main: ' Inicio del programa ANSEL = 0 ' Configurar los pines analgicos como pines de E/S digitales ANSELH = 0 OPTION_REG = $80 ' Configuracin del Timer0 (Timer0 funciona como temporizador ' con el pre-escalador) digit = 0 ' Valor inicial de la variable digit portd_index = 0 ' Encender el primer visualizador LED shifter = 1 ' Valor inicial de la variable shifter TMR0 = 0 ' Borrar el Timer0 INTCON = $A0 ' Habilitar interrupcin con los bits GIE y T0IE PORTA = 0 ' Borrar el PORTA TRISA = 0 ' Configurar el PORTA como salida PORTD = 0 ' Borrar el PORTD TRISD = 0 ' Configurar el PORTD como salida number = 6789 ' Un valor inicial en el visualizador LED
while TRUE ' Bucle infinito digit = number / 1000 ' Extraer miles portd_array[3] = mask(digit) ' y almacenarlo en la matriz PORTD digit = (number / 100) mod 10 ' Extraer centenas portd_array[2] = mask(digit) ' y almacenarlo en la matriz PORTD digit = (number / 10) mod 10 ' Extraer decenas portd_array[1] = mask(digit) ' y almacenarlo en la matriz PORTD digit = number mod 10 ' Extraer unidades portd_array[0] = mask(digit) ' y almacenarlo en la matriz PORTD
Delay_ms(1000) ' Retardo de un segundo Inc(number) ' Incrementar nmero
if (number > 9999) then ' Empezar a contar de cero number = 0 end if wend
end. ' Final de programa 4.12 EJEMPLO 10 Utilizar el visualizador LCD Este ejemplo muestra cmo utilizar un visualizador LCD alfanumrico. Las libreras de funciones simplifican este programa.
Dos mensajes escritos en dos lneas aparece en el visualizador: mikroElektronika LCD example Dos segundos ms tarde, el segundo mensaje se susituye por el voltaje presente en la entrada del convertidor A/D (el pin RA2). Por ejemplo: mikroElektronika voltage:3.141V En un dispositivo real se puede visualizar temperatura actual o algn otro valor medido en vez de voltaje.
Para que este ejemplo funcione apropiadamente, es necesario marcar las siguientes libreras en la ventana Library Manager antes de compilar el programa: ADC LCD 'Cabecera****************************************************** program example_10 ' Nombre de programa
dim LCD_RS as sbit at RB4_bit ' Conexiones del mdulo Lcd LCD_EN as sbit at RB5_bit LCD_D4 as sbit at RB0_bit LCD_D5 as sbit at RB1_bit LCD_D6 as sbit at RB2_bit LCD_D7 as sbit at RB3_bit LCD_RS_Direction as sbit at TRISB4_bit LCD_EN_Direction as sbit at TRISB5_bit LCD_D4_Direction as sbit at TRISB0_bit LCD_D5_Direction as sbit at TRISB1_bit LCD_D6_Direction as sbit at TRISB2_bit LCD_D7_Direction as sbit at TRISB3_bit ' Final de las conexiones del mdulo Lcd dim text as string [16] ' Variable text es de tipo string dim ch, adc_rd as word ' Variables ch y adc_rd son de tipo word dim tlong as longword ' Variable tlong es de tipo longword main: ' Inicio del programa TRISB = 0 ' Todos los pines del puerto PORTB se configuran como salidas PORTB = 0xFF INTCON = 0 ' Todas las interrupciones deshabilitadas ANSEL = 0x04 ' Pin RA2 se configura como una entrada analgica TRISA = 0x04 ANSELH = 0 ' Los dems pines se configuran como digitales Lcd_Init() ' Inicializacin del visualizador LCD Lcd_Cmd(_LCD_CURSOR_OFF) ' Comando LCD (apagar el cursor) Lcd_Cmd(_LCD_CLEAR) ' Comando LCD (borrar el LCD)
text = "mikroElektronika" ' Definir el primer mensaje Lcd_Out(1,1,text) ' Escribir el primer mensaje en la primera lnea text = "LCD example" ' Definir el segundo mensaje Lcd_Out(2,1,text) ' Definir el segundo mensaje en la segunda lnea ADCON1 = 0x80 ' Voltaje de referencia para la conversin A/D es VCC TRISA = 0xFF ' Todos los pines del puerto PORTA se configuran como entradas Delay_ms(2000) text = "Voltage=" ' Definir el tercer mensaje
while 1 ' Bucle infinito 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 = adc_rd * 5000 ' Convertir el resultado en milivoltios tlong = tlong / 1023 ' 0..1023 -> 0-5000mV ch = (tlong / 1000) mod 10 ' Extraer voltios (miles de milivoltios) ' del resultado Lcd_Chr(2,9,48+ch) ' Escribir resultado en formato ASCII Lcd_Chr_CP(".") ' Escribir el punto decimal ch = (tlong / 100) mod 10 ' Extraer centenas de milivoltios Lcd_Chr_CP(48+ch) ' Escribir resultado en formato ASCII ch = (tlong / 10) mod 10 ' Extraer decenas de milivoltios Lcd_Chr_CP(48+ch) ' Escribir resultado en formato ASCII ch = tlong mod 10 ' Extraer unidades de milivoltios Lcd_Chr_CP(48+ch) ' Escribir resultado en formato ASCII Lcd_Chr_CP("V") ' Escribir etiqueta para el voltaje "V" Delay_ms(1) ' Retardo de 1mS wend
end. ' Final de programa
4.13 EJEMPLO 11 Comunicacin serial RS232 Este ejemplo muestra cmo utilizar el mdulo EUSART del microcontrolador. La conexin entre el microcontrolador y una PC se establece de acuerdo con el 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 LEDs conectados al puerto PORTB y despus se devuelve automticamente al transmisor. La manera ms fcil es comprobar el funcionamiento del dispositivo en la prctica al utilizar un programa estndar de Windows denominado Hyper Terminal.
' Cabecera****************************************************** program example_11 ' Nombre de programa dim i as byte ' Variable es de tipo byte main: ' Inicio de programa UART1_Init(19200) ' Inicializar el mdulo USART ' 8 bits, tasa de baudios 19200, no hay bit de paridad...) while 1 ' Bucle infinito if UART1_Data_Ready() then ' Si se ha recibido un dato i = UART1_Read() ' leerlo UART1_Write(i) ' y enviarlo atrs end if wend
end. ' Final de programa Para que este ejemplo funcione apropiadamente, es necesario marcar la librera UART en la ventana Library Manager antes de compilar el programa: UART
4.14 EJEMPLO 12 Medicin de temperatura por medio del sensor DS1820. Uso del protocolo 1-wire... La medicin de temperatura es una de las tareas ms frecuentes realizadas por el microcontrolador. En este ejemplo, se utiliza un sensor DS1820 para medir. Es capaz de medir en el rango de 55 C a 125 C con exactitud de 0.5 C. Para transmitir los datos al microcontrolador se utiliza un tipo especial de la comunicacin serial denominado 1-wire. Debido al hecho de que estos sensores son simples de utilizar y con una amplia gama de aplicaciones, las funciones almacenadas en la librera One_Wire ponen en marcha y gobiernan estos sensores.
Esta librera contiene en total tres funciones: Ow_Reset se utiliza para reiniciar el sensor; Ow_Read se utiliza para recibir los datos del sensor; y Ow_Write se utiliza para enviar los comandos al sensor. Este ejemplo muestra la ventaja de utilizar libreras con las funciones listas para ser utilizadas. Concretamente, no tiene que examinar la documentacin proporcionada por el fabricante para utilizar el sensor. Basta con copiar las funciones apropiadas en el programa. Si le interesa saber cmo se declaran, basta con pulsar sobre alguna de ellas y seleccionar la opcin Help. ' Cabecera****************************************************** program example_12 ' Nombre de programa
dim LCD_RS as sbit at RB4_bit ' Conexiones del mdulo LCD LCD_EN as sbit at RB5_bit LCD_D4 as sbit at RB0_bit LCD_D5 as sbit at RB1_bit LCD_D6 as sbit at RB2_bit LCD_D7 as sbit at RB3_bit LCD_RS_Direction as sbit at TRISB4_bit LCD_EN_Direction as sbit at TRISB5_bit LCD_D4_Direction as sbit at TRISB0_bit LCD_D5_Direction as sbit at TRISB1_bit LCD_D6_Direction as sbit at TRISB2_bit LCD_D7_Direction as sbit at TRISB3_bit ' Final de conexiones del mdulo LCD
' Ajustar la constante TEMP_RESOLUTION a la resolusin correspondiente del sensor: ' DS18x20 utilizado: 18S20: 9 (ajustes por defecto pueden ser 9,10,11 o 12); 18B20: 12
const TEMP_RESOLUTION as byte = 9 ' Constante TEMP_RESOLUTION es de tipo byte
dim text as char[9] ' Variable text es de tipo char temp as word ' Variable temp es de tipo word sub procedure Display_Temperature( dim temp2write as word ) const RES_SHIFT = TEMP_RESOLUTION - 8 dim temp_whole as byte ' Variable temp_whole rd fr tipo byte temp_fraction as word ' Variable temp_fraction es de tipo word text = "000.0000"
if (temp2write and 0x8000) then ' Comprobar si la temperatura es negativa text[0] = "-" temp2write = not temp2write + 1 end if
if ( temp_whole div 100 ) then ' Convertir temp_whole en caracteres text[0] = temp_whole div 100 + 48 else text[0] = "0" end if
text[1] = (temp_whole div 10) mod 10 + 48 ' Extraer dgito de decenas text[2] = temp_whole mod 10 + 48 ' Extraer dgito de unidades temp_fraction = word(temp2write << (4-RES_SHIFT)) ' Extraer temp_fraction temp_fraction = temp_fraction and 0x000F ' y convertirlo en temp_fraction = temp_fraction * 625 ' unsigned int text[4] = word(temp_fraction div 1000) + 48 ' Extraer dgito de miles text[5] = word((temp_fraction div 100) mod 10 + 48) ' Extraer dgito de centenas text[6] = word((temp_fraction div 10) mod 10 + 48) ' Extraer dgito de decenas text[7] = word(temp_fraction mod 10) + 48 ' Extraer dgito de unidades Lcd_Out(2, 5, text) ' Visualizar temperatura en el Lcd
end sub
main: ' Inicio de programa ANSEL = 0 ' Configurar pines analgicos como digitales de E/S ANSELH = 0 text = "000.0000" Lcd_Init() ' Inicializar el Lcd Lcd_Cmd(_LCD_CLEAR) ' Borrar el Lcd Lcd_Cmd(_LCD_CURSOR_OFF) ' Apagar el cursor Lcd_Out(1, 1, " Temperature: ")
Lcd_Chr(2,13,178) ' Visualizar el carcter de grado, 'C' para centgrados ' Distintos visualizadores LCD tienen diferentes cdigos de caracteres para el grado Lcd_Chr(2,14,"C") ' si ve la letra griega Alfa, introduzca 178 en vez de 223
while 1 ' Leer la temperatura en el bucle principal Ow_Reset(PORTE, 2) ' Seal de reinicio de Onewire Ow_Write(PORTE, 2, 0xCC) ' Ejecutar el comando SKIP_ROM Ow_Write(PORTE, 2, 0x44) ' Ejecutar el comando CONVERT_T Delay_us(120)
Ow_Reset(PORTE, 2) Ow_Write(PORTE, 2, 0xCC) ' Ejecutar el comando SKIP_ROM Ow_Write(PORTE, 2, 0xBE) ' Ejecutar el comando READ_SCRATCHPAD
Display_Temperature(temp) ' Formatear y visualizar el resultado en el LCD
Delay_ms(520) ' Retardo de 520 ms wend end. ' Final de programa Para que este ejemplo funcione apropiadamente, es necesario marcar las siguientes libreras en la ventana Library Manager antes de compilar el programa: One_Wire LCD 4.15 EJEMPLO 13 Generacin de sonido, librera de sonido... Las seales de audio se utilizan con frecuencia cuando se necesita llamar la atencin de usuario para hacer algo, 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 cmo generar un 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. ' Cabecera****************************************************** program example_13 ' Nombre de programa
sub procedure Tone2() Sound_Play(698, 250) ' Frecuencia = 698Hz, duracin = 250ms end sub
sub procedure Tone3() Sound_Play(784, 250) ' Frecuencia = 784Hz, duracin = 250ms end sub
sub procedure Melody() ' Tocar una meloda divertida 1 Tone1() Tone2() Tone3() Tone3() Tone1() Tone2() Tone3() Tone3() Tone1() Tone2() Tone3() Tone1() Tone2() Tone3() Tone3() Tone1() Tone2() Tone3() Tone3() Tone3() Tone2() Tone2() Tone1() end sub
sub procedure ToneA() ' Tonos utilizados en la funcin Melody2 Sound_Play( 880, 50) end sub
sub procedure ToneC() Sound_Play(1046, 50) end sub
sub procedure ToneE() Sound_Play(1318, 50) end sub
sub procedure Melody2() ' Tocar Melody2 dim counter as byte for counter = 9 to 1 step -1 ToneA() ToneC() ToneE() next counter end sub
main: ' Inicio de programa
ANSEL = 0 ' Configurar pines analgicos como digitales de E/S ANSELH = 0
C1ON_bit = 0 ' Deshabilitar los comparadores C2ON_bit = 0
TRISB = 0xF0 ' Configurar los pines RB7..RB4 como entradas y RB3 como salida
Sound_Init(PORTD, 3) Sound_Play(880, 5000)
while TRUE ' Bucle infinito if (Button(PORTB,7,1,1)) then ' Si se presiona PORTB.7 tocar Tone1 Tone1() while (RB7_bit <> 0) nop ' Esperar que se suelte el botn wend end if
if (Button(PORTB,6,1,1)) then ' Si se presiona PORTB.6 tocar Tone1 Tone2() while (RB6_bit <> 0) nop ' Esperar que se suelte el botn wend end if
if (Button(PORTB,5,1,1)) then ' Si se presiona PORTB.5 tocar Tone1 Melody2() while (RB5_bit <> 0) nop ' Esperar que se suelte el botn wend end if
if (Button(PORTB,4,1,1)) then ' Si se presiona PORTB.4 tocar Tone1
Melody() while (RB4_bit <> 0) nop ' Esperar que se suelte el botn wend end if wend
end. ' Final de programa Para que este ejemplo funcione apropiadamente, es necesario marcar las siguientes libreras en la ventana Library Manager antes de compilar el programa: Button Sound
4.16 EJEMPLO 14 Utilizar el visualizador LCD grfico Un LCD grfico (GLCD) proporciona un mtodo avanzado para visualizar mensajes. Mientras que un LCD de caracteres puede visualizar slo caracteres alfanumricos, el LCD grfico puede visualizar los mensajes en forma de dibujos y mapas de bits. El LCD grfico utilizado con ms frecuencia tiene una resolucin de pantalla de 128x64 pxeles. El contraste de un GLCD se puede ajustar por medio del potencimetro P1.
Aqu, el GLCD visualiza un camin cuyo mapa de bits se almacena en el archivo truck_bmp.mbas.
dim GLCD_CS1 as sbit at RB0_bit ' Conexiones del mdulo Glcd GLCD_CS2 as sbit at RB1_bit GLCD_RS as sbit at RB2_bit GLCD_RW as sbit at RB3_bit GLCD_EN as sbit at RB4_bit GLCD_RST as sbit at RB5_bit
dim GLCD_CS1_Direction as sbit at TRISB0_bit GLCD_CS2_Direction as sbit at TRISB1_bit GLCD_RS_Direction as sbit at TRISB2_bit GLCD_RW_Direction as sbit at TRISB3_bit GLCD_EN_Direction as sbit at TRISB4_bit GLCD_RST_Direction as sbit at TRISB5_bit ' Final de conexiones del mdulo Glcd
dim counter as byte someText as char[18]
sub procedure Delay2S() ' Subfuncin de retardo de 2 segundos
Delay_ms(2000) end sub
main: ' Inicio de programa ANSEL = 0 ' Configurar pines analgicos como digitales de E/S
ANSELH = 0 Glcd_Init() ' Inicializar el Glcd Glcd_Fill(0x00) ' Borrar el Glcd while TRUE ' Bucle infinito Glcd_Image(@truck_bmp) ' Dibujar imagen Delay2S() delay2S()
Glcd_Fill(0x00) ' Borrar el Glcd
Glcd_Box(62,40,124,63,1) ' Dibujar la caja Glcd_Rectangle(5,5,84,35,1) ' Dibujar el rectngulo Glcd_Line(0, 0, 127, 63, 1) ' Dibujar la lnea
Glcd_Set_Font(@Character8x7, 8, 7, 32) ' Seleccionar la fuente "Character8x7" Glcd_Write_Text("mikroE", 1, 7, 2) ' Escribir la cadena
for counter = 1 to 10 ' Dibujar los crculos Glcd_Circle(63,32, 3*counter, 1) next counter Delay2S()
Glcd_Box(10,20, 70,63, 2) ' Dibujar la caja
Delay2S()
Glcd_Fill(0xFF) ' Llenar el Glcd Glcd_Set_Font(@Character8x7, 8, 7, 32) ' Cambiar de la fuente someText = "8x7 Font" Glcd_Write_Text(someText, 5, 0, 2) ' Escribir la cadena delay2S()
Glcd_Set_Font(@System3x5, 3, 5, 32) ' Cambiar de la fuente someText = "3X5 CAPITALS ONLY" Glcd_Write_Text(someText, 60, 2, 2) ' Escribir la cadena delay2S()
Glcd_Set_Font(@font5x7, 5, 7, 32) ' Cambiar de la fuente someText = "5x7 Font" Glcd_Write_Text(someText, 5, 4, 2) ' Escribir la cadena delay2S()
Glcd_Set_Font(@FontSystem5x7_v2, 5, 7, 32) ' Cambiar de la fuente someText = "5x7 Font (v2)" Glcd_Write_Text(someText, 5, 6, 2) ' Escribir la cadena delay2S() wend end. ' Final de programa truck_bmp.mbas file: module bitmap ' Mdulo con el cdigo de mapa de bits
end. ' Final del mdulo Para que este ejemplo funcione apropiadamente, es necesario marcar la librera GLCD en la ventana Library Manager antes de compilar el programa. Asimismo, es necesario incluir el documento Bitmap.mbas en el proyecto. 4.17 EJEMPLO 15 Utilizar el panel tctil... Un panel tctil es un panel fino, autoadhesivo y transparente, colocado sobre la pantalla de un LCD grfico. Es muy sensible a la presin as que un suave toque provoca algunos cambios en la seal de salida. Hay diferentes tipos de paneles tctiles. El ms sencillo es el panel tctil resistivo.
Un panel tctil est compuesto por dos lminas rgidas, formando una estructura de sndwich que tiene capas resistivas en sus caras internas. La resistencia de estas capas no excede normalmente de 1K. Los lados opuestos de las lminas disponen de los contactos para acceder a un cable plano.
El procedimiento para determinar las coordenadas de la posicin del panel que ha sido presionado se puede dividir en dos pasos. El primero es determinacin de la coordenada X, y el segundo es de determinar la coordenada Y de la posicin. Para determinar la coordenada X, es necesario conectar el contacto izquierdo en la superficie A a la masa (tierra) y el contacto derecho a la fuente de alimentacin. Esto permite obtener un divisor de voltaje al presionar el panel tctil. El valor de voltaje obtenido en el divisor se puede leer en el contacto inferior de la superficie B. El voltaje variar en el rango de 0V al voltaje suministrado por la fuente de alimentacin y depende de la coordenada X. Si el punto est prximo al contacto izquierdo de la superficie A, el voltaje estar prximo a 0V.
Para la determinacin de la coordenada Y, es necesario conectar el contacto inferior de la superficie B a masa (tierra), mientras que el contacto superior se conectar a la fuente de alimentacin. En este caso, el voltaje se puede leer en el contacto izquierdo de la superficie A.
Para conectar un panel tctil al microcontrolador es necesario crear un circuito para el control del panel tctil. Por medio de este circuito, el microcontrolador conecta los contactos adecuados del panel tctil a masa y a la voltaje de alimentacin (como describimos anteriormente) para determinar las coordenadas X y Y. El contacto inferior de la superficie B y el contacto izquierdo de la superficie A estn conectados al convertidor A/D del microcontrolador. Las coordenadas X e Y se determinan midiendo el voltaje en los respectivos contactos. El software consiste en mostrar un men en una pantalla LCD grfica, conmutar de encendido a apagado del panel tctil (control del panel tctil) y leer los valores del convertidor A/D que representan realmente las coordenadas X e Y de la posicin.
Una vez determinadas las coordenadas, es posible decidir qu es lo que deseamos que haga el microcontrolador. En este ejemplo se explica cmo conmutar entre encendido y apagado dos pines digitales del microcontrolador, conectados a los LEDs A y B. En este ejemplo se utilizan las funciones que pertenecen a las libreras Glcd y ADC. Teniendo en cuenta que la superficie del panel tctil es ligeramente mayor que la del LCD grfico, en caso de requerir una mayor precisin en la determinacin de las coordenadas, es necesario incluir el software de calibracin del panel tctil. 'Cabecera******************************************************
program example_15 ' Nombre de programa
dim GLCD_DataPORT as byte at PORTD ' Conexiones del mdulo Glcd
dim GLCD_CS1 as sbit at RB0_bit GLCD_CS2 as sbit at RB1_bit GLCD_RS as sbit at RB2_bit GLCD_RW as sbit at RB3_bit GLCD_EN as sbit at RB4_bit GLCD_RST as sbit at RB5_bit
dim GLCD_CS1_Direction as sbit at TRISB0_bit GLCD_CS2_Direction as sbit at TRISB1_bit GLCD_RS_Direction as sbit at TRISB2_bit GLCD_RW_Direction as sbit at TRISB3_bit GLCD_EN_Direction as sbit at TRISB4_bit GLCD_RST_Direction as sbit at TRISB5_bit ' Conexiones del mdulo Glcd
dim x_coord, y_coord, x_coord128, y_coord64 as longint ' Almacenar la posicin de las coordenadas x e y
sub function GetX() as word ' Leer la coordenada X
' Si BUTTON1 ha sido seleccionado: if ((x_coord128 >= 10) and (x_coord128 <= 58) and (y_coord64 >= 18) and (y_coord64 <= 46)) then if(PORTC.6 = 0) then PORTC.6 = 1 Glcd_Write_Text("RC6 ON ",14,4,0) else PORTC.6 = 0 Glcd_Write_Text("RC6 OFF",14,4,0) end if end if
' Si BUTTON2 ha sido seleccionado: if ((x_coord128 >= 70) and (x_coord128 <= 118) and (y_coord64 >= 18) and (y_coord64 <= 46)) then if(PORTC.7 = 0) then PORTC.7 = 1 Glcd_Write_Text("RC7 ON ",74,4,0) else PORTC.7 = 0 Glcd_Write_Text("RC7 OFF",74,4,0) end if end if
Delay_ms(100) wend ' Mientras verdadero
end. ' Final de programa Para que este ejemplo funcione apropiadamente, es necesario marcar las siguientes libreras en la ventana Library Manager antes de compilar el programa. GLCD -ADC C_Stdlib
4.18 EJEMPLO 16 Utilizar el teclado 4x4 Un teclado representa un conjunto de botones de presin conectados de tal manera que formen 'filas' y 'columnas', as reduciendo el nmero de los pines de E/S necasarios para su conexin. En este ejemplo utilizaremos un teclado con 16 botones de presin organizados en cuatro filas y columnas. La librera Keypad 4x4 contiene todas las funciones necesarias para leer este teclado as como para inicializar el puerto al que est conectado. Para demostrar el funcionamiento del teclado 4x4, el mensaje ser visualizado en un LCD.
program example_16 ' Nombre de programa dim kp, curX, curY as byte dim keypadPORT as byte at PORTD ' Esta variable debe estar definida en todos los proyectos por ' medio de la librera Keypad. As se define el puerto utilizado para conectar el teclado
dim LCD_RS as sbit at RB4_bit ' Conexiones del mdulo Lcd LCD_EN as sbit at RB5_bit LCD_D4 as sbit at RB0_bit LCD_D5 as sbit at RB1_bit LCD_D6 as sbit at RB2_bit LCD_D7 as sbit at RB3_bit LCD_RS_Direction as sbit at TRISB4_bit LCD_EN_Direction as sbit at TRISB5_bit LCD_D4_Direction as sbit at TRISB0_bit LCD_D5_Direction as sbit at TRISB1_bit LCD_D6_Direction as sbit at TRISB2_bit LCD_D7_Direction as sbit at TRISB3_bit ' Final de conexiones del mdulo LCD
main: ' Inicio de programa curX=1 ' Memorizar de la posicin del cursor en el visualizador LCD 2x16 curY=1 ANSEL = 0 ' Configurar pines analgicos como digitales ed E/S ANSELH = 0 TRISB = 0 PORTB = 0xFF Keypad_Init() ' Inicializar el teclado en el puerto PORTC Lcd_Init() ' Inicializar el LCD en el puerto PORTB, Lcd_Cmd(_LCD_CLEAR) ' Borrar el visualizador
while true ' Esperar que alguna tecla se presione y suelte
select case kp ' Preparar el valor comoo salida case 1 kp = "1" case 2 kp = "2" case 3 kp = "3" case 4 kp = "A" case 5 kp = "4" case 6 kp = "5" case 7 kp = "6" case 8 kp = "B" case 9 kp = "7" case 10 kp = "8" case 11 kp = "9" case 12 kp = "C" case 13 kp = "*" case 14 kp = "0" case 15 kp = "#" case 16 kp = "D" end select
if (curY > 16) then ' Cambiar de posicin del cursor if (curX = 1) then Lcd_Cmd(_LCD_SECOND_ROW) curX = 2 curY = 1 else Lcd_Cmd(_LCD_FIRST_ROW) curX = 1 curY = 1 end if end if
Lcd_Chr_CP(kp) ' Visualizar en el LCD Inc(curY) wend end. ' Final de programa Para que este ejemplo funcione apropiadamente, es necesario marcar las siguientes libreras en la ventana Library Manager antes de compilar el programa. Keypad4x4 - LCD Apndice A: Es hora de divertirse Un microcontrolador se parece a un genio en la botella, y no se necesita saber mucho para utilizarlo. Para crear un dispositivo controlado por un microcontrolador, se necesita una PC, un programa para compilar y un dispositivo para transmitir el cdigo de la PC al microcontrolador mismo. Aunque este proceso parece muy lgico, con frecuencia surgen las dudas, no por que es complicado, sino por un gran nmero de variaciones. A ver... A.1 VAMOS A EMPEZAR... A.2 COMPILACIN DE PROGRAMA A.3 SER UN FINAL FELIZ? A.4 SISTEMAS DE DESARROLLO A.1 VAMOS A EMPEZAR... Los programas especializados para Windows (compiladores) se utilizan para escribir un programa para el microcontrolador. Este libro describe el programa denominado mikroBasic PRO for PIC. La ventaja principal de este programa son las herramientas adicionales instaladas para facilitar el proceso de desarrollo.
Si tiene experiencia en escribir programas, entonces sabe que se trata de escribir todas las instrucciones en el orden en el que se deben ejecutar por el microcontrolador y observar las reglas de programa. En otras palabras, slo tiene que seguir su idea al escribir el programa. Esto es todo!
A.2 COMPILACIN DE PROGRAMA
El microcontrolador no entiende los lenguajes de alto nivel de programacin, de ah que sea necesario compilar el programa en lenguaje mquina. Basta con pulsar slo una vez sobre el icono apropiado dentro del compilador para crear un documento nuevo con extensin .hex. En realidad, es el mismo programa, pero compilado en lenguaje mquina que el microcontrolador entiende perfectamente. Este programa se le denomina con frecuencia un cdigo HEX y forma una secuencia de nmeros hexadecimales aparentemente sin significado. Una vez compilado, el programa se debe cargar en el microcontrolador. Usted necesita un hardware apropiado para hacerlo posible - un programador. PROGRAMAR LOS MICROCONTROLADORES Como hemos mencionado, para habilitar cargar un cdigo hex en el microcontrolador es necesario proporcionar un dispositivo especial, denominado el programador, con software apropiado. Un gran nmero de programas y circuitos electrnicos utilizados con este propsito se pueden encontrar en internet. El procedimiento es bsicamente el mismo para todos ellos y se parece a lo siguiente: 1. Coloque el microcontrolador en el zcalo apropiado del programador; 2. Utilice un cable adecuado para conectar el programador a una PC; 3. Abra el cdigo hex dentro de software del programador, ajuste varios parmetros, y pulse sobre el icono para transmitir el cdigo. Pocos segundos despus, una secuencia de ceros y unos se va a programar en el microcontrolador. Slo ha quedado instalar el microcontrolador programado en el dispositivo destino. Si es necesario hacer algunos cambios en el programa, el procedimiento anterior se puede repetir un nmero ilimitado de veces. A.3 SER UN FINAL FELIZ? Esta seccin describe en breve el uso del compilador mikroBasic PRO for PIC y del software de programacin (programador) PIC flash. Todo es muy simple...
Usted ya tiene instalado el mikroBasic PRO for PIC, verdad? Al iniciarlo, abra un proyecto nuevo y un documento nuevo con extensin .mbas dentro del mismo. Escriba su programa...
De acuerdo. El programa ha sido escrito y probado con el simulador. No ha informado de ningn error durante el proceso de compilacin en el cdigo hex? Parece que todo funciona perfecto... El programa ha sido compilado con xito. Slo queda cargarlo en el microcontrolador. Ahora necesita el programador PICflash que est compuesto por software y hardware. Inicie el programa PICFlash. La configuracin es simple y no hacen falta explicaciones adicionales (tipo de microcontrolador, frecuencia de oscilador de reloj etc.). Lo que queda hacer es lo siguiente: Conecte la PC con el hardware del programador por un cable USB; Coloque el microcontrolador en el zcalo apropiado del programador; Cargue el cdigo HEX utilizando el comando: File a Load HEX; y Pulse sobre el botn Write dentro de la ventana principal del programa PICflash y espere...
Esto es todo! El microcontrolador est programado y todo est listo para su funcionamiento. Si no est satisfecho, haga algunos cambios en el programa y repita el procedimiento. Hasta cundo? Hasta quedar satisfecho... A.4 SISTEMAS DE DESARROLLO Un dispositivo que puede simular cualquier dispositivo en la fase de prueba, es denominado un sistema de desarrollo. Aparte del hardware del programador, unidad de alimentacin, zcalo del microcontrolador, el sistema de desarrollo dispone de los componentes para activar los pines de entrada y monitorear los pines de salida. La versin ms simple tiene cada pin conectado a su respectivo botn de presin y un LED. Una versin de calidad alta tiene los pines conectados a los visualizadores LED, visualizadores LCD, sensores de temperatura u otros componentes por los que puede estar compuesto un dispositivo destino a ser programado.
Si es necesario, todos estos mdulos perifricos pueden estar conectados al microcontrolador por medio de los puentes. Esto permite probar el programa entero en la prctica an durante el proceso de desarrollo, porque el microcontrolador no sabe o no le interesa si su entrada est activada por un botn de presin o un sensor incorporado en un dispositivo real. Teniendo en cuenta que el compilador (en su PC) y el hardware del programador (en su sistema de desarrollo) colaboran perfectamente, el proceso de compilar un programa y programar el microcontrolador se lleva a cabo en un simple paso - al pulsar sobre el icono apropiado dentro del compilador. Desde este momento, cualquier cambio en el programa afectar inmediatamente al funcionamiento de los componentes apropiados en la placa.