You are on page 1of 321

TOMADO DE

http://www.mikroe.com/eng/chapters/view/81/capitulo-
-microcontrola!or-pic1"#88$/
Capitulo 1 - El mundo de los microcontroladores
Capitulo 2 - Programacin de los microcontroladores
Capitulo 3 - Microcontrolador PIC16F887
Capitulo 4 - Eemplos
!p"ndice !# Es $ora de di%ertirse
%apitulo 1: El mun!o !e los microcontrola!ores
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 ue contena tanto al
procesador como perifricos. !s es cmo fue desarrollada la primera
microcomputadora en un solo chip, denominada m"s tarde microcontrolador.
1&1 Introduccin
1&2 '(ME)*+, '(ME)*+, '(ME)*+&&&
1&3 -E.!//E+ IMP*).!'.E+
1&4 MIC)*C*'.)*/!-*)E+ PIC
1.1 &'T(OD)%%&*'
/os principiantes en electrnica creen 0ue un microcontrolador es igual a un
microprocesador& Esto no es cierto& -i1ieren uno del otro en muc$os sentidos& /a
primera 2 la m3s importante di1erencia es su 1uncionalidad& Para utili4ar al
microprocesador en una aplicacin real, se de5e de conectar con componentes tales
como memoria o componentes 5uses de transmisin de datos& !un0ue el
microprocesador se considera una m30uina de computacin poderosa, no est3 preparado
para la comunicacin con los dispositi%os peri1"ricos 0ue se le conectan& Para 0ue el
microprocesador se comuni0ue con alg6n peri1"rico, se de5en utili4ar los circuitos
especiales& !s7 era en el principio 2 esta pr3ctica sigue %igente en la actualidad&
Por otro lado, al microcontrolador se le dise8a de tal manera 0ue tenga todas las
componentes integradas en el mismo c$ip& 'o necesita de otros componentes
especiali4ados para su aplicacin, por0ue todos los circuitos necesarios, 0ue de otra
manera correspondan a los peri1"ricos, 2a se encuentran incorporados& !s7 se a$orra
tiempo 2 espacio necesario para construir un dispositi%o&
QUE PUEDEN HACER LOS MICROCONTROLADORES?
Para entender con m3s 1acilidad las ra4ones del "9ito tan grande de los
microcontroladores, %amos a prestar atencin al siguiente eemplo& :ace unos 1; a8os,
dise8ar un dispositi%o electrnico de control de un ascensor de un edi1icio de %arios
pisos era mu2 di17cil, incluso para un e0uipo de e9pertos& <:a pensado alguna %e4 en
0u" re0uisitos de5e cumplir un simple ascensor= <Cmo lidiar con la situacin cuando
dos o m3s personas llaman al ascensor al mismo tiempo= <Cu3l llamada tiene la
prioridad= <Cmo solucionar las cuestiones de seguridad, de p"rdida de electricidad, de
1allos, de uso inde5ido= /o 0ue sucede despu"s de resol%er estos pro5lemas 53sicos es
un proceso meticuloso de dise8ar los dispositi%os adecuados utili4ando un gran n6mero
de los c$ips especiali4ados& Este proceso puede tardar semanas o meses, dependiendo de
la compleidad del dispositi%o& Cuando $a2a terminado el proceso, llega la $ora de
dise8ar una placa de circuito impreso 2 de montar el dispositi%o&>?n dispositi%o
enorme@ Es otro tra5ao di17cil 2 tardado& Por 6ltimo, cuando todo est3 terminado 2
pro5ado adecuadamente, pasamos al momento crucial 2 es cuando uno se concentra,
respira pro1undamente 2 enciende la 1uente de alimentacin&
Esto suele ser el punto en el 0ue la 1iesta se con%ierte en un %erdadero tra5ao puesto
0ue los dispositi%os electrnicos casi nunca 1uncionan apropiadamente desde el inicio&
Prep3rese para muc$as noc$es sin dormir, correcciones, meoras&&& 2 no se ol%ide de 0ue
toda%7a estamos $a5lando de cmo poner en marc$a un simple ascensor&
Cuando el dispositi%o 1inalmente empiece a 1uncionar per1ectamente 2 todo el mundo
est" satis1ec$o, 2 le paguen por el tra5ao 0ue $a $ec$o, muc$as compa87as de
desarrollo estar3n interesadas en su tra5ao& Por supuesto, si tiene suerte, cada d7a le
traer3 una o1erta de tra5ao de un nue%o in%ersionista& +in em5argo, si lo re0uieren para
tra5aar en el control de los ele%adores de un nue%o edi1icio 0ue tiene cuatro pisos m3s
de los 0ue 2a manea su sistema de control& <+a5e cmo proceder= <Cree acaso 0ue se
pueden controlar las demandas de sus clientes= Pensamos 0ue usted %a a construir un
dispositi%o uni%ersal 0ue se puede utili4ar en los edi1icios de 4 a 4; pisos, una o5ra
maestra de electrnica& Aueno, incluso si usted consigue construir una o2a electrnica,
su in%ersionista le esperarar3 delante de la puerta pidiendo una c3mara en el ascensor o
una m6sica relaante en caso de 1allo de ascensor& * un ascensor con dos puertas&
-e todos modos, la le2 de Murp$2 es ine9ora5le 2 sin duda usted no podr3 tomar
%entaa a pesar de todos los es1uer4os 0ue $a $ec$o& Por desgracia, todo lo 0ue se $a
dic$o $asta a$ora sucede en la realidad& Esto es lo 0ue Bdedicarse a la ingenier7a
electrnicaC realmente signi1ica& Es as7 como se $ac7an las cosas $asta aparicin de los
microcontroladores dise8ados - pe0ue8os, potentes 2 5aratos& -esde ese momento su
programacin de de ser una ciencia, 2 todo tom otra direccin &&&
El dispositi%o electrnico capa4 de controlar un pe0ue8o su5marino, una gr6a o un
ascensor como el anteriormente mencionado, a$ora est3 incorporado en un slo c$ip&
/os microcontroladores o1recen una amplia gama de aplicaciones 2 slo algunas se
e9ploran normalmente& /e toca a usted decidir 0u" 0uiere 0ue $aga el microcontrolador
2 cargar un programa en "l con las instrucciones apropiadas& !ntes de encender el
dispositi%o es recomenda5le %eri1icar su 1uncionamiento con a2uda de un simulador& +i
todo 1unciona como es de5ido, incorpore el microcontrolador en el sistema& +i alguna
%e4 necesita cam5iar, meorar o actuali4ar el programa, $3galo& <:asta cu3ndo= :asta
0uedar satis1ec$o& Eso puede reali4arse sin ning6n pro5lema&
#aba usted ue todas las personas pueden ser clasificadas en uno de $% grupos, en los
ue est"n familiarizados con el sistema de numeracin binario & en los ue no est"n
familiarizados con l. #i no entendi lo anterior significa ue todava pertenece al
segundo grupo. #i desea cambiar su estado, lea el siguiente texto ue describe
brevemente algunos de los conceptos b"sicos utilizados m"s tarde en este libro 'slo
para estar seguro de ue estamos hablando en los mismos trminos(.
1.+ ',ME(O-. ',ME(O-. ',ME(O-...
>/a matem3tica es una gran ciencia@ .odo es tan lgico 2 simple&&& El uni%erso de los
n6meros se puede descri5ir con slo die4 d7gitos& 'o o5stante, <realmente tiene 0ue ser
as7= <'ecesitamos e9actamente esos 1; d7gitos= Por supuesto 0ue no, es slo cuestin
del $35ito& !cu"rdese de las lecciones de la escuela& Por eemplo, <0u" signi1ica el
n6mero 764= Cuatro unidades, seis decenas 2 siete centenas& >Mu2 simple@ <+e podr7a
e9presar de una 1orma m3s desarrollada= Por supuesto 0ue s7# 4 D 6; D 7;;& <!6n m3s
desarrollado= +7# 4E1 D 6E1; D 7E1;;& <Podr7a este n6mero parecer un poco m3s
Bcient71icoC= /a respuesta es s7 otra %e4# 4E1;; D 6E1;1 D 7E1;2& <Fu" signi1ica esto
realmente= <Por 0u" utili4amos e9actamente estos n6meros 1;;, 1;1 2 1;2 = <Por 0u"
es siempre el n6mero 1;= Es por0ue utili4amos 1; d7gitos di1erentes G;, 1, 2&&&8, HI& En
otras pala5ras, es por0ue utili4amos el sistema de numeracin en 5ase 1;, es decir el
sistema de numeracin decimal&
SISTEMA DE NUMERACIN BINARIO
<Fu" pasar7a si utili43ramos slo dos n6meros ; 2 1= +i slo pudi"ramos a1irmar G1I o
negar G;I 0ue algo e9iste& /a respuesta es Bnada especialC, seguir7amos utili4ando los
mismos n6meros de la misma manera 0ue utili4amos $o2 en d7a, no o5stante ellos
parecer7an un poco di1erentes& Por eemplo# 11;11;1;&<Cu3ntas son realmente
11;11;1; p3ginas de un li5ro= Para entenderlo, siga la misma lgica como en el
eemplo anterior, pero en el orden in%ertido& .enga en cuenta 0ue se trata de aritm"tica
con slo dos d7gitos ; 2 1, es decir, del sistema de numeracin en 5ase 2 Gsistema de
numeracin 5inarioI&
E%identemente, se trata del mismo n6mero representado en dos sistemas de numeracin
di1erentes& /a 6nica di1erencia entre estas dos representaciones 2ace en el n6mero de
d7gitos necesarios para escri5ir un n6mero& ?n d7gito G2I se utili4a para escri5ir el
n6mero 2 en el sistema decimal, mientras 0ue dos d7gitos G1 2 ;I se utili4an para escri5ir
a0uel n6mero en el sistema 5inario& <!$ora est3 de acuerdo 0ue $a2 1; grupos de
gente= >Aien%enido al mundo de la aritm"tica 5inaria@ <.iene alguna idea de dnde se
utili4a=
E9cepto en las condiciones de la5oratorio estrictamente controladas, los circuitos
electrnicos m3s complicados no pueden especi1icar con e9actitud la di1erencia entre
dos magnitudes Gdos %alores de %oltae, por eemploI, si son demasiado pe0ue8os Gm3s
pe0ue8os 0ue unos pocos %oltiosI& /a ra4n son los ruidos el"ctricos 2 1enmenos 0ue
se presentan dentro de lo 0ue llamamos Bentorno de tra5ao realC Galgunos eemplos de
estos 1enmenos son los cam5ios impre%isi5les de la tensin de alimentacin, cam5ios
de temperatura, tolerancia a los %alores de los componentes etc&&&I& Imag7nese una
computadora 0ue opera so5re n6meros decimales al tratarlos de la siguiente manera#
;J;K, 1JLK, 2J1;K, 3J1LK, 4J2;K&&& HJ4LK@=
<!lguien dio 5ater7as=
?na solucin muc$o m3s 13cil es una lgica 5inaria donde ; indica la ausencia de
%oltae, mientras 0ue 1 indica la presencia de %oltae& +implemente, es 13cil de escri5ir ;
o 1 en %e4 de Bno $a2 %oltaeC o B $a2 %oltaeC& Mediante el cero lgico G;I 2 uno lgico
G1I la electrnica se en1renta per1ectamente 2 reali4a con 1acilidad todas las operaciones
aritm"ticas& E%identemente, se trata de electrnica 0ue en realidad aplica aritm"tica en
la 0ue todos los n6meros son representados con slo dos d7gitos 2 donde slo es
importante sa5er si $a2 %oltae o no& Por supuesto, estamos $a5lando de electrnica
digital&
SISTEMA DE NUMERACIN HEXADECIMAL
En el principio del desarrollo de las computadoras era e%idente 0ue a la gente le costa5a
muc$o tra5aar con n6meros 5inarios& Por eso, se esta5leci un nue%o sistema de
numeracin, 0ue utili4a5a 16 s7m5olos di1erentes& Es llamado el sistema de numeracin
$e9adecimal& Este sistema est3 compuesto de 1; d7gitos a los 0ue estamos
acostum5rados G;, 1, 2, 3,&&& HI 2 de seis letras del al1a5eto !, A, C, -, E 2 F& <Cu3l es el
propsito de esta com5inacin aparentemente e9tra8a= Aasta con mirar cmo todo en la
$istoria de los n6meros 5inarios encaa per1ectamente para lograr una meor
comprensin del tema&
El ma2or n6mero 0ue puede ser representado con 4 d7gitos 5inarios es el n6mero 1111&
Corresponde al n6mero 1L en el sistema decimal& En el sistema $e9adecimal ese n6mero
se representa con slo un d7gito F& Es el ma2or n6mero de un d7gito en el sistema
$e9adecimal& <+e da cuenta de la gran utilidad de estas e0ui%alencias= El ma2or n6mero
escrito con oc$o d7gitos 5inarios es a la %e4 el ma2or n6mero de dos d7gitos en el
sistema $e9adecimal& .enga en cuenta 0ue una computadora utili4a n6meros 5inarios de
8 d7gitos& <!caso se trata de una casualidad=
CDIGO BCD
El cdigo AC- GBinar&)Coded Decimal - Cdigo 5inario decimalI es un cdigo 5inario
utili4ado para representar a los n6meros decimales& +e utili4a para 0ue los circuitos
electrnicos puedan comunicarse con los peri1"ricos utili4ando el sistema de
numeracin decimal o 5ien utili4ando el sistema 5inario dentro de Bsu propio mundoC&
Consiste en n6meros 5inarios de 4 d7gitos 0ue representan los primeros die4 d7gitos G;,
1, 2, 3&&&8, HI& !un0ue cuatro d7gitos pueden $acer 16 com5inaciones posi5les en total,
el cdigo AC- normalmente utili4a a las primeras die4&
CONVERSIN DE SISTEMAS DE NMERACIN
El sistema de numeracin 5inario es el 0ue utili4an los microcontroladores, el sistema
decimal es el 0ue nos resulta m3s comprensi5le, mientras 0ue el sistema $e9adecimal
presenta un 5alance entre los dos& Por eso, es mu2 importante aprender cmo con%ertir
los n6meros de un sistema de numeracin a otro, por eemplo, cmo con%ertir una serie
de ceros 2 unos a una 1orma de representacin comprensi5le para nosotros&
%O'/E(-&*' DE ',ME(O- 0&'A(&O- A DE%&MA1E-
/os d7gitos en un n6mero 5inario tienen ponderaciones di1erentes lo 0ue depende de sus
posiciones dentro del n6mero 0ue est3n representando& !dem3s, cada d7gito puede ser 1
o ;, 2 su ponderacin se puede determinar con 1acilidad al contar su posicin
empe4ando por la derec$a& Para $acer una con%ersin de un n6mero 5inario a decimal
es necesario multiplicar las ponderaciones con los d7gitos correspondientes G; o 1I 2
sumar todos los resultados& /a magia de la con%ersin de un n6mero 5inario a decimal
1unciona de mara%illa&&& <.iene duda= Keamos el siguiente eemplo#
Ca5e destacar 0ue es necesario utili4ar slo dos d7gitos 5inarios para representar a todos
los n6meros decimales de ; a 3& Por consiguiente, para representar los n6meros de ; a 7
es necesario utili4ar tres d7gitos 5inarios, para representar los n6meros de ; a 1L - cuatro
d7gitos etc& -ic$o de manera sencilla, el ma2or n6mero 5inario 0ue se puede representar
utili4ando n d7gitos se o5tiene al ele%ar la 5ase 2 a la potencia n& /uego, al resultado se
le resta 1& Por eemplo, si nJ4#
2
4
- 1 J 16 - 1 J 1L
Por consiguiente, al utili4ar 4 d7gitos 5inarios, es posi5le representar los n6meros
decimales de ; a 1L, 0ue son 16 %alores di1erentes en total&
%O'/E(-&*' DE ',ME(O- 2E3ADE%&MA1E- A DE%&MA1E-
Para reali4ar una con%ersin de un n6mero $e9adecimal a decimal, cada d7gito
$e9adecimal de5e ser multiplicado con el n6mero 16 ele%ado al %alor de su posicin&
Por eemplo#
%O'/E(-&*' DE ',ME(O- 2E3ADE%&MA1E- A 0&'A(&O-
'o es necesario reali4ar ning6n c3lculo para con%ertir un n6mero $e9adecimal a
5inario& /os d7gitos $e9adecimales se reempla4an simplemente por los cuatro d7gitos
5inarios apropiados& Ma 0ue el d7gito $e9adecimal m39imo es e0ui%alente al n6mero
decimal 1L, es necesario utili4ar cuatro d7gitos 5inarios para representar un d7gito
$e9adecimal& Por eemplo#
MARCAR LOS NMEROS
El sistema de numeracin $e9adecimal, unto con los sistemas 5inario 2 decimal, se
consideran los m3s importantes para nosotros& Es 13cil reali4ar una con%ersin de
cual0uier n6mero $e9adecimal a 5inario, adem3s es 13cil de recordarlo& +in o5stante,
estas con%ersiones pueden pro%ocar una con1usin& Por eemplo, <0u" signi1ica en
realidad la sentencia# BEs necesario contar 11; productos en una cadena de montaeC=
-ependiendo del sistema en cuestin G5inario, decimal o $e9adecimalI, el resultado
podr7a ser 6, 11; o 272 productos, respecti%amente& Por consiguiente, para e%itar
e0ui%ocaciones, di1erentes pre1ios 2 su1ios se a8aden directamente a los n6meros& El
pre1io N o ;9 as7 como el su1io $ marca los n6meros en el sistema $e9adecimal& Por
eemplo, el n6mero $e9adecimal 1;!F se puede escri5ir as7# N1;!F, ;91;!F o 1;!F$&
-e manera similar, los n6meros 5inarios normalmente o5tienen el su1io O o ;A& +i un
n6mero no tiene ni su1io ni pre1io se considera decimal& -esa1ortunadamente, esta
1orma de marcar los n6meros no es estandari4ada, por consiguiente depende de la
aplicacin concreta&
/a siguiente es ta5la comparati%a 0ue contiene los %alores de n6meros ;-2LL
representados en tres sistemas de numeracin di1erentes& Esto es pro5a5lemente la
manera m3s 13cil de entender lgica com6n aplicada a todos los sistemas de
numeracin&
NMEROS NEGATIVOS
Como 2a $emos %isto, para escri5ir un n6mero negati%o en matem3ticas, 5asta con
a8adirle el pre1io B-C Gsigno menosI& +in em5argo, en la programacin, al aca5arse el
proceso de la compilacin, se 0uedan slo los n6meros 5inarios, %ol%i"ndose las cosas
m3s complicadas& +e utili4an slo dos d7gitos - ; 2 1, mientras 0ue todos los dem3s
n6meros, s7m5olos 2 signos se 1orman por medio de las com5inaciones de estos dos
d7gitos& En el caso de los n6meros negati%os, la solucin es la siguiente# En los n6meros
negati%os, el 5it m3s signi1icati%o Gel 5it del e9tremo i40uierdoI representa el signo del
n6mero Gdonde ; ser3 positi%o 2 1 negati%oI& En el caso de un n6mero de 8 5its, para
representar un %alor num"rico slo 0uedan 7 5its& -e acuerdo a este tipo de codi1icacin
el n6mero D127 es el ma2or n6mero positi%o con signo 0ue se puede representar con 8
5its& !simismo, $a2 cero G;I positi%o 2 negati%o Gre1i"rase a la ta5la de la derec$aI& /a
siguiente pregunta ser7a# <Cmo es posi5le sa5er de 0u" n6mero se trata= Por eemplo,
si ponemos el n6mero 1;;;;;;1, <es -1 o 12H= 'o se preocupe, de eso se encarga el
compilador& Psta es la ra4n por la 0ue se declaran %aria5les al escri5ir el programa&
Aueno, de eso %amos a $a5lar a continuacin&
BIT
/a teor7a dice 0ue un 5it es la unidad 53sica de in1ormacin&&&Kamos a ol%idarlo por un
momento 2 demostrar 0u" es eso en la pr3ctica& /a respuesta es - nada especial- un 5it
es un slo d7gito 5inario& +imilar a un sistema de numeracin decimal en el 0ue los
d7gitos de un n6mero no tienen la misma ponderacin Gpor eemplo, los d7gitos en el
n6mero 444 son los mismos pero tienen los %alores di1erentesI, el Bsigni1icadoC de un
5it depende de la posicin 0ue tiene en n6mero 5inario& En este caso no tiene sentido
$a5lar de unidades, centenas etc& en los n6meros 5inarios, sus d7gitos se denominan el
5it cero Gel primer 5it a la derec$aI, el primer 5it Gel segundo 5it a la derec$aI etc&
!dem3s, 2a 0ue el sistema 5inario utili4a solamente dos d7gitos G; 2 1I, el %alor de un
5it puede ser ; o 1&
'o se con1unda si se encuentra con un 5it 0ue tiene el %alor 4, 16 o 64& +on los %alores
representados en el sistema decimal& +implemente, nos $emos acostum5rado tanto a
utili4ar los n6meros decimales 0ue estas e9presiones llegaron a ser comunes& +er7a
correcto decir por eemplo, Bel %alor del se9to 5it en cual0uier n6mero 5inario e0ui%ale
al n6mero decimal 64C& Pero todos somos $umanos 2 los %ieos $35itos mueren
di17cilmente& !dem3s, <cmo le suena Bn6mero uno-uno-cero-uno-cero&&&C=
BYTE
?n 52te consiste en 8 5its colocados uno unto al otro& +i un 5it es un d7gito, es lgico
0ue los 52tes representen los n6meros& .odas las operaciones matem3ticas se pueden
reali4ar por medio de ellos, como por medio de los n6meros decimales comunes&
+imilar a los d7gitos de cual0uier n6mero, los d7gitos de un 52te no tienen el mismo
signi1icado& El 5it del e9tremo i40uierdo tiene la ma2or ponderacin, por eso es
denominado el 5it m3s signi1icati%o GM+AI& El 5it del e9tremo derec$o tiene la menor
ponderacin, por eso es denominado el 5it menos signi1icati%o G/+AI& Puesto 0ue los 8
d7gitos de un 52te se pueden com5inar de 2L6 maneras di1erentes, el ma2or n6mero
decimal 0ue se puede representar con un 52te es 2LL Guna com5inacin representa un
ceroI&
?n ni55le o un cuarteto representa una mitad de 52te& -ependiendo de la mitad del
n6mero en cuestin Gi40uierda o derec$aI, se les denomina ni55les BaltosC o B5aosC,
respecti%amente&
*sted seguramente ha pensado alguna vez en cmo es la electrnica dentro de un
circuito integrado digital, un microcontrolador o un microprocesador. +,mo son los
circuitos ue realizan las operaciones matem"ticas complicadas & toman decisiones-
+#aba ue sus esuemas, aparentemente complicadas consisten en slo unos pocos
elementos diferentes, denominados circuitos lgicos o compuertas lgicas-
1. DETA11E- &M4O(TA'TE-
El 1uncionamiento de estos elementos es 5asado en los principios esta5lecidos por el
matem3tico 5rit3nico .eorge /oole en la mitad del siglo 1H - es decir, >antes de la
in%encin de la primera 5om5illa@ En 5re%e, la idea principal era de e9presar las 1ormas
lgicas por medio de las 1unciones alge5raicas& .al idea pronto se trans1orm en un
producto pr3ctico 0ue se con%irti m3s tarde en lo 0ue $o2 en d7a conocemos como
circuitos lgicos M G!'-I, * G*)I o '* G'*.I& El principio de su 1uncionamiento es
conocido como alge5ra de Aoole&
CIRCUITOS LGICOS
!lgunas instrucciones de programa utili4adas por un microcontrolador 1uncionan de la
misma manera 0ue las compuertas lgicas, pero en 1orma de comandos& ! continuacin
%amos a e9plicar el principio de su 1uncionamiento&
%OM4)E(TA 5 6A'D7
?na compuerta lgica BMC dispone de dos o m3s entradas 2 de una salida& En este caso
la compuerta utili4ada dispone de slo dos entradas& ?n uno lgico G1I aparecer3 en su
salida slo en caso de 0ue am5as entradas G! M AI sean lle%adas a alto G1I& /a ta5la a la
derec$a es la ta5la de %erdad 0ue muestra la relacin entre las entradas 2 salidas de la
compuerta& El principio de 1uncionamiento es el mismo cuando la compuerta disponga
de m3s de dos entradas# la salida proporciona un uno lgico G1I slo si todas las entradas
son lle%adas a alto G1I&
Cual0uier otra com5inacin de %oltaes de entrada proporcionar3 un cero lgico G;I en
su salida& ?tili4ada en el programa, la operacin M lgico es reali4ada por una
instruccin de programa, de la 0ue %amos a $a5lar m3s tarde& Por a$ora 5asta con
conocer 0ue M lgico en un programa se re1iere a la reali4acin de este tipo de
operacin so5re los 5its correspondientes de dos registros di1erentes&
%OM4)E(TA O 6O(7
-e manera similar, la compuerta * tam5i"n dispone de dos o m3s entradas 2 de una
salida& +i la compuerta dispone de slo dos entradas, es aplica5le lo siguiente# la salida
proporciona un uno lgico G1I si una u otra entrada G! o AI es lle%ada a alto G1I& En caso
de 0ue la compuerta * disponga de m3s de dos entradas, es aplica5le lo siguiente# /a
salida proporciona un uno lgico G1I si por lo menos una entrada es lle%ada a alto G1I& +i
todas las entradas est3n a cero lgico G;I, la salida estar3 a cero lgico G;I tam5i"n&
En un programa, la operacin * lgico se reali4a de la misma manera 0ue la operacin
M&
%OM4)E(TA 'O 6'OT7
/a compuerta lgica '* dispone de una sola entrada 2 una sola salida, por lo 0ue
1unciona mu2 simplemente& Cuando un cero lgico G;I apare4ca en su entrada, la salida
proporciona un uno lgico G1I 2 %ice%ersa& Esto signi1ica 0ue esta compuerta in%ierte las
se8ales por s7 mismas 2 por eso es denominada in%ersor&
En el programa la operacin lgica '* se reali4a so5re un 52te& El resultado es un 52te
con los 5its in%ertidos& +i los 5its de un 52te se consideran n6mero, el %alor in%ertido es
un complemento a ese n6mero& El complemento de un n6mero es el %alor 0ue se a8ade
al n6mero $asta llegar al ma2or n6mero 5inario de 8 d7gitos& En otras pala5ras, la suma
de un d7gito de 8 n6meros 2 de su complemento es siempre 2LL&
%OM4)E(TA 3O( 6O E3%1)-&/A7
/a compuerta Q*) G* EQC/?+IK!I es un poco complicada en comparacin con las
dem3s& )epresenta una com5inacin de todas las compuertas anteriormente descritas&
/a salida proporciona un uno lgico G1I slo si sus entradas est3n en estados lgicos
di1erentes&
En el programa, esta operacin se utili4a con 1recuencia para comparar dos 52tes& /a
resta se puede utili4ar con el mismo propsito Gsi el resultado es ;, los 52tes son
igualesI& ! di1erencia de la resta, la %entaa de esta operacin lgica es 0ue no es posi5le
o5tener los resultados negati%os&
REGISTROS
?n registro o una celda de memoria es un circuito electrnico 0ue puede memori4ar el
estado de un 52te&
REGISTROS SFR
! di1erencia de los registros 0ue no tienen ninguna 1uncin especial 2 predeterminada,
cada microcontrolador dispone de un n6mero de registros de 1unciones especiales
G+F)I, con la 1uncin predeterminada por el 1a5ricante& +us 5its est3n conectados a los
circuitos internos del microcontrolador tales como tempori4adores, con%ertidores !R-,
osciladores entre otros, lo 0ue signi1ica 0ue directamente manean el 1uncionamiento de
estos circuitos, o sea del microcontrolador& Imag7nese oc$o interruptores 0ue manean el
1uncionamiento de un circuito pe0ue8o dentro del microcontrolador& /os registros +F)
$acen e9actamente lo mismo&
En otras pala5ras, el estado de los 5its de registros se 1ia dentro de programa, los
registros +F) dirigen los pe0ue8os circuitos dentro del microcontrolador, estos circuitos
se conectan por los pines del microcontrolador a un dispositi%o peri1"rico utili4ado
para&&& Aueno, depende de usted&
PUERTOS DE ENTRADA/SALIDA (E/S)
Para $acer 6til un microcontrolador, $a2 0ue conectarlo a un dispositi%o e9terno, o sea,
a un peri1"rico& Cada microcontrolador tiene uno o m3s registros Gdenominados puertosI
conectados a los pines en el microcontrolador& <Por 0u" se denominan como puertos de
entradaRsalida= Por0ue usted puede cam5iar la 1uncin de cada pin como 0uiera& Por
eemplo, usted desea 0ue su dispositi%o encienda 2 apague los tres se8ales /E-s 2 0ue
simult3neamente monitoree el estado lgico de L sensores o 5otones de presin& ?no de
los puertos de5e estar con1igurado de tal manera 0ue $a2a tres salidas Gconectadas a los
/E-sI 2 cinco entradas Gconectadas a los sensoresI& Eso se reali4a simplemente por
medio de so1tSare, lo 0ue signi1ica 0ue la 1uncin de alg6n pin puede ser cam5iada
durante el 1uncionamiento&
?na de las caracter7sticas m3s importantes de los pines de entradaRsalida GER+I es la
corriente m39ima 0ue pueden entregarRreci5ir& En la ma2or7a de los microcontroladores
la corriente o5tenida de un pin es su1iciente para acti%ar un /E- u otro dispositi%o de
5aa corriente G1;-2;m!I& Mientras m3s pines de ER+ $a2a, m3s 5aa es la corriente
m39ima de un pin& En otras pala5ras, todos los puertos de ER+ comparten la corriente
m39ima declarada en la $oa de especi1icacin t"cnica del microprocesador&
*tra caracter7stica importante de los pines es 0ue pueden disponer de los resistores pull-
up& Estos resistores conectan los pines al polo positi%o del %oltae de la 1uente de
alimentacin 2 su e1ecto se puede %er al con1igurar el pin como una entrada conectada a
un interruptor mec3nico o a un 5otn de presin& /as 6ltimas %ersiones de los
microcontroladores tienen las resistencias pull-up con1igura5les por so1tSare&
Cada puerto de ER+ normalmente est3 5ao el control de un registro +F) especiali4ado,
lo 0ue signi1ica 0ue cada 5it de ese registro determina el estado del pin correspondiente
en el el microcontrolador& Por eemplo, al escri5ir un uno lgico G1I a un 5it del registro
de control G+F)I, el pin apropiado del puerto se con1igura autom3ticamente como
salida& Eso signi1ica 0ue el %oltae lle%ado a ese pin se puede leer como ; o 1 lgico& En
caso contrario, al escri5ir ; al registro +F), el pin apropiado del puerto se con1igura
como salida& +u %oltae G;K o LKI corresponde al estado del 5it apropiado del registro
del puerto&
UNIDAD DE MEMORIA
/a unidad de memoria es una parte del microcontrolador utili4ada para almacenar los
datos& /a manera m3s 13cil de e9plicarlo es compararlo con un armario grande con
muc$os caones& +i marcamos los caones claramente, ser3 13cil acceder a cual0uiera de
sus contenidos al leer la eti0ueta en la parte delantera del can&
-e manera similar, cada direccin de memoria corresponde a una localidad de memoria&
El contenido de cual0uier localidad se puede leer 2 se le puede acceder al direccionarla&
/a memoria se puede escri5ir en la localidad o leer&
:a2 %arios tipos de memoria dentro del microcontrolador#
MEMO(&A (OM 6(EAD O'15 MEMO(57 - MEMO(&A DE
-*1O 1E%T)(A
/a memoria )*M se utili4a para guardar permanentemente el programa 0ue se est3
eecutando& El tama8o de programa 0ue se puede escri5ir depende del tama8o de esta
memoria& /os microcontroladores actuales normalmente utili4an el direccionamiento de
16 5its, 0ue signi1ica 0ue son capaces de direccionar $asta 64 T5 de memoria, o sea
6LL3L localidades& Por eemplo, si usted es principiante, su programa e9ceder3 pocas
%eces el l7mite de %arios cientos de instrucciones& :a2 %arios tipos de memoria )*M&
(om !e m8scara 6enmascara!a7 - M(OM
/a )*M enmascarada es un tipo de )*M cu2o contenido es programado por el
1a5ricante& El t"rmino Bde m3scaraC %iene del proceso de 1a5ricacin, donde las partes
del c$ip se plasman en las mascaras utili4adas durante el proceso de 1otolitogra17a& En
caso de 1a5ricacin de grandes series, el precio es mu2 5ao& *l%ide la idea de
modi1icarla&&&
OT4 (OM 6One Time 4rogramma9le (OM7 - (OM programa9le una
sola ve:
/a memoria programa5le una sola %e4 permite descargar un programa en el c$ip, pero
como dice su nom5re, una sola %e4& +i se detecta un error despu"s de descargarlo, lo
6nico 0ue se puede $acer es descargar el programa correcto en otro c$ip&
)/ E4(OM 6)/ Erasa9le 4rogramma9le (OM7 - (OM programa9le
9orra9le por ra;os ultravioleta
El encapsulado de este microcontrolador tiene una B%entanaC reconoci5le en la parte
alta& Eso permite e9poner la super1icie del c$ip de silicio a la lu4 de ultra%ioleta 2 5orrar
el programa completamente en %arios minutos& /uego es posi5le descargar un nue%o
programa en "l&
/a instalacin de esta %entana es complicada, lo 0ue por supuesto a1ecta al precio&
-esde nuestro punto de %ista, desgraciadamente, de manera negati%a&&&
Memoria <lash
Este tipo de memoria se in%ent en los a8os 8; en los la5oratorios de la compa87a
I'.E/, como 1orma desarrollada de la memoria ?K EP)*M& Ma 0ue es posi5le
escri5ir 2 5orrar el contenido de esta memoria pr3cticamente un n6mero ilimitado de
%eces, los microcontroladores con memoria Flas$ son per1ectos para estudiar,
e9perimentar 2 para la 1a5ricacin en pe0ue8a escala& Por la gran popularidad de esta
memoria, la ma2or7a de los microconroladores se 1a5rican con tecnolog7a flash $o2 en
d7a& +i usted %a a comprar un microcontrolador, >"ste es en de1initi%a la opcin per1ecta@
MEMO(&A (AM 6(A'DOM A%%E-- MEMO(57 - MEMO(&A DE
A%%E-O A1EATO(&O
!l apagar la 1uente de alimentacin, se pierde el contenido de la memoria )!M& +e
utili4a para almacenar temporalmente los datos 2 los resultados inmediatos creados 2
utili4ados durante el 1uncionamiento del microcontrolador& Por eemplo, si el programa
eecuta la adicin Gde cual0uier cosaI es necesario tener un registro 0ue representa lo
0ue se llama BsumaC en %ida cotidiana& Con tal propsito, uno de los registros de la
)!M es denominado BsumaC 2 se utili4a para almacenar los resultados de la adicin&
MEMO(&A EE4(OM 6E1E%T(&%A115 E(A-A01E
4(O=(AMMA01E (OM7 - (OM 4(O=(AMA01E 5
0O((A01E E1>%T(&%AME'TE
El contenido de la EEP)*M se puede cam5iar durante el 1uncionamiento Gsimilar a la
)!MI, pero se 0ueda permanentemente guardado despu"s de la p"rdida de la 1uente de
alimentacin Gsimilar a la )*MI& Por lo tanto, la EEP)*M se utili4a con 1recuencia
para almacenar los %alores creados durante el 1uncionamiento, 0ue tienen 0ue estar
permanentemente guardados& Por eemplo, si usted $a dise8ado una lla%e electrnica o
un alarma, ser7a estupendo permitir al usuario crear e introducir una contrase8a por su
cuenta& Por supuesto, la nue%a contrase8a tiene 0ue estar guardada al apagar la 1uente de
alimentacin& En tal caso una solucin per1ecta es el microcontrolador con una
EEP)*M em5e5ida&
INTERRUPCIN
/a ma2or7a de programas utili4an interrupciones durante eecucin de programa regular&
El propsito del microcontrolador generalmente consiste en reaccionar a los cam5ios en
su entorno& En otras pala5ras, cuando ocurre algo, el microcontrolador reacciona de
alguna manera&&& Por eemplo, al apretar el 5otn del mando a distancia, el
microcontrolador lo registra 2 responde al comando cam5iando de canal, su5iendo o
5aando el %olumen etc& +i el microcontrolador pasar3 la ma2or7a del tiempo
compro5ando %arios 5otones sin parar - las $oras, los d7as, esto no ser7a nada pr3ctico&
Por lo tanto, el microcontrolador Baprendi un trucoC durante su e%olucin& En %e4 de
seguir compro5ando alg6n pin o 5it, el microconrolador dea su Btra5ao de esperarC a
un Be9pertoC 0ue reaccionar3 slo en caso de 0ue suceda algo digno de atencin&
/a se8al 0ue in1orma al procesador central acerca de tal acontecimiento se denomina
I'.E))?PCIU'&
UNIDAD CENTRAL DE PROCESAMIENTO (CENTRAL PROCESSOR
UNIT - CPU)
Como indica su nom5re, esto es una unidad 0ue controla todos los procesos dentro del
microcontrolador& Consiste en %arias unidades m3s pe0ue8as, de las 0ue las m3s
importantes son#
Deco!i#ica!or !e instrucciones es la parte 0ue descodi1ica las instrucciones del
programa 2 acciona otros circuitos 5as3ndose en esto& El Bconunto de
instruccionesC 0ue es di1erente para cada 1amilia de microcontrolador e9presa
las capacidades de este circuitoV
)ni!a! l?gica aritm@tica 6Arithmetical 1ogical )nit - A1)7 reali4a todas las
operaciones matem3ticas 2 lgicas so5re datosV 2
Acumula!or o registro de tra5ao& Es un registro +F) estrec$amente
relacionado con el 1uncionamiento de la !/?& Es utili4ado para almacenar todos
los datos so5re los 0ue se de5e reali4ar alguna operacin Gsumar, mo%erI&
.am5i"n almacena los resultados preparados para el procesamiento 1uturo& ?no
de los registros +F), denominado )egistro +tatus GP+WI, est3 estrec$amente
relacionado con el acumulador& Muestra el BestadoC de un n6mero almacenado
en el acumulador Gel n6mero es ma2or o menor 0ue cero etc&I en cual0uier
instante dado&
BUS
El 5us est3 1ormado por 8, 16 o m3s ca5les& :a2 dos tipos de 5uses# el 5us de
direcciones 2 el 5us de datos& El 5us de direcciones consiste en tantas l7neas como sean
necesarias para direccionar la memoria& +e utili4a para transmitir la direccin de la CP?
a la memoria& El 5us de datos es tan anc$o como los datos, en este caso es de 8 5its o
l7neas de anc$o& +e utili4a para conectar todos los circuitos dentro del microcontrolador&
COMUNICACIN EN SERIE
/a cone9in paralela entre el microcontrolador 2 los peri1"ricos a tra%"s de los puertos
de entradaRsalida es una solucin per1ecta para las distancias cortas - $asta %arios
metros& 'o o5stante, en otros casos cuando es necesario esta5lecer comunicacin entre
dos dispositi%os a largas distancias no es posi5le utili4ar la cone9in paralela& En %e4 de
eso, se utili4a la cone9in en serie&
:o2 en d7a, la ma2or7a de los microcontroladores lle%an incorporados %arios sistemas
di1erentes para la comunicacin en serie, como un e0uipo est3ndar& Cu3l de estos
sistemas se utili4ar3 en un caso concreto, depende de muc$os 1actores, de los 0ue m3s
importantes son#
<Con cu3ntos dispositi%os el microcontrolador tiene 0ue intercam5iar los datos=
<Cu3l es la %elocidad del intercam5io de datos o5ligatoria=
<Cu3l es la distancia entre los dispositi%os=
<Es necesario transmitir 2 reci5ir los datos simult3neamente=
?na de las cosas m3s importantes en cuanto a la comunicacin en serie es el Protocolo
0ue de5e ser estrictamente o5ser%ado& Es un conunto de reglas 0ue se aplican
o5ligatoriamente para 0ue los dispositi%os puedan interpretar correctamente los datos
0ue intercam5ian mutuamente& !1ortunadamente, los microcontroladores se encargan de
eso autom3ticamente, as7 0ue el tra5ao de programadorRusuario es reducido a la
escritura 2 lectura de datos&
/E1O%&DAD DE T(A'-M&-&*' -E(&A1
/a %elocidad de transmisin serial Gbaud rateI es el t"rmino utili4ado para denotar el
n6mero de 5its transmitidos por segundo X5psY& >F7ese 0ue este t"rmino se re1iere a 5its,
2 no a 52tes@ El protocolo normalmente re0uiere 0ue cada 52te se transmita unto con
%arios 5its de control& Eso 0uiere decir 0ue un 52te en un 1luo de datos serial puede
consistir en 11 5its& Por eemplo, si %elocidad de transmisin serial es 3;; 5ps un
m39imo de 37 2 un m7nimo de 27 52tes se pueden transmitir por segundo&
/os sistemas de comunicacin serial m3s utili4ados son#
&
+
% 6&'TE( &'TE=(ATED %&(%)&T7 - %&(%)&TO &'TE(-
&'TE=(ADO
Circuito inter-integrado es un sistema para el intercam5io de datos serial entre los
microcontroladores 2 los circuitos integrados especiali4ados de generacin& +e utili4a
cuando la distancia entre ellos es corta Gel receptor 2 el transmisor est3n normalmente en
la misma placa de circuito impresoI& /a cone9in se esta5lece por medio de dos l7neas -
una se utili4a para transmitir los datos, mientras 0ue la otra se utili4a para la
sincroni4acin Gla se8al de reloI& Como se muestra en la 1igura, un dispositi%o es
siempre el principal Gmaster - maestroI, el 0ue reali4a el direccionamiento de un c$ip
su5ordinado Gsla%e - escla%oI antes de 0ue se inicie la comunicacin& -e esta manera un
microcontrolador puede comunicarse con 112 dispositi%os di1erentes& /a %elocidad de
transmisin serial es normalmente 1;; T5Rseg Gel modo est3ndarI o 1; T5Rseg Gmodo de
%elocidad de transmisin 5aaI& )ecientemente $an aparecido los sistemas con la
%elocidad de transmisin serial 3&4 M5Rsec& /a distancia entre los dispositi%os 0ue se
comunican por el 5us I2C est3 limitada a unos metros&
-4& 6-E(&A1 4E(&42E(A1 &'TE(<A%E 0)-7 - 0)- -E(&A1 DE
&'TE(<AA DE 4E(&<>(&%O-
?n 5us serial de inter1a4 de peri1"ricos es un sistema para la comunicacin serial 0ue
utili4a $asta cuatro l7neas Gnormalmente solo son necesarias tresI - para reci5ir los datos,
para transmitir los datos, para sincroni4ar 2 GopcionalI para seleccionar el dispositi%o
con el 0ue se comunica& Esto es la cone9in 1ull duple9, lo 0ue signi1ica 0ue los datos se
en%7an 2 se reci5en simult3neamente&
/a %elocidad de transmisin m39ima es ma2or 0ue en el sistema de cone9in I2C&
)A(T 6)'&/E(-A1 A-5'%2(O'O)-
(E%E&/E(/T(A'-M&TTE(7 - T(A'-M&-O(-(E%E4TO(
A-B'%(O'O )'&/E(-A1
Este tipo de cone9in es as7ncrona, lo 0ue signi1ica 0ue no se utili4a una l7nea especial
para transmitir la se8al de relo& En algunas aplicaciones este rasgo es crucial Gpor
eemplo, en mandar datos a distancia por )F o por lu4 in1rarroaI& Puesto 0ue se utili4a
slo una l7nea de comunicacin, tanto el receptor como el transmisor reci5en 2 en%7an
los datos a %elocidad misma 0ue $a sido prede1inida para mantener la sincroni4acin
necesaria& Esto es una manera simple de transmitir datos puesto 0ue 53sicamente
representa una con%ersin de datos de 8 5its de paralelo a serial& /a %elocidad de
transmisin no es alta, es $asta 1 M5itRsec&
OSCILADOR
/os pulsos uni1ormes generados por el oscilador permiten el 1uncionamiento armnico
2 s7ncrono de todos los circuitos del microcontrolador& El oscilador se con1igura
normalmente de tal manera 0ue utilice un cristal de cuar4o o resonador cer3mico para
esta5ili4acin de 1recuencia& !dem3s, puede 1uncionar como un circuito autnomo
Gcomo oscilador )CI& Es importante decir 0ue las instrucciones del programa no se
eecutan a la %elocidad impuesta por el mismo oscilador sino %arias %eces m3s despacio&
Eso ocurre por0ue cada instruccin se eecuta en %arios ciclos del oscilador& En algunos
microcontroladores se necesita el mismo n6mero de ciclos para eecutar todas las
instrucciones, mientras 0ue en otros el tiempo de eecucin no es el mismo para todas
las instrucciones& Por consiguiente, si el sistema utili4a el cristal de cuar4o con una
1recuencia de 2; M:Z, el tiempo de eecucin de una instruccin de programa no es L;
n+, sino 2;;, 4;; o 8;; n+ dependiendo del tipo del microcontrolador&
CIRCUITO DE ALIMENTACIN
:a2 0ue mencionar dos cosas dignas de atencin con relacin al circuito de la 1uente de
alimentacin de microcontroladores#
0rown out es un estado potencialmente peligroso 0ue ocurre al apagar el
microcontrolador o en caso de 0ue el %oltae de la 1uente de alimentacin salga
de unos m3rgenes de5ido al ruido el"ctrico& Como el microcontrolador dispone
de %arios circuitos 0ue 1uncionan a ni%eles de %oltae di1erentes, ese estado
puede causar un comportamiento descontrolado& Para e%itarlo, el
microcontrolador normalmente tiene un circuito incorporado para el 5roSn out
reset& El circuito reinicia inmediatamente el microcontrolador si el %oltae de
alimentacin cae por de5ao del l7mite&
El pin !e reset GreinicioI, marcado 1recuentemente con MC/) GMaster Clear
)esetI, sir%e para el reinicio e9terno del microcontrolador al aplicar un cero G;I
o un uno G1I lgico dependiendo del tipo del microcontrolador& En caso de 0ue
el circuito 5roSn out no est" incorporado, un simple circuito e9terno para el
5roSn out reset se puede conectar al pin MC/)&
TEMPORIADORES/CONTADORES
El oscilador del microcontrolador utili4a cristal de cuar4o para su 1uncionamiento&
!un0ue no se trata de la solucin m3s simple, $a2 muc$as ra4ones para utili4arlo& /a
1recuencia del oscilador es de1inida con precisin 2 mu2 esta5le, as7 0ue siempre genera
los pulsos del mismo anc$o, lo 0ue los $ace per1ectos para medicin de tiempo& .ales
osciladores se utili4an en los reloes de cuar4o& +i es necesario medir el tiempo
transcurrido entre dos e%entos, 5asta con contar los pulsos generados por este oscilador&
Esto es e9actamente lo 0ue $ace el tempori4ador&
/a ma2or7a de los programas utili4a estos cronmetros electrnicos en miniatura&
[eneralmente son registros +F) de 8 o 16 5its cu2o contenido se aumenta
autom3ticamente con cada pulso& >?na %e4 0ue se llena el registro, se genera una
interrupcin@
+i el tempori4ador utili4a el oscilador de cuar4o interno para su 1uncionamiento, es
posi5le medir el tiempo entre dos e%entos Gel %alor de registro en el momento de iniciar
la medicin es .1, en el momento de 1inali4ar la medicin es .2, el tiempo transcurrido
es igual al resultado de la resta .2 - .1I& +i los registros se aumentan con los pulsos 0ue
%ienen de la 1uente e9terna, tal tempori4ador se con%ierte en un contador&
Esto es una e9plicacin simple de su 1uncionamiento& Es un poco m3s complicado en
pr3ctica&
C%*MO <)'%&O'A' 1O- TEM4O(&AADO(E-D
En pr3ctica, los pulsos generados por el oscilador de cuar4o son lle%ados al circuito una
%e4 por cada ciclo de m30uina directamente o por el pre-escalador, lo 0ue aumenta el
n6mero en el registro del tempori4ador& +i una instruccin Gun ciclo de m30uinaI dura
cuatro per7odos del oscilador de cuar4o, este n6mero ser3 cam5iado un milln de %eces
por segundo Gcada microsegundoI al incorporar al cuar4o 0ue oscila con una 1recuencia
de 4 M:4&
Es 13cil de medir los inter%alos de tiempo cortos de la manera descrita anteriormente
G$asta 2L6 microsegundos por0ue es el ma2or n6mero 0ue un registro puede contenerI&
Esta o5%ia des%entaa se puede superar de %arias maneras# al utili4ar el oscilador m3s
lento, por medio de registros con m3s 5its, del pre-escalador o de la interrupcin& /as
primeras dos soluciones tienen algunas de5ilidades as7 0ue se recomienda utili4ar el pre-
escalador 2Ro la interrupcin&
)T&1&AA( )' 4(EE-%A1ADO( E' E1 <)'%&O'AM&E'TO
DE1 TEM4O(&AADO(
?n pre-escalador es un dispositi%o electrnico utili4ado para di%idir la 1recuencia por un
1actor predeterminado& Esto 0uiere decir 0ue se necesita lle%ar 1, 2, 4 o m3s pulsos a su
entrada para generar un pulso a la salida& /a ma2or7a de los microcontroladores
disponen de uno o m3s pre-escaladores incorporados 2 su tasa de di%isin puede ser
cam5iada dentro del programa& El pre-escalador se utili4a cuando es necesario medir los
per7odos de tiempo m3s largos& +i el tempori4ador 2 el tempori4ador perro guardi3n
comparten un pre-escalador, "ste no se puede utili4ar por los dos simult3neamente&
)T&1&AA( )'A &'TE(()4%&*' E' E1 <)'%&O'AM&E'TO
DE1 TEM4O(&AADO(
+i el registro del tempori4ador es de 8 5its, el ma2or n6mero 0ue se puede escri5ir en "l
es 2LL Gen los registros de 16 5its es el n6mero 6L&L3LI& +i se e9cede este n6mero, el
tempori4ador se reinicia autom3ticamente 2 el conteo comien4a de nue%o en cero& Esto
es denominado des5ordamiento o so5re1luo 'overflo0(& Permitido por el programa, el
des5ordamiento puede pro%ocar una interrupcin, lo 0ue a5re completamente nue%as
posi5ilidades& Por eemplo, el estado de registros utili4ados para contar segundos,
minutos o d7as puede ser implementado en una rutina de interrupcin& El proceso entero
Ge9cepto la rutina de interrupcinI se lle%a a ca5o internamente, lo 0ue permite 0ue los
circuitos principales del microcontrolador 1uncionen regularmente&
/a 1igura anterior descri5e el uso de una interrupcin en el 1uncionamiento del
tempori4ador& !l asignarle un pre-escalador al tempori4ador, se producen retrasos de
duracin ar5itraria con m7nima inter1erencia en la eecucin del programa principal&
%O'TADO(E-
+i un tempori4ador se suministra por los pulsos ingresados por el pin de entrada en el
microcontrolador, se produce un contador& E%identemente, es el mismo circuito
electrnico& /a 6nica di1erencia es 0ue los pulsos para contar se ingresan por el pin de
entrada 2 0ue su duracin Ganc$uraI no es de1inida& Por eso, no se pueden utili4ar para
medicin de tiempo, sino 0ue se utili4an para otros propsitos, por eemplo# contar los
productos en la cadena de montae, n6mero de rotaciones del ee de un motor, pasaeros
etc& Gdependiendo del sensor utili4ado&
TEMPORIADOR PERRO GUARDI!N ("ATCHDOG)
El perro guardi3n es un tempori4ador conectado a un oscilador )C completamente
independiente dentro del microcontrolador&
+i el perro guardi3n est3 $a5ilitado, cada %e4 0ue cuenta $asta el m39imo %alor en el
0ue ocurre el des5ordamiento del registro se genera una se8al de reinicio del
microcontrolador 2 la eecucin de programa inicia en la primera instruccin& El punto
es e%itar 0ue eso ocurra al utili4ar el comando adecuado&
/a idea se 5asa en el $ec$o de 0ue cada programa se eecuta en %arios 5ucles, m3s
largos o cortos& +i las instrucciones 0ue reinician el tempori4ador perro guardi3n se
colocan en lugares estrat"gicos del programa, aparte los comandos 0ue se eecutan
regularmente, el 1uncionamiento del perro guardi3n no a1ectar3 a la eecucin del
programa& +i por cual0uier ra4n Gruidos el"ctricos 1recuentes en la industriaI el
contador de programa Bse 0ueda atrapadoC dentro de un 5ucle in1inito, el %alor del
registro continuar3 aumentado por el tempori4ador perro guardi3n alcan4ar3 el m39imo
%alor, el registro se des5ordar3 2, 1alelu&a2 >*curre el reinicio@
CONVERTIDOR A/D
/as se8ales del mundo real son mu2 di1erentes de las 0ue BentiendeC el
microcontrolador Gceros 2 unosI, as7 0ue de5en ser con%ertidas para 0ue el
microcontrolador pueda entenderlas& ?n con%ertidor analgico-digital es un circuito
electrnico encargado de con%ertir las se8ales continuas en n6meros digitales discretos&
En otras pala5ras, este circuito con%ierte un n6mero real en un n6mero 5inario 2 se lo
en%7a a la CP? para ser procesado& Este mdulo se utili4a para medir el %oltae en el pin
de entrada&
El resultado de esta medicin es un n6mero Gel %alor digitalI utili4ado 2 procesado m3s
tarde en el programa&
ARQUITECTURA INTERNA
.odos los microcontroladores actuales utili4an uno de dos modelos 53sicos de
ar0uitectura denominados 3arvard 2 von)4eumann&
+on dos maneras di1erentes del intercam5io de datos entre la CP? 2 la memoria&
ArEuitectura !e von-'eumann
/os microcontroladores 0ue utili4an la ar0uitectura %on- 'eumann disponen de un solo
5lo0ue de memoria 2 de un 5us de datos de 8 5its& Como todos los datos se
intercam5ian por medio de estas 8 l7neas, este 5us est3 so5recargado, 2 la comunicacin
por si misma es mu2 lenta e ine1ica4& /a CP? puede leer una instruccin o leerRescri5ir
datos deRen la memoria& /os dos procesos no pueden ocurrir a la %e4 puesto 0ue las
instrucciones 2 los datos utili4an el mismo 5us& Por eemplo, si alguna l7nea de
programa dice 0ue el registro de la memoria )!M llamado B+?MC de5e ser aumentado
por uno Ginstruccin# incf +?M!I, el microcontrolador $ar3 lo siguiente#
1& /eer la parte de la instruccin de programa 0ue especi1ica F?P es lo 0ue de5e
reali4ar Gen este caso es la instruccin para incrementar BincfCI
2& +eguir le2endo la misma instruccin 0ue especi1ica so5re C?\/ dato lo de5e
reali4ar Gen este caso es el contenido del registro B+?M!CI
3& -espu"s de $a5er sido incrementado, el contenido de este registro se de5e
escri5ir en el registro del 0ue 1ue le7do Gdireccin del registro B+?M!CI
El mismo 5us de datos se utili4a para todas estas operaciones intermedias&
A(F)&TE%T)(A DE 2A(/A(D
/os microcontroladores 0ue utili4an esta ar0uitectura disponen de dos 5uses de datos
di1erentes& ?no es de 8 5its de anc$o 2 conecta la CP? con la memoria )!M& El otro
consiste en %arias l7neas G12, 14 o 16I 2 conecta a la CP? 2 la memoria )*M& Por
consiguiente, la CP? puede leer las instrucciones 2 reali4ar el acceso a la memoria de
datos a la %e4& Puesto 0ue todos los registros de la memoria )!M son de 8 5its de
anc$o, todos los datos dentro del microcontrolador 0ue se intercam5ian son de la misma
anc$ura& -urante el proceso de la escritura de programa, slo se manean los datos de 8
5its& En otras pala5ras, todo lo 0ue usted podr3 cam5iar en el programa 2 a lo 0ue podr3
a1ectar ser3 de 8 5its de anc$o& .odos los programas escritos para estos
microcontroladores ser3n almacenados en la memoria )*M interna del
microcontrolador despu"s de $a5er sido compilados a cdigo m30uina& 'o o5stante,
estas localidades de memoria )*M no tienen 8, sino 12, 14 o 16 5its& 4, 6 o 8 5its
adicionales representan una instruccin 0ue especi1ica a la CP? 0u" $acer con los datos
de 8 5its&
/as %entaas de este dise8o son las siguientes#
.odos los datos en el programa son de un 52te G8 5itsI de anc$o& Como un 5us
de datos utili4ado para lectura de programa tiene unas l7neas m3s G12, 14 o 16I,
tanto la instruccin como el dato se pueden leer simult3neamente al utili4ar estos
5its adicionales& Por eso, todas las instrucciones se eecutan en un ciclo sal%o las
instrucciones de salto 0ue son de dos ciclos&
El $ec$o de 0ue un programa Gla )*MI 2 los datos temporales Gla )!MI est"n
separados, permite a la CP? poder eecutar dos instrucciones simult3neamente&
-ic$o de manera sencilla, mientras 0ue se reali4a la lectura o escritura de la
)!M G0ue marca el 1in de una instruccinI, la siguiente instruccin se lee por
medio de otro 5us&
En los microcontroladores 0ue utili4an la ar0uitectura de von)4eumann, nunca
se sa5e cu3nta memoria ocupar3 alg6n programa& [eneralmente, la ma2or7a de
las instrucciones de programa ocupan dos localidades de memoria Guna contiene
in1ormacin so5re F?P se de5e reali4ar, mientras 0ue la otra contiene in1orma
cin so5re C?\/ dato se de5e reali4arI& +in em5argo, esto no es una 1rmula
r7gida, sino el caso m3s 1recuente& En los microcontroladores 0ue utili4an una
ar0uitectura :ar%ard, el 5us de la pala5ra de programa es m3s anc$o 0ue un
52te, lo 0ue permite 0ue cada pala5ra de programa est" compuesto por una
instruccin 2 un dato& En otras pala5ras, una localidad de memoria - una
instruccin de programa&
#UEGO DE INSTRUCCIONES
El nom5re colecti%o de todas las instrucciones 0ue puede entender el microcontrolador
es llamado 5uego de 6nstrucciones& Cuando se escri5e un programa en ensam5lador, en
realidad se especi1ican instrucciones en el orden en el 0ue de5en ser eecutadas& /a
restriccin principal es el n6mero de instrucciones disponi5les& /os 1a5ricantes aceptan
cual0uiera de los dos en1o0ues descritos a continuacin#
(&-% 6(e!uce! &nstruction -et %omputer7 - %omputa!ora con Guego
!e &nstrucciones (e!uci!as
En este caso la idea es 0ue el microcontrolador reconoce 2 eecuta slo operaciones
53sicas Gsumar, restar, copiar etc&&&I /as operaciones m3s complicadas se reali4an al
com5inar "stas Gpor eemplo, multiplicacin se lle%a a ca5o al reali4ar adicin sucesi%aI&
Es como intentar e9plicarle a alguien con pocas pala5ras cmo llegar al aeropuerto en
una nue%a ciudad& +in em5argo, no todo es tan oscuro& !dem3s, el microcontrolador es
mu2 r3pido as7 0ue no es posi5le %er todas las Bacro5aciasC aritm"ticas 0ue reali4a& El
usuario slo puede %er el resultado 1inal de todas las operaciones& Por 6ltimo, no es tan
di17cil e9plicar dnde est3 el aeropuerto si se utili4an las pala5ras adecuadas tales como#
a la derec$a, a la i40uierda, el ]ilmetro etc&
%&-% 6%ompleH &nstruction -et %omputer7 - %omputa!oras con un
Iuego !e instrucciones compleIo
>CI+C es opuesto a )I+C@ /os microcontroladores dise8ados para reconocer m3s de
2;; instrucciones di1erentes realmente pueden reali4ar muc$as cosas a alta %elocidad&
'o o5stante, uno de5e sa5er cmo utili4ar todas las posi5ilidades 0ue o1rece un lenguae
tan rico, lo 0ue no es siempre tan 13cil&&&
CMO ELEGIR UN MICROCONTROLADOR?
Aueno, si usted es principiante, 2 $a tomado decisin de tra5aar con los
microcontroladores& >Felicitaciones por la eleccin@ 'o o5stante, a primera %ista, no es
13cil la eleccin del microcontrolador m3s adecuado como parece a la primera %ista& >El
pro5lema no es el pe0ue8o rango de dispositi%os a elegir, sino todo lo contrario@
!ntes de empe4ar a dise8ar un dispositi%o 5asado en un microcontrolador, tome en
cuenta lo siguiente# cu3ntas entradasRl7neas son necesarias para su 1uncionamiento,
reali4ar7a el dispositi%o otras operaciones adem3s encenderRapagar un rel", necesita
alg6n modulo especiali4ado tal como el de comunicacin en serie, con%ertidor !R- etc&
Cuando usted tiene una clara imagen de lo 0ue 0uiere, el rango de seleccin se reduce
considera5lemente, 2 le 0ueda pensar en el precio& <Ka a tener %arios dispositi%os=
<Karios cientos= <?n milln= -e todos modos a$ora es m3s claro&
+i est3 pensando en todas estas cosas por primera %e4, todo le parecer3 un poco con1uso&
Por esa ra4n, %a2a paso a paso& !ntes 0ue nada, seleccione al 1a5ricante, es decir, la
1amilia de microcontroladores 0ue o1rece& /uego, aprenda a tra5aar con un modelo
particular& +lo aprenda lo 0ue necesite aprender, no entre demasiado en detalles&
)esuel%a el pro5lema espec71ico 2 le pasar3 una cosa incre75le - ser3 capa4 de manear
cual0uier modelo del mismo 1a5ricante&&&
M3s o menos, todo se parece a montar en 5icicleta# despu"s de %arias ca7das ine%ita5les
en el principio, ser3 capa4 de mantener el e0uili5rio 2 montar en cual0uier otra 5icicleta&
>Por supuesto, nunca se ol%ida tanto de montar en 5icicleta, como de la destre4a de
programacin@
1.J M&%(O%O'T(O1ADO(E- 4&%
/os microcontroladores PIC desarrollados por 7icrochip 8echnolog& son
pro5a5lemente la meor opcin si es principiante& :a2 %arias ra4ones por lo 0ue esto es
%erdadero&&&
El nom5re %erdadero de este microcontrolador es PICmicro G9eripheral 6nterface
,ontrollerI, conocido 5ao el nom5re PIC& +u primer antecesor 1ue creado en 1H7L por
la compa87a .eneral 6nstruments& Este c$ip denominado PIC16L; 1ue dise8ado para
propsitos completamente di1erentes& -ie4 a8os m3s tarde, al a8adir una memoria
EEP)*M, este circuito se con%irti en un %erdadero microcontrolador PIC& :ace unos
pocos a8os la compa87a 7icrochip 8echnolog& 1a5ric la L 5illon"sima muestra& +i est3
interesado en aprender m3s so5re eso, siga le2endo&
I1 2ou are interested in learning more a5out it, ust ]eep on reading&
La idea principal de este libro es proporcionar la informacin necesaria al usuario
para ue sea capaz de utilizar los microcontroladores en la pr"ctica despus de leerlo.
9ara evitar explicaciones pesadas & las historias infinitas sobre las caractersticas
:tiles de los microcontroladores diferentes, este libro describe el funcionamiento de un
modelo particular ue pertenece a la ;clase media alta<. Es 96,$=>??@ ) bastante
poderoso para ser digno de atencin & bastante simple para poder ser utilizado por
cualuiera. !s, los siguientes captulos describen este microcontrolador en detalle &
tambin se refieren a la familia 96, entera.
<amilia
(O
M
KL9;
tesM
(A
M
K9;t
esM
4in
es
<recu
encia
!e
reloI.
KM2:M
Entr
a!as
A/D
(esolu
ci?n
!el
conver
ti!or
A/D
%ompar
a!ores
Tempori:
a!ores !e
8/1" 9its
%omuni
caci?n
serial
-ali
!as
4N
M
Otros
ArEuitectura !e la gama 9aIa !e 8 9its. pala9ra !e instrucci?n !e 1+ 9its
PIC1;FQ
QQ
;&37L
-
;&7L
16 -
24
6 -
8
4 - 8 ; - 2 8 ; - 1 1 9 8 - - -
PIC12FQ
QQ
;&7L
- 1&L
2L -
38
8 4 - 8 ; - 3 8 ; - 1 1 9 8 - -
EEP)
*M
PIC16FQ
QQ
;&7L
- 3
2L -
134
14
-
44
2; ; - 3 8 ; - 2 1 9 8 - -
EEP)
*M
PIC16:K
QQQ
1&L 2L
18
-
2;
2; - - - 1 9 8 - -
Kdd J
1LK
ArEuitectura !e la gama me!ia !e 8 9its. pala9ra !e instrucci?n !e 1J 9its
PIC12FQ
QQ
1&7L
- 3&L
64 -
128
8 2; ; - 4 1; 1
1 - 2 9 8 1
9 16
- ; - 1
EEP)
*M
PIC12:K
QQQ
1&7L 64 8 2; ; - 4 1; 1
1 - 2 9 8 1
9 16
- ; - 1 -
PIC16FQ
QQ
1&7L
- 14
64 -
368
14
-
64
2; ; - 13 8 or 1; ; - 2
1 - 2 9 8 1
9 16
?+!).
I2C +PI
; - 3 -
PIC16:K
QQQ
1&7L
- 3&L
64 -
128
14
-
2;
2; ; - 12 1; 2
2 9 8 1 9
16
?+!).
I2C +PI
- -
ArEuitectura !e la gama alta !e 8 9its. pala9ra !e instrucci?n !e 1" 9its
PIC18FQ
QQ
4 -
128
2L6
-
18
-
32 - 48 4 - 16 1; or
12
; - 3 ; - 2 9 8 2
- 3 9 16
?+A2&;
C!'2&;
; - L -
3H3
6
8;
?+!).
I2C +PI
PIC18FQ
Q^QQ
8 -
128
1;2
4 -
3H3
6
28
-
1;
;
4; - 48
1; -
16
1; 2
; - 2 9 8 2
- 3 9 16
?+A2&;
?+!).
Et$ernet
I2C +PI
2 - L -
PIC18FQ
QTQQ
8 -
64
768
-
3H3
6
28
-
44
64
1; -
13
1; 2
1 9 8 3 9
16
?+!).
I2C +PI
2 -
.odos los microcontroladores PIC utili4an una ar0uitectura :ar%ard, lo 0ue 0uiere decir
0ue su memoria de programa est3 conectada a la CP? por m3s de 8 l7neas& :a2
microcontroladores de 12, 14 2 16 5its, dependiendo de la anc$ura del 5us& /a ta5la
anterior muestra las caracter7sticas principales de estas tres categor7as&
Como se puede %er en la ta5la de la p3gina anterior, sal%o Blos monstruos de 16 5itsC
PIC 24FQQQ 2 PIC 24:QQQ - todos los microcontroladores tienen la ar0uitectura
:ar%ard de 8 5its 2 pertenecen a una de las tres grandes grupos& Por eso, dependiendo
del tama8o de pala5ra de programa e9isten la primera, la segunda 2 la tercera categor7a
de microcontroladores, es decir microcontroladores de 12, 14 o 16 5its& Puesto 0ue
disponen del n6cleo similar de 8 5its, todos utili4an el mismo uego de instrucciones 2
el Bes0ueletoC 53sico de $ardSare conectado a m3s o menos unidades peri1"ricas&
/os microcontroladores PIC con pala5ras de programa de 14 5its parecen ser la meor
opcin para los principiantes& !0u7 est3 el por0u"&&&
#UEGO DE INSTRUCCIONES
El uego de instrucciones para los microcontroladores 16F8QQ inclu2e 3L instrucciones
en total& /a ra4n para un n6mero tan reducido de instrucciones 2ace en la ar0uietectura
)I+C& Esto 0uiere decir 0ue las instrucciones son 5ien optimi4adas desde el aspecto de
la %elocidad operati%a, la sencille4 de la ar0uitectura 2 la compacidad del cdigo& /o
malo de la ar0uitectura )I+C es 0ue se espera del programador 0ue $aga 1rente a estas
instrucciones& Por supuesto, esto es rele%ante slo si se utili4a el lenguae ensam5lador
para la programacin& Este li5ro se re1iere a la programacin en el lenguae de alto ni%el
C, lo 0ue signi1ica 0ue la ma2or parte del tra5ao 2a 1ue $ec$o por alguien m3s& !s7,
slo se tienen 0ue utili4ar instrucciones relati%amente simples&
T&EM4O DE EGE%)%&*' DE &'-T()%%&O'E-
.odas las instrucciones se eecutan en un ciclo& /a 6nicas e9cepciones pueden ser las
instrucciones de rami1icacin condicional o las instrucciones 0ue cam5ian el contenido
del contador de programa& En am5os casos, dos ciclos de relo son necesarios para la
eecucin de la instruccin, mientras 0ue el segundo ciclo se eecuta como un '*P G4o
operationI& /as instrucciones de un ciclo consisten en cuatro ciclos de relo& +i se utili4a
un oscilador de 4 M:4, el tiempo nominal para la eecucin de la instruccin es 1_+& En
cuanto a las instrucciones de rami1icacin, el tiempo de eecucin de la instruccin es
2_+&
^uego de instrucciones de los microcontroladores PIC de 14 5its#
&nstrucci?n Descripci?n Operaci?n 0an!era %1L O
&nstrucciones para la transmisi?n !e !atos
M*K/W ] Mo%er literal a W ] -` S 1
M*KWF 1 Mo%er el contenido de W a 1 W -` 1 1
M*KF 1,d Mo%er el contenido de 1 a d 1 -` d Z 1 1, 2
C/)W Aorrar el contenido de W ; -` W Z 1
C/)F 1 Aorrar el contenido de 1 ; -` 1 Z 1 2
+W!PF 1,d Intercam5iar de ni55les en 1
1G7#4I,G3#;I -` 1G3#;I,
G7#4I
1 1, 2
&nstrucciones aritm@tico - l?gicas
!--/W ] +umar literal a W WD] -` W C, -C, Z 1
!--WF 1,d +umar el contenido de W 2 1 WD1 -` d C, -C ,Z 1 1, 2
+?A/W ] )estar W de literal ]-W -` W C, -C, Z 1
+?AWF 1,d )estar W de 1 1-W -` d C, -C, Z 1 1, 2
!'-/W ] !'- W con literal W !'- ] -` W Z 1
!'-WF 1,d !'- W con 1 W !'- 1 -` d Z 1 1, 2
I*)/W ] *) inclusi%o de W con literal W *) ] -` W Z 1
I*)WF 1,d *) inclusi%o de W con 1 W *) 1 -` d Z 1 1, 2
Q*)WF 1,d *) e9clusi%o de W con literal W Q*) ] -` W Z 1 1, 2
Q*)/W ] *) e9clusi%o de W con 1 W Q*) 1 -` d Z 1
I'CF 1,d +umar 1 a 1 1D1 -` 1 Z 1 1, 2
-ECF 1,d )estar 1 a 1 1-1 -` 1 Z 1 1, 2
)/F 1,d
)otar F a la i40uierda a tra%"s
del 5it de !carreo
C 1 1, 2
))F 1,d
)otar F a la derec$a a tra%"s del
5it de !carreo
C 1 1, 2
C*MF 1,d Complementar 1 1 -` d Z 1 1, 2
&nstrucciones orienta!as a 9it
ACF 1,5 Poner a ; el 5it 5 del registro 1 ; -` 1G5I 1 1, 2
A+F 1,5 Poner a 1 el 5it 5 del registro 1 1 -` 1G5I 1 1, 2
&nstrucciones !e control !e programa
A.F+C 1,5 +altar si 5it 5 de registro 1 es ; +]ip i1 1G5I J ; 1 G2I 3
A.F++ 1,5 +altar si 5it 5 de reg& 1 es 1 +]ip i1 1G5I J 1 1 G2I 3
-ECF+Z 1,d
-isminuir 1 en 1& +altar si el
resultado es ;
1-1 -` d s]ip i1 Z J 1 1 G2I
1, 2,
3
I'CF+Z 1,d
Incrementar 1 en 1& +altar si el
resultado es 1
1D1 -` d s]ip i1 Z J
;
1 G2I
1, 2,
3
[*.* ] +altar a una direccin ] -` PC 2
C!// ] /lamar a una su5rutina PC -` .*+, ] -` PC 2
)E.?)' )etornar de una su5rutina .*+ -` PC 2
)E./W ] )etornar con literal en W ] -` W, .*+ -` PC 2
)E.FIE )etornar de una interupcin
.*+ -` PC, 1 -`
[IE
2
Otras instrucciones
'*P 'o operacin
.*+ -` PC, 1 -`
[IE
1
C/)W-.
)einiciar el tempori4ador perro
guardi3n
; -` W-., 1 -` .*,
1 -` P-
.*, P- 1
+/EEP Poner en estado de reposo
; -` W-., 1 -` .*,
; -` P-
.*, P- 1
E1 +i un registro de ER+ est3 modi1icado, el %alor utili4ado ser3 el %alor presentado en
los pines del microcontrolador&
E2 +i la instruccin se eecuta en el registro .M) 2 si dJ1, el pre-escalador ser3
5orrado&
E3 +i la instruccin se eecuta en el registro .M) 2 si dJ1, el pre-escalador ser3
5orrado&
!r0uitectura de los microcontroladores PIC de 8 5its& Cu3les de estos mdulos
pertenecer3n al microcontrolador, depender3 del tipo de microcontrolador&
%apitulo + - 4rogramaci?n !e los microcontrola!ores
*sted seguramente sabe ue no es suficiente slo conectar el microcontrolador a los
otros componentes & encender una fuente de alimentacin para hacerlo funcionar,
+verdad- 3a& ue hacer algo m"s. #e necesita programar el microcontrolador. #i cree
ue esto es complicado, est" euivocado. 8odo el procedimiento es mu& simple. /asta
con leer el texto para entender de lo ue estamos hablando.
2&1 /E'[?!^E+ -E P)*[)!M!CIU'
2&2 C!)!C.E)a+.IC!+ P)I'CIP!/E+ -E/ MIT)*C
2&3 .IP*+ -E -!.*+ E' MIT)*C
2&4 K!)I!A/E+ M C*'+.!'.E+
2&L *PE)!-*)E+
2&6 E+.)?C.?)!+ -E C*'.)*/
2&7 .IP*+ -E -!.*+ !K!'Z!-*+
2&8 F?'CI*'E+
2&H C!)!C.E)a+.IC!+ P)I'CIP!/E+ -E/ P)EP)*CE+!-*)
2&1; MIT)*C P)* F*) PIC
2&11 P)*[)!M!) /*+ PIC ?.I/IZ!'-* MIT)*C P)* F*) PIC
+.1 1E'=)AGE- DE 4(O=(AMA%&*'
El microcontrolador eecuta el programa cargado en la memoria Flas$& Esto se
denomina el cdigo eecuta5le 2 est3 compuesto por una serie de ceros 2 unos,
aparentemente sin signi1icado& -ependiendo de la ar0uitectura del microcontrolador, el
cdigo 5inario est3 compuesto por pala5ras de 12, 14 o 16 5its de anc$ura& Cada pala5ra
se interpreta por la CP? como una instruccin a ser eecutada durante el 1uncionamiento
del microcontrolador& .odas las instrucciones 0ue el microcontrolador puede reconocer
2 eecutar se les denominan colecti%amente Conunto de instrucciones& Como es m3s
13cil tra5aar con el sistema de numeracin $e9adecimal, el cdigo eecuta5le se
representa con 1recuencia como una serie de los n6meros $e9adecimales denominada
cdigo :e9& En los microcontroladores PIC con las pala5ras de programa de 14 5its de
anc$ura, el conunto de instrucciones tiene 3L instrucciones di1erentes&
LENGUA#E ENSAMBLADOR
Como el proceso de escri5ir un cdigo eecuta5le era considera5lemente arduo, en
consecuencia 1ue creado el primer lenguae de programacin denominado ensam5lador
G!+MI& +iguiendo la sinta9is 53sica del ensam5lador, era m3s 13cil escri5ir 2
comprender el cdigo& /as instrucciones en ensam5lador consisten en las a5re%iaturas
con signi1icado 2 a cada instruccin corresponde una localidad de memoria& ?n
programa denominado ensam5lador compila GtraduceI las instrucciones del lenguae
ensam5lador a cdigo m30uina Gcdigo 5inarioI&
:Este programa compila instruccin a instruccin sin optimi4acin& Como permite
controlar en detalle todos los procesos puestos en marc$a dentro del c$ip, este lenguae
de programacin toda%7a sigue siendo popular&
V$%&'(') *$ +$%,-'($) *$ ./0,/'1'234% *$ '+&0 %35$+
! pesar de todos los lados 5uenos, el lenguae ensam5lador tiene algunas des%entaas#
Incluso una sola operacin en el programa escrito en ensam5lador consiste en
muc$as instrucciones, $aci"ndolo mu2 largo 2 di17cil de manear&
Cada tipo de microcontrolador tiene su propio conunto de instrucciones 0ue un
programador tiene 0ue conocer para escri5ir un programa
?n programador tiene 0ue conocer el $ardSare del microcontrolador para
escri5ir un programa
Programa escrito en C GEl mismo programa compilado al cdigo ensam5ladorI#
/os lenguaes de programacin de alto ni%el GAasic, Pascal, C etc&I 1ueron creados con
el propsito de superar las des%entaas del ensam5lador& En lenguaes de programacin
de alto ni%el %arias instrucciones en ensam5lador se sustitu2en por una sentencia& El
programador 2a no tiene 0ue conocer el conunto de instrucciones o caracter7sticas del
$ardSare del microcontrolador utili4ado& Ma no es posi5le conocer e9actamente cmo
se eecuta cada sentencia, de todas 1ormas 2a no importa& !un0ue siempre se puede
insertar en el programa una secuencia escrita en ensam5lador&
+i alguna %e4 $a escrito un programa para un microcontrolador PIC en lenguae
ensam5lador, pro5a5lemente sepa 0ue la ar0uitectura )I+C carece de algunas
instrucciones& Por eemplo, no $a2 instruccin apropiada para multiplicar dos n6meros&
Por supuesto, para cada pro5lema $a2 una solucin 2 "ste no es una e9cepcin gracias a
la aritm"tica 0ue permite reali4ar las operaciones compleas al descomponerlas en un
gran n6mero operaciones m3s simples& En este caso, la multiplicacin se puede sustituir
con 1acilidad por adicin sucesi%a Ga 9 5 J a D a D a D &&& D aI& Ma estamos en el
comien4o de una $istoria mu2 larga&&& 'o $a2 0ue preocuparse al utili4ar uno de estos
lenguaes de programacin de alto ni%el como es C, por0ue el compilador encontrar3
autom3ticamente la solucin a "ste pro5lema 2 otros similares& Para multiplicar los
n6meros a 2 5, 5asta con escri5ir aE5&
L$%,-'($ C
El lenguae C dispone de todas las %entaas de un lenguae de programacin de alto
ni%el Ganteriormente descritasI 2 le permite reali4ar algunas operaciones tanto so5re los
52tes como so5re los 5its Goperaciones lgicas, despla4amiento etc&I& /as caracter7sticas
de C pueden ser mu2 6tiles al programar los microcontroladores& !dem3s, C est3
estandari4ado Gel est3ndar !'+II, es mu2 porta5le, as7 0ue el mismo cdigo se puede
utili4ar muc$as %eces en di1erentes pro2ectos& /o 0ue lo $ace accesi5le para cual0uiera
0ue cono4ca este lenguae sin reparar en el propsito de uso del microcontrolador& C es
un lenguae compilado, lo 0ue signi1ica 0ue los arc$i%os 1uentes 0ue contienen el cdigo
C se traducen a lenguae m30uina por el compilador& .odas estas caracter7sticas $icieron
al C uno de los lenguaes de programacin m3s populares&
/a 1igura anterior es un eemplo general de lo 0ue sucede durante la compilacin de
programa de un lenguae de programacin de alto ni%el a 5ao ni%el&
+.+ %A(A%TE(B-T&%A- 4(&'%&4A1E- DE1
M&L(O%
! continuacin %amos a presentar a los elementos principales del lenguae mi]roC
desarrollado por Mi]roele]troni]a& Este lenguae es mu2 similar al C est3ndar, no
o5stante en determinados aspectos di1iere del !'+I est3ndar en algunas caracter7sticas&
!lgunas de estas di1erencias se re1ieren a las meoras, destinadas a 1acilitar la
programacin de los microcontroladores PIC, mientras 0ue las dem3s son la
consecuencia de la limitacin de la ar0uitectura del $ardSare de los PIC& !0u7 %amos a
presentar caracter7sticas espec71icas del lenguae mi]roC en la programacin de los
microcontroladores PIC& El t"rmino C se utili4ar3 para re1erirse a las caracter7sticas
comunes de los lenguaes C 2 mi]roC&
Este li5ro descri5e una aplicacin mu2 concreta del lenguae de programacin C
utili4ado en el compilador mi]roC P)* 1or PIC& En este caso, el compilador se utili4a
para la programacin de los microcontroladores PIC&
FASES DE COMPILACIN
El proceso de compilacin consiste en %arios pasos 2 se eecuta autom3ticamente por el
compilador& Por con, un conocimiento 53sico del 1uncionamiento puede ser 6til para
entender el concepto del lenguae mi]roC&
El arc$i%o 1uente contiene el cdigo en mi]roC 0ue usted escri5e para programar el
microcontrolador& El preprocesador se utili4a autom3ticamente por el compilador al
iniciarse el proceso de la compilacin& El compilador 5usca las directi%as del
preprocesador G0ue siempre empie4an por bcdI dentro del cdigo 2 modi1ica el cdigo
1uente de acuerdo con las directi%as& En esta 1ase se lle%an a ca5o inclusin de arc$i%os,
de1inicin de constantes 2 macros etc, lo 0ue 1acilita el proceso& M3s tarde %amos a
descri5ir estas directi%as en detalle& El anali:a!or sint8ctico GparserI elimina toda la
in1ormacin in6til del cdigo Gcomentarios, espacios en 5lancoI& /uego, el compila!or
traduce el cdigo a un arc$i%o 5inario denominado arc$i%o &mcl& El enla:a!or Glin]erI
recupera toda la in1ormacin re0uerida para eecutar el programa de los arc$i%os
e9ternos 2 la agrupa en un solo arc$i%o G&d5gI& !dem3s, un pro2ecto puede contener
m3s de un arc$i%o 1uente 2 el programador puede utili4ar 1unciones prede1inidas 2
agrupadas dentro de los arc$i%os denominados li5rer7as& Por 6ltimo, el genera!or .heH
produce un arc$i%o &$e9& Es el arc$i%o 0ue se %a a cargar en el microcontrolador&
El proceso entero de la compilacin 0ue inclu2e todos los pasos anteriormente descritos
se le denomina ;building<&
ESTRUCTURA DE PROGRAMA
/a idea principal de escri5ir un programa en C es de BromperC un pro5lema ma2or en
%arios tro4os m3s pe0ue8os& +upongamos 0ue es necesario escri5ir un programa para el
microcontrolador para medir la temperatura 2 %isuali4ar los resultados en un /C-& El
proceso de medicin se reali4a por un sensor 0ue con%ierte temperatura en %oltae& El
microcontrolador utili4a el con%ertidor !R- para con%ertir este %oltae G%alor analgicoI
en un n6mero G%alor digitalI 0ue luego se en%7a al /C- por medio de %arios
conductores& En consecuencia, el programa se di%ide en cuatro partes, de las 0ue cada
una corresponde a una accin espec71ica#
1& !cti%ar 2 con1igurar el con%ertidor !R- incorporadoV
2& Medir el %alor analgicoV
3& Calcular temperaturaV 2
4& En%iar los datos en el 1ormato apropiado al /C-V
/os lenguaes de programacin de alto ni%el como es C le permiten solucionar este
pro5lema con 1acilidad al escri5ir cuatro 1unciones 0ue se eecutar3n c7clicamente sin
parar&
/a idea general es de di%idir el pro5lema en %arios tro4os, de los 0ue cada uno se puede
escri5ir como una sola 1uncin& .odos los programas escritos en mi]roC contienen por
lo menos una 1uncin llamada mainGI 0ue encierra entre lla%es ef las sentencias a ser
eecutadas& Esto es la primera 1uncin a ser eecutada al iniciarse la eecucin de
programa& /as otras 1unciones se pueden llamar dentro de la 1uncin main& En otras
pala5ras, podemos decir 0ue la 1uncin mainGI es o5ligatoria, mientras 0ue las dem3s
son opcionales& +i toda%7a no $a escrito un programa en C, es pro5a5le 0ue todo le
resulte con1uso& 'o se preocupe, ac"ptelo tal como es por el momento 2 m3s tarde
entender3 la sinta9is&
>M a$ora, su primer programa breald@ /a 1igura muestra la estructura de programa,
se8alando las partes en las 0ue consiste&
/a manera de escri5ir el cdigo en C es mu2 importante& Por eemplo, C di1iere entre
min6sculas 2 ma26sculas, as7 0ue la 1uncin mainGI no se puede escri5ir M!I'GI o
MainGI& !dem3s, note 0ue dos l7neas del cdigo dentro de la 1uncin terminan con un
punto 2 coma& En C todas las sentencias de5en terminar con un punto 2 coma bVd, as7 el
compilador puede aislarlas 2 traducirlas a cdigo m30uina&
COMENTARIOS
/os comentarios son las partes del programa utili4ados para aclarar las instrucciones de
programa o para proporcionar m3s in1ormacin al respecto& El compilador no $ace caso
a los comentarios 2 no los compila al cdigo eecuta5le& -ic$o de manera sencilla, el
compilador es capa4 de reconocer los caracteres especiales utili4ados para designar
dnde los comentarios comien4an 2 terminan 2 no $ace nada de caso al te9to entre ellos
durante la compilacin& :a2 dos tipos de tales caracteres& ?nos designan los
comentarios largos 0ue ocupan %arias l7neas de programa marcados por la secuencia
especial RE&&&ER, mientras 0ue otros designan los comentarios cortos 0ue ca5en en una
sola l7nea RR& !un0ue los comentarios no pueden a1ectar a la eecucin de programa, son
tan importantes como cual0uier otra parte de programa& !0u7 est3 el por0u"&&& Con
1recuencia es necesario meorar, modi1icar, actuali4ar, simpli1icar un programa&&& 'o es
posi5le interpretar incluso los programas simples sin utili4ar los comentarios&
+. T&4O- DE DATO- E' M&L(O%
En el lenguae C, los datos tienen un tipo, o sea, cada dato utili4ado en el programa de5e
tener su tipo especi1icado& Esto permite al compilador conocer el tama8o de dato
Gn6mero de 52tes re0uerido en la memoriaI 2 su representacin& :a2 %arios tipos de
datos 0ue se pueden utili4ar en el lenguae de programacin mi]roC dependiendo del
tama8o de dato 2 del rango de %alores& /a ta5la muestra el rango de %alores 0ue los
datos pueden tener cuando se utili4an en su 1orma 53sica&
Tipo !e
!ato
Descripci?n
TamaPo
6nQmero !e
9its7
(ango !e valores
c$ar .e9to GcaracteresI 8 de ; a 2LL
int Kalores enteros 16 de -32768 a 32767
1loat Kalores en punto 1lotante 32
de g1&17L4H43L;82h1;
-38
a
g6&8;L647744;7h1;
38
dou5le
Kalores en punto 1lotante
de do5le precisin
32
de g1&17L4H43L;82h1;
-38
a
g6&8;L647744;7h1;
38
E-e5ido a las limitaciones impuestas por el $ardSare del microcontrolador, es
imposi5le alcan4ar una ma2or precisin de datos 0ue la del tipo 1loat& Por eso, el tipo
dou5le en mi]roC e0ui%ale al tipo 1loat&
!l a8adir un pre1io Gcali1icadorI a cual0uier tipo de dato entero o car3cter, el rango de
sus posi5les %alores cam5ia as7 como el n6mero de los 52tes de memoria necesarios&
Por de1ecto, los datos de tipo int son con signo, mientras 0ue los de tipo c$ar son sin
signo& El cali1icador signed Gcon signoI indica 0ue el dato puede ser positi%o o negati%o&
El pre1io unsigned indica 0ue el dato puede ser slo positi%o& 'ote 0ue el pre1io es
opcional&
Tipo !e
!ato
Tipo !e !ato con
pre#iIo
TamaPo 6nQmero !e
9its7
(ango !e valores
c$ar signed c$ar 8 de -128 a 128
int
unsigned int 16 de ; a 6LL3L
s$ort int 8 de ; a 2LL
signed s$ort int 8 de -128 a 127
long int 32 de ; a 42H4H672HL
signed long int 32
de -2147483648 a
2147483647
T3.0 $%&$/0 (3%&)
?n entero es un n6mero sin parte 1raccionaria 0ue puede estar e9presado en los
siguientes 1ormatos#
:e9adecimal G5ase 16I# el n6mero empie4a con ;9 Go ;QI& /os enteros
$e9adecimales consisten en los d7gitos Gde ; a HI 2Ro las letras G!, A, C,-, E, FI&
Por eemplo# b;91!d&
-ecimal G5ase 1;I# el n6mero consiste en los d7gitos Gde ; a HI& El primer d7gito
no puede ser ;& En este 1ormato, se puede introducir el signo de n6mero GbDd o
b-dI& Por eemplo# L6H, -2L, D1L;;&
*ctal G5ase 8I# los n6meros se representan a 5ase 8 utili4ando slo 8 d7gitos Gde
; a 7I& /os enteros octales empie4an con ;& Por eemplo# b;L6d&
Ainario# cuando un entero empie4a con ;5 Go ;AI se representan como una serie
de 5its Gb;d 2 b1dI& Por eemplo# ;A1;;11111
0x11 // formato hexadecimal equivale a decimal 17
11 // formato decimal
-152 // formato decimal
011 // formato octal equivale a decimal 9
0b11 // formato binario equivale a decimal 3
T3.0 .-%&0 6+0&'%&$ (6+0'&)
El tipo punto 1lotante G1loatI se utili4a para los n6meros reales con el punto decimal& /os
datos de tipo 1loat se pueden representar de %arias maneras& ?n dato 1loat es siempre
consigno GsignedI&
0. // = 0.0
-1.23 // = -1.23
23.45e6 // = 23.45 * 10^6
2e-5 // = 2.0 * 10^-5
3E+10 // = 3.0 * 10^10
.09E34 // = 0.09 * 10^34
T3.0 2'/72&$/ (28'/)
El tipo c$ar es considerado como un entero por el compilador& 'o o5stante, se utili4a
normalmente para los datos de tipo car3cter& ?n dato de tipo car3cter est3 encerrado
entre comillas 2 codi1icado en un car3cter !+CII&
59 // entero
'p' // carcter ASCII 'p'
?na secuencia de caracteres es denominada cadena GstringI& /as cadenas est3n
encerradas entre comillas do5les, por eemplo#
"Presione el botn RA0"
+.J /A(&A01E- 5 %O'-TA'TE-
D$63%3230%$)
?na %aria5le es un o5eto nom5rado capa4 de contener un dato 0ue puede ser
modi1icado durante la eecucin de programa& En C, las %aria5les tienen tipo, 0ue
signi1ica 0ue es necesario especi1icar el tipo de dato 0ue se le asigna a una %aria5le Gint,
1loat etc&I& /as %aria5les se almacenan en la memoria )!M 2 el espacio de memoria 0ue
ocupan Gen 52tesI depende de su tipo&
/* dos lneas de programa consecutivas. En la primera lnea del
programa
se define el tipo de variable */
int a = 1000; // Variable a es de tipo int y equivale a 1000
a = 15; // a equivale a 15
?na constante tiene las mismas caracter7sticas 0ue una %aria5le e9cepto el $ec$o de 0ue
su %alor asignado no puede ser cam5iado durante la eecucin de programa& !
di1erencia de las %aria5les, las constantes se almacenan en la memoria Flas$ del
microcontrolador para guardar el ma2or espacio posi5le de memoria )!M& El
compilador las reconoce por el nom5re 2 el pre1io const& En mi]roC, el compilador
reconoce autom3ticamente el tipo de dato de una constante, as7 0ue no es necesario
especi1icar el tipo adicionalmente&
/* dos lneas de programa consecutivas */
const A = 1000 // el valor de la constante A est definido
A = 15; // ERROR! no se puede modificar el valor de la
constante
Cada %aria5le o constante de5e tener un identi1icador 0ue lo distingue de otras %aria5les
2 constantes& )e1i"rase a los eemplos anteriores, a 2 ! son identi1icadores&
(eglas para nom9rar
En mi]roC, los identi1icadores pueden ser tan largos como 0uiera& +in em5argo, $a2
%arias restricciones#
/os identi1icadores pueden incluir cual0uiera de los caracteres al1a5"ticos !-Z
Ga-4I, los d7gitos ;-H 2 el car3cter su5ra2ado iji& El compilador es sensi5le a la
di1erencia entre min6sculas 2 ma26sculas& /os nom5res de 1unciones 2 %aria5les
se escri5en con 1recuencia con min6sculas, mientras 0ue los nom5res de
constantes se escri5en con ma26sculas&
/os identi1icadores no pueden empe4ar con un d7gito&
/os identi1icadores no pueden coincidir con las pala5ras cla%e del lenguae
mi]roC, por0ue son las pala5ras reser%adas del compilador&
El compilador mi]roC reconoce 33 pala5ras cla%e#
mikro% - pala9ras clave
a5solute data i1 return t2pede1
asm de1ault inline r9 t2peid
at delete int s1r t2pename
auto do io s$ort union
5it dou5le long signed unsigned
5ool else muta5le si4eo1 using
5rea] enum namespace static %irtual
case e9plicit operator struct %oid
catc$ e9tern org sSitc$ %olatile
c$ar 1alse pascal template S$ile
class 1loat pri%ate t$is
code 1or protected t$roS
const 1riend pu5lic true
continue goto register tr2
Eemplos de los identi1icadores %3lidos e in%3lidos#
temperatura_V1 // OK
Presin // OK
no_corresponder // OK
dat2string // OK
SuM3 // OK
_vtexto // OK
7temp // NO -- no puede empezar con un nmero
%ms_alto // NO -- no pueden contener caracteres especiales
if // NO -- no puede coincidir con una palabra
reservada
j23.07.04 // NO -- no puede contener caracteres especiales
(punto)
nombre de variable // NO -- no puede contener espacio en blanco
D$2+'/'234% *$ 5'/3'9+$)
Cada %aria5le de5e ser declarada antes de ser utili4ada en el programa& Como las
%aria5les se almacenan en la memoria )!M, es necesario reser%ar el espacio para ellas
Guno, dos o m3s 52tesI& !l escri5ir un programa, usted sa5e 0u" tipo de datos 0uiere
utili4ar 2 0u" tipo de datos espera como resultado de una operacin, mientras 0ue el
compilador no lo sa5e& 'o se ol%ide de 0ue el programa manea las %aria5les con los
nom5res asignados& El compilador las reconoce como n6meros en la memoria )!M sin
conocer su tama8o 2 1ormato& Para meorar la legi5ilidad de cdigo, las %aria5les se
declaran con 1recuencia al principio de las 1unciones#
<tipo> variable;
Es posi5le declarar m3s de una %aria5le de una %e4 si tienen el mismo tipo&
<tipo> variable1, variable2, variable3;
!parte del nom5re 2 del tipo, a las %aria5les se les asignan con 1recuencia los %alores
iniciales ustamente enseguida de su declaracin& Esto no es un paso o5ligatorio, sino
buna cuestin de 5uenas costum5resd& +e parece a lo siguiente#
unsigned int peso; // Declarar una variable llamada peso
peso = 20; // Asignar el valor 20 a la variable peso
?n m"todo m3s r3pido se le denomina declaracin con iniciali4acin Gasignacin de los
%alores inicialesI#
unsigned int peso = 20; // peso est declarado y su valor es 20
+i $a2 %arias %aria5les con el mismo %alor inicial asignado, el proceso se puede
simpli1icar#
unsigned int peso1 = peso2 = peso3 = 20;
int valor_inicial = un_mnimo_de_petrleo = 0;
.enga cuidado de no declarar la misma %aria5le otra %e4 dentro de la misma
1uncin&
Puede modi1icar el contenido de una %aria5le al asignarle un nue%o %alor tantas
%eces 0ue 0uiera
!l declarar una %aria5le, siempre piense en los %alores 0ue la %aria5le tendr3 0ue
contener durante la eecucin de programa& En el eemplo anterior, peso1 no se
puede representar con un n6mero con punto decimal o un n6mero con %alor
negati%o&
D$2+'/'234% *$ 20%)&'%&$)
+imilar a las %aria5les, las constantes de5en ser declaradas antes de ser utili4adas en el
programa& En mi]roC, no es o5ligatorio especi1icar el tipo de constante al declararla&
Por otra parte, las constantes de5en ser iniciali4adas a la %e4 0ue se declaran& El
compilador reconoce las constantes por su pre1io const utili4ado en la declaracin& -os
siguientes declaraciones son e0ui%alentes#
const int MINIMUM = -100; // Declarar constante MINIMUM
const MINIMUM = -100; // Declarar constante MINIMUM
/as constantes pueden ser de cual0uier tipo, inclu2endo cadenas#
const T_MAX = 3.260E1; // constante de punto
flotante T_MAX
const I_CLASS = 'A'; // constante carcter
I_CLASS
const Mensaje = "Presione el botn IZQUIERDA"; // constante de cadena
Mensaje
/as constantes de enumeracin son un tipo especial de constantes enteras 0ue $ace un
programa m3s comprensi5le al asignar los n6meros ordinales a las constantes& Por
de1ecto, el %alor ; se asigna autom3ticamente a la primera constante entre lla%es, el
%alor 1 a la segunda, el %alor 2 a la tercera etc&
enum surtidores {AGUA,GASLEO,CLORO}; // AGUA = 0; GASLEO = 1; CLORO
= 2
Es posi5le introducir directamente el %alor de una constante dentro de la lista de
enumeraciones& El incremento se detiene al asignar un %alor a un elemento de matri4,
despu"s se reinicia a partir del %alor asignado& Kea el siguiente eemplo#
enum surtidores {AGUA,GASLEO=0,CLORO}; // AGUA = 0; GSOLEO = 0;
CLORO = 1
/as constantes de enumeracin se utili4an de la siguiente manera#
int Velocidad_de_ascensor
enum motor_de_ascensor {PARADA,INICIO,NORMAL,MXIMO};
Velocidad_de_ascensor = NORMAL; // Velocidad_de_ascensor = 2
D$63%3/ +0) %-$50) &3.0) *$ *'&0)
/a pala5ra cla%e t;pe!e# le permite crear con 1acilidad los nue%os tipos de datos&
typedef unsigned int positivo; // positivo es un sinnimo para el tipo
sin signo int
positivo a,b; // Variables a y b son de tipo positivo
a = 10; // Variable a equivale a 10
b = 5; // Variable b equivale a 5
!193&0 *$ 5'/3'9+$) : 20%)&'%&$)
?na %aria5le o una constante es reconocida por el compilador en 5ase de su
identi1icador& ?n identi1icador tiene signi1icado si el compilador lo puede reconocer& El
3m5ito de una %aria5le o una constante es el rango de programa en el 0ue su
identi1icador tiene signi1icado& El 3m5ito es determinado por el lugar en el 0ue se
declara una %aria5le o una constante& Intentar acceder a una %aria5le o una constante
1uera de su 3m5ito resulta en un error& ?na %aria5le o una constante es in%isi5le 1uera de
su 3m5ito& .odas las %aria5les 2 constantes 0ue pensamos utili4ar en un programa de5en
ser declaradas anteriormente en el cdigo& /as %aria5les 2 constantes pueden ser
glo5ales o locales& ?na %aria5le glo5al se declara en el cdigo 1uente, 1uera de todas las
1unciones, mientras 0ue una %aria5le local se declara dentro del cuerpo de la 1uncin o
dentro de un 5lo0ue anidado en una 1uncin&
! las %aria5les glo5ales se les puede acceder de cual0uiera parte en el cdigo, a6n
dentro de las 1unciones con tal de 0ue sean declaradas& El 3m5ito de una %aria5le glo5al
est3 limitado por el 1in del arc$i%o 1uente en el 0ue $a sido declarado&
El 3m5ito de %aria5les locales est3 limitado por el 5lo0ue encerrado entre lla%es ef en el
0ue $an sido declaradas& Por eemplo, si est3n declaradas en el principio del cuerpo de
1uncin Gigual 0ue en la 1uncin mainI su 3m5ito est3 entre el punto de declaracin 2 el
1in de esa 1uncin& )e1i"rase al eemplo anterior& ! las %aria5les locales declaradas en
main'( no se les puede acceder desde la >uncinA$ 2 al re%"s&
*n bloue compuesto es un grupo de declaraciones & sentencias 'ue pueden ser
bloues tambin( encerradas entre llaves. *n bloue puede ser una funcin, una
estructura de control etc. *na variable declarada dentro de un bloue se considera
local, o sea, BexisteC slo dentro del bloue. #in embargo, las variables declaradas
fuera del "mbito todava son visibles.
!un0ue las constantes no pueden ser modi1icadas en el programa, siguen las mismas
reglas 0ue las %aria5les& Esto signi1ica 0ue son %isi5les dentro de su 5lo0ue a e9cepcin
de las constantes glo5ales Gdeclaradas 1uera de cual0uier 1uncinI& /as constantes se
declaran normalmente en el inicio del cdigo 1uera de cual0uier 1uncin Gcomo
%aria5les glo5alesI&
C+')$) *$ '+1'2$%'13$%&0
/as clases de almacenamiento se utili4an para de1inir el 3m5ito 2 la %ida de %aria5les,
constantes 2 1unciones dentro de un programa& En mi]roC se pueden utili4ar di1erentes
clases de almacenamiento#
auto es una clase de almacenamiento por de1ecto para las %aria5les locales, as7
0ue se utili4a raramente& +e utili4a para de1inir 0ue una %aria5le local tiene
duracin local& /a clase de almacenamiento auto no se puede utili4ar con
%aria5les glo5ales&
static es una clase de almacenamiento por de1ecto para las %aria5les glo5ales&
Especi1ica 0ue una %aria5le es %isi5le dentro del arc$i%o& ! las %aria5les locales
declaradas con el pre1io static se les puede acceder dentro del arc$i%o 1uente Go
sea se comportan como %aria5les glo5alesI&
eHtern# la pala5ra cla%e eHtern se utili4a cuando el programa est3 compuesto
por di1erentes arc$i%os 1uente& Esto le permite utili4ar una %aria5le, una
constante o una 1uncin declarada en otro arc$i%o& Por supuesto, para compilar 2
enla4ar este arc$i%o correctamente, el mismo de5e ser incluido en su pro2ecto&
En los siguientes eemplos, el programa consiste en dos arc$i%os# >ileA$ &
>ileAD& El >ileA$ utili4a una %aria5le 2 una 1uncin declaradas en >ileAD&
<ile 1:
extern int cnt; // Variable cnt es visible en File_1
extern void hello(); // Funcin hello()se puede utilizar en File_1
void main(){
PORTA = cnt++; // Cualquier modificacin de cnt en File_1 ser
visible en File_2
hello(); // Funcin hello()se puede llamar desde aqu
}
<ile +:
int cnt = 0;
void hello();
void hello(){ // Modificaciones que afectan a la
. // cnt en File_1 son visibles aqu
.
.
}
+.R O4E(ADO(E-
?n operador es un s7m5olo 0ue denota una operacin aritm"tica, lgica u otra operacin
particular& -ic$o de manera sencilla, %arias operaciones aritm"ticas 2 lgicas se reali4an
por medio de los operadores& :a2 m3s de 4; operaciones disponi5les en el lenguae C,
pero se utili4a un m39imo de 1;-1L de ellas en pr3ctica& Cada operacin se reali4a so5re
uno o m3s operandos 0ue pueden ser %aria5les o constantes& !dem3s, cada operacin se
caracteri4a por la prioridad de eecucin 2 por la asociati%idad&
OPERADORES ARITM;TICOS
/os operadores aritm"ticos se utili4an en las operaciones aritm"ticas 2 siempre
de%uel%en resultados num"ricos& :a2 dos tipos de operadores, los unitarios 2 los
5inarios& ! di1erencia de las operaciones unitarias 0ue se reali4an so5re un operando, las
operaciones 5inarias se reali4an so5re dos operandos& En otras pala5ras, se re0uieren
dos n6meros para eecutar una operacin 5inaria& Por eemplo# aD5 o aR5&
Opera!or Operaci?n
D !dicin
- )esta
E Multiplicacin
R -i%isin
O )esto de la di%isin
int a,b,c; // Declarar 3 enteros a, b, c
a = 5; // Inicializar a
b = 4; // Inicializar b
c = a + b; // c = 9
c = c%2; // c = 1. Esta operacin se utiliza con frecuencia
// para comprobar la paridad. En este caso, el
// resultado es 1 lo que significa que la variable
// es un nmero imparo
O4E(ADO(E- DE A-&='A%&*'
:a2 dos tipos de asignacin en el lenguae C#
/os operadores simples asignan los %alores a las %aria5les utili4ando el car3cter
com6n iJi& Por eemplo# a J8
/as asignaciones compuestas son espec71icas para el lenguae C& Consisten en
dos caracteres como se muestra en la ta5la a la derec$a& +e utili4an para
simpli1icar la sinta9is 2 $a5ilitar la eecucin m3s r3pida&
Opera!or
EIemplo
E9presin E0ui%alente
DJ a DJ 8 a J a D 8
-J a -J 8 a J a - 8
EJ a EJ 8 a J a E 8
RJ a RJ 8 a J a R 8
OJ a OJ 8 a J a O 8
int a = 5; // Declarar e inicializar la variable a
a += 10; // a = a + 10 = 15
O4E(ADO(E- DE &'%(EME'TO 5 DE%(EME'TO
/as operaciones de incremento 2 decremento por 1 se denotan con kDDk 2 k--k& Estos
caracteres pueden preceder o seguir a una %aria5le& En primer caso GDD9I, la %aria5le 9
ser3 incrementada por 1 antes de ser utili4ada en la e9presin& -e lo contrario, la
%aria5le se utili4ar3 en la e9presin antes de ser aumentada por 1& /o mismo se aplica a
la operacin de decremento&
Opera!or EIemplo Descripci?n
DD
DDa
Karia5le kak es incrementada por 1
aDD
--
--5
Karia5le kak es decrementada por 1
5--
int a, b, c;
a = b = 5;
c = 1 + a++; // c = 6
b = ++c + a // b = 7 + 6 = 13
O4E(ADO(E- (E1A%&O'A1E-
/os operadores relacionales se utili4an en comparaciones con el propsito de comparar
dos %alores& En mi]roC, si una e9presin es e%aluada como 1alsa G1alseI, el operador
de%uel%e ;, mientras 0ue si una oracin es e%aluada como %erdadera GtrueI, de%uel%e 1&
Esto se utili4a en e9presiones tales como bsi la e9presin es e%aluada como %erdadera,
entonces&&&d
Opera!or Descripci?n EIemplo %on!ici?n !e veraci!a!
` ma2or 0ue 5 ` a si 9 es ma2or 0ue a
`J ma2or o igual 0ue a `J L si a es ma2or o igual 0ue R
l menor 0ue a l 5 si a es menor 0ue 9
lJ menor o igual 0ue a lJ 5 si a es menor o igual 0ue 9
JJ igual 0ue a JJ 6 si a es igual 0ue "
@J desigual 0ue a @J 5 si a es desigual 0ue 9
int prop;
int var = 5;
prop = var < 10; // Expresin es evaluada como verdadera, prop = 1
O4E(ADO(E- 1*=&%O-
:a2 tres tipos de operaciones lgicas en el lenguae C# M G!'-I lgico, * G*)I lgico
2 negacin - '* G'*.I lgico& /os operadores lgicos de%uel%en %erdadero G1 lgicoI
si la e9presin e%aluada es distinta de cero& En caso contrario, de%uel%e 1also G; lgicoI
si la e9presin e%aluada e0ui%ale a cero& Esto es mu2 importante por0ue las operaciones
lgicas se reali4an generalmente so5re las e9presiones, 2 no so5re las %aria5les
Gn6merosI particulares en el programa& Por lo tanto, las operaciones lgicas se re1ieren a
la %eracidad de toda la e9presin&
Por eemplo# 1 && 0 es igual a (expresin verdadera) && (expresin falsa)
El resultado ;, o sea - Falso en am5os casos&
Opera!or <unci?n
mm M
nn *
@ '*
O4E(ADO(E- DE MA'EGO DE 0&T-
! di1erencia de las operaciones lgicas 0ue se reali4an so5re los %alores o e9presiones,
las operaciones de maneo de 5its se reali4an so5re los 5its de un operando& +e
enumeran en la siguiente ta5la#
Opera!or Descripci?n EIemplo (esulta!o
~
Complemento a uno a J o5 5 J L a J -L
<<
-espla4amiento a la i40uierda a J 5 ll 2 5 J 1111;;11 a J 11;;11;;
>>
-espla4amiento a la derec$a a J 5 `` 2 5 J 1111;;11 a J ;;;1111;
&
M lgico para maneo de 5its c J a m 5
a J 111;;;11
5 J 11;;11;;
c J 11;;;;;;
|
* lgico para maneo de 5its c J a n 5
a J 111;;;11
5 J 11;;11;;
c J 111;1111
^
EQ*) lgico para maneo de 5its c J a p 5
a J 111;;;11
5 J 11;;11;;
c J ;;1;1111
4ote ue el resultado de la operacin de desplazamiento a la derecha depende del
signo de la variable. En caso de ue el operando se apliue a una variable sin signo o
positiva, se introducir"n los ceros en el espacio vaco creado por desplazamiento. #i se
aplica a un entero con signo negativo, se introducir" un $ para mantener el signo
correcto de la variable.
C%*MO )T&1&AA( 1O- O4E(ADO(E-D
!parte de los operadores de asignacin, dos operadores no de5en estar escritos
uno unto al otro&
x*%12; // esta expresin generar un error
Cada operador tiene su prioridad 2 asociati%idad como se muestra en la ta5la#
+imilar a las e9presiones aritm"ticas, los operadores se agrupan untos por
medio de par"ntesis& Primero se calculan las e9presiones encerradas entre
par"ntesis& +i es necesario, se pueden utili4ar los par"ntesis m6ltiples GanidadosI&
4riori!a! Opera!ores Asociativi!a!
!lta
() [] -> .
de i40uierda a
derec$a
! ~ ++ -- +(unitario) -(unitario) *Puntero
&Puntero
de derec$a a
i40uierda
* / %
de i40uierda a
derec$a
+ -
de i40uierda a
derec$a
< >
de i40uierda a
derec$a
< <= > >=
de i40uierda a
derec$a
== !=
de i40uierda a
derec$a
&
de i40uierda a
derec$a
^
de i40uierda a
derec$a
|
de i40uierda a
derec$a
&&
de i40uierda a
derec$a
||
de derec$a a
i40uierda
?:
de derec$a a
i40uierda
Aaa
= += -= *= /= /= &= ^= |= <= >=
de i40uierda a
derec$a
int a, b, res;
a = 10;
b = 100;
res = a*(a + b); // resultado = 1100
res = a*a + b; // resultado = 200
CONVERSIN DE TIPOS DE DATOS
!lgunas operaciones implican con%ersin de datos& Por eemplo, si di%ide dos %alores
enteros, $a2 una alta posi5ilidad de 0ue el resultado no sea un entero& El mi]roC reali4a
una con%ersin autom3tica cuando se re0uiera&
+i dos operandos de tipo di1erente se utili4an en una operacin aritm"tica, el tipo de
operando de la prioridad m3s 5aa se con%ierte autom3ticamente en el tipo de operando
de la prioridad m3s alta& /os tipos de datos principales se colocan seg6n el siguiente
orden er3r0uico#
/a autocon%ersin se reali4a asimismo en las operaciones de asignacin& El resultado de
la e9presin de la derec$a del operador de la asignacin siempre se con%ierte en el tipo
de la %aria5le de la i40uierda del operador& +i el resultado es de tipo de la prioridad m3s
alta, se descarta o se redondea para coincidir con el tipo de la %aria5le& !l con%ertir un
dato real en un entero, siempre se descartan los n6meros 0ue siguen al punto decimal&
int x; // A la variable x se le asigna el tipo integer (un entero)
x = 3; // A la variable x se le asigna el valor 3
x+ = 3.14; // El valor 3.14 se agrega a la variable x al
// realizar la operacin de asignacin
/* El resultado de la adicin es 6 en vez de 6.14, como era de
esperar.
Para obtener el resultado esperado sin descartar los nmeros que
siguen al
punto decimal, se debe declarar x como un punto flotante. */
Para reali4ar una con%ersin e9pl7cita, antes de escri5ir una e9presin o una %aria5le
$a2 0ue especi1icar el tipo de resultado de operacin entre par"ntesis&
double distancia, tiempo, velocidad;
distancia = 0.89;
tiempo = 0.1;
velocidad = (int)(a/b); // c = (int)8.9 = 8.0
velocidad = ((int)a)/b; // c = 0/0.1 = 0.0
+." E-T()%T)(A- DE %O'T(O1
ESTRUCTURAS CONDICIONALES
/as condiciones son ingredientes comunes de un programa& /as condiciones permiten
eecutar una o %arias sentencias dependiendo de %alide4 de una e9presin& En otras
pala5ras, B#i se cumple la condicin '...(, se debe hacer '...(. Ee lo contrario, si la
condicin no se cumple, se debe hacer '...(C& /os operandos condicionales i#-else 2
switch se utili4an en las operaciones condicionales& ?na sentencia condicional puede
ser seguida por una sola sentencia o por un 5lo0ue de sentencias a ser eecutadas&
O4E(ADO( %O'D&%&O'A1 i#-else
El operador i# se puede utili4ar solo o asociado al operador else 6i#-else7&
Eemplo del operador i##
if(expresin) operacin;
+i el resultado de la e9presin encerrada entre par"ntesis es %erdadero Gdistinto de ;I la
operacin se reali4a 2 el programa contin6a con la eecucin& +i el resultado de la
expresin es 1also G;I, la operacin no se reali4a 2 el programa contin6a
inmediatamente con la eecucin&
Como $emos mencionado, la otra 1orma com5ina tanto el operador i1 como el else#
if(expresin) operacin1 else operacin2;
+i el resultado de la expresin es %erdadero Gdistinto de ;I, se reali4a operacin$, de lo
contrario se reali4a la operacinD& -espu"s de reali4ar una de las operaciones, el
programa contin6a con la eecucin&
/a sentencia i#-else se parece a lo siguiente#
if(expresin)
operacin1
else
operacin2
+i operacin1 u operacin2 est3 compuesta, escri5a una lista de sentencias encerradas
entre lla%es& Por eemplo#
if(expresin) {
... //
... // operacin1
...} //
else
operacin2
El operador i#-else se puede sustituir por el operador condicional i=#i#
(expresin1)? expresin2 : expresin3
+i el %alor de la expresin$ es distinto de ; G%erdaderoI, el resultado de la e9presin
entera ser3 e0ui%alente al resultado o5tenido de la expresinD& -e lo contrario, si la
expresin$ es ; G1alsoI, el resultado de la e9presin entera ser3 e0ui%alente al resultado
o5tenido de la expresinF& Por eemplo#
maximum = (a>b)? a : b // A la variable maximum se le asigna el
// valor de la variable mayor(a o b)
Opera!or -witch
! di1erencia de la sentencia i#-else 0ue selecciona entre dos opciones en el programa, el
operador switch permite elegir entre %arias opciones& /a sinta9is de la sentencia switch
es#
switch (selector) // Selector es de tipo char o int
{
case constante1:
operacin1 // El grupo de operadores que se ejecutan si
... // el selector y la constante1 son equivalentes

break;

case constante2:
operacin2 // El grupo de operadores se ejecuta si
... // el selector y la constante2 son equivalentes
break;
...
default:

operacin_esperada // El grupo de operadores que se ejecuta
si
... // ninguna constante equivale al selector
break;
}
/a operacin sSitc$ se eecuta de la siguiente manera# primero se eecuta el selector 2
se compara con la constante1& +i coinciden, las sentencias 0ue pertenecen a ese 5lo0ue
se eecutan $asta llegar a la pala5ra cla%e 5rea] o $asta el 1inal de la operacin sSitc$&
+i no coinciden, el selector se compara con la constante2& +i coinciden, las sentencias
0ue pertenecen a ese 5lo0ue se eecutan $asta llegar a la pala5ra cla%e 5rea] etc& +i el
selector no coincide con ninguna constante, se eecutar3n las operaciones 0ue siguen al
operador de1ault&
.am5i"n es posi5le comparar una e9presin con un grupo de constantes& +i coincide con
alguna de ellas, se eecutar3n las operaciones apropiadas#
switch (das) // La variable das representa un da de la semana.
{ // Es necesario determinar si es un da laborable o no lo es
case1:case2:case3:case4:case5: LCD_message = 'Da laborable';
break;
case6:case7: LCD_message = 'Fin de semana'; break;
default:LCD_message_1 = 'Elija un da de la semana'; break;
}
La palabra clave de , BbreaGC se puede utilizar en cualuier tipo de bloues. !l utilizar
BbreaGC, es posible salir de un bloue aunue la condicin para su final no se ha&a
cumplido. #e puede utilizar para terminar un bucle infinito, o para forzar un bucle a
terminar antes de lo normal.
BUCLES
! menudo es necesario repetir una cierta operacin un par de %eces en el programa& ?n
conunto de comandos 0ue se repiten es denominado un 5ucle de programa& Cu3ntas
%eces se eecutar3, es decir cu3nto tiempo el programa se 0uedar3 en el 5ucle, depende
de las condiciones de salir del 5ucle&
B-2+$ "83+$
El 5ucle 0hile se parece a lo siguiente#
while(expresin){
comandos
...
}
/os comandos se eecutan repetidamente Gel programa se 0ueda en el 5ucleI $asta 0ue la
e9presin llegue a ser 1alsa& +i la e9presin es 1alsa en la entrada del 5ucle, entonces el
5ucle no se eecutar3 2 el programa continuar3 desde el 1in del 5ucle S$ile&
?n tipo especial del 5ucle de programa es un 5ucle in1inito& +e 1orma si la condicin
sigue sin cam5ios dentro del 5ucle& /a eecucin es simple en este caso 2a 0ue el
resultado entre lla%es es siempre %erdadero G1J%erdaderoI, lo 0ue signi1ica 0ue el
programa se 0ueda en el mismo 5ucle#
while(1){ // En vez de "while(1)", se puede escribir "while(true)"
... // Expresiones encerradas entre llaves se ejecutarn
... // repetidamente (bucle infinito)
}
B-2+$ F0/
El 5ucle #or se parece a lo siguiente#
for(expresin_inicial; expresin_de_condicin; cambiar_expresin) {
operaciones
...
}
/a eecucin de esta secuencia de programa es similar al 5ucle 0hile, sal%o 0ue en este
caso el proceso de especi1icar el %alor inicial Giniciali4acinI se realice en la
declaracin& /a e9presinj inicial especi1ica la %aria5le inicial del 5ucle, 0ue m3s tarde
se compara con la e9presinj dejcondicin antes de entrar al 5ucle& /as operaciones
dentro del 5ucle se eecutan repetidamente 2 despu"s de cada iteracin el %alor de la
e9presinjinicial se incrementa de acuerdo con la regla cam5iarje9presin& /a iteracin
contin6a $asta 0ue la e9presinjdejcondicin llegue a ser 1alsa&
for(k=0; k<5; k++) // La variable k se incrementa 5 veces (de 1 a 4) y
operacin // cada vez se repite la expresin operacin
...
/a operacin se eecutar3 cinco %eces& /uego, al compro5ar se %alida 0ue la e9presin
]lL sea 1alsa Gdespu"s de L iteraciones ]JLI 2 el programa saldr3 del 5ucle 1or&
B-2+$ D0-<83+$
El 5ucle do)0hile se parece a lo siguiente#
do
operacin
while (cambiar_condicin);
/a e9presin cam5iarjcondicin se eecuta al 1inal del 5ucle, 0ue signi1ica 0ue
operacin se eecuta como m7nimo una %e4 sin reparar en 0ue si la condicin es
%erdadera o 1alsa& +i el resultado es distinto de ; G%erdaderoI, el procedimiento se repite&
.odos los siguientes eemplos son e0ui%alentes& Esta parte del cdigo %isuali4a k$ellok
en un /C- 1; %eces con un retardo de un segundo& 'ote 0ue en este eemplo se utili4an
1unciones prede1inidas, 0ue se encuentran en las li5rer7as del compilador miGro, 9HI
for 96,& 'o o5stante le aconseamos 0ue no trate de entenderlas en detalle& +u
comportamiento general dentro del 5ucle se e9plica por medio de los comentarios&
i = 0; // Inicializacin del contador
while (i<10) { // Condicin
Lcd_Out(1,3,"hello"); // Visualizar `hello" en el LCD
Delay_ms(1000); // Retardo de 1000 ms
Lcd_Cmd(_LCD_CLEAR); // Borrar el LCD
Delay_ms(500); // Retardo de 500ms
i++; // Contador se incrementa
}
for(i=0; i<10; i++) { // Inicializacin, condicin, incremento
Lcd_Out(1,3,"hello"); // Visualizar `hello" en el LCD
Delay_ms(1000); // Retardo de 1000 ms
Lcd_Cmd(_LCD_CLEAR); // Borrar el LCD
Delay_ms(500); // Retardo de 500ms
}
i = 0; // Inicializacin del contador
do {
Lcd_Out(1,3,"hello"); // Visualizar `hello" en el LCD
Delay_ms(1000); // Retardo de 1000 ms
Lcd_Cmd(_LCD_CLEAR); // Borrar LCD
Delay_ms(500); // Retardo de 500ms
i++; // Contador se incrementa
}
while (i<10); // Condicin
SENTENCIAS DE SALTO
-E'TE'%&A 0(EAL
! %eces es necesario detener 2 salir de un 5ucle dentro de su cuerpo& /a sentencia 5rea]
se puede utili4ar dentro de cual0uier 5ucle GS$ile, 1or, do S$ileI 2 en las sentencias
sSitc$ tam5i"n& En "stas la sentencia 5rea] se utili4a para salir de las sentencias sSitc$
si la condicin case es %erdadera& En este eemplo, BEsperarC est3 parpadeando en la
pantalla /C- $asta 0ue el programa detecte un uno lgico en el pin ; del puerto
P*).!&
while(1){ // Bucle infinito
if(PORTA.F0 == 1) // Probar si el estado lgico del pin 0 del
puerto
break; // PORTA es 1; si equivale, salir del bucle
Lcd_Out(1,3,"Esperar"); // Visualizar `Esperar" en el LCD
Delay_ms(1000); // Retardo de 1000 ms
Lcd_Cmd(_LCD_CLEAR); // Borrar LCD
Delay_ms(500); // Retardo de 500ms
}
-E'TE'%&A %O'T&')E
/a sentencia continue colocada dentro de un 5ucle se utili4a para saltar una iteracin& !
di1erencia de la sentencia 5rea], el programa se 0ueda dentro del 5ucle 2 las iteraciones
contin6an&
// Si x=7, puede ocurrir una divisin por 0.
// continue se utiliza aqu para evitar esta situacin.
x=1;
while (x<=10) {
if (x == 7) { // saltar x=7 para evitar divisin por 0
Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(1,3,"Division by 0");
Delay_ms(1000);
x++;
continue; // Despus de esta lnea, saltar a la sentencia while
con x=8
}

a = 1/(x-7); // Esta divisin generar un error si x=7

/* Muchas operaciones pueden ocurrir aqu */

Lcd_Out(1,3,"Division is OK"); // Poner este mensaje en el LCD
Delay_ms(1000);
x++;
}
-E'TE'%&A =OTO
/a sentencia goto le permite $acer un salto a5soluto al otro punto en el programa& Esta
caracter7stica se de5e utili4ar con precaucin 2a 0ue su eecucin puede causar un salto
incondicional sin $acer caso a todos los tipos de limitaciones de anidacin& El punto
destino es identi1icado por una eti0ueta, utili4ada como un argumento para la sentencia
goto& ?na eti0ueta consiste en un identi1icador %3lido seguido por un colon G#I&
...
if(CO2_sensor) goto aire acondicionado; // Si se consta que el valor
... // de la variable CO2_sensor
=1
// hacer salto a la lnea de
programa
// Aire acondicionado
...
Aire acondicionado: // Desde aqu sigue la parte
del cdigo que se ejecutar
// en caso de una
concentracin de CO2 demasiado alta
... // en el ambiente
+.$ T&4O- DE DATO- A/A'AADO-
MATRICES
?na matri4 es una lista de elementos del mismo tipo colocados en localidades de
memoria contiguas& Cada elemento es re1erenciado por un 7ndice& Para declarar una
matri4, es necesario especi1icar el tipo de sus elementos Gdenominado tipo de matri4I, su
nom5re 2 el n6mero de sus elementos encerrados entre corc$etes& .odos los elementos
de una matri4 tienen el mismo tipo&
tipo_de_matri nombre_de_matriz [n_de_elementos];
/os elementos de una matri4 se identi1ican por su posicin& En C, el 7ndice %a desde ;
Gel primer elemento de una matri4I a '-1 G' es el n6mero de elementos contenidos en
una matri4I& El compilador tiene 0ue Bsa5erC cu3ntas localidades de memoria de5e
aloar al declarar una matri4& El tama8o de una mati4 no puede ser una %aria5le& Por eso,
se pueden utili4ar dos m"todos#
// mtodo 1
int display [3]; // Declaracin de la matriz display capaz de contener
3 enteros
// mtodo 2
const DIGITOS = 5;
char Matriz_nueva[DIGITOS]; // Declaracin de la matriz Matriz_nueva
// capaz de contener 5 enteros
?na matri4 se puede iniciali4ar a la %e4 0ue se declara, o m3s tarde en el programa& En
am5os casos, este paso se reali4a al utili4ar lla%es#
int array_1[3] = {10,1,100};
Para leer o modi1icar un elemento de matri4 del eemplo anterior, 5asta con introducir
su 7ndice encerrado entre corc$etes#
/* Se supone que a ha sido declarado anteriormente como un entero */
a = array_1[0]; // A la variable a se le asigna el valor del miembro
de matriz
// con ndice 0 (a = 10)
array_1[2] = 20; // Miembro de matriz array_1[2] es modificado (nuevo
valor es 20)
El siguiente programa cam5ia el orden de los elementos de una matri4& 'ote 0ue el
7ndice se puede e9presar mediante %aria5les 2 operaciones 53sicas&
void main() {
const MUESTRAS_DE_AGUA = 4; // Valor de la constante
MUESTRAS_DE_AGUA es 4
int i, temp; // Variables i y temp son de tipo int
int profunidad_de_sonda [MUESTRAS_DE_AGUA] = {24,25,1,1987};// Todos

// los miembros de la matriz profundidad
// de sonda son de tipo int

for(i=0;i<(MUESTRAS_DE_AGUA/2);i++){ // Bucle se ejecuta 2 veces
temp = profundiad_de_sonda [i]; // temp se utiliza para guardar
un valor
// temporalmente
profundiad_de_sonda [i] = profundiad_de_sonda [MUESTRAS_DE_AGUA-1-
i];
profundiad_de_sonda [MUESTRAS_DE_AGUA-1-i] = temp;
}

// Aqu tenemos: profundidad_de_sonda [MUESTRAS_DE_AGUA] =
{1987,1,25,24}
}
MATRICES BIDIMENSIONALES
!parte de las matrices unidimensionales 0ue se pueden interpretar como una lista de
%alores, el lenguae C le permite declarar matrices multidimensionales& En esta parte
%amos a descri5ir slo las matrices 5idimensionales, tam5i"n denominadas ta5las o
matrices& ?na matri4 5idimensional se declara al especi1icar el tipo de dato de matri4, el
nom5re de matri4 2 el tama8o de cada dimensin&
tipo_de_matri nombre_de_matriz [nmero_de_filas]
[nmero_de_columnas];
En la declaracin de esta matri4 n6merojdej1ilas 2 n6merojdejcolumnas representan el
n6mero de 1ilas 2 columnas en las 0ue consiste una ta5la, respecti%amente& Kea la
siguiente matri4 5idimensional#
int Tabla [3][4]; // Tabla se define de modo que tenga 3 filas y 4
columnas
Esta matri4 se puede representar en la 1orma de una ta5la&
ta5laX;YX;Y ta5laX;YX1Y ta5laX;YX2Y ta5laX;YX3Y
ta5laX1YX;Y ta5laX1YX1Y ta5laX1YX2Y ta5laX1YX3Y
ta5laX2YX;Y ta5laX2YX1Y ta5laX2YX2Y ta5laX2YX3Y
+imilar a las matrices unidimesionales, es posi5le asignar los %alores a los elementos de
una ta5la en la l7nea de declaracin& /a asignacin de5e ser reali4ada l7nea a l7nea como
en el siguiente eemplo& Como $emos %isto anteriormente, esta matri4 tiene dos 1ilas 2
tres columnas#
int Tabla [2][3]= { {3,42,1},{7,7,19} };
/a matri4 anterior se puede representar tam5i"n en la 1orma de una ta5la de %alores#
3 42 1
7 7 1H
PUNTEROS
?n puntero es una %aria5le destinada a reci5ir una direccin& ?n puntero BapuntaC a una
localidad de memoria, re1erenciada por una direccin& En C, la direccin de un o5eto se
puede o5tener por medio un operador unitario m& Para acceder al contenido de la
memoria en una direccin espec71ica Gtam5i"n llamado o5eto apuntadoI, se utili4a un
operador de indireccin GEI&
imni es la direccin de la localidad de memoria ini&
iEGmnIi es el contenido de la direccin iGmnIi, o sea de ini&
Para declarar un puntero, se de5e 0ue especi1icar el tipo de la %aria5le apuntada#
tipo_de_variable *puntero;
En esta etapa, el puntero mijpuntero apunta al %alor almacenado en esta localidad de
memoria, o sea, a un %alor desconocido& !s7 0ue, una iniciali4acin es mu2
recomenda5le#
puntero = &variable;
!$ora, puntero contiene la direccin de variable&
Para acceder al contenido de la %aria5le apuntada, de5e utili4ar bEd& El siguiente eemplo
muestra el contenido de memoria dependiendo de la accin reali4ada por medio del
puntero&
/os punteros son mu2 6tiles para manear las matrices& En este caso, un puntero se
utili4ar3 para apuntar al primer elemento de una matri4& -e5ido al $ec$o de 0ue es
posi5le reali4ar operaciones 53sicas so5re los punteros Garitm"tica de punterosI, es 13cil
manear los elementos de una matri4&
F7ese en la di1erencia entre bE%D1d 2 bEG%D1Id en el siguiente eemplo#
short int voltio[3] = {0,5,10};
short int *v;
v = &(voltio[0]); // v contiene la direccin de voltio[0]
*(v+1) = 2; // voltio[1] = 2
voltio[2] = *v+1; // tab[2] = 1 (tab[0] + 1)
*(v+2) = *(v+1); // voltio[2] = 2
v++; // v contiene la direccin de voltio[1]
*v = 1; // voltio[1] = 1
Los punteros tambin pueden ser declarados con el prefiJo BconstC. En este caso,
su valor no puede ser modificado despus de la inicializacin, similar a una
constante.
! diferencia de ,, el miGro, no admite aloJamiento din"mico.
ESTRUCTURAS
Ma $emos %isto cmo agrupar los elementos dentro de matrices& 'o o5stante, al utili4ar
este m"todo todos los elementos de5en ser del mismo tipo& !l utili4ar estructuras, es
posi5le agrupar di1erentes tipos de %aria5les 5ao el mismo nom5re& /as %aria5les
dentro de una estructura se le denominan los miem5ros de la estructura& /as estructuras
de datos se declaran al utili4ar la siguiente sinta9is#
struct nombre_de_estructura {
tipo1_de_miembro1 miembro1;
tipo!_de_miembro! miembro2;
tipo"_de_miembro" miembro3;
..
};
'o es posi5le iniciali4ar %aria5les dentro de la declaracin de la estructura de datos#
struct generador {
int voltaje;
char corriente;
};
Entonces, podr3 de1inir los o5etos denominados btur5inad en el cdigo& ! cada uno de
estos tres o5etos Gtur5inasI se le asignan las %aria5les bcorriented 2 b%oltaed&
struct generadores turbina_1, turbina_2, turbina_3;
Para acceder a las %aria5les, es preciso utili4ar el operador i&i
turbina_3.voltaje = 150;
turbina_3.corriente = 12;
Por supuesto, igual 0ue al utili4ar los punteros, toda%7a se le permite reali4ar
operaciones por medio de operadores 2 sentencias de1inidos en las partes anteriores&
#i est" familiarizado con el lenguaJe ,, recuerde ue miGro, no admite la
inicializacin de los miembros de estructura por medio de las llaves. 9or eJemplo,
BconJuntoA$ KL$M,BmCNOC devuelve un error en miGro,.
+.8 <)'%&O'E-
?na 1uncin es una su5rutina 0ue contiene una lista de sentencias a reali4ar& /a idea
principal es di%idir un programa en %arias partes utili4ando estas 1unciones para resol%er
el pro5lema inicial con m3s 1acilidad& !dem3s, las 1unciones nos permiten utili4ar las
destre4as 2 el conocimiento de otros programadores& ?na 1uncin se eecuta cada %e4
0ue se llame dentro de otra 1uncin& En C, un programa contiene como m7nimo una
1uncin, la 1uncin mainGI, aun0ue el n6mero de 1unciones es normalmente ma2or& !l
utili4ar 1unciones el cdigo se $ace m3s corto 2a 0ue es posi5le llamar una 1uncin
tantas %eces como se necesite& En C, el cdigo normalmente consiste en muc$as
1unciones& 'o o5stante, en caso de 0ue su programa sea mu2 corto 2 simple, puede
escri5ir todas las sentencias dentro de la 1uncin principal&
FUNCIN PRINCIPAL
/a 1uncin principal mainGI es una 1uncin particular puesto 0ue es la 0ue se eecuta al
iniciar el programa& !dem3s, el programa termina una %e4 completada la eecucin de
esta 1uncin& El compilador reconoce autom3ticamente esta 1uncin 2 no es posi5le
llamarla por otra 1uncin& /a sinta9is de esta 1uncin es la siguiente#
void main (void) {
/* el primer 'void' significa que main no devuelve ningn valor. El
segundo
'void' significa que no recibe ningn valor. Note que el compilador
tambin admite la siguiente sintaxis: 'main()' o 'void main()' o
'main(void)' */
..
/* --- Introduzca su programa aqu --- */
.
};
Esto signi1ica 0ue 1 es una 1uncin 0ue reci5e un n6mero real 9 como par3metro 2
de%uel%e 2E9-2&
/a misma 1uncin en C se parece a lo siguiente#
float f (float x, float y) // variables flotantes x y y se pueden
utilizar en f
{
float r; // declarar r para almacenar el resultado
r = 2*x - y; // almacenar el resultado del clculo en r
return r; // devolver el valor de r
}
Cada 1uncin de5e ser declarada apropiadamente para poder interpretarla correctamente
durante el proceso de compilacin& /a declaracin contiene los siguientes elementos#
.ipo de resultado G%alor de%ueltoI# tipo de dato del %alor de%uelto
'om5re de 1uncin# es un identi1icador 0ue $ace posi5le llamar a una 1uncin&
-eclaracin de par3metros se parece a la declaracin de %aria5le regular Gpor
eemplo# 1loat 9I& Cada par3metro consiste en una %aria5le, constante, puntero o
matri4, precedidos por la eti0ueta de tipo de dato& +e utili4an para pasar la
in1ormacin a la 1uncin al llamarla& /os par3metros di1erentes est3n
delimitados por comas&
Cuerpo de 1uncin# 5lo0ue de sentencias dentro de lla%es
?na 1uncin se parece a lo siguiente#
tipo_de_resultado nombre_de_funcin (tipo argumento1, tipo
argumento2,...)
{
Sentencia;
Sentencia;
...
return ...
}
4ote ue una funcin no necesita par"metros 'funcin main'( por eJemplo(, pero debe
estar entre parntesis. En caso contrario, el compilador malinterpretara la funcin.
9ara hacerlo m"s claro, puede sustituir el espacio en blanco encerrado entre
parntesis por la palabra clave voidP main 'void(.
VALOR DEVUELTO
?na 1uncin puede de%ol%er un %alor Gesto no es o5ligatorioI por medio de la pala5ra
cla%e return& !l llegar a return, la 1uncin e%al6a un %alor Gpuede ser una e9presinI 2 lo
de%uel%e a la l7nea de programa desde la 0ue 1ue llamada&
return r; // Devolver el valor contenido en r
return (2*x - y); // Devolver el valor de la expresin 2*x-y
?na 1uncin no puede de%ol%er m3s de un %alor, pero puede de%ol%er un puntero o una
estructura& .enga cuidado al utili4ar matrices 2 punteros& El siguiente eemplo es un
error t7pico#
int *reverse(int *tab) // Esta funcin debe devolver una matriz r
{ // cuyo contenido est en orden inverso con
// respecto a la matriz tab
int r[DIM]; // Declaracin de una nueva matriz denominada r
int i;
for(i=0;i<DIM;i++) // Bucle que copia el contenido de tab en r
r[i] = tab[DIM-1-i]; // al invertir el orden
return r; // Devolver el valor r
}
En realidad, el compilador reser%a memoria para el almacenamiento de %aria5les de la
1uncin re%erse slo durante su eecucin& ?na %e4 completada la eecucin de re%erse,
la localidad de memoria para la %aria5le i o para la matri4 r 2a no est3 reser%ada& Esto
signi1ica 0ue la direccin 0ue contiene los %alores de i o rXY est3 li5re para introducir
datos nue%os& Concretamente, la 1uncin de%uel%e slo el %alor mrX;Y, as7 0ue slo el
primer elemento de la matri4 ta5 ser3 almacenado en la memoria& /as dem3s localidades
de memoria, tales como mta5X1Y, mta5X2Y, etc& ser3n consideradas por el compilador
como espacios en 5lanco, o sea, estar3n listas para reci5ir los nue%os %alores&
Para escri5ir esta 1uncin es necesario pasar la matri4 r XY como par3metro G%ea la
su5seccin Pasar los par3metrosI&
/a 1uncin puede contener m3s de una sentencia return& En este caso, al eecutar la
primera sentencia return, la 1uncin de%uel%e el %alor correspondiente 2 se detiene la
eecucin de la 1uncin&
float abs (float x, float y) // Devolver el valor absoluto de 2*x-y
{
if ((2*x - y) >= 0)
return (2*x - y);
else
return (-2*x + y);
}
+i la 1uncin no de%uel%e ning6n %alor, la pala5ra %oid de5e ser utili4ada como un tipo
de resultado en la declaracin& En este caso, la sentencia return no de5e ser seguida por
ninguna e9presin& Puede ser omitida como en el siguiente eemplo#
void wait_1 (unsigned int a)
{
cnt ++; // Incremento de una variable global cnt
Delay_ms(a) ; // Ejecucin de la funcin Delay_ms
} // Note que Delay_ms no devuelve nada
DECLARAR PROTOTIPOS DE FUNCIONES
Para utili4ar una 1uncin, el compilador de5e ser consciente de su presencia en el
programa& En la programacin en C, los programadores normalmente primero escri5en
la 1uncin main'( 2 luego las 1unciones adicionales& Para a%isar al compilador de la
presencia de las 1unciones adicionales, se re0uiere declarar los prototipos de 1unciones
en el principio de programa antes de la 1uncin main'(& ?n prototipo de 1uncin est3
compuesto por#
tipo de resultado
nom5re de 1uncin
tipos de par3metros
un punto 2 coma GVI
El prototipo de la 1uncin main no necesita ser declarado&
float f (float, float);
/* no es obligatorio escribir los nombres de los parmetros. Este
prototipo
informa al compilador: en el programa se utilizar la funcin f,
que utiliza dos parmetros de tipo float y devuelve el resultado del
tipo
float. */
LLAMAR UNA FUNCIN
Mientras una 1uncin es de1inida 2 su prototipo declarado, se puede utili4ar en cul0uier
parte de programa& +in em5argo, como la 1uncin main es irai4i del programa, no puede
ser llamada de ninguna parte de programa& Para eecutar una 1uncin, es necesario
escri5ir su nom5re 2 los par3metros asociados& Kea los siguientes eemplos#
float resultado,a,b; // resultado,a,b,time deben coincidir con los
tipos
// definidos
int time = 100; // en la declaracin de las funciones f y wait_1
a = 10.54;
b = 5.2;
resultado = f(a,b); // Ejecutar la funcin f por medio de los
parmetros a y b
// El valor devuelto se le asigna a la variable
resultado
pausa_1(tiempo); // Ejecutar la funcin pausa_1 por medio de la
variable tiempo
funcinX(); // Ejecutar la funcin funcinX (sin parmetros)
Cuando se llama una 1uncin, el programa salta a la 1uncin llamada, la eecuta, despu"s
%uel%e a la l7nea desde la 0ue 1ue llamada&
PASAR LOS PAR!METROS
!l llamar una 1uncin, se le pasan los par3metros& En C e9isten dos 1ormas di1erentes
para pasar par3metros a una 1uncin&
El primer m"todo, denominado bpaso por %alord, es el m3s 13cil& En este caso, los
par3metros se pueden considerar como %aria5les locales de la 1uncin& Cuando se llama
una 1uncin, el %alor de cada par3metro se copia a un nue%o espacio de memoria
reser%ado durante la eecucin de la 1uncin& Como los par3metros se consideran como
%aria5les locales por el compilador, sus %alores pueden ser modi1icados dentro de la
1uncin, pero sus modi1icaciones no se 0uedan en la memoria una %e4 completada la
eecucin de la 1uncin&
.enga en cuenta de 0ue la 1uncin de%uel%e un %alor, 2 no una %aria5le& !dem3s, se
crean copias de los %alores de los par3metros, por lo 0ue sus nom5res en la 1uncin 1
pueden ser di1erentes de los par3metros utili4ados en la main'(& /a ma2or des%entaa del
bpaso por el %alord es 0ue la 6nica interaccin 0ue una 1uncin tiene con el resto del
programa es el %alor de%uelto de un solo resultado Go la modi1icacin de las %aria5les
glo5alesI&
El otro m"todo, denominado ipaso por direccini le permite so5repasar este pro5lema&
En %e4 de en%iar el %alor de una %aria5le al llamar a 1uncin, se de5e en%iar la direccin
de memoria del %alor& Entonces, la 1uncin llamada ser3 capa4 de modi1icar el
contenido de esta localidad de memoria&
// Funcin 'sort'ordena los miembros de la matriz por valor ascendente
// y devuelve el miembro con mximo valor
int sort(int *); // Prototipo de funcin
const SIZE = 5; // Nmero de miembros a ordenar
void main() {
int maximum, input[SIZE] = {5,10,3,12,0}; // Declaracin de
variables en la matriz
maximum = sort(input); // Llamar a funcin y
asignarle el mximo
// valor a la variable maximum
}
int sort(int *sequence) {
int i, temp, permut; // Declaracin de variables
permut = 1; // Bandera de bit indica que se ha hecho
una permutacin

while(permut!=0) { // Quedarse en el bucle hasta reinicar la
bandera
permut = 0; // Bandera reiniciada
for(i=0;i<SIZE-1;i++) { // Comparar y oredenar los miembros de la
// matriz (dos a dos)

if(sequence [i] > sequence[i+1]){
temp = sequence [i];
sequence[i] = sequence[i+1];
sequence[i+1] = temp;
permut = 1; // Se ha hecho una permutacin, bandera de bit
//se pone a uno
}
}
}

return sequence[SIZE-1]; // Devolver el valor del ltimo miembro

} // que es al mismo tiempo el miembro con el mximo valor
En este eemplo, por medio de una 1uncin se reali4an dos operaciones# ordena los
miem5ros de la matri4 por %alor asdendente 2 de%uel%e el m39imo %alor&
Para utili4ar una matri4 en una 1uncin es necesario asignar la direccin a la matri4 Go a
su primer miem5roI& Kea el siguiente eemplo#
float mtodo_1(int[]); // Declaracin de prototipo de la
funcin Mtodo_1
float mtodo_2(int*); // Declaracin de prototipo de la
funcin Mtodo_2
const NMERO_DE_MEDICIONES = 7; // Nmero de los miembros de la matriz
void main()
{
double promedio1, promedio2; // Declaracin de las variables
promedio1
// y promedio2
int voltaje [NMERO_DE_MEDICIONES] = {7,8,3,5,6,1,9}; // Declaracin
de la
// matriz
voltaje
promedio1 = mtodo_1(&voltaje[0]); // Parmetro de la funcin es la
direccin
// del primer miembro
promedio2 = mtodo_2(voltaje); // Parmetro de la funcin es la
direccin de
// la matriz
}
//
float mtodo_1(int voltaje[]) // Inicio de la funcin mtodo_1
{
int i, suma; // Declaracin de las variables
locales i y suma

for(i=0;i<NMERO_DE_MEDICIONES;i++) // Clculo del valor promedio de
voltaje
suma += voltaje[i]; // Es posible utilizar
*(voltaje+i)en vez de voltaje[i]

return(suma/NMERO_DE_MEDICIONES);
}
//
float mtodo_2 (int *voltaje) //Inicio de la funcin mtodo_2
{
int i, suma; // Declaracin de las variables locales
i y suma

for(i=0;i<NMERO_DE_MEDICIONES;i++) // Clculo del valor promedio de
voltaje
suma += *(voltaje+i); // Es posible utilizar
voltaje[i] en vez de *(voltaje+i)

return(suma/NMERO_DE_MEDICIONES);
}
/as 1unciones im"todoj1i 2 im"todoj2i son completamente e0ui%alentes& /as dos
de%uel%en el %alor promedio de la matri4 i%oltaeXYi& -espu"s de declararla, la direccin
del primer miem5ro se puede escri5ir como i%oltaei o im%oltaeX;Yi&
+.S %A(A%TE(B-T&%A- 4(&'%&4A1E- DE1
4(E4(O%E-ADO(
El preprocesador es un programa 0ue procesa el cdigo antes de 0ue pase por el
compilador& Funciona 5ao el control de las l7neas de comando del preprocesador
denominadas directi%as& /as directi%as del preprocesador se colocan en el cdigo
1uente, normalmente en el principio del arc$i%o& !ntes de pasar por el compilador, el
cdigo 1uente se e9amina por el preprocesador 0ue detecta 2 eecuta todas las directi%as
del preprocesador& /as directi%as del preprocesador siguen a una regla de la sinta9is
especial, empie4an por un s7m5olo bcd 2 no re0uieren ning6n punto 2 coma al 1inal GVI&
DIRECTIVAS DEL PREPROCESADOR
/a siguiente ta5la contiene un conunto de directi%as del preprocesador 1recuentemente
utili4adas#
/as directi%as del preprocesador se pueden di%idir en tres categor7as#
Directivas <unciones
cde1ine -e1ine una sustitucin de macro
cunde1 Fuita una de1inicin de nom5re de macro
cde1ine Especi1ica un arc$i%o a ser incluido
ci1de1 Prue5a para de1inicin de macro
cendi1 Especi1icar el 1inal de ci1
ci1nde1 Prue5a si una macro no est3 de1inida
ci1 Prue5a las condiciones de compilar
celse Especi1ica alternati%as cuando la prue5a de ci1 1alla
celi1 Especi1ica alternati%as cuando m3s de dos condiciones se necesitan
-e1iniciones de macro
Inclusiones de arc$i%os
Control de compilacin
!$ora, %amos a presentar slo las directi%as del preprocesador utili4adas con m3s
1recuencia& +in em5argo, no es necesario sa5er todas ellas para programar
microcontroladores& +lo tenga en cuenta 0ue el preprocesador es una $erramienta mu2
poderosa para los programadores a%an4ados en C, especialmente para el control de
compilacin&
D&(E%T&/A- DE1 4(E4(O%E-ADO( 4A(A DE<&'&( MA%(O-
Por medio de los macros es posi5le de1inir las constantes 2 eecutar 1unciones 53sicas&
?na sustitucin de macro es un proceso en el 0ue un identi1icador del programa se
sustitu2e por una cadena prede1inida& El preprocesador sustitu2e cada ocurrencia del
identi1icador en el cdigo 1uente por una cadena& -espu"s de la sustitucin, el cdigo
ser3 compilado normalmente&
Esto signi1ica 0ue el cdigo sustituido de5e respetar la sinta9is del mi]roC& /a accin se
reali4a por medio de la directi%a icde1inei&
#define PI 3.14159 // Sustitucin simple, PI ser sustituido por
// el valor 3.14159 en todas las partes del
programa
.am5i"n puede utili4ar los par3metros para reali4ar su5stituciones m3s compleas#
#define VOLUMEN (D,H) (((D/2)*(D/2)*PI))*H // Macro con parmetros
Entonces, en el cdigo, la siguiente sentencia#
Tanque_1 = VOLUMEN (Dimetro,altura);
ser3 sustituida por#
Tanque_1 = (((Dimetro/2)*(Dimetro/2)*PI)*altura;
Por medio de la directi%a cunde1 es posi5le 0uitar una de1inicin de nom5re de macro&
!s7 se especi1ica 0ue la su5stitucin 0ue se $a de1inido anteriormente 2a no %a ocurrir
en el siguiente cdigo& Esto es 6til cuando usted 0uiere restringir la de1inicin slo a una
parte particular del programa&
#undef TANQUE // Quitar la definicin del macro VOLUMEN
&'%1)-&*' DE A(%2&/O-
/a directi%a de preprocesador Qinclude copia un arc$i%o espec71ico en el cdigo 1uente&
El cdigo incluido de5e o5ser%ar la sinta9is de C para ser compilado correctamente&
:a2 dos 1ormas de escri5ir estas directi%as& En el primer eemplo, slo el nom5re de
arc$i%o se especi1ica, as7 0ue el preprocesador lo 5uscar3 dentro del arc$i%o include& En
el segundo eemplo, se especi1ica la ruta entera, as7 0ue el arc$i%o estar3 directamente
incluido Geste m"todo es m3s r3pidoI&
#include <nombre_de_archivo> // Se especifica slo el
nombre del archivo
#include "C:\Ruta\nombre_de_archivo.h" // Se especifica la
localidad
// exacta del archivo
+.1T M&L(O% 4(O <O( 4&%
Como 2a $emos %isto, $a2 %arias di%ergencias entre los lenguaes mi]roC 2 !'+I C&
En este cap7tulo %amos a presentar las caracter7sticas espec71icas del mi]roC con el
propsito de 1acilitar la programacin de los microcontroladores PIC&
ACCESO A LOS REGISTROS DE FUNCIONES ESPECIALES (SFR)
Como todos los microcontroladores, los de 1amilia PIC tienen los registros de 1unciones
especiales G+F)I& Para programar un PIC, es necesario acceder a estos registros Gpara
leerlos o escri5ir en ellosI& !l utili4ar el compilador miGro, 9HI for 96, es posi5le de
acceder a cual0uier +F) del microcontrolador de cual0uier parte del cdigo Glos +F) se
consideran como %aria5les glo5alesI sin necesidad de declararlo anteriormente& /os
registros de 1unciones especiales se de1inen en un arc$i%o e9terno e incluido dentro del
compilador Garc$i%o &de1I& Este arc$i%o contiene todos los +F) del microcontrolador
PIC a programar&
TRISB = 0; // todos los pines del puerto PORTB se configuran como
salidas
PORTB = 0; // todos los pines del PORTB se ponen a 0
ACCESO A LOS BITS INDIVIDUALES
El compilador miGro, 9HI for 96, le permite acceder a los 5its indi%iduales de
%aria5les de 8 5its por su nom5re o su posicin en 52te#
INTCON.B0 = 0; // Poner a 0 el bit 0 del registro INTCON
ADCON0.F5 = 1; // Poner a 1 el bit 5 del registo ADCON0
INTCON.GIE = 0; // Poner a 0 el bit de interrupcin global (GIE)
Para acceder a un 5it indi%idual, se puede utili4ar i&FQi as7 como i&AQi GQ es un entero
entre ; 2 7 0ue representa la posicin de 5itI&
TIPO SBIT
+i 0uiere declarar una %aria5le 0ue corresponde a un 5it de un +F), $a2 0ue utili4ar el
tipo sbit& ?na %aria5le de tipo sbit se comporta como un puntero 2 se de5e declarar
como una %aria5le glo5al#
sbit Botn_PARADA at PORTA.B7; // Botn_PARADA est definido
...
void main() { // Cualquier modificacin de
Botn_PARADA afectar a PORTA.B7
... // Cualquier modificacin de PORTA.B7
afectar a Botn_PARADA
}
En este eemplo, El /otnA9!H!E! es una %aria5le declarada por el usuario, mientras
0ue P*).!&A7 G5it 7 del puerto P*).!I ser3 autom3ticamente reconocido por el
compilador&
TIPO BIT
El compilador mi]roC P)* 1or PIC proporciona un tipo de datos 5it 0ue se puede
utili4ar para declarar %aria5les& 'o se puede utili4ar en las listas de argumentos,
punteros 2 los %alores de%ueltos de 1unciones& !dem3s, no es posi5le declarar e
iniciali4ar una %aria5le de tipo 5it en la misma l7nea& El compilador determina el 5it en
uno de los registros disponi5les para almacenar las %aria5les&
bit bf; // Variable de tipo bit vlida
bit *ptr; // Varibale de tipo bit invlida.
// No hay punteros a una variable de tipo bit
bit bg = 0; // ERROR ; declaracin con inicializacin no est
permitida
bit bg;
bg = 0; // Declaracin e inicializacin vlidas
INSERTAR CDIGO ASM EN C
! %eces el proceso de escri5ir un programa en C re0uiere las partes del cdigo escritas
en ensam5lador& Esto permite eecutar las partes complicadas del programa de una
1orma de1inida con precisin en un per7odo de tiempo e9acto& Por eemplo, cuando se
necesita 0ue los pulsos mu2 cortos Gde unos microsegundosI apare4can peridicamente
en un pin del microcontrolador& En tales casos la solucin m3s simple ser7a utili4ar el
cdigo ensam5lador en la parte del programa 0ue controla la duracin de pulsos&
?na o m3s instrucciones en ensam5lador est3n insertadas en el programa escrito en C,
utili4ando el comando asm#
asm
{
instrucciones en ensamblador
...
}
/os cdigos escritos en ensam5lador pueden utili4ar constantes 2 %aria5les
anteriormente de1inidos en C& Por supuesto, como el programa entero est3 escrito en C,
sus reglas se aplican al declarar estas constantes 2 %aria5les&
unsigned char maximum = 100; // Declarar variables: maximum = 100
asm
{ // Inicio del cdigo ensamblador
MOVF maximum,W // W = maximum = 100
...
} // Final del cdigo ensamblador
FUNCIN DE INTERRUPCIN
?na interrupcin detiene la eecucin normal de un programa para eecutar las
operaciones espec71icas& ?na lista de sentencias a eecutar de5e estar escrita dentro de
una 1uncin particular denominada interrupt'(& /a sinta9is de una interrupcin en
mi]roC se parece a lo siguiente#
void interrupt() {
cnt++ ; // Al producirse una interrupcin
// la cnt se incrementa en 1
PIR1.TMR1IF = 0; // Poner a 0 el bit TMR1IF
}
! di1erencia de las 1unciones est3ndar, no es necesario declarar el prototipo de la
1uncin interrupt'(& !dem3s, como la eecucin de esta 1uncin no 1orma parte de la
eecucin de programa regular, no se de5e llamar de ninguna parte de programa Gse
eecutar3 autom3ticamente dependiendo de las condiciones 0ue el usuario $a de1inido
en el programaI& En el siguiente cap7tulo %amos a dar una clara e9plicacin de la
eecucin 2 de1inicin de su5rutinas de interrupcin&
LIBRER=AS
?sted pro5a5lemente $a notado 0ue en los eemplos anteriores $emos utili4ado algunas
1unciones como son i-ela2jmsi, i/C-jouti, i/C-jcmdi etc& Estas 1unciones est3n
de1inidas en las li5rer7as contenidas en el compilador miGro,&
?na li5rer7a representa un cdigo compilado, anteriormente escrito en mi]roC, 0ue
contiene un conunto de %aria5les 2 1unciones& Cada li5rer7a tiene un propsito
espec71ico& Por eemplo, la li5rer7a /C- contiene 1unciones de %isuali4acin de la
pantalla /C-, mientras 0ue ,Amath proporciona algunas 1unciones matem3ticas&
!ntes de utili4ar alguna de ellas en el programa, es necesario comunic3rselo al
compilador al marcarlas en la lista de las li5rer7as del compilador e9istentes& +i el
compilador encuentra una 1uncin desconocida durante la eecucin de programa,
primero %a a 5uscar su declaracin en las li5rer7as marcadas&
!parte de las li5rer7as e9istentes, es posi5le crear las li5rer7as 2 luego utili4arlas en el
programa& El procedimiento de cmo crear li5rer7as se descri5e en detalles en :elp
G!&udaI del compilador&
El compilador mi]roC inclu2e tres tipos de li5rer7as#
- li5rer7as !'+I C est3ndar#
1i9rarUa Descripci?n
!'+I C Ct2pe
/i5rar2
?tili4ada principalmente para pro5ar o para con%ertir los datos
!'+I C Mat$
/i5rar2
?tili4ada para las operaciones matem3ticas de punto 1lotante
!'+I C +tdli5
/i5rar2
Contiene las 1unciones de li5rer7as est3ndar
!'+I C +tring
/i5rar2
?tili4ada para reali4ar las operaciones de cadenas 2 de
manipulacin de memoria
- li5rer7as miscel3neas#
1i9rarUa Descripci?n
Autton /i5rar2 ?tili4ada para desarrollar los pro2ectos
Con%ersion /i5rar2 ?tili4ada para la con%ersin de tipos de datos
+print /i5rar2 ?tili4ada para 1ormatear los datos con 1acilidad
Print*ut /i5rar2 ?tili4ada para 1ormatear los datos e imprimirlos
.ime /i5rar2 ?tili4ada para c3lculos de tiempo G1ormato ?'IQ timeI
.rigonometr2
/i5rar2
?tili4ada para la implementacin de 1unciones trigonom"tricas
1undamentales
+etmp /i5rar2 ?tili4ada para los saltos de programa
- li5rer7as para el $ardSare#
1i9rarUa Descripci?n
!-C /i5rar2 ?tili4ada para el 1uncionamiento del con%ertidor !R-
C!' /i5rar2 ?tili4ada para las operaciones con el mdulo C!'
C!'+PI /i5rar2
?tili4ada para las operaciones con el mdulo C!' e9terno
GMCP2L1L o MCP2L1;I
Compact Flas$ /i5rar2
?tili4ada para las operaciones con las taretas de memoria
,ompact >lash
EEP)*M /i5rar2
?tili4ada para las operaciones con la memoria EEP)*M
incorporada
Et$ernetPIC18F99^6;
/i5rar2
?tili4ada para las operaciones con el mdulo Et$ernet
incorporado
Flas$ Memor2 /i5rar2
?tili4ada para las operaciones con la memoria Flas$
incorporada
[rap$ic /cd /i5rar2
?tili4ada para las operaciones con el mdulo /C- gr31ico
con resolucin 128964
I2C /i5rar2
?tili4ada para las operaciones con el mdulo de
comunicacin serial I2C incorporado
Te2pad /i5rar2
?tili4ada para las operaciones con el teclado G5otones de
presin 494I
/cd /i5rar2
?tili4ada para las operaciones con el /C- Gde 2916
caracteresI
Manc$ester Code /i5rar2
?tili4ada para la comunicacin utili4ando el cdigo
7anchester
Multi Media Card /i5rar2
?tili4ada para las operaciones con las taretas multimedia
MMC 1las$
*ne Wire /i5rar2
?tili4ada para las operaciones con los circuitos utili4ando
la comunicacin serial Ine Rire
Port E9pander /i5rar2
?tili4ada para las operaciones con el e9tensor de puertos
MCP23+17
P+R2 /i5rar2 ?tili4ada para las operaciones con el teclado est3ndar P+R2
PWM /i5rar2
?tili4ada para las operaciones con el mdulo PWM
incorporado
)+-48L /i5rar2
?tili4ada para las operaciones con los mdulos utili4ando
la comunicacin serial )+48L
+o1tSare I2C /i5rar2 ?tili4ada para simular la comunicacin I2C con so1tSare
+o1tSare +PI /i5rar2 ?tili4ada para simular la comunicacin +PI con so1tSare
+o1tSare ?!). /i5rar2
?tili4ada para simular la comunicacin ?!). con
so1tSare
+ound /i5rar2 ?tili4ada para generar las se8ales de audio
+PI /i5rar2
?tili4ada para las operaciones con el mdulo +PI
incorporado
+PI Et$ernet /i5rar2
?tili4ada para la comunicacin +PI con el mdulo
E.:E)'E. GE'C28^6;I
+PI [rap$ic /cd /i5rar2
?tili4ada para la comunicacin +PI de 4 5its con el /C-
gr31ico
+PI /C- /i5rar2
?tili4ada para la comunicacin +PI de 4 5its con el /C-
Gde 2916 caracteresI
+PI /cd8 /i5rar2 ?tili4ada para la comunicacin +PI de 8 5its con el /C-
+PI .6H63C [rap$ic /cd
/i5rar2
?tili4ada para la comunicacin +PI con el /C- gr31ico
?!). /i5rar2
?tili4ada para las operaciones con el mdulo ?!).
incorporado
?+A :id /i5rar2
?tili4ada para las operaciones con el mdulo ?+A
incorporado
+.11 4(O=(AMA( 1O- 4&% )T&1&AA'DO
M&L(O% 4(O <O( 4&%
En las secciones anteriores $emos presentado el lenguae mi]roC, especialmente
dise8ado para programar los PIC& !$ora, lo 0ue $emos re%isado es su1iciente para
empe4ar a programar, es $ora de presentar el so1tSare 0ue utili4ar3 para desarrollar 2
editar los pro2ectos& Este so1tSare se le denomina Entorno de desarrollo integrado
GIntegrated -e%elopement En%ironment - I-EI e inclu2e todas las $erramientas
necesarias para desarrollar los pro2ectos Geditor, depurador etc&I& Por e9tensin, I-E es
a %eces llamado compilador& En esta seccin le ense8aremos lo 53sico 0ue de5e sa5er
para empe4ar a desarrollar su primer pro2ecto en mi]roC utili4ando el I-E del
compilador mi]roC P)* 1or PIC&
!parte de todas las caracter7sticas comunes de cual0uier I-E, mi]roC P)* 1or PIC
contiene las in1ormaciones de ar0uitectura de los microcontroladores PIC Gregistros,
mdulos de memoria, 1uncionamiento de circuitos particulares etc&I para compilar 2
generar un arc$i%o legi5le por un microcontrolador PIC& !dem3s, inclu2e las
$erramientas espec71icas para programar los microcontroladores PIC&
El proceso de crear 2 eecutar un pro2ecto contiene los siguientes pasos#
1& Crear un pro2ecto Gnom5re de pro2ecto, con1iguracin de pro2ecto,
dependencias entre arc$i%osI
2& Editar un programa
3& Compilar el programa 2 correccin de errores
4& -epurar Geecutar el programa paso a paso para asegurarse de 0ue se eecutan las
operaciones deseadasI&
L& Programar un microcontrolador Gcargar el arc$i%o &$e9 generado por el
compilador en el microcontrolador utili4ando el programador 96,flashI&
INSTALAR MI>ROC PRO FOR PIC
!ntes 0ue nada, usted de5e instalar el compilador Gcon su I-EI en la PC& /a instalacin
del miGro, 9HI for 96, es similar a la instalacin de cual0uier programa en WindoSs&
.odo el procedimiento se lle%a a ca5o por medio de los Si4ards Gasistentes de
instalacinI#
Aasta con seguir las instrucciones 2 pulsar so5re 'e9t, *T, 'e9t, 'e9t&&& En general, es
el mismo procedimiento menos la 6ltima opcin# i-o 2ou Sant to install PICF/!+:
%7&11 programmer=i& <Para 0u" sir%e este so1tSare= -e eso %amos a $a5lar m3s tarde&
Por a$ora, 5asta con sa5er 0ue es un so1tSare autnomo utili4ado para cargar el
programa en el microcontrolador&
?na %e4 m3s# 'e9t, *T, 'e9t, 'e9t&&&
?na %e4 completada la instalacin del PIC1las$, el sistema operati%o le preguntar3 a
instalar otro programa similar, un so1tSare para programar un grupo especial de los
microcontroladores PIC 0ue 1uncionan en modo de 5ao consumo G3&3 KI& +alte este
paso&&&
El 6ltimo paso - >la instalacin del controlador Gdri%erI@
Pulse so5re Mes&
?n controlador es un programa 0ue permite al sistema operati%o comunicar con un
peri1"rico& En este caso, este dispositi%o es el programador G$ardSareI del sistema de
desarrollo&
El controlador a instalar depende del sistema operati%o utili4ado& +eleccione el
controlador correspondiente al +* Gsistema operati%oI utili4ado Gpor medio de a5rir la
carpeta correspondienteI e inicie la instalacin& *tra %e4, 'e9t, *T, 'e9t, 'e9t&&&
Aueno, >todo est3 instalado para iniciar a programar@
CARACTER=STICAS PRINCIPALES DEL MI>ROC PRO FOR PIC
!l iniciar el I-E del compilador mi]roC P)* 1or PIC por primera %e4, aparecer3 una
%entana como se muestra a continuacin#
-esgraciadamente, una descripcin detallada de todas las opciones disponi5les de este
I-E nos tomar7a muc$o tiempo& Por eso %amos a descri5ir slo lo m3s importante del
compilador mi]roC P)* 1or PIC& -e todos modos, para o5tener m3s in1ormacion
presione el 5otn de !2uda G:elpI XF1Y&
MANE#AR LOS PROYECTOS
!ntes de empe4ar a escri5ir el cdigo, usted de5e crear un pro2ecto& ?n programa
escrito en el compilador miGro, 9HI for 96, no es un arc$i%o 1uente autnomo, sino
0ue 1orma parte de un pro2ecto 0ue inclu2e un cdigo $e9, un cdigo ensam5lador,
ca5ecera 2 otros arc$i%os& !lgunos de ellos se re0uieren para compilar el programa,
mientras 0ue otros se crean durante el proceso de compilacin& ?n arc$i%o con
e9tensin .mcppi le permite a5rir cual0uiera de estos pro2ectos&
Para crear un pro2ecto, 5asta con seleccionar la opcin 9roJect/4e0 9roJect, 2 un
Si4ard aparecer3 autom3ticamente& <Fu" $acer entonces= +iga las instrucciones&&&
4(OGE%T MA'A=E( 6ADM&'&-T(ADO( DE1 4(O5E%TO7
?na %e4 creado el pro2ecto, es posi5le manear todos los arc$i%os 0ue contiene al
utili4ar la %entana Proect Manager& Aasta con pulsar con el 5otn derec$o del ratn
so5re una carpeta 2 seleccionar la opcin 0ue necesita para su pro2ecto&
4(OGE%T -ETT&'=- 6%O'<&=)(A%&*' DE 4(O5E%TO-7
!l compilar un pro2ecto, el compilador genera el arc$i%o &$e9 0ue se cargar3 en el
microcontrolador& Estos arc$i%os ser3n di1erentes lo 0ue depende del tipo del
microcontrolador as7 como del propsito de la compilacin& Por esta ra4n es necesario
austar algunos par3metros de pro2ectos utili4ando la %entana 9roJect #ettings&
Device 6!ispositivo7:
!l seleccionar el tipo de microcontrolador a utili4ar permite al compilador e9traer el
arc$i%o de de1inicin Garc$i%o &de1I asociado& El arc$i%o de de1inicin de un
microcontrolador contiene las in1ormaciones espec71icas de sus registros +F), de sus
direcciones de memoria 2 algunas %aria5les de programacin espec71icas a ese tipo del
microcontrolador& Es o5ligatorio crear un arc$i%o &$e9 compati5le&
Oscillator 6oscila!or7:
+e de5e especi1icar la %elocidad de operacin del microcontrolador& Por supuesto, este
%alor depende del oscilador utili4ado& El compilador la necesita para compilar rutinas, lo
0ue re0uiere in1ormacin del tiempo Gpor eemplo, la 1uncin -ela2jmsI& M3s tarde, el
programador necesitar3 esta in1ormacin tam5i"n& /a %elocidad de operacin se
con1igura de modo 0ue permita al oscilador interno del microcontrolador 1uncionar a
una 1recuencia seleccionada&
0uil!/De9ugger T;pe:
.odo el proceso de compilar G5uildingI est3 compuesto por an3lisis sint3ctico GparsingI,
compilar, enla4ar Glin]ingI 2 generar los arc$i%os &$e9& El tipo de compilacin le
permite austar el modo de compilacin& -ependiendo del modo seleccionado, di1ieren
los arc$i%os generados a cargar en el microcontrolador&
(elease# !l elegir esta opcin , el compilador no puede a1ectar m3s a la eecucin de
programa despu"s de la compilacin& El programa a cargar en el microcontrolador no
ser3 modi1icado de ninguna manera&
&%D !e9ug# !l elegir esta opcin, una %e4 completado el proceso de la compilacin 2
cargado el programa en la memoria del microcontrolador, el compilador se 0ueda
conectado al microcontrolador por medio del ca5le ?+A 2 el programador, 2 toda%7a
puede a1ectar a su 1uncionamiento& El arc$i%o &$e9 generado contiene los datos
adicionales 0ue permiten el 1uncionamiento del depurador& ?na $erramienta
denominada mi]roIC- G-epurador en circuito - In Circuit -e5uggerI permite eecutar
el programa paso a paso 2 proporcionar un acceso al contenido actual de todos los
registros de un microcontrolador real&
El simulador no utili4a los dispositi%os reales para simular el 1uncionamiento del
microcontrolador, as7 0ue algunas operaciones no pueden ser reproducidas Gpor eemplo,
interrupcinI& -e todos modos, resulta m3s r3pido depurar un programa por medio de
un simulador& !dem3s, no se re0uiere ning6n dispositi%o destino&
'ote 0ue es posi5le modi1icar cual0uier con1iguracin en cual0uier momento mientras
se edita el programa& 'o se ol%ide de recompilar 2 reprogramar su dispositi%o despu"s
de modi1icar una con1iguracin&
1&0(A(5 MA'A=&'= 6ED&TO( DE 1&0(E(BA-7
El compilador tiene 0ue conocer todas las dependencias de su arc$i%o 1uente en mi]roC
para compilarlo apropiadamente& Por eemplo, si las li5rer7as 1orman parte de su
pro2ecto, de5e especi1icar cu3les de ellas se utili4an&
/as li5rer7as contienen un gran n6mero de 1unciones listas para ser utili4adas& /as
li5rer7as en mi]roC proporcionan muc$as 1acilidades para escri5ir programas para los
microcontroladores PIC& !5ra la %entana Librar& 7anager, 2 mar0ue las 0ue 0uiere
utili4ar en el programa& !l marcar una li5rer7a, se a8ade autom3ticamente al pro2ecto 2
se enla4a durante el proceso de la compilacin& !s7, no necesita incluir las li5rer7as
manualmente en sus arc$i%os del cdigo 1uente por medio de la directi%a del
preprocesador Qinclude&
Por eemplo, si su programa utili4a un /C- no $ace 1alta escri5ir nue%as 1unciones 2a
0ue al seleccionar la li5rer7a /cd, usted podr3 utili4ar 1unciones listas para ser utili4adas
de la li5rer7a /C- G/cdjCmd, /C-jInit&&&I en su programa& +i esta li5rer7a no est3
seleccionada en la %entana /i5rar2 Manager, cada %e4 0ue intente utili4ar una 1uncin
de la li5rer7a /C-, el compilador le in1ormar3 de un error& ?na descripcin de cada
li5rer7a est3 disponi5le al pulsar con el 5otn derec$o del ratn so5re su nom5re 2
seleccionar la opcin :elp&
EDITAR Y COMPILAR PROGRAMAS
%ODE ED&TO( 6ED&TO( DE %*D&=O7
El proceso de editar programas se de5e reali4ar dentro de la %entana principal del I-E
denominada Code Editor& !l escri5ir el programa no se ol%ide de los comentarios& /os
comentarios son mu2 importantes para depurar 2 meorar el programa& !dem3s, aun0ue
el compilador no tenga las restricciones de 1ormateo, siempre de5e seguir a las mismas
reglas de editar Gcomo en los eemplos proporcionados en este li5roI& Como no $a2
limitaciones de tama8o, no %acile en utili4ar los espacios en 5lanco para $acer su cdigo
m3s legi5le&
!l escri5ir un programa, no espere 0ue termine la redaccin del programa para
compilarlo& Compile su cdigo de 1orma regular con el propsito de corregir cu3nto m3s
errores de sinta9is& !simismo usted puede compilar su programa cada %e4 0ue se
complete la redaccin de una nue%a 1uncin as7 como pro5ar su comportamiento al
utili4ar modo de depuracin G%er la pr9ima seccinI& -e este modo, resulta m3s 13cil
solucionar los errores de programa para no Btomar un camino errneoC en redactar su
programa& -e lo contrario, usted tendr3 0ue editar el programa entero&
%ODE E341O(E( 6E341O(ADO( DE1 %*D&=O7
/a %entana Code E9plorer le permite locali4ar 1unciones 2 procedimientos dentro de los
programas largos& Por eemplo, si usted 5usca una 1uncin utili4ada en el programa,
5asta con pulsar dos %eces so5re su nom5re en esta %entana, 2 el cursor estar3
autom3ticamente posicionado en la l7nea apropiada en el programa&
%OM4&1A( 5 -O1)%&O'A( 1O- E((O(E-
Para compilar su cdigo, pulse so5re la opcin Auild en el men6 Proect& En realidad, el
pro2ecto entero se $a compilado, 2 si la compilacin se $a reali4ado con "9ito, se
generar3n los arc$i%os de salida Gasm, &$e9 etc&I& ?na compilacin se $a reali4ado con
"9ito si no se $a encontrado ning6n error& -urante el proceso de compilacin se generan
muc$os mensaes 0ue se %isuali4an en la %entana Messages& Estos mensaes consisten
en in1ormacin, ad%ertencia 2 errores& Cada error encontrado se asocia con su l7nea de
programa 2 su descripcin&
Como un error en su cdigo puede generar muc$o m3s errores, simplemente de5e
intentar solucionar el primer error en la lista 2 despu"s recompile su programa& En otras
pala5ras, es recomenda5le solucionar los errores uno a uno&
En el eemplo anterior $a2 dos errores 2 una ad%ertencia# 1altan un punto 2 coma 2 una
declaracin de %aria5le /a ad%ertencia le in1orma 0ue 1alta el tipo del %alor de%uelto de
la 1uncin main&
/a compilacin le permite corregir su programa por medio de solucionar todos los
errores en mi]roC& Cuando todos los errores se solucionen, su programa est3 listo para
ser cargado en el microcontrolador& -e todas 1ormas, su tarea toda%7a no est3 terminada,
por0ue a6n no sa5e si su programa se comporta como se espera5a o no&
DEPURAR EL PROGRAMA
/a depuracin es un paso mu2 importante 2a 0ue permite pro5ar el programa despu"s
de una compilacin reali4ada con "9ito, o solucionar los errores descu5iertos mientras
se eecuta el programa& Como 2a $emos %isto, $a2 dos modos de depurar# un depurador
so1tSare 0ue simula el 1uncionamiento del microcontrolador Gmodo por de1ectoI 2
depurador $ardSare Gmi]roIC-I 0ue 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 6,E debug, $a2 0ue cargar el programa en el
microcontrolador antes de depurarlo&
Para iniciar la depuracin, pulse so5re la opcin #tart debugger del men6 Hun& El editor
del cdigo ser3 ligeramente modi1icado autom3ticamente 2 aparecer3 una %entana
denominada Ratch Salues& El principio de depuracin se 5asa en eecutar el programa
paso a paso 2 monitorear el contenido de los registros 2 los %alores de las %aria5les& -e
este modo, es posi5le compro5ar el resultado de un c3lculo 2 %er si algo inesperado $a
ocurrido& !l eecutar el programa paso a paso, podr3 locali4ar los pro5lemas con
1acilidad&
-urante una depuracin el programa ser3 modi1icado, por lo 0ue usted siempre de5e
recompilar el programa despu"s de cada correccin, 2 reiniciar el depurador para
compro5ar 0u" $a sido modi1icado&
%OMA'DO- DE1 DE4)(ADO(
:a2 %arios comandos disponi5les para depurar el cdigo#
-tep &nto - Eecuta una sola instruccin& Cuando la instruccin es una llamada a
una rutina, el depurador $ar3 un salto a la rutina 2 se detendr3 despu"s de
eecutar la primera instruccin dentro de la rutina&
-tep Over - +e eecuta una sola instruccin& Cuando la instruccin es una
llamada a una rutina, el depurador no $ar3 un salto a la rutina, sino 0ue se
eecutar3 toda la rutina& El depurador se detiene a la primera instruccin despu"s
de la llamada a la rutina&
(un To %ursor - El programa se eecuta $asta la l7nea en la 0ue se encuentre el
cursor&
-tep out - +e eecutan las dem3s instrucciones dentro de la rutina& El depurador
se detiene inmediatamente al salir de la rutina&
4)'TO- DE ()4T)(A 60(EAL4O&'T-7
/os puntos de ruptura $acen el proceso de depurar los programas de una manera m3s
e1iciente, puesto 0ue permiten eecutar el programa a toda %elocidad 2 detenerlo
autom3ticamente en una l7nea espec71ica Gpunto de rupturaI& Eso resulta mu2 6til,
permiti"ndole compro5ar slo las partes cr7ticas del programa 2 no perder el tiempo
pro5ando todo el programa l7nea a l7nea& Para a8adir o 0uitar un punto de ruptura 5asta
con pulsar so5re la l7nea apropiada en el lado i40uierdo del editor del cdigo, o
presionar XFLY& ?na pe0ue8a %entana denominada Area]points muestra dnde est3n los
puntos de ruptura& 'ote 0ue las l7neas designadas como puntos de ruptura est3n
marcadas en roo&
/a l7nea 0ue se est3 eecutando actualmente est3 marcada en a4ul& Es posi5le leer el
contenido de registros 2 %aria5les seleccionados en la %entana Watc$ Kalues en
cual0uier momento& Para eecutar la parte de programa desde la l7nea en la 0ue est3 el
cursor $asta el punto de ruptura, utilice el comando )unRPause -e5ugger&
/E'TA'A NAT%2 /A1)E-
El depurador so1tSare 2 $ardSare tienen la misma 1uncin de monitorear el estado de
los registros durante la eecucin del programa& /a di1erencia es 0ue el depurador
so1tSare simula eecucin de programa en una PC, mientras 0ue el depurador IC-
Gdepurador $ardSareI utili4a un microcontrolador real& Cual0uier cam5io de estado
lgico de los pines se indica en el registro GpuertoI apropiado& Como la %entana Watc$
Kalues permite monitorear el estado de todos los registros, resulta 13cil compro5ar si un
pin est3 a cero o a uno& /a 6ltima modi1icacin est3 marcada en roo en la %entana
Watc$ Kalues& Esto le permite locali4ar la modi1icacin en la lista de %aria5les 2
registros durante el proceso de la depuracin&
Para %isuali4ar esta %entana es necesario seleccionar la opcin Sie0/Eebug
Rindo0s/Ratch Salues& Entonces usted puede $acer una lista de registrosR%aria5les 0ue
0uiere monitorear 2 la manera de %isuali4arlos&
-TO4NAT%2 6%(O'*MET(O7
+i 0uiere sa5er cu3nto tiempo tarda un microcontrolador en eecutar una parte del
programa, seleccione la opcin )unRKieS +topSatc$& !parecer3 una %entana como se
muestra en la 1igura a la derec$a& <Cmo 1unciona un cronmetro= Eso es pan comido&&&
El tiempo 0ue tarda un comando Gstep into, step o%er, runRpause etc&I en eecutarse por
el depurador se mide autom3ticamente 2 se %isuali4a en la %entana +topSatc$& Por
eemplo, se mide tiempo para eecutar un programa, tiempo para eecutar el 6ltimo paso
etc&
4(O=(AMA( E1 M&%(O%O'T(O1ADO(
+i $a solucionado todos los errores en su cdigo 2 cree 0ue su programa est3 listo para
ser utili4ado, el siguiente paso es cargarlo en el microcontrolador& El programador
PIC1las$ se utili4a para este propsito& Es una $erramienta dise8ada para programar
todos los tipos de microcontroladores PIC& Est3 compuesto por dos partes#
/a parte $ardSare se utili4a para introducir un cdigo $e9adecimal Gel programa
a ser cargado en el microcontroladorI 2 para programar el microcontrolador por
medio de ni%eles de %oltae espec71icos& -urante el proceso de la programacin,
un nue%o programa se escri5e en la memoria 1las$ del microcontrolador,
mientras 0ue el programa anterior se 5orra autom3ticamente&
/a parte de so1tSare se encarga de en%iar el programa Garc$i%o &$e9 I a la parte
$ardSare del programador por medio de un ca5le ?+A& ! la inter1a4 de usuario
de este so1tSare se le puede acceder desde I-E al pulsar so5re la opcin
mEjProgrammer del men6 .ools o al pulsar XF11Y& Por consiguiente, es posi5le
modi1icar algunas con1iguraciones del programador 2 controlar el
1uncionamiento de la parte $ardSare GCargar, Escri5ir, Keri1icar&&&I&
+e puede reprogramar el microcontrolador tantas %eces como se necesite&
OTRAS HERRAMIENTAS DEL COMPILADOR
El compilador mi]roC P)* 1or PIC proporciona $erramientas 0ue en gran medida
simpli1ican el proceso de escri5ir el programa& .odas estas $erramientas se encuentran
en el men6 .ools& En la siguiente seccin %amos a darle una 5re%e descripcin de todas
ellas&
TE(M&'A1 )-A(T
El terminal ?+!). representa una sustitucin para la est3ndar WindoSs :2per
.erminal& +e puede utili4ar para controlar el 1uncionamiento del microcontrolador 0ue
utili4a la comunicacin ?+!).& .ales microcontroladores est3n incorporados en un
dispositi%o destino 2 conectados al conector )+232 de la PC por medio de un ca5le
serial&
/a %entana ?+!). terminal dispone de opciones para con1igurar la comunicacin
serial 2 %isuali4ar los datos en%iadosR reci5idos&
ED&TO( EE4(OM
!l seleccionar la opcin EEP)*M Editor del men6 .ools, aparecer3 una %entana como
se muestra en la siguiente 1igura& !s7 es cmo 1unciona la memoria EEP)*M del
microcontrolador& +i 0uiere cam5iar de su contenido despu"s de cargar el programa en
el microcontrolador, "sta es la 1orma correcta de $acerlo& El nue%o contenido es un dato
de un tipo espec71ico Gc$ar, int o dou5leI, primero de5e seleccionarlo, introducir el %alor
en el campo Edit Kalue 2 pulsar so5re Edit& /uego, pulse so5re el 5otn +a%e para
guardarlo como un documento con e9tensin &$e9& +i la opcin ?se EEP)*M in
Proect est3 acti%a, los datos se cargar3n autom3ticamente en el microcontrolador
durante el proceso de la programacin&
/E'TA'A A-%&& %2A(T
+i necesita representar num"ricamente un car3cter !+CII, seleccione la opcin !+CII
c$art del men6 .ools& !parecer3 una ta5la, como se muestra en la 1igura 0ue est3 a
continuacin& ?sted pro5a5lemente sa5e 0ue cada tecla de teclado est3 asociada con un
cdigo Gcdigo !+CIII& Como se puede %er, los caracteres 0ue representan los n6meros
tienen %alores di1erentes& Por esta ra4n, la instruccin de programa para %isuali4ar el
n6mero 7 en un /C- no %isuali4ar3 este n6mero, sino el e0ui%alente a la instruccin
AE/& +i en%7a el mismo n6mero en 1orma de un car3cter a un /C-, o5tendr3 el
resultado esperado - n6mero 7& Por consiguiente, si 0uiere %isuali4ar un n6mero sin
con%ertirlo en un car3cter apropiado, es necesario a8adir el n6mero 48 a cada d7gito en
el 0ue consiste el n6mero a %isuali4ar&
ED&TO( DE -&ETE -E=ME'TO-
?n editor de siete segmentos le permite determinar con 1acilidad el n6mero a poner en
un puerto de salida con el propsito de %isuali4ar un s7m5olo deseado& Por supuesto, se
da por entendido 0ue los pines del puerto de5en estar conectados a los segmentos del
%isuali4ador de manera apropiada& Aasta con colocar el cursor en cual0uier segmento
del %isuali4ador 2 pulsar so5re "l& +e %isuali4ar3 inmediatamente el n6mero a introducir
en el programa&
1%D %)-TOM %2A(A%TE( 6%A(A%TE(E- 1%D DE<&'&DO-
4O( E1 )-)A(&O7
!dem3s de los caracteres est3ndar, el microcontrolador tam5i"n puede %isuali4ar los
caracteres creados por el programador& !l seleccionar la $erramienta /C- custom
c$aracter, se e%itar3 un pesado tra5ao de crear 1unciones para en%iar un cdigo
apropiado a un %isuali4ador& Para crear un s7m5olo, pulse so5re los cuadros pe0ue8os en
la %entana /C- custom c$aracter, luego seleccione la posicin 2 la 1ila 2 pulse so5re el
5otn [E'E)!.E& El cdigo apropiado aparece en otra %entana& 'o es necesita pulsar
m3s& Cop2 to Clip5oard Gcopiar al portapapelesI - Paste GpegarI&&&
=E'E(ADO( DE MA4A DE 0&T- 4A(A )' 1%D =(V<&%O
El generador de mapa de 5its para un /C- gr31ico es una $erramienta insustitui5le en
caso de 0ue el programa 0ue escri5e utilice el %isuali4ador /C- G[/C-I& Esta
$erramienta le permite %isuali4ar un mapa de 5its con 1acilidad& +eleccione la opcin
.oolsR[lcd Aitmap Editor aparecer3 la %entana apropiada& Para utili4arlo, seleccione el
tipo de %isuali4ador a utili4ar 2 cargue un mapa de 5its& El mapa de 5its de5e ser
monocrom3tico 2 tener la resolucin apropiada del %isuali4ador G128 9 64 p79eles en
este eemploI& El procedimiento a seguir es igual 0ue en el eemplo anterior# Cop2 to
Clip5oard&&&
*n cdigo generado ue utiliza herramientas para controlar los visualizadores L,E &
.L,E contiene funciones de la librera Lcd. #i las utiliza en el programa, no se olvide
de marcar la caJa de cheueo Junto a esta librera en la ventana Librar& 7anager. !s
el compilador ser" capaz de reconocer estas funciones correctamente.
%apitulo : Microcontrola!or 4&%1"<88$
El 96,$=>??@ es un producto conocido de la compaa 7icrochip. Eispone de todos
los componentes disponibles en la ma&ora de los microcontroladores modernos. 9or
su baJo precio, un rango amplio de aplicaciones, alta calidad & disponibilidad, es una
solucin perfecta aplicarlo para controlar diferentes procesos en la industria, en
dispositivos de control de m"uinas, para medir variables de procesos etc. !lgunas de
sus caractersticas principales se enumeran a continuacin.
3&1 C!)!C.E)a+.IC!+ A\+IC!+ -E/ PIC16F887
3&2 P)I'CIP!/E+ )E[I+.)*+ +F)
3&3 P?E).*+ -E E'.)!-!R+!/I-!
3&4 .EMP*)IZ!-*) .IME);
3&L .EMP*)IZ!-*) .IME)1
3&6 .EMP*)IZ!-*) .IME)2
3&7 MU-?/*+ CCP
3&8 MU-?/*+ -E C*M?'IC!CIU' +E)IE
3&H MU-?/*+ !'!/U[IC*+
3&1; *+CI/!-*) -E )E/*^
3&11 MEM*)I! EEP)*M
3&12 >)EI'ICI*@ <A/!CT-*?., A)*W'-*?. * )?I-*+=
.1 %A(A%TE(B-T&%A- 0V-&%A- DE1 4&%1"<88$
arEuitectura (&-%
o El microcontrolador cuenta con solo 3L instrucciones di1erentes
o .odas las instrucciones son uni-ciclo e9cepto por las de rami1icacin
<recuencia !e operaci?n T-+T M2:
Oscila!or interno !e alta precisi?n
o Cali5rado de 135rica
o )ango de 1recuencia de 8M:4 a 31T:4 seleccionado por so1tSare
/oltaIe !e la #uente !e alimentaci?n !e +.T/ a R.R/
o Consumo# 22;u! G2&;K, 4M:4I, 11u! G2&; K, 32 T:4I L;n! Gen modo
de esperaI
Ahorro !e energUa en el Modo de suspensin
0rown-out (eset 60O(7 con opci?n para controlar por so#tware
R pines !e entra!a/sali!a
o alta corriente de 1uente 2 de drenador para maneo de /E-
o resistencias pull)up programa5les indi%idualmente por so1tSare
o interrupcin al cam5iar el estado del pin
memoria (OM !e 8L con tecnologUa <1A-2
o El c$ip se puede re-programar $asta 1;;&;;; %eces
Opci?n !e programacin serial en el circuito
o El c$ip se puede programar incluso incorporado en el dispositi%o destino&
+R" 9;tes !e memoria EE4(OM
o /os datos se pueden gra5ar m3s de 1&;;;&;;; %eces
"8 9;tes !e memoria (AM
%onverti!or A/D:
o 14 canales
o resolucin de 1; 5its
tempori:a!ores/conta!ores in!epen!ientes
Tempori:a!or perro guar!i8n
M?!ulo compara!or anal?gico con
o -os comparadores analgicos
o )e1erencia de %oltae 1ia G;&6KI
o )e1erencia de %oltae programa5le en el c$ip
M?!ulo 4NM incorpora!o
M?!ulo )-A(T meIora!o
o +oporta las comunicaciones seriales )+-48L, )+-232 2 /I'2&;
o !uto deteccin de 5audios
4uerto -erie -Uncrono Maestro 6M--47
o +oporta los modos +PI e I2C
DESCRIPCIN DE PINES
/a ma2or7a de los pines del microcontrolador PIC16F887 son multipropsito como se
muestra en la 1igura anterior& Por eemplo, la asignacin )!3R!'3RKre1DRC1I'D para
el 0uinto pin del microcontrolador indica 0ue "ste dispone de las siguientes 1unciones#
)!3 .ercera entradaRsalida digital del puerto !
!'3 .ercera entrada analgica
Kre1D )e1erencia positi%a de %oltae
C1I'D Entrada positi%a del comparador C1
/a 1uncionalidad de los pines presentados anteriormente es mu2 6til puesto 0ue permite
un meor apro%ec$amiento de los recursos del microcontrolador sin a1ectar a su
1uncionamiento& Estas 1unciones de los pines no se pueden utili4ar simult3neamente, sin
em5argo se pueden cam5iar en cual0uier instante durante el 1uncionamiento&
/as siguientes ta5las se re1ieren al microcontrolador -IP de 4; pines&
UNIDAD CENTRAL DE PROCESAMIENTO (CPU)
Con el propsito de e9plicar en 1orma clara 2 concisa, sin descri5ir pro1undamente el
1uncionamiento de la CP?, %amos a $acer constar 0ue la CP? est3 1a5ricada con la
tecnolog7a )I+C 2a 0ue esto es un 1actor importante al decidir 0u" microcontrolador
utili4ar&
)I+C es un acrnimo deri%ado del ingl"s Heduced 6nstruction #et ,omputer, lo 0ue
proporciona al PIC16F887 dos grandes %entaas#
/a CP? cuenta con slo 3L instrucciones simples& Ca5e decir 0ue para poder
programar otros microcontroladores en lenguae ensam5lador es necesario sa5er
m3s de 2;; instrucciones
El tiempo de eecucin es igual para casi todas las instrucciones 2 tarda 4 ciclos
de relo& /a 1recuencia del oscilador se esta5ili4a por un cristal de cuar4o& /as
instrucciones de salto 2 de rami1icacin tardan oc$o ciclos de relo en eecutarse&
Esto signi1ica 0ue si la %elocidad de operacin del microcontrolador es 2; M:4,
el tiempo de eecucin de cada instruccin ser3 2;;n+, o sea, >el programa
eecutar3 Lmillones de instrucciones por segundo@
MEMORIA
El PIC16F887 tiene tres tipos de memoria# )*M, )!M 2 EEP)*M& Como cada una
tiene las 1unciones, caracter7sticas 2 organi4acin espec71icas, %amos a presentarlas por
separado&
MEMO(&A (OM
/a memoria )*M se utili4a para guardar permanente el programa 0ue se est3
eecutando& Es la ra4n por la 0ue es 1recuentemente llamada Bmemoria de programaC&
El PIC16F887 tiene 8T5 de memoria )*M Gen total 81H2 localidadesI& Como la
memoria )*M est3 1a5ricada con tecnolog7a F/!+:, su contenido se puede cam5iar al
proporcionarle un %oltae de programacin especial G13KI&
'o o5stante, no es necesario e9plicarlo en detalles puesto 0ue se reali4a
autom3ticamente por un programa especial en la PC 2 un simple dispositi%o electrnico
denominado programador&
MEMO(&A EE4(OM
+imilar a la memoria de programa, el contenido de memoria EEP)*M est3
permanentemente guardado al apagar la 1uente de alimentacin& +in em5argo, a
di1erencia de la )*M, el contenido de la EEP)*M se puede cam5iar durante el
1uncionamiento del microcontrolador& Es la ra4n por la 0ue esta memoria G2L6
localidadesI es per1ecta para guardar permanentemente algunos resultados creados 2
utili4ados durante la eecucin del programa&
MEMO(&A (AM
Es la tercera 2 la m3s complea parte de la memoria del microcontrolador& En este caso
consiste en dos partes# en registros de propsito general 2 en los registros de 1unciones
especiales G+F)I& .odos estos registros se di%iden en cuatro 5ancos de memoria de los
0ue %amos a $a5lar m3s tarde en este cap7tulo&
! un0ue los dos grupos de registros se ponen a cero al apagar la 1uente de alimentacin,
adem3s est3n 1a5ricados de la misma 1orma 2 se comportan de la manera similar, sus
1unciones no tienen muc$as cosas en com6n&
(E=&-T(O- DE 4(O4*-&TO =E'E(A1
/os registros de propsito general se utili4an para almacenar los datos temporales 2 los
resultados creados durante el 1uncionamiento& Por eemplo, si el programa reali4a el
conteo Gde los productos en una cadena de montaeI, es necesario tener un registro 0ue
representa lo 0ue en la %ida cotidiana llamamos BsumaC& Como el microcontrolador no
es nada creati%o, es necesario especi1icar la direccin de un registro de propsito
general 2 asignarle esa 1uncin& +e de5e crear un programa simple para incrementar el
%alor de este registro por 1, despu"s de 0ue cada producto $a2a pasado por el sensor&
!$ora el microcontrolador puede eecutar el programa 2a 0ue sa5e 0u" es 2 dnde est3
la suma 0ue se %a a incrementar& -e manera similar, a cada %aria5le de programa se le
de5e pre-asignar alguno de los registros de propsito general&
/* En esta secuencia, la variable en el registro sum se aumenta cada
vez que se
lleve un uno (1) lgico en el pin de entrada RB0. */
...
if (PORTB.0 = 1) // Comprobar si el pin RB0 est a uno
sum++ ; // Si est, el valor de la variable se aumenta por 1
... // Si no est, el programa sale de la sentencia if
...
(E=&-T(O- DE <)'%&O'E- E-4E%&A1E- 6-<(7
/os registros de 1unciones especiales son tam5i"n parte de la memoria )!M& !
di1erencia de los registros de propsito general, su propsito es predeterminado durante
el proceso de 1a5ricacin 2 no se pueden cam5iar& Como los 5its est3n conectados a los
circuitos particulares en el c$ip Gcon%ertidor !R-, mdulo de comunicacin serial, etcI,
cual0uier cam5io de su contenido a1ecta directamente al 1uncionamiento del
microcontrolador o de alguno de los circuitos&
Por eemplo, el registro !-C*'; controla el 1uncionamiento del con%ertidor !R-& !l
cam5iar los 5its se determina 0u" pin del puerto se con1igurar3 como la entrada del
con%ertidor, el momento del inicio de la con%ersin as7 como la %elocidad de la
con%ersin&
*tra caracter7stica de estas localidades de memoria es 0ue tienen nom5res Gtanto los
registros como sus 5itsI, lo 0ue simpli1ica considera5lemente el proceso de escri5ir un
programa& Como el lenguae de programacin de alto ni%el puede utili4ar la lista de
todos los registros con sus direcciones e9actas, 5asta con especi1icar el nom5re de
registro para leer o cam5iar su contenido&
// En esta secuencia, el contenido de los registros TRISC y PORTC ser
modificado
...
TRISC = 0x00 // un cero lgico (0) se escribe en el registro
TRISC (todos
// los pines del puerto PORTC se configuran como
salidas)
PORTC = 0b01100011 // cambio de estado lgico de todos los pines del
puerto PORTC
...
0A'%O- DE 1A MEMO(&A (AM
/a memoria )!M est3 di%idida en cuatro 5ancos& !ntes de acceder a un registro al
escri5ir un programa Gpara leer o cam5iar su contenidoI, es necesario seleccionar el
5anco 0ue contiene ese registro& M3s tarde %amos a tratar dos 5its del registro +.!.?+
utili4ados para seleccin del 5anco& Para simpli1icar el 1uncionamiento, los +F)
utili4ados con m3s 1recuencia tienen la misma direccin en todos los 5ancos, lo 0ue
permite accederlos con 1acilidad&
.ra5aar con 5ancos puede ser di17cil slo si se escri5e un programa en lenguae
ensam5lador& !l utili4ar el lenguae de programacin de alto ni%el como es C 2 el
compilador como es miGro, 9HI for 96,, 5asta con escri5ir el nom5re del registro& !
partir de esa in1ormacin, el compilador selecciona el 5anco necesario& /as
instrucciones apropiadas para la seleccin del 5anco ser3n incorporadas en el cdigo
durante el proceso de la compilacin& :asta a$ora usted $a utili4ado slo el lenguae
ensam5lador 2 esta es la primera %e4 0ue utili4a el compilador C, %erdad= Es una noticia
mara%illosa, no lo cree=
PILA
?na parte de la )!M utili4ada como pila consiste de oc$o registros de 13 5its& !ntes de
0ue el microcontrolador se ponga a eecutar una su5rutina Ginstruccin C!//I o al
ocurrir una interrupcin, la direccin de la primera siguiente instruccin en ser
eecutada se coloca en la pila Gse apilaI, o sea, en uno de los registros& [racias a eso,
despu"s de eecutarse una su5rutina o una interrupcin, el microcontrolador Bsa5eC
dnde continuar con la eecucin de programa& Esta direccin se 5orra Gse desapilaI
despu"s de %ol%er al programa, 2a 0ue no es necesario guardarla, disponiendo
autom3ticamente esas localidades de la pila para un uso 1uturo&
Ca5e tener en mente 0ue el dato se apila circularmente& Esto signi1ica 0ue despu"s de
0ue se apile oc$o %eces, la no%ena %e4 se so5rescri5e el %alor 0ue se almacen al apilar
el dato por primera %e4& /a d"cima %e4 0ue se apile, se so5rescri5e el %alor 0ue se
almacen al apilar el dato por segunda %e4 etc& -atos so5rescritos de esta manera no se
pueden recuperar& !dem3s, el programador no puede acceder a estos registros para
$acer escrituraRlectura& 'o $a2 ning6n 5it de estado para indicar el estado de
des5ordamiento o su5des5ordamiento de pila& Por esta ra4n $a2 0ue tener un especial
cuidado al escri5ir un programa&
/amos a hacerlo en mikro%...
/* Al entrar o al salir de la instruccin en ensamblador del programa,
el compilador
no va a guardar los datos en el banco de la RAM actualmente activo.
Esto significa
que en esta seccin de programa la seleccin de banco depende de los
registros SFR
utilizados. Al volver a la seccin de programa escrito en C, los bits
de control
RP0 y RP1 deben devolver el estado que tenan antes de la ejecucin
del cdigo en
lenguaje ensamblador. En este ejemplo, el problema se soluciona al
utilizar la
variable auxiliar saveBank que guarda el estado de estos dos bits*/
saveBank = STATUS & 0b01100000; // Guardar el estado de los bits RP0 y
RP1
// (bits 5 y 6 del registro STATUS)
asm { // Inicio de la secuencia en ensamblador
...
... // Cdigo ensamblador
...
} // Final de la secuencia en ensamblador
STATUS &= 0b10011111; // Bits RP0 y RP1 devuelven su estado original
STATUS |= saveBank;
...
...
SISTEMA DE INTERRUPCIONES
!l aparecer una peticin de interrupcin lo primero 0ue $ace el microcontrolador es
eecutar la instruccin actual despu"s de 0ue se detiene el proceso de eecucin de
programa& Como resultado, la direccin de memoria de programa actual se apila
autom3ticamente 2 la direccin por de1ecto Gprede1inida por el 1a5ricanteI se escri5e en
el contador de programa& /a localidad en la 0ue el programa contin6a con la eecucin
se le denomina %ector de interrupcin& En el caso del microcontrolador PIC16F887 esta
direccin es ;9;;;4$& Como se muestra en la siguiente 1igura la localidad 0ue contiene
el %ector de interrupcin se omite durante la eecucin de programa regular&
?na parte de programa 0ue se eecutar3 al $acer una peticin de interrupcin se le
denomina rutina de interrupcin& +u primera instruccin se encuentra en el %ector de
interrupcin& Cu3nto tiempo tardar3 en eecutar esta su5rutina 2 cmo ser3 depende de
la destre4a del programador as7 como de la 1uente de interrupcin& !lgunos
microcontroladores tienen m3s de un %ector de interrupcin Gcada peticin de
interrupcin tiene su %ectorI, pero en este caso slo $a2 uno& En consecuencia, la
primera parte da la rutina de interrupcin consiste en detectar la 1uente de interrupcin&
Por 1in, al reconocer la 1uente de interrupcin 2 al terminar de eecutar la rutina de
interrupcin el microcontrolador alcan4a la instruccin #$%&'$, toma la direccin de la
pila 2 contin6a con la eecucin de programa desde donde se interrumpi&
mi]roC reconoce una rutina de interrupcin 0ue se eecutar3 como la 1uncin void
interrupt()& El cuerpo de la 1uncin, o sea, rutina de interrupcin, de5e ser escrito por
el usuario&
void interrupt() { // Interrupt routine
cnt++ ; // Interrupt causes variable cnt to be incremented
by 1
}
C410 -&3+3?'/ +0) /$,3)&/0) SFR
+upongamos 0ue usted $a comprado 2a un microcontrolador 2 0ue tiene una 5uena idea
de cmo utili4arlo&&& /a lista de los registros +F) as7 como de sus 5its es mu2 larga&
Cada uno controla alg6n proceso& En general, parece como una gran ta5la de control con
un gran n6mero de instrumentos e interruptores& <!$ora est3 preocupado de cmo
conseguir aprender acerca de todos ellos= Es poco pro5a5le, pero no se preocupe,
>?sted no tiene 0ue $acerlo@ /os microcontroladores son tan potentes 0ue se parecen a
los supermercados# o1recen tantas cosas a 5aos precios 2 a usted solo le toca elegir las
0ue necesita& Por eso, seleccione el campo en 0ue est3 interesado 2 e9amine slo lo 0ue
necesita& Cuando entienda completamente el 1uncionamiento de $ardSare, e9amine los
registros +F) encargados de controlarlo Gnormalmente son unos pocosI&
,omo todos los dispositivos tienen un tipo de sistema de control el microcontrolador
tiene sus TpalancasT con las ue usted debe estar familiarizado para ser capaz de
utilizarlos correctamente. 9or supuesto, estamos hablando de los registros #>H desde
los ue el proceso de programacin se inicia & en los ue el mismo termina.
.+ 4(&'%&4A1E- (E=&-T(O- -<(
El siguiente te9to descri5e los principales registros +F) del microcontrolador
PIC16F887& /os 5its de cada registro controlan los circuitos di1erentes dentro del c$ip,
as7 0ue no es posi5le clasi1icarlos en grupos especiales& Por esta ra4n, se descri5en
unto con los procesos 0ue controlan&
R$,3)&/0 STATUS
El registro +.!.?+ contiene# el estado aritm"tico de datos en el registro W, el estado
)E+E., los 5its para seleccionar el 5anco para los datos de la memoria&
&(4 - )egistro de seleccin de Aanco Gusado para direccionamiento indirectoI
o 1 - Aancos ; 2 1 son acti%os Glocalidades de memoria ;;$-FF$I
o T - Aancos 2 2 3 son acti%os Glocalidades de memoria 1;;$-1FF$I
(41.(4T - )egistro de seleccin de 5anco Gusado para direccionamiento
directoI&
(41 (4T 0anco activo
; ; Aanco ;
; 1 Aanco 1
1 ; Aanco 2
1 1 Aanco 3
TO - Time-out 9it 69it !e sali!a !el tempori:a!or perro guar!i8n7
o 1 - -espu"s de encender el microcontrolador, despu"s de eecutarse la
instruccin ()#*+% 0ue reinicia al W-. Gtempori4ador perro guardi3nI o
despu"s de eecutarse la instruccin +/EEP 0ue pone al
microcontrolador en el modo de 5ao consumo&
o T - -espu"s de aca5arse el tiempo del W-.&
4D - 4ower-!own 9it 69it !e apaga!o7
o 1 - -espu"s de encender el microcontrolador, despu"s de eecutar la
instruccin ()#*+% 0ue reinicia al W-.&
o T - -espu"s de eecutarse la instruccin ,)$$- 0ue pone al
microcontrolador en el modo de 5ao consumo&
A - Aero 9it 69it cero7
o 1 - El resultado de una operacin lgica o aritm"tica es ;&
o T - El resultado de una operacin lgica o aritm"tica es distinto de ;&
D% - Digit carr;/9orrow 9it G5it de acarreoRpr"stamo de d7gitoI cam5ia al
sumar o al restar si ocurre un kdes5ordamientok o un kpr"stamok en el resultado&
o 1 - :u5o acarreo del cuarto 5it de orden 5ao Gni55le 5aoI en el
resultado&
o T - 'o $u5o acarreo del cuarto 5it de orden 5ao Gni55le 5aoI en el
resultado&
% - %arr;/0orrow 9it G5it de acarreoRpr"stamoI cam5ia al sumar o al restar si
ocurre un kdes5ordamientok o un kpr"stamok en el resultado, o sea si el resultado
es ma2or de 2LL o menor de ;&
o 1 - *curri acarreo en el 5it m3s signi1icati%o GM+AI del resultado&
o T - 'o ocurri acarreo en el 5it m3s signi1icati%o GM+AI del resultado&
R$,3)&/0 OPTION@REG
El registro *P.I*'j)E[ contiene %arios 5its de control para con1igurar el pre -
escalador del .empori4ador ;RW-., el tempori4ador .imer;, la interrupcin e9terna 2
las resistencias pull-up en el puerto P*).A&
(04) - 4ort 0 4ull up Ena9le 9it 6resistencia 4ull )p 4uerto 07
o 1 - -esacti%adas&
o T - !cti%adas&
&'TED= - &nterrupt E!ge -elect 9it 69it selector !e #lanco activo !e la
interrupci?n eHterna7
o 1 - Interrupcin por 1lanco ascendente en el )A;RI'.&
o T - Interrupcin por 1lanco descendente en el )A;RI'.&
TT%- - TM(T %lock -ource -elect 9it 69it selector !e tipo !e reloI para el
TimerT7
o 1 - Pulsos introducidos a tra%"s del .*CTI GcontadorI&
o T - Pulsos de relo internos FoscR4 Gtempori4adorI&
TT-E - TM(T -ource E!ge -elect 9it G5it selector de tipo de 1lanco en
.*CTII selecciona el 1lanco Gascendente o descendenteI contado por el
tempori4ador .imer; por el pin )!4R.;CTI&
o 1 - Incrementa en 1lanco descendente en el pin .*CTI&
o T - Incrementa en 1lanco ascendente en el pin.*CTI&
4-A - 4rescaler Assignment 9it asigna el pre-escalador G$a2 slo unoI al
tempori4ador o al W-.&
o 1 - Pre - escalador se le asigna al W-.&
o T - Pre - escalador se le asigna al tempori4ador .imer;&
4-+. 4-1. 4-T 4rescaler (ate -elect 9its 69it selector !el valor !el
!ivisor !e #recuencia7
El %alor del di%isor de 1recuencia se selecciona al com5inar estos tres 5its& Como se
muestra en la siguiente ta5la, el %alor del di%isor de 1recuencia se le asigna al
tempori4ador G.imer;I o al tempori4ador perro guardi3n GW-.I&
4-+ 4-1 4-T TM(T NDT
; ; ; 1#2 1#1
; ; 1 1#4 1#2
; 1 ; 1#8 1#4
; 1 1 1#16 1#8
1 ; 1 1#64 1#32
1 1 ; 1#128 1#64
1 1 1 1#2L6 1#128
Para conseguir el %alor del di%isor de 1recuencia 1#1 cuando el tempori4ador .imer;
cuenta pulsos, el preescalador de5e ser asignado al W-.& En consecuencia, el
tempori4ador .imer; no utili4a el pre-escalador, sino 0ue cuenta directamente los
pulsos generados por el oscilador, lo 0ue era el o5eti%o&
/amos a hacerlo en mikro%...
/* Si el comando CLRWDT no se ejecuta,
el WDT va a reiniciar al microcontrolador cada 32.768 uS (f=4 MHz) */
void main() {
OPTION_REG = 0b00001111; // Pre-escalador est asignado al WDT
(1:128)
asm CLRWDT; // Comando en ensamblador para reiniciar al WDT
...
...// El tiempo entre estos dos comandos CLRWDT no debe exceder
32.768 microsegundos (128x256)
...
asm CLRWDT; // Comando en ensamblador para reiniciar al WDT
...
...// El tiempo entre estos dos comandos CLRWDT no debe exceder
32.768 microsegundos (128x256)
...
asm CLRWDT; // Comando en ensamblador para reiniciar al WDT
}
REGISTROS DEL SISTEMA DE INTERRUPCIN
!l llegar la peticin de interrupcin, no signi1ica 0ue una interrupcin ocurrir3
autom3ticamente, puesto 0ue de5e ser $a5ilitada por el usuario Gpor el programaI
tam5i"n& Por esta ra4n, $a2 5its especiales utili4ados para $a5ilitar o des$a5ilitar
interrupciones& Es 13cil de reconocerlos por las letras IE contenidas en sus nom5res
GInterrupt Ena5le - Interrupcin $a5ilitadaI& !dem3s, cada interrupcin se asocia con
otro 5it denominado 5andera 0ue indica 0ue una peticin de interrupcin $a llegado sin
%eri1icar si est3 $a5ilitada& !simismo, se reconocen con 1acilidad por las dos 6ltimas
letras contenidas en sus nom5res - IF GInterrupt Flag - Aandera de interrupcinI&
Como $emos %isto, toda la idea es mu2 simple 2 e1iciente& !l llegar la peticin de
interrupcin, primero el 5it de 5andera se pone a uno&
+i el 5it IE apropiado est3 a cero G;I, esta condicin ser3 ignorada completamente& -e lo
contrario, ocurre una interrupcin& +i %arias 1uentes de interrupcin est3n $a5ilitadas, es
necesario detectar la acti%a antes de 0ue la rutina de interrupcin se ponga a eecutar& /a
deteccin de la 1uente se reali4a al compro5ar los 5its de las 5anderas&
Ca5e destacar 0ue los 5its de cada 5andera no se ponen a cero autom3ticamente, sino
por el so1tSare, mientras 0ue la eecucin de la rutina de interrupcin contin6a
eecut3ndose& +i no $acemos caso a este detalle, ocurrir3 otra interrupcin
inmediatamente despu"s de %ol%er al programa principal, aun0ue no $a2 m3s peticiones
de eecucin& +implemente, la 5andera, as7 como el 5it IE, se 0uedan en uno&
.odas las 1uentes de interrupcin t7picas para el microcontrolador PIC16F887 se
muestran en la siguiente p3gina& F7ese en lo siguiente#
El 5it =&E $a5ilitaRdes$a5ilita simult3neamente las interrupciones no enmascaradas&
El 4E&E 9it $a5ilitaRdes$a5ilita las interrupciones no enmascaradas de peri1"ricos& Esto
no se re1iere al tempori4ador .imer; 2 a las 1uentes de interrupcin del puerto P*).A&
Para $a5ilitar una interrupcin causada por el cam5io del estado lgico en el puerto
P*).A, es necesario $a5ilitarla para cada 5it por separado& En este caso, los 5its del
registro &O%0 se comportan como los 5its IE de control&
R$,3)&/0 INTCON
El registro I'.C*' contiene %arios 5its de $a5ilitacin 2 de 5andera para el
des5ordamiento en el registro .M);, e interrupciones por el cam5io del estado en el
puerto P*).A 2 las interrupciones e9ternas en el pin I'.&
=&E - =lo9al &nterrupt Ena9le 9it - G5it de $a5ilitacin de interrupciones
glo5alesI controla simult3neamente todas las 1uentes de interrupciones posi5les&
o 1 - :a5ilita las interrupciones no enmascaradas&
o T - -es$a5ilita las interrupciones no enmascaradas&
4E&E - 4eripheral &nterrupt Ena9le 9it G5it de $a5ilitacin de interrupciones
peri1"ricasI es similar al 5it [IE, sin em5argo controla interrupciones $a5ilitadas
por los peri1"ricos& Eso signi1ica 0ue no in1lu2e en interrupciones causadas por
el tempori4ador .imer; o por el cam5io del estado en el puerto P*).A o por el
cam5io en el pin )A;RI'.&
o 1 - :a5ilita las interrupciones peri1"ricas no enmascaradas&
o T - -es$a5ilita las interrupciones peri1"ricas no enmascaradas&
TT&E - TM(T Over#low &nterrupt Ena9le 9it G5it de $a5ilitacin de
interrupciones por el des5ordamiento del tempori4ador .imer;I controla
interrupciones causadas por el des5ordamiento del .imer;&
o 1 - :a5ilita interrupciones por .imer;&
o T - -es$a5ilita interrupciones por .imer;&
&'TE - (0T/&'T EHternal &nterrupt Ena9le 9it G5it de $a5ilitacin de la
interrupcin e9terna en )A;I controla interrupciones causadas por el cam5io del
estado lgico en el pin de entrada )A;RI'. Ginterrupcin e9ternaI&
o 1 - :a5ilita interrupciones e9ternas I'.&
o T - -es$a5ilita interrupciones e9ternas I'.&
(0&E - (0 4ort %hange &nterrupt Ena9le 9it G5it de $a5ilitacin de
interrupciones por cam5ios en el puerto P*).AI& Cuando se con1iguran como
entradas, los pines en el puerto P*).A pueden causar una interrupcin al
cam5iar el estado lgico Gno importa si se produce 5aada o su5ida de tensin, lo
0ue importa es 0ue se produce un cam5ioI& Este 5it determina si una
interrupcin %a a ocurrir&
o 1 - :a5ilita interrupciones por cam5io en el puerto P*).A&
o T - -es$a5ilita interrupciones por cam5io en el puerto P*).A&
TT&< - TM(T Over#low &nterrupt <lag 9it G5it de 5andera de interrupcin por
el des5or damiento del .imer;I detecta el des5ordamiento en el registro del
tempori4ador .imer;, o sea el contador se pone a cero&
o 1 - En el registro del .imer; $a ocurrido des5ordamiento Gesta 5andera
de5e %ol%erse a ; por so1tSareI&
o T - En el registro del .imer; no $a ocurrido des5ordamiento&
&'T< - (0T/&'T EHternal &nterrupt <lag 9it G5it de 5andera de interrupcin
e9terna en I'.I detecta el cam5io en el estado lgico en el pin I'.&
o 1 - :a ocurrido una interrupcin e9terna por I'. Gesta 5andera de5e
%ol%erse a ; por so1tSareI
o T - 'o $a ocurrido una interrupcin e9terna por I'.&
(0&< - (0 4ort %hange &nterrupt <lag 9it G5it de 5andera de interrupcin por
cam5io en el puerto )AI detecta cual0uier cam5io del estado lgico de alguno
de los pines de entrada en el puerto P*).A&
o 1 - !l menos uno de los pines de ER+ de propsito general en el puerto
P*).A $a cam5ido de %alor& -espu"s de leer el puerto P*).A, el 5it
)AIF de5e %ol%erse a ; por so1tSareI&
o T - 'inguno de los pines de ER+ de propsito general en el puerto
P*).A $a cam5iado de %alor&
/amos a hacerlo en mikro%...
// El pin PORTB.4 se configura como una entrada sensible al cambio del
estado lgico.
void initMain() {
ANSEL = ANSELH = 0; // Todos los pines de E/S se configuran como
digitales
PORTB = 0; // Todos los pines del puerto PORTB se ponen a
cero
TRISB = 0b00010000; // Todos los pines del puerto PORTB menos PORTB.4
se
// configuran como salidas

RBIE = 1; // Se habilitan las interrupciones por el cambio
en el puerto PORTB
IOCB4 = 1; // Se habilita la interrupcin por el cambio en
el pin 4 en el
// puerto PORTB
GIE = 1; // Se habilita la interrupcin global
... // Desde este punto, se produce una interrupcin
con cualquier cambio
... // del estado lgico en el pin PORTB.4
...
R$,3)&/0 PIEA
El registro PIE1 contiene los 5its de $a5ilitacin de interrupciones peri1"ricas&
AD&E - A/D %onverter &nterrupt Ena9le 9it 69it !e ha9ilitaci?n !e
interrupciones !el converti!or A/D7.
o 1 - :a5ilita la interrupcin !-C&
o T - -es$a5ilita la interrupcin !-C&
(%&E - E)-A(T (eceive &nterrupt Ena9le 9it 69it !e ha9ilitaci?n !e
interrupciones !e recepci?n !el E)-A(T7.
o 1 - :a5ilita la interrupcin de recepcin del E?+!).&
o T - -es$a5ilita la interrupcin de recepcin del E?+!).&
T3&E - E)-A(T Transmit &nterrupt Ena9le 9it 69it !e ha9ilitaci?n !e
interrupciones !e transmisi?n !el E)-A(T7.
o 1 - :a5ilita la interrupcin de transmisin del E?+!).&
o T - -es$a5ilita la interrupcin de transmisin del E?+!).&
--4&E - Master -;nchronous -erial 4ort 6M--47 &nterrupt Ena9le 9it - G5it
de $a5ilitacin de la interrupcin del puerto serie s7ncrono maestro GM++PI
$a5ilita generar una peticin de interrupcin despu"s de cada transmisin de
datos por el mdulo de comunicacin serie s7ncrona Gmodo +PI o I2CI&
o 1 - :a5ilita la interrupcin del M++P&
o T - -es$a5ilita la interrupcin del M++P&
%%41&E - %%41 &nterrupt Ena9le 9it G5it de $a5ilitacin de la interrupcin
del mdulo 1 de ComparacinRCapturaRPWM - CCP1I permite generar una
peticin de interrupcin en el mdulo CCP1 utili4ado para procesamiento de la
se8al PWM&
o 1 - :a5ilita la interrupcin CCP1&
o T - -es$a5ilita la interrupcin CCP1&
TM(+&E - TM(+ to 4(+ Match &nterrupt Ena9le 9it 69it !e ha9ilitaci?n !e
la interrupci?n !e igual!a! entre TM(+ ; 4(+7
o 1 - :a5ilita la interrupcin de igualdad entre .M)2 2 P)2&
o T - -es$a5ilita la interrupcin de igualdad entre .M)2 2 P)2&
TM(1&E - TM(1 Over#low &nterrupt Ena9le 9it G5it de $a5ilitacin de la
interrupcin de des5ordamiento del tempori4ador .imer1I $a5ilita generar una
peticin de interrupcin despu"s de cada des5ordamiento en el registro del
tempori4ador .imer1, o sea el contador se pone a cero&
o 1 - :a5ilita la interrupcin de des5ordamiento del tempori4ador .imer1&
o T - -es$a5ilita la interrupcin de des5ordamiento del tempori4ador
.imer1&
/amos a hecerlo en mikro%...
/* Se produce una interrupcin con cada desbordamiento en el registro
del temporizador1
que consiste en TMR1H y TMR1L. En cada rutina de interrucpiones, la
variable
cnt ser incrementada por 1 */
unsigned short cnt; // Definir la variable cnt
void interrupt() // Inicio de la rutina de interrupcin
cnt++ ; // Al producirse una interrupcin, la cnt se
// incrementa por 1
PIR1.TMR1IF = 0; // El bit TMR1IF se reinicia
TMR1H = 0x80; // A los registros del temporizador TMR1H y
TMR1L se les
TMR1L = 0x00; // devuelven sus valores iniciales
} // Final de la rutina de interrupcin
void main() {
ANSEL = ANSELH = 0; // Todos los pines de E/S se configuran como
digitales
T1CON = 1; // Encender el temporizador Timer
PIR1.TMR1IF = 0; // El bit TMR1IF se pone a cero
TMR1H = 0x80; // Establecer los valores iniciales para el
temporizador Timer1
TMR1L = 0x00;
PIE1.TMR1IE = 1; // Habilitar la interrupcin al producirse un
// desbordamiento en el Timer1
cnt = 0; // Reiniciar la variable cnt
INTCON = 0xC0; // Habilitar la interrupcin (los bits GIE y
PEIE)
...
R$,3)&/0 PIEB
El registro PIE2 tam5i"n contiene %arios 5its de $a5ilitacin de interrupciones&
O-<&E - Oscillator <ail &nterrupt Ena9le 9it 69it !e ha9ilitaci?n !e la
interrupci?n !e #allo en el oscila!or7
o 1 - :a5ilita la interrupcin de 1allo en el oscilador&
o T - -es$a5ilita la interrupcin de 1allo en el oscilador&
%+&E - %omparator %+ &nterrupt Ena9le 9it 69it !e ha9ilitaci?n !e la
interrupci?n !el compara!or %+7
o 1 - :a5ilita la interrupcin del comparador C2&
o T - -es$a5ilita la interrupcin del comparador C2&
%1&E - %omparator %1 &nterrupt Ena9le 9it 69it !e ha9ilitaci?n !e la
interupci?n !el compara!or %17
o 1 - :a5ilita la interrupcin del comparador C1
o T - -es$a5ilita la interrupcin del comparador C1&
EE&E - EE4(OM Nrite Operation &nterrupt Ena9le 9it 69it !e ha9ilitaci?n
!e la interrupci?n !e escritura en la memoria EE4(OM7
o 1 - :a5ilita la interrupcin de escritura en la memoria EEP)*M&
o T - -es$a5ilita la interrupcin de escritura en la memoria EEP)*M&
0%1&E - 0us %ollision &nterrupt Ena9le 9it 69it !e ha9ilitaci?n !e la
interrupci?n !e colisi?n !e 9us7
o 1 - :a5ilita la interrupcin de colisin de 5us&
o T - -es$a5ilita la interrupcin de colisin de 5us&
)14N)&E - )ltra 1ow-4ower Nake-up &nterrupt Ena9le 9it 69it !e
ha9ilitaci?n !e la interrupci?n para salir !el mo!o !e ultra 9aIo consumo -
la reactivaci?n7
o 1 - :a5ilita la interrupcin para salir del modo de ultra 5ao consumo&
o T - -es$a5ilita la interrupcin para salir del modo de ultra 5ao consumo&
%%4+&E - %%4+ &nterrupt Ena9le 9it 69it !e ha9ilitaci?n !e la interrupci?n
!el m?!ulo + !e %omparaci?n/%aptura/4NM 6%%4+7
o 1 - :a5ilita la interrupcin del CCP2&
o T - -es$a5ilita la interrupcin del CCP2&
/amos a hacerlo en mikro%...
/* El comparador C2 se configura para utilizar los pines RA0 y RA2
como entradas. Al producirse
un cambio en la salida del comparador, el pin de salida PORTB.1 cambia
el estado lgico en la
rutina de interrupcin.*/
void interrupt() { // Inicio de la rutina de interrupcin
PORTB.F1 = ~PORTB.F1 ; // La interrupcin invertir el estado
lgico del
// pin PORTB.1
PIR2.C2IF = 0; // Bit de bandera de interrupcin C2IF se
pone a cero
} // Final de la rutina de interrupcin
void main() {
TRISB = 0; // Todos los pines del puerto
PORTB se configuran
// como salidas
PORTB.F1 = 1; // El pin PORTB.1 se pone a uno
ANSEL = 0b00000101;; // Los pines RA0/C12IN0- y
RA2/C2IN+ son las
// entradas analgicas
ANSELH = 0; // Todos los pines de E/S se
configuran como digitales
CM2CON0.C2CH0 = CM2CON0.C2CH1 = 0; // El pin RA0 se selecciona para
ser una
// entrada invertida del C2
PIE2.C2IE = 1; // Habilita la interrupcin del
comparador C2INT
CON.GIE = 1; // Interrupcin global est
habilitada
CM2CON0.C2ON = 1; // Comparador C2 est habilitado
...
...
R$,3)&/0 PIRA
El registro PI)1 contiene los 5its de 5anderas de interrupcin&
AD&< - A/D %onverter &nterrupt <lag 9it 69it !e 9an!era !e la interrupci?n
!el converti!or A/D7
o 1 - +e $a completado una con%ersin !R- Gel 5it de5e %ol%erse a ; por
so1tSareI
o T - 'o se $a completado una con%ersin !R- o no $a empe4ado
(%&< - E)-A(T (eceive &nterrupt <lag 9it 69it !e 9an!era !e la
interrupci?n !e recepci?n !el E)-A(T7
o 1 - El 561er de recepcin del E?+!). est3 lleno& El 5it se pone a cero al
leer el registro )C)E[&
o T - El 561er de recepcin del E?+!). no est3 lleno&
T3&< - E)-A(T Transmit &nterrupt <lag 9it 69it !e la interrupci?n !e
transmisi?n !el E)-A(T7
o 1 - El 561er de transmisin del E?+!). est3 %ac7o& El 5it se pone a cero
al esri5ir un dato en el registro .Q)E[&
o T - El 561er de transmisin del E?+!). est3 lleno&
--4&< - Master -;nchronous -erial 4ort 6M--47 &nterrupt <lag 9it 69it !e
9an!era !e la interrupci?n !e puerto serie sUncrono maestro7
o 1 - +e $a cumplido la condicin de ocurrir una interrupcin del M++P al
transmitirR reci5ir los datos& -i1ieren dependiendo del modo de operacin
del M++P G+PI o I
2
CI& El 5it de5e ponerse a cero por so1tSare antes de
%ol%er de la rutina de ser%icio de interrupcionesI
o T - 'o se $a cumplido ninguna condicin de ocurrir una interrupcin del
M++P&
%%41&< - %%41 &nterrupt <lag 9it 69it !e 9an!era !e la interrupci?n !el
m?!ulo 1 !e %omparaci?n/%aptura/4NM 6%%417.
o 1 - +e $a cumplido la condicin de la interrupcin del CCP1 GCCP1 es
una unidad para captar, comparar 2 generar una se8al PWMI&
-ependiendo del modo de operacin Gmodo captura o modo
comparacinI, se produce una captura o la igualdad en la comparacin&
En am5os casos, el 5it de5e %ol%erse a cero por so1tSare& El 5it no se
utili4a en el modo PWM&
o T - 'o se $a cumplido la condicin de la interrupcin del CCP1&
TM(+&< - Timer+ to 4(+ &nterrupt <lag 9it 69it !e 9an!era !e la
interrupci?n !e igual !a! entre el tempori:a!or Timer+ ; el registro 4(+7
o 1 - +e $a producido igualdad con el %alor del .M)2 Gregistro de 8 5its
del tempori4adorI 2 el %alor del P)2& El 5it de5e ponerse a cero por
so1tSare antes de %ol%er de la rutina de ser%icio de interrupcionesI&
o T - 'o se $a producido igualdad con el %alor del .M)2 2 el %alor del
P)2&
TM(1&< - Timer1 Over#low &nterrupt <lag 9it 69it !e 9an!era !e la
interrupci?n !e !es9or!amiento !el tempori:a!or Timer17
o 1 - +e $a producido des5ordamiento del .imer1& El 5it de5e ponerse a
cero por so1tSare&
o T - 'o se $a producido des5ordamiento del .imer1&
R$,3)&/0 PIRB
El registro PI)2 contiene los 5its de 5anderas da la interrupcin&
O-<&< - Oscillator <ail &nterrupt <lag 9it 69it !e 9an!era !e la
interrupci?n !e #allo en el oscila!or7
o 1 - +e $a producido un 1allo en el oscilador del sistema& /a entrada de
relo $a sido conmutada al oscilador interno I'.*+C& El 5it de5e
ponerse a cero por so1tSare&
o T - El oscilador del sistema 1unciona correctamente&
%+&< - %omparator %+ &nterrupt <lag 9it 69it !e 9an!era !e la
interrupci?n !el compara!or %+7
o 1 - /a salida del comparador analgico C2 $a sido cam5iada Gel 5it
C2*?.I& El 5it de5e ponerse a cero por so1tSare&
o T - /a salida del comparador analgico C2 no $a sido cam5iada&
%1&< - %omparator %1 &nterrupt <lag 9it 69it !e 9an!era !e la
interrupci?n !el compara!or %17
o 1 - /a salida del comparador analgico C1 $a sido cam5iada Gel 5it
C1*?.I& El 5it de5e ponerse a cero por so1tSare&
o T - /a salida del comparador analgico C1 no $a sido cam5iada&
EE&< - EE Nrite Operation &nterrupt <lag 9it 69it !e 9an!era !e la
interrupci?n !e la operaci?n !e escritura en la memoria EE4(OM7
o 1 - /a operacin de escritura en la memoria EEP)*M se $a completado&
El 5it de5e ponerse a cero por so1tSare&
o T - /a operacin de escritura en la memoria EEP)*M no se $a
completado o toda%7a no se $a iniciado&
0%1&< - 0us %ollision &nterrupt <lag 9it 69it !e 9an!era !e la interrupci?n
!e colisi?n !e 9us en el M--47
o 1 - +e $a producido una colisin de 5us en el M++P al ser con1igurado
para el modo maestro I2C& El 5it de5e ponerse a cero por so1tSare&
o T - 'o se $a producido colisin de 5us en el M++P&
)14N)&< - )ltra 1ow-power Nake-up &nterrupt <lag 9it 69it !e 9an!era
!e la interrupci?n para salir !el mo!o !e ultra 9aIo consumo - la
reactivaci?n7
o 1 - +e $a cumplido la condicin de salir del modo de ultra 5ao consumo&
El 5it de5e ponerse a cero por so1tSare&
o T - 'o se $a cumplido la condicin de salir del modo de ultra 5ao
consumo&
%%4+&< - %%4+ &nterrupt <lag 9it 69it !e la interrupci?n !el m?!ulo + !e
%omparaci?n/%aptura/4NM - %%4+7
o 1 - +e $a cumplido la condicin de la interrupcin del CCP2 GCCP2 es
una unidad para captar, comparar 2 generar una se8al PWMI&
-ependiendo del modo de operacin Gmodo captura o modo
comparacinI, se produce una captura o la igualdad en la comparacin&
En am5os casos, el 5it de5e %ol%erse a cero por so1tSare& El 5it no se
utili4a en el modo PWM&
o T - 'o se $a cumplido la condicin de la interrupcin del CCP2&
/amos a hacerlo en mikro%...
// Secuencia de activacin del mdulo ULPWU
void main() {
PORTA.F0 = 1; // Pin PORTA.0 se pone a uno
ANSEL = ANSELH = 0; // Todos los pines de E/S se
configuran como digitales
TRISA = 0; // Los pines del puerto PORTA se
configuran como salidas
Delay_ms(1); // Cargar el capacitor
PIR2.ULPWUIF = 0; // Bandera ULPWUIF se pone a cero
PCON.ULPWUE = 1; // Habilitar el funcionamiento del
mdulo ULPWU
TRISA.F0 = 1; // PORTA.0 se configura como entrada
PIE2.ULPWUIE = 1; // Habilitar la interrupcin por el
mdulo ULPWU
INTCON.GIE = INTCON.PEIE = 1; // Habilitar todas las interrupciones
asm SLEEP; // Pasar al modo de bajo consumo
...
...
R$,3)&/0 PCON
El registro PC*' contiene solamente dos 5its de 5anderas utili4ados para di1erenciar
entre un PoSer-on reset GP*)I, un AroSn-out reset GA*)I, un reinicio por el
tempori4ador perro guardi3n GW-.I 2 un reinicio e9terno por el pin MC/)&
)14N)E - )ltra 1ow-4ower Nake-up Ena9le 9it 69it !e ha9ilitaci?n para
salir !el mo!o !e ultra 9aIo consumo - la reactivaci?n7
o 1 - +e $a5ilita salir del modo de ultra 5ao consumo&
o T - 'o se $a5ilita salir del modo de ultra 5ao consumo&
-0O(E' - -o#tware 0O( Ena9le 9it 69it !e ha9ilitaci?n !el 0O( por
so#tware7
o 1 - +e $a5ilita AroSn-out reset&
o T - +e des$a5ilita AroSn-out reset&
4O( - 4ower-on (eset -tatus 9it 69it !e esta!o 4ower - on reset7
o 1 - 'o se $a producido PoSer - on reset&
o T - +e $a producido PoSer - on reset& El 5it de5e ponerse a uno por
so1tSare despu"s de 0ue se $a2a producido un PoSer - on reset&
0O( - 0rown-out (eset -tatus 9it 69it !e esta!o 0rown - out reset7
o 1 - 'o se $a producido AroSn - out reset&
o T - +e $a producido AroSn - out reset& El 5it de5e ponerse a uno por
so1tSare despu"s de 0ue se $a2a producido AroSn - out reset&
REGISTROS PCL Y PCLATH
/a memoria de programa del PIC16F887 es de 8T 2 tiene 81H2 localidades para el
almacenamiento de programa& Por esta ra4n, el contador de programa de5e de ser de 13
5its de anc$ura G213 J 81H2I& Para $a5ilitar el acceso a una localidad de memoria de
programa durante el 1uncionamiento del microcontrolador , es necesario acceder a su
direccin por medio de los registros +F)& Como todos los registros +F) son de 8 5its de
anc$ura, este registro de direccionamiento es creado Barti1icialmenteC al di%idir los 13
5its en dos registros independientes, PC/!.: 2 PC/& +i la eecucin de programa no
a1ecta al contador de programa, el %alor de este registro %a increment3ndose autom3tica
2 constantemente# D1, D1, D1, D1&&& -e esta manera, el programa se eecuta como est3
escrito - instruccin a instruccin, seguido por un incremento de direccin constante&
+i el contador de programa $a sido cam5iado por so1tSare, de5e tomar en cuenta lo
siguiente para e%itar pro5lemas#
/os oc$o 5its in1eriores Gel 52te in1eriorI del registro PC/ son de
lecturaRescritura, mientras 0ue los cinco 5its superiores del registro PC/!.:
son de slo escritura&
El registro PC/!.: se 5orra con cada reinicio&
En el lenguae ensam5lador, el %alor del contador de programa est3 marcado con
PC/ 2 se re1iere slo a los oc$o 5its& ?sted de5e tener cuidado al utili4ar la
instruccin "ADDWF PCL"& Esto es una instruccin de salto 0ue especi1ica la
localidad destino al a8adir un n6mero a la direccin actual& +e utili4a con
1recuencia para saltar a la ta5la de 56s0ueda o a la ta5la de rami1icacin de
programa 2 leerlas& ?n pro5lema surge si la direccin actual es de tal tama8o
0ue al sumar se produce un cam5io en un 5it 0ue pertenece al 52te superior del
registro PC/!.:&
/a eecucin de una instruccin so5re el registro PC/ causa simult3neamente la
sustitucin de los 5its del contador de programa por los contenidos en el registro
PC/!.:& -e todos modos, el registro PC/ puede acceder slo a 8 5its
in1eriores del resultado de la instruccin, pues el siguiente salto ser3
completamente incorrecto& /a solucin a este pro5lema es poner estas
instrucciones en las direcciones 0ue terminan en 99;;$& -e esta manera se
$a5ilitan los saltos de programa $asta 2LL localidades& +i se eecutan los saltos
m3s largos por medio de esta instruccin, el registro PC/!.: de5e ser
incrementado por 1 cada %e4 0ue se produce des5ordamiento en el registro PC/&
!l llamar una su5rutina o al eecutarse un salto Ginstrucciones (.)) 2 /0%0I, el
microcontrolador es capa4 de proporcionar solamente direccionamiento de 11
5its& +imilar a la )!M 0ue est3 di%idida en B5ancosC, la )*M est3 di%idida en
las cuatro Bp3ginasC de 2T cada una& /as instrucciones dentro de estas p3ginas
se eecutan regularmente& -ic$o de manera sencilla, como el procesador est3
proporcionado con una direccin de 11 5its del programa, es capa4 de
direccionar cual0uier localidad dentro de 2TA& /a siguiente 1igura muestra el
salto a la direccin del su5programa PP1&
+in em5argo, si una su5rutina o una direccin de salto no est3 en la misma p3gina 0ue la
localidad de salto, se de5en proporcionar dos 5its superiores 0ue 1altan al escri5ir en el
registro PC/!.:& /a siguiente 1igura muestra el salto a la direccin de la su5rutina
PP2&
En am5os casos, cuando la su5rutina llega a las instrucciones #$%1#2, #$%)* o #$%&'$
G%uelta al programa principalI, el microcontrolador continuar3 con la eecucin de
programa desde donde se interrumpi, 2a 0ue la direccin de retorno se empua 2 se
guarda en la pila 0ue consiste en registros de 13 5its, como $emos mencionado&
REGISTROS DE DIRECCIONAMIENTO INDIRECTO
!dem3s del direccionamiento directo, 0ue es lgico 2 claro G5asta con especi1icar la
direccin de un registro para leer su contenidoI, este microcontrolador es capa4 de
reali4ar el direccionamiento indirecto por los registros I'-F 2 F+)& ! %eces esto
1acilita el proceso de escri5ir un programa& El procedimiento entero est3 $a5ilitado 2a
0ue el registro I'-F no es real Gno e9iste 17sicamenteI, sino 0ue solamente especi1ica el
registro cu2a direccin est3 situada en el registro F+)& Por esta ra4n, escri5ir o leer los
datos del registro I'-F realmente signi1ica escri5ir o leer del registro cu2a direccin
est3 situada en el registro F+)& En otras pala5ras, direcciones de registros se especi1ican
en el registro F+), 2 su contenido se almacena en el registro I'-F& /a di1erencia entre
el direccionamiento directo e indirecto se muestra en la siguiente 1igura#
Como $emos %isto, el pro5lema con klos 5its de direccionamiento 0ue 1altank se
soluciona con un kpr"stamok del otro registro& Esta %e4, es el s"ptimo 5it, denominado
5it I)P del registro +.!.?+&
*na de las caractersticas m"s importantes del microcontrolador es el n:mero de los
pines de entrada/ salida, ue permite conectarlo con los perifricos. El 96,$=>??@
tiene en total FM pines de E/# de propsito general, lo ue es suficiente para la ma&ora
de las aplicaciones.
. 4)E(TO- DE E'T(ADA/-A1&DA
Con el propsito de sincroni4ar el 1uncionamiento de los puertos de ER+ con la
organi4acin interna del microcontrolador de 8 5its, ellos se agrupan, de manera similar
a los registros, en cinco puertos denotados con !, A, C, - 2 E& .odos ellos tienen las
siguientes caracter7sticas en com6n#
Por las ra4ones pr3cticas, muc$os pines de ER+ son multi1uncionales& +i un pin
re ali4a una de estas 1unciones, puede ser utili4ado como pin de ER+ de propsito
general&
Cada puerto tiene su propio registro de control de 1luo, o sea el registro .)I+
correspondiente# .)I+!, .)I+A, .)I+C etc& lo 0ue determina el
comportamiento de 5its del puerto, pero no determina su contenido&
!l poner a cero un 5it del registro .)I+ GpinJ;I, el pin correspondiente del puerto se
con1igurar3 como una salida& -e manera similar, al poner a uno un 5it del registro .)I+
G5itJ1I, el pin correspondiente del puerto se con1igurar3 como una entrada& Esta regla es
13cil de recordar# ; J Entrada 1 J +alida&
P-$/&0 PORTA : /$,3)&/0 TRISA
El puerto P*).! es un puerto 5idireccional, de 8 5its de anc$ura& /os 5its de los
registros .)I+! 2 !'+E/ controlan los pines del P*).!& .odos los pines del P*).!
se comportan como entradasRsalidas digitales& Cinco de ellos pueden ser entradas
analgicas Gdenotadas por !'I#
)!; J !'; Gdeterminado por el 5it !'+; del registro !'+E/I
)!1 J !'1 Gdeterminado por el 5it !'+1 del registro !'+E/I
)!2 J !'2 Gdeterminado por el 5it !'+2 del registro !'+E/I
)!3 J !'3 Gdeterminado por el 5it !'+3 del registro !'+E/I
)!L J !'4 Gdeterminado por el 5it !'+4 del registro !'+E/I
+imilar a 0ue los 5its del registro .)I+! determinan cu3les pines ser3n con1igurados
como entradas 2 cu3les ser3n con1igurados como salidas, los 5its apropiados del registro
!'+E/ determinan si los pines ser3n con1igurados como entradas analgicas o
entradasRsalidas digitales&
Cada 5it de este puerto tiene una 1uncin adicional relacionada a algunas unidades
peri1"ricas integradas, 0ue %amos a descri5ir en los siguientes cap7tulos& Este cap7tulo
cu5re slo la 1uncin adicional del pin )!;, puesto 0ue est3 relacionado al puerto
P*).! 2 a la unidad ?/PW?&
/amos a hacerlo en mikro%...
// El pin PORTA.2 se configura como una entrada digital. Todos los
dems pines del puerto
// PORTA son salidas digitales
...
ANSEL = ANSELH = 0; // Todos los pines de E/S se configuran como
digitales
PORTA = 0; // Todos los pines del puerto PORTA se ponen a
cero
TRISA = 0b00000100; // Todos los pines del puerto PORTA excepto el
// PORTA.2 se configuran como salidas
...
UNIDAD ULP"U
El microcontrolador se utili4a generalmente en los dispositi%os 0ue 1uncionan
peridicamente 2 completamente independiente utili4ando una 1uente de alimentacin
de 5ater7a& En tal caso, el consumo de corriente m7nimo es una de las prioridades& /os
eemplos t7picos de tales aplicaciones son# termmetros, sensores de deteccin del 1uego
2 similar& Es conocido 0ue al reducir 1recuencia de relo se reduce el consumo de
corriente, pues una de las soluciones m3s con%enientes a este pro5lema es 5aar la
1recuencia de relo, o sea utili4ar el cristal de cuar4o de 32T:4 en %e4 de el de 2;M:4&
!l poner el microcontrolador en el modo de reposo es otro paso en la misma direccin&
!6n $a 0uedado el pro5lema de salir de este modo 2 poner el microcontrolador en modo
normal de 1uncionamiento& Es o5%iamente necesario tener una se8al e9terna en alguno
de los pines& Esta se8al de5e ser generada por componentes electrnicos adicionales, lo
0ue resulta en un consumo de energ7a m3s alto del dispositi%o completo&&&
/a solucin per1ecta ser7a 0ue el microcontrolador saliera del modo de reposo
peridicamente por si mismo, lo 0ue no es imposi5le& El circuito 0ue lo $a5ilita se
muestra en la 1igura a la i40uierda&
El principio de 1uncionamiento es simple#
?n pin se con1igura como salida 2 se le lle%a un uno lgico G1I& Esto causa una carga
del capacitor& Inmediatamente despu"s, el mismo pin se con1igura como entrada& El
cam5io de estado lgico $a5ilita una interrupcin 2 el microcontrolador entra en modo
de reposo& +lo $a 0uedado esperar 0ue se descargue el capacitor por la corriente de
1uga 1lu2endo por el pin de entrada& -espu"s de la descarga, se produce una
interrupcin 2 el microcontrolador contin6a con la eecucin de programa en modo
normal& .odo el procedimiento se repite&
En teor7a, esto es una solucin per1ecta& El pro5lema es 0ue todos los pines capaces de
causar una interrupcin son digitales 2 tienen una corriente de 1uga relati%amente alta
cuando el %oltae so5re ellos no est3 cerca de los %alores l7mites de Kdd G1I o K++ G;I&
En este caso, el condensador se descarga en poco tiempo 2a 0ue la corriente es de %arias
centenas de microamperios& Por esta ra4n se dise8 el circuito ?/PW?, capa4 de
indicar una lenta ca7da de %oltae con un consumo de corriente m7nimo&
/a salida genera una interrupcin, mientras 0ue la entrada est3 conectada a uno de los
pines del microcontrolador& Es el pin )!;& )e1iri"ndose a la Figura G)J2;; o$ms,
CJ1nFI, el tiempo de descarga es apro9imadamente 3;m+, mientras 0ue un consumo
total de corriente del microcontrolador es 1;;; %eces m3s 5ao Gde %arias centenas de
nanoamperiosI&
P-$/&0 PORTB : /$,3)&/0 TRISB
El puerto P*).A es un puerto 5idireccional, de 8 5its de anc$ura& /os 5its del registro
.)I+A determinan la 1uncin de sus pines&
+imilar al puerto P*).!, un uno lgico G1I en el registro .)I+A con1igura el pin
apropiado en el puerto P*).A 2 al re%"s& /os seis pines de este puerto se pueden
comportar como las entradas analgicas G!'I& /os 5its del registro !'+E/:
determinan si estos pines ser3n con1igurados como entradas analgicas o
entradasRsalidas digitales#
)A; J !'12 Gdeterminado por el 5it !'+12 del registro !'+E/:I
)A1 J !'1; Gdeterminado por el 5it !'+1; del registro !'+E/:I
)A2 J !'8 Gdeterminado por el 5it !'+8 del registro !'+E/:I
)A3 J !'H Gdeterminado por el 5it !'+H del registro !'+E/:I
)A4 J !'11 Gdeterminado por el 5it !'+11del registro !'+E/:I
)A4 J !'11 Gdeterminado por el 5it !'+11del registro !'+E/:I
Cada 5it de este puerto tiene una 1uncin adicional relacionada a algunas unidades
peri1"ricas integradas, 0ue %amos a descri5ir en los siguientes cap7tulos&
Este puerto dispone de %arias caracter7sticas por las 0ue se distingue de otros puertos 2
por las 0ue sus pines se utili4an con 1recuencia#
.odos los pines del puerto P*).A tienen las resistencias pull)up integradas, 0ue
los $acen per1ectos para 0ue se conecten con los 5otones de presin Gcon el
tecladoI, interruptores 2 optoacopladores& Con el propsito de conectar las
resisitencias a los puertos del microcontrolador, el 5it apropiado del registro
WP?A de5e estar a uno&E
!l tener un alto ni%el de resistencia G%arias decenas de ]iloo$miosI, estas resistencias
k%irtualesk no a1ectan a los pines con1igurados como salidas, sino 0ue sir%en de un
complemento 6til a las entradas& Estas resistencias est3n conectados a las entradas de los
circuitos lgicos CM*+& -e lo contrario, se comportar7an como si 1ueran 1lotantes
gracias a su alta resistencia de entrada&
!dem"s de los bits del registro R9*/, ha& otro bit ue afecta a la instalacin de las
resistencias pull)up. Es el bit H/9* del registro I986I4AHE..
!l estar $a5ilitado, cada 5it del puerto P*).A con1igurado como una entrada
puede causar una interrupcin al cam5iar su estado lgico& Con el propsito de
$a5ilitar 0ue los termi nales causen una interrupcin, el 5it apropiado del
registro I*CA de5e estar a uno&
[racias a estas caracter7sticas, los pines del puerto P*).A se utili4an con 1recuencia
para compro5ar los 5otones de presin en el teclado 2a 0ue detectan cada apretn de
5otn in1ali5lemente& Por eso, no es necesario e9aminar todas las entradas una 2 otra
%e4&
Cuando los pines Q,M 2 Z se con1iguran como entradas de puesta a uno G1I, slo se
necesita esperar una peticin de interrupcin 0ue aparece al apretar un 5otn& M3s tarde,
se comprue5a cu3l 5otn 1ue acti%ado al com5inar ceros 2 unos en las entradas&
/amos a hacerlo en mikro%...
/* El pin PORTB.1 se configura como entrada digital. Se produce una
interrupcin con cualquier
cambio de su estado lgico. Tambin tiene una resistencia pull-up.
Todos los dems pines del
puerto PORTB son entradas digitales. */
...
ANSEL = ANSELH = 0; // Todos los pines de E/S se configuran como
digitales
PORTB = 0; // Todos los pines del puerto PORTB se ponen a
cero
TRISB = 0b00000010; // Todos los pines del puerto PORTB excepto
PORTB.1
// se configuran como salidas
RBPU = 0; // Se habilitan las resistencias pull-up
WPUB1 = 1; // La resistencia pull-up se conecta al pin
PORTB.1
IOCB1 = 1; // El pin PORTB.1 puede causar una interrupcin
por el
// cambio del estado lgico
RBIE = GIE = 1; // Se habilita una interrupcin
...
PIN RBC/INT
El pin )A;RI'. es la 6nica 1uente B%erdaderaC de la interrupcin e9terna& +e puede
con1igurar de manera 0ue reaccione al 5orde ascendente de se8al Gtransicin de cero a
unoI o al 5orde descendente de se8al Gtransicin de uno a ceroI& El 5it I'.E-[ del
registro *P.I*'j)E[ selecciona la se8al apropriada&
PINES RBD Y RBE
El PIC16F887 no dispone de ning6n pin especial para la programacin Gel proceso de
escri5ir un programa en la )*MI& /os pines 0ue generalmente est3n disponi5les como
los pines de ER+ de propsito general, se utili4an para este propsito& Para decir con m3s
precisin, son los pines del puerto P*).A utili4ados para la transmisin de se8al de
relo G)A6I 2 de datos G)A7I al cargar el programa& !dem3s, es necesario suministrar el
%oltae de alimentacin Kdd GLKI as7 como el %oltae apropiado Kpp G12-14KI para la
programacin de memoria F/!+:& -urante la programacin, el %oltae Kpp se aplica al
pin MC/)& 'o se preocupe de los detalles relacionados a este proceso, tampoco se
preocupe de cu3l %oltae se aplica primero puesto 0ue los componentes del programador
se encargan de eso& /o 0ue es mu2 importante es 0ue el programa se puede cargar al
microcontrolador a6n despu"s de $a5er sido soldado en el dispositi%o destino& Por
supuesto, el programa cargado se puede cam5iar de la misma manera& Esta 1uncin se le
denomina IC+P GIn-Circuit +erial Programming - Programacin serial en circuitoI
Para utili4arlo correctamente es necesario plani1icar con antelacin& >Es pan comido@
+lo es necesario instalar un conector miniatura de L pines en el dispositi%o destino para
suministrar al microcontrolador un %oltae de programacin necesario& Para e%itar la
inter1erencia entre los %oltaes 2 los componentes del dispositi%o conectados a los pines
del microcontrolador, todos los peri1"ricos adicionales de5en estar desconectados
durante la programacin Gutili4ando las resistencias o los puentesI&
Como $emos %isto, los %oltaes aplicados a los pines del 4calo del programador son los
mismos 0ue los utili4ados durante la programacin IC+P&
P-$/&0 PORTC : /$,3)&/0 TRISC
El puerto P*).C es un puerto 5idireccional, de 8 5its de anc$ura& /os 5its del registro
.)I+C determinan la 1uncin de sus pines& +imilar a otros puertos, un uno lgico G1I en
el registro .)I+C con1igura el pin apropiado del puerto P*).C como entrada&
.odas las 1unciones adicionales del puerto P*).C se descri5en en los siguientes
cap7tulos&
P-$/&0 PORTD : /$,3)&/0 TRISD
El puerto P*).- es un puerto 5idireccional de 8 5its de anc$ura& /os 5its del registro
.)I+- determinan la 1uncin de sus pines& +imilar a otros puertos, un uno lgico G1I en
el registro .)I+- con1igura el pin apropiado del puerto P*).- como entrada&
P-$/&0 PORTE : /$,3)&/0 TRISE
El puerto P*).E es un puerto 5idireccional, de 4 5its de anc$ura& /os 5its del registro
.)I+E determinan la 1uncin de sus pines& +imilar a otros puertos, un uno lgico G1I en
el registro .)I+E con1igura el pin apropiado del puerto P*).E como entrada&
/a e9cepcin es el pin )E3, 0ue siempre est3 con1igurado como entrada&
+imilar a los puertos P*).! 2 P*).A, en este caso los tres pines se pueden con1igurar
como entradas analgicas& /os 5its del registro !'+E/ determinan si estos pines ser3n
con1igurados como entradas analgicas G!'I o entradasRsalidas digitales#
)E; J !'L Gdeterminado por el 5it !'+L del registro !'+E/IV
)E1 J !'6 Gdeterminado por el 5it !'+6 del registro !'+E/IV 2
)E2 J !'7 Gdeterminado por el 5it !'+7 del registro !'+E/I&
/amos a hacerlo en mikro%...
/* El pin PORTE.0 se configura como una entrada analgica mientras que
los dems tres
pines del mismo puerto se configuran como digitales */
...
ANSEL = 0b00100000; // El pin PORTE.0 se configura como analgico
ANSELH = 0; // Todos los pines de E/S se configuran como
digitales
TRISE = 0b00000001; // Todos los pines del puerto PORTE excepto el
// PORTE.0 se configuran como salidas
PORTE = 0; // Todos los bits del puerto PORTE se ponen a cero
...
R$,3)&/0) ANSEL : ANSELH
/os registros !'+E/ 2 !'+E/: se utili4an para con1igurar el modo de entrada de un
pin de ER+ como analgico o como digital&
/a regla es la siguiente#
Para con1igurar un pin como una entrada analgica, el 5it apropiado de los registros
!'+E/ o !'+E/: se de5e poner a uno G1I& Para con1igurar un pin como una
entradaRsalida digital, el 5it apropiado se de5e poner a cero G;I&
El estado lgico de los 5its del registro !'+E/ no tiene in1luencia en las 1unciones de
salidas digitales& !l intentar a leer un pin de puerto con1igurado como una entrada
analgica, el resultado es siempre ;&
Es pro5a5le 0ue usted nunca %a2a a escri5ir un programa 0ue no utilice puertos, as7 0ue
el es1uer4o para aprender todo so5re ellos en de1initi%a %ale la pena& -e todos modos,
los puertos son pro5a5lemente los mdulos m3s simples dentro del microcontrolador&
+e utili4an de la siguiente manera#
!l dise8ar un dispositi%o, seleccione un puerto por el 0ue el microcontrolador
comunicar3 al entorno peri1"rico& +i usted utili4a slo entradasRsalidas digitales,
seleccione cual0uier puerto& +i utili4a alguna de las entradas analgicas,
seleccione los puertos apropiados 0ue soportan tal con1iguracin de los pines
G!';-!'13I&
Cada pin del puerto se puede con1igurar como salida o como entrada& /os 5its de
los registros .)I+!,.)I+A, .)I+C, .)I+- 2 .)I+E determinan cmo se com
portar3n los pines apropiados de los puertos P*).!, P*).A, P*).C, P*).-
2 P*).E& +implemente&&&
+i utili4a alguna de las entradas analgicas, primero es necesario poner a uno los
5its apropiados de los registros !'+E/ 2 !'+E/: en el principio de programa&
+i utili4a resistencias o 5otones de presin como una 1uente de se8al de en trada,
con"ctelos a los pines del puerto P*).A, 2a 0ue tienen las resistencias pull-up&
El uso de estos registros est3 $a5ilitado por el 5it )AP? del registro
*P.I*'j)E[, mientras 0ue la instalacin de las resistencias indi%iduales est3
$a5ilitada por los 5its del registro WP?A&
Con 1recuencia se necesita responder tan pronto como los pines de entrada
cam5ien su estado lgico& +in em5argo, no es necesario escri5ir un programa
para compro5ar el estado lgico de los pines& Es muc$o m3s simple conectar
estas entradas a los pines del puerto P*).A 2 $a5ilitar 0ue ocurra una
interrupcin con cada cam5io de %oltae& /os 5its de los registros I*CA e
I'.C*' se encargan de eso&
El microcontrolador 96,$=>??@ dispone de tres temporizadores/contadores
independientes, denominados 8imer%, 8imer$ & 8imerD. En este captulo se presenta
una descripcin detallada de los mismos.
.J TEM4O(&AADO( T&ME(T
El tempori4ador .imer; tiene una amplia gama de aplicaciones en la pr3ctica& +lo unos
pocos programas no lo utili4an de alguna 1orma& Es mu2 con%eniente 2 13cil de utili4ar
en programas o su5rutinas para generar pulsos de duracin ar5itraria, en medir tiempo o
en contar los pulsos e9ternos Ge%entosI casi sin limitaciones&
El mdulo del tempori4ador .imer; es un tempori4adorRcontador de 8 5its con las
siguientes caracter7sticas#
.empori4adorRcontador de 8 5itsV
Pre-escalador de 8 5its Glo comparte con el tempori4ador perro guardi3nIV
Fuente de relo interna o e9terna programa5leV
[eneracin de interrupcin por des5ordamientoV 2
+eleccin del 1lanco de relo e9terno programa5le&
/a siguiente 1igura muestra el es0uema del tempori4ador .imer; con todos los 5its 0ue
determinan su 1uncionamiento& Estos 5its se almacenan en el registro *P.I*'j)E[&
R$,3)&/0 OPTION@REG
(04) - 4O(T0 4ull-up ena9le 9it 6resistencia 4ull )p !el puerto 4O(T07
o ; - )esistencias pull-up del puerto P*).A est3n des$a5ilitadas&
o 1 - Pines del puerto P*).A pueden estar conectados a las resistencias
pull-up&
&'TED= - &nterrupt E!ge -elect 9it 69it selector !e #lanco activo !e la
interrupci?n eHterna7
o ; - Interrupcin por 1lanco ascendente en el pin I'. G;-1I&
o 1 - Interrupcin por 1lanco descendente en el pin I'. G1-;I&
TT%- - TM(T %lock -elect 9it 69it selector !e tipo !e reloI para el TimerT7
o ; - /os pulsos se lle%an a la entrada del tempori4adorRcontador .imer;
por el pin )!4&
o 1 - El tempori4ador utili4a los pulsos de relo internos GFoscR4I&
TT-E - TM(T -ource E!ge -elect 9it 69it selector !e tipo !e #lanco7
o ; - Incrementa en 1lanco descendente en el pin .M);&
o 1 - Incrementa en 1lanco ascendente en el pin .M);&
4-A - 4rescaler Assignment 9it 69it !e asignaci?n !el pre-escala!or7
o ; - Pre-escalador se le asigna al W-.&
o 1 - Pre-escalador se le asigna al tempori4adorRcontador .imer;&
4-+. 4-1. 4-T - 4rescaler (ate -elect 9it 69it selector !el valor !el !ivisor
!e #recuencias7
o El %alor del di%isor de 1recuencias se austa al com5inar estos 5its& Como
se muestra en la ta5la a la derec$a, la misma com5inacin de 5its
proporciona los di1erentes %alores del di%isor de 1recuencias para el
tempori4adorRcontador 2 el tempori4ador perro guardi3n,
respecti%amente&
4-+ 4-1 4-T TM(T NDT
; ; ; 1#2 1#1
; ; 1 1#4 1#2
; 1 ; 1#8 1#4
; 1 1 1#16 1#8
1 ; ; 1#32 1#16
1 ; 1 1#64 1#32
1 1 ; 1#128 1#64
1 1 1 1#2L6 1#128
Cuando el 5it P+! est3 a ;, el pre-escalador se le asigna al tempori4adorRcontador
.imer;, como se muestra en la siguiente 1igura&
/amos a hacerlo en mikro%...
// En este ejemplo, Timer0 se configura como un temporizador y se le
asigna un pre-escalador.
unsigned cnt; // Declarar la variable cnt
void interrupt() { // Rutina de interrupcin
cnt++; // Interrupcin causa el incremento de cnt por 1
TMR0 = 155; // Temporizador (o contador) Timer0 devuelve su
valor inicial
INTCON = 0x20; // Bit T0IE est a 1, bit T0IF est a 0
}
void main() {
OPTION_REG = 0x04; // Pre-escalador (1:32) se le asigna al
temporizador Timer0
TMR0 = 155; // Temporizador T0 cuenta de 155 a 255
INTCON = 0xA0; // Habilitada la generacin de interrupcin para
el
// temporizador Timer0
...
...
// En el siguiente ejemplo, Timer0 se configura
como un temporizador
// y se le asigna un pre-escalador.
OPTION_REG = 0x20; // Pre-escalador (1:2) se le asigna al contador
Timer0
TMR0 = 155; // Contador T0 cuenta de 155 a 255
INTCON = 0xA0; // Habilitada la generacin de interrupcin por
el
// temporizador Timer0
...
...
Cuando el 5it P+! est3 a 1, el pre-escalador se le asigna al tempori4ador perro guardi3n
como se muestra en la siguiente 1igura&
/amos a hacerlo en mikro%...
// En este ejemplo, el pre-escalador (1:64) se le asigna al
temporizador perro guardin.
void main() {
OPTION_REG = 0x0E; // Pre-escalador se le asigna al WDT (1:64)
asm CLRWDT; // Comando en ensamblador para reiniciar el WDT
...
...
asm CLRWDT; // Comando en ensamblador para reiniciar el WDT
...
Aparte !e lo !icho anteriormente. ca9e !estacar lo siguiente:
!l asignarle el pre-escalador al tempori4adorRcontador, el pre-escalador se
pondr3 a ; con cual0uier escritura en el registro .M);&
!l asignar el pre-escalador al tempori4ador perro guardi3n, tanto el W-. como
el preescalador se pondr3n a ; con la instruccin C/)W-.&
!l escri5ir en el registro .M);, utili4ado como un tempori4ador, no se inicia el
conteo de los pulsos inmediatamente, sino con retraso de dos ciclos de
instrucciones& Por consiguiente, es necesario austar el %alor escrito en el registro
.M);&
!l poner el microcontrolador en el modo de reposo se apaga el oscilador de
relo& 'o puede ocurrir el des5ordamiento 2a 0ue no $a2 pulsos a contar& Es la
ra4n por la 0ue la interrupcin por el des5ordamiento del .M); no
puedeBdespertarC al procesador del modo de reposo&
+i se utili4a como un contador de relo e9terno sin pre-escalador, la longitud de
pulso m7nima o tiempo muerto entre dos pulsos de5er3 ser 2 .osc D 2; n+ G.osc
es el per7odo de se8al de relo del osciladorI&
+i se utili4a como un contador de relo e9terno con pre-escalador, la longitud de
pulso m7nima o tiempo muerto entre dos pulsos es slo 1;n+&
El registro del pre-escalador de 8 5its no est3 disponi5le al usuario, lo 0ue
signi1ica 0ue no es posi5le leerlo o escri5ir en "l directamente&
!l cam5iar de asignacin del pre-escalador del .imer; al tempori4ador perro
guardi3n, es necesario eecutar la siguiente secuencia de instrucciones escritas en
ensam5lador para impedir reiniciar el microcontrolador#
BANKSEL TMR0
CLRWDT ;PONER A CERO WDT
CLRF TMR0 ;PONER A CERO TMR0 Y PRE-ESCALADOR
BANKSEL OPTION_REG
BSF OPTION_REG,PSA ;ASIGNARLE EL PRE-ESCALADOR AL WDT
CLRWDT ;PONER A CERO WDT
MOVLW b'11111000' ;SELECCIONAR LOS BITS PS2,PS1,PS0 Y PONERLOS
ANDWF OPTION_REG,W ;A CERO POR LA INSTRUCCIN 'Y LGICO'
IORLW b'00000101' ;BITS PS2, PS1, Y PS0 PONEN EL VALOR
MOVWF OPTION_REG ;DEL DIVISOR DE FRECUENCIAS A 1:32
-e manera similar, al cam5iar de asignacin del pre-escalador del W-. al
.imer;, es necesario eecutar la siguiente secuencia de instrucciones, tam5i"n
escritas en ensam5lador#
BANKSEL TMR0
CLRWDT ;PONER A CERO WDT Y PRE-ESCALADOR
BANKSEL OPTION_REG
MOVLW b'11110000' ;SELECCIONAR SLO LOS BITS PSA,PS2,PS1,PS0
ANDWF OPTION_REG,W ;Y PONERLOS A CERO POR LA INSTRUCCIN 'Y
LGICO'
IORLW b'00000011' ;VALOR DEL DIVISOR DE FRECUENCIAS ES 1:16
MOVWF OPTION_REG
Para utili4ar el .imer; apropiadamente, es necesario#
4aso 1: -eleccionar el mo!o:
El modo de tempori4ador se selecciona por el 5it .*+C del registro
*P.I*'j)E[ G.*+C# ;Jtempori4ador, 1JcontadorI&
Cuando se asigna el pre-escalador al tempori4adorRcontador se de5e poner a cero
el 5it P+! del registro *P.I*'j)E[& El %alor del di%isor de 1recuencias se
con1igura al utili4ar los 5its P+2-P+; del mismo registro&
!l utili4ar una interrupcin, los 5its [IE 2 .M);IE del registro I'.C*' de5en
estar a uno&
4aso +: Me!ir ; contar
4ara me!ir tiempo:
)einiciar el registro .M); o escri5ir un %alor conocido en "l&
El tiempo transcurridoGen microsegundos al utili4ar el oscilador de 4M:4I se
mide al leer el registro .M);&
El 5it de 5andera .M);IF del registro I'.C*' se pone a uno autom3ticamente
siempre 0ue ocurra el des5ordamiento del registro .M);& +i est3 $a5ilitada,
ocurre una interrupcin&
4ara contar pulsos:
/a polaridad de pulsos a contar en el pin )!4 se selecciona por el 5it .*+E del
registro *P.I*'j)E[ G.;+E# ;Jpulsos positi%os, 1Jpulsos negati%osI&
Karios pulsos se pueden leer del registro .M);& El pre-escalador 2 la
interrupcin se utili4an de la misma 1orma 0ue en el modo de tempori4ador&
.R TEM4O(&AADO( T&ME(1
El mdulo del tempori4ador .imer1 es un tempori4adorRcontador de 16 5its, lo 0ue
signi1ica 0ue consiste en dos registros G.M)1/ 2 .M)1:I& Puede contar $asta 6LL3L
pulsos en un solo ciclo, o sea, antes de 0ue el conteo se inicie desde cero&
+imilar al tempori4ador .imer;, estos registros se pueden leer o se puede escri5ir en
ellos en cual0uier momento& En caso de 0ue ocurra un des5ordamiento, se genera una
interrupcin si est3 $a5ilitada&
El mdulo del tempori4ador .imer1 puede 1uncionar en uno o dos modos 53sicos, eso
es como un tempori4ador o como un contador& ! di1erencia del tempori4ador .imer;,
cada uno de estos dos modos tiene 1unciones adicionales&
El tempori4ador .imer1 tiene las siguientes caracter7sticas#
.empori4adorRcontador de 16 5its compuesto por un par de registrosV
Fuente de relo interna o e9terna programa5leV
Pre-escalador de 3 5itsV
*scilador /P opcionalV
Funcionamiento s7ncrono o as7ncronoV
Compuerta para controlar el tempori4ador .imer1 Gconteo $a5ilitadoI por medio
del comparador o por el pin .1[V
Interrupcin por des5ordamientoV
k-espiertak al microcontrolador Gsalida del modo de reposoI por des5ordamiento
Grelo e9ternoIV 2
Fuente de relo para la 1uncin de CapturaRComparacin&
SELECCIN DE LA FUENTE DE RELO# DEL TEMPORIADOR
TIMERA
El 5it .M)1C+ del registro .1C*' se utili4a para seleccionar la 1uente de relo para
este tempori4ador#
<uente !e reloI TM(1%-
FoscR4 ;
.1CTI pin 1
!l seleccionar la 1uente de relo interna, el par de registros .M)1:-.M)1/ ser3
incrementado con %arios pulsos Fosc como es determinado por el pre-escalador&
!l seleccionar la 1uente de relo e9terna, este tempori4ador puede 1uncionar como un
tempori4ador o un contador& /os pulsos en el modo tempori4ador pueden estar
sincroni4ados con el relo interno del microcontrolador o 1uncionar as7ncronamente& En
caso de 0ue se necesite un oscilador del relo e9terno 2 el microcontrolador PIC16F887
utilice el oscilador interno I'.*+C con el pin )!6R*+C2RC/IT*?., el tempori4ador
.imer1 puede utili4ar el oscilador /P como una 1uente de relo&
PRE-ESCALADOR DEL TEMPORIADOR TIMERA
El tempori4ador .imer1 tiene un escalador completamente separado 0ue permite di%idir
la 1recuencia de entrada de relo por 1,2,4 o 8& 'o es posi5le leer el pre-escalador o
escri5ir en "l directamente& -e todas 1ormas, el contador del pre-escalador se pone a ;
autom3ticamente despu"s de escri5ir en los registros .M)1: o .M)1/&
OSCILADOR DEL TEMPORIADOR TIMERA
/os pines )C;R.1*+* 2 )C1R.1*+I se utili4an para registrar los pulsos 0ue %ienen de
los dispositi%os peri1"ricos, pero tam5i"n tienen una 1uncin adicional& Como se puede
%er en la siguiente 1igura, se con1iguran simult3neamente como entrada Gpin )C1I 2
salida Gpin )C;I del oscilador de cuar4o /P G/oS PoSer - de 5ao consumoI adicional&
Este circuito est3 principalmente dise8ado para 1uncionar a 5aas 1recuencias G$asta 2;;
T:4I, e9actamente para el uso de cristal de cuar4o de 32&768 T:4& Este cristal se utili4a
en los reloes de cristal puesto 0ue es 13cil de o5tener un pulso de duracin de un
segundo al di%idir esta 1recuencia&
Como el oscilador no depende del relo interno, puede 1uncionar incluso en el modo de
reposo& +e $a5ilita al poner a uno el 5it de control .1*+CE' del registro .1C*'& El
usuario de5e proporcionar tiempo muerto por medio de so1tSare Gunos pocos
milisegundosI para $a5ilitar 0ue el oscilador se inicie apropiadamente&
/a siguiente ta5la muestra los %alores recomendados de los capacitores con%enientes
con el oscilador de cuar4o& 'o es necesario 0ue estos %alores sean e9actos& -e todas
1ormas, la regla general es# cu3nto m3s alta sea la capacidad, tanto m3s alta ser3 la
esta5ilidad, lo 0ue a la %e4 prolonga el tiempo necesario para la esta5ili4acin del
oscilador&
Oscila!or <recuencia %1 %+
/P
32 ]:4 33 pF 33 pF
1;; ]:4 1L pF 1L pF
2;; ]:4 1L pF 1L pF
El consumo de corriente del microcontrolador se reduce a ni%el m3s 5ao en el modo de
reposo 2a 0ue el consumidor de corriente principal - el oscilador - no 1unciona& Es 13cil
de poner al microcontrolador en este modo - al eecutar la instruccin +/EEP& El
pro5lema es cmo despertar al microcontrolador por0ue slo una interrupcin puede
producirlo& Como el microcontrolador BduermeC, se de5e usar una interrupcin causada
por dispositi%os peri1"ricos para BdespertarloC& +e pone mu2 complicado si es necesario
despertar al microcontrolador a inter%alos de tiempo regulares&&&
Para resol%er el pro5lema, un oscilador de cuar4o /P Gde 5ao consumo de corrienteI
completamente independiente, capa4 de 1uncionar en el modo de reposo, est3 integrado
en el microcontrolador PIC16F887& +implemente, un circuito anteriormente separado
a$ora est3 integrado en el microcontrolador 2 asignado al tempori4ador .imer1& El
oscilador est3 $a5ilitado al poner a 1 el 5it .1*+CE' del registro .1C*'& El 5it
.M)1C+ del mismo registro se utili4a para $a5ilitar 0ue el tempori4ador .imer1 utilice
secuencias de pulsos de ese oscilador&
?na se8al generada por este oscilador de cuar4o est3 sincroni4ada con el relo
del microcontrolador al poner a ; el 5it .1+M'C& En este caso, el tempori4ador
no puede 1uncionar en modo de reposo por0ue el circuito para sincroni4acin
utili4a el relo del microcontrolador&
/a interrupcin por des5ordamiento en el registro del tempori4ador .imer1
puede estar $a5ilitada& +i el 5it .1+M'C se pone a 1, tales interrupciones se
producir3n en el modo de reposo tam5i"n&
COMPUERTA DEL TEMPORIADOR TIMERA
El pin .[1 o la salida del comparador C2 pueden ser una 1uente de los pulsos 0ue pasan
por la compuerta del tempori4ador .imer1& +e con1iguran por so1tSare& Esta compuerta
permite 0ue el tempori4ador mida directamente la duracin de los e%entos e9ternos al
utili4ar el estado lgico del pin .1[ o los e%entos analgicos al utili4ar la salida del
comparador C2& )e1i"rase a la Figura en la p3gina anterior& Para medir duracin de
se8al, 5asta con $a5ilitar esta compuerta 2 contar los pulsos 0ue pasan por ella&
TIMERA EN EL MODO TEMPORIADOR
Para seleccionar este modo, es necesario poner a ; el 5it .M)1C+& -espu"s de eso, el
registro de 16 5its ser3 incrementado con cada pulso generado por el oscilador interno&
+i se utili4a el cristal de cuar4o de 4 M:Z, el registro ser3 incrementado cada
microsegundo&
En este modo, el 5it .1+M'C no a1ecta al tempori4ador por0ue cuenta los pulsos de
relo interno& Como todos los dispositi%os utili4an estos pulsos, no $ace 1alta
sincroni4arlos&
El oscilador de relo del microcontrolador no 1unciona durante el modo de reposo as7
0ue el des5ordamiento en el registro del tempori4ador no puede causar interrupcin&
/amos a hacerlo en mikro%...
// En este ejemplo, el TMR1 est configurado como un temporizador con
el valor
// del preescalador 1:8. Cada vez que ocurra un desbordamiento de los
registros TMR1H y
// TMR1L, se solicitar una interrupcin.
void main() {
PIR1.TMR1IF = 0; // Poner a 0 la bandera de bit del TMR1IF
TMR1H = 0x22; // Poner el valor inicial para el
temporizador Timer1
TMR1L = 0x00;
TMR1CS = 0; // Temporizador1 cuenta los pulsos del
oscilador interno
T1CKPS1 = T1CKPS0 = 1; // El valor del pre-escalador asignada es 1:8
PIE1.TMR1IE = 1; // Interrupcin habilitada por desbordamiento
INTCON = 0xC0; // Interrupcin habilitada (bits GIE y PEIE)
TMR1ON = 1; // Encender el temporizador Timer1
...
TIMERA EN EL MODO CONTADOR
El tempori4ador .imer1 se pone a 1uncionar como un contador al poner a 1 el 5it
.M)1C+& Este 5it cuenta los pulsos lle%ados al pin PC;R.1CTI 2 se incrementa en el
1lanco ascendente de la entrada del relo e9terno .1CTI& +i el 5it de control .1+M'C
del registro .1C*' se pone a ;, las entradas del relo e9terno se sincroni4ar3n en su
camino al tempori4ador .imer1& En otras pala5ras, el tempori4ador .imer1 se
sincroni4a con el relo interno del microcontrolador 2 se le denomina contador s7ncrono&
!l poner en modo de reposo el microcontrolador 0ue 1unciona de esta manera, los
registros del tempori4ador .imer1: 2 .M)1/ no ser3n incrementados aun0ue los
pulsos de relo apare4can en los pines de entrada& Como el relo interno del
microcontrolador no 1unciona en este modo, no $a2 entradas de relo 0ue se utilicen
para la sincroni4acin& -e todas 1ormas, el pre-escalador sigue 1uncionando siempre 0ue
$a2a pulsos de relo en los pines, por0ue es un simple di%isor de 1recuencias&
Este contador detecta un uno lgico G1I en los pines de entrada& Ca5e destacar 0ue al
menos un 1lanco ascendente de5e ser detectado antes de empe4ar a contar los pulsos&
)e1i"rase a la Figura a la i40uierda& /as 1lec$as en la 1igura indican los incrementos del
contador&
R$,3)&/0 TACON
T1=&'/ - .imer1 [ate In%ert 5it GAit in%ersor de la compuerta del tempori4ador1I se
comporta como un in%ersor del estado lgico en la compuerta 1ormada por el pin .1[ o
la salida GC2*?.I del comparador C2& Este 5it $a5ilita al tempori4ador para con tar los
pulsos cuando la compuerta est" a alto o a 5ao&
1 - .empori4ador 1 cuenta los pulsos cuando el pin .1[ o el 5it C2*?. est"n a
alto G1I&
; - .empori4ador 1 cuenta los pulsos cuando el pin .1[ o el 5it C2*?. est"n a
5ao G;I&
TM(1=E - .imer1 [ate Ena5le 5it GAit de $a5ilitacin de la compuerta del
tempori4ador1I determina si la compuerta 1ormada por el pin .1[ o salida del
comparador C2 GC2*?.I estar3 acti%a o no& Este 5it es 1uncional slo en caso de 0ue el
tempori4ador .imer1 est" encendido Gel 5it .M)1*' J 1I& -e lo contrario, este 5it se
ignora&
1 - .empori4ador .imer1 est3 encendido slo si la compuerta no est3 acti%a&
; - Compuerta no a1ecta al tempori4ador .imer1&
T1%L4-1. T1%L4-T - .imer1 Input Cloc] Prescale +elect 5its GAits de seleccin del
preescalador de se8al de relo del .empori4ador1I determina el %alor del di%isor de
1recuen cias asignada al tempori4ador .imer1&
T1%L4-1 T1%L4-T /alor !el pre-escala!or
; ; 1#1
; 1 1#2
1 ; 1#4
1 1 1#8
T1O-%E' - /P *scillator Ena5le Control 5it G5it de $a5ilitacin del oscilador /P del
.imer1I
1 - *scilador /P est3 $a5ilitado para el relo del .imer1 Goscilador de 5ao
consumo 2 de 1recuencia de 32&768 ]:4I
; - *scilador /P est3 apagado&
T1-5'% - .imer1 E9ternal Cloc] Input +2nc$roni4ation Control 5it GAit de control de
sincroni4acin de la se8al de entradaI $a5ilita la sincroni4acin de la entrada del
oscilador /P o de la entrada del pin .1CTI con el relo interno del microcontrolador&
Este 5it se ignora al contar los pulsos desde el oscilador principal Gel 5it .M)1C+ J ;I&
1 - Entrada de relo e9terna no est3 sincroni4ada&
; - Entrada de relo e9terna est3 sincroni4ada&
TM(1%- - .imer .M)1 Cloc] +ource +elect 5it G5it de seleccin de la 1uente de relo
del tempori4ador .imer1I
1 - Cuenta los pulsos por el pin .1CTI Gpor el 1lanco ascendente ;-1I
; - Cuenta los pulsos del relo interno del microcontrolador
TM(1O' - .imer1 *n 5it G.M) acti%o, $ace entrar o no en 1uncionamiento el
.imer1I&
1 - :a5ilita el tempori4ador .imer1&
; - -es$a5ilita el tempori4ador .imer1&
Para utili4ar el .imer1 apropiadamente, es necesario $acer lo siguiente#
Como no es posi5le apagar el pre-escalador, su %alor de5e estar austado a los
5its .1CTP+1 2 .1CTP+; del registro .1C*' G)e1i"rase a la ta5laI&
+eleccionar el modo por el 5it .M)1C+ del registro .1C*'& G.M)1C+# ;Jla
1uente de relo es oscilador de cuar4o interno, 1J la 1uente de relo es oscilador
de cuar4o e9ternoI&
!l con1igurar el 5it .1*+CE' del mismo registro, el oscilador est3 $a5ilitado 2
los registros .M)1: 2 .M)1/ se incrementan con cada pulso de relo& !l
poner este 5it a ;, se detiene el conteo&
!l reiniciar los registros del contador o al escri5ir en ellos, se reinicia el pre-
escalador&
!l llenar am5os registros del tempori4ador, se con1igura la 5andera .M)1IF 2
el conteo empie4a desde cero&
." TEM4O(&AADO( T&ME(+
El mdulo del tempori4ador .imer2 es un tempori4ador de 8 5its&
/os pulsos 0ue %ienen del oscilador de cuar4o primero pasan por el pre-escalador cu2o
%alor puede ser modi1icado al com5inar los 5its .2CTP+1 2 .2CTP+;& /a salida del
preescalador se utili4a para incrementar el registro .M)2 empe4ando por ;;$& /os
%alores del .M)2 2 del P)2 se comparan constantemente 2 el registro .M)2 %a
increment3ndose $asta alcan4ar el %alor del registro P)2& Cuando se igualan los %alores
de los registros, lo 0ue ser3 registrado por el comparador, el .M)2 se reinicia a ;;$
autom3ticamente& El postescalador del tempori4ador .imer2 se incrementa 2 su salida
se utili4a para generar una interrupcin si est3 $a5ilitada&
/os am5os registros .M) 2 P)2 son de lectura 2 escritura& El conteo se puede detener
al poner a ; el 5it .M)2*', lo 0ue resulta en un a$orro de energ7a&
El momento de reinicio del .M)2 se puede utili4ar para determinar la %elocidad de
transmisin en 5audios de la comunicacin serie s7ncrona&
Karios 5its del registro .2C*' est3n en control del tempori4ador .imer2&
R$,3)&/0 TBCON
TO)T4- - TO)T4-T - .imer2 *utput Postcaler +elect 5its G5its de seleccin del
rango del di%isor del post-escalador para el .imer2I se utili4an para determinar el %alor
del post-escalador seg6n la siguiente ta5la#
TO)T4- TO)T4-+ TO)T4-1 TO)T4-T /alor !el post-escala!or
; ; ; ; 1#1
; ; ; 1 1#2
; ; 1 ; 1#3
; ; 1 1 1#4
; 1 ; ; 1#L
; 1 ; 1 1#6
; 1 1 ; 1#7
; 1 1 1 1#8
1 ; ; ; 1#H
1 ; ; 1 1#1;
1 ; 1 ; 1#11
1 ; 1 1 1#12
1 1 ; ; 1#13
1 1 ; 1 1#14
1 1 1 ; 1#1L
1 1 1 1 1#16
TM(+O' Timer+ On 9it - G5it de acti%acin del .IM)2I $ace entrar en
1uncionamiento el tempori4ador .imer2&
1 - :a5ilita el 1uncionamiento del .imer2&
; - -es$a5ilita el 1uncionamiento del .imer2&
T+%L4-1. T+%L4-T - .imer2 Cloc] Prescaler 5its Gseleccin del rango del di%isor
del preescalador del .imer2I determina el %alor del di%isor de 1recuencias#
T+%L4-1 T+%L4-T /alor !el pre-escala!or
; ; 1#1
; 1 1#4
1 9 1#16
!l utili4ar el tempori4ador .imer2 $a2 0ue sa5er %arios detalles relacionados con sus
registros#
En el momento de encender una 1uente de alimentacin, el registro P)2 contiene
el %alor FF$&
.anto el pre-escalador como el post-escalador se 5orran al escri5ir en el registro
.M)2&
.anto el pre-escalador como el post-escalador se 5orran al escri5ir en el registro
.2C*'&
!l producirse cual0uier reinicio, como puede anticiparse, tanto el pre-escalador
como el post-escalador se 5orran&
Los mdulos ,,9 pueden funcionar en muchos modos diferentes, por lo ue se
consideran los m"s complicados. #i usted intenta analizar su funcionamiento a base de
tablas ue describen las funciones de bits, comprender" meJor de lo u le estamos
hablando. #i utiliza alguno de los mdulos ,,9, primero seleccione el modo ue
necesita, analice la figura apropiada & entonces pngase a modificar los bits de
registros. #i no...
.$ M*D)1O- %%4
El mdulo CCP G,aptura/,omparacin/9R7I es un peri1"rico 0ue le permite medir 2
controlar di1erentes e%entos&
El mo!o !e captura proporciona el acceso al estado actual de un registro 0ue cam5ia
su %alor constantemente& En este caso, es el registro del tempori4ador .imer1&
El mo!o !e comparaci?n compara constantemente %alores de dos registros& ?no de
ellos es el registro del tempori4ador .imer1& Este circuito tam5i"n le permite al usuario
acti%ar un e%ento e9terno despu"s de 0ue $a2a e9pirado una cantidad de tiempo
predeterminada&
4NM G9ulse Ridth 7odulation - modulacin por anc$o de pulsosI puede generar
se8ales de 1recuencia 2 de ciclo de tra5ao %ariados por uno o m3s pines de salida&
El microcontrolador PIC16F887 dispone de dos mdulos CCP - CCP1 2 CCP2&
!m5os son id"nticos en modo normal de 1uncionamiento, mientras 0ue las
caracter7sticas del PWM meorado est3n disponi5les slo en el modo CCP1& Psta es la
ra4n por la 0ue en este cap7tulo se descri5e detalladamente el 1uncionamiento del
mdulo CCP1& Con respecto al CCP2, se presentar3n slo las caracter7sticas 0ue lo
distinguen del CCP1&
MDULO CCPA
?na parte central de este circuito es un registro CCP)1 de 16 5its 0ue consiste en
registros CCP)1/ 2 CC*)1:& +e utili4a para capturar 2 comparar sus %alores con los
n6meros almacenados en el registro del tempori4ador .imer1 G.M)1: 2 .M)1/I&
+i est3 $a5ilitado por so1tSare, puede ocurrir el reinicio del tempori4ador .imer1 al
igualarse los %alores en modo de Comparacin& !dem3s, el mdulo CCP1 puede
generar se8ales PWM de 1recuencia 2 de ciclo de tra5ao %ariados&
/os 5its del registro CCP1C*' est3n en control del mdulo CCP1&
CCPA EN MODO DE CAPTURA
En este modo, el registro del tempori4ador .imer1 G0ue consiste en los .M)1: 2
.M)1/I se copia al registro CCP1 G0ue consiste en los CCP)1: 2 CCP)1/I en las
siguientes situaciones#
Cada 1lanco ascendente G1 -` ;I en el pin )C2RCCPV
Cada 1lanco descendente G; -` 1I en el pin )C2RCCP1V
Cada cuarto 1lanco ascendente G; -` 1I en el pin )C2RCCP1V 2
Cada decimose9to 1lanco descendente G; -` 1I en el pin )C2RCCP1&
?na com5inacin de cuatro 5its GCCP1M3 - CCP1M;I del registro de control determina
cu3l de estos e%entos causar3 transmisin de dato de 16 5its& !dem3s, se de5en cumplir
los siguientes re0uisitos##
El pin )C2RCCP1 de5e estar con1igurado como entradaV 2
El .imer1 de5e 1uncionar como tempori4ador o contador s7ncrono&
El 5it de 5andera CCP1IF se pone a uno despu"s de aca5ar la captura& +i se pone a 1 el
5it CCP1IE del registro PIE1, se producir3 una interrupcin&
En caso de 0ue el mdulo CCP1 est" en modo de captura, puede producirse una
interrupcin no deseada& Para e%itarlo, antes de 0ue ocurra un cam5io en el registro de
control se de5en poner a ; tanto el 5it 0ue $a5ilita la interrupcin CCP1IE, como el 5it
de 5andera CCP1IF&
/as interrupciones no deseadas pueden producirse al cam5iar el %alor del pre-escalador&
Para e%itarlo, el mdulo CCP1 de5e estar apagado temporalmente antes de cam5iar el
%alor del pre-escalador&
+e recomienda la siguiente secuencia de programa, escrita en ensam5lador#
BANKESEL CCP1CON
CLRF CCP1CON ;REGISTRO DE CONTROL BORRADO
;MDULO CCP1 EST APAGADO
MOVLW XX ;NUEVO MODO DEL PRE-ESCALADOR EST SELECCIONADO
MOVWF CCP1CON ;EN EL REGISTRO DE CONTROL SE INTRODUCE UN NUEVO
VALOR
;MDULO CCP1 SE ENCIENDE SIMULTNEAMENTE
/amos a hacerlo en mikro%...
...
.,3 {
BANKESEL CCP1CON
CLRF CCP1CON // REGISTRO DE CONTROL BORRADO
// MDULO CCP1 EST APAGADO
MOVLW XX // NUEVO MODO DEL PRE-ESCALADOR EST SELECCIONADO
MOVWF CCP1CON // EN EL REGISTRO DE CONTROL SE INTRODUCE NUEVO
VALOR
} // MDULO CCP1 SE ENCIENDE SIMULTNEAMENTE
...
CCPA EN MODO DE COMPARACIN
En este modo, el %alor almacenado en el registro CCP1 se compara constantemente al
%alor almacenado en el registro del tempori4ador .imer1& !l igualarse los %alores, el
estado lgico en el pin de salida puede ser cam5iado, lo 0ue depende del estado de 5its
en el registro de control GCCP1M3 - CCP1M;I& El 5it de 5andera CCP1IF se pone a uno
simult3neamente&
Para poner el mdulo CCP1 en este modo de 1uncionamiento, se de5en cumplir dos
condiciones#
El pin )C2RCCP1 de5e estar con1igurado como salidaV 2
El tempori4ador .imer1 de5e estar sincroni4ado con el relo interno&
CCPA EN MODO P"M
/as se8ales de 1recuencia 2 de ciclo de tra5ao %ariados tienen una amplia gama de
aplicaciones en automati4acin& ?n eemplo t7pico es un circuito de control de potencia&
)e1i"rase a la siguiente 1igura& +i un cero lgico G;I indica un interruptor a5ierto 2 un
uno lgico G1I indica un interruptor cerrado, la potencia el"ctrica 0ue se transmite a los
consumidores ser3 directamente proporcional a la duracin del pulso& Esta relacin se le
denomina ,iclo de 8rabaJo&
El otro eemplo, com6n en la pr3ctica, es el uso de se8ales PWM en un circuito para
generar se8ales de 1orma de onda ar5itraria como una onda sinusoidal& Kea la siguiente
1igura#
/os dispositi%os 0ue 1uncionan seg6n este principio se utili4an con 1recuencia en la
pr3ctica como %ariadores de 1recuencia austa5le 0ue controlan motores el"ctricos
G%elocidad, aceleracin, desaceleracin etc&I
/a Figura anterior muestra el diagrama de 5lo0ues del mdulo CCP1 puesto en el modo
PWM& Para generar un pulso de 1orma ar5itraria en el pin de salida, es necesario austar
el per7odo de pulsos G1recuenciaI 2 la duracin de pulsos&
PER=ODO DE P"M
El per7odo de pulso de salida G.I se determina por el registro P)2 del tempori4ador
.imer2& El per7odo de PWM se puede calcular por la siguiente ecuacin#
Per7odo PWM J GP)2 D1I E 4.osc E Kalor de pre-escala del .imer2
+i el per7odo de PWM G.I es conocido, es 13cil determinar la 1recuencia de se8al F,
por0ue estos dos %alores est3n relacionados por la ecuacin FJ1R.&
CICLO DE TRABA#O DE P"M
El ciclo de tra5ao de PWM se especi1ica al utili4ar en total 1; 5its# los oc$o 5its m3s
signi1icati%os del registro CCP)1/ 2 los dos 5its menos signi1icati%os adicionales del
registro CCP1C*' G-C1A1 2 -C1A;I& El resultado es un n6mero de 1; 5its dado por
la siguiente 1rmula#
!nc$o de pulsos J GCCP)1/,-C1A1,-C1A;I E .osc E Kalor de pre-escala del .imer2
/a siguiente ta5la muestra cmo generar las se8ales PWM de di1erentes 1recuencias
cuando el microcontrolador utili4a un cristal de cuar4o de 2; M:4 G.oscJL;n+I&
<recuencia KL2:M 1.++ J.88 1S.R $8.1+ 1R". +T8.
Pre-escalador del .M)2 16 4 1 1 1 1
)egistro P)2 FF$ FF$ FF$ 3F$ 1F$ 17$
'otas adicionales#
El pin de salida se %a a poner a 1 constantemente, si por error el anc$o de pulso
generado es m3s largo 0ue el per7odo de PWM&
En esta aplicacin, no se puede utili4ar el post-escalador del tempori4ador
.imer2 para generar per7odos de PWM largos&
RESOLUCIN DE P"M
?na se8al PWM no es nada m3s 0ue una secuencia de pulsos 0ue %ar7an su ciclo de
tra5ao& Para una 1recuencia espec71ica Gn6mero de pulsos por segundoI, $a2 un n6mero
limitado de com5inaciones de ciclos de tra5ao& Este n6mero representa una resolucin
medida en 5its& Por eemplo, si una resolucin es de 1; 5its estar3n disponi5les 1;24
ciclos de tra5ao discretosV si una resolucin es de 8 5its estar3n disponi5les 2L6 ciclos
de tra5ao disretos etc& En este microcontrolador la resolucin es determinada por el
registro P)2& El m39imo %alor se o5tiene al usar el n6mero FF$&
Frecuencias 2 resoluciones de PWM GFosc J 2;M:4I#
<recuencia !e 4NM 1.++k2: J.88k2: 1S.Rk2: $8.1+k2: 1R".k2: +T8.k2:
Pre-escala del
tempori4ador
16 4 1 1 1 1
Kalor del P)2 FF$ FF$ FF$ 3F$ 1F$ 17$
)esolucin m39ima 1; 1; 1; 8 7 6
Frecuencias 2 resoluciones de PWM GFosc J 8M:4I#
<recuencia !el 4NM 1.++k2: J.STk2: 1S."1k2: $".S+k2: 1R.8Rk2: +TT.Tk2:
Pre-escala del
tempori4ador
16 4 1 1 1 1
Kalor del P)2 6L$ 6L$ 6L$ 1H$ ;C$ ;H$
)esolucin m39ima 8 8 8 6 L L
/amos a hacerlo en mikro%...
/* En este ejemplo, el mdulo PWM est inicializado y ajustado para
producir una secuencia
de pulsos de ciclo de trabajo del 50%. Para este propsito, se
utilizan las funciones
PWM1_Init(), PWM1_Start() y PWM1_Set_Duty(). Todas las funciones las
contiene la librera
PWM del mikroC PRO for PIC. Slo es necesario copiarlas al programa */
unsigned short duty_c; // Definir la variable duty_c
void initMain() {
ANSEL = ANSELH = 0; // Todos los pines de E/S se configuran como
digitales
PORTC = TRISC = 0; // Estado inicial de los pines de salida del
puerto PORTC
PWM1_Init(5000); // Inicializacin del mdulo PWM (5KHz)
}
void main() {
initMain();
duty_c = 127; // Valor inicial del ciclo de trabajo
PWM1_Start(); // Iniciar el mdulo PWM1
PWM1_Set_Duty(duty_c); // Ajustar el ciclo de trabajo de PWM al 50%
...
...
R$,3)&/0 CCPACON
41M1. 41MT - PWM *utput Con1iguration 5its G5its de con1iguracin del modo PWMI
- El pin P1! es la entrada del mdulo de CapturaRComparacin en todos los modos,
menos en modo PWM& /os pines P1A, P1C 2 P1- act6an como los pines de ER+ del
puerto -&
En modo PWM estos 5its a1ectan al 1uncionamiento del mdulo CCP1 como se muestra
en la siguiente ta5la#
41M1 41MT Mo!o
; ;
4NM con una s?la sali!a
Por el pin P1! sale una se8al modulada&
Pines P1A, P1C 2 P1- son entradasRsalidas del puerto -&
; 1 %on#iguraci?n <ull 0ri!ge - <orwar!
Gpuente completo con salida directaI
Por el pin P1- sale una se8al modulada&
Por el pin P1- sale una se8al modulada&
Pines P1A 2 P1C est3n inacti%os&
1 ;
%on#iguraci?n 2al# 0ri!ge 6me!io-puente7
Por los pines P1! 2 P1A sale una se8al modulada&
Pines P1C 2 P1- son entradasRsalidas del puerto -&
1 1
%on#iguraci?n <ull 0ri!ge - (everse
Gpuente completo con salida in%ersaI
Por el pin P1A sale una se8al modulada&
Pin P1C est3 acti%o&
Pines P1! 2 P1- est3n inacti%os&
D%101. D%10T - PWM -ut2 C2cle /east +igni1icant 5its G5its menos signi1icati%os
del ciclo de tra5ao de PWMI - +e utili4an slo en el modo PWM 2 representan dos 5its
menos signi1icati%os de un n6mero de 1; 5its& Este n6mero determina el ciclo de tra5ao
de la se8al PWM& /os dem3s 8 5its se almacenan en el registro CCP)1/&
%%41M - %%41MT - G5its de seleccin de modo del mdulo CCP1I determina el
modo del mdulo CCP1&
%%41M %%41M+ %%41M1 %%41MT Mo!o
; ; ; ; Mdulo est3 des$a5ilitado GreinicioI&
; ; ; 1 'o utili4ado&
; ; 1 ;
Mo!o !e comparaci?n
El 5it CCP1IF 5it se pone a 1 al ocurrir una
coincidencia&
; ; 1 1 'o utili4ado&
; 1 ; ;
Mo!o !e captura
Cada 1lanco descendente en el pin CCP1&
; 1 ; 1
Mo!o !e captura
Cada 1lanco ascendente en el pin CCP1&
; 1 1 ;
Mo!o !e captura
Cada cuarto 1lanco ascendente en el pin
CCP1&
; 1 1 1
Mo!o !e captura
Cada decimose9to 1lanco ascendente en el pin
CCP1&
1 ; ; ;
Mo!o !e comparaci?n
/a salida 2 el 5it CCP1IF se ponen a 1 al
ocurrir una coincidencia
1 ; ; 1
Mo!o !e comparaci?n
/a salida se pone a ; 2 el 5it CCP1IF se pone
a 1 al ocurrir una coincidencia&
1 ; 1 ; Mo!o !e comparaci?n
/lega la solicitud de interrupcin 2 el 5it
CCP1IF se pone a 1 al ocurrir una
coincidencia
1 ; 1 1
Mo!o !e comparaci?n
El 5it CCP1IF se pone a 1, 2 los registros de
tempori4adores 1 o 2 se 5orran al ocurrir una
coincidencia
1 1 ; ;
Mo!o 4NM
Pines P1! 2 P1C est3n acti%os a ni%el alto&
Pines P1A 2 P1- est3n acti%os a ni%el alto&
1 1 ; 1
Mo!o 4NM
Pines P1! 2 P1C est3n acti%os a ni%el alto&
Pines P1A 2 P1- est3n acti%os a ni%el 5ao&
1 1 1 ;
Mo!o 4NM
Pines P1! 2 P1C est3n acti%os a ni%el 5ao&
Pines P1A 2 P1- est3n acti%os a ni%el alto&
1 1 1 1
Mo!o 4NM
Pines P1! 2 P1C est3n acti%os a ni%el 5ao&
Pines P1A 2 P1- est3n acti%os a ni%el 5ao&
MDULO CCPB
Con e9clusin de los nom5res di1erentes de los registros 2 de los 5its, este mdulo es
una mu2 5uena copia del mdulo CCP1 puesto en modo normal& /a 6nica di1erencia
signi1icati%a entre ellos es el 1uncionamiento en modo de comparacin del mdulo
CCP2& /a di1erencia se re1iere a la se8al de reinicio del tempori4ador .1&
Concretamente, si el con%ertidor !R- est3 $a5ilitado, al igualarse los %alores de los
registros .M)1 2 CCP)2, la se8al de reinicio del tempori4ador .1 iniciar3
autom3ticamente la con%ersin !R-& +imilar al mdulo anterior, este circuito tam5i"n
est3 5ao el control de los 5its del registro de control& Esta %e4 es el registro CCP2C*'&
R$,3)&/0 CCPBCON
D%+01. D%+0T - PWM -ut2 C2cle /east +igni1icant 5its G5its menos signi1icati%os
del ciclo de tra5ao de PWMI - +e utili4an slo en modo PWM 2 representan dos 5its
menos signi1icati%os de un n6mero de 1; 5its& Este n6mero determina el ciclo de tra5ao
de la se8al PWM& /os dem3s 8 5its se almacenan en el registro CCP)2/&
%%4+M - %%4+MT - CCP2 Mode +elect 5its G5its de seleccin de modo del mdulo
CCP2I determina el modo del mdulo CCP2&
%%4+M %%4+M+ %%4+M1 %%4+MT Mo!o
; ; ; ; Mdulo est3 des$a5ilitado GreinicioI&
; ; ; 1 'o utili4ado&
; ; 1 ; 'o utili4ado&
; ; 1 1 'o utili4ado&
; 1 ; ;
Mo!o !e %aptura
Cada 1lanco descendente en el pin CCP2&
; 1 ; 1
Mo!o !e %aptura
Cada 1lanco ascendente en el pin CCP2&
; 1 1 ;
Mo!o !e %aptura
Cada cuarto 1lanco ascendente en el pin
CCP2&
; 1 1 1
Mo!o !e %aptura
Cada decimose9to 1lanco ascendente en el pin
CCP2&
1 ; ; ;
Mo!o !e comparaci?n
/a salida 2 el 5it CCP2IF se ponen a 1 al
ocurrir una coincidencia&
1 ; ; 1
Mo!o !e comparaci?n
/a salida se pone a ; 2 el 5it CCP2IF se pone
a 1 al ocurrir una coincidencia
1 ; 1 ;
Mo!o !e comparaci?n
+e produce una interrupcin, el 5it CCP2IF se
pone a 1 2 no $a2 cam5io el pin CCP2 pin al
ocurrir una coincidencia&
1 ; 1 1 Mo!o !e comparaci?n
!l ocurrir una coincidencia, el 5it CCP2IF se
pone a 1, los registros del tempori4ador 1 se
5orran 2 la con%ersin !R- se inicia si el
con%ertidor !R- est3 $a5ilitado&
1 1 9 9 Mo!o 4NM
C%?mo con#igurar e iniciar el m?!ulo %%41 para #uncionar en mo!o
4NMD
Para con1igurar e iniciar el mdulo CCP1 para 1uncionar en modo PWM, siga los
siguientes pasos#
-es$a5ilitar el pin de salida del CCP1& -e5er3 estar con1igurado como entrada&
+eleccionar el per7odo de se8al PWM al introducir el %alor en el registro P)2&
Con1igurar el mdulo CCP1 para 1uncionar en modo PWM al com5inar los 5its
del registro CCP1C*'&
!ustar el ciclo de tra5ao de se8al PWM al introducir el %alor en el registro
CCP)1/ 2 al utili4ar los 5its -C1A1 2 -C1A; del registro CCP1C*'&
Con1igurar e iniciar el tempori4ador .imer2#
o Poner a cero el 5it de 5andera de interrupcin .M)2IF en el registro
PI)1
o !ustar el %alor de di%isin de 1recuencia del tempori4ador .imer2 por
los 5its
o .2CTP+1 2 .2CTP+; del registro .2C*'&
o Iniciar el tempori4ador .imer2 al poner a uno el 5it .M)2*' del
registro .2C*'&
:a5ilitar los pines de salida de PWM despu"s de 0ue $a2a sido aca5ado un ciclo
de PWM#
o Esperar el des5ordamiento del tempori4ador .imer2 Gel 5it .M)2IF del
registro PI)1 se pone a unoI
o Con1igurar el pin apropiado como salida al poner a cero el 5it en el
registro .)I+&
MDULO CCPA EN MODO ME#ORADO
El mdulo CCP1 es el 6nico 0ue se puede poner en modo meorado& Este modo
53sicamente no di1iere del modo normal del CCP1 2 la meora se re1iere a la
transmisin de la se8al PWM a los pines de salida& <Por 0u" es eso tan importante= Por
el uso cada %e4 m3s 1recuente de los microcontroladores en los sistemas de control de
motores el"ctricos& !0u7 no %amos a descri5ir estos dispositi%os, sin em5rago si tiene la
oportunidad de tra5aar en el desarrollo de los dispositi%os similares, reconocer3 los
elementos 0ue se utili4a5an $asta $ace poco como los peri1"ricos& -ecimos mse
utili4a5anm por0ue todos estos elementos a$ora est3n integrados en el microcontrolador
2 pueden 1uncionar en %arios modos di1erentes&
MODO 4NM %O' )'A -A1&DA
El modo PWM con una salida est3 $a5ilitado slo en el caso de 0ue se pongan a cero los
5its P1M1 2 P1M; en el registro CCP1C*'& En tal caso, una se8al PWM puede estar
disponi5le simult3neamente en como m39imo cuatro di1erentes pines de salida&
!dem3s, la secuencia de se8ales PWM puede aparecer en 1orma de onda 53sica o
in%ertida& /a distri5ucin de se8ales depende de los 5its del registro P+.)C*',
mientras 0ue su polaridad depende de los 5its CCP1M1 2 CCP1M; del registro
CCP1C*'&
+i se utili4a una salida in%ertida, los pines acti%os a ni%el 5ao 2 los pulsos 0ue tienen la
misma 1orma de onda se generan siempre en pareas# en los pines P1! 2 P1C as7 como
en los pines P1A 2 P1-, respecti%amente&
MODO DE MED&O-4)E'TE
En cuanto al modo de medio-puente, la se8al PWM es una salida en el pin P1!,
mientras 0ue a la %e4 la se8al complementaria PWM es una salida en el pin P1A& Estos
pulsos acti%an a los controladores M*+FE. en modo de Medio-Puente 0ue
$a5ilitanRdes$a5ilitan el 1luo de corriente por el dispositi%o&
En este modo es mu2 peligroso encender los controladores M*+FE. simult3neamente
Gel cortocircuito producido en a0uel momento ser7a 1atalI& Para e%itarlo, es necesario
proporcionar un tiempo muerto entre encender 2 apagar los controladores& Este tiempo
muerto est3 marcado con itdi Gtime dela&I en la siguiente 1igura& El pro5lema se resuel%e
al utili4ar los 5its P-C;-P-C6 del registro PWM1C*'&
Como se muestra en la siguiente 1igura, el modo de medio-puente se puede utili4ar para
acti%ar los controladores M*+FE. en la con1iguracin Puente completo#
MODO 4)E'TE-%OM41ETO
.odos los cuatro pines se utili4an como salidas en el modo Puente completo& En la
pr3ctica, este modo es utili4a con 1recuencia para acti%ar los motores, lo 0ue
proporciona un control simple 2 completo de %elocidad 2 direccin de rotacin& :a2 dos
con1iguraciones de este modo# Full Aridge-ForSard Gpuente completo con salida
directaI 2 Full Aridge-)e%erse Gpuente completo con salida in%ersaI&
%O'<&=)(A%&*' 4)E'TE %OM41ETO - D&(E%TO
En modo Eirecto ocurre lo siguiente#
?n uno lgico G1I aparece en el pin P1! Gpin est3 acti%o a ni%el altoIV
+ecuencia de pulsos aparece en el pin P1-V 2
?n cero lgico G;I en los pines P1A 2 P1C Gpines est3n acti%os a ni%el 5aoI&
/a siguiente 1igura muestra el estado de los pines P1!-P1- durante un ciclo PWM
completo#
%O'<&=)(A%&*' 4)E'TE %OM41ETO - &'/E(-O
/o similar ocurre en modo 6nverso, a menos 0ue estos pines dispongan de 1unciones
di1erentes#
?n uno lgico G1I aparece en el pin P1C Gpin est3 acti%o a ni%el altoIV
+ecuencia de pulsos aparece en el pin P1AV 2
?n cero lgico G;I aparece en los pines P1! 2 P1- Gpines est3n acti%os a ni%el
5aoI&
R$,3)&/0 P"MACON
-T(% 4NM (estart Ena9le 9it 60it !e ha9ilitaci?n !el reinicio
autom8tico !el 4NM7
1 - -espu"s de un apagado autom3tico, el mdulo PWM se reinicia
autom3ticamente, 2 el 5it ECCP!+E del registro ECCP!+ se pone a cero&
; - Para iciar el mdulo PWM despu"s de un apagado autom3tico, el 5it
ECCP!+E de5e ponerse a cero por so1tSare&
4D%" - 4D%T 4NM Dela; %ount 9its 60its !e con#iguraci?n !el tiempo muerto en
el mo!o 4NM7 - El n6mero 5inario de 7 d7gitos determina el n6mero de ciclos de in
strucciones G4q.oscI a8adidos como tiempo muerto al acti%ar los pines de entrada
PWM&
R$,3)&/0 PSTRCON
-T(-5'% - -teering -;nc 9it G5it de sincroni4acin de direccinI determina el
momento de la direccin de los pulsos de PWM#
1 - /a direccin ocurre despu"s de 0ue el registro P+.)CI*' $a2a sido
cam5iado, slo si se $a completado la 1orma de onda del PWM&
; - /a direccin ocurre despu"s de 0ue el registro P+.)CI*' $a2a sido
cam5iado& /a se8al PWM en la salida del pin ser3 cam5iada inmediatamente sin
reparar en si el ciclo anterior $a sido completado& Este procedimiento es 6til
cuando es necesario detener la transmisin de una se8al PWM del pin&
-T(D - -teering Ena9le 9it D G5it - de $a5ilitacin de direccinI determina la
1uncin del pin P1-&
1 - El pin P1- tiene la 1orma de onda del PWM con polaridad determinada por
los 5its CCP1M; 2 CCP1M1&
; - Pin est3 con1igurado como entradaRsalida general del puerto P*).-&
-T(% -teering Ena9le 9it % G5it C de $a5ilitacin de direccinI determina la 1uncin
del pin P1C&
1 - El pin P1C tiene la 1orma de onda del PWM con polaridad determinada por
los 5its CCP1M; 2 CCP1M1&
; - Pin est3 con1igurado como entradaRsalida general del puerto P*).-&
-T(0 - -teering Ena9le 9it 0 G5it A de $a5ilitacin de direccinI determina la 1uncin
del pin P1A&
1 - El pin P1A tiene la 1orma de onda del PWM con polaridad determinada por
los 5its CCP1M; 2 CCP1M1&
; - Pin est3 con1igurado como entradaRsalida general del puerto P*).-&
-T(A - -teering Ena9le 9it A G5it ! de $a5ilitacin de direccinI determina la
1uncin del pin P1!&
1 - El pin P1! tiene la 1orma de onda del PWM con polaridad determinada por
los 5its CCP1M; 2 CCP1M1&
; - Pin est3 con1igurado como entradaRsalida general del puerto P*).C&
R$,3)&/0 ECCPAS
E%%4A-E - E%%4 Auto--hut!own Event -tatus 9it G5it de estado del apagado
autom3ticoI indica si $a ocurrido el apagado autom3tico del mdulo CCP Gestado de
!pagadoI#
1 - Mdulo CCP est3 en estado de !pagado&
; - Mdulo CCP 1unciona normalmente&
E%%4A-+ - E%%4A-T - E%%4 Auto--hut!own -ource -elect 9its GAits de
seleccin de la 1uente de apagado autom3ticoI selecciona la 1uente de apagado
autom3tico&
E%%4A-+ E%%4A-1 E%%4A-T <uente !el esta!o !e apaga!o
; ; ; Estado del apagado des$a5ilitado
; ; 1 Cam5io de salida del comparador C1
; 1 ; Cam5io de salida del comparador C2
; 1 1 Cam5io de salidas de los comparadores C1 2 C2
1 ; ; Cero lgico G;I en el pin I'.
1 ; 1
Cero lgico G;I en el pin I'. o cam5io de salida del
comparador C1
1 1 ;
Cero lgico G;I en el pin I'. o cam5io de salida del
comparador C2
1 1 1
Cero lgico G;I en el pin I'. o cam5io de salidas de
los comparadores C1 2 C2
4--A%1. 4--A%T - 4ins 41A. 41% -hut!own -tate %ontrol 9its GAits de
con1iguracin de los pines P1! 2 P1C en modo de apagadoI de1ine el estado lgico de
los pines P1! 2 P1C cuando el mdulo CCP est3 en el estado de apagado&
4--A%1 4--A%T Esta!o l?gico !e los pines
; ; ;
; 1 1
1 Q !lta impedancia G.ri-estadoI
4--0D1. 4--0DT - 4ins 410. 41D -hut!own -tate %ontrol 9its GAits de
con1iguracin de los pines P1A 2 P1- en modo de apagadoI de1ine el estado lgico de
los pines P1A 2 P1- cuando el mdulo CCP est3 en el estado de apagado&
4--0D1 4--0DT Esta!o l?gico !e los pines
; ; ;
; 1 1
1 Q !lta impedancia G.ri-estadoI
El microcontrolador 96, $=>??@ dispone de varios mdulos de comunicacin serie
independientes, adem"s cada uno se puede configurar a funcionar en modos diferentes.
Eso es lo ue los hace insustituibles en muchos casos. !curdese de lo ue hemos dicho
sobre los mdulos ,,9 &a ue lo mismo se aplica au. 4o se preocupe de los detalles
del funcionamiento de todos los mdulos, solo seleccione uno & utilice lo ue realmente
necesita.
.8 M*D)1O- DE %OM)'&%A%&*' -E(&E
El ?+!). es uno de los primeros sistemas de comunicacin serie& /as %ersiones
nue%as de este sistema est3n actuali4adas 2 se les denomina un poco di1erente -
E?+!).&
EUSART
El mdulo .ransmisorR)eceptor ?ni%ersal +7ncronoR!s7ncrono meorado GEn$anced
?ni%ersal +2nc$ronous !s2nc$ronous )ecei%er .ransmitter - E?+!).I es un
peri1"rico de comunicacin serie de entradaRsalida& !simismo es conocido como
Inter1a4 de comunicacin serie G+erial Communications Inter1ace - +CII& Contiene todos
los generadores de se8ales de relo, registros de despla4amiento 2 561ers de datos
necesarios para reali4ar transmisin de datos serie de entradaRsalida,
independientemente de la eecucin de programa del dispositi%o& Como indica su
nom5re, aparte de utili4ar el relo para la sincroni4acin, este mdulo puede esta5lecer
la cone9in as7ncrona, lo 0ue lo $ace 6nico para algunas aplicaciones& Por eemplo, en
caso de 0ue sea di17cil o imposi5le proporcionar canales especiales para transmisin 2
recepcin de datos 2 se8ales de relo Gpor eemplo, mando a distancia de radio o
in1rarroasI, el mdulo E?+!). es de1initi%amente la meor opcin posi5le&
El E?+!). integrado en el PIC16F887 posee las siguientes caracter7sticas#
.ransmisin 2 recepcin as7ncrona en modo >ull)duplexV
Caracteres de anc$ura de 8 r H 5its programa5lesV
-eteccin de direccin en modo de H 5itsV
-eteccin de errores por saturacin del 561er de entradaV 2
Comunicacin 3alf Euplex en modo s7ncrono&
E)-A(T E' MODO A-B'%(O'O
El E?+!). transmite 2 reci5e los datos utili4ando la codi1icacin de no retorno a cero
- ')Z Gnon-return-to-4eroI& Como se muestra en la siguiente 1igura, no se utili4a una
se8al de relo 2 los datos se transmiten de 1orma mu2 simple#
Cada dato se transmite de la siguiente 1orma#
En estado inacti%o la l7nea de datos permanece en estado alto G1IV
Cada transmisin de datos comien4a con un 5it de arran0ue G+.!).I, el cual,
siempre es cero G;IV
Cada dato tiene un anc$o de 8 o H 5its Gprimero se transmite el 5it menos
signi1icati%o - /+AIV 2
Cada transmisin de datos termina con un 5it de parada G+.*PI, el cual, siempre
es uno G1I /a siguiente 1igura muestra cmo conectar de manera $a5itual un
microcontrolador PIC 0ue utili4a el mdulo E?+!).& El circuito )+-232 se
utili4a como un con%ertidor de ni%el de %oltae&
Figure 5eloS s$oSs a common Sa2 o1 connecting PIC microcontroller t$at uses
E?+!). module& .$e )+-232 circuit is used as a %oltage le%el con%erter&
E)-A(T E' MODO DE T(A'-M&-O( A-B'%(O'O
Para $a5ilitar la transmisin de datos por medio del mdulo E?+!)., es necesario
con1igurarlo para 0ue 1uncione como un transmisor& En otras pala5ras, es necesario
de1inir el estado de los siguientes 5its#
T3E' W 1 - El transmisor E?+!). se $a5ilita al poner a uno el 5it .QE' del
registro .Q+.!&
-5'% W T - El E?+!). se con1igura a 1uncionar en modo as7ncrono al poner a
cero el 5it +M'C del registro .Q+.!&
-4E' W 1 - !l poner a uno el 5it +PE' del registro )C+.!, el E?+!). est3
$a5ilitado 2 el pin .QRCT se con1igura autom3ticamente como salida& +i el 5it
se utili4a simult3neamente para alguna 1uncin analgica, se de5e des$a5ilitar al
poner a cero el 5it correspondiente del registro !'+E/&
/a parte central del transmisor E?+!). ocupa el registro de despla4amiento .+) 0ue
no est3 directamente disponi5le al usuario& Para iniciar la transmisin de datos, el
mdulo de5e estar $a5ilitado al poner a uno el 5it .QE' del registro .Q+.!& /os datos
a en%iar se de5en escri5ir en el registro .Q)E[, lo 0ue resultar3 en la siguiente
secuencia de e%entos#
A2te ser3 transmitido inmediatamente al registro de despla4amiento .+)V
El registro .Q)E[ permanece %ac7o, lo 0ue indica la 5andera de 5it .QIF del
registro PI)1& +i se pone a uno el 5it .QIE del registro PIE1, se generar3 una
interrupcin& -e todos modos, la 5andera se pone a uno sin reparar en si una
interrupcin est3 $a5ilitada o no 2 no se puede poner a cero por so1tSare, sino al
escri5ir un dato nue%o en el registro .Q)E[&
-ispositi%os electrnicos de control kempuank el dato $acia el pin .Q en
sincroni4acin con se8al de relo interna# 5it de arran0ue G+.!).I
G1I&&&&&datos&&&&5it de parada G+.*PI G1I&
Cuando el 6ltimo 5it a5andona el registro .+), el 5it .)M. en el registro
.Q+.! se pone a cero autom3ticamente&
+i mientras tanto se escri5e un dato nue%o en el registro .Q)E[, todo el
procedimiento se repite inmediatamente despu"s de la transmisin del 5it de
parada del dato anterior&
Para transmitir un dato de H 5its es necesario poner a uno el 5it .QH del registro
.Q+.!& El 5it .QH- del registro .Q+).! es el no%eno 5it 2 el m3s signi1icati%o& !l
transmitir un dato de H 5its, el 5it de datos .QH- de5er3 estar escrito antes de 0ue de se
escri5an los 8 5its menos signi1icati%os en el registro .Q)E[& .odos los nue%e 5its de
datos se transmiten al registro de despla4amiento .F) inmediatamente despu"s de 0ue
se aca5e la escritura en el registro .Q)E[&
E)-A(T E' MODO DE (E%E4TO( A-B'%(O'O
+imilar al poner en marc$a el transmisor del E?+!)., para $a5ilitar el receptor es
necesario con1igurar los siguientes 5its#
%(E' W 1 - El receptor E?+!). se $a5ilita al poner a uno el 5it C)E' del
registro )C+.!V
-5'% W T - El E?+!). se con1igura a 1uncionar en modo as7ncrono al poner a
cero el 5it +M'C del registro .Q+.!V 2
-4E' W 1 - !l poner a uno el 5it +PE' del registro )C+.!, el E?+!). est3
$a5ilitado 2 el pin )QR-. se con1igura autom3ticamente como salida& +i el 5it
se utili4a simult3neamente para alguna 1uncin analgica, se de5e des$a 5ilitar
al poner a cero el 5it correspondiente del registro !'+E/&
-espu"s de 0ue se $a2a terminado el primer paso necesario 2 se $a2a detectado el 5it de
arran0ue G+.!).I, el dato se transmite al registro de despla4amiento )+) por el pin
)Q& !l $a5er reci5ido el 5it de parada G+.*PI, ocurre lo siguiente#
El dato se transmite autom3ticamente al registro )C)E[ Gsi est3 %ac7oIV
El 5it de 5andera )CIF se pone a uno 2 ocurre una interrupcin si est3 $a5ilita
da por el 5it )CIE en el registro PIE1& +imilar al transmisor, el 5it de 5andera se
pone a cero slo por so1tSare, o sea, al leer el registro )C)E[& .enga en cuenta
0ue esto es un do5le registro de tipo FIF* Gprimero en entrar, primero en salir -
first)in, first)outI, lo 0ue permite almacenamiento de dos caracteres
simult3neamenteIV
+i el registro )C)E[ est3 ocupado Gcontiene dos 52tesI 2 el registro de
despla4amiento detecta el nue%o 5it de parada G+.*PI, el 5it de so5rescritura
*E)) se pondr3 a uno& En tal caso se pierde un dato nue%o 0ue %iene, 2 el 5it
*E)) de5e ponerse a cero por so1tSare al poner a cero 2 luego al poner a uno el
5it C)E'V
'ota: 'o es posi9le reci9ir un !ato nuevo sino hasta Eue el 9it OE(( est@ a
uno.
+i el 5it de parada G+.*PI est3 a cero G;I, el 5it FE)) del registro )C+.!
estar3 a uno, lo 0ue indica un error en recepcinV 2
Para $a5ilitar la recepcin de un dato de H 5its, es necesario poner a uno el 5it
)QH del registro )C+.!&
DETE%%&*' DE E((O(E- E' (E%E4%&*'
El microcontrolador puede detectar autom3ticamente dos tipos de errores& El primero es
denominado error de encuadre '>raming error(& *curre cuando el receptor no detecta el
5it de parada en un inter%alo predeterminado de tiempo& Este error se indica mediante el
5it FE)) del registro )C+.!& +i el 5it est3 a uno, el 6ltimo dato reci5ido puede ser
incorrecto& Ca5e destacar lo siguiente#
El error de encuadre no genera por si mismo una interrupcinV
+i el 5it est3 a uno, el 6ltimo dato reci5ido contiene un errorV
El error de encuadre G5it est3 a unoI no impide la recepcin de un dato nue%oV
El 5it FE)) se pone a cero al leer el dato reci5ido, lo 0ue signi1ica 0ue se de5e
$acer una %eri1icacin antes de leer el datoV 2
El 5it FE)) no se puede poner a cero por so1tSare& +i es necesario, se puede
5orrar al poner a cero al 5it +PE' del registro )C+.!, lo cual, simult3neamente
causa una reiniciali4acin del sistema E?+!).&
*tro tipo de error es denominado error de so5rescritura G*%errun ErrorI& Como $emos
mencionado anteriormente, el registro de tipo FIF* puede almacenar slo dos
caracteres& ?n error de so5rescritura ocurre cuando el registro reci5e el tercer car3cter&
+implemente no $a2 espacio para almacenar un 52te m3s, por lo 0ue un error es
ine%ita5le& Cuando ocurre este error, el 5it *E)) del registro )C+.! se pone a uno&
/as consecuencias son las siguientes#
/os datos almacenados en los registros FIF* G2 52tesI se pueden leer
normalmenteV
'o se reci5ir3n m3s datos $asta 0ue el 5it *E)) est" puesto a ceroV 2
! este 5it no se le puede acceder directamente& Para 5orrarlo, es necesario poner
a cero el 5it C)E' del registro )C+.! o reiniciar el sistema E?+!). al poner
a cero al 5it +PE' del registro )C+.!&
(E%E4%&*' DE DATO- DE S 0&T-
!parte de reci5ir los datos de 1orma est3ndar de 8 5its, el sistema E?+!). soporta la
recepcin de datos de H 5its& En el lado del transmisor, el no%eno 5it Bse aduntaC al 52te
original directamente antes del 5it de parada& En el lado del receptor, al poner a uno el
5it )QH del registro )C+.!, el no%eno 5it de datos ser3 autom3ticamente escrito en el
5it )QH- del mismo registro& -espu"s de almacenar este 52te, es necesario tener
cuidado en como leer estos 5its - primero se de5e leer el 5it )QH- 2 luego los oc$o G8I
5its menos signi1icati%os del registro )C)E[& -e otra 1orma, el no%eno 5it ser3 puesto
a cero antes de ser le7do&
DETE%%&*' DE D&(E%%&*'
Cuando el 5it !--E' del registro )C+.! est3 a uno, el modulo E?+!). es capa4 de
reci5ir slo los datos de H 5its, mientras 0ue se ignoran todos los datos de 8 5its&
!un0ue parece una restriccin, este modo $a5ilita la comunicacin serial entre %arios
microcontroladores& El principio de 1uncionamiento es mu2 simple& El dispositi%o
maestro en%7a un dato de H 5its 0ue representa la direccin de un microcontrolador
escla%o& 'o o5stante, todos de5en tener el 5it !--E' puesto a uno, 2a 0ue de esta
manera se $a5ilita la deteccin de direccin& .odos los microcontroladores escla%os 0ue
comparten la misma l7nea de transmisin, reci5en este dato GdireccinI 2 %eri1ican
autom3ticamente si coincide con su propia direccin& El so1tSare, en el 0ue ocurre la
coincidencia de direccin, de5e des$a5ilitar la deteccin de direccin, poniendo a cero
el 5it !--E'&
El dispositi%o maestro sigue en%iando los datos de 8 5its al microcontrolador& .odos los
datos 0ue pasan por la l7nea de transmisin ser3n reci5idos slo por el mdulo E?+!).
direccionado& ?na %e4 reci5ido el 6ltimo 52te, el microcontrolador escla%o de5e poner a
uno el 5it !--E' para $a5ilitar de nue%o la deteccin de direccin&
R$,3)&/0 TXSTA
%-(% - %lock -ource -elect 9it - G5it de seleccin de la 1uente de reloI determina la
1uente del relo& +e utili4a slo en modo sincrnico&
1 - Modo 7aestro& )elo generado internamente por el generador de tasa de
5audios&
; - Modo Esclavo& )elo pro%eniente de una 1uente e9terna&
T3S - S-9it Transmit Ena9le 9it 69it !e ha9ilitaci?n !el mo!o !e S 9its en
transmisi?n7
1 - +e $a5ilita el modo de H 5its en transmisin por el sistema E?+!).&
; - +e $a5ilita el modo de 8 5its en transmisin por el sistema E?+!).&
T3E' - Transmit Ena9le 9it GAit de $a5ilitacin de transmisinI
1 - .ransmisin $a5ilitada&
; - .ransmisin des$a5ilitada&
-5'% - E)-A(T Mo!e -elect 9it GAit de seleccin del modo E?+!).I
1 - El E?+!). 1unciona en modo s7ncrono&
; - El E?+!). 1unciona en modo as7ncrono&
-E'D0 - -en! 0reak %haracter 9it GAit de en%7o de car3cter Area] en modo
as7ncronoI se utili4a slo en modo as7ncrono 2 cuando se re0uiere o5edecer el est3ndar
de 5us /I'&
1 - +e en%iar3 un car3cter /reaG en la pr9ima transmisin Gse pone a ; por
$ardSare cuando 1inali4a el en%7oI&
; - En%7o del car3cter de transmisin /reaG completado&
0(=2 - 2igh 0au! (ate -elect 9it G5it de seleccin de modo de alta %elocidad en
modo as7ncronoI& -etermina la %elocidad de transmisin en modo s7ncrono& 'o a1ecta al
E?+!). en modo s7ncrono&
1 - E?+!). 1unciona a alta %elocidad&
; - E?+!). 1unciona a 5aa %elocidad&
T(MT - Transmit -hi#t (egister -tatus 9it G5it de estado de registro de
despla4amiento de transmisinI
1 - )egistro .+) est3 %ac7o&
; - )egistro .+) est3 lleno&
T3SD - 'inth 9it o# Transmit Data GKalor del no%eno 5it en transmisinI Puede ser
utili4ado como direccin o 5it de paridad o para distinguir entre direccin o dato en los
5uses maestro-escla%oI&
R$,3)&/0 RCSTA
-4E' - -erial 4ort Ena9le 9it G5it de $a5ilitacin del puerto serieI
1 - Puerto serie $a5ilitado& /os pines )QR-. 2 .QRCT se con1iguran
autom3ticamente como entrada 2 salida, respecti%amente&
; - Puerto serie des$a5ilitado&
(3S - 69it !e ha9ilitaci?n !el mo!o !e S 9its en recepci?n7:
1 - +e $a5ilita la recepcin de datos de H 5its por medio del sistema E?+!).&
; - +e $a5ilita la recepcin de datos de 8 5its por medio del sistema E?+!).&
-(E' - -ingle (eceiveEna9le 9it G5it de $a5ilitacin de la recepcin simpleI& Es
utili4ado slo en modo sincrnico 2 en 1uncionamiento como Maestro&
1 - )ecepcin simple $a5ilitada&
; - )ecepcin simple des$a5ilitada&
%(E' - %ontinuous (eceive Ena9le 9it G5it de $a5ilitacin de la recepcin continuaI
act6a dependiendo del modo E?+!).&
Modo as7ncrono#
1 - )ecepcin $a5ilitada&
; - )ecepcin des$a5ilitada&
Modo s7ncrono#
1 - +e $a5ilita la recepcin continua $asta 0ue el 5it C)E' est" a cero&
; - 'o se $a5ilita la recepcin en 1orma continua&
ADDE' - A!!ress Detect Ena9le 9it G5it de $a5ilitacin de la deteccin de direccinI
se utili4a slo en modo de detectar la direccin&
1 - :a5ilita la deteccin de direccin Gslo se procesa un 52te reci5ido en el
registro de despla4amiento de recepcin si el no%eno 5it est3 a unoI
; - -eteccin de direccin des$a5ilitada Gtodos los 52tes reci5idos en el registro
de despla4amiento de recepcin son procesados independientemente del %alor
del no%eno 5it reci5idoI& El no%eno 5it se utili4a como 5it de paridad&
<E(( - <raming Error 9it G5it de error de encuadreI
1 - +e $a producido un error de encuadre en recepcin&
; - 'o se $a producido un error de encuadre&
OE(( - Overrun Error 9it 69it !e error !e so9rescritura7.
1 - +e $a producido un error de so5rescritura en recepcin&
; - 'o se $a producido un error de so5rescritura&
(3SD - 'inth 9it o# (eceive! Data 'o se $a producido un error de so5rescritura&
GENERADOR DE BAUDIOS DEL EUSART (BRG)
+i mira atentamente al diagrama del receptor o transmisor E?+!). as7ncrono, %er3 0ue
los am5os utili4an se8al de relo del tempori4ador local A)[ para la sincroni4acin& /a
misma 1uente de relo se utili4a tam5i"n en modo s7ncrono&
El tempori4ador A)[ consiste en dos registros de 8 5its $aciendo un registro de 16 5its&
El %alor de un n6mero escrito en estos dos registros determinar3 la %elocidad de
transmisin en 5audios& !dicionalmente, el 5it A)[: del registro .Q+.! 2 el 5it
A)[:16 del registro A!?-C./, a1ectan la 1recuencia de relo utili4ada para el c3lculo
de los 5audios&
El %alor de un n6mero escrito en estos dos registros determinar3 la %elocidad de
transmisin en 5audios& !dicionalmente, el 5it A)[: del registro .Q+.! 2 el 5it
A)[:16 del registro A!?-C./, a1ectan la 1recuencia de relo utili4ada para el c3lculo
de los 5audios&
0its Mo!o 0(= /
E)-A(T
<?rmula !e veloci!a! !e transmisi?n en
9au!ios -5'% 0(=1= 0(=2
; ; ; de 8 5its Ras7ncrono Fosc R X64 Gn D 1IY
; ; 1 de 8 5its R as7ncrono Fosc R X16 Gn D 1IY
; 1 ;
de 16 5its R
as7ncrono
Fosc R X16 Gn D 1IY
; 1 1
de 16 5its R
as7ncrono
Fosc R X4 Gn D 1IY
1 ; Q de 8 5its R s7ncrono Fosc R X4 Gn D 1IY
1 1 Q de 16 5its R s7ncrono Fosc R X4 Gn D 1IY
/as ta5las en las siguientes p3ginas contienen los %alores 0ue de5en estar escritos en el
registro de 16 5its +PA)[ 2 asignados a los 5its +M'C, A)[: 2 A)[:16 para
o5tener algunos %alores de la %elocidad de transmisin en 5audios est3ndar& /a 1rmula
para $acer el c3lculo de la %elocidad de transmisin en 5audios#
R$,3)&/0 BAUDCTL
A0DO/< - Auto-0au! Detect Over#low 9it G5it de des5ordamiento de auto-deteccin
de la %elocidad de transmisinI se utili4a slo en modo as7ncrono durante la deteccin
de la %elocidad de transmisin&
1 - +e $a producido des5ordamiento durante la auto-deteccin&
; - 'o se $a producido des5ordamiento durante la auto-deteccin&
(%&D1 - (eceive &!le <lag 9it 'o se $a producido des5ordamiento durante la auto-
deteccin&
1 - )eceptor en estado inacti%o& 'o $a2 operacin de recepcin en marc$a&
; - +e $a reci5ido el 5it de arran0ue G+.!).I 2 $a2 una operacin de recepcin
en marc$a&
-%L4 - -;nchronous %lock 4olarit; -elect 9it& G5it de seleccin de polaridad de la
se8al de relo en modo s7ncronoI& El estado lgico de este 5it di1iere dependiendo de
cu3l modo de E?+!). est3 acti%o
Modo as7ncrono#
1 - El dato in%ertido se transmite al pin )C6R.QRCT&
; - El dato no in%ertido se transmite al pin )C6R.QRCT&
Modo s7ncrono#
1 - +incroni4acin en el 1lanco ascendente de la se8al de relo&
; - +incroni4acin en el 1lanco descendente de la se8al de relo&
0(=1" 1"-9it 0au! (ate =enerator 9it - G5it de $a5ilitacin del generador de
%elocidad de transmisin de 16 5itsI determina si el registro +PA)[: se utili4ar3, o sea
si el tempori4ador A[)[ tendr3 8 o 16 5its&
1 - +e utili4a el generador de %elocidad de transmisin de 16 5its
; - +e utili4a el generador de %elocidad de transmisin de 8 5its
N)E Nake-up Ena9le 9it G5it de $a5ilitacin del modo de auto-acti%acin en modo
as7ncronoI#
1 - Modo de auto-acti%acin $a5ilitado& El receptor espera a 0ue el 1lanco
descendente apare4ca en el pin )C7R)QR-. para 0ue el microcontrolador se
despierte del modo de reposo&
; - Modo de auto-acti%acin $a5ilitado& El receptor 1unciona normalmente&
A0DE' - Auto-0au! Detect Ena9le 9it G5it de $a5ilitacin de auto-deteccin de
%elocidad de transmisinI se utili4a slo en modo as7ncrono&
1 - Modo de auto-deteccin $a5ilitado& !l detectar la %elocidad de transmisin,
el 5it se pone a uno autom3ticamente&
; - Modo de auto-deteccin des$a5ilitado&
/amos a hacerlo en mikro%...
/* En este ejemplo, el mdulo EUSART interno se inicializa y se ajusta
para enviar el
mensaje inmediatamente despus de recibirlo. La velocidad de
transmisin en baudios se
ajusta a 9600 bps. El programa utiliza las siguientes rutinas de
librera UART:
UART1_init(), UART1_Write_Text(), UART1_Data_Ready(), UART1_Write() y
UART1_Read().*/
char uart_rd;
void main() {
ANSEL = ANSELH = 0; // Todos los pines se configuran como
digitales
C1ON_bit = C2ON_bit = 0; // Deshabilitar los comparadores
UART1_Init(9600); // Inicializar el mdulo UART a 9600
bps
Delay_ms(100); // Esperar a que seal de reloj del
mdulo UART se
// ponga estable
UART1_Write_Text("Start");
while (1) { // Bucle infinito
if (UART1_Data_Ready()) { // Si el dato se ha recibido,
uart_rd = UART1_Read(); // lea el dato recibido
UART1_Write(uart_rd); // y envelo atrs por el UART
}
}
}
Transmisi?n serial asUncrona a trav@s !e los registros !el m?!ulo
E)-A(T
1& /a %elocidad de transmisin deseada de5er3 estar austada a tra%"s de los 5its
A)[: Gdel registro .Q+.!I 2 A)[16 Gdel registro A!?-C./I 2 de los
registros +PA)[: 2 +PA)[&
2& /a %elocidad de transmisin deseada de5er3 estar austada a tra%"s de los 5its
A)[: Gdel registro .Q+.!I 2 A)[16 Gdel registro A!?-C./I 2 de los
registros +PA)[: 2 +PA)[&
3& /a %elocidad de transmisin deseada de5er3 estar austada a tra%"s de los 5its
A)[: Gdel registro .Q+.!I 2 A)[16 Gdel registro A!?-C./I 2 de los
registros +PA)[: 2 +PA)[&
4& /a transmisin de datos es $a5ilitada poniendo a uno el 5it .QE' del registro
.Q+.!& El 5it .QIF del registro PI)1 est3 autom3ticamente puesto a uno&
L& Para 0ue el 5it .QE' cause una interrupcin, tanto el 5it .QIE del registro PIE1
como los 5its [IE, PEIE del registro I'.C*' de5er3n estar puestos a uno&
6& En una transmisin de datos de H 5its, el %alor del no%eno 5it de5er3 estar escrito
en el 5it .QH- del registro .Q+.!&
7& /a transmisin comien4a cuando se escri5e el dato de 8 5its so5re el registro de
recepcin .Q)E[&
(ecepci?n serial asUncrona a trav@s !e los registros !el m?!ulo
E)-A(T:
1& /a %elocidad de transmisin deseada de5er3 estar austada a tra%"s de los 5its
A)[: Gdel registro .Q+.!I 2 A)[16 Gdel registro A!?-C./I 2 de los
registros +PA)[: 2 +PA)[&
2& El 5it +M'C Gdel registro .Q+.!I de5er3 estar puesto a cero 2 el 5it +PE' Gdel
registro )C+.!I de5er3 estar puesto a uno a 1in de $a5ilitar el puerto serie&
3& .anto el 5it )CIE del registro PIE1 como los 5its [IE 2 PEIE del registro
I'.C*' de5er3n estar puestos a uno si se necesita $a5ilitar 0ue la recepcin de
dato cause una interrupcin&
4& Para una recepcin de datos de H 5its, el 5it )QH Gdel registro )C+.!I de5er3
estar puesto a uno
L& /a recepcin de datos es $a5ilitada poniendo a uno el 5it C)E' del registro
)C+.!&
6& El registro )C+.! de5er3 leerse para o5tener in1ormacin acerca de la
ocurrencia de errores durante la recepcin& El %alor del no%eno 5it ser3 almacena
do en este registro en la recepcin de datos de H 5its&
7& El dato de 8 5its reci5ido ser3 almacenado en el registro )C)E[ 2 de5er3 leerse
para o5tener dic$o dato&
AIustar el mo!o !e !etecci?n !e !irecci?n:
1& /a %elocidad de transmisin deseada de5er3 estar austada a tra%"s de los 5its
A)[: Gdel registro .Q+.!I 2 A)[16 Gdel registro A!?-C./I 2 de los
registros +PA)[: 2 +PA)[&
2& El 5it +M'C Gdel registro .Q+.!I de5er3 estar puesto a cero 2 el 5it +PE' Gdel
registro )C+.!I de5er3 estar puesto a uno G1I a 1in de $a5ilitar el puerto serie&
3& .anto el 5it )CIE del registro PIE1 como los 5its [IE 2 PEIE del registro
I'.C*' de5er3n estar puestos a uno si se necesita $a5ilitar 0ue la recepcin de
dato cause una interrupcin&
4& El 5it )QH del registro )C+.! de5e estar a uno&
L& El 5it !--E' del registro )C+.! de5e estar a uno, lo 0ue $a5ilita 0ue un dato
sea reconocido como direccin&
6& /a recepcin de datos es $a5ilitada poniendo a uno el 5it C)E' del registro
)C+.!&
7& .an pronto como se reci5a un dato de H 5its, el 5it )CIF del registro PI)1 estar3
autom3ticamente puesto a uno& +i est3 $a5ilitada se produce una interrupcin&
8& El registro )C+.! de5er3 leerse para o5tener in1ormacin acerca de la
ocurrencia de errores durante la transmisin& El no%eno 5it )QH- siempre estar3
a uno&
H& El dato de 8 5its reci5ido ser3 almacenado en el registro )C)E[ 2 de5er3
leerse& +e de5er3 compro5ar si la com5inacin de estos 5its coincide con la
direccin prede1inida& +i coincide, es necesario poner a cero el 5it !--E' del
registro )C+.!, lo 0ue $a5ilita la recepcin de datos de 8 5its&
MDULO PUERTO SERIE S=NCRONO MAESTRO (MSSP)
El M++P GPuerto serie s7ncrono maestro - 7aster #&nchronous #erial 9ortI es un
mdulo mu2 6til, 2 a la %e4 uno de los circuitos m3s compleos dentro del
microcontrolador& Este mdulo permite la comunicacin de alta %elocidad entre un
microcontrolador 2 otros peri1"ricos u otros microcontroladores al utili4ar %arias l7neas
de ER+ Gcomo m39imo dos o tres l7neasI& Por eso, se utili4a con 1recuencia para conectar
el microcontrolador a los %isuali4adores /C-, los con%ertidores !R-, las memorias
EEP)*M seriales, los registros de despla4amiento etc& /a caracter7stica principal de
este tipo de comunicacin es 0ue es s7ncrona 2 adecuada para ser utili4ada en sistemas
con un slo maestro 2 uno o m3s escla%os& ?n dispositi%o maestro contiene un circuito
para generacin de 5audios 2 adem3s, suministra se8ales de relo a todos los
dispositi%os del sistema& /os dispositi%os escla%os no disponen de un circuito interno
para generacin de se8ales de relo& El mdulo M++P puede 1uncionar en uno de dos
modos#
modo +PI GInter1a4 peri1"rica serial - #erial 9eripheral 6nterfaceIV 2
modo I2C GCircuito inter-integrado - 6nter)6ntegrated ,ircuitI&
Como se muestra en la siguiente 1igura, un mdulo M++P representa slo una mitad de
un $ardSare necesario para esta5lecer una comunicacin serial, mientras 0ue la otra
mitad se almacena en el dispositi%o con el 0ue intercam5ia los datos& !un0ue los
mdulos en am5as puntas de l7nea son los mismos, sus modos de 1uncionamiento
di1ieren esencialmente dependiendo de si el mdulo 1unciona como 7aestro o como
Esclavo#
+i el microcontrolador a ser programado controla otro dispositi%o o circuito
Gperi1"ricosI, de5er3 1uncionar como un dispositi%o maestro& Este mdulo generar3
se8al de relo cuando sea necesario, o sea slo cuando se re0uiera reci5ir 2 transmitir los
datos por so1tSare& Por consiguiente, el esta5lecimiento de cone9in depende
6nicamente del dispositi%o maestro&
-e lo contrario, si el microcontrolador a ser programado est3 integrado en un
dispositi%o m3s compleo Gpor eemplo en una PCI, de5er3 1uncionar como un
dispositi%o escla%o& Como tal, un escla%o siempre tiene 0ue esperar a 0ue un dispositi%o
maestro en%7e la solicitud de transmisin de datos&
MODO SPI
El modo +PI permite la transmisin 2 recepcin simult3nea de datos de 8 5its al utili4ar
tres l7neas de entradaRsalida
-DO - #erial Eata Iut Gsalida de datos serie I- l7nea de transmisinV
-D& - #erial Eata 6n Gentrada de datos serieI - l7nea de recepcinV 2
-%L - #erial ,locG Grelo de comunicacinI - l7nea de sincroni4acin&
!dicionalmente, $a2 una cuarta l7nea G++I 0ue se puede utili4ar si el microcontrolador
intercam5ia los datos con %arios dispositi%os peri1"ricos& )e1i"rase a la siguiente 1igura&
-- - #lave #elect '#eleccin de esclavo( - Es una l7nea adicional utili4ada para la
seleccin de un dispositi%o espec71ico& Esta l7nea est3 acti%a slo si el microcontrolador
1unciona como escla%o, o sea cuando el dispositi%o e9terno - maestro re0uiere
intercam5iar los datos& !l 1uncionar en modo +PI, el mdulo M++P utili4a 4 registros
en total#
++P+.!. - registro de estado
++PC*' - registro de control
++PA?F - 561er serie de transmisinRrecepcin
++P+) - registro de despla4amiento Gno es accesi5le directamenteI
/os primeros tres registros son de lecturaRescritura 2 se pueden modi1icar en cual0uier
momento, mientras 0ue el cuarto, como no es accesi5le, se utili4a para con%ertir datos
en 1ormato serial&
Como se muestra en la siguiente 1igura, la parte central del mdulo +PI consiste de dos
registros conectados a los pines para recepcin, transmisin 2 sincroni4acin&
El registro de despla4amiento G++P)+I est3 directamente conectado a los pines del
microcontrolador 2 es utili4ado para transmisin de datos en 1ormato serie& El registro
++P)+ dispone de la entrada 2 salida para despla4ar los datos $acia dentro 2 $acia 1uera
del dispositi%o& En otras pala5ras, cada 5it 0ue aparece en la entrada Gl7nea de recepcinI
despla4a simult3neamente otro 5it $acia la salida Gl7nea de transmisinI&
El registro ++PA?F G/:ferI es una parte de memoria utili4ada para almacenar
temporalmente los datos antes de 0ue se en%7en, o sea inmediatamente despu"s de 0ue
se reci5an& -espu"s de 0ue todos los 8 5its $a2an sido reci5idos, el 52te se mue%e del
registro ++P)+ al registro ++PA?F& Este proceso de crear un do5le 561er para reci5ir
los datos permite iniciar la recepcin del pr9imo 52te antes de leer los datos 0ue se
aca5an de reci5ir& -urante la transmisinRrecepcin de datos se ignora un intento de
escri5ir un dato en el registro ++A?F& -esde el punto de %ista de un programador, este
registro se considera el m3s importante por $a5er sido accedido con m3s 1recuencia&
Concretamente, si deamos aparte el auste del modo de 1uncionamiento, la transmisin
de datos por el mdulo +PI no es nada m3s 0ue escritura 2 lectura de datos de este
registro, mientras 0ue las dem3s Bacro5aciasC como mo%er los registros, se lle%an a
ca5o autom3ticamente por el $ardSare&
/amos a hacerlo en mikro%...
/* En este ejemplo, el microcontrolador PIC (maestro) enva un byte de
datos a un chip
perifrico (esclavo) por el mdulo SPI. El programa utiliza las
funciones de librera
SPI SPI1_init() y SPI1_Write. */
sbit Chip_Select at RC0_bit; // Pin RC0 es un pin de
seleccionar el chip
// perifrico Seleccin_de_chip
sbit Chip_Select_Direction at TRISC0_bit; // Bit TRISC0 define el pin
RC0 como entrada o salida
unsigned int value; // Dato a ser enviado es de
tipo unsigned int
void main() {
ANSEL = ANSELH = 0; // Todos los pines de E/S son digitales
TRISB0_bit = TRISB1_bit = 1; // Configurar los pines RB0, RB1 como
entradas
Chip_Select = 0; // Seleccionar el chip perifrico
Chip_Select_Direction = 0; // Configurar el pin CS# como salida
SPI1_Init(); // Inicializar el mdulo SPI
SPI1_Write(value); // Envar el valor al chip perifrico
...
C01-%32'234% )$/3'+ )F%2/0%' SPI
!ntes de iniciali4ar el mdulo +PI, es necesario especi1icar %arias opciones#
Modo maestro .)I+C&3J; Gpin +CT es salida de se8al de reloIV
Modo de escla%o .)I+C&3J1 Gpin +CT es entrada de se8al de reloIV
Fase de datos de entrada - la mitad o el 1inal del tiempo de salida G5it +MP del
registro ++P+.!. IV
Flanco de relo G5it CTE del registro ++P+.!.IV
Kelocidad de transmisin en 5audios, los 5its ++PM3-++PM; del registro
++PC*' Gslo en modo MaestroIV
+eleccin de modo escla%o, 5its ++PM3-++PM; del registro ++PC*' Gslo en
modo Escla%oI
El mdulo se pone en marc$a al poner a uno el 5it ++PE'#
4aso 1.
/os datos a ser transmitidos de5er3n ser escritos en el registro del 561er ++PA?F& +i el
mdulo +PI 1unciona en modo maestro, el microcontrolador eecutar3 autom3ticamente
la secuencia de los siguientes pasos 2,3 2 4& +i el mdulo +PI 1unciona en modo
escla%o, el microcontrolador no eecutar3 la secuencia de los siguientes pasos $asta 0ue
el pin +CT detecte se8al de relo&
4aso +.
El dato se mue%e al registro ++P+) 2 el contenido del registro ++PA?F no se 5orra&
4aso .
El dato se despla4a $acia el pin de salida Gprimero se despla4a el 5it m3s signi1icati%o -
M+AI, mientras 0ue a la %e4 el registro se carga con los 5its por el pin de entrada& En
modo maestro el microcontrolador en si mismo genera se8al de relo, mientras 0ue el
modo escla%o utili4a se8al de relo e9terna Gpin +CTI&
4aso J.
El registro ++P+) est3 lleno despu"s de 0ue $a2an sido reci5idos 8 5its de datos, lo 0ue
se indica al poner a uno el 5it AF del registro ++P+.!. 2 el 5it ++PIF del registro
PI)1& /os datos reci5idos Gun 52teI son autom3ticamente mo%idos del registro ++P+)
al registro ++PA?F& Como la transmisin de datos serial se reali4a autom3ticamente, el
resto de programa se eecuta normalmente mientras 0ue la transmisin de datos est3 en
progreso& En este caso, la 1uncin del 5it ++PIF es de generar una interrupcin al aca5ar
la transmisin de un 52te&
4aso R.
Por 6ltimo, el dato almacenado en el registro ++PA?F est3 listo para su uso 2 de5e
mo%erse al registro deseado&
M0*0 I
B
C
El modo I
2
C GAus de circuito inter-integradoI es adecuado para ser utili4ado cuando el
microcontrolador de5e intercam5iar los datos con un circuito integrado dentro de un
mismo dispositi%o& Pstos son con 1recuencia otros microcontroladores, o los circuitos
integrados especiali4ados 2 5aratos 0ue pertenecen a la nue%a generacin de as7
llamados kperi1"ricos inteligentesk Gmemorias, sensores de temperatura, reloes de
tiempo real etc&I
+imilar a la comunicacin serie en modo +PI, la transmisin de datos en modo I2C es
s7ncrona 2 5idireccional& Esta %e4 slo dos pines se utili4an para transmisin de datos&
Pstos son los pines de +-! G-atos serialesI 2 +C/ G)elo serialI& El usuario de5e
con1igurar estos pines como entradas o salidas por los 5its .)I+C&
!l o5ser%ar las reglas particulares GprotocolosI, este modo $a5ilita conectar
simult3neamente de una manera simple $asta 112 di1erentes componentes al utili4ar
slo dos %aliosos pines de ER+& Kamos a %er cmo 1unciona el sistema#
El relo, necesario para sincroni4ar el 1uncionamiento de am5os dispositi%os, siempre es
generado por un dispositi%o maestro Gun microcontroladorI 2 su 1recuencia directamente
a1ecta a la %elocidad de transmisin de datos& !un0ue $a2 un protocolo 0ue permite
como m39imo una 1recuencia de relo de 3,4 M:4 Gas7 llamado 5us I2C de alta
%elocidadI, este li5ro cu5re slo el protocolo utili4ado con m3s 1recuencia, con una
1recuencia de relo limitada a 1;; T:4& /a 1recuencia m7nima no est3 limitada&
Cuando los componentes maestro 2 escla%o est3n sincroni4ados por el relo, el maestro
siempre inicia cada intercam5io de datos& ?na %e4 0ue el mdulo M++P se $a
$a5ilitado, espera 0ue ocurra una condicin de arran0ue G+tart conditionI& El dispositi%o
maestro primero en%7a el 5it de arran0ue Gest3 a ceroI por el pin +-!, luego la direccin
de 7 5its del dispositi%o escla%o seleccionado, 2 por 6ltimo, el 5it 0ue re0uiere al
dispositi%o escri5ir G;I o leer G1I el dato en%iado& En otras pala5ras, los oc$o 5its se
despla4an al registro ++P+) despu"s de ocurrir una condicin de arran0ue& .odos los
dispositi%os escla%os 0ue comparten la misma l7nea de transmisin reci5ir3n
simult3neamente el primer 52te, pero slo el 0ue contiene la direccin coincidente
reci5ir3 el dato entero&
?na %e4 0ue el primer 52te se $a en%iado Gslo se transmiten datos de 8 5itsI, el maestro
se pone en modo de recepcin 2 espera el reconocimiento del dispositi%o receptor
acerca de la direccin coincidente&
+i el dispositi%o escla%o en%7a un 5it de reconocimiento G1I la transmisin de datos
continuar3 $asta 0ue el dispositi%o maestro GmicrocontroladorI en%7e el 5it de parada
G+topI&
Esto es una e9plicacin simple de cmo se comunican dos componentes& Este
microcontrolador es capa4 de controlar las situaciones m3s complicadas cuando est3n
conectados 1;24 di1erentes componentes Gdireccin de 1; 5itsI, compartidos por %arios
dispositi%os maestros di1erentes& Por supuesto, estos dispositi%os se utili4an pocas %eces
en la pr3ctica por lo 0ue no es necesario $a5lar de ellos detalladamente&
/a siguiente 1igura muestra el diagrama de 5lo0ues del mdulo M-++P en modo I
2
C&
En una operacin I
2
C con el mdulo M++P inter%ienen seis registros& !lgunos de ellos
se muestran en la Figura anterior&
++PC*'
++PC*'2
++P+.!.
++PA?F
++P+)
++P!--
R$,3)&/0 SSPSTAT
-M4 -ample 9it GAit de muestraI
Modo maestro +PI - Este 5it determina 1ase de datos de entrada&
1 - Estado lgico se lee al 1inal del tiempo de salida&
; - Estado lgico se lee en la mitad del tiempo de salida&
7odo esclavo #96 - Este 5it de5e ser 5orrado cuando +PI se emplea en modo escla%o&
Modo IsC Gmaestro o esclavoI
1 - -es$a5ilita control de %ariaciones para %elocidad est3ndar G1;;]:4I&
; - :a5ilita control de %ariaciones para %elocidad alta G4;;] :4I&
%LE - %lock E!ge -elect 9it G5it de seleccin del 1lanco de reloI selecciona el modo
de sincroni4acin&
CTP J ;#
1 - -ato transmitido en 1lanco ascendente de pulso de relo G; - 1I&
; - -ato transmitido en 1lanco descendente de pulso de relo G1 - ;I&
CTP J 1#
1 - -ato transmitido en 1lanco descendente de pulso de relo G1 - ;I&
; - -ato transmitido en 1lanco ascendente de pulso de relo G; - 1I&
D/A - Data/A!!ress 9it G5it de direccionesRdatosI se utili4a slo en modo I
2
C&
1 - Indica 0ue el 6ltimo 52te reci5ido o transmitido es un dato&
; - Indica 0ue el 6ltimo 52te reci5ido o transmitido es una direccin&
4 - -top 9it G5it de paradaI se utili4a slo en modo IsC&
1 - Ait de parada G+.*PI se $a detectado&
; - Ait de parada G+.*PI no se $a detectado&
- - -tart 9it G5it de arran0ueI se utili4a slo en modo I2C&
1 - Ait de arran0ue G+.!).I se $a detectado&
; - Ait de arran0ue G+.!).I no se $a detectado&
(/N - (ea! Nrite 9it G5it de in1ormacin /ecturaREscrituraI se utili4a slo en modo
I
2
C& Este 5it contiene la in1ormacin del 5it de /RE despu"s de la 6ltima direccin coin
cidente& Este 5it es %3lido slo desde la direccin coincidente $asta el siguiente 5it de
arran0ue, 5it de parada o 5it no !CT&
Modo IsC en modo escla%o
1 - /ectura de dato&
; - Escritura de dato&
Modo IsC en modo escla%o
1 - .ransmisin en progreso&
; - .ransmisin no est3 en progreso&
)A - )p!ate A!!ress 9it G5it de acti%acin de direccinI se utili4a slo en modo I
2
C
de 1; 5its&
1 - Indica 0ue es necesario actuali4ar la direccin en el registro ++P!--&
; - Indica 0ue la direccin es correcta 2 0ue no se necesita actuali4arla&
0< 0u##er <ull -tatus 9it G5it de estado de 561er llenoI
-urante la recepcin de dato Gen modos +PI e IsCI
1 - )ecepcin completa& El registro ++PA?F est3 lleno&
; - )ecepcin no completa& El registro ++PA?F est3 %ac7o&
-urante la transmisin de dato Gslo en modo IsCI
1 - .ransmisin de dato en progreso Gno inclu2e el 5it !CT 2 5its de paradaI&
; - .ransmisin de dato completa Gno inclu2e el 5it !CT 2 5its de paradaI&
R$,3)&/0 SSPSTAT
N%O1 Nrite %ollision Detect 9it G5it detector de colisinI
1 - Colisin detectada& En el registro ++PA?F se $a escrito cuando no se $an
cumplido las condiciones para iniciar una transmisin&
; - 'o $a2 colisin&
--4O/ (eceive Over#low &n!icator 9it G5it detector de des5ordamiento en recepcinI
1 - +e reci5e un nue%o 52te cuando el registro ++PA?F a6n mantiene los datos
ante riores& Como no $a2 espacio para reci5ir datos nue%os, uno de estos dos
52tes de5e ser 5orrado& En este caso, los datos almacenados en el registro
++P+) se pierden irremedia5lemente&
; - -ato serial es reci5ido correctamente&
--4E' - -;nchronous -erial 4ort Ena9le 9it G5it de $a5ilitacin del mdulo ++P -
puerto serie s7ncronoI determina la 1uncin de los pines del microcontrolador e
iniciali4a el mdulo M++P#
En modo +PI
1 - :a5ilita el mdulo M++P 2 con1igura los pines +CT, +-*, +-I 2 ++ como
una 1uente de pines del puerto serie&
; - -es$a5ilita el mdulo M++P 2 con1igura estos pines como pines del puerto
de ER+&
En modo IsC
1 - :a5ilita el mdulo M++P 2 con1igura los pines +-! 2 +C/ como una 1uente
de pines del puerto serie&
; - -es$a5ilita el mdulo M++P 2 con1igura estos pines como pines del puerto
de ER+&
%L4 - %lock 4olarit; -elect 9it G5it de seleccin de polaridad de reloI no se utili4a en
modo IsC maestro&
En modo +PI
1 - Para una se8al de relo, el estado inacti%o es un ni%el alto&
; - Para una se8al de relo, el estado inacti%o es un ni%el 5ao&
En modo IsC escla%o
1 - +e8al de relo $a5ilitada&
; - Mantiene la salida de se8al de relo en estado 5ao& +e utili4a para
proporcionar m3s tiempo para esta5ili4acin de datos&
--4M---4MT - -;nchronous -erial 4ort Mo!e -elect 9its& G5it de seleccin del
modo del ++P Gpuerto serie s7ncronoI& El modo ++P se determina al com5inar los
siguientes 5its#
--4M --4M+ --4M1 --4MT Mo!o
; ; ; ; Modo maestro del +PI, relo J FoscR4&
; ; ; 1 Modo maestro del +PI, relo J FoscR16&
; ; 1 ; Modo maestro del +PI, relo J FoscR64&
; ; 1 1 Modo maestro del +PI, relo J G.M) outputIR2&
; 1 ; ; Modo escla%o del +PI, $a5ilitado el pin de control ++&
; 1 ; 1
Modo escla%o del +PI, des$a5ilitado el pin de control
++, ++ se puede utili4ar como pin de ER+&
; 1 1 ; Modo escla%o I2C, direccin de 7 5its utili4ada&
; 1 1 1 Modo escla%o I2C, direccin de 1; 5its utili4ada&
1 ; ; ; Modo maestro I2C, relo J Fosc R X4G++P!-D1IY&
1 ; ; 1 M3scara utili4ada en modo escla%o I2C&
1 ; 1 ; 'o utili4ado&
1 ; 1 1 Modo maestro I2C controlado&
1 1 ; ; 'o utili4ado&
1 1 ; 1 'o utili4ado&
1 1 1 ;
Modo escla%o I2C, direccin de 7 5its utili4ada, los
5its de arran0ue G+.!).I 2 de parada G+.*PI
$a5ilitan interrupcin&
1 1 1 1
Modo escla%o I2C, direccin de 1; 5its utili4ada, los
5its de arran0ue G+.!).I 2 de parada G+.*PI
$a5ilitan interrupcin&
R$,3)&/0 SSPCONB
=%E' - =eneral %all Ena9le 9it G5it de $a5ilitacin generalI
+lo en modo escla%o IsC
1 - :a5ilita interrupcin cuando una direccin de llamada general es reci5ida en
el ++P+. G;;;;$I&
; - -es$a5ilita direccin de llamada general&
A%L-TAT - Acknowle!ge -tatus 9it G5it de estado de reconocimientoI
+lo en modo de transmisin maestro IsC
1 - )econocimiento del escla%o no reci5ido&
; - )econocimiento del escla%o reci5ido&
A%LDT - Acknowle!ge !ata 9it G5it de recepcinI
+lo en modo de recepcin maestro IsC
1 - 'o reconocimiento&
; - )econocimiento&
A%LE' - Acknowle!ge -eEuence Ena9le 9it G5it de $a5ilitacin de secuencia de
reconocimientoI
En modo de recepcin maestro IsC
1 - Indica una secuencia de reconocimiento en los pines +-! 2 +C/ 2 transmite
el 5it !CT-.& !utom3ticamente 5orrado por $ardSare&
; - +ecuencia de reconocimiento en reposo&
(%E' - (eceive Ena9le 9it G5it de $a5ilitacin de recepcinI
+lo en modo maestro IsC
1 - :a5ilita recepcin en modo I
2
C&
; - )ecepcin des$a5ilitada&
4E' - -TO4 con!ition Ena9le 9it G5it de $a5ilitacin de condicin de ParadaI
+lo en modo maestro IsC
1 - Indica una condicin de Parada en los pines +-! 2 +C/& /uego, este 5it es
autom3ticamente 5orrado por $ardSare&
; - Condicin de Parada en reposo&
(-E' - (epeate! -TA(T %on!ition Ena9le! 9it G5it de $a5ilitacin de repetir
condicin de !rran0ueI
+lo en modo maestro IsC
1 - Indica repeticin de condicin de !rran0ue en los pines +-! 2 +C/& /uego,
este 5it es autom3ticamente 5orrado por $ardSare&
; - Condicin de repeticin de !rran0ue en reposo&
-E' - -TA(T %on!ition Ena9le!/-tretch Ena9le! 9it G5it de $a5ilitacin de
condicin de !rran0ueI
+lo en modo maestro IsC
1 - Indica condicin de !rran0ue en los pines +-! 2 +C/& /uego, este 5it es
autom3ticamente 5orrado por $ardSare&
; - Condicin de !rran0ue en reposo&
IGC $% M0*0 M'$)&/0
El caso m3s com6n es 0ue un microcontrolador 1unciona como maestro 2 un peri1"rico
como escla%o& Es la ra4n por la 0ue este li5ro slo trata este modo& +e da por entendido
0ue la direccin consiste en 7 5its 2 el dispositi%o contiene un solo microcontrolador
Gdispositi%o con maestro 6nicoI&
Para $a5ilitar el mdulo M++P en este modo, siga las siguientes instrucciones#
!uste la %elocidad de transmisin Gregistro ++P!--I, desacti%e el control de
%elocidad de rotacin Gal poner a uno el 5it +MP del registro ++P+.!.I 2 seleccione el
modo maestro Gregistro ++PC*'I& -espu"s de 1inali4ar todos los austes 2 $a5ilitar el
mdulo Gregistro ++PC*'# 5it ++PE'I, es necesario esperar a 0ue los circuitos de
control internos indi0uen con una se8al 0ue todo est" preparado para transmisin de
datos# o sea, 0ue el 5it ++PIF del registro PI)1 se $a2a puesto a uno&
-espu"s de poner este 5it a cero por so1tSare, el microcontrolador est3 listo para
intercam5iar los datos con los peri1"ricos&
T/'%)13)34% *$ *'&0) $% M0*0 M'$)&/0 IGC
/a transmisin de datos en el pin +-! se inicia con un cero lgico G;I 0ue aparece al
poner a uno el 5it +PE' del registro ++PC*'2& +in em5argo, aun0ue est3 $a5ilitado, el
microcontrolador tiene 0ue esperar cierto tiempo antes de iniciar la comunicacin& +e le
denomina iCondicin de Inicioi durante la 0ue se reali4an las preparaciones 2
%eri1icaciones internas& +i se cumplen con todas la condiciones, el 5it ++PIF del registro
PI)1 se pone a uno 2 la transmisin de datos se inicia en cuanto se cargue el registro
++PA?F&
Como m39imo 112 circuitos integrados Gdispositi%os escla%osI pueden compartir
simult3neamente la misma l7nea de transmisin& El primer 52te de datos en%iado por el
dispositi%o maestro contiene la direccin 0ue coincide con una sola direccin del
dispositi%o escla%o& .odas las direcciones se enumeran en las $oas de datos respecti%as&
El octa%o 5it del primer 52te de datos especi1ica la direccin de transmisin de datos, o
sea si el microcontrolador %a a en%iar o reci5ir los datos& En este caso, como se trata de
transmisin de datos, el octa%o 5it se pone a cero G;I&
Cuando ocurre la coincidencia de direcciones, el microcontrolador tiene 0ue esperar a
0ue el dispositi%o escla%o en%7e el 5it de reconocimiento, o sea 0ue se ponga a cero el
5it !+T+.!. del registro ++PC*'2& ?na %e4 0ue la coincidencia de direcciones $a
ocurrido apropiadamente, todos los 52tes de datos se transmiten de la misma manera&
/a transmisin de datos termina al poner a uno el 5it +E' del registro ++PC*'2&
*curre la condicin de parada G+.*PI, lo 0ue $a5ilita 0ue el pin +-! reci5a una
secuencia de pulsos#
Inicio - -ireccin - )econocimiento - -ato - )econocimiento &&&& -ato -
)econocimiento - Parada@
R$2$.234% *$ *'&0) $% M0*0 M'$)&/0 IGC
/as preparaciones para reci5ir los datos son similares a las de transmitir los datos, con
e9cepcin de 0ue el 6ltimo 5it del primer 52te en%iado Gel 0ue contiene la direccinI se
ponga a uno lgico G1I& Eso especi1ica 0ue el dispositi%o maestro espera reci5ir los
datos del dispositi%o escla%o direccionado& Con respecto al microcontrolador, ocurre lo
siguiente#
-espu"s de $acer las prue5as internas 2 poner a uno el 5it de arran0ue G+.!).I, el
dispositi%o escla%o en%7a 52te por 52te& Estos 52tes se almacenan en el registro serial
++P+)& -espu"s de reci5ir el 6ltimo - octa%o 5it, cada dato se carga en el registro
++PA?F del 0ue se puede leer& !l leer este registro, se en%7a autom3ticamente el 5it de
reconocimiento, lo 0ue signi1ica 0ue el dispositi%o maestro est3 listo para reci5ir los
nue%os datos&
!l igual 0ue en el caso de la transmisin, la recepcin de datos termina al poner a uno el
5it de parada G+.*PI#
Inicio - -ireccin - )econocimiento - -ato - )econocimiento &&&& -ato -
)econocimiento - >Parada@
En esta secuencia de pulsos, el 5it de reconocimiento se en%7a al dispositi%o esclavo&
G$%$/'*0/ *$ 9'-*30)
Para sincroni4ar la transmisin de datos, todos los e%entos 0ue ocurren en el pin +-!
de5en estar sincroni4ados con la se8al de relo generada en el dispositi%o maestro& Esta
se8al de relo se genera por un simple oscilador cu2a 1recuencia depende de la
1recuencia del oscilador principal del microcontrolador, del %alor 0ue se introduce al
registro ++P!-- 2 as7 como del modo +PI actual& /a 1recuencia de se8al de relo del
modo descrito en este li5ro depende del cristal de cuar4o seleccionado 2 del registro
+P!--& /a 1rmula utili4ada para $acer el c3lculo de 1recuencia de relo es#
/amos a hacerlo en mikro%...
/* En este ejemplo, el microcontrolador PIC est conectado a la
memoria EEPROM 24C02
por los pines SCL y SDA. El programa enva un byte de dato a la
direccin 2 de la EEPROM.
Entonces, el programa lee este dato por el modo I2C de la EEPROM y lo
enva al
puerto PORTB para comprobar si el dato se ha escrito con xito. El
byte para direccionar
la EEPROM est compuesto por 7 bits de la direccin (1010001) y el bit
que determina
lectura o escritura del dato (LSB - bit menos significativo).*/
void main(){
ANSEL = ANSELH = PORTB = TRISB = 0; // Todos los pines son
digitales. Los pines del
// puerto PORTB son salidas.
I2C1_Init(100000); // Inicializar I2C con reloj
deseado

// Incio del bloque de sentencias para escribir un byte en la
memoria EEPROM.

I2C1_Start(); // Seal de inicio de I2C
I2C1_Wr(0xA2); // Enviar byte por I2C
(direccin de dispositivo + W)
I2C1_Wr(2); // Enviar byte (direccin de la
localidad EEPROM)
I2C1_Wr(0xF0); // Enviar los datos a escribir
I2C1_Stop(); // Seal de parada de I2C
Delay_100ms();

// En el siguiente bloque de sentencias se determina la direccin 2
de la que se leer el dato

I2C1_Start(); // Seal de inicio de I2C
I2C1_Wr(0xA2); // Enviar byte por I2C
(direccin de dispositivo + W)
I2C1_Wr(2); // Enviar byte (direccin de
dato)

// La direccin est determinada y el dato est listo para ser ledo

I2C1_Repeated_Start(); // Se vuelve a generar el inicio
de seal I2C
I2C1_Wr(0xA3); // Enviar byte (direccin de
dispositivo + R)
PORTB = I2C1_Rd(0u); // Leer el dato (reconocimiento
NO)
I2C1_Stop(); // Seal de parada de I2C
}
NOTAS TILES HHH
Cuando el microcontrolador se comunica con un peri1"rico, puede ocurrir un 1allo en la
transmisin de datos por alguna ra4n& En este caso, es recomenda5le compro5ar el
estado de algunos 5its 0ue pueden aclarar el pro5lema& En la pr3ctica, el estado de estos
5its se comprue5a al eecutar una pe0ue8a su5rutina despu"s de transmisin 2 recepcin
de cada 52te Gpor si acasoI&
N%O1 6-4%O'.$7 - +i intenta escri5ir un dato nue%o al registro ++PA?F mientras
0ue otra transmisinRrecepcin de datos est3 en progreso, el 5it WC*/ se pone a uno 2
el contenido del registro ++A?F se 0ueda sin cam5ios& 'o $a2 escritura& /uego, el 5it
WC*/ de5e ser 5orrado por el so1tSare&
0< 6--4-TAT.T7 - !l transmitir los datos, este 5it se pone a uno durante la escritura en
el registro ++PA?F 2 se 0ueda puesto a uno $asta 0ue el 52te en 1ormato serial se
desplace del registro ++P)+& En modo de recepcin, este 5it se pone a uno al cargar un
dato o una direccin al registro ++PA?F& +e pone a cero despu"s de leer el registro
++PA?F&
--4O/ 6--4%O'."7 - En modo de recepcin, este 5it se pone a uno al reci5ir un
nue%o 52te en el registro ++P+) por medio de la comunicacin serial, toda%7a sin $a5er
le7do el dato anteriormente reci5ido del registro ++PA?F&
4ines -DA ; -%1 - Cuando el mdulo ++P est3 $a5ilitado, estos pines se %uel%en a las
salidas de -renae !5ierto& Esto signi1ica 0ue de5en estar conectados a resistencias
conectados a la otra punta al polo positi%o de la 1uente de alimentacin&
Para esta5lecer la comunicacin serial en modo I2C, se de5e reali4ar lo siguiente#
AIustar el m?!ulo ; enviar la !irecci?n:
Introducir en el registro ++P!-- el %alor para de1inir la %elocidad de
transmisin en 5audios&
Poner a uno el 5it +MP del registro ++P+.!. para desacti%ar el control de la
%elocidad de rotacin&
Introducir el %alor 5inario 1;;; a los 5its ++PM3-++PM; del registro ++PC*'1
para seleccionar el modo Maestro&
Poner a uno el 5it +E' del registro ++PC*'2 Gsecuencia de Inicio - +.!).I&
El 5it ++PIF se pone a uno autom3ticamente en 1inal de la secuencia de Inicio
cuando el mdulo est3 listo para 1uncionar& +e de5er3 poner a cero&
Introducir la direccin de escla%o al registro ++PA?F&
Cuando se en%7a un 52te, el 5it ++PIF GinterrupcinI se pone a uno
autom3ticamente despu"s de $a5er reci5ido el 5it de reconocimiento del
dispositi%o escla%o&
Transmitir los !atos:
Introducir en el registro ++PA?F los datos a en%iar&
Cuando se en%7a un 52te, el 5it ++PIF GinterrupcinI se pone a uno
autom3ticamente despu"s de $a5er reci5ido el 5it de reconocimiento del
dispositi%o escla%o&
/a condicin de Parada G+.*PI se de5e iniciar al poner a uno el 5it PE' del
registro ++PC*' para in1ormar al dispositi%o Escla%o 0ue la transmisin de
datos se aca5&
(eci9ir los !atos:
Poner a uno el 5it )+E' del registro ++PC*'2 para $a5ilitar la recepcin&
El 5it ++PIF indica con su estado lgico la recepcin de datos& -espu"s de leer
los datos del registro ++PA?F, el 5it !CTE' del registro ++PC*'2 de5e
ponerse a uno para $a5ilitar el en%7o del 5it de reconocimiento&
/a condicin de Parada G+.*PI se de5e iniciar al poner a uno el 5it PE' del
registro ++PC*' para in1ormar al dispositi%o Escla%o 0ue la transmisin se
aca5&
!parte de disponer de un gran n:mero de lneas digitales de E/# utilizadas para la
comunicacin con los perifricos, el 96,$=>??@ contiene $U entradas analgicas.
Eebido a stas, el microcontrolador no slo puede reconocer si un pin es llevado a
baJo o alto '% o VMS(, sino ue puede medir con precisin el voltaJe & convertirlo en un
valor numrico, o sea, en formato digital.
.S M*D)1O- A'A1*=&%O-
El mdulo del con%ertidor !R- dispone de las siguientes caracter7sticas#
El con%ertidor genera un resultado 5inario de 1; 5its utili4ando el m"todo de
apro9imaciones sucesi%as 2 almacena los resultados de con%ersin en los
registros !-C G!-)E+/ 2 !-)E+:IV
-ispone de 14 entradas analgicas separadasV
El con%ertidor !R- con%ierte una se8al de entrada analgica en un n6mero
5inario de 1; 5itsV
/a resolucin m7nima o calidad de con%ersin se puede austar a di1erentes
necesidades al seleccionar %oltaes de re1erencia Kre1- 2 Kre1D&
CONVERTIDOR A/D
!un0ue a primera %ista parece mu2 complicado utili4ar un con%ertidor !R-, en realidad
es mu2 simple& -e $ec$o resulta m3s simple utili4ar un con%ertidor !R- 0ue los
tempori4adores o mdulos de comunicacin serie&
El 1uncionamiento del con%ertidor !R- est3 5ao el control de los 5its de cuatro
registros#
!-)E+: )egistro alto del resultado de la con%ersin !R-V
!-)E+/ )egistro 5ao del resultado de la con%ersin !R-V
!-C*'; )egistro de control ;V 2
!-C*'1 )egistro de control 1&
R$,3)&/0) ADRESH : ADRESL
El resultado o5tenido despu"s de con%ertir un %alor analgico en digital es un n6mero
de 1; 5its 0ue se almacenar3 en los registros !-)E+: 2 !-)E+/& :a2 dos maneras
de manearlo# usti1icacin a la i40uierda 2 a la derec$a 0ue simpli1ica en gran medida
su uso& El 1ormato del resultado de la con%ersin depende del 5it !-FM del registro
!-C*'1& En caso de 0ue no se utilice el con%ertidor !R-, estos registros se pueden
utili4ar como registros de propsito general&
REQUERIMIENTOS DE ADQUISICIN A/D
Para 0ue el con%ertidor !R- alcance su e9actitud especi1icada, es necesario
proporcionar un cierto tiempo muerto entre seleccionar una entrada analgica espec71ica
2 la medicin misma& Este tiempo se le denomina Btiempo de ad0uisicinC 2
generalmente depende de la impedancia de la 1uente& +e utili4a una ecuacin para $acer
c3lculo de tiempo de ad0uisicin con precisin, cu2o %alor m7nimo es de 2;u+
apro9imadamente& Por consiguiente, para reali4ar una con%ersin con precisin, no se
ol%ide este detalle&
RELO# PARA LA CONVERSIN A/D
El tiempo necesario para reali4ar una con%ersin !R- cu2o resultado es 1 5it se de1ine
en unidades de .!-& +e re0uiere 0ue sea como m7nimo 1,6 u+& Para reali4ar una
con%ersin completa de 1; 5its se re0uiere un poco m3s tiempo de lo esperado, son 11
.!-& Como la 1recuencia de relo as7 como la 1uente de con%ersin !R- son
determinadas por so1tSare, es necesario seleccionar una de las com5inaciones de los
5its disponi5les !-C+1 2 !-C+; antes de empe4ar a medir %oltae en una de las
entradas analgicas& Estos 5its se almacenan en el registro !-C*';&
<uente !e reloI !e AD% AD%-1 AD%-T
<recuencia !e !ispositivo 6<osc7
+T Mh: 8 Mh: J Mh: 1 Mh:
FoscR2 ; ; 1;; n+ 2L; n+ L;; n+ 2 u+
FoscR8 ; 1 4;; n+ 1 u+ 2 u+ 8 u+
FoscR32 1 ; 1&6 u+ 4 u+ 8 u+ 32 u+
Frc 1 1 2 - 6 u+ 2 - 6 u+ 2 - 6 u+ 2 - 6 u+
Cual0uier cam5io de la 1recuencia de relo del microcontrolador a1ectar3 a la 1recuencia
de relo de la con%ersin !R-, lo 0ue puede perudicar al resultado de la con%ersin
!R-& En la siguiente ta5la se muestran las caracter7sticas de la 1recuencia del
dispositi%o& /os %alores en las celdas som5readas est3n 1uera del rango recomendado&
CMO UTILIAR EL CONVERTIDOR A/D?
Para lle%ar a ca5o una con%ersin !R- sin pro5lemas as7 como para e%itar los resultados
inesperados, es necesario considerar lo siguiente#
El con%ertidor !R- no $ace di1erencia entre se8ales digitales 2 analgicas& Para
e%itar errores en medicin o da8ar el c$ip, los pines se de5en con1igurar como
en tradas analgicas antes de 0ue empiece el proceso de con%ersin& /os 5its
utili4a dos para este propsito se almacenan en los registros .)I+ 2 !'+E/
G!'+E/:IV
!l leer el estado de puerto con las entradas analgicas, el estado de los 5its
correspondientes se leer3 como cero lgico G;I, sin reparar en el %alor del %oltae
real en el pinV 2
:a5lando en t"rminos generales, la medicin de %oltae en el con%ertidor est3
5asado en comparar %oltae de entrada con una escala interna 0ue tiene 1;23
grados G2
1;
- 1 J1;23I& El grado m3s 5ao de esta escala representa el %oltae
Kre1-, mientras 0ue el grado m3s alto se re1iere al %oltae Kre1D& /a siguiente
1igura muestra los %oltaes de re1erencia selecciona5les as7 como sus %alores
m39imos 2 m7nimos&
R$,3)&/0 ADCONC
AD%-1. AD%-T - A/D %onversion %lock -elect 9its G5its de seleccin de relo de
con%ersin !R-I selecciona la 1recuencia de relo utili4ada para sincroni4acin interna
del con%ertidor !R-& !simismo a1ecta a la duracin de la con%ersin&
AD%-1 AD%-+ (eloI
; ; FoscR2
; 1 FoscR8
1 ; FoscR32
1 1 )C E
E +e8al de relo se genera por el oscilador interno )C 0ue est3 integrado en el
con%ertidor&
%2--%2-T - Analog %hannel -elect 9its G5its de seleccin de canal analgicoI
selecciona un pin o un canal analgico para la con%ersin !R-, o sea para medir el
%oltae#
%2- %2-+ %2-1 %2-T %anal 4in
; ; ; ; ; )!;R!';
; ; ; 1 1 )!1R!'1
; ; 1 ; 2 )!2R!'2
; ; 1 1 3 )!3R!'3
; 1 ; ; 4 )!LR!'4
; 1 ; 1 L )E;R!'L
; 1 1 ; 6 )E1R!'6
; 1 1 1 7 )E2R!'7
1 ; ; ; 8 )A2R!'8
1 ; ; 1 H )A3R!'H
1 ; 1 ; 1; )A1R!'1;
1 ; 1 1 11 )A4R!'11
1 1 ; ; 12 )A;R!'12
1 1 ; 1 13 )ALR!'13
1 1 1 ; CKre1
1 1 1 1 Kre1 J ;&6K
=O/DO'E - A/D %onversion -tatus 9it G5it de estado de la con%ersin !R-I
determina el estado actual de de la con%ersin#
1 - /a con%ersin !R- est3 en progreso&
; - /a con%ersin !R- $a 1inali4ado& El 5it se pone a cero autom3ticamente por
$ardSare cuando la con%ersin !R- 1inali4a&
ADO' - A/D On 9it G5it de encendido !R-I $a5ilita el con%ertidor !R-&
1 - Con%ertidor !R- est3 $a5ilitado&
; - Con%ertidor !R- est3 des$a5ilitado&
/amos a hacerlo en mikro%...
/* Este cdigo es un ejemplo de leer el valor analgico del canal 2 y
de visualizarlo
en los puertos PORTB y PORTC como nmero binario de 10 bits. */
#include <built_in.h>
unsigned int adc_rd;
void main() {
ANSEL = 0x04; // Configurar AN2 como pin analgico
TRISA = 0xFF; // PORTA se configura como entrada
ANSELH = 0; // Configurar los dems pines AN como E/S
digitales
TRISC = 0x3F; // Pines RC7 y RC6 se configuran como
salidas
TRISB = 0; // PORTB se configura como salida

do {
temp_res = ADC_Read(2); // Obtener el resultado de 10 bits de la
conversin AD
PORTB = temp_res; // Enviar los 8 bits ms bajos al PORTB
PORTC = temp_res >> 2; // Enviar los 2 bits ms significativos a
los RC7, RC6
} while(1); // Quedarse en el bucle
}
R$,3)&/0 ADCONA
AD<M - A/D (esult <ormat -elect 9it G5it de seleccin del 1ormato del resultado de la
con%ersin !R-I
1 - )esultado de con%ersin est3 usti1icado a la derec$a& 'o se utili4an los seis
5its m3s signi1icati%os del registro !-)E+:&
; - )esultado de con%ersin est3 usti1icado a la i40uierda& 'o se utili4an los seis
5its menos signi1icati%os del registro !-)E+/&
/%<=1 - /oltage (e#erence 9it G5it de con1iguracin de %oltae de re1erenciaI
selecciona la 1uente de %oltae de re1erencia 5ao 0ue se necesita para el 1uncionamiento
del con%ertidor !R-&
1 - Koltae de re1erencia 5ao se aplica al pin Kre1-
; - Koltae de alimentacin Kss se utili4a como una 1uente de %oltae de
re1erencia 5ao&
/%<=T - /oltage (e#erence 9it G5it de con1iguracin de %oltae de re1erenciaI
selecciona la 1uente de %oltae de re1erencia alto 0ue se necesita para el 1ucionamiento
del con%ertidor !R-&
1 - Koltae de re1erencia alto se aplica al pin Kre1D&
; - Koltae de alimentacin Kdd se utili4a como una 1uente de %oltae de
re1erencia alto&
Para medir el %oltae en un pin de entrada por medio del con%ertidor !R-, se de5e
reali4ar lo siguiente#
4aso 1 - Con1iguracin del puerto#
Escri5ir un uno lgico G1I a un 5it del registro .)I+, lo 0ue resulta en con1igurar
el pin apropiado como una entrada&
Escri5ir un uno lgico G1I a un 5it del registro !'+E/, lo 0ue resulta en
con1igurar el pin apropiado como una entrada analgica&
4aso + - Con1iguracin del mdulo de la con%ersin !R-#
Con1igurar %oltae de re1erencia en el registro !-C*'1&
+eleccionar una se8al de relo de la con%ersin !R- en el registro !-C*';&
+eleccionar uno de los canales de entrada C:;-C:13 del registro !-C*';&
+eleccionar el 1ormato de dato por medio de !-FM del registro !-C*'1&
:a5ilitar el con%ertidor !R- al poner a uno el 5it !-*' del registro !-C*';&
4aso - Con1iguracin de la interrupcin GopcionalmenteI#
Poner a cero el 5it !-IF&
Poner a uno los 5its !-IE, PEIE 2 [IE&
4aso J - .iempo de espera para 0ue transcurra el tiempo de ad0uisicin
Gapro9imadamente 2;u+I&
4aso R - Inicio de la con%ersin poniendo a uno el 5it [*R-*'E del reg istro
!-C*';&
4aso " - Esperar a 0ue la con%ersin !R- 1inalice&
Es necesario compro5ar en el 5ucle de programa si el 5it [*R-*'E est3 a cero
o esperar 0ue se produ4ca una interrupcin Gde5er3 estar anteriormente
$a5ilitadaI&
4aso $ - /ectura del resultado de la con%ersin !R-#
/eer los registros !-)E+: 2 !-)E+/&
COMPARADOR ANALGICO
!parte del con%ertidor !R-, $a2 otro mdulo, 0ue $asta $ace poco $a sido incorpodo
slo en los circuitos integrados 0ue pertenecen a los llamados Bcomponentes
analgicosC& -e5ido al $ec$o de 0ue casi no $a2 ning6n dispositi%o autom3tico
compleo 0ue en cierto modo no utilice estos circuitos, dos comparadores de alta
calidad, unto con los componentes adicionales est3n integrados en el microcontrolador
2 conectados a sus pines&
<Cmo 1unciona un comparador= A3sicamente, el comparador analgico es un
ampli1icador 0ue compara la magnitud de %oltaes en dos entradas& -ispone de dos
entradas 2 una salida& -ependiendo de cu3l %oltae de entrada es m3s alto G%alor
analgicoI, un cero lgico G;I o un uno lgico G1I G%alores digitalesI ser3 la salida&
Cuando el %oltae analgico en Kin - es m3s alto 0ue el %oltae an3logo en KinD,
la salida del comparador estar3 a un ni%el digital 5ao&
Cuando el %oltae analgico en KinD es m3s alto 0ue el %oltae an3logo en Kin-,
la salida del comparador estar3 a un ni%el digital alto&
El microcontrolador PIC16F887 dispone de dos de estos comparadores de %oltae cu2as
entradas est3n conectadas a los pines de ER+ )!;-)!3, mientras 0ue las salidas est3n
conectadas a los pines )!4 2 )!L& !dem3s, $a2 una 1uente de %oltae de re1erencia
interna en el c$ip mismo, la 0ue %amos a discutir m3s tarde&
Estos dos circuitos est3n 5ao el control de los 5its almacenados en los siguientes
registros#
CM1C*'; est3 en control del comparador C1V
CM2C*'; est3 en control del comparador C2V
CM2C*'1 est3 en control del comparador C2V
FUENTE INTERNA DE VOLTA#E DE REFERENCIA
?no de dos %oltaes analgicos proporcionados en las entradas del comparador es por lo
general esta5le e inaltera5le& Es denominado b%oltae de re1erenciadGKre1I& Para
generarlo, se pueden utili4ar tanto una 1uente de %oltae e9terna como una 1uente de
%oltae interna especial& El %oltae de re1erencia Kre1 se deri%a despu"s de seleccionar
una 1uente, por medio de una red en escalera 0ue consiste en 16 resistencias, 1ormando
un di%isor de %oltae& /a 1uente de %oltae es selecciona5le por el 5it K)++ del registro
K)C*'&
!dem3s, la 1raccin de %oltae proporcionada por la red de resistencias es selecciona5le
por los 5its K);-K)3 2 utili4ada como %oltae de re1erencia& Kea la siguiente 1igura#
El %oltae de re1erencia del comparador dispone de dos gamas con 16 di1erentes ni%eles
de %oltae cada una& /a seleccin de gama es controlada por el 5it K)) del registro
K)C*'& El %oltae de re1erencia seleccionado CKre1 puede ser la salida al pin
)!2R!'2 si el 5it K)*E se pone a uno&
!un0ue la idea principal era o5tener el %oltae de re1erencia %aria5le para el
1uncionamiento de mdulos analgicos, de ese modo se o5tiene un simple con%ertidor
!R-& Este con%ertidor es mu2 6til en algunas situaciones& +u 1uncionamiento est3 5ao
el control del registro K)C*'&
COMPARADORES E INTERRUPCIN
+iempre 0ue $a2a un cam5io del estado lgico en la salida de un comparador, el 5it de
5andera CMIF del registro PI) se pone a uno& Ese cam5io tam5i"n causar3 una
interrupcin si los siguientes 5its se ponen a uno#
El 5it CMIE del registro PIE J 1V
El 5it PEIE del registro I'.C*' J 1V 2
El 5it [IE del registro I'.C*' J 1&
+i una interrupcin est3 $a5ilitada, un cam5io en la salida de un comparador cuando el
microcontrolador est3 en modo de reposo, puede causar 0ue el microcontrolador salga
de reposo 2 %uel%a a 1uncionar en modo normal&
FUNCIONAMIENTO EN MODO DE REPOSO (SLEEP MODE)
+i est3 $a5ilitado antes de entrar en modo de reposo, el comparador se 0ueda acti%o
durante el modo de reposo& +i el comparador no se utili4a para kdespertark el
dispositi%o, el consumo de corriente se puede reducir en modo de reposo al apagar el
comparador& Esto se lle%a a ca5o al poner a cero el 5it C9*' del registro CM9C*';&
Para 0ue el comparador kdespiertek al microcontrolador del modo de reposo, el 5it C9IE
del registro IE2 2 el 5it PEIE del registro I'.C*' de5er3n ponerse a uno& /a
instruccin 0ue sigue a la instruccin +leep siempre se eecuta al salir del modo de
reposo& +i el 5it [IE del registro I'.C*' se pone a uno, el dispositi%o eecutar3 la
rutina de ser%icio de interrupcin&
R$,3)&/0 CMACONC
/os 5its de este registro est3n en control del comparador C1& Eso a1ecta principalmente
a la con1iguracin de las entradas& Para e9plicarlo con m3s claridad, %ea la siguiente
1igura en la 0ue se muestran slo los componentes directamente a1ectados por los 5its de
este registro&
%1O' - %omparator %1 Ena9le 9it G5it de $a5ilitacin del comparador C1I $a5ilita al
comparador C1&
1 - Comparador C1 est3 $a5ilitado&
; - Comparador C1 est3 des$a5ilitado&
%1O)T - %omparator %1 Output 9it G5it de salida del comparador C1I es la salida
del comparador C1&
+i C1P*/ J 1 Gsalida del comparador est3 in%ertidaI
1 - Koltae de entrada C1KinD es m3s 5ao 0ue el %oltae de entrada C1Kin-&
; - Koltae de entrada C1KinD es m3s alto 0ue el %oltae de entrada C1Kin-&
I1 C1P*/ J ; Gsalida del comparador no est3 in%ertidaI
1 - Koltae de entrada C1KinD es m3s alto 0ue el %oltae de entrada C1Kin-&
; - Koltae de entrada C1KinD es m3s 5ao 0ue el %oltae de entrada C1Kin-&
%1OE %omparator %1 Output Ena9le 9it G5it de $a5ilitacin de salida del
comparador C1I
1 - +alida del comparador C1*?. est3 conectada al pin C1*?. E&
; - +alida del comparador se utili4a internamente&
E Para $a5ilitar 0ue el 5it C1*?. apare4ca en el pin, se de5en cumplir dos condiciones#
C1*' J 1 Gel comparador de5e estar acti%adoI 2 el 5it correspondiente .)I+ J ; Gpin se
de5e con1igurar como salidaI&
%14O1 - %omparator %1 Output 4olarit; -elect 9it G5it de seleccin de polaridad de
salida del comparador C1I $a5ilita la in%ersin del estado de la salida del comparador
C1&
1 - +alida del comparador C1 est3 in%ertida&
; - +alida del comparador C1 no est3 in%ertida&
%1( - %omparator %1 (e#erence -elect 9it G5it de seleccin de la 1uente de %oltae de
re1erencia del comparador C1I
1 - Entrada no in%ertida C1KinD est3 conectada a la 1uente de %oltae de
re1erencia C1Kre1&
; - Entrada no in%ertida C1KinD est3 conectada al pin C1I'D&
%1%21. %1%2T - %omparator %1 %hannel -elect 9it G5it de seleccin de canal del
comparador C1I
%1%21 %1%2T Entra!a %1/in- !el compara!or
; ; Entrada C1Kin- est3 conectada al pin C12I';-
; 1 Entrada C1Kin- est3 conectada al pin C12I'1-
1 ; Entrada C1Kin- est3 conectada al pin C12I'2-
1 1 Entrada C1Kin- est3 conectada al pin C12I'3-
R$,3)&/0 CMBCONC
/os 5its de este registro est3n en control del comparador C2& +imilar al caso anterior, la
siguiente 1igura muestra un es0uema simpli1icado del circuito a1ectado por los 5its de
este registro&
%+O' - %omparator %+ Ena9le 9it G5it de $a5ilitacin del comparador C2I $a5ilita el
comparador C2&
1 - Comparador C2 est3 $a5ilitado&
; - Comparador C2 est3 des$a5ilitado&
%+O)T - %omparator %+ Output 9it G5it de salida del comparador C2I es la salida
del comparador C2&
I1 C2P*/ J 1 Gsalida del comparador est3 in%ertidaI
1 - Koltae de entrada C2KinD es m3s 5ao 0ue el %oltae de entrada C2Kin-&
; - Koltae de entrada C2KinD es m3s alto 0ue el %oltae de entrada C2Kin-&
I1 C2P*/ J ; Gsalida del comparador no est3 in%ertidaI
1 - Koltae de entrada C2KinD es m3s alto 0ue el %oltae de entrada C2Kin-&
; - Koltae de entrada C2KinD es m3s 5ao 0ue el %oltae de entrada C2Kin-&
%+OE - %omparator %+Output Ena9le 9it G5it de $a5ilitacin de salida del
comparador C2I
1 - +alida del comparador C2*?. est3 conectada al pin C2*?.E&
; - +alida del comparador se utili4a internamente&
E Para $a5ilitar 0ue el 5it C2*?. apare4ca en el pin, se de5en cumplir dos condiciones#
C2*' J 1 Gel comparador de5e estar acti%adoI 2 el 5it correspondiente .)I+ J ; Gpin se
de5e con1igurar como salidaI&
%+4O1 - %omparator %+ Output 4olarit; -elect 9it G5it de seleccin de polaridad de
salida del comparador C2I $a5ilita la in%ersin del estado de la salida del comparador
C2&
1 - +alida del comparador C2 est3 in%ertida&
; - +alida del comparador C2 no est3 in%ertida&
%+( - %omparator %+ (e#erence -elect 9it G5it de seleccin de la 1uente de %oltae de
re1erencia del comparador C2I
1 - Entrada no in%ertida C2KinD est3 conectada a la 1uente de %oltae de
re1erencia C2Kre1&
; - Entrada no in%ertida C2KinD est3 conectada al pin C2I'D&
%+%21. %+%2T %omparator %+ %hannel -elect 9it G5it de seleccin de canal del
comparador C2I
%+%21 %+%2T Entra!a %+/in- !el compara!or
; ; Entrada C2Kin- est3 conectada al pin C12I';-
; 1 Entrada C2Kin- est3 conectada al pin C12I'1-
1 ; Entrada C2Kin- est3 conectada al pin C12I'2-
1 1 Entrada C2Kin- est3 conectada al pin C12I'3-
R$,3)&/0 CMBCONA
M%1O)T Mirror %op; o# %1O)T 9it es una copia del 5it C1*?.
M%+O)T Mirror %op; o# %+O)T 9it es una copia del 5it C2*?.
%1(-E1 %omparator %1 (e#erence -elect 9it G5it de seleccin de la 1uente de
%oltae de re1erencia del comparador C1I
1 - Koltae selecciona5le CKre1 se utili4a en la 1uente de %oltae de re1erencia
C1Kre1&
; - Koltae de re1erencia 1io de ;,6K se utili4a en la 1uente de %oltae de
re1erencia C1Kre1&
%+(-E1 - %omparator %+ (e#erence -elect 9it G5it de seleccin de la 1uente de
%oltae de re1erencia del comparador C2I
1 - Koltae selecciona5le CKre1 se utili4a en la 1uente de %oltae de re1erencia
C2Kre1&
; - Koltae de re1erencia 1io de ;,6K se utili4a en la 1uente de %oltae de
re1erencia C2Kre1&
T1=-- - Timer1 =ate -ource -elect 9it G5it de seleccin de la 1uente de la compuerta
del tempori4ador .imer1I
1 - Compuerta del tempori4ador .imer1 utili4a se8al del pin .1[&
; - Compuerta del tempori4ador .imer1 utili4a se8al +M'CC2*?.&
%+-5'% - %omparator %+ Output -;nchroni:ation 9it G5it de sincroni4acin de
salida del comparador C2I
1 - +alida del comparador C2 est3 sincroni4ada con un 1lanco ascendente de
se8al de relo del tempori4ador .imer1
; - +alida del comparador es una se8al as7ncrona&
(egistro /(%O'
/(E' %omparator %1 /oltage (e#erence Ena9le 9it G5it de $a5ilitacin de la 1uente
de %oltae de re1erencia del comparador C1I
1 - Fuente de %oltae de re1erencia CKre1 est3 encendido&
; - Fuente de %oltae de re1erencia CKre1 est3 apagado&
/(OE %omparator %+ /oltage (e#erence Ena9le 9it G5it de $a5ilitacin de la 1uente
de %oltae de re1erencia del comparador C2I
1 - Fuente de %oltae de re1erencia CKre1 est3 conectada al pin&
; - Fuente de %oltae de re1erencia CKre1 no est3 conectada al pin&
/(( - %/re# (ange -election 9it G5it de seleccin de gama de %oltae de re1erencia
Kre1I
1 - Fuente de %oltae de re1erencia se austa a producir 5aa gama de %oltae&
; - Fuente de %oltae de re1erencia se austa a producir alta gama de %oltae&
/(-- - %omparator /re# (ange selection 9it G5it de seleccin de gama de %oltae de
re1erencia Kre1 del comparadorI
1 - Koltae de re1erencia est3 en la gama de Kre1D a Kre1-&
; - Koltae de re1erencia est3 en la gama de Kdd a Kss& G%oltae de
alimentacinI&
/( - /(T %/re# /alue -election Gseleccin de %alor de %oltae de re1erenciaI
I1 K)) J 1 Ggama 5aaI
El %oltae de re1erencia se calcula por medio de la 1rmula# CKre1 J
GXK)3#K);YR24IKdd&
I1 K)) J ; Ggama altaI
El %oltae de re1erencia se calcula por medio de la 1rmula CKre1 J KddR4 D
GXK)3#K);YR32IKdd&
Pasos a seguir para utili4ar apropiadamente los comparadores integrados#
4aso 1 - Con1iguracin del mdulo#
Para seleccionar el modo apropiado, se de5en con1igurar los estados de los 5its
de los registros CM1C*'; 2 CM2C*';& /a interrupcin de5e estar
des$a5ilitada durante el cam5io de modo&
4aso + - Con1igurar la 1uente de %oltae de re1erencia Kre1 interna Gslo si se utili4aI& En
el registro K)C*' es necesario reali4ar lo siguiente#
+eleccionar una de dos gamas de %oltae por medio del 5it K))&
Con1igurar el %oltae de re1erencia Kre1 necesario por medio de los 5its K)3 -
K);&
Poner a uno el 5it K)*E si es necesario&
:a5ilitar la 1uente de %oltae de re1erencia Kre1 al poner a uno el 5it K)E'&
Frmula utili4ada para calcular el %oltae de re1erencia
/(( W 1 6gama 9aIa7
CKre1 J GXK)3#K);YR24IK/!--E)
/(( W T 6gama alta7
CKre1 J GK/!--E)R4I D GXK)3#K);YK/!--E)R32I
Kladder J Kdd or GXKre1DY - XKre1-YI or Kre1D
4aso - Inicio del 1uncionamiento#
:a5ilitar una interrupcin al poner a uno los 5its CMIE Gregistro PIEI, PEIE 2
[IE Gregistro I'.C*' I&
/eer los 5its C1*?. 2 C2*?. del registro CMC*'&
/eer la 5andera de 5it CMIF del registro PI)& -espu"s de $a5er sido puesto a
uno, este 5it se pone a cero por so1tSare&
9ara sincronizar todos los procesos ue se llevan a cabo dentro del microcontrolador,
se debe utilizar una seal de reloJ, mientras ue para generar una seal de reloJ, se
debe utilizar un oscilador. !s de simple. El microcontrolador dispone de varios
osciladores capaces de funcionar en modos diferentes. W au es donde viene lo
interesante...
.1T O-%&1ADO( DE (E1OG
Como se muestra en la siguiente 1igura, la se8al de relo se genera por uno de los dos
osciladores integrados&
?n oscila!or eHterno est3 instalado 1uera del microcontrolador 2 conectado a los pines
*+C1 2 *+C2& Es denominado ie9ternoi por0ue utili4a componentes e9ternos para
generar una se8al de relo 2 esta5ili4ar la 1recuencia& Estos son# cristal de cuar4o,
resonador cer3mico o circuito resistor - capacitor& El modo de 1uncionamiento del
oscilador se selecciona por los 5its, 0ue se en%7an durante la programacin,
denominados Pala5ra de Con1iguracin&
El oscila!or interno consiste en dos osciladores internos separados#
El :FI'.*+C es un oscilador interno de alta 1recuencia cali5rado a 8M:4& El
microcontrolador puede utili4ar una se8al de relo generada a esta 1recuencia o despu"s
de $a5er sido di%idida en el pre-escalador&
El /FI'.*+C es un oscilador interno de 5aa 1recuencia cali5rado a 31 ]:4& +us pulsos
de relo se utili4an para 1uncionamiento de los tempori4adores de encendido 2 perro
guardi3n, asimismo puede utili4arse como 1uente de se8al de relo para el
1uncionamiento de todo el microcontrolador&
El 5it #&stem ,locG #elect G5it de seleccin del relo del sistema - +C+I del registro
*+CC*' determina si una 1uente de se8al de relo del microcontrolador ser3 interna o
e9terna&
R$,3)&/0 OSCCON
El registro *+CC*' go5ierna el microcontrolador 2 las opciones de seleccin de
1recuencia& Contiene los siguientes 5its# 5its de seleccin de 1recuencia GI)CF2, I)CF1,
I)CF;I, 5its de estado de 1recuencia G:.+, /.+I, 5its de control de relo del sistema
G*+.!, +C+I&
&(%<+-T - &nternal Oscillator <reEuenc; -elect 9its. G5its de seleccin de 1recuencia
del oscilador internoI& El %alor del di%isor de 1recuencias depende de la com5inacin de
estos tres 5its& /a 1recuencia de relo del oscilador interno se determina de la misma
manera&
&(%<+ &(%<1 &(%<T <recuencia O-%.
1 1 1 8 M:4 :FI'.*+C
1 1 ; 4 M:4 :FI'.*+C
1 ; 1 2 M:4 :FI'.*+C
1 ; ; 1 M:4 :FI'.*+C
; 1 1 L;; ]:4 :FI'.*+C
; 1 ; 2L; ]:4 :FI'.*+C
; ; 1 12L ]:4 :FI'.*+C
; ; ; 31 ]:4 /FI'.*+C
O-T- - Oscillator -tart-up Time-out -tatus 9it G5it de estado del tempori4ador de
encendidoI indica cu3l 1uente de relo est3 actualmente en uso& Es un 5it de slo lectura&
1 - +e utili4a el oscilador de relo e9terno&
; - +e utili4a uno de los osciladores de relo interno G:FI'.*+C o /FI'.*+CI&
2T- - 2<&'TO-% -tatus 9it G8 M:4 - 12L ]:4I G5it de estado del :FI'.*+CI
indica si el oscilador interno de alta 1recuencia 1unciona en modo esta5le&
1 - :FI'.*+C est3 esta5le&
; - :FI'.*+C no est3 esta5le&
1T- - 1<&'TO-% -ta9le 9it G31 ]:4I G5it de estado del /FI'.*+CI indica si el
oscilador de 5aa 1recuencia 1unciona en modo esta5le&
1 - /FI'.*+C est3 esta5le&
; - /FI'.*+C no est3 esta5le&
-%- - -;stem %lock -elect 9it G5it de seleccin del relo del sistemaI determina cu3l
oscilador se utili4ar3 como una 1uente de relo&
1 - *scilador interno se utili4a como relo del sistema&
; - *scilador e9terno se utili4a como relo del sistema&
El modo del oscilador se con1igura por medio de los 5its, denominados 9alabra
de ,onfiguracin, 0ue se escri5e en la memoria del microcontrolador durante el
proceso de la programacin&
MODOS DE RELO# EXTERNO
El oscilador e9terno se puede con1igurar para 1uncionar en uno de %arios modos, lo 0ue
$a5ilita 0ue 1uncione a di1erentes %elocidades 2 utilice di1erentes componentes para
esta5ili4ar la 1recuencia& El modo de 1uncionamiento se selecciona durante el proceso de
escri5ir un programa en el microcontrolador& !ntes 0ue nada, es necesario acti%ar el
programa en una PC 0ue se utili4ar3 para programar el microcontrolador& En este caso,
es el programa PIC1las$& Pulse so5re la casilla del oscilador 2 seleccione uno de la lista
desplega5le& /os 5its apropiados se pondr3n a uno autom3ticamente, 1ormando parte de
%arios 52tes, denominados Pala5ra de Con1iguracin&
-urante el proceso de la programacin del microcontrolador, los 52tes de la Pala5ra de
Con1iguracin se escri5en en la memoria )*M del microcontrolador 2 se almacenan en
los registros especiales no disponi5les al usuario& ! 5ase de estos 5its, el
microcontrolador Bsa5eC 0u" $acer, aun0ue eso no se indica e9pl7citamente en el
programa&
Modo de 1uncionamiento se selecciona despu"s de escri5ir 2 compilar un programa
O-%&1ADO( E3TE('O E' MODO E%
El modo de relo e9terno GEC - e9ternal cloc]I utili4a un oscilador e9terno como una
1uente de se8al de relo& /a m39ima 1recuencia de se8al de relo est3 limitada a 2; M:4&
/as %entaas del 1uncionamiento del oscilador e9terno en modo EC son las siguientes#
/a 1uente de relo e9terna independiente est3 conectada al pin de entrada *+C1&
El pin *+C2 est3 disponi5le como pin de ER+ de propsito generalV
Es posi5le sincroni4ar el 1uncionamiento del microcontrolador con los dem3s
componentes incorporados en el dispositi%oV
En este modo el microcontrolador se pone a 1uncionar inmediatamente despu"s
de encenderlo& 'o se re0uiere esperar para esta5ili4ar la 1recuencia&
!l des$a5ilitar temporalmente la 1uente de relo e9terna, se detiene el
1uncionamiento del dispositi%o, deando todos los datos intactos& -espu"s de
reiniciar el relo e9terno, el dispositi%o sigue 1uncionando como si no $u5iera
pasado nada&
O-%&1ADO( E3TE('O E' MODO 14. 3T O 2-
/os modos /P, Q. 2 :+ utili4an un oscilador e9terno como una 1uente de relo cu2a
1recuencia est3 determinada por un cristal de cuar4o o por resonadores cer3micos
conectados a los pines *+C1 2 *+C2& -ependiendo de las caracter7sticas de los
componentes utili4ados, seleccione uno de los siguientes modos#
Mo!o 14 - GAaa potenciaI se utili4a slo para cristal de cuar4o de 5aa
1recuencia& Este modo est3 destinado para tra5aar con cristales de 32&768 T:4
normalmente em5e5idos en los reloes de cristal& Es 13cil de reconocerlos por
sus dimensiones pe0ue8as 2 una 1orma cil7ndrica& !l utili4ar este modo el
consumo de corriente ser3 menor 0ue en los dem3s modos&
Mo!o 3T se utili4a para cristales de cuar4o de 1recuencias intermedias $asta 8
M:4& El consumo de corriente es media en comparacin con los dem3s modos&
Mo!o 2- - G!lta %elocidadI se utili4a para cristales de relo de 1recuencia m3s
alta de 8 M:4& !l utili4ar este modo el consumo de corriente ser3 ma2or 0ue en
los dem3s modos&
(E-O'ADO(E- %E(VM&%O- E' MODO 3T O 2-
/os resonadores cer3micos son similares a los cristales de cuar4o seg6n sus
caracter7sticas, por lo 0ue se conectan de la misma manera& ! di1erencia de los cristales
de cuar4o, son m3s 5aratos 2 los osciladores 0ue $acen uso de ellos son de calidad m3s
5aa& +e utili4an para las 1recuencias de relo entre 1;; ]:4 2 2; M:4&
O-%&1ADO( E3TE('O E' MODO- (% 5 (%&O
El uso de los elementos para esta5ili4ar la 1recuencia sin duda alguna tiene muc$as
%entaas, pero a %eces realmente no es necesario& En la ma2or7a de casos el oscilador
puede 1uncionar a 1recuencias 0ue no son precisamente de1inidas, as7 0ue ser7a una
p"rdida de dinero em5e5er tales elementos& /a solucin m3s simple 2 m3s 5arata es
estas situaciones es utili4ar una resistencia 2 un capacitor para el 1uncionamiento del
oscilador& :a2 dos modos#
Mo!o (%. Cuando el oscilador e9terno se con1igura a 1uncionar en modo )C, el pin
*+C1 de5e estar conectado al circuito )C como se muestra en la 1igura a la derec$a& /a
se8al de 1recuencia del oscilador )C di%idida por 4 est3 disponi5le en el pin *+C2& Esta
se8al se puede utili4ar para la cali5racin, sincroni4acin o para otros propsitos&
Mo!o (%&O. -e manera similar, el circuito )C est3 conectado al pin *+C1& Esta %e4,
el pin *+C2 est3 disponi5le para ser utili4ado como pin de ER+ de propsito general&
En am5os casos se le recomienda utili4ar los componentes como se muestra en la 1igura&
/a 1recuencia de este oscilador se calcula por medio de la 1rmula 1 J 1R. seg6n la 0ue#
1 J 1recuencia X:4YV
. J ) E C J constante de tiempo XsYV
) J resistencia el"ctrica XtYV 2
C J capacitancia del condensador XFY&
MODOS DE RELO# INTERNO
El circuito del oscilador interno consiste en dos osciladores separados 0ue se pueden
seleccionar como la 1uente del relo del microcontrolador#
El oscilador 2<&'TO-% est3 cali5rado de 135rica 2 1unciona a 8M$4& /a 1recuencia de
este oscilador se puede con1igurar por el usuario por medio de so1tSare utili4ando los
5its del registro *+C.?'E&
El oscilador 1<&'TO-% no est3 cali5rado de 135rica 2 1unciona a 31]:4&
+imilar al oscilador e9terno, el interno tam5i"n puede 1uncionar en %arios modos& El
modo de 1uncionamiento se selecciona de la misma manera 0ue en el oscilador e9terno -
por medio de los 5its 0ue 1orman 9alabra de configuracin& En otras pala5ras, todo se
lle%a a ca5o dentro del so1tSare de PC antes de escri5ir un programa en el
microcontrolador&
O-%&1ADO( &'TE('O E' MODO &'TO-%
En este modo, el pin *+C1 est3 disponi5le para ser utili4ado como pin de ER+ de
propsito general& /a se8al de 1recuencia del oscilador interno di%idida por 4 est3
disponi5le en el pin *+C2&
O-%&1ADO( &'TE('O E' MODO &'TO-%&O
En este modo, los dos pines est3n disponi5les como pines de ER+ de propsito general&
CONFIGURACIN DEL OSCILADOR INTERNO
El oscilador interno consiste en dos circuitos separados#
1& El oscilador interno de alta 1recuencia :FI'.*+C est3 conectado al post-escalador
Gdi%isor de 1recuenciasI& Est3 cali5rado de 135rica 2 1unciona a 8 M$4& !l utili4ar el
post-escalador, este oscilador puede producir una se8al de relo a una de siete
1recuencias& /a seleccin de 1recuencia se reali4a dentro del so1tSare utili4ando los
pines I)CF2, I)CF1 2 I)CF; del registro *+CC*'&
El :FI'.*+C est3 $a5ilitado al seleccionar una de siete 1recuencias Gentre 8 M$4 2
12L ]:4I 2 poner a uno el 5it de la 1uente de relo del sistema G+C+I del registro
*+CC*'& Como se muestra en la siguiente 1igura , todo el procedimiento se reali4a por
medio de los 5its del registro *+CC*'&
2& El oscilador de 5aa 1recuencia /FI'.*+C no est3 cali5rado de 135rica 2 1unciona a
31 ]:4& Est3 $a5ilitado al seleccionar la 1recuencia G5its del registro *+CC*'I 2 poner
a uno el 5it +C+ del mismo registro&
MODO DE CAMBIO AUTOM!TICO DE VELOCIDAD DE RELO# (T"O-
SPEED CLOC> START-UP MODE)
El modo de cam5io autom3tico de %elocidad de relo se utili4a para reducir el consumo
de corriente cuando el microcontrolador 1unciona en modo de reposo& <-e 0u" se trata
todo esto=
Cuando se con1igura en modo /P, Q. o :+, el oscilador e9terno se desacti%a al pasar a
modo de reposo para reducir el consumo de corriente total del dispositi%o& Cuando se
cumplen las condiciones de kdespertamientok, el microcontrolador no se pone a
1uncionar inmediatamente puesto 0ue tiene 0ue esperar a 0ue se esta5ilice la 1recuencia
de se8al de relo& Este tiempo muerto dura e9actamente 1;24 pulsos, despu"s de 0ue el
microcontrolador contin6a con la eecucin del programa& El caso es 0ue se eecutan
slo unas pocas instrucciones antes de 0ue el microcontrolador %uel%a al modo de
reposo&
Eso signi1ica 0ue la ma2or7a de tiempo as7 como la ma2or7a de corriente de 5ater7as se
$a perdido en %ano& El caso se soluciona utili4ando el oscilador interno para eecutar el
programa durante la duracin de 1;24 pulsos& .an pronto como se esta5ilice la
1recuencia del oscilador e9terno, "l retoma autom3ticamente kel papel principalk& .odo
el procedimiento se $a5ilita al poner a uno el 5it de pala5ra de con1iguracin& Para
programar el microcontrolador, es necesario seleccionar la opcin Int-E9t +Sitc$o%er
Gconmutacin internaRe9ternaI por so1tSare&
MONITOR PARA DETECTAR UN FALLO DE LA FUENTE DE RELO#
(FAIL-SAFE CLOC> MONITOR)
Como indica su nom5re, el monitor para detectar un 1allo de la 1uente de relo GFail-+a1e
Cloc] Monitor - F+CMI monitorea el 1uncionamiento e9terno 2 permite al
microcontrolador continuar con la eecucin de programa en caso de 0ue el oscilador
1alle por alguna ra4n& En tal caso, el oscilador interno toma su 1uncin&
El monitor detecta un 1allo al comparar las 1uentes de relo interno 2 e9terno& +i los
pulsos del oscilador e9terno tardan m3s de 2m+ en llegar, la 1uente de relo ser3
autom3ticamente cam5iada por la interna& !s7, el oscilador interno sigue 1uncionando
controlado por los 5its del registro *+CC*'& +i el 5it *+FIE del registro PIE2 est3 a
uno, se producir3 una interrupcin&
El relo interno sigue siendo la 1uente del relo del sistema $asta 0ue el dispositi%o
reinicie con "9ito el oscilador e9terno 0ue %uel%e a ser la 1uente de relo del sistema& -e
manera similar a casos anteriores, este mdulo est3 $a5ilitado al cam5iar la pala5ra de
con1iguracin ustamente antes de 0ue se inicie el proceso de programar el c$ip& Esta
%e4, esto se reali4a al seleccionar la opcin Fail-+a1e Cloc] Monitor&
R$,3)&/0 OSCTUNE
/os cam5ios del registro *+C.?'E a1ectan a la 1recuencia del oscilador :FI'.*+C,
pero no a la 1recuencia del /FI'.*+C& 'o $a2 ninguna indicacin de 0ue $a2a
ocurrido despla4amiento de 1recuencia durante el 1uncionamiento del microcontrolador&
T)'J - T)'T <reEuenc; Tuning 9its. G5its de cali5rar la 1recuenciaI& !l com5inar
estos cinco 5its, la 1recuencia del oscilador de 8M$4 se reduce o se aumenta& -e este
modo, las 1recuencias o5tenidas por la di%isin en el post-escalador cam5ian tam5i"n&
T)'J T)' T)'+ T)'1 T)'T <recuencia
; 1 1 1 1 M39ima
; 1 1 1 ;
; 1 1 ; 1


; ; ; ; 1
; ; ; ; ; Cali5rada
1 1 1 1 1


1 ; ; 1 ;
1 ; ; ; 1
1 ; ; ; ; M7nima
La EE9HI7 es un segmento de memoria separado, ue no pertenece a la memoria de
programa 'HI7(, tampoco a la memoria de datos 'H!7(. !unue a estas localidades
de memoria no se les puede acceder f"cil & r"pidamente, su propsito es insustituible.
Los datos almacenados en la EE79HI7 est"n permanentemente guardados incluso al
apagar la fuente de alimentacin, & pueden ser cambiados en cualuier momento. 9or
estas caractersticas excepcionales cada b&te de la EE9HI7 se considera valioso.
.11 MEMO(&A EE4(OM
El microcontrolador PIC16F887 dispone de 2L6 localidades de memoria EEP)*M
controlados por los 5its de los siguientes registros#
EEC*'1 Gregistro de controlIV
EEC*'2 Gregistro de controlIV
EE-!. Galmacena los datos listos para escritura 2 lecturaIV 2
EE!-) Galmacena la direccin de la EEP)*M a la 0ue se accedeI&
!dem3s, el registro EEC*'2 no es un registro %erdadero, no e9iste 17sicamente en el
c$ip& +e utili4a slo durante la escritura de los datos en la memoria&
/os registros EE-!.: 2 EE!-): se utili4an durante la escritura 2 lectura de la
EEP)*M& /os dos se utili4an tam5i"n durante la escritura 2 lectura de la memoria de
programa GF/!+:I&
Por considerar esto una 4ona de riesgo Gpor supuesto usted no 0uiere 0ue el
microcontrolador 5orre su propio programa por casualidadI, no %amos a discutirlo a0u7,
no o5stante le a%isamos 0ue tenga cuidado&
R$,3)&/0 EECONA
EE4=D - 4rogram/Data EE4(OM -elect 9it G5it de seleccin de memoriasI
1 - !cceso a la memoria Flas$ de programa&
; - !cceso a la memoria de datos EEP)*M&
N(E(( - EE4(OM Error <lag 9it G5it de error de escrituraI
1 - +e produce un error de escritura de 1orma prematura 2 $a ocurrido un error&
; - +e $a completado la operacin de escritura&
N(E' - EE4(OM Nrite Ena9le 9it G5it de $a5ilitacin de escrituraI
1 - Escritura de datos en la EEP)*M $a5ilitada&
; - Escritura de datos en la EEP)*M des$a5ilitada&
N( - Nrite %ontrol 9it G5it de control de escrituraI
1 - +e $a iniciado una operacin de escritura de datos en la EEP)*M&
; - +e $a completado una operacin de escritura de datos en la EEP)*M&
(D - (ea! %ontrol 9it G5it de control de lecturaI
1 - Inicia una lectura de la memoria EEP)*M&
; - /ectura de la memoria EEP)*M des$a5ilitada&
LECTURA DE LA MEMORIA EEPROM
Para leer los datos de la memoria EEMP)*M, siga los siguientes pasos#
4aso 1# Escri5ir la direccin G;;$ - FF$I en el registro EE!-)&
4aso +# +eleccionar el 5lo0ue de memoria EEP)*M al poner a cero el 5it
EEP[- del registro EEC*'1&
4aso # Poner a uno el 5it )- del mismo registro para leer el contenido de la
localidad&
4aso J# El dato se almacena en el registro EE-!. 2 est3 listo para su uso&
El siguiente eemplo muestra el procedimiento anteriormente descrito al escri5ir un
programa en lenguae ensam5lador#
BSF STATUS,RP1 ;
BCF STATUS,RP0 ; Acceder al banco 2
MOVF ADDRESS,W ; Mover la direccin al registro W
MOVWF EEADR ; Escribir la direccin
BSF STATUS,RP0 ; Acceder al banco 3
BCF EECON1,EEPGD ; Seleccionar la EEPROM
BSF EECON1,RD ; Leer los datos
BCF STATUS,RP0 ; Acceder al banco 2
MOVF EEDATA,W ; Dato se almacena en el registro W
/a misma secuencia de programa escrita en C se parece a lo siguiente#
W = EEPROM_Read(ADDRESS);
/as %entaas del uso del lenguae C se $an $ec$o m3s o5%ias, no lo cree=
ESCRITURA EN LA MEMORIA EEPROM
!ntes de escri5ir los datos en la memoria EEP)*M es necesario escri5ir la direccin en
el registro EE+!-) 2 los datos en el registro EE+!.& +lo $a 0uedado seguir a una
secuencia especial para iniciar la escritura para cada 52te& -urante el proceso de
escritura las interrupciones de5en estar des$a5ilitadas&
El eemplo 0ue sigue muestra el procedimiento anteriormente descrito al escri5ir un
programa en lenguae ensam5lador#
BSF STATUS,RP1
BSF STATUS,RP0
BTFSC EECON,WR1 ; Esperar a que se complete la escritura anterior
GOTO $-1 ;
BCF STATUS,RP0 ; Banco 2
MOVF ADDRESS,W ; Mover la direccin a W
MOVWF EEADR ; Escribir la direccin
MOVF DATA,W ; Mover los datos a W
MOVWF EEDATA ; Escribir los datos
BSF STATUS,RP0 ; Banco 3
BCF EECON1,EEPGD ; Seleccionar la EEPROM
BSF EECON1,WREN ; Escritura a la EEPROM habilitada
BCF INCON,GIE ; Todas las interrupciones deshabilitadas
MOVLW 55h
MOVWF EECON2
MOVLW AAh
MOVWF EECON2
BSF EECON1,WR
BSF INTCON,GIE ; Interrupciones habilitadas
BCF EECON1,WREN ; Escritura a la EEPROM deshabilitada
/a misma secuencia de programa escrita en C se parece a lo siguiente#
W = EEPROM_Write(ADDRESS, W);
'o $ace 1alta comentar nada&
/amos a hacerlo en mikro%...
// El ejemplo muestra cmo utilizar la librera EEPROM en el
compilador mikroC PRO for PIC.
char ii; // La variable ii utilizada en el bucle
void main(){
ANSEL = 0; // Configuracin de los pines AN
como E/S digitales
ANSELH = 0;
PORTB = 0;
PORTC = 0;
PORTD = 0;
TRISB = 0;
TRISC = 0;
TRISD = 0;
for(ii = 0; ii < 32; ii++) // Llenar el bfer con los datos
EEPROM_Write(0x80+ii, ii); // Escribir los datos en la
direccin 0x80+ii
EEPROM_Write(0x02,0xAA); // Escribir un dato en la direccin
2 de la EEMPROM
EEPROM_Write(0x50,0x55); // Escribir un dato en la direccin
0x50

// de la EEMPROM
Delay_ms(1000); // Diodos en los puertos PORTB y
PORTC
PORTB = 0xFF; // para indicar el comienzo de la
lectura
PORTC = 0xFF;
Delay_ms(1000);
PORTB = 0x00;
PORTC = 0x00;
Delay_ms(1000);
PORTB = EEPROM_Read(0x02); // Leer los datos de la direccin 2
de la EEPROM y

// visualizarla en el puerto PORB
PORTC = EEPROM_Read(0x50); // Leer los datos de la direccin
0x50 de la EEPROM y

// visualizarla en el puerto PORC
Delay_ms(1000);

for(ii = 0; ii < 32; ii++) { // Leer el bloque de 32 bytes de la
direccin
PORTD = EEPROM_Read(0x80+ii); // 0x80 y visualizarla en el puerto
PORTD
Delay_ms(250);
}
}
!primera vista, basta con encender una fuente de alimentacin para hacer funcionar
un microcontrolador. ! primera vista, basta con apagar una fuente de alimentacin
para detenerlo. #lo a primera vista. En realidad, el arranue & el final del
funcionamiento son las fases crticas de las ue se encarga una seal especial
denominada HE#E8.
.1+ X(E&'&%&OY C01A%L-O)T. 0(ON'-O)T O
()&DO-D
!l producirse un reinicio el microcontrolador detiene su 1uncionamiento
inmediatamente 2 5orra sus registros& ?na se8al de reinicio se puede generar
e9ternamente en cual0uier momento Gni%el lgico 5ao en el pin MC/)I& +i se necesita,
una se8al tam5i"n puede ser generada por la lgica de control interna& !l encender una
1uente de alimentacin siempre se produce un reinicio& Por muc$os e%entos de
transicin 0ue ocurren al encender una 1uente de alimentacin Gcentelleos 2 1ogona4os
de contactos el"ctricos en interruptores, su5ida de %oltae lenta, esta5ili4acin de la
1recuencia de se8al de relo graduada etc&I es necesario proporcionar un cierto tiempo
muerto antes de 0ue el microcontrolador se ponga a 1uncionar& -os tempori4adores
internos PW). 2 *+. se encargan de eso& El PW). puede estar $a5ilitadoR
des$a5ilitado durante el proceso de escri5ir un programa& Kamos a %er cmo 1unciona
todo&
Cuando el %oltae de la 1uente de alimentacin alcan4a entre 1&2 2 1&7K, un circuito
denominado tempori4ador de arran0ue GPoSer-up timerI mantiene al microcontrolador
reiniciado durante unos 72m+& .an pronto como transcurra el tiempo, otro tempori4ador
denominado tempori4ador de encendido del oscilador G*scillator start-up timerI genera
otra se8al de reinicio durante la duracin de 1;24 per7odos del oscilador de cuar4o& !l
e9pirar el tiempo muerto Gmarcado con )eset . en la FiguraI 2 al poner a alto el pin
MC/), todas las condiciones se $an cumplido 2 el microcontrolador se pone a eecutar
la primera instruccin en el programa&
!parte de este reinicio kcontroladok 0ue ocurre al encender una 1uente de alimentacin,
$a2 dos tipos de reinicio denominados Alac]-out 2 AroSn-out 0ue pueden producirse
durante el 1uncionamiento del microcontrolador as7 como al apagar una 1uente de
alimentacin&
REINICIO BLAC>-OUT
El reinicio 5lac] out ocurre al apagar una 1uente de alimentacin correctamente& El
microcontrolador no tiene tiempo para $acer nada impre%isi5le puesto 0ue el %oltae cae
mu2 r3pidamente por de5ao de su %alor m7nimo& En otras pala5ras, >se apaga la lu4, las
cortinas 5aan 2 el espect3culo $a terminado@
REINICIO BRO"N-OUT
Cuando el %oltae de la 1uente de alimentacin cae lentamente Gun eemplo t7pico es
descarga de 5ater7as, aun0ue el microcontrolador e9perimentar7a unas ca7das muc$o
m3s r3pidas como un proceso lentoI los componentes internos detienen su
1uncionamiento gradualmente 2 ocurre el as7 llamado reinicio AroSnout& En tal caso,
antes de 0ue el microcontrolador detenga su 1uncionamiento completamente, $a2 un
peligro real de 0ue los circuitos 0ue 1uncionan a 1recuencias altas se pongan a 1uncionar
de 1orma impre%isi5le& El reinicio 5roSn-out puede causar cam5ios 1atales en el
programa 2a 0ue se almacena en la memoria 1las$ incorporada en el c$ip&
RUIDO EL;CTRICO
Es un tipo especial del reinicio AroSnout 0ue ocurre en un am5iente industrial cuando
%oltae de alimentacin BparpadeaC por un momento 2 cae por de5ao del %alor m7nimo&
!un0ue es corto, este ruido producido en una l7nea de conduccin el"ctrica puede
a1ectar des1a%ora5lemente al 1uncionamiento del dispositi%o&
PIN MCLR
?n cero lgico G;I al pin MC/) causa un reinicio inmediato 2 regular& Es recomenda5le
conectarlo de la 1orma mostrada en la Figura a la derec$a& /a 1uncin de los
componentes adicionales es de mantener un uno lgico kpurok durante el
1uncionamiento normal& +i sus %alores se seleccionan de manera 0ue proporcionen un
ni%el lgico alto en el pin despu"s de 0ue $a2a transcurrido el tiempo muerto reset ., el
microcontrolador se pondr3 a 1uncionar inmediatamente& Esto puede ser mu2 6til
cuando se necesita sincroni4ar el 1uncionamiento del microcontrolador con los
componentes adicionales o con el 1uncionamiento de %arios microcontroladores&
Para e%itar posi5les errores al producirse el reinicio AroSn-out, el PIC 16F887 tiene un
Bmecanismo de proteccinC incorporado& Es un circuito simple, pero e1ica4 0ue
reacciona cada %e4 0ue el %oltae de alimentacin cae por de5ao de 4K Gsi se utili4a un
%oltae de alimentacin de LKI 2 mantiene este ni%el de %oltae por m3s de 1;;
microsegundos& Este circuito genera una se8al despu"s de 0ue todo el microcontrolador
1uncionar3 como si $u5iera sido encendido por primera %e4&
%apitulo J: EIemplos
El propsito de este captulo es de proporcionar la informacin b"sica ue necesita
saber para ser capaz de utilizar microcontroladores con xito en la pr"ctica. 9or eso,
este captulo no contiene ning:n programa mu& elaborado, tampoco dispone de un
esuema de dispositivo con soluciones extraordinarias. 9or el contrario, los siguientes
eJemplos son la meJor prueba de ue escribir un programa no es un privilegio ni cosa
de talento, sino una habilidad de ;poner las piezas Juntas del rompecabezas< al utilizar
directivas. 8enga la seguridad de ue el diseo & el desarrollo de los dispositivos
generalmente siguen al mtodo ;probar)corregir)repetir<. 9or supuesto, cu"nto m"s
ahonde sobre el tema, m"s se complica, &a ue tanto los nios como los aruitectos de
primera lnea, ponen las piezas Juntas del rompecabezas.
4&1 C*'EQIU' A\+IC!
4&2 C*MP*'E'.E+ !-ICI*'!/E+
4&3 E^EMP/* 1 - Escri5ir ca5ecera, con1igurar pines de ER+, utili4ar la 1uncin
-ela2 2 el operador +Sitc$
4&4 E^EMP/* 2 - ?tili4ar instrucciones en ensam5lador 2 el oscilador interno
/FI'.*+C&&&
4&L E^EMP/* 3 - .imer; como un contador, declarar %aria5les nue%as,
constantes de enumeracin, utili4ar rel"s&&&
4&6 E^EMP/* 4 - ?tili4ar los tempori4adores .imer;, .imer1 2 .imer2&
4&7 E^EMP/* L - ?tili4ar el tempori4ador perro - guardi3n
4&8 E^EMP/* 6 - Mdulo CCP1 como generador de se8al PWM
4&H E^EMP/* 7 - ?tili4ar el con%ertidor !R-
4&1; E^EMP/* 8 - ?tili4ar memoria EEP)*M
4&11 E^EMP/* H - Contador de dos d7gitos /E-, multiple9in
4&12 E^EMP/* 1; - ?tili4ar el %isuali4ador /C-
4&13 E^EMP/* 11 - Comunicacin serial )+-232
4&14 E^EMP/* 12 - Medicin de temperatura por medio del sensor -+182;&
?so del protocolo i1-Sirei&&&
4&1L E^EMP/* 13 - [eneracin de sonido, li5rer7a de sonido&&&
4&16 E^EMP/* 14 - ?tili4ar el %isuali4ador /C- gr31ico
4&17 E^EMP/* 1L - ?tili4ar el panel t3ctil&&&
J.1 %O'E3&*' 0V-&%A
Para 0ue un microcontrolador 1uncione apropiadamente es necesario proporcionar lo
siguiente#
!limentacinV
+e8al de reinicioV 2
+e8al de relo&
Como se muestra en la 1igura anterior, se trata de circuitos simples, pero no tiene 0ue
ser siempre as7& +i el dispositi%o destino se utili4a para controlar las m30uinas caras o
para mantener 1unciones %itales, todo se %uel%e muc$o m3s complicado&
ALIMENTACIN
!un0ue el PIC16F887 es capa4 de 1uncionar a di1erentes %oltaes de alimentacin, no es
recomenda5le pro5ar la le2 de Murp$2& /o m3s adecuado es proporcionar un %oltae de
alimentacin de LK -C& Este circuito, mostrado en la p3gina anterior, utili4a un
regulador de %oltae positi%o de tres terminales /M78;L& Es un regulador integrado 2
5arato 0ue proporciona una esta5ilidad de %oltae de alta calidad 2 su1iciente corriente
para $a5ilitar el 1uncionamiento apropiado del controlador 2 de los peri1"ricos Ga0u7
su1iciente signi1ica una corriente de 1!I&
SEIAL DE REINICIO
Para 0ue un microcontrolador pueda 1uncionar apropiadamente, un uno lgico GKCCI se
de5e colocar en el pin de reinicio& El 5otn de presin 0ue conecta el pin MC/) a ['-
no es necesario& +in em5argo, este 5otn casi siempre est3 proporcionado 2a 0ue
$a5ilita al microcontrolador %ol%er al modo normal de 1uncionamiento en caso de 0ue
algo salga mal& !l pulsar so5re el 5otn )E+E., el pin MC/) se lle%a un %oltae de
;K, el microcontrolador se reinicia 2 la eecucin de programa comien4a desde el
principio& ?na resistencia de 1;] se utili4a para impedir un corto circuito a tierra al
presionar este 5otn&
SEIAL DE RELO#
! pesar de tener un oscilador incorporado, el microcontrolador no puede 1uncionar sin
componentes e9ternos 0ue esta5ili4an su 1uncionamiento 2 determinan su 1recuencia
G%elocidad de operacin del microcontroladorI& -ependiendo de los elementos
utili4ados as7 como de las 1recuencias el oscilador puede 1uncionar en cuatro modos
di1erentes#
/P - Cristal de 5ao consumoV
Q. - Cristal R )esonadorV
:+ - CristalR)esonador de alta %elocidadV 2
)C - )esistencia R Condensador&
<Por 0u" son estos modos importantes= Como es casi imposi5le construir un oscilador
esta5le 0ue 1uncione a un amplio rango de 1recuencias, el microcontrolador tiene 0ue
Bsa5erC a 0u" cristal est3 conectado, para poder austar el 1uncionamiento de sus
componentes internos& Psta es la ra4n por la 0ue todos los programas utili4ados para
escri5ir un programa en el c$ip contienen una opcin para seleccionar el modo de
oscilador& Kea la 1igura de la i40uierda&
C/3)&'+ *$ 2-'/?0
!l utili4ar el cristal de cuar4o para esta5ili4ar la 1recuencia, un oscilador incorporado
1unciona a una 1recuencia determinada, 2 no es a1ectada por los cam5ios de temperatura
2 de %oltae de alimentacin& Esta 1recuencia se eti0ueta normalmente en el encapsulado
del cristal& !parte del cristal, los condensadores C1 2 C2 de5en estar conectados como
se muestra en el siguiente es0uema& +u capacitancia no es de gran importancia& Por eso,
los %alores proporcionados en la siguiente ta5la se de5en tomar como recomendacin 2
no como regla estricta&
R$)0%'*0/ 2$/71320
?n resonador cer3mico es m3s 5arato 2 mu2 similar a un cuar4o por la 1uncin 2 el
modo de 1uncionamiento& Por esto, los es0uemas 0ue muestran su cone9in al
microcontrolador son id"nticos& 'o o5stante, los %alores de los condensadores di1ieren
un poco de5ido a las di1erentes caracter7sticas el"ctricas& )e1i"rase a la ta5la 0ue est3 a
continuacin&
Estos resonadores se conectan normalmente a los osciladores en caso de 0ue no sea
necesario proporcionar una 1recuencia e9tremadamente precisa&
O)23+'*0/ RC
+i la 1recuencia de operacin no es de importancia, entonces no es necesario utili4ar los
componentes caros 2 adicionales para la esta5ili4acin& En %e4 de eso, 5asta con utili4ar
una simple red )C, mostrada en la siguiente 1igura& Como a0u7 es utili4ada slo la
entrada del oscilador local, la se8al de relo con la 1recuencia FoscR4 aparecer3 en el pin
*+C2& Psta es la 1recuencia de operacin del microcontrolador, o sea la %elocidad de
eecucin de instrucciones&
O)23+'*0/ $J&$/%0
+i se re0uiere sincroni4ar el 1uncionamiento de %arios microcontroladores o si por
alguna ra4n no es posi5le utili4ar ninguno de los es0uemas anteriores, una se8al de
relo se puede generar por un oscilador e9terno& )e1i"rase a la siguiente 1igura&
!pesar del hecho de ue el microcontrolador es un producto de la tecnologa moderna,
no es tan :til sin estar conectado a los componentes adicionales. Eicho 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.
J.+ %OM4O'E'TE- AD&%&O'A1E-
Esta parte trata los componentes adicionales utili4ados con m3s 1recuencia en la
pr3ctica, tales como resistencias, transistores, diodos /E-, %isuali4adores /E-,
%isuali4adores /C- 2 los circuitos de comunicacin )+-232&
INTERRUPTORES Y BOTONES DE PRESIN
/os interruptores 2 los 5otones de presin son los dispositi%os simples para
proporcionar la 1orma m3s simple de detectar la aparicin de %oltae en un pin de
entrada del microcontrolador& 'o o5stante, no es tan simple como parece&&& Es por un
re5ote de contacto& El re5ote de contacto es un pro5lema com6n en los interruptores
mec3nicos&
!l tocarse los contactos, se produce un re5ote por su inercia 2 elasticidad& Por
consiguiente, la corriente el"ctrica es r3pidamente pulsada en lugar de tener una clara
transicin de cero a la corriente m39ima& Por lo general, esto ocurre de5ido a las
%i5raciones, los desni%eles sua%es 2 la suciedad entre los contactos& Este e1ecto no se
perci5e normalmente al utili4ar estos componentes en la %ida cotidiana por0ue el re5ote
ocurre demasiado r3pido para a1ectar a la ma2or7a de los dispositi%os el"ctricos& +in
em5argo, pueden surgir pro5lemas en algunos circuitos lgicos 0ue responden lo
su1icientemente r3pido de manera 0ue malinterpreten los pulsos producidos al tocarse
los contactos como un 1luo de datos& -e todos modos, el proceso entero no dura muc$o
Gunos pocos micro - o milisegundosI, pero dura lo su1iciente para 0ue lo detecte el
microcontrolador& !l utili4ar slo un 5otn de presin como una 1uente de se8al de
contador, en casi 1;;O de los casos ocurren los errores&
El pro5lema se puede resol%er con 1acilidad al conectar un simple circuito )C para
suprimir r3pidos cam5ios de %oltae& Como el per7odo del re5ote no est3 de1inido, los
%alores de los componentes no est3n precisamente determinados& En la ma2or7a de los
casos es recomenda5le utili4ar los %alores 0ue se muestran en la siguiente 1igura&
+i se necesita una esta5ilidad completa, entonces $a2 0ue tomar medidas radicales& /a
salida del circuito, mostrado en la siguiente 1igura G5iesta5le )+, tam5i"n llamado 1lip
1lop )+I, cam5iar3 de estado lgico despu"s de detectar el primer pulso producido por
un re5ote de contacto& Esta solucin es m3s cara Ginterruptor +P-.I, pero el pro5lema
es resuelto&
!parte de estas soluciones de $ardSare, $a2 tam5i"n una simple solucin de so1tSare&
Mientras el programa prue5a el estado de circuito lgico de un pin de entrada, si detecta
un cam5io, $a2 0ue pro5arlo una %e4 m3s despu"s de un cierto tiempo de retardo& +i el
programa con1irma el cam5io, esto signi1ica 0ue un interruptorR5otn de presin $a
cam5iado de posicin& /as %entaas de esta solucin son o5%ias# es gratuita, se 5orran
los e1ectos del re5ote de contacto 2 se puede aplicar a los contactos de una calidad m3s
5aa tam5i"n&
REL;
?n rel" es un interruptor el"ctrico 0ue se a5re 2 se cierra 5ao el control de otro circuito
electrnico& Por eso est3 conectado a los pines de salida del microcontrolador 2 utili4ado
para encenderRapagar los dispositi%os de alto consumo tales como# motores,
trans1ormadores, cale1actores, 5om5illas etc& Estos dispositi%os se colocan casi siempre
leos de los componentes sensi5les de la placa& :a2 %arios tipos de rel"s, pero todos
1uncionan de la misma manera& !l 1luir la corriente por la 5o5ina, el rel" 1unciona por
medio de un electromagneto, a5riendo 2 cerrando uno o m3s conunto de contactos&
+imilar a los optoacopladores no $a2 cone9in gal%3nica Gcontacto el"ctricoI entre los
circuitos de entrada 2 salida& /os rel"s re0uieren con 1recuencia tanto un %oltae m3s
alto 2 una corriente m3s alta para empe4ar a 1uncionar& .am5i"n $a2 rel"s miniatura 0ue
se pueden poner en marc$a por una corriente 5aa o5tenida directamente de un pin del
microcontrolador&
/a 1igura 0ue sigue muestra la solucin utili4ada con m3s 1recuencia&
Para pre%enir la aparicin de un alto %oltae de autoinduccin, causada por una parada
repentina del 1luo de corriente por la 5o5ina, un diodo polari4ado in%ertido se conecta
en paralelo con la 5o5ina& El propsito de este diodo es de BcortarC este pico de %oltae&
DIODOS LED
Pro5a5lemente sepa todo lo 0ue necesita sa5er so5re los diodos /E-, pero tam5i"n de5e
pensar en los %enes&&& ! %er, <cmo destruir un /E-= Aueno&&&mu2 13cil&
Fuemar con rapi!e:
Como cual0uier otro diodo, los /E-s tienen dos puntas - un 3nodo 2 un c3todo&
Conecte un diodo apropiadamente a la 1uente de alimentacin 2 %a a emitir lu4 sin
ning6n pro5lema& Ponga al diodo al re%"s 2 con"ctelo a la misma 1uente de alimentacin
Gaun0ue sea por un momentoI& 'o emitir3 lu4 - >nunca m3s@
Fuemar lentamente
:a2 un l7mite de corriente nominal, o sea, l7mite de corriente m39ima especi1icada para
cada /E- 0ue no se de5er3 e9ceder& +i eso sucede, el diodo emitir3 lu4 m3s intensi%a,
pero slo por un per7odo corto de tiempo&
Algo para recor!ar
-e manera similar, todo lo 0ue tiene 0ue $acer es elegir una resistencia para limitar la
corriente mostrada a continuacin& -ependiendo de %oltae de alimentacin, los e1ectos
pueden ser espectaculares&
VISUALIADOR LED
A3sicamente, un %isuali4ador /E- no es nada m3s 0ue %arios diodos /E- moldeados
en la misma caa pl3stica& :a2 %arios tipos de los %isuali4adores 2 algunos de ellos est3n
compuestos por %arias docenas de diodos incorporados 0ue pueden %isuali4ar di1erentes
s7m5olos& 'o o5stante, el %isuali4ador utili4ado con m3s 1recuencia es el %isuali4ador de
7 segmentos& Est3 compuesto por 8 /E-s& /os siete segmentos de un d7gito est3n
organi4ados en 1orma de un rect3ngulo para %isuali4ar los s7m5olos, mientras 0ue el
segmento adicional se utili4a para el propsito de %isuali4ar los puntos decimales& Para
simpli1icar la cone9in, los 3nodos 2 los c3todos de todos los diodos se conectan al pin
com6n as7 0ue tenemos %isuali4adores de 3nodo com6n 2 %isuali4adores de c3todo
com6n, respecti%amente& /os segmentos est3n eti0uetados con letras de a a g 2 dp,
como se muestra en la siguiente 1igura& !l conectarlos, cada diodo /E- se trata por
separado, lo 0ue signi1ica 0ue cada uno dispone de su propia resistencia para limitar la
corriente&
!0u7 le presentamos unas cosas importantes a las 0ue de5e prestar atencin al comprar
un %isuali4ador /E-#
Como $emos mencionado, dependiendo de si 3nodos o c3todos est3n conectados
al pin com6n, tenemos %isuali4adores de 3nodo com6n 2 %isuali4adores de
c3todo com6n& Kisto de a1uera, parece 0ue no $a2 ninguna di1erencia entre estos
%isuali4adores, pues se le recomienda compro5ar cu3l se %a a utili4ar antes de
instalarlo&
Cada pin del microcontrolador tiene un l7mite de corriente m39ima 0ue puede
reci5ir o dar& Por eso, si %arios %isuali4adores est3n conectados al
microcontrolador, es recomenda5le utili4ar as7 llamados /E-s de Aao consumo
0ue utili4an solamente 2m! para su 1uncionamiento&
/os segmentos del %isuali4ador est3n normalmente eti0uetados con letras de a a
g, pero no $a2 ninguna regla estrictaa cu3les pines del %isuali4ador estar3n
conectados& Por eso es mu2 importante compro5arlo antes de empe4ar a escri5ir
un programa o dise8ar un dispositi%o&
/os %isuali4adores conectados al microcontrolador normalmente ocupan un gran
n6mero de los pines de ER+ %aliosos, lo 0ue puede ser un pro5lema so5re todo cuando se
necesita %isuali4ar los n6meros compuestos por %arios d7gitos& El pro5lema se %uel%e
m3s o5%io si, por eemplo, se necesita %isuali4ar dos n6meros de seis d7gitos Gun simple
c3lculo muestra 0ue en este caso se necesitan H6 pines de salidaI& /a solucin de este
pro5lema es denominada multiple9in&
!0u7 es cmo se $a $ec$o una ilusin ptica 5asada en el mismo principio de
1uncionamiento como una c3mara de pel7cula& ?n slo d7gito est3 acti%o a la %e4, pero
se tiene la impresin de 0ue todos los d7gitos de un n6mero est3n simult3neamente
acti%os por cam5iar tan r3pidamente de las condiciones de encendidoRapagado&
Keamos la 1igura anterior& Primero se aplica un 52te 0ue representa unidades al puerto
P*).2 del microcontrolador 2 se acti%a el transistor .1 a la %e4& -espu"s de poco
tiempo, el transistor .1 se apaga, un 52te 0ue representa decenas se aplica al puerto
P*).2 2 el transistor .2 se acti%a& Este proceso se est3 repitiendo c7clicamente a alta
%elocidad en todos los d7gitos 2 transistores correspondientes&
/o decepcionante es 0ue el microcontrolador es slo un tipo de computadora miniatura
dise8ada para interpretar el lenguae de ceros 2 unos, lo 0ue se pone de mani1iesto al
%isuali4ar cual0uier d7gito& Concretamente, el microcontrolador no conoce cmo son
unidades, decenas, centenas, ni die4 d7gitos a los 0ue estamos acostum5rados& Por esta
ra4n, cada n6mero a %isuali4ar de5e pasar por el siguiente procedimiento#
!ntes 0ue nada, un n6mero de %arios d7gitos de5e ser di%idido en unidades, centenas
etc& en una su5rutina espec71ica& /uego, cada de estos d7gitos se de5e almacenar en los
52tes particulares& /os d7gitos se $acen reconoci5les al reali4ar kenmascaramientok& En
otras pala5ras, el 1ormato 5inario de cada d7gito se sustitu2e por una com5inacin
di1erente de los 5its por medio de una su5rutina simple& Por eemplo, el d7gito 8 G;;;;
1;;;I se sustitu2e por el n6mero 5inario ;111 1111 para acti%ar todos los /E-s 0ue
%isuali4an el n6mero 8& El 6nico diodo 0ue 0ueda inacti%o a0u7 est3 reser%ado para el
punto decimal&
+i un puerto del microcontrolador est3 conectado al %isuali4ador de tal manera 0ue el 5it
; acti%e el segmento iai, el 5it 1 acti%e el segmento i5i, el 5it 2 acti%e el segmento ici etc,
entonces la ta5la 0ue sigue muestra la km3scarak para cada d7gito&
DUgitos a
visuali:ar
-egmentos !el vi suali:a!or
dp a 5 c d e 1 g
; ; 1 1 1 1 1 1 ;
1 ; ; 1 1 ; ; ; ;
2 ; 1 1 ; 1 1 ; 1
3 ; 1 1 1 1 ; ; 1
4 ; ; 1 1 ; ; 1 1
L ; 1 ; 1 1 ; 1 1
6 ; 1 ; 1 1 1 1 1
7 ; 1 1 1 ; ; ; ;
8 ; 1 1 1 1 1 1 1
H ; 1 1 1 1 ; 1 1
!dem3s de los d7gitos de ; a H, $a2 algunas letras -!, C, E, ^, F, ?, :, /, 5, c, d, o, r, t -
0ue se pueden %isuali4ar al enmascarar&
En caso de 0ue se utilicen los %isuali4adores de 3nodo com6n, todos los unos contenidos
en la ta5la anterior se de5en sustituir por ceros 2 %ice%ersa& !dem3s, los transistores
P'P se de5en utili4ar como controladores&
OPTOACOPLADORES
?n optoacoplador es un dispositi%o 1recuentemente utili4ado para aislar gal%3nicamente
el microcontrolador de corriente o %oltae potencialmente peligroso de su entorno& /os
optoacopladores normalmente disponen de una, dos o cuatro 1uentes de lu4 Gdiodos
/E-I en su entrada mientras 0ue en su salida, 1rente a los diodos, se encuentra el mismo
n6mero de los elementos sensi5les a la lu4 G1oto-transistores, 1oto-tiristores, 1oto-triacsI&
El punto es 0ue un optoacoplador utili4a una corta ruta de transmisin ptica para
transmitir una se8al entre los elementos de circuito, 0ue est3n aislados el"ctricamente&
Este aislamiento tiene sentido slo si los diodos 2 los elementos 1oto-sensiti%os se
alimentan por separado& !s7, el microcontrolador 2 los componentes adicionales 2 caros
est3n completamente protegidos de alto %oltae 2 ruidos 0ue son la causa m3s 1recuente
de destruccin, da8o 2 1uncionamiento inesta5le de los dispositi%os electrnicos en la
pr3ctica& /os optoacopladores utili4ados con m3s 1recuencia son a0u"llos con 1oto-
transistores en sus salidas& En los optoacopladores con la 5ase conectada al pin 6 interno
Gtam5i"n $a2 optoacopladores sin ellaI, la 5ase puede 0uedarse desconectada&
/a red )RC representada por una l7nea 0ue5rada en la 1igura anterior indica una
cone9in opcional de la 5ase de transistores dentro del optoacoplador, 0ue reduce los
e1ectos de ruidos al eliminar los pulsos mu2 cortos&
VISUALIADOR LCD
Este componente est3 espec71icamente 1a5ricado para ser utili4ado con los
microcontroladores, lo 0ue signi1ica 0ue no se puede acti%ar por los circuitos integrados
est3ndar& +e utili4a para %isuali4ar los di1erentes mensaes en un %isuali4ador de cristal
l70uido miniatura& El modelo descrito a0u7 es el m3s utili4ado en la pr3ctica por su 5ao
precio 2 grandes capacidades& Est3 5asado en el microcontrolador :-4478; G:itac$iI
integrado 2 puede %isuali4ar mensaes en dos l7neas con 16 caracteres cada una& Puede
%isuali4ar todas las letras de al1a5eto, letras de al1a5eto griego, signos de puntuacin,
s7m5olos matem3ticos etc& .am5i"n es posi5le %isuali4ar s7m5olos creados por el
usuario& Entre otras caracter7sticas 6tiles es el despla4amiento autom3tico de mensaes
Ga la i40uierda 2 a la derec$aI, aparicin del cursor, retroiluminacin /E- etc&
4ines !el visuali:a!or 1%D
! lo largo de un lado de una placa impresa pe0ue8a del %isuali4ador /C- se encuentran
los pines 0ue le permiten estar conectado al microcontrolador& :a2 14 pines en total
marcados con n6meros G16 si $a2 retroiluminacinI& +u 1uncin se muestra en la ta5la
0ue sigue#
<unci?n 'Qmero 'om9re Esta!o l?gico Descripci?n
.ierra 1 Kss - ;K
!limentacin 2 Kdd - DLK
Contraste 3 Kee - ; - Kdd
Control de
1uncionamiento
4 )+
;
1
-; r -7 considerados como
comandos
-; r -7 considerados como
datos
L )RW
;
1
Escri5ir los datos Gdel
microcontrolador al /C-I
/eer los datos Gdel /C- al
microcontroladorI
6 E
;
1
.ransicin de
1 a ;
!cceso al %isuali4ador /C-
des$a5ilitado
Funcionamiento normal
-atosRcomandos se est3n
transmitiendo al /C-
-atos R comandos
7 -; ;R1 Ait ; /+A
8 -1 ;R1 Ait 1
H -2 ;R1 Ait 2
1; -3 ;R1 Ait 3
11 -4 ;R1 Ait 4
12 -L ;R1 Ait L
13 -6 ;R1 Ait 6
14 -7 ;R1 Ait 7 M+A
4antalla 1%D
?na pantalla /C- puede %isuali4ar dos l7neas con 16 caracteres cada una& Cada car3cter
consiste en L98 o L911 p79eles& Este li5ro cu5re un %isuali4ador de L98 p79eles 0ue es
utili4ado con m3s 1recuencia&
El contraste del %isuali4ador depende del %oltae de alimentacin 2 de si los mensaes se
%isuali4an en una o dos l7neas& Por esta ra4n, el %oltae %aria5le ;-Kdd se aplica al pin
marcado como Kee& ?n potencimetro trimer se utili4a con 1recuencia para este
propsito& !lgunos de los %isuali4adores /C- tienen retroiluminacin incorporada
Gdiodos /E- a4ules o %erdesI& !l utili4arlo durante el 1uncionamiento, se de5e de
conectar una resistencia en serie a uno de los pines para limitar la corriente Gsimilar a
diodos /E-I&
+i no $a2 caracteres %isuali4ados o si todos los caracteres est3n oscurecidos al encender
el %isuali4ador, lo primero 0ue se de5e $acer es compro5ar el potencimetro para austar
el contraste& <Est3 austado apropiadamente= /o mismo se aplica si el modo de
1uncionamiento $a sido cam5iado Gescri5ir en una o en dos l7neasI&
Memoria 1%D
El %isuali4ador /C- dispone de tres 5lo0ues de memoria#
--)!M -ispla2 -ata )!M G)!M de datos de %isuali4acinIV
C[)!M C$aracter [enerator )!M Ggenerador de caracteres )!MIV 2
C[)*M C$aracter [enerator )*M Ggenerador de caracteres )*MI
Memoria DD(AM
/a memoria --)!M se utili4a para almacenar los caracteres a %isuali4ar& .iene una
capacidad de almacenar 8; caracteres& !lgunas localidades de memoria est3n
directamente conectadas a los caracteres en el %isuali4ador&
.odo 1unciona mu2 simple# 5asta con con1igurar el %isuali4ador para incrementar
direcciones autom3ticamente Gdespla4amiento a la derec$aI 2 esta5lecer la direccin
inicial para el mensae 0ue se %a a %isuali4ar Gpor eemplo ;; $e9I&
/uego, todos los caracteres en%iados por las l7neas -;--7 se %an a %isuali4ar en el
1ormato de mensae al 0ue nos $emos acostum5rado - de la i40uierda a la derec$a& En
este caso, la %isuali4acin empie4a por el primer campo de la primera l7nea 2a 0ue la
direccin inicial es ;;$e9& +i se en%7a m3s de 16 caracteres, todos se memori4ar3n, pero
slo los primeros 16 ser3n %isi5les& Para %isuali4ar los dem3s, se de5e utili4ar el
comando s$i1t& Kirtualmente, parece como si el %isuali4ador /C- 1uera una %entana,
despla43ndose de la i40uierda a la derec$a so5re las localidades de memoria con
di1erentes caracteres& En realidad, as7 es cmo se cre el e1ecto de despla4ar los
mensaes so5re la pantalla&
+i se $a5ilita %er el cursor, aparecer3 en la localidad actualmente direccionada& En otras
pala5ras, si un car3cter aparece en la posicin del cursor, se %a a mo%er
autom3ticamente a la siguiente localidad direccionada&
Esto es un tipo de memoria )!M as7 0ue los datos se pueden escri5ir en ella 2 leer de
ella, pero su contenido se pierde irrecupera5lemente al apagar la 1uente de alimentacin&
Memoria %=(OM
/a memoria C[)*M contiene un mapa est3ndar de todos los caracteres 0ue se pueden
%isuali4ar en la pantalla& ! cada car3cter se le asigna una localidad de memoria#
/as direcciones de las localidades de memoria C[)*M corresponden a los caracteres
!+CII& +i el programa 0ue se est3 actualmente eecutando llega al comando ben%iar el
car3cter P al puertod, el %alor 5inario ;1;1 ;;;; aparecer3 en el puerto& Este %alor es el
e0ui%alente !+CII del car3cter P& !l escri5ir este %alor en un /C-, se %isuali4ar3 el
s7m5olo de la localidad ;1;1 ;;;; de la C[)*M& En otras pala5ras, se %isuali4ar3 el
car3cter P& Esto se aplica a todas las letras del al1a5eto Gmin6sculas 2 ma26sculasI, pero
no se aplica a los n6meros&
Como se muestra en el mapa anterior, las direcciones de todos los d7gitos se despla4an
por 48 en relacin con sus %alores Gdireccin del d7gito ; es 48, direccin del d7gito 1 es
4H, direccin del d7gito 2 es L; etc&I& Por consiguiente, para %isuali4ar los d7gitos
correctamente es necesario a8adir el n6mero decimal 48 a cada uno antes de en%iarlos a
un /C-&
<Fu" es un cdigo !+CII= -esde su aparicin $asta $o2 en d7a, las computadoras $an
sido capaces de reconocer solamente n6meros, 2 no las letras& Esto signi1ica 0ue todos
los datos 0ue una computadora intercam5ia con un peri1"rico, reconocidos como letras
por los $umanos, en realidad est3n en el 1ormato 5inario Gel teclado es un 5uen
eemploI& En otras pala5ras, a cada car3cter le corresponde la com5inacin 6nica de
ceros 2 unos& El cdigo !+CII representa una codi1icacin de caracteres 5asada en el
al1a5eto ingl"s& El !+CII especi1ica una correspondencia entre los s7m5olos de
caracteres est3ndar 2 sus e0ui%alentes num"ricos&
Memoria %=(AM
!dem3s de los caracteres est3ndar, el %isuali4ador /C- puede %isuali4ar s7m5olos
de1inidos por el usuario& Esto puede ser cual0uier s7m5olo de L98 p79eles& /a memoria
)!M denominada C[)!M de 64 52tes lo $a5ilita&
/os registros de memoria son de 8 5its de anc$ura, pero slo se utili4an L 5its m3s
5aos& ?n uno lgico G1I en cada registro representa un punto oscurecido, mientras 0ue 8
localidades agrupados representan un car3cter& Esto se muestra en la siguiente 1igura#
/os s7m5olos est3n normalmente de1inidos al principio del programa por una simple
escritura de ceros 2 unos de la memoria C[)!M as7 0ue crean las 1ormas deseadas&
Para %isuali4arlos 5asta con especi1icar su direccin& Preste atencin a la primera
columna en el mapa de caracteres C[)*M& 'o contiene direcciones de la memoria
)!M, sino los s7m5olos de los 0ue se est3 $a5lando a0u7& En este eemplo b%isuali4ar ;d
signi1ica %isuali4ar bsonrisad, b%isuali4ar 1d signi1ica - %isuali4ar banclad etc&
%oman!os 98sicos !el visuali:a!or 1%D
.odos los datos transmitidos a un %isuali4ador /C- por las salidas -;--7 ser3n
interpretados como un comando o un dato, lo 0ue depende del estado lgico en el pin
)+#
(- W 1 - /os 5its -; - -7 son direcciones de los caracteres a %isuali4ar& El
procesador /C- direcciona un car3cter del mapa de caracteres 2 lo %isuali4a& /a
direccin --)!M especi1ica la localidad en la 0ue se %a a %isuali4ar el car3cter&
Esta direccin se de1ine antes de transmitir el car3cter o la direccin del car3cter
anteriormente transmitido ser3 aumentada autom3ticamente&
(- W T - /os 5its -; - -7 son los comandos para austar el modo del
%isuali4ador&
En la siguiente ta5la se muestra una lista de comandos reconocidos por el /C-#
%oman!o (- (ND$ D" DR DJ D D+ D1 DT
Tiempo !e
eIecuci?n
Aorrar el %isuali4ador ; ; ; ; ; ; ; ; ; 1 1&64m+
Poner el cursor al inicio ; ; ; ; ; ; ; ; 1 9 1&64m+
Modo de entrada ; ; ; ; ; ; ; 1 IR- + 4;u+
!cti%arRdesacti%ar el
%isuali4ador
; ; ; ; ; ; 1 - ? A 4;u+
-espla4ar el
cursorR%isuali4ador
; ; ; ; ; 1 -RC )R/ 9 9 4;u+
Modo de 1uncionamiento ; ; ; ; 1 -/ ' F 9 9 4;u+
Esta5lecer la direccin
C[)!M
; ; ; 1 -ireccin C[)!M 4;u+
Esta5lecer la direccin
--)!M
; ; 1 -ireccin C[)!M 4;u+
/eer la 5andera
kA?+MkGocupadoI GAFI
; 1 AF -ireccin C[)!M -
Escri5ir en la C[)!M o en la
--)!M
1 ; -7 -6 -L -4 -3 -2 -1 -; 4;u+
/eer la C[)!M o la --)!M1 1 -7 -6 -L -4 -3 -2 -1 -; 4;u+
'4+ 1 = Incremento (por 1) #4) 1 =
Desplazamiento a la derecha
0 = Decremento (por 1) 0 =
Desplazamiento a la izquierda

, 1 = Desplazamiento del visualizador activado +) 1 = Bus de
datos de 8 bits
0 = Desplazamiento del visualizador desactivado 0 = Bus de
datos de 4 bits

+ 1 = Visualizador encendido 2 1 =
Visualizador de dos lneas
0 = Visualizador apagado 0 =
Visualizador en una lnea

1 1 = Cursor activado & 1 = Carcter
de 5x10 puntos
0 = Cursor desactivado 0 = Carcter
de 5x7 puntos
5 1 = Parpadeo del cursor encendido +4( 1 =
Desplazamiento del visualizador
0 = Parpadeo del cursor apagado 0 =
Desplazamiento del cursor
CF)> E- )'A 0A'DE(A DE O%)4ADO 60)-5 <1A=7D
En comparacin al microcontrolador, el /C- es un componente e9tremadamente lento&
Por esta ra4n, era necesario proporcionar una se8al 0ue, al eecutar un comando,
indicar7a 0ue el %isuali4ador esta5a listo para reci5ir el siguiente dato& Esta se8al
denominada 5andera de ocupado G5us2 1lagI se puede leer de la l7nea -7& El
%isuali4ador est3 listo para reci5ir un nue%o dato cuando el %oltae en esta l7nea es de ;K
GAFJ;I&
%onectar al visuali:a!or 1%D
-ependiendo de cu3ntas l7neas se utili4an para conectar un /C- al microcontrolador,
$a2 dos modos de /C-, el de 8 5its 2 el de 4 5its& El modo apropiado se selecciona en
el inicio del 1uncionamiento en el proceso denominado biniciali4acind& El modo de
/C- de 8 5its utili4a los pines -;--7 para transmitir los datos, como $emos e9plicado
en la p3gina anterior& El propsito principal del modo de /C- de 4 5its es de a$orrar los
%aliosos pines de ER+ del microcontrolador& +lo los 4 5its m3s altos G-4--7I se utili4an
para la comunicacin, mientras 0ue los dem3s pueden 0uedarse desconectados& Cada
dato se en%7a al /C- en dos pasos - primero se en%7an 4 5its m3s altos Gnormalmente
por las l7neas -4- -7I, 2 luego los 4 5its m3s 5aos& /a iniciali4acin $a5ilita 0ue el
/C- conecte e interprete los 5its reci5idos correctamente&
Pocas %eces se leen los datos del /C- Gpor lo general se transmiten del
microcontrolador al /C-I as7 0ue, con 1recuencia, es posi5le guardar un pin de ER+ de
so5ra& Es simple, 5asta con conectar el pin /RE a .ierra& Este Ba$orroC del pin tiene su
precio& /os mensaes se %isuali4ar3n normalmente, pero no ser3 posi5le leer la 5andera
de ocupado 2a 0ue tampoco es posi5le leer los datos del %isuali4ador& !1ortunadamente,
$a2 una solucin simple& -espu"s de en%iar un car3cter o un comando es importante dar
al /C- su1iciente tiempo para $acer su tarea& -e5ido al $ec$o de 0ue la eecucin de un
comando puede durar apro9imadamente 1&64m+, el /C- tarda como m39imo 2m+ en
reali4ar su tarea&
&niciali:ar al visuali:a!or 1%D
!l encender la 1uente de alimentacin, el /C- se reinicia autom3ticamente& Esto dura
apro9imadamente 1Lm+& -espu"s de eso, el /C- est3 listo para 1uncionar& !simismo,
el modo de 1uncionamiento est3 con1igurado por de1ecto de la siguiente manera#
1& Kisuali4ador est3 5orrado&
2& Modo
D1 J 1 - Aus de datos de 8 5its
' J ; - /C- de una l7nea
< J ; - Car3cter de L 9 8 puntos
3& Kisuali4adorRCursor encendidoRapagado
D J ; - Kisuali4ador apagado
) J ; - Cursor apagado
0 J ; - Parpadeo del cursor apagado
4& Introduccin de caracteres
&D J 1 -irecciones %isuali4adas se incrementan autom3ticamente en 1
- J -espla4amiento del %isuali4ador desacti%ado
Por lo general, el reinicio autom3tico se lle%a a ca5o sin pro5lemas& >En la ma2or7a de
los casos, pero no siempre@ +i por cual0uier ra4n, el %oltae de alimentacin no llega a
su m39imo %alor en 1;m+, el %isuali4ador se pone a 1uncionar de manera
completamente impre%isi5le& +i la unidad de %oltae no es capa4 de cumplir con las
condiciones o si es necesario proporcionar un 1uncionamiento completamente seguro, se
aplicar3 el proceso de iniciali4acin& /a iniciali4acin, entre otras cosas, reinicia de
nue%o al /C-, al $a5ilitarle un 1uncionamiento normal&
:a2 dos algoritmos de iniciali4acin& Cu3l se utili4ar3 depende de si la cone9in al
microcontrolador se reali4a por el 5us de datos de 4 o 8 5its& En am5os casos, despu"s
de iniciali4acin slo 0ueda especi1icar los comandos 53sicos 2, por supuesto, %isuali4ar
los mensaes&
)e1i"rase a la Figura 0ue sigue para el procedimiento de iniciali4acin por el 5us de
datos de 8 5its#
>Esto no es un error@ En este algoritmo, el mismo %alor se transmite tres %eces en 1ila&
El procedimiento de iniciali4acin por el 5us de datos de 4 5its#
/amos a hacerlo en mikro%...
/* En mikroC for PIC, basta con escribir slo una funcin para
realizar todo el proceso
de la inicializacin del LCD. Antes de llamar esta funcin es
necesario declarar los
bits LCD_D4-LCD_D7, LCD_RS y LCD_EN. */
...
Lcd_Init(); // Inicializar el LCD
...
EGEM41O- 4(V%T&%O-
El proceso de crear un pro2ecto nue%o es mu2 simple& +eleccione la opcin 'ew
4roIect del men6 4roIect como se muestra en la Figura de la derec$a&
!parecer3 una %entana 0ue le guiar3 a tra%"s del proceso de creacin de un pro2ecto
nue%o& /a %entana de entrada de este programa contiene una lista de acciones a reali4ar
para crear un pro2ecto nue%o& Pulse el 5otn 'eHt&
El proceso de creacin de un pro2ecto nue%o consiste en cinco pasos#
1& +eleccione el tipo de microcontrolador a programar& En este caso se trata del
PIC16F887&
2& +eleccione la 1recuencia de relo del microcontrolador& En este caso el %alor
seleccionado es 8 M:4&
3& +eleccione el nom5re 2 la ruta del pro2ecto& En este caso, el nom5re del
pro2ecto es FirstjProect& Est3 guardado en la carpeta C#uM2 proects& !l
nom5re del pro2ecto se le asigna autom3ticamente la e9tensin &mcppi& +e
crear3 en el pro2ecto el arc$i%o 1uente con el mismo nom5re GFirstjProect &c&$I&
4& +i el nue%o pro2ecto consiste de %arios arc$i%os 1uente, se necesita
especi1icarlos 2 pulse so5re el 5otn !dd para incluirlos& En este eemplo no $a2
arc$i%os 1uente adicionales&
L& Por 6ltimo, se necesita con1irmar todas las opciones seleccionadas& Pulse so5re
Finis$&
-espu"s de crear el pro2ecto, aparecer3 una %entana 5lanca en la 0ue de5e escri5ir el
programa& Kea la siguiente 1igura#
?na %e4 creado el programa, es necesario compilarlo en un cdigo &$e9& +eleccione una
de las opciones para compilar del men6 4roIect#
Para crear un arc$i%o &$e9, seleccione la opcin Auild GCtrlDFHI del men6
Proect o pulse so5re el icono Auild de la 5arra de $erramientas Proect&
Por medio de la opcin Auild !ll Proects G+$i1tDFHI se compilan todos los
arc$i%os del pro2ecto, li5rer7as Gsi el cdigo 1uente contiene alguna de ellasI 2
los arc$i%os de1 para el microcontrolador utili4ado&
/a opcin Auild D Program GCtrlDF11I es importante 2a 0ue permite al
compilador mi]roC P)* 1or PIC cargar autom3ticamente el programa en el
microcontrolador despu"s de la compilacin& El proceso de la programacin se
reali4a por medio del programador PICFlas$&
.odos los errores encontrados durante la compilacin aparecer3n en la %entana
Message& +i no $a2 errores en el programa, el compilador mi]roC P)* 1or PIC
generar3 los correspondientes arc$i%os de salida&
J. EGEM41O 1
E)2/393/ 2'9$2$/'K 20%63,-/'/ .3%$) *$ E/SK -&3+3?'/ +' 6-%234% D$+': :
$+ 0.$/'*0/ S<3&28
El 6nico propsito de este programa es de encender %arios diodos /E- en el puerto A&
?tilice este eemplo para e9aminar cmo es un programa real& /a siguiente 1igura
muestra el es0uema de cone9in, mientras 0ue el programa se encuentra en la siguiente
p3gina&
!l encender la 1uente de alimentacin, cada segundo, el diodo /E- en el puerto A emite
lu4, lo 0ue indica 0ue el microcontrolador est3 conectado correctamente 2 0ue 1unciona
normalmente&
En este eemplo se muestra cmo escri5ir una ca5ecera correctamente& /o mismo se
aplica a todos los programas descritos en este li5ro& Para no repetir, en los siguientes
eemplos no %amos a escri5ir la ca5ecera& +e considera estar en el principio de cada
programa, marcada como kCa5ecerak&
Para $acer este eemplo m3s interesante, %amos a $a5ilitar 0ue los /E-s conectados al
puerto P*).A parpadeen& :a2 %arios modos de $acerlo#
1& .an pronto como se encienda el microcontrolador, todos los /E-s emitir3n la
lu4 por un segundo& /a 1uncin -ela2 se encarga de eso en el programa& +lo se
necesita austar la duracin del tiempo de retardo en milisegundos&
2& -espu"s de un segundo, el programa entra en el 5ucle 1or, 2 se 0ueda all7 $asta
0ue la %aria5le ] sea menor 0ue 2;& /a %aria5le se incrementa en 1 despu"s de
cada iteracin& -entro del 5ucle 1or, el operador sSitc$ monitorea el estado
lgico en el puerto P*).A& +i P*).AJ;9FF, su estado se in%ierte en ;9;; 2
%ice%ersa& Cual0uier cam5io de estos estados lgicos $ace todos los /E-s
parpadear& El ciclo de tra5ao es L#1 GL;;m+#1;;m+I&
3& !l salir del 5ucle 1or, el estado lgico del puerto P*.)A cam5ia G;95
;1;1;1;1I 2 el programa entra en el 5ucle in1inito S$ile 2 se 0ueda all7 $asta
0ue 1J1& El estado lgico del puerto P*).A se in%ierte cada 2;;m+&
J.J EGEM41O +
U&3+3?'/ 3%)&/-2230%$) $% $%)'19+'*0/ : $+ 0)23+'*0/ 3%&$/%0
LFINTOSCHHH
En realidad, esto es una continuacin del eemplo anterior, pero se ocupa de un
pro5lema un poco m3s complicado&&& El propsito era $acer los /E-s en el puerto
P*).A parpadear lentamente& +e puede reali4ar al introducir un %alor su1iciente grande
para el par3metro del tiempo de retardo en la 1uncin -ela2& 'o o5stante, $a2 otra
manera m3s e1iciente para eecutar el programa lentamente& !cu"rdese de 0ue este
microcontrolador tiene un oscilador incorporado /FI'.*+C 0ue 1unciona a una
1recuencia de 31]:4& !$ora lleg la $ora de Bdarle una oportunidadC&
El programa se inicia con el 5ucle do-S$ile 2 se 0ueda all7 por 2; ciclos& -espu"s da
cada iteracin, llega el tiempo de retardo de 1;;ms, indicado por un parpadeo
relati%amente r3pido de los /E-s en el puerto P*).A& Cuando el programa salga de
este 5ucle, el microcontrolador se inicia al utili4ar el oscilador /FI'.*+C como una
1uente de se8al de relo& /os /E-s parpadean m3s lentamente aun0ue el programa
eecuta el mismo 5ucle do-S$ile con un tiempo de retardo 1; %eces m3s corto&
Con el propsito de $acer e%identes algunas situaciones potencialmente peligrosas, se
acti%an los 5its de control por medio de las instrucciones en ensam5lador& -ic$o de
manera sencilla, al entrar o salir una instruccin en ensam5lador en el programa, el
compilador no almacena los datos en un 5anco actualmente acti%o de la )!M, lo 0ue
signi1ica 0ue en esta seccin de programa, la seleccin de 5ancos depende del registro
+F) utili4ado& !l %ol%er a la seccin de programa escrito en C, los 5its de control )P; 2
)P1 de5en recuperar el estado 0ue ten7an antes de bla a%entura en ensam5ladord& En este
programa, el pro5lema se resuel%e al utili4ar la %aria5le au9iliar sa%eAan], lo 0ue
guarda el estado de estos dos 5its&
/* Cabecera *********************************************/
int k = 0; // Variable k es de tipo int
char saveBank; // Variable saveBank es de tipo char
void main() {
ANSEL = 0; // Todos los pines de E/S se
configuran como digitales
ANSELH = 0;
PORTB = 0; // Todos los pines del puerto PORTB
se ponen a 0
TRISB = 0; // Pines del puerto PORTB se
configuran como salidas

do {
PORTB = ~PORTB; // Invertir el estado lgico del
puerto PORTB
Delay_ms(100); // Tiempo de retardo de 100mS
k++; // Incrementar k en 1
}
while(k<20); // Quedarse en bucle hasta que k<20

k=0; // Reiniciar variable k
saveBank = STATUS & 0b01100000; // Guardar el estado de los bits RP0
y RP1

// (bits 5 y 6 del registro STATUS)
asm { // Inicio de una secuencia en
ensamblador
bsf STATUS,RP0 // Seleccionar el banco de memoria
que contiene el
bcf STATUS,RP1 // registro OSCCON
bcf OSCCON,6 // Seleccionar el oscilador interno
LFINTOSC
bcf OSCCON,5 // de frecuencia de 31KHz
bcf OSCCON,4
bsf OSCCON,0 // Microcontrolador utiliza
oscilador interno
} // Final de la secuencia en
ensamblador

STATUS &= 0b10011111; // Bits RP0 y RP1 recuperan el
estado original
STATUS |= saveBank;

do {
PORTB = ~PORTB; // Invertir el estado lgico del
puerto PORTB
Delay_ms(10); // Tiempo de retardo de 10 mS
k++; // Incrementar k en 1
}
while(k<20); // Quedarse en el bucle hasta que
k<20
}
J.R EGEM41O
TimerT como un conta!or. !eclarar varia9les nuevas. constantes !e
enumeraci?n. utili:ar rel@s...
En cuanto a los eemplos anteriores, el microcontrolador $a eecutado el programa sin
$a5er sido a1ectado de ninguna 1orma por su entorno& En la pr3ctica, $a2 pocos
dispositi%os 0ue 1uncionen de esta manera Gpor eemplo, un simple controlador de lu4 de
nenI& /os pines de entrada se utili4an tam5i"n en este eemplo& En la siguiente 1igura
se muestra un es0uema, mientras 0ue el programa est3 en la siguiente p3gina& .odo
sigue siendo mu2 simple& El tempori4ador .imer; se utili4a como un contador& /a
entrada del contador est3 conectada a un 5otn de presin, as7 0ue cada %e4 0ue se
presiona el 5otn, el tempori4ador .imer; cuenta un pulso&
Cuando el n6mero de pulsos coincida con el n6mero almacenado en el registro .E+.,
un uno lgico GLKI aparecer3 en el pin P*).-&3& Este %oltae acti%a un rel"
electromec3nico, 2 por eso este 5it se le denomina b)E/Pd en el programa&
/*Cabecera****************************************************/
void main() {
char TEST = 5; // Constante TEST = 5
enum salidas {REL = 3}; // Constante RELAY = 3

ANSEL = 0; // Todos los pines de E/S se configuran
como digitales
ANSELH = 0;
PORTA = 0; // Reiniciar el puerto PORTA
TRISA = 0xFF; // Todos los pines del puerto PORTA se
configuran como entradas
PORTD = 0; // Reiniciar el puerto PORTD
TRISD = 0b11110111; // Pin RD3 se configura como salida,
mientras que los dems

// se configuran como entradas
OPTION_REG.F5 = 1; // Contador TMR0 recibe los pulsos por el
pin RA4
OPTION_REG.F3 = 1; // Valor del pre-escalador 1:1

TMR0 = 0; // Reiniciar el temporizador/contador TMR0

do {
if (TMR0 == TEST) // Coincide el nmero en el temporizador
con la
// constante TEST?
(PORTD.RELAY = 1); // Nmeros coinciden. Poner el bit RD3 a
uno (salida REL)
}
while (1); // Quedarse en el bucle infinito
}
+lo una constante de enumeracin )E/P se utili4a en este eemplo& +e le asigna un
%alor mediante la declaracin&
enum salidas {REL = 3}; // Constante REL = 3
+i %arios pines del puerto P*).- est3n conectados a los rel"s, la e9presin anterior se
puede escri5ir de la siguiente manera tam5i"n#
enum salidas {REL=3, CALENTADOR, MOTOR=6, SURTIDOR};
! todas las constantes, precedidas por las constantes con %alores asignados G)E/PJ3 2
M*.*)J6I, se les asignan autom3ticamente los %alores de las constantes precedentes,
incrementados en 1& En este eemplo, a las constantes C!/E'.!-*) 2 +?).I-*)
se les asignan los %alores 4 2 7, es decir GC!/E'.!-*)J4 2 +?).I-*)J7I,
respecti%amente&
J." EGEM41O J
U&3+3?'/ +0) &$1.0/3?'*0/$) T31$/CK T31$/A : T31$/BH U&3+3?'/
3%&$//-.230%$)K *$2+'/'/ %-$5') 6-%230%$)HHH
!l anali4ar los eemplos anteriores, es pro5a5le 0ue se $a2a 1iado en la des%entaa de
proporcionar tiempo de retardo por medio de la 1uncin -ela2& En estos casos, el
microcontrolador se 0ueda best3ticod 2 no $ace nada& +implemente espera 0ue transcurra
una cierta cantidad de tiempo& .al p"rdida de tiempo es un luo inacepta5le, por lo 0ue
se de5er3 aplicar otro m"todo&
<+e acuerda usted del cap7tulo de los tempori4adores= <+e acuerda de lo de
interrupciones= Este eemplo los conecta de una manera pr3ctica& El es0uema se 0ueda
inalterada, 2 el desa17o sigue siendo presente& Es necesario proporcionar un tiempo de
retardo su1iciente largo para darse cuenta de los cam5ios en el puerto& Para este
propsito se utili4a el tempori4ador .imer; con el pre-escalador asignado& +iempre 0ue
se genere una interrupcin con cada des5ordamiento en el registro del tempori4ador, la
%aria5le cnt se aumenta autom3ticamente en 1 al eecutarse cada rutina de interrupcin&
Cuando la %aria5le llega al %alor 4;;, el puerto P*).A se incrementa en 1& .odo el
procedimiento se lle%a a ca5o Bentre 5astidoresC, lo 0ue $a5ilita al microcontrolador
$acer otra tarea&
/*Cabecera******************************************************/
unsigned cnt; // Definir la variable cnt
void interrupt() {
cnt++; // Con una interrupcin la cnt se incrementa en
1
TMR0 = 96; // El valor inicial se devuelve en el
temporizador TMR0
INTCON = 0x20; // Bit T0IE se pone a 1, el bit T0IF se pone a
0
}
void main(){
OPTION_REG = 0x84; // Pre-escalador se le asigna al temporizador
TMR0
ANSEL = 0; // Todos los pines de E/S se configuran como
digitales
ANSELH = 0;
TRISB = 0; // Todos los pines de puerto PORTB se
configuran

// como salidas
PORTB = 0x0; // Reiniciar el puerto PORTB
TMR0 = 96; // Temporizador T0 cuenta de 96 a 255
INTCON = 0xA0; // Habilitada interrupcin TMR0
cnt = 0; // A la variable cnt se le asigna un 0

do { // Bucle infinito
if (cnt == 400) { // Incrementar el puerto PORTB despus 400
interrupciones
PORTB = PORTB++; // Incrementar nmero en el puerto PORTB en 1
cnt = 0; // Reiniciar la variable cnt
}
} while(1);

}
+iempre 0ue se produ4ca un des5ordamiento en el registro del tempori4ador .)M;,
ocurre una interrupcin&
/*Cabecera******************************************************/
unsigned short cnt; // Definir la variable cnt
void interrupt() {
cnt++ ; // Con una interrupcin la cnt se incrementa en
1
PIR1.TMR1IF = 0; // Reiniciar el bit TMR1IF
TMR1H = 0x80; // El valor inicial se devuelve en los registros
TMR1L = 0x00; // del temporizador TMR1H y TMR1L
}
void main() {
ANSEL = 0; // Todos los pines de E/S se configuran como
digitales
ANSELH = 0;
PORTB = 0xF0; // Valor inicial de los bits del puerto PORTB
TRISB = 0; // Pines del puerto PORTB se configuran como
salidas
T1CON = 1; // Configurar el temporizador TMR1
PIR1.TMR1IF = 0; // Reiniciar el bit TMR1IF
TMR1H = 0x80; // Ajustar el valor inicial del temporizador
TMR1
TMR1L = 0x00;
PIE1.TMR1IE = 1; // Habilitar la interrupcin al producirse un
desbordamiento
cnt = 0; // Reiniciar la variable cnt
INTCON = 0xC0; // Interrupcin habilitada (bits GIE y PEIE)

do { // Bucle infinito
if (cnt == 76) { // Cambiar el estado del puerto PORTB despus de
76 interrupciones
PORTB = ~PORTB; // Nmero en el puerto PORTB est invertido
cnt = 0; // Reiniciar la variable cnt
}
} while (1);
}
En este caso, una interrupcin se $a5ilita despu"s de 0ue se produ4ca un
des5ordamiento en el registro del tempori4ador .M)1 G.M)1:, .M)1/I& !dem3s, la
com5inacin de los 5its 0ue %ar7a en el puerto P*.)A di1iere de la en el eemplo
anterior&
/*Cabecera******************************************************/
unsigned short cnt; // Definir la variable cnt
void Reemplazar() {
PORTB = ~PORTB; // Definir nueva funcin Reemplazar
} // Funcin invierte el estado del puerto
void interrupt() {
if (PIR1.TMR2IF) { // Si el bit TMR2IF = 1,
cnt++ ; // Incrementar variable la cnt en 1
PIR1.TMR2IF = 0; // Reiniciar el bit y
TMR2 = 0; // Reiniciar el registro TMR2
}
}
// main
void main() {
cnt = 0; // Reiniciar la variable cnt
ANSEL = 0; // Todos los pines de E/S se configuran como
digitales
ANSELH = 0;
PORTB = 0b10101010; // Estado lgico en los pines del puerto PORTB
TRISB = 0; // Todos los pines del puerto PORTB se
configuran como salidas
T2CON = 0xFF; // Configurar el temporizador T2
TMR2 = 0; // Valor inicial del registro del temporizador
TMR2
PIE1.TMR2IE = 1; // Interrupcin habilitada
INTCON = 0xC0; // Bits GIE y PEIE se ponen a 1

while (1) { // Bucle infinito
if (cnt > 30) { // Cambiar el estado del puerto PORTB despus de
// ms de 30 interrupciones
Reemplazar(); // Funcin Reemplazar invierte el estado del
puerto PORTB
cnt = 0; // Reiniciar la variable cnt
}
}
}
En este eemplo, una interrupcin ocurre despu"s de 0ue se produce un des5ordamiento
en el registro del tempori4ador .M)2& Para in%ertir el estado lgico de los pines del
puerto se utili4a la 1uncin )eempla4ar, 0ue normalmente no pertenece al lenguae C
est3ndar&
J.$ EGEM41O R
U&3+3?'/ $+ &$1.0/3?'*0/ .$//0 - ,-'/*37%
Este eemplo muestra cmo '* se de5e utili4ar el tempori4ador perro-guardi3n& ?n
comando utili4ado para reiniciar este tempori4ador se omite a propsito en el 5ucle del
programa principal, lo 0ue $a5ilita al tempori4ador perro guardi3n Bganar la 5atalla del
tiempoC 2 reiniciar al microcontrolador& Por consiguiente, el microcontrolador se %a a
reiniciar sin parar, lo 0ue indicar3 el parpadeo de los /E-s del puerto P*).A&
/*Cabecera******************************************************/
void main() {
OPTION_REG = 0x0E; // Pre-escalador se le asigna al temporizador WDT
(1:64)
asm CLRWDT; // Comando en ensamblador para reiniciar el
temporizador WDT
PORTB = 0x0F; // Valor inicial del registro PORTB
TRISB = 0; // Todos los pines del puerto PORTB se configuran
como salidas
Delay_ms(300); // Tiempo de retardo de 30mS
PORTB = 0xF0; // Valor del puerto PORTB diferente del inicial

while (1); // Bucle infinito. El programa se queda aqu
hasta que el
// temporizador WDT reinicie al microcontrolador
}
Para 0ue este eemplo 1uncione apropiadamente, es necesario $a5ilitar al tempori4ador
perro-guardi3n al seleccionar la opcin .oolsRmE ProgrammerRWatc$dog .imer -
Ena5led&
J.8 EGEM41O "
M4*-+0 CCPA 2010 ,$%$/'*0/ *$ )$L'+ P"M
Este eemplo muestra el uso del mdulo CCP1 en modo PWM& Para $acer las cosas m3s
interesantes, la duracin de los pulsos en la salida P1! GP*).C,2I se puede cam5iar
por medio de los 5otones de presin sim5licamente denominados b*+C?)*d 2
bC/!)*d& /a duracin austada se %isuali4a como una com5inacin 5inaria en el puerto
P*).A& El 1uncionamiento de este mdulo est3 5ao el control de las 1unciones
pertenecientes a la li5rer7a especiali4ada PWM& !0u7 se utili4an las tres de ellas#
1& 4NM1Zinit tiene el prototipo# void Pwm1_Init(long freq);
El par3metro 1re0 austa la 1recuencia de la se8al PWM e9presada en $ercios& En
este eemplo e0ui%ale a L]:4&
2& 4NM1Z-tart tiene el prototipo# void Pwm1_Start(void);
3& 4NM1Z-etZDut; tiene el prototipo# void Pwm1_Set_Duty(unsigned short
duty_ratio);
El par3metro dut2jratio austa la duracin de pulsos en una secuencia de pulsos&
/a li5rer7a PWM tam5i"n contiene la 1uncin PWMj+top utili4ada para des$a5ilitar
este modo& +u prototipo es# void Pwm1_Stop(void);
/*Cabecera******************************************************/
// Definir las variables ciclo_de_trabajo_actual,
// ciclo_de trabajo_anterior
unsigned short ciclo_de_trabajo_actual;
unsigned short ciclo_de trabajo_anterior;
void initMain() {
ANSEL = 0; // Todos los pines de E/S se configuran como
digitales
ANSELH = 0;
PORTA = 255; // Estado inicial del puerto PORTA
TRISA = 255; // Todos los pines del puerto PORTA se configuran
como entradas
PORTB = 0; // Estado inicial del puerto PORTB
TRISB = 0; // Todos los pines del puerto PORTB se configuran
como salidas
PORTC = 0; // Estado inicial del puerto PORTC
TRISC = 0; // Todos los pines del puerto PORTC se configuran

// como salidas
PWM1_Init(5000); // Inicializacin del mdulo PWM (5KHz)
}
void main() {
initMain();
ciclo_de_trabajo_actual = 16; // Valor inicial de la variable
ciclo_de_trabajo_actual
ciclo_de trabajo_anterior = 0; // Reiniciar la variable ciclo_de
trabajo_anterior
PWM1_Start(); // Iniciar el mdulo PWM1

while (1) { // Bucle infinito
if (Button(&PORTA, 0,1,1)) // Si se presiona el botn
conectado al RA0
ciclo_de_trabajo_actual++ ; // incrementar el valor de la
variable current_duty
if (Button(&PORTA, 1,1,1)) // Si se presiona el botn
conectado al RA1
ciclo_de_trabajo_actual-- ; // decrementar el valor de la
variable current_duty
if (old_duty != ciclo_de_trabajo_actual) { // Si
ciclo_de_trabajo_actual y
// ciclo_de trabajo_anterior no son iguales
PWM1_Set_Duty(ciclo_de_trabajo_actual); // ajustar
un nuevo valor a PWM,
ciclo_de trabajo_anterior = ciclo_de_trabajo_actual; // Guardar
el nuevo valor
PORTB = ciclo_de trabajo_anterior; // y
visualizarlo en el puerto PORTB
}
Delay_ms(200); // Tiempo de retardo de 200mS
}
}
Para 0ue este eemplo 1uncione apropiadamente, es necesario marcar las siguientes
li5rer7as en la %entana /i5rar2 Manager antes de compilar el programa#
PWM
Autton
J.S E3AM41E $
U&3+3?'/ $+ 20%5$/&3*0/ A/D
El con%ertidor !R- del microcontrolador PIC16F887 se utili4a en este eemplo& <:ace
1alta decir 0ue todo es pan comido= ?na se8al analgica %aria5le se aplica al pin !'2,
mientras 0ue el resultado de la con%ersin de 1; 5its se muestra en los puertos P*.)A
2 P*).- G8 5its menos signi1icati%os en el puerto P*).- 2 2 5its m3s signi1icati%os
en el puerto P*).AI& /a .ierra G['-I se utili4a como %oltae de re1erencia 5ao Kre1-,
mientras 0ue el %oltae de re1erencia alto se aplica al pin !'3& Esto $a5ilita 0ue la
escala de medicin se estire 2 encoa&
IEn otras pala5ras, el con%ertidor !R- siempre genera un resultado 5inario de 1; 5its, lo
0ue signi1ica 0ue reconoce 1;24 ni%eles de %oltae en total G2
1;
J1;24I& /a di1erencia
entre dos ni%eles de %oltae no es siempre la misma& Cu3nto menor sea la di1erencia
entre Kre1D 2 Kre1-, tanto menor ser3 la di1erencia entre dos de 1;24 ni%eles& Como
$emos %isto, el con%ertidor !R- es capa4 de detectar pe0ue8os cam5ios de %oltae&
/*Cabecera******************************************************/
unsigned int temp_res;
void main() {
ANSEL = 0x0C; // Pines AN2 y AN3 se configuran como
analgicos
TRISA = 0xFF; // Todos los pines del puerto PORTA se
configuran

// como entradas
ANSELH = 0; // Los dems pines se configuran como
digitales
TRISB = 0x3F; // Pines del puerto PORTB, RB7 y RB6 se
configuran

// como salidas
TRISD = 0; // Todos los pines del PORTD se configuran
como salidas
ADCON1.F4 = 1 ; // Voltaje de referencia es llevado al pin
RA3.

do {
temp_res = ADC_Read(2); // Resultado de la conversin A/D es
copiado a temp_res
PORTD = temp_res; // 8 bits menos significativos se mueven
al puerto PORTD
PORTB = temp_res >> 2; // 2 bits ms significativos se mueven a
los bits RB6 y RB7
} while(1); // Bucle infinito
}
Para 0ue este eemplo 1uncione apropiadamente, es necesario marcar la li5rer7a !-C en
la %entana /i5rar2 Manager antes de compilar el programa#
!-C
J.1T EGEM41O 8
U&3+3?'/ 1$10/3' EEPROM
Este eemplo muestra cmo escri5ir 2 leer la memoria EEP)*M incorporada& El
programa 1unciona de la siguiente manera& El 5ucle principal lee constantemente el
contenido de localidad de la memoria EEP)*M en la direccin L GdecimalI& /uego el
programa entra en el 5ucle in1inito en el 0ue el puerto P*).A se incrementa 2 se
comprue5a el estado de entradas del puerto P*).!&2& En el momento de presionar el
5otn denominado MEM*, un n6mero almacenado en el puerto P*).A ser3 guardado
en la memoria EEP)*M, directamente le7do 2 %isuali4ado en el puerto P*).- en
1orma 5inaria&
/*Cabecera******************************************************/
void main() {{
ANSEL = 0; // Todos los pines de E/S se configuran
como digitales
ANSELH = 0;
PORTB = 0; // Valor inicial del puerto PORTB
TRISB = 0; // Todos los pines del puerto PORTB se
configuran

// como salidas
PORTD = 0; // Valor inicial del puerto PORTB
TRISD = 0; // Todos los pines del puerto PORTD se
configuran

// como salidas
TRISA = 0xFF; // Todos los pines del puerto PORTA se
configuran

// como entradas
PORTD = EEPROM_Read(5); // Leer la memoria EEPROM en la direccin
5

do {
PORTB = PORTB++; // Incrementar el puerto PORTB en 1
Delay_ms(100); // Tiempo de retardo de 100mS
if (PORTA.F2)
EEPROM_Write(5,PORTB); // Si se pulsa el botn MEMO, guardar el
puerto PORTB

PORTD = EEPROM_Read(5); // Leer el dato escrito
do {
while (PORTA.F2); // Quedarse en este bucle hasta que el
botn est pulsado
}
}
while(1); // Bucle infinito
}
Para compro5ar el 1uncionamiento de este circuito, 5asta con pulsar el 5otn MEM* 2
apagar el dispositi%o& -espu"s de reiniciar el dispositi%o, el programa %isuali4ar3 el
%alor guardado en el puerto P*).-& !cu"rdese de 0ue en el momento de escri5ir, el
%alor 1ue %isuali4ado en el puerto P*).A&
Para 0ue este eemplo 1uncione apropiadamente, es necesario marcar la li5rer7a
EEP)*M en la %entana /i5rar2 Manager antes de compilar el programa#
EEP)*M
J.11 EGEM41O S
C0%&'*0/ *$ *0) *F,3&0) LEDK 1-+&3.+$J34%
En este eemplo el microcontrolador 1unciona como un contador de dos d7gitos& /a
%aria5le i se incrementa Gsu1iciente lentamente para ser %isi5leI 2 su %alor se %isuali4a
en un %isuali4ador de dos d7gitos /E- GHH-;I& El punto es $a5ilitar una con%ersin de
un n6mero 5inario en un decimal 2 partirlo en dos d7gitos Gen decenas 2 unidadesI&
Como los segmentos del %isuali4ador /E- se conectan en paralelo, es necesario
asegurar 0ue alternen r3pidamente para tener una impresin de 0ue emiten la lu4
simult3neamente Gmultiple9in por di%isin en tiempoI&
En este eemplo, el tempori4ador .M); est3 encargado de la multiple9in por di%isin
en tiempo, mientras 0ue la 1uncin mas] con%ierte un n6mero 5inario a 1ormato
decimal&
/*Cabecera******************************************************/
unsigned short mask(unsigned short num);
unsigned short digit_no, digit10, digit1, digit, i;
void interrupt() {
if (digit_no == 0) {
PORTA = 0; // Apagar ambos visualizadores
PORTD = digit1; // Colocar mscara para visualizar unidades en el
// puerto PORTD
PORTA = 1; // Encender el visualizador para las unidades
(LSD)
digit_no = 1;
}else{
PORTA = 0; // Apagar ambos visualizadores
PORTD = digit10; // Colocar mscara para visualizar decenas en el
// puerto PORTD
PORTA = 2; // Encender el visualizador para las decenas
(MSD)
digit_no = 0;
}

TMR0 = 0; // Reiniciar el contador TMRO
INTCON = 0x20; // Bit T0IF=0, T0IE=1
}
void main() {
OPTION_REG = 0x80; // Ajustar el temporizador TMR0
TMR0 = 0;
INTCON = 0xA0; // Deshabilitar las interrupciones
PEIE,INTE,RBIE,T0IE
PORTA = 0; // Apagar ambos visualizadores
TRISA = 0; // Todos los pines del puerto PORTA se configuran

// como salidas
PORTD = 0; // Apagar todos los segmentos del visualizador
TRISD = 0; // Todos los pines del puerto PORTD se configuran

// como salidas
do {
for (i = 0; i<=99; i++) { // Contar de 0 a 99
digit = i % 10u;
digit1 = mask(digit); // Preparar la mscara para visualizar
unidades
digit = (char)(i / 10u) % 10u;
digit10 = mask(digit); // Preparar la mscara para visualizar
decenas
Delay_ms(1000);
}
} while (1); // Bucle infinito
}
mask.c
/*Cabecera******************************************************/
unsigned short mask(unsigned short num) {
switch (num) {
case 0 : return 0x3F;
case 1 : return 0x06;
case 2 : return 0x5B;
case 3 : return 0x4F;
case 4 : return 0x66;
case 5 : return 0x6D;
case 6 : return 0x7D;
case 7 : return 0x07;
case 8 : return 0x7F;
case 9 : return 0x6F;
}
}
Para 0ue este eemplo 1uncione apropiadamente, es necesario incluir el arc$i%o mas]&c
en el pro2ecto Gaparte del arc$i%o e9ampleH&cI en la %entana Proect Manager antes de
compilar el programa#
ExampleX.mcppi ) #ources - A!! <ile To 4roIect
mas]&c
e9ampleH&c
J.1+ EGEM41O 1T
U&3+3?'/ $+ 53)-'+3?'*0/ LCD
Este eemplo muestra cmo utili4ar un %isuali4ador /C- al1anum"rico& /as li5rer7as de
1unciones simpli1ican este programa, lo 0ue signi1ica 0ue al 1inal el es1uer4o para crear
el so1tSare %ale la pena&
?n mensae escrito en dos l7neas aparece en el %isuali4ador#
mikroElektronika
1%D eHample
-os segundos m3s tarde, el mensae en la segunda l7nea cam5ia, 2 se %isuali4a el %oltae
presente en la entrada del con%ertidor !R- Gel pin )!2I& Por eemplo#
mikroElektronika
voltage:.1J1/
En un dispositi%o real se puede %isuali4ar temperatura actual o alg6n otro %alor medido
en %e4 de %oltae&
Para 0ue este eemplo 1uncione apropiadamente, es necesario marcar las siguientes
li5rer7as en la %entana /i5rar2 Manager antes de compilar el programa#
!-C
/C-
/*Cabecera*****************************************************/
// Conexiones del mdulo LCD
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
// Final de las conexiones del mdulo LCD
// Declarar variables
unsigned char ch;
unsigned int adc_rd;
char *text;
long tlong;
void main() {
INTCON = 0; // Todas las interrupciones
deshabilitadas
ANSEL = 0x04; // Pin RA2 se configura como una
entrada analgica
TRISA = 0x04;
ANSELH = 0; // Los dems pines se configuran como
digitales

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

text = "mikroElektronika"; // Definir el primer mensaje
Lcd_Out(1,1,text); // Escribir el primer mensaje en la
primera lnea

text = "LCD example"; // Definir el segundo mensaje
Lcd_Out(2,1,text); // Definir el primer mensaje

ADCON1 = 0x82; // Voltaje de referencia para la
conversin A/D es VCC
TRISA = 0xFF; // Todos los pines del puerto PORTA
se configuran como entradas
Delay_ms(2000);

text = "voltage:"; // Definir el tercer mensaje

while (1) {
adc_rd = ADC_Read(2); // Conversin A/D. Pin RA2 es una
entrada.
Lcd_Out(2,1,text); // Escribir el resultado en la
segunda lnea
tlong = (long)adc_rd * 5000; // Convertir el resultado en
milivoltios
tlong = tlong / 1023; // 0..1023 -> 0-5000mV
ch = tlong / 1000; // Extraer voltios (miles de
milivoltios)

// del resultado
Lcd_Chr(2,9,48+ch); // Escribir resultado en formato
ASCII
Lcd_Chr_CP('.');
ch = (tlong / 100) % 10; // Extraer centenas de milivoltios
Lcd_Chr_CP(48+ch); // Escribir resultado en formato
ASCII
ch = (tlong / 10) % 10; // Extraer decenas de milivoltios
Lcd_Chr_CP(48+ch); // Escribir resultado en formato
ASCII
ch = tlong % 10; // Extraer unidades de milivoltios
Lcd_Chr_CP(48+ch); // Escribir resultado en formato
ASCII
Lcd_Chr_CP('V');
Delay_ms(1);
}
}
J.1 EGEM41O 11
C01-%32'234% )$/3'+ RS-BMB
Este eemplo muestra cmo utili4ar el mdulo E?+!). del microcontrolador& /a
cone9in a una PC se $a5ilita por medio del est3ndar de comunicacin )+-232& El
programa 1unciona de la siguiente manera& Cada 52te reci5ido por medio de la
comunicacin serial se %isuali4a al utili4ar los /E-s conectados al puerto P*).A 2
despu"s se de%uel%e autom3ticamente al transmisor& +i ocurre un error en recepcin, se
lo indicar3 al encender el diodo /E-& /a manera m3s 13cil es compro5ar el
1uncionamiento del dispositi%o en la pr3ctica al utili4ar un programa est3ndar de
WindoSs denominado 3&per 8erminal&
/*Cabecera******************************************************/
unsigned short i;
void main() {
UART1_Init(19200); // Inicializar el mdulo USART
// (8 bits, tasa de baudios 19200, no hay bit
// de paridad...)

while (1) {
if (UART1_Data_Ready()) { // si se ha recibido un dato
i = UART1_Read(); // leerlo
UART1_Write(i); // enviarlo atrs
}
}
}
Para 0ue este eemplo 1uncione apropiadamente, es necesario marcar la li5rer7a ?!).
en la %entana /i5rar2 Manager antes de compilar el programa#
?!).
J.1J EGEM41O 1+
M$*3234% *$ &$1.$/'&-/' .0/ 1$*30 *$+ )$%)0/ DSANBCH U)0 *$+
./0&020+0 OA-<3/$PHHH
/a medicin de temperatura es una de las tareas m3s 1recuentes reali4adas por el
microcontrolador& En este eemplo, se utili4a un sensor -+182; para medir& Es capa4 de
medir en el rango de LL vC a 12L vC con e9actitud de ;&L vC& Para transmitir los datos al
microcontrolador se utili4a un tipo especial de la comunicacin serial denominado 1-
Sire& -e5ido al $ec$o de 0ue estos sensores son simples de utili4ar 2 de grandes
capacidades, los comandos utili4ados para $acerlos 1uncionar 2 controlarlos tienen la
1orma de 1unciones almacenadas en la li5rer7a *nejWire& En total son las siguientes tres
1unciones#
OwZ(eset se utili4a para reiniciar el sensorV
OwZ(ea! se utili4a para reci5ir los datos del sensorV 2
OwZNrite se utili4a para en%iar los comandos al sensor
Este eemplo muestra la %entaa de utili4ar li5rer7as con las 1unciones listas para ser
utili4adas& Concretamente, no tiene 0ue e9aminar la documentacin proporcionada por
el 1a5ricante para utili4ar el sensor& Aasta con copiar alguna de estas 1unciones en el
programa& +i le interesa sa5er cmo se declaran, 5asta con pulsar so5re alguna de ellas 2
seleccione la opcin :elp&
/*Cabecera******************************************************/
// Conexiones del mdulo LCD
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
// Final de conexiones del mdulo LCD
const unsigned short TEMP_RESOLUTION = 9;
char *text = "000.0000";
unsigned temp;
void Display_Temperature(unsigned int temp2write) {
const unsigned short RES_SHIFT = TEMP_RESOLUTION - 8;
char temp_whole;
unsigned int temp_fraction;

// comprobar si la temperatura es negativa
if (temp2write & 0x8000) {
text[0] = '-';
temp2write = ~temp2write + 1;
}

// extraer temp_whole
temp_whole = temp2write >> RES_SHIFT ;

// convertir temp_whole en caracteres
if (temp_whole/100)
text[0] = temp_whole/100 + 48;
else
text[0] = '0';
text[1] = (temp_whole/10)%10 + 48; // Extraer dgito de decenas
text[2] = temp_whole%10 + 48; // Extraer dgito de unidades

// extraer temp_fraction y convertirlo en unsigned int
temp_fraction = temp2write << (4-RES_SHIFT);
temp_fraction &= 0x000F;
temp_fraction *= 625;

// convertir temp_fraction en caracteres
text[4] = temp_fraction/1000 + 48; // Extraer dgito de miles
text[5] = (temp_fraction/100)%10 + 48; // Extraer dgito de centenas
text[6] = (temp_fraction/10)%10 + 48; // Extraer dgito de decenas
text[7] = temp_fraction%10 + 48; // Extraer dgito de unidades

// Visualizar temperatura en el LCD
Lcd_Out(2, 5, text);
}
void main() {
ANSEL = 0; // Configurar los pines AN como digitales
ANSELH = 0;
C1ON_bit = 0; // Deshabilitar los comparadores
C2ON_bit = 0;

Lcd_Init(); // Inicializar el LCD
Lcd_Cmd(_LCD_CLEAR); // Borrar el LCD
Lcd_Cmd(_LCD_CURSOR_OFF); // Apagar el cursor
Lcd_Out(1, 1, " Temperatura: ");

// Visualizar el carcter de grado, 'C' para centgrados
Lcd_Chr(2,13,223); // distintos visualizadores LCD tienen diferentes
cdigos

// de caracteres para el grado
// si ve la letra griega Alfa, intente introducir 178 en vez de 223
Lcd_Chr(2,14,'C');

//--- bucle principal
do {
//--- realizar lectura de temperatura
Ow_Reset(&PORTE, 2); // Seal de reinicio de Onewire
Ow_Write(&PORTE, 2, 0xCC); // Ejecutar el comando SKIP_ROM
Ow_Write(&PORTE, 2, 0x44); // Ejecutar el comando CONVERT_T
Delay_us(120);
Ow_Reset(&PORTE, 2);
Ow_Write(&PORTE, 2, 0xCC); // Ejecutar el comando SKIP_ROM
Ow_Write(&PORTE, 2, 0xBE); // Ejecutar el comando READ_SCRATCHPAD
temp = Ow_Read(&PORTE, 2);
temp = (Ow_Read(&PORTE, 2) << 8) + temp;
//--- Formatear y visualizar el resultado en el LCD
Display_Temperature(temp);
Delay_ms(500);
} while (1);
}
Para 0ue este eemplo 1uncione apropiadamente, es necesario marcar las siguientes
li5rer7as en la %entana /i5rar2 Manager antes de compilar el programa#
*nejWire
/C-
J.1R E3AM41E 1
G$%$/'234% *$ )0%3*0K +39/$/F' *$ )0%3*0HHH
/as se8ales de audio se utili4an con 1recuencia cuando se necesita llamar la atencin de
usuario, con1irmar 0ue alguno de los 5otones se $a pulsado, a%isar 0ue se $a llegado
$asta los %alores m7nimos o m39imos etc& Pueden ser una simple se8al de pitido as7
como melod7as de una duracin m3s larga o m3s corta& En este eemplo se muestra la
generacin de sonido por medio de 1unciones 0ue pertenecen a la li5rer7a +ound&
!dem3s de estas 1unciones, la 1uncin Autton 0ue pertenece a la misma li5rer7a se
utili4a para pro5ar los 5otones de presin&
/*Cabecera******************************************************/
void Tone1() {
Sound_Play(659, 250); // Frecuencia = 659Hz, duracin = 250ms
}
void Tone2() {
Sound_Play(698, 250); // Frecuencia = 698Hz, duracin = 250ms
}
void Tone3() {
Sound_Play(784, 250); // Frecuencia = 784Hz, duracin = 250ms
}
void Melody1() { // Componer una meloda divertida 1
Tone1(); Tone2(); Tone3(); Tone3();
Tone1(); Tone2(); Tone3(); Tone3();
Tone1(); Tone2(); Tone3();
Tone1(); Tone2(); Tone3(); Tone3();
Tone1(); Tone2(); Tone3();
Tone3(); Tone3(); Tone2(); Tone2(); Tone1();
}
void ToneA() { // Tono A
Sound_Play( 880, 50);
}
void ToneC() { // Tono C
Sound_Play(1046, 50);
}
void ToneE() { // Tono E
Sound_Play(1318, 50);
}
void Melody2() { // Componer una meloda divertida 2
unsigned short i;

for (i = 9; i > 0; i--) {
ToneA(); ToneC(); ToneE();
}
}
void main() {
ANSEL = 0; // Todos los pines de E/S son digitales
ANSELH = 0;
TRISB = 0xF0; // Pines RB7-RB4 se configuran como
entradas

// RB3 se configura como salida
Sound_Init(&PORTB, 3);
Sound_Play(1000, 500);

while (1) {
if (Button(&PORTB,7,1,1)) // RB7 genera Tono1
Tone1();
while (PORTB & 0x80) ; // Esperar que se suelte el botn
if (Button(&PORTB,6,1,1)) // RB6 genera Tono2
Tone2();
while (PORTB & 0x40) ; // Esperar que se suelte el botn
if (Button(&PORTB,5,1,1)) // RB5 genera meloda 2
Melody2();
while (PORTB & 0x20) ; // Esperar que se suelte el botn
if (Button(&PORTB,4,1,1)) // RB4 genera meloda 1
Melody1();
while (PORTB & 0x10) ; // Esperar que se suelte el botn
}
}
Para 0ue este eemplo 1uncione apropiadamente, es necesario marcar las siguientes
li5rer7as en la %entana /i5rar2 Manager antes de compilar el programa#
Autton
+ound
J.1" EGEM41O 1J
U&3+3?'/ $+ 53)-'+3?'*0/ LCD ,/76320
?n /C- gr31ico G[/C-I proporciona un m"todo a%an4ado para %isuali4ar mensaes&
Mientras 0ue un /C- de caracteres puede %isuali4ar slo caracteres al1anum"ricos, el
/C- gr31ico puede %isuali4ar los mensaes en 1orma de di5uos 2 mapas de 5its& El
/C- gr31ico utili4ado con m3s 1recuencia tiene una resolucin de pantalla de 128964
p79eles& El contraste de un [/C- se puede austar por medio del potencimetro P1&
En este eemplo el [/C- %isuali4a una secuencia de im3genes, de las 0ue un mapa de
5its representa un camin almacenado en otro arc$i%o denominado truc]j5mp&c& Para
$a5ilitar 0ue este programa 1uncione apropiadamente, usted de5e a8adir este arc$i%o
como arc$i%o 1uente a su pro2ecto&
/as directi%as del preprocesador incluidas en este eemplo le permiten elegir si 0uiere
%isuali4ar toda la secuencia de im3genes o slo una secuencia corta& Por de1ecto se
%isuali4ar3 toda la secuencia de im3genes& +in em5argo, al a8adir un comentario delante
de la directi%a #define COMPLETE_EXAMPLE se des$a5ilita %isuali4ar algunas im3genes
de la secuencia& +i se comenta Go si se 5orraI esta directi%a, las sentencias entre las
directi%as #ifdef COMPLETE_EXAMPLE 2 #endif no ser3n compiladas, as7 0ue no se
eecutar3n&
/*Cabecera******************************************************/
//Declaraciones-------------------------------------------------------
----------
const code char truck_bmp[1024]; // Declarar la constante definida en
truck_bmp.c
// para utilizarla en este archivo
//--------------------------------------------------------final-de-
declaraciones
// Conexiones del mdulo Glcd
char GLCD_DataPort at PORTD;
sbit GLCD_CS1 at RB0_bit;
sbit GLCD_CS2 at RB1_bit;
sbit GLCD_RS at RB2_bit;
sbit GLCD_RW at RB3_bit;
sbit GLCD_EN at RB4_bit;
sbit GLCD_RST at RB5_bit;
sbit GLCD_CS1_Direction at TRISB0_bit;
sbit GLCD_CS2_Direction at TRISB1_bit;
sbit GLCD_RS_Direction at TRISB2_bit;
sbit GLCD_RW_Direction at TRISB3_bit;
sbit GLCD_EN_Direction at TRISB4_bit;
sbit GLCD_RST_Direction at TRISB5_bit;
// Final de conexiones del mdulo Glcd
void delay2S(){ // Funcin de tiempo de retardo de 2 segundos
Delay_ms(2000);
}
void main() {
unsigned short ii;
char *someText;

/* Esta directiva define un macro denominado COMPLETE_EXAMPLE. Ms
tarde en el
programa, la directiva ifdef prueba si este macro est definido. Si
se borra esta
lnea o si se transforma en un comentario, las secciones del cdigo
entre las
directivas ifdef y endif no sern compiladas. */

#define COMPLETE_EXAMPLE // Poner esta lnea como un comentario si
quiere
// visualizar la versin corta de la secuencia

ANSEL = 0; // Configurar los pines AN como digitales
ANSELH = 0;
C1ON_bit = 0; // Deshabilitar comparadores
C2ON_bit = 0;
Glcd_Init(); // Inicializar el GLCD
Glcd_Fill(0x00); // Borrar el GLCD

while(1) { // bucle infinito, la secuencia se
repite

/* Dibujar la primera imagen */
#ifdef COMPLETE_EXAMPLE
Glcd_Image(truck_bmp); // Dibujar la imagen
delay2S(); delay2S();
#endif
Glcd_Fill(0x00); // Borrar el GLCD

/* Dibujar la segunda imagen */
Glcd_Box(62,40,124,56,1); // Dibujar la caja
Glcd_Rectangle(5,5,84,35,1); // Dibujar el rectngulo
Glcd_Line(0, 0, 127, 63, 1); // Dibujar la lnea

delay2S();

for(ii = 5; ii < 60; ii+=5 ){ // Dibujar lneas horizontales y
verticales
Delay_ms(250);
Glcd_V_Line(2, 54, ii, 1);
Glcd_H_Line(2, 120, ii, 1);
}

delay2S();
Glcd_Fill(0x00); // Borrar el GLCD

/* Dibujar la tercera imagen */

#ifdef COMPLETE_EXAMPLE
Glcd_Set_Font(Character8x7, 8, 7, 32); // Seleccionar la fuente,
ver
// __Lib_GLCDFonts.c en la carpeta Uses
#endif

Glcd_Write_Text("mikroE", 1, 7, 2); // Escribir la cadena
for (ii = 1; ii <= 10; ii++) // Dibujar los crculos
Glcd_Circle(63,32, 3*ii, 1);
delay2S();

Glcd_Box(12,20, 70,57, 2); // Dibujar la caja
delay2S();

/* Dibujar la cuarta imagen */
#ifdef COMPLETE_EXAMPLE
Glcd_Fill(0xFF); // Llenar el GLCD
Glcd_Set_Font(Character8x7, 8, 7, 32); // Cambiar de la fuente
someText = "8x7 Font";
Glcd_Write_Text(someText, 5, 0, 2); // Escribir la cadena
delay2S();
Glcd_Set_Font(System3x5, 3, 5, 32); // Cambiar de la fuente
someText = "3X5 CAPITALS ONLY";
Glcd_Write_Text(someText, 60, 2, 2); // Escribir la cadena
delay2S();
Glcd_Set_Font(font5x7, 5, 7, 32); // Cambiar de la fuente
someText = "5x7 Font";
Glcd_Write_Text(someText, 5, 4, 2); // Escribir la cadena
delay2S();
Glcd_Set_Font(FontSystem5x7_v2, 5, 7, 32); // Cambiar de la fuente
someText = "5x7 Font (v2)";
Glcd_Write_Text(someText, 5, 6, 2); // Escribir la cadena
delay2S();
#endif
}
}
truckZ9mp.c#
/*Cabecera*****************************************************/
unsigned char const truck_bmp[1024] = {
0, 0, 0, 0, 0,248, 8, 8, 8, 8, 8, 8, 12, 12, 12, 12,
12, 10, 10, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9,137,137,137,137,137,137,
137,137,137,137,137,137,137, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 13,253, 13,195, 6,252, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
240,240,240,240,240,224,224,240,240,240,240,240,224,192,192,224,
240,240,240,240,240,224,192, 0, 0, 0,255,255,255,255,255,195,
195,195,195,195,195,195, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0,255,240, 79,224,255, 96, 96, 96, 32, 32, 32, 32, 32,
32, 32, 32, 32, 32, 32, 32, 32, 64, 64, 64, 64,128, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
255,255,255,255,255, 0, 0, 0, 0,255,255,255,255,255, 0, 0,
0, 0,255,255,255,255,255, 0, 0, 0,255,255,255,255,255,129,
129,129,129,129,129,129,128, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0,255, 1,248, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 16,224, 24, 36,196, 70,130,130,133,217,102,112,
160,192, 96, 96, 32, 32,160,160,224,224,192, 64, 64,128,128,192,
64,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 63, 96, 96, 96,224, 96, 96, 96, 96, 96, 96,
99, 99, 99, 99, 99, 96, 96, 96, 96, 99, 99, 99, 99, 99, 96, 96,
96, 96, 99, 99, 99, 99, 99, 96, 96, 96, 99, 99, 99, 99, 99, 99,
99, 99, 99, 99, 99, 99, 99, 96, 96, 96, 96, 96, 96, 96, 64, 64,
64,224,224,255,246, 1, 14, 6, 6, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2,130, 67,114, 62, 35, 16, 16, 0, 7, 3, 3, 2,
4, 4, 4, 4, 4, 4, 4, 28, 16, 16, 16, 17, 17, 9, 9, 41,
112, 32, 67, 5,240,126,174,128, 56, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1,
1, 1,127,127,127,127,255,255,247,251,123,191, 95, 93,125,189,
189, 63, 93, 89,177,115,243,229,207, 27, 63,119,255,207,191,255,
255,255,255,255,255,255,255,127,127,127,127,127,127,127,127,255,
255,255,127,127,125,120,120,120,120,120,248,120,120,120,120,120,
120,248,248,232,143, 0, 0, 0, 0, 0, 0, 0, 0,128,240,248,
120,188,220, 92,252, 28, 28, 60, 92, 92, 60,120,248,248, 96,192,
143,168,216,136, 49, 68, 72, 50,160, 96, 0, 0, 0, 0, 0, 0,
0, 0, 0,128,192,248,248,248,248,252,254,254,254,254,254,254,
254,254,254,254,254,255,255,255,255,255,246,239,208,246,174,173,
169,128,209,208,224,247,249,255,255,252,220,240,127,255,223,255,
255,255,255,255,255,254,254,255,255,255,255,255,255,255,254,255,
255,255,255,255,255,255,254,254,254,254,254,254,254,254,254,254,
254,254,254,254,255,255,255,255,255,255,254,255,190,255,255,253,
240,239,221,223,254,168,136,170,196,208,228,230,248,127,126,156,
223,226,242,242,242,242,242,177, 32, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 1, 1, 1, 1, 3, 3, 3, 7, 7, 7, 7, 7, 15,
15, 15, 7, 15, 15, 15, 7, 7, 15, 14, 15, 13, 15, 47, 43, 43,
43, 43, 43, 47,111,239,255,253,253,255,254,255,255,255,255,255,
191,191,239,239,239,191,255,191,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,127,127,127,127,255,255,191,191,191,191,255,254,
255,253,255,255,255,251,255,255,255,127,125, 63, 31, 31, 31, 31,
31, 31, 63, 15, 15, 7, 7, 3, 3, 3, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0,
1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1,
1, 1, 1, 1, 3, 3, 3, 11, 11, 11, 11, 7, 3, 14, 6, 6,
6, 2, 18, 19, 19, 3, 23, 21, 21, 17, 1, 19, 19, 3, 6, 6,
14, 15, 15, 7, 15, 15, 15, 11, 2, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
Para 0ue este eemplo 1uncione apropiadamente, es necesario marcar la li5rer7a [/C-
en la %entana Librar& 7anager antes de compilar el programa& !simismo, es necesario
incluir el documento trucGAbmp.c en el pro2ecto&
J.1$ EGEM41O 1R
U&3+3?'/ $+ .'%$+ &72&3+HHH
?n panel t3ctil es un panel 1ino, autoad$esi%o 2 transparente, colocado so5re la pantalla
de un /C- gr31ico& Es mu2 sensi5le a la presin as7 0ue un sua%e to0ue pro%oca
algunos cam5ios en la se8al de salida& :a2 di1erentes tipos de paneles t3ctiles& El m3s
sencillo es el panel t3ctil resisti%o del 0ue se $a5lar3 a0u7&
?n panel t3ctil est3 compuesto por dos l3minas r7gidas, 1ormando una estructura de
bs3ndSic$d 0ue tiene capas resisti%as en sus caras internas& /a resistencia de estas capas
no e9cede normalmente de 1To$m& /os lados opuestos de las l3minas disponen de los
contactos para acceder a un ca5le plano&
El procedimiento para determinar las coordenadas de la posicin del panel 0ue $a sido
presionado se puede di%idir en dos pasos& El primero es determinacin de la coordenada
Q, 2 el segundo es de determinar la coordenada M de la posicin&
Para determinar la coordenada Q, es necesario conectar el contacto i40uierdo en la
super1icie ! a la masa GtierraI 2 el contacto derec$o a la 1uente de alimentacin& Esto
permite o5tener un di%isor de %oltae al presionar el panel t3ctil& El %alor de %oltae
o5tenido en el di%isor se puede leer en el contacto in1erior de la super1icie A& El %oltae
%ariar3 en el rango de ;K al %oltae suministrado por la 1uente de alimentacin 2
depende de la coordenada Q& +i el punto est3 pr9imo al contacto i40uierdo de la
super1icie !, el %oltae estar3 pr9imo a ;K&
Para la determinacin de la coordenada M, es necesario conectar el contacto in1erior de
la super1icie A a masa GtierraI, mientras 0ue el contacto superior se conectar3 a la 1uente
de alimentacin& En este caso, el %oltae se puede leer en el contacto i40uierdo de la
super1icie ! &
Para conectar un panel t3ctil al microcontrolador es necesario crear un circuito para el
control del panel t3ctil& Por medio de este circuito, el microcontrolador conecta los
contactos adecuados del panel t3ctil a masa 2 a la %oltae de alimentacin Gcomo
descri5imos anteriormenteI para determinar las coordenadas Q 2 M& El contacto in1erior
de la super1icie A 2 el contacto i40uierdo de la super1icie ! est3n conectados al
con%ertidor !R- del microcontrolador& /as coordenadas Q e M se determinan midiendo
el %oltae en los respecti%os contactos& El so1tSare consiste en mostrar un men6 en una
pantalla /C- gr31ica, conmutar de encendido a apagado del panel t3ctil Gcontrol del
panel t3ctilI 2 leer los %alores del con%ertidor !R- 0ue representan realmente las
coordenadas Q e M de la posicin&
?na %e4 determinadas las coordenadas, es posi5le decidir 0u" es lo 0ue deseamos 0ue
$aga el microcontrolador& En este eemplo se e9plica cmo conmutar entre encendido 2
apagado dos pines digitales del microcontrolador, conectados a los /E-s ! 2 A&
En este eemplo se utili4an las 1unciones 0ue pertenecen a las li5rer7as [lcd 2 !-C&
8eniendo en cuenta ue la superficie del panel t"ctil es ligeramente ma&or ue la del
L,E gr"fico, en caso de reuerir una ma&or precisin en la determinacin de las
coordenadas, es necesario incluir el soft0are de calibracin del panel t"ctil.
/* Cabecera ***************************************************/
// Conexiones del mdulo Glcd
char GLCD_DataPort at PORTD;
sbit GLCD_CS1 at RB0_bit;
sbit GLCD_CS2 at RB1_bit;
sbit GLCD_RS at RB2_bit;
sbit GLCD_RW at RB3_bit;
sbit GLCD_EN at RB4_bit;
sbit GLCD_RST at RB5_bit;
sbit GLCD_CS1_Direction at TRISB0_bit;
sbit GLCD_CS2_Direction at TRISB1_bit;
sbit GLCD_RS_Direction at TRISB2_bit;
sbit GLCD_RW_Direction at TRISB3_bit;
sbit GLCD_EN_Direction at TRISB4_bit;
sbit GLCD_RST_Direction at TRISB5_bit;
// Final de conexiones del mdulo Glcd
// Declaracin de la cadena a visualizar en el GLCD
char msg1[] = "TOUCHPANEL EXAMPLE";
char msg2[] = "MIKROELEKTRONIKA";
char msg3[] = "BUTTON1";
char msg4[] = "BUTTON2";
char msg5[] = "RC6 OFF";
char msg6[] = "RC7 OFF";
char msg7[] = "RC6 ON ";
char msg8[] = "RC7 ON ";
// Declaracin de variables globales
long x_coord, y_coord, x_coord128, y_coord64; // almacenar la posicin
de las
// coordenadas x e y
// Leer la coordenada X
unsigned int GetX() {
//reading X
PORTC.F0 = 1; // DRIVEA = 1 (electrodo izquierdo (LEFT)
conectado, electrodo
// derecho (RIGHT) conectado, electrodo superior
(TOP)desconectado)
PORTC.F1 = 0; // DRIVEB = 0 (electrodo inferior (BOTTOM)
desconectado)
Delay_ms(5);
return ADC_Read(0); // leer el valor de X de RA0(BOTTOM)
}
// Leer la coordenada Y
unsigned int GetY() {
//Leer la Y
PORTC.F0 = 0; // DRIVEA = 0 (electrodo izquierdo (LEFT)
desconectado, electrodo
// derecho (RIGHT) desconectado, electrodo
superior (TOP) conectado)
PORTC.F1 = 1; // DRIVEB = 1 (electrodo inferior (BOTTOM)
conectado)
Delay_ms(5);
return ADC_Read(1); // leer el valor de Y de RA1 (del elctrodo
izquierdo LEFT)
}
void main() {
PORTA = 0x00;
TRISA = 0x03; // RA0 y RA1 son entradas analgicas
ANSEL = 0x03;
ANSELH = 0; // Configurar otros pines AN como digitales de E/S
PORTC = 0 ; // Todos los pines del puerto PORTC estn a 0
(incluyendo los
// pines RC6 y RC7)

TRISC = 0 ; // PORTC es una salida

// Inicializacin del GLCD
Glcd_Init(); // Glcd_Init_EP5
Glcd_Set_Font(FontSystem5x7_v2, 5, 7, 32); // Seleccionar el tamao
de fuente 5x7
Glcd_Fill(0); // Borrar GLCD
Glcd_Write_Text(msg1,10,0,1);
Glcd_Write_Text(msg2,17,7,1);

// Visualizar botones en el GLCD:
Glcd_Rectangle(8,16,60,48,1);
Glcd_Rectangle(68,16,120,48,1);
Glcd_Box(10,18,58,46,1);
Glcd_Box(70,18,118,46,1);

// Visualizar los mensajes en los botones
Glcd_Write_Text(msg3,14,3,0);
Glcd_Write_Text(msg5,14,4,0);
Glcd_Write_Text(msg4,74,3,0);
Glcd_Write_Text(msg6,74,4,0);

while (1) {
// leer X-Y y convertirlo en la resolucin de 128x64 pxeles
x_coord = GetX();
y_coord = GetY();
x_coord128 = (x_coord * 128) / 1024;
y_coord64 = 64 -((y_coord *64) / 1024);
//Si BUTTON1 ha sido presionado
if ((x_coord128 >= 10) && (x_coord128 <= 58) && (y_coord64 >= 18)
&&
(y_coord64 <= 46)) {
if(PORTC.F6 == 0) { // Si RC6 = 0
PORTC.F6 = 1; // Invertir el estado lgico
del pin RC6
Glcd_Write_Text(msg7,14,4,0); // Visualizar un nuevo mensaje:
RC6 ON
}
else { // Si RC6 = 1
PORTC.F6 = 0; // Invertir el estado lgico
del pin RC6
Glcd_Write_Text(msg5,14,4,0); // Visualizar un nuevo mensaje:
RC6 OFF
}
}
// Si BUTTON2 ha sido presionado
if ((x_coord128 >= 70) && (x_coord128 <= 118) && (y_coord64 >= 18)
&&
(y_coord64 <= 46)) {
if(PORTC.F7 == 0) { // Si RC7 = 0
PORTC.F7 = 1; // Invertir el estado lgico
del pin RC7
Glcd_Write_Text(msg8,74,4,0); // Visualizar un nuevo mensaje:
RC7 ON
}
else { // Si RC7 = 1
PORTC.F7 = 0; // Invertir el estado lgico
del pin RC7
Glcd_Write_Text(msg6,74,4,0); // Visualizar un nuevo mensaje:
RC7 OFF
}
}
Delay_ms(100);
}
}
Para 0ue este eemplo 1uncione apropiadamente, es necesario marcar las siguientes
li5rer7as en la %entana Librar& 7anager antes de compilar el programa&
[/C-
!-C
Cj+tdli5
A.Q%*32$ AR E) 80/' *$ *35$/&3/)$
*n microcontrolador se parece a un ;genio en la botella<, & no se necesita saber
mucho para utilizarlo. 9ara crear un dispositivo controlado por un microcontrolador,
se necesita una 9,, programa para compilar & un dispositivo para transmitir el cdigo
de la 9, al chip mismo. !unue este proceso parece mu& lgico, con frecuencia surgen
las dudas, no por ue es complicado, sino por un gran n:mero de variaciones. ! ver...
!&1 K!M*+ ! EMPEZ!)&&&
!&2 C*MPI/!CIU' -E P)*[)!M!
!&3 P)*[)!M!) E/ MIC)*C*'.)*/!-*)
!&4 +I+.EM!+ -E -E+!))*//*
/AMO- A EM4EAA(...
/os programas especiales en el entorno de WindoSs se utili4an para escri5ir un
programa para el microcontrolador& Este li5ro descri5e el programa denominado
mi]roC P)* 1or PIC& /a %entaa principal de este programa son las $erramientas
adicionales instaladas para 1acilitar el proceso de desarrollo&
+i tiene e9periencia en escri5ir programas, entonces sa5e 0ue se trata de escri5ir todas
las instrucciones en el orden en el 0ue se de5en eecutar por el microcontrolador 2
o5ser%ar las reglas del lenguae C& En otras pala5ras, slo tiene 0ue seguir su idea al
escri5ir el programa& >Esto es todo@
A.+ %OM4&1A%&*' DE 4(O=(AMA
El microcontrolador no entiende los lenguaes de alto ni%el de programacin, de a$7 0ue
sea necesario compilar el programa en lenguae m30uina& Aasta con pulsar slo una %e4
so5re el icono apropiado dentro del compilador para crear un documento nue%o con
e9tensin &$e9& En realidad, es el mismo programa, pero compilado en lenguae
m30uina 0ue el microcontrolador entiende per1ectamente& Este programa se le denomina
con 1recuencia un cdigo $e9 2 1orma una secuencia de n6meros $e9adecimales
aparentemente sin signi1icado&
?na %e4 compilado, el programa se de5e cargar en el c$ip& ?sted necesita un $ardSare
apropiado para $acerlo posi5le - un programador&
PROGRAMAR EL MICROCONTROLADOR
Como $emos mencionado, para $a5ilitar cargar un cdigo $e9 en el microcontrolador es
necesario proporcionar un dispositi%o especial, denominado el programador, con
so1tSare apropiado& ?n gran n6mero de programas 2 circuitos electrnicos utili4ados
con este propsito se pueden encontrar en Internet& El procedimiento es 53sicamente el
mismo para todos ellos 2 se parece a lo siguiente#
1& Colo0ue el microcontrolador en el 4calo apropiado del programadorV
2& ?tilice un ca5le adecuado para conectar el programador a una PCV
3& !5ra el programa en cdigo $e9 dentro de so1tSare del programador, auste
%arios par3metros, 2 pulse so5re el icono para transmitir el cdigo& Pocos
segundos despu"s, una secuencia de ceros 2 unos se %a a programar en el
microcontrolador&
+lo $a 0uedado instalar el c$ip programado en el dispositi%o destino& +i es necesario
$acer algunos cam5ios en el programa, el procedimiento anterior se puede repetir un
n6mero ilimitado de %eces&
A. C-E(V )' <&'A1 <E1&AD
Esta seccin descri5e en 5re%e el uso del programa GcompiladorI miGro, 9HI for 96, 2
del so1tSare de programacin GprogramadorI 96,flash& .odo es mu2 simple&&&
?sted 2a tiene instalado el miGro, 9HI for 96,, <%erdad= !l iniciarlo, a5ra un pro2ecto
nue%o 2 un documento nue%o con e9tensin &c dentro del mismo& Escri5a su programa&&&
*T& .$e program $as 5een Sritten and tested Sit$ t$e simulator& It did not report an2
errors during t$e process o1 compiling into t$e hex code= It seems t$at e%er2t$ing is
under control&&&
-e acuerdo& El programa $a sido escrito 2 pro5ado con el simulador& <'o $a in1ormado
de ning6n error durante el proceso de compilacin en el cdigo $e9= Parece 0ue todo
1unciona per1ecto&&&
El programa $a sido compilado con "9ito& +lo 0ueda cargarlo en el microcontrolador&
!$ora necesita un programador 0ue est3 compuesto por so1tSare 2 $ardSare& Inicie el
programa 96,>lash&
/a con1iguracin es simple 2 no $acen 1alta e9plicaciones adicionales Gtipo de
microcontrolador, 1recuencia 2 relo del oscilador etc&I&
Conecte la PC con el $ardSare del programador por un ca5le ?+AV
Cargue el cdigo $e9 utili4ando el comando# File a /oad :EQV 2
Pulse so5re el 5otn Write 2 espere&&&
>Esto es todo@ El microcontrolador est3 programado 2 todo est3 listo para su
1uncionamiento& +i no est3 satis1ec$o, $aga algunos cam5ios en el programa 2 repita el
procedimiento& <:asta cu3ndo= :asta 0uedar satis1ec$o&&&
A.J -&-TEMA- DE DE-A((O11O
?n dispositi%o 0ue puede simular cual0uier dispositi%o en la 1ase de prue5a, es
denominado un sistema de desarrollo& !parte del programador, unidad de alimentacin,
4calo del microcontrolador, el sistema de desarrollo dispone de los componentes para
acti%ar los pines de entrada 2 monitorear los pines de salida& /a %ersin m3s simple
tiene cada pin conectado a su respecti%o 5otn de presin 2 un /E-&
?na %ersin de calidad alta tiene los pines conectados a los %isuali4adores /E-,
%isuali4adores /C-, sensores de temperatura u otros componentes por los 0ue puede
estar compuesto un dispositi%o destino& +i es necesario, todos estos peri1"ricos pueden
estar conectados al microcontrolador por medio de los puentes& Esto permite pro5ar el
programa entero en la pr3ctica a6n durante el proceso de desarrollo, por0ue el
microcontrolador no Bsa5e o no le interesaC si su entrada est3 acti%ada por un 5otn de
presin o un sensor incorporado en un dispositi%o real&
+i dispone de un sistema de desarrollo, el proceso de programar 2 pro5ar un programa
es a6n m3s sencillo& .eniendo en cuenta 0ue el compilador mi]roC P)* 1or PIC Gen su
PCI 2 el $ardSare del programador PIC1las$ Gen su sistema de desarrolloI cola5oran
per1ectamente, el proceso de compilar un programa 2 programar el microcontrolador se
lle%a a ca5o en un simple paso - al pulsar so5re el icono Auild and Program dentro del
compilador& -esde este momento, cual0uier cam5io en el programa a1ectar3
inmediatamente al 1uncionamiento de alguno de los componentes del sistema de
desarrollo&
<Est3 de acuerdo con nosotros 0ue es $ora de di%ertirse=
C'/'2&$/F)&32') ./3%23.'+$) *$+ )3)&$1' *$ *$)'//0++0 E'):PICD
1& )egulador de %oltae de alimentacin
2& Conector ?+A para el programador en la placa
3& Programador ?+A 2&; con soporte de mi]roIC-
4& Zcalo para el sensor de temperatura -+182;
L& Conector para el depurador e9terno GIC-2 o IC-3I de Microc$ip
6& Conector para la comunicacin ?+A
7& Entradas de prue5a del con%ertidor !R-
8& Conector P+R2
H& /C- 2916 en la placa
1;& Interruptores -IP permiten el 1uncionamiento de las resistencias pull-upRpull-
doSn
11& Puente para seleccionar las resistencias pull-upRpull-doSn
12& Conectores de los puertos ER+
13& Zcalo para colocar el microcontrolador PIC
14& Controlador del panel t3cti
1L& E9tensor de puertos
16& Conector del /C- gr31ico128964
17& Potencimetro de contraste del /C- gr31ico
18& Conector de panel t3ctil
1H& .eclado Menu
2;& .eclado 494
21& Aotones de presin para simular las entradas digitales
22& Puente para seleccionar el estado lgico de los 5otones de presin
23& Puente para poner en cortocircuito la resistencia de proteccin
24& Aotn para reiniciar el microcontrolador
2L& 36 diodos /E- indican el estado lgico de los pines
26& !uste de contraste del /C- al1anum"rico
27& Conector del /C- al1anum"rico
28& Conector para la comunicacin )+-232
LOS MICROCONTROLADORES PIC
/os microcontroladores PIC, dise8ados por Microc$ip .ec$nolog2 pro5a5lemente son
la meor opcin para los principiantes& :e a0u7 por 0u"&&&
El nom5re original de este microcontrolador es PICmicro GPerip$eral Inter1ace
ControllerI, pero es meor conocido como PIC& +u ancestro, llamado el PIC16L;, 1ue
dise8ado en 1H7L por [eneral Instruments& Es usado para 1ines totalmente di1erentes&
!lrededor de die4 a8os despu"s, este circuito se trans1orm en un microcontrolador PIC
real mediante la adicin de memoria EEP)*M& :o2 en d7a, Microc$ip .ec$nolog2
anuncia la 1a5ricacin de la muestra n6mero L mil millones&
.odos los microcontroladores PIC usan la ar0uitectura :ar%ard, lo 0ue signi1ica 0ue su
memoria de programa est3 conectada a la CP? por m3s de 8 l7neas& -ependiendo del
anc$o del auto56s del de microcontrolador, $a2 12 -, 14 - 2 16-5its&
%O'G)'TO DE &'-T()%%&O'E-
El conunto de instrucciones para la PIC16F8QQ inclu2e 3L instrucciones en total& /a
ra4n de un n6mero tan reducido de instrucciones se encuentra en la ar0uitectura )I+C&
Esto signi1ica 0ue las instrucciones est3n 5ien optimi4adas en cuanto a %elocidad,
sencille4 de la ar0uitectura 2 compacidad de cdigo& /o malo de la ar0uitectura )I+C es
0ue el programador de5e $acer 1rente a estas instrucciones& Por supuesto, esto slo es
rele%ante si se utili4a el lenguae ensam5lador para la programacin& Este li5ro se re1iere
a la programacin en el lenguae de A!+IC , lo 0ue signi1ica 0ue la ma2or7a del tra5ao
2a 1ue reali4ado por alguien mas& +lo tienes 0ue utili4ar instrucciones relati%amente
simples&
T&EM4O DE EGE%)%&O' DE &'-T()%%&*'
.odas las instrucciones son de un solo ciclo de instruccin& /a 6nica e9cepcin son las
instrucciones de salto condicional Gsi la condicin se cumpleI o instrucciones reali4adas
en el contador de programa& En am5os casos, son necesarios dos ciclos para la eecucin
de la instruccin, mientras 0ue el segundo ciclo se eecuta como un '*P G'o
*perationI& ?n ciclo de instruccin constar3 de cuatro ciclos de relo& +i se utili4a el
oscilador de 4 M:4, el tiempo nominal para la eecucin de la instruccin es 1_+& En
cuanto a las instrucciones de salto, el tiempo de eecucin de la instruccin es 2_+&
ArEuitectura !e los microcontrola!ores 4&% !e 8 9its. 1a eHistencia !e
!etermina!o mo!ulo en el microcontrola!or !epen!e !el mo!elo !el mismo
E+F?EM! -E C*'EQIU' P!)! E/ ?+* -E/ MIC)*C*'.)*/!-*)

You might also like