Vous êtes sur la page 1sur 251

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

temp_whole = word(temp2write >> RES_SHIFT) ' Extraer temp_whole

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

temp = Ow_Read(PORTE, 2)
temp = (Ow_Read(PORTE, 2) << 8) + temp

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 Tone1()
Sound_Play(659, 250) ' Frecuencia = 659Hz, duracin = 250ms

end sub

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.





'Cabecera******************************************************

program example_14 ' Nombre de programa

dim GLCD_DataPORT as byte at PORTD

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

Delay2S()
counter = 5

while (counter <= 59) ' Dibujar lneas horizontales y verticales
Delay_ms(250)
Glcd_V_Line(2, 54, counter, 1)
Glcd_H_Line(2, 120, counter, 1)
Counter = counter + 5
wend

Delay2S()

Glcd_Fill(0x00) ' Borrar el GLCD

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

const truck_bmp as byte[1024] =
(0,0,0,0,0,248,8,8,8,8,8,8,12,12,12,12,12,10,10,10,10,10,10,9,9,9,9,9,9,9,9,9,9,
9,9,9,9,9,9,9,9,9,137,137,137,137,137,137,137,137,137,137,137,137,137,9,9,9,9,9,
9,9,9,9,9,9,13,253,13,195,6,252,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,
0,0,0,0,0,0,0,0,0,240,240,240,240,240,224,224,240,240,240,240,240,224,192,192,22
4,240,240,240,240,240,224,192,0,0,0,255,255,255,255,255,195,195,195,195,195,195,
195,3,0,0,0,0,0,0,0,0,0,0,0,0,255,240,79,224,255,96,96,96,32,32,32,32,32,32,32,3
2,32,32,32,32,32,64,64,64,64,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0
,0,0,255,255,255,255,255,0,0,0,0,255,255,255,255,255,0,0,0,255,255,255,255,255,1
29,129,129,129,129,129,129,128,0,0,0,0,0,0,0,0,0,0,0,0,255,1,248,8,8,8,8,8,8,8,8
,8,8,8,8,8,8,16,224,24,36,196,70,130,130,133,217,102,112,160,192,96,96,32,32,160
,160,224,224,192,64,64,128,128,192,64,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
63,96,96,96,224,96,96,96,96,96,96,99,99,99,99,99,96,96,96,96,99,99,99,99,99,96,9
6,96,96,99,99,99,99,99,96,96,96,99,99,99,99,99,99,99,99,99,99,99,99,99,96,96,96,
96,96,96,96,64,64,64,224,224,255,246,1,14,6,6,2,2,2,2,2,2,2,2,2,2,2,130,67,114,6
2,35,16,16,0,7,3,3,2,4,4,4,4,4,4,4,28,16,16,16,17,17,9,9,41,112,32,67,5,240,126,
174,128,56,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,127,127,127,127,255
,255,247,251,123,191,95,93,125,189,189,63,93,89,177,115,243,229,207,27,63,119,25
5,207,191,255,255,255,255,255,255,255,255,127,127,127,127,127,127,127,127,255,25
5,255,127,127,125,120,120,120,120,120,248,120,120,120,120,120,120,248,248,232,14
3,0,0,0,0,0,0,0,0,128,240,248,120,188,220,92,252,28,28,60,92,92,60,120,248,248,9
6,192,143,168,216,136,49,68,72,50,160,96,0,0,0,0,0,0,0,0,0,128,192,248,248,248,2
48,252,254,254,254,254,254,254,254,254,254,254,254,255,255,255,255,255,246,239,2
08,246,174,173,169,128,209,208,224,247,249,255,255,252,220,240,127,255,223,255,2
55,255,255,255,255,254,254,255,255,255,255,255,255,255,254,255,255,255,255,255,2
55,255,254,254,254,254,254,254,254,254,254,254,254,254,254,254,255,255,255,255,2
55,255,254,255,190,255,255,253,240,239,221,223,254,168,136,170,196,208,228,230,2
48,127,126,156,223,226,242,242,242,242,242,177,32,0,0,0,0,0,0,0,0,0,0,1,1,1,1,3,
3,3,7,7,7,7,7,15,15,15,7,15,15,15,7,7,15,14,15,13,15,47,43,43,43,43,43,47,111,23
9,255,253,253,255,254,255,255,255,255,255,191,191,239,239,239,191,255,191,255,25
5,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,25
5,255,255,255,255,255,255,127,127,127,127,255,255,191,191,191,191,255,254,255,25
3,255,255,255,251,255,255,255,127,125,63,31,31,31,31,31,31,63,15,15,7,7,3,3,3,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,3,3,3,11,11,11
,11,7,3,14,6,6,6,2,18,19,19,3,23,21,21,17,1,19,19,3,6,6,14,15,15,7,15,15,15,11,2
,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)

implements

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

PORTC.0 = 1 ' DRIVEA = 1 (electrodo izquierdo (LEFT) conectado, electrodo
' derecho (RIGHT) conectado, electrodo superior (TOP) desconectado)
PORTC.1 = 0 ' DRIVEB = 0 (electrodo inferior (BOTTOM) desconectado)
Delay_ms(5)
result = ADC_Read(0) ' LEER-X (BOTTOM)

end sub

sub function GetY() as word ' Leer la coordenada Y

PORTC.0 = 0 ' DRIVEA = 0 (electrodo izquierdo (LEFT) desconectado, electrodo
' derecho (RIGHT) desconectado, electrodo superior (TOP) conectado)
PORTC.1 = 1 ' DRIVEB = 1 (electrodo inferior (BOTTOM) conectado)


Delay_ms(5)
result = ADC_Read(1) ' LEER-X (LEFT)
end sub

main: ' Inicio de programa

PORTA = 0x00
TRISA = 0x03 ' RA0 y RA1 son entradas analgicas
ANSEL = 0x03
ANSELH = 0 ' Configurar otros pines analgicos como digitales de E/S

PORTC = 0
TRISC = 0 ' Pines del puerto PORTC se configuran como salida

Glcd_Init() ' Glcd_Init_EP5
Glcd_Set_Font(@font5x7, 5, 7, 32) ' Seleccionar el tamao de fuente 5x7
Glcd_Fill(0) ' Borrar el GLCD

Glcd_Write_Text("TOUCHPANEL EXAMPLE",10,0,1)
Glcd_Write_Text("MIKROELEKTRONIKA",17,7,1)

Glcd_Rectangle(8,16,60,48,1) ' Visualizar 'dos botones' en el GLCD:
Glcd_Rectangle(68,16,120,48,1)
Glcd_Box(10,18,58,46,1)
Glcd_Box(70,18,118,46,1)
Glcd_Write_Text("BUTTON1",14,3,0)
Glcd_Write_Text("RC6 OFF",14,4,0)
Glcd_Write_Text("BUTTON2",74,3,0)
Glcd_Write_Text("RC7 OFF",74,4,0)

while TRUE ' Leer X-Y y convertirlo en la resolucin de 128x64 pxeles

x_coord = GetX()
y_coord = GetY()
x_coord128 = (x_coord * 128) / 1024
y_coord64 = 64 -((y_coord *64) / 1024)

' 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.

'Cabecera******************************************************

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

kp = 0
while kp = 0
kp = Keypad_Key_Click()
Delay_ms(10)
wend

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.

Es hora de divertirse?