Sie sind auf Seite 1von 270

COMPILADOR C CCS In~)

Y SIMoLADOR PROTEUS
PARA
MICROCONTROLADORES PIC
Eduardo Garcia Breiio

A Alfaomega ediclones tecn ! cils


COMPILADOR C CCS
y

S.MULADOR PROTEUS
PARA

MICROCONTROLADORES PIC

Eduardo Garcia Breijo

f1. Alfaomega
Datos C31111ognificos
Garcia. Eduardo
Compilador C CCS Ysimulador PROTEUS para
Microcontroladores PIC
Primera &lici6n
Alfnomegn Gropo Editor. S.A. de c.y., Mexico
ISBN : 978-970-15-1397-2
Formato: 17 x 23 cm Paginas: 276

Compilador C CCS Y simulador PROTEUS para Microcontroladores PIC


Eduardo Garcia Breijo
ISBN: 978-84-267-1495-4. edici6n original pJblicada por MARCOMBO. S.A .• Barcelona. Espana
Derechos reservados Cl MARCOMBO. S.A.
Primcra edici6n: Alfaomcga Gropo Editor, Mexico. junio de 2008.

@ 2008AlfaomegaCrupo Editor, S.A. de C.Y.


Pilagoras r 139, Col. Del Valle, 03100, Mexico D.F.
Micmbm dc la Camara Nacional de In Industria Edilorial Mexicana
Registm No. 2317

pag. Web: hUp:llwww.alfaomega.com.mx


E-mail: libreriapitagoras@alfaomega.com.mx

(SBN: 978·970-15-1397-2

Derechos rescrvados:
Esta obrn cs propiedad inrelecrual de su autor y los derechos de p.!blicaci6n en Jengua espanola han
sido legulmcnte mmsferidos al edita-. Prohibida su reproducci6n parcial 0 total por cualquicr medio
sin permisQ por escnlO del propietario de los derechos del copyright

Nola imporlanlt":
La infonnaci6n contcnida en esta obra tiene un fin exclusivamente didOCtico y. por 10 tanto. 00 esll1
previsto su aprovcchamiento a nivel profesional 0 industrial. Las indicacioncs tocnicas y programas
incluidos. han sido elabomdos con gnm cuidado por el aUlor y reproducidos bajo estrictas oormas
de control. ALFAOMEGA GR UPO EDlmR, S.A. de C. V. no sera jurCdicrunente responsable
por: errores u omisiones: daflos y peJjuicios que se pudieran atribuir al uso de In infonnaci6n
comprendida en este libro y en eJ CD-ROM adjunto. ni por la utiJizaci6n indebida que pudieradmeJe.
Edici6n 3U{orizada para venia en Mexico y todo el cominente americano.
Impreso en Mhico. Printed in Mexico.

Empresas del grupo:


Mbko: Alfaomega Grupo Editor. S.A. de C.V. - PimgOl1lS 1139. Col. Del Valle. Mtxico. D.P. - c. P. 03100.
Tel.: (52-55) 5089-7740 _ Pax (52-55) 5575-2420 12490. Sin costo: OI·SOO-020-4396
E-mail: libreriapitagoras@alfaomega.com.mx
Colombia: Alfoomega Colombiana S.A. - Carrera 15 No. 64 A 29 - PBX (57-1 ) 2100122
fax : (57-]) 6068648 - E-mail: sciienlC@alfaomega.com.co
ChU..: Alfaomega Grupo Editor. S.A. - General del Canto 37Q.-Providencia. Sanliago. Chil"
Tel. : (56-2) 235-4248 - Fax: (56-2) 235-5786 - E-mail: agechik@alfaomega.cI
Argentina: Alfaomega Grupo Editor Argentino. S.A. _ Paraguay 13Q7 P.B. r I". Capilal Federal.
H

Buenos Aires. C.P. 1057 - Tel.: (54-11) 481 1-7183 f 8352, E-mail: info@alfaomegaeditor.com.ar
In dice analitico
1. ISIS de PROTEUS VSM ................................................................... 1
1.1 Introduccion ........................................... ........................................................................ 1
1.2 Captura ele<:tr6nica: entorno gnifico IS IS ................................................................. 2
1.3 D epumci6n de los s.istemas basados en PICmicro ................................................. 12
2. Compilador CCS C .................................................. ....................... 23
2.1 Introducci6n..................................... .................... ............................... .............23
2.2 Estructura de un programa ........... ........................................ .................................. 24
2.3 Tipos de cla(QS ........... .................... .........•......... . ...........•••.•...••24
2.4 Las constantes ...... .... ........ ........ ........................ ...........................25
2.5 Variables ..... ............. ........ ....................... .. .......................... .26
2.6 Operndore5 .................................................................................................................27
2.6.1 Asignaci6n ............................................................................................................................... 27
2.6.2 Ariunecicos ..................................................................................................................... _....... 27
2.6.3Rclaciona1es .......................... .......................................................... ........................................ 28
2.6.4LOgicos ..................................................................................................................................... 28
2.6.5Dc biLS •.•.•.•.•.•..............................................•..•.•.•..•.•.•.•.......................................................... 28
2.6.6Puntcros ................................................................................................................................... 28
2.7 Funciones ................................................................................................................... .. 29

2.8 D eclaraciones de control ...................... ......................................................................30
2.8.1 IF-ELSE................................................................................................................................. 31
2.8.2 S\VITCH ..........................................................................................................•...................... 33
2.8.3 FOR .......................................................................................................................................... 34
2.8.4 \VH.lLE I DO-\VHfLE ................................................................................•....................... 35
2.8.5 Ou-os ......................................................................................................................................... 37
2.9 Comentarios ...... ................................................. ..............................................37
2. 10 Directivas y funciones (preprocessor commands y built-in functions) ............ 38
2. 10.1 Dircccivas ............................................................................................................................. 38
2.10.2 Funciones............................................................................................................................... 40
2.1 1 Librerias, drivers y ejemplos ................ ........ ............................................................. 43
2.12 Emorno de rrabajo de CCS C Compiler .......................................... ..................... .43
2.12.1 Introduccion.............................................................................................. ............................ 43
2.12.2 Emorno de rrabaio ................................................................................. .................... 44
3. La gesti6n de los puertos ......................................... ... .................... 55
3.1 Introducci6n ........................................ .........................................................................55
3.2 Gestion de pucrtos en c. .... ................................................. ....................................
.57
3.2.1 A travcsdc la RA.L\I ................................................................................................................ 57

v
3.2.2 A traves de !:Is dircccivas ........................................................................ ........................ 60
3.2.3 Con punteros ................. ........................................................................................................ 62
3.3 Entradas y salidas........ ................. ........... .......... ................................... 65
3.3.1 LCD. ........................................................................................................................... 65
3.3.2 LCD gniitco.......................................................................................................................... 70
3.3.3 Tedado (keypad 3x4) ........................................................................................................... 75
4. Las interrupcioncs y los tcmporizadorcs ............................ ............ 83
4.1 Jntroducdon.............................................................. ......... ................ .... ........... 83
4.2 Jnterrllpdones ........... ............................................................................. ...... ........... ... .83
4.2.1 Interrupciones en C...................... ....................................................................... 88
4.3 'nr-. IERO..... ...................................... ......................................................... 94 ...
4.3.1 TL.\lERO en C............. ............................ ........................................................... .... 95
4.4 Tl j\ l£Rl r Tli\-lER2 .................... ................... ..............................................99
4.4.1 TL.\IERI YTll\IER2 en C ............................................................................................... 102
5. Convcrtidor Analogico - Digital .................................................... 117
5.1 Introduccion.. ............................ ............................ ..................... 117
5.2 MOdulo Com'crticlor (gama media) ..................................................................... 118
5.2.1 Registros rSR ..................... ....................... .................................................. 119
5.2.2 ProcesQ de com·ersi6n...................... .................................................................... 122
5.2.3 EfCCto del modo SLEEP y RESHT en el mOdulo AD .................................. ...... 124
5.3l\ looulo AD en C................................................... .................. ..................... 125
6. M6dulo CCP - Comparador, Captura y PWM .............................. 137
6.1 Introclucci6n .......................................................................................................... 137
6.2 ~Iodo Captu[a ............................................................... ................. .................. ...... 139
6.3 Modo Comparacion ..... .............................................. ................. ...... 140
6.4l\fodo P\'{'l\f ........................................................... ......... .... ............. ................... .... 141
6.5 f..-i6dulo cep en C .................................................................... .............................. 143
7. T ransrnisi6n scrie ........................................................................... 167
7.1 Inrroducdon .............. .................................................................................... .......... 167
7.2 El mOdulo U5ART/SCl .......................................................................................... 168
7.2.1 Introducci6n ........................................................................................................................ 168
7.2.2 EJ mOdulo USARTen C ..................................................................................................... 174
7.2.3 1.a norma RS232 ................................................................................................................ 180
7.3 Puerto serie sincrono (SSP)............................... .................. .. 190
7.3.1 Interfaz Inter-Circuitos (l2q ............................................................................................. 190
8. GamaAlta-PIC18 ......................................................................... 213
8.1 Introducd6n ........................................................................................ .. .................. 213
8.2 Organizaci6n de 1a memoria ................................................ ................. 214
8.2.1 Ar'luitecrum HARDVARD ......................................... ....................................................... 215
8.2.2 11emoria de Programa ......................................................................................................... 215
8.2.3 COlltador de Progmma. .................................... ...................... ........................... 216
8.2.4 Memoria de Configuraci6n........................... .......................................................... 217

vi
8.2.5 Pila ............................. .............................. ..................... ............................................ 21 -
8.2.6l\lemoria de Datos ............................................................................................................. 218
8.2.7 l\lemoria EEPRO,\] ............................................................................................... 219
8.2.8 i\lodos de Direccionamiento ............................................................................................ 220
8.2.91nterrupciones....... .................................... .................................................. 220
8.2.9.1 Registms de sah1lguarda ................................................................................................ 222
8.2.10 Registro \'(1....... ........... .................. ................ .. ............................... 223
8.2.1 ·J Oscilador............................................................................................................. 223
8.2.1 2 Unidades Funcionales ....................... . ........... ...................... ....... .... 223
8.2.12.1 Puertos de emr:lda/s.alida .............................................................................................. 224
8.2.12.2 Temporizadores ............................................................................................................. 225
8.2.12.3 Convcrcidor Analogico-Digital........... ..................................... ..................... 226
8.2.12.4 Canal de Comunicaci6n Serie (EUSARl) .................................................................. 227
8.2.12.5 i\lodulo Master SSP {i\ !SSP) .......................................................................................... 228
8.2.1 2.6 r.lodulo de Compr.acion/Captura!P\Vi\! (CCP) ........................................................ 228
8.2.12.7i\lodulo Companldor.............................. .............................................. 230
8.2.12.8l\Iodulo de referencia ..................................................................................................... 230
8.2.12.9 Modulo detct:tor de Alto/Baio Voltaie ..................... .. ................................ 230
9. RTOS - Real Time Operating System ........................................... 239
9.1 Introducci6n ............................................................................................................ 239
9.2 RTOS en C ............................................................................................................... 240
10. USB - Universal Serial Bus .......................................................... 251
10.1 lntroducci6n ............... .......... ........... ............. ..... ......... .. ..................................... .. ... 251
10.1.Il\ligracion de RS232 a USB ...................................................................................... ....... 252
10.1.1.1 USB CDC (Communication Device Clas5) ................................................................. 252
10.2 USB con ISIS y CCS C ............................................. ... ................ .................... ...... 253
10.2.1 USB en ISiS............................... ........................................................................ 253
10.2.2 USB en CCS C .................................................................................................................... 254

vii
.

Introduccion
EI estudio de los microcontroladores PIC no consiste sOlo en dominar su arquitec-
tura intema 0 el c6digo maquina sino tambien en conocer programas auxiliares que
fadlitan eJ diseilo de los sistemas donde intervienen.

Entre los muchas programas para el desarrollo de sistemas con PICmicro® desta-
can, por su potencia, el PROTEUS VSM de ©Labcenter Electronics y el compilador
C de ©Custom Computer Services incorporated (CCS).

El programa PROTEUS VSM es una herramienta para la verificacion vIa software


que permite comprobar, pr<icticamente en cualquier diseiio, 1a eficacia del progra-
rna desarrollado. Su combinacion de simulation de cooigo de programaci6n y si-
rnuladen mixta SPICE permite verificaciones anal6gico-digitales de sistemas basa-
dos en microcontroladores. Su potencia de trabajo es magnifica.

Por otra parte, tenemos el compilador C de CCS, ya que despues de conocer y "do-
minar" ellenguaje ensamblador es muy titiJ aprender a programar con un lenguaje
de alto nivel como el C. EI compilador CCS C permite desarrollar programas en C
enfacado a PIC con las ventajas que supone tener un lenguaje desarroUado espe-
cificamente para un microcontrolador concreto. Su facilidad de uso, su cuidado
entomo de trabajo y la posibilidad de compilar en las tres familias de gamas baja,
media yalta, Ie confieren una versatilidad y potencia muy elevadas.

Al escribir este libro se plantean muchas dudas, sobre todo a la hera de concretar
el temario. Escribir profusarnente sobre los PIC 0 sobre el PROTEUS 0 sobre el CCS
C supone, casi segura, escribir un libro para cada uno de estos temas. Por ello, el
planteamiento ha sido diferente, desarrollar los conocimientos basicos necesarios
para manejar cada programa, apoyarlo con el mayor numero de ejercicios y dejar
al lector la posterior ampliacion de conocimientos. Asi 10 he decido en base a la
., experiencia que me da estar impartiendo clases sabre PIC en la carrera de lngenie-
ros Tecnicos Industriales, especiaJidad de Electr6nica Industrial, de la Universidad
Politernica de Valencia.

Can estas premisas espero que ellibro sirva a lector para aumentar sus conocimien-
tos sobre el PIC 0 para iniciarlos en el casa de los que desconozcan este mundo.

ix
1. ISIS de PROTEUS VSM

Capitulo 1

ISIS de PROTEUS VSM


1.1 Introduccion
E1 entomo de diseiio electronico PROTEUS VSM de LA BCENTER ELECTRONICS
(w'Ww.labcellfcr.co.llk) ofrece In posibilidad de simu lar c6digo microcontrolador de
alto y bajo niveJ y, simul taneamente, con la simulacion en modo mixto de SPICE.
Esto permite el diseno tanto a !livel hardware como software y realizar la simuJa-
cion en un mismo y unieo entomo. Para ella, se suministran tres potenles subentor-
nos como son el[SIS para el diseno grMico, VSM (Virtual System Modellillg) para la
simulation y el ARES para el diseiio de placas (figura t).

The V!iM Advantage


--
- -
'0 ......- ...
• Con las hemim ....ntas
~

-
tntddooll/l!lS de diS>flflo. aI deSll!TOllo del soII'wsI8 Y Is rx:mprobac/6f! del sistema
no puede (fIafzarsa hastB qve SII dssanolla IJIl protOOpo ffllJl, 115ft! pueOO supIXI#V semamos de ro/roso.
AdlWlAs. 51 SII Iouliza 8(giln 8rrot' en et diseflo harrJw8ff1. fa lOI/11idad (Je/ proctJ$O debe ntpfItirse.

--
O-\!m +--
§ .... - -.- ... ,-- , /.;./ o
Usando Proteus VSM, e/ desatrOllo dol ~ pi.J8dtJ comenur IBn ptOn/O como eJ esquemMk;o os
dibv}6do y Is oombinaciOn d& softwMl y flM1ware pufXIo ser /e.ste9da ~m"N riel montllf aI proIoIipo.

Figur" T. Entorno de tr"bajo PROTEUS Ifuente: Labc:enter Electronicsl

1
Compilador CCCS y Simulador PROTEUS para Mlcrocontroladores PIC

1.2 Captura electronica: entorno gratico ISIS


ISIS es un potente programa de diseno electr6nico que permite realizar esquemas
que pueden ser simu lados en el entomo VSM 0 pasados a un circuj to impreso ya
en el entomo ARES.
Posee una muy buena coleccion de librerias de modelos tanto para dibujar, simular
o para las placas. Ademas, permite la creaci6n de nuevas componentes, su mode·
lizaci6n para su simulacion e, inciuso, la posibilidad de solicilar al fabricante (LAb·
center Electrollics) que cree un nuevo modelo.
Sin entrar profundamente en como utilizar dicho programa (requerirfa un libro
sOia para ello), a continuati6n se explican las bases para dibujar cualquier circuito
electr6nico. El programa ISIS posee un entomo de trabajo (figura 2) formada por
distintas barras de herramientas y la ventana de trabajo.

.......
--~


Ventana de TrabaIo

Fig ... r .. 2. EI entorno de trabajo del progra....a ISIS

Varios de estos menus tambien se pueden utilizar con la ayuda del bolon derecho del
raton. Al pulsarlo en cualquier parte del entomo de trabajo apa rece un menu contex-
tual donde se pueden i.r obteniendo los distintos submenus de trabaja (figura3).

2
1. ISIS d, PROTEUS VSM

+~~
;; I->tSo#

"'-
U_M
g'.....
-c· ~PI'I

L.. ....
a l_~

..--_.
. @ ~

~v. . . Pf0b8
Y' C,-,...... Probe ~~
11/ .... _

/~

..
"b
,,~
~
~

=0
= ..
...-. .
.,,~

A'" ""'"
"""
~""
OI''''TT~

Figura 3. Submenus de t,,,b,.jo del bolon derec:ho del raton

Para dibujar, 10 primero es colocar los distintos componentes en la hoja de trabajo.


Para ello, se selecciona el modo componentes (figura 4) y, acto seguido, realizar una
pulsation sabre el boton P de la ventana de componentes y librerias (Figura 5).

2
Flgur.. 4. Modo componentes 1lgl.lr.. 5 . Boton ~plck~

Tras activar el bot6n P se abre la ventana para la edici6n de componentes (figura 6)


donde se puede buscar el componente adecuado y comprobar sus caracteristicas.

Al localizar el componente adecuado se realiza una doble pulsaci6n en el, de tal


forma que aparezca en la ventana de componentes y librerias (figura 7). Se pue-
de reaHzar esta acci6n tantas veces como componentes se quieran incorporar al
esquema. Una vez finalizado el proceso se puede cerrar la ventana de edici6n de
componentes.

3
Compilador CCCS V Simulador PROTEUS para Microconlroladores PIC

por lipO. clue y fabricanta


Permil, loeaHut componantfS par nombfe
..
Usia de d;;.~n;"' •• dI'~ffilt'''' ,.,".~,.""i.,""

y modelo

Encapsulado
para plllce

=C::,~.,- . " ••
Peque/lo &dilor de Jaa caract.,ristlcaa
de un componente (sltullr.,1 ralon aobr. "I

Figu,.. 6. Ventana pari'! la edlcion de componentes

Figura 7 . Los componentes a"adldos

Para situar un componente en el esquema tan s6lo debemos selecciona rlo de la


lista. Al hacerlo se puede comprobar su orien tadon (tal como se representara en el
esquema) en la ventana de edki6n (figura 8). Si deseamos modificar la rotacion 0
la reflexi6n del componente podemos acceder a ello a traves de la barra de herra-
mientas correspondiente (figura 9).

Haciendolo de esta forma, "todos" los componentes de 1a Hsta tendriln la misma


orientacion (si se desea orientar un unico componente deberemos hacerlo una vez
ya situado en el esquema).

4
1. ISIS de PROTEUS VSM

\O!'

"'
ci~~:jl
..
Ie oro--
_s::: e
Figura 8 . Se 'ecc:lon y orienta tion Figura 9 . Barra de ro ta cion y refl exi on
del componente

Ahara 5610 falta realizar una pulsaci6n sobre la ventana de trabaja y se colocara
el componente. E1 cursor del raton se convierte en un i<ipiz blanco (figura 10). Se
pueden colocar varias componentes del mismo tipo simplemente realizando varias
pulsaciones. Para termmar de colocar un componente se debe selecdonar otro com~
ponente de la lista 0 pasar a OITO modo de trabaja.

/ UPI.l blaoro: elie en bcll6n iaju.,,-uo coloca.,1 roDlPOIICDI~

Figura to. Cursor e n e l modo d e coJocad6n


Es importante activar la herramienta de referenda automiltica (Real Tillie AlIIlOta-
tion). De esta forma, los componentes tendran una referenda distinta y de forma
consecutiva; en los circuitos integrados con varios componentes encapsulados tam-
bien se referenciaran segtin dicho encapsulado (UIA, UIB, etc.). Esta herramienla
se acliva a desactiva desde la opcion de menu TOOLS -? Rea l Time Amlotatiol/.

Una vez situ ados los componenles en el area de trabajo se pueden mover, al pasar
por encima del camponenle el cursor se canvierte en una mano (figura 11) y al rea-
lizar una pulsation, el cursor se transforma en una mana con una cruz, indicando
que se puede mover el componente (quedan seleccionados al panersc en raja) y se
puede arraslrar (atencion: si se vuelve a realizar OITa pulsaci6n del balon izquierdo
se editan las caracteristicas del componente). Tambien se puede cambiar su orienta-
cion utilizando los comandos de rolacion y reflex ion a Iraves de una pulsacion del
baton derecha del ralon (figora 12) y se pueden eliminar can dos pulsadones con e1
boton derecha sabre elias (a con el bot6n derecho y el camanda Delete Objet).

Flgu,,, 1 t. £1 cursor en modo de se leccion y move ,

5
CompUador CCCS y Simulador PROTEUS para Microconlroladores PIC

--
+ OragObioct
f"Pt<JI'I'I'!iM

0C ....
_ _
'"""""
"""
TKIH)&.~acciIn

-
,~

C_llIOdov_

·•
~-.
t Y-Mr,,,,


o DIsJJIay /IIodoI tWI>
~- ......... ""'"
""'"

-
,1J'-"Des¢~.,

"....
J: p..o:.gn; 1001
f--J'- _C

FlgLlr~ 12. Men';' contextual de un componente ~ctlvado por el boton derecho del r~ton

Todas estas acdones se pueden realizar individualmente 0 de forma cole<:tiva, es


dedr, se pue-den agrupar varios componentes a traves de puisaciones consecutivas
sobre elIos (manten iendo la tecla <Control> pulsada) a dibujando una ventana can
el bot6n izquierdo y arrastnindola sabre los mismos (figura 14).

-
UI
.-.
~~
_..... ,--
t--
t:=-. -
R.UtANlMIEl'·
~.
~
M'

RllllP<lD
+01 ,,~ ---
" !Nil
To

- "
1ICW'T1000000'OO

~RI,.
'tC111101.1CC1'7
~


~
~

~.-
PIC'6f~nI

Flgur~ 13. LO$ componentes en el are~ de tr~b~Jo

Una vez seleccionado el conjunta de componentes (se marcan tadas en raja) debe
mas u tilizar la herramienta de grupo (figura 15), que tambien aparece tras pulsar el
bot6n derecho. Can esta herramienta se pueden copiar, mover, rotar a elimiIlar los
componentes selecdonados.

6
1. ISIS de PROTEUS VSM

- ,"
-
-"
-----',
- '
'
-,---
-•
••

Figura 14. Selection de varlos cornponentes

Figura 15. La herramlenta de grupo

Para unir los componentes con cables hay que situarse en los extremos de los termi¥
nales, el cursor se convierte en un i<ipiz verde (figura 16). Ahora se pueden ejecutar
dos actiones 0 if marcando el camino hasta el destino con distintas pulsaciones
(figura ] 7) 0 reaiizar, directamente, una pulsaci6n en el destino y dejar que 1$1$
realice el camino. Para ella, debe estar activada la herramienta TOOLS -7 Wire

.,.; :
Alltor ollter.

,,
"

R ,
.1k·

Figura 16. Inlclo de .:able Flgur.. 11. Circ:uito #a milno #

7
Compilador CCCS YSimulador PROTEUS para Microconlroladores PIC

Las uniones entre cables se pueden realizar de forma automatica. Para ella, mien-
tras se traza un camino debemos realizar una pulsacion sobre el cable objeto de la
union electrica (figura 18). Tambien se pueden realizar de forma manual mediante
el modo de uni6n (figura 19)i en {'ste modo tan sOlo hay que ir hacienda pulsacio-
nes sobre los puntas donde deseamos realizar la union.

~ 21
T
1 22
2H;
t-'
24
25
r +
Figura 18. Union ele.c:trica entre cable$ Figura 19. Modo de union

Se puede modificar el trazado de los cables. Para ella, se realiza una pu lsati6n so-
bre el cable, en ese instante el cursor se convierte en una doble flecha (figura 20) y
se puede arrastrar el raton para modificar el cable.

l Doble flecha: mo"cr cables

Figura 20. Mover 10$ cable$

Tambien se pueden utilizar buses para las uniones multicable. Los buses perm iten
conectar varios terminales entre sf utilizando un unico elemento (figura 21); en este
caso, el cursor se convierte en un liipiz azul (figura 22). Pero para distinguir los
distintos cables que fo rman parte del bus y distribuirlos en la entrad a y en 1a salida
se deben etiquetar mediante labels. En el caso de los cables se indicani una etiqueta
lmica LCDO, LCD1, etc., y al bus una etiqueta conjunta segun el formato LCD{O..3]
que indique el nombre y la cantidad de cables que 10 fo rman.

lCOlll_.lI

Figura 21 . Cableado por bU$

8
1. ISIS de PROTEUS VSM

, L.1piz (lzul: trazado de buses.

Figura 22. Cursor e n modo de tri'lZado d e bu.J

El etiquetado tamhiEm permite unir cables virtualmente. Para ella, tan sOia es nece-
sario que los dos cables se lIamen iguaJ aunque no esten conectados entre sl. Para
etiquetar cables 0 buses se utiliza el modo label (figura 23). AJ activar este modo y
realizar una putsaci6n sobre un cable 0 bus se abre una ventana donde podemos in-
troducir la etiqueta, ademas de seleccionar posicion, orientaci6n y estilo (figura 24).

• ••
''''
-..- .-
r-.. ~

figura 23. Modo label Figura 24. Vent"nill de edldon de etlq ... t!'tas

OtTO modO de uni6n virtual es a !raves de terminates. Al activar el modo terminal


(figura 25) se pueden seleccionar distinlos tipos de terminaies, entre elias el ubliza-
do poT defecto (de/all't). AI utilizar este terminal en varios componentes y darle el
mismo nombre en todos ellos se consigue una union eltktrica.

Figura 25. Modo lerminal

9
Compilador CCCS y Slmulador PROTEUS para Mlcrocontroladores PIC

""""""
"""'00
~~l::::8~g ~oo----I~o

""""'"
RD1~1

"""""
""""'"
'''''''''''
''''''''''
""""'"
RD71PSP7

Figura 26. Union electrlca a traves de tlNmlnales

Mediante este modo tambien se pueden colocar las masas y alimentaciones del
circu ito utilizando las opciones GrOill/d y Pawer (figu ra 26). De esta forma se puede
finalizar el circuito (figura 27).

OSCl/CU(N
oo"",",<>rr """'"
L-.L.J MO."'""", '"
'" SWl
"'0"'" """'"
IVol/ANl

""'''''''''''-
R,A3.lAN3/YREF.
~~""15W~'"''''
""""",
""'''"''' R1
''''

Flgurit 27. Clrculto citbleitdo

Tan solo queda modificar las caracteristicas de los componentes que 10 requieran,
por ejemplo modificando el valor de los componentes pasivos. Para ello, se seleccio-
na un componente realizando una pulsacion con el baton derecho, aparece el menu
contextual y se selecciona la opcion EDIT PROPERTIES; tambien se puede utillzar
el modo edicion (figura 28) en el cual tan salo es necesario harer una pulsaci6n con
el boton izquierdo sobre el componente; en este modo el cursor se convierte en una
flecha (figura 29). Al ejerutar esta acci6n se abre la ventana de edicion donde se
pueden cambia r las caracteristicas de los componentes (figura 30), por ejemplo la
resistencia de 10K a 180 ohm. Tambien se puede editar dire<:tamente la referenda 0
el valor de un componente si la pulsaci6n se reallza encima de estos elementos.

10
1. 1515 de PROTEUS VSM

~ Flecha: modo edici6n

Flgur.. 28. Modo ediclon Figur.. 29. Cunor en modo edldon

- - - - . - -
- I'll!)
- fdJl Compon.m
-
.......
c--.~' JIII ......
...... I I
IH"\
I '" I
-'-
H~

. '1 11..... -"

--
I~
I I
~,- lRESIO .111 :.... '" Oil '""'

I
r_ _ i _
[ _ _ POI.-' -''-''''''jIOCUII.
[dill _ _ lOW.

Figura 30. Ventanil de edicl6n de un componente

Con esto quedaria finalizado el circuito electr6nico (figu ra 31). Pero en el caso de
los sistemas basados en un microcontrolador aim quedan por modificar las carac-
teristicas del mismo microcontrolador.

U1
......,

*
OSCI/CLKIN
<>=CU<<M
.cuw""", '"
""
j ~-
'''''OM'" •
~~,t sw.".,,..,
SW1
RIll/ANI
"""',...,. '"
''''''''''
Ro\3IAN~'
j ~''''''
- """""-
""'''"''' RCIJ(l'1050{T1CKI
RC1If1OS!iCCP2
RC2i'CCPl
,.,
R1 --
'''''''KOO.
'c",,,•..,.
"""'00 ,
"""""'"
RC71RXJOT
".~

Figur.. 31. EI esquema completo

11
Compilador C CCS YSimulador PROTEUS para Microcontroladores PIC

En el caso de los microcontroladores, la ventana de edici6n aporia mucha infor-


macion (figura 32). Tal vez 10 mas importante es que permite cargar en el micro
controlador el archivo de programa (·.H£X) generado en la compilacion; tambien
se puede modificar la frecuencia de reloj (por 10 tanto no es neccsario el usc de
cristales extemos en la simulaci6n), cambiar la palabra de configuraci6n y olTas
propiedades avanzadas.

'-',....... ~1I1 ......


....
""-',- ,",,"'"

f'Io\IO ... fk" B010N_' cd ~ "mO


~O>eI<f-...rq
641ii---- ~-

-
Proo"""'~""""Wm! :ikHa ' Hido M
-"
IUP~'
""""" - -,.....,..,...-
1 :"';" AI

........ - ' HidoM

Figur.. 32. Venta"., de edid6n de un micro

1.3 Depuracion de los sistemas basados


en PICmicro
La caracteristica mas importante del PROTEUS VSM es la capacidad de depurar pro-
gramas fuente de distinlos lenguajes de programaci6n. Ademas de aceptar el archivo
de programaci6n 111 tel Hex (HEX), tambien admite ficheros IAR UBROF (039), Byfe-
Craft COD (COD), Microchip Compatible COF (COF) Y CrownlIifl Proton Pills (BAS). AI
utilizar estos archivos se puede abrir una ventana de c6digo fuente Ilamada S OURCE
CODE mediante la cual se puede seguir el programa fuente linea a linea de c6digo.

Ademas permite visualiza r elementos internos del PIC como son la memoria de
prograrna, la memoria de datos RAM 0 la EEPROM, los registros especiales (FSR)
y la pila (S tack).

Ademas, el entorno PROTEUS VSM permite com pilar progra mas fuente en cOdigo
ensamblador directamente. Para ello, se utiliza el comando SOUR CE (figu ra 33).

12
1. ISIS de PROTEUS VSM
------'-

'* Oefne Code Generation IooIs ...

......
Setup ExterMi Text ~di1:or ...

1. bot"ra,asm

Figurill 33. Generador d e c6dlgo de flc:heros ' ... enll:

En el caso del campilador CCS C, despues de compilar se generan, entre otros, los
archivos ".HEX y ",COF, los cuales se pueden utilizar para trabajar con el cotoma
PROTEUS VSM. Para ejecutar el programa desde ISIS se debe abrir 1a ventana de
edidon del microcontrolador (figura 32) y en e1 item PROGRAM FILE se puede
indicar el Fichera de c6digo fllente utiIizado.
Ademas, en esta ventana se puede indicar la frecuenda de trabajo con la option
PROCESSOR CLOCK FREQUENCY(debemos observar que para la simulaci6n no
es necesario colocar elementos extemos de oscilaci6n en el PIC, tan 5010 haeen falta
en caso de realizar 1a placa). En la opdon ADVANCED PROPERTIES podemos ha-
bilitar 0 configurar muchos mas elementos: configurar el wtJcthdog. habilitar avisos
de desbordamiento de pila, accesos no correctos a memoria, etc.
Una vez cargada el microcontrolador can el programa fuente, se puede proceder a
la simulation del circuito empleando la barra de simulation (figura 34). Esta barra
se compone de la opdon MARCHA, PASOA PASO, PAUSA Y PARADA .

II II • =I ~
Figura 34. Barra de slmuladon

Con la opcion MARCHA la simuladon se inicia (eJ baton se vuelve verde) y fun-
dona en modo continuo. La simulacion NO es en tiempo real y dependeni de la
carga de trabajo del PC. En la barra de estado se indica Ja carga de la CPU del PC
(a mayor carga menos real sera la si mulacion) y el tiempo de ejecuci6ni este tiempo
indica el tiempo que tardaria, en la re.1lidad, el circuito en realizar un proceso (por
ejemplo esto implica que, dependiendo de la carga de trabajo de la CPU. un tiempo
de 1 sen el circuito puede significar varios minutes de sim ulation).

IT ~ ! I~ I /I I• I ANIMATING: 00:00.02.65 (CPU loadS" ) ,

Figura 35. Barra de estado en la slmuladon

13
Compilador C CCS y Simulador PROTEUS para Mlcrocontroladores PIC

La opcion STOP para totalmente la simulati6n mientras que PAUSE la para de for-
ma momentanea permitiendo haeer usa de las herramientas de depuration.
La opcion PASO a PASO permite trabajar en tramos de tiempo predefinidos y, ade-
mas, permite utiliza r las herramientas de depuracion. Esta opcion esta ligada a
la configuraci6n de la animation (figura 36): SYSTEM ~ SET ANIMATION OP-
TIONS ~ SINGLE STEP TlME donde se puede definir el incremento de tiempo
que se desea que pase cada vez que se pulsa esta tecla.

s_s~ ......... ~
F,_I'4Soc:ud r.-- Show\l"'-'~""Ptobet? ,;
''''''''''I*F,.., ~ S'-lo\Jir:StaIoolPn7 ';;
S.-.gltSt.,> T_ P;-- S'-W..... oII • ..,Cdo..?
IoI ... SPIC£T__ Ps;- s,-"",..c......."",,_?

Figura 36. Set animation options

En este cuadra de dicilogo tambien se pueden eambiar los siguientes parametros:


• FRAMES PER SECOND: num ero de veces que la pantalla de ISIS se refresca
en un segundo (por defecto 20) .
• TIMESTEP PER FRAME: indica el tiempo de simulaci6n por cada uno de 105
frames; 10 ideal es que sea el valor inverso del escogido en la opdon FRAMES
PER SECOND.
ANIMATIONS OPTIONS: perrnite habilitar la visualizacion de las sondas de
tensi6n y corriente, mostrar los niveles 16gicos en 105 pines, mostrar el nivel de
tension en los cables mediante colores 0 mostrar Ja direcci6n de la corriente en
los cables mediante flechas.
VOLTAGE/CURRENT RANGES: permite determinar el umbral de tensi6n
(±V) y eorriente para utilizar en la visualizacion de las correspondientes ANI-
MATIONS OPTIONS.

En este punto se puede simular (y animar) un sistema can el PICmicro (figura 37).
Lo mas interesante de la simulacion con microcontroladores es la utilizad6n de las
herramientas de depuracion_ Es decir, visualizar mediante ventanas las d istintas
partes intemas del microcontrolador: memoria de programa, memoria de datos,
pila.. etc. La mayor parte de estas ventanas sOlo se pueden visuaHzar dUJ"aIlte una
PAUSA.

14
• 1. ISIS de PROTEUS VSM

Figura 37. Una slmulad6n en marcha

Desde el menu DEBUG (figura 38) tam bien se puede inidar la simulaci6n pero
pensando en la depurad6n. Con la opd6n START/RESTAR DEBUGGING se pue-
de inidar la simulaci6n pero hacienda una pausa para vet las distintas ventanas
de depuraci6n. Tambien se puede ejecutar el p rograma directamente cOllla opcion
EXECUTE, EXECUTE WITHOUT BREAKPOI NT 0 EXECUTE FOR SPECfF1ED
TIME que permite ejecutar dire<:tamente un programa, ejecutarlo sin puntas de
ruptura (en el caso de tenerlos) y ejecu tarlo en un tiempo concreto.
~l."" Y 1..,.... ~_ .....
H ~~ ~~

•"



,.
I·'

---
---- ~---~
u.._Dobug_

Figura 38. 101 me"~ DEBUG antes de I. slmulaci6n

, 15
Compilador CCCS YSimulador PROTEUS para Microcontroladores PIC

Desde esta ventana tambien se puede reinicializar la memoria EEPROM del mi-
crocontrolador mediante RESET PERSfSTENT MODEL DATA. AI producirse una
pausa, el menu DEBUG se modifica (figura 39) mostrando las correspondientes
herramientas de depuraci6n .

... - . . . . . .-.-
.. fOUKi'nMb:1'1

"-"t_
~._&
'"
.fI...,-!;

......
~""~'ino

~ ",
......
-~
...
~
'"
"'"'''

.--
l·_~oQ

}. OI((JIU'IoI.o",(ooIo. II,

1·1'ICO\J¥"'--UI
s.I'ICO'U ........ ·UI
~ PICO'Utloo_, - UI
Z.• 1C(JIU~j)M""""'-Ul
.. PlCCPUPr<9_--.. -UI
2-FlC(JIU~ -III

Figura 39. EI menu DEBUG en una pausa

Estas herramientas son (figura 40):

• SIMULATION LOG: Mensajes resultantes de la simuiacion.


• WATCH WINDOWS: Ventana de visualizacion de posiciones de memoria.
Permite anadir la que el usuario desea ver.
• PTC CPU REGISTERS: Muestra [os registros FSR del PIC.
• PIC CPU DATA MEMORY: Muestra la memoria de datos (RAM).
• PIC CPU EPROM MEMORY: Muestra la memoria de datos (EPROM).
• PIC CPU PROGRAM MEMORY: Muestra la memoria de programa.
• PIC CPU STACK: Muestra la pila.

16
1. ISIS de PROTEUS VSM

............
.. ........
...........
.. ,e " ,. " ...
............
"'
...... ,., ...
...........
............ ."

............
.. "' ...... co

.. .. .,.,... . ...
, ......
"'
CPU DATA MEMORY

..... ,. ... " .......


.... ,-
:;;;:::;::~:: ::
.. , ," """"
,. , ,,"
"., .,
,''' ". -."""
, ~.-

' ... CPU EPROM MEMORY

• """"'''''"''"''' " ,
=-•._. .......... ........ .. .
............ . ............
0(" . . . . . . . . . . . . . . , . . . . . . .

.. ......... ... ........


.. ,,"" .. ,.
·· .. "H ....
" ,.."
::' ..................
" " ",.
..
-, "" , ..,,,.,, .,
"

.,.:."';-.... ..........
- . ........ ,... ". ,................
" ,
, ......
• • j . .. . . . . " .......... "

" .. "
::... ,.:: !:....ijQilij;t.ldiM*i@I;I'
-•._.. ............ ... ,,".........
. ...... .
- ........
......
..
".
",... ,.""
....
" ........
:r; " .... ,. .. " ........ " . ..
•r .................... "
" ,.""
,
",... "" ... ""
..... ""J'
.. ,' ...... ,,
.............
Fi gura 40. VentitnillJ de depuraci6n

La ventana WATCH WINDOWes la mas versatil puesto que se pueden anadir


variables y modificar su visualizati6n. Al pulsar el boton deremo sobre la ven-
tana se abre un menu contextual (figura 41). Can ADD ITEMS (" ame/address) se
anade la variable a visuaJizar directamente can el nombre predefinido (figura 42)

- --, x

::.;;"'... ".."" ••.


'''''''''''t
SW6
en el PIC 0, en et caso de varia-
bles propias del programador, se
pueden visualizar por direcd6n
(figura 43), donde se Ie indica el
nombre, la direccion en hexade-
cima l, el tipo de dato (byte, word,
-, etc.) y el formato de visualizacion
(binario, decimal, etc.). El tipo de

..- "
data y el fonnato tam bien se pue-
de cambiar desde DATA TYPE Y
DISPLAY FORMAT.

-- .
'-_
" " - _[.000' - 1
-~
....,

-~
Figura 41 . Menu contextual d e
WATCH WINDOWS

17
Compilador CCCS y Simulador PROTEUS para Microcontroladores PIC

Can WATCH POINT CONDmON se pueden habilitar puntas de ruptura median~


te condiciones sabre las distintas variables (figura 44); se indica la variable, la mas~
cara de la condicion (NONE, AND, OR, XOR) Yel tipo de candidon (NONE, ON
CHANGE, EQUALS, etc.).

_ _ ............. h _ _ l

Figur;t 42. Add by N;tme

J:i_ JPCCflJO... M_ ,U2


H_ ISAlJ()o\.
~ 1r..rom---------3~·

.'"
O"'W-
t' ASOt;S-.g
-,-
""''.....
'''
• ~""'
1iIotMiI8'..... ~
(' T""'lAj.....I ..... _
A ~1Ioo~'J,JN_.. _ . - .
___ ont_AU_ ... _
(' W<IOd(2b,mJ
<' ocatlltwaodf4¥eof
<' o-ll,o,'otd J8 b,<eo)
<" 1£[[ FN fll¥_)
<:- I££E DIdIIa 18 t.,teoJ
<' ttj .... fIooI13~1
0 ~FkooII'bJo'e.Il
<' --
<' , ......
,, ~',.

tI__
IFOATA
J..-ND
c--IGnC!wn;lo
3~
:£)

3
1 .. 11,... I

Fi gura 43. Add by Address F1g..r. 44. Punto$ de rupt ..r ..

Hay una ventana de depuracion que 5010 se visualiza si se ha incarporada un fi~


mera COD 0 COF al microcontralador, se trata de la ventana CPU SOURCE CODE
(figura 45). Can esta ventana se puede seguir la simulation linea a linea del archiva
de codigo fuente.
En esta ventana (tambien en el menu DEBUG) estan disponibles unas botones de
control (figura 46).

18
1. ISIS de PROTEUS VSM

---- ","c1 .."" <lc<l.,Jrnc.o


---- "lm:l .. d~ <kbdJIIO,O

)> VO,., ..... 1nO (


c~at' k;
tn t V , Xi

H7 le'L1nltCj'
llt9 kbcLtnit( \'
,U~ pc~Lb..JI" ups (mUE);
188 lccLputcC"\ft.t. t o ... \n") ,

FigurCil 45. u venta"a CPU Source code

Figura ".los c:ontroles pilriil Iii slmulacl6n

'0 Simulacion en modo continuo, no permite ver las ventanas de depu-


racion.
Pennite ejecutar una instruction; si es una subrutina una fundon 1a
'0 ejecuta directamente.
Permite ejecutar una instrucci6n; si es una subrutina 0 una fundon
0

.~ entra en ella.

.~
Trabaja en modo continuo hasta que encuentra un retorno de cual-
quier subrutina.
Trabaja en modo continuo has ta que se encuentra con un punta de
'[l] ruptura.

'1 0.1 Habilita 0 deshabilita los puntas de ruptura.

19
Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC

Hay tina ventana de diagnostico que facilita la depuracion, almacenando los erro-
res, mensajes de diagnostieo y avisos produddos durante el proceso de simulacion
(figura 47). En la barra de estado (zona inferior del area de trabajo) se muestra un
aviso (figura 48); con una pulsation en el aviso aparece la ventana de diagnosis.

Figura 47. Me nsaje$ de diagnostlco de la simulacion

Se pueden configurar las opdones de esta herramienta desde la opeian DEB UG~
CONFIG URE DISGNOSTIC (figura 49). En la ventana se muestran los componen-
les del esquema susceptibles de un diagnostico en la simulacian y las diferentes
posibilidades de diagnostico y el tiempo de diagn6stico (figura 50).

a 4 Ii
]
Figura 48. MensaJes de la helTamienta de dla gnonlco

<to< ..... , _ , ...........


~I _ ... _~ OIW"'~

,;.~ ,,:
r-n ....... &_".,.... ~ ... \2

~.""5po<II""-

--_
--...-.
.....

Figura 49. Lot configufiKlon de d lagnOstlcos

20
1. ISIS de PROTEUS VSM

I'oeo~
• ID-SYSTl ~ IISISIPRDSPlC[]
• ~ WllfDRD..()QO.B~P IU!§)
• DS2405 IUl1
• DSl40'S 1U21
• DSZ405 lUll
I PlC1GF£2BA (uSI
oJ PIop_1.J>odor
O_E.-",
""''' ' ' 'I' 'SFJl _ _
A_E....ru
I SIoopI'W'" E-.
~l~ •
.....M:cMogI_M_

- •
PSPWOItJo
Iu.,.I_LO'I'd

Figura 50. Opclones de conflguraci6n

Tras la simulacion aparecen los diIerentes resultados del analisis; en e1 item SO UR-
CE aparece indicado el dispositivQ fuente del analisis y tras una pulsacion se puede
acceder a el (figura 51).

..
Figura 51 . Resultado del dlagn6stlco

EI listado de nodos y patillas se pueden encontrar con [a ayuda del DESIGN EX-
P LOR ER (a esta opci6n podemos acceder a traves de distinlas apdones: caman-
do DESI GN, boton derecho, etc.). En su ventana de tTabaja se muestran lodos los
nodos y patillas que forman el cirmito (figura 52).

21
Compilador CCCS YSimulador PROTEUS para Microconlroladores PIC

.. -_
"....
~-­
r..~.-- . ,
.......

~--
---
.--- -
~ ......
. ~-

~-
___ hot _

11---
£I~""'" ....

__..• • • • .--
..- _. .- -_.
------
!:..

.-.-- -:-:-.- -_.


.~

y
.- ~

--
.-
.-.-
.-.-H5
.-'-'-
Figu,OiI 52. u ventanOil Design Explore,

22
2. Compilador CCS C

Capitulo 2

Compilador CCS C
2.1 'ntroduccion
El Compi/ador C de CCS ha sido desarrollado especificamente para PIC MCU, ob-
teniendo la maxima optimizacion del compiJador can estos dispositivos. Dispone
de una amplia lihreria de funciones predefinidas, comandos de preprocesado y
ejemplos. Ademas, suministra los controladores (dri!1trs) para diversos dispositivos
como LCD, convertidores AD, relojes en tiempo real. EEPROM serie, etc. Las ca-
racteristicas generales de este compilador y mas informacion adicional se pueden
encontrar en ta direccion http://www.ccsinfo.com.
Un compilador convierte el lenguaje de alto nivel a instrucciones en cOdigo ma-
quina; un cross-compiler es un compilador que funciona en un procesador (normal-
mente en un PC) diferente al procesador objeto. EI compitador CCS C es un cross-
compiler. Los programas son editados y compilados a instrucciones maquina en el
entorno de trabajo del PC, el c6digo maquina puede ser cargado del PC a1 sistema
PIC mediante elICD2 (0 mediante cualquier programador) y puede ser depurado
(puntos de ruptura, paso a paso, etc.) desde el entomo de trabajo del Pc.
El CCS C es C estandar y, ademas de las directivas estcindar (#include, etc.), sumi-
nistra unas directivas especificas para PIC (tldevice, etc.); ademas induye funciones
espedficas (bil_sctO, etc.). Se suministra can un editor que permite controlar la sin-
taxis del programa.

NOTA

En el manual de CCS se da mucha mas informad6n de la que a continuad6n


se va a dar. En este capitulo sOia se descrihiran los elementos mas basicos y
esenciales para comenzar a programar.

23
Compilador CCCS y 5imulador PROTEUS para Microconlroladores PIC
---
2.2 Estructura de un programa
Para escribir un programa en e can el ees C se deben tener en cuenta lma serie de
elementos basicos de su estructu ra (figura 1).
DIRECfIVAS DE PREPROCESADO: controlan la conversion del programa
a codigo maquina par parte del compilador.
PROGRAMAS 0 FUNClONES: conjunto de instrucOones. Puede haber uno
o varios; en cualquier caso siempre debe haber uno definido como principal
mediante la inclusion de la l1amada maillO .
• INSTRUCCIONES: indican como debe comportar el PIC en todo momenta.
COMENTARIOS: permilen describir 10 que significa cada linea del programa.

_4_ ."-
-- ----
\1'_ ... _,_,
t··~ .;.,.._- ":::..._
-.~ ...
....- -=- "iil'-T"-

Pll' ..

,,- •
dooloy .1ocl<

.~,,'_a ~ Directivas
.-______ Funcion
U)(n.~.u. •
..
• nrO
ve.O .u.pu••b1t Pl".,O
' ••
..
OU'P'J'_bU'III.IO

_.. ..
.n_~ OTO

• _ - - - - - Funcion principal
•• '''P.t1. ."_o J.T<;(:_IJITlAAo\l, J.t<:C_DN."

.
...
•• , 11••• 0
• ...bI. .".... ~. IX. nXlJlll
.""'".::""0",.," qlobal ~
.... - - - Instrucciones
....
~ Comentarios

... ."."" - ._-


Figura 1. Estructura bl'islc:a de un programa

2.3 Tipos de datos


ces e acepta los siguientes tipos de datos:
Tipo Tamano Rango Description
IntI
1 bit 0" Entero de 1 bit
Short

24
2. Compilador CCS C

Tipo Tamano Rango Descripcion


Int
8 bit Oa 255 Entero
Int8
Int16
Long
16 bit oa 65.535 En lero de 16 bit

Int32 32 bit oa 4.294.967.295 Entero de 32 bit


±1.175x1(tl8 a
Float 32 bit Coma fI otante
±3.402xl0·JI!
Ch" 8 bit Oa 255 Cankter
Void - - Sin valor
Signed lnl8 8 bit ·1 28 a +127 Entero con signo
Signed Int16 16 bit -32768 a + 32767 Entero largo can signa
Signed lnt32 32 bit _2 31 a +(2 31 _1) En tero 32 bit con signa

2.4 Las constantes


Las constantes se pueden especiBcar en decimal, octal, hexadecima l a en bina rio:

123 Deci mal


0123 Oct, l (0)
Oxl23 Hexadecimal(Ox)
ObOl0010 Binaria (Db)
'><' Ca r.kter
'\010' Caracter octal
'\xAS' Car<icter hexadecimal

Ademas, se pueden defin ir constantes can un suBja:

Int8 I27U
Long 80UL
Signed INTI6 BOL
Float 3.14F
Ch", Con comillas simples 'e'

Tambien se definen caracteres especiales, algunos como:

\n Cambia de linea
\r Retorno de carro

25
Compilador CCCS YSimulador PROTEUS para Microcontroladores PIC

\t Tabuladon
\b Backspace

2.5 Variables
Las variable se utilizan para nombrar posiciones de memoria RAM; se deben decla-
rar, obligatoriamente, antes de utilizarlas; para ello se debe indicar el nombre y el
tipo de dato que se manejara. Se definen de la siguiente forma:

TJPO NOMBRE_ VARIABLE (",VALOR INICIALJ

TfPO hace referenda a cualquiera de los tipos de datos vistas en el pun ta 2.3. EI
NOMBRE_VARfABLE puede ser cualquiera y el valor inicial es opcional. Veamos
unejemplo:

Las variables definidas en un programa pueden ser de tipo LOCAL a GLOBAL. Las
variables locales solo se utilizan en la funcion donde se encuentran declaradas; las
variables globaJes se pueden utilizar en todas las fundones del programa. Ambas
deben declararse antes de ser utilizadas y las glabales deben declararse antes de
cualquier funcion y fuera de elias. Las variable globaJes son puestas a cera cua ndo
se inicia la fundan prindpaimai,,().

'include <16f876 . h>


'USE DELA Y (CLOCK-4000000)
in t 16 counter; II Variable g;oblll
void FUNCION(vOidJ

ChilI K. kant .. ' 0 '; II Vllciabl e .s loclIles

void Mllin ( )

intS t emp; II Va ri ab le l ocal

Las variables pueden ser definidas con:


• AUTO: (usada por defecto. no hace falta que se indique) donde la variable
existe mientras la funcian esta activa. Estas variables no se inicializan a cera.
Su valor se pierde cuanda se sale de la fundan.

26
2. Compilador CCS C

• STATIC: Una variable local se activa como global, se iniciaJiza a cera y man-
tiene su valor aJ entrar y salir de 1a fundon .
• EXTERN: Permite el uso de variables en compilaciones multiples.

2.6 Operadores
2.6.1 Asignaclon

-
~
Asignaci6n de suma (x+=y es 10 mismo que x-x+Y)
Asignacion de resta (x--y es 10 mismo que x- x-y)
". Asignacion de multiplicaci6n (x"'''')' es 10 mismo que x=x"'y)
/. Asignaci6n de division (xl-yes 10 mismo que x-x/y)
%:: Asignaci6n del resto de la division (x%=y es 10 mismo que x=x%y)
<<= Asignaci6n de desplazamiento a Ja izquierda (x«"yes igual que x"'"x«y)
>>" Asignaci6n de desplazamiento a derecha (x>>=y es igual que x=x»y)
&: Asignaci6n AND de hits (x&-y es 10 mismo que x-x&y)
I· Asignaci6n OR de hits (x l=y es 10 mismo que X"'X Iy)
"= Asignacion OR EXCLUSIVA de bits (x"-y es 10 mismo que x-x"y)

2 .6.2 Aritmetlcos
+ Suma
- Resta
• Multiplicacion
/ Division
% Modulo, resta de una division entera
- Incremento
++ Decremento
sizeof Determina el tamana, en bytes. de un operando

En las operaciones de decremento e incremento, en funcion de la posicion del ope-


radar, se ronsigue un preincremento (++A) 0 un postincremento (A++).

27
Compllador CCCS y Simulador PROTEUS para Microcontroladores PIC

b-4°0l++; , b-4 Y 01-4;

,-,
b-4°++3;

2.6.3 Relaclonales

< Menor que


> Mayor que
,.. Mayor 0 igual que
<- Menor iguaJ que
= Igual
!. Distinlo
?: Expresi6n condicional

2.6.4 Loglcos

! NOT
&& AND
II OR

2 .6.5 De bits

- Complemento a 1
& AND
, OR EXCLUSIVA
I OR
» Desplazamiento a derechas
« Desplazamiento a izquierdas

2.6.6 Punteros

& Direcci6n
• Indirecci6n
-> Puntero a estructura

28
_ _ _ _ _::.
2. Compllador CCS C

Orden de precedencia de \05 operadores:

Expresiones en orden de precedenda descendente


(expr)
!expr - expr ++expr expr++ --expr expr--
(type)expr "expr &value sizeof(type)
expr*expr expr/expr expr%expr
expr+expr expr-expr
expr«expr expr>>expr
expr<expr expr<-expr expr>expr expr>=expr
expr=expr expr!=expr
expr&expr
expr"expr
expr I expr
expr && expr
expr I I expr
expr ? expr:expr
Ivalue .. expr Iva\ue+=expr Ivalue-=€xpr
lvalue"~xp r lvaJue/=expr Iva\ue%=expr
Ivalue>>=expr Ivalue«=expr lvalue&=expr
Ivalue"=expr Ivalue I"'expr expr, expr

2.7 Funciones
Las funciones son bloques de sentencias; todas las sentendas se deben enmarcar
dentro de las funciones . AI igua\ que las variables, las funciones deben definirse
antes de utiJizarse.
Una funcion puede ser invocada desde una sentencia de otra funcion. Una funcion
puede devolver un valor a la sentencia que la ha llamado. EI tipo de dato se indica
en la definicion de la funcion; en el caso de no indicarse nada se entiende que es
un int8 y en el caso de no devolver un valor se debe espedficar el valor VOID. La
funci6n, ademas de devolver un valor, puede recibir parametros 0 argumentos.

29
Compilador C CCS y Simulador PROTEUS para Microconlroladores PIC

La estructura de una funcion es:

Nombre_Fllncion (tipt:l p",r;lml , fJ<Ir~m2 , .. ,.)

(sentencias) ;

float trunca (noat a) f


flOllt b ;
b-noor(a} ;
a-a-b ;
a-.,'100 ;
a-floor (a) ..
"'-0'1 "0 . 01 ,
.. -bta ;
return (a) ..

La forma de devolver un valor es mediante la sentencia RETURN:

return (expresionj ..
return e x presion;

Donde expresion debe manejar el mismo tipo de dato que el indicado en la de-
finicion de la fundon. En el caso de no devolver nada Be finaliza con RETURN,
al encontrar esta sentencia el compilador vuelve a la ejecucion de ta sentencia de
Uamada. Tambien se puede finalizar la funcian sin RETURN, tan s610 con la Have
de cierre ")".

Las funcio nes pueden agruparse en ficheros de Iibrerias <fidlero.h>, que se pueden
utilizar mediante la directiva tinell/de <fichero.II>.

2.8 Declaraciones de control


Las declaraciones son usadas para controlar el proceso de ejecuci6n del programa.
Las que admite CCS son:
• If-Else .
• While.
_ _ _ _ _.c2:.:.. Compilador CCS C

• Do-While.
• For.
• Switch-Case.
• Refilm.
• Break, Conti/we YColo.

2.8.1 IF·ELSE
Con la ayuda de IF-ELSE se pueden tamar decisiones.

i r (ex pres16n)
sentenci"_ 1 ..
{else
sentencia_2 ,- J

NOTA

Los elementos que se encuentran entre corchetes { J son opcionales.

Primero seevalua 1a EXPRESI6Ny si es cierta (TRUE 0 1) ejecuta la SENTENClA_l,


en el caso contrario (FALSE 0 0) ejecuta la SENTENC1A_2.
Pueden anidarse los IF-ELSE dando lugar a los ELSE-IF; esto permi te tamar deci-
siones mUltiples.

i f (expresion_1J
sentencia 1 ;
{else i f (exp:;esi6n_ 2J
sentflncia_2 ; )
[else

En este caso las EXPRESIONES se evaluan en orden, si algu na de elias es cierta la


SENTENCIA asociada a ella se ejerutani y se termina la funci6n. En caso contrario
se ejecuta la SENTENCIA del ELSE. En ambos casos si existen vadas sentencias
para ejecutar se deben utiliza las Uaves { I:

31
Compilador CCCS VSimulador PROTEUS para Microcontroladores PIC

if (exp:;esionj
{

setltencis_l;

selltellcid n;

(else

sell tenci,,_ fl:

11

Ejemplos:

IF (A==O) 6= 10;
ELSE C=5;

c:J -<2> ~{~ $


./

IF (AI=1) 8=10;
r ELSE C=5;

./

IF (A>10)
(IF (A>20) 8=5;
ELSE 8=15;)

Il

32
2. Compilador CCS C

IF (A>10)
(IF (A>20) 8=15;)
ELSE 8=5;

••

2.8.2 SWITCH
Switch es un caso particular de una decision nlllltiple

s,1i tch (expres16n)

C4se constante 1 :
lJentencias :
bre4k :
~4se cons t ante 2 :
sentenciaS ;
bre4k ;

~tault :

entencias ; 1

E\-a1ua la expresi6n y en orden a la CONSTANTE adecuada realiza las sentencias


a30Ciadas. Si ningwlO de los CASE corresponde a la CONSTANTE se ejecuta DE-
r AULT (este comando es opdonal).

EI romando BREAK provoca la salida de SWTTCH, de 10 contrario se ejeruta el


~lguiente CASE.

NOTA

'0 pueden existir dos CASE can la misma CONSTANTE.

33
Compilador CCCS YSimulador PROTEUS para Microconfroladores PIC

Ejemplo:
,-----------------------~

<2> -0
""
Switch (A) (
case 0:

<2>--1 ~2 ~, 8=1 ;
break;
case 2:
8=2;
"" break;

<2>- 0 ' case 3:


8=3;
break;
default: break;
)

2.8.3 FOR
Se usa para repehr sentencias.

for finicializadon ; condici6n de: finlilizac16n incre!llf:'nto J

sentencias :

En las expresiones del FOR la inicializacion es una variable a la cual se Ie asigna un


valor inicial con el que controlar el bude. La condicion de finalizacion sirve para
evaluar ANTES de ejecutar las sentencias si es cierta 0 no, en el caso de ser derta se
ejecutan las sentencias y en caso contra rio se sale del FOR. Por ultimo, 1a expresion
de incremento a decremento modifica 1a variable de control DESPUES de ejecutar
el bude.

NOTA

Se pueden anidar budes FOR utiJizando distintas variables de control.

34
2. Compilador CCS C

Si se ejecuta la siguiente exp resi6n se consigue un BUCLE SIN FIN:

For( ; }

sentencias;

Ejemplo:

For (N=1;N<=10;N++)
(
Printf("%u",N);
}

'-

2.8.4 WHILE I DO·WHILE


WHILE se utilizil para repetir sentencias.

while (expre~!on)

s ...ntencias ;

La expresi6n se evalua y la sente ncia se ejecuta mientras 1a expresi6n es verdadera,


cuanda es falsa se sale del WHILE .

35
Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC

DO~WHrLE se diferencia del WHILE y del FOR en la condici6n de finalizaci6n, la


cual se evalua al final del bucle, por 10 que las se.ntencias se ejecutan 011 menos una
vez.

Do

.sentencia.s ;

while (expre.sionJ;

Si se ejecutan las siguientes expresiones se consigue un BUCLE SIN FIN:

While (1)

sentencias ;

Do
I
sentencias :

While (1)

Ejemplos:


~ While (N)S && M<10)
(
~I
. "" )

[ ] I. '-

36
2. Compilador CCS C

- Do
(

[. ,] •
)
A=1 :
6=2:

While (N>5 && M<10):

¢ M<~o? -----
NO

2.8.50tros
Return: se emplea paTa devol veT datos en las funciones.
Break: permite salir de un bude, se utiliza para While, For ,Do y Switch.
Goto: provoca un salta incondidonal.

2.9 Comentarios
Los comentarios en eJ programa facilitan Ja compresibn de las distintas expresiones
tanto para el programador como para quien tiene que interpretar dicho programa.
No afectan a la compilacion por 10 que pueden ser tan extensos como el programa-
dar quiera. Se pueden colocar en cualquier parte del programa y con dos forma-
tos:

• Utilizando II. Al colocar estos signos se comienza el comentario y finaliza en


el final de la linea.

II Comentario que teI'minaI'll 41 fWlll de fUlta linea .

.. Utilizando I"' y "'I. Se debe utilizar al initio y al final de comentario, pero no


pueden repetirse dentra del mismo comentario.

I ' Este comentllcio no flnaliza <II ['mal de esta l1nea


fin"l1z" cU<lndo se cierce e1 comentacl0 ~I

31
Compilador CCCS YSimulador PROTEUS para Microcontroladores PIC

2.10 Directivas y funciones (Preprocessor


commands y built·ln functlonsl
2.1 0.1 olrectiva.
Las directivas de pre-procesado comienzan con el simbolo # y continuan con un
comando espedfico. La sintaxis depende del comando. Algunos comandos no per-
miten otros elementos sint<kticos en 1a misma expresion. Muchas de las directivas
utilizadas por CCS son extensiones del C esta ndar.

IOEFINE ID STRING tlF expr ;NOLIST


:EL5E ; IFDEF id IIPRAGMAcmd
Est.1ndar C
tENDlF lUST .rUNOEF id
,fERROR ;INCLUDE "FILENAME"
IINUNE iINT_GLOBAL IISEPARATE
Cualificadores
tINT_DEFAULT :lNT xxx
__ DATE __ LlNE__
-- -- PCH--
IdentiRcadores __DEVICE__
--PCB-- __TIME__
FILE PCM
- FILENAME
RrOS tTASK WSERTOS
Especificacio n WEVICECHIP #10 "filename" "FUSES options
Dispositivos #iD CHECKSUM #10 NUMBER ,SERIALIZE
;USE DELAY CLOCK iUSE FlXED_IO .fUSE RS232
Librerias
WSEFAST_IO ;USEI2C #USESPI
predefinidas
;USE SfANDARO 10
MSM #BYTE id-id IIROM
; BIT id-id.const ,fENOASM ~TYPE
Control de
iBIT id-(onst.consl #F1LL_ROM IIZERO_RAM
memoria
~BUILO .LOCATE id-const
;BYTE id-const tRESERVE
Control de ~CASE "OPTn ;PRIORITY
compilador IORG llGNORE WARNINGS

A 10 largo del presente libro se iran viendo varias directivas en su ambito de apli-
cadon particular.

38
2. Compilador CCS C

Como ejemplo se pueden comenlar:

#DEVICE chip, permite definir el PIC con el que se realizar;i la compilaci6n.

'davic" PIC16F84

'FUSES options, la eual permite definir la palabra de configuraci6n para progra-


mar un PIC. Por ejemplo, en el PIC16F84 las opciones posibles son:

LP, XT, HS, Re, NOWDT, WDT, NOPUT, PUT, PROTECT, NQPRQTECT.

Idevice PIC16F84
#{uses XT, NOWDT, PUT, NOPROTECT

gINCLL"DE "filename", permile induir fichero en el programa.

'include <15FB4 . h>


t fuses XT, HOWDT, PUT , NOPROT£CT

#USE DELAY (CLOCK=SPEEDt permite definir las freeuencia del oseiJador del
PIC, el compilador 10 utiliza para realizar c.lleulos de tiempo. Se puede utilizar M,
MHZ, K Y KHZ para definir la freeuenda.

#INCLUDE <l6F877 . h>


tU!;e delay (ci ock-4000000j

IASM Y IENDASM, permiten utilizar e6digo ensamblador en el programa en C.


Se utilizan al inicio y at final del bloque ensamblador.

#asm
bsf TATUS , RPO
IIIC>vlw Ox 8
movwf PORTil
bef STATUS,RPO
#endIJsln

39
Compilador CCCS VSimulador PROTEUS para Microcontrotadores PIC

2.10.2 Funciones
CCS suministra una serie de funciones predefinidas para acceder y utilizar el PIC y
sus perifericos. Estas funciones facilitan la configuration del PIC sin entrar en el ni-
vel de los registros especiales. Las funciones se dasifican por bloques funcionales.

ASSERT( ) GETCH() PUTq )


FGETC( ) GETCHAR( ) PUTCHAR( )
FGETS( ) GETS{ ) PUTS()
FlS RS232
FPRLNTF( ) KBHIT() SET UART SPEED()
FPUTC() PERROR( ) SETUP UART()
FPUTS( ) PRINTF( )
FlSBU5 SETUP SPI() SPI DATA IS tN() I SPI WRITE()
SPI2-HILOS sri XFER() sri READ()
OlITPlIT_
GET~TRlSx( ) INPUT~K() SET_TRIS_B( )
FLOAT( )
INPlIT( ) Il\.TPlIT SfATE() OVTPlIT_G( ) SET TRIS C()
INPlIT A() INPlIT x() OUTPUT H() SET TRiS D()
OUTPlIT_
INPlIT_B( ) OUTPUT_A() SET _TRIS_E()
HIGH()
INPUT C() OUTPUT_B( ) OUTPUT.]() SET TRIS F()
ElS
INPUT D() OUTPUT_BIT( ) OUTPUT K() SET TRIS G()
D1SCRETAS
INPUT E() OUTPUT_CCl OUTPUT LDWO SET TRIS H()
OUTPUT_TO-
INPlTf]( ) OUTPUT_DO SET_TRIS..J()
GGlE( )
OUTPUT_DRI- PORT_A_PU-
INPUT_G( ) SET_TRIS_K()
VE() LLUPSO
INPUT H() OUTPUT_E{ ) PORT B PUllUPS()
INPUT..J( ) OUTPUT_F() SET TRIS A()
E/S PUERTO psp INPUT FULl() psp OVERFlOW()
PARAlELO
PSP_OUTPUT_FUll( ) SETUP_PSP( )
ESCLAVO
12C WRlTE() 12C SlaveAddr() 12C rSR STATEO
fiS BUS I2C 12C POLL() 12C START()
12C READ() 12C STOP()
CLEAR_rNfE- GOTO_
RESET_CPU( )
CONTROL RRUPT( ) ADDRESS()
PROCESOS DISABlE_IN- INTERRUPT_
RESTART_CAUSE( )
TERRUPTS( ) ACfIVE( )

40
2. Compilador CCS C

ENABLE_IN-
JUMP_TO_ISR SETUP_OSCILLATOR( )
TERRUPTS( )
CONTROL
EXT_INT_ LABEL -
PROCESOS SLEEP()
EDCE( ) ADDRESS( )
Gr.TENV( ) READ BANK() WRITE BANK()
BIT CLEAR() MAKES( ) MUL() SH1FT LEFT()
ROTATE - SHIFT_
MANEJO BIT~ BIT_SETe) MAKE16( )
LEIT( ) RIGHT()
BYTE
ROTATE_
BIT_TEST( ) MAKE32() SWAP( )
RlGHT( )
AIlS{) COSH( ) LABS{ ) SIN()
OPERADORES
ACOS( ) DIV() LDEXP( ) SINHII
MAT.
ASIN() EXP() LDlV( ) SQRT()
ATAN() FABS( ) LOG() TAN()
ATAN2( ) FLooR( ) LOGlO( ) TANH()
CESrA..NDAR
CEIL( ) FMOD() MOD'I)
COS{) FREXP() POW()
TENSI6N DE
SETUP_VREF( ) SETUP_LOW_VOLT_DETECT()
REF ERENOA
NDCONVER· SET AOC CHANNEL() SETUP AOC PORTS()
SI6N SETUP ADC() READ_AOC()
ATOF( ) ISLOWER(char) STRCMP() STRRCHR()
ATOi( ) ISPRlNT(x) STReOLL( ) STRSPN()
AT0132() ISPUNCT(x) SfRCPY( ) STRSTR( )
ATOL( ) ISSPACE{char) STRCSPN( ) STRTOD( )
CARACfERES ISALNUM() ISUPPER(cllar) STRLEN() STRTOK{)
C EsrANDAR ISALPHA(char) ISXDIGIT(char) STRLWR( ) STRTOL()
ISAMOUNG() ITOA() STRNCATO STRTOUL( )
ISCNTRL(x) SPRINTF( ) STRNCMP( ) STRXFRM( )
ISDIGIT(char) STRCAT( ) STRNCPY( ) TOLOWER()
ISCRAPH(x) STRCHR( ) STRPBRK() TOUPPER( )
GET TIMERO() SET RTCC() SETUP TIMER 0 ()
GET TlMER1() SET TIMERO() SETUP T IMER 1 ()
TIMERS
GET TlMER2() SET TIMER1() SETUP TIMER 2 ( )
GET TIM£R3() SET TIMER2() SETUP TIMER 3 ( )

41
CompiJador C CCS YSimuJador PROTEUS para MicrocontroJadores PJC

GET TlMER4( ) SET TIMER3() SETIJP TIMER 4 ( )


GET TIMERS() SET TIMER4() SETUP TIMER_5 ()
TIMERS
GET TIMERx() SET TIMERS() SETUP WDT ()
RESTART WDT() SETUP COUNTI:RS()
CA LLOC( ) MEMCMP() OFFSETOFBIT{ )
FREE( ) MEMCPV() REALLOC( )
MEMORIAC
LONG]MP() MEMMOVE() SE1]MP()
ESTANDAR
MALLOC( ) MEMSET()
MEMCHR() OFFSETOF( )
SfRXFRM( ) MEMCHR() MEMCMP()
STRCAT( ) STRCHR( ) STRCMP()
STRCOLL() STRCSPN() STRICMP()
CAOENAS STRCOLL() STRCSPN() STRICMPO
ESTANDAR STRLEN() STRLWR( ) SfRNCAT()
STRNCMP( ) STRNCPY() STRPBRK()
STRRCHR( ) STRSPN() SfRSTR()
STANDARD STRING FUNQ'ION()
SET POWER PWM OVERRIDE() SETUP CCP2()
SET POWER PWMX DUTY() SETUP CCP3()
SET PWMI DUTY() SETUP CCP4()
MODULO SET PWM2 DlfrY() SETIJP CCP5()
CCP SET PWMJ DlITY() SETUP CCP6()
SET PWM4 DlITY() SETUP POWER PWM()
SET PWM5 DUTY() SETUP POWER PWM PINS()
SETUP CCP1()
ERASE PROGRAM EEPROM() SETIJP EXTERNAL MEMORY()
WRITE_CONFIGURATION -
READ_CALIBRATION( )
MEMORY()
EEPROM READ EEPROM() WRJTE EEPROM()
INTERNA
READ EXTERNAL MEMORY() WRITE EXTERNAL MEMORY()
READ PROCRAM EEPROM() WRITE PROGRAM EEPROM()
READ PROGRAM MEMORY() WRITE PROGRAM MEMORY()
CEsrAN DAR
BSEARCH( ) RAND() SRAND() QSORT()
(ESPEClALES)
RETARDOS DELAY CYCLES() DELAY uS() DELAY MS()

42
Compilador C CCS y Simulador PROTEUS para Microconlroladores PIC

.PJT: Amero de proyecto; contiene tada la informaci6n relacionada con el p ro-


yecto.
• .lST: muestra un listado con el cooigo C y el cooigo ensa mblador asociado
para cada linea de codigo .
.SYM: muestra las posiciones y valores de los registros y las variables del pro-
grama.
• .STA: muestra lma estadfstica de la utilizacion de la RAM, ROM Y la PILA.
• .TRE: muestra un arbol del programa donde se especifican las hmdones y sus
lIamadas, con la ROM y RAM usada en cada una de elias .
.HEX: fichero estcindar para la programacion del PIC.
• .COF: fichero binario que induye el cooigo maquina y la informaci6n para la
depuracion correspond iente.

2.12.2 Entorno de trabajo


EI e ntomo de trabajo del ecs e.n pew y PCWH permite com pilar y tambien su mi-
nistra u na gran variedad de hcrramientas auxiliares. En la Figura 2 se muestra los
d istintos elementos basicos del entomo de trabajo. Existen dos formas de iniciar
una sesi6n: abriendo un fichero de c6digo fuente 0 creando un proyecto.

I Comando de maneJo
. de flcheros .
I < ISarra de. Comandos ~
"''I! ' )1 bX

, • I
Pesla!'!a
..,
1 __.....
r
, .. .- ------------ Barra de
- j SubComandosr

Programa I _ . :;:-..: "". I """':::"'----,-----,


I
- ,..... .
Barra de estindar
~ ri .. .. _ ..._ ..... ..

--.....
Barr. de
/: ...... . ..
........
.......
.M"'_"

g§[::~:.
" .. "._.
..
IZONA DE C6DIGO I
Ventana!> _ ....
aUlliliares .... -
:::--:::::':'';;..'"-'''
---.-
. . ,. . _

-. - - ~ - --
....... M . . . . . . .

. ,.... , -
_--_..
, -~ -

... - ~~., . ' •


I Macr;f Barra de InformacIOn

Figura 2. Entorno de Tr.. bajo

44
2. Compitador CCS C

Para abrir un fichero fuente directamente se realiza una pulsaci6n sobre el icona
para el manejo de ficheros (figuIa 3) y aparece un menu donde podemos crear,
abrir, guardar a cerraI ficheros. Can el comando NEW podemos crear un fichero
fuente, un proyecto, un fichero RTF a un fichero de diagrama de flujo.
"';::"
<=' . . _-
--
~.-·Itr~:
-..,.,.._ ..... '

_M J~ ~~---.-~

..."-.
JII-'"

.... - ,l."

Flgur.. J. Los menlls para el manejo de los "(heros


Con la opci6n NEW ~ SOURCE FILE, el programa pide el nombre del nuevo fichero
y crea una nueva ventana en blanco donde podemos empezar a escribir (FiguIa 4) .

0-- - , - ... ,.- _ ...- ......


.'

'1 ' :.l. .:;
-.
.l. '
.'
Co.
' . . .... 0 ......

I.

...
FlgloIril 4. Flchero 'uente nuevo

45
Compilador CCCS y Simulador PROTEUS para Microconlroladores PIC

Si se ejecuta el comando PR OJECT WI ZAR D, tras pedir el nombre del nuevo p ro-
yecto aparece la ventana de configuracion con dos pestanas, una para configurar
las distintas opdones que se muestran en la barra de la izquierda (figura 5) y otra
donde se muestra el cooigo resultante de [a configuration (figura 6). Recorriendo
las distintas opciones (general, communicatiolls, etc.) se llega a obtener el cooigo de
configuracion deseado (figura 7), tras 10 cual ya podemos empezar a escribir el
resto del codigo del programa. Debemos observar como se induye un fichero de
cabecera *.11 donde se encuentra la configuracion del disposi ti v~ (figura 8).
..... - -- --'--" ,
,.
,-- -' --....._.
""",",,_~1 . &

_Ie-

-
~~=

---
~-
-.-
r•. _ _ ..... _ ...

---
--
~-

--=-
~-

Figura 5. Vrntana d e configu,acion de 1...5 opdone.5

1_ .... ' -
',~ ... ---
'''''''''_1loo'_.. _ruW'!
,_~q

-'--
=-...
~M

Flgur.. 6. Ve ntana de configuracion con r l cOdigo f'e.5ultantr

46
_ _---=2", C
"o:..
mpilador CCS C

,,,
Me:', cea\ IIruoeb"'_I. h"
Lee c
_t.h h

,
,6 vo~d .... in


9 atl:cup_...:Ic_p.orta lHO
10 •• t-lIp_ad<: .lJ)C_CLOCK_ INTERN.lL
11 " .. CUll_Sill r.u.S!
12 8e""p_t.1-= .. _0 RTCC_lNTEIltUL RTCC_DIV_l
13 !I .. t."p_t.~r_l Tl_D I$l..8U:O
1'1 !lct.up_t.UD!:r_2 T2_DlSlEILED
15 le<l_1nit.

""
""

Flgur", 7. EI cOdlgo despues de una conflgl.l,iltcl6n

.,..
·· - a~

--
,

·
1

'0

"
12
~
..a.aQftCT

-
~~
ItOCPo

1I'DD1IW

H"
""
Figura 8. EI "(hero de cabecera con la con"guracl6n del PIC

2.12.2.1 EI primer programa


La opci6n del PROJECT WIZARD es muy comoda pero para comenza r a trabajar
con CCS C se recomienda inidar los ficheros de c6diga fuente directamente hasta
que el programador adquiera los conocimientos basicos para manejar esta opd6n.

Asi pues abrimos un fichero fuente nuevo donde se escribira un programa para en-
cendef y apagar un led durante 1 segundo. Elled se conectani a la patilla RB7 de un
PIC16F876 trabajando a una frecuenda de 4 MHz. En los siguientes lemas se intn
explicando cada una de las senlendas ut"ilizadas, ahara [0 interesante es manejar el
entorno de trabajo y no tanto 10 que hace cada sentenda.

La primero es utilizar el fichero de cabecera donde se especifican las caracteristicas


del mkrocontrolador PIC:

47
CompiJador C CCS YSimulador PROTEUS para Microcontroladores PIC

linclude <l6F876.h>

Este fichero 10 suministra CCS y 10 incorpora en el directorio de dispositivos (devi-


ces) . El eompilador tiene una ruta de busqueda para los fieheros #illcfude; esta ruta
se puede modifiear en el casa de querer induir ficheros que Sf' encuentren en otros
directorios. Can el comando OPTIONS ~ PROJECTS OPTIONS ~ fNCLUDE
FILES se accede a una ventana (figura 9) donde Sf' puede anadir, eliminar a mo-
difiear el orden de busqueda de los ficheros #i ndude (tam bien podemos observar
que se pueden configurar los ficheros de trabajo -FILES- 0 los ficheros de salida
- OUTPUT FlLES-) .

......
- - -. -- - -- ..........
---.. ---.
-- '- .

1.i:E!"-..6:<.--
.' • ......
_.-
• •• 0
-'~'--

... . •. . "".
l!l1ioowt FJo s-...a....

! .. : t!?J!!!'t'~ t "'!'~
+-'".

, ..
,----;;;;;;-:;-,
I
-
~

--_.._. _- • .--
-'-
.~-

.....
_

Figura 9. Ruta de b~squedil de los ficheros .include

A continuacion se definen, mediante las correspondientes directivas, la velocidad


del PIC y el puerto utilizado. Es importante definir la velocidad inmediatamente
despues del PIC ya que muchos drivers (como el LCD) la nccesitan para eonfigu-
rarse.

luae delay (clock = 4000000)


, byte puerto_ b _ 0,,06

Ahora se puede describir la funcion principal MAfN (). Los cambios de color, letra,
etc., se puede configurar desde la opcion OPTIONS ~ EDITOR PROPERTIES ...
AI escribir el programa (figura 10) podemos observa r como apa rece un aTbol de
funciones a la izquierda de la ventana de programa; esto pennite expandir 0 con-
traer las fundones y dedaraciones de control para optimizar la visualizacion de los
programas mas complejos (figura 11).

48
2. tompilador CCS C

.

"
- ,,• ,m •

I.
!Scl_, eioclt

J ,• , .... no_1>
_11.
,• V<

f ,• _l_~r1._b

' .... nO_1>

" CIoIl.,__

•• ..
"" bll _ _ t
","1.,__ ,_n.o b

" 13 ..._"1 ...., p . . no_'"

..
U

"
no,

Flgur. to. EI progrOllmill

....

,, Clel., clocl< "" •
,• p ... r~_b

,• d _.11

,• • .,t._trU_1)
' .... rto_b

..
""
"
.a nUl

Figura' 1. ContrOilyenda ~ ;i,bol

En el editor de texto se puede pu lsar el bot6n derecho 50bre cualquier linea (figu ra
12); en cl caso de los fiche ros ;illc1l1de permite abrirlos en una pestana adicional.

-
-
FlgUfill 1 Z. Las opc:ione. del bolon derecho

49
Compilador CCCS YSimulador PROTEUS para Microcontroladores PIC

Como ayuda para escribir el programa, CCS ofrece el comando VIEW (figura 13)
que permite visualizar las internlpciones (Valid Interrllpts), fusibles de configura-
cion (Valid Fllses), hojas de caracteristicas (Data Sheet) y una ventana completa don-
de se describe el PIC (Device Table Editor) mediante distintas pestaii.as (esta opdon
tambien es accesible desde la opci6n TOOLS ~ DEVI CE EDI TOR (ver figura 15).

<i' -............ -- -- .-: ..... - - -.. - ...

.-

--.' ,-_._,,-
...... .. .
., .,.-
~
..•.............
~~~w
~
••••••••••
~q_~_._._.'..
~..

n.~._

___ ._ • • • • _NnN""".
~

Flgu,,, t 3. Com.. ndo VIEW

Se puede proceder ala compilacion, que se puede hacercan el comanda COMPILE


~ COM PILE 0 directamente con 1a teda de funcion <F9>. Durante la compilacion
aparece una ventana donde se in/orma del p roceso de compilaci6n y si hay errores
(figura 14). Tras la compilaci6n aparece una ventana con los mensajes de error si los
hubiese 0 el porcentaje de utilizacion de la memoria RAM y ROM si la compilacion
ha side correcta (figura 15).

NOTA

jATENCI6N! Si se escribe un fichero Fuente y a continuaci6n se abr(' 0 se crea


un segundo fiche ro fuente, al compiJar este ultimo se compilara el primero.
Siempre se compila siempre el PRIMER fichero abieTto.

50
2. Compilador CCS C

ProJu r.
F:L.ATUR.\.PICIpr a~c~,\CLASE\lu%Jrn_cllu%.c

C...,I".
II•• nOI.
Flln: 2. SIMtI".,1IS: S. n..: 1 h" lin... ~
0 ..... _ .... ERR HEX SYM LST (Of PJT mE STA

RAM: ",
ROM,
"
Figura 14. Ventana de c:ompllacl6n

--_
< _ _ .10<._ _ _ _"0 __'

'-'- . _-

FigurOil 1 S. MensOiIjeS" de c:ompiiOilc:i6n

Tras la compilacion se obtiene, entre otros, el fichero HEX para programar 0 si-
mu!ar el PIC. En OPTIONS ~ PROJECT OPTIONS ~ OUPUT FlLES, se pueden
configurar los ficheros de salida (figu ra 16).

".
~
-~
r _
r _
(' Am.-
(' ~ . coo
.C(lD
~~
r, _
=-
r ~_
_
--
--~
~-
~
~

-...
r _
lJ,i
, ~

...
-~
fOfCol_1Io
r_
-~
(O" ,alO -~
r _

"-
.-~ (' lIalO r _
r »""Ia.
Gl,b>lOof;_
11',... .........
~~ 1'_1'0'....

- ." r .... _-." ........ __ ...... ...


Figura 16. FlcheroS" de saUdOil

51
Compilador C CCS YSimulador PROTEUS para Microcontroladores PIC

En 1a parte izquierda del fichero Fuente aparecen unas ventanas auxiliares (ldellti-
fiers, Projects, Files) en las que se pueden observar [a estructura de fichero del pro-
grama compilado (figura 17). Hacienda una puJsaci6n en cualguiera de ellos se
abre una pestana con su contenido.

!- - ..
I - Iii: .......
-",-

" O.

j -",-
'"~

-
O~
0.-

I 0-
~
Om
o.~
0*

"'-
Flgur.. 17. Ventilna auxilia, para ficheros

En 1a barra estandar -Figura 18- (para activarla: OPTIONS -? TOOLBAR ... ~


TOOLBARS, figura 19), tambien aparecen distintos comandos entre los que se en-
cuentran la visuaHzaci6n de los ficheros de salida.
,. I~
"
.x ....
ggbS d 4 sa

e
2
'iI""~
SOW $ !!!&!lQ2
• $

Figura 18. Barra estandar

U<er r....... _ "...


;;;;,;:
..,;..
;:--------

Dotds II (:II(

Figura 19. ActJvctcion barrils de herrarnlentils

52
2. Compilador CCS C

Hay un fichero de salida especia lmente util pa ra la simuladon con el PROTEUS


VSM, se IT.:l t.:l del fichero RAM SYMBOL MAP (·.SYM) donde .:lparecen todas las
variables de la memoria RAM y sus correspondientes direcciones. Por ejemplo, si
en un programa existe una variable FLOAT llamada TEMP, se puede consultar su
dircccion a traves de este fichero (figura 20) para utiliza rla en el WATCH del PRO·
TEUS (figura 21 y figura 22).

l t d_i ni t.i
133- 13_ 8ITOF.P1

Figura 20. flchero de salida SYM

.- ~;~~§~:::::~
IJ_ InN!'
..... "'1"""----301•
O.uo.r-- o.p.,[_

...
ASOIZSq

< W..a(2~1
DotJlIoWCllC!((~1
QuoOW"!8~1 (
IEEEFboII(~)
IEE£ DoobIII (8 ~J
"" HMd\fIo,oI;(3b\>INJ
• -,.,fIooot[( btoIosl
.; iigC_
... 11 -

Figura 21. Conflguracion del WATCH en el PROTEUS

53
Compilador CCCS VSimulador PROTEUS para Microcontroladores PIC

Figura 22. Ventillna de WATCH con 1011 variable

54
3. La gestion de los puertos
--'-

Capitulo 3

La gestio" de los puertos


3.1 Introducclon
Los microcontroladoresPIC tienen termina les de entrada/salida divididos en puer-
tos, que se encuentran nombrados alfabtHicamente A, B, C, D, etc. Cada puerto pue-
de tener hasta 8 terminales que, de fonna basica, se comportan como una entrada/
salida digital. -Segt'm las caracteristicas del PIC, cada puerto puede tener, ademas,
asignado un bloque funcional: convertidor AD, USART, 12C, etc.
Por ejempJo, en Iii familia PIC16F87X (figura 1), pueden llegar hasta 5 puertos en el
PIC16F877 donde se pueden encontrar bloques de TIMERS, CCP, MSSP, U5ART,
P5P Y convertidores AD.

Figura'. Caracterlstlcas de 101 familia PIC' 6F87X

Considerando a los puertos como entradas/salidas digitales, los puertos se carac-


terizan por ser independ ientes, es decir, se puede programar cada temlinai del
puerto para que se com porte como lila entrada 0 una salida d igital (figura 2). La

55
Compilador CCCS VSimulador PROTEUS para Microconlroladores PIC

habilitaci6n como entrada 0 salida se reaJiza a traves del registro TRISx (TRlSA:
8Sh, TRJSB: 86h, TRISC: 87h, TRISO: 88h 0 TRISE: 89h en el BANCO 1 de la memo-
ria RAM).

NOTA

Un valor 0 en estos registros indica que el terminal correspondiente del puerto


es de salida, mientras que un va lor 1 indica que sera de entrada.

La gestion del bus de datos se realiza a traves de los registros PQRTx (pORTA:
05h, PORTB: 06h, poRTe: 07h, PORTO: 08h 0 PORTE: 09h en el BANCO 0 de la
memoria RAM).

BUSQATOS 0 0 1'> TERMI NAL


110

ESCRITURA or "
DATOS

I- 0 or
ESCRITURA 0
TRIESTADO

lECTURA
DATOS
?-
Fig"r .. 2 . Estr"ct"ra baslca de "" termi"al

Tambien existen algunos terminales que poseen unas caracteristicas especiales, por
ejemplo:

• En el puerto A, el tennina! RA4 tiene salida en drenador abierto 10 que obliga


a utilizar una resistencia de pllll-llp en el caso de funcionar como salida. Este
terminal tiene entrada en trigger-scllllliH 10 que pennite su utilizaci6n como
entrada de contador de eventos externos en conju ncion con un modulo tem-
porizador (TIMER) .
• En el puerto B, los terminales tienen una resistencia de pUll-liP intema que se
puede habilitar a traves del bit RBPU del registro OPTION_REG (81h, 181h).
Si dicho bit es 1, todas las resistencias de pull-lip €Stanm deshabilitadas, si es
un 0 estaran habilitadas sOlo en el caso de que el term inal funcione como en-
trada (figura 3).

56
3. La gesli6n de los puertos
-- - - - - - - - ----=-----'---
_., _., _., _., _., _., _., _., R-Blu '"'
II IIBPtJ !INTEDG 110CS !lOS!! !P8.' !PII2 !1'$1 !PSI) I W-Blu ,"""fII.

." ••
U_BIt no Im.,...,..ntado
.. ... c.orno B
............ ~ un POll ....
L- ,

Figura 3. Registro OPTION_REG

Bit 7: RPBU: Habilita las resistencias de pull-up.


l - Las deshabilita.
()mLas habilita todas.

Las caracteristicas electricas de los puertos delimitan su utilizaci6n para manejar


cargas de forma directa.

Mlixima I;orriente de salida a ni vel alto por un pin 110 25mA


Maxima corriente de salida II nivel ba·o in 110 20 rnA
Mlix ima corriente de salida a
'""
nivcl alto po:r. 1.'1 puerto A 80mA
Maxima comentc de salida a nivel ba ·o <oJ uerto A SOmA
Maxima corriente de salida a nivc! altopor cI puerto 8 ISOmA
Mhima corricn!c de salida a nivet ba·o cd uerto B l00mA

Figura 4. Caracteristicas electricas de los puertos de .... n PIC16F84

Estos niveles de tension permiten trabajar con cargas de bajo consumo como leds,
displflYs de 7 segmentos 0 LCD, pero para activar cargas de mayor consumo es ne-
cesaria la utilizaci6n de transistores.

3.2 Gestlon de puertos en C


En lenguaje C se pueden gestionar los puertos de dos formas:
• Se dedaran los registros TRISX y PORTX definiendo su posicion en la memo-
ria RAM como variables de C.
• Utilizando las directivas especificas del compilador (#USE FAST_IO, ;;USE
FIXED_lO, #USE STANDARDjO).

3.2.1 A traves de la RAM


Se definen los registros PORTx y TRfSx como bytes y se sirnan en la posicion co-
rrespondiente de la memoria RAM. La directiva utilizada de C es #BYTE:

=BYTE variable=constante;
'BYTE TIUSA - 011 85 II V<!Iriable TRISA en a5h.
'BYTE PORTA - 01105 II VaIiilble PORTA en OSh .
'BYTE TRISB - 0:< 86 II Varillble TRISB en 86h .

57
Compilador CCCS y Simulador PROTEUS para Microcontroladores PIC

IBYTE PORTB .. Ox06 /1 V" r i.tbll'!' PORTB I'!'n 06h .


IBYTe TRISC .. Ox 87 II V.triiilble T'RISC en B1h.
IBYTe PORTe - Ox 07 1/ V.trJable PORTC en 07h .

Una vez definidas estas variables se pueden eonfigurar y controlar los puertos a
traves de los comandos de asignacion.
TRISlt ... OxFF; II 8 termin.tles de entrada
TRISB .. Ox OO ; II B termindles de sali da
TRISC .. OICOF; 1/ 4 terminales de mayor peso de sillida , 4 term.:inill e s de
1/ menor peso de e.nr.tda

Escritura en los puertos:


PORTe - Ox OA ; II salidil del d.ttos 0000'1010 por el p uer t o C
Lecrura de puertos:
valor .. PORTA ; 1/ Asiqna el da t o del pIJ9r to A a 101 v(l r iollble valor.

Manejo de sentencias:
TRISD-Ox OF ;
ir (POR TD , oxon PORTD 1- OxltO ; II comprueb<ll los 4 terminales de
II meno./:" peso del plJert o D y si son
II 1111 saeo!! por los 4 termi.ndles de
II m<lyor peso el data 1010 .

Existen unas funciones de C que permiten trabajar bit a bit eon los registros 0 varia-
bles definidas previamente. Estas funciones son las sigu ientes:

bit_clear (var,biO; /I Pone a 0 el bit especifieo (0 a 7) de la variable.


II Pone a 1 el bit especifieo (0 a 7) de la variable.
bit_test (var , bit); /I Muestra el bit especifieo (0 a 7) de la variable.
swap (var); 1/ lntercambia los 4 bits de mayor peso por los 4 de
II menor peso de la variable
bit_set (PORTe , 4J : II Hsaca n un 1 por el termlnal RC~

ir Ibl t _test(PORTB,O)--lJ bit_ clear /PORTB , l); Iisi RHO es 1 born RBl

Se puede declarar un bit de un registro eon una variable mediante la directiva ;;8IT,
10 que permite trabajar mrectamente con el terminal:

#BIT nombre = posicion. bit


'BIT RB4 - Ox 06 . 4 II PORT'A-0IC06
RB4 - 0 :

58
3. La gesti6n de los puertos

Ejemplo 1; Se configuran los terminales RB1 como salida y el RBO como entrada
(con resistenda de pull-up). La salida debe tener el mismo valor que la entrada. Se
utiliza lm in terruptor en la entrada y un led en Ja salida (figura 5). Componentes
ISIS: PIC16FB76, RES, LED-BLUE Y SW-SPST-MOM.

OSCIIClKIN

SW1
RMI"" SW-SPST-MQ.4
RAlIANl D1
""_.
AA31AN~'
""""'if ·
""""""
RA5IAN4iSS RCtVTl0S0/T1CKI
RClfT1OSIiCCP2
RC2JCcPl R1
RC"""""- ".

Figura S. EI esquema del ejemplo 1


'include ~16F876 . h>

'fuses XT,NOWDT
'use delay( clock - 4000000 ) II Reloj de 4 MHz
'BYTE TRISB - Ox 86 II TRISB en 86h.
I B YTE PORTB - Ox06 II PORTB en 06h.
IBYTE OPTION_REG" Ox8l II OPTION_REG en Blh.
void main () (
b1t_ cleat"(OPTION_REG, 7); II Habilitacion Pull-Up
bit_ set (TRISB, O); II 80 como entt"ada
bi t_ cleat" ITRIS8, IJ ; II B1 como s.llid"
bi t_ clear (PORTB, 1) .- II Ap"gd el LED
!>'h.Ue II} (
1f (bit_test (portb,O) - 1 II Si RaO es 1, ap"ga el LED
bi t_ cleat" (portb, I) ;
else
bit_set (portb, I ) ; II S1 RBO - C, enciende e1 LED

Figura 6 . EI programa del eJemplo 1

59
Compilador CCCS y Simulador PROTEUS para Microconlroladores PIC

3.2.2 A traves de las dlrectivas


EI compilador ofrece funciones predefinidas para trabajar con los puertos. Estas
funciones son:

output_X (valorl; // Por el puerto correspondiente saca el valor (0-255).


input_XO; // Se obtiene el valor en el puerto correspondjente.
set_tris_X(valorli /1 Carga eI registro TRISx can el valor (0-255).
port_h_pulJups (valorl; // Mediante valor '* TRUE 0 valor '"' FALSE habilita
II 0 deshabilita las resistencias de pull-up en PORTB.
geUrisXO II Devuelve el valor del registro TRISx
Donde la X es la initial del puerto correspond iente (A, B, C, ... ).
Qu t pu l:_A(O x FF}; / / Sacs par el puerto A el valor 11111
Valo r -Input_BO ,. I I Le e ",1 valor del puerto B
Se t_tri~_C(OxOF) ,. / / Conflgura el puerto C ; CO-CJ entradas , C4-C7 sillidliS

Existen una sene de funciones asociadas a un terminal 0 pin". EI parametro pin"


se define en un fichero inclllde (par ejemplo, 16F876.h) con un formato del tipo
PfN_XII, donde X es el puerto y n es el numero de pin.

#define PIN_AO 40
#define PIN_A1 41

Las funciones son:


output_low (pin"); II Pin a O.
output_high (pin"); II Pin a 1.
output_bit (pin" , valor); II Pin al valor especificado.
outpuUoggle(pin"); 1/ Complementa el valor del pin.
output_float (pin"); II Pin de entrada, quedando a tension flotante .. .
II (simula salid a en drenador abierto)
in put _sta tee pin")i II Lee el valor del pin sin cambial' el SE:ntido del
/1 terminal.
input(pin"); II Lee el valor del pin.
Las funciones OlitPIICXO e illpllCxO dependen de la directiva tipo #US E "-",0 que
este activa. Directivas:
;USE FAST_fO (PUERTO) (PUERTO: A ... J
Con la funcion 01ltpllCXO se saca el va lor al puerto y con la funcion illPllt_xO se lee
el puerto. La directi va no modi fica previa mente el registro TR{S correspond iente.

60
3. La gestion de los puertos

Hay que asegurarse de que los registros TRIS estan corre<:tamen te definidos. En-
tonces, el ejemplo 1 quedaria :
lincllJdQ <16F876.h>
I ~u !S es XT , NOWDT
luse delllY ( clock - 4000000 )
lu s e ~lIs t_io (B) +-
void mdin () (
part_byul1ups (T/lUS) ;
set_tris_B (OxOl);
output_ low{PIN_Bl) ;
...hile (J)

i f (input (PIN_ BO! -- 1


output_low(PIN_Bl) ;
else

' USE STANDARD_fO (PUERTO) [PUERTO: A ... J


Can la funci6n OU~PlltJ() el compilador se asegura de que el terminal, 0 terminales
correspondie ntes, sean de salida mediante la modificaci6n del TRIS correspondien-
teo Can la funcion inpllt_xO ocurre 10 mismo pero asegurando el terminal (termina-
les) como en trada. Es la directiva por defecto. Entonces, el ejemplo 1 quedaria:
linclude <16F876 . h>
I fuses XT , NOWDT
luse delpy( clock - 4000000
'use stllndd cd_lo/B) +-
void main (J {
por t_byul1ups (TRUE) ;
output_low(PIN_ BlJ ;
while (1)

i t (input(PIN_ BO) -- 1
output_ low(PIN_Bl! ;
else

=USE FlXED_IO (PUERTO_OUTPUTS=pin"", ... ) [PUERTO: A ... J


El compiJador se encarga de generar el codigo para definir los puertos de acuerdo
ron la informaci6n que indica la directiva (donde sOlo se indican los terminales de

61
Compilador CCCS YSimulador PROTEUS para Microconlroladores PIC

salida), sin tener en cuenta si la operati6n es de entrada 0 de salida. Entonces, el


ejemplo 1 quedaria:
'include <16F876 . h>
'fuses XT,NO~DT

luse delay( clock ... 4000000 }

'use fixed_io(b_outpu/;s-pin_bl) +-
voidmain(} {
poTt_byullups (TRUE),.
output_ lo.,(prN_ BIJ;
.,hile (1J

if (input (PIN_SO) .... 1


output_lo.,(PIN_BI) ;
else
output_high (PIN_SI),.

3.2.3 Con punteros


En C se puede acceder a la memoria de datos mediante punteros. Los punteros se
deben definir como tNT:
Iderme TRISA (inc ' ) Ox85
Idefine PORTA finc"} 0,,05

EI regis tro es manejado mediante la utilizati6n del operando .:


int valor
valor _ ' porta

Los terminales se pueden leer 0 escribir utilizando operadores logicos:


' porta 1- ObOOOOOOOl ,. II RAO .. .l
' porta , - ObllllllOl ; II M2-0
If ("porta, ObOOOaaOOl} ... II Lee el valor de RAO

Entonces, el ejemplo 1 quedaria:


linclude <16F876 . h>
Iruses XT,NOWDT
luse delay( clock'" 4000000

Iderme TRISB (int " ) Ox86 +-


'define PORTB fint · ) 0,,06 +-
'define OPTION (int ' ) Ox81 +-

62
_ _ _ _ _ _ _ _ _ _ _ _-=
3. La gesli6n de los puertos

void mo!in () {
"option &'- Ob01111111 .. II Pon.,o! 0 e1 bit 7 del OPTION REG
/1 (pull-up hiJbl1itadoi
- tcisb· axOl; II RBD entrada, RBl salida
~portb - OxDD ; II Apaqll el LEO
while OJ

i.[ ( ' porth , OxOl /1 Lee el REO Y I'll es 1 ••


'portb-OxOD ; 1/ Ap.lglJ el LED (RBl .. OJ
e1$'e
· poctb-Ox02 ; 1/ 51 es 0 enciende el LED /RBI .. l)

Ejemplo 2: Realizar un contador de 0 a 99 con un doble display de 7 segmentos de


ca todo comu n. La cuenta debe ser continua y de 0 a 9 el digito de las decenas debe
estar apagado. Componentes [SIS: PIC16F876, RX8 Y 7SEG-MPX2-CA-BLUE.

Figur;!l 7 . EI esquema del ejemplo Z


'include <16FB76 . h>
'USE DELAY(CLOCK .. 4000000)
'FUSES XT ,NOHDT ,NOPROTECT,NOPUT
IUSE fast_ 10 (B)
luS£ fast_IO (A)
byte CXJNSr DISPLAY(lOJ - (Ox3f. OJ<06 , Ox5b, Ox4f, Ox (i6, Ox6d, Ox7d, Ox07 , Ox7! , OxEl) :

63
Compilador C CCS y Simulador PROTEUS para Microconlroladores PIC

"".,in () (
byte ud-O,dec-O ;
SET_ TRI5_B (OxOO) ;
5£T_ TRIS_ A (OxOO) ;
OUTPUT_B (0) ..
for( ;; l f
for (dec- 0;dec<10;dec-H-) I I Cuenta digito decenas
for (ud-O;ud<lO;ud-O)
OUTPUT_A(Ox02) ; / / cat_ D - apagado, cat_ U" encendido
OUTPUT_ B(OISPLAY{ud]}; / / Diglto unidades
delay_ ms(50J; / / PlIrll evital'" parplldeos
j f (dec_O) output_a (Ox03); /1 S1 decenas - 0,
/1 cat_D - apagado
else output_ a(OxOI); I I Si decenas ;. 0,
I I cat_ D .. encendido
OUTPUT_B(DISPLAY[dec]) ,- I I Dlglto dec.naa
delay_IlLS (50),. I I P ..roll .v;i tar pa.q>oIIcr.<>a

FlgUfil 8 . EI programil del ejemplo Z

Los terminales de los dos displays son comunes par 10 que el dato es comt'tn; para
que aparezca el digito s610 en las unidades, 0 sOlo en las decenas, se debe apagar
e! afro display mediante el terminal de cModo. Es decir, si se desea visua.lizar las
unidades se pasa el c6digo "10" aJ displny y si son las decenas se pasa el "01" (con
un 1 el displny esta apagado y can un 0 esta encendida) . La altemancia entre los dos
ditodos debe ser tan nlpida que el ajo no se de cuenta del parpadeo. En el caso que
las decenas sean cera, su display se apagara.

CONST DlSPLAY!l OJ = {Ox3('Ox06,OxSb,Ox4f,Ox66,Ox6d,Ox7d,Ox07,Ox7f,Ox6f! permi~


te visualizar de 0 a 9 mediante la combinacion de digitos tipica de los displays de 7
segmentos (figura 9). Par ejemplo, en el 0 se encienden a, b , c, d, e y £, 10 que signi~
fica 111111, Ox3F en hexadecimal.

Figura 9. Los 7 segme"tos del dlsplil)'

64
3. La gestion de los puerlos
---
3.3 Entradas y salidas
3.3.1 LCD
Se acostumbran ha util izar LCD del tipo HD44780, con un numero de lineas varia-
ble y un numero de caracteres por linea lambien variable (por ejemplo, can 2 x 16
se trabaja can dos lineas de 16 caracteres cada una) (ver figura 10) .

• 1.· 11_( _ )
2.- lIo:;{AIImentad6n ....." !"~ ~,~YJ I
J. - ..juste de conlnSta (a o ~ 5.SV)
4..' ItS (~de ft9i$lro)
5.. R/W {1ed~/eKJ'itur..}
6.- E ( .. nabI_)
1. - DO (dMo lSI )
15.- 01
g. -Ol
lo.- O]
11 .- 0<11
l2.·05
13.- Ofi
1 • . - 01 {dato M51}

Figura 10. EI patlllaje de un LCD t ip lco

El bus de datos es de 8 bits, aunque tambien existe la posibilidad de trabajar can 4


bits (can un menor numero de caracteres). El compilador C induye un fichero (dri-
ver) que permite trabajar can un LCD. EI archivo es LCD.C y debe llamarse como un
#inc/udc. Este archivo dispone de varias fundones ya definidas:

Icd_in it 0;
Es la primera fund6n que debe ser Hamada.

Barra el LCD y 10 configura en el formato de 4 bits, ron dos Hneas yean caracteres
de 5 x 8 puntas, en modo encendido, cursor apagado y sin parpadeo.

Configura el LCD con un autoincremento del puntero de direcciones y sin despla-


zamien to del display real.

1cd....gotoxy (byte x , byte y);


Indica la posidon de acceso al Lm. Par ejemplo, (1, 1) indica la primera posicion de
la primera linea y (1,2) indica la primera posicion de la segunda linea.

Icd..getc Cbyte x , byte y);


Lee el car,kter de la posicion (x,y).

65
Compiiador C CCS y Simuiador PROTEUS para Microconlroladores PIC

lcd_pute (char s);


5 es una variable de tipo char. Esta funcion escribe la variable en la posicion corres·
pondiente. Si, ademas, se indica:
\I se limpia el LCD.
\n el cursor va a la posicion (1,2).
\b el cursor retrocede una posici6n.
EI compi lador de C ofrere una funcion mas versatil para trabajar con el LCD:

p rintf (string)
printf (cstring.. values ..•)
p ri ntf (fname, (string, val ues ... )
String es una cadena 0 un array de caracteres, values es una lista de variables sepa·
radas por comas y fiw/1/e es una funciOn.
EI forma to es %nl, donde n es opcional y puede ser:
1·9: para especificar cuantos caracteres se deben especificar.
01 -09: para indicar la cantidad de ceros a la izquierda.
1.1 -9.9 para coma flotante.
t puede indicar:
c Caracter.
s Cadena 0 caracter.
u Entero sin signa.
d Entero con signa.
Lu Entero largo sin signa.
Ld Entero largo can signo.
x Entero Hexadecimal (minusculas).
X Entero Hexadecimal (mayusculas).
Lx Entero largo Hexadecimal (minusculas).
LX Entero largo Hexadecimal (mayusculas).
f Flotante con truncado.
g Flotante con redondeo.
e Flotante en farmata expor,encial.
w Entero sin signa con decirnales insertados. La 11 cifra indica el total,
la 21 el numero de decimales.

66
3. La gestio" de los puertos

A continuaci6n, mostramos unos ejemplos de los distintos formatos:

Formato Valor = Ox12 Valor = OxFE


o/.:.03u 0 18 254
'You 18 254
%2u 18 •
%S 18 254
~%d 18 -2
'Yo, 12 fe
%X 12 FE
%4X 0012 OOFE
%3.1w 1.8 25.4

Ahara, mostramos una serie de ejemplos de aplicacion:


by~c x,y,1.;
print£I~HolB~);

print! I ~V/llor->'2x In Ir", gct_ rtcc () ;


pIintf(~t2u 8X '4X\n\r ,K,y,Z};
W

pcintf{LCD_PUTC, "n-tu"'.n);

EI driver LCO.C esta pensado para trabajar con el PORTO 0 el PORTB. Por defecto.
utiliza el PORTO a menos que Ie indiquemos 10 contTario mediante:
#define use...,portbJ cd lRUE , se mmenta 0 descomentatal como se indica en I., figurn 11.
Por defecto. este driver usa siete terminaJes para la comunicaci6n entre el LCD y el
PIC. En la figura 11 se observa parte del fiche ro LCO.C donde se enruentran defini-
das las conexiones utilizadas y la posibiJidad de cambia r de puerto.
II As defined in the following structure thtt pin connection is ~s follOws:

,.,.
enable
/I
// "D'
// D2
/1 D' D'
// D5 D5
// D' D'
// D7 D7
//
1/ LCD pins DO-DJ /lre not used and PIC D3 1s not used.
1/ U!:I -COIIIIIIel1t tb e Lo~~owil1g da1ine t o u.ft port B
/1 IcI.Jjne u .sJXJctb_ l c d TRUE

Figuril 11. Extrilcto del flchero LCO.C

67
Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC

Se puede trabajar con otros puertos, por ejemplo el PORTC, modificando el fichero
LCD.C En la figura 12 se muestra parte del fichero LCD.C donde se definen los
puertos de trabajo (el Do el B); modificando estas sentencias se puede trabajar con
otro puerto (A, C, etc.) .
lif defined use_portb~lcd

Iloedte led'" getenv( "sEr:PQRTB"'J II This puts the entire structure over
II t he port
Idefjne ser_tris_ledl x J set_tris_b(x}
'else
Ilocate led - getenvl"sfr : PORTD"') 1/ This puts the entire structure over
II the pert
'denne set_tds_led(x) set_td.s_dlx)
lendiE
Figura '2. EJ(tracto del flchero LCD.C

Ejemplo 3: Realizar un menu de control mediante un pulsador. EI programa debe


mostrar un menu de 3 funciones. Mediante el pulsador se debe seleccionar uno de
los 3 elementos y con otro ejt:ocutar la funcion (en este caso encender un led). Dispo-
ncmos de los componentes ISIS: P1C16F876, RES, BU1TONy LM016L.

,--CAlIBR,,~R
lCOI'

[
I
t ... .. ITlI····

U lli"'L::: .'.
~ qO •• ~
z
"',
,
:.
·..
···
~

IT'
c
~

.. ,.

'" Rl :
·
• .
If' ze 01 ~4 1 00
''
.
~ ~ I ••c
" I t~
i .~: : • "'. •• '",.
-

Flg",a '3. £1 esquern.1 del ejemplo 3

68
3. La gestion de los puertos

linclude <J6F876.h>
'fuses XT, NOWDT
I~se delay(clock- 4000000,
linclude <lcd.c>
luse stand.. rd_io(CJ
hse st .. ndard_io(AJ

enu~ [uncione", (med,cal,ini}; IF Asigna un valor .. cada elentento


,1 met:! - 0, cal - 1 e ln1 - 2

void ~dir(void'{ 'F Funci6n de IrIfIdir


'/~lgorltmo
correspondiente
output_ toggle (pin_CO, ..
,
\'old cslibrar(void) f llFuncion de c"llbr"r
,Islgoritmo correspondiente
utput_toggle(pin_Cl} ,.

id inicial1z .. r(void/ ( ,1 Funci6n de inicial1zar


lalgoritmo correspondiente
tput_ toqgle (pin _ C2) ..

j run.[unc(i.nt numfunc' ( I, A$ign..ci6n de 1" [uncl(in .. rflal!zar


F viene dada POI' 1a vari.able J tem'"
K

:J1f! tch (num[unc)

'aBe lIIed:
medirfJ ;
brealc;
c"",e c"l,
calibrar (/;
brealc ;
case ln1:
inlcializar() ;
break;

in (/ {
.... r .Item; II Vari"bles de [unci ones

69
Compilador C CCS y Simulador PROTEUS para Microconlroladores PIC

II NUmero de funeiones

// bit_sec (TRISA,O};
1cd_ init(J;

...hile O} f
if (input(PIN_AO) l/ I II Detecta botdn de selecci6n
item++: /1 Si pulsJ Jumenta la variable
delay_1M (300); II Para evitar rebotea
lcdyut;c('\f',:

if (item> (rLmenus-I)) II Si la variSble supera e1 m.imero de .. .


item-OIl II tunciones la inicializa

switch (item)

case 0:
lcd_gotoxy(l,lj:
pdntf(lcd_pucc, "l>'.EOIR"'j;
lcd_gotoxy (1,1) i

break;

case 1 :
prl11tf(lcdyutc, "CALIBRAR N
):

lcd_gotoxy(1, 1);
break;

case 2:
printf (lcdyutc, "INICIALIZAR");
lcd_gotoxy(l,l) ;
break;

it fJnput(PIN_Al) l/ II 51 5e pulsa el botdn de .,elecci6n . . .


(delay_ma (200):
rull_ tullC (i tem) : J II 5e llama a 18 funcidn correspondience

Figura 14. Ef programa del eJempfo)

3.3.2 LCD grafteD


Se puede utilizar un LCD grMico con una controladora KSOl08 (como el de la figura
15), por ejemplo la ASI-A-1286AS-Lj-EWSIW de la casa ALL SHORE INDUSTRIES.

70
3. La gesti6n de los p.uertos

Fiiura 15. LCD 9"Uko con controlado,a KS0108

La distribuci6n de patillas es la siguiente:

VSS: masa.
VOO: alimentaciOn.
Vo: tension de contraste.
on: entrada de da tos/entrada de coo igos de illstruccion.
RIW: lectura/escritura.
E: enable.
080 .. 087: datos de entrada.
CSl..CS2: chip select.
RST: reset.
El compiladorC suministra varios drivers para estetipo de LCD graficos, el CLeD.C,
CRAPHICS.C 0, el mas espedfico, HDM64GSI2.C.

La conexion definida e n estos ficheros es la siguiente:

1111111111111111111111/1/11111111111/111111111111/11/11//11/11/11/11111111/111/11111111
//11 fill
1/11 LCD Pin camzeclialls: 1111
11!I (These call be c/ranged (/S /leeded ill the Jollowi/lg defines). /1//
1111 VSS;s conllected to GND I11I
1I11 VDO is cOllllected to +5V 1111
1111 VO - LCD operatillg voltage (Constrast adjustmeflt) 1I11
1/11 Oil - Data or IIIStructioll is con/lected to 82 1111
1111 R/W - Read or Write is connected to 84 /III
//1/ Enable is connected to 85 /111
/11/ Data Blls 0 to 7 is amnected to port d ////

71
Compitador CCCS y Simulador PROTEUS para Microcontroladores PtC

II/I Cllip Select 1 is COflllected to BO 1/1/


1/1/ Chip Select 2 is COllnected to 81 fill
/11/ Reset is COIIl/ected to CO III/
111/ Negative vol/age is also connected to the 20k Ohm POT 1I11
fIll Positive lIoltagefor LED back/igM is cO/mected to +5V fill
fIll Negavtive voltage for LED backlight is cOllnected to CND ////
@ @
11//11/1/111////111111//1///111/11111/111/////////////111/////////111/111////////111
Las fundones definidas son:
gcd_init(mode)
Debe ser la primera fund 6n en invocarse. Enciende el LCD.
glcd_pixel(x,y,color)
Establece el color del pixel. Puede activarse a desactivarse.
glcd_fiIIScreen(color)
Rellena el LCD de un color determinado. Puede activarse a desactivarse.

glcd_updateO
Escribe en la RAM del LCD; s6lo es posible si esta definido FAST_CLCO.
glcd_line(xl, yl, xl, y2, color)
Dibuja una linea desde el primer punta al segundo asignando color, el cual, a su
vez, puede activarse a desactivarse.
glcdJect(xl, yl, x2, y2, fill, color)
Dibuja un rectangulo con un vertice en (xl , yl ) y el otro en (x2, y2). Puede ser relle·
nado 0 no y puede activarse un color a no.
glcd_bar(xl , yl, x2, y2, width, color)
Dibuja una barra desde el primer punto al segundo; se puede d cfinir el numero del
rango de pixeles y puede activarse el color 0 no.
glcd_cirde(x, y, radius, fill, color)
Dibuja un circuJo con centro en (x, y) y con el radio especificado; puede rellenarse
o no y puede activarse el color a no.
glcd_text57(x, y, textptr, size, color)
Escribe el texto empezando en (x, y); los caracteres son de 5 x 7 pixeles; se puede
escalar el tamano y puede activarse el color a no. Esta funcion envia los caracteres
a la linea siguiente (se debe usar #defifle CLeD_WIDTH para definir el ancho de
visu alizaci6n).

72
3. La gestion de IDs puertDs

Ejemplo 4: VisuaJizar en un LCD el estado de las entradas del PUERTOA (ver figu-
ra 16). Disponemos de los componentes 1515: P1C16F877, RESPACKB, LGMI2641-
BSIR Y SW-SPST-MOM .

PlERTO A

"

~-.---- ..
Figura 16. EI esquema del ejemplo 4

'1nclude <15£877.h>
Ifuses HS,NOWDT,NOPROTECT ,NOLVP
'use del~y (clock-20000000)
'include <HDM54GS12.c>
linclude <graphics.c>
'use standard_io(~}

void main ()
CHAR A5! j .. ~A5~;
CHAR A4{ j-"A4'":
CHAR A31 j-#AJ" ;
CHAR A21 1- #A2*;
CHAR All }-"Ar;
CHAR AO[ }_"AO N ;
CHAR IN[ }-"PUERTO A";
glcd_inlt(ON};
glcd textS7(33, 30 , AS, 1, 1);
gled text57(49, 30,A4 , 1, 1);
glcd_tex t 57(55, 30,A3, 1, 1);
qlcd_ text57(8L 30,A2, 1. 1);

73
Compilador CCCS y Simulador PROTEUS para Microcontroiadores PIC

gled eextS7(97, 30,Al, 1, I),.


!lled_textS7(113, 30,AO, I, 1);
gled textS7 (30, S, IN, 2, 1) ..

h'hlle(lJ (
i f (lnput_"t.ace(PIN_A5j .... OI
gled recc(32,40,46,60,l,l);
else
gled reet(32,40,46,60,l,O);
!lled_ rec:t (32,40,46, 60, 0, 1) ;

I~ (input_state (PIN_A4) -0)


gled_ reee (48, 40, 62,60,1,1) ;
else
gled reet(48,40,62,60,1,0) ..
glcd_ reet (48, 40,62,60. 0,1) ;

lr (inpuC_state{PIN_A3)-"0)
glcd_rece (64, 40, 78, 60, 1,1);

glcd_rece {64, 40, 78,60,1, O} ..


gled recc{64,40,78,60,O,l};

lr {lnpue_seate(PIN_A2}--O}
g1cd recc(80,40,94,60,J,l);
else
glcd_rlJct (80, 40, 94, 60, 1, OJ;
glcd rect(80,40,94,60,O,l);

i f (input_st"ee(E'IN_Al)--O)
!lIed reet(96,40,110,60,1,1);
else
gled_ reet (96, 40, 110, 60,1,0);
gled_ reet (96, 40, 120, 60,0, 1) ;

i f (input_state (PIN_AO)-O)
!lIed reet(112,40,126,60,l,1);
else
gled_rece (112, 40,126 , 60,1,0);
gled_recc (112, 40, 126, 60,0, 1) ..
delay_IllS (400);

Figura' 7 . EI program.a cOrTeJpondle"te .II eje ... pto 4

74
3. La gestlon de los puertos

3.3.3 Teclado (keypad 3x41


Las entradas a traves de un pulsador son muy habituales en los sistemas con micro-
controladores para trabajar con una mayor infonnadon 0 infonnacion alfanumerica.
Por ejemplo, se utilizan los tedados matriciales de 1x4, 3x4 04x4 (ver figura 18).

•,
' DSB 0
· 0 GUill
a •
1
Bema
.m.a
• •
Figura 18. Dlferentes tlpos de teclados matriclales

EI compilador de C induye el driver KBD.C para manejar el teclado (3x4). Las fun-
ciones que incorporan son las siguientes:

kbd_inilO
lnidaliza el sistema, debe ser la primera funcion en el programa.

kbd-setcO
Devuelve el valor de la teda pulsada en fund6n de la tabla que tiene programada
(ver figura 19).
r7~~~~---------------'
II Keypad llyout:
cha~ const KEYS[4][3] • {{'1','2','3'},
{ '4','S','6' },
{ '7 ' ,'8 ' , ' 9 '} .
{'.·.·O'.· . '} } ;

Figura 19. La definIcion de teclas fl1 el archlvo KBD.C

A traves de la modificacion de esta tabla podemos adecuar el resultado del progra-


rna a las distintas canitu las del teclado.

EI archivo KBD.C esta pensado para trabajar con el PORTB 0 el PORTD (ver figura
20). Activando 0 no la Ifnea #defitle use-portb_lcd TRUE podemos seleccionar el
PORTB (ver figura 21).

75
Compilador CCCS YSimulador PROTEUS para Microcontroladores PIC

' I 1)1 to port II (~,

" , P , ",
lif lIefinpd U'iPJlortb_kbd
Idpfinl' spt td s kbd e se t _ tri s_ b ( x )
Iplsl' --
Idpfinp Sl't_ tri S_kbll( se t _ tr is_lI exJ
lendiF

Figura 20. La conflguraci6n de puertos

t
Id fln p

,.
.,. , P

Figura 2'. La selecci6n del PORTS

Las conexiones vienen dadas en el fichero pero se pueden modificar:

'dl'hne COLI ( 1 « 5)
Idefine COl1 ( 1 « ')
IdPf{np COl 2 (1 « 7)

Ide fine ROWS (1 « 1)


«
.
Id('fin(' ROW1 (1 2)
«
Ifdefine
Id('finp ,"112,'
(1
(1 «
3)
')

eo ell e21
- " "
RO
• 1 2 3
Rl
• 4 5 6
--- ., I--iI
• ~, 7 8 9

.,---
"•• R3
0 #
*
0
~
Hi-
r"-

Figura 22.l.a asignaclon de patillas

76
3. La gesli6n de los puertos

Se puede trabajar con el LCD y el teclado a tTaves de puertos separados 0 compar-


tiendoel mismo puerto (con eJ ahorro de patillas que contleva) (ver figuras 23 y 24).
Com partir puerto suele conllevar problemas si se quiere trabajar con el tedado y
las interru pdones RB4IRB7.

2 3

4 5 •

7 • 9

* 0 •

Figura 23. EllCD Y el teCloldo en puertoJ dbtintoJ

1 2 3
4 5 •
7 • 9

* 0 •

Figura 24. EllCD Y el tee'ado compartlendo 'OJ mlsmos puertos

Ej emplo 5: Introducir d atos par el teclado y visualiza rlos en el LCD. Cua ndo se
pu lsa la I'ecla "." borrar eI LCD (ver figura 24). Se dispone de los sigu ientes compo-
nentes [SIS : PIC18F876, LM016L Y KEYPAD-PHONE.
l i nclude <l6F876 . h>
'fuses XT , NOWDT , NOPROTECT , NOLVP
luse delsy(clock- 4000000}
linclude <lcd . c>
linclude <kbd. c>

77
Compilador C CCS Y Simulador PROTEUS para Microcontroladores PIC

void main ()
e/llu' k;
illt x:
lcd_lnitO ;
kbd_illit ();
pcrt_ bJull ups (TRUE) :
ledJutc ("lfListo . . . InN) :

while (TRUE) (
k - kbd_qetc() :
x-k-48; II Conversion numedea
if(k!-O} /
iflk--'·')
lcdJ1.lte( ' lf');
else
IcdJutc (x) ; II Impr i me car~cter

delay_ms (!jOO);

printf(1cdyutc, Nlf car-tc",k) ,. II Imprime carActer


delay_ms(!jOO);

prin cf (1cdJutc,Nlf Cilr_'uN,k); II Imprimeo villar ASCII


del.Jy_ms (!jOO) ..

printr(led_putc, ~Il' Num-Ju".x) ; I I Imprime valor numlirleo


delay_ ms(!iOO);
lcdJute("\fLisco ... InN} ..

Figura 25. £1 programa del ejemplo 5

Debemos observar que el valor leido en el tecJado y el visualizado en el LCD es


un caracter ASCII. Si deseamos convertirlo a su valor numerico correspondjente
deberemos restarle el valor 48 (30 en hexadecimal); eslo se debe a que el caracter 0
en ASCII es 3Oh, ell es 31h, etc.

Ejemplo 6: Oiseiiar un sistema basico para el control de accesos; a traves de un


tecJado de 3x4 introducir una clave de 3 digitos que cuando sea correcta abra una
puerta (con un pulsv a un rele) y 10 indique en una pantalla de LCD. Guardar la
dave de acceso en 1a memoria EEPROM (figura 26). Se dispone de los siguienles
componentes /5/5: P1C18F876, KEYPAD-PHONE, RES, BD135, CEUy RELAY.

78

=
3. La gestio" de los puertos

=
[""'1"" LKI. I I
· .', ~
1 3

t;~ • ,, It ~6

i'= 7 - 9
-:'1
,
,
• • 0

'C'

." r
I -~~\j~~ ~~"
.b

Figura 26. lEI esquem ... del ejemplo 6

linclude <16F876 . h>


Ifuses XT,NOWDT,NOPROTECT,NOLVP
luse delayfr:lor:.k- 40000(0)
luse stilndilrd_io{a)

linclude <lcd.c>
linclude <kbd.c>
linclude <stdlib . h>
Irem Ox2100_{'7','2','3'} II Posicion 0,1 y 2 de la Eeprom cen los dates_
II 7,2, Y J respectivllmente
void llI8,in ()
chllr k;
int i;
char data{3}, clave(3]; II Matrices paca guardar clave y datos
lcd_ initlJ ;
kbd_init ();
port_byullups(TRUE) :
while (TRUE) (
II posicion de 1a matriz
pnntf(1cdyucc,'"lfpulsac tecla lIn"); II Plica primer dato
whlle(i<-2j ( II FiJCiJ tres diJtos
k-kbd_getc()J 1/ Lee el teclade

79
Compilador CCCS y Simulador PROTEUS para Microconlroladores PIC

i f (k! - OJ II 51 .'Ie h(l pul5ado a1guna t eela


(d~u.{il-k; II .'Ie gl.lardll en 1<1 posic16n correspondiente
1++; II de la marriz
printf(lcd_putc,"\fpulsar tecla tu\n" ,i+lJ; . / / S1qulente dato

/ / Pasa datos de eeprom a la matriz clave


clave {1 J -read_ eeprotIJ (i I ; )
1f ((da ta [0] _clave [0] J &. (da ta {I] --clave [1} J H (d<lta [2] -clave (21 J)
printf(lcd_putc,"\fPuerta Abiecta"); / / Ctlmp.9ra los datos y la clave
outpuc_hlgh(PIN_AO}; /15.1. es igual cUI pulso <II rele
del .. y_ms (SOD) ..
outpuC_low(PIN_AOJ .. }
else printf(1cd_ putc, "\fPuert .. Cerrad.. "); /. Cl<lve erronea
delaY_lfls (lOOO) ;
I

Figura 27.· Programa del Ejemplo 6

Ejemplo 7: Inl roducir los datos, a traves de un tedado, de velocidad de un mo-


tor y generar una senal modu lada en ancho de pulso proporcional al dato de la
velocidad (figura 28). Se dispone de los siguientes componentes ISIS: PIClSFS76,
KEYPAD-PHONE, RES. 2sK1058, CELL YMOTOR.

,.
....n

,--------1' 1 2 3
5 6
8 9
o #

"'C' .....

Figura 28. EI esqlotema del ejemplo 7

80
3. La gesti6n de los puertos

Se genera una selia! modulada en ancho de pulso PWM (sin utilizar el modulo
eep de los PIC) donde el semiperiodo de seital a nivel alto esta fijado por el valor
introducido en eJ tec1ada. Para ella, se utiliza un regislro de B bils para fijar el semi-
periodo 11 nive! alto (PWMH) y el semiperiodo a nivel bajo (PWML) (ver la Figura
29). Como el valor maximo del regislTo es 255, este debe coinddir con el valor
maximo del tedado, es decir 9; por 10 tanto, la relacion entre el valor del t€Clado y
el semiperiodo PWMH sera:

PWMH", (255/9) x Tecla, aproximadamente PWMH=2S·Tecla.

PWMII

L
255 ~
Figura 29. La moc:lulilC:lon PWM

Segtin dicha ecuadon ruanda el valor de teclado sea 0 la salida sera 0 de forma
continua y el motor estara parada. Cuando el valor de teclado sea 9, el semiperiodo
PWMH sera de 252 (no Beg:l a 255) yel motor estara casi a tada marcha. EI semipe-
riodo a nivel bajo PWML Sf' obtiene de restar el PWMH a 255.
linc]ude <.l6f876. h>
I f uses XT, NOWDT, NOPROTECT , NOLVP
IUSE DE.LAY (CLOCJ(-4000000)
IINCLUDE <kbd. c>
IUSE STANDARD_ IO (1.1)

VO I D MAINO

CHAR k , kanta ' O'; II k valor de tec]ado , Jr valor anterior de t ec]"do


chltr PWMH-O , PWML-O ; II Semi periodo alto y bdjO
kbd_ini t () ;
PORT_ B_ PULLUPS (TRUE.) ;

WHIL E (IJ { II Bucl e infinito (siemp re consulta e l teclado)


Jr -kbd_ ge tc() ; 'I Lee en ASCII el valor de 1(1 tecla pu1s(lda
i f (k- ' \O ' , k-k ant ; 1/ 5i no se p ulsa tecl .. (lO) .'Ie US"
II el valor anterior
i~ ((k -- '"' ) I I (k-- " ' )) k- ' O'; II 5i se puls/J ' 0 I se dslgna
// un valor cero .

81
Compilador C CCS YSimulador PROTEUS para Microconlroladores PIC

kant-/c; /1 Sa guard.. tec1a pu1sad ..


k-k~48; II Se cc""vierte de ASCII a valor numer.ico
PWMH-k · 28; 1/ Proporcion entre valor tecla y semiperiodo Alto .
PWML-255-PWMH; / / Semipedodo Bajo
for (PWMH; PWMH>D; PWMH- - ) { // Obtenci6n de 1a salida .. nivel alto
OUTPUT_ HIGH(PIN_AOJ: }
for(PWML;PWML>O:PWML--) ( // Obtenci6n d£I 14 salldil a nive1 bajo
OUTPUT_LOW(PIN_AO);}

Figura 30. leI programa del ejemplo 7

Figura 31. La sena. obtenlda para el valor 9

82
4. Las inlerrupciones y los lemporizadores
----------------~

Capitulo 4

Las interrupciones y
los temporizadores
4.1 Introduccion
Las intcrrupciones permiten a cu.alquier suceso interior 0 exterior interrumpir la
cjccuci6n del prosrruna principal en cualquier momento. En el momenta de pro-
ducirse la interrupdon, el PIC ejecuta un saito ala rutina de atenci6n a la interrup-
ci6n, previamente definida por el programador, donde se atendera a la demanda
de la interrupci6n. Cuando se termina de ejecutar dicha rutina, el PIC retoma a la
ejecuci6n del programa principal en la misma posicion de la memoria de programa
donde se produjo la interruption.
El manejo de interrupdones permite realizar programas que no tienen que estar
continuamente consultando sucesos internos 0 extemos mediante tlknicas de con-
sulta 0 polling, las ruales provocan retardos 0 paradas en la ejecu.cion del programa
principal.
Los TIMER 0 temporizadores son m6dulos integrados en el PIC que permite reali-
zar cuentas tanto de eventos internos como extemos. Cuando la cuenta es interna
se habla de temporizaci6n y ruando la ruenta es extema se habla de contador. Los
timers estan intimament'e Iigados al uso de las interrupciones, pera no por ello se
utilizan siempre de forma conjunta.

4.2 Interrupciones
Al producirse una interrupd6n, el PIC salta automaticamente a la direcdon del
vector de interrupcion de 1a memoria de programa y ejeruta la pordon de p rogra-
rna, correspondiente a la atendon de la interrupti6n, hasta encontrar la instruccion
RETFIE. AI encontrar dicha instruccion, abandona la interrupd6n y retoma a la

83
Compilador CCCS YSimulador PROTEUS para Microcontroladores PIC

posicion de memoria del programa principal desde la que salta al producirse la


interrupci6n.
Las fuentes de interrupci6n dependen del PIC utilizado. Por ejemplo, el PIC16F84
tiene 4 fuentes de interrupci6n y la familia PIC16F87X Hene entre 13 y 14.

Los PIC de gama baja y media tienen un Unico vector de interrupcion situado en
la direccion 04h de programa (figura 1), mientras que los de gama alta tienen dos
vectores de interrupci6n de distinta prioridad, alta y baja, situados en la posicion
OSh y 18h de In memoria de programa.

PC<12:0>
~L~
utl'lUlEn.w
Hi....11 de I. Pile

NI"",, 2 d. I. PU. n
~

.... _...... _-_ .. _.....


Hlvel. de III PliJI

"".
-""."".
Veclo. de Rf, ...1

..........•.._..........._..
Vecto. de 1n1al'!'\l!)CHln

°
--.
Pe;;""
Q1FFh

Pallll\l \
OFFFh
,om,
PlIogll\Il
11FFh
1FFFh
Pegl"" J

Figura 1. Mrmoria dr program.. lposicion drl vrctor de interrupdonJ

Al poseer un unico vector de interrupci6n (dos en 1a gama alta), el PIC posee W10S
registros de control donde mediante Ia utilizaci6n de banderas, 0 flag s, el usuario
puede determinar que es 10 que ha producido la interrupd6n; ademas, en estos
registros, se pueden habilitar 0 no las distintas fuentes de interrupci6n (mascaras
de interrupci6n) e, induso, permite una habilitaci6n general.
Cuando la habilitacion generaJ esta activa y algunas, 0 todas, la particulares tam-
biE!I1 10 estan, los flags se activan en e1 caso de producirse algunas de las interrup-
dones, de tal mane-ra que el programador puede, mediante el testeo de dichosftags,
actllar de la forma mas adecuada.

84
4. Las interrupciones y los temporizadores

La faniilia P/C16F87X tiene hasta 14 fuentes de interrupci6n. Posee un registro de


control, INTCON (figura 2), que permite la habilitad6n de mterrupciones y el manejo
de losfiags. La habilitadon general se activa medianteel bit Glf (INTCON<7», el cual
es desactivado en el reset; por 10 tanto, hay que habilitarlo por programa. Existen 4
registros adiciona les para la gestion de las interwpciones; PIR1, PIR2, PI El Y PIE2.

Cuando se responde a una interrupcion, el bit GIE es inhabilitado para evitar inte-
rrupdones sucesivas. La direcoon de retorno del programa principal se almacena
eil ia pila y el contador de programa se carga con la direccion 0004h. Una vez en la
wtina de atencion a la interrupci6n se puede determina r la Fuente de la interrup-
cion mediante el testeo de los diferentesjlags. Losjlags activos deben ser "borrados"
antes de abandonar la rutina de interrupci6n para evitar reentradas errOneas.

Registro ITCON (dlreccion RAM: OBh/8Bh/ l0Bh/18Bhl [PIC16F87x]

RIW~ RIW-O RIW-O RiW-O RiW-O RIW-O RiW-O RIW-'


I I
.,to I
GIE I I PEIE TOlE I INTE I R81E I TOIF I INTF R81F
Blt7

Flgur<t 2. Re-glJtro INTCON

bit 7: Gl f: Bit de habilitaci6n global de las interrupciones.


1 - Habilita todas las in terrupciones no enmascararbles.
0= Las deshabilita.
bit 6: PEIE: Bit de habilitacion de las interrupciones de perifericos.
1 - Habilita todas las interrupciones no enmasca rables de
perifericos.
0= Las deshabilita.
bit 5: TOl E: Bit de habilitacion de la in terrupcion por desbordamiento del
TMRO:
1 - Habilita la interrupci6n del TMRO.
0 - La deshabilita.
bit 4: INTE: Bi t de habilitaci6n de la interrupci6n extema RBOffNT.
1 ~ Habi lita la interrupci6n del RBOIlNT.
0"" La deshabilita.

b it 3: RBlE: Bit de habilitad6n de la interrupci6n por cambio en el PORTB.


1" Habilita la interrupd6n del PORTB.
0 - La deshabilita.

85
Compilador CCCS YSimulador PROTEUS para Microcontroladores PIC

bit 2: TO lF: Bit de flag de la interrupcion del TMRO.


I - El registro del TMRO se ha desbordado (debe borrarse
por software).
0= EI registro del TMRO no se ha desbordado.

bill: INTF: Bit deflag de la interrupci6n del RBOIINT.


1 - Se ha producido una mterrupci6n extema por RBOIINT
(debe borrarse por software).
0 '" No se ha producido la interrupci6n.

bit 0: RBlF: Bit de flag de la interrupti6n por cambia en PORTB.


1 .. Al menos uno de los tenninales RB7:RB4 ha cambiado deestado
(debe borrarse por software).
0'" No se ha producido cambia en dichas pati llas.

Reglstro PIE1 (dlrecclon RAM: SCh) [PIC16FS7x]

RJW-<J RJW-<J RJW-<J RJW-<J RJW-<J RJW-<J RJW-<J RJW-<J


I PSPIE l ADlE I RCIE I TXIE I SSPIE [ CCP11E [ TMR2tE [ TMR11E

Bil7 BitO

Figur.. 3. Regbtro PIE I

bit 7: PSPIE: Bit de habili tacion de interrupcion por lecturajescritura del puerto
paralelo esclavo:
1 = Habilita la interrupci6n por lectura/escritura del PSP.
0- La deshabili ta.

bit 6: A DIE: Bit de habilitacion de interrupcion por conversion AID.


1 - Habilita la interrupcion.
0 " La deshabilita.
bt 5: R CIE: Bit de habilitaci6n de interrupci6n por recepci6n del USART.
1 = Habilila la mterrupci6n.
0- La deshabilita.

bit 4: TXlE: Bit de habilitaci6n de mterrupci6n por transmisi6n del USART.


1 .. Habilita la mterrupci6n.
0- La deshabilita.

86
4. las interrupciones y los temporizadores

bit 3: SSPIE: Bit de habilitaci6n de interrupci6n del puerto serie sincrono.


1 '"' Hahilita la interruption.
0 .. La deshabilita.

bit 2: CCPUE: Bit de habilitati6n de interrupci6n del m6dulo CCP1.


1 '" Habilita la interrupci6n.
0'" La deshabilita.
bit 1: TMR2 1E: Bit de habilitaci6n de interrupcion por igualaci6n del
TMR2 y PR2.
1'" Habilita la interrupti6n.
0'" La deshabilita.
bit 0: TMRllE: Bit de habilitation de interrupcion por desbordamiento del TMR1.
1 '" Habilita la interrupti6n.
0 - La deshabilita.

Re-glstro PIE2 ,dJreccion RAM: SDh, [PIC16FS7x]


U.Q u-o
Be LIE
Blt7 BltO

Figura 4 . Regfstro PIEZ

bit 7: No implementado. Se lee como O.


bit 6: Reservado.
bit 5: No implementado. Se lee como O.
bit 4: EETE: Habilitacion de interrupcion por escritura en EEPROM.
1 '" Habilita la inlerrupcion.
0'" La deshabilita.
bit 3: BCU F: Flag de interrupcion por colision en bus
1 = Colision en el bus SSP 0 12C en modo master.
0= No hay colisi6n.
bit 2-1: No implementados. Se leen como O.
bit 0: CCP2I E: Habili taci6n de interrupcion del m6dulo CCP2.
1 - Habilita la interrupci6n.
0", La deshabilita

87
Compilador CCCS y Simulador PROTEUS para Microcontroladores PIC

Los registros PIRI y PIR2 rontienen losflngs de las djstinlas inteTrupdones. EI rom-
pilador C se encarga de generar 1'.'1 cooigo necesario para leer y borrar dichosflngs,
tal y como podremos ver en el siguiente apartado.

4.2.1 Interrupclones en C
En el compilador C la directiva habitual en el manejo de las internlpciones es
IiTNL,;rxxx. Especifica que la funcion que Ie sigue es una funcion de interrupcion;
ademas, no necesita mas parametros.
Las posibles directivas son las siguientes (en gris las posibles interrupciones en la
familja PIC16F87X):

Interrupciones Oescripci6n
tINT_AD Conversion AD complela.
'INT ADOF Conversion AD fuera de rango de tiempo.
' INT_BUSCOL Colision de bus.
'INT BUTTON Por boton (14000).
;INT_CANERR Error en 1'.'1 modulo CAN.
:INT_CANIRX Mensaje invalido en 1'.'1 bus CAN.
~ I NT_CANRXO Bus CAN recibe un nuevo mensaje en buffer O.
;INT CANRXI Bus CAN recibe un nuevo mensaje en bllffer 1.
#INT_CANTXO Bus CAN trar.smision complela en buffer O.
: INT CANTXl Bus CAN transmision completa en bllffer 1.
;: INT_ CANTX2 Bus CAN transmision com piela en buffer 2.
; INT_CANWAKE Bus CAN evento de activacion 0 wake-up.
#INT_CCPl Unidad 1 de captura, comparacion y PWM.
;: INT_CCP2 Unidad 2 de captura, comparaci6n y PWM.
: INT_CCP3 Unidad 3 de captura, comparacion y PWM.
"NT_CCP4 Unidad 4 de captura, comparacion y PWM.
; INT CCPS Unidad 5 de captura, comparaci6n y PWM.
#lNT_COMP Comparador.
JINT_COMP1 Comparador 1.

88
4. las interrupciones Vlos temporizadores

Interrupciones Descripci6n
ITTNT_COMP2 Camparador 2.
IT INT_CR Encriptaci6n finaJizada.
~INT_EEPROM Escritura EEPROM finalizada.
;tINT EXT lnterrupdon extema (RBO).
=TNT_EXTl Interrupci6n extema it1.
ItINT EXT2 Interrupcion extema 1t2.
,ttINT_EXT3 Interrupcion extema 113.
=INT 12C lrtterrupcion 12C (14000).
ff lNT_tCl Entrada captura #1.
;tINT IC2 Entrada captura ;;2.
, INT 1C3 Entrada captura it3.
#INT LCD Actividad LCD
,INT_LOWVOLT Detectado bajo voltaje.
;:rNT_LVO Detectado baja voltaje.
;tINT OSCJAIL Falla en oscilador.
ItI NT_OSCF Fallo en oscilador.
:oINT PSP Dato de entrada en puerto paralelo.
#INT]WMTB Base de tiempo PWM.
.ttINT RA Cambia de estado en AD-AS .
.;' INT_RB Cambia de estada en B4-B7 .
ii INT Re Cambia de estado en C4-C7.
=lNT_RDA RS232 dato recibido.
; INT_RDAO RS232 data recibido en buffer O.
'; INT_RDAI RS232 data redbido en buffer J.
itINT_RDA2 RS232 data recibida en buffer 2.
#INT RTCC Desbordamiento del Timer 0 (RTCC).
ITINT_PSP Escriturallectura del puerto paralela.

89
4. Las inlerrupciones y los lemporizadores

(nterrupciones Descripci6n
:lNT_COM P2 Comparador 2.
#INT_CR Encri ptaci6n finalizada.
t i NT_EEPROM Escritura EEPROM finalizada.
, I NT_EXT lnterru pci6n extema (RBO).
; INT_EXTl lnterru pci6n externa:;1.
:: INT_EXT2 Interru pci6n externa : 2.
#INT_EXT3 Interrupci6n externa ~3.

:: INT 12C lnterrupci6n llC (1 4000).


, INT _ICI Entrado caplura #1.
/l INT_IC2 Entrada caplura #2.
' INT_1C3 Entrada captula ::3.
.; INT_lCD AClividad LCD
: INT LOWVOLT Detectado bajo voltaje.
:INT LVD Detcctado bajo voltajc.
II INT_OSC FAIL Falla en oscilador.
#INT_OSCF Fallo en oscilador.
#INT_PSP Da ta de en trada en puerto pa rale lo.
#INT PWMTB Base de tiempo PWM.
::INT_RA Cambio de estado en AD-AS.
: INT RO Cambio de estado en S4-B7.
' INT RC Cambio de estado en C4-C7.
#INT_RDA RS132 dato redbido.
#INT_RDAO RS132 data redbido en buffer O.
#INT_ROAI RS232 dato recibido en buffer I.
::INT_RDA2 RS232 d ata recibido en buffor 2.
/l INT RTCC Desbordamiento del Timer 0 (RTCC).
::INT_PSP Escritura/lectu ra del puerto paralelo.

89
Compilador CCCS y Simulador PROTEUS para Microcontroladores PIC

lnterrupciones Descripcion
#lNT SSP Actividad en SPI 0 12C.
UNT_SSP2 Actividad en SPI 0 12C Port 2.
;lNT TBE RS232 buffer de transmision vado.
#INT_TBEO RS232 buffer 0 de transmisi6n vado.
#INT TBEl RS232 buffer 1 de transmisi6n vade.
#INT_TBE2 RS232 buffer 2 de transmisi6n vado.
-'INT TlMERO Desbordamiento del Timer 0 (RTCC).
~INT_TIMERl Desbordamiento del Timer 1.
;INT_TIMER2 Desbordamiento del Timer 2.
#INT_TIMER3 Desbordamiente del Timer 3.
#INT_TIMER4 Desbordamiento del Timer 4.
#INT_TIMERS Desbordamiento del Timer 5.
#INT_USB Actividad en el USB.

Existe una directiva ;INT_DEFAULT que implica que se utilizara la funcion que Ie
acompafia si se activa una interrupd6n y ninguno de los f1ags est" activo.

La directiva ~ INT_GLOBAL implica que la fund6n sustituye todas las acdones que
inserta el compilador al aceptarse una interrupci6n. Se ejecuta .solamente 10 escrito en
dicha funci6n. No se suele utilizar y si se hace debe hacerse con mucho cuidado.

Si se utilizan [as directivas de interrupci6n, el compilador genera el c6digo nece·


sario para ejecular la fund6n que sigue a la directiva. Ademas genera el c6digo
necesario para guardar a1 principio y restituir al final el contexto; tambien borrani
el flag activo por la interrupti6n.

EI compilador C induye funciones para el mejor manejo de las directivas de inte-


rropd6n:

enabJe_interrupts (nivei);
nivel es una constante definida en un fichero de cabecera (16F87X.h - figufa 5-) y
genera el c6digo necesario para activar las mascaras correspondientcs, afectando a
los registros lTCON, PIEl Y PIE2.

En el PIC16F876, los "ruwles" permitjdos son:

90
4. Las interrupciones y los temporizadores

enable_interrupts
ITCON(OBh) PIE1(SCh) PIE2(SDh)
(nivel);

GLOBAL
11000000
COh
INT_RTCC
00100000
INT_TIMERO 20h

00010000
INT_EXT
10h
0000 1000
INT_RB
08h

INT_AD
DIOOOOOO
40h

00100000
INT_RDA
20h

00010000
INT_TEE
10h

00001000
INT_SSP
OSh
00000100
INT_CCP1
04h

00000010
INT_TIMER2
02h
00000001
INT_TIMERl
01h
00010000
INT_ EEPROM
IOh
00001000
INT_BUSCOL
OSh
00000100
rNT_CCP2
04h

GLOBAL equivale a GIE '" PEIE '" 1 Y debe activarse de forma independiente. El
resto activar;in la mascara correspodiente.

disable_interrupts (nivel);
Realiza la funci6n contra ria a la anterior, inhabili ta las mascaras de la interrupci6n
correspondiente.

91
Compilador CCCS YSimulador PROTEUS para Microcontroladores PIC

'-ro_, ,.
'"' '-"'-'
GLOUL oero
!U

"
~- me
lIlT~RD
IN'T_trr ...
x01'.O
"rr 1108

• ...
llfT_ ~
11fT TOE
,~-
,~- T1I1LRI
,~- T1I1LJU




" - ,~ CCPI

'1,-
" ,~- CCN
lifT_SSP
,~-
'"
,~- lIiJ!1COL
,~- E[PIIOII
d, m'_TlHRO
Figura 5. Parte d~ flc:hero include 16F87x.h

4.2.1 .1 Interrupclon exterior por RBO


Es una interrupci6n basica, comun a la mayoria de los PIC. Permite generar una in-
terrupd6n tras el cambia de nivel de alto a bajo 0 de bajo a alto en la entrada RBO.

La dirediva utilizada es :INT_EXT y se debe acompaiiar de las siguientes funcio-


nes (afectan al bit 6 del registro OPTION_REG, ver Figura 6).

exUnU~dge (H_TO_U;
La interrupci6n es por flanco de bajada (activa el flag INTF).
exUnt_edge (L_TO_H);
La interrupci6n es por f1anco de subida (activa el flag INTF).

R/W-l R/W-l R/W-l R/W-l R/W-l R/W-l R/W-l R/W-l


1 RBPU I INTEDG I Toes I lOSE IpSA I PS2 I PSI Ipso
Blt7 BitO

Figura 6. Registro OPTION_REG

bit 6: lNTEDG: Bit de seleccion del flaneo de interrupcion de RBO.


] - La interrupci6n es por flanco de subida del pin RBO/INT.
0= La interrupci6n es por flanco de bajada del pin RBO/INT.

92
4. Las interrupciones y los lemporizadores
---
Ejemplo 1: Enccndcr y 'wagar, c0l15ccIIliuamcI1fc, 1111 LED ell la paWla RB7 wando sc pro-
duzca un cambio de nivel cilia patilla RBO (ver figura 7). COmpOIlClltes: ISIS: PIC1 6F876,
RES, LED-GREEN Y SW-SPDT-MOM

OSC1JCLK,.
OSC21CLKOlJT """NT
.S>
'---.l!.f MCUWppITh'V ""
RB3IPOM SW-SPOT-MOM
RAW"'" .S<
RAl/ANl
RA2lAN2NRU-
RA3lAH3NREf+
"'" p'----,
""""'"
RB11PGD
RA4/TOCKJ
""",....,
01

R1
""

FlgurOl 7. Ejemplo 1
#include <16F876 . h>
Iruses XT , NOWDT , P(JT,NOWRT
luse deldy(clock- 4000000)
IU!fe f"st_lo(B)
inti cambiO""O ; II Variable de cambia
lINT_EXT II Atencion a interrupcion por cambia en RBO
ext_isrO ( II Funcion de inte r rupcion
al1cput_co ggle(pin_B1) .-

vold !Min" {
set_t n: s_B(OxOl} ; II BO como entrada , 87 como siilllida
output_low(PIN_ B7) ; II Apaga LED
port_ byullups(TR(JEJ; II Pull-up para RBO
enable_lnterrupts(1nt_ext) ; II Habllita int o RBO...
e x t_int_edge (L_tO_H) ; II por flanco de subidll
enllble_interrupts (GLOBAL) ; II Habilita into generlll
while (11 { II Buele infini to de espera

Figura 8. programa del ejemplo I

93
Compilador CCC S y Simulador PROTEUS para Microconlroladores PIC

4.3 TIMERO
EI bloque mntional TIMEROI WATCHDOG es un contador (registro) de 8 bits, incre-
mentado por hardware y pragramable. La cuenta maxima es de 255 (el incremento
es constante e independiente) .

• Contador: cuenta los eventos extemos (a traves del pin RA4ffOCK1) .


• Temporizador: cuenta los pulsos internos de reloj.

Se puede insertar un prescaier, es door, un divisor de frecuencia programable que


puede dividir por 2, 4, 8, 16,32, 64,1280256. La frecuencia de conteo es una cuarta
parte de la frecuencia de reloj (fosc/4). Posteriormente, con el usn del presca/er se
puede dividir la freruencia.

EI bloque del T1MERO puede funcionar como WATCHDOG, 10 que permite que du-
rante el funcionamiento normal del microcontrolador, un desbordamiento (0 time-
Ollt) del Watchdog provoque un reset (Watdldog Timer Reset). Para evitar el desbor-
damiento se debe, cada aerlo tiempo y antes de que lIegue at limite, ejecutar una
instruccion CLRWDT que borra el Wardrdog y que hace comenzar un nuevo conteo
desde cera. Se basa en un oscilador RC interno, independiente del oscilador del mi-
crocontrolador y que no requiere ningun componente extemo. EI Watchdog cuenta in-
duso si e! reloj conectado a OSCVCLKI ylo OSC2/CLKO esta parada, por ejemplo,
por la ejecuci6n de una instrucci6n SLEEP 0 por un defecto del cristal oscilador.

Los registros implkados en la configuraci6n del TIMEROfWDT son los siguientes:


OPTION_REG: configura el "hrudware" del TIMEROfWDT.
l NTCON: permite trabajar con la interrupcion del TIMEROfWDT.
TRISA: habilita la patilla RA4.

Reglstro OPTION_REG Idlrecclon RAM: 81h/181hl [PIC16F87x]


RIW-1 RIW-1 RIW-1 RIW-1 RJW-1 RJW-1 RIW-1 RJW-1
RBPU I INTEDG I TOeS I TOSE IpSA I P52 I PS1 Ipso
Blt1 BltO

Figura 9 . Re gi stro OPTION_REG

bit 5: TOeS: Procedencia de las sei'iales:


1 = RA4ITOCK1.
0: Reloj interno.
bit 4: TOSE: Tipo de £lanco en el TOCKl I RA4:
1 = Flanco descendente.
0 - Flanco ascendente.

94
4. las Inlerrupt:lones Vlos lemporizadores
-------------------------
bit 3: PSA: Asignad6n del divisor de frecuencias:

1=WOT.
0 - TMRO.

bit 2:0: P52:PSl:PSO: Determina el divisor de frecuencias a actuar segun la


s iguiente tabla.

Valor RangoTMRO RangoWDT

000 1:2 1.1

001 H 1,2

010 1:8 1:4

011 ],16 ],8

100 1:32 1:16

101 ],64 1:32


110 1:128 1:64

111 ],256 1:128

El tiempo de desbordamiento del TIMERO se caJcula segun la siguiente ecuaci6n:

T .. TCM ·Prescaler·(256 - Carga TMRO)

Donde To,t es el cicio maquina que se puede caJcula r mediante la ecuadon:

4.3.1 TIMERO en C
La funcion para configurar el TlMERO es:

setup_timer_O (modo);
Donde modo esta definido en el fichero de cabecera (afecta a los bits 5:0 del op-
TlON]EG),

Setu p_Timer_O(modo); OPTION_REG(Sl h/lSl h)

00000000
RTCC_ INTERNAL .
GOh
00100000
RTCC EXT_ L_TO_lI
~ lOh

95
Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC

Setup_Timer_O(modo); OPTION_REG(81h/181h)
00110000
RTCC_EXT_H_TO_ L
JOh
00001000
RTCC_ DIV_ I
68h
00000000
RTCC_ DlV_ 2
OOh
00000001
RTCC_DIV_4
OIh
00000010
RTCC_DlV_S
02h
00000011
RTCC_ DIV_ 16
03h
00000100
RTCC_DIV_32
0,"
00000101
RTCC_ I)IV_6-'
OSh
00000110
RTCC_DIV_ 128
06h

RTCC_DIV_256
00000111
07h

Los distintos modos se pueden agrupar mediante el empleo de simbolo I.


setup_ timer_O (RTCC_DIV_ 2 I RTCC_EXT_L_TO_H) ;

La funcion para configurar el WDT es:


setup_wdt (modo);
Donde madoesta definido en el Fichero de cabecera (afecta a los bits 3:0 del OPTION_
REG),

Setup_wdt(modo); OPTION]EG(81hI181h)

0000ll)()()
WDT_18MS
OBh
00001001
WDT_36MS
09h
00001010
WDTJ2MS
OAh

96
4. las interrupciones y los temporizadores

Setup_wdt(modo); OPTION_REG(81h/l 81 h)

00001011
WDT_I44MS
OBh
00001100
WDT_288MS
OCh
00001101
WDT_576MS
ODh
00001110
WDT_1152MS
OEh
00001111
WDT_2304MS
OFh

Para activar el Watchdog se deben utilizar los bits de configurad6n mediante la


directiva ; FUSES:

~fuses WDT Activado.

#fuses NOWDT Desactivado.

EI compilador C suministra una sene de funci ones para leer 0 escribir en el Tl-
M£ROIWOT. Para escribir un valor en el registro :
seCtimerO (valor);
wlor: entero de 8 bits.
Para leer eJ valor actual del registro:

valor = get_timerO 0;
wlor: en tero de 8 bits.
Tambien permite realizar la puesta a cero del Watchdog (como CLRW01):

restarl_wdt 0;

Ejemplo 2: Generar ul/a SClial Cllfldrada de 1KHz utilizmldo /a interrupcion del TIMERO
(ver figura 10). COII/pollelltes ISIS: PIC16F876 e Illstrumen/os ISIS: OSCILLOSCOPE y
COUNTER TIMER.

Para generar una seiial de 1 Khz se necesita un semiperiodo de 500 fls. SegUn la
eruacion de desbordamiento del K, utilizando un cristal de 4 MHz y un presca/er
de 2:

T- TCM ·Prescaler·(256 - Carga TMRO)

97
Compilador CCCS YSimulador PROTEUS para Microcontroladores PIC

donde x - 6, es door, se d ebe cargar el TlMERO con el valor 6. Pero esta relacion
sOlo se rumple si se trabaja en ensamblador. AI trabajar en C, el compiJador genera
lineas de c6digo que aumentan el hempo de ejecuci6n del programa y, por ello, es
necesario ajustar el valor final. En este caso se ha utilizado un valor de carga de 29
(OxlO).

Figura 10. Ejemplo 2


'INCLUDE <16F876 . h>
luse delay (clock - 40aOOOO)
Ifuses XT,NONDT
,use st"nd"rd_io(B)
hllt_ TIMERO
void TIMERO_isr(void}
output_toggle (PIN_BO);
.'!et_ timecO (OxlB); /1 Sa recargii el tlmerO
void mlJin () f
setup_ timec_ D(RTCC_INTERNALIRTCC_DIV_2); II Coniigurdcion time,c-O
set_timeI'D (OxlB),. II CacgiJ del timecO
enablfLinteI'rl,lpts (INT_ TIMERO); II HiJbillta lntecrupc16n timecO
enable_interrupts (glob"l) ; II Habl11t .. interrupci6n gener"l
",hile (1): 1/ bucle in/mit"
J
Figura 1,. Proglama del EJemplo 2

98
4. las interrupciones y los temporizadores

EI compilador se encarga al entrar en la interrupci6n de inhabilitar las interrupcio-


nes y al saUr de borrar losjlags, por 10 que no es necesario hacerlo por programa.
Se puede observar la senal con el osciloscopio digital y activando los cursores en el
menu de Trigger (figura 12) y la medida es de 998.76 ~s.

Figu ra 12. Osc:iloscopio digital

4.4 TIMER1 Y TIMER2


EI modulo TIMER1 es otro temporizador/contador con las siguientes caracteristicas:

• Trabaja con 16 bits (con dos registros de 8 bits: TMRIH y TMRlL).


• Ambos registros se pueden leer y escribir.
• Interrupci6n por desbordamiento de FFFFh a OOOOh.
• Reset por disparo del mOdulo CCP.
• Controlado por el registro neON (ver figura 13). Con el bit TMR10N
(TlCON<O» se puede habilitar 0 deshabilitar.

Reglstro TtCON Idlrecclon RAM: tOhJ[PICt6F87x]


bit 7:6: No impiementados: Se leen como O.
bit 5:4: TlCKPS1:T1CKPSO: Seleccion del valor del prescnler del reloj del TMR1:
11 = Presclller a 1 :8.

99
Compilador CCCS YSimulador PROTEUS para Microcontroladores PIC

10- Prescaier a 1:4.


01 '" Prescaier a 1:2.
00= Prescnier a 1:1.

Flgur.. fl. Reglnro TICON

bit 3: TlOSCEN: Bit de habilitacion deJ oscilador del TMR1:

1 .. Oscilador habilitado.

0- OsciJador parada.
bit 2: TlSYNC: Sincronizacion de la entrada de relo; externa.

Si TMR1CS "" 1:
1 = No sincronizado con la entrada de reloj interno.

o- Sincronizaci6n de la entrada del reloj externo.


5i TMRICS '" 0:

Este bit es ignorado. TMRl unliza el relo; interno.


bit 1: TMR1CS: Bit de se!~cci6n de 101 fuente de reloj para el TMRO:

I = Reloj exlerno desde el pin RCa/naSa/TICK] (flanco de subida).

0 '" Relcj interne (F osJ4).

bit 0: TMR10N: Bit de habilitaci6n del TMR1:


1 .. TMRl habilitado.

o- TMRl parado.
El TIMER1 puede operar en los siguien tes modos:

• Como temporizador.
• Como contador sincrono.
• Como contador asincrono.
El modo de operaci6n se establece mediante el bit TMRICS (TICON<1» . En
modo temporizador, el TIMER1 Sf' incrementa en cada cicio de instrucd6n. En
modo con tad or se incrementa por Danca de subida de la senal externa. Cuando

100
4. las interrupciones Vlos temporizadores

se habilita eJ oscilador interno del TlMER1 mediante el bit TlOSCEN, las patillas
RCIfr10S1 y RCoffiOsomCKI se configuran como entradas ignorando el va lor
de TR1SC<1:0>. El TlMER1 tiene un reset interno que puede ser genefado par el
mooulo CCP. Las interrupciones del TIMERl se controlan a traves de los registros
PIE1 y PIR1.

El tiempo de desbordamiento del TIMER1 sc calcula segun la siguiente ecuaci6n:

T= T CM·Prescaler·(65536 - Carga TMR1)

Donde T CM es el cicio maquina que se puede calcu.lar mediante la ecuacion:

T CM - 4fF osc
EI TIMER2 es un modulo temparizador can las siguientes caracteristicas:
• Temporizaci6n de 8 bits (regis/ro TMR2).
• Registro de periodo de 8 bits (PR2).
• Ambos registros se pueden leer 0 escribir.
• Presc(I/er programable par programa (1:1 , 1:4, 1:16).
• Postallcr programable por programa (1:1 a 1:16).
• Internlpci6n controlada por PR2.
• El mooulo SSP utiliza opcionalmente el TlMERl para generar una seiial de
reloj.
EI TIMER2 tiene un registro de control T2CON (figura 14). El TIMER2 puede ser
habUitado mediante e l bit TMR20N (T2CON<2» para optimizar el consumo de
palencia.

Reglstro T2CON Idirecclon RAM: 12h1[PIC16F87x]

_ TOUTPSl I TOUTPS2 I TOUTPSl I TOUTPSO I TMR20N I T2CKPSl IT2CKPSO


8lt7 81tO

Flg.."a t 4. Registro T2CON

bit 7: No implementado: Se lee como O.

bit 6:3: TOUTPS3:TOUTPSO: Seleccion del valor del pas/scaler del TMRl.
0000 - Postscnler a 1:].
0001 - Postscall'r a 1:2.

101
Compilador C CCS YSimulador PROTEUS para Microcontroladores PIC

1110"" Pastscaler a 1:15.


1111 :< Postscaler a 1:16.
bit 2: TMR20N: Bit de habilitad6n del TMR2:
1 .. TMRl habilitado.
0'"' TMRl parada.

biI1:0: T2CKPSl:T2CKPSO: Selecci6n del valor del prescaler del TMRl.


OO-Prescalera 1:1.
01 - Prescaler a 1:4.
Ix" Presenter a 1:16.
EI T/M£R2 se puede emplear coma base de tiempos para la modulaci6n en ancho
de pulso (PWM) mediante la utilizaci6n del mOdulo CCP. EI TLM£R2 se puede leer
a escribir y es borrada en eI reset. La entrada de relaj (FOSC/4) tiene un prescnler de
1:1. ] :4 a 1:16 seleccionado mediante los bits T2CKPSl:T2CKPSO (f2CON<1:O».
La salida se obtiene a !raves de un postscaler (de 1:1 a 1:16) que permite generar la
interrupci6n cuyo flag se encuentra en TMR2IF, (PIRl<1». Los contadores de pres-
cnler y postscnler son borrados ruanda se escribe en el registro TlMER2, ruando se
escribe en el registro T2CON a en cualquier reset. EJ TlMER2 no se barra euando
se escribe en el T2CON.
EI tiempo de desbordamiento del TIMER2 se caleula segun la siguiente eruaci6n:
T .. T(M·rrrescaler·(Carga TMR2 + 1)·PostscalerJ

Donde TCM es el cido maquina que se puede calcular mediante la ecuad6n:

Ta'l .. 4/Fosc

4.4.1 TIMER1 Y TIMER2 en C


La configuraci6n del m6dulo TMR1 en el compilador de C se realiza a traves de la
fundon;

setup_timer_l (modo);
Donde modo esta definido en el fichero de cabecera (afecta a los bits 5:0 del registro
neON),

TlCON(lOh)

oooooooo
OOh

102
4. Las Interrupciones y los temporizadores

Selup_Timecl(modo); T1CON(10h)

lOODOIOl
Tl_INTERNAL
85h
10000 111
Tl_EXTERNAL
87h

101XXJ011
Tl_EXTERNAL_SYNC
83h
00001000
Tl_CLK_OUT
OSh
OOOOOOOO
TI_DlV_BY_l
OOh
00010000
Tl_D1V _BY_2
10h
00100000
T1_DIV _ BY_4
20h
0011 0000
Tl_ DIV_ BY_B
30h

Los distintos mOOos se pueden agrupar mediante el empleo de sfmbolo I.

La lectura y escritura en el mOdulo TMRl se realiza a traves de las siguientes fun-


clones:
vaJor = get_timerl 0;

set_timerl (valor);
donde valor es un entero de 16 bits.

La configuradon del m6dulo TMR2 en el compilador de C se rea liza con la lun-


cion:
setup_timer_2 (modo,periodo,postscaler);

donde:
• i1t!riodo es un valor entero de 8 bits (0-255) para el registro PR2;
• pastscaler es el valor del postscaler (1 a 16). Afecta a los bits 6:3 del registro
T2CON;y
• modo afecta a los bits 2:0 del registro T2CON.

103
Compilador e ecs y Simulador PROTEUS para Microcontroladores PIC

Setup_Timec2( modo,periodo, postscaJer); T2CON(12h)

T2_DlSABLED OOOOOOOO
ooh
00000100
. Tl_Orv_BY_l
04h

00000101
Tl_Orv_BY_4
05h
000001 10
n~ DIY _BY_16
06h

La lectura y escritura en el mOdulo TMR2 se reauza con la ayuda de las siguientes


funciones:

valor = geUimcr2 0;
set_timer2 (valor);
donde valor es un entero de 8 hits.

Ejemplo 3: Generar IIIla ftmcioll que permUn renliznr retnrdos de 1 segllndo empiealldo 1'1
TIMER1. Componcntes ISIS: PIC16F876.

..
01
~

-
Figura 15. EJemplo 3

Se calcula un periodo parcial de 0.5 segun~os y se repite dos veces:

104
4. Las interrupciones y los temporizadores

0.5 - 4/Fosc'(65536-x)·P
con F0'iC ""- 4 MHz Ypreescaler 1:8,; el TMRl ., 3036.

NOTA

Para observar mejor el periodo conectar el COIlf/fer Timer a CE y ponerlo en


modo TIME (segundos).

#include <16f876 . h>


#fuses XT,NOWDT
luse dpl~y(clock~4000000J

luse Stand3rd_~o (bl

intl Lont-O;

tint_ TIMERl ,1 Interrupci6n TIMERl


void templs(void) " Funci6n

i f (cont--l; output_toggle(PIN_B11; II Cada 2 interrupciones de O.S s


set_timed (3036) ; " reci.lrgi.t del THRl
COnt-- .. ;

mi.tln ()

set_timed (3036) ; // recllrf}a del TMRl


eni.tble_interc upts (INT_TIMERll ; / hi.lbjliti.t interrupci6n tLmerl
enable_in terrupts (qlobi.llJ ,. habiliti.l interrupc16n qenerlll

while(l) ,.

Figura 16. Program.. del ejemplo ~

Tambien se podria realizar sin interrupciones, esperando a que el TMRl se desbor-


dase.
~ inc1ude <16f876 . h>
Ifuses XT,NOWOT
luse dela}' (clock-4000000)
luse st .. ndard_ io (bl

105
Compilador CCCS y Simulador PROTEUS para Microconlroladores PIC

templ.,()

int cont-O;

output_togg1e(PJN_BlJ ..
while (cone<2i II Par.!! cont<lfr 2 V6t;"e" 0 . .5 "eg

set_timerl (3036); II Inic1allzlJ e1 TMRl


while (get_timerl(»-3036) .. II Esper.!! a que S6 de-sborde (0.5 $)

cont++;

m.!!in ()

while(l} (
templs(); II t1am"d" " 1" funci6n de ~emporizllci<'ln

Figur;t 17. Progr;trrull del ejemplo 3 sin Interrupcionel

EjempJo 4: Medir el allclro de 1111 pulso mediante el TIM£Rl y ltl interfllpci6" extema por
RBO (figura 18). Compo/lentes 1515: PIC16F876!1 LM016L. Ills/mlllelltos: OSCILLOS-
COPE Y Gelleradores: PULSE.

LC02

!Pulsoc 182.8uS

Fig\lr.. 18. EJempio 4

106
4. las interrupclones y los temporizadores

Al medir el ancho de un pulso se necesita detectar su flanco de subida y despues


su flanco de bajada. Eslo se puede realizar mediante la interrupci6n RBO ya que
permite configurar el flanco de disparo.
Al produdrse una interrupci6n, porejemplo en el flanco de subida, se puede inicia-
lizar el valor del temporizador (TIMER1) en ese momento; se cambia la activaci6n
de la interrupci6n del RBO a flanco de bajada y ruanda sc vuelva a producir la si-
gujente interrupcion por dicho flanco se guarda el valor del temporizador.

El ancho de pulso sera la diferencia entre el valor del TIMERl en el flallco de subida
y el flanco de bajada. EI ancho de pulso maximo para una frecuencia de 4 MHz (ci-
do maquina de 1 ~IS) es de 65,536 ms (un cicio del TIMER1). EI minima dependera
del tiempo que tarda un programa en gestionar la interrupci6n y los calculos. En el
ejemplo se puede conseguir medir anchos de pulso de entre 64,934 ms y 69 fls.

Modificar el fichero LCD.C paTa que se visualice a traves del puerto C.


linclude <16f876.h>
Ifuses XT,NOWDT
IU8e cIelay(clock-4000000j
#include <lcd.c>

Int16 TfB; /1 Tiempo llaneo de bBjada


float AP ; /1 ValoI final del alleho de pulsD
intl lluevopulso"O; II ElltIa OtIO pulso
intl cambio-O ; II Cambia de !laneo de dispaIO

lillt_ ext
void fUllcion_ext_int (} ( (I Funci6n Intereupci6n
if(cambio-O) ( /1 Flanco de Subida
set_ timed (0); II 1lliciali~a TMRl
ext_int_edge(O,H_TO_L) ; II COllfigueae paed flllllCO ba)ada
cambio-1; II COllteol de cambio de flalleo
else ( II Flanco de Bajadoil
TFB-get_ timed (J ; II Valoe del TIMERl paca el fianco de boiljada
ext_int_edge (0 , L_TO_H) ; II ConfiguIae paea llaneo sUbida
cambio-a; II Conteol de cambia de floilnco
if(nuevopulso--OJ ( II Fin de pulso ...
Iluevopulso-l; II Pulso a calculae

void main ()
led_illit(};

107
Compilador C CCS YSimulador PROTEUS para Microcontroladores PIC

stJwp_timec_l (Tl_INTERNAL Conflguraci6n TIMERl


ext_ in t _ edge (0 , L_ TO_ H) .. /,' Configurar para fiance subida
cambie • 0; 1/ Control de cambia de flallco
enable_ interrupts (int _ ext) .. / Habilitac16n interrupci6n RaO
enable_ ..i nterrupt s('llebal) ; Habili racion general
do I
if'(nuevepulso--lj ( I, ,Pulso nuevo?
AP .. TFB ~ 1.0 ; i l Al1che de pulse en microsegundos de TlMERl..
II ... 4MHZ e1 T .. 1ps'Timerl
princf'(lcdyucc, "lnPulso - 16 . 1Eu$ ", AP) ; II Vi:rualil:a medida
I en LCD

nuevopulso-O ; 1/ Pulso medido

J while (TRUE) i Bucle lnfinltO

Flgur.. 19. Progr.ilm.il del Ejemplo 4

El generador PULSE se utiliza para crear ta seiial de entrada. Con el bot6n derecho
se pueden editar sus caracteristicas (figura 20).

Ejemplo 5: Generar I/lla sellal ClIadrada de 1 KHz IItilizalldo la il/terrl/pda" del TlMER2
(figura 21). Compo"entes ISIS: PIC16F876 e lnsfrllmelltos 1515: OSCILLOSCOPE y
COUNTER TIMER.

108
4. las interrupclones y los temporizadores

Para generar lIna senal de 1 Khz se necesita un semiperiodo de 500 ).1s, segUn la
ccuacion del desbordamiento del TIMER1, utilizando un cristal de 4 MHz, un pre·
eSClller de 4 y un postscaler de 1:
T - TQ>i·[Prescaler·(Carga TMR2+1)·Postscaler)

500 ~,~ (4/4000000H4'(X+l)'1]

donde X" 125; es dedr, se debe cargar el TIMER2 con el valor 125. Pero esta relaci6n
5010 se cumple si se trabaja en ensamblador. AI trabajar en C, el compilador genera
Ilneas de c6digo que aumentan el tiempo d e ejecuci6n del programa y, por ello, es
necesario ajustar el valor final. En este caso se ha utilizado un valor de carga de 11.

.. ---
--
,
-- - ---
. ~.--
nil
-~
..
~
-.
-~

_
...
,,
~iO/I~l

'M
....,..".,
~RI' ~_"t
.""
~A:lJM'J/'J!IIu. ..'"D
~.T
~.
PIMINMT RCOI1IOSOITIOCI
ftCV!10M U'"
RC2J<:Crl
lIQIIel/lJc:~
ftC4'i",,"~"
~~~D

-~.
ftCT"'-M)l

-------
Figura 2' , Ejemplo 5

IINCLUDE <16F876 . h>


luse Qalay(clock-4000000)
#fuses XT,NOPiDT
#use st .. "dard_!o(B)

#int_TIMER2
void TlMER2_isr{voia) ,
oucput_TOGGLE(PIN_BO) ; 1/ para semiperiodo alto
sec_tlmer2 (11); II se tecarga el TlMERO

109
Compilador CCCS YSimulador PROTEUS para Microcontroladores PIC

void l/IlJin (J f
setup_timer_2rT2_DIV_BY_ 4, 124,l) ; 1/ configurltcion TIMER2
enltble_in t errupts (INT_TlMER2),' // hltbilite in t errupciOn TIMERO
enable_ interrupts(globltl},' /. hltbllitlt interrupCi6n general

while (1); /, bucle infinito

Figura 22. Program" del ejemplo 5

Figura ZJ. Senal de , KHz

Ejemplo 6: lntrodllcir los datos, a traves del tec/ado, de la velocidad de WI motor de co-
rriente cOtlfimlfl y generar IIna seiia/ lIIodulada err 1111 anclw de pl//so proporciolla/ a/ data de
veIocidad. Contra/ar Ia velocidad ell rpm y viSllulizaria ell 1m LCD (Figura 24). COlllpollell-
tes
ISIS; PIC18F876, KEYPAD-PHONE, RES, 2SK1058, CELL, LM016L Y MOTOR -
ENCODER.

Funciona igual que el ejemplo 6 del tema de los puertos, pero ahara se Ie anadc un
eantadar de pulsos controlado por el TIMERO. Los pulsos pmceden de un e/lcoder
que suministra el modele del MOTOR-ENCODER. Este modelo permite obtener
tres tipos de salidas: Ql, Q2 e lOX.

Q1 Y Q2 permiten controlar el sentido de giro y la posicion angular del motor (se


configuran en la opci6n PULSES PER REVOLUTION del menu de edici6n del rna-.
tor). La senal rox suministra un pulso por revolucion y es la que se usara para medir
la velocidad del motor en este ejemplo; aJ suministrar un puJso por revoluci6n se
pueden eon tar los pulsos por minuto mediante el TMRO y visualizarlos en el LCD.

110
4. Las interrupciones y los temporiladores

"'• 123
• 5 •
7 8 •

J~==-~ . * 0 #

Figura 24. Ejemplo 6

Se puede utilizar el puerto B conjuntamente para el LCD y el teciado, pero se ha


preferido utilizar el puerto C para el LCD (esto supone modificar el fichero LCD.C
para que en lugar de utilizar el puerto DoE utilice el q, figura 25.

1'---------'---=---=====""~.;;••
;;;.'elecCI6N'
I _.,...rto
. . t"" ~ 1~"_Jl ..._-P
IIOOL!:UI nabl.
~!:UI ta
I'OOl.U" n
IOOI.EIJI
.~ t
""""*<I
<Ioou
.~

., de"_ pel!
•• de ....... u;.,_';t.b_ lcd
." '.'

.' ,:
I' ", ie"
fIbyt. led • IlKFU
.U "ofi""d l&54I_portb_ IO'<!
<by led

I
-. . . . . . ..,..Ied. 7 lion to porte (.(..:Idr... 7)

,"'c"~~c:_'"::c'~--"._-".:c:,:'":""o"":--"O"'-"'''"'"'~'_1-;,.IIdefI
~._....~_~~:::~.,..~~).~Irlo;..,.<:I.'~
f., ... , _ _ ~ tru led"
n t t< •• " . 'f
"
Figura 25. Flchero LCD.C it modlflc:ar

111
Compilador C CCS Y Simulador PROTEUS para Microcontroladores PIC

EI programa se basa en producir tma interrupci6n del TIM ERO cada 0.5 segundos y
leer el TIMERO que se utiliza como contador de pulsos extemos. La lectura se debe
multiplicar por 2 (preescaler minimo del TMRO) y por 120 (puesto que a1 ser revolu-
clones por minuto, Sl se mide cada 0.5 segundos se necesitara multiplicar por este
factor). La carga del TMRl con un preescaler de 8 es de 3036.
'include <lpr876.h>
'(uses XT,NOWDT,NOPROT~CT,NOLVP

IUSE DELAY (CLOCK-4000000)


'INCLUD~ <kbd . C>
'include <lcd.c>
IUSE STANDARD_IO (8)
int16 counter-D;

/ •• ~ •••••••••••• INT TIMERl .... • ••• • .. ••••••••••


lint TIMERl
void TIMERl lsr(void)
COil" ter-qet_ timecO () .. 1/ Lectura cont/ldor TMRO
counte r -collnter '2'120; r Conversi6n a rpm
printf(lCdyUtc, ",611J rpm",colJnter!,
1cd_gotoxy(1,1} ..
set_timecD(D} ,. 'I Reinicill ClJentll

set_timerl (JD36); II Recllrg<J a 0 . 5 s

II " '" •••••••••••••••.•••••••••••••••• •• •••••••


VOID MAIN(}

CHAR K,kllnt-'O';
Char PWMH-O,PWML-O,
lcd_ init II;
kbd_init ();
PORT_B_PULLUPS (TRUE! ,

setup timer O(rtcc ext_l_to_hlRTCC_DIV_2); II ConfiglJr"ci6., TMRO


setlJp_timer_l (Tl_internall Tl_DIV_BY_8) , 1/ Configucaci6n TMRl
~et_t1merO (0); /1 Eoccado contador
set_ timed (3036) ; 1/ Carga a 0 . 5 s
enable_interrupts (int_ timerl) ..
enable_in t errllpts(qlobal!; II Habilic.!ci6n de intercIJpciones

WHILE (11 {
k-klX1_qetc
i f (k-'\O') k-kant;

11 Z
4. las inlerrupciones y los lemporizadores

i! (fk- '-' ) ( k .... · "}) X- ' O';


kant-k;
k~k -48 .­

PM·fH- k · 28 .-
PWML- 255-f'WM}/ ;
f or(nt'MJI ; PWMH:>O ; PWMH--) (
OUTPUT_ HIGJf(PIN_AO) i }
for(PWNL ; PWML>O ; PWML -- ) f
OU TPUT_LOW/PIN_AD} ;)

Figura 26. Progro;tma del ejemplo 6

Figurit27. Seniti moduli'! y salida del encoder

Ejemplo 7: Segl.n la dllracio" de pulsacion de WI baton obteller Ires fipos de fimeiol1es:


Ima pulsacion corIa da II/gar a lI11a fimcitm (por ejemplo encellder 1m led 1"/1 eI pllfrlo A),
IIl1a primera pulsacion mayor de fres segllndos da Illgar a aIm fimcioll (por ejelflp/o elleen-
der lin led en eI puerlo C) y IIl1a segl/nda pilisacio/llllayor de Ires seglmdos de II/gar a afm
fimci611 (por ejemplo apagar died del puerto 0. Cua"do se trabaje CO" la seglmda 0 fereern
f'lllcioll 110 se atenderrin las pli/saciolles cortas (figura 28). Compo"elltes ISIS: PIC18F877,
BUTTON, R£S, LED-RED, LED-BLUE.
En este ejemplo se uti liza una tecnica de pol/ing (comprobad6n continua) del esta-
do del pulsador pero empleando la interrupdon del TIMERO; de esta forma no se
tendnl al programa principal parado comprobando el estado del pulsador.

113
Compilador CCCS YSimulador PROTEUS para Microconlroladores PIC
-----

-
'" ., '"_.- .---.
I -- ...-=,
-~
.".....
~

*--
~
.
~! 4~ ~i M_~

-
_Id
,,,,,,,, '
-"*""'""..,
""'~.-
~

~
_: ."
.
,
7
~.
~.
":4~
." . . .-
~,


-
*

,
-----
~
~,-
~

I
*
-7
~
'" 7

Figur. 28. Ejemplo 7

Se programa el T/MERO para que p rovoque una interrupti6n cada determinado


tiempo. en este caso de 20 ms. Cada vez que se produzca la interruption se com-
prueba si el bot6n ha sido pulsado. En el caso de que haya sido pulsado se com-
prucba si es una pulsacion corta 0 mayor de 3 segundos. Para este ultimo caso
se comprueba si el boton esta pulsado durante 150 interrupciones del TIMERO
(3s/20ms = 150),

Si el bot6n no ha side pulsado se designa como FUllci611_D 6 '" 0, si ha side pulsado


una vez durante mas de 3 segwldos se designa como FUllcioll_D6 = 1. si ha sido
pulsado momentaneamente se designa como Frmcioll_D6 = 2 Y si ha sido p ulsado
durante mas de 3 segundos por segund a vez se designa como FUllci611_D6 = 3.
Para d isti ngui r si se ha pulsado durante mas de 3 segundos una a dos veces se uti-
Iiza una variable de control (que se Ilamara CON_D6) que puede valer cera 0 uno,
dependiendo de si es la primera vez 0 la segunda vez que se pulsa.
Para controlar el tiempo que esti el bot6n pulsado se utiliza una variable (06) que se ira
incrementando si el bat6n esta pulsado y se produce una interrupci6n del TMRO.
'INCLUDE <16F811.h>
Idevice adc-lO
luse delay (clock "4000000/
'fuses XT,NOWDT,NOPUT,NOPROTECT,NOBROWNOUT,NOLVP,NOCPD,NOWRT,NODEBUG
#USE FAST_Ie (B)

'BYTE TRISA • Ox8S


'BYTE PORTA - OxOS

114
4. Las interrupciones y los temporizadores

'BYTE T1USC 0,,87


'BYT~ PORTC 0,,07
'B),T~ TEUSD - Ox88
'BYTE PORTD - 0,,08
IBYTE TIMERO .. C"OI
I BIT RA5 - Ox05.5
IBIT lK2 .. Ox07 . 2

CHAR D6 , FUNCION.D6,CON_D6 ;
rNTl CNT:

/, •••• • , • • • • •• • INTERRUPCION TIMERO · · · · · · · · · · · · · · · ····· ·· ·


'lnt_TlMERO
void TlMERO_.isclvoidJ /
IF (INPUT/PIN_D6}-·0) ' / 5i IflIt.!! pul.,.4do
IF (06 >- ISO } { //Det~etll 81 J 8 (20m.,. x 150)
IF (CON__ D6-·0} ( " PultJlldo I' v~z 3 $

06-0;
roNCION_D6-1:

ELSE I
06-0 :
FUHCION_D6-3 :
CON. D6-0: I

ELSE /
if (06)0 U funcJ.on_06 .... 1) 06-0 ;
' / 3 $e9 ba r ril cont.!!dor
IF (Do > H FUNCWN_D6 !-1 " ruNe10N_ Oo .'-3 J /1 Si pUl$.!!do .!!nt~$ .•

fVNCION_06-2: I Y NO 1"-1 Y NO F-3 ..


06-0:/ /1 entonC~$ F-2

'/ '" ••••••••• • • , • •• •• • • • .. · PR1NCIPAL· · • • ••• • • • •••••••••••••••••••••••••

vnid IIIltjn() (

di$.!!ble_int~rrupu (GLOBAL);
.,.&tup_timec_O (RtcC_INTERNALI RTCC DIV_128J;
06-0 : FUNCION_D6-0: CON_D6_0 ; 1 Lllltpill contlldoces teelll
TRISA .. oxOO; //00000000
TRISC .. OXOO ; 1/00000000

115
Compilador CCCS YSimuJador PROTEUS para Microcontroladores PIC

TRISD ~ OX40.- 11000000


BIT~CLEAR{PORTA,5) .-
BIT~CLEAR{PORTC,2} ..
en",ble~illterrUpts {GLOBAL} ..
, TIMERO-20ms r:ie polli.ng.- 20ms"(256-100}'1 j,ls'128

WHILE OJ{
IF (Fr,JNC!ON_D6--l} RC2 - 1; t. Si ~uncion 1 enciende He2
IF (roNcroN~Dfi--3) Si ~unc1dn 3 dpdga RC2 •• ".
RC2-0; /, F:spera un tiempo para no provocar una ~unc.i6n 2
DELAY_MS(400); I. no desead", .
FUNCION_D6-0;} / Vuelve d funcion 0
IF (FUNCION_D6--2) ( " Si tuncion 2, un" vez encJ.ende led ..
CNT+~ ; 'I seguncM ve% 10 apaga, asi C'ontinuamente
IF ICNT-O) RA5-1;
ELSE RA5-0;
FUNCION_ D6-0; 1 Vuelve a tunclon 0
J

J
Figura 29. Programa del ejemplo 7

116
5. Convertidor Analogico - Digital

Capitulo 5

Convertidor Analogico - Digital


5.1 Introduccion
Los microoontroladores PIC pueden incorporar un mOdulo de conversion de senal
anal6gica a senal digital. Los mOdulos AD que utiliza Microchip haecn un muestreo y
retencion (sample & hold) can un condensador y despues utiliza el m6dulo de conver-
si6n (figura I). El m6dula de conversi6n AID es del tipo de aproximaciones sucesivas.

;~~~g~A ,V
-f'>-rJ.--.{'-c- "" ';,~ I.__-,I
VJ1L. I ,"D SALIDA
DIGITAL

SiH

Figura t. FiilSes de liiI converJi6n a"iill6gicajdigitiill


EI convertidor de aproximaciones sucesivas se utiliza en aplicaciones donde se ne-
cesitan altas velocidades de conversion. Se basa en rea lizar sucesivas comparacio-
nes de forma ascendente a descendente hasla encontrar un valor digital que iguaJe
la tension entregada por el conversor D/A y la tension de entrada.

Durante la lase de muestro el interruptor se cierra y el condensador se carga a


la tensi6n de entrada (el tiempo que el interruptor permanece cerrado es funda-
mental para la correcta carga del condensador). Una vez abierlo el interruptor, el
condensador mantendra (te6ricamente) la tensi6n de entrada mientras el modulo
AID realiza Ja conversion.
El mOdulo de conversion se caracteriza por parametros como los siguientes:
• Rango de entrada.

117
Compilador CCCS YSimulador PROTEUS para Microconlroladores PIC

• Numero de bits.
• Resolud6n.
• Tension de fondo de escala.
• Tiempo de conversion.
• Error de conversion.
EI mOdulo que utilizan los PIC de garna media tiene un numero de bi ts de 10, por
10 que su resolution es:

resolucion = ~
2N _ I

s iendo VN la tension de entrada y N el numero de bits del convertidor. Es door, para


la tension maxima de e ntrada (5V) la resolution es de 0,0048 V (4,8 mV) por LSB.

La resoludon sl cambia si se modifica la tension de fonda de escala, es derir, la ten·


si6n de referenda. Los PICs permiten cambiar la tension de referenda en un valor
absoluto (de 0 a +V ref) 0 en un margen (de -vm a +V",,).

Las tensiones a convertir siempre son positivas.

5.2 Modulo Convertidor (gama medial


EI modulo convertidor AID en la gama media posee hasta 8 entradas anal6gicas.
Los 16F876/873 tienen 5 canales (en el puerto A) y los 16F877/874 lienen 8 canales (5
en el puerto A y 3 en el puerto E). EI convertidor (figura 2) es de 10 bits y, tal como
se ha comentado, es de aproximadones sucesivas. Permite variar la tension de refe-
renda a la maxima V00 0 a una tension positiva menor a traves de AN3NREF' Y a la
minima VS5 a a una tension positiva mayor a traves de AN2N REJ'..'

Yin ~Ck Ci«::uito de


AproximacioQes
'- / Sucesivas

Date digital

Moduro D/A

Figura 2 , BloqultJ boiJlcOJ de un convltrtldor AID de aproJllmaciones JucltJlv;1J

Puede seguir fundonando cuando el PIC csta en modo SLEEP ya que d ispone de
un oscilador RC intemo propio.

118
_________________-=5:..-C
::.:o::.:"::.:
,,:::.::
rtidor Analoglco - Digital

"~
.LJ .
."
--
D-
.- ".
... o "v...
••
I ...............
- ...
0--
O-
r ... ~-
S:: 1IAlI_
..
.... E --
u_
eM

j',.,......
." , '- .,
1-001 !
- " ' , .. --'!""'"'-.• ~
ClrcuJlo
-
'_0

..... -".-
. ; ~) AID
'-
, .... ,OJ'.

- ....
'_
' .. _;!O J_ .. I
:--

FI9uril ~. Arqu lle«ura del m6du'o con~rtidor AID

La fundon de transferencia del convertidor AID es el resultado de que 1a prirnera


transicion ocurra cuanda la tensi6n anaJ6gica de entrada es igual a V RE/1024.

La resoluci6n vendra dada por la siguiente ecuacion:


ILSB -:: V _ + (VRf5. -vRI'P.
RLP- 1024
En e l caso de que 1a VRD4 ~ VDO Y VREF. '" VS5 entonces Ja resoluci6n es:

5
lLSB=---=,4,8mV
1024

de esta forma si 1a lectura es de 512 LSB, la tensi6n anal6gica leida es:


5
VI'" =512·---=512.4,8mV=2.4576V
1024

5.2.1 Registros FSR


Hay 11 registros asociadas a este periferico:
• Definici6n de pines de entrada y senales aplicadas:
TRISA - PORTA - TRISE - PORTE .
• Manejo de in terrupciones:
INTeON - PIEl - PLR1.

119
Compilador C CCS YSimulador PROTEUS para Microcontroladores PIC

• Control del conversor AID:


ADCONO - ADCONl- ADRESH - ADRESL.

Reglstro de control ADCONO tdlrecclon RAM: 1FhJ [PIC16F87x]

FlglI,,, 4. Registro "DCONO

bits 7:6 DCSl:ADCSO: Bits de seJeccion del reloj para la conversi6n AID.
00 • F""',.
01 • F"",8.
10 - F"",32.
11 - FRC (Reloj del oscilador interno RC).
bits 5:3 CHS2:CHSO: Bits de seleccion del canal.
000 - Canal 0, (RAO/ANO).
am = Canal 1, (RAl/ANl ).
OlD-Canal 2, (RA2/AN2).
all - Canal 3, (RA3/AN3).
100 = Cana\4, (RA4/AN4).
101 = Canal 5, (RA5/AN5).
110 =- Canal 6, (RA6/AN6).
11] = Canal 7, (RA7/AN7).
bit 2 GOI DONE: Bits de estado de la conversion.
SiADCQN .. l
1 - Conversi6n en progreso (a 1 inida una conversi6n).
0 .. La conversi6n ha finalizado (este bit es borrado par hardware
al terminar la conversion)
bit 1 No usado: valor o.
bit 0 ADCON: Activaci6n del conversor AID.
1 "" convertidor activo.
0" convertidor no activo.

120
5, Convertidor Anltl6gico - DiIibI

Reglstro de control ADCONl (dlre"l"n RAM: 9Fhf [PIC16F87x]

Figura S. Reglstro ADCON I

bit 7: AOFM: Seleccion de formato del resultado (figura 6):


1 ,.. Justificaci6n a derechas, Los 6 bits mas significativos de
ADRESH son leidos como '0'.
o.. Justificaci6n a izquierdas. Los 6 bits menos significativos de
ADRESL son leidos como '0'.
bit 6-4: No usado: valor 0
bit 3·0: PCFG3:PCFGO: Configuraci6n de las entradas al modulo AID (Figura 7).

ADFM:O

, 2 10 7 , , 076$ ,
000000

ADRESH ADRESL ADRESH !


I """ I
ADRESL
r··············,: ................. ,
: R. ..,lta<io 10 bit : R.. .,lt~ 10 bit :

Justlficaclon a derechas JUlltificacl6n a Izquierda$

Figura 6. Justlficad6n mediante bit ADFM

:;; I:;~ :;: I::: I :~ I ~ :::: I::: I '.,. " ...


~
I::g~

W;, ~
,
,
, ,
, ,

i ,, , ,

,
Figurill 7. Tablill de configuration de los canales

121
Compilador CCCS y Simulador PROTEUS para Microcontroladores PIC

En las versiones PIC17F87xA existen unas pequei'ias variaciones en estos dos re-
gistros.
En el registro AOCONO (direcci6n RAM:1Fh) [PIC16F87xA] los bits:
bit 7-6: ADCSl:AOCSO: Seleccion del reloj para la conversion AID junto con
ADCS2 que esta en ADCONI.

AOCS2:o(} 00 '" fOSC/2 01 -= rose/s 10,. fOSCl32 II .. fRC

A.OCS2"' 1 00 "" fOSC/4 0\ " fOSClI6 IO - IOSCl64 II - me

En el registro ADCONI (direcci6n RAM: 9Fh) [PIC16F87xAl el bit:


bit 6: ADCS2: Selecci6n de reloj para conversion AID junto con ADCSl y
ADCSO.
Otros registros que afectan al mOdulo convertidor son los referentes a la interrup-
d6n: INTCON, PrEI Y PIR1.

5.2.2 Proceso de conversion


Para realizar la conversion, el fabricante recomienda seguir los siguientes pasos:
1. Configurar el mOdulo AID:
a. Configuraci6n de pines anal6gicos/tensi6n de relerencia/E/S digitales
(ADCONl).
b. Selecci6n de la entrada AID (ADCONO).
c. Selecci6n de reloj para la conversion AID (ADCONO).
d. Habilitar m6dulo AID (ADON (ADCONO<O»
2. Configurar las interrupciones (si se desea):
a. ADIF-=O;
b. GIE - PEIE - ADlE-1.
3. Esperar el tiempo de adquisici6n.
4. Comenzar la conversion poniendo a ' 1' el bit GOIDON£(ADCON0<.2».

5. Esperar a que termine la conversion. Puede ser de dos formas:


a. Mediante lectura continua del bit GOIDONE hasta que sea ' 0', indicando el fin
de la conversi6n.
b. Esperando ala interrupcion.
6. Leer rei egistro de conversi6n ADRES y borrar enflag ADlF si es necesario.

122
5. Convertldor Analogico - Digital

7. Para la siguiente conversion se salta a los puntos 1. 2 0 3 en funcion de 10 que se


necesite. EI tiempo de conversi6n par bit se define como T"o' Un minimo de 2'T"o
son necesarios antes de la conversi6n (esto no es necesario para los PIC16F87xA de-
bido a que el interruptor de muestreo se derra en coanto se obtiene el resultado).
Existen dos tiempos basicos de trabajo: el tiempo de adquisici6n (T"co) y el tiempo
de conversi6n TAD'

• Tiempo d e adq uisici6n (T"cJ: tiempo necesario para que se cargue el con-
densador de retencion (~con la tension de entrada. Este proceso de carga
del condensador depende de distintos fadores, entre otros, la impedancia de
ILl fuente de tension de entrada (el fabricante recomienda que se situe por de-
bajo de los 10 kohm).
EI tiempo de adquisicion dentro de los margenes tipicos es de, aproximada-
mente, 20 1-15.
La adqujsicion no comienza hasta que no acabe la conversion. Asf que se debe
espera un TACQ tras una conversi6n, tras seleccionar un nuevo canal 0 tras en-
cender el mOdulo AD .
• Tiempo de conversi6n (TAD): tiempo necesario para obtener el valor digital de
la tensi6n anal6gica de entrada. Este tiempo depende de Ia fuente de reloj que
se seleccione para la conversion. Para una correcta conversion AID, el reloj
debe seleccionarse para asegurar un tiempo minimo T"o de 1,6 fls. En la Figura
8 se muestra la tabla de seleccion de fuentes de reloj con su T AO asociado, las
celdas sombreadas son las que no se recomienda su uso.
}' uenle de relo Frecuencl.l del dis osilivD
Opera tio n ADCSI ;ADCSO 20 Mllz 5 MHz 1.25 r-rnz 333.33 kHz
2T_ 00 lOOns\ 400n5 1.6, 6 ,
400 nsw 1.6 jlS 6.4 jlS 24 jlSV)
8T
32T"",
01
10 1.6, 6.' , 25.6 , 98 ,
RC II 2-6 J.lS 2·6 ItS 2·6 IlS 2-6 j.ls\I/

Figura 8 . Tabla de selecdon de fuentes de retoj

Las notas de la figura B indican:


(1): La fuente RC tiene un T AO tipico de 4 ~s.

(2): Estos valores violan el minimo tiempo requerido de T AD'


(3): Para conversiones mas riipidas se recomienda utilizar otra fuente de reloj.
(4): En PICs con frecuencias superiores a 1 MHz, el modo RC 5010 es recomen-
dable en modo SLEEP.
EI T"D se configura en ADCONO (refoj de fa conversi6n).
TA o--2·TOSC TAil -S' TOSe TAl)· 32 ·TOSC

123
Compilador C CCS Y Simulador PROTEUS para Microcontroladores PIC

Tambien en el PIC16F87xA.
I Top'"-4-TOSC I TAP 16· TQSC I TAD 64·TQSC I
Para convertir 10 hits se requiere un tiempo de 12T,\o (figura 9).

,.. - - - - .,- - - - r- - - -., - - - -,- - - - r- - - -,- - - - T - - - , - - - -,.. - - - T - - - - r- - - --


, 1 , , , 1 , , , , , , :
.... !..... , ' , , • , , , , , , ,
TH lo T~Cln.cl 'T~c2' T;=':l3' T..;.04' 1 .<1.:>5' TIo.:>6 • T.<I.D7 , r"oil' T,:.c9' T"c1OfT);'::1"
j b9 b8 b7 b6 b5 b.1 1>3 b2 01 bO

r tNtCIO CONVERSI6N

r El CONOEHSAOOR VA CARGAOO SE OESCOHECTA DE LA FUENTE ANAL6GICA


(TlPICAMEHTE A lOS 100n.)

I GOIDONE • 1 I ..
SE CARGA AORES
EL BIT GOli5ONE SE PONE A 0
SE ACTlVA El FLAG AOIF
EL CONOESAOOR SE CONTECTA DE NUEVO A LA FUENTE ANAL6GICA

Figura 9. Clclos de convenl6n

Considerando los dos tiempos (de adquisici6n y de con versi6n) la secuencia com-
pleta de muestreo/ retenci6n y adquisicion en los PICs de gama media Sf" muestra
en la figura 10. Exis te una di(erencia entre los PIC1 6F87X y los PIC16F87XA; en los
primeros es necesario es perar un tiempo 2·TAD antes de inid ar una nueva adquisi-
cion, cosa que no ocurre en los segundos.

r _ _ <M .clquloid6n TOompo .. """....... i cH. En I...


OUt ...","", lietnpo -' c-.., EI (;-., ......,oneeu de .. _"."". P'c.'&Flh
_".".,.:.tYadoto.. .. . 'c. ... CH -'
'-_"~.~'~""."M."''''''~''''"_'''''-_I-, ________-l _s._
IotIl00n. "GQoo' .
· 2.f..,

Fin de> (;on ..... iOn GOII)()NEa9


s.t.cciOn c..n.I (ADCOHO)
HablIIIad6n mddulo AD (AtlCOtfO) V. ....... ADfIES.
Ink:k> de -.lqulalc:iOn S. .c:U•• fI-v ADlF

Figura 10. TIempo de muestro y conveul6n

5.2.3 Efecto del modo SLEEP y RESET en el modulo AD


En el modo dormido (sleep), el mOdulo AD puede funcionar si se selccciona como
reloj para la conversion el RC interno (ADCS1= 1 Y ADCSO = 1). En es te caso, el
mOdulo espera 1 cicIo de instrucci6n antes de iniciar la conversi6n, permitiendo la
ejecucion de la siguiente instruccion SLEEP, eliminando as! todo posible rujdo de

124
5. Convertldor Anal6gico - Digital

conmutadon durante la conversion. Al finalizar I~ conversion, el bit GO/DONE


es puesto a "0" y el resuJtado se carga en los registros ADRESH y ADRESL. En el
caso de que 1a interrupcion del modulo AD este habilitada (ADIE '" 1 Y PEI E:: 1) el
dispositivo se despierta, pero en el caso de no estar habilitada, el mooulo se apaga
aunque el bit ADON siga a " 1".

En el caso de que la fuente de reloj no es la RC interna, la ejecuci6n de una instruc-


cion SLEEP haee que la conversion que se este realizando se pare y que el mooulo
se apague aunque el bit ADON siga a "1".
En el caso de produdrse un RESET, los registros del m6dulo AD se inicializan a los
va[ores indicados par el fabricante. EI efeeto del RESET es el apagado del m6du lo
y la parada instantanea de la conversion actual, los terminales se reinidalizan a
entradas anaJ6gicas (ADCONI parte baja a 0); el valor de ADRESX no se modifiea
en el caso de un Reset pero en el caso de un Power-oll Reset es desconocido.

5.3 Modulo AD en C
En el compilador C las funciones para manejar el oonvertidor AD son las siguientes:
setup_adc (modo);
modo: para la configuraci6n del m6dulo com'ersor AJD oorrespondientes a los bits
7:6 del ADCONO.

Selu p_"dr(modo); ADCON6(IFh)


OOOOOOOO
ADC_OFF
OOh
11000000
ADC_CLOCK_r"'TERNAL
co.
-.0000
ADC_CLOCK_I>1"_2
OOh
AOC~CLOCK_DIV~8
01,.,.,.
'0.
10000000
ADC_CU>CK_D P" _J2
80h

setup_adc_ports (valor);
Valor: definicion de las entradas analogicas correspondiente a los bits 3-0 del
ADCONJ (figura 11).
set_adc_channel (canal);
callal: selecci6n del canal anal6gico correspondiente a los bits 5:3 de ADCQNO.
o(ANO) 1 (ANI) 2 (AN2) J (AN3)

4 (AN4) S (ANS) 6 (AN6) 7 (AN7)

125
Compilador CCCS YSimulador PROTEUS para Microcontroladores PIC

pc.-r.J
'"
ou
<'.
RJ:.
A~5
'u
A'\"~ A'O .~ "10"
M.
. ~.
selup_adc...p0rtJi (valor);

-
~~ ~ ~ M'
, , , , , , ,'" , ..U.-,""N"UX;

~, , , , , .
' ,-- , , , .. ~'_A~"_ A"l_A~4_A ~~_ A " . A'i?_ vss_\ lu:r ,
, , , , , ....._A..'CA.~l .. >ll_"-':'
M"
" " 0

, ". -,. , ,
...
M" " " "
"
,
" " " '_. " ,
,
,
,
,
",-':0_""" _"~l_".~_"55_'

....,,_"I>'_..-.:l
""...- '''_''li'_'-KH
KEr

till

l UX
" " " " " l'Io-,""~"1.I.I'GS

,. ," ", ," ," " " ,"


' •.. 'm. ," ........ "1 ,s. MiS--"",_,,"'_' -MF.f_VMU'

'M ' 0 0 , , , , , , "''''-'"",' ' _Al'1_"10-,"":o.._"-'5


1010 , , ., ,. .. , , , "SIl_....' I_",~l-,"" ~._" '5_' SS_' ME~
," , , ,
,
1011

, ", , , '_. '- , , ~'<'O_"M_" .~4_""-5_' K.:t·_, MEr

". ' .... ' _. "-,""NA1.OG_kAJ_1lA1_klf

1111 , , , ' . ,. '- , ,, .. ..-. ,,-.:, VRff,IIIEf


", , , .~ I
lilt

, " , '_.
0
" " ,
'"I " " ...... " "M_, 'Rt;r_ "R~r

Figura 11. Poslble valores de setup_adc...,portfvalorl

valor = read_adc 0;
Lectura del resultado donde valor es un entero de 16 bits 5egUn la directiva ~DEVI­
CE AVC- empleada. Dicha directiva trabaja segun la tabla:

DEVlCE 8 bit IObil II bi! 16 bil

ADC=8 OO-FF OO-FF OO-FF OO-FF

ADC= IO , 0-3FF , ,
AOC-II , , 0-7FF ,
ADC"'- 16 O-FFOO O-FFCO O--FFEO O-FFFF

Porejemplo, _el Fichera 16f876.h incluye como primera directiva Itdevice PIC16F876. Para
incluir la informacion del tipo de conversor AID se debe anadir #device adc::: to.

READ_ADO) admite tres modos de funcionamiento:


Si no sc indica nada cs la opci6n por defttto.
Pennilc iniciar v leer el Convertidor.
ADC START ONLY S610 inicia Is convcrsi6n.
ADC READ ONLY SOlo lee los re iSlros del conve"ido~.

126
5. Convertidor Anal6gico - Digital

Ejemplo 1: Lectura de IIrIa tension Q/wl6gica par e1 carlal AND (ftgllra 12). COII/PO"Clltes
ISIS: PIC16F876, POT-LIN, CELL Y LMOI6L.

,..",

flgur~ 12. EJemplo 1


hnclude <16FS76.h>
Idevice adc-10

IFUSES XT,NOWDT
IFUSES
luse delay(clock-4000DODI
linclude <LCD.C>

void main II
int16 q;
no~t p;

setup_adc_ p<u:ts (ANDI! Ileanal 0 analogico


setup_adc(A1X:_CLOCK_ INTERNAL) .. /IFuente de reloj RC

for (;;1 (
set_lIdc_chatwel (OJ; I/Habilitacion canal 0
del..y_us(201;

127
Compilador CCCS VSimulador PROTEUS para Microcontroladores PIC

q .. read_ade(l ; //Le ctura canal 0


p - 5 . 0.' q / 1024 . 0; //Conversi6n iI t e nsion

p rint f (1cdyu t c , " \ f ADC - Uld ", ql ;


pr:i.nt f (lcdyutc , ~ \nVolta9'e . . . Ol . 2fV~, pi ;

Figura 13. Programa del Ejemplo 1

Ejemplo 2: Yt'1'momeiro COl! IIl1a NYC NYSAOWB203 (figura 16). Componcnles ISIS:
PfC16F876, NTSAOWB203, CELL Y LM016L.

Se utiliza una NTC NTSAOWB203 con una beta de 4050 y una resistencia a 25 °C de
20 kohm (figura 14); estas caracteristicas se pueden ajustar as! como la temperatura
a medir en el menu de edicion del componenle (bol6n derecho, figura 15).

Fig"'''' '4. C.,.,aderistiC";u de la NTC NTSAOW8203

,-'""""-
O~F.... w/C

' _ConoIonl {- !
U!.O.N<>doIr*-

--- ---
e_
edl~_ .
_ Pa~

__

Flg .... 'a 1 S. Edldon del componente

128
5. Convertidor Analogico - Digital

La NTC se linealiza mediante una resistencia R1 de 10 kohm, el valor de tension


de la NTC (V T) se puede obtener segOn las siguientes eruaciones (temperaturas en
grados kelvin):
Rr = Vr ·R, =IOOOO,Vr
VBAT - VT 5-VT
1 1
TT=I R 1 -273.15= 1 R 273.15
_ In(_T_) + _
fJ Rm T"
__ In(_T_) +
4050 20000 298. 15
=--:-::
LCDl

~ 2~.45C

Figwra '6. EJemplo 2


linclude "16f876.hN
Idevice /ldc - 10
Ifuses XT, NOWDT
~use delCly(clock-4000000}
'include <m/lth.h> / /NecesClcia paca los c';;lculos matemJtiCOs
linclude <lcd . c>

vOid milin () (
floar tv,tc,temp,y ; I/Vadable.'l de ecuilci6n
int16 valu .. ;
lcd_init();
setupyort_a( ALL_ ANALOG};
setup_oldc ( ADC_CLOCK_INTERNAL );

129
Compilador C CCS YSimulador PROTEUS para MicrocontlOladores PIC

sec_iJdc_chllnneJ ( 0 );
delay_u.s(lO);
do ,
value - Read_ADC();
tv _ 5.0 • value I 1024.0:
tr - tv • 10000.0 I (5.0 - tv);
y _ logler/20DOO.O):
y - (1.0/298 . 15) + (y ' (1 . DI40SD.O}).-
temp-I. rJly:
temp - temp -273.15:
print£(1cdyutc,"\nT - t04 .2£C", tl!!mp):
...hile (TRUE);

Figura t7 .- Programa de eJ~plo 2

Ejemplo 3: RealiZllr 1m bar6metrolaltimetro que mida e'l Kpa, Psi, Aim 0 mfs median-
te SII seleccion por IItI pllisador (figura 20). Compommfes 1515: PIC16F876, MPX4115,
NT5AOWB203, BUrrO, CAP y LMOI6L.

El sensor de presion MPX4115 de 15 a 115 kPa (2.2 to 16.7 psi) con una tensi6n de
salida de 0.2 a 4.8 V. La funcion de transferencia se muestra en la figura 18, la ecua-
cion de la tensi6n de salida es:
Vour - Vs .. (0.009 .. P - 0.095) ± (Error Presion .. FactorTmp .. 0.009 Vs>

.... ... ~
TJVN~FlIClDN. -
v.. .. v.·(.OI»'p...O!iI5) t: Bftw
•• VS_S.1Vdt
TOP .. OIOeS""C TYP

I ,.'" ~

~
;; .,.
'-'

u ~,~!
~
"~
~e~2~~~~~$SS~~~i2aS§~!~~
PreIan /tit 10 -*' ..... iIIlcPa

FIgura 18. MPX4t 15 (cortesia de Motorola]

EI error de Presion y el factor de temperatura vienen definidos por el fabricante


(figura 19). El error de Presion se sirna en ±l.5 y el factor de temperatura varia entre

130
5. Convertidor Anal6gico - Digital

1 Y3 seglm la temperatura. Este factor hare que sea necesario medir la temperatura
de trabajo y, por ello, se utilizani una NTC

u-
--o.....,. ..
MPU t1 5A. /IIIPXMllSA SeI1e5

,
- ......
u-
d-

~~ ,
1

..
>O-
J J J J
• _• c • • , ,
u
~ ~
• • ,_
~

r- PI"IS$UI"I Error Band


."'" ,
u- t-~'"_

u-
i
S"
lO-

J ~,,- • • • •
J J
,. ,. -...
_10-

-10-
-
IhIlS.,. I"'~
tl5j1r"

Figura 19. Error de Presion y Factor de Temperatura fcortesla de Motorola)

La ecuad6n para caJcular la presion con una Vs de SV y un error de presion de ±1.5


esde:
0.475+ V
p= OUT ±1.S.FaclorTmp
0,045
Una vez calculada la presion en Kpa se reladona con Psi y Atm:
1 Kpa ... 0.0098692 Atm.
1 Kpa - O.1450377 Psi.
La altitud en metros 5e puede calcular 5egUn la ecuacion:

H ~ -7990.6527 .I{ 101.304


P ". J
K

131
Compilador C CCS y Simulador PROTEUS para Mlcrocontroladores PIC

LCD1
'W~

p; 99.87 Kp(I
IT; 25.35C I
t m .1. .. .... ..
8i!iSSatl:!E;
...
..."'"',. wl"
~ ~

'~
",.,e
:=
ji"'
-
--- 0

--
N,

-
0
,
J1 ~""I
. ,
,
Jo, ~".,.\

'. f!
"
R'
7
1 ...-
~
.,~

""""'<=T'CK!
,

-- '.
""11'~
~,

11 ~'t'j 7 ~

I ~ -
~
Rn R2
~ 1<1(>
~
.....,...... ~,-

- t-

- ~-~. - - .- -.~
~-
- _.
Figura 20. Ejemplo 3
linclude <16F876.h>
Idevice ildc-10
IFUSES XT,NOWDT
'roSES
'use delay{clock-4000000}
'include <math.h>
'include <LCD . C>
'BYTE TRISA .. Ox85
'BYTE PORTA" Ox05

void mdin ()
int16 q;
lIOilt cv, cr, cemp,y, cf,error; //Vari ... bJ.es ecuac1.one9
float p,presjon,pres_iltm,pres_ps~,~lt, /IV~ ri~ble3 c6lcu10 pre;sion
//y altura
int cnt-O;
bic_set (TRISA , 2);
sflcup_adc.....POrts(RJlO_ RJll_RJlJ_ANALOG); //RJlO y RAl ana16gica, Rli2 digital

132
5. Convertidor Analogico - Digital

&etup_.dc (ADC_CLOCK_IN"TER.NA1.);
Jcd_inH ():

for (I;) (

set_Ide_channel (0); //Lectura pre~lion en v"lcio.5


delaY_II& (20) i
q - r-ead_"dcl!;
p - 5.0 • q I 2024.0;
pre&io'l- (o. 475+p) /0 . 045; ,ILectur" presion en Xpa

"et_edc_ channel (l) ; //Lectu ra temperatur"


del"y.. u.5{ZO};
q - re.d_"dc{);
cv - 5.0 • q I 1024.0;
tr - tv • 10000.0 / (5.0 - tv):
y .. 109' (UI20000. 0);
y " (1.0/298.15) + {y '(1.0 /4050 .0));
tflm~l.O/y:

temp .. tf!ll1P -2 73. J5;


lE {temp>-O " temp<-85} "''''J . O;
else TF-3.0,.
ERROR. .. TF • 1.5; /IC61eul" del error de pre"ion eon Ie te.mperacura
/Iel error puede ser :t pero .aqul u&alrlO& 0 +
pres j on-presl0.'l-ERROR; /1?re.51on en I<pa
pres_"tm .. presion' 0.0098692; IIPresion en Atm
pnUl_psl .. presjon • 0.l450377; I'Presion en Psi.
ale .. -7990.652789*log(pre"lonIJOl.304); IAltun
if (BIT_TEST(PORTA,Z)oo"O) enc++; IICalcular nUmero veees pul.se boton
j f (ent>-4) cnt-Q;
Switch (ent) ( //Segun flumero veces pl/Js.a bot en s. elige _nu
c.". 0:
led_9"otoxy (1,1) i
printf(lcdJ'utc, ~\P- 1S.2! ](pa PREStoN);
printf(lcd Pl/tc."\nT" '04 .2f CoO, cemp);
brelJk;
case 1:
led_gocexy (I, 1) .-
printf{led_puce, MIP- 14.2f atlll PRES_a em) ;
print!(lcdJ'utc,"\nToo 'Of .2! CoO , temp};
bre.ak;
c"se 2:
led_90toJrY (1,l) ;
printf(lcdJ'utc, M\?- '3.21 psj PRESysi) ;

133
Compilador CCCS YSimulador PROTEUS para Mlcroconlroladores PIC

pdntf (lcdyute, *\nT .. t0 4.2f C M


, tempi:
bre<lk:
elise 3:
led_qotoxy (1, I) ;
printf{lcd_putc, "lAIc- t7 .2f m "; altl;
printf(lcd_pute,*\nT" '04.2f C*, tempi;
break;

deldy_ms(100/:
}

Flgu,.. 21 . P1'og,.. m .. del ejemplo 3

Ejemplo 4: Siml/lacioll de adqllisicio// de /e//siolle5 lIegnfivas (figilla 22). Componentes


ISIS, PIC16F876, CELL Y LM016L.

Como se ha comentado al iniao del capItulo, el convertidos AD del PIC 5610 puede
adquirir tensiones POSlTIVAS. Tal como esta configu rada la entrada del conversor,
el PIC se "QUEMARlA" en el case de introducir una senal de tension negativa
por los canales AD. Pero la simulacion es "muy sufrida" y sf que permite adquirir
tensiones negativas sin que al PIC Ie ocurra nada, pero 13 realidad es muffio "mas
cruel"; j010 can esta diferencia entre la simulaci6n y la realidad!

Figura 22. Ejemplo 4

134
_ _ _ _~5 . Convertidor Anal6gico - Digital

' include <16F876.h>


'dev~ce /lde-IQ
IflJSES XT.NDWDT
,roSES
luse dellly(clock-4000000}
linclude <LCD.C>
void lOIIin ()
inelt> q;
DOllt p;
setup_"dC....,POl':tS(ANO_VREF_VREFJ;
setup_lId'c fADC_CLOCK. INTEFl.NALJ;
icd_lnltO ;

for ( u l (
set_<1dc_channel (0);
delay_us,201;
q - relld adel);
p - (-2.0) + (4 °q /1024.0);
N
pr.1ntfflcdyutc , "\fADC - t41d , q/o'
prJ.ntf(lcdyutc, "\nVolt"ge _ IOl . 2fV w , pI;
delaY_ill.! (lOO}.-
I

F'tu,... 21. PTogr .. _ del ejem~o 4

La soluci6n p ractica para medir lensiones negativas es desplazar la tensi6n hasta


valores positivOS y despues restar este desplazamiento por sofhvare.

135
6. MOdulo CCP - Comparador, Captura y PWM

Capitulo 6

Modulo CCP - Comparador,


Captura y PWM
6 . 1 Introduccion
Los mOdulos CCP permiten realizar tres funciones basicas basadas en el manejo de
los temporizadores (Timer):

• Comparador: com para el valor del temporizador con el valor de un registro y


provoca una acci6n en el PIC.
• Captura: obtiene eI valor del temporizador en un momenta dado, fijado por la
accion de un terminal del PIC.
• PWM: genera Wla senal modulada en amplitud de pulso.
Los PIC de la gama media pueden tener hasta 2 mOdulos ecp. Los dos mOduJos CCP
se comportan practicamente igual (menos en un caso especial que se estudiara paste-
riormente). Tras producirse un reset, el mOdulo cep se encuentra deshabilitado.

Cada mOdulo eep posee un registro de 16 bits que puede utilizarse de las tres
siguientes formas:

• Registro de 16 bits para capturar el valor del temporizador al producirse un


evento (CAPTURA).
• Registro de 16 bits para comparar su valor con el valor del temporizador
TMRI, pudiendo provocar un evento cuando se alcanza el valor contenido en
este registro (COMPARADOR).
• Registro de 10 bits para el cicio de trabajo de una senal PWM (PWM).
Cada uno de los registros ecp tiene asociados tres registros (Ia x indica CCP1 a CCP2):

• CCPxCON: Registro de control del ecp.

137
Compilador C CCS YSimulador PROTEUS para Microcontroladores PIC

• CCPRxH: Byte alto del registro de 16 bits del CCP.


• CCPRxL: Byte bajo del registro de 16 bits del ecp.
• CCPx: pin del ecp.
Reglstro de control CCPxCON Idlrecclon RAM: 17h/D1hJ rpI~
C16F87xj
Figura , . Reglstro d e tontrol CCP.CON
u.o U-O RIW-O RIW-O RIW-O RIW-O R/W.o RNI~

_ CCPxX I CCPxY I CCPxMJ I CCPxM2 I CCPxM1 [ CCPlIMO


8 110

bit 7:6 No usados: valor O.


bit 5:4 CCPxX:CCPxY: bin y bitO del Duty Cycle del PWM.

Modo captura: No Be usa.


Modo comparacioll: No se usa .
Modo PWM: Son los dos bits menos significativos de los 10 bits utilizados para el
Duty Cycle del PWM. Los acho bits de mayor peso del Duty Cycle se encuentran en
el registro CCPRxL.

bit 3:0 CCPxM3:CCPxMO: bits de selecci6n del modo CCPx.

0000 eep inhabilitado (reset del mOdulo CCPx).


0100 Modo de captura, cada flanco de bajada.
0101 Modo de captura, cada flanco de subida.
0110 Modo de captura, cada 4 flancos de subida.
01 11 Modo de captura, cada 16 flancos desubida.
1000 Modo de comparacion, pin CCP a 1 aJ igualarse (CCPxlF = 1).
1001 Modo de comparacion, pin CCP a 0 al iguatarse (CCPxIF -1).
Modo de comparaci6n, genera interrupci6n al igualarse (CCPxfF = 1,
1010
CCPx no es afectado).
I-----t------------------
Modo de comparaci6n, lanza acci6n especial (CCPxlF "' 1, eCPl resetea
1011 TMRl, CCP2 resetea TMRI y lama una conversi6n AID (si esta hahi-
litada).

11"" ModoPWM.

138
6. Modulo CCP - Comparador, Captura y PWM

Debido a que los dos m6dulos CCP utilizan los temporizadores, cuando estan acti-
vos los dos m6dulos se puede dar alguna interacci6n entre eUos. La siguiente tabla
muestra dichas interacciones.

ModoCCPx ModoCCPy Interacc:ion


Captura Captura Misma base de tiempos en TMR1.
La comparacion debe configurarse para la ac-
Capfura Comparad6n
ci6n especial de disparo que borra el TMR1.
La comparacion debe configurarse para la ac-
Comparaci6n Comparacion
cion especial de disparo que borra el TMR1.
Los PWM deberan tener la misma frecuencia
PWM PWM
y tasa de actualizacion (int['fftlpcion TMRl).
PWM Captura Ninguna.
PWM Comparaci6n Ninguna.

6.2 Modo Captura


En el modo de captura, CCPRxH:CCPRxL capturan el valor de los 16 bits del regis-
tro TMRJ cuando ocurre un evento en el pin CCPx. Los posibles eventos son:

• Flanco de bajada.
• Flanco de subida.
• 4 flam::os de subida.
• 16 fiancos de subida.
Estos eventos se seleccionan con los bits CCPxM3:CCPxMO (CCPxCON<3:O». En
el momento de la captura, el bit CCPlIF (PIRl<2» [y/o el CCP2JF (PIR2<O>)l se
pone a 1, produciendo una interrupcion en el casa de que este habilitada. Eljlag ha
de ser borrado par software. Si sucede otra captura antes de haber leido el registro
CCPRx, el valor de la captura previa se habra perdido.
En modo captura, el pin RC2iCCPl (yloel pin RC1!f10SIICCP2) debe configurar-
secomo entrada poniendo a unoel bitTRISC<2> [y/oel nuSC<l>J. Si el bit RC2I
CCPt [y/o RCtJCCP2] se configura como salida, una escritura en este pin pod..ria
originar una captura.
Este modo trabaja can el TMRI. Ademas, es necesario que este funcione como tem-
porizador a como contador en modo sincrono. En modo asmcrono no fundonaria.
Si se produce un cambia en el modo captura, por ejemplo de flanco de bajada a
cada 4 fiancos, se puede dar una falsa interrupdon. Por software se debe borrar el

139
CompHador CCCS y Simulador PROTEUS para Microconlroladores PIC

bit CCPxlE para deshabilitar las interrupciones, limpiar elf/fig CCPxlF y eambiar
el modo de eaptura.

Mediante el preesca/cr se puede aJcanzar una resolucion mas precisa sobre las se-
nales de entrada. Hay cuatTo configuraciones de preescaler especificadas mediante
los bits CCPxM3:CCPxMO. Cuando el mOdulo CCPx esta inhabilitado no esla en
modo eaptura, el eonlador del predivisor es pueslo a cero. Cualquier tipo de reset
barra el preesca/er.
Para cambiar el tipo de preesca/er se debe apagar antes el mOdulo CCPx (borrar el
preesca/er) y posteriormente modificar dimo valor, de 10 contrario se puede produ-
cir una interrupcion.
Si se utiliza el modo sleep (dormido), el TMRl (configurado en modo sincrono) no
se incrementa, pero el preesca/er del CCPx si que continua incrementando el conta-
dor de eventos y, por 10 tanto, cuando aJcanza el valor prefijado, el bit CCPxF se
pone a 1, 10 que provoca un despertar del PIC; asi el contenido del TMRl se guarda
en los CCPRx pero su valor no es significativo dado que el TMRl estaba parada.

6.3 Modo Comparacion


En el modo comparacion el valor de 16 bits del registro CCPRx se compara eonti-
nuamente con el valor del temporizador TMR1. Cuando ambos valores se igualan,
en el pin CCPx se puede producir, 0 no, un evento de los siguientes:

Se pone a 1.
Se pone a O.
No cambia.
Estos even los se seleccionan mediante la configuracion de los bits de control
CCPxM3:CCPxMO (CCPxCON<3:O»:

1000 Modo de comparacion, pin CCP alaI igualarse (CCPxlF = 1).


1001 Modo de comparaci6n, pin CCP a 0 al igualarse (CCPxlF = 1).
1010 Modo de comparacion, genera interrupci6n al igualarse (CCPxlF = 1,

1---1··~·~:'::··~~·~··~·~~~·~~~~·~~·············
Modo de comparacion, lanza accion especial (CCPxIF ::;: 1, eCPl re-
1011 setea TMR1, CCP2 resetea TMRl y lanza una conversion AID (si esta
habUitada).

Por otta parte, al producirse un evento en el pin. se producir<'i la interrupci6n en


caso de que este habilirnda, ya que el f/ag CCPrlF (de PIR) 0 PIR2) se pone a 1.

140
6, Modulo CCP - Comparado1, Capfura y PWM

El TIMER1 se debe eonfigurar en modo temporizador a modo eontador smerono


para que el mOdulo CCPx fun cione correetamente en el modo eomparacion,

Para trabajar en este modo, el pin CCPx debe configurarse como salida, poniendo
a 0 el bit del registro TRISC correspondiente. Cuando se seiecciona uno de los
modos de comparacion, el pin CCPx toma el nivel logico contrario aJ que tiene
que tamar cuando se produzea la igualdad (es decir si se tiene que poner a 1 en la
igualdad, se pone a 0 en estado normal)

Hay un modo de trabajo (CCPxM3:CCPxMO: 1010) en el que se produce una inte-


rrupci6n al produdrse la igualdad, se activa elflag CCPxIF y se genera Ja interrup-
ci6n, si esta habilitada, pero el pin CCPx no se ve afectado.

Por ultimo, puede trabajar en mododedisparode accion especial (CCPxM3:CCPxMO:


1011 ). En este caso cuanda se produce la iguaJdad, el temporizador TIMERl se re-
setea, por 10 que se utiliza como marcador de la accion. En el modulo CCP2. ade-
mas de producirse el reset del TIMER1, se inicia una nueva conversion AD si dicho
mOdulo esta habilitado; esto pernlite realizar conversiones AID periOdicas,

En e[ modo sleep (dormido), el TlMER1 no funciona y, por 10 tanto, [a comparacion


tam poco. El pin cepx tendra el mismo valor que antes de trabajar en modo sleep.
Despues de cua/quieTreset, el modu.lo ecp esta deshabilitado.

6.4 Modo PWM


EI modo PWM (Pulse Width Modulatioll) 0 MODULACl6N DE ANCHO DE PUL50,
permite obtener en los pines eep)." una senal periOdica en la que se puede modifi-
ca r su cido de trabajo (Dllty Cie/e). Es decir, puede variarse ei tiempo en el cualla
selial esta a nivel alto (TON) frente al tiempo que esta a nivel bajo (TOfF ); ver la figura
2. De esta forma, la tension media aplicada a la carga es proporcional al TON' contro-
lando, por ejempJo, la velocidad de motores, luminosidad de lamparas, etc.

Oulplll

V mod. -l n Ton IX: V mod


T ------;
T = cleo

V mod t
T" I I I
T-

Figura Z. Seonaf PWM

141
Compilador CCCS YSimulador PROTEUS para Microcontroladores PIC

La resoluci6n de salida E'S de hasta 10 bits_ Para que este mOdulo fundone corree-
tamente, el pin debe estar configurado como salida, mediante la configuracion del
TRIS correspondiente_
EI periodo de la senal PWM se obtiene de configurar el T1MER2 y eJ contenido del
registro PR2 (direecion Ox92); ver la Figura 3_ Este registro de 8 bits contiene los 8
bits mas significaHvos de una cuenta de 10 bits_ Para calcular el periodo de la senal
PWM se utiliza la siguiente ecuaci6n:

PWMT - (PR2 + 1)-4-T(l'j("-(Valor del Preescaler del TMR2)

Cuando el valor del TMR2 se iguala al valor de PR2, pueden ocurrir los siguientes
eventos:

• TMRl se borra_
• EI pin CCPx se pone a 1 (excepci6n: si el Dllty Cycle es 0%, el CCPx no se pone
a 1)_
• EI valor de CCP Rxl se carga en el CCPRxH.. el cual E'S el que se com para_con
el TIMER2 para fijar e1 duty cycle_

PERIOOO
• •

I I I I
• • •
Cicio de TBbaJo : TMR2- PRZ

TMR2-CIcJo ct. Tm.jo


TMfUooPRZ

Figura ) . Senal de salida PWM

EI cido de trabajo (duty cycle) se define por e1 valor del registro CCPRxL y con los
bits CCPICON<5:4> antE'S de comenzar un nuevo periodo_ EI registro CCPRxL
contiene los 8 bit de mayor peso y el CCP1CO N<5:4> contiene los 2 bits de menor
peso. Par 10 tanto, se cansigue una resolucion de 10 bits (D CxB9: DCxBO). EI tern-
porizador base con el que se campara el contenido de estos registros es el TMR2.
La siguiente ecuadon permite calcuJar eJ valor del Duty Cycle:

PWM duty cic/e - (CCPRxL:CCPxCON<5:4»-TO!lC-1MR2Itt'iCAUR


Los registros CCPRIL y los bits CCPlCON<5:4> pueden escribirse en cualquier
momento, perc no se cargan en CCPRI H hasta que final ice el periodo de la onda
PWM actual (es door que se produce la iguaJdad entre PRl y TMRl). En este modo
el CCPRIH es de sOlo lectura.

142
6. Modulo CCP - Comparador, Captura y PWM

EI CCPx se pone a 0, terminando el cicio de trabajo, ruando el TMRl mas 2 bits se


iguala a CCPxH mas 2 bits

Si el cicio de trabajo de 1a onda PWM es mayor que el periodo, la senal que sale por
la patilla CCPx esta siempre a 1.

La resoluci6n maxima en bits viene dada por la expresion:

Fose )
1g - -
(
resolucion == F I'WM bils
Ig2

Por ejemplo, para una frecuencia de PWM de 1.22 kHz con un preescalcr de TMRl
de 16 y una frecuencia de reloj de 20 MHz:
1 1
1220 ::. (PR2+1) · 4 · 20.10 6 ·16

se obtiene un valor de PR2::. 255 (OxFF), y una resoluci6n de:

\,.(20.10' )
"\. 1200
resolucion = > 10 bits
Ig2

Para poner en marcha el modo PWM se deben dar los siguientes pasos:

1. Configurar el periodo PWM mediante escritura del registro PRl.


2. Configurar el Dllty Cycle escribiendo en el registro CCPR1L y los bits
CCP1CON<5:4>.
3. Configurar CCPx como salida mediante el TRISC.
4. Configurar el preescaIer del TMR2 y habilitarlo mediante escritura en
neON.
5. Configurar el mOdulo CCP para la operaci6n en modo PWM.

6.S Modulo CCP en C


El compUador C suministra una sene de fundones para el manejo del m6dulo CCP.

Configuraci6n del mOdulo CCPx:

setuP3cPX (modo);
modo hace referenda a los bits CCPxM3:CCPxMO del registro CCPxCON (figura 4).

143
Compilador C CCS y Simulador PROTEUS para Microconlroladores PIC

Figura 4 . Modo$ de SETUP_CCPxfMOOOf

Los valores para compa rar se fijan en los registros CCPRx. En el compilador C
estos registros estan definidos en el fichero iI/elI/de, por ejemplo en eI16F87x.h:

long CCP 1; long CCP 2;


,;byte CCP_1 = OxIS 'byte CCP_2 =OxlB
#b yte CCP_1 LOW", OxIS #byte CCP 2 lOW", OxID
#byte CCP_I _HIGH = OxI6 #byte CCP _2_HI GH '" OxIC

Definicion del cielo de trabajo para PWM:

set_pwmx_ duty (valor);


valor: dato de 8 0 16 bits que determina el cielo de trabajo. Este valor, junto con el
valor del preescaler del TMR2, determina el valor del cielo de trabajo. En la configu-
racion del TIMERl, el poslcaler debe valer 1.

Figura S. Ejemplo 1

144
6. MOdulo CCP - Comparador, Captura y PWM
---
Ejemplo 1: Medir eI anc/IO de 1111 pulso mediallte elmodulo eep (figura 5). Compollcntes
ISIS: PIC16F876 y LNl016L. Inslrumefltos: OSCILLOSCOPE y Gellemdores: PULSE.
Se utiliza el modo captura del eep, configunlndolo para que detecte el fIanco de
subida 0 de bajada del pulso a medir. Este ejemplo es similar al ejemplo 4 del tema
de interrupciones, pero en ese la deteccion era por interrupcion de RBO.
Cada vez que se produzca una detection de flanco, el valor del TMRl pasara al
registro del modulo eep.
linclude <16f876.h>
Ifu~es XT.NOWDT
lusa delay(clock - 4000000)
'include <lcd . c>
,byte PIRZ - OxOC

lntl nuevopulso"O ; IIEntra otro pulso


int16 TFa-O , TFS-O,TF-O ; /ITiempo nancos
float AP-O.O : //Villor final del anche> de pulso
intl cambia-O ; /(Cambio de nance> de disparo

#int_ ccpl
void ccpl_int() ( //Funcion interrupci6n
if(cambio-O) { //F1anco de subida
TFS-CCP_l ; //Carga del valor del rer;istro CCPRI en !liJnco subidil
~etup_ccpl(CCP_CAPTURE_FE) ; IIConflquriJcion modo Captura en funco b.1jada
cambi.o-l; I/Control de cambio de flanco
else ( I/Flanco de Bajada
TF8-CCP_l i IICargiJ del valor del reqj~tro CCPRI en nanco bajada
~etup_ccpl (CCP_CAPTURE_RE) .. I/ConflguriJcion modo Cilptura en Danca subidil
cambio- O; //Control de cambio de {Janco

if(nuevopl.llso--O} / /IFin de pulso ...


Dl.levopulso .. j : //pulso a medir

void main (J

lcd_init (} :
setup_tilllltr_ l (Tl_INTERNAL! ; //Conffguracion TMRl
SBtUp_CCp.l /CCP_ CAPTURE_RE) i IIConflgu r acion lIIodo CClp t ura en fJdnco subida
camb..!o - 0 ; //Control d e cambio il 0

145
Compilador CCCS YSlmulador PROTEUS para Microcontroladores PIC

enable_interrupts(int_ccpl} ; IIHabilitacion interrupcion modulo CCP


enable_interrupts (global) .. I IHabil1. tacion interrupcion global
do (
1.[ {nuevopulso- - l) (
Ill.Pul so nuevo?
TF-(TFB-TFS) i IIAncho de pulso .
IIAncho de pulso en micro-se gundos (a 4 MHz : l ,,5)
print[(lcdyutc, N\nPtllso *16.1tus ", liP);
nuevopulso-D; IIPulso ya medido , espera nuevo

J while {TRUE/ ..

Figura 6. Programa del eJemplo 1

Ejemplo 2: Ge"erar ulla seilnl Clladrada de 2 kHz medimlff el m6dljlo CCP (figura 7).
Compollelltes ISIS: PIC16F876 y LM016L. lnstrumentos: OSCILLOSCOPE y COUN~
TER TIME.

--
.~ . -
.~ .
.-. .-._-
~ ' ::'-:'
OSCUI:I.JQII

L _-'-'j ~lJ<'O<Jl
WCUW'opITHV

-~
..... fI.../" Ri!I$
AA21N<2NREr R_$C
~H' "117"'''0

~ "~,,;~~;;~I~~~-
--,
1tC2ItC~'

~C4ISWSD"

"-~
ftce/T)CICII
~C7I1Wf)T

Figura 7. Ejemplo 2

Se utiliza el modo comparacion del CCP, configurandolo en modo conmutaci6n del


pin CCP por comparacion. Este ejemplo es similar a los ejemplos 1 y 5 del tema de
interrupciones, pero en esos la detecdon era par interrupcion del TRMO y TMRl,
respectivamente.

146
6. Modulo CCP - Comparador, Captura y PWM

El modulo CCP campara continuamente el valor de TMRI con el valor prefijadoi


ruando se produce la igualdad se produce el cambio de estado del pin CCP Y la
activacion de la interrupci6n del mOdulo CCP.

En cada conmutaci6n se debe fijar el valor a comparar para obtener una onda cua~
drada (un cicio de trabajo del 50%), es decir un semiperiodo de 250 I-1S (a 4 MHz el
cicio maquina es de 11-1s), por 10 tanto, e! CCP2 se debe cargar con este valor (ajus-
tando el valor final es de 199).
linclude <16f876.h>
Ifuses XT,NOHDT
intI c<'lmbio-O; IIVlJrilJbl e de control de cambio

lint_ccp2
void ccp2_int () ( /IFunci6n de in t errupci6n
if(++cambio~l) (
secup_ ccp2(CCP_ COMPllRE_ CLR_ON_MATCH) i IIModo Comparac16n, cambio a 0
else{
seCup_ccp2(CCP_COMPARE_SET_ON_MATCH}; IIModo Compardci6n, cambio a 1

set_timerl (0) : IIBo rriJdo de TMRI


CCP_2 - 199; //Inicidlizaci6n del registro CCPR2
psra un Duty del SOl

void main (J {

disable_in terrupcs (g1 ohal) ;


setup_tlmer_l (Tl_INTERNAL I Tl_DIV_BY_l); IIConfiguraci6n TMRI
setup_ccp2 (CCP_ COMPARE_SET_ ON_MATCH) i IIConfigu r<'lcion inicial modulo CCP
CCP 2 - 199; IIIniciillli;r;acion del registro CCPR2
- I/para un DLlty del sal
enable_interrupt II (int_ ccp2); IIHabilitillci6n interrupci6n modulo CCP2
enilble_ in Cerruptll (glob<'ll) ; IIHabilitaci6n interrupci6n general
do (
) while (TRUE);
)

FlgtJr .. 8 . Progritm .. del ej emplo.z

Ejemplo 3: Mediante 10. collfiguracioll del mOdulo CCP lanzar ulla cOllversion AD, auto-
matico. cada 111/s. Can cl valorobtenidose realizara zilla COfwersion DA utilizmzdo eI PWM
Y lin filtro paso-bajo (figura 10). Compo/lellies ISIS: PIC16F876, CAP, CELL, LED-BAR~
GRAPH-GRN, LM3914, POT~LlN Y RES. Illstrumelltos: OSCILLOSCOPE.

Se configura el mOdulo CCP2 en modo comparadon con accion especial de disparo,


cuando se produce la igualdad se resetea el TMRI se y se lanza una conversion AD,
si esta habilitada. Cargando el registro de CCP2 con el valor adecuado se consigue

147
Compilador CCCS y Simulador PROTEUS para Microcontroladores PIC

que, ruando coincida con el va lor de TMR1, se produzca una conversion AD, en
este caso cada 1 ms. Dado que la fre<:uencia de trabajo es 4 MHz (1 ms!1 fls=l(00),
el registro CCP2 se carga a 1000.

Figura 9 . Selial de 2 KHz lejemplo 2)

Con el valor obtenido de la conversion se puede obtener una senal PWM propor-
donal a este valor. Para ella se utiliza e l mooulo CCPl, dado q ue el valo r de la con-
version es de 10 bits y el registro del moouJo PWM tambien es de 10 bits, el va lor
puede ser transferido directamente.

EI periodo de la senal PWM viene fija do por e l TMR2, con un presca/er y un pastcaler
de valor 1 y un valor de registro PR2 de 224, 10 que implica un periodo de 225 f1s
(4444 Hz).

Si dicha senal es filtrada can un filtro de paso bajo se obtiene una corriente continua
proporcional al valor de la conversion. Como apJicacion se puede aplicar esta senal
a una barra de leds y obtener una senalluminosa proporcional a la senal adquirida
(voltmeter). Para e llo se utiliza el circuito integrado LM3914 (figura 11).

En la figura 10 se observa el funcionamiento del circuito; con una pila y un poten-


ciometro se varia la tensi6n de entrada, la cual es muestreada cada 1 ms. Can este
valor se genera una senal PWM (ver canal A del osciloscop io) y mediante el filtro
de paso bajo se obtiene la tension media p ro porcional (ver canal 8 del oscilosco-
pio). Dicha tension se inyecta a la entrada del LM3914 que proporciona 1a senaJ a
los leds.

148
6. Modulo CCP - Comparador, Captura y PWM

•~"

Flgu,a to. Ejemplo 3

r ~lFQ

I
I
I
I LtO
,. ". ,. .-I , ,I
'.
I NO.1
I
I
" " " " " " " "
IJ "
-'-
"'T'
LMJ9 14
I
,- "n
I
" I JI " ••I' '" ".,II _~ I '"1 l'
-
l l

L ~~",~==:t--i-----1:;:::-'I-+-
M
V' f.llV-11V

- - ---- ~r'----'--,'- :~
"." l """"-
SlGMAI
JOUIICI

Flgu,a 11. Apllcacl6n t'plca del LM3914 {cortesi" N"tlon,,' SMq

~include <16f876 . h>


Idevice adc-10
Ifuses XT,NOWDT
int16 valor;
lint_ad

149
Compilador CCCS YSimulador PROTEUS para Microcontroladores PIC

void "d_int(J{ IiFUnci6n interrllpcion AD


valor- read_adc(J ,. IIValor de fllente analoqica ..
set_pwml_dllty {valor}; II" Ollty de PNM

void main () (
disable_ interrllpts (global) ,.

setllp_ adcJorts (AND),. IIHabilitac:ion RAD analogico


setllp_adc (ADC_CLOCK_INTERNAL),. IIReloj interno RC
set_ildc_channel (0); IICana1 ()

setup_ timer_2(T2_DIV_SY_l,224, 1); IlpR2~224, Tpwm~225 liS

setup_ccpl (CCP_ PWM); IICCPl en modo FWM


setup_ccp2 (CCP_COMPARE_RESET_T.IMER); IICCP2 modo COMPARACION...
II y di:;paro e.'Jpecjltl
setup_ timer_l (Tl_INTERNAL Tl_DIV_BY_l}; IIConJiqurac16n TMRl
set_timerl (O) ; IIPuesta " 0
ccp_2-1000; //Muestreo cada 1 ms a 4 MHz
enable_interrupts lINT_AD); IIHabl11taci6n Interrupcion AD
enable_ interrupts {globalJ .. //Habllitacion Interrupeion global
do (
j ...hile (TRUE);

Figura 12. Programa del ejemplo:t

Flgl.lra 1:t. Senal modulad.. '1 senal fIItr ..da

150
_ _ _ _ _ _ _ _ _ _ _6_
.M ._uIO CCP - Comparador, Captura y PWM
_6cd

NOTA

Puede detecta rse un error en el m6du lo ecp en modo PWM con valores altos
(ver el llltimo ejemplo de este capitulo).

EjempJo 4: Mediallte la cOlljigllracion del modulo ecp iallUlr 1I11a collversion AD allfo-
ma/ica. COli eI il(l/or obtellido represel1lar la tel/sioll de mirada ell 1111 display grajieo (fi-
gura 14). CompOllclltes ISIS: PlC16F877, CELL, VSIN, LGM12641BS1R.llls/rumell/os:
OSCILLOSCOPE.

En este ejercicio hay que tener en cuenta dos factores. Par un lado que la frecuencia
de muestreo debe ser, par 10 menos, dos veces mayor que la frecuencia a mues-
trear; en este caso si la frecuencia de muestreo es de 5 kHz (200 ).1s), la frecuencia de
la serial a mucstrear debe ser inferior a 2 KHz.

POr otro tado, hay que ajusta r el rango de tensi6n de entrada a valores positivos. St:-
utiliza una fuente de continua de 2.5 V para elevar una fuente senoidal de 5 V de
pico a pico con una freruencia de 10 Hz (tambien se puede desplaza r la tensi6n con
el offset de la Fuente VSINE). Para representar esta tension se ajusta el tamal'io de la
pan talla: en el eje de las X e1 tiempo (de 1 a 128 pixeles), en el eje de las Y la tensi6n
(de 1 a 64 pixeles).

Flgu'iI 14. Ejemplo 4


'include <16£877.h>
'device adc-lO

151
Compllador CCCS y Simulador PROTEUS para Microconlroladores PIC

'use delay (clock-200DOOOO)


'fuses HS,NOWDT
'include <'HDM64GS12 . c>
'include <graphics.c>
!ntl6 valor;
fioilt tension;
lint_ad
void ad_int(} { I/Funci6n interrupcion AD
valor-read_ ,sdc (ADe_ READ_ ONLY); / /Valor de f!lence anlllOgica . ..
ccp_2-1DOO; //reinic1d C!lentll
}
void mllln II
1nc8 xa -128 ,Yi:l-D;
glcd_ init (ON),-
d1 sable_interrupts (globalJ ;
secup_lldc-POrts(ANO) .. I/Hllbilitllcion RAO IInll16gico
setup_adc (ADC_CWCK_INTERNAL)'- I/Reloj interno RC
set_adc_channel (0); Ileanal 0
setup_ccp2 (CCP_COMPARE_ RESET_TIMER) .. IICCP2 modo COMPARACION._
II y disparo especial
setup_timer_l fTl_INTERNAL /ICcmfigurilcion TMRI
sec_timerl (0),- 1,'PlJesta a 0
eep_2"1000 .. /IMuestreo c,sda 200 ~s a 20 MHz
enable_interrupts (INT_AD); //Habi1itacion Interrupcion AD
ena.ble_ interrupts (globi:ll) ; '/Habilicacion Interrupcion global
gled fl11screen (0),- '/Borrado de panta)la
gled line/l,64,1,1,1); //lineas de x e y
gled I1ne(1,31,128,31,1);
do
tension-(valor~5.0)/1024.0; //Vin en voltios (de 0 a 5V)
ya-l . 0~12 . 6~tension .. /IEsclilado de Vin, y de 1 Ii 64 (y_l+64/S'Vin)
glcd~ixel (xll,ya,l);
xa--;
if (xa<2)
(xa-128; I/Eje de ciempos (x de 1 B 128)
glcd_ fil1screen (O) ;

glcd 1~ne(1,64,1,1,lJ; //l ineas de x e y


glcd line(l,31 , 128,31,1);

while (TRUE) ..

Figura 15. Program" clel eJemplo 4

152
6. Modulo CCP - Comparador, Captura y PWM

Ejemplo 5: RealiZllr lin colltrol PID pam regular la tellll1eratura de III/ homo (figura
16). Compollt!l1tes ISIS: PIC16F877, IRLl004, OVEN, RES Y CELL. llls/rume,,/os: OS-
CILLOSCOPE.

-"

Figura 16. Ejemplo 5

Uno de los controladores mas comunes que se utilizan en el control de temperatura


es el PiD (Proporcional-Integral-Derivada). Sin entrar en teoria de contro\' se pue-
de indicar que un controlador PID responde a la siguiente l'CUacion:

donde e(t) es el error de la sena[ y u(t) es [a entrada de control del proceso. Kp es la


gananda proporcionaJ, TI es [a constante de tiempo integral y Td es la constante de
tiempo derivativa.
En el dominic s, el controlador PID se puede escribir como:

U(S)~KI'[l +_l + TdS] E(S)


T,S

Un controlador PID tiene tres parametros (Kp' Ty Td ) los cuales interacttian uno con
e[ otro y su ajuste para obtener el mejor control puede ser muy comp[kado.

153
Compilador CCCS y Simulador PROTEUS para Microcontroladores PIC
--
Ziegler/Nichols sugirieron valores para los parametros del control PID basados en
analisis de lazo abierto y lazo cerrado del p roceso a controlar. En lazo abierto, mu-
chos procesos plleden definirse segun la siguiente funcion de transferencia:

donde los roeficientes "0- '[0 Y Y(I se obtienen de la respuesta del sistema en lazo abier-
to a una entrada escalon. Se parte del sistema estabilizado en y(t) .. Yn para u(t) - ulY
se aplica lm:l entrada escalon de llu a u 1 (el salta debe estar entre un 10 Y un 20% del
valor nominal) y se registra la respuesta de la salida hasta que se estabilice en el nue-
vo punto de operati6n.

y(l) /
y, .-.----.----.- +,---::-=~---­
Ftt«o ~ .." ' _ pond-'t. I i
I
h

.... - .............,,.... - ............................-


;
y. I--,--~

r II j
" I
I(S)

Figura 17. Respuesta de sa lida a una entra da escalon


Los panimetros se pueden obtener de esta respuesta:
TO = /!- / O

YO=12- / 1
-
K0 -
y, - Yo
U! - uO

Seg{In Ziegler/Nochols, las reladones de estos coeficientes can los para metros del
controlador son:

154
6. ModiJlo CCP - Comparador, Caplura y PWM
---
La realizaci6n de un controlador PID discreto viene dado por la transfonnada z:

U(Z)=E(Z)K,[I+ T , +T, (J-Z-')]


7;(I -z·) T
tambicn:
U(z) b
- - = o+ - - + c(l-z- l )
E(z) I -z-'
donde:
K oT
a=K , b=-'-
7;
c = CC
KL'",0T,,-,
T

Existen distintas posibilidades de la realizaci6n pr.ktica de un controlador PID;


una de las mas habituales es la realizad6n en paralelo (figura IS).

proporcional +
e(kT) -~-<a ~......:.---+( u(kT)
+
derivativa +
'---+{ c ) , - - - - +(

Figura 18. Diseno paralefo del controlador PID

EI algoritmo utilizado para programar el PIC se muestra en la figura 19 de la pagi-


na siguiente. EI muestreo debe ser mucho menor que el hempo de establecimiento
del sistema en Iazo abierto. En el modelo Ziegler/Nichols se lorna un valor T < Tr/4
(tambien puede utilizarse T < yJlO).
Un problema asociado a este tipo de disefio es eil lamado "integral windllp", el cual
puede provocar largos periodos de sobreimpulsos (overshoot), motivados por los
valores excesivos que a!canza la senal de control debido a la acumulaci6n en el
integrador. Para evita r este problema se suele limitar la senal de control entre un
valor maximo y otro minimo, impidiendo que el integrador actiie cuando se supe-
ran esos Hmites.

155
Compilador CCCS YSimulador PROTEUS para Microconlroladores PIC

( AD )
[

I
SET _POINT

I ,on
!
MUESTREOOE
seNAl.. O~)Si.PLJOA
,OJ

CALCULO oa ERROR
e~T)=r(kT)-y(kT)

ch.cuLooa
TERMINO INTEGRAL
i(kT)=b· e(kT) ... I,kT a)

ch.cuLOoa
TERMINO CJERIVATIV'O
d(kTt)"C·e(kT)-c·e(kT 0)

~
CALCULO DE LA ~OA
AD
u(kT}"I(kT )-te·I~T) +d(kT)

~
TRH-ISFERENCIAOE l{Kl)
AL)CTU..aDOO

L
i(kTrJ=(kT)
e(kT o)"8(\<.T)

Figur;!l 19. AJgoritmo de progr;!lm;!lcion del PIO

En el ejemplo. el control se realiza sabre un homo can una resistencia calefactora.


Se actua sabre dicha resistencia median te una se.nal PWM generada en funcion del
control prD. Para faci li tar la sirnu laci6n se alimenta la resistencia con una fuente

156
6. MOdulo CCP - Comparador, Captura y PWM

de corriente continua de 12 V Yse modifica su potencia de calentamiento (edita r el


componente con el boton derecho) a 120 W (figura 20).

~----g

--,...
c--.t floloron<o
.rfM
"" N -"- ·
I '" I
I <- I
...
usa. ~ odoI r ill: 'Hid.".

--, -
A6i"""odPl_
_jll 20
·
·

t >ddo _!i~ MJd>1'oor..... mocUo·


·
[>d.do _PC81.,.,-
E.. " , - - . .. _

Figura 20. Caracte ristJC;lS d e l OVEN

Dado que la corriente maxima es de 10 A se ha utilizado un MOSFET de potencia,


elIRLlOO4.
Como sensor de temperatura se puede utilizar rualquier dispositivo NTC, RID,
termopares, etc.; pero el OVEN tiene un terminal que indica la temperatura del
homo en grados Celsius. Sera este terminal el que se utilice para introducir al PIC
la temperatura del horno; dado que la temperatura esta medida directamente en
grados Celsius es conveniente utilizar (para este ejemplo) un divisor por 100 que
permita obtener el valor en milivoltios de la temperatura (25 °C seran 250 mY) .
--.= - -l1li

-_.-
• jlll,C""'II,,,,"h' - - - - ,-

r",,- D_ ~

~,-
-" "
--.
!AI_FIa

. ·6 -
~. '""'
1II'Iooe.--
.
t[ -
__-~
l'D l._
(,11 _ _ .. _
_..._- •

Figura 21. Ca racte rlsticas del OVEN

157
Compilador Cecs y Simulador PROTEUS para Microcontroladores PIC

La temperatura a alcanzar (0 set point) se podria intraducir por teclado (y LCD)


pera, para simplificar, se establece directamente en el pragrama (se deja allector
modificar dicho programa para poder variar la temperatura de set poil/t). La tempe-
ratura inidal se puede modificar en el menu de edici6n del com panen te OVEN.

EI resta de caracteristicas a modificar en el componente OVEN son (figura 22):

• Temperature coefficient (Vl°C): da una idea de 1a temperatura que alcanzani eJ


homo segtin la tension aplicada. Valor: 1 V/°e.
• Oven time COllstant (sec): es la canstante de tiempo del homo. Para evitar una
larga simuladon se ajusta a 10 segundos.
• Heater lillie Constant (sec): es la canstante de tiempo del calefaetor. Para evitar
una larga simulacion se ajusta a 1 segundo.
• Thermal resistance to ambient ("CIW): resistencia tI~rmica homo-ambiente. Se
ajusta al mismo valor que el dado par defecto, 0.7.

- ----------
~---------

_.--
-- '<Ill C..,ponenl

'r;;;
" "--
C-""''l.... M'
I I ~

I '""' I
_.-.
~_f..

_1_i'C} ."
_. ··
~!"C:i;..,...1V<Il

-
~T_CmototoI

,
1 _.... ~"'f'Cl
__ 1 '- i,

·
E_""":;.o.-.
E_ _ Pal......
E60~ ___
"""'_-..JIIlIlIo

Flguril 22. CilritCtflfstlcas del OVEN

Para determinar los par;imetros (~'[o y yJ del control PlD basados en el anal isis de
lazo abierto segun Ziegler/Nichols, se realiza un amilisis transitorio del homo can
una entrada escalon de 0 a 2 V (10% a 20% del valor nominal); vcr Figura 23.

Para trazar la gr.ifica se utiliza la SimulatiOIl graphs en el ISIS (Figura 24); el tipo
illteractive. En el comando GRAPH/ADD TRACE (figura 25) se afiade la traza de
la sonda de tension colocada en la salida de temperatura del hoeno. Al realizar
la simulaci6n temporal de la forma habitual (0 can la barra espaciadora) se lanza
tambien la simulacion grafica y durante el tiempo fijado en la gnifica (editando
sus caracteristicas -Figura 26-), el va lor de la sonda se reflejara en dicha g rMka (se
deja abierto el interruptor un tiempo y despues se eierra para provocar el escal6n

158
6. Modulo CCP - Comparador, Captura y PWM

de entrada). Realizando una pulsacion en la barra de titulo de la gnlfica se puede


ampliar y utilizar un cursor para realizar las medidas; tam bien se puede exportar
la grMica a un fichero.

~
:- BAT1

SW,

SW$'ST
•• 3IilIIl QUlin

-
()toI'!T1~ ,~

+ ,-
.~

••
~ .. ....
~

~
~
~.' ~.'
ov,
~

Figura 24. Simulation Graphs

--.
--
Figura 25. Menu Graph

159
Compilador CCCS y Simulador PROTEUS para Microconlroiadores PIC

---
..... PC_

"'-,
f
I
SPlCtO_
s.l:~
,;

II
Figura 26. C<lracteriS"tlcaS" del graflco

De la recta de maxima pendiente se deducen los parametros " 0' TO Y Yo definidos


para eJ amllisis en lazo abierto de ZieglerlNichols (Figura 27).

_. ." .... ..... , ... . ........................ . ... ..... . .... ~.~

,;
""
~-
"
/1 /'
:/ i
, , /
/ ',
,:
• ,,i/ !,, TO = 11 ~tr) =5.5- 4.5 = I
,,' :,,,
,!j ,, ro= 1, -I, = 18.5-5.5 = 13
,, ,,
• ,,
• "0=y , - Yo = 276 - 25 = 125.5
U1 -Ur) 2- 0

..~ T...J/
k

· '•. M ,. " .. ~.. • .. .


..

.. ... .... ....


Figura 27. Determinacion de loS" parametros ICO' T.Y Y.

Los parametros Kr' T Y TJ se calculan en base a estos:


j

K = 1. 2 10 = 1.2·13 =0.1243
p Ko ·ro 125.5·1
T, = 2·'o= 2·1 = 2
T" = 0.5·To = 0.5 · 1=0.5

160
6. MOdulo CCP - Comparador, Caplura y PWM

Los pafi1metros del controlador discreto se ca lculan en base al tiempo T que segun
Ziegler/NidlOls es de 0.1 s po r ser menor de T < '[0 /4.
(I = K , = 0. 1243

b = K {I· T = 0.1143·0.1 = 0.0062


r, 2
c = K p ' T" = 0.1243·0.5 = 0.6215
T 0.1

IINCLUDE <16F877.h>
Idavice adc~lO

luse delay(c1ock-4000000)
Ifuses XT,NOWDT
IByn; TRISe - OxS 7

void main () {
inC16 valor; //1ectura de temperatura
int16 control; //va10r del PWM
noat a,b,c ; //conSCl!Jntes del PID
float temp_limit ; //tempe rl!Jtura a alcanzar
noat rT, eT , iT , dT ,yT, uT, iTO , eTO, 1T_1 ,eT_l: //variables de eeuaeiones
float max,min: //limices mJxirno y minimo de control
min-O . O; //lnielalizaeion variables
max-IODO. D:
iT_I-0.0 ;
eT_ l - O. O;
CI-0.1243; //cons tantes del PID
b -O . 0062 ;
e-0 . 6215;
temp_1 Jm! t - 500. 0; //Temperacu!'"a " alcanzile
TRISC"O;
setup_timer_2 (c2_div_by_ 4 , 249, Ij .. //periodo de 1" sella! PWM a 1m,.
setup.eepl (cep.pwm); //M6du!o CCP a modo ~
setup_ ade_ports (a11_ analo~J .. //Puerw A "na16gico
setup_ade(ADC_CLOCK_INTERNAL); //reloj convertldoe AD inteeno
set_adc_channe1 (O); //Lec tu!'"a por el eanal 0
while (lj (
valor-read_adc() ,. //Lectu!'"a de 1a temperatu!'".3
yT-valor' 5000. 0/1024.0; //conveesion a mV (O.25Va 250mV)
rT- temp_llmlt;
eT-rT- yT; //CalCulo erroe
iT-b ~eTdTO: //e.Heu!o del teemino integral

161
Compilador CCCS y Simulador PROTEUS para Microcontroladores PIC

dT-c' feT-eTG); I/Calculo del ~ermino dedvIJtivo


uT"i T+IJ *eT+dT; //CAlcul0 de la SIJlid/l PID
if (uT>ma,,) '{ I/SalidiJ PID 5i es mayor que el MAX
uT"mIJx;}
else (
if (uT<min) ( I/Si.lljda PID 51 es menor que e1 MIN
uT"min ; I

control-uT ; //Transterencia de si.llida PID a 5eilal PWM


set_p"'ml_du~y(control) ;
iTO-iT: //Guardiir v.!rl.!ble5
eTO-eT;
delay_m$(lOO): I/Tiempo de muestreo
i

Figuril 28. Programil del ejemplo 5

La respuesta del sistema se mueslra en Ja figura 29; si se redu ce el tiempo de mues-


treo alms se reduce el sobreimpu lso (£igura 30).



/ "-
• "-
I

/ "-

·
·•

.000.120

•.

I
I -0.62 5
T_ t QOm

·• I Min - 0

•. /
• /
• II
" ~I
Iii
Figura 29. Respuesta con T - 100 ms

162
6. Modulo CCP - Comparador, CaplUra y PWM


·
·

~

· /
/'

·
· / .......,,,
1"-0:12.3

· / .
c:>'62.151
-- r-
· !/ MU~OO

·•. f-- Ii!II •

w /
• / ,

• /
"::'Iiij ' - " !=::illI
Figura 30. Respuesta con T . 1 ms
Ejemp lo 6: Problemas Cilia simI/Indo!! del mOdzdo CCP ell modo PWM.coll el1515 (figu-
ra 16). CompOllclltes ISIS: PIC16F876. IlIstrmnclltos: OSCILLOSCOPE.

5e ha detecfado un problema, que pronto sera resuelto por LabCenter, en el m6du-


10 eep trabajando en modo PWM. Los valores del dutty pueden ir de 0 a 1023 dan-
do una selial modulada desde 0 V con el valor 0 a 5 V con el valor 1023; pero en el
ISIS, a partir del valor 900 1a senal se convierte en una selia! cuadrada con u n cicio
del 50% y un periodo doble del ,que tenia. En eI ejemplo se observa este defecto.

""~
-- ,
~
-
~,

,•
~
~~
AA'iAH'

'""-- ,
~
~.
~ .... """'"
1aJ1.'I'GO

FtCWT10S01llClO
RC11T1~

"""'"
"""""'-
""""""
""""' ,"
~

~~.
""''''''
Figura ~1. EJernpla 6

163
Compilador CCCS YSimulador PROTEUS para Microcontroladores PIC

Flgu,a 32. PWM con valor "'enor de 900

Figura 33. PWM con valor mayor de 900

164
6. Modulo CCP - Comparador, Captura y PWM

linclude <16f876.h>
Ifusetl XT,NOWDT
IUtl& d&1.y(~lo~k-4000000J

int16 i;
void lII~ln () /
tletup_ti,..r_2{T2_DIV_SY.1.224,11; //PR2-224 . Tpwm-225jJs
senlp_ccpl (CCP_PtfMJ; l/eePl en modo PWH
for fi. .. O.. i<1024;~HJ (
set_pwml_dutyfiJ; //IJ Duty de PWM
delay_ms (25) ..

Figura 34. PrOiilrama del eJemplo 6

165
7. Transmlsi6n serie

Capitulo 7

Transmision serie

7.1 'ntroduccion
Los PIC uHlizan, entre otros, dos modos de transmision en sene:

• El puerto serie smcrona (SSP).


• La interfa z de comunicacion serle (SCI) 0 receptor transmisor serie smcrono-
asincrono universal (USAR1).
El SSP se suele utilizar en la comunicaci6n con otros microcontroladores 0 con pe-
rifericos. Las dos interfaces de trabajo son:

• lnterfaz serie de perifericos (SPI): desarrollada por Motorota para la comu-


nicacion entre microcontroladores de la misma, 0 diferente, fa milia en modo
maestro-esc1avo; Full-duplex.
• lnterfaz Inter-Circuitos (f2C): lnterfaz desarrollado por Philips, con tu1a gran
capacidad para comunicar microcontroladores y perifericos; Half-duplex.
La configuraci6n USART (transmisor-receptor serie smCTono-asincrono universal),
tambien conocirlo como SCI (interfaz de COmunicaci6n serie), permite la comunica-
cion can un ordenador trabajando en modo full-dllplex asincrono 0 con perife.ricos
trabajando en modo Ilaif--duplex. En general, puede trabajar de dos formas:

• Asincrono (jull-duplex).
• Sincrono (lralf-duplex).
Otros tipos de comunicacion soportados par los PIC son: 1-Wire bus, LIN (Local
IlltercD/mect Network), USB (Ulliversal Serial Bus), el CAN (COli troller Area Network)
y Ethernet.

167
Compilador CCCS VSimulador PROTEUS para Microcontroladores PIC
---
7.2 EI modulo USART/SCI
7.2.1 Introducclon
Algunos PIC disponen del m6dulo de comunicaci6n serie USARTISCI, tal vez el
mas utilizado entre los mOdulos de inlerfaz serie.
La principal funcion del USART es la de transmitir 0 recibir datos en serie. Esta
operaci6n puede dividirse en dos categorias: sincrona 0 asincrona. La transmisi6n
sincrona utiliza una seiial de reloj y una linea de datos, mientras que en la transmi-
sion asincrona no se envia la senal de reloj, por 10 que el emisor y el receptor deben
tener relojes con la misma frecuencia y fase. Cuando 1a distancia entre el emisor y
el receptor es pequena se suele utilizar la transmision sincrona, mientras que para
distancias mayores se utiliza la transmision aslncrona.
El USART puede transmitir 0 recibir datos serie. Puede transferir Iramas de datos
de 8 0 9 bits por transmisi6n y detectar errores de transmisi6n. Tambien puede ge-
nerar interrupciones cuando se produce una recepci6n de datos 0 cuando la trans-
mision ha sido completada.
Algunos PIC tienen un USART direccionable 0 AUSART (Addresab/e USARD que
utiliza el novena bit de datos para distinguir entre la recepd6n de datos 0 de direc-
cion. En algunos PIC se ha mejorado el mOdulo USART dando lugar al EUSART 0
USART mejorado, el cual pennite la detecci6n automatica de baudios, el despertar
automatico al recibir la senaJ de sincronismo a la transmision del canicler Break de
12 bits, permitiendo su utilizacion en sistemas de redes de interconexion local (bus
LIN).

Basicamente, la transmision serie consiste en enviar los datos bit a bit a traves de
una linea cornun en periodos de tiempo fijos, dando lugar a la llamada velocidad
de transmision 0 numero de bits enviados por segundo (baudios). Tanto el emisor
como eJ receptor poseen registros de desplazamientc para realizar la comtmica-
cion. Los bits estan codificados en NRZ (niveJ alto; 1, nivel bajo: 0), NRZI (cambio
de myel: 1, sin cambio de nive!: 0), etc.
En el modo Slncrona se permite la transmisi6n continua de datos y no existe un
limite de tamano, es un modo semi-du plex (Ia comunicaci6n serie se establece a tra-
yeS de una Unica linea, en ambos sentidos, pero no se puede Iransferir informacion
en ambos sentidos de forma simultanea). En este modo de transmisi6n se puede
trabajar de dos formas:
• En modo Maestro, donde el microcontrolador maestro genera la senal de relaj
e inicia a finaliza la comunicaci6n .
• En modo Esdavo, donde el microcontrolador esdavo recibe la senal de relaj y
depende del microcontrolador maestro para recibir 0 envia r informaci6n.

168
7. Transmision serle

byte
Datos

Reloj

Figura I . Transmlsl6n sincrona

En el modo asincrono SE' em plean relojes tanto en el emisor como en el receptor.


Ambos relojes deben ser de igual frecuencia y deben estar en fase a sincronizados.
La frecuencia de [eloj se acuerda antes de la transmision configurando 1a velocidad
mientras que 1a sincronizacion se rea liza durante la transmision. Cada trama de
datos tiene un tamano fijo y poseen un bit iniciaJ 0 de arranque (starf) y un bit Final
o de parada (stop) que permiten realizar dicha sincronizaciOn. La transmisi6n es
en modo filII-duplex (se utiHzan dos lineas, una transmisora -TX- yotra receptora
-RX-, transfiriendo informaci6n en ambos sentidos; SE' puede transmitir y recibir
informaci6n de forma simultanea).

1 101111 111 11 1,--1


Bit start Bit stop

Figura Z. Transmlsl6n asincrona

EI modo mas habitual de transmision por el USART es el modo asincrono, pues-


to que permite comunicaciones en largas distancias. Existen distintas normas de
transmisi6n serie asmcrona, como 1a RS232, la RS48S, etc. Los niveles de tension
empleados en estas normas son diferentes al empleado par el PIC. Par ella, suele
ser necesaria la utilizaci6n de cirruitos extemos de adaptacion

Los terminales utiliz.1dos en el modulo USART son el RC6/TX/CK y el RC7/RXIDT:

• En el modo sincrono maestro, el pin RC6!TXlCK se utiliza como senal de reloj


(de salida) y el RC7/RXIOT como linea de datos a envia r 0 recibir.
• En el modo sincrono esclavo, e[ pin RC6ffX/CK SE' utiliza como senal de reloj
(de entrada) y el RC7/RX/DT como linea de datos a enviar 0 recibir.
• En el modo asincrono, e[ pin RC6/TX/CK SE' utiliza como terminal de transmi-
sian de datos y el RC7/RXIDT como terminal de recepci6n de datos.
Los registros asociadas al modulo USART/SCI son:
• SPBRG: Generador del ratio de baudios.
• TXSTA: Estado de transmision y control.

169
CompUador CCCS VSimulador PROTEUS para Microcontroladores PIC

• RCSTA: Estado de recepcion y control.


• TXREG: Registro de datos de transmisi6n.
• RCREG : Registro de datos de recepci6n.
• PlRl : Flag de interrupcion.
prE1 : Habilitacion de la interrupcion.

Reglstro TXSTA (dlrecclon RAM: 98hl [PICI6F87x]

Rm-O Rm-O RiW-O RfW-O U-O Rm-O RIW-O R/W-O


rlc~s~.~c--rIT~X~,~-r.IT~X~E"~-r.ls~y~"c~'lIIIIIr.~'~G~H--lrT~'~~~-lrT~X~'D~'
8117 SilO

Figura 3. El reglstro TXSTA

bit 7: CSRC: Bit de seleccion de la fuente de reloj.


E.n modo asincrono no interviene.
En modo sincrono:
1 = Modo maestro (genera seRal de reloj mediante BRG).
0= Modo esdavo (fuente de reloj exterior).

bit 6: TX9: Bit de habilitacion de 1a transmision de 9 bits:


1 = Transmision de 9 bits.
0- Transmision de S bits.
bit 5: TXEN: Bit de habilitaci6n de 1a tr.. nsmisiOn:
1 - Transmision habilitada.
0"" Transmisi6n deshabilitada.

bit 4: SYNC: Bit de seleccion del modo del U5ART:


1 - Transmisi6n sincrona.
0 - Transmision asincrona.
bit 3: No implementado. Se lee como O.

bit 2: BRGH: Bit de seleccion del valor de baudios.


Modo asincrono:
1 - AHa velocidad.
0 - Baja veloodad.
No se utiliza en el modo sincrono.

170
7. TransmisiOn serie

bit 1: TRMT: Bit de estado del registro TSR :


1 - TSR vado.
0= TSR lleno.

bit 0: TX9D: 9 bit de datos transmitidos. Puede ser el bit de paridad.

TXREG
TX9=1 1 bit i
~.-- .. -.. -.... - -.. 1 6 bit
IREGISTRO DE DESPlAZAM!ENTO DE SALID~

Figura 4. Esquema de' proceso de trilnsm'sion

El USART puede configurarse para transmitir 8 0 9 bit de datos configurando el


bit TX9 del registro TXSTA . Si se utiliza el fonnato de 9 bits, el noveno bit debe
colocarse en el bit TX9D del registro TXSTA antes de escribir los 8 bit en el registro
TXREG. Una vez estan todos los bits en dicho registro, son transferidos al registro
de desplazamiento de transmision (TSR). Desde alli son transmitidos al cicio de
reloj por el pin TX comenzando par el bit de start y terminando por el bit de stop.

BII stan Bil slop

Figura S. EI envio de 'illS tramils

Reglstro RCSTA fdlrecclon RAM: 18hl [PIC16F87xj


RlW< RlW< RlW< RlW< u< .< .< .<
SPEN I RX9 I SREN I CREN _ FERR I OERR I RX90 I
B", 6110

Figura 6 . EI registro RCSTA

bit 7: SPEN: Bit de habilitacion del puerto serie.


1 = H abilitado (RXIDT y TX/CK como puerto serie).
0" Deshabilitado.

171
Compilador CCCS YSimulador PROTEUS para Mlcrocontroladores PIC

bit 6: RX9: Bit de habilitaci6n de la recepcion de 9 bits.


1 '" Recepcion de 9 bits.
0", Recepcion de 8 bi ts.

bitS: S REN: Bit de habilitacion de recepci6n sincrona.


No utilizado en modo asincrono.
Modo sincrono:
1 '" Recepdon {mica habilitada.
0'" Deshabilitada. (Se pone a 0 despues de una recepcion
completa).

bit4: CRE N: Bit de habilitacion de recepcion continua.


Modo asincrono:
1 = Habi litada.
0", DeshabiJitada.
Modo sincrono:
1 '" Habilitada hasta que el bit C REN es puesto a O.
0 - Deshabilitada.
bit 3: No implementado. Se lee como O.

bit 2: FERR : Bit de error de trama.


1 '" Error (Se actualiza alleer RCREG).
0 " No error.
bit 1: OERR: Bit de error de ovcrmll/.
1 = Error (Se pone a 0 si CREN es 0).
0= No error.

bilO: RX9D : 9 bit de datos transmitido

~EGISTRO DE DESPlAZAMIENTO DE ENTRADA I


~

,., ,.,
......... ... ... .

Buffer 0

RX9=1 I RX9D I RCREG


••
.............. .

Figura 1. EI esquema del proceso de lit rlKepc:lon de datos

172
1. Transmisi6n serie

EI U5ART puede oonfigurarse para recibir 8 0 9 bit configurando el bit RX9 del
registro RCSTA. Despues de 1a detecdon del bit de start, los 8 0 9 bits entrantes
por el pin RX son desplazados par el registro de desplazamiento de entrada (RSR)
uno a uno. Oespues de que el ultimo bit ha side desplazado dentro, el bit de stop
es testeado y el dato (el paquete de bits) es transferido a un bllffer el coal. a su vez,
10 transfiere al rcgistro RCREG si esta vado. E\ bllffer y e\ registro RCREG forman
una FIFO de dos elementos (el primer dato que entra esel primer dato que sale). En
el caso de transmision de 9 bit, el noveno bit pasa la bit RX9D del registro RCSTA
del mismo modo que los olros 8 pasan al registro RCEG.

Algunos dispositivos tienen un USART modificada, Hamado AUSART 0 USART


direcciOllable, que permite filtrar automaticamente dertas transmisiones. Los datos
recibidos son separados en dos categorias, direcci6n y datos, que se indican por
el noveno bit. 5610 los bytes de direcci6n son procesados por el U5ART, los datos
son ignorados. Este echo se utiJiza normaJmente ruanda hay varios dispositi vos en
un bus y las transmisiones se direccionan a uno en concreto. Los dispositivos que
reciben la transmision ignoran todos los bytes de datos can el novena bit a 0 y sOlo
reciben los bytes de direccion can el noveno bit a 1. Cuando se recibe el byte de di-
reccion y coincide, el dispositivo puede pasar a recepcion normal y recibir el resto
de los datos. En este tipo de dispositivos el bit 2 del RCSTA es:
bil3: ADDEN: Bit de habililaci6n de deteccion de direcdon
l=Habilitada (5610 si RX9=l)
(F.Deshabilitada

~REGISTRO DE DESPlAZAMIENTO DE ENTRADAJ

ADDEN=l
RX9=1 TEST .Carya solo si 1
00

.\ .'
0
0

...
0'0

0
0 0
0 , 8 bit
,.
\ 0
0
0
0


Buffer 0
~
~
RX9D RCREG

Figura 8. Esquema del proceso de rec=epclon e n los AUSART

Reglstro SPBRG (Ox991 [PIC16F87x]


La velocidad de comunicacion se controla por el valor cargado en este registro.
Genera el reloj que pennite Ja comunicacion. La velocidad se expresa en baudios
(bit/s).

173
Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC
-------
En modo asincrono:

BRGH=O (baja velocidad) BAUDIOS = lose


64· (SPBRG + I)

BRCH..l(alta velocidad) BAUD/OS = lose


16· (SPBRG+ I)

En modo sincrono: BA UDIOS == Jose


4· (SPBRG + 1)

Siempre hay que considerar un margen de error.

7.2.2 EI modulo USART en C


Configuraci6n generica del USART:
#USE RS232 (opdones)
Esta directiva permite configurar varios panlmetros del U5ART: velocidad de trans-
mision, pins utilizados, etc. Se puede modificar en cualquier parte del programa
pero siempre despues de haber definido la di rectiva ;US£ DELAY. Esta directiva
habil ita el usa de tunciones tales como GETCH, PUTCHAR Y PRINTF. Permite su
usa en dispositivos que no poseen m6dulo USART mediante software USART.
Cuando se utilizan dispositivos can U5ART, si no se puede alcanzar una tasa de
baudios dentro del ~% del valor deseado utilizando la frecuencia de reloj actual, se
generara un error.

8AUD=X Velocidad en Baudios.


XMIT=pin Pin de transmisi6n.
RCV=pin Pin de recepcion.
Usa un software UART software en lugar del hard-
FORCE_SW ware aun cuando se especifican los pines del hard-
ware.
Hace que la fundan GETC() ponga a cero el WDT
RESTART_WDT
mientras espera u!1 caracter.
Permite velocidades de transmisi6n bajas en chips
BRGHlOK que tienen problemas de transmisi6n.

174
7. Transmision serie

EI pin especificado esta ra a nivel alto durante la


ENABLE=pin transmisi6n. Utilizado en transmisi6n 485.
Permite depuracion a traves del/CD. El pin por de+
DEBUGGER fecto es el 83; usar XMIT y Re V para cambiar el pin
(debe serel misma en ambos).
Provoca que la fundon GETC() barre el WOT si es+
RESTART_WDT
pera un caracter.
mvierte la polaridad de los pines serie (normalmen-
te no es necesario con el convertidor de nivei, como
INVERT el MAX232). No puede usarse con el USART inter-
no.
PARITY=X Donde X e5 N, E, u O.
Donde X es 5-9 (no puede usarse 5+7 can el USART
BITS =X interno).
FLOAT_ HIGH Se utiliza para las salidas de colector abierto.
lndica a1 compilador que guarde los errores recibi-
ERRORS dos en la variable RS232_ERRORS para rcstablecer-
los ruanda se producen.
No se puede utilizar con USART interno. Provo-
SAMPLE_EARLY ca que el nluestreo del data a traves de la fundon
GETC() se realice al p rincipio de un bit de tiempo.
Para FLOAT_HIGH y MULTCMASTER, este pin se
usa para leer la senal de retorno. Par defecto, para
RETURN:pin
FLOAT_HIGH es XMIT y para MULTCMASTER es
Re V .

Usa el pin de RETURN para determinar si otro mas-


ter en el bus esta transmitiendo al mismo tiempo. Si
se detecta una colision, el bit 6 se pone a 1 en RS232_
MULTCMASTER ERRORS Y todos los posibles PUTCO son ignorados
hasta que el bit 6 este a O. La senal es comprobada
a1 final y al principia de cada bit de tiempo. No se
puede utilizar con USART interno.
Permite manejar INTI6 a las funciones GETCO y
LONG_DATA
pureo. En formatos de datos de 9 bits.
Provoca la deshabilitacion de interrupciones cuan-
D1SABLE_INTS do se ejecuta GETC() y PUTC() evitando distorsio--
nes en los datos.

175
Compilador C CCS y Simulador PROTEUS para Microconlroladores PIC

STOP=x Numero de bits de stop (por defecto 1)


Para establecer el tiempo que GETCO espera un ca-
TI:MEOUT",x racter (en o1s). Si no se recibe caracter en este tiem-
po, el RS232 ERRORS se pone a O.
Provoca una linea RS232 en modo esclavo sincro-
no, hacienda la patilla de recepcian como entrada
SYNC_SLAVE
de reloj y la de transmisi6n como entrada/salida de
datos.
F'rovoca una linea RS232 en modo maestro sincrono,
SYNC_MASTER hacienda la patilla de recepdon como salida de reloj
y la de transmisi6n como entrada/salida de datos.
Provoca una linea RS232 en modo maestro smcrono
en modo continuo, hacienda la paliUa de recepdon
SYNC_MATER_CONT
como salida de reloj y la de transmision como entra-
da/salida de datos.
UART] Configurar 1"1XMIT Y RCV para el USART1.
UART2 Configurar el XMIT y RCV para 1"1 USART2.

Ejemplos:
#use delay (clClCk-20aaOOO) ;
#use rs232 (BAUo-9600 XMIT-PIN c6 RCV-PIN_ C7 , BITS-B)
luse rs232 (BAUD-9500 XMIT_PIN_A2 RCV"'PIN_A3)

setup_ ua.rl{baudJ
baud es una constante que define la velocidad . Un 1 enciende el USART y lm 0 10
apaga. Can cualquier valor de velocidad, el USART se enciende. En dispositivos
que utilizan AUSART se admiten los sigu ientes parametros;
UART_ADDRESS UART: 5010 acepta datos can 1"1novena bit a 1.
UART_ DATA UART: acepta todos los datos.

set_uart_speed (baud)
Identica a la funcion anterior.
II 5e estJblece 1~

s ...itCh ( .l.nput_ b()• 3 ) ,


velocid~d medi~nte l~ combin~ci6n de las pat111as 80 y 81

cllse 0 set_uart_ speed(2400) ; bceak;


Cllse 1 "et_uart_"peed(4800) ,. break,.
c~"e 2 set_ uact_ speed {9600J ; bceak ;
case 3 set_uart_speed{l9200J ; bre .. k;

176
7. Transmisi6n serie

Transmision de datos:
pute (edata)

putehar (edata)
cdala es un carader de 8 bits. Esta fu ndon envia un cank ter mediante la patilla
XMlT. La direcliva #USE RS232 debe situarse siempre antes de utilizar esta fun-
cion.

puiS (string)
siring: cadena de caracleres constante 0 matriz de caracieres terminada con un O.
La funcion pI/IsO manda los caracteres de la cadena, uno a uno, a traves del bus
RS-232 utilizando la funcion PUTC(); detnis de la cadena envia un RETURN (13) Y
un retorno de carro (10).

printf (fnarne, cstring, values...)


cstring: es una cadena de caracteres (constante) 0 matriz de caracieres term inada
con un O.
!Jlame: las funciones a utilizar para escribir la cadena indicada; par defecto se utiHza
la funcion PUTC(), que permile escribir en el bus RS-232.

va/lies: valores a indulr en 1a cadena separados por comas; se debe indicar %nt. EI
Formato es %nl, donde n es opcional y puede ser:

1-9 para especificar ruantos caracleres deben ser es pecificados;


01-09 para indicar la cantidad de ceros ala izquierda;

1.1 - 9.9 para coma flolanle.

t puede indkar:

, Car.icier.
5 Cadena 0 canicler.
u Entero sin signo.
d Entero con signa.
Lu Entero largo sin signa.
Ld Entero largo con signo.
x Enlero hexadecimal (minlisculas).
X Entero hexadecimal (mayusculas).

177
Compilador C CCS YSimulador PROTEUS para Mlcroconlroladores PIC

Lx Entero largo hexadecimal (minusculas).


LX Entero largo hexadecimal (mayusculas).
f Flotante con truncado.
g Flotante con redondeo.

• Flotante en formato exponencial.


Entero sin signo con decimales insertados. La 11 cifra indica el total, 1a 2-
w
el numero de decimales.

Recepci6n de datos:

value=getcO
value=getch O

value=getcharO
va/lie es un caracter de 8 bits. Espera recibir un caracter por la linea RS-232 y de-
vuelve su valor. En los dispositivos con USARTinterno, se pueden almacenar hasta
tres caracteres; para evitar esperas se puede usarla fundon KBHIT().

valor = kbhitO
valor es 0 (FALSE) si GETC() debe esperar a que Begue un caracter; 1 (TRUE) si ya
hay un caracter listo pard ser leido por la funci6n CETC().
Ejemplo 1 : Elluiar los datos del 0 a/l0, ell modo as/llerono, entre dos PIC. VisualiUlr COli
1111LCD los datos enuiados y los datos recibidos: In recepcioll del dnto deberti ser por illter-
rtlpcioll dd USART. (ver figura 10). COif/poI/elites ISIS: PIC16F876 y LM016L. illstm-
lIIentos: VIRTUAL TERMINAL.
'include <lfiF876.h>
,roSES XT,NOWDT
'use delily(clodc-4000000)
'use rs232(bilud-9fiOO , xmit"'Pln_C Il, rc_pln~c7J
'include <LCD.C>

void main {J {
int Villar;

while (lJ {
for (valcr"O;valor<_10;valor..o-+)
PU'1'C(val0r } ,

178
7. Transmision serie

print! (lcdJutc , M\fenviando-tlD ", VALOR) ;


delJ y_ma(SOO) ..

Figura 9. Programa PIC_ 1 del eJemp!o 1

tf' --- ···..·


-- -
~,

1;;=
Alphanumeric LCD

~
Ienviando=9
I
C

:S"~":::~ m
..c1lT'0ISIa':r'! .

~:i l' . ...


Ii ... Bofl81l1!i!!i
.' . . .. .
~ :

~,-
~

~- It~=

I.~
r---'
f-'-
f-'-

tl:u!,,_
£::::::
-- ··

-
q,

:=
-_.... _.......- I
Alphanumeric LCD
CC02

I
~~
recibiendo=9
~-. q,-
~
,"'" .,
~~~
m II. .....
Bofl8!!!S
~
~

~-
~
, 'I' I, ... . .
. ..
~

,• ~-
It~=

-~ -.~~.~ .
Figura 10. EI ejemplo 1
linclude <16F876 . h>
IFUSES XT , NOWDT
luae delay(clock-4000000}
luse r s232 (baud-9600 , xmi t -pin_ c6 , rcv-pin_c7 , bi t s-B}
linclude <LCD . C>
IBYTE TRIS A-Ox85

179
Compilador CCCS YSimulador PROTEUS para Microcontroladores PIC

'BYTE PORTA - OXOS


int valor ;
lint_RDA
RDA_ isrO

v"lo~ -GETC(} ..

void /lliJin (J
bi t_clellr (tRISA , OJ;
lco:"'init () ,-
enable_interrupts (HIT_RDM ;
enable_ interrupts (GLOBAL) I
for ( ;1 ) I
1cd_ 90toxy (1,1) ;
print f (l cd_pute, ~recJ.biendo-'l D v.1)or) ;
N
,

Figura II . Program.. PIC_2 del ejemplo ,

Can el programa VIRTUAL TERMINAL (baton derecho: Hex display mode) se pue-
den visualizar los datos del bus serie (figura 12).

Figura 12. VIrtual Termln~1

7.2.3 La norma RS232


La norma RS232 es la mas habitual en la comunicacion serie. Basicamente comu-
nica un equipo terminal de datos (DTE 0 Data Termillal Equipmellt) y e1 equipo de
comunicacion de datos (DCE 0 Data Commllllications Equipment).

Las caracterislicas eh~ctrica s de la senal en esla norma establecen que la longitud


maxima entre el DTE y el DCE no debe ser su perior a los 15 metros y la velocidad
maxima de transmision es d e 20.000 bps. Los niveles J6gicos no son compatibles

180
7. Transmisi6n serie

TTL, deben situarse dentro de los siguientes rangos: 1 logico entre -3V y -15V Y 0
logico entre +3V y +15V. Se utili zan conectores de 25 patillas (DB 25) 0 de 9 patillas
(DB 9) siendo asignado el conector macho al DTE y el conedor hem bra al DeE.

Para una comunicao6n fill! duplex desde el USART del PIC, se debe conectar un
minima numero de seflales, TXD y RXD asi como 1a masa (GND ). Los PIC utiJizan
senal ITL en el modulo USART por 10 que se debe utilizar un conversor de nivel a
RS232, como el A1AX232.

RX

NlVElESTn. NIVEl.ES RS232

Figura 13. Conexion baslca full duple x entre PIC y PC

En la mayana de los PC actuales, sabre todo ellos portatiles, estan desaparedendo


los puertas serie. Como solud6n se pueden utilizar cables de conversion SERIE-
USB que utilizan el Ulliversal Serial Port (USB), no se debe confundir con 1a utiliza-
don del m6dulo USB integrado en el PIC con gestion de comunicacion USB (ver
la figura 14).

BUS USB BUS USB

DISPOSITIVO
INTERFAZ
SERIE·USB
1----'"
BUS
SERlE PIC PIC

Figura 14. Dlferencla e ntre un convertidor serle-usb y un m6dulo USB integrado

Estos cables (ver la figura 15) se hasan en integrados como el F7232BM de FrDJ
chip (figura 16) (llffp:llwwwjtdichip.comIPradlictsIFT232BM.htm). En la propia Web
del fahricante se pueden e ncontrar los drivers para la configuraci6n de Windows
(figura 17) y los d iseiios de un sistema de conversion SERlE-USB.

181
Compilador CCCS y Simulador PROTEUS para Microcontrotadores PIC

Flgu,;, 1 S. Cable SERIE-USB


Figura 16. FT231BM

' ll_
• ~-" • .-M
• . . - . . ... ,001

I ·v--.........,...,
, , _ _ /'04a.O

:~~. . . tuo .." .........


·Id-· ......
_._,"'. . . .*,.'r_
, .,j~.a'l""1W'I
,.~~

,5~do-
. ..r

...-.. .........
'~f_
, ..

.~-
,
IIM~Sq>oI_

)-,-.--,..,..
_ .I ........ !«O<Illl'T)
.1-'-"'_«""')
.I~9~!JtP1L)
::£w _ _ (cOM!l
'4J~
· ..Jt..-do <110>
· ""....,.,..do_.

Figu,;, 17. Unlversitl Seriitl Port

EI/ SIS del PROTE US proporciona un potente componente que permite la simula-
ci6n a traves del puerto serie: COMPIM (figura 18).

182
7. Transmislon serie

P3

_.
O ~O

Figura 18. EI componente COMPIM

Utilizando este componente no es necesario anadir al esquema del PIC un MAX232,


ya que el propio componente gestiona la comunicaci6n can el puerto del Pc. Utili-
zando este componente podemos comunicamos con el propio PC (si tiene 2 puer-
tos serie a 1 puerto sene y un puerto USB -utilizando el convertidor- como pode-
mas ver en la figura 19) y manejar los datos que proceden del PIC can rualquier
programa de aplicacion (Vis/lal BASIC, Visual C, etc.).

COM1 CABLE SERlE


COM2 HEMBRA-HEMBRA

CABLE
HEMBRA.HEMBRA
+ USB-SERIE

Figura 19. Lits conexlones serle-serie ° serie-c..sb

183
Compilador CCCS YSimulador PROTEUS para Mlcrocontroladores PIC

La conFiguraci6n del puerto se realiza como en cualquier componente y se pueden


cambiar practicamente todas las propiedades de un puerto serie: numero de puer-
to, velocidad, paridad, nu.mero de bits, etc. (ver la Figura 20).

,~.
VSM Mcdol
~~ ~-M
roM'
"""'""
PIpc.tIs-lAft" ',i.oo
""'.
~OotaB..:

~,
:f-t>:joAi

'mM
~P"'"
V_B-..dR... "~..oo- :Ho;loAi
V_OotaBb
• :H.-AI
,Ho;loAi
VIIWI P.,q
'"'"

E..,.,..""'"i...........
E!d.do_
EdI,, _ __ PCB~."...

Figura 20. ConRgurac:l6n COMPIM

Ejemplo 2: Ellviar los dntos de lI/1a COllversion AD al puerto serie de 1111 PC (Figu ra 21).
Compol/elltes ISIS: PIC16F876, COMPJM, POTLIN Y LM016L. lllstrumell/os: DC VOL-
TMETERy VIRTUAL TERMiNAL.

Para probar este ejemplo se pueden utilizar dos PC a un PC con das puertos serie 0
un PC can un puerto serie y un puerto USB (utilizando un cable SERlE-USB).

Para observar los datos que envla el PIC se utiliza un COMPIM y tambien se puede
utilizar un COMPIM para leer los datos que entran por el PC 0, en este casa, utilizar
el HyperTermillal de Windows 0 cuaJquier otro programa emulador del puerto serie.

Por el Virtual Termillal se put"den comprobar los datos de salida y entrada. En este
casa se han conectado los dos puertos serie del PC (COMl y COM2 con un cable).

Se puede utilizar el HyperTerminnl de Windows (Accesorios/Comlllliraciollt'sIHyperTer-


minal), configunindolo segun las siguientes figu ras: Figura 23, Figura 24, figura 25,
Figura 26 y la Figura 27. En este caso se han conectado el puerto COM1 del PC y un
USB configu rado en COM6.

184
,~,

Figura 21 . EI ejemplo 2

Figura 22. VI"u;)1 Terminal de salida ,COM I J Y entrada ICOMZI: las panuUi'ls son Idenlials

185
Compilador C CCS y Simulador PROTEUS para Microconlroladores PIC
---

-~
Ii.-odo
~
...
CoNcUr_ CIlNl _ _ _ _ _ _ _":.,

Figura 24. La seleccion d e l pLlerto (COM I en e l PROTEUS y COM6 en el HyperTermlnal)

ell"", _ _ " " '• • • • •


...... 1*- •

FigLlra 25. La configLlracion dt!'! puerto

-
---
--.- .," ,

FlgurOil 26. EI tomando An:hivofPropiedades parOil modlflear la vfsLlaliziJdon

186
1. Transmisi6n serie
-------------------------------

C-.'-_
- ....-. --
.. !."'....... -
~
!"""" .....-

--. .. -........---
r .[..... _ _ _ _


.-~

..... ---.- . -
l ..... ..,...... iDI
~-_ _ I&01 ..
"-"-
' ____ ,1oft

1_. -.:,. .; ;. ,
r: ~_._ . _

~, ...

F'guril 27. Activar ~Agregar aViln(e de lineil... -

•• •

Figura 28. La simulildon entre PROTEUS y el PC utUlz;lndo el HyperTermln;l1

187
Compilador CCCS YSimutador PROTEUS para Microcontrotadores PIC
-----
'include <16F871 h>
'device adc-lO
IFUSES XT,NOWDT
luse delay(clock-4000000}
fuse cs232(baud-9600 , xmit-pin_c6, ccv-pin_c7, bits-8, pilcity-N}
bnclude <LCD.C>

void main ()
int16 q;
noat p;
setup adc_pocts (AND);
setup_ildc IADe_CLOCK_INTERNAL};
lcd_ init (J:
for (:;) {
set_oldc_channel (0) i
delay_ us(lO};
q .. read adc(}.
p" 5.0 · q I 1024.0;
print£{lcdyutc, "\£ADC - ~41d", q};
printf(lc~Jutc, "\nVolt"ge .. tOl .2EV", p);

pc1nt£("ADe - i41d ", q);


printf("Voltage" IOl . 2£Vlr", p}; II Ir permite cilmbiar de 11nea.
delay_ms(lOO} ;

Figlolr.. 29. EI program.. del ejempto 2

Ejemplo 3: Elluiar 1111 data desde el PC al PIC por e/ pl/erto serie. CUQndo 10 reciba debe vi-
sualiwrfo ell 1m LCD y ellviar la palabra "recibido" af PC Emplear illterrllpcio'les (figura
31). CompollelltesISfS: PIC16F876, COMPIM Y LMD16L.
'include <16F876.h>
'FUSES XT,NOWDT
'use delay(clock-4000000)
'use rs232(baud-960Q, ~~it-pin_c6, rcv=pln_c7, bits-8, parlty=N)
linclude <LCD.C>

chiJC ch;

lint_cd"
void serial isrll {
ch-getch"r{J i
PUts (HRecibido H
);

188
7. Transmision serie

void tn<Iin()

lcd_init () ..
en"ble_inteccupt3 (glob"l) ..
enlwle_!ntercupts (int_cd,,) ;
while (1)
printElled puCe , ~ \n\r V"loc lc .... ,ch);

Figura 30. EI programa del ejemplo 3

n.= --- ·· ':.,.~. ·

-- ---····
---- Alphanumeric LCD

-
"",
. ~

--_. 0'- Ing ... Uil ler I


--
~

"I, ., . ........
'IC''''~
8<i811~1!!!15

~
~
.,!
~.-
-=

"
'-.~
.
.~

-
:::
OM

0.""",,0

--_. -.-~-

Flguriil 31. Elejemplo 3

.-.. ~
o E_Ifl,._"""I;.o...,..,.. .. _
!2lE«>,. ... cor _ _ ........

--
"--
R......... _ 0

,
!II_~'OI

EJ ..ro-......,. do _.fNI dO __ IInN>ed><Io

Cl ......... <·_~"-...sOI .. 7t.t.


0~1- ____ . _.. --.I

I~II~J Figura 32. Configuraclon del HyperTermln;!l1 para


Envll'lr/Recibir

189
Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC
-----
•• • •••
I~

-" =

Figura 33. Comuni(ad6n full duplex (on el PC

7.3 Puerto serie sincrono (SSP)


Los dos modos de trabajo son:
• Interfaz serie de perifericos (SPl): Des.'lrrollada por Motorota para la comu-
nicacion entre microcontroladores de la misma 0 diferente familia en modo
maestro-esclavo. Full-duplex .
• lnterfaz Inter-Circuitos (PC): Interfazdesarrollado por Philips, con gran capa-
cidad para comunicar microcontroladores y perifericos. Half-dllplex.

7.3.1 Interfaz Inter·Clrcuitos WCJ


EI bus FC se basa en la comunicacion a traves de 2 hilos. Cada dispositivo co-
nectado al bus tiene una direccion. Puede configurarse como comunicad6n de un
maestro y varios esdavos 0 una configuration MlIltimaestro. En ambas configura-
ciones, el dispositiv~ maestro es el que tiene la iniciativa en la transferencia, decide
con quien se realiza, el sentido de la misma (envio 0 recepc:i6n desde el punta de
vista del maestro) y cuiindo finaliza. Cuando el maestro inicia una comunicacion,
primero transmite la direcci6n del dispositivo con el wal se quiere comunicar y los
escJavos comprueban si la -direction concuerda con la suya. La transmision puede

190
7. Transmision serie

ser de lectma 0 escritura, el ultimo bit de la direccion 10 indica; asi el maestro estara
en transmisibn y el esclavo en recepcion 0 viceversa. En cualquier caso la selial de
reloj la genera el maestro.

Los dos hilos del bus Fe son dos Iineas de colector abierto: la senal de reloj SCL
o pin RC3 y la Imea de datos SDA 0 pin RC4. Se deben utilizar unas resistencias
extemas 0 de pull-up para asegurar un nivel alto cuando no hay dispositivos conee-
tados al bus.
EI numero de dispositivos conectados y la longitud de conexion estan limitados
par la capaddad de direccionamicnto (de 7 a 10 bits) y par la maxima carga del bus
(400 pF). La velocidad maxima estandar es de hasta 100 Kbps, la rapida hasta 400
Kbps y la Alta hasta los 3.4 Mbps
-
\ 1-
1\
, ~.
J.,[
!•
~
t ~ .\(l(IoJ-:

« • .oOC>.)':
)'!~STE"
OC,

T
==
"I"
,I
"
I
"" - C8.!S

Figura 34. Calc:ulo del valor de R. en funcf6n de la capllcfdad y


velocldad del bus ,cortesill de Sn
La transmisi6n se inida con un bit de inicio 0 START Y termina con el bit de nllaH-
zacion a STOP. STARTse establece can una transici6n de alto a bajo en la linea SDA
(normalmente a nivel alto) cuando la linea SCL esta a nivel alto. STOP se establece
cuanda se produce una transici6n de bajo a alto en la linea SDA cuando SeL esta
a nivel 31toi de esta forma los datos en la linea SDA s610 cambian en el estado bajo
de la linea SeL (figura 35).

START STOP

50A

5e,
5 p
CAMBia DE DATOS

Figura 35. Condiciones de III transmisl6n

191
eompilador e ees y Simulador PROTEUS para Microcontroladores PIC

Al inidar la transmisi6n, el master envia la direccion del esc1avo con el que desea
establecer la comunicacion. La direcci6n pllede ser de 7 0 10 bits con fonnato de
byte (uno 0 dos bytes respectivamente). Tras la direecion se adjunta un bit de lec-
tura/escritura (figura 36).

DIRECCION DE 1 BITS

DlfKCl6ro de t bit, de! Esd."o


OIRECCION DE 10 BITS

FigurOi'l 36. Los formatos de direc:ci6n

Una vez el master envia la direccion (0 datos), el esdavo genera un bit de reco-
nocimiento (ACK), si el master no reeibe este bit la comunicaci6n se interrumpe,
generando la sena] de STOP. EI maestro tambien puede recibir datos, en este caso
es el quien genera la senal de reconocimiento para cada byte recibido menos para el
ultimo, en este caso el esclavo libera la Ifnea SDA y el master genera un STOP.

Existe la posibilidad de que el master, tras una transmisi6n/recepcion, no abando-


ne el bus y siga en comunicaci6n con el esc1avo; en esta ocasi6n genera una nueva
condici6n de START, Hamada START REPETlDA (Sr), identica a la anterior pero
desput's de un pulso de reeonocimiento.

En los PIC de Ia garna media existen dos mOdulos que permitcn realizar una comu-
nkad6n PC, el BSSP (Basic Sy"cilrollolls Serial Port) y el MMSP (Master Sync/ITo/lOlls
Serial Port), y se diferencian en modo de trabajo maestro. EI m6dulo MSSP permile
detectar condiciones de START y STOP por interrupcion. Este m6dulo puede tra-
bajar en tres modos:

• Maestro.
• Esclavo con direcci6n de 7 bits.
• Esc1avo con direcci6n de 10 bits.
Los registros asociadas a este mOdulo son seis: SSPCON, SSPCON2, SSPADD,
SSPBUF, SSPSTAT Y eI SSPSR.

192
7. Transmisi6n serie
-------------------------
Reglstro SSPSTAT (direccion RAM: 94hJ [PIC16F87x]
_-0 -< '-0 .< .< .< .< .<
1SMP ! eKE ! DIA [P [s [RIW [ UA [.F [
BII1 SltO

Figura ~7. EI reglrtro SSPSTAT

bit 7: SMP: Bit de muestreo.


SPI en modo maestro:
I - EI data se muestrea al final de cicio.
0", El data se muestrea en el media del cicio.
SPI en modo esclavo:
SMP debe ponerse a '0' ruanda se trabaje en modo esclavo.
PC en modo master a esdava:
1 "" Deshabilitacion del control Slew mte para una velocidad
estandar (100 kHz i 1 MHz)
0: Habilitacion del control Slew rate para alta velocidad (400 kHz)

bit 6: eKE: Selecdon de f1anco de relaj en modo SPI.


CPK - O
1 - El data se transmite en el f1anca de subida de CKS.
0 .. El data se transmite en el flanco de bajada de CKS.
CKP'" 1
1 "" EI dato se transmite en el flanco de bajada de CKS.
0 .. El dato se transmite en el flanco de subida de CKS.
PC en modo master 0 esclavo:
1 = Niveles de entrada conforme espedficadones 5MBUS.
0= Niveles de entrada conforme especificaciones p.c.

bit 5: D/A : Bit de datosl direccion (solo en el modo rq.


1 "" Indica que el ultimo byte redbido 0 transmitido era un data.
a = Indica que el ultimo byte recibido 0 transmitido era lIna
direction.

bit 4: P: Bit de Stop (sOlo en el modo rq.


1 - Indica que ha side detectada una condid6n de Slop.
a - No se ha detectado la condicion de Slop.

193
Compitador CCCS YSimulador PROTEUS para Microcontroladores PIC
-----
bit 3: 5: Bit de Start (s610 en el modo FC).
1 - Indica que ha sido detectada una condid6n de Start.
0 - No se ha detectado 1a condid6n de Start.
bit 2: RIW: Bit de Leetural Escritura (sOlo en el modo FC). Este bit retiene 1a
informacion de lectura 0 escritura despues de la ultima deteccion de di-
reecion correcta. 5610 es valida desde la confirmacion de direccion hasta el
siguiente bit de Start, Stop 0 no ACK.
En PC modo esclavo:
1 "" Lectura.
0'" Escritura.
En PC modo master:
1 = Transmision en progreso.
0 - Transmisi6n en no progreso.
bit 1: UA: Actualizacion de directi6n (solo en el modo FC de 10 bits).
1 '" Se necesita una actualizaci6n de direcdon en el registro SSPADD.
,
0- La direcci6n no necesita una actualizaci6n.
bit 0; BF: Bit de bllffer lIeno.
Recepcion (modos SPI e r-C):
1'" Recepci6n completada, SS PBUF esta Ueno.
0'" La tecepci6n no ha finalizado, SSPBUF esta vado.
Transmisi6n:
1 .. Transmisi6n en proceso, SSPBUF IIcno.
0- Transmisi6n completa, SSPBUF vado.

Reglstro SSPCON (dlreccion RAM: 14hJ [PICI6F87xj


""'~ ""'~ ""'~ ""'~ ""'~ RIW~
""'~ RIW~

I S$POV I sspeN I I S$PMl I SS PM l I SS PM1 I SPMO


weol
""
CKP

" .
Fig"r .. 38. el registro SSPCON

bit 7: weOL: Bit de detecci6n de colisi6n.


Modo master:
l - Se ha produrido una escritura en SSPBUF sin que las condidones
del PC sean validas.

194
7. Transmisi6n serie

0", No hay colision.


Modo Esdavo:
1 = EI registro SSPBUF ha sido escrito mientras se realizaba una
transmision previa.
0- No hay colision.
bit 6: SSPOV: Bit de overflow (debe ser borrado por software).
En modo SPI:
1 - Un nuevo data se ha redbido cuando aim no se ha leido e) dato
anterior almacenado en SSPBUF. EI dato del registro SSPSR se pier-
de y Sf' mantiene el anterior. 5610 se produce overflow en modo
esclavo.
o= No hay auerj1ow.
En modo PC:
I '" Un nuevo byte es recibido ruando aun no se ha leido el registro
SSPBUF donde se encuentra el byte anteriormente recibido.
0 - No hay overflow.
bit 5: SSPEN: Bit de habilitadon del puerto serie smCTono.
En ambos modos, los pines han de ser correctamente configurados como
entradas a salidas.
En modo SPI:
1 - Habilitaci6n del puerto serie y configuracion de los pines SCK,
SOD, SDI Y S5 como fuente del puerto.
0= Puerto serie deshabilitado y pines configurados como ElS.
En modo PC:
1 = Habilitaci6n del puerto serie y configuraci6n de los pines SOA y
SCL como Fuente del puerto.
0'" Puerto serie deshabilitado y pines canfigurados como E/5.
bit 4: CKP: Bit de selecd6n de la polaridad del relaj.
En modo SPI:
1 - EI estado de reposo para el reloj es el nivel alto.
0 - EI estado de reposo para el relaj es el nivel bajo.
En modo PC esclavo: (control de liberation de 5CK).
1 - Habilitacion del reloj.
0 - Mantiene el reloj en estado bajo.

195
Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC

bits 3:0 S5PM3:SSPMO: 5elecci6n del modo del modulo SSP.


0000 '" SPI, modo maestro, reloj = Fa;d4.
0001 = SPI, modo maestro, reloj = FoscI16.
DOlO .. SPI, modo maestro, reloj = F051:/64.
0011 = SPI, modo maestro, reloj = Salida del TMR2/2.
0100 ~ SPI, modo esclavo, reloj .. pin SCK, pin 55 habilitado.
0101 = SPI, mado esclavo, reloj = pin 5CK, pir.. 55 deshabilitado.
ruede usarse como pin de E/5.
0110 " PC, modo esclavo, direcdon de 7 bits.
0111 =- FC, modo esclavo, direcdon de 10 bits.
1000 " PC modo master, reloj"F .,.j14·(SSPADD+l)).
1011 = FC en modo maestro control ado por fimmure (esdavo inactivo).
1110 = PC en modo maestro controlado por firmware (direcci6n 7
bit con interrupcion de bit START Y STOP).
1111 = PC en modo maestro controlado par firmware (direcci6n ]0
bit can interrupci6n de bit START Y STOP).
1001, 1010, 1100, 1101 .. Reservado.

Registro SSPCON2 IdJreccion RAM: 91 hI [PIC16F87x).


RIW~ RIW~ RIW~ RIW~ RIW~ RIW~ R/W~ RIW-O
GCEN I ACKSTAT I ACKOT I ACKEN I RCEN I PEN I RSEN I SEN
Blt7 BltO

Figura 39. EI registro SSPCON2

bit 7: GCEN: Bit de habilitacion Hamada general (salo en modo PC esclavo).


I .. Habilita la interruption ruanda se redbe una lIamada general
(direccion OOOOh) en el 55P5R.
o- Deshahilitado.
bit 6: ACKSTAT: Bit de estado de reconocimiento (5610 en modo PC master).
En modo master transmision:
1 =No recibido ACK del esclavo.
0 .. ACK recibido del esclavo.
bilS: ACKDT: Bit de data de reconocimiento (5010 en modo PC master).

196
7. Transmisi6n serie

En modo master reeepeion: Valor que sera transmitido euando el usuario


inide una secuencia de reconocimiento al final de una recepcion:
I -No ACK.
0= ACK.

bit 4: ACKEN: Habilitacion secuencia de ACK (5010 en modo PC master).


En modo master reeepei6n:
1 = Inicia secuencia de reconocimiento de SDA y sa, y transmite
un ACKDT. Borrado por hardware.
0= Desactivado.

bit 3: RCEN: Bit de habilitad6n de reeepdon (s610 en modo I'C master).


1- I~eeepei on habilitada.
0= Deshabilitada.

bit 2: PEN: Habilitati6n de la secuencia de STOP (s610 en modo PC master).


I - Waa condidon de Stop en SDA y SCL Borrado por hardware.
0 - Deshabilitada.
bit 1: RSEN: Habilitacion del START repetido (solo en modo FC master).
1 = Wda la condidon de SR en SDA y SCL Borrado por hardware.
0= Deshabilitada.

bit 0: SEN; Habilitati6n del START (s610 en modo Fe master).


1 - lni<ia la condici6n de STARTen SDA y SCL Borrado por hardware.
0" Deshabilitada.
EI resto de registros son:
• EI registro SSPB UF (direccion Ram: 13h) es un bllffer de transmisi6n/recep-
ci6n serie: es el registro desde el cual se leen 0 escriben los datos a transmitir.
• EI registro SSP5R es un registro de desplazamiento SSP (no accesible directa-
mente). Desplaza el dato para transmitirlo 0 recibirlo. En una transmisi6n, el
dato se escribe desde el registro 5SPB UF, mientras que en una recepd6n, se
carga el dato de SSPSR a SSPB UF.
• EI registro SSPADD (direccion Ram: 93h) define la direcd6n del esdavo 0
los baudios de la comunicadon del master. En este registro se almacena la
direction del esdavo; en el modo de 10 bits primero se debe cargar el byte alto
(1111 0 A9 A80) Y despues el byte bajo (A7:AO).
Otros registros relacionados can el modulo MSSP son el T RISC (direcd6n Ram:
87h) para definir RC3 y RC4 como entradas. EI PIRl/PIEl (direcciones Ram:

197
Compilador CCCS y Simulador PROTEUS para Microcontroladores PIC

OCh/BCh) para la gestion de interrupciones (SSPlF/SSPIE). El PIR2IPIE2 (dire<:cio-


nes Ram: DOh/SOh) para la gestion de la interrupcion por colisi6n del bus (BCLIFI
BCLIE) Y eilNTCON (direcciones Ram: DBh/SBh/l0Bh/1SBh) para la habilitacion
de las interrupciones de perifericos.

7.3.1.1 12C en C
Configuracion generica del PC:
/tuse 12C (opciones)
Opciol!es: separadas par comas, pueden ser las siguientes:

MULTCMASTER Establece modo Multimaesrro.


MASTER Establece modo maestro.
SLAVE Establece modo esdavo.
SCL--pin Especifica el pin seL.
SOA:=pin Espedfica el pin SOA.
AODRESS-=nn Especifica la direcci6n en modo esclavo.
FAST Utiliza velocidad alta.
SLOW UtHiza velocidad baja.
RESTART_WDT Barra el WDT mientras espera una lectura.
FORCE HW Utiliza las funciones PC hardware.
NOFLOAT_HlGH No permite senales flotantes.
5MBUS Utiliza el bus en formato SM8US.
STREAM=id Asocia un identificar slream .

Esta directiva (pUSE 12C) tiene efecto sabre las funciones 12C_START, I2C_STOP,
12C_READ, 12C_WRITE e 12C_POLL. Se utilizan runciones software a menos que
se especifique FORCE_HW. EI modo esclavo 5610 puede seT usado con el mOdulo
ffsico SSP.
luse l2C(rtJ~ster, Sdii-PIN_BO, scl .. PIN_Bl}
luse I2C(sliive, sda_PlN_C4, scl-PIN_<=3, address-OxiiO, FORCE_HW)
'use l2C(m8stec, scl-PlN_BO, sda-PIN_Bl, £ast-4~ODOO)

Las runciones asociadas son


• 12C_ WRITE().
I2C_STARTO.

198
7. Transmisi6n serie

12C_READ().
12C_STOPO.
12C-,OLl() .
• 12C_ISR_STATE().
12C_S laveAddr().

12C_START();
En modo master, esta funcion inidaliza la transmision. Despues de la condidon de
Start, el reloj es puesta a nivel bajo hasta que sc escribe con la fundon 12C_WRITE().
Si se Uama a otra funcion 12C_START antes de un 12C_STOP se esta utilizando un
START repctido (Sr). Esta mndon dependera de la respuesta del esdavo.
i2c_suct () .. IIInicializacian de ia transml$l~n

12,,_ ",d te (Gx",O) .. /IDireccion del esclavo


i2c_ ",ri te (address) ,- //Datos a esclsvo
i2c_st<1rt () .. //Restllfct
j 2c_",d te (Oxllfl J .. //C",mbio a lectura
dilta-12c_rellfd(O) .. /IDaeos del esc1l!fvo a-1 master.
12r;_stop() .. //FinIlf1izllfcion de la- trllfnsmision

12C_STOP 0;
FinaJiza la transmisiOn.

12C_WRlTE(dato);
Data es un entero de 8 bits que envia por el bus. En modo master, esta funcion
genera la senal de reloj que marca la velocidad de transmisi6n del data; en modo
esdavo espera la senal de reloj que genere el maestro.
Devuelve el bit de reconocimiento ACK que envia el receptor ruanda la transmi-
sian ha terminado: 0 indica ACK 1 indica un NO ACK Y un 2 indica una colision
en modo multimaster.
El bit de menor pesor (Isb) del primer data transmitido tras un START indica el sen-
tido de la comunicadon (si el bit es "0", la informacion se transmitira de maestro
a esclavo).

date = 12C_READ([ACKl);
Data es un entero de 8 bits lefdo del bus. En modo master, esta fu ncion genera la
scnal de reloj; en modo esclavo espera la senal de reloj. No hay timeout por 10 que
se utiliza junto can 12C_POLL para prevenir bloqueos.
Opcionalmente se puede incluir un ACK donde 1 indica un ACK y un 0 indica un
NO ACK. Se puede borrar el Watchdog mientTas se espera a leer el dato, para eUo se
debe incluir la opd6n RESTART_WDT en la directiva #use i2cO.

199
Compilador CCCS y Simulador PROTEUS para Microconlroladores PIC

valor = 12C_POLL();
Se utiliza sOia si el PIC tiene m6dulo SSP. Devuelve un TRUE (1) si se ha recibido
el data en el buffer y un FALSE (0) si no se ha recibido. Cuando devuelve un TRUE,
la funci6n I1C_READO guarda el data leido.

12C_SlaveAddr(intB adr);
Se especifica la direcci6n del dispositivo en modo esclavo.

estado= 12C_ISR_STATEO;
Se utiliza sOlo si el PIC bene mOdulo SSP. Devuelve el estado del bus en modo es-
clava despues de una interrupci6n.
Estado es un entero de 8 bits:
0>= Indica direcci6n coincidente con un R/W a ce ra.
1-Ox7F - EI master ha escrito lm data, se debe utilizar J2C_READ(J.
OxBO = Indica direccion coincidente can un R/W a uno, responder con 12C_
WRITE().
Ox81-OxFF .. Transmisi6n termimda y reconocida, se responde con 12CWRlTE().

Ejemplo 4: Guardar y leer datos en las 10 prill/eras posiciolles de memoria de JIlin EE-
PROM Pc. Represelltar los va/ores escritos y leidos CI1 UII display LCD (figura 40). COI/I-
po"et/les {SIS: PIC16F877, M24512, RES Y LM016L.ll1strumellfos: 12C DEBUGGER.

12C

-.n v i~ndo'"8
-
rtGibil'ndo=6

Figur~ 40. EI ejemplo 4

200
7. TransmiSion serie

La EEPROM PC 24512 tiene un byte de control (figura 41) donde la parte alta tiene
un valor fijo (Ah) y la parte haja consta de la direcdon impuesta en sus patillas
( E2:EO) y ei bit de iectura/escritura, de tal forma que si se fijan las entradas de di-
recd6n amasa, el byte de control puede tener los vaiores AOh para escrihlra y All;,
pa ra lectura.

00!0<lIu f:j@IKlton.. '",


D.... 'U Typo ,a.nI" ...

,
~

"', ,
M
Clllp !Mblt ",ad, •••

'" ~
"'
..
"'
~,

" " "


FlgUfil 41. Byte de control del 24512 [cortesia de STJ

EI formato de escritura es el mostrado en la figura 42, donde !ras un START se es-


cribe la palabra de control para selecdonar el dispositivo y el modo de trabajo, dos
bytes para ta dirccd6n de escritura en ei dispositiv~ y el dato a escribir.

,\0 lL___________
O\CK "Ci< ""CK "CK

BYTE"'TE [[ .D~; HL: [1.I[i~~~II[i~H?~II[ : ?":-:;: 1 0


.
I<
~
-
~~
.
"~

Flgur.ll42. EI formato de escrltura (cortesla de STI

A continuacion se describe una fundon para la escritura en la EEPROM, que debe


ser Hamada desde el programa principal donde se Ie pasa 1a direccion a escribir y
el data.

sbort int status;


12c_stact() ; //Inlclaliza ls transmisi6n
i 2c_ "'cite (OxAO) ; //Escribe la palaora de control (direcci6n
IIOb ~ 0 para escritura)
12c_ wei te (sddress»8) ; //Parte alta de la dlrecci6n a escrlbic en ls
/IEEPROM
//Pacte bajs de 1<1 direcc10n a e!!cdbir en llf
IIEEPII.DM
12c_"'rlte (d<lt<l) ; //Dato a escribic
i2c_ stop() ; //Finaliz<lc16n de 101 tr<lnsmisiOn.
i2c_stact (); I/Reinic1o
sts tus-i2c_ write (Oxi'JOI ; //Lectura del bit ACK, para evit"r esccitoras
I/lncocrectas

201
Compilador CCCS y Simulador PROTEUS para Microcontroladores PIC

while(status*-l) Ilsi es 1 e!f~rar I! que responda el esclilvo

i2c_ !ftart () ;
status-i2c_ ....Ii te (Ol<" 0) ,.

Figur. 41. Fund6n de eserftur. en I. EEPROM

EI formate> de le<::tura puede ser de cuatro formas: le<::tura de la direcci6n actual en el


bus, lectura de una direcci6n cuaiquiera, lectura secuencial a partir de la direcci6n
actual y lectura secuencial a partir de una direccion cualquiera. La forma mas normal
es la de leer una direccion cualquiera (6gura 44), donde el proceso es muy similar
al de escritura y tras una reinicializaci6n hay dos cidos donde se indica el modo de
lectura y se envia el dato. En este caso, el master debe devolver 1;'n NO ACK.

At..: -'CI( "CK ..,CK NO,I..CI{

rr-11~~:"i'''''''~:111I i~:'~ III i~~:,~;"dll i+>~ :'1 111 ?:·~~T: 110


RA)';OQM

.
ADQRESS
"'0
~ R'N ~ RfJ.l ~
"

Figura 44. Leetura de una dln:ecl6n eualqulera (eortesia de STI

A continuaci6n se describe una funci6n para la lectura de la EEPROM, que debe ser
Hamada desde el programa principal donde se Ie pasa la d ireccion a leer.
BYTE reiJd_el<t_eep.om(1ong int addIess) (
BYTE dat,,;
i2c_sta.t(j; //Inicializl! 1a tr.JnsmisiOn
I/Escri.be 1a pa1abra de cont1:o1 (dlreccidn Oh
//+ 0 para escrltura)
i2c_wri te (address»B); //Parte alta de Ia direccidn a escribfr en II!
//EEPROM
I/Partfill baja de Ia dlrecc1dn .. escrlbir ..n 1"
//EEPROM
i2c_!ftaIt (J; /IReini.cio
i2c_ wd te (Ol<al) ; /IEscribe 1a pa1abra de control (di~eccidn Oh
/1+ 1 para lectu~a)
data-i2c_read/O) ,. I/lectu~a del data
i2c_ stop(J ; // Fina1izaci6n'de 1a tUlnsmfsi.6n.
return (data);

Flgur.,. 45. Funcl6n de Iect:ura de la EEPROM

202
7. TransmlslOn serie
------------------------
Para la aplicacion del ejemplo se utilizan estas funciones en el programa princi-
pal.
#include <16F877 . h>
#fuaes X'l' ,NOWDT, NOPROT£CT, NDLVP
lus~ deley(clack-4000000}
luse 12c (Master, sda-PH'_ C4, scl=PIN_ C3) //Confiqucac16n J2C
'include <lcd . c>

Idefine £EPROM_ADDRESS long inc

void vrite_ext_eepnm(long int addcess, BYTE data)

f//ineluir 1.1 funeion explicada anteciocmente} ~

BYTE cead_ eKt_eep r omflong .tnt address}

(Ilincluir 111 funci6n expliCllda IInteriormente) (-

vold trl6ln() {

inca valor-O, data;


EEPROM_ADDRESS address;;
lcd_ini t (};

foc (addcess-O ; .. ddresa<-9;addresa++)


WRJTE_EXT_EEPROMflJddr~.!Js, valor);
led_gotoxy (l, 1) :
print!llcdyutc, Henviando·%lD" , valor};
delay_ rns (S OD) ;
valoc+-+ ;

foe (addcess-O ;address<-9 ;address++)


dato-READ_EXT_EEPROM( address);
lcd_ gotoxy (l , 2} .-
printf(lcd""putc , "recibienda-IID" ,data);
delay_rns (SOO};

FJgur. 46. EI pr09r._ deJ ejemplo.

En el 12C debugger se pueden seguir las transicianes del bus. En la figura 47 se


muestra una operacion de lectura tal como se ha explicado anteriormente. La S
significa START, la A es recanocimiento (ACK), la Sr es START repetido, la N es NO
ACK Y la P indica STOP (campara ria con la figura 44, en este caso Ia direcci6n es
Olh y eI data es Olh).

203
Compilador C CCS y Simulador PROTEUS para Microconlroladores PIC

·•
C_'H
' _In ·· '_12' · ~,

· •••
'_l.n
• . u. · • ·· .." ,
C.l"
•. u.
00'

·•
' _12'
c. l~' ·· •'_12''"'" ·· .ll,..
·• .....• ··
Sou. •

-- • •
C_02 •

Fig ura 47. La operaclon de led",a con el 12C debugger

Ejemplo 5: Leer la temperatura y lIora de lectura y guardar los datos ell ulla EEPROM;
lIti/aar IIIl sensor de temperatllra 12C (D51621), /lTI reloj ell liempo real12e (051307) y
/Ilia EEPROM serie 12C (M24512). La lectlira 51' realizara ell jUl/cioll de IHla ardell dada
por 1'1 puerto serie; call otm ardell Sf viSllaliznrall los primeros datos de la EEPROM ell
1111 lIIollitor del pllerto serie (figura 48). COli/poI/elites ISIS: P1C16F877, M24SI2, RES,
COMPIM, D51621, D51307 Y LM016L.IlIstrumel//os: 12C DEBUGGER.

oc me

-
-n0:: ..-
I2C SENSORTEM

-
I2C E~rom

~ w
.
.'J'l1~ .'
'~
' ''-
,"::-
""

Fig",a 48, EI ejemplo 5

Para facilitar el desarrollo del programa se van ha crear 3 ficheros driver para cada
uno de los perifericos. Para la EEPROM serie 12C M24512 se util izaran los algorit-

204
7. Transmisi6n serie

mos descritos en el ejemplo anterior (figura 49). La direcci6n asignada en el esque-


ma es 1a OxOO.

short int sratus :


i2c_start () ,.
i2c_ "ri te (OxaO) ;
12c_ ",rite (address»8);
i2c_ "'rite (address) :
i2c_wnte (data);
i2c_4tOP() ;
12c_start():
st"tus- i2c_",rltt;> (OxaO);
while/status-l}

12c_ starr (!;


stll tus - 12c_ wri te (Ox"O) :

BYTE read_ext_eeprO/Illlong int "ddress) I


BYTE dilta :
i2c_st"rt () ;
i2c_wei te (OxaO) :
i2c_",rite (lIddress»8) :
12c_ ",rite (address);
1Zc_ start();
i2c_ wei te (Oxa1) ;
dat,,-i2c_read(0) ,.
:i2c_stap();
return (d"til);

Figura 49. Flche ro EEPROM_24512.C

Para el reloj en tiempo real 051307 se necesitan conacer sus caracterfsticas y es-
cribir el driver. EI 051307 suministra segundos, minutos, horas, dia, mes y aiio en
tiempo real (mediante una bateria y un cristal de cuarzo exterior permite un fun-
cionamiento independiente del sistema). Posee una serie de registTos donde apa-
recen los datos necesarios (figura 50), los cuales se suministran en c6digo BCD con
el formato indicado en la parte derecha de la figura. En este ejemplo 5010 se leeran
los segundos, mmutos y horas.

Para la escritura y lectura del integrado, el fabricante recomienda los ciclos mdi-
cados en 1a figura 51. Podemos observar que el cicio de escritura se mica can la

205
Compilador C CCS YSimulador PROTEUS para Microcontroladores PIC

palabra OxDO y la de lectura con OxDl. En el ddo de escritura, el segundo byte es


lm puntero que debe indicar la direcci6n de inicio (en este caso 0). En el cielo de
lectura se realizara la lectura de los tres primeras direcciones de la memoria del
051307 (los segundos, minutos y horas), el ultimo byte debe indicar un NACK al
master. Tan s610 queda convertir 105 bytes en BCD a binario. EI fichero se muestra
en la figura 52.

- ,,- .--
I ~

• ••
.,,-: . -..-
.~

I~ ~,.", :,;g
,
• _.
..I-' .' "
, 10&.
"H
"'"
""
DS1307 ADDRESS MAP
-- -
DS1 307 TIMEKEEPER REGISTERS
••
• I . 1··1.

Figura SO. Reglstros con dlrecdones '1 formatOI fcorteslil de Oa"..s $1114:.1

.
_1.-
~,

~ - 1QO;()ooOI.~
~ _ "01'
~ _ fIf"-'" 000 OIM.CTIOIO lit.

- - - 'f
1s t 1101000 ! 1
J
A I
._....
J)(lO(XXXJI;
.~I'>,.. _ ..·00 <-.. .
1 A IxxxxlOln I A IXXXXXKlOC I A Ixx:ooocxx I A I p I
~ !>

I Ii I
,•• , ."''' • ~;::r~t'fPIASI.lIO,
.. . 1IO..CMt:o .... _~ .. , , - ;
• • ~tt IS

_.D'~

Figur.. 5 t. Cicio de escrlturil '1 fedu, .. (cortes'" de O,,".s $mc.1


int BCDaBIN(int bedJ r //Conve ;csi6t1 de BCD a Bin .. do
int v~rill;

varia - bed;
varia :>:>- 1;
varia , .. Ox78;
return(varia + (vari".» 2J + (bed, OxO!));

206
7. Transmisi6n serie

vold tlempo(byte ..hor, byte ulin, byte .. sec) (


i2c_start(J; IIEscrltura
i2c_"'rite (OxDO) .. IICOdiqo de eacritura
i2c_ wdte (0;0,(10) : IIPuntero a 1a pr1mera direccidn
12c_stilrt II: IILectura
i2c_"dte{OxDIJ .. I/C6digo de 1ectura
s .. c - BCD4BIN(12c_read() .. Ox7f); /ILeetura de loa 7 bit de los sequnt;los
min - BCDaBIN(i2c_ read(} .. Ox7t): //Lectura de los 7 bit de los minutos
hor - BCDaBIN(12c_read(0}.Ox3f); IILectur<l de los 6 bit de las hoC"as
i2c_stop() ..

Figura 52. FlcMto RTC_DStJ07.C

EI termometro digital y termostato 12C 051621 perrnite medir temperaturas entre


-55 "C Y 125 "c. El valor de temperatu.ra se suministra en dos bytes, el byte alto es
el valor entero can resolucion de 1 "C Y el segundo byte es el valor decimal can
resolucion de 0.5 "C (figura 53).

FigilriR SJ. Form.lo de loll lemp8atura Icortesl. de Dalla.. Smc.,

La direccion asignada en el esquema es la OxOl. Tiene un registro de control para el


funcionamiento como termostato queen esta aplicacion no se utiliza. La palabra de
control para la lectura a escritura es l001A3A2A1-R/W (figu.ra 55). Los comandos
de control pueden ser, entres otros, OxAA para lectura de la temperatura, OxEE
para el inicio de la conversion. Con estos datos se puede escribir el fichero para el
control del 051621 (figura 54) .
void inlt_temp{int address} (
i2c_start () ..
12c_"'rlt6(Ox901 (address«l)}; IIGenera primer byte (lOOlA2AIAOW)
i2c_write(Oxee) .. /Ilnici.a conversion
i2c_stop() "

noat r ..ad_full_templint addressl (


signed int datah;
Int d"tal;
noat tur,,:

207
Compilador CCCS y Simulador PROTEUS para Microconlroladores PIC

i2c_start (J;
12c_ ",rite(Ox90 I (address«l)) ; /IGenera primer byte (1001A2AIAO-W)
12c_ ",Ii te (Oxaa) ; /ILeer temperatura
i2c_start();
I (address«l)); /IGenera prlmf!cr byte (lOOlA2AIAO-R)
i2c_ "'rl ce (Ox9l
datah-i2c_cead(!; I/Lectura parte dlta
datal-i2c_ cead(DI ; I/Lectura parte bdj .. y HACK
12c_stopO ;
tura"'datah ; /IConversion a flotante
i f (d<iC.,1--128) turcp*tura+D.5;
return (turd) ;

Figura 54. Flchero TEMP_DS16Z1.C

_. ..--. _..._-
~~i-f*
- I ' " ' 'I I
..... ...-.- ":If' _ .." III.:!' . .
JU1.J'1.I1JU1fl:u1.f'
~ , • r-,
_

.-
I '
,I oo
..., ..... ,
-
_
-..gr '!:l!'
-., .... .-..mt_"" \ 1
lfU1J1Jl.nJ1JU1nnnnIUln..'lJ1.."11UU1.J1IlJl.V1IULI"lJ"U

--.--.. .-.. . . ......: __

~,~-~_~.--_I...,
OIl. .'

....- •.n..n.n n n.nnnn..nnIlIUl.fUVU1f1.J1JUUUUUUUUlJVU1...~


- '!:l!' ........,..
-
- t
"
I

--
_.-._-"" ......-
,t
~---uu1.I1
,
,t, ,t I ' "
. 1 L---..,-
',V;;-
_1 " I

, I•
~
.-
-...
1 "

!ICl '" J1.I1"rtn..IlrUl..~


~
1
,t I

't1:' -
, if t
.- '=" ."""

Figura 55. Prolocolo de lectura,lescrilura Icortesia de Dallas Smc.1

Puesto que la temperatura es un FLOAT no se puede guardar este data directamente en


la EEPROM segUn las funciones dadasen el Fichera EEPROM_24512.C; por 10 tanto, se

208
7. Transmisi6n serie

pllede utilizar el fichero surninistrado por CCS C Ilamado FLOATEE.C para guardar y
leer datos tipo FLOAT en una EEPROM. EI fichero se muestra en la figura 56.

int i;

nOgt R£AD_FLOAT_EXT_EEPROM(long inc nl (


int i;
flog t datil ;
for (1 - 0 ; 1 < 4 ; i++1
>((intS oJ ('ddta) + i)
return(data);

Figura 56. Fichero FLOATEE.C

Una vez definidos los ficheros para el manejo de los perilericos se pllede escribir
el programa principal. EI programa se comunica con un terminal del puerto serie
de tal forma que mediante un menu se pueden elegiT dos opdones: Con 1 se (nida
la lectura de temperatura y tiempo para almacenarlo en la EEPROM y can 2 se
visualiza, a tTaves del puerto serie, los prirneros datos de la EEPROM (los 4 bytes
del FLOAT de la temperatura y los 3 bytes del tiempo -seg., min. y horas-). La co-
municadon serie se realiza por interrupcion.
#include <ltiF876 . h>
Ifuses XT , NOW;)T , NOPROT£C'I' ,NOLVP
'lJse delay(clock-4000000)
luse rs232 fbaud-9600 , xml t-pln_eli , rev-pin _ e7 , bi ts-8 , pari ty-NJ
luse i2e (Master, sda-PIN_ C4, sel-PIN_ C3)

lincIucM <Icd . e>


linelude <EEPROM_245J2.e~ //Ficheros driver de los perifericos
linclude <RTC_ds1307 . e>
ILnclude <TEMP_dsl ti21 . c>
linclude <noatee.e~

int aat_in , ent , hr , min , see ;


intI ti address-a .-
int dat_serie(7];
noat date ;

//Inter r llpeion para e1 puerto se r ie

209
Compilador CCCS y Simulador PROTEUS para Microcontroladores PIC

dllt_in-getc(J ; IILee el puerto ;'Iecle


printt(-\r-, ;
if (d4t_i.n--'2" '51 es "2-;'Ie vi.;'IulllizlIn 10;'1 prJ._ro;'l dlitOB de JIll EEPROM

for(cnt-O;cnt<-6;cnt++} IILectucli de los 7 pcimecos bytes de III EEPROtf

foc(cnt-O;cnt<-6;cnt+*} IlvisulIlizlJ los 1 prJ_mecos bytes de III EEPROM

void III/Iin {J
lCd_lnit ();
enllble_intercupt;'l {in t_ rdll} ;
enllble_inteccupts (globlll};
lIddcess-O;

printf(~PulsllC 1 PIUli leer datos\c·'; IIHenu PlIrli el terminal serie


pc1ntf("PulllllC 2 PlICli VillUlllizlIc dlltos\c·);

",hile(l) (

it(d4t_ln--'l'l 1/51 es -1· lie lnlcill 1" lectuc" y gCllblldo en III EEPROM

lnlt_telllp(OxOl}; IllniciltlizlI el D51621


de111y_1IIIf (l00, ;
tiempo (he, lllin, secl ; IILee tit!mpO del D51301
d"to - re"d_lull_telllp(OxOl/; IILee temperatura del 05162J
WRITE_FLCA'I'_EXT_EEPROHI"ddcesS,d8to); I/Guarda f byuB del FLOAT
lIddnus-liddress+f;

WRITE_EXT_EEPROH(lIddreS!lH, hcl; IIGuaeda byt. de hoc"


WRITE_EXT_EEPROM (lIddrellll H ,min) ; IIGuarda byte de minuto
WRITE_ EXT_EEPRC»I (.ddrell;'l++, sec) ; IIGultrdll byte de segundo
lcd_gotoxy (l, 1) ;

printltlcd_putC,"Temp-t4.1f C\n",ddtO}; /IVlsullliz" JIll tempec"tur"


pr intf (1cd.JJutc, "'Zu: t2u: ~2u", he ,.,In, sec) ; I/VJ.SU811zlJ 1" hoe"

210
7. Transmision serie

i t (address-Oxl l l l ) address-O ; IICuanda se tecmina 1a EEFROM vue1ve


l/a1 princip ia .
I
I
)

Figura 57. Programa principal del eJemplo 5


Se puede utiliza el HyperTerminal para comunicarse con el PIC. La configuraci6n se
muestra en la figura 58; £01 resultado se muestra en la figura 59.

j_~OI

~ ErMaI In de Ii~ eon lot a~~ de linea


o Eco de lot .,..adel"e#O"j", ~
Releodo de liroe« 0
o
AI_ASCII

El A!II~ SYfIrICfI de linea .. INI de CIda li nea ,eo;:bd,o


o lrierp"el. caract_ rer:::Odos comoASOI de 7 til
qj iW_ nneM <pi Ulbrepas«l eI aroc:IQ de ltwImaI

I "- II ""'"'" I
Figura 58. Conngur"cion del HyperYermlnal

,.,.
~

~
, . 18
..
~ "
~ ~

Figura 59. Pantalla de coml.lnicacion

211
Compilador CCCS YSimulador PROTEUS para Microcontroladores PIC

En el comanda DEBUG del PROTEUS se pued e visualizar la EE PROM serie me-


d iante el camanda I2C MEMOR Y INTERNAL M EM ORY (figura 60).

.. . . . .
,, ,, , no, " ",, ,, ,, ,, , no, no", , ,, ,, ....•......•.... . ..... . ..
-
.. . . .. . ..
0000
0010
0020
OOo)O
00·0 "",• ", ",
no ", ",•
0
no
no ", "•
, no
· .•......•..
.........
", "",• ", ", " no" " no", "",• ", · .. s ...... s .....
0 ....
. 0

..... $ . . . . . . , •••
,~,
" "
no, ", , , ., ........... .....
"• " '""u, ",• " " " no", "• no"u• ",• " no" "" no", "• ................
0 0
00'0
OOolO
00&0
gOo'O
no

" ", " ,


0
0
no 0
. 0

", ",• '"• • u no", ",• no", ",• , ,• " no", . ...............
.. ........... ...
0

00 ... 0

0000
no
no •
... .. ... ..
.oc, ",• no" "" '"", "", no", ", " " " no", "•, no", ", " ................
DOBO

" ",• , , " no" "" no" • '"• • " no" "" no", " ................
0
0
0

.............. 0
0

..
ODED 0
, •
.~.
01 00
0110
OliO
DUO
0
"
0
,",
. .. . .. . .. . .
" •
0 0
" no, "
0
.0

, "",• '" "• u no " no", "" uo, ",• no " no", "" ................
0 0 0
0

""• uo ", " no", "", no" "",• '" "• u no, "u,• '", "" no, ............
................
0

... ...........
0
0
...........
... 0
0
0 0

0
0
0

01'0
0150
OliO
. .. .. .. " , ",•
0 0

""• no, "",• no, , " no ""• no", "",• no, , "
0 ", ,
. . ..
0
0 ............
................
H
0
0
0

. .. .. .. no, ................
DLTD 0
" 0

..
DUD
, , ", '", ",• '" • ", " ................
..
01~0 H 0

" " no
no, ", , ,• " no, "
0
· ... . ... . ... .. . .
................
no, ", •
.
u" no
" 0
no, ", " , ",•
no ................
", u",• no ", " " "u• no, "u, no", "• " " ...........
0
0
0

..... ...... ... ... ... .. ...... ...... . ...... ...... ...... ... ...
0 0
u"
0

,• '" no " no", "",• '"", ", '", , " ", "", no", ", '", ............... ...........
0
0 0 0 0
H
m "• m m m" m" m"
" ", ",• " "" ... '" ........... 0

no "
m
0
m " m "
'"
... ... ...
H
...
...
...... ... ... ... ...... ... ... ...... ... ... ... ...... ......
...'" m '" ...mm '"mm ... m m '"...
............
........
.................
.............
.. .. .

......... ...... ... ......... ...... ......... ...... ...... ...... ...... ......... ......... ......... ...... ......... ......
... ... ... ... . ... ...........
'" .... ...........
'" '" ... '" '" ...
: S5
'" :H '"
'" '" '" '" :H '" '" '" '"
m

... m m
m '"
·.. . . ......... ..
. ......•....••••

...... ...... ....... ......... ... ... ...... ...... ...... ... ...... ...... ... ......... ...
:H as :n
'"
m m
'" '" '" '" m ................
'" '" '" ................1$S
m :H
'" m
'" '" '" ... ... .. ..............
................
... ... ... ... ....... ... ... ... '"
... ......
'" '" '" '" '" '" '" '" '" '"
... '" :" "'" '"... '" '" '" :ss'" m'" '"'" ... mm ......................
'" " '" m
'" l~S
. .............
............
BS

Figura 60. Memoria intern.. de la EEPROM 12C

212
8. Gama Alia - PIC18

Capitulo 8

Gama Alta - PIC18

8.1 Introduccion
En los uitirnos anos, Microchip ha Ianzado varias garnas d e PIC con elevadas pres-
taeones, los PIC1S, los PIC24 Y los dsPIC Con la gama alta (PICI 8), Microchip
mantiene la arquitectura basica que tan buenos resultados ha obtenido con 1a garna
baja y media y, ademas, ~uce las limitaciones de estas dos ultimas. Los PICIS
tienen una arquitectura RiSe avanzada Harvard con 16 bits de bus de programa y 8
bits de bus de datos (figura 1).

16 8
R, PIC18
~~,
Rise '!A,iu:-:;
f CPU f ,H'.TA 4KS)
, 'A~ .

Figl.lrit 1. Arqllitectl.lra PICla

La memoria de programa aumenta hasta 1 MWord (en realidad se manejan hasta


64 Kbytes pero Hegan hasta los 2 Mbytes can memoria external y desaparece la pa-
ginaci6n. La memoria de datos RAM puede !legar hasta 16 x 256 (4 KBytes) y hasta
tos 1 Kbytes de EEPROM.

La pita aumenta hasta 31 nivetes. Lnduyen tres punteros FSR que permiten direc-
cionar la memoria de datos de forma indirecta y sin bancos. EI juego de instruccio-
nes aumenta hasta las 75 instmcciones. Lntroduce un multiplkador hardware 8x8.
La frecuencia maxima de reloj es de 40 MHZ Y la veloddad de procesador Hega a
los 10 MfPS con oscilador de 10 MHz. Induye perifericos de comunicacion avan-
zados (CAN y USB). Can la filosoHa tradicional de Microchip, los PICl8 son com-
patibles con los PIC16CXX y PIC17CXX. Ademas ha desarrollado un compilador C
espedfico para esta gama alta, el C1S.

213
Compilador CCCS YSimulador PROTEUS para Microcontroladores PIC

,
., .,
1'-"-'" 1~"r...dOa
"W.IIt~ ..
Itf..slT.
. n._.
1....... rri6a RES!'.T. ,
.. 010 I......
,
..1101 ......
~d ... w••• 1It OoIIord .... I<1o •• lit Ihtbordon>IrB' . lit DftbordO",IrB' Bd.
ru. ('\HtT.O!>'l). pu. (PlI IIT.OST). Plio ( ,lIIIT.OST). Plio (PWIIT.OS'r).
~1""'ion.l)' l ~~~R C.prioBo l). l ~.~~It (.,..,IoDol). l ~~TRI.,..,iMO').
, I"'N I'~ I"'N
I"" 1.,,'
~
1'"'' I'~

1'" 1 ,~
1'" I '~
I~ 1 ,~ I~ 1,~

it
~-
,

, , ,
-i".'"~" 1'" .
I 7S(1U UI., . ,,, ....., ", ".... ,,, . "".,
, I" " " "
I" " " "
,, ,,
,
Figura 2. Caraderfrtlcasde PIC18F2420, PIC18F2520, PICI8F4420 '1 PICI8F4520

8.2 Organizacion de la memoria


El rIC18F4520 dispone de las siguientes memorias:
• Memoria de programa: memoria FLASH intema de 32.768 bytes:
Almacena inSITucciones y constantes/datos.
Puede ser escrila/lefda mediante un programador extemo 0 durante la
ejecucion del programa mediante unos punteros .
• Memoria RAM de datos: memoria SRAM intema de 1.536 bytes en la que
estan incluidos los registros de funcion especial:
Almacena datos de forma temporal durante la ejecud6n del programa.
Puede ser escrita/leida en tiempo de ejecucion mediante diversas ins-
trucciones.

214
8. Garna Alta - PIC18
---
Memoria EEPROM d e da los: memoria no voJatil de 256 bytes.
Almacena datos que se deben canservar aun en ausencia de tension de
alimentation.
Puede ser escrita/lefda en tiempo de ejecution a traves de registros.
Pila: bloque de 31 palabras de 21 bits.
• Almacena la direccion de 1a instruccion que debe serejecutada despues
de una interrupci6n 0 subrutina.
Mem oria d e configuracion: memoria en la que se induyen los bits de confi-
guraci6n (12 bytes de memoria flnsh) y los registros de identificaci6n (2 bytes
de memoria de sOIa lectura).

8.2.1 Arqultectura HARDVARD


EI PIC18F4520 dispone de buses diferentes para el acceso a la memoria de progra-
rna y a la memoria de datos (arquitectura Harvard}:
• Bus de la memoria de programa:
21lineas de direction.
16/81meas de datos (16lineas para instrucdones/B lineas para datos).
• Bus de la memoria de datos:
12 !ineas de direcci6n.
8 lineas de datos.
Esto permite acceder simultaneamente a la memoria de programa y a la memoria
de datos. Es decir, se puede ejecutar una instruccion (10 que por 10 general requiere
acceso a la memoria de datos) mientras se lee de la memoria de programa la si-
guiente instruccion (proceso pipeline).

8.2.2 Memoria de Programa


EI PIC18F4520 dispone de una memoria de programa de 32.768 bytes (OOOOH-7-
FFFH) (figura 3). Las instrucciones ocupan 2 bytes (excepto las instrucciones CALL,
MOVFF, GOTO Y LSFR que ocupan 4). Por 10 tanto, la memoria de programa puede
almacenar hasta 16.384 instrucaones.
Primero se almacena la parte baja de la instruccion y luego la parte alta (para las
instrucciones de 4 bytes primero los bytes menos significativos y luego los mas
significativos). Las instrucciones siempre empiezan en direcciones pares.
La operaci6n de lectura en la posicion de memoria por encima de 7FFF H da '0'
como resultado (equiva lente a 1a instrucci6n NOP).

215
Compilador CCCS y Simulador PROTEUS para Microcontroladores PIC

Direcciones especiales de la memoria de programa:


• Vectorizaci6n del R.eset es OOOOH.
• Vectorizaci6n de las interrupciones de alta prioridad es la OOOSH.
• Vectorizacion de las interrupciones de baja prioridad es la 0018H.

[ PC<2D:O:>
.... 21,,
J}
II
L
Niftll6t1l1ll!

NiYel31 dill pill

....'""

L~tomo'O·
1

Figura 3 , Memoria de Program"

La memoria de programa puede ser leida, borrada y escrita durante la ejecuci6n


del pragrama. La operaci6n que se utiliza normalmente en tiempo de ejecuci6n es
la de lectura de tablas 0 datos almacenados en memoria de programa.

8.2.3 Contador de Programa


EI PC (contador de programa) tiene 21 bits (PCU, PCH y PCL). EI bitmenos significa-
tivo del PC apunta a BYTEs, no a WORDs, por 10 que es "0". EI PC se incrementa de
dos en dos. Se dispone de los correspondientes registros auxiliares PCLATU y PCLA-
TH para actuar de forma combinada can e1 PC cuanda este se escribe 0 se lee.

216
8. Gama Alia - PIC18
--
• pev: parte superior del PC, registro no directamente accesible; las operaciones
de lectura/escritura sobre este registro se hacen a traves del registro PCLATU.
peR parte alta del PC, registro no directamente accesible; las operaciones de
lectura/escritura sabre este registro se haeen a traves del registro PCLATH.
peL: parte baja del PC, registro directamente accesible. Una operadon de lec-
rur;] sabre peL provoca que los valores de peu y PCH pasen a los registros
PCLATU y PCLATH, respectivamente. Y una operaci6n de escritura sabre peL
provoca que los valores de PCLATU y PCLATH pasen a peu y PCH, respecti-
vamente. El peL siempre tiene el bit menos significa ti v~ a '0' debido a que las
instrucciones siempre empiezan en direcciones pares.

8.2.4 Memoria de Conflguraclon


Se trata de un bloque de memoria situado a partir de la posicion 30000H de la me-
moria de programa (mas alla de la zona de memoria de programa de usuario). En
esta memoria de configurad6n se induyen:

Bils de configuracion: contenidos en 12 bytes de memoria fiash permiten la


configurad6n de algunas opdones del PIC como:
Opdones del oscilador.
Opdones de reset.
Opciones del watchdog.
Opciones de la drcuiteria de depuraci6n y programaci6n.
Opciones de protecd6n contra escritura de la memoria de programa y
de la memoria EEPROM de datos.
Estos bits se configuran generalmen te d\lrante la programaci6n C, a\mque tambien
pueden ser leidos y modificados durante la ejecuci6n del programa .

• Registros de identificaci6n: se trata de dos registros situados en las direccio-


nes 3FFFFEH y 3FFFFFH que contienen informaci6n del modelo y revision
del dispositivo. Son registros de 5610 ledura y no pueden ser modificados por
el usuario.

8.2.5 Pila
La Pila es un bloque de memoria RAM independiente. de 31 palabras de 21 bits y un
puntero de 5 bits, que sirve para almacenar temporalmente e] valor del PC ruando se
produce una lIamada a una subrutina 0 interrupci6n. EI "Top O/Stack" es accesible.
se pued.e leer y escribir (sera conveniente quitar previamente las interrupdones).
El punteTo de pila (contenido en el regisITo STKPTR) es un contador de 5 bits que
indica la posicion actual del final de pila. El contenido del final de pHa es accesible
mediante los registros TOSU, TOSH, TOSL.

217
Compilador CCCS YSimulador PROTEUS para Microcontroladores PIC
------
Cuando se procesa una interrupci6n 0 se ejecutan las instrucciones CALL 0 RCALL
(el PC esta apuntando a la siguiente instrucci6n) se incrementa el STKPTR y se
almacena el \'alor del PC en el final de pila. Cuando se ejecutan las instrucciones
RETURN, RETLW 0 RETF1E se copia en el PC el valor almacenado en la cima de
pila y se decrementa el STKPTR.

8.2.6 Memoria de Datos


Los PIClS tienen hasta un total de 4 KBytes agrupados en 16 bancos, con 256 bytes
cada uno. Como en eI resto de las gamas, existen los registros de prop6sito general
GPR y los registros especiales SFR; estos ultimos se sirnan en la zona mas alta (des-
de FOOh hasta FFFh).

EI PIC18F4520 dispone una memoria RAM de datos 1.536 bytes (6 bancos de 256
bytes). Ademas dispone de 126 bytes dedicados a los registros de funcion especial
(SFRs) situados en la parte alta del banco 15 (figura 4).
8. Gama AHa - PIC18

Para acceder a un byte de la memoria RAM de datos primero se debe seleccionar el


banco al que pertenece el byte mecHante el registro de selecci6n de banco (8SR) y, a
continuaci6n, direccionar el byte dentro del banco. Ademas existe una modalidad
de acceso rapido a las 126 posiciones de la parte baja del banco 0 y a los 126 bytes
de SFR (banco de acceso rapido).

La memoria RAM de datos se com pone de registros de prop6sito general (GPRs) y


de registros de fund6n especial (SFRs). Los SFRs son los registros mediante los cua-
les se puede monitorizar/controlar el funcionamiento de la CPU y de las unidades
funcionales del PIC. En el PIC18F4520 se sirna en el bloque de memoria de OxFBO a
OxFFF (figura 5). Se distinguen dos conjuntos de SFRs:
SFRs asociados con el nudeo del PIC:
CPU: WREG, STATUS, BSR, etc.
lnterrupciones: INTCON, PIE1, PIRl, IPR1, etc.
Reset: RCON.
SFRs asociados con las mlidades funcionales:
Timers: TOCON, TMRIH, TMRIL, TlCON, etc.
Convertidor AID: ADRESH, ADRESL, ADCONO, ADCONl, etc.
EUSART: TXREG, TXSTA, RCSTA, etc.
CCP: CCPRIH, CCPRIL, CCPICON, etc.
MSSP: SSPSTAT, SSPDATA, SSPCFG, etc.
Puertos de ElS: TRISA, PORTA, TRISB, PORTS, etc.
PORTA OxF80 SPBRG OxFAF
PORTB OxF8l - -
PORTC OxF82 T1MERlL OxFC
PORTD OxF83 TlMER lH OxFC
PORTE OxF84 ---
----- TlMEOL OxFD
TRlSA OxF92 TlMEROII OxFD
TRISB OxF93 -----
TRISC OxF94 WERG OxFE8
TRlSD OxF95 -----
TRlS E OxF96 STKPTR OxFFC
Figur.. S. Regl,tra, SFR

8.2.7 Memoria EEPROM


El PIC18F4520 dispone una memoria EEPROM de datos de 256 bytes. Al ser una
memoria no volatil, los datos almacenados en ella se mantienen en ausencia de

219
Compilador CCCS y Simulador PROTEUS para Microcontroladores PIC

tension de alimentacion. EI acceso a esta memoria se realiza mediante los SFRs:


EECONI, EECON2, EEDATA Y EEADR. Esta memoria permite hasta 1.000.000 de
cidos de borrado/escritura. Se puede leer/escribir de forma individual en cada una
de las 256 posiciones de memoria.

Cuando se realiza una operacion de escritura, la circuiteria intema del PIC se en·
carga de borrar previamente la posici6n en la que se desea escribir. La duracion de
un cido completo de borrado/escritura de un byte en la memoria EEPROM suele
ser de unos 4 ms.

8.2.8 Modos de Dlrecclonamiento


EI modo de direccionamiento es la forma en la que se obtienen los datos que van a
ser utilizados en la instruccion. Existen 4 modos de direccionamiento: INHEREN·
TE, LITERAL, DLRECfO e INDIRECTO.

• Modo de direccionamiento inherente: en este modo, 0 bien la instnlccion no


tiene operando 0 bien e1 operando viene especificado en el propio c6digo de
operacion de la instrucciOn.
• Modo de direccionamiento literal: en este modo, el valor del operando viene
indicado de forma explicita en la instruccion.
• Modo de direccionamienlo directo: en este modo, 1a direccion en la que se
encuentra el va lor del operando viene indicada de forma explicita en la ins·
truccion.
• Modo de direccionamiento indirecto: en este modo, la direcci6n de memoria
en la que se encuentl"a el dato viene especificado en uno de los registros FSRO,
FSRI Y FSR2.

8.2.9 Interrupciones
Se dispone de dos niveles de prioridad:
• Nivel alto veclorizado en la direccion OOOBH.
• Nivel bajo, vectorizado en la direccion 0018H.
Todas las interrupciones pueden ser programadas con cua lquiera de las dos priori·
dades, salvo la interrupcion extema 0 (que siempre tiene alta prioridad). Se puede
forzar el modo compatible "solo alta prioridad". mediante el bit IPEN = o.

GIEIGIEH & PETEiGIEl controlan los respectivos permisos globales. Cuando se


sirve una interrupcion, <lutomaticamente se quita su correspondiente permiso glc--
bal. EI servicio de interrupcion de alta prioridad impide el servicio de baja priQri~
dad. Cuando se ejecuta RETFfE se pone el penniso correspondiente al nive1 que se
esta sirviendo.

220
6. Gama Alta - PIC18

Todas las interrupciones disponen de 3 bits de configuraci6n (excepto Iainterrup·


don extema 0 que tiene dos):
Bit de habilitacion de inlerrupci6n: permite habiJitar a rovel individual la
interrupci6n.
• Flag de interrupci6n: se pone a '1' ruanda se produce la candidon de inte-
rfupd6n independientemente de si la interrupd6n esta habilitada 0 no. Este
flag debe ponerse '0' por software cuando se procesa 1a interntpci6n.
Bit de prioridad d e interrupci6n: establece si la interrupci6n es de alta 0 de
baja prioridad (este bit no esta disponible para la interrupci6n extema 0).
EI PIC18F4520 dispone de 20 fuentes de interrupciones. Se distinguen dos grupos
de interrupciones:

• Grupo general de interrupciones:


Jlltl"rru Ion de Tem Qrizador 0
lnterru i6n or ta mbio en PORTO
Interru d on externa 0
Interru don extcrn a I
Interru cion edem a Z
• Grupo de interrupciones de perifericos:
"

En el compilador C se modifica la directiva : INT_XXXX de tal forma que se pue~


den induh las palabras dave HIGH y FAST.

Una priori dad HIGH puede interrumpir a otra interrupcion. Una prioridad FAST
se realiza sin salvar 0 restaurar registros (ver el siguiente apartado).

Asi, en los PICIS se pueden dar las siguientes interrupciones en C:

restauro 105 rcgistros clave.

puede interrumpir a

clave. Esta interrupci6n puede interrumpir a olms en

221
Compilador CCCS YSimulador PROTEUS para Microcontroladores PIC

• ltINT_xxxx: Prioridad normal (baja) de interrupci6n. EI compiJador guarda y


restaura los registros clave. Esla inlerrupcion no interrumpe a otras en pro-
greso.
; l NT_xxxx FAST: Interruption de alta prioridad. En compilador NO guarda
y restaura los registros clave. Esla interrupci6n puede interrumpir a otras en
progreso. 5610 se permite una en el programa.
!l' INT_xxxx HIGH: Interrupci6n de alta prioridad. EI compilador guards y
restaura los registros clave. Esta interrupcion puede interrumpir a olras en
progreso.
EI PIC18F4550 tiene las fuenles de inlerrupci6n mostradas en la figura 6.

~';:"O~(lalgFHa:_)
rT ..... O~("""IITIMERO....,..J
rT ..... '~
rT ..... 2......&w
r T... 3 owrftooo
r"",,,_
rE ........ ~.'
rE ....... ~1I2
rPM 8 "'" cII.orws 01\ 8.-87
r" ..* s....... Port "-- ..
r MoIog '" doj;" _ .,.,.,..
rRS232 ....... cIotI ...oMIlIo

Figuril 6 . Fuentes de interrupcl6n del PIC 18F45Z0 desde el Wizard del CCS

8.2.9.1 Reglstros de salvaguarda


Las interrupciones se disparan durante la ejecucion de c6digo del programa prin-
cipal a de otra interrupci6n. Esto hace que durante la ejecuci6n de la rutina de tra-
tamiento de la interrupcion se pueda modificar el valor de los registros que estan
siendo utilizados por olras partes del c&liga.

Para evitar que estas modificaciones alteren el carrecto funcionamiento del sistema
conviene almacenar los valorl'S de estos registros al inicio de la interrupcion para
recuperarlos al final.

Se puede sa lvar y restaurar el contenido de las variables de entomo (WREC, STA-


TUS y BSR) en sus respectivos registros sombra, 10 que equivaJe a una pila de un
sOlo nivel.

222
8. Gama Alta - Ple18

8.2.10 Reg/stro W
El registro WREG pasa a ser un registro direcdonable (OxFE8), por 10 que se puede
utilizar de forma explicita.

8.2.11 Oscl/ador
El PICl8F4520 permite mUltiples configuraciones:

I-XJ ' 4.\1"" . I.


, '.0
~
,d, PLL (.. ",

) '" RA6 1m", 4MH"


;
no " ~O RA:' "A;
, "0," "'6(m .. ,

La disponibilidad de oscilador interno permite multiples configuraciones (figura 7).

t _ _ O_

n25IJo;z~ad: _ _ 1JoIHi!7

31 Kho-J-.. _ _ ..... - . O -

-
"""

Fig .... ," 7. Conflguradon del oScilador interno

8.2.12 Un Ida des Funcionales


EI PIC18F4520 dispone de una serie de Ullidades F'lIlciollules que Ie permiten:
• Realizar tareas especificas especializadas (conversion AID, transmisi6n/re-
cepdan de datos, generaci6n de S€nales digitaJes con temporizaciones pro-
gramables, etc.).

223
Compilador CCCS YSimulador PROTEUS para Microcontroladores PIC

• Optimizar el rendimiento del PIC, ya que estas unidades trabajan en paralelo


a la CPU permitiendo que esta se centre en otras tareas como el procesado de
datos, c;ilculos, movimiento de datos, etc.
Las Ullidades Fllliciol/aies mas importantes del PIC18F4520 son:
Puerto de £JS Unidad d"Com aracio nfCa lurall'WM me'onda recl'
Tern ori~ador 0 Canal de co mun iucio n se rie EUSART
Te rn orizldor I Canal de comu nitaciti u Inw MSSP
Tr ill orlZMdor 2 MOd ulo MnllO ieo de Will STlcM!!
Tem oril.lldor J CM nal de Irao51l1isltio de datos en Mrs ielo SPP
Con\'erridor AID AcCf:SO a memoria e:ne rna Ei\lA
Unldlld de Com anl(:i6n/CII luralPWM CCP

8.2.12.1 Puertos de entrada/salida


EI PIC18F4520 dispone de 5 puertos de E/S que incluyen un total de 36 lineas digi-
tales de E/S:

Todas las lineas digitales de E/S dispone", como minimo, de una funci6n alterna-
tiva asociada a alguna drcuiteria espedfica del PIC. Cuando una linea trabaja en el
modo alternativo no puede ser utilizada como linea digital de E/S estindar,

ow < ,..

-.- ,._0- .
MO

~w
. • • I ,..,...
~"

-. .
L

_.-
- --'

Figura 8. Esquerna de un terrnln;ll

224
8. Gama Alta - PIC18

Cada puerto de E/S tiene asociado 3 registros:


• Registro T RI S: mediante este registro se configuran cada una de las lineas de
E!S del puerto como ENTRADA (bit correspondiente a '1') 0 como SALIDA
(bit correspondienle a '0').
• Registro PO RT: mediante este registro se puede leer el nivel de pin de E/S y
se puede estableccr eJ valor del/atell de salida.
• Registro LAT: mediante este registro se puede leer 0 establecer el valor del
latch de salida.

8.2.12.2 Temporizadores
TEMI'ORIZADOR 0,
• Configurable como temporizador/contador de 8 bits/16 bits.
• Pre-escaJar de 8 bits programable.
• lnterrupcion por desbordamiento.

TEMPORJZADOR 1:
• Configurable como temporizador/contador de 16 bits.
• Dispone de un QsciJador propio que puede funcionar como:
• Sena! de reloj d~1 temporizador 1.
• Serial de rcloj del PIC en modos de bajo consumo.
• Pre-escalar de 3 bits programable.
• Interrupci6n por desbordamiento.

TEMPORIZADOR 2,
• Temporizador de 8 bits (registro TMR2).
• RegisITo de periodo PR2.
• Pre-escalar d~ 2 bits programable (1:1, 1:4, 1:16).
• Post-escalar de 4 bits (1 :1...1 :16).
• [nterrupci6n par igualdad entre TMR2 y PR2.
• Se puede utilizar junto con los mOdulos CCP y ECCP.
• Se puede utilizar como selial de reloj del mOdulo MSSP en modo SPI.
TEMPORIZADOR 3,
• Configurable como temporizadorlcontador de 16 bits.
• Dispone de varias opciones de sefial de reloj en e[ modo temporizador:
Oscilador principal can 0 sin pre-escalar.
Oscilador del temporizador 1 con 0 sin pre-escalar.

225
Compilador C CCS YSimulador PROTEUS para Microcontroladores PIC

• Pre-escalar de 3 bits programable.


• Interrupdon por desbordamiento.

r~.N"'used
"fITfI.. -' 2",
••
••
....
,,~

~­ ,,-
n.

.,-
OR
,. ~
1 ~8 ...

""- 0-.

,....
1)1 ... ~,

--
"'-
11~ ..

.......
~

[. "'IOI:.-,-B.

,. ......-
••
•• ,-
". ••
:32",

D CIod<oo.t""C01'I.oI ") s,..c( .. DldIoO",,


f_ ! 5J.ltI1lDJ

Flgu,.. 9 . WDTyTMRO, TMRI yTMR2

2.. 111 ...


( .... 262 ...
8ur 52.( ....
IS.... 1o.c ,..

Figu,.. 10, TMR3

8.2. 12.3 Convertldor Analoglco-Digltal


• 10 bits de resaludon.
• 13 canales multiplexados.

226
8. Gama AJtI - PlC18

• Seiial de reloj de conversion configurable.


• Tiempo de adquisidon p rograrnable (O a 20 TAD).
• Posibilidad de establecer el rango de tensiones de conversion mediante ten-
siones de referenda extemas.
..,,,,,,,,~

"''*'PF'~,
,~

AD41J,2JoJA5EO£1 f2B2 8)Bl BI BO


emm
AdAI A2A3A~EOEI E2B2B181 B~

ADA1AlAlA5EO£1£lBl9JBI
' MAl A2A3AHOEI HUl)
ADAIA2A3MEO£l (282
o\OAlA2~A5EOEl El ~_12U1
AOAlA2AlMEOEl
ADAl A2A3A5EO
AOAlA2A3A5
AOAlA2Al
AOA1A2
"'''
'"
Figl.lra 11. Modulo AD

8.2.12.4 Canal de Comunlcaclon Serle (EUSARTI


Caracteristicas fundamentales:

• Modos de trabajo:
Modo asincrono de 8 bits.
Modo asincrono de 9 bits.
Modo sincrona Maestro.
Modo sinClana Esc/avo.
• Auto-activaci6n por deteccion de data recibido.
• Detecdon autamatica de veloddad de camunicacion (balldrate).
• Transmisi6n y detecd6n de caracter de BREAK (bus UN).

'"
A~2J2IIl
.!i U.. RS·712

.... ..,
.,-
eo." ,,-
~
' ...,.."""
'] .....'--.d
...
,..... ~

R..,....., C1 "'- BRGHUJ( ,,- Figura 12.
Comunicacl6n Sene
--- ._- --~~.- ----_. ----
227
Compilador C CCS y Simulador PROTEUS para Microconlroladores PIC

8.2.12.5 Modulo Master SSP fMSSPI


El modulo MSSP es un interfaz serie capaz de comunicarse con perifericos U otro
microcontrolador. Puede operar en dos modos:
• Serial Peripheral liller/ace (SPI).
• lIller-llllegrated Circllit ([2e).
La interfaz 12C admite los siguienles modos:

• Master mode.
• Multi-Master mode.
• Slave mode.

~"- SPl ll

,,-...
CXPoIlOOoll
CXP..c.ru· l
DJ'-un:oIl
CKP_l.o;r_l

D_II1'~

U.. I_2
..
Df'IoIdol'!l16
"""'
-
eU .. I2[

" "0
'"
.,-- -,.
r: fIotI.w\...:I
,~

S~OIE.-.:I

Figura 13. Modo SPI Fi gura 14. Modo 12C

8.2.12 .6 Modulo de Compraclon/Captura/PWM (CCPJ


Dispone de tres modos de fWlcionamiento:
• Modo de Captura: se utiliza para medir eventos externos como 1a duraci6n de
pulsos digitales.
Modo de Comparacion: se utiliza para generar seiiales digitales con tempori-
zaciones programables. Este tipo de seiiales son muy utiles para e1 control de
etapas de potencia (convertidores DCIDC, DC/AC AC/DC, AC/DC).
• Modo PWM: se utiliza para generar senales de modulaci6n de ancho de pulso
(PWM).
Tambien existe un modulo de comparacion/captura/PWM mejorado (ECCP).

228
8. Gama AHa - Ple18
--
Dispone de cuatro modos de fundonamiento:
• Modo de Captura: se utiJiza para med ireven tosextemos como la duradon de
pulsos digitales.
Modo de Comparaci6n: se utiliza para generar senales digitales can tempori-
zaciones programables. Este tipo de seiiales son muy utiles para el control de
etapas de patencia (convertidores DefOe. DQAC, AC/DC, AC/DC) .
• Modo PWM: se utiliza para generar senales de modulaci6n de anrna de pulso
(PWM).
Modo PWM mejorado: se u tiliza para generar senales PWM complementa-
rias para el control de semi puentes de transistores.

5(Ol1lX! Khz. D~ Ia 4
1250.In)!:I>l.DtIj.ooOlu '
n2.SOOKhl. O~Io '

"
~"G<1a.MW
~"G<2"""

PmAntSludown5t"e £,II.... Co-nrw""""


DIMPNAnCto'o'
'"
RBOor~oICorl
PmBnOS~StaI. ABOoreo.r--dor2
D<iYe PN B nO to '0' ABO .. E.o!heo~""'"

Figura IS. Mooulas CCP y ECCP

NOTA

El m6du.lo ECCP no funciona correctamente en la ultima version del Proteus.


Es de esperar que LabCenter 10 solucia ne en breve.

229
Compilador CCCS YSimulador PROTEUS para Microcontroladores PIC

8.2.12.7 Modulo Comparador


El mOdulo de comparadores analOgicos contiene dos comparadores que pueden ser
configurados de distintas fonnas. Las entradas pueden seleccionarse entre las entradas
anal6gicas de los pins RAO a RA5. Las salidas digitales (normal 0 invertida) son accesi-
bles exterionnente y pueden ser leidas a traves de un registro de control.

"'"'"'".
'''''
''''' va ,.,
''''' t>a
t!1

'''''
hns'Sou'-fl

Fi gura 16. M6chdo Comparador

8.2.12.8 Modulo de referenda


EI mOdulo de referenda esta formado por una red de resistencias y permite selec-
donar una tensi6n de referenda.
,.
!_" OK
_ , 25
,~
,,,
HI'

,., L97

,,, 113 ( 1 . ~G

.
,". 1.67

. , ,."'''''".
,n a.
r 200
""
' .113 ""
• 00

,,.
2,19 .~
W

,,,
' .50 063
.83 3.13

D VraI-> F5 o Camp - ) V,e!


Figura 17. Refe-renc:ia

8.2.12.9 Modulo detector de Alto/Bajo Voltaje


Este m6dulo program able permite, al usuario, definir un punta umbra] de tensi6n
y la direccion de cambia. Si el dispositivo experimenta u n cambia en la tensi6n y en
la direcci6n indicada sabre e1 punta umbra! se produce una interrupcion.

230
8. Gama Alia - PIC18

--
,.~

_.'_L..,

Flgur.. 18. HLVD Y LVD

Ejemplo 1: Diseiiar 1m Reloj ell Tiempo Real (RTe) IIti/iZlIlldo la interrupcion del TMRI
COli osci/ador exterior; II l ilizar pam In Visuillizacioll un display de 7 segmentos (figura 19).
COmpOllelltes [SIS: P1C18F4520, RES, 7SEG-BCD Y Generador ISIS: Pulse.

Figur .. 19. Ejemplo I

E1 Proteus tiene un componente 7SEG-BCD que es un display 7 de segmentos con el


derodificador 7 SEC-BCD integrado, 10 que fadlita la simulaci6n.

El empleo del TIMER1 con oscilador exterior permite trabajar a dicho TIMER1 in-
duso ruanda el PIC esta en modo sleep. El Proteus no simula el oscilador extemo
del TMRI con cristal de ruaTZO (figu ra 20), por 10 que hay que sustitui rlo por un

231
Compilador CCCS YSimulador PROTEUS para Microconlroladores PIC

generador de pulsos con la frecuencia adecuada e introdudrlo por el pin RCO/TlO-


SO (figura 21). Al editar las caracteristicas del generador de pulso hay que cambiar
el Pulse (HigM voltaj,- a 5 V Y la freqllency a 32.768 Hz.

Para conseguir una internJpci6n cada 1 seg con d icha fr€CUenca hace {alta precar-
gar el TMRl a OxSOOO segUn los c.i\cuJos de la siguiente ecuad6n.

C1

""
D
.-
X1

C2
~

,,,.
Figura 20. TMRI con oJ"Cllador de cuarzo eMterno

np "" ..W""""',,,,,, I
ss
Figura 2' . TMRI con osdl;Idor eMterno slmuhdo ton un generador

-.- _ ..... VdO_


•,
,
-,....
"*""..:N .........

.---
""'-
~
"-'_('<0<01 :'u

---
:,~
r.. •... !SoaI

,--
•• ,, -.~

.--'"
~,

'--
""-.
...-
~_t

- .- ,
. ~">t

-
'
~

-~,
1--'
!!_fdh?
"' II.""-*"
_~oe<J

--~

Figura 22. Caracteristicas del generador Pulse

232
. _---
La internlpci6n del TMR1 debera ser de alta prioridad. ll'lS datos ~ ti:rwio se-
gundos, minutos y horas) se deben pasar a dos digitos en BCD.

NOTA

Se han utilizado los puertosA, By D (ya queel C es necesario para el oscilador). En


cl puerto A de los PlelS, la patiUa RA4 ya NOes un Drellador Abierlo peroel PRO-
TEUS sigue lratandola como tal, por 10 que haee falta una resistenda de pllll-lip a
la salida. En realidad esto no sena necesario. Por otra parte, la simulaci6n no es en
tiempo real por 10 que 1 segundo de simulaci6n puede tardar varios segundos de
procesador del ordenador; se puede comprobar la reladon en 1.1 barra inferior del
Prateljs dande nos indica el tiempo de procesado (figura 23).

Figuri'l 23. Tlempo de procesado


'include ~18F4520 . h>

Id<!vice high_ints-tx-ul! /IP<lca ZlUJnej<lT interrupciones de dlt", prioricad


luse delay(clock-lOOOOOOOJ
int horas-O, mi.nutos"O, segundos_O;
int LSdigito , MSdiglto , 1JCD ;
ITNT_TTMERl high //TnterrupcJ6n de 1l1ta prloridad del TMRl
VOID int_ tmrl (void)

segundoS-H· ; //Cuenta los segundo$


i f (segundos·"60)
{minutos+~ ; //Cuenta los minutos

233
Compilador CCCS YSimulador PROTEUS para Microcontroladores PIC

segundos-O; I
i f (minutos--60)
(hOCilS ++; //Cuen ta l~s horas
minutos-O;I
i.e (horils_24) horil.!l-O;
set_timed (OX8000); I/Precilrgil el TNMRl antes de Sillir

void BINaBCD(int valor) ( //Funci~n de convecsi~n de Bindrio d BCD


M$digi to " O;
i f (villor>-lO) (
dol
valoc-vdlor-l 0 ..
MSdigito++ ;
}while (villor>-lO):

L$digito-villor; //Unidades en BCD


MSdigi to-Msdigi to«4; //Decenil.!l en BCD (.!Ie desplilzan a 1" parte
/Idlta del int)
BCD-HSdigito I LSdigito; IIOR entre los dos m.imeros para obtener un
I/en tero que se pued" sacar directamente poe
/Iel puerto
void main ()

setup_ildcJ>Occs (NO_ ANALOGS I VSS_ VDD);


.!Ietup_",dt (WDT_OFF};
setup_timer_l (Tl_EXTERNALI Tl_ DIV_BY_11; //TMIl.l con oscilador externo
//modo asincrono y presc~ler-l

setup_comparator (NC_NC_NC_NCJ;
setup_veet(FALSE);
setup_ osc1l1~tor (Fa lse) ;
en~ble_ int.ercilpts (INT_TIMER1) ;
enable_interrupts (GLOBAL) ..
set_timer1 (OXSOOO); I/TMRl-655J6- (l/TQSel) -65536 -J276S-J276S"'OxSOOO
while(true)

BINaBCD(segundos); I/Crml"ier te los segundo" de bin~rio ~ BCD_.


OUTPUT_ D(BCD); /Ilos s~ca por el puerto D.
BIN/lBCD(minuto.!l} ;
OUTPUT_B(BCD);
BINaBCD(horas) ;
OUTPUT_A (BCD) ;

Figura 24. Programa del Ejemplo 1

234
8. Gama AHa - Ple18

Es necesario deshabilitar el watclldog en el PIC (6gu ra 25) .

--..
lofj,c.m ... _",

"'-,
.,
;f1t'".,,,m
,-
, _.
,- II
..
.,.. I

""'- ;""" -
_._. --I ... I
I
....
--
- -.,jIlGoM
r...
PI<9.. -1.,,.£' ....
[ "'-tN I
_Cb:I<f_ - I

-
I
-, - ~
--- - ""'
.... •


£[--~
_ _ I'CI!.--' -"_u. .....
[dI~ ___

Flgu,.. 25. Dtlrha billUd6n def Wiltchdog

Ejemplo 2: Efeoodor de tel/sio/l (voltaje-boost cOIwerto) am realimelltaci6/1 de con trol (6-


gura 26). Componentes ISIS: PIC18F4520, RES, IRF130, INDUCTOR, 1OBQ015 Y CAP .


-,"'"" "
-
"'
-
••

Figur. 26. Elevador de tensl6n

NOTA
En PROTEUS, el m6du lo comparador en el modelo del PIC1S no fundona co-
rrectamente en la simulaci6n, as! tambien el m6dulo fCCP tiene algunos pro-
blemas. Esperemos que LabCenler 10 solucione en breve.

235
Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC

Se configura el m6dulo CCP para trabajar en modo PWM y el comparador para


que compare la senal de salida (dividida por un coeficiente) y la tensi6n de refe-
renda intema (en este caso se fija a 3.59 V <lunque se puede modificar su va lor por
programaci6n). En el programa se modifica el mOdulo de referenda con la funci6n
setup_vrefO, pero el comparador se modifica directamente en su registro CMCON
ya que con la fundon setup30mparatorQ existe un incorrecta asignadon de vala-
res en el fichero <18F4520.h>.

El modu lo de referenda se configura para obtener un valor de 3.59 V mediante 1a


programaci6n del registro CVRCQN=ObnOOll11 0 en compilador C de CCS: se-
tup_vref(VREF_HIGH 115 1VREF _F5).

EI mOdulo comparador se configura para introducir la senal extema por RAO y


utilizar la referenda intema (figura 27) mediante la programaci6n del registro
CMCON= ObOOOOOll0, en C deberia ser setup_comparalor(AO_VR_Al_VR) pero
se ha detectado un error en la asignacion #define del fichero de cabecera (se puede
modificar 0 utilizar directamente el valor de CMCON ). La frecuencia de la senal
PWM se ha fijado en 4 KHz.

A CM2..CMD _ 110
RAO -CIS.~
RA3 ~. ~- . C1 ClOUT
+

RAl...L
RA2 -A.
-.-. C2 C20UT
+

VAEf
Figura 27. Modo del com~rador

EI sistema hll1ciona en un equ ilibrio dimimico, mientras la tension de salida (divi-


did a) sea menor que la VREF la senal PWM actUa, si es mayor la selial PWM es O. De
esta forma se consigue una tensi6n continua en la salida del convertidor. De esta
forma se consigue una V"",- 20 ± 0.27 V.
Es importante inicializar la salida (can un label tc=5 sobre el cable) para evitar
errores de convergenda en la simulacion.
linclude <18f~520.h>

I f uses XT , NOWDT
luse delAy (c1ock - 4000000J
Ibyte CMCON-OxFB4
Iby t e TRISA-Oxf"92

236
8. Gama Alta - PIC18

void main () (
int16 dutty ..
TIUSA- Obll101011 ..
CMCON- ObOOOOOl10 .. /lsetup_ r;Omp<lIator(AO_ VR_A1_VR):
setup_vref{VREF_HIGHI151 VREF_ FS) .. / /CVRCON-Ob11001111 :
setup_t1meI_2 (T'2_DIV_BY_ 4,62,1) ; //4XH7:
setup_ cr;pl (CCP_PWM) .. //CCPl ~n modo PWM
set_plfflll_ duty(714) ..

",hlle(ll (
If'(ClOUT) dutty-714; //Si VCut/Coef < \IRE£'
else dutty ..O; //Sj Vout/Coer > \IREI'"
setYh1ll1_duty(dutty) ..
}

Figura 28.Programa del ejemplo 2

Si se quiere utilizar una VR£Fdistinta a la intema para ajustar mas finamente la ten-
si6n de salida, se puede utilizar el m6clulo comparador segun la figura 29, introdu-
ciendo la senal por RAO y una referenda extema pOT RA3,
CM2,.CMO>o; 100
RAO A
RA3
, +
C1 ClOUT

RA1 A
ClOUT
RA2~

Figura 29, Modo del Comparador

,. ~

~T~

I
~
F
i
':
.
';1
ti

I~ :r~
"
• .-'
~
~. ,

. .rrn; 0'-
-- . "- .:I -"".:::-
~
~

Figura 30. Clrculto con referenda ektern;!l

237
Compilador CCCS y Simulador PROTEUS para Microcontroladores PIC
------
'include <18t4520.h>
,tu5es XT,NOWOT
'use del~y(clock·4000000)

'byte CHCON-OxFB4
Ibyte TRISA-OxF92
void m/JJn (J (
intI6 dutty;

TRISA .. Obll1010ll;
CMCON .. ObOOOOOlOO;
setup_timer_2(T2_DIV_BY_ 4,62,1);
-,etup_ ccpl (CCP_ f>tiHJ ;
setywml_duty(714) ;

t.hile (1) (
IF(ClQUT) dutty .. 714;
else dutty-V;
set_pwml_ duty (duccy);

238
9. Real Time Operating System - RTOS

Capitulo 9

RTOS - Real Time


Operating System
9.1 Introduccion
EI Sistema Operativa ell Tiempo Real simplifica el desarrollo de una aplicacion y,
mediante el uso de tareas, reduce los errores de programaci6n. En general, se pue-
de definir un RYOS como un programa que trabaja en segundo plano, controla la
ejecuci6n de variai'; tareas y facilita la comunkaci6n entre eUas. En el caso de que se
este ejecutando mas de una tarea aJ mismo tiempo, el sistema se denomina multi-
tarea; cada tarea tiene asignado un tiempo de proeesador.
El RTOS no es exactamente un so (sistema operativo) a pesar de que los dos se
basan en un nudeo (kernel) que se encarga de c:ontrolar la de ejecuci6n de las tareas.
La diferencia estriba en la carga inicial, si es sOlo el nudeo (RTOS) 0 si ademas se
cargan otros procesos (SO). EI RTOS esta pensado para trabajar con los microcon-
troladores. Puede utilizarse en los PIC de garna media pero donde mayor rendi-
miento se obtiene es en los PIC de garna alta.
EI RTOS que utiliza CCS permite el PIC ejecute regularmente las tareas programa-
das sin necesidad de interrupciones. Este se logra a traves de la funcion RTOS_
RUNO que actUa como planificador de tareas (dispatcher). La fundon del planifica-
dor consiste en dar el control del procesador a la tarea que debe ejecuta rse en un
momento dado.
Cuando la tarea ha terminado de ejecutarse 0 ya no necesita del procesador, el
control de dicho proeesador es devuelto al planificador el cual dara el control del
procesador a la siguiente tarea que este Lista para ejecutarse en ese momento. Este
p rocesa se conoee como cooperativo multitarea (cooperative multi-tasking)
Un buen ejemplo de la optimizacion del usa del PIC con el RTOS es el PID utilizado
en el tema sobre el m6dulo CCP para regular la temperatura de un homo (ejemplo

239
Compllador CCCS VSimulador PROTEUS para Microconlroladores PIC

5). Estudiando el programa realizado en esa ocasion se observa como el rrc esta
totalmente ocupado en realizar el proceso PID; si se necesitase utilizar dicho mi-
crocontrolador para realizar mas funciones se deberia realizar una programaci6n
bastante compleja, intentando siempre respetar el tiempo de muestreo del PID.
Utilizando el RTOS en dicho ejemplo, no sOlo se simplifica el programa sino que
adenlils se consigue mejorar Ia respuesta en el sistema ya que se optimizan los re-
cursos del micro.

De los dos casas estudiados (tiempos de muestreo de 100 ms y 1 ms), en el primer


caso se reduce el sobreimpulso y las oscilaciones y en el segundo caso se alcanza
antes la temperatura fijada (Figura 1).
Pero ademas, la utilizacion de RTOS va ha permitir aiiadir fadlmente mas tareas al
PIC como veremos en los pr6ximos ejemplos.

.~..- --

Sin RTOS
f-!--+---j_--'1001~+--+--+-1
t
-=trt:=t=r==C~"ii~~T~•O:j::===::j:=:I:1
. ....j T

... I~ --r--+--t
.,

,. Sin RTOS , CO" TOI


m " 1m.

f- -
t
--t
.1---- -I-- -
.,.
....
-"

Figura 1. Respuesta del PID con y sin prograrnacl6n RTOS

9.2 RTOS en C
Las funciones que incorpora CCS para la gestion del RTOS san las que aparecen en
la siguiente tabla:

240
9. Real Time Operating System - RTOS

rlOSJunO Inicia la operaci6n del RTOS. Todns las {areas sc ejecuta"


a traves de esta funcion.
rtos_lermi nate() Finaliza la opcracion del RTOS y devuclve e! control al
programa principal, a la linea siguicnle de la funci6n
nos runO."Es como una fuoci6n RETURN.
rlos_cnable(lask) Habilita una de las tareas RTOS. Una vez la tarea es
habilitada, ], funcion rrosJunQ IillmarA a esla tarea
cuando Ie toque por liempo. EI parnmetro de esla funci611
cs el nombre de la tarea.
rtos_ disablf.'(t8Sk) Deshabilita una de las tareas RTOS. Una vez 18 tarea es
deshabililada, la funci6n rlos_nmO no lIaman\. a esta tarea
ha~ta que vuclva a ser habilitada mediante la funci6n
rlos_ellableO.EI parametro de esta funeion es el nombre
de la taIea.
rtos_msuoliO Devuelve un TRUE si hay un dalO en la cola de mensajes
de tarcas.
rtos_ms~rca dO Devuelve c[ siguicnte byte del dato cuntenido en la cola de
mensa'es de [areas.
rtns_RlslL,send(task,b)1e) Envia un byte de datos para una tarea conereta. EI dato es
situado en la cola de mensa'es de !.areas.
r tos.....vieidO Se llama desde una de las tareas y devuelve el control del
programa a la funci6n rIDS_nmO. Todas las tareas dcben
tener una Hamada a esta funci6n aJ finaJ de su e6digo.
rtos_sigllltl(s('OI) Incrementa un SEMAFORO quc sc utiliza para difundir 1a
disponibilidad de un rccurso limitado.
rtos_wait(sem) Espcra a que el rccurso asocilido con el semaforo eSle
disponible y emonces decrementa ,] semaforo p"a
reclamar el rceurso.
rtos~await (expre) Espera a que la EXPRESION sea TRUE antes de pemlitir
Que la larea continue.
rtos_ overrun(task) Retorna un TRUE 5i la tarea ha sobrepasado el liempo
permitido de eiecuci6n.
rlos_ slals(lnk,stat) Relorna una EST ADiSTICA de una larea concreta. La
estadistica incluye , ] ticmpo minimo y maximo d,
ejecuci6n de la tarea y el tiempo total que 18 tarea ha
sobrenasado su eiccuci6n.
Las directivas asociadas son dos:

luse rtos (options)


Las OptiOIlS pueden ser las sigujentes (separadas par comas):
timer-X: donde X (0 a 4) indica el TIMER que se utilizani pa ra la ejecud6n de
las tareas. EI TIMER seleccionado debe utilizarse para el RTOS.
minor_cycle=time: donde TIME es un numero seguido de s, ffiS, I1S 0 ns. Indi-
ca el tiempo que debera tardar e n ejecutarse una tarea. Los tiempos de ejeClI-

241
Compilador CCCS y Simulador PROTEUS para Microcontroladores PIC

cion de cada tarea deben ser mUJtiplos de esta cantidad. Si no se especifica, el


compilador se encaTgani de calcularlo.
statistics: indica el tiempo minimo, maximo y el total utilizado por cada tarea.
:task (options): Esta directiva indica al compilador que la funcion que Ie si-
gue es una tarea de RTOS.
Las options pueden seT las siguientes (separadas por comas):
rate:time: donde TIME es un numero seguido de s, ms, ps, 0 ns. Especifica
la frecuenoa can se ejecutani la tarea. Debe ser iguaJ 0 multipla del valor mi-
liar_cycle.
mar-time: donde TIME es un numero seguido de s, ms, ps, 0 ns. Especifica
el tiempo de ejecuci6n de la tarea. Este tiempo debe seT menor 0 igual que el
valor millor_cycle. EI compilador no puede hacer cumplir este tiempo por 10
que el pragramador debe tener cuidado en asignar el tiempo de ejecuci6n.
Ademas, este tiempo activa la funcion rfos_ovcrrun(fask).
queue=bytes: especifica cuantos bytes son colocados en la cola de mensajes.
EI valor por defecto es O.
Como primer ejemplo se puede utilizar el controlador PID (ejemplo 5) del tema
sobre el modulo CCP. Comparando el p rograrna escrito en aqueUa ocasi6n y el que
se presenta ahara con RTOS (Figura 2), se observa que el bloque del PID que estaba
en el programa principal es ahara una tarea . El tiempo de muestreo estaba espcci-
ficado can un de/ay_msO y ahara se utiliza el tiempo de ejecuci6n de la tarea como
tiempo de muestreo. Tal como se ha comentado en c1 punto anterior, se ha obtenido
una mejora en el fundonamiento del sistema (Figura 1).
#INCLUDE <16F877 . b>
Idevice adc-10
#use delay(clock-4000000)
Ituses XT , MOWDT
IByte TRISC .. Ox 87

//Di r eceiva del RTOS

int16 valor ; /Ilectura de t emperatura


int16 control; //valor del PWM
float a-O . 1243; Ilcon,tante" del PID para lOOms
float b-O.00006;
float c"62.l514;
float terop_limit ..SOO.O,. II temperatura a alcanzar
float rT,eT,pT, qT,yT , uT; //variable" de ecuaciones
floa t pT_l-O.O;
float eT_l-O . O;

242
9. Real lime Operating System - RlOS

float max~lOOO.O; //limices mJximo y minimo de control


float min-O . D,.

'task (ra te - lms, m.!Ix"lms) IIIndica que la $iguiente funci6n es una Tarea
void pid ( ) ; //que se ejecutara cada lOOms .

void lIJilin{) (
TRISC-O;
setup_timer_ 2 ft2_div_by_ 4,249, I) ; /IPeriodo de 18 se~a1 PWM alms
s .. tup_ccpl (ccPJOI1IJ) ; I/MOdu10 CCP a modo PWM
setup_"dcyorts /iJll_analog) ; IIPuer to A analdgico
Siltup_ .. dc (AOC_ CLOCK_INTERNAL),. /Ireloj conVl!rtidor AD interno
"et_"dc_ channel (D) ; IILec tura por e1 canal 0

IIInicia 113 o~raci6n de RTOS

void pid ( IITiJrea PID

output_ hitr PIN_CD, OJ;


valor_read adc();
yT"v021or" 5000. 0/102.4.0 ;
rT-temp_limit;
eT ..rT-yT,.
pT-b · eT+pT_l,.
qT-c ' (eT-eT_I) ;
uT=pT+a 'eT+qT;
if (uT>max)
uT-max; }
else (
if luT<minJ f
uT..m1ni)

control-uTI
setYIilnI_ duty (control) ;
pT_l-pT;
eT_I-eT;

Flgu,.. 2. Prog,.. m .. del PID con RTOS

En el ejemplo se puede anadir una tarea que permita visualizar en un display LCD
la temperatura que tiene en homo (figura 3). AI manejar varias tareas es convenien-
te utilizar la funcion rtos-yieldO para devolver el control aJ planificador de tareas

243
Compilador CCCS y SimuladoT PROTEUS para Microcontroladores PIC

y coordinar las tareas mediante las fundones rtos_waitO y rtos_signaIO; para utili-
zar estas dos fundones se debe utilizar un "semaforo", el cuaJ permite a una tarea
utilizar un rectlrso com partido 0 esperar en el caso de que este en lI SO•

..
-"

IT~~ .. • 35 . 64

Fig~ril 3. Dos tareils: PID y DISPLAY

En este ejemplo no se utiliza ningtin recurso com partido, por 10 que no 5e u tilizan
las fundones rtos_waitO y rtos_signaIO .
JINCLUDE <16F811 . h.>
Idevice adc - lO
luse delay(clock - 4000000)
Ifuses XT,NOWDT
Jinclude <lcd.c'>
luse rtos (timer-O , minor_cycle-lms)
IByte TRISC - ox87
int!6 valor , conteol;
float a-o.1243.
flOlft b-O . 00006 ;

244
9. Real Time Operating System - RTOS

flOiH c-62.1S14,.
flo"t temp_ lrmrt-SOO.O;
nm rT,eT,pT,qT,yT,uT ,.
flo"C pT l-C.';

",'" 1-0.0;
"-
tlo.:Jt 1ILII,,-1000.0;
flo.Jt Iftin-C . O;
no"c temper,,;

'Cask(rat8~lns,ma"·lms) tTacea del pro


void rId ( ) ..

It .. ,.", (r" roO-lOrn,., /11",,-1 /II.~) //rIJrea del DISPLAY


void display( );

void ~ln () (
lcd_Jnlt():
TRISC-O;
.!letup_ t i.mer.. 2 (t2_ di v_by. 4,249,1) ..
~etup_ccpl (ccp.PIl1ll),.
setup_adc-porcs r.Jll_"n.Jloq) ,.
.!Iet"p ."dc(AOC .CLOCK. INTERNAL);
sec_.rdc_ch.lnnel fO),.

void pid ( ) //T"cea del prD

valoc-reiJd_"dc(} ,-
yT-v"loc'SOOO. 0/1024.0;
rT-temp_limi t:
eT-rT-yT ;
pT-b'eT+pT_l,.
qT-c ' (eT-eT_l);
uT-pTt-a ' eTt-qT ;
i t (uT>m.. ,,)
uT-ma,,; J
else {
;j t (uT<lllin) r
uT-min: J

control-uT;

245
Compilador CCCS y Simulador PROTEUS para Microcontroladores PIC

setywrnl_duty (control):
pT_1 - pT;
eT_ l-eT;

nosyie1d(J ; liSe devue1ve e1 control a1 planiflcador


}

void display () IITareiJ del DISPLAY

lcd_90tOJfY (1,1) ;
temperiJ-yT/10;
printf(lcdyutc, ~Temp- If"·, tempera):

liSe devuelve e1 control al planjfjcador

Figura 4 . EI programa

Las variables se pueden definir de forma global 0 particular como en cualquier


funci6n . En el caso de variables globales, todas las tareas pueden utilizarlas, pem
en el caso de funciones particulares se pueden utiliza r las funciones de rorreo:
rtos_fisS-pollO, rtos_fi ss-rea dO y rlos_mss-send(task,byte) para transferir in-
formacion. En el ejemplo anterior la variable utilizada es global, por 10 que puede
ser utilizada por las dos tareas, pero en el caso de ser local se podrian ulilizar las
funciones de correa (aunque la variable sea global tambien se pueden u tilizar).
En el caso de variables globales puede seT interesante el usa de e stas funcion es en
aquellos casos en los que una de las tareas este esperando que la variable modifi-
que su valor a traves de olTa tarea .
Para utilizar estas funcianes en el ejemplo se modifica la lIamada a la tarea DIS-
PLAY Yse aitade una variable para el correa (figura 5).

Icask(riJte - 10ms,milx-lms,queue-2) / /Cola dc 2 bytes .


void display( };
Figura S. MocUficaciones clel programa 11/

Se realiza el envlo de la variable valor desde la tarea PID y se recibe en la tarea


DISPLAY para su posteriOT usa (figura 6). EI resultado es similar al del ejemplo
anterior.
void pid ( )

valor- read_adc() ;
yT-valor~5000.0/1024.0;

rT-temp_1lmit:

246
9. Real lime Operating System - RlOS

I/El resto de cOdigo como slempre


nos_lIlsg send(d.lsplay, valor) ; /IEnvla los 2 bytes de Valor a DISPL.AY
rtosyieldl! ;

void display()

valor_l-rtos_ msg_reild () ,. /IRecibe los 2 bytes de Valor

temper.. -valor"': 1 ·500 . 0/1024.0 ;


lcd_gotox y (1 , 1) ,.
printf(lcdJutc, ~Temp. if'" , tempera);

Flguril 6. ModlRcilciones del programa 1"1

Para terminar can este ejemplo se ha aiiadido una tercera tarea que permita modi-
ficar la temperatura limite en cualquier momenta mediante un bot6n en la patilla
RBO. Para esta tercera opcion se ha cambiado a un PIC18F4520. Como ya se ha
comentado, el RTOS adquiere toda su eficiencia en los PIC de gama alta (figura 7).
" 1" _ _ ,,.
,

j
.• ~"

"

~' -,'.'7
T.~.'
~,

Lt~'h' 51

Figura 7. Tres tareas: PIO, DlSPLAYy TECLA

247
Compilador CCCS YSimulador PROTEUS para Microconlroladores PIC

Dado que en este caso se modifica una variable en dos de las tareas es conveniente
utilizar las funciones rtos_waitO y rtos_signalO (figura 8).
IINCLUDE <18F4520 . h>
Idevice adc-l0
luse delay(clock-4000000)
IEuses XT,NOWDT
linclude <lcd.c>
luse rtos (timer-O , minor_cycle-lms}
luse standard_ io{B)
luse standard_io{c)
Idefine BO PIN_ BO

int16 valor; //lectl1ra de temperatl1ra


int16 control; //va10r del PWM
float a-0.1243 ;
float 1>-0 . 00006;
float c-62 . 1514 ; //constantes del PID
float temp_limit-SOO.O; //temperatura a .. lcan:;!ar
flollt rT,eT , pT,qT,yT,I1T ;
float pT_ I-O . 0 ;
flollt eT_1-0.0 ; //variables de ecuaciones
float max-lDDO . O;
float min-O . O; //limi t es maximo y minima de contrOl .
float tempera ; //Para visualiur Ia temperatu r a de l .'lorna .
int16 t_l ; //PlIrll visI11l1izIlr III temperatura limite .
intS sem ; //Variable de semA f oro .

Itask(rate-lms , max-lms)
void pid ();

Itask (rate-lOms,max-lms,queue-2)
void display ( );

Itask(rate-lDms , mllx-lms)
void teclado ( );

void main {J {

248
9. Real Time Operating System - RTOS

setup_cimer_2(t2_div_by_4,249,1); //pedodo de 1" sefld1 PWM" 1ms


setup_ccpl (ccpylffll); //Modu10 CCp" modo PWM

setup_ adc_ports ("11_"nalogl ; //Puerco A ana16gico


SE>tu.o_ ade (ADC_ C.LOCK_ INTERNAL); //reloj convercidor AD lnterno
set_"dc_ch"nnel (0);

selll- 1 ;
..-tos_run ( );

void pia ( )

valor-raild_ddc {I; //Lectura de 1" temperatura


yT~valor · 5000. 0/1024.0; //converSl0n .. mV (0.25V a 250mVI
rT- temp_limit;
eT ....-T-yT; //C4lclIlo error
pT_b"OT+pT_l; //C~lculo del termino inteqral
qT- c· (eT-eT_l); //Calculo del terllllno derivativo
uTwpT+-" "eTtqT i //Calcul0 de 1a slflidlf PID

i f (IIT>mllx) //Slflid,a PID sl es mlfyor que e1 MAX


liT-max; J
else r
i f (uT<IlI.i.n) I //SalidiJ PIO si es /!fenOr que el MIN
uT-min;}

control-uT; //TCI:msferencia de sillidlf PID If se"lIl PWM

pT_l ..pT; /!Gullrdar variables


eT_1-eT;

reos_siqnlll (sem);
rt os_yleldlJ ;

voId displ .. y()

rtos "'lflt (sem);

249

Compilador CCCS YSimulador PROTEUS para Microcontroladores PIC

temperil-yT/IO:
lcd_gocOKY (1,1) ;
princf (lcdyutc, «Temp- tF\n», tempera):
t_l - temp_limit/lO;
princf(lcdYlJcc, "Limite- t LI,IN, t_l):

reos_signal (sem);
rtosyield() :

void teclado(}

rtos_ wai t (sem) ;


if (input (PIN_ C.f) --0) cemp_limi c- temp_lim.! t +l 0.0;
i f (temp_limit;;. 1000.0) temp_limlt - 500.0;

rtos_signal (semI;
rtosyield() ;
J
Figura 8 , Programa con PICt8F4S20

250

10. USB - Universal Serial Bus

Capitulo 10

USB - Universal Serial Bus


NOTA DEL AUTOR

Cuando este libro eslaba pnkticamente en imprenta, LabCenter realiz6 una


actualizacion de la version 7 can un nuevo (y esperada) madelo: el USB (USB-
CONN). CCS C ya proponia ejemplas y suministraba librerias para utiJizar USB
que no se podian simuJar en ISIS. Con este nuevo modelo se puede abandonar
ya la simu lacion por puerto serie RS-232 (la mayoria de los PC ya no disponen
de este puerto) y afrontar el USB. Al estar ellibro en imprenta, s610 he podido
inc1uir alga de teoda basica de USB y algUn ejemplo sendllo sabre I"ffiulad6n
RS-232 con USB; espero que si hay masedidones de este libra pueda completa r
y aumentar este capitulo.

10.1 'ntroduccion
EI Hils 5erie Utziversal fue creado en los anos 90 por una asociacion de empresas con
la idea, entre otras, de mejorar las tecrucas pIlIg-mld-play, es decir, permitir a los dis-
positivos conectarse y desconectarse sin necesidad de reinitiation, configurandose
automaticamente al ser conectados; ademas se Ie dat6 de transmisi6n de energia
electrica para los dispositivos conectados.
Este bus tiene una estructura de afbol y se pueden ir conectado dispositivos en
cadena, pudiendose conectar hasta 127 dispositivos permitiendo la transferencia
sincrona yasincrona.
Se puede c1asificar segUn Sll velocidad de transferencia de datos (desde kilobits
hasta megabits): Baja Velocidad (1.0) utiJizado para los Dispositivos de lnterfaz
Humana (HlD) como ratones, etc.; Velocidad Completa (] .1) Y AJta Velocidad (2.0)
para conexiones a lnternet, etc.

251
Compilador C CCS YSimulador PROTEUS para Microcontroladores PIC
-----
Fisicamente, los datos del USB se transmiten por un par trenzado (0+ y D-) ademiis
de la masa y alimentacion (+5V). Los conectores estan sujetos al estandar (tipo A,
tipo B).
USB es un bus punta a punto, can inicia en el HOST y destino en un dispositivo
o ~n un HUB; 5610 puede existir un tmico HOST en la arquitectura USB. HOST se
define como el dispositivo maestro que inidaliza la comunicacion y HUB es el dis-
positivo que contiene uno 0 mas conectores 0 conexiones hacia olros dispositivos
USB; cada conector es un puerto USB. EI protocolo de comunicaci6n se basa en el
paso de testigo (token), donde el HOST proporciona el testigo al dispositivo selec-
cionado y este Ie devuelve el testigo como respuesta.

10.1.1 Migracion de RS232 a USB


La interfaz serie Rs-.232 esta desaparecienda priiclicamente de los ordenadores per-
sonales y esto supone un problema, ya que muchas de las aplicaciones con micro-
C'ontroladores utilizan este bus para su comunicacion con el Pc. La soludan ideal
es migrar a una interfaz USB y existen distintas formas de hacerlo. EI metodo mas
sendUo es emular RS-232 con el USB, con la ventaja de que el PC vera la conexi6n
USB como una conexion COM RS-232 Y no requerira cambios en el software exis-
tente. Otra ventaja es que se utilizan drivers suministrados por WindoUlS, por 10 que
no es necesario desarrollar uno nd 11O{; estos drivers son el usbser.sys y el ccp ort.
sys. Ademas, puesto que el protocolo USB maneja comunicaciones de bajo nivel,
los conceptos bnlld rate, bit de paridad y control de fluio para el RS-232 ya no im-
portan.

10.1 . 1.1 USB CDC ICommunicatlon De-vice- Class'


Una clase USB es una agrupacion de dispositivos de caracteristicas comunes, es
decir, utilizan una misma forma de C'omunicarse con el entomo. La dase de dis-
positivo permite conocer la forma en que la interfaz se comunica con el sistema, el
cual puede localizar eI driver que puede controlar la coneclividad entre la interfaz
y el sistema.

USB 5610 permite a1 driver comunicarse con el periferico a traves de las tuberias
(Pipes) establecidas entre el sistema USB y los endpoints del periferico. Los tipos de
transferencia a traves de las pipes dependen del endpoillt y pueden ser: Bulk, COltlrol,
Interrupt e Isochronous. Una tuberia es un enlace virtual entre el HaSTy el dispositi-
vo USB, dandese configura el ancho de banda, el tipo de transferencia, la direcd6n
del flujo de datos y el tamano del paquete de datos.
Estos enlaces se definen y crean durante 1a inidalizacion del USB. Un elldpoi"t es
un bl/ffer dentro del dispositivo a periferico donde se aimacenan paquetes de infor-
maci6n; todos los dispositivos deben admitir el clldpoi"t 0, el cuat recibe el control y
las petidones de estado durante la enumeracion del dispositivo. Cuando se conecta
un disposi tiv~ al HOST se produce la enumeraci6n en la cual el HOST interroga a1

252
10. USB - Universal Serial Bus

dispositivo sobre sus caracteristicas principales, asigmindole una direcdon y per-


mitiendo la transferenda de datos.
La espedficaci6n Clase de Oispositivo de Comullicaci611 (CDC) define algunos mo-
delos de comunicacion, incluyendo la comunicacion serie. Windows suministra el
driver usber.sys para esta especificacion. Para la especificacion CDC se necesitan
dos interfaces USB, primero la interfaz COlllmunication Class usando un IN interrupt
endpoint de interrupd6n y el segundo es la intefaz Data Class usando un OUT blllk
clldpohlf y un [N bulk endpoint. Esta interfaz es utilizada para transferir los datos
que normalmente deherian ser transferidos a traves de la interfaz RS-232.
Desde el punta de vista de sistema USB, el dispositivo puede tener distintas con-
figuraciones, para cada una de las cuales puede funcionar de forma distinta. Los
dispositivos suministran la informaci6n necesaria al sistema USB a traves de los
descriptores; estos contienen unos campos que permiten al sistema clasificar al dis-
positivo y asignarle un driver. La primera informacion que necesita es 1a del fabri-
cante y producto (USB vendor ID - VIP Y el Prodllet ID - PID). EI VIP es un numero
de 16 bits asignado porel USB implel/lmters FOfllm (USB-IF) y debe ser obtenido por
el fabricante del dispositivo USB; cada V/D puede contener 65.536 PID diferentes
ill ser tambien un numero de 16 bits. Microchip suministra su vcr y los pro para
cada familia de PIC can USB.
Microsoft Willdmvs (2000 0 XP) no tiene un fichero ".infestandar para el driver CDC,
as! que es necesario suministrar este fichero ruanda se coneda un dispositivo USB
par primera vez al sistema. Microchip suministra el fichero mchpcdc.inf necesario
para sus dispositivos PIC.

10.2 USB con ISIS y CCS C


10.2.1 USB en ISIS
LabCenter ha incorporado, en su version 7, dos herramientas para la simulad6n de
circuitos can USB: el conector USB [[amado USBCONN (figura 1), el rual permite
conectar y desconectar el bus y el visualizador de USB Hamada Analizador de Tran-
siciones USB (figura 2); este ultimo se debe adquirir como un mOdulo aparte.

Figura 1. USBCONN

Ademas, el software de LABCENTER incorpora los drivers necesarios para la simu-


ladon con USB. Para instaJarlos hay que iT a la opcion INICIO > PROGRAMAS >

253
Compilador C CCS YSimulador PROTEUS para Microcontroladores PIC

PROTEUS 7 PROFESSIONAL> VIRTUAL USB> INSTALL USB DRIVERS. Tras este


proceso ya se puede trabaja r con el USBCONN.

Figura 2 . An"IIzador de Translclones USB

10.2.2 USB en CCS C


CCS suministra librerfas para comunicar PIC con el PC utilizando el bus USB, me-
diante perifericos internos (familia PIC18F4550 0 el PIC16C765) 0 mediante dispo-
sitivos externos al PIC (del ripo USBN9603).

Las librerias suministradas son:

• p ic_usb.h : driver de capa hardware de la familia PIC16C765.


• pic_18u sb.h: driver de G;lpa hardware de 1.1 familia PIC18F4550.
• usbn960x.h : driver de capa hardware para el dispos i tiv~ externo USBN9603/
USBN9604. De esta forma, se puede utiliza el bus USB en cualquier PIC.
• usb .h: definiciones y protatipos utilizadas en el driver USB.
usb.c: El USB stack, que maneja las interrupciones USB y el USB Setup Requesfs
en Endpoint O.
• us b_cdc.h : driver que permite utilizaruna dase de dispositi v~ CDC USB, emu-
lando un dispositivo RS232 y 10 muestra como un puerto COM en Windows.
Las funciones mas importantes, entre atras muchas, son:

• usb_inHO: lnicializa el hardware USB. Espera en un bude infinito hasta que


el periferico USB es conectada a1 bus (aunque esa no significa que ha sido
enumerado por el PC). Habilita y utiliza 1.1 interrupci6n USB.
• usb_taskO: Si se utiliza una deteccion de canexion para 1.1 inicializacion, en-
tances se debe Uamar peri6dicamente a esta func ion pam controlar el pin de
deteccion de conexi6n. Cuanda el PIC es canectada a desconedado del bus,
es!a funcion inicializa el periferico USB 0 resetea el USB stack y el periferica.

254
10. USB - Universal Serial Bus

usb_enumeratedO: Devuelve un TRUE si el dispositiv~ ha sido enumerado


por el PC y, en este caso, el dispositivo entra en modo de operad6n normal y
puede enviar y redbir paquetes de datos.
Existen fundones espedficas para CDC, entre elias:

ush_cdc_putc(c): Es identiea a Pllt(C) y envia un cankter. Coloca un cankter


en el bllffer de transmisi6n; en el easo de que este Ileno esperaril hasta que
pueda enviarlo.
usb_edc-sete(c): Es identica a get(c) y lee un eankter. Recibe un cankter del
buffer de transmisi6n; en el easo de estar vado esperara hasta que se reciba.
CCS aporta varios ejemplos de aplicad6n de USB segiln las dases de dispositi-
vos, por ejemplo para el CDC encontramos el EX_USB_SERIAL.C y el EX_USB_
SERIAL2.C

Ejemplo 1: Ellviar los datos de IIl1a conversi6n AD al puerto USB como Virillal Comm.
Componellirs ISfS: PIC18F4550, USBCONN, POTLlN, CELL, RES Y LED-BLUE.
EI ejemplo se basa en la aplicaci6n para CDC, EX_VSB_SERIAL2.C, donde el USB
emula un puerto serie COM. De todas las posibles dases de dispositivos, la CDC
es la mas sendlla de apliear y entender (dada su similitud can el fundonamiento
de un puerto serie). EI ejemplo EX_USB_SERIAL2.C permite la visualizacion de
una parte de la memoria EEPROM del PIC La estructura de librerias de CCS se
muestra en la figura 3.

EX_USB_SERIAL2.C I
#include "l8F4S50.h"
#include "usb_ooc.h"
I
IUSB_CDC.H I
#Include "piela_usb h"
#irlCluda "usb_desc_cdc.h" _ I USB OESC COC.H
IJirlClude "i.b.C:> #ll'lcluda "usb.h"

! US8.C J
#include "usb.h>

Figura 3. Ubrerias en ElLCDC_SERlAL2.C

Se va ha modificar este ejemplo para adaptarlo a los ejemplos del tema 7 sabre los
puertos serie. Ademas de modificar el programa principal, hay que realizar una
modifieadon importante en la librena de deseriptores USB_DESC_CDCH, donde
se indica, al final de la libreria, el fabricante y el producto (VlP/PID); en este easo
aparece:

255
Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC

Ox61,Ox04, //vendor id (Ox04D8 is Microchip, or is it Ox0461 ??) ..... 8,9


Ox33,OxOO, Ilproduct id = 10,11
Para trabajar can Microchip hay que indicar en el identificador de fabricante el
VENDOR ID Ox04DB y en el identificador de productor el PRODUCT ID OxOA para
la familia de los PIC1S. Es decir, esas dos lineas deben de quedar asi (es aconsejable
hacer una copia de la libreria original antes de proceder al cambia):

OxD8,Ox04, Ilvendor id - 8,9


OxOA,OXOQ, Ilproduct id -= 10,11

Estos dos identificadores permiten la conexion can el driver de WilJdows; al iniciarse


la conexion, Willdows recibe los dos identificadores y local iza el driver necesario
para la conexi6n. En el caso de no localizarlo, permite la instalacion de los recursos
necesados para la conexi6n; en este caso a traves del fichero mchpcdc.inf suminis-
trado por Microchip.

Por otra parte, al final de la libreria se encuentra la descripdon textual del disposi-
tivo que sera detectado par Windows; para ella utiliza USB_STRING_DESC. Se puc-
de modificar a gusto del usuario, teniendo cu idado con la definici6n de la posici6n
de s~rjllgs y sus tamai'ios.
ch" USB_STRING_DESC_OFFSET[[-[O,4,12[;
char const USB_STRING_DESc[]-1
Ilstring 0
4, //length of string index
USB_DESC_STRlNG_TYPE, Iidescriptor type Ox03 (STRING)
Ox09,Ox04, I/Microsoft Defined for US-English
Ilstring 1
8, l/length of string index
USB_DESC_STRING_TYPE, Ildescriptor type Ox03 (STRING)
'C',O,
'C',O,
'5',0,
Ilstring 2
30, l/length of string index
USB_DESC_STRING_TYPE, I/descriptor type Ox03 (STRfNG)
'C',O,
'C',O,

256
10. USB - Universal Serial Bus

'5',0,
, ',0,
'R',O,
'5',0,
'2',0,
'3',0,
'2',0,
, ',0,
'0',0,
'e',O,
'm',O,
'0',0
I;
EI ejemplo (flgura 4) realiza la lectura de una senal analogica par el canal AND y
envia el dato por el USB elT\ulando RS-232, de forma similar al ejemplo 2 del lema
7; cl dato sc enviani solo en eI casa de que vade la tension.

,-,'"

Figura 4. Ejemplo I

AI iguaJ que en el tema 7 se puede utilizar el Hypertermillul de Windows (0 cualquier


otro visor del puerto serie) para visualizar los datos. En este casa, hay que esperar
a conectar e l US B para que aparezca el puerto en las posibles conexiones del Hy-
perfermillili.

257
Compilador CCCS y Simulador PROTEUS para Microcontroladores PIC

......
,
is
-,.~-
.o~ (I
V"lt_- ' 99V
V,,"_1 .4')Y
V"lt_2.4 W
V"lt_2 . 9911
V"II_-3.49Y
V"II_- 2 9911
~,,]t_-8 oov

Figura 5 . Hypertermlnal conectado ill puerto VJr1uai

#include <18F4550.h>
'device "dc- lO
IEu5e5 HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,QSBDIV,PLL5 , CPQOIV1 , VREGEN
luse delay(clock - 48000000)

linclude <u5b~cdc . h>

void maln () (
BYTE 1 , j , addres5, vallle;

int16 q,ql;
noat p;
ql-0;
setup~ddc""porcs (ANOI VSS_ VOO),.
setllp~ ... dc (ADe_CLOCK_INTERNAL);
.set_ adc_ Channel (O),.

usb_cdc~init I} ,.
u5b_ inlt () ..

do
usb~task() ;

i f (usb_enumerated(})

q " read iiJdc();


i f (q! - ql) f
p o. 5.0 • q / 1024 . 0;
printf(usb~cdcJutc, " \n\c Volt"ge - tOl . 2fVN, pi ;

258
10. USB - Universal Serial Bus
----------------------~
ql-q :
delay_ms (500);

} loIhJ.le (TRUE) J

Fig"r.. 6 . Programa del ejemplo 1

La configuraci6n de PIC18F4550 es la habitual, tan sOlo debemos tener en cuenta


que la frecuencia debe ser de 48 M1-Iz pero que utilizando el bit de configuraci6n
PUS se puede emplear un cristal de cuarzo exterior de 20 MHz. Es importante
cantigurar el pin de detection del sentido de transmision (USB_CON_SENSE_PIN)
para podercan trolar la conexi6n 0 desconexi6n del PIC al USB; 1a conexi6n fisica se
mueslra en la Figura 4. Antes de utilizar el puerto en el programa hay que initiali-
zarlo (usb3dc_initO y IIsb_initO) y, "muy importante", comprobar que ha sido enu-
merado par el HOST (usb_enumeratedO). Con el fin de inicializar 0 resetear la co-
flexion con el USB se debe reaJizar una Hamada peri6dica a la funcion II sb_tuskO.

Al iniciar la Simulaci6n con el PLAY del ISIS, el sistema permanecera inactivo hasta
que se conecte el USBCONN (con las flechas rajas correspondientes). Tras conff-
tar, por primera vez el USB, Windows solicita la instalaci6n del driver (se debe indi-
car el directorio donde se guarde el fichero mchpcdc.inf) (figura 7 y figura 8).
_-------
-_._.-
.----------------
...
..... __.
----,--
- -

__ __
-~
,

._. .
..-.--..
-
-.---~--
_____ J
~-

-,_._-
... --.-
--_._-
-_......_-,- ----_
. ----.-.
---.---- -
. _-----
.... --~-.

~ __ c..;..

----.----
.... -
"...................
, --~- .1...I

_
-~
_.._. - -
D _ _ ... - ... _ -

... _
_ .. _ . .... _'*'c"" ..._
-
-
......

- _~ 11 - .- 1

Flg"r.. 7 . Pasos e n la Instalad6n del driver

259
Compilador CCCS YSimulador PROTEUS para Microcontroladores PIC
-------
Tras esta instalaci6n y cada vez que se coneete el USBCONN apareccra el puerto
COM virtual en el administrador de dispositivos de Windows (figura 9). Tambien
desapareeeni el COM virtual cada vez que se desconeete.

'--"--"-

-
.1--

-*---_.-
-.
..

Flguri'l 8 . Pasos en 1.1 'nstaladon Icontlnuadonl

--'"'--_...-..--._--.. . .->
..-.1---...
-.11'-_
· ,..
-~--

.-. ...__ - .-
·010 _ _ _ . " _ _
"'~

..--- .oa..,,,
,,_

._,---
··
- .J---~.'""
---..-.-
J _ _ _ -=-l
.JW .. 'H , , '
.J _ _ _
..
'--"-
.11.-"-
·

Figura 9 . Puerto COM virtui'll en el administ,ador de disp ,uitivos

En este instan te el PIC queda conectado ill PC Yse puede abrir un visor del puerto
serie para comprobar la transmisi6n (Figura 5).
En los ejemplos de CCS tambien se pueden encontrar aplicadones para Mass Stora-
ge Device Class (MSO) y HIIII/all lllterface Device Class (HJO).
Ejemplo 2: Enviar los datos de Ulla conversion AD a/ puerto USB como Virtual Comm
para de/ermillar /a respllesta ell Iazo abierto de WI homo (figura 10). Compollelltes ISIS:
PIC18F4550, USBCONN, CELL, RES, LED-BWE, SW-SPDT Y OVEN.

El ejemplo es similar al anterior, en este caso se utiliza EXCEL con Visual Basic, de
tal forma que se pueden guard ar los datos de tiempo y temperatura en una hoja de
calculo y representarlos grMicamente.

260
10. USB - Universal Serial Bus

Figura 10. Eje mplo 2

Pa ra utilizar el fiche ro en Excel, HORNO.XlS, se debe configurar el puerto serie


virtual: en el fichero esta definido como el puerto 9 y ademas habilitar las macros
en el caso de tener Excel p rotegido (Herrt/mientas > Macro> Segllridad > Media/Baja).
Para cambiarlo a la medida del usuario hay que abrir el editor de Visual Basic (He~
rramientas > Macro > Editor de Visual Basic), buscar Commport = 9 Ysustituirlo por el
numero adecuado de puerto serie virtual (figura 11) .

... """~ ~"" (_&"ttO~1 (Uo k!!


C_luuoal ..... l<Colo< • RGlrO, us, 0)
c-.u~<"'~I....,kColo< • IIGIf~CIII. ~CIII, 300)
""r"""''''I·IIoJ_L·).C<I''-'I·r',.N_<TO'''~ ' "'\1.0l)I.l"
~rk."" e '. ("b) _' ", .Col-..I"!·' .1I_<ro"" • "0. 0'
H . ... no·O ...... A ._etO · '
."I>~
.•
.- .
.~<<l_ • ·~..~".C'~C.~.·
.C,*"",Qn·i ;11
.In·~J'".''''lo " I
.lft ••, _• • c~"'''C '''' ''d'a.r. .... ' .
.. ,
....... , ... " • 0
.1'0«." • n: ...
h<i VitI>

Onvo". & .... C _ ' t o o l CUokU


C-....."''''''I.lla<'kColo< • POliO, zs~, 0)
C_I><iII~<"' ... . ....,ltC<>lor • tGBllOC, !!IO, ZOO)

Figura 11 . ModifiC:iIIc1on del puerto Jerle

Ilnclude <lBF45.50 . h>


Idevice 4dc-10
Ifuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODE8UG,USBDIV,PLL5,CPUDIVl,VREGEN
luse delay(clock-48000000/
Ideflne USB_CON_SENSE PIN PIN 82

261
Compilador C CCS YSimulador PROTEUS para Microcontroladores PIC

'include <usb cdc . h>


void main () (
inc16 q , n;
float p;
inc qL;
int qH;
int nL,nH;
setup_lIdc_pocts (ANO);
setup_a dc (ADe_ CLOCK_INTERNAL) ..

n-O;
usb cdc init (} ;
usb_initO ;
delay_ ms(JOOO); /IRetardo para poder abrir el pue r to con el excel
do I
usb_task (I;
i f (usb_enumerated())

sec_adc_chiHlnel (0);
delay_us(10);
q - cead_adc();
p - 5 . 0 ' q I 1024 . 0;

nL- llJiIkeR(n, 0) ..
nH-makeR (n, 1);
i f (usb_cdc_putreiJdy()) usb_ cdcyutc(nL);
i f (usb_cdcyutready()) usb_cdc_puCc(nH);

qL-~keR(q,O};
qH-make8(q,1);
it (usb_cdcJ1ucready() usb_cdcJutc{qL};
it (usb_cdcyutready(}) usD_cdc_putC(qH) ..
del"y_ms(SOO); lISe envian datolf cada 0.5 s
n++;

J while (TRUE) ;

FigurOil 12. Program.. del ejemplo 2

Para la simulacion se debe abrir el fichero de Excel (figura 13); en este fiche ro exis-
ten dos botones para abrir el puerto y cerrarlo (tambien hay un boton para borrar
los d atos adquiridos). Antes de abrir el puerto se debe arrancar el ISIS e iniciar la
simulaci6n del programa, a continuation se pllede conectar el USBCO NN y, una

262
10. USB - Universal Serial Bus

vez conectado, se puede abrir el puerto con el boton de Excel para iniciar la adqu i-
siciOn.

., . .. . .
"- -- ...
u
.
-
, .
- -
" ',.
•-
• , ... . ,

~"

.- ...
•••
.......
.. ••
. •

.

r
" .
'

,

• .• , •
....
.
-
'
T

I: ,- - - - 1-'

·-
·.t-'
-
-- """"
- ..
··· . . . . .
-. _.
.. ·\_'/....,'_1 . - .._. .,. ... • ,. .,

Figura 11. Fichero de Exce l


Para ver la curva de calentamiento se puede cerrar el interruptor del homo de tal
fo rma que comience a calentarse (figura 14).

"- - --• ~-
-.- , • .. ........ " ..
, , •
,.......,
, ..
• , r

9 • ::
-
• ••
•• .._.
"
·•
·•. ....
-
- .-..
-- ,
··•.
.

-••
"
...-••.--
••
-- ,-,J
·

••
•.• ·"• -.•• -. I

·_. _,J_,_,
-. '-'''''''' •
-
.i

Figura 14. Datos adquirldos y su representacion

263
Esta cdiciOn 5e tennin6 de imprimir en junio de 2008. Publicada
por AlFAOMEGA GRUPO EDITOR, S.A. de C.V. Apal1ado Postal
73-267,03311 , Mexico, D. F. La impresi6n y encuadc:maci6n se realizaron
en FUEI'ITES [MPRESORES, S.A, Centeno No. [09. Col. Granjas Esmeralda.
IZlapalopa. 09810, Mexico, D.F.
Los microcontroladores PICmicro de Microcrup ban experimentado un importanle
aumento de presencia en el sector industrial, esto se debe, entre otros mucbos fae-
tores, a la politica de apertura que tiene Microcrup, ya que facilita y patencia el de-
sarrollo de herramienras por parte de atras compaiHas.
En lenguajes de programacion destacanlos compiladores C para PIC de companias
como CCS Inc. EI desarrollo de un lenguaje C especifico para un microcontrolador
pennite obtener el maximo reodimiento del micro.
Los programas de simulaci6n permiten depurar hasta casi la perfecci6n el disei'io
antes de ser montado en una placa. No haec falta explicar el ahorro de tiempo y
coste que ella supone. Tal vez uno de los mejores simuladores para microcontro-
ladores es ellSIS de PROTEUS.
En el capitulo I de este libro se hace una breve, pero intensa, descripci6n del ISIS
de PROTEUS, de forma que ellector pueda afrontar la simulaci6n de disei'ios sin
ningun problema. En el capitulo 2 tambien se realiza un repaso del compilador C
para PIC de ecs; obviamente no puede explicarse este lenguaje en un solo capi-
tulo, pero tras su lectura cualquier lector podci afrontar los pequenos programas de
diseiio que se exponen en los siguientes capitulos.
Del capitulo 3 al 7 se desarroUan los distintos m6dulos que integran un PIC (ADC,
USART.CCP, etc.) a nivel hardware, enlazandolos con las correspondientes direc-
tivas y funciones del C. En cada capitulo se plantean y desarrolJan sencillos ejem-
plos de aplicaci6n que ellector podnl. estudiar y, como no, modificar para completar
sus conocimientos.
En el capitulo 8 se expone la gama alta (PIC18) y en el capitulo 9 una aplicacion
mas compJeja, el RTOS (Real Time Operating System). Tambien en estos capftulos
se incorporan dislintos ejemplos de aplicaci6n. Por ultimo, en el capitulo to se
desarrolla el USB de reciente incorporaci6n aIISIS.
Este libra esta enfocado a (odos aqueUos lectores movidos por el interes aeerea de
los microcontroladores PIC sin necesidad de tener conocimientos muy profundos
en la materia. Los ejemplos desarrollados no tienen una excesiva eompJej idad. son
breves y permiten ir afianzando los conocimientos capitulo a capitulo.

Das könnte Ihnen auch gefallen