Académique Documents
Professionnel Documents
Culture Documents
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
cc
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 componentes tales como memoria o componentes buses de transmisin de
datos. 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.
-
c
cc
!
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.
Gaba 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. Gi no entendi lo anterior significa que todava pertenece al segundo grupo. Gi 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).
"#
$#
$#
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.
c%
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. Simplemente, es 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.
c
&
c
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.
Corresponde 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?
c'%c
El cdigo BCD (inary- oded ecimal - Cdigo binario decimal) es un cdigo binario utilizado
para representar a los nmeros decimales. Se utiliza para que los circuitos electrnicos puedan
comunicarse con los perifricos utilizando el sistema de numeracin decimal o bien utilizando el
sistema binario dentro de su propio mundo. 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.
c(
#
c
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.
c(
#
%
c
Los dgitos en un nmero binario tienen ponderaciones diferentes lo que depende de sus
posiciones dentro del nmero que estn representando. Adems, cada dgito puede ser 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
las ponderaciones con los dgitos correspondientes (0 o 1) 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. 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:
4
2 - 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.
c(
#
&
c
c
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. Por ejemplo:
c(
#
&
c
%
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:
c#
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. El prefijo $ o 0x as como el sufijo h marca los nmeros en
el sistema hexadecimal. Por ejemplo, el nmero hexadecimal 10AF se puede escribir as:
$10AF, 0x10AF o 10AFh. De manera similar, los nmeros binarios normalmente obtienen el
sufijo % o 0B. 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.
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.
#
'(
Como ya hemos visto, para escribir un nmero negativo en matemticas, basta con aadirle el
prefijo - (signo menos). Sin embargo, en la programacin, al acabarse el proceso de la
compilacin, se quedan slo los nmeros binarios, volvindose las cosas ms complicadas. Se
utilizan slo dos dgitos - 0 y 1, mientras que todos los dems nmeros, smbolos y signos se
forman por medio de las combinaciones de estos dos dgitos. En el caso de los nmeros
negativos, la solucin es la siguiente: En los nmeros negativos, el bit ms significativo (el bit
del extremo izquierdo) representa el signo del nmero (donde 0 ser positivo y 1 negativo). En
el caso de un nmero de 8 bits, para representar un valor numrico slo quedan 7 bits. De
acuerdo a este tipo de codificacin el nmero +127 es el mayor nmero positivo con signo que
se puede representar con 8 bits. Asimismo, hay cero (0) positivo y negativo (refirase a la tabla
de la derecha). La siguiente pregunta sera: Cmo es posible saber de qu nmero se trata?
Por ejemplo, si ponemos el nmero 10000001, es -1 o 129? No se preocupe, de eso se
encarga el compilador. sta es la razn por la que se declaran variables al escribir el programa.
Bueno, de eso vamos a hablar a continuacin.
%
%)
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.
sted 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? Gaba que sus
esquemas, aparentemente complicadas consisten en slo unos pocos elementos diferentes,
denominados circuitos lgicos o compuertas lgicas?
*
El funcionamiento de estos elementos es basado en los principios establecidos por el
matemtico britnico leorge Boole en la mitad del siglo 19 - es decir, antes de la invencin de
la primera bombilla! En breve, 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.
cc'c
Algunas instrucciones de programa utilizadas por un microcontrolador funcionan de la misma
manera que las compuertas lgicas, pero en forma de comandos. A continuacin vamos a
explicar el principio de su funcionamiento.
c
)+,
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 es
la tabla de verdad que muestra la relacin entre las entradas y salidas de la compuerta. El
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.
c
+,
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.
c
+,
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.
c
&+
&c(,
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.
'
Un registro o una celda de memoria es un circuito electrnico que puede memorizar el estado
de un byte.
'-
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, lo que
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 perifrico utilizado para... Bueno, depende de
usted.
.+
.,
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 (1020mA). Mientras ms pines de E/S haya, ms baja es la corriente mxima de un pin. En otras
palabras, todos los puertos de E/S comparten la corriente mxima declarada en la hoja de
especificacin tcnica del microprocesador.
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.
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:
+
)
),/
c
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.
0 +
, /
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...
+1 2 ,/ 1 2 34
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.
(
+(
21 2 , / 1 22 2
5 3
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...
+
cc)
%
'
' %
)%%
7cc
%
,/
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.
c
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.
c
c
+c
c
/
c,
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:
8
es la parte que descodifica las instrucciones
del programa y acciona otros circuitos basndose en esto. El conjunto de
instrucciones que es diferente para cada familia de microcontrolador expresa
las capacidades de este circuito;
91 : +6 1 /, realiza todas las
operaciones matemticas y lgica s sobre datos; y
o registro de trabajo. Es un registro SFR estrechamente
relacionado con el funcionamiento de la ALU. Es utilizado para almacenar
todos los datos sobre los que se debe realizar alguna operacin (sumar,
mover). Tambin almacena lo s 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 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 lneas de ancho. Se utiliza para
conectar todos los circuitos dentro del microcontrolador.
c cc
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, en otros casos 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:
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.
(
c
La velocidad de transmisin serial (baud 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:
"c+
'
cc,/cc
/
'
Circuito inter-integrado es un sistema para el intercambio de datos serial entre los
microcontroladores y los circuitos integrados especializados de 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 serial es normalmente 100 Kb/seg (el modo estndar) o
10 Kb/seg (modo de velocidad de transmisin baja). Recientemente han aparecido los sistemas
con la velocidad de transmisin serial 3.4 Mb/sec. La distancia entre los dispositivos que se
comunican por el bus I2C est limitada a unos metros.
+
-c
%, /%
-;
-7c
Un bus serial de interfaz de perifricos es un sistema para la comunicacin serial que utiliza
hasta cuatro lneas (normalmente solo son necesarias tres) - 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 mxima es mayor que en el sistema de conexin I2C.
+(
)c
c
(
.
, /
/
c
<c(
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.
c
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.
cc
c
Hay que mencionar dos cosas dignas de atencin con relacin al circuito de la fuente de
alimentacin de microcontroladores:
;
.c
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.
-c -c
;
!
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. 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) al incorporar al cuarzo que oscila con una frecuencia de 4 MHz.
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.
;
c
-c
;
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 preescaladores 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. Si el
;
c
-c
;
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.
c
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. 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.
;
'>+?c',
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 (ruidos elctricos frecuentes en la industria) 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!
c(
.
Las seales del mundo real son muy diferentes de las que entiende el microcontrolador (ceros
y unos), 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.
El resultado de esta medicin es un nmero (el valor digital) utilizado y procesado ms tarde en
el programa.
c
Todos los microcontroladores actuales utilizan uno de dos modelos bsicos de arquitectura
denominados [arvard y von-Neumann.
Son dos maneras diferentes del intercambio de datos entre la CPU y la memoria.
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: SUMA), el microcontrolador har lo
siguiente:
c
(
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 este diseo 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
informa cin sobre CUL dato se debe realizar). Sin embargo, esto no es una
'
cc
El nombre colectivo de todas las instrucciones que puede entender el microcontrolador es
llamado uego 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 aceptan cualquiera de los dos
enfoques descritos a continuacin:
-c
' cc!
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 del mismo
fabricante...
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!
C cc
c
Los microcontroladores PIC desarrollados por icrochip Technology son probablemente la
mejor opcin si es principiante. Hay varias razones por lo que esto es verdadero...
El nombre verdadero de este microcontrolador es PICmicro (Peripheral Interface Controller),
conocido bajo el nombre PIC. Su primer antecesor fue creado en 1975 por la
compaa leneral Instruments. Este chip denominado PIC1650 fue diseado para propsitos
completamente diferentes. Diez aos ms tarde, al aadir una memoria EEPROM, este circuito
se convirti en un verdadero microcontrolador PIC. Hace unos pocos aos la
compaa icrochip Technology fabric la 5 billonsima muestra. Si est interesado en
aprender ms sobre eso, siga leyendo.
If you are interested in learning more about it, just keep on reading.
La idea principal de este libro es proporcionar la informacin necesaria al usuario para que sea
capaz de utilizar los microcontroladores en la prctica despus de leerlo. 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.
U
U
!"
#
"
$%&
!
'
(
)
*
$
+"
%,
PIC10FXXX
0.375 0.75
16 - 24
6-8
4-8
0 -2
0-1
1x8
PIC12FXXX
0.75 - 1.5
25 - 38
4-8
0 -3
0-1
1x8
EEPROM
PIC16FXXX
0.75 - 3
25 - 134
14 44
20
0 -3
0-2
1x8
EEPROM
PIC16HVXXX
1.5
25
18 20
20
1x8
Vdd =
15V
)
*
$
+"
%-
PIC12FXXX
1.75 - 3.5
64 - 128
20
0 -4
10
1 - 2 x 8 1 x 16
0-1
EEPROM
PIC12HVXXX
1.75
64
20
0 -4
10
1 - 2 x 8 1 x 16
0-1
20
0 - 13
8 or 10
0-2
1 - 2 x 8 1 x 16
0-3
20
0 - 12
10
2 x 8 1 x 16
PIC16FXXX
1.75 - 14
64 - 368
14 64
PIC16HVXXX
1.75 - 3.5
64 - 128
14 20
PIC18FXXX
4 - 128
256 3936
18 80
32 - 48
4 - 16
10 or 12
0-3
0 -2x82 -3x
16
USB2.0 CAN2.0
USART I2C SPI
0-5
PIC18FXXJXX
8 - 128
1024 3936
28 100
40 - 48
10 - 16
10
0 -2x82 -3x
16
USB2.0 USART
Ethernet I2C SPI
2-5
PIC18FXXKXX
8 - 64
768 3936
28 44
64
10 - 13
10
1 x 8 3 x 16
)
*
$
+"
%&
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 tabla anterior muestra las
caractersticas principales de estas tres categoras.
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...
'
cc
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. Lo malo 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 C, lo que significa que la mayor parte del
trabajo ya fue hecho por alguien ms. As, slo se tienen que utilizar instrucciones
relativamente simples.
cc
cc
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 1S. 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:
cc
c c
c
%
cD
E
MOVLW k
Mover literal a W
k -> w
MOVWF f
Mover el contenido de W a f
W -> f
MOVF f,d
Mover el contenido de f a d
f -> d
CLRW
Borrar el contenido de W
0 -> W
1, 2
CLRF f
Borrar el contenido de f
0 -> f
SWAPF f,d
Intercambiar de nibbles en f
1, 2
./*
ADDLW k
Sumar literal a W
W+k -> W
C, DC, Z
ADDWF f,d
Sumar el contenido de W y f
W+f -> d
C, DC ,Z
SUBLW k
Restar W de literal
k-W -> W
C, DC, Z
SUBWF f,d
Restar W de f
f-W -> d
C, DC, Z
ANDLW k
W AND k -> W
ANDWF f,d
AND W con f
W AND f -> d
1, 2
1, 2
1, 2
IORLW k
W OR k -> W
IORWF f,d
OR inclusivo de W con f
W OR f -> d
1, 2
XORWF f,d
W XOR k -> W
1, 2
XORLW k
OR exclusivo de W con f
W XOR f -> d
INCF f,d
Sumar 1 a f
f+1 -> f
1, 2
DECF f,d
Restar 1 a f
RLF f,d
f-1 -> f
1, 2
1, 2
RRF f,d
1, 2
COMF f,d
Complementar f
1, 2
BCF f,b
0 -> f(b)
1, 2
BSF f,b
1 -> f(b)
1, 2
BTFSC f,b
Skip if f(b) = 0
1 (2)
BTFSS f,b
Skip if f(b) = 1
1 (2)
f -> d
DECFSZ f,d
1 (2)
1, 2,
3
INCFSZ f,d
1 (2)
1, 2,
3
GOTO k
k -> PC
CALL k
RETURN
TOS -> PC
RETLW k
RETFIE
NOP
No operacin
CLRWDT
1
TO, PD
SLEEP
TO, PD
*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 la instruccin se ejecuta en el registro TMR y si d=1, el pre-escalador ser borrado.
Arquitectura de los microcontroladores PIC de 8 bits. Cules de estos mdulos pertenecern al
microcontrolador, depender del tipo de microcontrolador
sted seguramente sabe que no es suficiente slo conectar el microcontrolador a los otros
componentes y encender una fuente de alimentacin para hacerlo funcionar, verdad? [ay
que hacer algo ms. Ge necesita programar el microcontrolador. Gi cree que esto es
complicado, est equivocado. Todo el procedimiento es muy simple. Basta con leer el texto
para entender de lo que estamos hablando.
2.1 LENGUAJES DE PROGRAMACIN
"
'
' c
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 se interpreta por la CPU
como una instruccin a ser ejecutada durante el funcionamiento del microcontrolador. Todas
las instrucciones que el microcontrolador puede reconocer y ejecutar se les denominan
colectivamente Conjunto de instrucciones. 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. En los microcontroladores PIC con las
'
%
Como el proceso de escribir un cdigo ejecutable era considerablemente arduo, en
consecuencia fue creado el primer lenguaje de programacin denominado ensamblador (ASM).
Siguiendo la sintaxis bsica del ensamblador, era ms fcil escribir y comprender el cdigo.
Las instrucciones en ensamblador consisten en las abreviaturas con significado y a cada
instruccin corresponde una localidad de memoria. Un programa denominado ensamblador
compila (traduce) las instrucciones del lenguaje ensamblador a cdigo mquina (cdigo
binario).
HEste programa compila instruccin a instruccin sin optimizacin. Como permite controlar en
detalle todos los procesos puestos en marcha dentro del chip, este lenguaje de programacin
todava sigue siendo popular.
Los lenguajes de programacin de alto nivel (Basic, Pascal, C etc.) fueron creados con el
propsito de superar las desventajas del ensamblador. En lenguajes de programacin de alto
nivel varias instrucciones en ensamblador se sustituyen por una sentencia. El programador ya
no tiene que conocer el conjunto de instrucciones o caractersticas del hardware 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.
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, para cada problema hay
una solucin y ste no es una excepcin gracias a la aritmtica que permite realizar las
operaciones complejas al descomponerlas en un gran nmero 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 C, 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.
1 Bc
La figura anterior es un ejemplo general de lo que sucede durante la compilacin de programa
de un lenguaje de programacin de alto nivel a bajo nivel.
""cc
<cc
Dc
A continuacin vamos a presentar a los elementos principales del lenguaje mikroC desarrollado
por Mikroelektronika. Este lenguaje es muy similar al C estndar, no obstante en determinados
aspectos difiere del ANSI estndar en algunas caractersticas. Algunas de estas diferencias se
refieren a las mejoras, destinadas a facilitar la programacin de los microcontroladores PIC,
mientras que las dems son la consecuencia de la limitacin de la arquitectura del hardware de
los PIC. Aqu vamos a presentar caractersticas especficas del lenguaje mikroC en la
programacin de los microcontroladores PIC. El trmino C se utilizar para referirse a las
caractersticas comunes de los lenguajes C y mikroC.
Este libro describe una aplicacin muy concreta del lenguaje de programacin C utilizado en el
compilador mikroC PRO for PIC. En este caso, el compilador se utiliza para la programacin de
los microcontroladores PIC.
-
c c
El proceso de compilacin consiste en varios pasos y se ejecuta automticamente por el
compilador. Por con, un conocimiento bsico del funcionamiento puede ser til para entender el
concepto del lenguaje mikroC.
El archivo fuente contiene el cdigo en mikroC que usted escribe para programar el
microcontrolador. El preprocesador se utiliza automticamente por el compilador al iniciarse el
proceso de la compilacin. El compilador busca las directivas del preprocesador (que siempre
empiezan por #) dentro del cdigo y modifica el cdigo fuente de acuerdo con las directivas.
En esta fase se llevan a cabo inclusin de archivos, definicin de constantes y macros etc, lo
que facilita el proceso. Ms tarde vamos a describir estas directivas en detalle. El 4
0 (parser) elimina toda la informacin intil del cdigo (comentarios, espacios en
blanco). Luego, el
traduce el cdigo a un archivo binario denominado archivo .mcl.
El 4
(linker) recupera toda la informacin requerida para ejecutar el programa de los
archivos externos y la agrupa en un solo archivo (.dbg). Adems, un proyecto puede contener
ms de un archivo fuente y el programador puede utilizar funciones predefinidas y agrupadas
dentro de los archivos denominados libreras. Por ltimo, el 1
6A produce un
archivo .hex. Es el archivo que se va a cargar en el microcontrolador.
El proceso entero de la compilacin que incluye todos los pasos anteriormente descritos se le
denomina building.
c
'
La idea principal de escribir un programa en C es de romper un problema mayor en varios
trozos ms pequeos. Supongamos que es necesario escribir un programa para el
microcontrolador para medir la temperatura y visualizar los resultados en un LCD. El proceso
de medicin se realiza por un sensor que convierte temperatura en voltaje. El microcontrolador
utiliza el convertidor A/D para convertir este voltaje (valor analgico) en un nmero (valor
digital) que luego se enva al LCD por medio de varios conductores. En consecuencia, el
programa se divide en cuatro partes, de las que cada una corresponde a una accin especfica:
Y ahora, su primer programa real! La figura muestra la estructura de programa, sealando las
partes en las que consiste.
La manera de escribir el cdigo en C es muy importante. Por ejemplo, C difiere entre
minsculas y maysculas, as que la funcin main() no se puede escribir MAIN() o Main().
Adems, note que dos lneas del cdigo dentro de la funcin terminan con un punto y coma. En
C todas las sentencias deben terminar con un punto y coma ;, as el compilador puede
aislarlas y traducirlas a cdigo mquina.
c
Los comentarios son las partes del programa utilizados para aclarar las instrucciones de
programa o para proporcionar ms informacin al respecto. El compilador no hace caso a los
comentarios y no los compila al cdigo ejecutable. Dicho de manera sencilla, 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. Hay
dos tipos de tales caracteres. Unos designan los comentarios largos que ocupan varias lneas
de programa marcados por la secuencia especial /*...*/, mientras que otros designan los
comentarios cortos que caben en una sola lnea //. 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.
"*
Dc
En el lenguaje C, los datos tienen un tipo, o sea, cada dato utilizado en el programa debe tener
su tipo especificado. Esto permite al compilador conocer el tamao de dato (nmero de bytes
requerido en la memoria) y su representacin. Hay varios tipos de datos que se pueden utilizar
en el lenguaje de programacin mikroC dependiendo del tamao de dato y del rango de
valores. La tabla muestra el rango de valores que los datos pueden tener cuando se utilizan en
su forma bsica.
c c
F +#
% ,
char
Texto (caracteres)
int
Valores enteros
16
de -32768 a 32767
'
(
de 0 a 255
float
32
de 1.1754943508210-38 a
6.805647744071038
double
32
de 1.1754943508210-38 a
6.805647744071038
c
-
char
signed char
de -128 a 128
unsigned int
16
de 0 a 65535
short int
de 0 a 255
de -128 a 127
long int
32
de 0 a 4294967295
32
de -2147483648 a
2147483647
int
F +#
% ,
'
(
Decimal (base 10): el nmero consiste en los dgitos (de 0 a 9). El primer dgito
no puede ser 0. En este formato, se puede introducir el signo de nmero (+ o
-). Por ejemplo: 569, -25, +1500.
Octal (base 8): los nmeros se representan a base 8 utilizando slo 8 dgitos
(de 0 a 7). Los enteros octales empiezan con 0. Por ejemplo: 056.
Binario: cuando un entero empieza con 0b (o 0B) se representan como una
serie de bits (0 y 1). Por ejemplo: 0B10011111
! "#$%% &'&
Una secuencia de caracteres es denominada cadena (string). Las cadenas estn encerradas
entre comillas dobles, por ejemplo:
"C(%
)c
8
Una variable es un objeto nombrado capaz de contener un dato que puede ser modificado
durante la ejecucin de programa. En C, las variables tienen tipo, que significa que es
necesario especificar el tipo de dato que se le asigna a una variable (int, float etc.). Las
variables se almacenan en la memoria RAM y el espacio de memoria que ocupan (en bytes)
depende de su tipo.
(
)(
'* (( +
'
)
'*
(
'
,
(
' -
Una constante tiene las mismas caractersticas que una variable excepto el hecho de que su
valor asignado no puede ser cambiado durante la ejecucin de programa. A diferencia de las
variables, las constantes se almacenan en la memoria Flash del microcontrolador para guardar
el mayor espacio posible de memoria RAM. El compilador las reconoce por el nombre y el
prefijo const. En mikroC, el compilador reconoce automticamente el tipo de dato de una
constante, as que no es necesario especificar el tipo adicionalmente.
(
)(
'* ((
( " (!
Cada variable o constante debe tener un identificador que lo distingue de otras variables y
constantes. Refirase a los ejemplos anteriores, a y A son identificadores.
1 2
En mikroC, los identificadores pueden ser tan largos como quiera. Sin embargo, hay varias
restricciones:
absolute
data
if
return
typedef
asm
default
inline
rx
typeid
at
delete
int
sfr
typename
auto
do
io
short
union
bit
double
long
signed
unsigned
bool
else
mutable
sizeof
using
break
enum
namespace
static
virtual
case
explicit
operator
struct
void
catch
extern
org
switch
volatile
while
char
false
pascal
template
class
float
private
this
code
for
protected
throw
const
friend
public
true
continue
goto
register
try
02
02
02
02
02
02
30 '
'4 5
30 '
( ('
(
30 '
'
(
30 '
( ('
( 6'7
30 '
('
O
O
!
!
Aparte del nombre y del tipo, a las variables se les asignan con frecuencia los valores iniciales
justamente enseguida de su declaracin. Esto no es un paso obligatorio, sino una cuestin de
buenas costumbres. Se parece a lo siguiente:
|
8
'(
"(*
'(
|
'( (!
- (
(
Si hay varias variables con el mismo valor inicial asignado, el proceso se puede simplificar:
|
"
'
(
9(?
Las constantes de enumeracin son un tipo especial de constantes enteras que hace un
programa ms comprensible al asignar los nmeros ordinales a las constantes. Por defecto, el
valor 0 se asigna automticamente a la primera constante entre llaves, el valor 1 a la segunda,
el valor 2 a la tercera etc.
|
()
!)*&+!%&++, "@:" A @"#B>+0 A $>0/0
|
()
!)*&+!%&++, "@:" A @C#0>+0 A $>0/0
|
( '!%+!+ &! $ +,
+ & ,
<
<((
A las variables globales se les puede acceder de cualquiera parte en el cdigo, an dentro de
las funciones con tal de que sean declaradas. El mbito de una variable global est limitado por
el fin del archivo fuente en el que ha sido declarado.
El mbito de variables locales est limitado por el bloque encerrado entre llaves {} en el que
han sido declaradas. Por ejemplo, si estn declaradas en el principio del cuerpo de funcin
(igual que en la funcin main) su mbito est entre el punto de declaracin y el fin de esa
funcin. Refirase al ejemplo anterior. A las variables locales declaradas en main() no se les
puede acceder desde la Funcin_1 y al revs.
n bloque compuesto es un grupo de declaraciones y sentencias (que pueden ser bloques
tambin) encerradas entre llaves. n bloque puede ser una funcin, una estructura de control
etc. na variable declarada dentro de un bloque se considera local, o sea, existe slo dentro
del bloque. Gin embargo, las variables declaradas fuera del mbito todava son visibles.
Aunque las constantes no pueden ser modificadas en el programa, siguen las mismas reglas
que las variables. Esto significa que son visibles dentro de su bloque a excepcin de las
constantes globales (declaradas fuera de cualquier funcin). Las constantes se declaran
normalmente en el inicio del cdigo fuera de cualquier funcin (como variables globales).
c
Las clases de almacenamiento se utilizan para definir el mbito y la vida de variables,
constantes y funciones dentro de un programa. En mikroC se pueden utilizar diferentes clases
de almacenamiento:
es una clase de almacenamiento por defecto para las variables locales,
as que se utiliza raramente. Se utiliza para definir que una variable local tiene
es una clase de almacenamiento por defecto para las variables globales.
Especifica que una variable es visible dentro del archivo. A las variables locales
declaradas con el prefijo se les puede acceder dentro del archivo fuente
(o sea se comportan como variables globales).
A: la palabra clave A se utiliza cuando el programa est compuesto
por diferentes archivos fuente. Esto le permite utilizar una variable, una
constante o una funcin declarada en otro archivo. Por supuesto, para compilar
y enlazar este archivo correctamente, el mismo debe ser incluido en su
proyecto. En los siguientes ejemplos, el programa consiste en dos
archivos: File_1 y File_2 . El File_1 utiliza una variable y una funcin declaradas
en File_2 .
-
,
( (
E
<
-
ED
67( '
4 E
<
(
+#
$
D
E
< (! (
E
<
-
ED
67( '
(
)
,
-"
-
-
( 9
(
E
< ( (
( )
,
"G
Un operador es un smbolo que denota una operacin aritmtica, lgica u otra operacin
particular. Dicho de manera sencilla, varias operaciones aritmticas y lgicas se realizan por
medio de los operadores. Hay ms de 40 operaciones disponibles en el lenguaje C, pero se
utiliza un mximo de 10-15 de ellas en prctica. Cada operacin se realiza sobre uno o ms
operandos que pueden ser variables o constantes. Adems, cada operacin se caracteriza por
la prioridad de ejecucin y por la asociatividad.
7c
Los operadores aritmticos se utilizan en las operaciones aritmticas y siempre devuelven
resultados numricos. Hay dos tipos de operadores, los unitarios y los binarios. A diferencia de
las operaciones unitarias que se realizan sobre un operando, las operaciones binarias se
realizan sobre dos operandos. En otras palabras, se requieren dos nmeros para ejecutar una
operacin binaria. Por ejemplo: a+b o a/b.
c
Adicin
Resta
Multiplicacin
Divisin
Resto de la divisin
'c
Hay dos tipos de asignacin en el lenguaje C:
Expresin
Equivalente
+=
a += 8
a=a+8
-=
a -= 8
a=a-8
*=
a *= 8
a=a*8
/=
a /= 8
a=a/8
%=
a %= 8
a=a%8
c
)
c
Las operaciones de incremento y decremento por 1 se denotan con "++" y "--". Estos
caracteres pueden preceder o seguir a una variable. En primer caso (++x), la variable x ser
incrementada por 1 antes de ser utilizada en la expresin. De lo contrario, la variable se
utilizar en la expresin antes de ser aumentada por 1. Lo mismo se aplica a la operacin de
decremento.
c c
++a
++
--
!!
G
c
Los operadores relacionales se utilizan en comparaciones con el propsito de comparar dos
valores. En mikroC, si una expresin es evaluada como falsa (false), el operador devuelve 0,
mientras que si una oracin es evaluada como verdadera (true), devuelve 1. Esto se utiliza en
expresiones tales como si la expresin es evaluada como verdadera, entonces...
c c
>
mayor que
b>a
>=
a >= 5
<
menor que
a<b
<=
a <= b
==
igual que
a == 6
!=
desigual que
a != b
c c
(
c
si
es mayor que
si
si
es menor que
si
si
O + '(D (
F ''
'c
Hay tres tipos de operaciones lgicas en el lenguaje C: Y (AND) lgico, O (OR) lgico y
negacin - NO (NOT) lgico. Los operadores lgicos devuelven verdadero (1 lgico) si la
expresin evaluada es distinta de cero. En caso contrario, devuelve falso (0 lgico) si la
expresin evaluada equivale a cero. Esto es muy importante porque las operaciones lgicas se
realizan generalmente sobre las expresiones, y no sobre las variables (nmeros) particulares
en el programa. Por lo tanto, las operaciones lgicas se refieren a la veracidad de toda la
expresin.
- c
??
??
NO
??
%
A diferencia de las operaciones lgicas que se realizan sobre los valores o expresiones, las
operaciones de manejo de bits se realizan sobre los bits de un operando. Se enumeran en la
siguiente tabla:
c c
Complemento a uno
a = ~b
b=5
a = -5
OO
Desplazamiento a la izquierda
a = b << 2
b = 11110011
a = 11001100
Desplazamiento a la derecha
a = b >> 2
b = 11110011
a = 00011110
c = 11000000
c=ab
a = 11100011
b = 11001100
c=ab
a = 11100011
b = 11001100
c = 11101111
c=a^b
a = 11100011
b = 11001100
c = 00101111
-c ;
!
c (
Alta
/0
de izquierda a derecha
de derecha a izquierda
.2
de izquierda a derecha
de izquierda a derecha
O
de izquierda a derecha
OO
de izquierda a derecha
Baja
1
de izquierda a derecha
de izquierda a derecha
de izquierda a derecha
de izquierda a derecha
de izquierda a derecha
de derecha a izquierda
de derecha a izquierda
.22O
de izquierda a derecha
!!
.
(
.
(
c(
Algunas operaciones implican conversin de datos. Por ejemplo, si divide dos valores enteros,
hay una alta posibilidad de que el resultado no sea un entero. El mikroC realiza una conversin
automtica cuando se requiera.
Si dos operandos de tipo diferente se utilizan en una operacin aritmtica, el tipo de operando
de la prioridad ms baja se convierte automticamente en el tipo de operando de la prioridad
ms alta. Los tipos de datos principales se colocan segn el siguiente orden jerrquico:
La autoconversin se realiza asimismo en las operaciones de asignacin. El resultado de la
expresin de la derecha del operador de la asignacin siempre se convierte en el tipo de la
variable de la izquierda del operador. Si el resultado es de tipo de la prioridad ms alta, se
descarta o se redondea para coincidir con el tipo de la variable. Al convertir un dato real en un
entero, siempre se descartan los nmeros que siguen al punto decimal.
4
'
F (
'
Para realizar una conversin explcita, antes de escribir una expresin o una variable hay que
especificar el tipo de resultado de operacin entre parntesis.
| !
!
3
2 67I I
2
"H
c
c
ccc
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, Gi se
cumple la condicin (...), se debe hacer (...). De lo contrario, si la condicin no se cumple, se
debe hacer (...). Los operandos condicionales 8/ y =6 se utilizan en las operaciones
condicionales. Una sentencia condicional puede ser seguida por una sola sentencia o por un
bloque de sentencias a ser ejecutadas.
cc8/
El operador 8 se puede utilizar solo o asociado al operador +8/,.
Ejemplo del operador 8:
Si operacin1 u operacin2 est compuesta, escriba una lista de sentencias encerradas entre
llaves. Por ejemplo:
(
'D
,
=6
A diferencia de la sentencia 8/ que selecciona entre dos opciones en el programa, el
operador =6 permite elegir entre varias opciones. La sintaxis de la sentencia =6 es:
#
(
'
(
+
*'
'
( ( ? (
+
*'
'
( ( ? (
|
+
*'
'
( ( ? (
,
La palabra clave de C break se puede utilizar en cualquier tipo de bloques. Al utilizar break,
es posible salir de un bloque aunque la condicin para su final no se haya cumplido. Ge puede
utilizar para terminar un bucle infinito, o para forzar un bucle a terminar antes de lo normal.
%c
A menudo es necesario repetir una cierta operacin un par de veces 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.
%?6
El bucle while se parece a lo siguiente:
(
,
Los comandos se ejecutan repetidamente (el programa se queda en el bucle) hasta que la
expresin llegue a ser falsa. Si la expresin es falsa en la entrada del bucle, entonces el bucle
no se ejecutar y el programa continuar desde el fin del bucle while.
Un tipo especial del bucle de programa es un bucle infinito. Se forma si la condicin sigue sin
cambios dentro del bucle. La ejecucin es simple en este caso ya que el resultado entre llaves
es siempre verdadero (1=verdadero), lo que significa que el programa se queda en el mismo
bucle:
( + 4
JK
67JF ( '
( JK
67J
+ '((
(
( ( ?!
'
6
7
,
%-
El bucle 8 se parece a lo siguiente:
(
,
La ejecucin de esta secuencia de programa es similar al bucle while, salvo que en este caso
el proceso de especificar el valor inicial (inicializacin) se realice en la declaracin. La
expresin_ inicial especifica la variable inicial del bucle, que ms tarde se compara con la
expresin_ de_condicin antes de entrar al bucle. Las operaciones dentro del bucle se ejecutan
repetidamente y despus de cada iteracin el valor de la expresin_inicial se incrementa de
acuerdo con la regla cambiar_expresin. La iteracin contina hasta que la
expresin_de_condicin llegue a ser falsa.
O
>
L ( ( 6
7 -
4 ( '
'(D 'D
La operacin se ejecutar cinco veces. Luego, al comprobar se valida que la expresin k<5 sea
falsa (despus de 5 iteraciones k=5) y el programa saldr del bucle for.
%/=6
El bucle do-while se parece a lo siguiente:
La expresin cambiar_condicin se ejecuta al final del bucle, que significa que operacin se
ejecuta como mnimo una vez sin reparar en que si la condicin es verdadera o falsa. Si el
resultado es distinto de 0 (verdadero), el procedimiento se repite.
Todos los siguientes ejemplos son equivalentes. Esta parte del cdigo visualiza "hello" en un
LCD 10 veces con un retardo de un segundo. Note que en este ejemplo se utilizan funciones
predefinidas, que se encuentran en las libreras del compilador mikroC PRO for PIC. No
obstante le aconsejamos que no trate de entenderlas en detalle. Su comportamiento general
dentro del bucle se explica por medio de los comentarios.
%
4D
O( $
D
&+!!
-
,(
4 M
N
>$8
'
5 /
(
&%&%'%& O
>$8
'
5 /
(
$
(
,
O
( %
4DF
DF
&+!!
-
,(
4 M
N
>$8
'
5 /
(
&%&%'%& O
>$8
'
5 /
(
,
%
4D
(
&+!!
-
,(
4 M
N
>$8
'
5 /
(
'
5 /
(
$
(
,
O $
D
c
c%
D
A veces es necesario detener y salir de un bucle dentro de su cuerpo. La sentencia break se
puede utilizar dentro de cualquier bucle (while, for, do while) y en las sentencias switch
tambin. En stas la sentencia break se utiliza para salir de las sentencias switch si la
condicin case es verdadera. En este ejemplo, Esperar est parpadeando en la pantalla LCD
hasta que el programa detecte un uno lgico en el pin 0 del puerto PORTA.
( O
+#4 H (
(
D*
'
'
H0/;" ( A (
F (
&+!!
,(
4 M+('N
>$8
'
5 /
(
&%&%'%& O >$8
'
5 /
(
,
cc
La sentencia continue colocada dentro de un bucle se utiliza para saltar una iteracin. A
diferencia de la sentencia break, el programa se queda dentro del bucle y las iteraciones
continan.
# F '
(D '
(
4 ) ' ( (D
O(
( (
'
(D '
&%&%'%&
&+!!
' 5
'
5
| 8('P(
(
)F (
( K
I
,
2 +(
(D *! (
c'
La sentencia goto le permite hacer un salto absoluto al 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 un colon (:).
%+
# ( (
$0<((
(
)
'*
"
8(
) (*
'
D
* (
?!
(
D
$0
(
"I
(;
c
Una matriz es una lista de elementos del mismo tipo colocados en localidades de memoria
contiguas. Cada elemento es referenciado por un ndice. 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. Todos los elementos de una matriz
tienen el mismo tipo.
/
0
Los elementos de una matriz se identifican por su posicin. En C, el ndice va desde 0 (el
primer elemento de una matriz) a N-1 (N es el nmero de elementos contenidos en una matriz).
El compilador tiene que saber cuntas localidades de memoria debe alojar al declarar una
matriz. El tamao de una matiz no puede ser una variable. Por eso, se pueden utilizar dos
mtodos:
P
5/0 8
D
4
('
- '4
(
P
'7)#+
/'7)#+0 8
D
4 94<
'4
(
Una matriz se puede inicializar a la vez que se declara, o ms tarde en el programa. En ambos
casos, este paso se realiza al utilizar llaves:
5/0(!!,
Para leer o modificar un elemento de matriz del ejemplo anterior, basta con introducir su ndice
encerrado entre corchetes:
# (' (
5/0 "
(
(*
4
)
6 7
5/0 9
4 -<QR (
6
( 7
El siguiente programa cambia el orden de los elementos de una matriz. Note que el ndice se
puede expresar mediante variables y operaciones bsicas.
(
#')
,
( 9:+#;/"#<8+<"@:" (
!
,
( - ' (
'
/
#')
0( !!!3, ;
(
( (
4 '
(
(
'
O
#')
2
( O
( ? (
/0 ' (
4 ' *
'
/0
/
#')
0
/
#')
0
,
") (S '
<
<(
Q9:+#;/"#<8+<"@:"R TIFFFU
,
c
%
Aparte de las matrices unidimensionales que se pueden interpretar como una lista de valores,
el lenguaje C le permite declarar matrices multidimensionales. En esta parte vamos a describir
slo las matrices bidimensionales, tambin denominadas tablas o matrices. Una matriz
/
0/
0
tabla[0][1]
tabla[0][2]
tabla[0][3]
tabla[1][0]
tabla[1][1]
tabla[1][2]
tabla[1][3]
tabla[2][0]
tabla[2][1]
tabla[2][2]
tabla[2][3]
Similar a las matrices unidimesionales, es posible asignar los valores a los elementos de una
tabla en la lnea de declaracin. La asignacin debe ser realizada lnea a lnea como en el
siguiente ejemplo. Como hemos visto anteriormente, esta matriz tiene dos filas y tres columnas:
#/0/0((! !,!(!!,,
42
19
Un puntero es una variable destinada a recibir una direccin. Un puntero apunta a una
localidad de memoria, referenciada por una direccin. En C, la direccin de un objeto se puede
obtener por medio un operador unitario &. Para acceder al contenido de la memoria en una
direccin especfica (tambin llamado objeto apuntado), se utiliza un operador de indireccin
(*).
'&n' es la direccin de la localidad de memoria 'n'.
'*(&n)' es el contenido de la direccin '(&n)', o sea de 'n'.
.
Los punteros son muy tiles para manejar las matrices. En este caso, un puntero se utilizar
para apuntar al primer elemento de una matriz. Debido al hecho de que es posible realizar
operaciones bsicas sobre los punteros (aritmtica de punteros), es fcil manejar los elementos
de una matriz.
Fjese en la diferencia entre *v+1 y *(v+1) en el siguiente ejemplo:
/0(!!,
.
/0
D
QR
.
QR
/0.
QR 6QR G 7
.
.
QR
D
QR
. QR
Los punteros tambin pueden ser declarados con el prefijo const. En este
caso, su valor no puede ser modificado despus de la inicializacin, similar a
una constante.
A diferencia de C, el mikroC no admite alojamiento dinmico.
c
Ya hemos visto cmo agrupar los elementos dentro de matrices. No obstante, al utilizar este
mtodo todos los elementos deben ser del mismo tipo. Al utilizar estructuras, es posible
agrupar diferentes tipos de variables bajo el mismo nombre. Las variables dentro de una
estructura se le denominan los miembros de la estructura. Las estructuras de datos se declaran
al utilizar la siguiente sintaxis:
|
(
V V
,
|
(
,
Entonces, podr definir los objetos denominados turbina en el cdigo. A cada uno de estos
tres objetos (turbinas) se le asignan las variables corriente y voltaje.
|
! !
Por supuesto, igual que al utilizar los punteros, todava se le permite realizar operaciones por
medio de operadores y sentencias definidos en las partes anteriores.
Gi est familiarizado con el lenguaje C, recuerde que mikroC no admite la inicializacin de los
miembros de estructura por medio de las llaves. Por ejemplo, conjunto_1 ={15,m}; devuelve
un error en mikroC.
"J-c
Una funcin es una subrutina que contiene una lista de sentencias a realizar. La idea principal
es dividir un programa en varias partes utilizando estas funciones para resolver el problema
inicial con ms facilidad. Adems, las funciones nos permiten utilizar las destrezas y el
conocimiento de otros programadores. Una funcin se ejecuta cada vez que se llame dentro de
otra funcin. En C, un programa contiene como mnimo una funcin, la funcin main(), aunque
el nmero de funciones es normalmente mayor. Al utilizar funciones el cdigo se hace ms
corto ya que es posible llamar una funcin tantas veces como se necesite. En C, el cdigo
normalmente consiste en muchas funciones. No obstante, en caso de que su programa sea
muy corto y simple, puede escribir todas las sentencias dentro de la funcin principal.
-cc
La funcin principal main() es una funcin particular puesto que es la que se ejecuta al iniciar el
programa. Adems, el programa termina una vez completada la ejecucin de esta funcin. El
compilador reconoce automticamente esta funcin y no es posible llamarla por otra funcin.
La sintaxis de esta funcin es la siguiente:
(
' &
& (*
*5
+
(*
&
& (* *5
3
'
P
(* ( (S &67& &
67&
&6
7&
%
4 ( '* )
,
Esto significa que f es una funcin que recibe un nmero real x como parmetro y devuelve
2*x-y.
La misma funcin en C se parece a lo siguiente:
'
(
. 5
(
!
|
,
Cada funcin debe ser declarada apropiadamente para poder interpretarla correctamente
durante el proceso de compilacin. La declaracin contiene los siguientes elementos:
Note que una funcin no necesita parmetros (funcin main() por ejemplo), pero debe estar
entre parntesis. En caso contrario, el compilador malinterpretara la funcin. Para hacerlo ms
claro, puede sustituir el espacio en blanco encerrado entre parntesis por la palabra clave void:
main (void).
(
(
Una funcin puede devolver un valor (esto no es obligatorio) por medio de la palabra clave
return. Al llegar a return, la funcin evala un valor (puede ser una expresin) y lo devuelve a la
lnea de programa desde la que fue llamada.
Una funcin no puede devolver ms de un valor, pero puede devolver un puntero o una
estructura. Tenga cuidado al utilizar matrices y punteros. El siguiente ejemplo es un error tpico:
.
. +( D
4
Si la funcin no devuelve ningn valor, la palabra void debe ser utilizada como un tipo de
resultado en la declaracin. En este caso, la sentencia return no debe ser seguida por ninguna
expresin. Puede ser omitida como en el siguiente ejemplo:
c
-c
Para utilizar una funcin, el compilador debe ser consciente de su presencia en el programa.
En la programacin en C, los programadores normalmente primero escriben la funcin main() y
luego las funciones adicionales. Para avisar al compilador de la presencia de las funciones
adicionales, se requiere declarar los prototipos de funciones en el principio de programa antes
de la funcinmain(). Un prototipo de funcin est compuesto por:
tipo de resultado
nombre de funcin
tipos de parmetros
un punto y coma (;)
-c
Mientras una funcin es definida y su prototipo declarado, se puede utilizar en culquier parte de
programa. Sin embargo, como la funcinmain es 'raiz' del programa, no puede ser llamada de
ninguna parte de programa. Para ejecutar una funcin, es necesario escribir su nombre y los
parmetros asociados. Vea los siguientes ejemplos:
!! (
FFF
( '(
(
D
( ( - K<
! +?
D '
( '!( -
+
(
(*
(
+?
D '(< '
'
$ +?
D D= 6( '!(7
Cuando se llama una funcin, el programa salta a la funcin llamada, la ejecuta, despus
vuelve a la lnea desde la que fue llamada.
>
Al llamar una funcin, se le pasan los parmetros. En C existen dos formas diferentes para
pasar parmetros a una funcin.
El primer mtodo, denominado paso por valor, es el ms fcil. En este caso, los parmetros se
pueden considerar como variables locales de la funcin. Cuando se llama una funcin, el valor
de cada parmetro se copia a un nuevo espacio de memoria reservado durante la ejecucin de
la funcin. Como los parmetros se consideran como variables locales por el compilador, sus
valores pueden ser modificados dentro de la funcin, pero sus modificaciones no se quedan en
la memoria una vez completada la ejecucin de la funcin.
Tenga en cuenta de que la funcin devuelve un valor, y no una variable. Adems, se crean
copias de los valores de los parmetros, por lo que sus nombres en la funcin f pueden ser
diferentes de los parmetros utilizados en la main(). La mayor desventaja del paso por el valor
es que la nica interaccin que una funcin tiene con el resto del programa es el valor devuelto
de un solo resultado (o la modificacin de las variables globales).
El otro mtodo, denominado 'paso por direccin' le permite sobrepasar este problema. En vez
de enviar el valor de una variable al llamar a funcin, se debe enviar la direccin de memoria
del valor. Entonces, la funcin llamada ser capaz de modificar el contenido de esta localidad
de memoria.
ED &(&
( (
4 '
(
-
!
. H'
D
(
! /0(!!!!, 8
D
(
4
>
D - (*
!
,
.
9
(
!
!
8
D
(
O
( 'D
1( V
(
(
O
O
( $' -
( (
4 6
(
(7
9
/0
9
/
0(
9
/0
9
/0
9
/
0
9
/
0
# 'DF
( '
,
,
,
|
9
/0 8
5
, (
( '
!
En este ejemplo, por medio de una funcin se realizan dos operaciones: ordena los miembros
de la matriz por valor asdendente y devuelve el mximo valor.
Para utilizar una matriz en una funcin es necesario asignar la direccin a la matriz (o a su
primer miembro). Vea el siguiente ejemplo:
(
|
!
8
D
(
( '
- '
/ +' '%+0(!3!!!!!, 8
D
4
?
:
/0 H!
D (
D
'
:
H!
D (
D
4
,
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
:
/0 %
D P
<
(
! 8
D
(
(
( - (
O +' '%+
$!
'
?
/0 +( '(
4 6
?G7 4
?QR
Las funciones 'mtodo_1' y 'mtodo_2' son completamente equivalentes. Las dos devuelven el
valor promedio de la matriz 'voltaje[]'. Despus de declararla, la direccin del primer miembro
se puede escribir como 'voltaje' o '&voltaje[0]'.
"Kcc
<cc
c
El preprocesador es un programa que procesa el cdigo antes de que pase por el compilador.
Funciona bajo el control de las lneas de comando del preprocesador denominadas directivas.
Las directivas del preprocesador se colocan en el cdigo fuente, normalmente en el principio
del archivo. Antes de pasar por el compilador, el cdigo fuente se examina por el
preprocesador que detecta y ejecuta todas las directivas del preprocesador. Las directivas del
preprocesador siguen a una regla de la sintaxis especial, empiezan por un smbolo # y no
requieren ningn punto y coma al final (;).
c(
c
La siguiente tabla contiene un conjunto de directivas del preprocesador frecuentemente
utilizadas:
Las directivas del preprocesador se pueden dividir en tres categoras:
c (
- c
Rdefine
Rundef
Rdefine
Rifdef
Rendif
Rifndef
Rif
Relse
Relif
Definiciones de macro
Inclusiones de archivos
Control de compilacin
Ahora, vamos a presentar slo las directivas del preprocesador utilizadas con ms frecuencia.
Sin embargo, no es necesario saber todas ellas para programar microcontroladores. Slo tenga
en cuenta que el preprocesador es una herramienta muy poderosa para los programadores
avanzados en C, especialmente para el control de compilacin.
c(
c
- c
Por medio de los macros es posible definir las constantes y ejecutar funciones bsicas. Una
sustitucin de macro es un proceso en el que un identificador del programa se sustituye por
una cadena predefinida. El preprocesador sustituye cada ocurrencia del identificador en el
cdigo fuente por una cadena. Despus de la sustitucin, el cdigo ser compilado
normalmente.
Esto significa que el cdigo sustituido debe respetar la sintaxis del mikroC. La accin se realiza
por medio de la directiva '#define'.
R
#(D ('
F H% (! ((
'
(
( '(
'*
R
+&
'!;'2.'2. .; 9 '!(
# 9
+&
'
!
# 9
'
2.'
2. .
Por medio de la directiva #undef es posible quitar una definicin de nombre de macro. As se
especifica que la substitucin que se ha definido anteriormente ya no va ocurrir en el siguiente
cdigo. Esto es til cuando usted quiere restringir la definicin slo a una parte particular del
programa.
R
#
V
D
,0>:9+3
c
c(
La directiva de preprocesador Rinclude copia un archivo especfico en el cdigo fuente. El
cdigo incluido debe observar la sintaxis de C para ser compilado correctamente.
Hay dos formas de escribir estas directivas. En el primer ejemplo, slo el nombre de archivo se
especifica, as que el preprocesador lo buscar dentro del archivo include. En el segundo
ejemplo, se especifica la ruta entera, as que el archivo estar directamente incluido (este
mtodo es ms rpido).
R
O
-
# (' (D
R
%
--
# ('
"L Dc-c
Como ya hemos visto, hay varias divergencias entre los lenguajes mikroC y ANSI C. En este
captulo vamos a presentar las caractersticas especficas del mikroC con el propsito de
facilitar la programacin de los microcontroladores PIC.
cc
'
-c
c
+-,
Como todos los microcontroladores, los de familia PIC tienen los registros de funciones
especiales (SFR). Para programar un PIC, es necesario acceder a estos registros (para leerlos
o escribir en ellos). Al utilizar el compilador mikroC PRO for PIC es posible de acceder a
cualquier SFR del microcontrolador de cualquier parte del cdigo (los SFR se consideran como
variables globales) sin necesidad de declararlo anteriormente. Los registros de funciones
especiales se definen en un archivo externo e incluido dentro del compilador (archivo .def).
Este archivo contiene todos los SFR del microcontrolador PIC a programar.
#<
(
( '(
' H0/;O ( * (
(
+#<
(
( '(
H0/;O ( '
cc
%(
El compilador mikroC PRO for PIC le permite acceder a los bits individuales de variables de 8
bits por su nombre o su posicin en byte:
#%+< H
*( %3;$03
'%+4 H
*( "8$03
Para acceder a un bit individual, se puede utilizar '.FX' as como '.BX' (X es un entero entre 0 y
7 que representa la posicin de bit).
%
Si quiere declarar una variable que corresponde a un bit de un SFR, hay que utilizar el tipo sbit.
Una variable de tipo sbit se comporta como un puntero y se debe declarar como una variable
global:
< ' +#< OD<H"/"8" (!
( $
D
OD<H"/"8" !
H0/;"O
$
D
H0/;"O !
OD<H"/"8"
,
En este ejemplo, El Botn_PARADA es una variable declarada por el usuario, mientras que
PORTA.B7 (bit 7 del puerto PORTA) ser automticamente reconocido por el compilador.
%
El compilador mikroC PRO for PIC proporciona un tipo de datos bit que se puede utilizar para
declarar variables. No se puede utilizar en las listas de argumentos, punteros y los valores
devueltos de funciones. Adems, no es posible declarar e inicializar una variable de tipo bit en
la misma lnea. El compilador determina el bit en uno de los registros disponibles para
almacenar las variables.
,
' !
. ,
' !
3 - '(
'
+//0/ A
D
4D (! '
8
D
4D !
(
c'
c
A veces el proceso de escribir un programa en C requiere las partes del cdigo escritas en
ensamblador. Esto permite ejecutar las partes complicadas 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 utilizar el cdigo ensamblador en
la parte del programa que controla la duracin de pulsos.
Una o ms instrucciones en ensamblador estn insertadas en el programa escrito en C,
utilizando el comando :
(
,
-c
c
Una interrupcin detiene la ejecucin normal de un programa para ejecutar las operaciones
especficas. Una lista de sentencias a ejecutar debe estar escrita dentro de una funcin
particular denominada interrupt(). La sintaxis de una interrupcin en mikroC se parece a lo
siguiente:
(
"
'
( 'D
(
# 4 H
;9/%E
,
%
<
Usted probablemente ha notado que en los ejemplos anteriores hemos utilizado algunas
funciones como son 'Delay_ms', 'LCD_out', 'LCD_cmd' etc. Estas funciones estn definidas en
las libreras contenidas en el compilador mikroC.
Una librera representa un cdigo compilado, anteriormente escrito en mikroC, que contiene un
conjunto de variables y funciones. Cada librera tiene un propsito especfico. Por ejemplo, la
librera LCD contiene funciones de visualizacin de la pantalla LCD, mientras
queC_math proporciona algunas funciones matemticas.
Antes de utilizar alguna de ellas en el programa, es necesario comunicrselo al compilador al
marcarlas en la lista de las libreras del compilador existentes. Si el compilador encuentra una
funcin desconocida durante la ejecucin de programa, primero va a buscar su declaracin en
las libreras marcadas.
Aparte de las libreras existentes, es posible crear las libreras y luego utilizarlas en el
programa. El procedimiento de cmo crear libreras se describe en detalles en Help (Ayuda) del
compilador.
El compilador mikroC incluye tres tipos de libreras:
- libreras ANSI C estndar:
%<
c c
- libreras miscelneas:
%<
c c
Button Library
Conversion Library
Sprint Library
PrintOut Library
Time Library
Trigonometry Library
Setjmp Library
c c
ADC Library
CAN Library
CANSPI Library
Utilizada para las operaciones con el mdulo CAN externo (MCP2515 o MCP2510)
EEPROM Library
EthernetPIC18FxxJ60 Library
Utilizada para las operaciones con el mdulo LCD grfico con resolucin 128x64
I2C Library
Utilizada para las operaciones con el mdulo de comunicacin serial I2C incorporado
Keypad Library
Lcd Library
Utilizada para las operaciones con las tarjetas multimedia MMC flash
Utilizada para las operaciones con los circuitos utilizando la comunicacin serial
PS/2 Library
PWM Library
RS-485 Library
Utilizada para las operaciones con los mdulos utilizando la comunicacin serial RS485
Sound Library
SPI Library
Utilizada para la comunicacin SPI de 4 bits con el LCD (de 2x16 caracteres)
UART Library
Dc-c
Antes que nada, usted debe instalar el compilador (con su IDE) en la PC. La instalacin
del mikroC 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? De eso vamos a hablar ms tarde. Por ahora,
basta con saber que es un software autnomo utilizado para cargar el programa en el
microcontrolador.
Una vez ms: Next, OK, Next, Next...
Una vez completada la instalacin del PICflash, el sistema operativo le preguntar a instalar
otro programa similar, un software para programar un grupo especial de los microcontroladores
PIC que funcionan en modo de bajo consumo (3.3 V). Salte este paso...
Pulse sobre Yes.
Un controlador es un programa que permite al sistema operativo comunicar con un perifrico.
En este caso, este dispositivo es el programador (hardware) del sistema de desarrollo.
El controlador a instalar depende del sistema operativo utilizado. Seleccione el controlador
correspondiente al SO (sistema operativo) utilizado (por medio de abrir la carpeta
correspondiente) e inicie la instalacin. Otra vez, Next, OK, Next, Next... Bueno, todo est
instalado para iniciar a programar!
cc
<cc
Dc-c
Al iniciar el IDE del compilador mikroC 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
mikroC PRO for PIC. De todos modos, para obtener ms informacion presione el botn de
Ayuda (Help) [F1].
)
c
Antes de empezar a escribir el cdigo, usted debe crear un proyecto. Un programa escrito en el
compilador mikroC PRO for PIC no es un archivo fuente autnomo, sino que forma parte de un
proyecto que incluye un cdigo hex, un cdigo ensamblador, cabecera y otros archivos.
Algunos de ellos se requieren para compilar el programa, mientras que otros se crean durante
el proceso de compilacin. Un archivo con extensin .mcppi le permite abrir cualquiera de estos
proyectos.
Para crear un proyecto, basta con seleccionar la opcin Project/New Project, y un wizard
aparecer automticamente. Qu hacer entonces? Siga las instrucciones...
c '
+
)
c,
Una vez creado el proyecto, es posible manejar todos los archivos que contiene al utilizar la
ventana Project Manager. Basta con pulsar con el botn derecho del ratn sobre una carpeta y
seleccionar la opcin que necesita para su proyecto.
c
'+c-'c
)
c,
'HYLFHGLVSRVLWLYR
Al seleccionar el tipo de microcontrolador a utilizar permite al compilador extraer el archivo de
definicin (archivo .def) asociado. El archivo de definicin de un microcontrolador contiene las
informaciones especficas 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.
2VFLOODWRURVFLODGRU
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.
%XLOG'HEXJJHU7\SH
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.
: 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.
c
21: Al elegir esta opcin, 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. El archivo .hex generado contiene los datos adicionales que permiten el
funcionamiento del depurador. 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 de un microcontrolador real.
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.
%) ''+
%
<,
El compilador tiene que conocer todas las dependencias de su archivo fuente en mikroC para
compilarlo apropiadamente. Por ejemplo, si las libreras forman parte de su proyecto, debe
especificar cules de ellas se utilizan.
Las libreras contienen un gran nmero de funciones listas para ser utilizadas. Las libreras en
mikroC proporcionan muchas facilidades para escribir programas para los microcontroladores
PIC. Abra la ventana Library anager, 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 Rinclude.
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 (Lcd_Cmd, LCD_Init...) 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.
Al escribir un programa, no espere que termine la redaccin del programa para compilarlo.
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 (ver la
prxima seccin). De este modo, resulta ms fcil solucionar los errores de programa para no
tomar un camino errneo en redactar su programa. De lo contrario, usted tendr que editar el
programa entero.
c
&
+
&
c',
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.
c )c
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 hay dos errores y una advertencia: faltan un punto y coma y una
declaracin de variable La advertencia le informa que falta el tipo del valor devuelto de la
funcin main.
La compilacin le permite corregir su programa por medio de solucionar todos los errores en
mikroC. 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.
'
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. 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.
Para iniciar la depuracin, pulse sobre la opcin Gtart 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
c
Hay varios comandos disponibles para depurar el cdigo:
+%
D,
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 ejecutar la parte de programa desde la lnea en la que est el cursor hasta el
punto de ruptura, utilice el comando Run/Pause Debugger.
(
?c(
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
un microcontrolador real. 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
la lista de variables y registros durante el proceso de la depuracin.
?c+c
,
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.
'
cc
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:
Se puede reprogramar el microcontrolador tantas veces como se necesite.
c
El compilador mikroC 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.
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.
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.
(
cc
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.
'
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.
cc cc
+cc
c
-
,
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)...
'
%c'>-c
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...
n cdigo generado que utiliza herramientas para controlar los visualizadores LCD y lLCD
contiene funciones de la librera Lcd. Gi las utiliza en el programa, no se olvide de marcar la
caja de chequeo junto a esta librera en la ventana Library anager. As el compilador ser
capaz de reconocer estas funciones correctamente
*cc
<c%>c
cH-JJI
@ c
Calibrado de fbrica
14 canales
resolucin de 10 bits
9
?
9
B
"GH25
Consumo: 220uA (2.0V, 4MHz), 11uA (2.0 V, 32 KHz) 50nA (en modo de espera)
M
+ ,
cc
La mayora de los pines del microcontrolador PIC16F887 son multipropsito como se muestra
en la figura anterior. Por ejemplo, la asignacin RA3/AN3/Vref+/C1IN+ para el quinto pin del
microcontrolador indica que ste dispone de las siguientes funciones:
La funcionalidad de los pines presentados anteriormente es muy til puesto que permite un
mejor aprovechamiento de los recursos del microcontrolador sin afectar a su funcionamiento.
Estas funciones de los pines no se pueden utilizar simultneamente, sin embargo se pueden
cambiar en cualquier instante durante el funcionamiento.
Las siguientes tablas se refieren al microcontrolador DIP de 40 pines.
c
c
+c,
Con el propsito de explicar en forma clara y concisa, sin describir profundamente el
funcionamiento de la CPU, vamos a hacer constar que la CPU est fabricada con la tecnologa
RISC ya que esto es un factor importante al decidir qu microcontrolador utilizar.
RISC es un acrnimo derivado del ingls Reduced Instruction Get Computer, lo que
proporciona al PIC16F887 dos grandes ventajas:
La CPU cuenta con slo 35 instrucciones simples. Cabe decir que para poder
programar otros microcontroladores en lenguaje ensamblador es necesario
saber ms de 200 instrucciones
El tiempo de ejecucin es igual para casi todas las instrucciones y tarda 4
ciclos de reloj. La frecuencia del oscilador se estabiliza por un cristal de cuarzo.
Las instrucciones de salto y de ramificacin tardan ocho ciclos de reloj en
ejecutarse. Esto significa que si la velocidad de operacin del microcontrolador
es 20 MHz, el tiempo de ejecucin de cada instruccin ser 200nS, o sea, el
programa ejecutar 5millones de instrucciones por segundo!
El PIC16F887 tiene tres tipos de memoria: ROM, RAM y EEPROM. Como cada una tiene las
funciones, caractersticas y organizacin especficas, vamos a presentarlas por separado.
La memoria ROM se utiliza para guardar permanente el programa que se est ejecutando. Es
la razn por la que es frecuentemente llamada memoria de programa. El PIC16F887 tiene
8Kb de memoria ROM (en total 8192 localidades). Como la memoria ROM est fabricada con
tecnologa FLASH, su contenido se puede cambiar al proporcionarle un voltaje de
programacin especial (13V).
No obstante, no es necesario explicarlo en detalles puesto que se realiza automticamente por
un programa especial en la PC y un simple dispositivo electrnico denominado programador.
Similar a la memoria de programa, el contenido de memoria EEPROM est permanentemente
guardado al apagar la fuente de alimentacin. Sin embargo, a diferencia de la ROM, el
contenido de la EEPROM se puede cambiar durante el funcionamiento del microcontrolador. Es
la razn por la que esta memoria (256 localidades) es perfecta para guardar permanentemente
algunos resultados creados y utilizados durante la ejecucin del programa.
Es la tercera y la ms compleja parte de la memoria del microcontrolador. En este caso
consiste en dos partes: en registros de propsito general y en los registros de funciones
especiales (SFR). Todos estos registros se dividen en cuatro bancos de memoria de los que
vamos a hablar ms tarde en este captulo.
A unque los dos grupos de registros se ponen a cero al apagar la fuente de alimentacin,
adems estn fabricados de la misma forma y se comportan de la manera similar, sus
funciones no tienen muchas cosas en comn.
'
'
Los registros de propsito general se utilizan para almacenar los datos temporales y los
resultados creados durante el funcionamiento. Por ejemplo, si el programa realiza el conteo (de
los productos en una cadena de montaje), es necesario tener un registro que representa lo que
en la vida cotidiana llamamos suma. Como el microcontrolador no es nada creativo, es
necesario especificar la direccin de un registro de propsito general y asignarle esa funcin.
Se debe crear un programa simple para incrementar el valor de este registro por 1, despus de
que cada producto haya pasado por el sensor.
Ahora el microcontrolador puede ejecutar el programa ya que sabe qu es y dnde est la
suma que se va a incrementar. De manera similar, a cada variable de programa se le debe preasignar alguno de los registros de propsito general.
'
-c
c
+-,
Los registros de funciones especiales son tambin parte de la memoria RAM. A diferencia de
los registros de propsito general, su propsito es predeterminado durante el proceso de
fabricacin y no se pueden cambiar. Como los bits estn conectados a los circuitos particulares
en el chip (convertidor A/D, mdulo de comunicacin serial, etc), cualquier cambio de su
contenido afecta directamente al funcionamiento del microcontrolador o de alguno de los
circuitos.
Por ejemplo, el registro ADCON0 controla el funcionamiento del convertidor A/D. Al cambiar los
bits se determina qu pin del puerto se configurar como la entrada del convertidor, el
momento del inicio de la conversin as como la velocidad de la conversin.
Otra caracterstica de estas localidades de memoria es que tienen nombres (tanto los registros
como sus bits), lo que simplifica considerablemente el proceso de escribir un programa. Como
el lenguaje de programacin de alto nivel puede utilizar la lista de todos los registros con sus
direcciones exactas, basta con especificar el nombre de registro para leer o cambiar su
contenido.
%c
La memoria RAM est dividida en cuatro bancos. Antes de acceder a un registro al escribir un
programa (para leer o cambiar su contenido), es necesario seleccionar el banco que contiene
ese registro. Ms tarde vamos a tratar dos bits del registro STATUS utilizados para seleccin
del banco. Para simplificar el funcionamiento, los SFR utilizados con ms frecuencia tienen la
misma direccin en todos los bancos, lo que permite accederlos con facilidad.
Trabajar con bancos puede ser difcil slo si se escribe un programa en lenguaje ensamblador.
Al utilizar el lenguaje de programacin de alto nivel como es C y el compilador como es mikroC
PRO for PIC, basta con escribir el nombre del registro. A partir de esa informacin, el
compilador selecciona el banco necesario. Las instrucciones apropiadas para la seleccin del
Una parte de la RAM utilizada como pila consiste de ocho registros de 13 bits. Antes de que el
microcontrolador se ponga a ejecutar una subrutina (instruccin CALL) o al ocurrir una
( %
( (
$D
* (
, E
( (
##
O( /H - /H
( (
*
##
<
c
Al aparecer una peticin de interrupcin lo primero que hace el microcontrolador es ejecutar la
instruccin actual despus de que se detiene el proceso de ejecucin de programa. Como
resultado, la direccin de memoria de programa actual se apila automticamente y la direccin
por defecto (predefinida por el fabricante) se escribe en el contador de programa. La localidad
en la que el programa contina con la ejecucin se le denomina vector de interrupcin. En el
mikroC reconoce una rutina de interrupcin que se ejecutar como la funcin
| . El cuerpo de la funcin, o sea, rutina de interrupcin, debe ser escrito por el
usuario.
( %'
%' ((
-
,
c94 1-
Supongamos que usted ha comprado ya un microcontrolador y que tiene una buena idea de
cmo utilizarlo... La lista de los registros SFR as como de sus bits es muy larga. Cada uno
controla algn proceso. En general, parece como una gran tabla de control con un gran nmero
de instrumentos e interruptores. Ahora est preocupado de cmo conseguir aprender acerca
de todos ellos? Es poco probable, pero no se preocupe, Usted no tiene que hacerlo! Los
microcontroladores son tan potentes que se parecen a los supermercados: ofrecen tantas
cosas a bajos precios y a usted solo le toca elegir las que necesita. Por eso, seleccione el
campo en que est interesado y examine slo lo que necesita. Cuando entienda
completamente el funcionamiento de hardware, examine los registros SFR encargados de
controlarlo (normalmente son unos pocos).
Como todos los dispositivos tienen un tipo de sistema de control el microcontrolador tiene sus
"palancas" con las que usted debe estar familiarizado para ser capaz de utilizarlos
correctamente. Por supuesto, estamos hablando de los registros GFR desde los que el proceso
de programacin se inicia y en los que el mismo termina.
*"c
'-
El siguiente texto describe los principales registros SFR del microcontrolador PIC16F887. Los
bits de cada registro controlan los circuitos diferentes dentro del chip, as que no es posible
clasificarlos en grupos especiales. Por esta razn, se describen junto con los procesos que
controlan.
1
L
% c c (
Banco 0
Banco 1
Banco 2
Banco 3
/=/
=2+2
1
,
de bajo consumo.
;/;2+2,
- Hubo acarreo del cuarto bit de orden bajo (nibble bajo) en el resultado.
L - No hubo acarreo del cuarto bit de orden bajo (nibble bajo) en el resultado.
1O
'
El registro OPTION_REG contiene varios bits de control para configurar el pre - escalador del
Temporizador 0/WDT, el temporizador Timer0, la interrupcin externa y las resistencias pull-up
en el puerto PORTB.
%/%
22+ %,
- Desactivadas.
L - Activadas.
'/
12+2
8 3
9A ,
L
/ L
12 (bit selector de tipo de flanco en TOCKI)
selecciona el flanco (ascendente o descendente) contado por el temporizador
Timer0 por el pin RA4/T0CKI.
L
L
?
1:2
1:1
1:4
1:2
1:8
1:4
1:16
1:8
1:64
1:32
1:128
1:64
1:256
1:128
Para conseguir el valor del divisor de frecuencia 1:1 cuando el temporizador Timer0 cuenta
pulsos, el preescalador debe ser asignado al WDT. En consecuencia, el temporizador Timer0
no utiliza el pre-escalador, sino que cuenta directamente los pulsos generados por el oscilador,
lo que era el objetivo.
( 6 Nc
#
$>/X8; ( ?F
X8;
I # 6 9Y47
(
+ #+) H(
(! (*
X8; 6SI7
%&='# $
(
'
X8;
+
' ((
(
( $>/X8;
I (*
(
6I 7
%&='# $
(
'
X8;
+
' ((
(
( $>/X8;
I (*
(
6I 7
%&='# $
(
'
X8;
,
'
c
Al llegar la peticin de interrupcin, no significa que una interrupcin ocurrir automticamente,
puesto que debe ser habilitada por el usuario (por el programa) tambin. Por esta razn, hay
bits especiales utilizados para habilitar o deshabilitar interrupciones. Es fcil de reconocerlos
por las letras IE contenidas en sus nombres (Interrupt Enable - Interrupcin habilitada).
Adems, cada interrupcin se asocia con otro bit denominado bandera que indica que una
peticin de interrupcin ha llegado sin verificar si est habilitada. Asimismo, se reconocen con
facilidad por las dos ltimas letras contenidas en sus nombres - IF (Interrupt Flag - Bandera de
interrupcin).
Como hemos visto, toda la idea es muy simple y eficiente. Al llegar la peticin de interrupcin,
primero el bit de bandera se pone a uno.
Si el bit IE apropiado est a cero (0), esta condicin ser ignorada completamente. De lo
contrario, ocurre una interrupcin. Si varias fuentes de interrupcin estn habilitadas, es
necesario detectar la activa antes de que la rutina de interrupcin se ponga a ejecutar. La
deteccin de la fuente se realiza al comprobar los bits de las banderas.
Cabe destacar que los bits de cada bandera no se ponen a cero automticamente, sino por el
software, mientras que la ejecucin de la rutina de interrupcin contina ejecutndose. Si no
hacemos caso a este detalle, ocurrir otra interrupcin inmediatamente despus de volver al
programa principal, aunque no hay ms peticiones de ejecucin. Simplemente, la bandera, as
como el bit IE, se quedan en uno.
Todas las fuentes de interrupcin tpicas para el microcontrolador PIC16F887 se muestran en
la siguiente pgina. Fjese en lo siguiente:
El bit '
habilita/deshabilita simultneamente las interrupciones no enmascaradas.
El
2 habilita/deshabilita las interrupciones no enmascaradas de perifricos. Esto no se
refiere al temporizador Timer0 y a las fuentes de interrupcin del puerto PORTB.
Para habilitar una interrupcin causada por el cambio del estado lgico en el puerto PORTB, es
necesario habilitarla para cada bit por separado. En este caso, los bits del registro c% se
comportan como los bits IE de control.
1c
El registro INTCON contiene varios bits de habilitacin y de bandera para el desbordamiento en
el registro TMR0, e interrupciones por el cambio del estado en el puerto PORTB y las
interrupciones externas en el pin INT.
'
/'2
22 - (bit de habilitacin de interrupciones
globales) controla simultneamente t odas las fuentes de interrupciones
posibles.
/6
22 (bit de habilitacin de interrupciones
perifricas) es similar al bit GIE, sin embargo controla interrupciones habilitadas
por los perifricos. Eso significa que no influye en interrupciones causadas por
el temporizador Timer0 o por el cambio del estado en el puerto PORTB o por el
cambio en el pin RB0/INT.
L
/ L38=
22 (bit de habilitacin de
interrupciones por el desbordamiento del temporizador Timer0) controla
interrupciones causadas por el desbordamiento del Timer0.
/%L.
A
22 (bit de habilitacin de la
interrupcin externa en RB0) controla inter rupciones causadas por el cambio
del estado lgico en el pin de entrada RB0/INT (interrupcin externa).
%
/%c6 1
22 (bit de habilitacin de
interrupciones por cambios en el puerto PORTB). Cuando se configuran como
entradas, los pines en el puerto PORTB pueden causar una interrupcin al
cambiar el estado lgico (no importa si se produce bajada o subida de tensin,
lo que importa es que se pr oduce un cambio). Este bit determina si una
interrupcin va a ocurrir.
-/%L.
A - 12 (bit de bandera de interrupcin
externa en INT) detecta el cambio en el estado lgico en el pin INT.
- Ha ocurrido una interrupcin externa por INT (esta bandera debe volverse a 0 por
software)
L - No ha ocurrido una interrupcin externa por INT.
(
D*
' H0/;O
1
El registro PIE1 contiene los bits de habilitacin de interrupciones perifricas.
/.c3
22+2
6 2 9
3
.,
c
/
3
22+2
6 2 9
9
,
&
/
22+2
6 2 9
9
,
/ 56 + ,
22 - (bit
de habilitacin de la interrupcin del puerto serie sncrono maestro (MSSP)
habilita generar una peticin de interrupcin despus de cada transmisin de
datos por el mdulo de comunicacin serie sncrona (modo SPI o I2C).
cc
/cc
22 (bit de habili tacin de la interrupcin del
mdulo 1 de Comparacin/Captura/PWM - CCP1) permite generar una peticin
de interrupcin en el mdulo CCP1 utilizado para procesamiento de la seal
PWM.
"
/ "" 6
22+2
6 2 9
9
1
"5",
/ 38=
22 (bit de habilitacin de la
interrupcin de desbordamiento del temporizador Timer1) habilita generar una
peticin de interrupcin despus de cada desbordamiento en el registro del
temporizador Timer1, o sea el contador se pone a cero.
1
"
El registro PIE2 tambin contiene varios bits de habilitacin de interrupciones.
-
/ -
22+2
6 2 9
9
8
,
c"
/c c"
22+2
6 2 9
9
c",
c
/c c
22+2
6 2 9
9
c,
/
,
%c
/%c
22+2
6 2 9
9
9
2,
?
/ =/=? N/
22+2
6 2 9
9
2 B /
3 9,
cc"
/cc"
22+2
6 2 9
9
9
"
c 9.c .? +cc",
*
(
% %+%%;% %+%%; +
' /" ( (
' (
$
% Y
'D
'
$%3;
%+) %'D *
(!
% %+%+ $'
$ (!
1
El registro PIR1 contiene los bits de banderas de interrupcin.
- Se ha completado una conversin A/D (el bit debe volverse a 0 por software)
c-/
3- 12+2
2
9
9
,
- El bfer de recepcin del EUSART est lleno. El bit se pone a cero al leer el registro
RCREG.
&-/
- 12+2
9
9
,
- El bfer de transmisin del EUSART est vaco. El bit se pone a cero al esribir un
dato en el registro TXREG.
- Se ha producido igualdad con el valor del TMR2 (registro de 8 bits del temporizador) y
el valor del PR2. El bit debe ponerse a cero por software antes de volver de la rutina de
servicio de interrupciones).
- Se ha producido desbordamiento del Timer1. El bit debe ponerse a cero por software.
1"
El registro PIR2 contiene los bits de banderas da la interrupcin.
- La salida del comparador analgico C2 ha sido cambiada (el bit C2OUT). El bit debe
ponerse a cero por software.
- La salida del comparador analgico C1 ha sido cambiada (el bit C1OUT). El bit debe
ponerse a cero por software.
-/
,
- Se ha cumplido la condicin de salir del modo de ultra bajo consumo. El bit debe
ponerse a cero por software.
1c
El registro PCON contiene solamente dos bits de banderas utilizados para diferenciar entre un
Power-on reset (POR), un Brown-out reset (BOR), un reinicio por el temporizador perro
guardin (WDT) y un reinicio externo por el pin MCLR.
?
/ =/=? N/
22+2
6 2 9
2 B / 3 9,
%
/8= %
22+2
6 2 9
%
8= ,
L - Se ha producido Power - on reset. El bit debe ponerse a uno por software despus de
que se haya producido un Power - on reset.
L - Se ha producido Brown - out reset. El bit debe ponerse a uno por software despus
de que se haya producido Brown - out reset.
'c)c
La memoria de programa del PIC16F887 es de 8K y tiene 8192 localidades para el
almacenamiento de programa. Por esta razn, el contador de programa debe de ser de 13 bits
de anchura (213 = 8192). Para habilitar el acceso a una localidad de memoria de programa
durante el funcionamiento del microcontrolador , es necesario acceder a su direccin por medio
de los registros SFR. Como todos los registros SFR son de 8 bits de anchura, este registro de
direccionamiento es creado artificialmente al dividir los 13 bits en dos registros
independientes, PCLATH y PCL. Si la ejecucin de programa no afecta al contador de
programa, el valor de este registro va incrementndose automtica y constantemente: +1, +1,
+1, +1... De esta manera, el programa se ejecuta como est escrito - instruccin a instruccin,
seguido por un incremento de direccin constante.
Si el contador de programa ha sido cambiado por software, debe tomar en cuenta lo siguiente
para evitar problemas:
Los ocho bits inferiores (el byte inferior) del regis tro PCL son de
lectura/escritura, mientras que los cinco bits superiores del registro PCLATH
son de slo escritura.
El registro PCLATH se borra con cada reinicio.
En el lenguaje ensamblador, el valor del contador de programa est marcado
con PCL y se refiere slo a los ocho bits. Usted debe tener cuidado al utilizar la
instruccin
''=4 %&
. Esto es una instruccin de salto que especifica la
localidad destino al aadir un nmero a la direccin actual. Se utiliza con
frecuencia para saltar a la tabla de bsqueda o a la tabla de ramificacin de
programa y leerlas. Un problema surge si la direccin actual es de tal tamao
que al sumar se produce un cambio en un bit que pertenece al byte superior
del registro PCLATH.
La ejecucin de una instruccin sobre el registro PCL causa simultneamente
la sustitucin de los bits del contador de programa por los contenidos en el
registro PCLATH. De todos modos, el registro PCL puede acceder slo a 8 bits
inferiores del resultado de la instruccin, pues el siguiente salto ser
completamente incorrecto. La solucin a este problema es poner estas
instrucciones en las direcciones que terminan en xx00h. De esta manera se
habilitan los saltos de programa hasta 255 localidades. Si se ejecutan los saltos
ms largos por medio de e sta instruccin, el registro PCLATH debe ser
incrementado por 1 cada vez que se produce desbordamiento en el registro
PCL.
Al llamar una subrutina o al ejecutarse un salto (instrucciones c y ), el
microcontrolador es capaz de proporcionar solamente direccionamiento de 11
bits. Similar a la RAM que est dividida en bancos, la ROM est dividida en
las cuatro pginas de 2K cada una. Las instrucciones dentro de estas pginas
se ejecutan regularmente. Dicho de manera sencilla, como el procesador est
proporcionado con una direccin de 11 bits del programa, es capaz de
direccionar cualquier localidad dentro de 2KB. La siguiente figura muestra el
salto a la direccin del subprograma PP1.
Sin embargo, si una subrutina o una direccin de salto no est en la misma pgina que la
localidad de salto, se deben proporcionar dos bits superiores que faltan al escribir en el registro
PCLATH. La siguiente figura muestra el salto a la direccin de la subrutina PP2.
'
cc
c
Adems del direccionamiento directo, que es lgico y claro (basta con especificar la direccin
de un registro para leer su contenido), este microcontrolador es capaz de realizar el
direccionamiento indirecto por los registros INDF y FSR. A veces esto facilita el proceso de
escribir un programa. El procedimiento entero est habilitado ya que el registro INDF no es real
(no existe fsicamente), sino que solamente especifica el registro cuya direccin est situada en
el registro FSR. Por esta razn, escribir o leer los datos del registro INDF realmente significa
escribir o leer del registro cuya direccin est situada en el registro FSR. En otras palabras,
direcciones de registros se especifican en el registro FSR, y su contenido se almacena en el
registro INDF. La diferencia entre el direccionamiento directo e indirecto se muestra en la
siguiente figura:
Como hemos visto, el problema con "los bits de direccionamiento que faltan" se soluciona con
un "prstamo" del otro registro. Esta vez, es el sptimo bit, denominado bit IRP del registro
STATUS.
**
.
Con el propsito de sincronizar el funcionamiento de los puertos de E/S con la organizacin
interna del microcontrolador de 8 bits, ellos se agrupan, de manera similar a los registros, en
cinco puertos denotados con A, B, C, D y E. Todos ellos tienen las siguientes caractersticas en
comn:
Por las razones prcticas, muchos pines de E/S son multifuncionale s. Si un pin
re aliza una de estas funciones, puede ser utilizado como pin de E/S de
propsito general.
Cada puerto tiene su propio registro de control de flujo, o sea el registro TRIS
correspondiente: TRISA, TRISB, TRISC etc. lo que determina el
comportamiento de bits del puerto, pero no determina su contenido.
Al poner a cero un bit del registro TRIS (pin=0), el pin correspondiente del puerto se configurar
como una salida. De manera similar, al poner a uno un bit del registro TRIS (bit=1), el pin
correspondiente del puerto se configurar como una entrada. Esta regla es fcil de recordar: 0
= Entrada 1 = Salida.
51
El puerto PORTA es un puerto bidireccional, de 8 bits de anchura. Los bits de los registros
TRISA y ANSEL controlan los pines del PORTA. Todos los pines del PORTA se comportan
como entradas/salidas digitales. Cinco de ellos pueden ser entradas analgicas (denotadas por
AN):
?
El microcontrolador se utiliza generalmente en los dispositivos que funcionan peridicamente y
completamente independiente utilizando una fuente de alimentacin de batera. En tal caso, el
consumo de corriente mnimo es una de las prioridades. Los ejemplos tpicos de tales
aplicaciones son: termmetros, sensores de deteccin del fuego y similar. Es conocido que al
reducir frecuencia de reloj se reduce el consumo de corriente, pues una de las soluciones ms
convenientes a este problema es bajar la frecuencia de reloj, o sea utilizar el cristal de cuarzo
de 32KHz en vez de el de 20MHz.
Al poner el microcontrolador en el modo de reposo es otro paso en la misma direccin. An ha
quedado el problema de salir de este modo y poner el microcontrolador en modo normal de
funcionamiento. Es obviamente necesario tener una seal externa en alguno de los pines. Esta
seal debe ser generada por componentes electrnicos adicionales, lo que resulta en un
consumo de energa ms alto del dispositivo completo...
La solucin perfecta sera que el microcontrolador saliera del modo de reposo peridicamente
por si mismo, lo que no es imposible. El circuito que lo habilita se muestra en la figura a la
izquierda.
El principio de funcionamiento es simple:
Un pin se configura como salida y se le lleva un uno lgico (1). Esto causa una carga del
capacitor. Inmediatamente despus, el mismo pin se configura como entrada. El cambio de
estado lgico habilita una interrupcin y el microcontrolador entra en modo de reposo. Slo ha
quedado esperar que se descargue el capacitor por la corriente de fuga fluyendo por el pin de
entrada. Despus de la descarga, se produce una interrupcin y el microcontrolador contina
con la ejecucin de programa en modo normal. Todo el procedimiento se repite.
En teora, esto es una solucin perfecta. El problema es que todos los pines capaces de causar
una interrupcin son digitales y tienen una corriente de fuga relativamente alta cuando el voltaje
sobre ellos no est cerca de los valores lmites de Vdd (1) o VSS (0). En este caso, el
condensador se descarga en poco tiempo ya que la corriente es de varias centenas de
microamperios. Por esta razn se dise el circuito ULPWU, capaz de indicar una lenta cada
de voltaje con un consumo de corriente mnimo.
La salida genera una interrupcin, mientras que la entrada est conectada a uno de los pines
del microcontrolador. Es el pin RA0. Refirindose a la Figura (R=200 ohms, C=1nF), el tiempo
de descarga es aproximadamente 30mS, mientras que un consumo total de corriente del
microcontrolador es 1000 veces ms bajo (de varias centenas de nanoamperios).
%51%
El puerto PORTB es un puerto bidireccional, de 8 bits de anchura. Los bits del registro TRISB
determinan la funcin de sus pines.
Similar al puerto PORTA, un uno lgico (1) en el registro TRISB configura el pin apropiado en el
puerto PORTB y al revs. Los seis pines de este puerto se pueden comportar como las
entradas analgicas (AN). Los bits del registro ANSELH determinan si estos pines sern
configurados como entradas analgicas o entradas/salidas digitales:
RB0 = AN12 (determinado por el bit ANS12 del registro ANSELH)
Cada bit de este puerto tiene una funcin adicional relacionada a algunas unidades perifricas
integradas, que vamos a describir en los siguientes captulos.
Este puerto dispone de varias caractersticas por las que se distingue de otros puertos y por las
que sus pines se utilizan con frecuencia:
Todos los pines del puerto PORTB tienen las resistencias pull-up integradas,
que los hacen perfectos para que se conecten con los botones de presin (con
el teclado), interruptores y optoacopladores. Con el propsito de conectar las
resisitencias a los puertos del microcontrolador, el bit apropiado del registro
WPUB debe estar a uno.*
Adems de los bits del registro WPB, hay otro bit que afecta a la instalacin de las
resistencias pull-up. Es el bit RBP del registro OPTION_REl.
Al estar habilitado, cada bit del puerto PORTB configurado como una entrada
Gracias a estas caractersticas, los pines del puerto PORTB se utilizan con frecuencia para
comprobar los botones de presin en el teclado ya que detectan cada apretn de botn
infaliblemente. Por eso, no es necesario examinar todas las entradas una y otra vez.
Cuando los pines X,Y y Z se configuran como entradas de puesta a uno (1), slo se necesita
esperar una peticin de interrupcin que aparece al apretar un botn. Ms tarde, se comprueba
cul botn fue activado al combinar ceros y unos en las entradas.
( 6 Nc
%L.
El pin RB0/INT es la nica fuente verdadera de la interrupcin externa. Se puede configurar
de manera que reaccione al borde ascendente de seal (transicin de cero a uno) o al borde
descendente de seal (transicin de uno a cero). El bit INTEDG del registro OPTION_REG
selecciona la seal apropriada.
%H)%I
El PIC16F887 no dispone de ningn pin especial para la programacin (el proceso de escribir
un programa en la ROM). Los pines que generalmente estn disponibles como los pines de E/S
de propsito general, se utilizan para este propsito. Para decir con ms precisin, son los
pines del puerto PORTB utilizados para la transmisin de seal de reloj (RB6) y de datos (RB7)
al cargar el programa. Adems, es necesario suministrar el voltaje de alimentacin Vdd (5V) as
como el voltaje apropiado Vpp (12-14V) para la programacin de memoria FLASH. Durante la
programacin, el voltaje Vpp se aplica al pin MCLR. No se preocupe de los detalles
relacionados a este proceso, tampoco se preocupe de cul voltaje se aplica primero puesto que
los componentes del programador se encargan de eso. Lo que es muy importante es que el
programa se puede cargar al microcontrolador an despus de haber sido soldado en el
dispositivo destino. Por supuesto, el programa cargado se puede cambiar de la misma manera.
Esta funcin se le denomina ICSP (In-Circuit Serial Programming - Programacin serial en
circuito)
Para utilizarlo correctamente es necesario planificar con antelacin. Es pan comido! Slo es
necesario instalar un conector miniatura de 5 pines en el dispositivo destino para suministrar al
Como hemos visto, los voltajes aplicados a los pines del zcalo del programador son los
mismos que los utilizados durante la programacin ICSP.
c51c
El puerto PORTC es un puerto bidireccional, de 8 bits de anchura. Los bits del registro TRISC
determinan la funcin de sus pines. Similar a otros puertos, un uno lgico (1) en el registro
TRISC configura el pin apropiado del puerto PORTC como entrada.
Todas las funciones adicionales del puerto PORTC se describen en los siguientes captulos.
51
El puerto PORTD es un puerto bidireccional de 8 bits de anchura. Los bits del registro TRISD
determinan la funcin de sus pines. Similar a otros puertos, un uno lgico (1) en el registro
TRISD configura el pin apropiado del puerto PORTD como entrada.
51
El puerto PORTE es un puerto bidireccional, de 4 bits de anchura. Los bits del registro TRISE
determinan la funcin de sus pines. Similar a otros puertos, un uno lgico (1) en el registro
TRISE configura el pin apropiado del puerto PORTE como entrada.
1
5
Los registros ANSEL y ANSELH se utilizan para configurar el modo de entrada de un pin de
E/S como analgico o como digital.
La regla es la siguiente:
Para configurar un pin como una entrada analgica, el bit apropiado de los registros ANSEL o
ANSELH se debe poner a uno (1). Para configurar un pin como una entrada/salida digital, el bit
apropiado se debe poner a cero (0).
El estado lgico de los bits del registro ANSEL no tiene influencia en las funciones de salidas
digitales. Al intentar a leer un pin de puerto configurado como una entrada analgica, el
resultado es siempre 0.
Es probable que usted nunca vaya a escribir un programa que no utilice puertos, as que el
esfuerzo para aprender todo sobre ellos en definitiva vale la pena. De todos modos, los puertos
son probablemente los mdulos ms simples dentro del microcontrolador. Se utilizan de la
siguiente manera:
interrupcin con cada cambio de voltaje. Los bits de los registros IOCB e
INTCON se encargan de eso.
El microcontrolador PIC16F887 dispone de tres temporizadores/contadores independientes,
denominados Timer0, Timer1 y Timer2. En este captulo se presenta una descripcin detallada
de los mismos.
*C
;
L
El temporizador Timer0 tiene una amplia gama de aplicaciones en la prctica. Slo unos pocos
programas no lo utilizan de alguna forma. Es muy conveniente y fcil de utilizar en programas o
subrutinas para generar pulsos de duracin arbitraria, en medir tiempo o en contar los pulsos
externos (eventos) casi sin limitaciones.
El mdulo del temporizador Timer0 es un temporizador/contador de 8 bits con las siguientes
caractersticas:
Temporizador/contador de 8 bits;
Pre-escalador de 8 bits (lo comparte con el temporizador perro guardin);
Fuente de reloj interna o externa programable;
Generacin de interrupcin por desbordamiento; y
Seleccin del flanco de reloj externo programable.
La siguiente figura muestra el esquema del temporizador Timer0 con todos los bits que
determinan su funcionamiento. Estos bits se almacenan en el registro OPTION_REG.
1O
'
1 - Pines del puerto PORTB pueden estar conectados a las resistencias pull-up.
'/
12+2
8 3
9A ,
0 - Los pulsos se llevan a la entrada del temporizador/contador Timer0 por el pin RA4.
1 - El temporizador utiliza los pulsos de reloj internos (Fosc/4).
L
/ L
12+2
8 ,
El valor del divisor de frecuencias se ajusta al combinar estos bits. Como se muestra en
la tabla a la derecha, la misma combinacin de bits proporciona los diferentes valores del
divisor de frecuencias para el temporizador/contador y el temporizador perro guardin,
respectivamente.
"
L
L
?
1:2
1:1
1:4
1:2
1:8
1:4
1:16
1:8
1:32
1:16
1:64
1:32
1:128
1:64
1:256
1:128
( 6 Nc
Cuando el bit PSA est a 1, el pre-escalador se le asigna al temporizador perro guardin como
se muestra en la siguiente figura.
( 6 Nc
+ ( ?'
F
'(
6S 7 (
(*
'4
'
*
!
(
+ #+) H(
(
(*
X8; 6S 7
%&='# $
(
'
X8;
%&='# $
(
'
X8;
<6&#
<6&+ #+)
<6&#
<6&+ #+)
'=4+ #+)!=AZ H03+/>0# " $+/0 H0/ >" %3#;/:$$%B3 &Z >B@%$0&
+=4+ #+)
"
5
Reiniciar el registro TMR0 o escribir un valor conocido en l.
El tiempo transcurrido(en microsegundos al utilizar el oscilador de 4MHz ) se
La polaridad de pulsos a contar en el pin RA4 se selecciona por el bit TOSE del
*G
;
El mdulo del temporizador Timer1 es un temporizador/contador de 16 bits, lo que significa que
consiste en dos registros (TMR1L y TMR1H). Puede contar hasta 65535 pulsos en un solo
ciclo, o sea, antes de que el conteo se inicie desde cero.
Similar al temporizador Timer0, estos registros se pueden leer o se puede escribir en ellos en
cualquier momento. En caso de que ocurra un desbordamiento, se genera una interrupcin si
est habilitada.
El mdulo del temporizador Timer1 puede funcionar en uno o dos modos bsicos, eso es como
un temporizador o como un contador. A diferencia del temporizador Timer0, cada uno de estos
dos modos tiene funciones adicionales.
El temporizador Timer1 tiene las siguientes caractersticas:
cc
-
;
El bit TMR1CS del registro T1CON se utiliza para seleccionar la fuente de reloj para este
temporizador:
-
c
Fosc/4
T1CKI pin
/
c
;
El temporizador Timer1 tiene un escalador completamente separado que permite dividir la
frecuencia de entrada de reloj por 1,2,4 o 8. No es posible leer el pre-escalador o escribir en l
directamente. De todas formas, el contador del pre-escalador se pone a 0 automticamente
despus de escribir en los registros TMR1H o TMR1L.
c
;
Los pines RC0/T1OSO y RC1/T1OSI se utilizan para registrar los pulsos que vienen de los
dispositivos perifricos, pero tambin tienen una funcin adicional. Como se puede ver en la
siguiente figura, se configuran simultneamente como entrada (pin RC1) y salida (pin RC0) del
oscilador de cuarzo LP (Low Power - de bajo consumo) adicional. Este circuito est
principalmente diseado para funcionar a bajas frecuencias (hasta 200 KHz), exactamente para
el uso de cristal de cuarzo de 32.768 KHz. Este cristal se utiliza en los relojes de cristal puesto
que es fcil de obtener un pulso de duracin de un segundo al dividir esta frecuencia.
Como el oscilador no depende del reloj interno, puede funcionar incluso en el modo de reposo.
Se habilita al poner a uno el bit de control T1OSCEN del registro T1CON. El usuario debe
proporcionar tiempo muerto por medio de software (unos pocos milisegundos) para habilitar
que el oscilador se inicie apropiadamente.
La siguiente tabla muestra los valores recomendados de los capacitores convenientes con el
oscilador de cuarzo. No es necesario que estos valores sean exactos. De todas formas, la regla
general es: cunto ms alta sea la capacidad, tanto ms alta ser la estabilidad, lo que a la vez
prolonga el tiempo necesario para la estabilizacin del oscilador.
c
LP
-
c
c
c
c"
32 kHz
33 pF
33 pF
100 kHz
15 pF
15 pF
200 kHz
15 pF
15 pF
Una seal generada por este oscilador de cuarzo est sincronizada con el reloj
del microcontrolador al poner a 0 el bit T1SYNC. En este caso, el temporizador
no puede funcionar en modo de reposo porque el circuito para sincronizacin
utiliza el reloj del microcontrolador.
La interrupcin por desbordamiento en el registro del temporizador Timer1
puede estar habilitada. Si el bit T1SYNC se pone a 1, tales interrupc iones se
producirn en el modo de reposo tambin.
c
;
El pin TG1 o la salida del comparador C2 pueden ser una fuente de los pulsos que pasan por la
compuerta del temporizador Timer1. Se configuran por software. Esta compuerta permite que
el temporizador mida directamente la duracin de los eventos externos al utilizar el estado
lgico del pin T1G o los eventos analgicos al utilizar la salida del comparador C2. Refirase a
la Figura en la pgina anterior. Para medir duracin de seal, basta con habilitar esta
compuerta y contar los pulsos que pasan por ella.
;
Para seleccionar este modo, es necesario poner a 0 el bit TMR1CS. Despus de eso, el
registro de 16 bits ser incrementado con cada pulso generado por el oscilador interno. Si se
utiliza el cristal de cuarzo de 4 MHZ, el registro ser incrementado cada microsegundo.
En este modo, el bit T1SYNC no afecta al temporizador porque cuenta los pulsos de reloj
interno. Como todos los dispositivos utilizan estos pulsos, no hace falta sincronizarlos.
c
El temporizador Timer1 se pone a funcionar como un contador al poner a 1 el bit TMR1CS.
Este bit cuenta los pulsos llevados al pin PC0/T1CKI y se incrementa en el flanco ascendente
de la entrada del reloj externo T1CKI. Si el bit de control T1SYNC del registro T1CON se pone
a 0, las entradas del reloj externo se sincronizarn en su camino al temporizador Timer1. En
otras palabras, el temporizador Timer1 se sincroniza con el reloj interno del microcontrolador y
se le denomina contador sncrono.
Al poner en modo de reposo el microcontrolador que funciona de esta manera, los registros del
temporizador Timer1H y TMR1L no sern incrementados aunque los pulsos de reloj aparezcan
en los pines de entrada. Como el reloj interno del microcontrolador no funciona en este modo,
no hay entradas de reloj que se utilicen para la sincronizacin. De todas formas, el preescalador sigue funcionando siempre que haya pulsos de reloj en los pines, porque es un
simple divisor de frecuencias.
Este contador detecta un uno lgico (1) en los pines de entrada. Cabe destacar que al menos
un flanco ascendente debe ser detectado antes de empezar a contar los pulsos. Refirase a la
Figura a la izquierda. Las flechas en la figura indican los incrementos del contador.
1c
'( - Timer1 Gate Invert bit (Bit inversor de la compuerta del temporizador1) se comporta
como un inversor del estado lgico en la compuerta formada por el pin T1G o la salida
(C2OUT) del comparador C2. Este bit habilita al temporizador para con tar los pulsos cuando la
compuerta est a alto o a bajo.
1 - Temporizador 1 cuenta los pulsos cuando el pin T1G o el bit C2OUT estn a
alto (1).
0 - Temporizador 1 cuenta los pulsos cuando el pin T1G o el bit C2OUT estn a
bajo (0).
'
- Timer1 Gate Enable bit (Bit de habilitacin de la compuerta del temporizador1)
determina si la compuerta formada por el pin T1G o salida del comparador C2 (C2OUT) estar
activa o no. Este bit es funcional slo en caso de que el temporizador Timer1 est encendido
(el bit TMR1ON = 1). De lo contrario, este bit se ignora.
1 - Temporizador Timer1 est encendido slo si la compuerta no est activa.
cD$cDL - Timer1 Input Clock Prescale Select bits (Bits de seleccin del
preescalador de seal de reloj del Temporizador1) determina el valor del divisor de frecuen cias
asignada al temporizador Timer1.
cD
cDL
(
/
c
1:1
1:2
1:4
1:8
c
- LP Oscillator Enable Control bit (bit de habilitacin del oscilador LP del Timer1)
)c - Timer1 External Clock Input Synchronization Control bit (Bit de control de
sincronizacin de la seal de entrada) habilita la sincronizacin de la entrada del oscilador LP o
de la entrada del pin T1CKI con el reloj interno del microcontrolador. Este bit se ignora al contar
los pulsos desde el oscilador principal (el bit TMR1CS = 0).
1 - Entrada de reloj externa no est sincronizada.
c - Timer TMR1 Clock Source Select bit (bit de seleccin de la fuente de reloj del
temporizador Timer1)
1 - Cuenta los pulsos po r el pin T1CKI (por el flanco ascendente 0 -1)
0 - Cuenta los pulsos del reloj interno del microcontrolador
- Timer1 On bit (TMR activo, hace entrar o no en funcionamiento el Timer1).
1 - Habilita el temporizador Timer1.
Como no es posible apagar el pre -escalador, su valor debe estar ajustado a los
bits T1CKPS1 y T1CKPS0 del registro T1CON (Refirase a la tabla).
Seleccionar el modo por el bit TMR1CS del registro T1CON. (TMR1CS: 0=la
fuente de reloj es oscilador de cuarzo interno, 1= la fuente de reloj es oscilador
de cuarzo externo).
Al configurar el bit T1OSCEN del mismo registro, el oscilador est habilitado y
los registros TMR1H y TMR1L se incrementan con cada pulso de reloj. Al
poner este bit a 0, se detiene el conteo.
Al reiniciar los registros del contador o al escribir en ellos, se reinicia el pre escalador.
Al llenar ambos registros del temporizador, se configura la bandera TMR1IF y
el conteo empieza desde cero.
*H
;
"
El mdulo del temporizador Timer2 es un temporizador de 8 bits.
Los pulsos que vienen del oscilador de cuarzo primero pasan por el pre-escalador cuyo valor
puede ser modificado al combinar los bits T2CKPS1 y T2CKPS0. La salida del preescalador se
utiliza para incrementar el registro TMR2 empezando por 00h. Los valores del TMR2 y del PR2
se comparan constantemente y el registro TMR2 va incrementndose hasta alcanzar el valor
del registro PR2. Cuando se igualan los valores de los registros, lo que ser registrado por el
comparador, el TMR2 se reinicia a 00h automticamente. El postescalador del temporizador
Timer2 se incrementa y su salida se utiliza para generar una interrupcin si est habilitada.
Los ambos registros TMR y PR2 son de lectura y escritura. El conteo se puede detener al
poner a 0 el bit TMR2ON, lo que resulta en un ahorro de energa.
El momento de reinicio del TMR2 se puede utilizar para determinar la velocidad de transmisin
en baudios de la comunicacin serie sncrona.
Varios bits del registro T2CON estn en control del temporizador Timer2.
1"c
*/L - Timer2 Output Postcaler Select bits (bits de seleccin del rango del
divisor del post-escalador para el Timer2) se utilizan para determinar el valor del post-escalador
segn la siguiente tabla:
*
"
L
(
/
c
1:1
1:2
1:3
1:4
1:5
1:6
1:7
1:8
1:9
1:10
1:11
1:12
1:13
1:14
1:15
1:16
""2 - (bit de activacin del TIMR2) hace entrar en funcionamiento el
temporizador Timer2.
1 - Habilita el funcionamiento del Timer2.
0 - Deshabilita el funcionamiento del Timer2.
"cD$"cDL - Timer2 Clock Prescaler bits (seleccin del rango del divisor del
preescalador del Timer2) determina el valor del divisor de frecuencias:
"cD
"cDL
(
/
c
1:1
1:4
1:16
Al utilizar el temporizador Timer2 hay que saber varios detalles relacionados con sus registros:
Los mdulos CCP pueden funcionar en muchos modos diferentes, por lo que se consideran los
ms complicados. Gi usted intenta analizar su funcionamiento a base de tablas que describen
las funciones de bits, comprender mejor de lo qu le estamos hablando. Gi utiliza alguno de
los mdulos CCP, primero seleccione el modo que necesita, analice la figura apropiada y
entonces pngase a modificar los bits de registros. Gi no...
*I cc
El mdulo CCP (Captura/Comparacin/PW) es un perifrico que le permite medir y controlar
diferentes eventos.
El
proporciona el acceso al estado actual de un registro que cambia su valor
constantemente. En este caso, es el registro del temporizador Timer1.
El
9 compara constantemente valores de dos registros. Uno de ellos es
el registro del temporizador Timer1. Este circuito tambin le permite al usuario activar un evento
externo despus de que haya expirado una cantidad de tiempo predeterminada.
?
(Pulse Width odulation - modulacin por ancho de pulsos) puede generar seales de
cc
Una parte central de este circuito es un registro CCPR1 de 16 bits que consiste en registros
CCPR1L y CCOR1H. Se utiliza para capturar y comparar sus valores con los nmeros
almacenados en el registro del temporizador Timer1 (TMR1H y TMR1L).
Si est habilitado por software, puede ocurrir el reinicio del temporizador Timer1 al igualarse los
valores en modo de Comparacin. Adems, el mdulo CCP1 puede generar seales PWM de
frecuencia y de ciclo de trabajo variados.
Los bits del registro CCP1CON estn en control del mdulo CCP1.
cc
c
En este modo, el registro del temporizador Timer1 (que consiste en los TMR1H y TMR1L) se
copia al registro CCP1 (que consiste en los CCPR1H y CCPR1L) en las siguientes situaciones:
Una combinacin de cuatro bits (CCP1M3 - CCP1M0) del registro de control determina cul de
estos eventos causar transmisin de dato de 16 bits. Adems, se deben cumplir los siguientes
requisitos::
El bit de bandera CCP1IF se pone a uno despus de acabar la captura. Si se pone a 1 el bit
CCP1IE del registro PIE1, se producir una interrupcin.
En caso de que el mdulo CCP1 est en modo de captura, puede producirse una interrupcin
no deseada. Para evitarlo, antes de que ocurra un cambio en el registro de control se deben
poner a 0 tanto el bit que habilita la interrupcin CCP1IE, como el bit de bandera CCP1IF.
Las interrupciones no deseadas pueden producirse al cambiar el valor del pre-escalador. Para
evitarlo, el mdulo CCP1 debe estar apagado temporalmente antes de cambiar el valor del preescalador.
Se recomienda la siguiente secuencia de programa, escrita en ensamblador:
G (
<6&%% %+
%&4%% %+ /+@%#;/0 8+ $03;/0> O0//"80
9B8:>0 $$H +#;C "H"@"80
+&=$$ 3:+,0 9080 8+> H/++#$">"80/ +#;C #+>+$$%03"80
+=4%% %+ +3 +> /+@%#;/0 8+ $03;/0> #+ %3;/08:$+ 3:+,0 ,">0/
, 9B8:>0 $$H #+ +3$%+38+ #%9:>;C3+"9+3;+
cc
c c
En este modo, el valor almacenado en el registro CCP1 se compara constantemente al valor
almacenado en el registro del temporizador Timer1. Al igualarse los valores, el estado lgico en
el pin de salida puede ser cambiado, lo que depende del estado de bits en el registro de control
(CCP1M3 - CCP1M0). El bit de bandera CCP1IF se pone a uno simultneamente.
Para poner el mdulo CCP1 en este modo de funcionamiento, se deben cumplir dos
condiciones:
cc
?
Las seales de frecuencia y de ciclo de trabajo variados tienen una amplia gama de
aplicaciones en automatizacin. Un ejemplo tpico es un circuito de control de potencia.
Refirase a la siguiente figura. Si un cero lgico (0) indica un interruptor abierto y un uno lgico
(1) indica un interruptor cerrado, la potencia elctrica que se transmite a los consumidores ser
directamente proporcional a la duracin del pulso. Esta relacin se le denomina Ciclo de
Trabajo.
El otro ejemplo, comn en la prctica, es el uso de seales PWM en un circuito para generar
seales de forma de onda arbitraria como una onda sinusoidal. Vea la siguiente figura:
Los dispositivos que funcionan segn este principio se utilizan con frecuencia en la prctica
como variadores de frecuencia ajustable que controlan motores elctricos (velocidad,
aceleracin, desaceleracin etc.)
La Figura anterior muestra el diagrama de bloques del mdulo CCP1 puesto en el modo PWM.
Para generar un pulso de forma arbitraria en el pin de salida, es necesario ajustar el perodo de
pulsos (frecuencia) y la duracin de pulsos.
<
?
El perodo de pulso de salida (T) se determina por el registro PR2 del temporizador Timer2. El
perodo de PWM se puede calcular por la siguiente ecuacin:
Perodo PWM = (PR2 +1) * 4Tosc * Valor de pre-escala del Timer2
cc
%
?
El ciclo de trabajo de PWM se especifica al utilizar en total 10 bits: los ocho bits ms
significativos del registro CCPR1L y los dos bits menos significativos adicionales del registro
CCP1CON (DC1B1 y DC1B0). El resultado es un nmero de 10 bits dado por la siguiente
frmula:
Ancho de pulsos = (CCPR1L,DC1B1,DC1B0) * Tosc * Valor de pre-escala del Timer2
La siguiente tabla muestra cmo generar las seales PWM de diferentes frecuencias cuando el
microcontrolador utiliza un cristal de cuarzo de 20 MHz (Tosc=50nS).
-
c
c P D; Q
""
CJJ
KG*
IJ"
GH*
"LJ*
16
Registro PR2
FFh
FFh
FFh
3Fh
1Fh
17h
Notas adicionales:
c
?
Una seal PWM no es nada ms que una secuencia de pulsos que varan su ciclo de trabajo.
Para una frecuencia especfica (nmero de pulsos por segundo), hay un nmero limitado de
combinaciones de ciclos de trabajo. Este nmero representa una resolucin medida en bits.
Por ejemplo, si una resolucin es de 10 bits estarn disponibles 1024 ciclos de trabajo
discretos; si una resolucin es de 8 bits estarn disponibles 256 ciclos de trabajo disretos etc.
En este microcontrolador la resolucin es determinada por el registro PR2. El mximo valor se
obtiene al usar el nmero FFh.
Frecuencias y resoluciones de PWM (Fosc = 20MHz):
-
c
c
?
""D;
CJJD;
KG*D;
IJ"D;
GH*D;
"LJ*D;
16
FFh
FFh
FFh
3Fh
1Fh
17h
Resolucin mxima
10
10
10
KHD;
IHK"D;
G*JG D;
""D;
CKLD;
"LLLD;
16
65h
65h
65h
19h
0Ch
09h
Resolucin mxima
'
((
?
[ H ( ''D(F (
4
( (
HX9<%67F HX9<#67 - HX9<#<8-67 ;
(
( (
(
)
HX9
L$ H/0 H%$ #D
( ( '
(
'*
| 5 8
-<
(
&&; ;
(
( '(
+# ( *
*
(
+#%#% +(
( '(
(
' H0/;$
= %
4D
D
HX9 62Y47
,
(
5 ,
?
= %
D
HX9
=
'55 "?(
?
HX9
[
1ccc
$ L - PWM Output Configuration bits (bits de configuracin del modo PWM) - El pin
P1A es la entrada del mdulo de Captura/Comparacin en todos los modos, menos en modo
PWM. Los pines P1B, P1C y P1D actan como los pines de E/S del puerto D.
En modo PWM estos bits afectan al funcionamiento del mdulo CCP1 como se muestra en la
siguiente tabla:
L
(
c%$c%L - PWM Duty Cycle Least Significant bits (bits menos significativos del ciclo de
trabajo de PWM) - Se utilizan slo en el modo PWM y representan dos bits menos significativos
de un nmero de 10 bits. Este nmero determina el ciclo de trabajo de la seal PWM. Los
dems 8 bits se almacenan en el registro CCPR1L.
cc */cc L - (bits de seleccin de modo del mdulo CCP1) determina el modo del
mdulo CCP1.
cc
*
cc
"
cc
cc
L
No utilizado.
1
Cada flanco ascendente en el pin CCP1.
"
0
Cada cuarto flanco ascendente en el pin CCP1.
"
1
Cada decimosexto flanco ascendente en el pin CCP1.
"
0
La salida y el bit CCP1IF se ponen a 1 al ocurrir una coincidencia
"
1
La salida se pone a 0 y el bit CCP1IF se pone a 1 al ocurrir una coincidencia.
"
cc"
Con exclusin de los nombres diferentes de los registros y de los bits, este mdulo es una muy
buena copia del mdulo CCP1 puesto en modo normal. La nica diferencia significativa entre
ellos es el funcionamiento en modo de comparacin del mdulo CCP2. La diferencia se refiere
a la seal de reinicio del temporizador T1. Concretamente, si el convertidor A/D est habilitado,
al igualarse los valores de los registros TMR1 y CCPR2, la seal de reinicio del temporizador
T1 iniciar automticamente la conversin A/D. Similar al mdulo anterior, este circuito tambin
est bajo el control de los bits del registro de control. Esta vez es el registro CCP2CON.
1cc"c
c"%$c"%L - PWM Duty Cycle Least Significant bits (bits menos significativos del ciclo de
trabajo de PWM) - Se utilizan slo en modo PWM y representan dos bits menos significativos
de un nmero de 10 bits. Este nmero determina el ciclo de trabajo de la seal PWM. Los
dems 8 bits se almacenan en el registro CCPR2L.
cc" */cc" L - CCP2 Mode Select bits (bits de seleccin de modo del mdulo CCP2)
determina el modo del mdulo CCP2.
cc"
*
cc"
"
cc"
cc"
L
No utilizado.
No utilizado.
No utilizado.
! "
Cada flanco descendente en el pin CCP2.
! "
0
1
Cada flanco ascendente en el pin CCP2.
! "
0
Cada cuarto flanco ascendente en el pin CCP2.
! "
1
Cada decimosexto flanco ascendente en el pin CCP2.
"
0
La salida y el bit CCP2IF se ponen a 1 al ocurrir una coincidencia.
"
1
La salida se pone a 0 y el bit CCP2IF se pone a 1 al ocurrir una coincidencia
"
(
-c981 9
cc 8
? !
Para configurar e iniciar el mdulo CCP1 para funcionar en modo PWM, siga los siguientes
pasos:
Deshabilitar el pin de salida del CCP1. Deber estar configurado como entrada.
Seleccionar el perodo de seal PWM al introducir el valor en el registro PR2.
Configurar el mdulo CCP1 para funcionar en modo PWM al combinar los bits
del registro CCP1CON.
Ajustar el ciclo de trabajo de seal PWM al introducir el valor en el registro
CCPR1L y al utilizar los bits DC1B1 y DC1B0 del registro CCP1CON.
Configurar e iniciar el temporizador Timer2:
Ajustar el valor de divisin de frecuencia del temporizador Timer2 por los bits
Habilitar los pines de salida de PWM despus de que haya sido acabado un
ciclo de PWM:
Esperar el desbordamiento del temporizador Timer2 (el bit TMR2IF del registro PIR1 se
pone a uno)
Configurar el pin apropiado como salida al poner a cero el bit en el registro TRIS.
cc
El mdulo CCP1 es el nico que se puede poner en modo mejorado. Este modo bsicamente
no difiere del modo normal del CCP1 y la mejora se refiere a la transmisin de la seal PWM a
los pines de salida. Por qu es eso tan importante? Por el uso cada vez ms frecuente de los
microcontroladores en los sistemas de control de motores elctricos. Aqu no vamos a describir
estos dispositivos, sin embrago si tiene la oportunidad de trabajar en el desarrollo de los
dispositivos similares, reconocer los elementos que se utilizaban hasta hace poco como los
perifricos. Decimos &se utilizaban& porque todos estos elementos ahora estn integrados en
el microcontrolador y pueden funcionar en varios modos diferentes.
? c
El modo PWM con una salida est habilitado slo en el caso de que se pongan a cero los bits
P1M1 y P1M0 en el registro CCP1CON. En tal caso, una seal PWM puede estar disponible
simultneamente en como mximo cuatro diferentes pines de salida. Adems, la secuencia de
seales PWM puede aparecer en forma de onda bsica o invertida. La distribucin de seales
depende de los bits del registro PSTRCON, mientras que su polaridad depende de los bits
CCP1M1 y CCP1M0 del registro CCP1CON.
Si se utiliza una salida invertida, los pines activos a nivel bajo y los pulsos que tienen la misma
forma de onda se generan siempre en parejas: en los pines P1A y P1C as como en los pines
P1B y P1D, respectivamente.
/
En cuanto al modo de medio-puente, la seal PWM es una salida en el pin P1A, mientras que a
la vez la seal complementaria PWM es una salida en el pin P1B. Estos pulsos activan a los
controladores MOSFET en modo de Medio-Puente que habilitan/deshabilitan el flujo de
corriente por el dispositivo.
En este modo es muy peligroso encender los controladores MOSFET simultneamente (el
cortocircuito producido en aquel momento sera fatal). Para evitarlo, es necesario proporcionar
un tiempo muerto entre encender y apagar los controladores. Este tiempo muerto est marcado
con 'td' (time delay) en la siguiente figura. El problema se resuelve al utilizar los bits PDC0PDC6 del registro PWM1CON.
Como se muestra en la siguiente figura, el modo de medio-puente se puede utilizar para activar
los controladores MOSFET en la configuracin Puente completo:
/c
Todos los cuatro pines se utilizan como salidas en el modo Puente completo. En la prctica,
este modo es utiliza con frecuencia para activar los motores, lo que proporciona un control
simple y completo de velocidad y direccin de rotacin. Hay dos configuraciones de este modo:
Full Bridge-Forward (puente completo con salida directa) y Full Bridge-Reverse (puente
completo con salida inversa).
c-'c
c
/
c
La siguiente figura muestra el estado de los pines P1A-P1D durante un ciclo PWM completo:
c-'c
c
/(
Lo similar ocurre en modo Inverso, a menos que estos pines dispongan de funciones
diferentes:
Un uno lgico (1) aparece en el pin P1C (pin est activo a nivel alto);
Un cero lgico (0) aparece en los pines P1A y P1D (pines estn activos a nivel
bajo).
1? c
cH/cL? 5c2+%
81 9
? , - El nmero binario de 7 dgitos determina el nmero de ciclos de in strucciones (4Tosc)
aadidos como tiempo muerto al activar los pines de entrada PWM.
1c
/1
22 (bit D de habilitacin de direccin) determina la funcin del pin
P1D.
1 - El pin P1D tiene la forma de onda del PWM con polaridad determinada por
los bits CCP1M0 y CCP1M1.
0 - Pin est configurado como entrada/salida general del puerto PORTD.
c1
22c (bit C de habilitacin de direccin) determina la funcin del pin
P1C.
1 - El pin P1C tiene la forma de onda del PWM con polaridad determinada por
los bits CCP1M0 y CCP1M1.
0 - Pin est configurado como entrada/salida general del puerto PORTD.
%/1
22% (bit B de habilitacin de direccin) determina la funcin del pin
P1B.
1 - El pin P1B tiene la forma de onda del PWM con polaridad determinada por
los bits CCP1M0 y CCP1M1.
0 - Pin est configurado como entrada/salida general del puerto PORTD.
/1
22 (bit A de habilitacin de direccin) determina la funcin del pin
P1A.
1 - El pin P1A tiene la forma de onda del PWM con polaridad determinada por
los bits CCP1M0 y CCP1M1.
0 - Pin est configurado como entrada/salida general del puerto PORTC.
1
cc
cc
/
cc/6
=
3 2 (bit de estado del apagado automtico)
indica si ha ocurrido el apagado automtico del mdulo CCP (estado de Apagado):
1 - Mdulo CCP est en estado de Apagado.
cc"/
ccL/
cc/6
=2 (Bits de seleccin de la
fuente de apagado automtico) selecciona la fuente de apagado automtico.
cc"
cc
ccL
-
'
cL
' c
%L
' c
*J
c cc
El USART es uno de los primeros sistemas de comunicacin serie. Las versiones nuevas de
este sistema estn actualizadas y se les denomina un poco diferente - EUSART.
El mdulo Transmisor/Receptor Universal Sncrono/Asncrono mejorado (Enhanced Universal
Synchronous Asynchronous Receiver Transmitter - EUSART) es un perifrico de comunicacin
serie de entrada/salida. Asimismo es conocido como Interfaz de comunicacin serie (Serial
Communications Interface - SCI). Contiene todos los generadores de seales de reloj, registros
de desplazamiento y bfers de datos necesarios para realizar transmisin de datos serie de
entrada/salida, independientemente de la ejecucin de programa del dispositivo. Como indica
su nombre, aparte de utilizar el reloj para la sincronizacin, este mdulo puede establecer la
conexin asncrona, lo que lo hace nico para algunas aplicaciones. Por ejemplo, en caso de
que sea difcil o imposible proporcionar canales especiales para transmisin y recepcin de
datos y seales de reloj (por ejemplo, mando a distancia de radio o infrarrojas), el mdulo
EUSART es definitivamente la mejor opcin posible.
El EUSART integrado en el PIC16F887 posee las siguientes caractersticas:
<c
El EUSART transmite y recibe los datos utilizando la codificacin de no retorno a cero - NRZ
(non-return-to-zero). Como se muestra en la siguiente figura, no se utiliza una seal de reloj y
los datos se transmiten de forma muy simple:
Figure below shows a common way of connecting PIC microcontroller that uses EUSART
module. The RS-232 circuit is used as a voltage level converter.
<c
Para habilitar la transmisin de datos por medio del mdulo EUSART, es necesario configurarlo
para que funcione como un transmisor. En otras palabras, es necesario definir el estado de los
siguientes bits:
&
R - El transmisor EUSART se habilita al poner a uno el bit TXEN del
registro TXSTA.
)cRL - El EUSART se configura a funcionar en modo asncrono al poner a
cero el bit SYNC del registro TXSTA.
R - Al poner a uno el bit SPEN del registro RCSTA, el EUSART est
habilitado y el pin TX/CK se configura automticamente como salida. Si el bit
se utiliza simultneamente para alguna funcin analgica, se debe deshabilitar
al poner a cero el bit correspondiente del registro ANSEL.
La parte central del transmisor EUSART ocupa el registro de desplazamiento TSR que no est
directamente disponible al usuario. Para iniciar la transmisin de datos, el mdulo debe estar
habilitado al poner a uno el bit TXEN del registro TXSTA. Los datos a enviar se deben escribir
en el registro TXREG, lo que resultar en la siguiente secuencia de eventos:
Para transmitir un dato de 9 bits es necesario poner a uno el bit TX9 del registro TXSTA. El bit
TX9D del registro TXSRTA es el noveno bit y el ms significativo. Al transmitir un dato de 9 bits,
el bit de datos TX9D deber estar escrito antes de que de se escriban los 8 bits menos
significativos en el registro TXREG. Todos los nueve bits de datos se transmiten al registro de
desplazamiento TFR inmediatamente despus de que se acabe la escritura en el registro
TXREG.
c
<c
Similar al poner en marcha el transmisor del EUSART, para habilitar el receptor es necesario
configurar los siguientes bits:
c
R - El receptor EUSART se habilita al poner a uno el bit CREN del
registro RCSTA;
)cRL - El EUSART se configura a funcionar en modo asncrono al poner a
cero el bit SYNC del registro TXSTA; y
R - Al poner a uno el bit SPEN del registro RCSTA, el EUSART est
habilitado y el pin RX/DT se configura automticamente como salida. Si el bit
se utiliza simultneamente para alguna funcin analgica, se debe desha bilitar
al poner a cero el bit correspondiente del registro ANSEL.
Despus de que se haya terminado el primer paso necesario y se haya detectado el bit de
arranque (START), el dato se transmite al registro de desplazamiento RSR por el pin RX. Al
haber recibido el bit de parada (STOP), ocurre lo siguiente:
OERR debe ponerse a cero por software al poner a cero y luego al poner a uno
el bit CREN;
22
36 @2
:
Si el bit de parada (STOP) est a cero (0), el bit FERR del registro RCSTA
estar a uno, lo que indica un error en recepcin; y
Para habilitar la recepcin de un dato de 9 bits, es necesario poner a uno el bit
RX9 del registro RCSTA.
cc
c
c
El microcontrolador puede detectar automticamente dos tipos de errores. El primero es
denominado error de encuadre (Framing error). Ocurre cuando el receptor no detecta el bit de
parada en un intervalo predeterminado de tiempo. Este error se indica mediante el bit FERR del
registro RCSTA. Si el bit est a uno, el ltimo dato recibido puede ser incorrecto. Cabe
destacar lo siguiente:
El error de encuadre no genera por si mismo una interrupcin;
Si el bit est a uno, el ltimo dato recibido contiene un error;
Otro tipo de error es denominado error de sobrescritura (Overrun Error). Como hemos
mencionado anteriormente, el registro de tipo FIFO puede almacenar slo dos caracteres. Un
error de sobrescritura ocurre cuando el registro recibe el tercer carcter. Simplemente no hay
espacio para almacenar un byte ms, por lo que un error es inevitable. Cuando ocurre este
error, el bit OERR del registro RCSTA se pone a uno. Las consecuencias son las siguientes:
Aparte de recibir los datos de forma estndar de 8 bits, el sistema EUSART soporta la
recepcin de datos de 9 bits. En el lado del transmisor, el noveno bit se adjunta al byte
original directamente antes del bit de parada. En el lado del receptor, al poner a uno el bit RX9
del registro RCSTA, el noveno bit de datos ser automticamente escrito en el bit RX9D del
mismo registro. Despus de almacenar este byte, es necesario tener cuidado en como leer
estos bits - primero se debe leer el bit RX9D y luego los ocho (8) bits menos significativos del
registro RCREG. De otra forma, el noveno bit ser puesto a cero antes de ser ledo.
cc
cc
Cuando el bit ADDEN del registro RCSTA est a uno, el modulo EUSART es capaz de recibir
slo los datos de 9 bits, mientras que se ignoran todos los datos de 8 bits. Aunque parece una
restriccin, este modo habilita la comunicacin serial entre varios microcontroladores. El
principio de funcionamiento es muy simple. El dispositivo maestro enva un dato de 9 bits que
representa la direccin de un microcontrolador esclavo. No obstante, todos deben tener el bit
ADDEN puesto a uno, ya que de esta manera se habilita la deteccin de direccin. Todos los
microcontroladores esclavos que comparten la misma lnea de transmisin, reciben este dato
(direccin) y verifican automticamente si coincide con su propia direccin. El software, en el
que ocurre la coincidencia de direccin, debe deshabilitar la deteccin de direccin, poniendo a
cero el bit ADDEN.
El dispositivo maestro sigue enviando los datos de 8 bits al microcontrolador. Todos los datos
que pasan por la lnea de transmisin sern recibidos slo por el mdulo EUSART
direccionado. Una vez recibido el ltimo byte, el microcontrolador esclavo debe poner a uno el
bit ADDEN para habilitar de nuevo la deteccin de direccin.
1&
baudios.
0 - Modo Esclavo. Reloj proveniente de una fuente externa.
&K/K/2
22+2
6 2 9
K2 9,
1 - Se habilita el modo de 9 bits en transmisin por el sistema EUSART.
&
/
22 (Bit de habilitacin de transmisin)
1 - Transmisin habilitada.
0 - Transmisin deshabilitada.
)c/
2 (Bit de seleccin del modo EUSART)
1 - El EUSART funciona en modo sncrono.
%/
% Nc6 2 (Bit de envo de carcter Break en modo asncrono) se
utiliza slo en modo asncrono y cuando se requiere obedecer el estndar de bus LIN.
1 - Se enviar un carcter Break en la prxima transmisin (se pone a 0 por
1c
/
22 (bit de habilitacin del puerto serie)
1 - Puerto serie habilitado. Los pines RX/DT y TX/CK se configuran
/13
22 (bit de habilitacin de la recepcin simple). Es utilizado slo
en modo sincrnico y en funcionamiento como Maestro.
1 - Recepcin simple habilitada.
c
/c3
22 (bit de habilitacin de la recepcin continua) acta
dependiendo del modo EUSART.
Modo asncrono:
Modo sncrono:
/
22 (bit de habilitacin de la deteccin de direccin) se utiliza
slo en modo de detectar la direccin.
1 - Habilita la deteccin de direccin (slo se procesa un byte recibido en el
-
/- 1
2 (bit de error de encuadre)
1 - Se ha producido un error de encuadre en recepcin.
/3
2+2
2 ,
1 - Se ha producido un error de sobrescritura en recepcin.
0 - No se ha producido un error de sobrescritura.
&K/628 3
No se ha producido un error de sobrescritura.
'
%
+%',
Si mira atentamente al diagrama del receptor o transmisor EUSART asncrono, ver que los
ambos utilizan seal de reloj del temporizador local BRG para la sincronizacin. La misma
fuente de reloj se utiliza tambin en modo sncrono.
El temporizador BRG consiste en dos registros de 8 bits haciendo un registro de 16 bits.
El valor de un nmero escrito en estos dos registros determinar la velocidad de transmisin en
baudios. Adicionalmente, el bit BRGH del registro TXSTA y el bit BRGH16 del registro
BAUDCTL, afectan la frecuencia de reloj utilizada para el clculo de los baudios.
El valor de un nmero escrito en estos dos registros determinar la velocidad de transmisin en
baudios. Adicionalmente, el bit BRGH del registro TXSTA y el bit BRGH16 del registro
BAUDCTL, afectan la frecuencia de reloj utilizada para el clculo de los baudios.
%
% ' .
-
(
c
%
'67!
28%8
28
de 8 bits /asncrono
de 8 bits / asncrono
de 16 bits / asncrono
de 16 bits / asncrono
Fosc / [4 (n + 1)]
de 8 bits / sncrono
Fosc / [4 (n + 1)]
de 16 bits / sncrono
Fosc / [4 (n + 1)]
Las tablas en las siguientes pginas contienen los valores que deben estar escritos en el
registro de 16 bits SPBRG y asignados a los bits SYNC, BRGH y BRGH16 para obtener
algunos valores de la velocidad de transmisin en baudios estndar. La frmula para hacer el
clculo de la velocidad de transmisin en baudios:
1%c
Modo sncrono:
?
? N/
22 (bit de habilitacin del modo de auto-activacin en modo asncrono):
1 - Modo de auto-activacin habilitado. El receptor espera a que el flanco
%
//%
22 (bit de habilitacin de auto-deteccin de velocidad de
transmisin) se utiliza slo en modo asncrono.
<c
+ ,
El MSSP (Puerto serie sncrono maestro - aster Gynchronous Gerial Port) es un mdulo muy
til, y a la vez uno de los circuitos ms complejos dentro del microcontrolador. Este mdulo
permite la comunicacin de alta velocidad entre un microcontrolador y otros perifricos u otros
microcontroladores al utilizar varias lneas de E/S (como mximo dos o tres lneas). Por eso, se
utiliza con frecuencia para conectar el microcontrolador a los visualizadores LCD, los
convertidores A/D, las memorias EEPROM seriales, los registros de desplazamiento etc. La
caracterstica principal de este tipo de comunicacin es que es sncrona y adecuada para ser
utilizada en sistemas con un slo maestro y uno o ms esclavos. Un dispositivo maestro
contiene un circuito para generacin de baudios y adems, suministra seales de reloj a todos
los dispositivos del sistema. Los dispositivos esclavos no disponen de un circuito interno para
generacin de seales de reloj. El mdulo MSSP puede funcionar en uno de dos modos:
modo SPI (Interfaz perifrica serial - Gerial Peripheral Interface ); y
Como se muestra en la siguiente figura, un mdulo MSSP representa slo una mitad de un
hardware necesario para establecer una comunicacin serial, mientras que la otra mitad se
almacena en el dispositivo con el que intercambia los datos. Aunque los mdulos en ambas
puntas de lnea son los mismos, sus modos de funcionamiento difieren esencialmente
dependiendo de si el mdulo funciona como aestro o como Esclavo:
Si el microcontrolador a ser programado controla otro dispositivo o circuito (perifricos), deber
funcionar como un dispositivo maestro. Este mdulo generar seal de reloj cuando sea
necesario, o sea slo cuando se requiera recibir y transmitir los datos por software. Por
consiguiente, el establecimiento de conexin depende nicamente del dispositivo maestro.
El modo SPI permite la transmisin y recepcin simultnea de datos de 8 bits al utilizar tres
lneas de entrada/salida
Adicionalmente, hay una cuarta lnea (SS) que se puede utilizar si el microcontrolador
intercambia los datos con varios dispositivos perifricos. Refirase a la siguiente figura.
- Glave Gelect (Geleccin de esclavo) - Es una lnea adicional utilizada para la seleccin de
un dispositivo especfico. Esta lnea est activa slo si el microcontrolador funciona como
esclavo, o sea cuando el dispositivo externo - maestro requiere intercambiar los datos. Al
funcionar en modo SPI, el mdulo MSSP utiliza 4 registros en total:
SSPSTAT - registro de estado
Como se muestra en la siguiente figura, la parte central del mdulo SPI consiste de dos
registros conectados a los pines para recepcin, transmisin y sincronizacin.
El registro de desplazamiento (SSPRS) est directamente conectado a los pines del
microcontrolador y es utilizado para transmisin de datos en formato serie. El registro SSPRS
dispone de la entrada y salida para desplazar los datos hacia dentro y hacia fuera del
dispositivo. En otras palabras, cada bit que aparece en la entrada (lnea de recepcin) desplaza
simultneamente otro bit hacia la salida (lnea de transmisin).
El registro SSPBUF ( Bfer) es una parte de memoria utilizada para almacenar temporalmente
los datos antes de que se enven, o sea inmediatamente despus de que se reciban. Despus
de que todos los 8 bits hayan sido recibidos, el byte se mueve del registro SSPRS al registro
SSPBUF. Este proceso de crear un doble bfer para recibir los datos permite iniciar la
recepcin del prximo byte antes de leer los datos que se acaban de recibir. Durante la
transmisin/recepcin de datos se ignora un intento de escribir un dato en el registro SSBUF.
Desde el punto de vista de un programador, este registro se considera el ms importante por
haber sido accedido con ms frecuencia. Concretamente, si dejamos aparte el ajuste del modo
de funcionamiento, la transmisin de datos por el mdulo SPI no es nada ms que escritura y
lectura de datos de este registro, mientras que las dems acrobacias como mover los
registros, se llevan a cabo automticamente por el hardware.
( 6 Nc
+ ( ?'
F
H%$ 6(7 ) -
( '
'P 6(
7 '
D
#H% +
'*
4
( (
)
#H% #H%<67 - #H%<X
%-
% H /$ ( '
(
'
'P #
D<
<'
%-
'
#% O ;/%#$
' /$
(
|
8 (
(
' (*
(
&&; ;
(
( '(
+# (
*
(
#<#< $*
( '( /OF /O
(
%-
#
' 'P
%-
'
$*
' $#] (
%
4
D
#H%
=
+)
' 'P
Los datos a ser transmitidos debern ser escritos en el registro del bfer SSPBUF. Si el mdulo
SPI funciona en modo maestro, el microcontrolador ejecutar automticamente la secuencia de
los siguientes pasos 2,3 y 4. Si el mdulo SPI funciona en modo esclavo, el microcontrolador
no ejecutar la secuencia de los siguientes pasos hasta que el pin SCK detecte seal de reloj.
"
El dato se mueve al registro SSPSR y el contenido del registro SSPBUF no se borra.
*
El dato se desplaza hacia el pin de salida (primero se desplaza el bit ms significativo - MSB),
mientras que a la vez el registro se carga con los bits por el pin de entrada. En modo maestro
el microcontrolador en si mismo genera seal de reloj, mientras que el modo esclavo utiliza
seal de reloj externa (pin SCK).
C
El registro SSPSR est lleno despus de que hayan sido recibidos 8 bits de datos, lo que se
indica al poner a uno el bit BF del registro SSPSTAT y el bit SSPIF del registro PIR1. Los datos
recibidos (un byte) son automticamente movidos del registro SSPSR al registro SSPBUF.
Como la transmisin de datos serial se realiza automticamente, el resto de programa se
ejecuta normalmente mientras que la transmisin de datos est en progreso. En este caso, la
funcin del bit SSPIF es de generar una interrupcin al acabar la transmisin de un byte.
G
Por ltimo, el dato almacenado en el registro SSPBUF est listo para su uso y debe moverse al
registro deseado.
"c
El modo I2C (Bus de circuito inter-integrado) es adecuado para ser utilizado cuando el
microcontrolador debe intercambiar los datos con un circuito integrado dentro de un mismo
dispositivo. stos son con frecuencia otros microcontroladores, o los circuitos integrados
especializados y baratos que pertenecen a la nueva generacin de as llamados "perifricos
inteligentes" (memorias, sensores de temperatura, relojes de tiempo real etc.)
Similar a la comunicacin serie en modo SPI, la transmisin de datos en modo I2C es sncrona
y bidireccional. Esta vez slo dos pines se utilizan para transmisin de datos. stos son los
pines de SDA (Datos seriales) y SCL (Reloj serial). El usuario debe configurar estos pines
como entradas o salidas por los bits TRISC.
Al observar las reglas particulares (protocolos), este modo habilita conectar simultneamente
de una manera simple hasta 112 diferentes componentes al utilizar slo dos valiosos pines de
E/S. Vamos a ver cmo funciona el sistema:
El reloj, necesario para sincronizar el funcionamiento de ambos dispositivos, siempre es
generado por un dispositivo maestro (un microcontrolador) y su frecuencia directamente afecta
a la velocidad de transmisin de datos. Aunque hay un protocolo que permite como mximo
una frecuencia de reloj de 3,4 MHz (as llamado bus I2C de alta velocidad), este libro cubre
slo el protocolo utilizado con ms frecuencia, con una frecuencia de reloj limitada a 100 KHz.
La frecuencia mnima no est limitada.
Cuando los componentes maestro y esclavo estn sincronizados por el reloj, el maestro
siempre inicia cada intercambio de datos. Una vez que el mdulo MSSP se ha habilitado,
espera que ocurra una condicin de arranque (Start condition). El dispositivo maestro primero
enva el bit de arranque (est a cero) por el pin SDA, luego la direccin de 7 bits del dispositivo
esclavo seleccionado, y por ltimo, el bit que requiere al dispositivo escribir (0) o leer (1) el dato
enviado. En otras palabras, los ocho bits se desplazan al registro SSPSR despus de ocurrir
una condicin de arranque. Todos los dispositivos esclavos que comparten la misma lnea de
transmisin recibirn simultneamente el primer byte, pero slo el que contiene la direccin
coincidente recibir el dato entero.
Una vez que el primer byte se ha enviado (slo se transmiten datos de 8 bits), el maestro se
pone en modo de recepcin y espera el reconocimiento del dispositivo receptor acerca de la
direccin coincidente.
2
En una operacin I C con el mdulo MSSP intervienen seis registros. Algunos de ellos se
muestran en la Figura anterior.
SSPCON
SSPCON2
SSPSTAT
SSPBUF
SSPSR
SSPADD
1
odo esclavo GPI - Este bit debe ser borrado cuando SPI se emplea en modo esclavo.
Modo IC (maestro o esclavo)
1 - Deshabilita control de variaciones para velocidad estndar (100kHz).
cD
/cN
12 (bit de seleccin del flanco de reloj) selecciona el modo de
sincronizacin.
CKP = 0:
CKP = 1:
.?/
?2 (bit de informacin Lectura/Escritura) se utiliza slo en modo I C. Este bit
contiene la informacin del bit de L/E despus de la ltima direccin coin cidente. Este bit es
vlido slo desde la direccin coincidente hasta el siguiente bit de arranque, bit de parada o bit
no ACK.
Modo IC en modo esclavo
1 - Lectura de dato.
0 - Escritura de dato.
1 - Transmisin en progreso.
0 - Transmisin no est en progreso.
2
/
2 (bit de activacin de direccin) se utiliza slo en modo I C de 10 bits.
1 - Indica que es necesario actualizar la direccin en el registro SSPADD.
1
ante riores. Como no hay espacio para recibir datos nuevos, uno de estos dos
bytes debe ser borrado. En este caso, los datos almacenados en el registro
SSPSR se pierden irremediablemente.
0 - Dato serial es recibido correctamente.
/56
22 (bit de habilitacin del mdulo SSP - puerto
serie sncrono) determina la funcin de los pines del microcontrolador e inicializa el mdulo
MSSP:
En modo SPI
1 - Habilita el mdulo MSSP y configura los pines SCK, SDO, SDI y SS como
una fuente de pines del puerto serie.
0 - Deshabilita el mdulo MSSP y configura estos pines como pines del puerto
de E/S.
En modo IC
1 - Habilita el mdulo MSSP y configura los pines SDA y SCL como una fuente
de pines del puerto serie.
0 - Deshabilita el mdulo MSSP y configura estos pines como pines del puerto
de E/S.
En modo IC esclavo
*/ L/56
2 . (bit de seleccin del modo del
SSP (puerto serie sncrono). El modo SSP se determina al combinar los siguientes bits:
*
"
L
Modo esclavo del SPI, deshabilitado el pin de control SS, SS se puede utilizar
como pin de E/S.
No utilizado.
No utilizado.
No utilizado.
Modo esclavo I2C, direccin de 7 bits utilizada, los bits de arranque (START) y de
parada (STOP) habilitan interrupcin.
Modo esclavo I2C, direccin de 10 bits utilizada, los bits de arranque (START) y de
parada (STOP) habilitan interrupcin.
1c"
'c
/' c
22 (bit de habilitacin general)
Slo en modo esclavo IC
1 - No reconocimiento.
0 - Reconocimiento.
cD
/N=
1@
22 (bit de habilitacin de secuencia de
reconocimiento)
En modo de recepcin maestro IC
c
/3
22 (bit de habilitacin de recepcin)
Slo en modo maestro IC
/
22 (bit de habilitacin de condicin de Parada)
Slo en modo maestro IC
1 - Indica una condicin de Parada en los pines SDA y SCL. Luego, este bit es
automticamente borrado por hardware.
0 - Condicin de Parada en reposo.
/
c
2
2 (bit de habilitacin de repetir condicin de
Arranque)
Slo en modo maestro IC
/c
2
.6
2
2 (bit de habilitacin de condicin de
Arranque)
Slo en modo maestro IC
1 - Indica condicin de Arranque en los pines SDA y SCL. Luego, este bit es
automticamente borrado por hardware.
0 - Condicin de Arranque en reposo.
Sc
Ajuste la velocidad de transmisin (registro SSPADD), desactive el control de velocidad de
rotacin (al poner a uno el bit SMP del registro SSPSTAT) y seleccione el modo maestro
(registro SSPCON). Despus de finalizar todos los ajustes y habilitar el mdulo (registro
SSPCON: bit SSPEN), es necesario esperar a que los circuitos de control internos indiquen con
una seal que todo est preparado para transmisin de datos: o sea, que el bit SSPIF del
registro PIR1 se haya puesto a uno.
Despus de poner este bit a cero por software, el microcontrolador est listo para intercambiar
los datos con los perifricos.
9
Sc
La transmisin de datos en el pin SDA se inicia con un cero lgico (0) que aparece al poner a
uno el bit SPEN del registro SSPCON2. Sin embargo, aunque est habilitado, el
microcontrolador tiene que esperar cierto tiempo antes de iniciar la comunicacin. Se le
denomina 'Condicin de Inicio' durante la que se realizan las preparaciones y verificaciones
internas. Si se cumplen con todas la condiciones, el bit SSPIF del registro PIR1 se pone a uno
y la transmisin de datos se inicia en cuanto se cargue el registro SSPBUF.
Como mximo 112 circuitos integrados (dispositivos esclavos) pueden compartir
simultneamente la misma lnea de transmisin. El primer byte de datos enviado por el
dispositivo maestro contiene la direccin que coincide con una sola direccin del dispositivo
esclavo. Todas las direcciones se enumeran en las hojas de datos respectivas. El octavo bit del
primer byte de datos especifica la direccin de transmisin de datos, o sea si el
microcontrolador va a enviar o recibir los datos. En este caso, como se trata de transmisin de
datos, el octavo bit se pone a cero (0).
Cuando ocurre la coincidencia de direcciones, el microcontrolador tiene que esperar a que el
dispositivo esclavo enve el bit de reconocimiento, o sea que se ponga a cero el bit ASKSTAT
del registro SSPCON2. Una vez que la coincidencia de direcciones ha ocurrido
apropiadamente, todos los bytes de datos se transmiten de la misma manera.
La transmisin de datos termina al poner a uno el bit SEN del registro SSPCON2. Ocurre la
condicin de parada (STOP), lo que habilita que el pin SDA reciba una secuencia de pulsos:
Inicio - Direccin - Reconocimiento - Dato - Reconocimiento .... Dato - Reconocimiento Parada!
9
Sc
Las preparaciones para recibir los datos son similares a las de transmitir los datos, con
excepcin de que el ltimo bit del primer byte enviado (el que contiene la direccin) se ponga a
uno lgico (1). Eso especifica que el dispositivo maestro espera recibir los datos del dispositivo
esclavo direccionado. Con respecto al microcontrolador, ocurre lo siguiente:
Despus de hacer las pruebas internas y poner a uno el bit de arranque (START), el dispositivo
esclavo enva byte por byte. Estos bytes se almacenan en el registro serial SSPSR. Despus
de recibir el ltimo - octavo bit, cada dato se carga en el registro SSPBUF del que se puede
leer. Al leer este registro, se enva automticamente el bit de reconocimiento, lo que significa
que el dispositivo maestro est listo para recibir los nuevos datos.
Al igual que en el caso de la transmisin, la recepcin de datos termina al poner a uno el bit de
parada (STOP):
Inicio - Direccin - Reconocimiento - Dato - Reconocimiento .... Dato - Reconocimiento Parada!
En esta secuencia de pulsos, el bit de reconocimiento se enva al dispositivo esclavo.
( 6 Nc
+ ( ?'
F
H%$ (!
++H/09 $
'
( '( #$> - #8" +
'* ) -
D
++H/09
+(F
'*
(
'
%$
++H/09 -
)
' H0/;O ' ' (
( ( P +
- '
++H/09 (! '( ' (
D 67 -
(
6>#O ( (*7
(
&&; +#<#< ;
(
( '( (
*
( >( '(
' H0/;O ( (
(
% %
4 %$
?
(
%
(( ' ( -
++H/09
% #\
%$
%= + - ' %$ 6
D
('(
G X7
%= + - 6
D
++H/097
%= 4 +
(
( (
% #\
'
%$
'
5
+
(*
(( (
D
(
!
% #\
%$
%= + - ' %$ 6
D
('(
G X7
%= + - 6
D
7
>
D (!
-
(!
( ' (
)
%
#
*
(\
%$
%= + - 6
D
('( G /7
+#<% >
6 307
% #\
'
%$
,
#
Cuando el microcontrolador se comunica con un perifrico, puede ocurrir un fallo en la
transmisin de datos por alguna razn. En este caso, es recomendable comprobar el estado de
algunos bits que pueden aclarar el problema. En la prctica, el estado de estos bits se
comprueba al ejecutar una pequea subrutina despus de transmisin y recepcin de cada
byte (por si acaso).
?c+c$I, - Si intenta escribir un dato nuevo al registro SSPBUF mientras que otra
transmisin/recepcin de datos est en progreso, el bit WCOL se pone a uno y el contenido del
registro SSBUF se queda sin cambios. No hay escritura. Luego, el bit WCOL debe ser borrado
por el software.
%-+$L, - Al transmitir los datos, este bit se pone a uno durante la escritura en el
registro SSPBUF y se queda puesto a uno hasta que el byte en formato serial se desplace del
registro SSPRS. En modo de recepcin, este bit se pone a uno al cargar un dato o una
direccin al registro SSPBUF. Se pone a cero despus de leer el registro SSPBUF.
(+c$H, - En modo de recepcin, este bit se pone a uno al recibir un nuevo byte
en el registro SSPSR por medio de la comunicacin serial, todava sin haber ledo el dato
anteriormente recibido del registro SSPBUF.
5c - Cuando el mdulo SSP est habilitado, estos pines se vuelven a las
salidas de Drenaje Abierto. Esto significa que deben estar conectados a resistencias
conectados a la otra punta al polo positivo de la fuente de alimentacin.
Para establecer la comunicacin serial en modo I2C, se debe realizar lo siguiente:
B 9
53
9
Introducir en el registro SSPADD el valor para definir la velocidad de
transmisin en baudios.
Poner a uno el bit SMP del registro SSPSTAT para desactivar el control de la
velocidad de rotacin.
Introducir el valor binario 1000 a los bits SSPM3 -SSPM0 del registro SSPCON1
para seleccionar el modo Maestro.
Poner a uno el bit SEN del registro SSPCON2 (secuen cia de Inicio - START).
El bit SSPIF se pone a uno automticamente en final de la secuencia de Inicio
cuando el mdulo est listo para funcionar. Se deber poner a cero.
Introducir la direccin de esclavo al registro SSPBUF.
Cuando se enva un byte, el bit SSPIF (interrupcin) se pone a uno
automticamente despus de haber recibido el bit de reconocimiento del
dispositivo esclavo.
Introducir en el registro SSPBUF los datos a enviar.
2
Poner a uno el bit RSEN del registro SSPCON2 para habilitar la recepcin.
El bit SSPIF indica con su estado lgico la recepcin de datos. Despus de leer
los datos del registro SSPBUF, el bit ACKEN del registro SSPCON2 d ebe
ponerse a uno para habilitar el envo del bit de reconocimiento.
La condicin de Parada (STOP) se debe iniciar al poner a uno el bit PEN del
registro SSPCON para informar al dispositivo Esclavo que la transmisin se
acab.
*K 'c
El mdulo del convertidor A/D dispone de las siguientes caractersticas:
c(
.
Aunque a primera vista parece muy complicado utilizar un convertidor A/D, en realidad es muy
simple. De hecho resulta ms simple utilizar un convertidor A/D que los temporizadores o
mdulos de comunicacin serie.
El funcionamiento del convertidor A/D est bajo el control de los bits de cuatro registros:
1
5
El resultado obtenido despus de convertir un valor analgico en digital es un nmero de 10
bits que se almacenar en los registros ADRESH y ADRESL. Hay dos maneras de manejarlo:
justificacin a la izquierda y a la derecha que simplifica en gran medida su uso. El formato del
resultado de la conversin depende del bit ADFM del registro ADCON1. En caso de que no se
utilice el convertidor A/D, estos registros se pueden utilizar como registros de propsito general.
c.
Para que el convertidor A/D alcance su exactitud especificada, es necesario proporcionar un
cierto tiempo muerto entre seleccionar una entrada analgica especfica y la medicin misma.
Este tiempo se le denomina tiempo de adquisicin y generalmente depende de la impedancia
de la fuente. Se utiliza una ecuacin para hacer clculo de tiempo de adquisicin con precisin,
cuyo valor mnimo es de 20uS aproximadamente. Por consiguiente, para realizar una
conversin con precisin, no se olvide este detalle.
c(
.
El tiempo necesario para realizar una conversin A/D cuyo resultado es 1 bit se define en
unidades de TAD. Se requiere que sea como mnimo 1,6 uS. Para realizar una conversin
completa de 10 bits se requiere un poco ms tiempo de lo esperado, son 11 TAD. Como la
frecuencia de reloj as como la fuente de conversin A/D son determinadas por software, es
necesario seleccionar una de las combinaciones de los bits disponibles ADCS1 y ADCS0 antes
de empezar a medir voltaje en una de las entradas analgicas. Estos bits se almacenan en el
registro ADCON0.
-
c
c
( + - c ,
-
c
c
cL
,9:
$:
-:
%:
2 uS
Fosc/2
100 nS
250 nS
500 nS
Fosc/8
400 nS
1 uS
2 uS
8 uS
Fosc/32
1.6 uS
4 uS
8 uS
32 uS
Frc
2 - 6 uS
2 - 6 uS
2 - 6 uS
2 - 6 uS
tabla se muestran las caractersticas de la frecuencia del dispositivo. Los valores en las celdas
sombreadas estn fuera del rango recomendado.
-c ;
c(
.!
Para llevar a cabo una conversin A/D sin problemas as como para evitar los resultados
inesperados, es necesario considerar lo siguiente:
1cL
c"
Fosc/2
Fosc/8
Fosc/32
RC *
* Seal de reloj se genera por el oscilador interno RC que est integrado en el convertidor.
c*/cL/ 1c6 2 (bits de seleccin de canal analgico) selecciona
un pin o un canal analgico para la conversin A/D, o sea para medir el voltaje:
c*
c"
c
cL
c
RA0/AN0
RA1/AN1
RA2/AN2
RA3/AN3
RA5/AN4
RE0/AN5
RE1/AN6
RE2/AN7
RB2/AN8
RB3/AN9
10
RB1/AN1
0
11
RB4/AN1
1
12
RB0/AN1
2
13
RB5/AN1
3
CVref
Vref = 0.6V
'.
/.c3 2 (bit de estado de la conversin A/D) determina el
estado actual de de la conversin:
1 - La conversin A/D est en progreso.
1c
referencia bajo.
(c-'L/( 182 (bit de configuracin de voltaje de referencia) selecciona la
fuente de voltaje de referencia alto que se necesita para el fucionamiento del convertidor A/D.
1 - Voltaje de refe rencia alto se aplica al pin Vref+.
Para medir el voltaje en un pin de entrada por medio del convertidor A/D, se debe realizar lo
siguiente:
- Configuracin del puerto:
Escribir un uno lgico (1) a un bit del registro TRIS, lo que resulta en configurar
c 'c
Aparte del convertidor A/D, hay otro mdulo, que hasta hace poco ha sido incorpodo slo en
los circuitos integrados que pertenecen a los llamados componentes analgicos. Debido al
hecho de que casi no hay ningn dispositivo automtico complejo que en cierto modo no utilice
estos circuitos, dos comparadores de alta calidad, junto con los componentes adicionales estn
integrados en el microcontrolador y conectados a sus pines.
Cmo funciona un comparador? Bsicamente, el comparador analgico es un amplificador
que compara la magnitud de voltajes en dos entradas. Dispone de dos entradas y una salida.
Dependiendo de cul voltaje de entrada es ms alto (valor analgico), un cero lgico (0) o un
uno lgico (1) (valores digitales) ser la salida.
-
(
-
c
Uno de dos voltajes analgicos proporcionados en las entradas del comparador es por lo
general estable e inalterable. Es denominado voltaje de referencia(Vref). Para generarlo, se
pueden utilizar tanto una fuente de voltaje externa como una fuente de voltaje interna especial.
El voltaje de referencia Vref se deriva despus de seleccionar una fuente, por medio de una red
en escalera que consiste en 16 resistencias, formando un divisor de voltaje. La fuente de
voltaje es seleccionable por el bit VRSS del registro VRCON.
Adems, la fraccin de voltaje proporcionada por la red de resistencias es seleccionable por los
bits VR0-VR3 y utilizada como voltaje de referencia. Vea la siguiente figura:
El voltaje de referencia del comparador dispone de dos gamas con 16 diferentes niveles de
voltaje cada una. La seleccin de gama es controlada por el bit VRR del registro VRCON. El
voltaje de referencia seleccionado CVref puede ser la salida al pin RA2/AN2 si el bit VROE se
pone a uno.
Aunque la idea principal era obtener el voltaje de referencia variable para el funcionamiento de
mdulos analgicos, de ese modo se obtiene un simple convertidor A/D. Este convertidor es
muy til en algunas situaciones. Su funcionamiento est bajo el control del registro VRCON.
c
c
Siempre que haya un cambio del estado lgico en la salida de un comparador, el bit de
bandera CMIF del registro PIR se pone a uno. Ese cambio tambin causar una interrupcin si
los siguientes bits se ponen a uno:
-c
+
,
Si est habilitado antes de entrar en modo de reposo, el comparador se queda activo durante el
modo de reposo. Si el comparador no se utiliza para "despertar" el dispositivo, el consumo de
corriente se puede reducir en modo de reposo al apagar el comparador. Esto se lleva a cabo al
poner a cero el bit CxON del registro CMxCON0.
Para que el comparador "despierte" al microcontrolador del modo de reposo, el bit CxIE del
registro IE2 y el bit PEIE del registro INTCON debern ponerse a uno. La instruccin que sigue
a la instruccin Sleep siempre se ejecuta al salir del modo de reposo. Si el bit GIE del registro
INTCON se pone a uno, el dispositivo ejecutar la rutina de servicio de interrupcin.
1c cL
Los bits de este registro estn en control del comparador C1. Eso afecta principalmente a la
configuracin de las entradas. Para explicarlo con ms claridad, vea la siguiente figura en la
que se muestran slo los componentes directamente afectados por los bits de este registro.
c/c c
22 (bit de habilitacin del comparador C1) habilita al
comparador C1.
1 - Comparador C1 est habilitado.
0 - Comparador C1 est deshabilitado.
c/c c2 (bit de salida del comparador C1) es la salida del
comparador C1.
Si C1POL = 1 (salida del comparador est invertida)
c
c c
22 (bit de habilitacin de salida del comparador C1)
1 - Salida del comparador C1OUT est conectada al pin C1OUT *.
* Para habilitar que el bit C1OUT aparezca en el pin, se deben cumplir dos condiciones: C1ON
= 1 (el comparador debe estar activado) y el bit correspondiente TRIS = 0 (pin se debe
configurar como salida).
c/c c 52 (bit de seleccin de polaridad de salida
del comparador C1) habilita la inversin del estado de la salida del comparador C1.
1 - Salida del comparador C1 est invertida.
referencia C1Vref.
0 - Entrada no invertida C1Vin+ est conectada al pin C1IN+.
ccL
c ( /
c
1c "cL
Los bits de este registro estn en control del comparador C2. Similar al caso anterior, la
siguiente figura muestra un esquema simplificado del circuito afectado por los bits de este
registro.
c"/c c"
22 (bit de habilitacin del comparador C2) habilita el
comparador C2.
1 - Comparador C2 est habilitado.
0 - Comparador C2 est deshabilitado.
c"/c c"2 (bit de salida del comparador C2) es la salida del
comparador C2.
If C2POL = 1 (salida del comparador est invertida)
c"
/c c"
22 (bit de habilitacin de salida del comparador C2)
1 - Salida del comparador C2OUT est conectada al pin C2OUT*.
* Para habilitar que el bit C2OUT aparezca en el pin, se deben cumplir dos condiciones: C2ON
= 1 (el comparador debe estar activado) y el bit correspondiente TRIS = 0 (pin se debe
configurar como salida).
c"/c c" 52 (bit de seleccin de polaridad de salida
del comparador C2) habilita la inversin del estado de la salida del comparador C2.
1 - Salida del comparador C2 est invertida.
referencia C2Vref.
0 - Entrada no invertida C2Vin+ est conectada al pin C2IN+.
c"cL
c" ( /
c
1c "c
C1Vref.
0 - Voltaje de referencia fijo de 0,6V se utiliza en la fuente de voltaje de
referencia C1Vref.
c"
/c c"82 (bit de seleccin de la fuente de voltaje de
referencia del comparador C2)
1 - Voltaje seleccionable CVref se utiliza en la fuente de voltaje de referencia
C2Vref.
0 - Voltaje de referencia fijo de 0,6V se utiliza en la fuente de voltaje de
referencia C2Vref.
1(c
(
c c( 18
22 (bit de habilitacin de la fuente de
voltaje de referencia del comparador C1)
1 - Fuente de voltaje de referencia CVref est encendido.
(
c c"( 18
22 (bit de habilitacin de la fuente de
voltaje de referencia del comparador C2)
1 - Fuente de voltaje de referencia CVref est conectada al pin.
Configurar el voltaje de referencia Vref necesario por medio de los bits VR3 VR0.
Poner a uno el bit VROE si es necesario.
Habilitar la fuente de voltaje de referencia Vref al poner a uno el bit VREN.
Para sincronizar todos los procesos que se llevan a cabo dentro del microcontrolador, se debe
utilizar una seal de reloj, mientras que para generar una seal de reloj, se debe utilizar un
oscilador. As de simple. El microcontrolador dispone de varios osciladores capaces de
funcionar en modos diferentes. Y aqu es donde viene lo interesante...
*Lc
Como se muestra en la siguiente figura, la seal de reloj se genera por uno de los dos
osciladores integrados.
Un
A est instalado fuera del microcontrolador y conectado a los pines OSC1
y OSC2. Es denominado 'externo' porque utiliza componentes externos para generar una seal
de reloj y estabilizar la frecuencia. Estos son: cristal de cuarzo, resonador cermico o circuito
resistor - capacitor. El modo de funcionamiento del oscilador se selecciona por los bits, que se
envan durante la programacin, denominados Palabra de Configuracin.
El
consiste en dos osciladores internos separados:
El HFINTOSC es un oscilador interno de alta frecuencia calibrado a 8MHz. El microcontrolador
puede utilizar una seal de reloj generada a esta frecuencia o despus de haber sido dividida
en el pre-escalador.
El LFINTOSC es un oscilador interno de baja frecuencia calibrado a 31 kHz. Sus pulsos de reloj
se utilizan para funcionamiento de los temporizadores de encendido y perro guardin,
asimismo puede utilizarse como fuente de seal de reloj para el funcionamiento de todo el
microcontrolador.
El bit Gystem Clock Gelect (bit de seleccin del reloj del sistema - SCS) del registro OSCCON
determina si una fuente de seal de reloj del microcontrolador ser interna o externa.
1cc
c-
c-L
-
c
c
c
8 MHz
HFINTOSC
4 MHz
HFINTOSC
2 MHz
HFINTOSC
1 MHz
HFINTOSC
500 kHz
HFINTOSC
250 kHz
HFINTOSC
125 kHz
HFINTOSC
31 kHz
LFINTOSC
/ // 2 (bit de estado del temporizador de encendido)
indica cul fuente de reloj est actualmente en uso. Es un bit de slo lectura.
1 - Se utiliza el oscilador de reloj externo.
/-c 2 (8 MHz - 125 kHz) (bit de estado del HFINTOSC) indica si el
oscilador interno de alta frecuencia funciona en modo estable.
1 - HFINTOSC est estable.
/-c 22 (31 kHz) (bit de estado del LFINTOSC) indica si el oscilador de
baja frecuencia funciona en modo estable.
1 - LFINTOSC est estable.
c/5cN2 (bit de seleccin del reloj del sistema) determina cul oscilador
se utilizar como una fuente de reloj.
1 - Oscilador interno se utiliza como reloj del sistema.
&
El oscilador externo se puede configurar para funcionar en uno de varios modos, lo que habilita
que funcione a diferentes velocidades y utilice diferentes componentes para estabilizar la
frecuencia. El modo de funcionamiento se selecciona durante el proceso de escribir un
programa en el microcontrolador. Antes que nada, es necesario activar el programa en una PC
que se utilizar para programar el microcontrolador. En este caso, es el programa PICflash.
Pulse sobre la casilla del oscilador y seleccione uno de la lista desplegable. Los bits apropiados
se pondrn a uno automticamente, formando parte de varios bytes, denominados Palabra de
Configuracin.
Durante el proceso de la programacin del microcontrolador, los bytes de la Palabra de
Configuracin se escriben en la memoria ROM del microcontrolador y se almacenan en los
registros especiales no disponibles al usuario. A base de estos bits, el microcontrolador sabe
qu hacer, aunque eso no se indica explcitamente en el programa.
c
&
c
El modo de reloj externo (EC - external clock) utiliza un oscilador externo como una fuente de
seal de reloj. La mxima frecuencia de seal de reloj est limitada a 20 MHz.
Las ventajas del funcionamiento del oscilador externo en modo EC son las siguientes:
c
&
$&
Los modos LP, XT y HS utilizan un oscilador externo como una fuente de reloj cuya frecuencia
est determinada por un cristal de cuarzo o por resonadores cermicos conectados a los pines
OSC1 y OSC2. Dependiendo de las caractersticas de los componentes utilizados, seleccione
uno de los siguientes modos:
por sus dimensiones pequeas y una forma cilndrica. Al utilizar este modo el
consumo de corriente ser menor que en los dems modos.
& se utiliza para cristales de cuarzo de frecuencias intermedias hasta 8
MHz. El consumo de corriente es media en comparacin con los dems
modos.
- (Alta velocidad) se utiliza para cristales de reloj de frecuencia ms
alta de 8 MHz. Al utilizar este modo el consumo de corri ente ser mayor que en
los dems modos.
c
> c
&
Los resonadores cermicos son similares a los cristales de cuarzo segn sus caractersticas,
por lo que se conectan de la misma manera. A diferencia de los cristales de cuarzo, son ms
baratos y los osciladores que hacen uso de ellos son de calidad ms baja. Se utilizan para las
frecuencias de reloj entre 100 kHz y 20 MHz.
c
&
c)c
El uso de los elementos para estabilizar la frecuencia sin duda alguna tiene muchas ventajas,
pero a veces realmente no es necesario. En la mayora de casos el oscilador puede funcionar a
frecuencias que no son precisamente definidas, as que sera una prdida de dinero embeber
c Cuando el oscilador externo se configura a funcionar en modo RC, el pin OSC1
debe estar conectado al circuito RC como se muestra en la figura a la derecha. La seal de
frecuencia del oscilador RC dividida por 4 est disponible en el pin OSC2. Esta seal se puede
utilizar para la calibracin, sincronizacin o para otros propsitos.
c De manera similar, el circuito RC est conectado al pin OSC1. Esta vez, el pin
OSC2 est disponible para ser utilizado como pin de E/S de propsito general.
En ambos casos se le recomienda utilizar los componentes como se muestra en la figura.
La frecuencia de este oscilador se calcula por medio de la frmula f = 1/T segn la que:
f = frecuencia [Hz];
El circuito del oscilador interno consiste en dos osciladores separados que se pueden
seleccionar como la fuente del reloj del microcontrolador:
El oscilador -c est calibrado de fbrica y funciona a 8Mhz. La frecuencia de este
oscilador se puede configurar por el usuario por medio de software utilizando los bits del
registro OSCTUNE.
El oscilador -c no est calibrado de fbrica y funciona a 31kHz.
Similar al oscilador externo, el interno tambin puede funcionar en varios modos. El modo de
funcionamiento se selecciona de la misma manera que en el oscilador externo - por medio de
los bits que forman Palabra de configuracin. En otras palabras, todo se lleva a cabo dentro del
software de PC antes de escribir un programa en el microcontrolador.
c
c
En este modo, el pin OSC1 est disponible para ser utilizado como pin de E/S de propsito
general. La seal de frecuencia del oscilador interno dividida por 4 est disponible en el pin
OSC2.
c
c
En este modo, los dos pines estn disponibles como pines de E/S de propsito general.
c-'c
c
El oscilador interno consiste en dos circuitos separados:
2. El oscilador de baja frecuencia LFINTOSC no est calibrado de fbrica y funciona a 31 kHz.
Est habilitado al seleccionar la frecuencia (bits del registro OSCCON) y poner a uno el bit SCS
del mismo registro.
c % >c
(
c
+?/
ccD/
,
El modo de cambio automtico de velocidad de reloj se utiliza para reducir el consumo de
corriente cuando el microcontrolador funciona en modo de reposo. De qu se trata todo esto?
Cuando se configura en modo LP, XT o HS, el oscilador externo se desactiva al pasar a modo
de reposo para reducir el consumo de corriente total del dispositivo. Cuando se cumplen las
condiciones de "despertamiento", el microcontrolador no se pone a funcionar inmediatamente
puesto que tiene que esperar a que se estabilice la frecuencia de seal de reloj. Este tiempo
muerto dura exactamente 1024 pulsos, despus de que el microcontrolador contina con la
ejecucin del programa. El caso es que se ejecutan slo unas pocas instrucciones antes de
que el microcontrolador vuelva al modo de reposo.
Eso significa que la mayora de tiempo as como la mayora de corriente de bateras se ha
perdido en vano. El caso se soluciona utilizando el oscilador interno para ejecutar el programa
durante la duracin de 1024 pulsos. Tan pronto como se estabilice la frecuencia del oscilador
externo, l retoma automticamente "el papel principal". Todo el procedimiento se habilita al
poner a uno el bit de palabra de configuracin. Para programar el microcontrolador, es
necesario seleccionar la opcin Int-Ext Switchover (conmutacin interna/externa) por software.
c-
-
+-/
-
ccD ,
Como indica su nombre, el monitor para detectar un fallo de la fuente de reloj (Fail-Safe Clock
Monitor - FSCM) monitorea el funcionamiento externo y permite al microcontrolador continuar
con la ejecucin de programa en caso de que el oscilador falle por alguna razn. En tal caso, el
oscilador interno toma su funcin.
El monitor detecta un fallo al comparar las fuentes de reloj interno y externo. Si los pulsos del
oscilador externo tardan ms de 2mS en llegar, la fuente de reloj ser automticamente
cambiada por la interna. As, el oscilador interno sigue funcionando controlado por los bits del
registro OSCCON. Si el bit OSFIE del registro PIE2 est a uno, se producir una interrupcin.
El reloj interno sigue siendo la fuente del reloj del sistema hasta que el dispositivo reinicie con
xito el oscilador externo que vuelve a ser la fuente de reloj del sistema. De manera similar a
casos anteriores, este mdulo est habilitado al cambiar la palabra de configuracin justamente
antes de que se inicie el proceso de programar el chip. Esta vez, esto se realiza al seleccionar
la opcin Fail-Safe Clock Monitor.
1c
Los cambios del registro OSCTUNE afectan a la frecuencia del oscilador HFINTOSC, pero no a
la frecuencia del LFINTOSC. No hay ninguna indicacin de que haya ocurrido desplazamiento
de frecuencia durante el funcionamiento del microcontrolador.
*
"
L
-
c
c
Mxima
Calibrada
Mnima
*
El microcontrolador PIC16F887 dispone de 256 localidades de memoria EEPROM controlados
por los bits de los siguientes registros:
1
c
'/1 .
?
/
- 12 (bit de error de escritura)
1 - Se produce un error de escritura de forma prematura y ha ocurrido un error.
?
/
?
22 (bit de habilitacin de escritura)
1 - Escritura de datos en la EEPROM habilitada.
c
Para leer los datos de la memoria EEMPROM, siga los siguientes pasos:
= +
''
Las ventajas del uso del lenguaje C se han hecho ms obvias, no lo cree?
c
Antes de escribir los datos en la memoria EEPROM es necesario escribir la direccin en el
registro EESADR y los datos en el registro EESAT. Slo ha quedado seguir a una secuencia
especial para iniciar la escritura para cada byte. Durante el proceso de escritura las
interrupciones deben estar deshabilitadas.
El ejemplo que sigue muestra el procedimiento anteriormente descrito al escribir un programa
en lenguaje ensamblador:
<4## !
<4## !
+=4%+
<4%+!=
<4#%+!)A %'(
(
<%4%+!=A +(
++H/09
(
= + =
''!=
+ =
! +(
D
++9H/09
+ =
! +(
D
++9H/09
'
5 8
(
( '( H0/;O - H0/;$
+#< 44 '
4
+#% 44
'
5
+#<
+#%
'
5
+#< +
>
(
(
D
++H/09 -
'
5
,
,
Aprimera vista, basta con encender una fuente de alimentacin para hacer funcionar un
microcontrolador. A primera vista, basta con apagar una fuente de alimentacin para detenerlo.
Glo a primera vista. En realidad, el arranque y el final del funcionamiento son las fases crticas
de las que se encarga una seal especial denominada REGET.
*"T
cU-%cD/$%?/!
Al producirse un reinicio el microcontrolador detiene su funcionamiento inmediatamente y borra
sus registros. Una seal de reinicio se puede generar externamente en cualquier momento
(nivel lgico bajo en el pin MCLR). Si se necesita, una seal tambin puede ser generada por la
lgica de control interna. Al encender una fuente de alimentacin siempre se produce un
reinicio. Por muchos eventos de transicin que ocurren al encender una fuente de alimentacin
(centelleos y fogonazos de contactos elctricos en interruptores, subida de voltaje lenta,
estabilizacin de la frecuencia de seal de reloj graduada etc.) es necesario proporcionar un
cierto tiempo muerto antes de que el microcontrolador se ponga a funcionar. Dos
temporizadores internos PWRT y OST se encargan de eso. El PWRT puede estar habilitado/
deshabilitado durante el proceso de escribir un programa. Vamos a ver cmo funciona todo.
Cuando el voltaje de la fuente de alimentacin alcanza entre 1.2 y 1.7V, un circuito denominado
temporizador de arranque (Power-up timer) mantiene al microcontrolador reiniciado durante
unos 72mS. Tan pronto como transcurra el tiempo, otro temporizador denominado
temporizador de encendido del oscilador (Oscillator start-up timer) genera otra seal de reinicio
durante la duracin de 1024 perodos del oscilador de cuarzo. Al expirar el tiempo muerto
(marcado con Reset T en la Figura) y al poner a alto el pin MCLR, todas las condiciones se han
cumplido y el microcontrolador se pone a ejecutar la primera instruccin en el programa.
Aparte de este reinicio "controlado" que ocurre al encender una fuente de alimentacin, hay dos
tipos de reinicio denominados Black-out y Brown-out que pueden producirse durante el
funcionamiento del microcontrolador as como al apagar una fuente de alimentacin.
c%cD/
El reinicio black out ocurre al apagar una fuente de alimentacin correctamente. El
microcontrolador no tiene tiempo para hacer nada imprevisible puesto que el voltaje cae muy
rpidamente por debajo de su valor mnimo. En otras palabras, se apaga la luz, las cortinas
bajan y el espectculo ha terminado!
c%?/
Cuando el voltaje de la fuente de alimentacin cae lentamente (un ejemplo tpico es descarga
de bateras, aunque el microcontrolador experimentara unas cadas mucho ms rpidas como
un proceso lento) los componentes internos detienen su funcionamiento gradualmente y ocurre
el as llamado reinicio Brownout. En tal caso, antes de que el microcontrolador detenga su
funcionamiento completamente, hay un peligro real de que los circuitos que funcionan a
frecuencias altas se pongan a funcionar de forma imprevisible. El reinicio brown-out puede
causar cambios fatales en el programa ya que se almacena en la memoria flash incorporada en
el chip.
7cc
Es un tipo especial del reinicio Brownout que ocurre en un ambiente industrial cuando voltaje
de alimentacin parpadea por un momento y cae por debajo del valor mnimo. Aunque es
corto, este ruido producido en una lnea de conduccin elctrica puede afectar
desfavorablemente al funcionamiento del dispositivo.
c
Un cero lgico (0) al pin MCLR causa un reinicio inmediato y regular. Es recomendable
conectarlo de la forma mostrada en la Figura a la derecha. La funcin de los componentes
adicionales es de mantener un uno lgico "puro" durante el funcionamiento normal. Si sus
valores se seleccionan de manera que proporcionen un nivel lgico alto en el pin despus de
que haya transcurrido el tiempo muerto reset T, el microcontrolador se pondr a funcionar
inmediatamente. Esto puede ser muy til cuando se necesita sincronizar el funcionamiento del
c C
B
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
Cc
&%>c
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.
c
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).
F
c
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.
F
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:
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.
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.
c
Si la frecuencia de operacin no es de importancia, entonces no es necesario utilizar los
componentes caros y adicionales para la estabilizacin. En vez de eso, basta con utilizar una
simple red RC, mostrada en la siguiente figura. Como aqu es utilizada slo la entrada del
oscilador local, la seal de reloj con la frecuencia Fosc/4 aparecer en el pin OSC2. sta es la
frecuencia de operacin del microcontrolador, o sea la velocidad de ejecucin de instrucciones.
A
Apesar 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.
C"c
c
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.
)%
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. Este efecto no se percibe normalmente al utilizar estos
componentes en la vida cotidiana porque el rebote ocurre demasiado rpido para afectar a la
mayora de los dispositivos elctricos. Sin embargo, pueden surgir problemas en algunos
circuitos lgicos que responden lo suficientemente rpido de manera que malinterpreten los
pulsos producidos al tocarse los contactos como un flujo de datos. De todos modos, el proceso
entero no dura mucho (unos pocos micro - o milisegundos), pero dura lo suficiente para que lo
detecte el microcontrolador. Al utilizar slo un botn de presin como una fuente de seal de
contador, en casi 100% de los casos ocurren los errores.
El problema se puede resolver con facilidad al conectar un simple circuito RC 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.
7
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.
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.
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.
4
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!
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.
1
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.
(;
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:
Los visualizadores conectados al microcontrolador normalmente ocupan un gran nmero de los
pines de E/S valiosos, lo que puede ser un problema sobre todo cuando se necesita visualizar
los nmeros compuestos por varios dgitos. El problema se vuelve ms obvio si, por ejemplo,
se necesita visualizar dos nmeros de seis dgitos (un simple clculo muestra que en este caso
se necesitan 96 pines de salida). La solucin de este problema 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
diseada para interpretar el lenguaje de ceros y unos, lo que se pone de manifiesto al visualizar
cualquier dgito. Concretamente, el microcontrolador no conoce cmo son unidades, decenas,
centenas, ni 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
palabras, el formato binario de cada dgito se sustituye por una combinacin diferente de los
bits por medio de una subrutina simple. Por ejemplo, el dgito 8 (0000 1000) se sustituye por el
nmero binario 0111 1111 para activar todos los LEDs que visualizan el nmero 8. El nico
diodo que queda inactivo aqu est reservado para el punto decimal.
Si un puerto del microcontrolador est conectado al visualizador de tal manera que el bit 0
active el segmento 'a', el bit 1 active el segmento 'b', el bit 2 active el segmento 'c' etc, entonces
la tabla que sigue muestra la "mscara" para cada dgito.
< '
( ;
'
dp
( ;
c
c
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.
(;c
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.
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:
- c
#
%
' c
c c
Tierra
Vss
0V
Alimentacin
Vdd
+5V
Contraste
Vee
0 - Vdd
RS
0
1
R/W
0
1
0
1
Transicin de 1 a 0
D0
0/1
Bit 0 LSB
D1
0/1
Bit 1
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
Control de funcionamiento
Datos / comandos
c
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).
c
El visualizador LCD dispone de tres bloques de memoria:
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.
Todo funciona 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.
c'
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 perifrico, reconocidos como letras por los humanos,
en realidad estn en el formato binario (el teclado es un buen ejemplo). En otras palabras, a
cada carcter le corresponde la combinacin nica de ceros y unos. El cdigo ASCII
representa una codificacin de caracteres basada en el alfabeto ingls. El ASCII especifica una
correspondencia entre los smbolos de caracteres estndar y sus equivalentes numricos.
c'
Adems de los caracteres estndar, el visualizador LCD puede visualizar smbolos definidos
por el usuario. Esto puede ser cualquier smbolo de 5x8 pxeles. La memoria RAM denominada
CGRAM de 64 bytes lo habilita.
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 escritura
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.
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:
?
I
H
G
C
*
"
L
c c
Borrar el visualizador
1.64mS
1.64mS
Modo de entrada
I/D
40uS
Activar/desactivar el
visualizador
40uS
Desplazar el cursor/visualizador
D/C
R/L
40uS
Modo de funcionamiento
DL
40uS
c
Direccin CGRAM
Direccin CGRAM
40uS
40uS
Leer la bandera
"BUSY"(ocupado) (BF)
BF
Direccin CGRAM
Escribir en la CGRAM o en la
DDRAM
D7
D6
D5
D4
D3
D2
D1
D0
40uS
D7
D6
D5
D4
D3
D2
D1
D0
40uS
'
-
'
'
9
G'
<
3
'
<
"
"
%%
%
%
c'
'
- 7
%
c+%)-',!
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).
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.
Esto no es un error! En este algoritmo, el mismo valor se transmite tres veces en fila.
El procedimiento de inicializacin por el bus de datos de 4 bits:
4D
>$8 "(
( D ( (
(
( >$8<8>$8<8F >$8</# - >$8<+3
& %
4
>$8
>cc
El proceso de crear un proyecto nuevo es muy simple. Seleccione la opcin =B del
men B como se muestra en la Figura de la derecha.
Aparecer una ventana que le guiar a travs del proceso de creacin de un proyectonuevo.
La ventana de entrada de este programa contiene una lista de acciones a realizar para crear un
proyecto nuevo. Pulse el botn A.
El proceso de creacin de un proyecto nuevo consiste en cinco pasos:
Una vez creado el programa, es necesario compilarlo en un cdigo .hex. Seleccione una de las
opciones para compilar del men B:
Para crear un archivo .hex, seleccione la opcin Build (Ctrl+F9) del men
C*
Al encender la fuente de alimentacin, cada segundo, el diodo LED en el puerto B 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 operador switch monitorea el estado lgico
en el puerto PORTB. Si PORTB=0xFF, su estado se invierte en 0x00 y viceversa.
Cualquier cambio de estos estados lgicos hace todos los LEDs parpadear. El
ciclo de trabajo es 5:1 (500mS:100mS).
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. El
estado lgico del puerto PORTB se invierte cada 200mS.
CC
"
4 2
5
-c
En realidad, esto es una continuacin del ejemplo anterior, pero se ocupa de un problema un
poco ms complicado... El propsito era 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 C, los bits de control RP0 y RP1 deben recuperar el estado que tenan
antes de la aventura en ensamblador. En este programa, el problema se resuelve al utilizar la
variable auxiliar saveBank, lo que guarda el estado de estos dos bits.
*
(
&;
+#< ;
(
( '(
' H0/;O ( '
#< H(
' H0/;O ( * (
(
(
+#< +#< %
(
D*
' H0/;O
'
5 ;'
#
% L
,
O V
(
( L^
/
L
< ##
@
(
( ( /H - /H
6( -
( %
( (
CG
*
L
$
3 23 $
9$4 :
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 Timer0 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.
$
(
## $( ;+#;
| (&?, $( /+>"Z
& ;
(
( '(
+# ( *
*
(
&;
+# /
' H0/;"
# 44 ;
(
( '(
' H0/;" ( *
(
+#' /
' H0/;8
#' H /8 ( * (
F (
(
!(
( *
(
+ #+)4 $
;9/
( '
(( '
' /"
+ #+)4 ,
'(
S
# /
'4
;9/
(
# ## _$
5
'4
Slo una constante de enumeracin REL se utiliza en este ejemplo. Se le asigna un valor
mediante la declaracin.
Si varios pines del puerto PORTD estn conectados a los rels, la expresin anterior se puede
escribir de la siguiente manera tambin:
A todas las constantes, precedidas por las constantes con valores asignados (REL=3 y
MOTOR=6), se les asignan automticamente los valores de las constantes precedentes,
incrementados en 1. En este ejemplo, a las constantes CALENTADOR y SURTIDOR se les
asignan los valores 4 y 7, es decir (CALENTADOR=4 y SURTIDOR=7), respectivamente.
CH
C
4 4
L$5"4
$
3 8
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 Timer0
con el pre-escalador asignado. Siempre que se genere una interrupcin con cada
desbordamiento en el registro del temporizador, la variable cnt se aumenta automticamente
en 1 al ejecutarse cada rutina de interrupcin. Cuando la variable llega al valor 400, el puerto
PORTB se incrementa en 1. Todo el procedimiento se lleva a cabo entre bastidores, lo que
habilita al microcontrolador hacer otra tarea.
$
| 8
(
$ 'D
(
# +
(
'4
;9/
#%+ O ;%+ ( ' F
;%E ( '
,
(
+ #+) 3 H(
(
(*
'4
;9/
& ;
(
( '(
+# ( *
*
(
&;
#< ;
(
( '(
' H0/;O ( *
(
(
+#< /
' H0/;O
# ;'4
;
#%+ Y
'D ;9/
Siempre que se produzca un desbordamiento en el registro del temporizador TRM0, ocurre una
interrupcin.
$
| 8
(
$ 'D
(
# 4 /
;9/%E
# ; 3 +
(
( *((
# &
'4
;9/Y - ;9/>
,
(
& ;
(
( '(
+# ( *
*
(
&;
+#< 4 ,
( (
' H0/;O
#< H(
' H0/;O ( * (
(
#%+ $*
'4
;9/
# 4 /
;9/%E
# ; 3 "?(
'4
;9/
# &
# Y
'D
'
(
(
/
#%+ % %'D
6( @%+ - H+%+7
( O
( $
(
' H0/;O
('P(
'(
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.
$
| 8
(
+#< +#< 8 D b/'
4c
, ED
(
'
(
# 4( #
;9/%E F
%
# 4 /
-
# /
*( ;9/
,
,
(
/
& ;
(
( '(
+# ( *
*
(
&;
+#< +(
D*
( '(
' H0/;O
#< ;
(
( '(
' H0/;O ( * (
(
#%+ 44 $*
'4
;
# ,
*(
'4
;9/
# %'D
#%+ % O( @%+ - H+%+ ( '
( O
( $
(
' H0/;O
('P(
!(
'(
En este ejemplo, una interrupcin ocurre despus de que se produce un desbordamiento en el
registro del temporizador TMR2. Para invertir el estado lgico de los pines del puerto se utiliza
la funcin Reemplazar, que normalmente no pertenece al lenguaje C estndar.
CI
G
4 4
/1
0
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.
$
(
+ #+) H(
(
(*
'4
X8; 6S 7
%&='# $
(
'
'4
X8;
+#< 4 ,
*( H0/;O
#< ;
(
( '(
' H0/;O ( * (
(
'
5 ;'
#
+#< 4 ,
' H0/;O
O
+
'* (
) (
'4
X8;
,
Para que este ejemplo funcione apropiadamente, es necesario habilitar al temporizador perroguardin al seleccionar la opcin Tools/mE Programmer/Watchdog Timer - Enabled.
CJ
H
$
8
(
(
<
<?<
F
<
?<
|
|
(
& ;
(
( '(
+# ( *
*
(
&;
+# +(
' H0/;"
# ;
(
( '(
' H0/;" ( *
(
+#< +(
' H0/;O
#< ;
(
( '(
' H0/;O ( * (
(
+#% +(
' H0/;$
#% ;
(
( '(
' H0/;$ ( *
(
(
= %
4D
D
HX9 62Y47
,
(
,
<
<?<
/
<
?<
= %
D
HX9
( O
< +#!!! # ( '(
D
/"
<
-
< +#!!! # ( '(
D
/"
<
-
51
( #
<
<?<
-
<
?< ( *
(
=
'5
?(
HX9F
@
+#<
- (
4
' H0/;O
,
'
5 ;'
#
,
,
Para que este ejemplo funcione apropiadamente, es necesario marcar las siguientes libreras
en la ventana Library Manager antes de compilar el programa:
PWM
Button
CK
&
I
4 3
.
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 el voltaje de
referencia alto se aplica al pin AN3. Esto habilita que la escala de medicin se estire y encoja.
IEn otras palabras, el convertidor A/D siempre genera un resultado binario de 10 bits, lo que
10
significa que reconoce 1024 niveles de voltaje en total (2 =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.
$
|
(
& % H( "3 - "3 ( *
D*(
# 44 ;
(
( '(
' H0/;" ( *
(
&; >(
!( '( ( *
*
(
#< 4 H(
' H0/;OF /O - /O
( *
(
(
#' ;
(
( '(
H0/;8 ( * (
(
'%+4 ,
?
(
' /"
(
'%
/(
(D "8 ( '
'<(
+#'
I ( ( (*( (
' H0/;8
+#<
- /O
, O
,
Para que este ejemplo funcione apropiadamente, es necesario marcar la librera ADC en la
ventana Library Manager antes de compilar el programa:
ADC
CL
J
4
Este ejemplo muestra cmo escribir y leer la memoria EEPROM incorporada. El programa
funciona de la siguiente manera. El bucle principal lee constantemente el contenido de
localidad de la memoria EEPROM en la direccin 5 (decimal). Luego el programa entra en el
bucle infinito en el que el puerto PORTB se incrementa y se comprueba el estado de entradas
del puerto PORTA.2. En el momento de presionar el botn denominado MEMO, un nmero
almacenado en el puerto PORTB ser guardado en la memoria EEPROM, directamente ledo y
visualizado en el puerto PORTD en forma binaria.
$
((
& ;
(
( '(
+# ( *
*
(
&;
+#< ,
' H0/;O
#< ;
(
( '(
' H0/;O ( *
(
(
+#' ,
' H0/;O
#' ;
(
( '(
' H0/;8 ( *
(
(
# 44 ;
(
( '(
' H0/;" ( *
(
+#' +
>
++H/09
D
(
+#< +#<
%
' H0/;O
'
5 ;'
#
+#4
+ =
! +#< # ( '
(
D 9+90F *
' H0/;O
+#' +
>
(
(
+#4 V
( (
(
D (P '
(
,
,
O
,
Para comprobar el funcionamiento de este circuito, basta con pulsar el botn MEMO y apagar
el dispositivo. Despus de reiniciar el dispositivo, el programa visualizar el valor guardado en
el puerto PORTD. Acurdese de que en el momento de escribir, el valor fue visualizado en el
puerto PORTB.
Para que este ejemplo funcione apropiadamente, es necesario marcar la librera EEPROM en
la ventana Library Manager antes de compilar el programa:
EEPROM
C
K
c
M1
$A9
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
dos dgitos LED (99-0). El punto es habilitar una conversin de un nmero binario en un
decimal y partirlo en dos dgitos (en decenas y unidades). Como los segmentos del visualizador
LED se conectan en paralelo, es necesario asegurar que alternen rpidamente para tener una
impresin de que emiten la luz simultneamente (multiplexin por divisin en tiempo).
$
| |
| !!!!
(
(
+# "'* ( (
4
(
+#' $
!( ' (
4
(
+# +
(
4
'
(
( 69#87
,
# /
;9/0
#%+ O ;%EF ;%+
,
(
+ #+) 3 "?(
'4
;9/
#
#%+ 8(
( '( H+%+F%3;+F/O%+F;%+
+# "'* ( (
4
(
# ;
(
( '(
' H0/;" ( *
(
(
+#' "'*
(
( (*(
(
4
#' ;
(
( '(
' H0/;8 ( *
(
(
(
O
( $
H'
!( ' (
4
(
2
H'
!( ' (
4
(
'
5
,
, O
,
N
$
| | (
(
| 4
|
| <
| 4
|
| '
| '
|
3| 4
Para que este ejemplo funcione apropiadamente, es necesario incluir el archivo mask.c en el
proyecto (aparte del archivo example9.c) en la ventana Project Manager antes de compilar el
programa:
Example9.mcppi - Gources -
-B
mask.c
example9.c
C"
L
4 3 4
c
Este ejemplo muestra cmo utilizar un visualizador LCD alfanumrico. Las libreras de
funciones simplifican este programa, lo que significa que al final el esfuerzo para crear el
software vale la pena.
Un mensaje escrito en dos lneas aparece en el visualizador:
N
NN
cA
Dos segundos ms tarde, el mensaje en la segunda lnea cambia, y se visualiza el voltaje
presente en la entrada del convertidor A/D (el pin RA2). Por ejemplo:
N
NN
3 1 *C(
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
$
$ (
D
>$8
&%'<
&%'<
&%'' <
&%''<
&%''<
&%''<
&%''
#<
&%''
#<
&%'' '
#<
&%'''
#<
&%'''
#<
&%'''
#<
E
( (
D
>$8
8
(
| -
|
.
(
#%+ ;
(
( '(
(
(
& H /" ( *
D*
#
&; >(
!( '( ( *
*
(
& %
4D
(
4
>$8
&%&%'%
++44 $
>$8 6'*
(7
&%&%'%& $
>$8 6
>$87
8
' (?
&+!!
+(
' (?
'
)
&%'
(
,
C*
c 9 /"*"
Este ejemplo muestra cmo utilizar el mdulo EUSART del microcontrolador. La conexin a
una PC se habilita por medio del estndar de comunicacin RS-232. El programa funciona de
la siguiente manera. Cada byte recibido por medio de la comunicacin serial se visualiza al
utilizar los LEDs conectados al puerto PORTB y despus se devuelve automticamente al
transmisor. Si ocurre un error en recepcin, se lo indicar al encender el diodo LED. La manera
ms fcil es comprobar el funcionamiento del dispositivo en la prctica al utilizar un programa
estndar de Windows denominado [yper Terminal.
$
|
(
# %
4
D
:#"/;
6I (F (
( F -
'
7
(
#'
5( ( (
#
#=
!(
,
,
,
Para que este ejemplo funcione apropiadamente, es necesario marcar la librera UART en la
ventana Library Manager antes de compilar el programa:
UART
CC
"
9
J"L
W/=X
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 de grandes capacidades, los
comandos utilizados para hacerlos funcionar y controlarlos tienen la forma de funciones
almacenadas en la librera One_Wire. En total son las siguientes tres funciones:
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 alguna de estas funciones en el programa. Si le interesa
saber cmo se declaran, basta con pulsar sobre alguna de ellas y seleccione la opcin Help.
$
$ (
D
>$8
&%'<
&%'<
&%'' <
&%''<
&%''<
&%''<
&%''
#<
&%''
#<
&%'' '
#<
&%'''
#<
&%'''
#<
&%'''
#<
E
(
D
>$8
.
|
'5#
|
8
(
8-
|
' (
' ( *
8
3(
/0
8
8
,
'<K
8-
8
;4#
'<K
(
8-
2
/0
8-
2
3
/0
/0
8-
2
3 +
)*
(
/0
8-
3 +
)*
(
'< -
(*
8
OO ;4#
4
.
'< (
/ 0
2
3 +
)*
(
/0
2
3 +
)*
(
/0
2
3 +
)*
(
/0
3 +
)*
(
,(
4 '
>$8
&+!!
,
(
& $*
( '( "3
*
(
&;
%+ 8(
( '
(
%+
& %
4
>$8
&%&%'%& O
>$8
&%&%'%
++44 "'*
(
&+!!
#
,(
4
!
*
F &$& ' )*
(
&%-!!
(( (
4
( >$8
( D
*(
( '
*
(
** "
F
I 4
&%-! !%
''
(
4
'
+8
+#! #\
0K
+8=
+#!! %% +?
#2%H</09
+8=
+#!! +?
$03,+/;<;
'
5
+8
+#!
+8=
+#!! %% +?
#2%H</09
+8=
+#!! < +?
/+"8<#$/";$YH"8
+8
+#!
+8
+#!OO3
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
CG
&
*
' 9
$2M
Las seales de audio se utilizan con frecuencia cuando se necesita llamar la atencin de
usuario, confirmar que alguno de los botones se ha pulsado, avisar que se ha llegado hasta los
valores mnimos o mximos etc. Pueden ser una simple seal de pitido as como melodas de
una duracin ms larga o ms corta. En este ejemplo se muestra la generacin de sonido por
medio de funciones que pertenecen a la librera Sound.
Adems de estas funciones, la funcin Button que pertenece a la misma librera se utiliza para
probar los botones de presin.
$
#
(
5! E
Y4F
D (
,
#
(
53! E
IY4F
D (
,
#
(
53 ! E IY4F
D (
,
5( $'
)
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
,
#
( ; "
533!
,
#
%( ; $
5 !
,
#
( ; +
53!
,
5( $'
)
|
(
#
#
%#
,
,
(
& ;
(
( '(
+# (
*
(
&;
#< 4 H( /O/O ( *
(
/O ( * (
+#<!
5!
(
< +#<!!! /O * ;
#
+#< 3 +(' ( (
D
< +#<!!! /O
* ;
#
+#< +(' ( (
D
< +#<!!! /O *
)
5
+#< +(' ( (
D
< +#<! !! /O *
)
5
+#< +(' ( (
D
,
,
Para que este ejemplo funcione apropiadamente, es necesario marcar las siguientes libreras
en la ventana Library Manager antes de compilar el programa:
Button
Sound
CH
C
4 3 4
c108
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.
En este ejemplo el GLCD visualiza una secuencia de imgenes, de las que un mapa de bits
representa un camin almacenado en otro archivo denominado truck_bmp.c. Para habilitar que
este programa funcione apropiadamente, usted debe aadir este archivo como archivo fuente a
su proyecto.
Las directivas del preprocesador incluidas en este ejemplo le permiten elegir si quiere visualizar
toda la secuencia de imgenes o slo una secuencia corta. Por defecto se visualizar toda la
secuencia de imgenes. Sin embargo, al aadir un comentario delante de la directiva R
%+ &#$ & se deshabilita visualizar algunas imgenes de la secuencia. Si se
comenta (o si se borra) esta directiva, las sentencias entre las directivas R
%+ &#$ & y R
no sern compiladas, as que no se ejecutarn.
$
8
(
/ 0 8
(
L<'
(
-
(! '
(
R
%+ &#$ & H (
) (
(
4
(D
(
& $*
( '( "3
*
(
&;
%+ 8(
'
(
%+
) %
4
@>$8
)4 O
@>$8
(
F
( ( '
8?
' *
R
%+ &#$ &
)
8?
*
5
5
R
)4 O
@>$8
8?
(*
*
)< ! ! !! 8?
?
)
!!3 !! 8?
!*
)&
!!!! 8?
)
5
O
( 8?
)( 4
( -
(
'
5
)&
! !!
);&
!!!
,
5
)4 O
@>$8
8?
*
R
%+ &#$ &
)
4 %-
3 !3!! #
F
<<><@>$8E(
' :((
R
)=
#
!!! +(
O
8?
( )
(
)%
!!.!
5
NO2:
2.%
.....................................................2
|
/ 0(
!!!!! 3!3!3!3!3!3!3!!!!!
!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!
! ! ! ! ! ! ! ! ! ! ! ! !!! !
! ! ! ! ! !!!!!!!!!!!
!!!!!!!!!!!!!!!!
!!!! !! !!!!!!!!!!
!!!!!!!! ! ! ! !3!!!!
!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!
!!!!!!3!!!!!!!!!!
!!!!! 3!3!3!3!3!3!3!3!3!3!3!
3!3!3!3!! ! !!!!!!!!!!
!!!!!!!! ! !! ! !3!3!!
!3!!!!!!!!!!!!!!!
!!!!!!!!! !!!!!!!
!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!! ! !
! ! !! !! !!!!!!!!!!
!!!!!! !!!!!!!!!!
! ! ! ! ! ! !3!!!!!!!! !
!!!! !! !3!!!!!!!!!
!!!!!!!!!!!!!!!!
!!!!!!!! !!!!!!!3!
3!!!3!!! !!!!!!!!!!
!!!!!!!!!!!!!!!!
!!!!!!!!!! 3!!!!!!
! 3! 3!! !!!!!!!!!3! ! 3!
!33!!!!3!3!!!!!! 3! 3!!!
!3!!! !3!!!!!!!!!!!
!!!3!! 3! 3! 3! 3!! ! ! ! ! ! !
! ! ! ! !!!!!! !!3! ! !!
!3!!3! ! ! !!!!! !!!!!
!!!!! ! !!!!!!!! !!
!!!!!! ! ! ! ! ! ! ! ! ! !
! ! ! !!!!!!! !!!!!!
!!!! !3!!!!3!3!! 3!!!!
!! ! ! ! ! !!!!!!!!!!
!!!!!!!!!!!!!!!!
!!!!!!!!! !!!! ! ! !
! ! ! !!!!!!! !!!!!!
!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!! !
!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!
!!!!!!!!!!!!! !!!
!!3!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!
,
Para que este ejemplo funcione apropiadamente, es necesario marcar la librera GLCD en la
ventana Library anager antes de compilar el programa. Asimismo, es necesario incluir el
documento truck_bmp.c en el proyecto.
CI
G
4 0
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 del que se hablar aqu.
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 1Kohm. 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.
$
$ (
D
@
)&%'' +#'
)&%'%<
)&%'%<
)&%'<
)&%'=<
)&%'<
)&%'#<
)&%'%'
#<
)&%'%'
#<
)&%''
#<
)&%'='
#<
)&%''
#<
)&%'#'
#<
E
(
D
@
8
D
(
4
@>$8
/0
#+
%; &$ &
/0
6+&6#+6
/0
<
##+
/0
<
##+
/0
%+44
/0
%+44
/0
%+
3/0
%+
8
D
( *
(
( -
>
=
| )
$(
* =
+#%4 8/%,+" 6
4
6>+E;7
F
6/%@Y;7
F
('
6;0H7
(
7
+#%4 8/%,+O 6
6O0;;097
(
7
'
5
| '%
=
/"6O0;;097
,
>
Z
| )
@(
>
Z
+#%4 8/%,+" 6
4
6>+E;7
(
F
6/%@Y;7
(
F
(' 6;0H7
7
+#%4 8/%,+O 6
6O0;;097
7
'
5
| '%
Z
/" 6
P
4
>+E;7
,
(
+#
# /" - /" (
(
D*(
&
&; $* ( '( "3
*
(
+#
+#% ;
(
( '(
' H0/;$ (! 6
-
(
'( /$
- /$7
# O:;;03 (
'(
3
3O35
3
5 O (
+#%4( # /$
03
,
( # /$
0EE
,
,
# O:;;03 (
'(
3
3O35
3
5 O (
+#%4( # /$
+#%4 %
(
D*
' /$
)=
#
3! ! ! ,(
4 (?S /$ 03
,
( # /$
+#%4 %
(
D*
' /$
)=
#
! ! ! ,(
4 (?S /$ 0EE
,
,
'
5
,
,
Para que este ejemplo funcione apropiadamente, es necesario marcar las siguientes libreras
en la ventana Library anager antes de compilar el programa.
GLCD
ADC
C_Stdlib
:
6
3
n 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,
programa para compilar y un dispositivo para transmitir el cdigo de la PC al chip 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...
(
;
Los programas especiales en el entorno de Windows se utilizan para escribir un programa para
el microcontrolador. Este libro describe el programa denominado mikroC 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 del lenguaje C. En otras palabras, slo tiene que seguir su idea al escribir el programa.
Esto es todo!
"c c
'
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 chip. Usted necesita un hardware
apropiado para hacerlo posible - un programador.
'
cc
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:
*-
>--
;!
Esta seccin describe en breve el uso del programa (compilador) mikroC PRO for PIC y del
software de programacin (programador)PICflash. Todo es muy simple...
Usted ya tiene instalado el mikroC PRO for PIC, verdad? Al iniciarlo, abra un proyecto nuevo y
un documento nuevo con extensin .c dentro del mismo. Escriba su programa...
OK. The program has been written and tested with the simulator. It did not report any errors
during the process of compiling into the hex code? It seems that everything is under control...
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...
C
Un dispositivo que puede simular cualquier dispositivo en la fase de prueba, es denominado un
sistema de desarrollo. Aparte 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. Si es necesario, todos estos 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.
Si dispone de un sistema de desarrollo, el proceso de programar y probar un programa es an
ms sencillo. Teniendo en cuenta que el compilador mikroC PRO for PIC (en su PC) y el
hardware del programador PICflash (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 Build and Program dentro del compilador. Desde este momento,
?
?
?
?
?
?