You are on page 1of 270

COMPILADOR C CCS s:

Y SIMoLADOR PROTEUS
PARA
MICROCONTROLADORES PIC
Eduardo Garcia Breijo

11.Alfaomega marcombo
ediciones t s c n t oas
COMPILADOR C CCS
y

S.MULADOR PROTEUS
PARA

M.CROCONTROLADORES PIC

Eduardo Garcia Breijo

11. Alfaomega ediciones re c nt cas


Datos catalograflcos
Garcia. Eduardo
Compilador C CCS y simulador PROTEUS para
Microcontroladores PIC
Primera Edici6n
Alfaornega Grupo Editor, SA de C.V., Mexico
ISBN: 978-970-15-1397-2
Formato: 17 x 23 em P6ginas: 276

Compilador C CCS y simuJador PROTEUS para Microcontroladores PIC


Eduardo Garcia Breijo
ISBN: 978-84-267-1495-4. edici6n original publicada por MARCOMBO, SA, Barcelona. Espana
Derechos reservados @ MARCOMBO, S.A.
Prirncra edici6n: Alfaornega Grupo Editor, Mexico, junio de 2008.

© 2008 Alfaomega Grupo Edltor, S.A. de C.V.


Piragoras 1139, Col. Del Valle. 03100, Mexico D.E
Miernbro de In Camara Nacionnl de la Industria Editorial Mexicana
Registro No. 2317

Pag. Web: hUp:!!www.alfaomega.com.mx


B-mail: libreriapitagoras@alfaomega.com.mx

[SBN: 978-970-15-1397-2

Derechos reservados:
Esta obra es propiedad intelectual de su autor y los derechos de publicaci6n en lengua espanola han
sido legalmente rransferidos al editor. Prohibida su reproducci6n parcial 0 total por cualquler medio
sln permiso por escrito del propietario de los dereehos del copyright

Nota importante:
La informaci6n contcnida en esta obra tiene un fin exclusivamente clidlictico y, por 10 tanto. no est6
previsto su aprovechanuento (I nivel profesional 0 industrial. Las indicacloncs tecnicas y prograrnas
lncluidos, han sido elaborados con gran cuidado por eJ autor y reproducidos bajo estrictas normas
de control. ALFAOMEGA GRUPO EDITOR. SA de C.V. no sera jurfdicarnente responsabtc
POI':errores u ornisiones; dniios y perjuicios que se pudieran atribuir al uso de la informacion
comprendida en esrelibro y en el CD-ROM adjunto. ni por In utilizaci6n indebida que pudiero cLirscle.
&lici6n autorizada para venta en Mexico y todo el continente arnericano.
Impreso en Mexico. Printed in Mexico.

fl.:mpresas del grupo:


Mexico: Alfaomega Grupo Editor.S.A. de C.V. - Piulgof'd,\ I 139. Col. Del Vulle. Mexico, D.P. -C.P. 03100.
Tel.: (52-55) 5089-7740 - Fax: (52-55) 5575-2420/2490. Sin coste: 01·800·020-4396
E-moil: libreriapitagorn~@ulfaorncga.corli.ml(
Celombla: Alfaorneg« Colombiana SA - Carrera 15 No. 64 A 29 - PBX (57·1) 2100 122
flux: (57-I) 6068648 - E-mail: scliontc(/hllfnomegn.com.co
ChUe: Alfaomega Grupo Editor, S.A. - General del Caruo 370-Provldenciu. Santiago. Chile
TeL: (56-2) 235-4248 - Fax: (56-2) 235·5786 - E-mail: ngechile@nlfaomegll.cl
Argentina: Attaorncga Grupo Editor Argentino. S.A. - Paraguay 1307 P.B. "II". Capital Federal.
Buenos Aires. C.P. 1057 Tel.: (54-II) 4811-7183/8352, E-mail: info@nlfaomegacditor.com.ar
,
Indice analitico
1. ISIS de PROTEUS VSM 1
1.1 Introduccion 1
1.2 Captu ra electronica: entorno gcifico ISIS 2
1.3 Depuracion de los sistemas basados en PICmicro .l2
2. Compilador CCS C 23
2.1 Introduccion 23
2.2 Estructura de un programa 24
2.3 Tipos de datos 24
2.4 Las constantes 25
2.5 Variables 26
2.6 Operadorcs 27
2.6.1 Asignacion 27
2.6.2 .Arirmeticos 27
2.6.3 Relacionales 28
2.6.4 Logicos 28
2..6.5 De bits 28
2.6.6 Punrcros 28
2.7 Funciones 29
2.8 Declaraciones de control 30
2.8.1 IF-ELSE 31
2.8.2 SWITCH. 33
2.8.3 FOR 34
2.8.4 WIIILE / DO-WH]LR 35
2.8.5 Otros 37
2.9 Comentacios 37
2.10 Directivas y funclones (preprocessor commands y built-in functions) 38
2.10.1 Direcrivas 38
2.1 0.2 Funciones , 40
2.11 Librerfas, drivers y ejemplos .43
2.12 Entornc de rrabajo de CCS C Compiler 43
2.12,1 lntroducci6n 43
2.12,2 Enrorno de traba]o 44
3. La gesti6n de los puertos 55
3.1 Introduccion 55
3.2 Gcstion de pucrtos en C 57
3.2.1 A craves de la RAM 57

v
3.2.2 ,\ craves de las dircctivas 60
3.2.3 Con punrcros 62
3.3 Entradas )' salidas 65
3.3.1 LCD 65
3.3.2 LCD gr:ific() 70
3.3.3 Teclado (keypad })(4) 75
4. Las inrerrupciones y los temporizadores 83
4.11nt.roducci6n 83
4.2 Interrupciones 83
4.2.1 lnrcrrupciones en C 88
4.3 'rn\IERO 94
4.3.1 Tl iVLERO cn C 95
4.4 T1l\lERJ )' Tll\1ER2 99
4.4.1 TIJ\fER 1 YTTh1E.R2 en C 102
5. Convertidor Anal6gico - Digital 117
5.1 Introduccion 117
5.2 Modulo Convcrtidor (gama media) 118
5.2.1 Regisrros rSR 119
5.2.2 Proccso de conversion 122
5.2.3 Efcceo del modo SLEEP}, RESET en el modulo Al) 124
5.3 Modulo AD en C 125
6. Modulo CCP - Comparador, Captura y PWM 137
G.1 lntroduccion 137
6.2l\lodo Caprura 139
6.3 Modo Cornparacion 140
6.4 Modo P\'V'M 141
6.5 Modulo CCP en C 143
7. Transmision seric 167
7.1 lniroduccion 167
7.2 EI modulo USi\RT/SCl 168
7.2.1 Irnroduccion 168
7.2.2 EJ modulo USART en C 174-
7.2..3 La norma RS232 180
7.3 Puerto sene sincrono (SSP) 190
7.3.1 lnterfaz Imer-Circuiros (l2C) 190
8. Gama Alta - PIC18 213
8.1 Iruroduccion 213
8.2 Organizacion de la memoria 214
8.2.1 Arquitectura HARDVARD 215
8.2.2 Memoria de Programs 215
8.2.3 Ccntador de Programs 216
8.2.4 Memoria de Configuracicn 217

vi
8.2.5 Pila 21-
8.2.6 Memoria de Datos 218
8.2.7 Memoria EEPR01vl 219
8.2.8 Modes de Direccionamienro 220
8.2.91nrerrupdones , 220
8.2.9. J Regisrros de salvaguarda 222
8.2.10 Registro W 223
8.2.11 Oscilador 223
8.2.12 Unidades Funcionales 223
8.2.12.1 Puertos de entrada/salida 224
8.2.12.2 Temporizadores , 225
8.2.12.3 Convertidor Analogico-Digiral 226
8.2.12.4 Canal de Comunicacion Serle (EUSART) 227
8.2.12.5 Modulo Master SSP (MSSP) 228
8.2.12.6 Modulo de Cornpracion/Captura/Pwlvl (CCP) 228
8.2.12.7 Modulo Comparador 230
8.2.12.8 Modulo de referencia 230
8.2.12.9 Modulo detector de Alto/Bajo Volrajc 230
9. RTOS - Real Time Operating System 239
9.1 lntroducci6n 239
9.2 RTOS en C 240
10, USB - Universal Serial Bus 251
10.1lntroducci6n ,.251
, O.l.l11igracion de RS232 a USB 252
LO.t.l.1 USB CDC (Communication Device Class) 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 codigo rnaquina sino tambien en conocer programas auxiliares que
facilitan el disefio de los sistemas donde intervienen.

Entre los muchos programas para el desarrollo de sistemas con PICmicro® desta­
can, par 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 verification via software
que permite comprobar, practicamente en cualquier disefio, la eficacia del progra­
rna desarrollado. Su combination de simuladon de codigo de programacion y si­
mulacion mixta SPICE permite verificaciones analogico-digitales de sistemas basa­
dos enmicrocontroladores. 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 uti! aprender a programar con un lenguaje
de alto nivel como el C. EI compilador CCS C permite desarrollar program as en C
enfocado a PIC con las ventajas que supone tener un lenguaje desarrollado espe­
cificamente para un microcontrolador concreto. Su facilidad de usa, su cuidado
entomo de trabajc y la posibilidad de compilar en las tres familias de gamas baja,
media yalta, Ie confieren una versatilidad y potentia muy elevadas,

Al escribir este libro se planteanmuchas dudas, sobre todo a la hera de concretar


el temario. Escribir profusamente sobre losPIC 0 sobre el PROTEUS 0 sobre el CCS
C supone, casi seguro, escribir un libro para cada uno de estos temas. Por ello, el
planteamiento ha sido diferente, desarrollar los conocimientos basicos necesarios
para manejar cada prograrna, apoyarlo con elmayor numero de ejercicios y dejar
al lector la posterior arnpliacion de conocimientos. Asi 10 he decide en base a Ia
, experiencia que me da estar impartiendo dases sobre PIC en Ia carrera de Ingenie­
ros Tecnicos Industriales, especialidad de Electronica Industrial, de la Universidad
Politecnica de Valencia.

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

ix
1. ISIS de PROTEUS VSM

C pitulo 1

ISIS de PROTEUS VSM


1•1 Introduccion
illentorno de disefio electronico PROTEUS VSM de LABCENTER ELECTRONICS
(W1.ow.labcenfer.co.lIk) ofrece la posibilidad de simular c6digo microcontrolador de
alto y bajo nivel y, simulraneamente, con la simulacion en modo mixto de SPICE.
Esto permite e1 disefio tanto a nivel hardware como software y realizar la simula­
cion en un mismo y unico entomo. Para ello, se suministran tres po ten tes subentor­
nos como son ellSlS para eldisefio grafico, VSM (Virhtaf SystemModelling) para la
simulaci6n y elARES para el disefio de places (figura I).

The V§M Advantage


s_k

~+ - ......._,
"---
~ .... ~"~_:d~W:.:N:!M~O:~~ .. __ ----"~ ~
, Con las herramientas tradlcionales de disel'io. al desarrollo del software y la comprobaciOn del sislBma
no puede reiiflizars9 hasta que sa dasarrolla un prototipo real. esto puede suponer semanas de retraso.
Ademas. sise /ocalrza algun error en el aiseno hardware. la totalidad de! proceso debe repeJjrse.

Usando Proteus VSM. al desarrollo del software puet:Jecomenzar tan pronto como al esqusmatiCO es
cJjbuJadoy la combinac;6n de software y hardware puede ser testeada antes del montar a/ prolDtipo.

Figura 1. Entomo de trabajo PROTEUS ffuente: Labcenter Electronics)

1
Compllador C CCS y Simulador PROTEUS para Microcontroladores PIC

1.2 Captura electronica: enterne grafico ISIS


JSIS es un potente programa de disefio electronico que permite realizar esquemas
que pueden ser simulados en el entomo VSM 0 pasados a un circuito impreso ya
en el entomo ARES.
Posee una muy buena coleccion de Iibrerfas de modelos tanto para dibujar, simular
o para las placas. Ademas, permite Ia creacion de nuevos componentes, su mode­
lizacion para su simulacion e, Incluso, la posibilidad de solicitar al fabricante (Lab­
center Electronics) que cree un nuevo modele.
Sin entrar profundamente en como utilizar dicho programa (requeritia un Iibro
solo para ello), a continuacion se explican las bases para dibujar cualquier circuito
electronico. El programa ISIS posee un entomo de trabajo (figura 2) fonnado por
distintas barras de herramientas y la ventana de trabajo.

Vontuna de Edicl6n

)lentajJa de Trabajo

Barra de slm~elOn
CQI7Iando.s de:
BaI1il de estadc>
rolllclcln oj r~f[exl6n

CO~ .. ' tLI,OJ I. j 11.1 .. 1,FIooI""'r1 _

Figura 2. EI e"tor"o de trabaJo del programa ISIS

Varies de estos menus tambien se pueden utilizar con la ayuda del boton derecho del
raton, Al pulsarlo en cualquier parte del entomo de trabajo aparece un menu contex­
tual donde se puedenir obteniendo los distintos submenus de trabajo (figura3).

2
1. ISIS de PROTEUS VSM

:{> Comoonent
+.Mctl)nOot
s..ItIct All ObJects

J
;; le><l:Sc...,r
;;'8uS
:Q:~

gT~
I~DeWaPin
L<it1lP>s
!Ml r_ R~corder
~@ DC
~VolooePr¢e stIlE
~ Cllfent Probe Pl.lSf:
~ v.tuallY..truroent ElCP
SfFM
/UM
P'W1.1N
Deox
FILC
OCl'de
AlOIO
~At<
OSTATE
C:>Path
DEDGE
AT ••t
MA.SE
ElSymboi
DCLOCK
.M4Irl<et
.....,..,.,.,.. ~ATTERN

Figura 3. Submenusde trabaJodel boton derecho del raton

Para dibujar, 10primero es coloear Jos distintos componentes en la hoja de trabajo,


Para ello, se selecciona el modo cornponenres (figura 4) y, acto seguido, realizar una
pulsaci6.n sobre el boron P de la venlana de componentes y librerfas (figura 5).

Figura 4. Modo componentes Figura 5. Boton Hplck"

Tras activar el boton P se abre la ventana para la edicion de componentes (figura 6)


donde se puede buscar el componenre adecuado y comprobar sus earacteristicas.

Al localizar el components adecuado se realize una doble pulsaci6n en et de tal


forma que aparezca en la ventana de componentes y librerias (figura 7). Se pue­
de realizar esta accion tantas veces como componentes se quieran incorporar al
esquema. Una vez finalizado el proceso se puede cerrar la ventana de edicion de
com ponentes.

3
Compilador C CCS V Simulador PROTEUSpara MicrocontroJadores PIC

Permite locallzar por tlpo, clase y fabricante

Encapsulado
para placa

Pequeilo editor de las caracterisllcas


de un componente (situar el raton sobre el)

Figura 6. Ventana para la edItion de componentes

PI LJ
.n'lI~IIII'-
E'_C16f876
RE"S
SW·SPST·MOM

Figura 7. Los componentes anadldos

Para situar un componente en e] esquema tan s610 debemos seleccionarlo de la


lista. AI hacerlo se puede comprobar su orientacion (tal como se representara en el
esquema) en la ventana de edicion (figura 8). Si deseamos modificar la rotacion 0
la reflexion del components podemos acceder a ella a traves de Labarra de herra­
mientas correspondiente (figura 9).

Haciendolo de esta forma, "todos" los componentes de la Iista tendran Ia misma


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

4
1. ISIS de PROTEUS VSM

~
+
E
B~PI L I
.
:i
:Q: LED·BLUE
~ PlC16fIYS
. '-
C>
CI
;~
S'W·SPST·MOM ft:
r:

Figura 8. Seleccion y orientacion Figura 9. Barra de rota ciony reflexion


del componente

Ahora solo falta realizar una pulsacion sobre la ventana de trabajo y se colocara
el componente. El cursor del raton se convierte en un lapiz blanco (figura 10). Se
pueden colocar varios componentes del mismo tipo simplemente realizando varias
pulsaciones, Para terminar de colocar un componente se debe selecdonar otro com­
ponente de la lista 0 pasar a otro modo de trabajo.

~ Up£! blanco: die en boron Izquierdo coJoen el cOmpoocolC

Figura 10. Cursor en el modo de colocacion

Es importante activar la herramienta de referenda automatica (Real Tillie Annoia­


tion). De esta forma, los componentes tendran una referenda distinta y de forma
consecutiva; en los circuitos integrados con varios cornponentes encapsulados tam­
bien se referenciaran segun dicho encapsulado (UIA, U1B, etc.). Esta herramienta
se activa 0 desactiva desde 1a option de menu TOOLS -7 Real Time Annotation.

Una vez situ ados los componentes en el area de trabajo se pueden mover, al pasar
por encima del componente el cursor se convierte en unamano (figura 11)y alrea­
lizar una pulsacion, el cursor se transforma en una mano con una cruz, lndicando
que se puede mover el componente (quedan seleccionados al ponerse en IOjO) y se
puede arrastrar (atencion: si se vuelve a realizar otra pulsacion del boton izquierdo
se editan las caracterfsticas del componente). Tammen se puede cambiar su orienta­
don utilizando los comandos de rotation y reflexion a traves de una pulsation del
boron derecho del raton (figura 12) y se pueden eliminar con dos pulsadones con el
boton derecho sobre elios (0 con el boton derecho y el comando Delete Objet).
\P"l
\..J Seleccion del componerne

Figura 1,. el cursor en modo de selecCion y mover

5
Compllador C CCS Y Simulador PROTEUS para Microcontroladores PIC

+ Drao Object
Edit PIope.tles CttI't-€
DeleteOb)ojtt

C Rotate Clod<l\llse Ted~·l)e.SusU action


:0 f(!)I:ate AntKJoc~IMS. Tede·tle-Adicion
C RotatellSOde'Jlees
.. )1.01'11"01 ad...M
tY~'fi<

f) DIsplay Mallei Hdp CblH1


OJ ~ey ~tasl\eet CtrI+D

Figura 12. Menu contextual de un componente actlvado por el boton derecho del raton

Todas estas aceiones ee pueden realizar indlvidualmente 0 de forma colectiva, es


decir, se pueden agrupar varies componentes a traves de pulsaciones consecutivas
sobre enos (manteniendo la tecla <Control> pulsada) 0 dibujando una ventana con
el bot6n Izquierdo y arrastrandola sobre los mismos (figura 14).

I'leoillft 1
RDI
R03lPOM
FUloI
RBa
RIIfliPGC
R811PGO
Rfi12
.01
", kEO-BlU~
4 SN1
\

1-
SW·SPST.MOf,1

RCOITIOSO/TICKI
nyl~
~~=
RC!1T10SIICCP2
RC2ICCI'I R1
I
RCil/SOO
RCfIITX/CK
ReT/IIX10!

Figura 13. Los componentes en eJ-'rea de trabaJo

Una vez selecclonado e1conjunto de componentes (se marcan todos en rojo) debe
mos utilizer 1aherrarnienta de gru po (figu ra 15), que tambien aparece tras pulsar el
boron derecho, Con esta herramienta se pueden copiar, mover, rotar 0 ellmlnar los
com ponentes seleccionados,

6
1. ISIS de PROTEUS VSM

'" ......
'* u.... ,.,. ~ .... ,.._ ... ,.... :w... ,..
[;
a_iii lilt) .Q +'1""D • 1... Cr:SII ......... .''''''~ !:I.a.,
!Ir~
Q, •• 'Dil
I:',
------ --
.. J
I
'l'
I
,
k
\
.~:;
I) • \PCtlolUlif f!:
..
l.
[!
0;

'".' - -
._
~ .,.
v, _ h
fi

.~:..... ....
...' u
~ F
/
;l

p
CI
~- =Ii
......Ift

1:s- ........
.
~~-u
-'= ~
11 .,..,
!:WI

!::

~-. •-
~i,
"'
lit
A
._
"-=:;"V
,.,
H
lOt

+• , "'ft
1CWt\O'I

if

cor~
'"",,",-
~, Lt..LLf"OIIiJ ... ... .... •• "......... -. - ~.• .,. ....
Figura '4. Selecd6n de varlos componentes

I~~DDI a au
Figura 15.La heN'amlentade grupo
Para unir los componentes con cables hay que situarse en los extremes de los termi­
nales, el cursor se convierte en un lapiz verde (figura 16).Ahora se pueden ejecutar
dos acciones 0 ir marcando el camino hasta el destine con distintas pulsaciones
(figura 17) 0 realizar, directamente, una pulsaci6n en el destine y dejar que [SIS
real ice el camino. Para ello, debe estar activada la herrarnienta TOOLS ~ Wire
Autorouter.

+ 01
LE0.8LL

Figura 16. 'n.do de cable Figura 17. Clrculto-a mano H

7
Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC

Las uniones entre cables se pueden realizer de forma autornatica. Para ella, mien­
tras se traza un camino debemos realizar una pulsacion sabre el cable objeto de la
union electrica (figura 18). Tambien se pueden realizar de forma manual mediante
el modo de union (figura 19)i en este modo tan solo hay que ir hacienda pulsacio­
nes sobre los puntos donde deseamos realizar la union.

Figura 18. Union ehktr.ca entre cables Figura '9. Modo de union
Se puede modificar el trazado de los cables. Para ella, se realiza una pulsaci6n 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.

t Doble flccha: mover cables

Figura 20. Mover los cables

Tambien se pueden utilizar buses para las uniones multicable. Los buses permiten
conectar varios terminales entre si utilizando un unico elemento (figura 21); en este
caso, el cursor se convierte en un lapiz azul (figura 22). Pero para distinguir los
distintos cables que forman parte del bus y distribuirlos en la entrada y en la salida
se deben etiquetar mediante labels. En el caso de los cables se indicara una etiqueta
{mica LCDO, LCD1, etc., y al bus una etiqueta conjunta segun el formate LCD[O. .31
que indique el nombre y la cantidad de cables que 10 forman.

lCOO

lCD2
!.C03

Figura 21. Cableado por bus

8
1. ISIS de PROTEUS VSM

, Lapi» azul: trazado de buses.

Figura 22. Cursor en modo de trazado de bus

1::.1 etiquetado tambien permite unir cables virtualmente. Para eliot tan solo es nece­
sario que los dos cables se llamen igual almque no esten conectados entre sf. Para
etiquetar cables 0 buses se utiliza el modo label (figura 23). Al activar este modo y
realizar una pulsaci6n sabre un cable 0 bus se abre una ventana donde podernos in­
troducir la etiqueta, adem as de seleccionar posicion, orientacion y estilo (.£igura24).

.,,.

.I.ctt Cerit., A.:.QhI


1~ Midrit. BOIImI

Figura 23. Modo label Figura 24. Ventana de edlcion de etiquetas

Otro modo de union virtual es a traves de terminales. Al activar e1 modo terminal


(figura 25) se pueden seleccionar distintos tipos de terminales, entre ellos el utiliza­
do por defecto (default). Al utilizar este terminal en varies componentes y darle el
mismo nombre en todos ellos se consigue una union electrica.

:f>-
+

-=0,;
~<
n-
lAlfl C-~
~:
".
:(J: PI "1'

II: ~
<:>
OUTPUT
CI BfOIR
D- POWER
QROUND
L BUS
@

\0)
~".

Figura 25. Modo terminal

9
Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC

Figura 26. Union e'ectrlca it traves de termfna.es


Mediante este modo tambien se pueden colocar las masas y alimentaciones del
circuito utilizando las opciones Ground y Potier (figura 26). De esta forma se puede
finalizar el circuito (figura 27).

OSC1/CLKIN
OSC21CLKOUT
L-_":""; MCLRNpp/lHV

RAOfANQ
RA11ANl
RA2JAN2NREF­
RA3lAN3I\IREB­
RA4fTDCKr
RASlAN4ISS

Figura 27. Orculto cab'eado


Tan solo queda modificar las caracteristicas de los componentes que 10 requieran,
POt ejemplo modificando el valor de los componentes pasivos. Para eUo,se seleccio­
na un components realizando una pulsacion conel boron derecho, aparece el menu
contextual y se selecciona la opcion EDIT PROPERTIES; tambien se puede utilizer
el modo edicion (figura 28) en el cual tan solo es necesario haceruna pulsaci6n con
el boton izquierdo sobre el componente; en este modo el cursor se convierte en una
flecha (figura 29). AI ejecutar esta acci6n se abre la ventana de edicion donde se
pueden cambiarlas caracteristicas de los componentes (figura 30), pOI ejemplo la
.resistencia de lOK a 180 ohm. Tambien se puede editar directamente la referencia 0
el valor de un componente sila pulsacion se realiza encima de estes elementos.

10
1. ISIS de PROTEUS VSM

Flecha: modo edici6n


I:::
Figura 28. Modo ed'cl6n Figura 29. Cursor en modo edlcion

~~~ ~-:=~=
..-=~=~.::
..','~-.~-
'--::0
IliiI
CooT_'",Be4 ... oc.
R....w.c. [iii"
Hld!IIn'
~odden
I Jlr I
. I Jjdo
I b:
ModeITI'O<!'
I'C8 PooQge
IANAlOG ---
REScO - -
• rH~AI
1" H<I6A1 -J
I '"'" I
ou""eo-tle,

IEiIOIJdo', ... ~ .. 1CI'1 _1w'.d1I.!IJOGAor.


£_"... PC8~
Edt .. ",,,,,,,,,,,,, .,,.'"

Figura 30. Ventana de edicl6n de un componente

Con esro quedaria finalizado el circuito electronico (figura 31). Pero en el caso de
los sistemas basados en un microcontrolador aun quedan por modificar Jas carac­
tedsticas del mismo microcontrolador.

OSC1/CLKN R8W~T~~------------~
OSC2IClJ(OUT R81H~--~
'----'--I MCLRNppI'IHV RB2
R83IPGM SW1
MOlANO R84 01 SW-SPST-MOM
Res

"t
RA1/AN1
RA2lAI'I2NReF· RB6IPGC
RA3/AN3NREF+ R871PGO
RA4rrOCKI
RA5IAI'I~SS RCorr10Sorr1CKI
RC1rr1OSVCCP2
RC2ICCP1
RC3ISCI</SCl
RC4/SDVSOA
RC5ISDO
RC6iTXICK
RC71RX1DT

Figura 3'. EI esquemacompleto

11
Compilador C CCS Y Simulador PROTEUS para Microcontroladores PIC

En el caso de los microcontroladores, Ia ventana de edicion aporta mucha infor­


macion (figura 32). Tal vez lo mas importante es que permite cargar en el micro
controlador el archive de programa ("'.HEX) generado en la compilacion: tambien
se puede modificar la frecuenda de reloj (por 10 tanto no es necesaria el usa de
cristales externos en la simulacion), cambiar la palabra de configuracion y otras
propiedades avanzadas,
, .. 1.\' " ,', C)r
If_
Compono.ll B.eIer"",,'"
Corr4Mm... ')!otvo:
UI
I'IC1lifVl6 Hodde..
QI I
~
Mdl> I
FTI>!JllmFile iaeTON_4col ...li H'~AI
~
II"'.. I
P'<>::<mOlClod F,equerey CI.IH%
11l1cJFfii ---
·HlkAI
. H_frlt I
P,_ CoM'llJl.o(ionWoot HrdoAi

-. z: I
£..,..,.)
PCBP8Ok_ 'Dii2itIAR ~AI .:J
Advanceo Piope<1Jeo:
-
Ilandr:imirePtog;am M-....y' • ,No .3 Hrde~
::tfs:, :\':'< :.J.!:! ;~
Randorr.ce Da1. MetnOIl'1
Dump CooIlgllraiion Wol'5l
Modr!IPICS14It·upD~? ...
Model PICWai<e-up o~,.,
For<reAOC81!oakporrv.d S""'lifeT~
Wom" StacI<UndeliO.....-iIows1
"
~ham~'r.ulllliM: AAoclllllff~'~
El<clvde:rom PCB l,~
Edit.ollol('I''''tIeS ... te>d.,
,'" ;': "',~'~ ;,c'
Figura 32. Ventana de edidon de un micro

1.3 Depuracion de los sistemas basados


en PICmicro
La caracteristica mas importante del PROTEUS VSM es la capaddad de depurar pro­
gramas fuente de distintos lenguajes de programacion, Ademas de aceptar el archi vo
de programaci6n Intel Hex (HEX), tambien adrnite ficheros IAR UBROF (039), Byte­
Cmft COD (COD), Microchip CompatibleCOF (COF) Y Croumhil!Proton PillS (BAS). Al
utilizar estos archivos se puede abrir una ventana de codigo fuentellamada SOURCE
CODE mediante Ia cual se puede seguir el programafuente linea a linea de codigo.
Ademas permite visualizar elementos intern os del PIC como son Ia memoria de
programs, la memoria de datos RAM 0 la EEPROM, los registros especiales (FSR)
y 1a pila (Stack).

Ademas, el entomo PROTEUS VSM permite compilar program as fuente en c6digo


ensamblador directamente, Para ello, se utiliza el comando SOURCE (figura 33).

12
1. ISIS de PROTEUS VSM

* DeFine Code Generation 10015...


Setup External Text ,dltor ...
Build 811

1. borra.asm

Figura 33. Generador de c6dlgo de flcheros fuente

En el caso del compilador CCS C, despues de compiler se generan, entre otros, los
archivos ".HEX y ".COF, los cuales se pueden urilizar para trabajar con el entorno
PROTEUS VSM. Para ejecutar el program a desde [SIS se debe abrir la ventana de
edicion del microcontrolador (figura 32) y en el item PROGRAM FILE se puede
indica; el fichero de codigo fuente urilizado.

Adernas, en esta ventana se puede indicar la frecuencia de trabajo can la opcion


PROCESSOR CLOCK FREQUENCY (debemos observar que para la simulacion no
es necesario colocar elementos externos de 0501aci6n en el PTC,tan s610 hacen falta
en caso de realizer la placa). En la opci6nADVANCED PROPERTIES podemos ha­
bilitar 0 configurar muchos mas elementos: configurar el uacihdog, habilitar avisos
de desbordamiento de pila, accesos no correctos a memoria, etc.

Una vez cargado el microcontrolador con el programa fuente, se puede proceder a


Lasimulacion del circuito empleando la barra de simulacion (figura 34). Esta barra
se com pone de la opcion MARCHA, PASO A PASO, PAUSA Y PARADA.

II a
Figura 34. Barra de slmulacl6n

Con la opcion MARCHA la simulacion se inicia (eJ boron se vuelve verde) y fun­
dona en modo continuo. La simulacion NO es e11tiempo real y dependera de la
carga de rrabajo del Pc. En la barra de estado se indica la carga de Ia CPU del PC
(a mayor carga menos real sera Ia simulacion) y el tiempo de ejecucion: este tiempo
indica el tiempo que tardaria, en la realidad, eJ circuito en realizer un proceso (por
ejemplo esto implica que, dependiendo de la carga de trabajo de la CPU, un tiempo
de J s en e) circuito puede significar varies minutes de simulacion).

II I • I ANIMATING: 00'00:02.65 (CPU load 9~~l

Figura 35. Barra de estado en la slmulacl6n

13
CompUador C CCS y Simulador PROTEUSpara Microcontroladores PIC

La option STOP para totalmente la simulacion mientras que PAUSE Lapara de for­
ma momentanea permitiendo hacer uso de las herramientas de depuration.
La opcion PASO a PASO permite trabajar en tramos de tiempo predefinidos y, ade­
mas, permite utilizar Lasherramientas de depuracion, Esta opcion esta ligada a
Laconfiguracion de La animacion (figura 36): SYSTEM -7 SET ANIMATION OP­
TIONS -7 SINGLE STEP TIME donde se puede definir el incremento de tiempo
que se desea que pase cada vez que se pulsa esta tecla.

-- Sindabon
SpE£dt----
fr<II1& P<'IS;ocood: ~
Tm",.repperF"""", ~
SIngIeS!ep Time: pm- ShowW~eVoltageb!lCc>ku?
Max. SPlaT,,~ Ps;;- ShowWreCment with Anow.?

-VoIt09l'lCweriRanger-
M6J!IJUI>Vdtaga Is SPlCE Option<
Cmeri TlYe$hold, l;"'lu---
ilK II ~el

Figura 36. Set animation options


En este cuadro de dialogo tambien se pueden cambiar los siguientes parametres:
• FRAMES PER SECOND: numero de veces que ]a pan talla de ISIS se refresca
en un segundo (par defecto 20).
• TIMESTEP PER FRAME: indica el tiempo de simulation par cada uno de los
frames; 10 ideal es que sea el valor inverse del escogido en la opci6n FRAMES
PER SECOND.
• ANIMATIONS OPTIONS: permite habilitar la visualization de las sondas de
tension, y corriente, mostrar los niveles 16gicos en.los pines, mostrar e1nive1 de
tension en los cables mediante colores 0 mostrar la direccion de La corriente en
los cables mediante flechas.
• VOLTAGE/Clm-RENT RANGES: permite determiner el umbral de tension
(±V) y corriente para utilizar en la visualizacion de las correspondientes ANI­
['vrATIONS OPTIONS.
En este punto se puede simnlar (y animar) un sistema con el PICmicro (Figura 37).
1.0 mas interesante de la simulaci6n can microcontroladores es 1a utilizacion de las
.herramientas de depuracion Es decir, visualizar mediante ventanas las distintas
partes internes del microcontrolador: memoria de programa, memoria de datos,
pila, etc. La mayor parte de estas ventanas solo se pueden visualizar durante una
PAUSA.

14
1. ISIS de PROTEUS VSM

SVV5
R1 ••
1M

R2
1M

SVV2
••
SW-SPST

OSC11CLI(IN RAG I-ii:------'


O~~ AAI~~-- J

4 MCUI ~ H-------------'
RMIlOClll
RBOiINT ~------±--l
RBI
E---!-I
Ra2:
P---~-i
A8l R..--':--l
RI34
1-=7~--:-I
RBS ~i:--!-i
RBIII-':-!'~--;'-i
R!!7
PIC\5f~

Figura 37. Una simuJacl6n en marcha

Desde el menu DEBUG (figura 38) tam bien se puede iniciar la simulacion pero
pensando en la depuration. Con la opcion STARTIRESTAR DEBUGGING se pue­
de iniciar la simulacion pero haciendo una pausa para ver las distintas ventanas
de depuraci6n. Tambien se puede ejecutar el programa directamente con Ia opcion
EXECUTE, EXECUTE wrmour BREAKPOINT 0 EXECUTE FOR SPECIFIED
TIME que permite ejecutar directamente un programa, ejecutarlo sin puntos de
ruptura (en el caso de tenerlos) y ejecutarlo en un tiempo concreto.

R....tl'oj:qlvmcIwos
,,_Pet,_.. _
.Cotfqx.~...
Use P.....xeDebuQ_
Data

Figura 38. Ef menu DEBUG antes de la slmulaci6n

15
'f
Compilador C CCS Y Simulador PROTEUS para Microcontroladores PIC

Desde esta ventana tambien se puede reinicializar la memoria EEPROM del rni­
crocontroJador mediante RESET PERsrSTENT MODEL DATA. Al producirse una
pausa, el menu DEBUG se modifica (figura 39) mosrrando las correspondientes
herramientas de depuracion.

Llbrmy 1~11M $ystem Help


., 5t4lt/l!''''dtO~'''' tl;Il"'l~

FI2
Exeat. WlthotA a.... ;pOi1ts 1\11.+1'12
Exeate lot ~Jied Time

,.!:, stop 0 ... , FlO


~Stopll1t4 PI!
,l.,Sl.pClul. arf+FII

I.M Remote 06truo MOllitor

::I Til.. HO";:or)tefy


]) T'!.y.. tIoiIIV

1· Slll1Ulo(rQ'll"'l
l:. Watch Wlr'OJw
1. Plr O>U s...,.Cod •• UI
S. PIC O>UV6,.x.1M 1)1

§. PIC q.ufW<;b(c(~· VI
k. PIC O>UDate_v ·UI
Z. PI<:"(i>U&IIr.f1 NI!(1I(VY'UI
Q pIC cpu ""0;1'' ' ' Memory -ul
~. PICCPU3l«f ·111

Figura 39. EI menu DEBUGen una pausa

Estas herrarnientas son (figura 40):

• SIMULATION LOG: Mensajes resultantes de la simulacion .


• WATCH WINDOWS: Ventana de visualizacion de posiciones de memoria.
Permite afiadir la que el usuario desea ver.
• PIC CPU REGlSTERS: Muestra los 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 1amemoria de programa.
• PIC CPU STACK: Muestra la pila.

16
1. ISIS de PROTEUS VSM

/
o
o
~""
A
...lSI

Figura 40. Ventanas de depuracion

La ventana WATCH WINDOW es la mas versatil puesto que se pueden aiiadir


variables y modificar su visualization. Al pulsar el boton derecho sobre la ven­
tana se abre un menu contextual (figura 41). Con ADD ITEMS (name/address) se
made la variable a visualizar directamente can el nomhre predefinido (figura 42)
en el PIC 0, en el caso de varia­
vatue ws.ten e .. bles propias del programador, se
Ot;oOOlll:;l;O S1IV6·
abuu..u-u pueden visualizar par direccion
(figura 43), donde se le indica el
nombre, la direccion en hexade­
cimal, el tipo de dato (byte, word,
etc.) y el formate de visualizacion
(binario, decimal, etc.). E1tipo de
dato yel formate tambien se pue­
de cambiar desde DATA TYPE Y
DISPLAY FORMAT.

"'~Aad~'

_
SOow_._
~l\1)ffi

.._
"'S"'cM'k.!Itd"lE~1

Ii. 5ctfor' ...


s.e

Figura 41. Menu contextual de


J5<l_ ...
WATCH WINDOWS

17
Compilador C CCS Y Simulador PROTEUS para Microcontroladores PIC

Can WATCH,POINT CONDITION se pueden habilitar puntos de ruptura median­


te condiciones sabre las distintas variables (figura 44)i se indica la variable, la mas­
cara de la condicion (NONE, AND, OR, XOR) Y el tipo de condicion (NONE, ON
CHANGE, EQUALS, etc.).

ET G

Figura 42. Add by Name

0::1
Oala~:' [)~EQlTMI:
A AS'ClIZ slti1q (\.SirloIy
~B}'te /' Oel'"
(' Word (2 bjite;1 A HeJl<adec~
(' O~W",d(4b)te:1 4 ~drnt!iiO?
c- QYOdW""dlS byte.) ( lJmignedlliege,
,.. IEEE floa( I"byf.. l
~ IEEE DOlilie (81)l'\eSl
A H!ecOFk..t (3 bY... )
~ Mierochip FIoaI (4 bjq:)

Figura 43. Add by Addr,ess Figura 44. Puntos de ruptura

Hay una ventana de depuracion que solo se visualize si se .ha incorporado un fi­
chero COD 0 COF almicrocontrolador, se trata de la ventana CPU SOURCE CODE
(figura 45). Can esta ventana se puede seguir la simulacion linea a linea del archive
de codigo fuente.

En esta ventana (tambien en el menu DEBUG) estan disponibles unos botones de


control (figura 46).

18
1. ISIS de PROTEUS VSM

OP.· void mainO {


---- char kj
lnt V,Xj
0137 lcd_in;-tOi
018a kbd_inltO:
0199 pcrt_b_pull ups (TRUE);
(lISe , cd_putq:"\fLi s ro ... \n"):
wilil e (TRUE) {
1)1~;; k=l<bd_oetcO i
OJ.::l' _k;
01'8 )(;1(.-48; 11w.30
019£ if'kr~O)
01-".1- 11'(k='·')
OlAS , cd...pLltC('\f');
O:JJU< elsl!!
du:> lcd_pute(k)j //fmprln11!! caract:er
----II pri ntf!' cd putc "JCc" kj' iJ;~rnpr!me caract:~r
----II prlntf loLP.utc:_""<:":".; Ijlmprllne caracter
--- II pI"intf 1cd_putc, ")41" ,k ; l/impMmI!! valor es ct t
---- 1/ prlnt1' 'cd_pu·te."~".v : //imprime valor Mdf
---II Pr"l~ lcd_putc, "nu" ,x ; I/imprime valor numer1co
----
OIJ'-("
}
)

Figura 45. La ventana CPU Source code

I ".( it .ua,
Figura 46. Los controles para 5a simufacion

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


radon.

-~ Permite ejecutar una lnstruccion; si es una subrutina


ejecuta directamente,
0 una funci6n la

-~ Pennite ejecutar una instrucci6n; si es una subrutina


entra en ella.
0 una funcion

-~ Trabaja en modo continuo hasta que encuentra un retorno de cual­


quier subrutina.

-[i] Trabaja en modo continuo hasta que se encuentra con un punto de


ruptura.

-,0-.1 Habilita 0 deshabilita los puntos de ruptura.

19
Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC

Hay una ventana de diagnostico que facilita la depuracion, almacenando los erro­
res, rnensajes de diagn6stico y avisos producidos durante el proceso de simulacion
(figura 47). En la barra de estado (zona inferior del area de trabajo) se muestra un
aviso (figura 48)i con una pulsacion en el aviso aparece la ventana de diagnosis .

......ag. SOIAce
alSI~ R....... 701 tr(BI.OIcI:i6SZItClI.4boo<l .. £.... .,,,,, rmlOO7
., SO"". <XIdo ouId c.,..,.1ed O~
J c 1t\gdotogn C,IoiIt_ .. d!P"'OI.... ~'" [leell_IF,O(.... 1P1..... on.r.sAMf'lE
oJ N C<flTPlot.oo _lc1od O,~
,.. rl .. b" A.... 11g "",""""td or
., P.,I1I.,.,.",ylot OIII1Ii>I<'!ed or.
JS"""'lII\lpbl""", 1438fC5f7]
.J PROSPiCE 11000 IQul<!26291(C) 1.oIx.", .. EIoor,,..., 1993-2007
Jloaded ....litr (\DOCU~'E'I\EdJ\CONFlG 'IITomp\LI$6,lemSOrl",dMI;n 'GiS2.Il5MATC'H
"PIC16~,.I .... 7000318"""368'1) """I;tI1gPlC16628,.,.." I,!!;
oJ l....,.<1 128 I;oj•• eI P., .... 1"1[[PAOlA dol. !.!lI
.Jload,ng HE)(lie j,4och""HEX. 11£
J R.od 1«<101fOOlb;lk,"omlk t.HGI."",ftD\' :,r
J loaded 5311~0111'" WIIId end 0 tlol.!IjI(et IiG

Figura 47. Mensajes de diagnostico de fa simufaci6n

Se pueden configurar las opciones de esta herrarnienta desde la opcion DEBUG~


CONFIGURE DIS GNOSTIC (figura 49). En la ventana se muestran los componen­
tes del esquema susceptibles de un diagnostico en la simulacion y las diferentes
posibilidades de diagnostico y el tiempo de diagn6stico (figura 50).

FIgura 48. MensaJes de lit herramienta de dfagnostico

"'lbr6tYT8f1'II)I.;te~HaIt;
ChloH'l~

__ ._t,,,.
R.... POllJp _

Figura 49. La configuracion de diagnostlcos

20
1. ISIS de PROTEUS VSM

r,,,,,. C4t00Ul""
·InSYSll~ (ISIS/PROSPlCEI
• ~ ~ILrOR0-4X20·IlKP (US)
• 052405 lUll
• 052405 IU21
• OS24051U3)
- III PIC16f&28A (UG)
o
I I'IOglomLoeder
.., I,.,.bucbon~..,
.. Mel1'lOl)llSFRICcon _.
! R...d E"eo!,
I SI"""","" Event.
Inten\llll EYer'll
I WIIkI1dc!!hnal MocUo
PSPModIAe
II_lnlllmo.;lJon LIIw.I

Figura 50. Opclones de conflguracl6n

Tras 1asimulacion aparecen los diferentes resultados del analisis; en eJ item SOUR­
CE aparece indicado el dispositive fuenle del analisis y tras una pulsacion se puede
acceder a el (figura 51),

MeU<OQ&
~Pin plebe on UOOOOI If dog.lal

.r"
~p", PIOI»on Uooo."S" 6o,laI
Plob, (VI ~1~)1)~6, dgII"
aplr>PI"tJ<, ,., uooro.>~I d.ll'I'"
'if'•.JlCOt on UO(l(t28 " digital
'if'in ptabo on UOO029, 6gJlaI
.Pln Plol» on UOOQ-.iil t dog.l..
d PIC16madeI ,""'est!
700 0318uid 3685)""'obng PICI6628 deo,ioc;o.
'_IOlWIOI Fbll.,Jy ·-"de lfJol
1iWC.:'. :. 111« t' •
• [OIW10) CAC-8 Code ASH
.,Cll\"'10} av."~, ''4,p(o[1 fie
U Loaded 128 bjitet CIt "0",,1,,,,1 EEPROM dole
d LDdJg HEX lilo 'MooI1rcm HEX'
._. Floodtdalcjl 082 bjitet homfile 'Moehl.... H£)(,
dLcoded536 plogtam wad ~ 0 dolo bjite> ",'

Figura 51. Resultado del dlagn6stlco

EJ listado de nodes y patillas se pueden encontrar con Ja ayuda del DESIGN EX­
PLORER (a esta opci6n podernos acceder a craves de disrintas opciones: coman­
do DESIGN, boton derecho, etc.). En su venlana de trabajo se muestran todos los
nodes y patillas que forman el circuito (Figura 52),

21
Compilador C CCS Y Simulador PROTEUS para Microconlroladores PIC

i5"'''' ~.
~ Lb ....
-
-...._ ,_
-
cl

... -.........
!'"
.......-. ..,..". L ... t..

..
:: .....
i"'....."'",M..,
I t'
."
Ed(Qc~PrOOCllbe''''
fdt $'oOI"'_tIH, ..
....... ·n :=o,.lV
'1"'-~,K>II'l
~
~. l
-..
lI!I~fII""
:'::::'-I~t
tdil""..... '_ ...
::f>- ::= -"'~T......·IIi""'·~·" ;-
f:~ : ~,
.. -
Corltoo.. ~A"', ..
.....".
-1It .... .M
... ,&.... '"

~-
!, :or.:;

. --
I.13IC_
~ tIOo' 5h>oI ....""'II"'lIl'-n.." ...''"'
~.~J"',*I
::::,r
..-..,.
."./ill1IO':
Wa--- ,~ "
I ........."'"
.. \....,.I~ltlo.

~9~."""~
0Il ~5heot
-",-
,N
:::~ "" ~'iOtI

Alf-P.
fil.c:otO.so.e<
ililfIe>l9n~or ,..+x +-
fir
" l Root.t.o( I
componentes
~!'
_,_ ~:
"".
r:,;s L".
V·"'i
"-
-
.. ...
-'.I)'I'CI

-.....
-""
-'"',....
_-",
,-
.
.. :- I
::i,.
IICO'"
"",.
lo5',.'lI';
:r
::~
- El II1II0'10
y,",~(..
• IICU'"
Y " ""'.."
"""
" ..... ,,,.,,.
.......,.
¥tMo"

-
'1'.... t::;::'" :;1
"·IdI1l.
v_,
t '».W
tJJ....... 1:::
...
\o.~~

.....~
Y":II'
Y""I' :!
~= v_

,,-.,.~....
.......
.........
"'"
v_
~;
.
A>ol
t.( ......

~I
nodos

Figura 52. La ventana Design Explorer

22
2. Compilador CCS C

Capitulo 2

Compilador CCS C
2.1 'ntroduccion
EI Compilndor C de ces ha sido desarrollado espedficamente para PIC MCU, ob­
teniendo la maxima optimizaci6n del compilador con estos dispositivos. Dispone
de una amplia libreria de funciones predefinidas, comandos de preprocesado y
ejemplos. Adernas, suministra los controladores (drivers) 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 la direccion http://www.ccsinfo.com.

Un compilador convierte el lengua]e de alto nivel a instrucciones en codigo rna­


quina; un cross-compiler es un compilador que funciona en un procesador (normal­
mente en un PC) diferente al procesador objeto. El compilador CCS C es un cross­
compiler. Los programas son editados y compiJados a instrucciones maquina en eJ
entorno de trabajo del PC, el codigo maquina puede ser cargado del PC al sistema
PIC mediante ellCD2 (0 mediante cualquier programador) y puede ser depurado
(puntas de ruptura, paso a paso, etc.) desde el entorno de trabajo del Pc.

EI CCS C es C estandar y, adernas de las directives estandar (#illc/udc, etc.), surni­


nistra unas directivas especificas para PIC (ltdc'vice, etc.): ademas induye funciones
espedficas (bif_sefO, etc.). Se surninistra con un editor que permite controlar la sin­
taxis del programa.

NOTA

En el manual de CCS se da rnucha mas informacion de la que a continuacion


se va a dar. En este capitulo solo se describiran los elementos mas basicos y
esenciales para comenzar a programer.

23
Compilador C CCS y Simulador PROTEUSpara Microcontroladores PIC

2.2 Estructura de un programa


Para escribir un programa en C con el ccs
C se deben tener en cuenta una serie de
elementos basicos de su estructura (figura 1).

• DIRECTIVAS DE PREPROCESADO: controlan la conversion del programa


a codigo maquina por parte del compilador.
• PROGRAMAS 0 FUNCIONES: conjunto de instrucciones. Puede haber uno
o varies: en cualquier caso siernpre debe haber uno definido como principal
mediante la inclusion de la llarnada maint).
• lNSTRUCCIONES: indican como debe comportar el PIC en todo momento.
• COMENTARIOS: permiten describir 10 que significa cada linea del programa.

18161>
delay alock
XT mwD1'
~'.ndArd_ ~o • ._____ Directivas

____ ----- Funcion


TfMUO ur ..
v.,O -
v.atO OUtput bit PUI. &0
It'1oi output 1>1c FTN 10 .
•• t_'u.....tO - -

Min
___
.-
------ Funci6n principal
".t.. _tlJD..:_O P..TCC I~"ERNAL "''Tee DIV :

.".
"
to

....
"'"

Figura 1. Estructura baslcade un programa

2.3 Tipos de datos


ccs C acepta los siguientes tipos de datos:

Tipo Tamaiio Rango Descr!.E_cion


Inn
1 bit Oal Entero de 1 bit
Short

24
2. Compilador CCS C

Tipo Tamaiio Rango Descripci6n


Int
Int8
8 bit o a 255 Entero

Int16
Long
16 bit o a 65.535 Entero de 16 bit

Int32 32 bit o a 4.294.967.295 Entero de 32 bit


±1.l75xlO·3jja
Float 32 bit Coma flotante
±3.402xlO-JS
Char 8 bit o a 255 Caracter
Void - - Sin valor
Signedlnt8 8 bit -128 a +127 Entero can signo
Signed lnt16 16 bit -32768 a + 32767 Entero largo can signo
Signed lnt32 32 bit _23Ja +(231-1) Entero 32 bit can signo

2.4 Las constantes


Las constantes se pueden especificar en decimal, octal, hexadecimal 0 en binario:

123 Decimal
0123 Octal (0)
Ox123 Hexadecimal (Ox)
ObOl0010 Binario (Ob)
'x' Caracter
'\010' Caracter octal
'\)cAS' Caracter hexadecimal

Ademas, se pueden definir constantes can un sufijo:

lnt8 1270
Long 80UL
Signed INT16 BOL
Float 3.14F
Char Can comillas simples 'C'

Tarnbien se de.finen earacteres especiales, algunos como:

\n Cambia de linea
\r Retorno de carro

25
Compilador C CCS V Simulador PROTEUSpara Microcontroladores PIC

\t Tabulacion
\b Backspace

2.5 Variables
Las variable se utilizan para nombrar posiciones de memoria RAMi se deben decla­
rar, obJigatoriamente, antes de utilizarlas; para ello se debe indicar el nombre y el
tipo de dato que se manejara. Se definen de Lasiguiente forma:

TIPO NOMBRE_ VARIABLE [=VALOR INICIAL]

TlPO hace referenda a cualquiera de los tipos de datos vistos en el punto 2.3. El
NOMBRE_VARlABLE puede ser cualquiera y el valor inicial es opcional. Veamos
un ejemplo:

float temp_limic=500.0;

Las variables definidas en un programa pueden ser de tipo LOCAL 0 GLOBAL. Las
variables locales solo se utilizan en la funcion donde se encuentran declaradas; Las
variables glob ales se pueden utilizar en todas las funciones del programa. Ambas
deben declararse antes de ser utilizadas y Lasglobales deben dedararse antes de
cualquier £unci6n y fuera de elias. Las variable globales son puestas a cera cuando
se inicia la funcion principalmain().

~Lnclude <16f876.h>
#us£ DELAY (CLOCK=4000aOO)
in tl6 counter; /1 Variable g~obal
void tvo ia)
FUNCION

char K, kens= '0'; II Variables locales

void main ( )

int8 temp; 1/ variable local

Las variables pueden ser definidas can:

• AUTO: (usada par defecto, no hace falta que se indique) donde la variable
existe rnientras la funcion esta activa. Estas variables no se inicializan a cero.
Su valor se pierde cuando se sale de Lafuncion.

26
2. Compilador CCS C

• STATIC: Una variable local se activa como global, se inicializa a cero y man­
tiene su valor al entrar y salir de la Fund6n.
• EXTERN: Permite el uso de variables en oompilaciones multiples,

2.6 Operadores
2.6.1 Asignacion
+= Asignaci6n de suma (x+=y es 10 mismo que x=x+y)
-= Asignacion de resta (x--y es 10 mismo que x=x-y)
It= Asignacion de multi plica cion (x"''"'yes 10 mismo que x=xry)
/= Asignacion de division (x/=-y es 10 mismo que xc:x/y)
%= Asignacion del resto de la division (x%=y es 10 mismo que x=x%y)
<<= Asignacion de desplazamiento a la izquierda (xcc=y es igual que x=x«y)
>>= Asignacion de desplazamiento a derecha (x>>--yes iguaJ que x=x»y)
&= Asignacion AND de bits (x&"')'es 10 miS010 que x=x&y)
1= Asignacion OR de bits (x 1=y es 10 mismo que x=xIy)
"= Asignacicn OR EXCLUSIVAde bits (x"=y es 10 mismo que x=x"y)

2 .6.2 Aritmetlcos

+ Suma
- Resta
* Mul tiplicaclon
I Division
% Modulo, resto de una division entera
-- Incremento
++ Decremento
sizeof Delermina el tarnafio, en bytes, de un operando

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


rador, se consigue un preincremento (++A)0 un postincremento (A++).

27
Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC

II b-16 Y a~4;

2.6.3 Relacionales
< Menor que
> Mayor que
>= Mayor 0 iguaJ que
<= Menor igual que
- IguaJ
!= Distinto
?: Expresi6n condicional

2.6.4 Loglcos
! NOT

&& AND
II OR

2.6.5 De bits

- Complemento a 1
& AND
1\
OR EXCLUSIVA
I OR
» Desplazarniento a derechas
« Desplazarniento a izquierdas

2.6.6 Punteros
& Direcdon
If
Indirecci6n
-> Puntero a estructura

28
2. Compilador CCS C

Orden de precedencia de los operadores:

Expresiones en orden de precedencia descendente


(expr)
lexpr -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 exprl=expr
expr&expr
exproexpr
expr I expt
expr && expr
expr II expr
expr? expr:expr
Ivalue = expr Ivalue+sexpr Lvalue-=expr
Ivalue*=expr IvaJue/=expr Ivalue%=expr
1va1uex=expr lvaluecc=expr Ivalue&=expr
Ivalue==expr lvalue I=expr expr, expr

2.7 Funciones
Las funciones son bloques de sentencias; todas las sentencias se deben enmarcar
dentro de las funciones. Al iguaJ que las variables, las funciones deben definirse
antes de utilizarse.

Una funcion puede ser invocada desde una sentencia de otra funcion. Una funcion
puede devolver un valor ala sentencia que 1aha llamado. El tipo de dato se indica
en la definicion de la funcion: en el caso de no indicarse nada se entiende que es
un int8 )' en el caso de no devolver un valor se debe especiJicar el valor VOID. La
funci6n, ademas de devolver un valor, puede recibir parametres 0 argumentos.

29
Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC

La estructura de una funci6n es:

Tipo_Dar:.o Npmbre_Funcion (ripo paraml, param2, .... )


{
(sentencias) ,.

float trunca (floae a)


float b,.
b-ttoor (a) ,.

a-a"laa,.
a-floor (a) ;
a ..a~O.OJ.;
a-b+a,.
return (aJ,.

La forma de devolver un valor es mediante la senten cia RETURN:

retum (expresion),­
return expresi6n;

Donde expresi6n debe manejar el mismo tipo de dato que el indicado en la de­
finicion de la funcion. En el caso de no devolver nada se finaliza con RETURN,
a1 encontrar esta sentencia el compilador vuelve a la ejecucion de la sentencia de
llamada. Tambien se puede finalizar la funcion sin RETURN, tan solo con la Have
de cierre "}".

Las funciones pueden agruparse en ficheros de librerias <fichera.It>, que se pueden


utilizar mediante Ja directiva #inc/Ilda <fichero.h».

2.8 Declaraciones de control


Las declaraciones son usadas para controlar el proceso de ejecucion del programs.
Las que admite CCS son:

• lj-Elsc.
• While.

30
2. Compilador CCS C

• Do-While.
• For.
• Switch-Case.
• Return.
• Break, Cantin ue y Gota.

2.8.1 IF-ELSE
Con 1aayuda de IF-ELSE se pueden tamar decisiones.

i:f (exp.t:esi6n)
sencencia_li
(else
sen tencia _ 2; ]

NOTA

1...05 elementos que se encuentran entre corchetes [J son opdonales.

Primero se evalua.Ia EXPRESI0N y si es cierta (TRUE 0 1) ejecuta 1a SENTENCIA._l,


en eJ caso contrario (FALSE .0 0) ejecuta la SENTENCTA_2.

Pueden anidarse los IF-ELSE dando lugar a los ELSE-IF; esto permite tomar deci­
siones multiples.

if (expresi6n_lJ
sentencia_l;
[else if (expresiOn_2J
sen tencia _ 2 i J
{else
sencenClil_3;}

En este caso las EXPRESTONES se evahian en orden, si alguna de eUas es cierta la


SENTENCIA asociada a ella se ejecutara y se temrina la funcion. Encaso contrario
se ejecuta Ia SENTENCIA del ELSE. En ambos casos si existe.n varias se.ntencias
para ejecutar se deben utiliza las llaves f I:

31
Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC

if (e.><presi6n)

sencenci<l_l;

sentenCid_n;

(else

sentenci<l_l;

sentencia_n;
JJ

Eiemplos:

IF (A==O) 8=10,
ELSE C=5;

IF (A!=1) 8=10,
ELSE C=5:

IF (A>10)
{IF (A>20) B=5,
ELSE B=15,}

32
2. Compilador CCS C

IF (A>10)
{IF (A>20) B=15;}
ELSE B=5,

2.8.2 SWITCH
Swifch es un caso particular de una decision multiple

swit.cn (expresion)

case constante 1:
sentencias;
break;
case constanta 2:
sentencias;
breek :

detail 1t:
entencias;]

Evalua la expresi6n y en orden a la CONSTANTE adecuada realiza Lassentencias


asociadas. Si ninguno de los CASE corresponde a la CONSTANTE se ejecuta DE­
FAULT (este comando es opcional),
EJ comando BREAK provoca la salida de SWTTCH, de 10 contra rio se ejecuta el
iguiente CASE.

NOTA

I'\o puedcn existir dos CASE can 1a misma CONSTANTC.

33
Compilador C CCS y Simulador PROTEUS para Microconfroladores PIC

Ejemplo:

Switch (A) {
case 0:
8=1;
break;
case 2:
8=2,
break;
case 3:
8=3;
break,
default: break;
NO

2.8.3 FOR
Se usa para repetir sentencias,

for (inlcializacion ,. candicion de finalizacion incremento)

sentencias;

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


valor inicial con el que controlar el bucle, La condicion de finalizacion sirve para
evaluar ANTES de ejecutar las sentencias si es cierta 0 no, en el caso de ser cierta se
ejecutan las sentencias yen caso contrario se sale del FOR. Por ultimo, la expresi6n
de incremento 0 decremento modifica la variable de control OeSPUES de ejecutar
el bucle.

NOTA

Se pueden anidar bucles fOR utilizando distintas variables de control.

34
2. Compilador CCS C

Si se ejecuta la siguiente expresion se consigue un BUCLE SIN FIN;

For ( ;)

sentenciils;

Ejemplo:

For (N=1 :N<=10;N++)


I{
I Printf("%u",N);
}
S!
~
1
NO

IMPRlMIR N
N-N'I
L
2.8.4 WHILE I DO-WHILE
WHILE se utiliza para repetir sentencias.

while (expresion)

sentencias;

La expresi6n se evalua y 1asentencia Be ejecuta mientras la expresion es verdadera,


cuando es £alsase sale del WHILE.

35
Compilador C CCS Y Simulador PROTEUS para Microcontroladores PIC

DO-WHILE se diferencia del WHILE Y del FOR en la condici6n de finalizacion, La


mal se evalua al final del bucle, par Laque las sentencias se ejecutan al menos una
vez,

Do

sencenci~s;

while (eApresion);

Si se ejecu tan las Sig1.1 ientes expresiones se consigue un B UCLE STNFIN:

While (1)
(

sarrcencias i

DO

serit.erici.es :

While (1)

Ejemplos:

While (N)5 && M<10)


{
A=1;
8=2;

36
2. Compilador CCS C

51 A=1,
8=2,

I~hile (N)5 && M<10);


~~

,
NO

2.8.50tros
• Return: se emplca para devolver datos en las funciones.
• Break: permite salir de un bucle, se utiliza para While, ForDo Y Switch.
• Goto: provoca un saito incondicional.

2.9 Comentarios
Los cornentarios en el programa facilitan la compresi6n de las distintas expresiones
tanto para el programador como para quien tiene que interpretar dicho programa.
No afectan a la compilaci6n por 10que pueden ser tan extensos como el prograrna­
dor quiera. Se pueden colocar en cualquier parte del program a y con dos forma­
tos:
• Utilizando /I. Al colocar estos signos se comienza el cornentario y finaliza en
el final de la linea.

/1 Comentario que termlnilrEi ill uoe: de eet:« Lned.

• Utilizando /* y "l, Se debe utilizer al inicio y al final de cornentario, pero no


pueden reperirse dentro del mismo comentario.

/' eece comencer io no iinallzil al final de esca linea


flnaliza cuando se clerre el comentario ~I

37
Compilador C CCS Y Simulador PROTEUS para Mlcrocontroladores PIC

2.10 Directivas y funciones (Preprocessor


commands y built-in functions)
2.10.1 Directivas
Las directivas de pre-procesado cornienzan con el simbolo /I y continuan con un
comando especlfico. La sin taxis depende del comando. Algunos comandos no per­
miten otros elementos sintacticos en la misma expresion. Muchas de las directives
utilizadas par CCS son extensiones del C estandar.

ItDEFINETOSTRING !lIP expr !I NOLIST


!lELSE IfIFDEF id GPRAGMAcmd
Estandar C
ItENDIP #UST itUNDEFid
# ERROR illNCLUDE "FiLENAME"
#INLINE PINT_GLOBAL #SEPARATE
Cualificadores
~INT_DEFAULT !lINT_xxx
__ DATE PCH__
-- --LINR__ --
_ _PCB __ TIME
Identificadores --DEVlCE-- -- --
_FILE_ - _-PCM__ __ FILENAME__
RTOS 1ITASK ruSERTQS
Especificacion #DEVICE CHIP IIID "filename" #FUSESoptions
Dispositivos .ID CHECKSUM ~IDNUMBER IISERIAUZE
#USE DELAYCLOCK mSEFlXED_IO IfUSERS232
Librerias
#USEFAST_IO mSE12C /tUSESPI
predefinidas
russ STANDARD_10
#ASM ItBYTEid=id IIROM
#BJTid=id.const #ENDASM #TYPE
Control de
#BIT id=const.const !IFILL_ROM !iZERO_RAM
memoria
*BUIlD #LOCATEid=const
II13YTE id=const ilRESERVE
Control de # CASE #OPTn !tPRIORITY
compilador bORG ltIGNORE_WARNINGS

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

38
2. Compilador CCS C

Como ejemplo se pueden comentar:

IIDEVICE chip, permite definir el PIC con el que se realizara la compilaciOn.

#device PIC16F84

#FUSES options, la cual peunite definir Ia palabra de configuraci6n para progra­


mar un PIC. Por ejemplo, en el PIC16F841as opciones posibles son:
(P, XT,HS, nc, NOWDT, WDT, NOPlIT, PUT, PROTECT, NOPROTECf.

Hdevice PIC16F84
#fuses XT, NOWDT, PUT, NOPROTECT

IIINCLLlJE "filename", pennite mduir fichero en el programa.

linclude <16FB4.h>
11fuses XT, NOWDT, PUT, NGPROTECT

/lUSE DELAY (CLOCK=SPEED), permite definir las freruencia del oscilador del
PIC, el compilador 10utiliza para realizar caleulos de tiempo. Se puede utilizar M,
MHZ, K Y KHZ para de£i.nirla frecuenda.

KINCLUDE <16P877.h>
'use delay(clock=4009000)

#ASM Y #ENDASM, perrniten utilizer codigo ensamblador en el programa en C.


Se utilizan a] inicio y al final del bloque ensamblador.

/iasm
bsf TATUS,RPO
movl", OxS
movwf PORTB
bcf STA'I'US,RPO
ilendasm

39
Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC

2.10.2 Funciones
ces suministra una serie de fund ones predefinidas para acceder y utilizar el PIC Y
sus perifericos. Estas fundones facilitan la configuraci6n deJ PIC sin entrar en el ni­
vel de los registros espedales. Las funciones se dasifican por bloques funcionales.

ASSERT() GETCH( ) PUTC()


FGETC() GETCHAR() PUTCHAR()
FGEIS( ) GETS() PUTS{ )
E/S RS232
FPRINTF( ) KBHlT() SET_VART_SPEED( )
FPUTC() PERROR() SETDP_UART( )
FPUTS() PRINTF( )
E/S BUS SETUP_SPI( ) SP1_DATA_IS_IN() SPI_WRITE()
SPI2-HILOS SPl_XFER( ) SPI_READ( )
OUIPUT_
GET_TRlSx( ) lNPUT_K() SET_TRIS_B()
FLOAT()
INPUT( ) INPUT_STATEC) OtJTPUT_G( ) SET_TRlS_C( )
INPUT_A() INPUT_x() OUTPUT Ji() SET_TRIS_D()
OUIPUT_
INPUT_B( ) OUTPUT_A() SET_TRIS_EO
HIGH()
INPUT_C() OUTPUT_B() OUTPDTJ() SET_IRlS_F( )
E/S [NPUT_D() OUTPUT_K() SET_IRIS_G( )
OUTPUT_BITe)
DISCRETAS
INPUT_E() OUTPUT_C() OUI'POT_LOW() SET_TRIS_H( )
OUTPUT_TO-
INPUT_F( ) OUTPUT_D() SET_TRIS__j()
GGLE( )
OUTPUT_DRI- PORT_A_PU-
INPUT_GO SET_TRlS_K( )
VEO [LUPSO
INPUT_H() OUTPUT_E() PORT_B_PULLUPS( )
INPUT_j( ) OUTPUT]() SET_TRlS_A( )
E/SPUERTO PSP_INPUT FULL() PSP OVERFLOW()
.PARAlELO
PSP_OUTPUT_FULL() SETUP _PSP( )
ESCLAVO
I2C_WRITE( ) 12C_SIaveAddr( ) I2C 15R_STATEO
ElSBUS12C I2C_POLL( ) 12C_START()
I2C_READ( ) I2C_STOP( )
CLEAR_INTE- GOTO_
RESET_CPU( )
CONTROL RRUPT() ADDRESS()
PROCESOS DlSABLE_IN- lNTERRUPT_
RESTART_CAUSE( )
TERRUPTS( ) ACTIVE()

40
2. Compilador CCS C

ENABUUN- JUMI'_TO_lSR
rERRUI'TS( ) SETUP_OSCILLATOR()
CONTROL
EXT_lNT_ LABEL-
PROCESOS EDGE( ) ADDRESS( ) SLEEP( )
GEIENV( ) READ_BANK( ) WRITE_BAl'\lK( )
BIT_CLEAR( ) MAKE8( ) _MUL( ) Sl-ITFT_LEFT( )
ROTATE- SHlFT_
MANEJO BIT- BIT_SET( ) MAKEI6()
LEFT( ) RIGHT( )
BYTE
BIT_TEST() ROTATE_
MAKE32( ) SWAP()
RIGHT( )
ABS( ) COSH( ) LABS( ) SIN( )
OPERADORES
MAT. ACOS( ) DIV( ) LDEXP( ) SINH( )
ASfN( ) EXP( ) LDIV( ) SQRT()
A1AN() FABS() LOG() TAN()
ATAN2() FLOOR() LOGlO( ) TANH()
C"ESTANDAR
CElL( ) FMOD( ) MOOre)
COS() FREXP( ) POW()
TENS16NDE
SETUP_VREF( ) SETUP_LOW _VOLT_DETECT( )
REFERENC1A
A/DCONVER- SET_ADC_ClIANNEL( ) SETUP_ADC_PORTS( )
SleN SETUP_A DC( ) READ_ADC()
ATOF() ISLOWER(char) STRCMP() STRRCHR()
ATOI( ) ISPRINT(x) SmCOLL() STRSPN( )
AT0132( ) ISPUNCf(x) STRCPY( ) STRSTR( )
ATOL( ) [SSPACE(char) STRCSPN( ) STRTOD( )
CARACTERES ISALNUM() ISUPPER(char) STRLEN( ) STRTOK()
CESTANDAR 1SALPl:-lA(char) rSXDIGIT(char) STRLWR( ) STRTOL( )
lSAMOUNG( ) ITOA( ) STRNCAT() STRTOUL( )
rSCNTI~L(x) SPRINTF( ) STRNCMP( ) STRXFRM()
ISDIGIT(char) STLKAT() STRNCPY() TOLOWER()
ISGRAPI lex) STRCllR( ) STRPBRK( ) TOUPPER( )
GET_TTMERO() SET_RTCC( ) SETUP_ThVIER_O( )
GET TIMERI() SET_TlMERO( ) S£TUP_T1MER_' ()
TIMERS
GE'T_TIMER2( ) SET_T1MER1( ) SETUP_TlMER_2 ()
GET_TLMERJ( ) SELTIMER2( ) SETUP_TIMER 3 ()

41
Compilador C CCS Y SimuJador PROTEUS para MicrocontroJadores PIC
-----------------
GET_1IMER4( ) SET_TIMER3( ) SETUP_TIMER_4 ( )
GET_TIMERS( ) SET_TlMER4( ) SETUP TIMER_5 ( )
TIMERS
CET:_TlMRRx( ) SET_TIMERS() SETUP_WDT ( )
RESTART_WDT( ) SETUP_COUNTERS( )
CALLOC() MEMCMP() OFFSETOFBLT()
FREE( ) MElYfCPY( ) REALLOC()
MEMORlAC
LONG]MP() MEMMOVE() SET]MP()
ESTANDAR
MAllOC() MEMSET()
MEMCHR() OFFSETOF()
STRXFRM() MEMCHR() MEMCMP()
STRCAT() STRCHR( ) STRCMP()
STRCOLL() STRCSPN() SIRICMP()
CADENAS STRCOLL() STRCSPN() STRICMP()
ESTANDAR STRLEN() STRLWR() STRNCAT()
STRNCMP() STRNCPY() STRPBRK{)
STRRCHR() STRSPN() STRSTR()
STANDARD STRING FUNCTION( )
SET POWER PWM_OVERRIDE() SETUP_CCP2{ )
SET_POWER_PWMX_DUTY( ) SETIJP_CCP3( )
SET_PWMl_DUIY( ) SETUP CCP4()
MODULO SET PWM2 DUTY() SETUP_CCP5( )
CCP SET_PWM3_DUTY( ) SETUP _CCP6()
SET PWM4 DUTY() SETUP_POWER_PWM( )
SET_PWMS_DUTY( ) SETUP_POWER_PWM_PINS( )
SETUP_CCPl()
ERASE_PROGRAM_EEPROM( ) SETUP EXTERNAL_MEMORY()
~TE_CONflGURArrON_
READ_CALIBRATION( )
MEMORY()
EEPROM READ_EEPROM( ) WRITE_EEPROMO
INTERNA
READ_EXTERNAL_MEMORY( ) WRITE_EXTERNAL_MEMORY()
READ_PROGRAM_EEPROM( ) WRITE_PROGRAM_EEPROM( )
READ_PROGRAM_MEMORY( ) WRITE PROGRAM MEMORY()
CESTANDAR
BSEARCH() RAND() $RAND() QSORT()
(ESPEClALES)
RETARDOS DELAY_CYCLES() DELAY USC) DELAY MS()

42
Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC

o .PJT: fichero de proyccto; conriene toda Ia informacion rcJacionada con el pro­


yecto.
o .lST: rnuestra un listado con el codigo C y el codigo ensamblador asociado
para cada linea de codigo.
o .SYM: muestra las posiciones y valores de los regisrros y las variables del pro­
grama.
o .STA: rnuestra una estadistica de la utilizacion de la RAM, ROM Y1a PILA.
o .TRE: rnuestra un arbol del programs donde se especifican las funciones y sus
llamadas, con la ROM y RAM usada en cada una de eHas.
o .HEX: fichero estandar para la programad6n del PIC.
o .COF: fichero binario que inc1uye el codigo maquina y la informacion para la
depuracion correspondiente,

2.12.2 Entorno de trabajo


E1entorno de trabajo del ces en pew y peWH perrnite com pilar y tarnbien sumi­
nistra una gran varied ad de herramientas auxiliares, En 1a figure 2 se muestra los
disrintos elementos basicos del entorno de trabajo. Existen dos forrnas de iniciar
una sesi6n: abriendo un fichero de codigo fuente 0 crcando un proyecto .

..
Barra de
SubComandos
Pestaila
Del
Programa

Barra de IZONA DE C60lGO I


Ventanas
auxiliares ......', .
,.,.,,,
...l.,U_ .°'11,1
.......
::'::·::';::U:=.
u,,.,._ ... _ ....
t1..........
•~t ..... '"_H''' 11.,..1_,..••• _t,

Figura 2. Entorno de TrabaJo

44
2. Compilador CCS C

Para abrir un fichero fuente directamente se realiza una pulsacion sobre el icono
para el manejo de ficheros (figura 3) y aparece un menu donde podemos crear,
abrir, guardar 0 cerrar ficheros. Con el cornando NEW podemos crear un fichero
fuente, un proyecto, un fichero RTF 0 un fichero de diagrama de flujo.

FIgura 3. los menus para el manejo de los fJcheros

Con la opcion NEW -7 SOURCE FILE, el program a pide el nombre del nuevo fichero
y crea una nueva ventana en blanco donde podemos empezar a escribir (Figura 4).
... '.

Figura 4. Flchero fuente nuevo

45
Compilador C CCS y Simulador PROTEUSpara Microcontroladores PIC

51se ejecuta el comando PROJECTWIZARD, tras pedir el nombre del nuevo pro­
yecto aparece la ventana de configuracion con dos pestafias, una para configurar
las distintas opciones que se muestran en la barra de 1a izquierda (figura 5) y otra
donde se rnuestra el c6digo resuHante de la configuracion (figura 6). Recorriendo
las distintas opciones (general, C0I111111111;catiolls, etc.) se llega a obtener el codlgo de
configuraci6n deseado (figura 7), tras 10 cual ya podemos empezar a escribir el
resto del codigo del programa. Debemos observer como se inc1uye un fichero de
cabecera *.11 donde se encuentra la configuraci6n del dispositivo (figura 8).
"'lIt.---- , :-,\\~
.:~,
J
"i

-~--
flJt

--- --
Sf'I-.llCO
T_
l'OIT_
;".q
00..
0.....

.. 0
c...
r~c;
10
..,
,. 0.-.0111_l1li'\
-.,
.".
...

0_.
-".p,
1,0",,"
IfcIMooV<Ioj>o
r _WOI """" ..... O(l.AY
,.-no.
I.. O...... C<rio

CAHIIU~
,r.;, OnahMpor ... ...ch •

lCO_
MOOBU$
~o .. ~---:=J
"'_110''''''

Figura 5. Ventana de conflguraclon de las opdones

Figura 6. Ventana de conflguracl6n con eJc6dlgo resuJtante

46
2. Compilador CCS C

Pl'ueba_l.c
1 Of : ... CE\ pru::l:'-"'i_l. b"
2 LCD C

!i5
mar.h h

6
7
8
9 &e~Up_8dc_pores ANO
10 s",eup_ado!DC_CLOCK_INTERNAL
11 saeup "pi FALSE
12 "",r.UJI-
r.inler0 RTCC INTEJlHALRTCC I>IV1
13 "",cup-CiJDer-l Tl DISABLED. --
1~ seeUP-~imer-2 T2-DI5.lBLED
15 lod inie - -
16
17
18
19

Figura 7. E. codigo despues de una configuracion

~_l.C _b.~I'"
> ..,076 b
1 .tIC
)
4 NOIffiT
5 JIS
6 PUT
~ l'Iopp.oTtC1'
8 NQB1IOIINOUT
I) NQLVP
10 IIOCPD
11 HOVRT
12 NODEBUC
l~
~4 de.1.y clOClC:
lS 1:'!I232 baud

Figura 8. EI fichero de cabecera con fa configuradon de. PIC

2.12.2.1 EI primer programa


La opcion del PROJECT WIZARD es muy comoda pero para comenzar a trabajar
con CCS C, se recomienda iniciar los ficheros de codigo mente directa.mente hasta
que el programador adquiera los conoci.mientos basicos para manejar esta opcion,

As! pues abrimos un fichero fuente nuevo donde se escribira un programa para en­
cender yapagar un led durante 1s-egundo. Elled se conectara a la patiDa RB7 de un
PIC16F876 trabajando a una frecuencia de 4 MHz. En los siguientes temas se iran
explicando cada una de las sentencias utilizadas, ahara 10 interesante es manejar eI
entorno d-etrabaja y no tanto 10 que hace cada sentencia

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


del microcontrolador PIC:

47
Compilador C CCS y SimuJador PROTEUS para MicrocontroJadores PIC

#include <16F876.b>

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


ces).El compiJador tiene una ruta de busqueda para los ficheros sinclude; esta ruta
se puede modificar en el caso de querer incluir ficheros que se encuentren en otros
directories. Con el coman do OPTIONS -7 PROJECTS OPTIONS -7 INCLUDE
FILES se accede a una ventana (figura 9) donde se puede afiadir, eliminar a mo­
dificar el orden de busqueda de los ficheros .liindude (tambien podemos observar
qlle se pueden configurar los ficheros de trabajo -FILES- a los ficheros de salida
-OUTPUT FILES-).

Figura 9. Ruta de busqueda de los ficheros #include

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


del PTC y el puerto utilizado. Es importante definir la velocidad inmediatamente
despues del PIC ya que muchos drivers (como el LCD) Ja necesitan para configu­
rarse,

luse deLay (clock = (000000)


# byte puerto_b = Ox06

Ahora se puede describir la funcion principal MAIN (). Los cambios de color, letra,
etc., se puede configurar desde la opcion OPTIONS -7 EDITOR PROPERTIES ...
Al escribir el pTograma (figura 10) podemos observar como aparece un arbol de
funciones a la izquierda de Ia ventana de programa; esto permite expandir 0 (on­
'traer las funciones y declaraciones de control para optimizer la visualizacion de los
programas mas complejos (figura 11).

48
2. Compilador CCS C

1 ~876 h
Z delay cloek
..5
3
p\leceo_b
6 vow Min VOiI
'7
8 aee_trls_b
9 pueno_b
10
11
;II 12 ~lav_1IIS
I 13 bit aee
__ puereo_b
d41.,,
14
IS blt_Clear puereo_b
16
17 vhlle nUl
18

Flgur .. TO.EIprograma

Iuu
t876 b
dela, clock

puert.o_b

.(!t_trta_b
PUeeto_b
U
..htl. TRUE

FIgura t t, Contrayendo eJ arbol

En ~Ieditor de texto se puede pulsar el boron derecho sobre cualquier lmea (figura
12); en el caso de los ficheros sinclude permite abrirlos en una pestafia adicional.

Figura 12. Las opclones del boto" derecho

49
Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC

Como ayuda para escribir el programa, CCS ofrece el comando VIEW (figura ]3)
que permite visualizar las interrupciones (Valid Interrupts), fusibles de configura­
cion (Valid Fllses), hojas de caracteristicas (Data Sht'ct) y una ventana completa don­
de se describe el PIC (Device Table Editor) mediante distintas pestanas (esta opcion
tambien es accesible desde la opci6n TOOLS -7 DEVICE EDITOR (ver figura 15).

II<

"".
~:~
' ....
,.~t
...,~-:
I"
;::
.
1 "4.~!:'''
r~
"!!"P ......
Ii:_ -•••
~ltd
f

'. I' I",


... _

II
~
0 I r ..
t\
,,.. Hrl..'.~""".UOI ........ IJl! fC.;a ...
'..'"
'"hl· '~J{t~r"it""""_""'''
'-11,..."..........
~ tf " II ,r " ,.
.. " '" ff " II f' u"
H " ••
""
tt "
" ,.."
It ..
ff
h "
no
ft
'''~""llIjl _''_'''""",
,.,
IU/"I" "._
1.-... '''''"''
... .
"iII'I'.. 'MI.'.,.,q~ ....r;
1."'0
1111"""
t"t~_"""'.~
....."~
'.' t
, ..... ....,
"""7.......
~--....-
,- I'
.c...

Figura 13. Comando vIew

Se puede proceder a la cornpilacion, que se puede hacer con el comando COMPILE


-7 COMPILE 0 directamente con la teda de funcion <F9>. Durante la compilacion
aparece una ventana donde se inform a del proceso de compilacion y si hay errores
(figura 14).Tras Ja compilacion aparece una ventana con los mensajes de error si los
hubiese 0 el porcentaje de utilizacion de la memoria RAM y ROM si Ia compilacion
ha sido correcta (figura IS).

NOTA

jATENCI6N! Si sc escribe un fichero fuente y a continuaci6n se abre 0 se crea


un segundo fichero fuente, al com pilar este ultimo se compilara el primero.
Siempre se compile siempre el PRIMER fichero abierto.

50
2. Compilador CCS C

F:I...ATUR-\_PIClpracric<lsICLASElluz_l",_cllu%.c

COlllplolt
No '00'.
OUIJI,n f".~
FII•• : 2. Slalt'"O"u; 8. TIm.: 1 Sec. 1I11'~ 266
ERR HEX SYIl lST COF PJT TRt; STA

RAM: 2'
ROM: I',
W'Wt! m;vtiJ com

Figura 14. Ventana de compllacl6n

)......, - ~)
li!i

\~H=~~r-------------------------------------------.ii
Figura 15. MensaJesde compllacl6n
Tras la compilacion se obtiene, entre otros, el fichero HEX para programar 0 si­
muJar el PIC. En OPTIONS -7 PROJECT OPT10NS ~ OUPUT FILES, se pueden
configurar los ficheros de salida (figura 16).
? Ie

o.t>uol'tt
rNone
.....
. co_ C<wroIe_Up
Ho[mn.
,.. stoncllinj .COCl 1~5ocf .:1
r A11) MAP r """''''''*'
r 0Id-., Ontmr.
r: Elcpandod,coo
(. COf'f r ,.,.._ r,;-

ov."... ObiOCtNt !I,.....


r. $1!I(11!X r: 0n0i'III
1;1_'.
Qc.elII .. "

rsc,""' ....
r 168111!X r-.,
("~ '~~
Q_ .........

l Dot... P_w_

Figura 16. Ficheros de salida

51
Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC

En Laparte izquierda del fichero iuente aparecen unas ventanas auxihares (Identi­
fiers, Projects, Piles) en las que se pueden observar la estructura de fichero de) pro­
grama compilado (figura 17). Hacienda una pulsacion en cualquiera de ellos se
abre una pestaria con su contenido.

~.,
16f8~h
-ci:~
lJr... ,
iJo.O$YOI
Iu2.IIn
...... "110
l4.J«
Iut.ccI
Iul.""
lu... ta
1800c""""_'

Figura 17. Ventana auxiJiar pa1"aficheros

En Ja barra estandar -figura 18- (para activarla: OPTIONS -7 TOOLBAR... -7


TOOLBARS, figura 19), tambien aparecen distintos comandos entre los que se en­
cuentran la visualizacion de los fichercs de salida,

i!

Figura 18. Barra estandar

lCO
Open
s..veAf
Close AI
Co~
PICWlZMd
SlCWa",d
Oesajptloru

Figura 19. Activacion barras de herramientas

52
2. Compilador CCS C

Hay un fichero de salida especialmenLe util para la simulacion con el PROTEUS


VSM, se trata del fichero RAM SYMBOL MAP (*.SYM) donde aparecen todas las
variables de la memoria RAM y sus correspondientes direcciones. Por ejemplo, si
en un program a exists una variable FLOAT lIamada TEMP, se puede consulter su
direccion a traves de este fichero (figura 20) para utilizarla en el WATCHdel PRO­
TEUS (figura 21 y Figura 22).

ad_ntc.c kd.c ad_lltc.sym


004-00$ QWAITE PROGRAM MEHO
OO~-005 QREAO PROGRAM MENOR
006 lcd _ _
1t15-1t16 CCP_1
015 CCP 1 LOW
016 CCP-1-HIGH
It1B-01C CCP:=2-
018 CCP 2 LOW
01C CCP-2-HIGH
021-02" MAIH.tu
025-028 MAULt,.
ufiO'Pf1l1ltiJlt'rm
020-030 HAIH • .11
031-032 HRIH.ualue
033 lcd init_i
033-034 QITOF.P1
033 MAIN.asCRATCH
034-0379PRIHTF_L320_J08FPF

Figura 20. Flchero de salida SYM

? )(

Dala1YPo<
r ASOIZ SUing
". BJ(e
, W",d!2bj1t.. l
Double\llOId (~~1
Quod\ll .. dra~l
I~EE I'looI (4 b.l(es)
1m DO<A:lIe181¥eo)
... HItecIII'looI13b!1t .. )
• MlcroclllP Fl9aIIHlI1tes)

" .i!1O tocioan

Figura 21. Configuracion del WATCH en el PROTEUS

53
Compilador C CCS V Simulador PROTEUS para Mjcrocontroladores PIC

x
Address
OXl9

Figura 22. Ventana de WATCH con la variable

54
3. La gesti6n de los puertos

Capitulo 3

La·gestion de los puertos


3. 1 Introducc.on
Los microcontroladores PTC tienen terminales de entrada/salida divididos en puer­
tos, que se encuentran nombrados alfabeticarnente A, B, C, 0, etc. Cada puerto pue­
de tener hasta 8 terminales que, de forma basica, se comportan como una entrada/
salida digital. Begun las caracterfsticas deJ PIC, cada puerto puede tener, adernas,
aslgnado un bloque funcional: convertidor AD, USART, [2C, etc.

Por ejemplo, en la familia PIC16F87X (figura 1), pueden llegar hasta 5 puertos en el
PIC16F877 donde se pueden encontrar bloques de TIMERS, CCP, MSSP, USART,
PSP Yconvertidores AD.

CftrAct~rh.llrll~ I'JCI6FII73 l'IC16F874 l'IC16F876 I'ICI6f877


Galli. M~dla -
I'rccu~ncla de IrabiTo, --- DC·1M1ih OC·20MII1. DC·1O~UI:t; DC·20MllL ~:[:
Rt'c! (y delnYl) POR.nOR POR,OOR 1'0R,nOR POR,BOR
(PWRT.OST) (PWRT.OSTJ (l'WRT.OST) (PWRTOSn
M~murl. d~ I'rogrllmll FI..A~ H ~K 4K HK ilK
(uuhll,r", dll I.j..bll~)
M~U1nrl. Oucu.{llVIeJ) 192 192 368 3611
Melllurim I)ACO.Et:P~OM 128 128
.- 156 256 l\;;:
Incenupdoo.s 13 14 1.1 t4
Puerto, F)S l'omA.n.C Pori~ A,B.C D e POMSA.B C Pur~ A.B.C.D.£
TeonJ)Clrl:wdor~8 .'I l l l ';i
M6dulo5 CCI' 1 2 2 1
ComuIIlcnCiOiiCio~ --- I\ISSP USART MSSPU~ART- M~SPUsAiiT 'iisSt>:USART ::
COlllunICllcl~n;;;P;;ruiCiO - PSI' p&r fJ
Modulo AD ue cObles 5 CANALES 8CANALt:!> 5 CANAl res 8 (,"NAI_f.~
~'c"u de I11M~!CJ.!!lJ_. _. _._J~__ J§._ lL_ ~-_- t
FIgura'. Caracterlstlcas de fa familia PIC' 6F87X

Consideranco a los puertos como entradas/salldas dlgitales, los puertos se carac­


terizan por ser independientes, es decir, se puede programar cada terminal del
puerto para que se com porte como una entrada 0 una salida digital (figura 2). La

55
Compilador C CCS V Simulador PROTEUSpara Microcontroladores PIC

habilitacion como entrada 0 salida se realiza a traves del registro TR1Sx (TRISA:
85h, TRlSB: 86h, TRISC: 87h, TRISD: 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 valor 1 indica que sera de entrada.

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

BUS DATOS 0 Q
r-, ..c--J TERMINAL
110
V
ESCRlTURA
-
Q -
DATOS

- 0 Of--

ESCRITURA Q
TRIESTADO

LECTURA
DATOS

Figura 2. Estructura basica de un terminal

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

• En el puerto A, el terminal Ril4 tiene salida en drenador abierto 10 que obliga


a utilizar i111a resistencia de pull-up en el caso de funcionar como salida. Este
terminal tiene entrada en trigger-schmitt 10 que permite su utilizacion como
entrada de contador de eventos extemos en conjuncion can un modulo tem­
porizador (TIMER).
• En el puerto B, los terminales tienen una resistenda de pull-lip interna que se
puede habilitar a traves del bit RBPU del registro OPTION_REG (8Th, 18Th).
51 dicho bit es I, todas las resistencias de pull-up estaran deshabilitadas, si es
un 0 estaran habilitadas s610 en el caso de que el terminal funcione como en­
trada (figura 3).

56
3. La gesti6n de los puertos

R/W·1 R/W·1 II/W·! RJW·, R/w·' R/w.' RJW·, R/W., II-BII.I •• r


IIIBPU IINTEOG I TOCS I TOSE IpSA I PS2 I PSI Ipso I
WoBI•• esetlblr F
Llt7 SItO
U-SII no Impl .......ntado
,. '" como a
"'''valor pare un POR resel
~i:
~ ~ '-
t'i'
Figura 3. Reglstro OPTION_REG

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


t-Les deshabilita.
D=Lashabilita todas.

Las caracteristicas electricas de los puertos delimltan su utilizacion para manejar


cargas de forma directa.

Maxima corriente de salida a nivel alto par un pin I/O 25 mA


Maxima corriente de salida a nivel baio nor un pin 1/0 20mA
MAxima corricntc de salida a nivel aha eor el puerto A .!Q.!!!!,\
MAxima corricrne de salida a nivel baio cor el puerto A 50mA
Maxima corrieute de salida a nivel alto ear cI puerto B ~mA
Maxima corricnte de salida a nivel bajo por el puerto B IOOmA

Figura 4. Caracteristicas electricas de los puertos de un PIC16F84

Estes niveles de tension perrniten trabajar con cargas de bajo consumo como leds,
displnys de 7 segmentos 0 LCD, pero para activar cargas de mayor consumo es ne­
cesaria la utilizacion de transistores.

3.2 Gestion de puertos en C


En lenguaje C se pueden gestionar los puertos de dos formes:
• Se declaran los regisrros TRISX y PORTX definiendo su posicion en la memo­
ria RAM como variables de C.
• Utillzando las directivas espedficas del compilador (/tUSE FAST_IO, /;USE
FIXED_lO, #USE STANDARD_IO).

3.2.1 A traves de la RAM


Se definen los regisiros PORTx y TRISx como bytes y se sinian en 1a posicion co­
rrespondiente de la memoria RAM, La directiva utilizada de C es IIBYTE:

IIBYTEvariable=constante:
'BYTE TJUSA • Ox8S 1/ Variable TRISA en 8Sh.
'BYTE PORT'" - OxOS // Variable PORTAen OSh.
ilBYTE TRISB - Ox86 /1 Variable TRISB en 86h.

57
Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC

jBYTE PORTB = Ox06 II Variable PORTB en 06h.


#BYTE TRIse = Ox87 II Variable TRISe en 87h.
tBYTE PORTe = OxO? II Variable PORTe en 07h.

Una vez definidas estas variables se pueden configurar y controlar los puertos a
traves de los eomandos de asignacion.
TRISA = OxIT; II 8 cerminales de entrada
TRISB c Oxoo; II 8 cerminales de saLida
TRIse = OxOF; 114 terminales de mayor peso de salida, 4 terminales de
II menor peso de en~
Escritura en los puertos:
PORTC= OxOA; II salida del datos 00001010 por e1 puerto C
Lectura de puertos:
valor = PORTA; II Asigna e1 dato del puerto A a la variable valor.

Manejo de sentencias:
TRISD9JxOF;
if (PORTO& OxOF) PORTD 1= OxAO; II comprueba los 4 terminales de
II meaos: peso de~ puerto D y 51 son
II 1111 saca pot: los 4 terminales de
II mayor peso e1 data 1010.
Existen unas funciones de C que perrniten trabajar bit a bit con los registros 0 varia­
bles definidas previamente. Estas funciones son las siguientes:

bit_clear (var,bit)i II Pone a 0 el bit especifieo (0 a 7) de la variable.


bit_set (var , bit)i II Pone aIel bit especifieo (0 a 7) de la variable.
bit_test (var, bit): /1 Muestra el bit especifico (0 a 7) de la variable.
swap (var); /1 Intercambia los 4 bits de mayor peso por los 4 de
// menor peso de la variable
bi t_ set (PORTe , 4); 1/ "sacs" un 1 pox e1 r:erminal RC4
if (bit_.eS~iPORTB,O)==l) bit_cleariPORTB,l); Iisi F~O es 1 borre RBl

Se puede declarar unbit de unregistro con una variable mediante la directive ;iBIT,
10 que permite trabajar directamente con el terminal:
if BIT nombre = posicion. bit
#BIT RB4 = Ox06.4 •1 FORTA=Ox06
RB4 = 0;

58
3. La gestion de los puertos

Ejemplo 1: Se configuran los terminales RBI como salida y el RBO como entrada
(con resistenda de plill-lIp). La salida debe tener el mismo valor que la entrada. Se
utiliza un interrupter en Ja entrada y un led en 1a salida (figura 5). Componentes
ISIS: P1C16F876, RES, LED-BLUE Y SW-SPST-MOM.

OSClICLKIN RBO/INTH~------__,
OSC2ICU<OUT
'------1..-1 MCLRNpp/l1-tV
RS1 H~----,
RB2

R83/PGM SW1
RAOIANO RB4 SW-SPST-MOM
RA1/AN1 Res 01
RA21AN2NREF· RB6IPGC LED-BLUj •
RA3IAN3NREF< RB7/PGO
RA4/TOCKI
RA5IAN4/SS RC0/T10S01T1CKI
RC1/Tl0SI/CCn
RC21CCP1
RC3/SCKISCL
RCI/SOI/SDA
RC5ISDO
RCGITXICK
RC7/RXIOT

Figura s. EIesquema del eJemplo 1


#include <16F876.h>
il'fuses
XT,NOWDT
#use delay( clock" 4000000 ) II Reloj de 4 MHz
IBY1'ETRISB Ox85 /1 TRISB en 85h.
'BYTE PORTB - Ox06 II PORTS en 05h.
'BYTE OPTION_REG - Ox8l II OPTION_REG en Blh.
void main () (
bic_clear(OPTION_REG, 1); II Habilitacion Pull-up
bit_seC(TRISB,O); II BO como entrada
bit_clear(TRISE,l); II B1 como salida
bit_clear(PORTB,lJ; II Apaga el LSD
while (1) (
if (bit.test(portb,O) -- 1 II S~ RBO es J, apaga el LED
bic_clear(portb,l);
else
blt_set(portb,l); II Si REO - 0, enclende el LED

Figura 6. EIprograma del ejemplo 1

59
Compilador C CCS V Simulador PROTEUSpara Microcontroladores PIC

3.2.2 A traves de las directivas


El compilador ofrece funciones predefinidas para trabajar con los puertos. Estas
funciones son:
output_X (valor); II Por el puerto correspondiente saca el valor (0-255).
input_XO; II Se obtiene el valor en el puerto correspondiente.
set_tris_X(valor); 1/ Carga el registro TRISx con el valor (0-255).
port_b_puUups (valor); 1/ Mediante valor = TRUE 0 valor = FALSE habilita
I/o deshabilita las resistencias de pull-lip en PORTB.
get_trisXO /1 Devuelve el valor del registro TRISx
Donde la X es la inicial del puerto correspondiente (A, B, C,... ).
Output A(OxFF); II sees por el puerto Ii e1 valor 11111
Valor~Tnput_B(); II Lee el valor del puerco B
Sec_tris_C(OxOF); II Configurae1 puertO C: CO-CJ encradas, C4-C? salidas
Existen una serie de funciones asociadas a un terminal 0 pin". EI para metro pin"
se define en un fichero include (por ejemplo, 16F876.h) con lin Formato del tipo
PIN_Xu, donde X es el puerto y n es el numero de pin.

IIdefine PIN_AO 40
#de6ne PIN_A141

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.
output_toggle(pin"); II Complementa el valor del pin.
output_float (pin"); II Pin de entrada, quedando a tension flotante ...
II (simula salida en drenador abierto)
input_state(pin"); II Lee el valor del pin sin cambiar el sentido del
II terminal.
input(pin"); II Lee el valor del pin.
Las funciones ot/tput_xO e illput_xO depend en de la directiva tipo IIUSE "_10 que
esre activa. Directivas:
IIUSE FAST_IO (PUERTO) [PUERTO: A ... J
Con la funci6n Olllpllt_xO se saca el valor al puerto y con la funcion input_xO se Ice
el puerto. La directive no modi fica previa mente el registro TRTS correspondlenle.

60
3. La gestio" de los puertos
-------------------------------------------------
Hay que asegurarse de que los registros TRIS estan correcramente definidos. En­
tonces, el ejemplo 1 quedaria :
#include <16FB16.h>
I fuses XT, NOWDT
Duse de1ay( clock = 4000000
Huse fast_io (B) ~
void maJ.n() (
port_b_plll.lups (TRUE);
set_tris_B(OxOl);
outpuc_J.ow(PIN_BlJ;
while (1)

i1 (input (PIN_BO) = 1
output_low(PIN_Bl);
else
ourput_high(PIN_Bl);

IUSE STANDARD_IO (PUERTO) [PUERTO: A... ]


Can la funcion output_x() el compilador se asegura de que el terminal, 0 terminales
corresponclientes, sean de salida mediante la modificacion del TRlS correspondien­
teoCon Ia funcion input_xO ocurre 10 mismo perc asegurando el terminal (termina­
tes) como entrada. Es la direct iva por defecto. Entonces, el ejemplo 1 quedaria:
Hnclude <16F876.11>
ifuses XT,NOWDT
fuse delay( clock = 4000000 )
juse standard_io(B) +-
v~nd main () l
port_b_pullups (TRUE);
output_low(PIN_Bl);
vn.i.Le (1)
(
if (input(PIN_BO) == 1
ou~put_low(PIN_Bl);
else
output_hlgh(PIN_Bl);

~USE FIXED_10 (PUERTO _OUTPUTS=pin'" I ...) [PUERTO: A...J


E1compilador se encarga de generar el codigo para definir los puertos de acuerdo
can la informacion que indica la directiva (donde solo se inclican los terminales de

61
Compilador C CCS Y Simulador PROTEUS para Microcontroladores PIC

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


ejemplo 1 quedaria:
#include <16F876.h>
#fuses XT, NOWDT
juse delay( clock = 4000000 )
fuse fixed_io(b_outputs;pL~_bl) +­
void main() I
port_byullups ('I'RUE);
oucput_low(PIN_Bl);
while (1)

if (input(PIN_BO) == 1
outPut_~ow(PIN_Bl);
else
outPuc_high(PIN_Bl);

3.2.3 Con punteros


En C se puede acceder a la memoria de datos mediante punteros. Los punteros se
deben definir como TNT:
#define TRISA (inc*) ax8S
'define PORTA (iDL*J oxos
El registro es manejado mediante la utilizacion del operando ...:
inc v<Jlor
valor = "porta

Los terminates se pueden leer 0 escribir utiJizando operadores logicos:


*porta 1= ObOOOOOOOl; //RAQ=l
·porta &= Obllll1101; II RA2 = 0
If (*porta & ObOOOaOOOl) ... II Lee e1 valor de RAO

Entonces, el ejemplo 1 quedaria:


#include <16F876.h>
tfuses XT,NOWDT
#use delay( clock = 4000000
Ideline TRLSB (int~J Ox86 +­
itdefine PORTE (int·) Ox06 +­
-fdei1ne OP'l'IOlij ( inz=) OxSl +-

62
3. La gestio" de los puertes

void main () {
"option G= ObOl111111; II Pone a 0 el bit 7 del OPTION RSG
II (pull-up habilitado)
"trisb - OxOl; I I REOentrada, RBl saiida
~portb ~ OxOO; II Apaga el .LED
while (1)

if (·portb & OxOl /1 Lee el RBO y si es 1 ..


*portb=OxOO; II Apa~ el LED (RBI ~ 0)
else
"portb-Ox02 ; /1 ss es 0 enciende el LED (RBI. = 1)

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


catodo comun. La cuenta debe ser continua y de a a 9 el digito de las decenas debe
estar apagado. Componentes ISIS: PIC16F876, RX8 Y 7SEG-MPX2-CA-BLUE .

•• ,\,..-<.
t~ .'

;, ~
.. .1,

12

••

Figura 7. El esquema del ejemplo 2


#include <15£'875.h>
#USE DELAY(CLOCK = 4000000)
#FOSES XT,NOWDT,NOPROTECT,NOPUT
IUSE fast_IO (B)
JUSE fast_IO (A)
byte C~NSt DLSPLAY(lO] {Ox3f,Ox06,Ox5b,Ox4f,Ox56,Ox6d,Ox7d,Ox07,Ox7f,Ox6f);

63
Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC

main () (
byte ud=O,dec=O;
SET_TRIS_B(OxOO);
SET_TRLS_A(OxOO);
OUTPUT_B(0);
fori ;; ) (
for (dec=0;dec<10;dec++) /1 Cuenta digi~o decenas
for (ud=O;ud<lO;ud++)
OUTPUT_A(Ox02); // cat_D = epeqeao , cat_U = encendi.do
OUTPUT_B(DISPLAY{ud); Digito unidades
/
delay_ms(SO); // Para evicar parpadeos
if (dec==O) output_a(Ox03); /1 Si decenas = 0,
// cac_D = apagado
else output_a(OxOl); // Si decenas > 0,
/1 cat_D = encendido
OUTPUT_B(DISPLAY{dec]); 1/ Digito decends
de.lay_.IIlS (50) ; II Para evitar parpadeos

Figura 8. E. programa deJ ejemplo 2

Los terminales de los dos displlTYs son comunes por 10 que el data es comun; para
que aparezca el digito solo en Jas unidades, 0 5610en las decenas, se debe apagar
elot'ro display mediante e] terminal de carodo, Es deci.r, si se desea visualizar las
unidades se pasa e1 codigo "10" al display y si son las decenas se pasa el"Ol" (con
un 1el display esta apagado y can un 0 esta encendido). La altemancia entre.los dos
catodos debe ser tan rapida que el ojo no se de cuenta del parpadeo. En el caso que
las decenas sean cero, su display se apagara.

CONST DISPLAY[lO] = IOx3f,Ox06,OxSb,Ox4f,Ox66,Ox6d,Ox7d,Ox07,Ox7f,Ox6fl permi­


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

Figura 9. Los 7 segmentos de. dispray

64
3. La gestio" de los puertos

3.3 Entradas y sa.idas


3.3.1 LCD
Se acosturnbran ha utilizar LCD del tipo HD44780, con un nurnero de Iineas varia­
ble y un numero de caracteres por linea tambien variable (por ejemplo, con 2 x 16
se trabaja con dos lineas de 16 caracteres cada una) (ver figura ]0).

• C) lCDconar,v
1.·Vss ("'''SOl)
n I

2.- Vee(Alimentlldon de 2.7V a 5.SV)


3.- Ajuste de c:ontraste (de 0 .. 5.SY)
4' RS(scl~trlonde ~g,stro)
5.- R/W (klduraJescrtturll)
6.· £ (enable)
7.- 00 (dam LSB)
H
8.-01
9.· 02 ~,:
10.·03
U.-O"
12.- OS
13.- 06
14,- 07 (dato "'58)
Ii
ii:
i ',[
I
~.~

t,~:
• • ,_, =-,
Figura 10. EI patlllaJe de un LCDtlplco

EI bus de datos es de 8 bits, aunqu.e tambien existe la posibilidad de trabajar con 4


bits (con un menor nurnero de caracteres). El compilador C induye un fichero (dri­
ver) que permite trabajar con un LCD. El archive es LCD.C y debe Ilamarse como un
#ine/tlde. Este archive dispone de varias funciones ya definidas:

lcd_init 0;
Es la primera funci6n que debe ser llamada.
Borra el LCD y 10 configura en el formato de 4 bits, con dos lineas Y con caracteres
de 5 x 8 puntos, en modo encendido, cursor apagado y sin parpadeo.

Configura eJ LCD con un autoincremento del puntero de direcciones y sin despla­


zamiento del display real.

lcd_gotoxy (byte x , byte y)i


Indica la posicion de acceso al LCD. POl' ejemplo, (1,1) indica la primera posicion de
la primera linea y (1,2) indica la primera posicion de la segunda linea.

lcdgetc (byte x , byte Y)i


Lee el caracter de la posicion (x.y).

65
Compilador C CCS Y Simulador PROTEUS para Microcontroladores PIC

lcd_pute (char s);


S es una variable de tipo char. Esta funcion escribe la variable en la posicion corres­
pondiente. Si, ademas, se indica:

\£ se Jimpia el LCD.
\n el cursor va a 1a posicion (1,2).
\b el cursor retrocede una posicion.
El compilador de C ofrece una funcion mas versa til para trabajar con el LCD:

printf (string)

printf (cstring, values ...)

printf (fname, cstring, values ...)


String es una cadena 0 un array de caracteres, values es una lista de variables sepa­
radas por comas yfiW/1I(! es una funcion,

El formate es %nt, donde n es opcional y puede ser:


1-9: para especificar cuantos caracteres se deben especificar.
01-09: para indicar Ia cantidad de ceros ala izquierda.
1.1-9.9 para coma £lotante.
t puede Indicar:

c Caracter.
s Cadena 0 caracter.
u Entero sin signo.
d Entero con signo.
Lu Entero largo sin signo.
Ld Entero largo con signo.
x Entero Hexadecimal (minusculas).
X Entero Hexadecimal (mayusculas).
Lx Entero largo Hexadecimal (mimisculas).
LX Entero largo Hexadecimal (mayusculas).
f Flotante con truncado.
g Flotante con redondeo.
e Flotante en forma to exponencial.
w Entero sin signo con decimales insertados. La Iii ci.£raindica el total,
la 2~el rnrmero de decimates.

66
3. La gestio" de los puertos
---------------------------------------------
A continuacicn, mostramos unos ejemplos de los distintos formatos:

Formato Valor = Oxl2 VaJor = OxFE


%03u 018 254
%u 18 254
o/\l2u 18
"
%5 18 254
%d 18 -2
%x 12 fe
%X 12 FE
%4X 0012 OOFE
%3.1w 1.8 25.4
Ahora, mostramos una serie de ejempLos de aplicaci6n:
by;;e x,y, z;
prlncf("B.oLa") ;
printf (\\Valor=>%2x\n \r" ,gec_rcce ());
princE ("~2!J iX i4X\n ~r", x,y, z t :
_orinr:f(LCD_PUTC, "n=61)" .ni ,

Eldriver LCD.C esta pensado para trabajar con eJ PORTD 0 eJ PORTB. Por defecto,
utiliza eJ PORTD a menos que le indiquemos 10 contrario mediante:
#defineuse_portb_lcd lRUE, secomentao descomentatalcomo se.ind:icaen la figurall.
Por defecto, este driver usa siete terminales para La comunicaci6n entre el LCD Yel
PTC. En 1a figura 11se observa parte del fichero LCD.C donde se encuentran defini­
das las conexiones u tilizadas y la posibilidad de cambiar de puerto.
/1 As defined in xtie following sr:ructure the pin connection is as follows:
II DO enable
// Dl rs
// D2 rw
// D4 1)4

// D5 D5
II D5 05
/1 D7 D7
II
/1 LCD pins DO-D3 are noc used and PIC D3 is noC used.
// Un-comment the following define to use port B
II #deii.De use _portb_led TRUE

Figura 1,. Extracto de' flchero LCD.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 6gura 12 se muestra parte del fichero LCD.C donde se definen los
puertos de trabajo (el 0 0 el B);modificando estas sentencias se puede trabajar con
otro puerto (A, C, etc.).
#if defined USE_porch_led
Jllocate led ~ getenv("sfr:PORTB") // This puts che entire structure over
II che port
'define ser:_ tris_led (x) set_cIJ;s_b (x)
#else
#loci1te led = get:env("srr:PORTD") II This puts the ent ire structure over
II the port
#deflne ser_tris_lcd(xJ set_tris_d(xJ
#endif
Figura 12. Extracto del fichero LCD.C

Ejemplo 3: Realizer un menu de control mediante unpulsador. EI program a debe


mostrar un menu de 3 funciones. Mediante el pulsador se debe seleccionar uno de
los 3 elementos y con otro ejecutar la funcion (en este caso encender un letI). Dispo­
nemos de los componentes ISIS: PIC16F876, RES, BUTTONy LM016L.

R2
.i:«

Figura 13. Ef esquema del ejemplo 3

68
3. La gestion de los puertos

ijnclud~ <16F876.h>
Ifuses XT,NOII'IJT
luse del~Ylclock- 4000000)
Ijnclud~ <lcrl.c>
luse standard_lotC)
luse standard_loIA)

enum funclones (med,cBl,lni]; II Asigna un valor a cada elemen:o


II mcd - 0, cal - 1 e in! - 2

void medlrlvold){ II Funcion de medlr


Ilalgodcmo corcE'spondlence
oucpuc_!:ogqle (pln_CO);

voia calibl:ar(void) ( IIFuncion de callbra1


Ilalgoritmo corrospondiante
output_~ogQ'le(PlIJ_Cl);
J

~ld inlclalizBt (void){ II FUncion de !nlclallzar


Ilalgoricmo corr~spondfente
oucpuc_coggletp!n_C2J;

d run_func(int numfunc){ II As!gnacion de la funci6n a reallzar


/1 viene dada par la vanable "item-
(num[uncJ
Sl>'lcch
case med:
medi r t ) ;
bH!lJk;
case cal:
c,11ibral'
();
bn'alc;
case ini:
l n t c i e t izaL ();

1M1n I) (
r Item: II variables de funclones

69
Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC

char n_menus - 3; /1 Numero de funciones

1/ bit_setITRISA,O);
lcd_lnit ();

while (1) (
if (input(PIN_AO) 1) ( II Detecca boton de selecc~6n
J.cemr+; II s1 pulsa aumenca la variable
de1ay_ms (300); /1 Para evr taz- rebotes
lcd_pucc ('\f' I:

if (ieem > (n_menus-1)) /1 Si la variable supers e1 numero de ...


item - 0: J II funciones la J.nJ.cializa

stdtch (i tern)

case 0:
lcd_gotoxy(l,l);
printf(lcd_purc, "MEDIR H):

1cd_goroxy/l,l};
break;

case 1:
printf Ilcd_putc, "CALIBRARH);
lcd_gotoxy/l,l);
break:

case 2:
printf(lcd_putc, "INICIALIZARH);
lcd_gocoxy(l,l);
break:

if (input(PIN_Al) 1) II S1 se pulsa e1 baton de seleccion ...


(delaY_1I1s(200);
run_func (i tern);) II se llama a 18 funci6n correspondienee

Figura 14. EIprograma del eJemp'o 3

3.3.2 LCD graflco


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

70
_._
3. La gesti6n de los puertos

Figura 15. LCD graflco con controladora KSO108

La distribuci6n de patillas es Ia siguiente:


VSS: masa.
VOO: alimentaciOn.
Vo: tension de contraste.
D(I: entrada de datos/entrada de c6digos de instruction.
RlW: Iectura/escritura.
E: enable.
DBO..DB7: datos de entrada.
CSl..CS2: chip select.
RST:reset
EJ compilador Csuministra varios drivers para este tipo de LCD gnificos, el GLCD.C,
GRAPHICS.C 0, el mas especifico, HDM64GS12.C.

La conexion definida en estos ficheros es la siguiente:

II II II II II II II II II 11/1/1111111//111
111/1111
I111111/1111111111111/11111/1111111111111/11
IIII IIII
II/I LCD Pin eonnections: 1/11
IIII (These C(l11 be dumged as needed in thefollowil1g defines). IIII
/11/ VSS is connected to GND 1III
1111 VDD is connected to +5V IIII
///1 va - LCD opemtiflg voltage (Canstrast adjustment> Ifff
/111DIT- Data or Instruction is connected to B2 I1I1
//11 R/W - Read or Write is connected to B4c 111/
1//1 Enable is connected to B5 IIII
IIII Data Bus 0 to 7 is connected to port d IIII

71
Compilador C CCS Y Simulador PROTEUS para Microcontroladores PIC

//// Chip Select 1is connected fa 80 If//


Ilf/ Chip Select 2 is connected to 81 III/
1/11Reset is connected to CO IIII
//1/ Negative voltage is also connected to the 20k Ohm POT ////
/1// Positive voltngefor LED backlight is connected to +5V f/I/
//// Negnvtive volfagefor LED backlight is connected to GNDI///
W W
1///////////////////////////////////////////////////////////////////////////////////
Las funciones definidas son:
gcd_iill t(mode)
Debe ser la primera fund6n en invocarse. Enciende el LCD.
glcd_pixel(x,y,color)
Establece el color del pixel. Puede activarse 0 desactivarse.
glcd_filIScreen(color)
Rellena at LCD de un color determinado. Puede activarse 0 desactivarse.

glcd_updateO
Escribe en la RAM del LCD; s610 es posible si esta definido FAST_GLCD.

glcd_line(x1, y1, x2, y2, color)


Dibuja una linea desde el primer punto al segundo asignando color, el cual, a su
vel, puede activarse 0 desactivarse.

g1cd_rect(x1, yt, x2, yz, 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 0 no.
glcd_bar(xl, yl, x2, y2, width, color)
Dibuja una barra des de el primer punto aJ segundo; se puede definir el numero del
rango de pixeles y puede activarse el color 0 no.
glcd_circle(x, y, radius, fill, color)
Dibuja un circulo con centro en (x, y) y con el radio especificado; puede rellenarse
o no y puede activarse eJ color 0 no.
gJcd_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 tarnafio y puede activarse el color 0 no. Esta funci6n envia .105caracteres
a la linea siguiente (se debe usar #define GLCD_WIDTH para definir el ancho de
visualizacion).

72
3. La gestion de los puertos

Ejemplo 4: Visualizar en un LCD el estado de las entradas del PUERTOA (ver figu­
ra 16). Disponemos de los compone.ntes ISIS: PIC16F877, RESPACKB, LGM12641-
BSIR Y SW-SPST-MOM.

PUERTO A

AO
ts.
AI
.,

Figura 16. EI esquema de. eJemp.o 4

#include <16F877.h>
#fuses HS, NOWD'1',NOPROTECT, NOLVP
luse delay(clock·20000000)
/linclude <HDM64GS12.c>
#:J.nclude <graphics. c>
'use standard_io (a)

void main ()
CHAR AS [ J -"AS";
CHAR A4 ( J-"A4";
CHAR A3 ( le A3";
ll

CHAR A2[ J -"A2";


CHAR Al [ 1~"Al" ;
CHAR AO[ 1 "AO";
CHAR IN[ 1-"PUERTO A";
glcd_lniCrON);
t;J.1
cd_textS? (33, 3D, AS, 1, 1) ;
glcd text57 (49, 30,M, 1, 1) ;
glcd_ textS7 (65, 30,A3, 1, 1) ;

glcd_textS7 (81, 30,A2, 1, 1) ;

73
Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC

glcd_cext57 (97, 30,AI, 1, 1);


glcd_cext57(113, 3~,AO, 1, ~};
glcd_cext57(30,5,TN, 2, 1);

while (1)I
if (input_scate(PtN_A5)--OJ
glcd cecc(J2,40,46,60,1,1);
else
glcd_rect(J2,40,46,60,1,O};
glcd_cect(32,40,46,60,O,1};

i= (input_state(PIN_A4}~;0)
glcd_cect(48,40,62,60,1,1};
else
glcd recc(48,40,62,50,1,0);
glcd_rect(48,40,62,bO,O,1);

if (input_state(PI~_A3)-=0)
glcd_cecc (54,40,78,50,1,1);
else
glcd_cecc(64,40,78,60,1,0};
glcd_recc(64,40,78,60,0,1);

if (input_state(PIN_A2)~O)
glcd_rect(SO,40,94,60,1,lJ;
else
glcd_cect (80,40,94,60,1,0),.
glcd_rect(80,40,94,50,0,1);

if (input_staCe(PIN_Al}a;O)
glcd_recc(96,~O,110,60,2,1);
else
glcd_recc(96,i~,••G,60,l,0);
glcd_rect(96,40,110,60,O,1);

if (inpu c_sCc'u:e (PTN_AO)=0)


.glcd_rect(112, 40,126,60,1,1);
else
glcd_cecc(112,40,126,60,1,O);
glca_cect(112,40,126,60,O,I);
delay_ms(400):
}

Figura' 7. EI programa conespondiente al ejemplo 4

74
3. La ges1i6n de los puertos

3.3.3 Teclado (keypad 3x4J


Las entradas a traves de un pulsador son muy habituales en los sistemas con micro­
control adores para trabajar con una mayor informacion 0 informacion alfanumerica.
Por ejemplo, se utilizan los teclados matriciales de lx4, 3x4 0 4x4 (ver Figura 18).

Figura 18. Dlferentes tlpos de tedados matrlciales


El cornpilador de C incluye el driver KBD.C para manejar el teclado (3x4). Las fun­
clones que incorporan son las siguientes:

kbd_initO
lnicializa el sistema, debe ser la primera funci6n en el programa.

kbd_getcO
Devuelve el valor de la tecla pulsada en funci6n de la tabla que tiene programada
(ver figura 19).

liP 0 ! J •
char const KEYS[4][3] a {{'1','2','3'}.
{'4' ,'5' ,'6'}.
{'7','8','9'},
{'*','O','U'}};

f1gura 19. La deflnlcl6n de teclas en el archlvo KBD.C


A traves de la modificaci6n de esta tabla podemos adecuar el resultado del progra­
rna a las dislintas caratulas del teclado.

EI archive KBD.C esta pensado para trabajar con el PORTB 0 eJ PORTD (ver Figura
20). Activando 0 no la linea #define Ilse_portb_lcd TRUE podemos seleccionar el
PORTB (ver figura 21).

75
Compilador C CCS Y Simulador PROTEUS para Microcontroladores PIC

Hlr deFrn ~~portb_kbd


rtbl,llkbd - 6 \ I '111 t 0 Iart n (I
lIeIs!!
1\ kbd - 8
IIhl)t I on I I I' 0 (I
tentJi f
"Nldif

IIlf defined use_portb_kbd ~


set_tris_kbd(,.,rset_triS_b(X)<, )
lilli' inp
1I1'1s£
Pdefinl set tris kbd(\l set tris d(x)
lendlf _ - --

Figura 20. La conflguracl6n de puertos

Figura 21. La seleccl6n del PORTS

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

~h1I'till'COLO (1 « 5)
tltlefio~COl1 (1 « 6)
1IdeFtn,. COl2 (1 « 7)
111ft·fin ROWO (1 « 1) [)
lIdHim RO~/1 (1 « 2)
'IIIefin ROll2 (1 « 3)
IIdel i 111' ROlla (1 « 4)

r· :

CO Cli C21
~ ... ~
RO rj,
A
1 2 3
Rl

,e
8 4 5 6
flaOlIN'! ~ 22 R2 rl
RB.
R82
..
71 7 8 9
:~
_oc Hf-
RtI3IPQM
R84
RIle
26
:HI R3
0* 0 # ~\'
RS7iPGD r-1L
.~ ... T<'d",",~'"~f

Figura 22. La aslgnacl6n de patlllas

76
3. La gestion de los puertos

Se puede trabajar con el LCD y el teclado a traves de puertos separados 0 compar­


tiendo el mismo puerto (con ej ahorro de patillas que conlleva) (ver figuras 23 yM).
Compartir puerto suele eonllevar problemas si se quiere trabajar con el teclado y
las interrupciones RB4IRB7.

Figura 23. Ef 1.CDYel tecJado en puertos distintos

.......
LCD2

I Listo•.• I
'1
-
., 1
I
2
I
-
3
58,90.
~~~ ~~~ B5ssa&Sa
. .
~;
1T1-1-'" •
~j
I~U1 • 4 5 6
t r-
~rciJG'4
= .,
-l < 7 8 9 ~

--I
~~
_oHJN_ ~~- 1
~1
$ AAIlMIIC
""11M'
,.
>7 0* 0 #
:t ~

~~
P..!-npt;b

fICIQIl1Q5O't,q;'
""un"""""'"

"",_
.. g
..",.,":
"""st'OStI<
"" ...,
.,.".,..".
Rt:1l~Ut!Gr
~~
M
~~
Figura 24. Ef 1.CDYel tedado compartiendo los mismos puertos

Ejemplo 5: Introducir datos par el teclado Y visualizarlos en el LCD. Cuando se


pulsa la tecla 1/*" borrar e1LCD (ver figura 24). Se dispone de los siguientes compo­
nentes ISIS: P[C18F876,LM016L Y KEYPAD-PHONE.
#include <16FB76.h>
Ifuses XT,NOWDT,NOPROTECT,NOLVP
/use delay(clock= 4000000)
#include <lcd.c>
#incLude <kbd.c>

77
Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC

void main ()
char k;
int: x;
lcd_lnH (),.
kbd_lnit();
por.t_b_pullupS(TRUE),.
lcd_putc("\fList;o ... In");

while (TRUE) (
k-kbd_ger::ct) ,.
x-k-48,. II Conversion numerics
if(kJ"O) I
ifrk- 'W')
lcd_putc( '\f');
else
lcd_pucc (k) ; II Imprime caracter
delay_ms (SOO) ;

prinr:f(1cd_putc, "If Car-flc",k),. II Imprime cerecce«


delay_ms (SOO) ;

printf(lcd_putc, "Ie Car- u",k); /1 Imprime valor ASCII


delay_ms (SOO);

princtUcd_puCC, "It Num-tu",x); 1/ Imprime valor numeric"


delay_ms(500) ,.
lcd_putc("\tListo ... In"');

Figura 25. ef programa de. ejempfo 5

Debemos observer que el valor leido en el teclado y el visualizado en el LCD es


un caracter ASCn. Si deseamos convertirlc a su valor numerico correspondiente
deberemos restarle el valor 48 (30 en hexadecimal); esto se debe a que el caracter 0
en ASCrr es 30h, ell es 31h, etc.

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


teclado de 3x4 introducir una clave de 3 dlgitos que cuando sea correcta abra una
puerta (con un pulsu a un rele) y 10 indique en una pantalla de LCD. Guardar la
clave de acceso en la memoria EEPROM (figure 26). Se dispone de los siguientes
componentes ISIS: PIC18F876, KEYPAD-PHONE, RES, 80135, CELL Y RELAY.

78
3. La gestio" de los puertos

LC02
~
I "YIn,. h,1I1

- _" 1
I

2
.I
3 . I
II
',,'

t o. ,- "'"_: :if-
4
7
5
8
6
9 ~
I

1I~~ It:
-
* 0 #
._
-
;;
hl
~""
III
-tr;::::l
Sill ! Rl.l
'n
1
••
BAll
N

r
CFA:RAl)U}lA

f------

Figura 26. EI esquema del ejemplo 6

#;include <16F876.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock- 4000000)
Huse scandard_~o(a)

# inc:1IJdl'!<led. c>
#include <kbd.c>
#include <stdlib.h>
!lrom Ox2100-( '7',' 2',' 3'} II Posicion 0,1 y 2 de la Eepromcon los dezos.:
II 1,2, Y 3 respectivamente
void main ()
char k;
inc i :
char daca{3}, clave(3]; II Matrices pari! que sde» c ieve y datos
lcd_in.i.t; ();
kbd_inJ.t ();
port_b_pullups(TRUE);
while (TRUE) {
II posicion de la matriz
pnntf (lcd_pucc, "\ fpuls,u tecla 1In"); I I Para primer data
1~.Iple(1<-2)( II Para eres datos
k-kbd_getc{); II Lee el teclado

79
Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC

if (k!=O) 1/ 5i se ha pulsado alguna reela


{data l i i=k : II se guarda en la posici6n correspondienre
i-'-+; // de la macriz
pri"Ci'(lcd_putc,"lfpulsar teela ulnH,iH);, II Siguiente dato

for (i=O;i<=2;~++) II Pasa datos de eeprom a la matriz clave


clave[ij=read_eeprom(i);}
if ((data [OJ=clave (OJ) E.S (data Li.l =claveLLl) && (data (2j=clave(21))
( printf(lcd_putc, "lfPueIt:a Abierca"); II Camparalos datos y !a clave
output_high (PIN_AD); /1 5i es 190al da pu.Ieo a1 rele
delay_ tas (500) ;
oucput_low(PIN_AO);}
else printl (lcd_putc, H\ fPuerca Cerrada"); I Clave erronea
delay_InS (LOOO);
}

Figura 27,' Programa del Ejemplo 6

Ejemplo 7: Introducir los datos, a craves de un teclado, de velocidad de un mo­


tor y generar una serial modulada en ancho de pulso proporcional al dato de la
velocidad (ligura 28). Se dispone de los siguientes componentes ISIS: PIC18F876,
KEYPAD-PHONE, RES, 2SKl058, CELL Y MOTOR.

Figura 28. El e.squemadel ejemplo 7

80
3. La gesti6n de los puertos

Se genera una sefial modulada en ancho de pulse PWM (sin utilizar el modulo
CCP de los PiC) donde el sernlperiodo de sefial a nivel alto esta fijado por el valor
introducido en cl reclado. Para elJo, se uriliza lin registro de 8 bits para fijar el semi­
periodo a nivel alto (PWMH) y el semiperiodo a nivel bajo (PWML) (ver la Figura
29). Como el valor maximo del registro es 255, este debe coincidir con el valor
maximo del teclado, es decir 9; por 10 tanto, la relacion entre el valor del teclado y
el semiperiodo PWMH sera:

PWMH= (255/9) x Tecla, aproximadamente PWMH=28ItTecla.

J PWML J
255
~

Figura 29. La modulacl6n PWM

Segun dicha ecuaci6n cuando el valor de teclado sea 0 la salida sera 0 de forma
conti nus y el motor esta ra parade. Cuando el valor de teclado sea 9, el semiperiodo
PWMH sera de 252 (no llega a 255) y el motor estara casi a toda marcha. EI semipe­
riodo a nivel bajo PWML se obticne de restar el PWMH a 255.
Hinclude <16f876.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
RUSE DELAY (CLOCK-4000000)
IINCLUDE <kbd.c>
IUSE STANDARD_IO (a)

VOID MAIN()
I
CHAR X,kant '0'; / k valor de eeclado, k valor anterior de teclado
ch~r PWMH·O,PWML 0; II Semiperiodo alto y bajo
kbd_in,it();
PORT_B_PULLUPS(TRUE);

WHILE (1) { 1/ Bucle in/mito (siempre consulta el teclado)


kekbd_getc ().. '/ Lee en ASCII el valor de la tecla pulsada
if (ke·'\O') k-kant: II S1 no se pulsa cecla (10) se usa
1/ e.L valor ancecJ.or
II Si se pulsa • 0 # se asiqna
// un valor cera.

81
Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC

kant-Jc; II Sa guarda tecla pulsada


k-k-48; /1 Se convierce de ASCII a valor numer.lCO
PWMH-k'28; II Proporci6n encre valor tecla.}' semiperiodo Alto.
PWML-2S5-PWMH; II Semiper.lodo Bajo
for (PWMH;PWMH>D;PWMH--)( /1 Obcenci6n de la salida a nivel a1eo
OUTPUT_HIGH{PIN_ADJ;}
[o.r(PWML;PWML>O:PWML--)( II Obtencion de la salida a nlvel ba]o
OUTPUT_LOW(PIN AD);}

FIgura 30. EI programa del ejemplo 7

FIgura 31. La senal obtenlda para el valor 9

82
4. Las interrupciones y los temporizadores

Capitulo 4

Las interrupciones y
los temporizadores
4. 1 Introduccion
Las intcrrupciones permiten a cualquier suceso interior 0 exterior interrumpir la
ejecuclon del programa principal en cualquier memento. En el memento de pro­
ducirse la interrupcion, el PTC ejecuta un salto a ]a rutina de atencion a la interrup­
cion, previamentc definida por el programador, donde se atendera a la demanda
de la interrupcion. Cuando se termina de ejecutar dicha rurina, el PIC retorna a la
ejecuci6n del program a principal en la misma posicion de la memoria de prograrna
donde se produ]o la interrupci6n.
EI rnane]o de interrupciones permite realizar program as que no tienen que estar
continuamente consultando sucesos internes 0 externos mediante tecnicas de con­
sulta 0 polling, las cuales provocan retardos 0 paradas en la ejecucion del programa
principa1.
Los TIMER 0 Lemporizadores son m6dulos integrados en el PIC que pennite reali­
zar cuentas tanto de eventos internes como extemos. Cuando la cuenta es interna
se habla de temporizacion y cuando la cuenta es extema se habla de contador. Los
tinters estan intimamenle ligados al usa de las interrupciones, pero no por ella se
utilizan siempre de forma conjunta.

4.2 Interrupciones
AI producirse una interrupcion, el PIC salta automaticamente a la direcci6n del
vector de interrupcion de la memoria de prograrna y ejecuta Ja porcion de progra­
rna, correspondiente ala atenci6n de la interrupcion, hasta enconrrar Ja instruccion
RETFIE. Al encontrar dicha instruccion, abandons la interrupci6n y retorna a la

83
Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC

posicion de memoria del prograrna principal desde la que salto al producirse la


interrupcion.

Las fuentes de interrupcion depcnden del PTCutilizado, Por ejemplo, el PIC16F84


tiene 4 Fuentes de interrupcion y la familia PIC16F87X tiene entre 13 y 14.

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

PC<12'O>
CAl.I..IIETURN t H
RETF1E.RETl.W+_

Hlvel1 de la Plla
ti
13
Hlvel 2 do la Plla

............................ - V

Nlvel 8 de 18 Pile
It

Iik
Vector d. Reset OOOOh

..................... ,........ +0-


--
Vector do Interrupclon 0004h

Pegin.O
0OO5h

07FFh
il
0800h ::!
Paglna 1
OFFFh
1000h
Pagln! 2
17FFh
1--
1FFFh
Pa(Jlna 3
f)
Figura 1. Memoriade programa ,posicion del vector de interrupcl6nJ
Al poseer un unico vector de interrupcion (dos en la gama alta), el PIC posee unos
registros de control donde mediante la utilization de banderas, 0 flags, el usuario
puede deterrninar que es 10 que ha producido la interrupcion: ademas, en estos
registros, se pueden habilitar 0 no las distintas fuentes de interrupcion (mascaras
de Interrupcion) e, inc1uso, permite una habilitaci6n general.
Cuando Ia habilitacion general esra activa y algunes, 0 todas, Ia particulares tam­
bien 10 estan, los flags se activan en el caso de producirse algunas de las interrup­
clones, de tal manera que el programador puede, mediante el testeo de dichos flags,
actuar de la forma mas adecuada.

84
4. Las interrupciones y los temporizadores

La familia PIC16F87X tiene hasta 14 fuentes de interrupcion. Posee un registro de


control, TNTCON (figura 2), que permite la habilitacion de interrupdones y el mancjo
de losflags. La habllitacion general se activa mediante e1 bit GIE (lNTCON<7», el cual
es desactivado en el reset; por 10 tanto, hay que habilitarlo por programa. Existen 4
registros adicionales para Ia gesnon de las interrupciones: PIR1, PIR2, PIEl YPIE2.

Cuando se responde a una interrupcion, el bit Glf es inhabilltado para evitar inte­
rrupciones sucesivas. La direccion de retorno del program a principal se almacena
en la pila y el contador de programa se carga can Ia direccion 0004h. Una vez en la
rutina de atenci6n a la interrupcion se puede deterrninar la fuente de la interrup­
cion mediante el testeo de los difcrentes flags. Los flags activos deben ser "borrados"
antes de abandoner la rutina de interrupci6n para cvitar reentradas err6neas.

Registro ITCON Idlreccion RAM: OBh/8Bh/1 OBh/18Bh, [PIC16F87x]

RIW·O RIW..o RIW·O R/w·O RIW·O RIW-O RIW..o RIW-x


GIE 'I PEIE I TOlE IINTE I RBIE I TOIF IINTF I RBIF
Blt7 BltO I i1
~,
Figura 2. Reglstro INTCON

bit 7: GlE: Bit de habilitacion global de las interrupciones.


1 = Habilita todas las interrupciones no enmascararbles.
0'" Las deshabilita.
bil6: PElE: Bit de habilitacion de las interrupciones de perifericos.
1 = Habilita todas las interrupciones no enmascarables de
perifericos.
0= Las deshabilita.
bit 5: TOlE: Bit de habilitaci6n de la interrupcion por desbordamiento del
TMRO:
1 = Habilita la interrupcion del TMRO.
0= La deshabilita.
bit 4: INTE: Bit de habilitacion de la interrupci6n extern a RBO/INT.
1= Habilita la inlerrupci6n del RBO/INT.
0= La deshabilita.
bit 3: RB1E: Bit de habilitaci6n de la interrupci6n por cambio en el PORTB.
1 = Habilita la interrupci6n del PORTB.
0= La deshabilita.

85
Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC

bit 2: TOIF: Bit de jlag de Ja interrupcion del TMRO.


1 = EI registro del TMRO se ha desbordado (debe borrarse
por software).
o = EI registro del TMRO no se ha desbordado.
bit 1: fNTF: Bit de jlng de la interrupci6n del RBOIlNT.
I = Se ha producido una interrupci6n extema por RBOIINT
(debe borrarse por software).
0= No se ha producido la interrupci6n.

bit 0: RBIF: Bit de jlng de la interrupci6n por cambio en PORTB.


1 = Al menos uno de los terminates RB7:RB4 ha cambiado de estado
(debe borrarse por software).
0= No se ha producido cambio en dichas patillas.

Reglstro PIE1 (dlreccfon RAM: 8Ch, [PIC16F87x]

RfW..() RfW·O RfW..() RfW·O RfW·O RfW-O RfW-O RfW..()

! PSPIE lADlE I RCIE I TXIE I SSPIE I CCP11E I TMR21E I TMR11E ~:


Bit7 BitO i:i
,~,,~ 'ci,'

Figura 3. Regbtro PIE'

bit 7: PSPIE: Bit de habilitaci6n de interrupci6n por lectura/escritura del puerto


paralelo esclavo:
1 = Habilita la interrupcion por lectura/escritura del PSP.
0= La deshabilita.
bit 6: ADIE: Bit de habilitacion de interrupci6n por conversion AID.
1 = Habilita la interrupcion.
0= La deshabilita.

bt 5: ReIE: Bit de habilitaci6n de interrupci6n por recepcion del USART.


] = Habilita la interruption.
0= La deshabilita.

bit 4: TXIE: Bit de habilitacion de interrupci6n por transmisi6n del USART.


1 = Habilita 1a interruption.
0= La deshabilita.

86
4. Las Interrupciones y los temporizadores

bit 3: SSPIE: Bit de habilitacion de interrupci6n del puerto sene sincrono.


] ""Habilita la interrupcion.
0==La deshabilita.
bit 2: CCPlIE: Bit de habilitacion de interrupci6n del modulo CCP1.
1 '" Habilita la interrupcicn.
0= La deshabilita.
bit I: TMR2IE: Bit de habilitaci6n de interrupcion por igualacion del
TMR2 y PR2.
1 = Habilita la interrupcion.
0= La deshabilita.
bit 0: TMRl1E: Bit de habilitacion de interrupci6n por desbordamiento del TMRI.
1 = Habilita la interrupci6n.
o- La deshabllita.

Regfstro PfE2 ,dlrecclon RAM: 8Dh, (PIC' 6F87xl


u-o RIW-O u-e RIW-O R]W·O u-e u-o RJW-O

I i. I I ~ r I EEIE I BCLIE I I I CCP21E ,


81t7 61tO
~. -~
FIgura 4. Reglstro PIE2
bit 7: No implementado. Se lee como O.
bit 6: Reservado.
bit 5: No irnplementado. Se lee como O.
bit 4: EEIE: Habilitaci6n de interrupcion por escrirura en EEPROM.
1= HabiJita la interrupcion.
0 .. La deshabilita.
bit 3: BCLIF: Flag de interrupcion por colision en bus
1 ""Colisi6n en el bus SSP 0 12C en modo master.
0= No hay colislon.
bit 2-1: No impJementados. Se leen como O.
bit 0: CCP2JE: Habilitacion de interrupcion del modulo CCP2.
1 = Habilita la interrupcion,
0= La deshabilita

87
Compilador C CCS Y Simulador PROTEUS para Microcontroladores PIC

Los registros PIRl y PIR2 contienen los flngs de las distintas interrupciones, El com­
pilador C se encarga de generar el codigo necesario para leer y borrar dichos flags,
tal y como podremos ver en el siguiente apartado.

4.2.1 Interrupciones en C
En el compilador C la directive habitual en el manejo de las interrupciones es
IIINT_xxxx. Especifica que la funcion que le sigue es una funcion de interruption;
edemas, no necesita mas parametres.
Las posibles directivas son las siguientes (en gris las posibles interrupdones en la
familia PIC16F87X):

In terrup clones Descripci6n


#INT_AD Conversion AD completa.
!tINT_ADOF Conversion AD fuera de rango de tiempo.
~INT_BUSCOL Colision de bus.
#INT_BUTION Par boton (14000).
CINT_CANERR Error en el modulo CAN.
IiINT_CANlRX Mensaje invalido en e1 bus CAN.
#INT_CANRXO Bus CAN redbe un nuevo mensaje en buffer O.
#INT_ CANRXI Bus CAN recibe un nuevo mensaje en buffer 1.
#INT_ CANTXO Bus CAN transmision completa en buffer O.
4INT_ CANDO Bus CAN transmision completa en buffer l.
~INT_CANTX2 Bus CAN transmision completa en buffer 2.
#INT _CANWAKE Bus CAN even to de activacion 0 uiake-up.
i1INT_CCPl Unidad 1 de captura, comparacion y PWM.
IiINT_CCP2 Unidad 2 de captura, comparacion y PWM.
#INT_CCP3 Unidad 3 de captura, comparacion y PWM.
UNT_CCP4 Unidad 4 de captura, comparacion y PvVM.
#INT_CCP5 Unidad 5 de capture, comparacion y PWM.
#INT_COMP Comparador.
IIINT_COMP! Comparador 1.

88
4. las Interrupciones y los temporizadores

Interrupciones Descripcion
!TINT_COMP2 Comparador 2.
/tINT_CR Encriptacion finalizada.
IIrNT_EEPROM Escritura EEPROM finalizada.
flINT_EXT Interrupcion extema (RBO).
/lINT_EXTl Interrupcion extema ttl.
ttlNT_EXT2 Interrupci6n externa #2.
ttINT_EXT3 Interrupcion externa 113.
#INT_I2C Interrupcion 12C (14000).
#lNT_ICl Entrada capture ttl.
'---
ItINT_IC2 Entrada captura 112.
ttINT_IC3 Entrada captura #3.
#INT LCD Actividad LCD
RINT_LOWVOLT Detectado bajo voltaje.
ItINT_LVD Detectado bajo voltaje.
#lNT_OSC_FAIL Fallo en oscilador.
!tINT OSCF Fallo en oscilador.
dINT_PSP Dato de entrada en puerto paralelo.
#INT_PWMTB Base de tiempo PWM.
!tINT .RA Cambio de estado en AO-AS.
ilTNT_RB Cambio de estado en B4-B7.
f1INT_RC Cambio de estado en C4-C7.
tiINT_RDA RS232 dato recibido.
/tINT_ROAO RS232 dato recibido en bllffer O.
#INT_RDAI RS232 dato recibido en buffer 1.
IIINT_ROA2 RS232 dato recibido en bllffer 2.
ItINT_RTCC Desbordamiento del Timer 0 (RTCC).
ilINT_PSP Escrltura/lectura del puerto paralelo.

89
4. Las interrupciones y los temporizadores

Interrupcioncs Descripcion
,ltINT_COMP2 Comparador 2.
~INT_CR Encriptacion finalizada.
#INT_EEPROM Escritura EEPROM finalizada.
dINT_EXT Interrupcion externa (RBG).
#INT_EXTI lnterrupcion extema #1.
IiINT_EXT2 Interrupcion externa .Ii2.
#INT_EXT3 Interrupcion externa 1t3.
#fNT_I2C Interrupcion 12C (1':1000).
!lINT_ICI Entrada captura 111.
#lNT_IC2 Entrada caplura #2.
~INT_IC3 Entrada captura #3.
I1INT_LCD Actividad LCD
#INT_lOWVOLT Detectado bajo voltaje.
#INT_LVD Detectado bajo voltaje.
IHNT_OSC_FAIl Fallo en oscilador.
I1INT_OSCF Fallo en oscilador.
#INT_PSP Dato de entrada en puerto paralclo.
ItrNT_PWMTB Base de tiernpo PWM.
ttlNT_RA Cambio de estado en AO-AS.
ltINT_RB Cambio de estado en B4-l37.
#lNT_RC Cambio de estado en C4-C7.
#INT_RDA RS232 dato rccibido.
#lNT_RDAO RS232 dato recibido en lll~ffi.'rO.
ItINT_RDAl RS232 dato recibido en buffer 1.
#INT_RDA2 RS232 dato recibido en bllffer 2.
#INT_RTCC Desbordarniento del Timer 0 (RTCC).
#INT_PSP Escritura/lectura del puerto paralelo,

89
Compilador C CCS y Simulador PROTEUSpara Mlcrocontroladores PIC

Interrupdones Descripci6n
ItlNT_SSP Actividad en SP! 0 12C.

itINT_SSP2 Actividad en SPIo 12C Port 2.


#INT_TBE RS232 ouffer de transmision vacio.
# INT_TB EO RS232 btiffer 0 de transmision vacio.
#INT_TBEl RS232 buffer 1 de transmision vacio.
#INT_TBE2 RS232 bliffel' 2 de transmision vado.
IIINT_ TIMERO Desbordamiento del Timer 0 (RTCC).
ItlNT_ TIMER1 Desbordamiento del Timer 1.
ftINT_ TIMER2 Desbordamiento del Timer 2.
#INT_ TIMER3 Desbordamiento del Timer 3.
#INT_TlMER4 Desbordamiento del Timer 4.
#INT_TIMERS Desbordamiento del Timer 5.
#INT_USB Actividad en el USB.

Existe una directive #INT_DEFAULT que irnplica que se utilizara Ia funcion que Je
acornparia si se activa una interrupcion y ninguno de losflrrgs esta activo.
La directiva #INT_GLOBAL implica que la fundon sustituye todas las acetones que
inserts el compilador al aceptarse una interrupcion. Se ejecuta solamente 10escrito en
dicha funcion, No se sue Ie utilizar y si se hace debe hacerse con mucho cuidado.

Si se utilizan las directivas de interrupcion, el compilador genera el codigo nece­


sario para ejecutar la funci6n que sigue a la directive. Ademas genel'a el c6digo
riecesario para guardar al principio y restituir al final el contexto; tambien borrara
el flng activo por la interrupcion.

E1compilador C induye funciones para el mejor manejo de las directives de 'inte­


rrupd6n:
enable_interrupts (nivel),
nioel es una constante definida en un fichero de cabecera (16F87X.h -figura 5-) y
genera el codigo necesario para activar las mascaras correspondientes, afectando a
los registros ITeON, PIEI y PIE2.
En el PICl6F876, los "niveles" permitidos son:

90
4. Las interrupciones y los temporizadores

enable_interrupts
ITCON(OBh) PIE1(8Ch) PlE2(8Dh)
(nivel);

GLOBAL
11000000
COh
INT_RTCC
00100000
INT_TIMERO 20h

00010000
INT_EXT
10h

INT_RB
00001000
OSh

INT_AD
01000000
40h

INT_RDA
00100000
20h
00010000
INT_TBE
10h
00001000
INT_SSP
08h
00000100
INT_CCPl
04h
00000010
INT_TIMER2
OTh
00000001
INT_TlMERl
cu.
00010000
INT_EEPROM 10h
00001000
JNT_BUSCOL
08h

INT_CCP2
00000100
04h

GLOBAL equivale a GIE = PElE = 1 Y debe activarse de forma lndependiente. El


resto activaran la mascara correspodiente.

disable_interrupts (nivel);
Realiza Lafuncion contraria a Laanterior, mhabilita las mascaras dela mterrupcion
correspondiente.

91
Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC

L_TO.H
H_TO_L

I etU\C INT_TBt
INT_ItllA
INT_TUIERl
INT TIltER2
,. lNT:::CCPl
lNT_CCPZ
INT SSP
Mo:I~h. INT:::PSP

Figura 5. Parte del flchero Include 16F87x.h

4.2.1.1 'nterrupclon exterIor por RBO


Es una interrupcion basics, corruin a 1a mayoria de los PTe. Permite generar una in­
terrupcion tras eJ cambio de nivel de alto a bajo 0 de bajo a alto en la entrada RBO.

La directive utilizada es #JNT_EXT y se debe acompsfiar de las siguicnres funcio


nes (afectan al bit 6 del registro OPTION_REG, ver figura 6).
ext_int_edge (H_TO_L);
La Interrupcion es por Ilanco de bajada (active el flag INTF).
ext_int_edge (L_TO_H);
La interrupci6n es por f1ancode subida (activa el flag INTF).

R1W·1 R1W·1 R1W·1 R1W·1 R1W·1 RJW·1 RJW·1 RJW·1


I RBPU IINTEDG I Toes I TOSE IpSA I PS2 I PS1 Ipso
Blt7 BltO ~.
"'A'-~~~~ . ~""-'~
Figura 6. Reglstro OPTION_REG
bit 6: INTEDG: Bit de seleccion del f1anco de interrupcion de RBO.
1 = La interrupci6n es por flanco de subida del pin RBO/fNT.
0= La interrupci6n es por flanco de bajada del pin RBOflNT.

92
4. las interrupciones y los temporizadores

Ejemplo 1: Eticcuder y npagnr, cOlIsecutiVI111I1!11tc, un LED ell In paiilla RB7 cuando sepro­
tiuzca U/I camuio de ulue! ell In patill« RBO(ver figura 7). Compouentes: 1515:PIC16F876,
RES, LED-GREEN 1) SW-SPDT-MOM.

asel/ClKIN RBo/lNT
OSCgJClKOUT RB'
1...---.J....4 MCLRlVpplTHV RB2
RB3fPGM SW-SPDT-MQM
RAO{ANO RB4
Ri\1/AN1
RA2/AN2JVREF·
RBS
RB61PGC

RA31AN3NREF+ RB7/PGO 1-""'-----...,
RA4fTOCKI
RA6IAN4ISS RComosomCKI
RClfT10SUCCP2
RC2ICCPl
01
RC3/SCKISCL LED-GREEN
RC4ISDIISDA
RC5ISOO
RC8ITXICK
R07lRXlDT
PIC16F876

Figura 7. Ejemplo 1
'include <15F876.h>
Ifuses XT,NOWDT,PUT,NOWRT
luse delay(clock- 4000000)
luse fast_io (B)
~ntl cambio-O; II Variable de cambio
lINT EXT II Atenci6n a inten'upcic:in por cambio en RBO
ext_isr() ( II Punci6n de interrupc~6n
output_toggle (pin_B7);

void main () I
sec tris~B{OxOl); II SO como entrada, B7 como salida
outpuc_low{PIN_B7); II Apaga LED
porc_b_pulJupS(TRUE); II Pull-up pe s:« RBO
enable_interrupts (lnt_ext); II Habil~ta inc. RBO...
ext_int_edge(L_TO_H); /1 por flanco de subida
enable_inteaupts (GLOBAL),. II Habilita inc. general
~hile 11) ( II Bucle inJmito de espera

Figura 8. Programa del ejemplo 1

93
Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC

4.3 TIMERO
EI bloque funcional TIMERO/WATCHDOG es un contador (registro) de 8 bits, mere­
mentado por hardware y programable. La cuenta maxima es de 255 (el incremento
es constante e independiente).

• Contador: cuenta los eventos externos (a traves del pin RA4ffOCKl).


• Temporizador: cuenta Los pulsos internes de reloj.
Se puede insertar un prescaler, es decir, un divisor de frecuencia programable que
puede dividir por 2, 4, 8, 16, 32, 64, 128 0 256. La frecuencia de conteo es una cuarta
parte de la frecuencia de reloj (fosc/4). Posteriormente, con el uso del prescaler se
puede dividir la frecuencia,

E1bloque del TIMERO puede fundonar como WATCHDOG, 10que permite que du­
rante el funcionamiento normal del microcontrolador, un desbordamiento (0 time­
out) del Watdldog provo que un reset (Watchdog Timer Reset). Para evitar el desbor­
damiento se debe, cada derto tiempo y antes de que llegue aJ limite, ejecutar una
instruceion CLRWOT que borra el Watchdog y que hace comenzar un nuevo con teo
desde cero. Se basa en un oscilador RC interno, independiente del oscilador del mi­
crocontrolador y que no requiere ningun com ponente extemo. El Watclrdog cuenta in­
cluso si el reloj conectado a OSCl/CLI<I y/o OSC2ICLKO esta parade, por ejemplo,
por la ejecucion de una instruccion SLEEP 0 por un defecto del cristal oscilador.

Los registros implicados en la configuradon del TIMEROIWDT son los siguientes:

• OPTION_REG: configura el"hardware" del TIMERO/WDT.


• lNTCON: permite trabajar con la tnterrupcicn de] TlMERO/WDT.
• TRISA: habilita la patilla RA4.

Reglstro OPTION_REG (direccion RAM: 81h/18th, [PICt6F87x]

,MN -1__ .-MN__.1


__ ,-AAN
__ ._1-._AAN
__ ._1-._AAN .1-"AAN .1__ .-RNV_·_-1
__ r-AAN __ ,~
__ ._1
I RBPU IINTEDGI Toes I rOSE IpSA I PS2 I PS1 Ipso h

Figura 9. Registro OPTION_REG

bit 5: TOeS:Procedencia de las sefiales:


1= RA4ITOCKl.
0= Reloj interne.
bit 4: TOSE:Tipo de flanco en el TOCK1/RA4:
1 = Flanco descendente.
o = Flanco ascendente.

94
4. las interrupciones y los temporizadores

bit 3; PSA; Asignacion del divisor de frecuencias:

l=WDT.

O=TMRO.
bit 2:0: PS2:PS1;PSO:Deterrnina el divisor de frecuencias a actuar segun Ia
siguiente tabla.

Valor Ran,goTMRO RangoWDT


000 1:2 1.1
001 1:4 1:2
010 1:8 1:4
011 1:16 1:8
100 1:32 1:16
101 1:64 1:32
110 1:128 1:64

111 1:256 1:128

El tiempo de desbordamiento del TIMERO se calcula segun 1asiguiente ecuacion:


T = TCM·Prescaler·(256 _ Carga TMRO)

Donde TCM es e1 ciclo maquina quese puede calcular mediante la ecuaci6n:

TCM =4/Fosc

4.3.1 TIMERO en C
La funcion para configurar el TIMERO es:
setup_timer_O (modo);
Donde modo esta definido en el fichero de cabecera (afecta a los bits 5:0 del OP­
TION_REG):

Setup _Timer._O(modo)i OPTION_REG(81h/181h)


00000000
RTCC_INTERNAL ,
OOh

RTCC EXT_L_TO_H
00100000
~ 20h

95
Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC

Setup _Timer_O(modo); OPTION_REG(8lh/18lh)


00110000
RTCC_EXT_H_TO_L
30b
00001000
RTCC_DlV_1
OSh
00000000
RTCC_DN_2
OOh
00000001
RTCC_DIV_4
OIh
00000010
RTCC_DJV_S
02b
00000011
RTCC_DN _16
03h
00000100
RTCC_DIV _32
04h
00000101
RTCC_DJV_64
OSh
00000110
RTCC_DIV_llS
06b

RTCC_DIV_256
00000111
07h

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


setup_eimer_O (R!l'CC_DIV_2 I R'l"CC_EXT_L_TO_H);

La funcion para configurar el WDT es:


setup_wdt (modo);
Donde modo esta def:i:nidoen eJ fichero de cabecera (aiecta a los bits 3:0 del OPTION _
REG):

Setup_wdl(modo); OPTION_REG(8lh/18lh)

00001000
WDT_18MS
08h
00001001
WDT_36MS
09h
00001010
WDT_72MS
OM

96
4. Las interrupciones y los temporizadores

Setup_wdt(modo)i OPTION_REG(81h/181h)

00001011
WDT_144MS
DBh
00001100
WDT_288MS
DCb

WDT_576MS
OOOOllOl
OOh
00001110
WDT_1152MS
OEh
00001111
WDT_2304MS
OFh

Para activar el Watchdog se deben utilizer los bits de configuration mediante la


directive #FUSES:

IffusesWDT Activado.

Jtfuses NOWDT Desactivado.


EI comp:ilador C suministra una serie de funciones para leer 0 escribir en el Tl­
MEROIWDT. Para escribir un valor en el registro :

set_timerO (valor),
valor: entero de 8 bits.
Para leer el valor actual del registro:

valor = get_timeT() Oi
oalar: entero de 8 bits.

Tambien permite realizar la puesta a cero del Watchdog (como CLRWDJ):

restart_wdt 0;
Ejemplo 2: Generar una seiial cuadrada de 1KHz utilizando [a interrupciim del TIMERO
(ver figura 10). Componentes IS[S: PIC16F876 e lnstrumentos ISIS: OSCILLOSCOPE y
COUNTER TIMER.

Para generar una sefial de 1 Khz se necesita un semiperiodo de 500 1-lS. SegUn 1a
ecuacion de desbordamiento del K, utilizando un crista} de 4 MHz Y tID prescaler
de 2:
T= TCM·Prescaler·(256 _ Carga TMRO)

97
Compilador C CCS Y Simulador PROTEUS para Microcontroladores PIC

500 J.1S = (4!4000000)·2·C256-x)


donde x = 6, es decir, se debe cargar el TlMERO con e] valor 6. Pero esta relation
5610 se cum ple si se trabaja en ensamblador. Al trabajar en C, el compilador genera
lfneas de codigo que aumentan e] tiempo de ejecucion de] programa y, por ello, es
necesario ajustar el valor final. En este caso se ha utilizado un valor de carga de 29
(OxlD).

Figura' o. Ejemplo 2
NINCLUDE <16F876.b>
#use delay(clock=4000000)
#fuses XT,NOWDT
fuse standard_io(B)
#int_TIMERO
void TIMERO_isr(void)
ou-cput_togg.le(PIN_BO);
set ~imeIO (OxIS); ) II Se recarge el ciff~rO
void main() (
setup_rimer_O(RTCC_IN~~IRTCC_DIV_2); II Configurdci6n timerO
set_ timerO (OxlE); I I Carge del timerO
enable_interrupts(LNT_~teRO); II Habillta interrupci6n timerO
enable_in-ceLTupcs(global); // HabiljLa interrupc~6n generaL
while (1); II bucle infinico

FI.gura 11. Programa 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 salir de borrar los flags, por 10 que no es necesario hacerlo por programa.
Se puede observar la serial con el osciloscopio digital y activando los cursores en el
menu de Trigger (figura 12) y la rnedida es de 998.76 us.

Figura 12. Osciloscopio digital

4.4 TIMER1 Y TIMER2


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

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


• Ambos registros se pueden leer y escribir,
• Interruption por desbordamiento de FFFFh a OOOOh.
• Reset por clisparo del modulo CCP.
• Controlado por el registro TlCON (ver figura 13). Con el bit TMRION
(TlCON<O» se puede habilitar 0 deshabilitar.

Registro T1 CON (dlreccion RAM: 10h,[PIC16F87x]


bit 7:6: No Impiernentados: Se leen como O.

bit 5:4: TICKPSl:T1CKPSO: Selection del valor del presenter del reloj del TMR1:
11= Prescaler a 1:8.

99
Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC

10= Prescaler a 1:4.


01= Prescaler a J.:2.
00= Prescalcr a l il.

u-e u..o RIW-O R/w·O RIW-O RIW-O R/w·O RIW-O

I Bil7
.~
I
-
IT1CKPS1

-.
I nCKPSO I nOSCEN I T1SYNC I TMR1CS I TMR10N
BltO
t
.",

Figura 13. Reglstro neON

bit 3: T10SCEN: Bit de habilitacion del oscilador del TMR1:

1 = Oscilador habilitado.

0= Oscilador parado.
bit 2: T1SYNC: Sincronizacion de la entrada de reloj extema.

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

0= Sincronizacion de la entrada del reloj externo.

Si TMRJ CS = 0:
Esre bit es ignorado. TMRl uriliza el reloj intarno.
bit 1: TMR1CS: Bit de seleccion de la Fuente de reJoj para el TMRO:

1 = Reloj externo desde eI pin RCOITlOSOIT1CKl (flanco de subida).

0= Reloj interne (F(~/4).


bit 0: TMRION: Bit de habilitaci6n del TMR1:

] = TMRI habilitado.

0= TMRl parado,
EI TLMER1 puede operar en los siguientes modes:

• Como ternporizador.
• Como contador sincrono.
• Como contador asincrono.
El modo de operacion se establece mediante el bit TMR1CS (T1CON<1». En
modo temporizador, el TIMERl se incrementa en cada ciclo de instruccion, En
modo contador se incrementa por flanco de subida de la serial externa. Cuando

100
4. Las interrupciones y los temporizadores

se habilita el oscilador interne del TfMERl mediante el bit TlOSCEN, las patillas
RClrrlOSI y RCO/TlOSOrnCKI se configuran como entradas ignorando el valor
de TRlSC<1:0>. EI TlMCR7 tiene un reset interno que puede ser generado por el
modulo CCP. Las interrupciones deJ TIMERl se controlan a traves de los registros
PIEl y PIRl.
EJ tic 01 po de desbordamiento del TTMER1 se calcula segun la siguiente ecuacion:

T=T(.:M·Prescaler·(65536- Carga TMR1)

Donde Tt'M es e) ciclo maquina que se puede calcular mediante la ecuaci6n:

TeM =4/Fosc

El TlMCR2 es un modulo ternporizador con las siguientes caracteristicas:


• Temporizaci6n de 8 bits (registro TMR2).
• Registro de periodo de 8 bits (PR2).
• Ambos registros se pueden leer 0 escribir.
• Presenter programable por programa (1:1, 1:4, 1:16).
• PO$fcn/crprogra01able pOl'programa (1:1 a ]:16).
• lnterrupcion controlada por PR2.
• El modulo SSP utiliza opcionalmente el TIMER2 para generar una senal de
reloj.
EI TfMER2 tiene un registro de control T2CON (figura 14). El TIMCR2 puede ser
habilitado mediante el bit TMR20N (T2CON<2» para optimizar el consumo de
potencia.

Reglstro T2CON (dlrecclon RAM: 12h)[PIC16F87x]


U·O u-o RJW·O Riw-o RJW-O RJW·O RJW-o RJW.Q
'~ .. :~ TOUTPS3 I TOUTPS2 I TOUTPS1 I TOUTPSO I TMR20N I T2CKPS1 I T2CKPSO III
8117 81t0
~
Figura 14. Reglstro T2CON

bit 7: No implementado: Se lee como O.


bit 6:3: TOUTPS3:TOUTPSO: Seleccion del valor del postscater del TMR2.
0000:: Postscaler a 1:1.
000 1 = Postscaler a 1:2.

101
Compilador C CCS Y Simulador PROTEUS para Microcontroladores PIC
---------- -- ------

1110 = Poslscaler a 1:15.


1111 = Posiscater a 1:16.

bit 2: TMR.20N: 1M de habilitaci6n del TMR2:


1>=TMR2habilitado.
o == TMRl parado.
bit 1:0: T2CKPS1:T2CKPSO: Selecd6n del valor del prescaler del TMR2.
00 = Prescaler a 1:1.
01 = Prescaler a 1:4.
Ix = Prescaler a 1:16.
E1TIMf.R2 se puede emplear como base de tiempos para la modulacion en ancho
de pulso (PWM) mediantela utilizacion del modulo CCP. El TIMERl se puede leer
o escribir y es borrado en el reset. La entrada de reloj (FOSC/4) tiene un prescaler de
1:1. 1:401:16 seleccionado mediante los bits T2CKPSl:T2CKPSO (T2CON<1:0».
La salidase obtiene a craves de un postscaler (de 1:1 a 1:16) que permite generar la
interrupcion cuyo flag se encuentra en TMR2IF, (PIR1<.1». Los contadores de pres­
caler y postscaler son borrados cuando se escribe en el registro TIMER2, cuando se
escribe en el registro T2CON 0 en cualquier reset E1 TIMER2no se berra cuando
se escribe en el T2CON.
El tiempo de desbordamiento del TIMER2 se calcula segUn la siguiente ecuacion:

T = TcM,[Prescaler·(Carga TMR2 + l)·Postscaler]

Donde TCM es el ciclo maquina que se puede calcular mediante la ecuaci6n:

TeM = 4/Fosc

4.4.1 TIMER1 Y TIMER2 en C


La configuradon del modulo TMRI en e] compilador de C se realiza a craves de Ia
funcion:
setup_timeT_l (modo);
Donde modo esta definido en el fichero de cabecera (afecta a los bits 5:0 del registro
TlCON):

Setup_Timer_l(modo); TICON(lOh)

00000000
Tl_DISABLED
DOh

102
4. las interrupciones y los temporizadores

Setup_ Timer_l(modo); TICON(lOh)

Tl_INTERNAL 10000101
85h

Tl_EXTERNAL 10000111
87h

Tl_EXTERNAL_SYNC
10000011
83h

Tl_CLK_OUT
00001000
08h

Tl_DIV _BY_l 00000000


OOh

Tl_DIV _BY_2 00010000


10h

Tl_DIV _BY_4 00100000


20h
00]]0000
TI_DIV _BY_B 30h

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

La lecture y escritura ell el modulo TMJU se realiza a traves de las siguienles fun­
clones:

valor= get_timer1 Oi
set_timer1 (valor);
donde valor es un entero de 16 bits.
La configuradon del modulo TMRl en el compilador de C se realize con la fun­
cion:
setup_timer_2 (modo,periodo,postscaier);

donde:
• periodo es un valor entero de 8 bits (0-255) para el registro PR2;
• postscale: es el valor del postscaler (1 a ]6). Afecta a los bits 6:3 del registro
T2CONiY
• modo afecta a los bits 2:0 del registro T2CON.

103
Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC

Setup_Timer_2(modo,periodo,postscaler); T2CON(12h)

00000000
T2_DISABLED
DOh
00000100
. Tl_DIV _BY_l
0411
00000101
Tl_DIV _BY_4 OSh
00000110
rr, DIV _BY_16 OSh

La lectura y escritura en el modulo TMR2 se realize con la ayuda de las siguientes


funciones:

valor = get_timer2 0;
set_timer2 (valor);
donde ualor es lID entero de 8 bits.
Ejemplo 3: Generar WIn [uncion que permiia realizar retardos de 1 segundo empleanda el
TIMER1. Contponentes ISIS: PIC16F876.

.- __. _lrW"filII!ii,,1iiI

_- - - --,
, ,
,-'
,',
- I
l

I.. :.........
\ ~ •• ' ,,',". -•

.... .. I .~O-DI('I'.(J~ ~

D1
LEt>-Bl
GoA:t£~ MOCf'
_j .'NI.'1~
'... t.... ,

. I "v AD 0 .""........,.
.e~.'

PIQ1ef'S'T!l

Figura 15. Ejemplo 3

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

104
4. las interrupciones y los temporizadores

0.5 = 4/F osc·(65536-x)·P

con Posc= <I; MHz y preeecaie» 1:8,; e) TMRI = 3036.

NOTA

Para observer mejor el perioda conectar el Counter Timer a CE y ponerlo en


modo TiME (segundos).

iinclude <J6f876.h>
#{lJses XT,NOWDT
#use delay (clock=4000000J
ruse st.:Jnd:Jrd_~o(b)

luLl ("on(-O:

Nint_TIMER1 II [ncerrupci6n TIMERJ.


void cempls (void) II FunclOn

if (COIlL:"'l) output toggle(PIN_Bl); II Cada 2 interrupciones de 0.5 s


sel:_ Clme.: 1 (3036): II recarga del TMRI
conr;+-t:

main I)

set up_timer_l (Tl_TNTERNAL I Tl_DIV_BY_8J:


set_timer] (3036); II recarga del TMRI
enable_ inr:ern)pts (INT_TINERl) .­ II habi li ta intert-upcion cimerl
enable_interrupt.s (global); /1 habllita lnl:errupci6n general

while (1):

Figura 16. Programa del ejemplo 3

Tarnbien se podria realizar sin inrerrupciones, esperando a que e) TMRl se desbor­


dase.
,jn~llJde<16f876.h>
'fuses XT,NOI-mT
luse de!dj'(clock-4000000)
luse sCdnda"'d_J:o (b)

105
Compilador C CCS Y Slmulader PROTEUS para Microcontroladores PIC

temp1 s ()
(
int cont-O;

outpuc_coggle(?lN_Bl);
while tcontcs] II Pa~a conra r 2 voces D.S seg

set_timer~ (30361; II Inicializa e1 TNRl


while (geC_timerl(I~-3036); /1 Espera a que se desbocde (0.5 5)

con c++;

main ()

secup_timer_l (Tl_INTERNAL Tl_DTV_BY_8J;

while (11 (
templs () ; II Llamada a la funci6n de cemporizacion

Figura 17. Programa de. ejemplo 3 sin interrupdones

Ejemplo 4: MediI' ei auclu: de un pulso mediante el TIMr.Rl y 1(1inierrupcion exierna pOl'


RBO (Figura 18). Coinponentes ISIS: PIC16F876 !/ LM016L. lnstrumentos: OSCILLOS­
COPE Y Genemdores: PULSE.

LC02
LMOII!I.

102.0uS

Figura 18. EJemplo 4

106
4. las interrupclones y los temporizadores

A] medir el ancho de uri pulso se necesita detectar su flanco de subida y despues


su flanco de bajada. E510 se puede realizer mediante la interrupcion RBO ya que
perrnite configurar el flanco de disparo.
Al producirse una interrupci6n, por ejemplo en el flanco de subida, se puede inicia­
lizar el valor del ternporizador (TlMER1) en ese momento; se cambia la activacion
de la intcrrupcion del RBO a flanco de bajada y cuando se vuelva a producir la si­
gulenre interrupcion por dicho flanco se guarda el valor del temporizador.
EI ancho de pulso sera la diferencia entre el valor del TlMERl en eJ (Janco de subida
y 01flanco de bajada. EI ancho de puJso maximo para una frecuencia de 4 MHz (ci­
elo maquina de 1 !-IS) es de 65,536 ms (un cicio del TIMERl). EI minimo dependera
del tiempo que tarda un program a en gestionar Ja interrupci6n y los calculos, En eJ
ejemplo se puede conseguir medir anchos de pulso de entre 64,934 ms y 69 IJs.

Modificar eJ fichero LCD.C para que se visualice a traves del puerto C.


s t nol ude ,,16f876.h>
Uuses XT,NOWDT
'use aelay(clockc4000000)
linclude <lcd.c>

Int16 TFB; II Tiempo Danco de bajada


tloet: AP; // Valor finaldel ancho de pulso
intl nuevopulso-O; /1 Enera otro pulso
intl cambio'O; 1/ Cambio de flanco de disparo

lint_ext
void funcian_Bxt_lnt() ( /1 Funci6n Inrerrupci6n
if (cambio--O){ 1/ F.lanco de Subida
set_ tlmer 1 (0); 1/ InicialJ.za TMRl
ext_int_edge (0,lI_TO_L); II Conflgurar para flanco baJada
cambio-l; II Control de cambio de flanco
else ( 1/ Flanco de BaJada
TFB~get_tlmerl(); II Valor del TIMERl para el flanco de bajada
ext illt edge(O,L T~ H); /1 Cenfigurar para flanco subida
cambia-O; II Control de cambia de Danco
if(nllevopulso."'O)I 1/ Fin de pulso ...
nuevopulso-l; 1/ Pulse a calcular
}
}

void main ()
lcd_J.nit ();

107
Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC

set:up_timeL"_l(Tl_INTERNAL Tl_DIV_BY_l): // Coniiqure ci on TillERl


ext:_int:_edge(O,L_TO_HI: 1/ Configurarpara flanca sub.lda
cambia = 0; // Control de cambio de uanco
enable_interrupts(int_ext): // Habilitaci6n Interrupcion RaO
enable_2nterruptslglobal); 1/ Hab.llitaciongeneral
do (
if (nuevopulso==l)( nuet'o? /1 .;Pulso
AP = TFB"l.O; en m:i crosequndos de ?'IMERI_
1/ Ancno de pulso
/1 a 4MHZ eI T = Ips'Timerl
printf(lcd_putc,"\nPu~o = %6.1fuS ". API; 1/ VLsualiza medida
1/ en !.CD

nuevopulso=O: /1 Puiso medida

while (TRUEI; /1 Buc1e iatin.!to

Figura 19. Programa de. Ejemplo 4

EI generador PULSE se utiliza para crear la serial de entrada. Con eJ boron derecho
se pueden editar sus caracteristicas (figura 20).

';

G_.oIQlN_ l_llowlVoI._
J{l-
:
j~
AMlcpT=
PuI:ed lH..nlV",,* s ·
~
Stalt{S=l 0

.~
DC
s.'" R"" T.... 's..,.j (SOOn :
Pwiln r.IT....IS_) 51»> :
~ N,·W,,*"
AIJdoo
E,_,.,-j ~ IIfdnlSeocl :
smt • Puia"""""(\') 50 ·
~
['Jg!"Type~
F~t!lIOd
SteadySl~
5,g.Edge • f~YIH.J 51. :
S"'!lIo1'ul<>o
~ POR>dIS.."t ·
~
PtI'OfO 4'dM1G,. :
Cuterl SotAoe?
~B<I"e1
M..... !lEat.?
"'lido~'

,
m;
II C4nc;ej

-5
Figura 20. Propiedades d~PULSE

Ejemplo 5: Geuerar una seiial cuadrada de 1 KHz utilizando la inierrupcion del TIMER2
(figura 21). Componentes ISIS; PIC16F876 e Instrumenios ISIS: OSOLLQSCOPE y
COUNTER TIMER

108
4. Las inlerrupciones y los temporizadores

Para generar una serial de 1 Khz se necesita un semiperiodo de 500 fJS, segun la
ecuacion deJ desbordamiento del TIMERl, utilizando un crista! de 4 MHz, un pre­
escaler de 4 y un postscale« de 1:
T= TQwl·[Prescaler·(Carga1'MR2+1)·Postscaler)

500 j.lS = (4/4000000)· [4,(X+1)'1]

donde X = 125; es decir, se debe cargar el, TIMER2 con el valor 125. Pero esta relacion
solo se cumple si se trabaja en ensamblador. AI trabajar en C, el cornpilador genera
lineas de codigo que awnentan el tiempo de ejecuci6n del program a y, par ello, es
necesario ajustar el valor final. En este caso se ha utilizado un valor de carga de 11.

, ;;-. I •

, I ,
",-_, .. - - - ~\ .- .
_mn

RIlO/INT
RBI
Be2
RB3.'PGM
RB4
Re5
ReffJPGg
RI!7IP(,1)

RCOITIOSOfl' ICJ(l
R01IT1OSI/tCPZ
RC2ICCPI
RC'lISCKlSCl
Rc4lSollS0A
FlCI51SDG
R06ITX1CK
RC11RX1DT

Figura 21. EjempJo5

{(INCLUDE <16F876.h>
luse aelay(clock=4000000)
-/Ffuses XT,NOWDT
ifuse $candard_ i.o(8)

tine TIMER2
void TLMER2_isr(void) {
outpu t_ TOGGLE (PIN_ BO) ; / para semipez::iodo a1!:Co
sec_ timer2 (11); I /1 se recarga e1 TrMERO

109
Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC

void main () f
setup_umer ,t!(T2_DIV_BY_4,124,l); 1/ contiqurec ion TlMER2
enable_interrupts (INT_TTMER2); 1/ habilit:a ~nterrCJpci6n TlMERO
enpble_interJ:upts(qlobal); II habl1~ta interxupci6n general

Ivh~le (1),. 1/ bucle inilnito

Figura 22. Programa del ejemp'o 5

Figura 23. Sma' de , KHz

Ejemplo 6: lntroducir los datos, a traves del tedado, de In oelocidad de un motor de co­
mente continua y generar una seiial modulada en un ancho de pulso proporcional al dato de
velocidad. Controiar la uelocidad en rpm y oisualizarla ell 1111LCD (figura 24). Componen­
tes iSIS: PiC18F876, KEYPAD-PHONE, RES, 2SKl058, CELL, LM016L y MOTOR­
ENCODER

Funciona igual que el ejemplo 6 del tema de los puertos, pero ahora se le afiade un
contador de pulses controlado por e] TlMERO. Los pulsos proceden de un encoder
que suministra el modele del MOTOR-ENCODER. Este modele permite obtener
tres tipos de salidas: Ql, Q2 e mx.
Ql y Q2permiten controlar el sentido de giro y la position angular del motor (se
configuran en la option PULSES PER REVOLUTION del menu de edition del mo­
tor). La sefial IDX suministra un pulso por revolution y es la que se usara para medir
la velocidad del motor en este ejemplo; a] suministrar un pulse por revolucion se
pueden contar los pulsos por minuto mediante el TMROYvisualizarlos en el LCD.

110
4. Las interrupciones y los temporizadores

Figura 24. EJempio6

Sc pucde utilizar el puerto B conjuntamente para el LCD y el teclado, pero se ha


preferido utilizar el puerto C para el LCD (esto supone modificar el fichero LCD.C
para que en Iugar de utilizar el puerto DoE utilice el C), 6gura 25.

, .. -
I
1/ Para laleccl6nar olro puerto
oc.ruc:t !Cld_'P3D_Al6J)
,
lI()()J.t.IJl.nlll>le
Il00Ltm c..
Booum rv
I100UA1I\In.... "
ln~ CIa •• ~
let"

• ~e!'tJn"d _Pt:tf_
• .,d~tl1\ell
" led
Wle ~"'rl:b_lc4
-, .
/"
.' rI
101-1., '
r
led ,."tEl ... <:::::::::::: .- I
1Iby1.'cd • OxF82
•I'l! dotined Wlc_POEtb_loCS
01, led < .~ 'c' •

~l)fL"
I'e'ldH
led _J
If n<j1' ~'lIby1.'Cd.7 I/on to porte (ataddr ... 7) ::t
.. ......

D, •
detlll.lCl
u"
_poz:tb lOCS
\ol••
•• e cr1. lad x •• ~tt1.bX
'. ~~.~ ... t_ItI~."Icd(.).•• ,-:~_,.c:(")
Ifjj-C1'~ a.t tt"u led It ~et ttl. d j(
"111111

Figura 25. Flchero LCD.Ca modlffcar

111
Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC

E1programa se basa en producir una interrupci6n del TlMERO cada 0.5 segundos y
leer el TlMERO que se utiliza como contador de pulsos externos. La Jectura se debe
multiplicar par 2 tpreescnler minima del TMRO) y par 120 (puesto que aJ ser revolu­
ciones par minute, si se mide cada 0.5 segundos se necesitara rnultiplicar par este
factor). La carga del TMRI can un preescaler de 8 es de 3036.
t;.nclude...
16fB76.h>
Ifuses XT,NOWDT,NOPROTECT,NOLVP
fUSE DELAY (CLOCK-4000000)
IINCLUDE <kbd.C>
tinclude <lcd.c>
IUSE STANDARD_IO (a)
inr;16 counter~O;

Dint_TINERl
void TIMER1_!srlvoid)
counter=get_timerO(); II zeccura contador THRO
counter-counter·2·120; II Conversion a rpm
printf(lcd_plJcc,"i61u rpm",counter) /
lcd_gotoxy(l,l);
s~t_cimerO (0); II Re~nicia cuenca
set_time! 1 (3036): II Recarga a 0.5 s

/110 '" III ,.. It 'Ii'''' .j '" iii .;. ~ oj to _ .- " .- ..

VOID MAIN()
(

CHAR K,kant-'O';
cha r PWMH-O,PWHL 0;
lcd_lnit ();
kbd_init ()/
PORT_B_PULWPS (TRUE),.

setup t;.mer_0(rtcc~ext_1_to_hIRTCC_DIV_2); II Conflguraci6n TMRO


setup tlmer_lITl_lnternaJ,Tl_DIV_BY_B); II Contiguracion TMRl
set_ timerO (0)r II Sorrado contador
set_timerl (3036); II Cc3rga a 0.5 s
enable_incerrupcs(inc_timerJ)/
enable_loterrupcs{global); II Habilltac~6n de interrupciones

WHTLE (l) I
k-kbd_getc
if (k-' \0') k-kanc,.

112
4. Las interrupciones y los temporizadores

if ((k 1°1 II (k--'II')) k-'O';


kant~k:
/("k-·18 ;
PWMH-k'28;
PWML-2SS-PWMfI;
tor (f'WMH;['WMH>O;PWNH--)(
OUTPU:r_HIGIi (PIN_AD) ;}
for (PWML;PNML>O:PWML--) (
OUTPUT_LOv.'(PIN_AO) ;}

Figura 26. Programa del eJemplo 6

Figura 27. Senal modula y salida del encoder

Ejemplo 7: Seg,;1/ In duracion de plt/sacio/l de L//I botoll oinenet fres fipos de f"llciol/es:
1/ lin I,I/Isncioll corm cia II/gar a 'III/a fllllci611 (por ejempl» enceuder 1111 leri ell e! puerto A),
una primera pulsaciou mayor de Ires segundos da lugar a otrafuucion (por ejemplo encen­
tier /III led en el puerto C) y 111111 scgunda pulsacion mayor de ires segundos de Illgar fI oira
ftlllcioll (por ejclllpio flpngnr cl led del puerto C). Cuando 5Ctrabaic call In segundo 0 tercera
fllllCi611 flO se atendenin Ins pulsncianes cortas (figura 28). Componentes ISIS: PIC18F877,
BUTTON, RES, LED-RED, LED-BLUE.

En este ejemplo se utiliza una tecnica de polling (comprobaci6n continua) del esta­
do del pulsador pero empleando la interrupcion del TIMERO; de esta forma no se
tendra al programa principal parado comprobando el estado del pulsador.

113
Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC

~.'


m)1"''8Pl
~D21f1!112
..,......
1tO~

._I""'!-----,
,.,1"'&1»'
.. .,

Figura 28. EJempJo 7

Se programa eJ TlMCRO para que provoque una interrupcion cada determinado


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

Si el boron no ha sido pulsado se designa como Fll1lciol1_D6 = 0, si ha sido puJsado


una vez durante mas
de 3 segundos se designa como Fll1ldolt_D6 = 1, si ha sido
pulsado mornentaneamente se designa como F,l/Icioll_D6 = 2 Ysi ha sido pulsado
durante mas de 3 segundos por segunda vez se designa como FllI1ci611_D6= 3.

Para distinguir si se ha pulsado durante mas de 3 segundos una 0 dos veces se uti­
liza una variable de control (que se llarnara CON_D6) que puede valer cero 0 uno,
dependiendo de si es la prirnera vez 0 la segunda vez que se pulsa.

Para controlar el tiempo que esta el boron pulsado se utiJiza una variable (06) que se ira
incrementando si el bot6n esta pulsado y se produce una interru pci6n del TMRO.
IINCLUDE <16F877.h>
#device adc-10
#use delay(clock-4000000)
Ifuses XT,NOWDT,NOPUT,NOPROTECT,NOBROWNOUT,NOLVP,NOCPD,NOWRT,NO~EBUG
IUSE F'IIST_10 (8)

'BYTE TRISA - Ox85


tBYTE PORTA - OxOS

114
~ ----------4. las interrupciones y los temporizadores
IFloTE TRISC - Ox8?
ISYTb: PORTC - Ox07
IEn'TE TR TSD - 0.,<88
IBYTE POR'I'D..OxOS
IBYTE TIMERO • OxOl
IBIT RAS - OxOS.S
IBIT RC2 - Ox07.2

CUAR DG, FUNCION_D(o, CON_D6;


INTI CNT;

tint_TIMERO
voln TIMERO_~sr(voldJ (
rf (TNPUT(PIN_D6J •• OJ II 51 estD pu1sado
if' ([16 >- 150) { //D~tectR si J s (20ms x 150)
If' (CON_D6--0) { // Pulsndo 1· vex 3 s
D6-0,.
roNcroN_D6-1;
CON_D6-1; }
ELSE ( II Pulsado 2" vez 3 s
06-0;
FUNC10N_D6-3,.
CON_D6-0; )

ELSE D6h,. /IS1 no 11ega a los 3 s a~entd contadar

ELSE {
if {D6>O 6& funciC)n_D6 --I} "6aO,. 1/ 51 pulsado anres pOlO menos
1/ 3 seq borra contadoc
IF ID6 > 0 && FUNCION D6 !-1 && roNCION_D6 1-3 ) II 51 pulsado sntes_
{FUNCION_D6-2 ; // y NO r-i Y NO 1'-3_
D6-0;} 1/ entonces F-2

S£T_TIMERO uooi • 1/ Relnici~li%a el eontadol

/ /. " t '" • *t " ,. .. ~ ~ -t .. <I ,. It i t ~ PRINe1 PAL •• ,..• ,. It ,. lit 1* ~ w" It" .. III • )It •

void main () I
disable_interrupts (GLOBAL);
secup_cimer_OIRTCC_INTERNALIRTCC_DIV_128);
D6-0; FUNCION_D6-0: COU_D6-0; II Lilffplacontadores teela
TRTSA - OXOO; '/00000000
TRISC - OXOO; 100000000

115
Compilador C CCS V Simulador PROTEUS para Microcontroladores PIC

TRISD - OX40; 1101000000


BIT_CLEAR(PORTA,S);
BIT_CLEAR(PORTC,2);
enable_interrupts (GLOBAL];
SET_TIMf:RO (100): /1 TZNERO-20ms de polling: 20ms-(2S6-100}"1 iJs·128
enable_if1terrupts (INT_ TIMERO) ;

IF (FUNCION_D6--lJ RC2-1; 1/ S1 fun~idn I ~nc~ende RCL


IF (FUNCION_06--J) ( SJ. [uneidn J apaga RC2 •••••
//
RC2-0; 1/ Espera un t~empopara no provocar una [un~j6n2
DELAY_MS (400); II no deseada.
FUNCION_D6-0; I 1/ Vuelve a f~nciDn 0
IF (FUNCION_D6--2) { /, S1 funcJOn 2, ~na vez enclenda led_
CNT+'; 1/ segundn vez 10 apaga, asl continuamente
IF (CN7'-0) RAS-l;
ELSE RJl5-0;
FUNCION_ D6-0; 1/ Vuelve a funeidn 0
J

Figura 29. Program.. del ejemplo 7

116
5. Convertidor Analogico - Digital

Ca .tulo 5

Convertidor Analogico - Digital


5.1 Introduccion
Los microcontroladores PIC puedcn incorporar un modulo de conversion de sefial
analogica a serial digital. Los modules AD que utiliza Microchip hacen un muestreo y
retendon (snlllpl£' & h()ld) con un condensador y despues utiliza el modulo de conver­
sion (figura 1). El modulo de conversion AID es dcl ti po de aproxlmaciones sucesivas,

SALIDA
ENTRADA
ANALOGICA
~
i v .1
•• j
AID DIGITAL

S/H

Figura 1. Fases de la conversion anal6glcajdigltal

EI convertidor de aproximaciones sucesivas se utiliza en aplicaciones donde se ne­


cesitan altas velocidades de conversion. Se basa en realizar sucesivas cornparacio­
nes de forma ascendente 0 descendente hasta encontrar un valor digital que iguale
In tension cnrregada por ol converser D/A YIa tension de entrada.
Durante la fase de rnuestro el interrupter se cierra y el condensador se carga a
Ia tension de entrada (eJ tiernpo que el intcrruptor pcrmanece cerrado es funda­
mental para la corrects carga del condensador). Una vez abierto el interrupter, el
condensador mantendra (teoricamente) la tensi6n de entrada mientras el modulo
A/D realize la conversion.
EI modulo de conversion se caracteriza por pararnerros como los siguicntes:

• Rango de entrada.

117
Compilador C CCS V Simulador PROTEUS para Mlcrocontroladores PIC

• N u mero de bits.
• Resolud6n.
• Tension de fondo de escala.
• Tiernpo de conversion.
• Error de conversion.
EI m6dulo que utilizan los PIC de gama media tiene un nurnero de bits de 10, por
10 que su resolucion es:
V
resolucion =--!L
2"-I

siendo VL'I la tension de entrada y N el nurnero de bits del convertidor. Es dedr, para
la tension maxima de entrada (5V) la resoluci6n es de 0,0048V (4,8 mV) por LSB.

La resolucion 51 cambia si se modi fica la tension de fondo de escala, es dear, la ten­


si6n de referenda. Los PICs permiten cambiar la tension de referenda en un valor
°
absoluto (de a +V",,) 0 en un margen (de -Vr., a +V">I)'
Las tensiones a convertir siempre son positivas.

5.2 Modulo Convertidor (gama media)


81 modulo convertidor AID en la gama media posee hasta 8 entradas analogicas.
Los 16F876/873 tienen 5 canales (en el puerto A) y los 16F877/874 tienen 8 canales (5
en eJ puerto A y 3 en el puerto E). EI convertidor (figura 2) es de 10 bits y, tal como
se ha comentado, es de aproximaciones sucesivas. Permite variar la tension de refe­
renda a la maxima V000 a tina tension positiva menor a traves de AN3N REF ya la
minima V55 0 a tina tension positive mayor a traves de AN2N RFF'

Vln_ ~Ck - Circuuo de


Aproximaciooes !;:
-V Sucesivas
"
Dato digital

fl
MOdUIOD/A]
~:
Figura 2. Bloques b,blcos de un convertJdor AID de aproxlmaclones suceslva$

Puede seguir funcionando cuando el PIC esta en modo SLEEP ya que dispone de
un oscilador RC interne propio.

118
5. Convertidor Analogico - Digital

rm..rNpfOI" de
_n:ro
IU, 1lUc;
r-r--c:::>--r-<=-

., , It,
1-001 I
ACIt .. H, .... _ ~'Il;._.
:~.OI)iOOolf. Clrcuito
AID

Figura 3. Arqultec1ura del modulo convertldor AID


La funcion de transferencia del eonverlidor AID es el resultado de que la primera
transicion ocurra cuando Latension anal6giea de entrada es igual a Vm/1024.

La resolution vendra dada por la siguiente ecuacion:


ILSB = V. + (('UF. -VRFf_)
Rf.F- 1024
En el caso de que la VRlLf, = V00 YVRrF = Vssentonces la resolucion es:
5
1LSB =--
1024
= 4,81111'
de esta forma si la leetura es de 512 LSB,la tension analogica leida es:
5
V/N =512 --=512·4,8mV=2,4576V
1024

5.2.1 Registros FSR


Hay 11 registros asociados a este periferico:

• Definicion de pines de entrada y sefiales aplicadas:


TR[SA - PORTA - TRISE - PORTE.
• Manejo de interrupciones:
INTCON - PIEl - PIRl.

119
Compilador C CCS Y Simulador PROTEUS para Microcontroladores PIC

• Control del conversor AID:


ADCONO - ADCON 1 - ADRESH - ADRESL.

I'tegistro de control ADCONO tdlreccl6n 1lAM: 1FhJ [PIC16F87x]


R/W-O R/W.() R/W.() RJW-O R/W-O u-e R/W.()
I ADCS1 I ADCSO I CHS2 I CHS1 I CHSO I GO/DONE I ' I ADON
SI(7 SItO

Figura 4. Reglstro ADCONO

bits 7:6 DCS1:ADCSO: BHsde seleccion del reloj para Ia conversion A/D.
00 = Fosd2.
01 = Fosc/8.
10 co Fosc/32.
11 =-FRC (Reloj del osdlador in tern 0 RC).
bits 5:3 CHS2:CHSO: Bits de seleccion del canal.
000 ...Canal a, (RAO/ANO).
001 = Canal L (RA1/AN1).
010 = Canal 2, (RA2/AN2).
all = Canal 3, (RA3/AN3).
100 = Canal 4, (RA4/AN4).
101 = Canal 5, (RAS/ANS).
110 = Canal 6, (RA6/AN6).
111 = Canal 7, (RA7/AN7).
bit 2 GO! DONE: Bits de estado de la conversion.
51 ADCON = 1
1 = Conversion en progreso (a 1 inicia una conversion).
a = La conversion ha finalizado (este bit es bon-ado por hardware
al terrninar la conversion)
bit 1 No usado: valor O.
bit a ADCON: Activacion del converser A/D.
1= convertidor activo.
0= convertidor no activo.

120
5. Convertidor Analogico - Digital

Reglstro de control ADCON1 (dlreccl6n RAM: 9FhJ [PIC16F87x]


R/W.o u-e u-e u-e RJW.o R/W.o RJW·O R/w.o [\
Ir-''''-O-F...;.M-,....->=-t-;lr-."Y-.,r.:'-;.---T" 1-...-"-"'--'-";II"-p"';'C-F-G-3 --r1-P-C-FG"';'2-"'-1 P"':C';"F"';'G-1
--r1-PC';_';_FG';"o---'1
BU7 BIIO

Figura s. Registro ADCON1

bit 7: ADFM:Selecci6nde formate del resultado (figura 6):


1 = [ustificacion a derechas. Los 6 bits mas significativos de
ADRESII SOl1 leidos como '0'.
0= Justificaci6n a jzquierdas. Los 6 bits menos significativos de
ADRESL son leidos como '0',
bit 6·4: No usado: valor 0
bit 3-0: PCFG3:PCFGO: Configuracion de las entradas al modulo AfD (figura 7).

ADFM=1 AOFM=O

7 2 10 7 o 7 0765
000000 I 000000

AORESH,- __ L _ AORESL
_ _, AORESH AORESL
: Resultado 10 bit :

Justlficacl6n a derechas Justlficacl6n a Izqulerdas

Figura 6. Justlflcacl6n mediante bit ADFM

"CF(;3
PCF(iO
AN7
REl
1\1'/6
RI':I
,\1'15
RliO
"'1'14
RAS
\\3
RO
,1\2
R,o\2
,,"
RAI
,,1'00
RAG
'RH' ,~V CIt",1
RF~
OOO() 1\ A II 1\ II A 7\ I-i\ voo VSS ~l()

orK'1 A A - -;::- A v«... r-x --:-


.~ A RAJ I-vss 7/1 .,1
(J(}I() () [) f) A A A A A von vss SIU :
01)11 n 0 0 A VktJ• A A A RA3 VoSS .j I
moo I) I) I) n A I) A A VOO VSS 30 :"
0101 I) I) f) I) VRrr• 0 A A VA3 VSS :!II !:
ronx ~ D 0 0
- V~" 0 0 0 0 VOO V!iS 0,0
1000 A A A 1\ Vutl• A A VM RA1 612
W(II f) I) A A A A A A VDO \'SS (>,0
1(110 I) 0 A A V"..' II A <\ VA3 VSS 5 I
lOll n D A A V,u-,- VKU. A A V<\j JV\2 4'2
1100 IJ I) I) A V~". \ arr A A VA) RA1 3f2
1101 I) o I) 0 V~Ff' VRrr A A VAl RAl 2/2
1110 I? _ 0 o 0 0 I)
~0
A VDO VSS 110
LllJ D -0-- 0 D V.,,-,- V.... --A- tv.u -RA:! 1'1
~', .......,
Figura 7. Tabla de conflguracl6n de los canales

121
Compilador C CCS Y Simulador PROTEUS para Microconlroladores PIC

En las versiones PIC17F87xA existen unas pequefias variaciones en estos dos re­
gistros.
En el registro ADCONO (direcci6n RAM:lFh) [PIC16F87xAJ los bits:

bit 7-6: ADCSl:ADCSO: Seleccion del reloj para la conversi6n AID junto con
ADCS2 que esta en ADCONI.

ADCS2:() 00= roscz 01 = roSC/8 10 = roSC/32 11 = IRC

ADCS2=1 00= roSC/4 01 rosc/re 10 10SC/64 II =fRC

En el registro ADCONI (direcci6n RAM: 9Fh) [PIC16F87xA] el bit:

bit 6: ADCS2: Selecd6n de reloj para conversion AID junto con ADCSI y
ADCSO.

Otros registros que afectan al modulo convertidor son los referentes a la interrup­
d6n: INTCON, PIEl Y erai.

5.2.2 Proceso de conversion


Para realizar Ja conversion, el fabricante recomienda seguir los siguientes pasos:

1. Configurar el modulo AID:

il. Configuration de pines analogicos/tension de eeferenda/E/S dlgitales


(ADCONl).
b. Seleccion de la entrada AID (ADCONO).
c. Seleccion de reloj para la conversion AID (ADCONO).
d. Habilitar modulo AID (ADON (ADCONO<O»
2. Configurar las interrupciones (si se desea):

a. ADIF =0;
b. GIE =r PEIE = ADlE '" 1.
3. Esperar el tiempo de adquisicion.

4. Comenzar la conversion poniendo a '1' el bit GOIDONE(ADCON0<2».

S. Esperar a que termine la conversion. Puede ser de dos formes:

a. Mediante lecture continua del bit GOIDONE hasta que sea '0', indicando el fin
de la conversion.
b. Esperando a Ia interrupci6n.
6. Leer rei egisrro de conversion ADRES y borrar enf1ng ADIF si es necesario.

122
5. Convertldor Analogico - Digital

7. Para la slguiente conversion se salta a los puntos I, 2 03 en funcion de 10 que se


necesite. EI tiempo de conversion por bit se define como TAO' Un minimo de 2-T~o
son necesarios antes de la conversion (esto no es necesario para los PIC16F87xA de­
bide a que el interrupter de muestreo se cierra en cuanto se obtiene el resultado).

Existen do~ tiempos basicos de trabajo: el tiempo de adquisici6n (fACQ) y el tiempo


de conversion TAl)'

• Tiempo de adquisid6n (TACQ): tiempo necesario para que se cargue el con­


densador de retencion (CIIOLO> con la tension de entrada. Este proceso de carga
del condensador depende de distintos Iactores, entre otros, la impedancia de
In Fuente de tension de entrada (c1 fabricante recomienda que se situe por de­
bajo de los 10 kohm).
EI tiernpo de adquisici6n dentro de los mar-genes tipicos es de, aproximada­
mente, 20 ,",so
La adquisici6n no comienza hasta que no acabe la conversi6n. Asi que se debe
espera un TACO tras una conversion. tras seleccionar un nuevo canal 0 tras en­
cender el modulo AD.
• Tiempo de conversion (TAO): tiempo necesario para obtener el valor digital de
la tension analogica de entrada. Este tiempo depende de la Fuente de reloj que
se seleccione para la conversion. Para una correcta conversion AID, el reloj
debe seleccionarse para asegurar un tiempo minimo TAO de l,6lls. En la figura
8 se rnuestra la tabla de seleccion de fuenles de reloj con su TAD asociado, Jas
celdas sornbreadas son las que no se recomienda SU uso.
Fuente de relo] (TAnl Frecuencia del dispositi~
Operacien ADCSI :ADCSO 20 Mlu 5 l\fllz 1.25 MHz 333.33 k:i'h
2T"". 00 100 nsl"' 400 nsl';, 1.6!ls 6 ~IS
8To~ - 01 400 ns\·' J.6gs 6.4 !lS 24 !lSI>'
32TI1," 10 1.6 ).IS 6.4 J.lS 25.6 !ls(J) 98 jJSll)
RC II 2-6 us cu 2-6 jJS(4) 2-6 JJSl'A' 2-6 jJs{')
-..._~ es=e=e-
FIgura 8. Tabla de seleccJ6n de fuentes de reloJ

Las notas de la figura 8 indican:


(1): La fuente RC tiene un TAD tipico de 4 us.
(2): Estos valores violan el minima tiempo requerido de TAO'

(3): Para conversiones mas rapidas se recomienda utilizar otra fuente de reloj.
(4): En PICs con frecuencias superiores a 1 MHz, el modo RC s610 es recomen-
dable en modo SLEEP.
El TAl) se configura en ADCONO (reloj de la conversi6n).
TAO'2·TOSC TIO 8'TOSC T,,(J 32·TOSC

123
Compilador C CCS V Simulador PROTEUS para Microcontroladores PIC

Tambien en el PIC16F87xA.
I T~p 4·Tose I TAJI-16'TOSC1 TAD-M'Tose I

Para convertir 10 bits se requiere un tiempo de 12·TAD (figura 9).

r- - - - - -,- - - - r - - - , - - - -,-- - - r - - - , - - - - T - - - , - - - - r- - - - T - - - - r - - - -
I I I I I I I I I I It:
I I I I I I I I , f , I
T~yloT.lOlT,.C1'T~c2' T;.;)3' T~:~' T.:-t\' T",:,6'T ..:.7' T-08' T-c91.T~C:l0'T-:;·.,
t
09 1>8 1>7 b6 es b.l 1.J3 1.)2 :>1 to
r INICIO CONVERSI6N

r EL CONOENSADORYA CARGADO SE DESCONECTADE LA FUENTEANAL6GICA


(T1PICAMENTEA LOS 100os)

I GO/DONE= 1 I ..
SE CARGA ADRES
EL BIT GO/DONE SE PONE A 0
SE ACTIVA EL FLAG ADIF
EL CONOESADORSE CONTECTADE NUEVOA LA FUENTE ANAL6GICA

FIgura 9. Ciclosde conversi6n


Considerando los dos tiempos (de adquisicion y de conversion) la secuenda com­
plete de muestreo/retenci6n y adquisici6n en los PICs de gama media se muestra
en la figura 10. Existe una diferencia entre los PIC16F87X Y los PIC16F87XAien los
primeros es necesario esperar tin tiempo 2·TAOantes de iniciar una nueva adquisi­
cion, cosa que no ocurre en los segundos.

nempo de mUOltro y conv.rsUIO

. : ; ~...
TI.mpo de .dqul.lei6n TI_po d. eon__ iclrt En los
Durante .. te tllmpo .1 CHOI.I) EI CHOl.D.. ducon.CI. de I•• nlr.da I Plc16F87.
I; pormanteo .erradohula "eanear II 101 lOOn, do GO.l. S. debe
espera2·T ...
t v.lor d. la leftal do on!nul.

tn' .,.I"WJtO¥ d•
• " ...... )\1"0 .I(

lOOn,

Selecel6n Canal (AOCONO) Iniclo do Convsrelon Fin d. Conv.rslOn GOIOONE-O


Habllillcl6n m6dulo AD (AOCONO) GOIOONE-1 Valor en ADRES.
Inlelo d. odqulslcl6n S. activ. flag -'OIF

Figura 10. Tiempode muestro y conversl6n

5.2.3 Efecto del modo SLEEP y RESET en el modulo AD


En el modo dormido (sleep), el m6dulo AD puede funcionar si se selecciona como
reloj para la conversion el RC interne (ADCSl= 1 Y ADCSO = 1). En este caso, el
modulo espera 1 cicio de instruccion antes de iniciar la conversion, permitiendo la
ejecucion de la siguiente instruccion SLEEP, eliminando as! todo posible ruido de

124
5. Convertidor AnalOgico - Digital

conmuradon durante la conversion. Al finalizar 1" conversion, eJ bit GO/DONE


es puesto a "0" y el resultado se carga en los registros ADR[SH y ADRE.SL. En e]
caso de que la Interrupcion del modulo AD este habili.tada CADlE = 1 YPEIE = 1) el
dispositive se despierta, perc en el caso de no estar habilitada, el modulo se apaga
aunque el bit ADON siga ali]".

En el caso de qtle la fuente de relo] no es la RC interna, la ejecucion de una instruc­


cion SLEEP hace que la conversion que se este realizando se pare y que el modulo
se apague aunque el bit ADON siga a "1".

En el caso de producirse un RESET, los registros del modulo AD se inicializan a los


valores indicados por el fabricante. EI efecto del RESET es el apagado del modulo
y la parada instantanea de la conversion actual, los terminales se reinicializan a
entradas analogicas (ADCONl parte baja a 0); el valor de ADRESX no se modifies
en el caso de un Reset pero en et caso de un Power-on Reset es desconoddo.

5.3 Modulo AD en C
En eJ compilador C las funciones para manejar el convertidor AD son las siguientes:
setup_adc (modo);
modo: para la configuraci6ndel modulo converser AID correspondientes a los bits
7:6 del ADCONO.

SClUp_lIdc(lIlodo); AOCONO(IFh)

ADC_OFfi' 00000000
OOh
11000000
AOC_CLOCK_fNTERNAL COh
ADC_CLOCK_OIV _2 000000000
OOh
01000000
ADC_CLOCK_DIY _8
40h
10000000
AOC_CLOCK_DI"_32 80h

setup_adc_ports (valor);
Valor: definicion de las entradas anal6gicas correspondiente a los bits 3-0 del
A DCONI (figura 11).
set_adc_channel (canal);
canal: selecci6n del canal analogico correspondiente a los bits 5:3 de ADCONO.
o (ANO) I (ANI) 2 (A~2) 3 (AN3)
4 (AN4) 5 (ANS) 6 (AN6) 7 (AN7)

125
Compllador C CCS y Simulador PROTEUS para Mlcrocontroladores PIC

P<H:J
PC-F(;O '''7
11£.1
'Nfi
Rt:1
A'i~
RF.O
"'i~
liAS
"'''l
RA)
'''1
RAl '''I
R \1 RAO
\"n setup_adc_portll (vaJor);
l'i
0000 A A 1\ 1\ A A A A AI L_A""LOG

0001 \ \ , " '"... 1\ , \ '",,0_"'I '''1_ v.~,,~_"'_ '''7_Vll.'i. \ RU 1 "t.!


0010 II 11 11 A .. A , \ '"0 1\1'>1'''1 ",,1\'4

0011 D I) D , \ 'O_AI'>I_AI'o1_M'~_\ ~,_ \ Ilff


[)
OlilO 1) 1) 11
A

11
"If'"
I)
"
A
A
_ ::!
A " \:\U_.'" 'Nl ,/
0101 I) 0 0 0 0 ,\ .\ 1\1100
\"_V~'_\ltH ':t
'In·
OIlX II 0 1) 0 0 11 0 II 1'I0_1\'1I\LOC" ti,
IUOO \ \ , A \ "t. \ "n·
, A ~'O.I\" \I'I~ \NS \" "7 'Rn \ Rf ....
i:
1001 I) Il 1\ ~"0_,,1'1 I_A'1
A \
"... A
" ""0 ""I_MO_
;"")_"'~ .11..'5
ii
1010 I) 1) A \ 'MH. \
", \"~_A'$_\ l-.'_VRfF
kil
1011 I) D 1\ A \MH '... 1\ ~'O_A"I_A'4 "S_\IlH_'kH

1100 I) 11 1) A \ .., \ 'II". A , ,_,,"AI.OC_lt;\l_RAl 11.1;1 t!


IIUI 0 I) 0 0 '!tu 'm. A ~ 11.'0''11 '!Iff \Rn
r
1110 II Il I) 1) II 0 I) A
'''0 P
1111 I) II 11 n 'w \ll'(t. I) ... 'SO "RfF \'REr
i\

Figura 11. Poslble vafores de setup_adc_port(vaforJ

valor = read_adc 0;
Lectura del resultado donde valor es un entero de 16 bits segun la directive I!DE VI­
CE A DC.. empleada. Dicha directiva trabaja segun la tabla:

DEVICE 8 bit 10 bit II bit 16 bit

ADC=8 OO-FF OO-FF OO-FF OO-FF

ADC=lO x 0-3FF ;I. x

ADC=II x x 0-7FF x

ADC=16 o-rroo O-HCO O-FFEO O-fHf

Por ejemplo, el fichero 16f876.hincluye como primera dircctiva Itdl!lJict! PIC16FS76.Para


incluir 1ainformacion del tipo de converser AID se debe afiadir #device adc = 10.

READ_ADCO admite ires modes de funcionamiento:


ADC_START .AND_READ Si no se indica nada es In opcicn por defeeto.
Permite inicinr y leer el Convertidor.
ADC START ONLY S610 inicia Jo conversion.
--
ADC R.EAD ONty S610 Icc los regisrros del convertidor,

126
5. Convertidor Anal6gico _ Digital
----------------------------------
Ejemplo 1: Lecture de una tenskir: analogica par el canalANO (figllrtl 12). Componenies
ISIS: PIC16F876, POT-LIN, CELL Y LM016L.

lC01
u.oo ...

IRDC = 511
Voltage = 2.49U I f:i
t ~~~
4···
. .. .. ~IU...ao!!8i5~8B [:!
I
U1
f: PSC''''''''
ose>.c.KOVT
L---.L. ...cm~
R9OoIN'1"" •
'!S.
~gz •
Ii
RV1 J1:~~_,"'""jIt''' RSJ.-= ., ~I

I-J- BAT1 • I + AAtJANI R850

• •
• . ~
tv,,,,,,,,'<Z"IIlEfO
"""_.
1tMI'IOC<1
RAsrA.III4:SS
ROOI'GC
l'I1!fil'GO
~toeOrltQCI , l:
~ "
R:C1/tt(]6l11CCf2 ~
~ [:i
-:.: 'RC2.'CCPI

*
RClISCKlIiC.
ftt:A~
f\
~,
RC$"SQ(t

PIlI~m
Rell"""'"
RC7AX,oOl .!.:! ,

Figu1'a 12. Ejemplo 1


t2Dclude <16F876.h>
#aevice adc=10

;FUSES X'l',NOWDT
IFUSES
luse delay(clock=400000Qj
#include <LCD.C>

void main ()
int16 q:
Ilaet: PI

setup_adc_ports(ANO); IICanal 0 ana16gico


setup_ddc (ADC_CLOCK_INTERNAL); I/Fuence de r~loj RC

10d_ .i n.i t: () ,.

for (;I) (
set_adc_channel(O); /IHabili taci6n canal 0
delay_us (20) ;

127
Compilador C CCS V SimuJador PROTEUS para Microcontroladores PIC

q read_a de-() ; IILectura canal 0


p 5.0.* q , 1024.0; IIConversi6n a cension

printf(lad_pucc, "\fADe = MId", q);


pr~ntt-(lcd_pt1tc, "\nVolcage = e"Ol-2fV", .0);

delay_ms (100) ;
}

Figura 13. Programa del Ejemplo 1

Ejemplo 2: Ternuimetro call IIna NTC NTSAOWB203 (figura 16). Componentes [SIS:
prC16F876, NTSAOWB203, CELL Y LM016L.
Se utiliza una NTC NTSAOWB203con una beta de 4050 y una resistencia a 25°C de
20 kohm (figura 14)i estas caracteristicas se pueden ajustar asi como la temperatura
a medir en el menu de edicion del componente (boton derecho, figura 15).
P~ ..t.)~ ... ft..l':,«n,rtl4\1
~1~~~~Wi~,tlnq
rr.J~£,~t~ ' <)n::: CJr;· I
l'If'Ir""l[ih~1(>rl (J"."'~
nl&lmfttCTlmP
f:~~'T""'"'1~:."',. F:
..
F",INllTltutt t~S(1 ~~OI-:l
tk(lhlhl ' •• 1 in,1oU 1InV"
f'~
N1$A0Jt,.~Onlll& _'J 1~V' I'" 11 11
,
T ~:)I~tl5
m<r,01[ll502CiFfOO
trnAtXJlIPlt:iEIDY
noo.±l~
''''fiO.tt'l:.

0)3
21
15
1.1
I; ,. ...tOlol1'
-.,to 12~ f:i
.l!.T~
10
io, . ·'IL n., 11
, ~"1
(I) 125 n
~TK'OVlI\mtJE
1B~
NTSAl)Wc..\o'\.1OE 1!Ie
10
Y>
",'!i:.1:''''
..(JM ~
OJ1
(t ~.
I J1
)1
1.1
.11 . .oIl]l"'~
-'01",125
~t:
~= .~
Figura 14. Caracteristicas de Ja NTC NTSAOWB203

Matet'" Comiart
Oi~I"" f.ccorWrc fiidoAil
nmeConllanl{,,"c)
r------ 'Hdt"AT
Usp'McdejF'1Ie- HI<ieAII
PCBP~ • 1 H"odoAU
Ad\.><>OOed I'I""",,_
r"""""wu,'( .25 _

Otherfropoj\ltt

E#ludelrom£~
E•• ~ ~cm PO! !.<J.oo":
Edit JII ,",op.,be!.ntelIr

Figura 15. EdlcUm del componente

128
5. Convertidor Analogico - Digital

La NTC se linealiza mediante una resistencia Rl de 10 kohm, el valor de tension


de la NTC (V,) se puede obtener segun las siguientes ecuadones (temperatures en
grados kelvin):
_ ~. R[ 10000 . VI
R r-
V8AT - VT 5 - Vr
1
Tr= 1 Rr 1 -273.15= 1 Rr 1 273.15
-In(--) +- --In(--) +--
fJ RT25 T15 4050 20000 298.15
LC01
1.M01&

IT ~ 25.45C

1~~

,.,---r::::~'-"iP!~~-I RAOI_
RA11ANl
F!A2/i'J<1'VREf'
RA3IAA3M<EF'
AA4fT0CKl
RJI5I/lmIlS

Figura '6. Ejemplo 2


+i nc.Iuae ··lQ£875.b"
~deyice acic=10
"fuses XT,NOWDT
"use dElay (clock=4000000)
~include <matb.b> / /uecesex ie .oarB los calculos matemaricos
linclude <lcd. c>

=oi.d main () {
float tv,tr,cemp,y: //Variab1es de eCl1acion
int16 value:
lcd_init () :
setl1pyOrt_a ( ALL_ANALOG);
serup_a.dc ( ADC_CLOCK_INTERNAI. l :

129
Compilador C CCS Y Simulador PROTEUS para MicrocontroJadores PIC

set_ado_channel( 0 ),.
delay_us (10);
do (
value = Read_ADe();
tv = 5.0 • value 1024.0;
tr = tv • 10000.0 / (5.0 - tv);
Y = lag(tr/20000.0);
y = Il.0/29B.15) + (y • (1.0/4050.0»;
temp=l. O/y;
temp = temp -273.15;
printf(lcd_putc, "\nT - i04.2fCP, cerr>.p);
while (TRUE),.

Figura 17.- Program a de ejemplo 2

Ejemplo 3: Realizar lin bar6metrolaltlmetro que mida en Kp«, Psi, Attn 0 tnt!>median­
te su seleccion por un pulsador (figura 20). Componenies ISIS: PIC16F876 MPX4115, I

NTSAOWB203, eurto. CAP y LM016L.


El sensor de presion MPX4115 de 15 a 115 kPa (2.2 to 16.7 psi) con una tension de
salida de 0.2 a 4.8 V. La funcion de transferencia se muestra en la figura 18, la ecua­
cion de Ia tension de salida es:

vOUT = Vs * (0.009 * P - 0.095) ± (Error Presion * FactorTmp * 0.009 Vs)

I I I I I I I I I I I , I I
i- TRA'~SFERFWC'OOH. - UAX
~!¢
i- VOlA~
Vs."S.l Vdc
v,'
(.O(9"P-.Oi» ± faot 1\.
\..~~
l&~
,
ijJ..5 ,_ TO.!P = 0 10 as 'C ~~
TYP-
~ 3.0
~~
~ 25
S 2.0
1..5
~~
~~,iA~'P

" \a~
1.0
0.5
~~
"- F~.
~~=~~~~~~$~S~2=2~g~88~=~
.----"-_

Figura 18. MPX41IS (cortesia de Motorola)

El error de Presion y el factor de temperatura vienen definidos por el fabricante


(figura 19). El error de Presion se sima en ±1.5y el factor de temperatura varia entre

130
5. Convertidor Anal6gico - Digital

1 Y 3 segun Ja temperatura. Este factor hace que sea necesario medir la temperatura
de trabajo y, por ello, se utilizara una NTC.

--....
.-- Temper;)ture Error Band
MPX4115A.MPXA4115A SefieS
~J-

-. "'"
1lI-
......
.40 J
ltm1>orJl ... DlDlII 1
£JIll
14- 1:& J
Fa:...
1.0-
I I I I I I I I I I
" ~ -JII ~ 111
T_;,O
CI eo 110 1110 1211 140

.-- Pressure Error Band

I I I I I I
l!) 40 Q) 110 100 11'0 "'' ' <If (OIlWOo)
"...... 1a....lII&r.j
15.115~ :tU(oPOI

Figura 19.Error de Presl6ny Factor de Temperatura [eertesra de MotorofaJ

La ecuacion para calcular la presion con una Vs de5V y un error de presion de ±l.5
esde:

p 0.475+v'....!:O~f..,T~+
___ 1.5. FactorImp
0.045
Una vez calculada Ia presion en Kpa se reladona con Psi y Atm:

1 Kpa = 0.0098692 Atm.

1 Kpa = 0.1450377 Psi.


La altitud en metros se pu.ede calcular segiln la ecuacion:

H = -7990.6527 .In( 101.304


P J Kpa

131
Compilador C CCS y Simulador PROTEUS para Mlcrocontroladores PIC

LCD1

p= 99.S7 Kpa
T = 2S.35C

M1

Figura 20. Ejemp'o 3

linclude <16FB76.h>
Idevice adc-10
#E'USESXT,NOWDT
#FUSES
Nuse delaylclock-4000000)
'include <mach.h>
#include <LCD.C>
IBYTE TRISA - DxBS
KBYTE PORTA - DxDS

void main()
int16 q;
iloat cv,rr,temp,y,cf,error; IIVarisoles ecusclones
floatp,presion,pres_atm,pres_psi,slt; I/Variables calculo presion
Ily altura
inc cne-O;
bit_set (TRISA, 2);
setup_adc_ports(RAO_RAl_RA3_ANALOG); IIRAO y RAl analogica, RA2 digital

132
5. Convertidor Analogico _ Digital

setup_adc(ADC_C~OCK_INTEFNAL):
lcd_ini c () :

Ear t t r! {
set_adc_channel(O}; //Lecrura presion en voltios
delay_us (201;
q - r-ead_adc (};
p - 5.0 ' q I 1024.0;
preslon- (O.475+p}IO.04S; //~ectura presion en KPB

sec_adc_c~an~el(_I; /ILec~ura temperatura


delay_us (201:
q = read_adc ();
tv - 5.0 • q I 1024.0;
tr - tv * 10000.0 I (S.O - tvl;
y - log(tr/20000.0);
y - (l.O/298.1S) + (y ·(1.OI4050.0}1;
cemp-l.OI},;
cemp - cemp -273.1S:
~f (cemp>=O && te~<-8S) TF=1.0;
else TF=3.0i
ERRCR a TF ICa1culo del error de p~esi6n con la ~emperatura
9 1.5;
/e1 error puede ser z pero aqui usaoos - 0 +
pLoesion-presion-ERROR; I/Presi6n en Kpa
pres_atm = presion ~ 0.0098692; I/Presi6n en .4cm
pres_psi = presion· 0.1450377; I/Presi6n en Psi
alt: - -7990. 652789"log(presion/lCl.304); IIAl:::ura
if (BIT_TEST(PORTA,2)==0) cnt++; Calcular QUmera veces pulsa baton
If (cnt>=4) cnt=C;
$Iatch tcnc) I/Segun numero veces pulsa bacon sa elige menu
case 0:
lcd_gOtDXY (1,1);
princfOcd_Fl1T.:c, "\P= is.2f Frpa .., PRESION);
printf(Icd_putc,"\nT - !04.2i C", ~ea:p);
break;
case 1:
lcd_gotDxy(l,l);
pr:incf(lcd_pur:c, "\Fa 14.2f a"1!' ". PRES_a-:m);
printf(lcd_PL~c,"\nT - i04.2f C", r:emp);
break;
case 2:
lcd_gocaxy(l,l);
prinef(lcd_putc, "\p ... H.2f psi ", PRES_psi);

133
Compilador C CCS y SimuJador PROTEUS para Microcontroladores PIC

print£(lcd_purc,H\nT = i04.2f CH, temp);


break;
case 3:
lcd_gor:ox.y(l,l) ;
printf{lcd_pur:c, "\Alt= %7. 2f m ", ale);
printr( lcd_putc, "\nT = i04. 2f en, temp);
break;

delay_ms (100) ;
)

Figura 21. Programa del ejemplo 3

Ejemplo 4: Simlliacio/l de adquisici6n de tensiones negatioas (jigura 22). Componenies


[SIS: PIC16F876, CELL Y LM016L.
Como se ha comentado al inicio del capitulo, el convertidos AD del PIC 5610 puede
adquirir tensiones POSITNAS. Talcomo esta configurada la entrada del converser,
el PIC se "QUEMARIA" en e] caso de introducir una serial de tension negativa
par los canales AD. Pero la simulacion es "muy sufrida" y sf qu€ penn.ite adquirir
tensiones negativas sin que al PIC le ocurra nada, pero la realidad es mucho "mas
cruel"; jOJO can esta diferencia entre la simulaci6n y la realidad!

Figura 22. Ejemplo 4

134
5. Convertidor Anal6gico _ Digital

linclude <16F876.h>
Idev;.ceadc-IO
IFUSES XT,NOWDT
I roSES
'use delay(clock-4000000}
linclude <LCD.C>
void main ()
int16 q;
floatp;
spcup_~dc_portS(ANO_VRF.F_VREF);
secup_sdc(AOC CLOCK_INTERNAL);
lcd_ini e () ;

tor (;;) (
set "dc_channel (0);
delay us(20);
q reacl_adc t t :
P ~ (-2.0) + (4*q I 1024.0);
print! (lcd_putc, "\fADC - 141d N, q);
pz-intf(lcd_putc, "\nVoltage - IOl.2fVH, p);
delay_ms(lOO);
}

Figura 23. Programa del ejemplo 4

La solucion practice para medir tensiones negativas es desplazar la tension hasta


valores positivos y despues restar este desplazamiento por software.

135
6. Modulo CCP - Comparador, Captura y PWM

Capitulo 6

Modulo CCP - Comparador,


Captura y PWM
6.1 Introduccion
Los modules CCP permiten realizar tres funciones basicas basadas en el manejo de
los temporizadores (Timer):

• Comparador: compara el valor del temporizador COnel valor de un registro y


provoca una acci6n en el PIC.
• Captura: obtiene el valor del temporizador en un momento dado, fijado por la
acci6n de un terminal del PIC.
• PWM: genera una senal rnodulada en amplitud de pulso.
Los PIC de la gama media pueden tener hasta 2 m6dulos CCP. Los dos modules CCP
se comportan practice men te iguaJ (menos en un caso especial que se estudiara peste­
riormcnte). TrOISproducirse un reset, el modulo CCP se encuentra deshabilitado.
Cada m6dulo CCP posee un registro de 16 bits que puedc utilizarse de las tres
siguientes formas:

• Registro de 16 bits para capturer el valor del temporizador al producirse un


evenLo (CAPTURA).
• Registro de 16 bits para cornparar su valor can el valor del ternporizador
TMRl, pudiendo provocar Linevento cuando se alcanza el valor contenido en
este registro (COMPARADOR).
• Registro de 10 bits para el ciclo de trabajo de una sefial PWM (PWM).
Cada uno de los registros CCP tiene asociados tres registros (la x indica CCPl 0 CCP2):

• CCPxCON: Registro de control del CCP.

137
Compilador C CCS y Sjmulador PROTEUS para Microcontroladores PIC

• CCPRxH: Byte alto del registro de 16 bits del CCP.


• CCPRxL: Byte bajo del registro de 16 bits del CCP.
• CCPX: pin del CCP.

Registro de control CCP.xCON fdireccion RAM: 17h/D1h, CPI­


C16F87.x]
Figura t. Registro de control CCPxCON
RrN-O RrN-O RrN-O RrN-O RrN-O RrN-O
I CCPxX I CCPltY I CCPxM3 I CCPxM2 I CCPxM1 I CCPxMO
81tO

bit 7:6 No usados: valor O.

bit 5:4 CCPxX:CCPxY: bitl y bitO del Duty Cycle deJ PWM.

Modo captura: No se usa.


Modo comparacion: No se usa.
Modo PWM: Son los dos bits menos significativos de los 10 bits utilizados para eJ
DUhj Cycle del PWM. Los ocho bits de mayor peso del Duty Cycle se encuentranen
el registro CCPRxL.

bit 3:0 CCPxM3:CCPxMO: bits de selecci6n del modo CCPx.

0000 CCP inhabilitado (reset del modulo CCPx).

0100 Modo de captura, cada flanco de bajada.


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

0101 Modo de captura, cada flanco de subida.


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

0110 Modo de capture, cada 4 flancos de subida.


----------------~--.-.--.-.----.--- ..------.------------
DIll Modo de captura, cada 16 flancos de subida.
1000 . ... __
Modo de comparacion,
... pin _._._ _._
....._CCP a 1....
.. .... al_igualarse _._ _
(CCPxIF
..-.-_.-_._ = ......-~-.-
........- 1).
1001 Modo de compara cion, pin CCP a 0 al igualarse (CCPx1F = 1).
......--..-........-.......'"""'...----~.-.-.-.-.----------------------------~- .-_ ...
Modo de cornparacion, genera interrupcion al igualarse (CCPx1F = 1,
1010
CCPx no es afectado).
-----------~---------------------------------------------.--
Modo de com para cion, lanza accion especi.a1(CCPxlF = I, CCPl resetea
1011 TMRl, CCP2 resetea TMRI y lanza una conversion AID (si esta habi-
litada).
llxx 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 interaccion entre elios. La siguiente tabla
muestra dichas interacciones.

Modo CCP" ModoCCPy Interaction


Captura Caprura Misma base de tiempos en TMR1.
La comparacion debe configurarse para la ac-
Captura Comparacion
cion especial de disparo que borra el TMRl.
La comparaci6n debe con.figurarse para la ac-
Comparacion Comparacion
cion especial de disparo que berra eJ TMRl.
Los PWM deberan tener la misma frecuencia
PWM PWM
y tasa de actualization (interruption TMR2).
PWM Captura Ninguna.
PWM Comparacion Ninguna.

6.2 Modo Captura


En el modo de captura, CCPRxH:CCPRxL capturan el valor de los 16 bits del regis­
tro TMRl cuando ocurre un evento en e1 pin CCPx. Los posihles event os son:

• Flanco de bajada.
• Flanco de subida.
• 4 flancos de subida,
• 16 flancos de subida.
Estes eventos se seleccionan con los bits CCPxM3:CCPxMO (CCPxCON<3:O». En
el momento de la captura, el bit CCPlIF (pJR1<2» [y/o el CCP21F (PIR2<O>)]se
pone a I, produciendo una interrupcion en el caso de que este habilitada. E1flag ha
de ser borrado por software. Si sucede otra captura antes de haber Ieido el registro
CCPRx, el valor de 1a captura previa se habra perdido.

En modo captura, el pin RC2ICCPl (:flo elpin RClff105I1CCP2) debe configurar­


se como entrada poniendo a uno el bit TRISC<z> [y/o el TRI5C<1>]. 51el bit RC2!
CCPl [y/o RCVCCP2] se configura como salida, una escritura en este pin podria
originar una captura.

Este modo trabaja can el TMRl.Ademas, es necesario q_ueeste funcione como tern­
porizador 0 como contador en modo sincrono. En modo asincrono no funcionaria.

Si se produce un cambio en el modo captura, por ejemplo de flanco de bajada a


cada 4 flancos, se puede dar una falsa interruption. Por software se debe borrar el

139
Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC

bit CCPxIE para deshabilitar las interrupciones, limpiar elflag CCPxIF y cambiar
el modo de captura,

Mediante el preescaler se puede alcanzar una resolucion mas precisa sobre Lasse­
fiales de entrada. Hay cuatro configuraciones de preescaler especificadas mediante
los bits CCPxM3:CCPxMO. Cuando el modulo CCPx esta inhabilitado no esta en
modo captura, el contador del predivisor es puesto a cero, Cualquier tipo de reset
borra el preescaier.
Para cambiar el tipo de preescaler se debe apagar antes el modulo CCPx (horrar el
preescaler) y posteriormente modificar dicho valor, de 10 contra rio se puede produ­
cir una interrupcion.
Si se utiliza el modo sleep (dorrnido), el TMRl (configurado en modo sincrono) no
se incrementa, pero el preescaler del CCPx si que continua incrementando el conta­
dor de eventos y, pOT 10 tanto, cuando alcanza el valor prefijado, el bit CCPxF se
pone a 1,10 que provoca un despertar del PIC; asf el contenido del TMRl se guarda
en los CCPRx pero su valor no es significativo dado que el TMRl estaba parado.

6.3 Modo Comparacion


En el modo comparacion el valor de 16 bits del registro CCPRx se compara conti­
nuamente con el valor del temporizador TMRI. Cuando ambos valores se igualan,
en el pin CCPx se puede producir, 0 no, un even to de los siguientes:

Sepone a 1.
Se pone a O.
No cambia.
Estos eventos se seleccionan mediante la configuracion de los bits de control
CCPxM3:CCPxMO (CCPxCON<3:0»:

1000
1001
__ ..
... __
Modo de comparacion, pin CCP a 1 al igualarse (CCPxIF = 1).
...........__ .. ...-__
..--............~..........-- . ......-...-.......-
Modo de comparacion, pin CCP a 0 aligualarse (CCPx:IF = 1).
.._-.. ...----.-

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


Modo de comparacion, genera interrupcion al igualarse (CCPxIF = I,
1010
CCPx no es afectado).
...-.----.--- ..---
_ .................._--_ ....•--.... ......................_. __ ......--- ..---.-~-.----- .....--------------~
_,.

Modo de comparacion, lanza accion especial (CCPxIF = 1, CCPl re-


1011 setea TMRl, CCP2 resetea TMRl y lanza una conversion AID (si esta
habilitada).

Por otra parte, al producirse un evento en el pin, se producira 1a interrupcion en


caso de que este habilitada, ya que elflag CCPxIF (dePlR1 0 P1R2) se pone a 1.

140
6. Modulo CCP- Comparador, Captura V PWM

El T'IMERl se debe configurar en modo temporizador 0 modo contador sincrono


para que el modulo CCPx funcione correctamente en el modo comparacion,

Para trabajar en este modo, el pin CCPx debe configurarse como salida, poniendo
a 0 el bit del registro TRISC correspondiente, Cuando se selecciona uno de los
modos de comparacion, el pin CCPx toma el nivel logico contrario a] que tiene
gue tomar cuando se produzca Ia igualdad (es dear si se tiene que poner a 1 en Ia
lgualdad, se pone a 0 en estado normal)

Hay un modo de trabajo (CCPxM3:CCPxMO: 1010) en el que se produce una inte­


rrupcion aJ producirse la igualdad, se activa elflng CCPxIF y se genera la interrup­
cion, si esta habilitada, perc el pin CCPx no se ve afectado.

Porwtimo,puedetrabajarenmododedisparodeaccionespedaJ(CCPxM3:CCPxMO:
1011). En este caso cuando se produce la igualdad, el temporizador TIMERl se re­
setea, por 10 que se utiliza como marcador de la acd6n. En el m6dulo CCP2, ade­
mas de producirse el reset del TlMERl, se inicia una nueva conversi6nAD si dicho
modulo esta habilitado: esto permite realizar conversiones AID peri6dicas.
En e1 modo sleep (dormido), el TlMERl no funciona y, par 10tanto, Ia comparacion
tampoco. EI pin CCPx tendra el mismo valor que antes de trabajar en modo sleep.
Despues de cualquier reset, el modulo CCP esta deshabilitado.

6.4 Modo PWM


si modo PWM (Puise WidthMQdulanon) 0 MODULACTON DE ANCHO DE PULSO,
permite obtener en los pines CCPx una sefial periodica enla que se puede modifi­
car su ciclo de trabajo (Duty Cicle). Es decir, puede variarse el tiempo en el coal la
sefial esta a nivel alto (TON) frente a] tiempo que esta a ruvel bajo (ToFF);verla figura
2. De esta fo.rma,la tension media aplicada a la carga es proporcional a] TON' centro­
lando, par ejemplo, 1a velocidad de motores, luminosidad de lamparas, etc.

OutPUL
Ton
V mod L
Too ccV mod
T =cte.

Vmod t

Figura 2. Sella. PWM

14:1
Compilador C CCS Y Simulador PROTEUS para Microcontroladores PIC

La resolucion de salida es de hasta 10 bits. Para que este modulo funcione correc­
tamente, el pin debe estar configura do como salida, mediante la configuration del
TRIS correspondiente.

El periodo de 1a sefial PWM Be obtiene de configurar el TIMER2 Yel contenido del


registro PR2 (direcci6n 0x92); ver la figura 3. Este registro de 8 bits contiene los 8
bits mas significativos de una cuenta de 10 bits. Para calcular el periodo de la serial
PWM se utiliza la siguiente ecuaci6n:

PWMT = (PR2 + 1)·4-Tosc·(Valordel Preescaler del TMR2)


Cuando el valor del TMR2 se iguaJa al valor de PR2, pueden ocurrir los siguientes
eventos:

• TMR2 se borra .
• El pin CCPx se pone a 1 (excepci6n: si el Duty Cycle es 0%, el CCPx no se pone
a 1).
• El valor de CCPRxL se carga en el CCPRxH, el cual es el que se compara. con
el TIMERl para fijar el duty cycle.

PERIOOO
~..

,
CicIo dE>Trabajo : TMR2=PR2

TMR2=Clclo de Trabajo
TMR2=PR2

FIgura 3. Se;;al de sanda PWM


El ciclo de trabajo (duty cycle) se define par el valor del registro CCPRxL y can los
bits CCPICON<5:4> antes de comenzar un nuevo periodo. El registro CCPRxL
contiene los 8 bit de mayor peso y e1 CCPICON<5:4> contiene los 2 bits de menor
peso. Por 10 tanto, se consigue una resolucion de 10 bits (DCxB9:DCxBO). E1tern­
porizador base con el que se campara el contenido de estos registros es el TMR2.
La siguiente ecuaci6n permitecalcular el valor del Duty Cycle:

PWM duty dele = (CCPRxL:CCPxCON<5:4»·Tosc·TMR2pRESCAl£R


Los registros CCPRlL y los bits CCPICON<5:4> pueden escribirse en cualquier
memento, pero no se cargan en CCPR1H hasta que finalice e1 periodo de la onda
PWM actual (es decir que se produce la igualdad entre PRl y TMR2). 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 cido de trabajo, cuando el TMR2 mas 2 bits se


iguala a CCPxH mas 2 bits
Si el cido de trabajo de la onda PWM es mayor que eJ periodo, la seiial que sale por
la patilla CCPx esta siempre a 1.
La resoluci6n maxima en bits viene dada par 1a expresi6n:

resolucion =
,fosc )
FpWM bits
192

Par ejemplo, para una frecuencia de PWM de 1.22 kHz can un preescaler de TMR2
de 16 y una frecuencia de reIoj de 20 MHz:
1 1
-=(PR2 + 1)·4·--·16
1220 20.106

se obtiene un valor de PR2 = 255 (OxFF), y una resolution de:

Ij20'106)
, 1200
resolucion = > to bits
Ig2

Para porter en marcha el modo PWM se deben dar los siguientes pasos:

1. Configurar el periodo PWM mediante escritura del registro PR2.


2. Configurar el DItty Cycle escribiendo en el registro CCPRlL y los bits
CCPICON<5:4>.
3. Configurar CCPx como salida mediante eI TRlSC.
4. Configurar el preescaler del TMRl y habilitarlo mediante escritura en
T2CON.
5. Configurar el modulo CCP para la operacion en modo PWM.

6.5 Modulo CCPen C


EI compilador C suministra una sene de fundones para eI manejo del modulo CCP.

Configuracion del modulo CCPx:


setup_ccpx (modo);
modo hace referenda a los bits CCPxM3:CCPxMO del registro CCPxCON (figura 4).

143
Compilador C CCS Y Simulador PROTEUS para Microconlroladores PIC

SETUP_CCPl(MODO); MODO RElJlstro CCPxCOII (17hID1b)


CCP_OFF DeshabiliIKion 00000000(OOh)
CCP CAPTURE_FE
CCP CAPTURE RE
Captura per flanco de bajada
Captura per f1anc:ode subfda
00000100(04h)
00000101 (05h)
:':
CCP CAPTURE_DIV_4 Captura tras 4 pulsos 00000110(06h)
CCP_CAPTURE_DIV_16 Captura tras 16 PUlS05 00000111(07h)
CCP COMPARE SET ON MATCH Salida a 1 en ccmparactcn 00001000(OSh)
CCP_COM~ARE_CLR_ON_MATCH Salida a 0 en comparaci6n 00001001(OA9)
CCP COMPARE INT Interrupcl6n en comparacl6n 00001010(OAh)
CCP_COMPARE_RESET_TIMER Reset TMRen comparaci6n 00001011(OBh)
CCP_PWM Habllitacl6n PWM 00001100(OCh)
,.~

Figura 4. Modos de SETUP_CCPx(MODOJ

Los valores para comparar se fijan en los registros CCPRx. En el compilador C,


estos registros estan definidos en el fichero include, por ejemplo en eI16F87x.h:

10ngCCP_I; long CCP_2;


#byte CCP_1 = OxlS #byte CCP_2 = OXlB
#byte CCP_I_LOW;Ox15 #byte CCP_2_LOW = OxlB
#byte CCP_I_HIGH = Ox16 #byte CCP_Z_HIGH = OxIC

Definicion del cicio de trabajo para PWM:


set_pwmx_ duty (valor);
valor: dato de 8 0 16 bits que determina el cido de trabajo. Este valor, junto con el
valor del preescaler del TMR2, determina el valor del ciclo de trabajo, En la configu­
radon del T1lvlER2, el postcaler debe valer 1.

S92.BuS I

Figura S. Ejemplo 1

144
6. Modulo CCP _ Comparador, Captura y PWM

Ejemplo 1: Medir III ancho de 1111 pulso mediante el modulo CCP (figura 5). COIIII'0Ilt'"tt':;
v
ISIS; P1C16F876 LM016L. Instrulllt!lltoS: OSCILLOSCOPE y Generadores: PULSE.

Se utiliza el modo captura del CCP, configurandolo para que detecte el Ilanco de
subida 0 de bajada del pulso a medir. Este ejemplo es similar al ejernplo 4 del tema
de interrupciones, pero en esc la deteccion era por interrupcion de RBO.

Cada VC7 que se produzca una deteccion de flanco, el valor del T'oARl pasara al
registro del modulo CCP.
I~nclude ~lbcblb.h~
Ifuses XT,NOWDT
/fusedelay tc lock-')OOOOOO)
K~ncludo <lcd.c>
~byte PIRI-OxOC

intl nuevapulso-O; I/Sntra otro pulso


int16 TFB-0,1·P."O,rF 0: I/Ti(Jmpo!lancos
floacAP-O.O: //Valor tmal del ancho de pul so
intI cambia-O: //CfJmbiode Danco de disparo

#lnt_ccpl
void ccpl_Jnt()( IIFuncion intel.'rupciOn
If{cfJmblo--O)( /IFIBnco de subida
TFS-CCP_l; //CBrgB del valor del regisero CCPRl en Danco subidB
setup_ccpl(CCP_CAPTURE_FE): //Conflguracionmodo CBptuca en flancobajada
cambio-l; //Contral de cambio de uenco
else { //Flonco de Bajada
TFS-CCP_l; //CacgB del valor del registro CCPRI en fJancoba]ada
setup_ccpl(CCP_CAPTURe~RE): //Conflguraci6nmodo captura en fldnco subida
cambia-O; //Control de cambio de [Janco

if (nuevopulso--O// //FJn de pulso ...


nuevopulso-l; //pulso a medi.r

void maln IJ

lcd_inH (/;
seotup_tlm81_1 ('fl_TNTERNALJ; //Conflguracion n~Rl
seeup_ccpl/CCP_CAPTURE_RE) ; //Conflguracion modo Capcura en flanco sublda
camblO - 0: //Conrrol de cambio a 0

145
Compllador C CCS y Simulador PROTEUS para Microcontroladores PIC

enable_lnterrupcs(~nt_cCpl); IIHab~litaci6n interrupci6n modulo CCP


enable_interrupts(global); I/Habilitacion interrupci6n global
do (
if(nuevopulso"-l)I /1,Pulso nuevo?
TF- (TFB-TFS) ,. I/Ancho de pulso.
AP - TF"1.0; //Allchode pulso en microsegundos (a 4 MHz:l us)
pcinc£(lcd_pucc,H\nPulso - ~6.1fuS ". AP);
nuevopulso-O; /IPulso ya medido, ~spera nuevo

} while (TRUE);

Figura 6. Programa del ejemplo ,

Ejemplc 2: Generar ulla seiia! cuadrada de 2 kHz mediante el modulo CCP (figura 7).
Componenies [SIS: PIC16F876 s LM016L. lnetrumentos: OSCILLOSCOPE v COUN­
TER TIME.

~OO(TI080ITI0I4
II
RC11T10SVCCP2 t-=-J~ ..... ---~
RC2ICCP,
RClISCI<ISCl
RC4ISOI/SOA
RCilISClO
R08JTXlCV
RC7!1lM)T

Figura 7. Ejemplo 2

Se uriliza el modo cornparacion del CCP, configurandolo en modo conmutacion del


pin ecp pot' comparacion. Este ejemplo es similar a los ejemplos 1 y 5 del tema de
interrupciones, pero en esos la detection era por interrupcion del TRMO y TMR2,
res pectivamen teo

146
6. Mlldulo CCP _ Comparador, Captura V PWM
------------------------------------
E1 m6dulo CCP compara continuamente el valor de TMRI con el valor prefijado:
cuando se produce la igualdad se produce el cambio de estado del pin CCP Y la
activacion de la interrupcion del.modulo CCP.

En cada conmutaci6n se debe fijar el valor a comparar para obtener una onda cua­
drada (un cido de trabajo de150tyo), es decir un semiperiodo de 250 fls (a 4 MHz el
ciclo maquina es de 1 us), por 10 tanto, el CCP2 se debe cargar con este valor (ajus­
tando el valor final es de 199).
#include <16f876.h>
IIfusesXT,NOWDT
intI cambio=-O; //Variable de cancrol de cambia

#int_ccp2
vo.id ccp2_int ()( //Funcion de interrupci6n
if(++cambio--l)(
setup_ccp2(CCP_COMPARE_CLR_ON_MATCH);
//Modo Comparacion, calnbio a 0
else {
setup_ccp2(CCP_COMPARE_SET_ON_MATCH);//Modo Comparacion, cambio a 1

set_timer1(0): IIBarrado de TMRl


CCP_2 = 199; I/Inic~al~zacion del registro CCPR2
para un Duty del 50%
}

void ma.i n ()(


disable_interrupts (global);
setup_timer_l(Tl_INTERNAL I Tl_DIV_BY_l); //ConflguracionTMRI
//Configuraci6ninicial modulo ccr
setup_ccp2(CCP_COl1PARE_SET_ON_MA'I'CH);
CCP_2 = 199; /IInicializaci6n del registro CCPR2
//para un Duty del 50%
enable_interrupts(int_ccp2); IIHabilitaci6n interrupc~6n modulo CCP2
enable_inteJirupts(global); Ilffabilitacion interrupcion general
do (
) while (TRUE);

Figura 8. Programa de. ejemplo 2

Ejemplo 3: Mediante Laconfiguracion del modulo CCP lanzar una conversion AD, auto­
mdtica cada 11115. Con el valor obienido se realisarti una conversion DA uiilizando el PWM
y un filtro paso-bajo (figura 10). Cotnponentes TSIS: PIC16F876, CAP, CELL, LED-BAR­
GRAPH-GRN, LM3914, POT-LIN Y RES.lnstrumentos: OSCILLOSCOPE.
Se configura el modulo CCP2 en modo comparacion can accion especial de disparo,
ruanda se produce la igualdad se resetea el TMR1 se y se lanza una conversi6nAD,
si esta habilitada. Cargando el registro de CCP2 COn el valor adecuado se consigue

147
Compilador C CCS V Simulador PROTEUS para Microcontroladores PIC

que, cuando coincida con el valor de TMR1, se produzca una conversion AD, en
este caso cada 1 ms, Dado que la frecuencia de trabajo es 4 MHz (1 ms/l f-ls=1000),
e1 registro CCP2 se carga a 1000.

Figura 9. Senal de 2 KHz fejemplo 21

Con el valor obtenido de la conversion se puede obtener una serial PWM prop or­
donal a este valor. Para ello se utiliza el modulo CCP1, dado que el valor de la con­
version es de 10 bits y el registro del modulo PWM tam bien es de 10 bits, el valor
puede ser transferido directamente.

£1 periodo de la sefial PWM viene fijado por el TMR2, con un prescalery un posicaler
de valor 1 y W1 valor de registro PR2 de 224, 10 que implica un periodo de 225 I-'s
(4444 Hz).

Si dicha serial es filtrada con un filtro de paso bajo se obtiene una corriente continua
proporcional al valor de la conversion. Como aplicacion se pucde aplicar esta sefial
a una barra de leds y obtener una serial luminosa proporcional a la serial adquirida
(volill/eter). Para ello se utiliza eJ circuito integrado LM3914 (figura 11).

En la Figura 10 se observa el funclonamiento del circuito: con una pila y un poten­


ciornetro se varia la tension de entrada, la cual es muestreada cada 1 ms. Con este
valor se genera una serial PWM (ver canal A del osciloscopio) y mediante el filtro
de paso bajo se obtiene la tension media proporcional (ver canal B del oscilosco­
pio), Dicha tension se inyecta a la entrada del LM3914 que proporciona 1a serial a
los leds.

148
6. Modulo CCP - Comparador. Captura y PWM

Figura 10. Ejemplo 3

r­ I FO
I ~, n_1 11
I
I
" 1i 'I

I LED L[O
~O 10
I NO.1
I l' 11 11 n 14 1) 11 II 10

I
....L
u ..r .....,._. LM3914
I
I
I
I
L ~ __ __,

ov-sv
SIGNAl
SOURCE

Figura 11. Apllcacl6n tlplca del LM39141cortesia National SMq

#include <16f876.h>
Ifdevice adc=10
#fuses XT,NOIVDT
.i.nt16 valor;
/line_ad

149
Compilador C CCS y Slmulador PROTEUS para Microcontroladores PIC

void ad_ int () { IIFuncion interrupcion AD


valoc=read_adc(}; IIValor de fuente ana16gica...
set_pwm1_duty (valor); Iia Duty de PWM
)

void main () (
disable_interrupts(global);

setvp_acc_ports(ANO); //Habilitaci6nRAO ana~6gico


setup_adc(lWC_CLQC[{_INTERNAL) ; IIReloj interno RC
set_adc_channel(O); //C,mal 0

setup_timer_2(T2_DIV_BY_1,224,1); I/PR2=Z24, Tpwm=225 US


setup_ccpl (CCP_1?WM); I/CCPl en modo PWM
setup_ccp2 (CCP_COMP.I!RE_RESET_TIMER),. IICCP2 modo COMPARACION
...
II y dispare especial
setup_timer_lITl_INTERNlfL Tl_DIV_BY_l); IIConliguracidn TMR1
set_ timerl (0) ; I IPuesta a 0
cc'p_2=1000; /IMuestreo cada 1 ms a 4 Mnz
enable_interrupts(INT_AD}; IIHabilitacidn Interrupci6n AD
enable_interrupts(global); I/Ha.oilitacion Interrupci6n global
do I
) l"hi.Ie (TRUE);

Figura 12. Programa de. ejemplo 3

Figura 13. Senal moduJada y sena. fjltrada

150
6. M6dulo CCP - Comparador, Captura y PWM

NOTA

Puede detectarse un error en el m6dulo CCP en modo PWM con valores altos
(ver el ultimo ejemplo de este capitulo).

Ejemplo 4: Mediallte In cOllfiguracion del modulo CCP lanzar Lit/aconoersion AD auto­


nuitia; COli el tin/or ootenido representor In tension de entrada ell WI display grcifico (fi­
gura 14). Conuxmeutes [SIS: PTC16F877, CELL, V5IN, LGM12641BSIR. Instrumentos:
OSCILLOSCOPE.
En este ejercicio hay que teneren cuenta dos factores. Por un lado que Ja frecuencia
de muestreo debe ser, por 10 menos, dos veces mayor que la frecuencia a mues­
rrear: en este caso si la frccuencia de muestreo es de 5 kl-lz (200 J,Js),la frecuencia de
la serial a muestrear debe ser inferior a 2 KHz.

Por orro lado, hay que ajustar e) rango de tension de entrada a valores positives, Se
utiliza una fuente de continua de 2.5 V para elevar una fuente senoidal de 5 V de
pico a pico con una frecuencia de 10 Hz (tam bien se puede desplazar la tension con
el offset de la fuente VSINE). Para representar esta tension se ajusta el tamafio de la
pantalla: en el eje de las X eJ tiernpo (de] a 128 plxeles), en el eje de las Y la tension
(de 1a 64 pixeles).
LCO,

.
-.
tOU'... ·85Jft

• r"
-~
r-; 0,
/ , .. 1:1
- ;.
-D
I \v ' v
t':,
.1

Lt _l.
OIC'ICli(,.
~~~
A/tt)roW;..
,.....Rt,,,,,,
'Ie.':: ~
P&iI •
.'R,
• ....·~t
... .. -
!!\:"::s. ••__......

:=
fl:
i,1

j ~""'I
'lI~I''''VN.'
~.
"&II'ICC
!i'.l1,tQ)
- jj

rE,"
'V --

1~tTl :t
~~Q
RP.6''''''~
!U>1'_~
~t':'''·H& ~-.
1C11~lQI.':
I"C1trt~

-"-
FIC2,,(P1
~
":'
t~i

_.
"""""'"
kCMlJf)(
1IIC,~m
:!
..,.~A) •
=~~
==.:' f,i:

It
'"*""'" •
H011f1U1-'1' •
:~:
""II"" ~~ 'i
~
Figura 14. Ejemplo 4
linclude C16f817.h>
#device adc-10

151
Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC

luse delay(clock=20000000)
#fuses HS,NOWD'1'
#include <HDM64GS12.C>
#include <graphics.c>
int16 valor;
floattension;
lint_ad
void ad_int ()( //Funci6n interrupci6n AD
valor=reaq_adc(ADC_READ_ONLY); I/Valor de fuence ana16a~ca ...
ccp_2:1000; Ilreinicia cuenta
)

void main ()
int8 xa=128.ya=O;
glcd_init (ON) ;
disable_incerrupcs(global);
setup_adc_ports(ANO); IIHabilitacion RAO anal6gico
setup_adc(ADC_CLOCK_INYERNAL); IIReloj incerno RC
set_adc_channel(0); IICanal 0
setup_ccp2(CCP_COMPARE_RESEJ_TIMaR); //CC!?2modo COMPARACION._
// Y disparo especial
secup_timer_l (Tl_INTERNAL Tl_DIV_BY_l}; IIConnguraci6n L~l
set_ timerl (0); //puesta a 0
ccp_2=lOOO; I/Muestreo cada 200 PS a 20 MHZ
enable_interrupts (INT_JW); //Habilitacion Interrupcion AD
enable_interrupcs(global); //Habilitaci6n Interrupci6n global
glcd nllscreen(O); //8orrado de pantaI1a
g~cd_l.ine{L, 64,1,1,1) ; /Ilineas de x e y
glcd_line(l,31,128,31,1);
do
tension=(valor~5.0)/1024.0; / /v in en voltios (de 0 a 5V)
ya=l. 0+-12.6"1:ensi
on; //Escalado de Vin, y de 1 a 64 (y=1+5415~Vin)
glcd_pixel(xo,ya,l);
xa._-;
if (xa<Z)
(xa=128; //E]e de ~empos (x de 1 a 128)
glcd_flllscreen(O);
glcd__l~ne(l,64,1,1,l}; III~neas de x e y
glcd 11ne(1,31,128,31,1),.

lvhiJ.e (TRUE);

Figura 15. Programa del ejempfo 4

152
6. Modulo CCP - Comparador, Captura y PWM

Ejemplo 5: Realizar 1111 control PID parn regular la temperatura de 1111 homo (figura
16). Componentes ISIS: PIC16F877, lRLI004, OVEN, RES Y CELL. lnstrumentas: OS­
CILLOSCOPE.

...

~~EtJ, J..J
Rl

01
",.""

OVI

""'"
FIgura '6. EjempJo 5
Un.O de los controladores mas comunes que se utilizan en el control de temperatura
es el PW (Proporcional-Integral-Derivada). Sin entrar en teoria de control, se pue­
de indicar que 1.1n controlador PID responde ala siguiente ecuacion:

U(l)
K
= K peel) + ___L_
If e(t)dt + K pTd --de(t)
r. / ()
dt

donde e(t) es el errol' de la sefial y u(t) es la entrada de control del proceso. K es la


gananda proportional, T, es la constante de tiempo integral y Td es Ia constante de
tiempo derivative.
En. el dominio 5, el controlador PID se puede escribir como:

Un controlador PID ti.ene tres parametres (Kp' Tv Td) los cuales interacnian uno con
el otro y su ajuste para obtener el mejor control puede ser muy complicado.

153
Compilador C CCS y Simulador PROTEUSpara Microcontroladores PIC

Ziegler/Nichols sugirieron valores para los parametres del control PID basados en
analisis de lazo abierto y laze cerrado del proceso a controlar. En lazo abierto, mu­
chos procesos pueden definirse segun la siguiente funcion de transferencia:
-.IT"
G(s) = 1(0 ·e
(1+sYo)

donde Loscoeficientes ~l' 'toY Yo se obtienen de la respuesta del sistema en lazo abier­
to a una entrada escalon. Se parte del sistema estabilizado en y(t) = Yopara u(t) = urY
se aplica una entrada escalon de llu a ~ (el salto 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 operacion.

y(t) I
-----------I---=-=.-.:-~
----

yo I--,.--C(·---·--·------r
i
---------------------
II I
!:
I i

to t(5)

Figura 17_Respuesta de salida a una entrada escalon

Los parametres se pueden obtener de esta respuesta:

'0 = tl =!«
Yo = t2 -II

- YI- Yo
K 0-
ul-uO

Begun Ziegler/Nochols, las relaciones de estos coeficientes con los parametres del
controlador son:
K = 1.2·yu
p
Ko -rt)

154
6. ModiJlo CCP - Comparador, Captura y PWM

La realizacion de un controJador Pill discreto viene dado por la transformada z:

U(z) = E(Z)KI'[I + T _I + TJ _(I_-_Z_-I..;..)]


1;(1-.: ) T
tambien:

U(z) b ( -I
--=a+--+c l-z )
E(z) 1- Z-I
donde:
K-T
a=K,1 b=-P-
1';

Existen distintas posibilidades de la realizacion practica de un controlador Pill;


una de las mas habituales es la realizacion en paralelo (figura 18).

integral

u(kT)

Figura 18. Dlseno paraleJo del controlador PIO

E1algoritmo utilizado para programar elPICse muestra en la figura 19 de la pagi­


na slguiente. El muestreo debe ser mucho rnenor que el tiempo de establecimiento
del sistema en lazo abierto. En el modele Ziegler/Nichols se toma un valor T <TJ4
(tarnbien puede utilizarse T < yJI0).
Un problema asociado a este tipo de disefio es el llamado "integral toindup", el coal
puede provocar largos periodes de sobreimpulsos (overshoot), motivados por los
valores excesivos que alcanza Ia serial de control debido a 1a acumulacion en eJ
integrador, Para evitar este problema se suele limitar la serial de control entre un
valor maximo y otro mirnmo, impidiendo que el integrador actue cuando se supe­
ran esos limites.

155
Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC

( AD )

CALCULO DB- ERROR


e(kT)=l{kT)-y(kT)

cxcuro oe,
TERMINO INTEGRAl
~T)=b·e(kT).jf(kTo)

cALcuLoDa
TERMINO DERIVATIVO
d(kTt)"C·e(kT)·c"e(kT0)

CALCULO DE LA SAUDA
AD
u(kT)=i(kT)i'<I~BQ<T)+d(kT)

.. I
TR.lWSFERENCIADE t(KI)
AL .acTU,aoOR

J
j(kTo~T)
e(kTope(kT)

Figura' 9. AJgoritmo de programacion del PID

En el ejemplo, el control se realiza sabre un homo can una resistencia calefactora.


Se actua sobre dicha resistencia mediante una serial PWM generada en funcion del
control PID. Para lacilitar la simulation se alimenta la resistencia con una fuente

156
6. Modulo CCP - Comparador, Captura y PWM

de corriente continua de 12 V Y se modifica su potentia de calentamiento (editar el


componerrte con el boton derecho) a 120 W (figura 20).

Ccrnponel'd8Er~EnCe Hldden
CIl'fol1Ol100t ~oIvc: OVEN IbciJM
r--
U$AModclF'de 'H.j;,AI
Mi!lllted I'!op!ltlet
..... ·'1126 lido ...
-
Ot~_~_~.

tllCiIdo (,om ~inuilllioo\


E.cIiIde 110mPCB j,~
EditjP rA«lortle. aoleit·

Figura 20. CaracteristJcas del OVEN

Dado que Ia corriente maxima es de 10 A se ha utilizado un MOSFET de potencia,


elIRLl004.
Como sensor de temperatura se puede utilizer cualquier dispositive NTC, RID,
termopares, etc.; pero el OVEN tiene un terminal que indica la temperatura del
homo en grades Celsius. Sera este terminal el que se utilice para introducir al PIC
la temperatura del horno: dado que la temperatura esta medida directamente en
grad os Celsius es conveniente utilizar (para este ejemplo) un divisor par 100 que
permita obtener el valor en milivoltios de la temperatura (25 °C seran 250 mV).
~.~
!~i.J~h Com~,.,~nl •.o~" ~.... _,.I,o

rM'---
c..._.,.llef"......
C_YaIo= ~
H>Odm
HlJoo,oo
I !!~ I
.I ~ I
-1'\--
USA...oddFIe.

Il!,<"~~
- ~...:.;;:..I
•.•,' ...•,.
....-

:15
-~..
~d.",

I ~
e~from.i"'l.U;on: - ............ JllCdIe.
Ed"i."...,PCS.... '"
f~;iJ_" ... ,...

Figura 21. Caracteristicas del OVEN

157
Compilador C ecs y Simulador PROTEUSpara Microcontroladores PIC
--- - ---------------
La temperatura a alcanzar (0 set point) se podria introducir por teclado (y LCD)
pero, para simplificar, se establece directamente en el programa (se deja al lector
modificar dicho programa para podervariar la temperatura de set point). La tempe­
ratura inicial se puede modificar en el menu de edicion del componente OVEN.

El res to de caracteristicas a modilicar en el componente OVEN son (figura 22):

• Temperature coefficient (V1~C):da una idea de la temperatura que alcanzara eJ


homo segUn l~ tension aplicada. Valor: L V 1°C.
• Oven time Constant (sec): es Laconstante de tiempo del homo. Para evitar una
larga simulacion se ajusta a 10 segundos.
• Heater time Constant (sec): esla constante de tiempo del calefactor. Para evitar
una larga sirnulacion se ajusta a 1segundo.
• Thermal resistance to ambient ("ClW): resistencia termica homo-ambiente. Se
ajusta al mismo valor que el dado por defecto, 0.7.

USA Madti Ae:


AtJ.oncod ",,_toe.:
_T'_'''t.lrel·q

1helIIId 19e=au toAotlonl r"-AIJ)


DvM TiIIe!:<matt!«< 1
Ii_ r"""c-.ntI see,J
...,......
••_(IIrcl
"0"""'_

E_",,",~
E~"""PC8~~
E<iljl_~.....,*'"

Figura 2L Caracteristicas deJ OVEN

Para determinar los parametres (Ko- 'toy yo> del control P 1D basados en el analisis de
lazo abierto seglin Ziegler/Nichols, se realize un analisis transitorio del homo can
una entrada escalon de 0 a 2 V (10% a 20% del valor nominal); ver figura 23.

Para trazar la grafica se utiliza 1a Simulation graphs en el ISIS (figura 24); el tipo
interactive. En el comando GRAPH/ADD TRACE (figura 25) se afiade la traza de
la sonda de tension colocada en la salida de temperatura del homo. Al realizar
la simulacion temporal de la forma habitual (0 con la barra espaciadora) se lanza
tambien la simulation grafica y durante el tiempo fijado en la grafica (editando
sus caracterlsticas -figura 26-), el valor dela sonda se reflejara en dicha grafica (se
deja abierto el interruptor un tiempo y despues se cierra para provocar el escalon

158
6. Modulo CCP - Comparador, Captura y PWM

de entrada). Realizando una pulsacion en la barra de titulo de la grafica se puede


ampliar y utilizar un cursor para realizar las medidas; tarnbien se puede exporter
la gnifica a un fichero,

BAT1

SW1
••
SW-SPST

100

50 .11
111.00
HOMor e.ee

FIgura 23. Respuesta a una entrada escalon

ANAlOGUE
DIGITAL
MIXED
FREQUEtltv
TRANSFER
'~DISE
ISTORllON
OURIER
AUDIO
':II
~) COliroriMANCf
~ OCSWEEP
'",," AC SWEEP
r;;
/

Figura 24. Simulation Graphs

:~.j Soul", C<t1luQ To... ,,"" ~"'''''' tIoIw


h!t<ltOIlOll...

I;OnI",_".An "'(111"' /
QoOI,t. _ Carl", ". ANoI, ..

Figura 25. Menu Graph

159
Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC

G,.,n,'j" I~TERACTI\I£NIAL)'S,s
1.,... ,....
itoolr.. ~

'......(le .... "'" "


~:mJ.'* ."

lit II ~
Figura 26. Caracteristicas del grafico
De la recta de maxima pendiente se deducen los parametres KO' -CoY Yo definidos
para el analisis en lazo abierto de Ziegler/Nichols (figura 27).

..;...:"~.- r _ ,.,-::;,
~ -
21G'C " __
,: ,I

,:" ,
" I

/
I
,I

I
I
I
/
,,• =/, -/0 =5.5-4.5= I
... ,, TO
/
..
,
,/
: rs=t->', =J8.5-5.5=13
'to Ko = y, - Yo = 276- 25 = 125.5
1I,-Uo 2-0
••
.... i l'.S.

4'.'
'1'
..i/ I ..f IS.' ~_. ".. ".1 ~.. "Ii, .". ."
.
Figura 27. Determinacion de los para metros "0" "toY Yo
Los parametres Kp'T, YT~se calculan en base a estos:

K = 1.2· y.!!_ = 1.2·13 = 0.1243


" Ko "0 125.5·1
T,=2·Tu=2·1=2
T" = 0.5· Tel = 0.5 . 1= 0.5
160
6. Modulo CCP - Comparador. Captura y PWM

Los parametres del controlador discreto se calculan en base al tiempo T que segun
Ziegler/Nichols es de 0.1 s por ser menor de T < 'to /4.
(I = Kp = 0.1243
b= Kp ·T = 0.1243·0.1 =0.0062
T, 2

c = _K....:...p_._TJ~ = 0.1243·0.5 = 0.6215


T 0.1

HINCLUDE <16P877.h>
ildevice adc=10
lose delay(clock=4000000)
Itfuses X'I',NOWDT
#BYTE TRISC = Ox87

void main () {
int16 valor; / lectora de temperatura
int16 control; //valor del PWM
float a,b,c; //constantes del PID
float temp_limit; /Itemperatura a alcanzar
floa t rT, et, iT,dT, yT, cr. i.TO, eTO,iT_l, eT_1: l!vilI~bles de ecuaciones
iloat max,min; //limir::esmaximo y minimo de control
min=O.O; //inicia11zacion variables
max=1000.0:
12'_1=0.0;
eT_l=C,O;
a<=O.120; //constantes del PID
b=O.0062;
c=0.6215;
temp_limit=500.0; IITemp~a~UIa a alcanzar
TRISC=G;
setup_cimer_2 (t2_div_by_4,249,1); I/periodo de la sena] PWM a lms
setup_ccp1(ccp_pwm); IIM6du~o CCP a modo PWM
ser::up_adc_ports(all_analog); //Puerco A ana~6gico
s'e-cup_adc (ADC_CLOCK_INTERNAL): I/reloj convertidor AD int:erno
~et_adc_cbannel(O); IILectura por el canal 0
while (1) (
va1or=read_ adc (); IILectura de la temperacura
yT=valor~5000.0/1024,Oi Ilconversi6n a mV (0.251' a 250mV)
l'T=bemp_limit;
eT=rT-yT: I/Calculo error
iT=b*eT+iTO; licalcu10 del termino integral

161
Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC

dT..c· (eT-eTO) ; //Calculo del termino derivativo


IJT .. i T+a*eT+dT, //Calculo de la salida PID
if (uT>max) '{ //Salida PID si es mayor que el MAX
uT-max; I
else {
if (uT<min) ( //Sallda PID s i es menor que el NIN
uT-min; I

control-uTi / /Transferencia de sal ida PID a seilal PW/1


set_pwml ducytcont cal i ,
iTO-1T, //Guardar variables
eTO-I:T,
delay_ms(lOO) , //Tiempo de muestreo
)

Figura 28. Programa del ejempJo S

La respuesta del sistema se muestra en la figura 29; si se reduce el tiempo de rnues­


treo a J ms se reduce el sobreimpulso (figura 30).

,.. 1IlTI'
,... L_ r-, ~~'

"!of.
-,
I r-, ;,'
-,
>I.

.....
.,.
.•.
...
-1.11I--
-+-
j
j
-- --- -
r-,

---~
- k---"

--- _-- - .
::1

::,
:,'
1/
.•.. - --
.... I a=0.1243
fi<iu.u,,~- t,'
j
....
.._, I-
caO.6215
T-100mt
_,n,
- --- --- -- - 1---'

j Min:O
t:l:
.. / t:
.... -)
n.• ---
._'---
". ''!!_ ~ .
Figura 29. Respuesta con T - tOO ms

162
6. Modulo CCP - Comparador, Captura y PWM

,
" .. ~ , ..
(;i
....
6'.9

•• ,e

". /
~
V
I

I
-- ~ -
:::~,:
.... / ii
/
.... i~
•.. j 3"'0.1243
h:llMnnl
:j
... / c:"S2.151
IT=1......

,. I Max=100[
Min",n_ 1[:

.... /
"'. / 'I
.. r.
'j
/
, II
...
·V
1""

....! ~2;;.i; ~
Figura 30. Respuesta con T = 1 ms

Ejemplo 6: Problenmsen Lasimuiacian del mMulo CCP en modo PWM,con el ISIS (figu­
ra 16). Componentes ISIS: PIC16F876. lnsirumentos: OSCILLOSCOPE,

Se ha detectado un problema, que pronto sera resue1to par LabCenter, en e1 modu­


lo CCP trabajando en modo PWM. Los valores del dutty pueden it de 0 a 1023 dan­
do una serial modulada desde 0 V can el valor 0 a 5 V can eI valor 1023; pero en el
ISIS, a partir del valor 900 la serial se convierte en una sefial cuadrada can un cido
del 50% y un periodo doble delque tenia. En el ejemplo se observa este de£ecto.

OSC11CLrJN ReOllNl
OSC21!fLKOI.IT RBl
L.-.----!.-j MCLRIVppITHV RllZ
Rll3IPGIvI
MOlANO RB4-
RAIIANI RB6
RA2lAN2NREF­ Ri*WPGC
RA3/AN~EF+ RB7/PGD
RA4/TOCKI
RA$lA~ RCOfflosom C1<1
RCliT10SIJCCP2
RC2JCCP1 ~'-- ...J
RC3/SC1(/SCL
RCAISOlISoA
RC5/S00
RC6fTXICK
RC71RXIDT
PIC16f878

Figura 31, Ejemplo 6

163
Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC

Figura 32. PWM con valor menor de 900

Figura 33. rWM con valor mayor de 900

164
6. Modulo CCP _ Comparador, Captura y PWM

linclude <16f876.h>
Ictuses XT,NOWDT
,use delay(clock-4000000)
~nc16 i;
void main (J (
setup_tlmer_2(T2_DIV_B)~1,224,lJ; I/PR2=224, 1pwm=22Sus
secup_ccpl (CCP_PwY,J,. IlccP! en =000 Ph~
~or (~=O;~<l024;l~+)(
sec_pI':ml_ducy(iJ; I/a Duty de PlfM
delay_ms(25J;
)

FIgura 34. Programa del eJemplo 6

165
7. Transmisi6n serie

Capitulo 1

Transmision serie

7.1 Introducc;on
Los PIC utili zan, entre otros, dos modos de transmision en serie:

• El puerto serie sincrono (SSP).


• La interfaz de comunicaci6n serie (SO) 0 receptor transmisor serie sincrono­
asincrono universal (USART).
El SSP se suele utilizar en la comunicaci6n con otros microcontroladores 0 can pe­
rifericos. Las dos interfaces de trabajo son:
• Interfaz sene de perifericos (SPI): desarrollada por Motorota para la cornu­
nicaci6n entre microcontroladores de Ia misma, 0 diferente, familia en modo
maestro-esclavo: Full-duplex.
• Interfaz Inter-Circuitos (FC): lnter.£az desarrol1ado por Philips, can una gran
capacidad para comunicar microcontroladores y perifericos; Half-duplex.
L(.Iconfiguracion USART (transmisor-receptor serie sincrono-asincrono universal),
tambien conocido como SCT (interfaz de comunicacion serie), permite la comunica­
cion can un ordenador trabajando en modo full-duplex asincrono 0 Con perifericos
trabajando en modo half-duplex. En general, puede trabajar de dos formas:

• Asfncrono (full-duplex).
• Sincrono (half-duplex).
Otros tipos de comunicacion soportados par los PIC son: J-Wire bus, UN (Local
Interconnect Network), USB (Universal Serial Hus), el CAN (Controller Area Nenvork)
y Ethernet,

167
Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC

7.2 EI modulo USART/SCI

7.2.1 rntroduccion
Algunos prc disponen del modulo de comunicacion serie USARTISCl, tal vez el
mas u tilizado entre los modules de interfaz sene,
La principal funci6n del USART es la de transmitir 0 recibir datos en serie. Esta
operacion puede dividirse en dos categorias: sincrona 0 asincrona. La transmision
sincrona uriliza una serial de reloj y una linea de datos, mientras que en la transmi­
sion asincrona no se envia la serial de reloj, por 10 que el ernisor y el receptor deben
tener relojes con la misma frecuencia y fase, Cuando la distancia entre el emisor y
el receptor es pequefia se suele utilizer la rransmision slncrona, mientras que para
distancias mayores se utiliza la transmision asincrona,

El USART puede transmitir 0 recibir datos serie. Puede transferir trarnas de datos
de 8 0 9 bits por transmision y detectar errores de transmision. Tarnbien puede ge­
nerar interrupdones cuando se produce una recepcion de datos 0 cuando la trans­
miston ha sido completada.

Algunos PIC tienen un USART direcdonable 0 AUSART (Add1'eSnbleUSARD que


utiliza el noveno bit de datos para disringuir entre Ia reception de datos 0 de direc­
cion. En algunos PIC se ha mejorado el modulo USART dando lugar a1 EUSART 0
USART mejorado, el cual permite la deteccion automatica de baudios, el despertar
automatico al recibir la serial de sincronismo 0 la transmision del caracter Break de
12 bits, permitiendo su utilizacion en sistemas de redes de interconexi6n local (bus
LJN).
Basicamente, 1a transrnision serie consiste en enviar los datos bit a bit a traves de
una linea cornun en periodos de tiempo fijos, dando lugar a Ja llamada velocidad
de rransrnision 0 numero de bits enviados pOTsegundo (baudios). Tanto el ernisor
como el receptor poseen registros de desplazamiento para realizar la comunica­
cion. Los bits estan codificados en NRZ (nivel alto: I, nivel bajo: 0), NRZI (cambio
de nivel: 1, sin cambio de nivel: 0), etc.

En eJ modo sincrono se permite la transmision continua de datos y no existe un


limite de tamaiio, es un modo semi-duplex (la cornunicacion serie se establcce a tra­
ves de una unica linea, en ambos sentidos, pero no se puede transferir informacion
en ambos sentidos de forma simultanea), En este modo de transmision se puede
trabajar de dos formes:

• En modo Maestro, donde el microcontrolador maestro genera la scfia! de reloj


e inicia 0 finalize la comunicacion.
• En modo Esclavo, donde el microcontrolador esclavo recibe la sefial de reJoj y
depende del rnicrocontrolador maestro para recibir 0 enviar informacion,

168
7. Transmisi6n serie

Datos

Reloj

Figura 1. Transmlsl6n sincrona

En el modo asincrono se emplean relojes tanto en el emisor como en el receptor.


Ambos relojes deben ser de iguaJ frecuenda y deben estar en Ease 0 sincronizados.
La frecuenda de reloj se aeuerda antes de la transmisi6n configurando la velocidad
miantras que Lasincronizacion se realiza durante Latransmision. Cada trama de
datos tiene lID tamafio fijo y poseen un bit initial 0 de arranque (start) y un bit final
o de parada (stop) que permiten realizar dicha sincronizacion, La transmision es
en modo full-duplex (se utilizan dos lineas. una transmisora -TX- y otra receptor a
-RX-, transfiriendo informacion en ambos sentidos: se puede transmitir y recibir
informaci6n de forma simultanea),

1 I 0 I I I I I I I I 11 ,____I
Bit start Bit stop

Figura 2. Transmlsl6n asincrona

El modo mas habitual de transmision par e1 USART es e1 modo asincrono, pues­


to que permite comunicaciones en largas distancias. Existen distintas normas de
transmision serie asincrona, como LaRS232, la RS485, etc. Los niveles de tensi6n
empleados en estas normas son diferentes al empleado par el PIC Por ello, suele
ser necesaria la utilizacion de circuiros extemos de adaptacion
Los terminales utilizados en el modulo USART son el RC6ffX1CK y el RC71RX1DT:

• En el modo sincrono maestro, el pin RC6rrXlCK se utiliza como seftal de reloj


(de salida) yel RC71RX1DT como linea de datos a enviar 0 recibir.
• En el modo sincrono esdavo, elpin RC6fIXJCK se utilize como sefial de reloj
(de entrada) y el RC7/RXlDT como linea de datos a enviar 0 recibir.
• En el modo asincrono, el pin RC6/TX/CK se utiliza como terminal de transmi­
sion de datos y elRC7/RXIDT como terminal de recepoon de datos.
Los registros asociadas a] modulo USARTISCT son:

• SPBRG: Generador del ratio de baudios.


• TXSTA: Estado de transmisi6n y control.

169
Compilador C CCS y Simulador PROTEUSpara Microcontroladores PIC

• RCSTA: Estado de recepcion y control.


• TXREG: Registro de datos de transmisi6n.
• RCREG: Registro de datos de recepcion.
• pml: Flag de internrpcion.
• PIE1: Habilitacion de Lainterrupcion.

Registro TXSTA (direcclon RAM: 98hJ (PIC16F87x1

RIW~ RIW"() RIW"() RIW..() u-o RIW"() RIW"()


I CSRC I TXEN I SYNC I SRGH I TRMT I TX9D
Blt7 SitO

Figura 3. EJregistro TXSTA

bit 7: CSRC: Bit de seleccion de la fuente de reloj.


En modo asincrono no interviene.
En modo sincrono:
1= Modo maestro (genera sefial de reloj mediante BRG).
0= Modo esclavo (fuente de reloj exterior).

bit 6: TX9: Bit de habilitacion de la transmision de 9 bits:


1 = Transmision de 9 bits.
0= Transmision de 8 bits.

bitS: TXEN: Bit de habilitacion de la transmision:


1 = Transmision habilitada
0= Transmision deshabilitada.
bit 4: SYNC: Bit de seleccion del modo del USART:
1 = Transmision sincrona.
o = Transmision asfncrona.

bit 3: No implementado. Se lee como O.

bit 2: BRGH: Bit de seleccion del valor de baudios.


Modo asincrono:
1 = Alta velocidad.
o = Baja velocidad.
No se utiliza en el modo sincrono.

170
7. Transmision serie

bit 1: TRMT: Bit de estado del registro TSR:


1= TSR vacio.
o = TSR !leno.
bit 0: TX9D: 9 bit de datos transmitidos. Puede ser el bit de paridad.

.'-.-.-."T~~~'~
'1"'1
!
,TX9=1 1 bit ;
'. --- _.- ------------ ---~

Figura 4. Esquemade' proceso de transmision

EI USART puede configurarse para transmitir 8 0 9 bit de datos configurando el


bit TX9 del registro TXSTA. Si se utiliza el Formato de 9 bits, el novena bit debe
colo carse 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 alregistro
de desplazamiento de transmision (TSR). Desde alli son transmitidos al cido de
reloj por el pin TX comenzando por el bit de start y terminando por el bit de stop.

Figura 5. £1envfo de las t.ramas

Registro RCSTAfdireccion RAM: 18b) [pIC16F87xl


RfW.Q RfW·O RfW·O RfW·O R.Q R.Q
SPEN I RX9 I SREN I CREN IOERR I RX9D
BitT BilO

Figura 6•.EJ regist.ro RCSTA

bit 7: SPEN: Bit de habilitacion del puerto serie.


1 = Habilitado (RXlDT Y TXlCK como puerto serie).
0= Deshabilitado.

171
Compilador C CCS y Simulador PROTEUS para Microconlroladores PIC

bit 6: RX9: Bit de habilitad6n de la recepcion de 9 bits.


J = Recepd6n de 9 bits.
o = Recepd6n de 8 bits.
bitS: SREN: Bit de habilltaci6n de recepci6n sincrona.
No utilizado en modo asincrono.
Modo sincrono:
1 = Recepci6n unica habilitada,
0= Deshabilitada. (5e pone a 0 despues de una recepci6n
completa).

bit 4: CREN: Bit de habilitacion de recepcion continua.


Modo asincrono:
1 = Habilitada.
0= Deshabilitada.
Modo sincrono:
1 = Habilitada hasta que e1 bit CREN 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).
o =No error.

bit 1: OERR: Bit de error de ooerrrun.


1 == Error (Se pone a 0 si CREN es 0).
O=No error.

bit 0: RX9D: 9 bit de datos transmitido

pin REGISTRO DE DESPLAZAMIENTO DE ENTRADA


I

1 bit 8 bit ~:I,


,"

j
j
9< ............
--r----, f\
j

; Buffer 0
, u.
u::
;
RX9=1 I RX9D I RCREG
............. -...-- -~-~
.. -
t!
Figura 1. EI esquema del proceso de la recepcion de datos

172
1. Transmision serie

El USART puede configurarse para recibir 8 0 9 bit configurando el bit RX9 del
registro RCSTA. Despues de 1a deteccion del bit de start, los 8 0 9 bits entrantes
por el pill RX son desplazados pOI el registro de desplazamiento de entrada (RSR)
uno a uno. Despues de que el Ultimo bit ha sido desplazado dentro, el bit de stop
es testeado y el data (el paquete de bits) es transferido a un bllffer el cual, a su vez,
10 transfiere al registro RCREG si esta vado. El buffer y el registro RCREG forman
Lilla FIFO de dos elementos (el primer dato que entra es el primer dato que sale). En
ei caso de transmision de 9 bit, el noveno bit pasa la bit RX9D del registro RCSTA
del mismo modo que los otros 8 pasan al registro RCEG.

Algunos dispositivos tienen un USART modificada, Ilamado AUSART 0 USART


direccionabie, que permite filtrar autornaticamente ciertas transmisiones. Los datos
recibidos son separados en dos categorias, direcdon y datos, que se indican por
el noveno bit. Solo los bytes de direccion son procesados por el USART, los datos
son ignorados. Este echo se utiliza normalments cuando hay varios dispositivos en
un bus y las transmisiones se direccionan a uno en concreto. Los dispositivos que
reciben Ia transmislon ignoran todos los bytes de datos con el noveno bit a 0 y solo
reciben los bytes de direccion con el noveno bit a 1. Cuando se recibe el byte de di­
reccion y coincide, el dispositive puede pasar a recepci6n normal y recibir el resto
de los datos. En este tipo de dispositivos el bit 2 del RCSTA es:
bit 3: ADD EN: Bit de habilitacion de deteccion de direccion
l=Habilitada (5610si RX9=1)
O=<Deshabilitada

~REGISTRO DE DESPLAZAMIENTO DE ENTRADA I


tili:;
ADDEN=1
RX9=1 I TEST I ,~~:~a solo si 1

..,.
..........., , 8 bit
,,
,.
1 bit , , ttl
.... '~

Buffer 0
IL

RX9D RCREG
u::
!",,,

Figura 8. Esquema del proceso de recepci6n en los AUSART

Registro SPBRG(0x99, [PIC16F87x1


La velocidad de ccmunicacion se controla par el valor cargado en este registro.
Genera el reloj que permite 1a comunicacion. La veloddad se expresa en baudios
(bit/s).

173
Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC

En modo asincrono:

BRGH=O(baja velocidad) BAUD/OS = lose


64· (SPBRG + I)

BRGH=l(alta velocidad) BAUD/OS = lose


16· (SPBRG + I)

En modo sfncrono: BAUDIOS = lose


4· (SPBRG + I)

Siempre hay que considerar un margen de error.

7.2.2 EI modulo USART en C


Configuraci6n generics del USART:
#USE RS232 (opciones)
Esta directive permite configurar varies parametres del USART: velocidad de trans­
rnisi6n, pins utilizados, etc. Se puede modificar en cualquier parte del program a
pero siernpre despues de habet definido la directiva ::USE DELAY. Esta directive
habiJita el uso de funciones tales como G£TCH, PUTCHAR Y PRINTF. Permite su
uso en dispositivos que no poseen modulo USART mediante software U5ART.
Cuando se utilizan dispositivos con USART, si no se puede alcanzar una tasa de
baudios dentro del ~% del valor deseado utilizando la frecuencia de reloj actual, se
generara un error.

BAUD=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.
Haee que la funcion GETC() ponga a cero el WDT
RESTART_WDT mientras espera un caracter.
Permite velocidades de transmision bajas en chips
BRGH10K
que tienen problemas de transmisi6n.

174
7. Transmislon serie

El pin especificado estara a nivel alto durante la


ENABLE=pin transmtsion. Utilizado en transmision 485.
Permite depuraci6n a traves del JCD. EI pin por de-
DEBUGGER fecto es el B3;usar XMJT y RCV para cambiar eJ pin
(debe ser el mismo en ambos).
Provoca que la funci6n GETCO borre el WDT si es-
RESTART _WDT
pera un caracter.
Invierte la polaridad de los pines serie (normalmen-
tc no es necesario con eJ convertidor de nivel, como
INVERT
el MAX232). No puede usarse con el USART inter-
no.
PARITY=X Donde X es N, E, u O.
Donde X es 5-9 (no puede usarse 5-7 con el USART
BITS=X interne).
FLOAT_HIGH Se utiliza para las salidas de colector abierto.
Indica al compilador que guarde los errores recibi-
ERRORS dos en la variable RS232_£RRORS para restablecer-
Los cuando se producen.
No se puede utilizar con USART interne. Provo-
SAMPLE_EARLY ca que el muestreo del dato a traves de la funci6n
GETC() se realice a1 principle de un bit de tiernpo.
Para FLOAT_HIGH y MULTI_MASTER, este pin se
usa para leer la serial de retorno. Por defecto, para
RETURN=pin
FLOAT_HIG! I es XMJT y para MULT/_MASTER es
RCV.
Usa el pin de RETURN para determinar si otro mas-
ter en el bus esta transmitiendo al misrno tiempo. Si
se detecta una colislon, el bit 6 se pone a 1 en RS232_
MULTI_MASTER ERRORSY todos los posibJes PUTCO son ignorados
hasta que el bit 6 este a O. La sefial es comprobada
al final y aJ principle de cada bit de tiempo. No se
puede utilizer con USART interne.
Permite manejar INT16 a las funciones GETC() y
LONG_DATA
PUTCO. En formatos de datos de 9 bits.
Provoca la deshabilitacion de interrupciones cuan-
OISABLE_INTS do se ejecuta GETCO y PUTCO evitando distorsio-
nes en los datos.

175
Compilador C CCS Y Simulador PROTEUS para Microcontroladores PIC

STOP=x Numero de bits de stop (por defecto 1)


Para establecer el tiempo que GETC() espera un ca-
TIMEOUT=x racter (en ms). Si no se recibe caracter en este tiem-
po, elRS232_ERRORS se pone a O.
Provoca una linea RS232 en modo esclavo sincro-
no, haciendo la patilla de recepcion como entrada
SYNC_SLAVE
de relo] y la de transmision como entrada/salida de
datos.
Provoca una linea RS232 en modo maestro sincrono,
SYNC_MASTER haciendo la patilla de recepcion como salida de reloj
y la de transmision como entrada/salida de datos.
Provoca una linea RS232 en modo maestro sincrono
en modo continuo, haciendo la patilla de recepcion
SYNC_MATER_CONT
como salida de reloj y la de transmision como entra-
da/salida de datos.
UARTl Configurar el XMlT y RCV para el USART1.
UART2 Configura! el XMIT Y ReV para el USART2.

Ejemplos:
#use delay (clock=2000000);
#-use rs232 (BACJD=9600, XMIT=PIN_C6 , RCV=PIN_C7 , BITS=8)
#use rs232 (BAUD=9600 , XMIT=PLN_A2 , RCV=PLN_A3)

setup_uart(baud)
baud es una constante que define la velocidad. Un 1 enciende el USART y un 0 10
apaga. Con cualquier valor de velocidad, el USART se enciende. En dispositivos
que utilizan AUSART se admiten los siguientes parametres:
UART_ADDRESS UART: solo acepta datos con elnoveno bit a 1.
UART_DATA UART: acepta todos los datos.
set_uart __speed (baud)
Identica a la funcion anterior.
II se establece la veiocidad mediante la combinacL6n de las patil1.as 80 y 81
swi t cn ( input_b () .. 3 ) l
case 0 ser_uart_speed(2400); break;
case 1 set:_uart_speed(4800) ; break;
case 2 set_uarc_speed(960D); break;
case 3 set:_uarr_speed(l920Q); break;

176
7. transmtslen serie

Transmision de datos:
putc (cdata)

putchar (cdata)
cdaia es un caracter de 8 bits. Esta funcion envia un caracter mediante la patiUa
XMIT. La directiva #US£ RS232 debe situarse siempre antes de utilizar esta fun­
cion.

puts (string)
string: cadena de caracteres constante 0 matriz de caracteres terminada con un O.
La funcion putst) rnanda los caracteres de la cadena, uno a uno, a traves del bus
RS-232 utilizando la funcion PUTCO; detras de la cadena envia un RETURN (13) Y
un retorno de carro (10).

printf (fname, cstring, values ...)


cstring: es una cadena de caracteres (constante) 0 matriz de caracteres terminada
con un O.
!IW/IIe: las funciones a utilizar para escribir la cadena indicada; por defecto se utiliza
Is funcion PUTCO, que perrnite escribir en el bus RS-232.

values: valores a incluir en la cadena separados por comas; se debe indicar %nt. EI
forma to es %nt, donde n es opcional y puede ser:
1-9 para espccificar cuantos caracteres deben ser especificados;
01-09 para indicar la cantidad de ceros ala izquierda;

1.1 - 9.9 para coma flotante.

t puede indicar:

c Caracter.
s Cadena 0 caracter.
u Entero sin signo,
d Entero con signo.
Lu Entero largo sin signo.
Ld Entero largo con signo.
x Entero hexadecimal (minuscules),
X Entero hexadecimal (rnayusculas).

177
Compilador C CCS Y Simulador PROTEUS para Microcontroladores PIC

Lx Entero largo hexadecimal (rninusculas).


LX Entero largo hexadecimal (mayUsculas).
f Flotante con truncado,
g Flotante con redondeo.
e Flotante en formato exponencial.
Entero sin signo con decimales insertados. La Ii cifra indica e1 total, la 2~
w
el mrmero de decirnales.

Recepcion de datos:

val ue=getcO

value=getchO

value=getcharO
tmlue es un caracter de 8 bits. Espera recibir un caracrer por la linea RS-232 y de­
vuelve su valor. En los dispositivos con USART interne, se pueden almacenar hasta
tres caracteres; para evitar esperas se puede usarla funcion KBHlT().

valor = kbhitO
taler es 0 (FALSE) si GETCO debe esperar a que llegue un caracter: 1 (TRUE) si ya
hay un caracter listo para ser Iefdo por la funcion GETC().
Ejemplo 1: Enoiar los datos del 0 allO, en modoaslncrono, entre dos PIC. Yisualizar con
un LCD los datos enuiados y los datos recibidos; la recepcion del data debera ser par inter­
rupcion del USART. (ver figura 10). Componenies ISIS: PICl6F876 y LM016L. lnsiru­
mentes: VIRTUAL TERMINAL.
ilinclude <l6r875.h>
#FUSES JIT,NOWDT
luse delay(clock=4000000)
fuse rs232(baud=9600, xmic=p~n_c6, rcv=p~n_c7)
#include <LCD.C>

void main () (
inc vaJ.or;
lcd_ini<: ();

while (l) (
for (va1.or=0;valor<=10;valor-'--)
rurctve ior) ;

178
7. Transmision serle

print[ (lcd_pute, "I fenviando-%lD", VALOR);


delay_ms (500);
}

Figura 9. Programa PIC_1de' ejemplo 1

AI hanumeric LCD
MO'ANO r;::=~~~===illCO'
env iando=9
_A~
~A1'AH' LMO'II.
FlA:)JAN?NPH
RA3IANlNREF ..
ffA4flOClo

e-evec

:~~~'T
, Ii'iWWppl'l1lV
AI hanumeric LCD
• RAO/NfJ
•• :;~~~lVre
r;::=====:::;==;llC02
I t"ec.ibiendo=9 CO',IIa,
R.UJ.Nl~Ft
RAAllOOKI
• MlI'N~
~~~ ~lw SoSS!888

II"Ovec

FIgura 10. EI eJemplo 1


Hinelude <16F876.h>
#P'USES XT,NOWDT
Huse delay(elock~4000000)
Huse rs232(baud-9600, xmit·pin_c6, rcv-pin_c7, bits-B)
'include <LCD.C>
HBYTE TRlSA-OX85

179
Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC

IBYTE PORTA=OX05
ine valor;
~_nt_RDA
RDA_isr()
(

vaior=GE!I'C();

void main()
bit_clear(TR!SA,O);
lcd_init () ;
en~Ie_inceLrup~s(INT_RDA);
en~ble_interrupts(GLOBAL);
for (;;) (
lcd_gotoxy(l,l);
printf (lcd_pul:C, "recibierrdo=%]J)", valor);

Figura' 1. Programa PIC_2 del ejemplo ,

Con el programa VIRTUAL TERMINAL (boton derecho: Hex display mode) se pue­
den visualizar los datos del bus serie (figura 12).

Figura 12. Virtual Terminal

7.2.3 La norma RS232


La norma RS232 es Ia mas habitual en 1a comunicacion serie, Basicamente cornu­
nica un equipo terminal de datos (DIE a Data Terminal Equipment) y el equipo de
comunicacion de datos (DCE a Data Contmunications Equipment).

Las caracteristicas electricas de la sefial en esta norma establecen que 1a Iongitud


maxima entre el DTE y el DCE no debe ser superior a los 15 metros y 1avelocidad
maxima de transmision es de 20.000 bps. Los niveles Iogicos no son compatibles

180
7. Transmisilin sene

ITL, deben situarse dentro de los siguientes rangos: Llogico entre -3V y -15V Y0
logico entre +3Vy +15\1. Se utilizan conectores de 25 patillas (DB 25) 0 de 9 patillas
(DB 9) siendo asignado el conector macho al DTE Y el conector hembra a1 DCE.

Para una com unica cion full duplex desde el USART del prc, se debe conectar un
mfnimo numero de sefiales, TXO y RXD asi como la masa (GNU). Los PIC utilizan
sefial TTL en el modulo USART por 10 que se debe utilizar un conversor de nivel a
RS232, como el MAX232.

NIVElES TTL ..... __ ...

Figura' 3. Conexion basica fuU duplex entre PIC y PC

En Ia mayoria de los PC actuales, sobre todo ellos porta tiles, estan desapareciendo
los puertos serie. Como solucion se pueden utilizar cables de conversion SERlE­
USB que utilizan el Unioersal Serial Port (USB), no se debe confundir con la utiliza­
cion del modulo USB integrado en el PIC can gestion de comunicacion USB (ver
la figura 14).

BUS USB BUS USB

DISPOSITIVO
Modulo I
INTERFAZ
SERJE-USB BUS I USB

SERlE PIC PIC

FIgura '4. Dlferencla entre un convertidor serie-usb y un mOdulo USBintegrado

Estos cables (ver Ia figura 15) se basan en integrados como el FT232BM de FillI
chip (figura 16) (http://wwwjtdichip.camfProducts/FT232BM.hhn). En Ia propia Web
del fabricante se pueden encontrar los drivers para la configuracion de windoioe
(figura 17) y los disefios de un sistema de conversion SERIE-USB.

181
Compilador C CCS y Simulador PROTEUSpara Microcontroladores PIC

Figura 15. Cable SERlE-USB

Figura 16. FT232BM

-JO )(

• .!!I Adoot_ do ".....011.


, ~_"do,od
• y' Adoi>t_~
..... Add:odoI'tJ ~
'!l~
, ~~or"._"doW.$<o."""",'"
, _j Cfdrolador .. 1IlEAlA/AT"'"
, ._j Cor<,....,... .;.~
+ tJ~doW..".,,.
I .,~.,lYoodo_
+ ~ ""Q•• to_ do1OOIdo. YIdeo ~ '*00>
,!lEllUlX'
• .. It-MOIQItoISol"<IPII>AU""
.o!.),~
•!!d'-"
I )",_yot,oscl_"",JCiloIodor ..

_to
- ..IP1Jett"(C~Il<lPt)
.y do """""' __
:I Puzl9iltffll!_tt<)I.!-(\l'II)
(COM')

lot ~ s..'"
Po-t (COI'1S)
,, .u lee""""
..J i.l'>dodos do d<c>l
, "*,,~dediq.tel.

Figura 17. Universal Serial Port

Bl/STS del PROTEUS proporciona un potente cornponente que permite la simula­


cion a traves del puerto serie: COMPIM (figura 18).

182
7. Transmisi6n serle

o E.RRCR 0
COMPIM

FIgura 18. £1 componente COMPIM

Utilizando este componente no es necesario aiiadir al esquema del PIC un MAX232,


ya que el propio components gestiona la comunicacion con el puerto del PC, Utili­
zando este componente podemos cornunicarnos con el propio PC (si tiene 2 puer­
tos serie 01 puerto serie y un puerto USB -utilizando el convertidor- como pode­
mos ver en la figura 19) y rnanejar los datos que proceden del PIC con cualquier
programa de aplicacion (Visual BAS1C, visua! C, etc.).

COM1 CABLE SERlE


COM2 HEMBRA-HEMBRA

CABLE
HEMBRA-HEMBRA
+ USB-SERlE

Figura 19. Las conexlones serle-serle 0 serle-usb

183
Compilador C CCS Y Simulador PROTEUS para Microcontroladores PIC

La configuraci6n del puerto se realiza como en cualquier componente y se pueden


cambiar practicamente todas las propiedades de un puerto serie: ruimero de puer­
to, velocidad, paridad, runnero de bits, etc. (ver la figura 20).

~~"'er>e~- pj
CoMponent ~4AJe: caMPtI-!

VSM MQdeI HI<IeAl

~$i:<>Ipon: colon • HeAl


~8.oudA. rwr • HlCleAR
PhylicalO!lla8~o: '8 • HldeAl
~Parlt;r. HONE --=:------. tHideAl

2-400
V_8>lodRat.:
Virtual 0«.Bitsc '8
-~• HmAi --
....
HideAl
Virt\ralP~; tlmlE • HIdeAl

Eo..de hom~,"",la(Jon
EdxlehOlllPCS!.~
E6I ~ PlOI>I!'1*ml<>ld

Figura 20. Configuracion COMPIM

Ejemplo 2: Enoiar los datos de una conversion AD al puerto serie de Ill! PC (figura 21).
Camponentes 1515: PTC16F876, COMPIM, POTLIN Y LMOI6L. htstrumentos: DC VOL­
TMETER Y VIRTUAL TERMINAL.

Para probar este ejemplo se pueden utilizar dos PC 0 un PC can dos puertos serie 0
un PC con un puerto serie y un puerto USB (utilizando un cable SERIE-USB).

Para observar los datos que envia el PIC se utiliza un COMPIM y tambien se puede
utilizar un COMPlM para leer los datos que entran por elPCo, eneste caso, utilizar
elHyperTermillnl de Windows 0 cualquier otro program a emulador del puerto serie.
Par el Virtual Terminal se pueden comprobar los datos de salida y entrada. En este
caso se han conectado los dos puertos serie del PC (COM1 y COM2 con un cable).
Se puede utilizar el HyperTerminal de Windows (Accesorios/Comunicaciones/HyperTer­
minal), configurandolo segun las siguientes figuras: figura 23, figura 24, figura 25,
figura 26 y la figura 27. En este caso se han conectado el puerto COMl del PC Yun
USB configurado en COM6.

184
Figura 21. EIejemplo 2

Figura 22. Virtual Terminal de salida (COM 1) Y entrada (COM2): las pantallas son Identicas

E:crilaLlflra;ob~y-8a~IC'QI'IOPllq-fa~
NolIi:e:
EJ£MI'l.ll ~
lcaa

Figura 23. EInombre de la conexJ6n

185
Compilador C CCS y Simulador PROTEUSpara Microcontroladores PIC

~ EJEMPL02

C6tigo de .§lea
» odu
, one

(hedN wando. COM1


~lrn~M~1r-------------~
COMZ
§Itt.

Figura 24. La seteeeten del puerto (COM' en el PROTEUSy COM6 en el HyperTerminall

Bhpco __ rn._••

Figura 25. La configuracion del puerto

-_. EOIuXI Vet


tiU!'l'<ACOI1!":cn

_dar ..
~di.'amo.
C«"Irpft !'.!ON,..
IJiItIn;!t tf.-dor..

C;:. %1 .g

Figura 26. EI comando Archivo/Propiedades para modificar fa visuaJizaclon

186
7. Transmision serie

Conocl.. Ccrill)l.r~

_.."''''''''''I
• Itdlnllll''''''''''

.~"-:I.I'I'I ~~?1'n,j = E"",""oe"I1i9o!C!OI"IPt:~:hljne&


Cl~.H Supo CJMI.E .... " (I~.a w £..... 10< ... """" ..... "'_

2: ~~da'jMs!llWClClcaddli""l~
InleI7ttf.-~elel ~-CCJit'IoASOI cte 7 bib
'" AjUll!l' IlneO}4'& rot.!petd'l. aneho de temw:aI

Frgura 27. Act;var ~Agregar avance de IInea ...··

SilVol laDe = 2.49V


511 Voltall'! = 2. 49V
511 Vol t"'....= 2.49V
SU'Iollllve 2.49V
511 Volt age ~ 2.'-9V
Sll Voltage = 2.49v
Stl Vollage = 2_49V
511 Volt.09 • 2.49V
511 Voltaoe • 2.49V
;!,p Volloge = 2.49V
... 1 Voll.ge = 2.49V
511 VolI_lie • 2.49V
S11 Vol taSIQ 2.49V

Figura 28. La simulaclon entre PROTEUSy el PCutJlizando el HyperTermlnal

187
Compilador C CCS Y Simulador PROTEUS para Microcontroladores PIC

linclude <16F877.h>
JdeviCii! adc:lO
ffFUSES XT, NOWDT
luse delay(clock=400000D)
luse rs232(baud=96DD, xmit=pin_c6, rcv=pLn_c7, b~rs=8, paricy=N)
#~nclude <LCO.C>

void main()
lnU6 q;
float p;
setup_adc_ports (AND);
setup_adc(ADC_CLOCK_INTERNAL);
lcd_ ini t ();
for (;;) (
set_ adc_channel (0);
de1ay_us(10) ;
g = read_ade();
p = 5.0 w q / 1024.0.
prin tf (lcd_putc, "\fADe = '"Hd", q);
printf(lcd_putc, "\nVolt.3qe = %Ol.2fV", p);
prinr;f("ADC : -%4.ld .. , q);
princf("Voltage = ~01.2fV\r", p); II \r permi'ce camhiar de l~nea.
delay_ms(100);
}

Figura 29. E. programa de. ejemp.o 2

Ejemplo 3: Enuiar 1111 dnto desde el PC al PIC pOl' el puerto serie. Cuando 10 reciba debe vi­
sualizarlo en uu LCD y enuiar In paiabra "recibido" al Pc. Emplear interrupciones (figura
31). Componenies ISIS: PICl6F876, COMPIM Y LM016L.
linclude <15F876.h>
#FUSES XT,NOWDT
#use delay(clock=4000000)
Huse rs232 (baucJ=9600, xmit"'Pin_c6, rc~in_c7, b1ts=8, parit:y=N)
#include <LCD. C>

cnes: ChI

lint_rda
void seri~l_isr() (
ch=aexcner () ;
pur;s("~ecibidD");

188
7. Transmision serie

void main ()

J cd_wit () r
enable_incerrupts(global);
ellable_incerrupts (int_rda) ;
whi Le t l ) ,
printf(lcd put:c, "\n\r Valor 8c",ch);
)

Figura 30. £1programa del ejemplo 3

nUl OI>C"CUltl
oselAKOUT
MeIJI_' ,,- ··
lIl!Q."""
"".
~
..~
12 Alphanumeric LCD
AAIlIAlIl "'"
_

I f<A'-
M.·...
N7MO£I'.
~"'A.Nl!'~
.onoc.cl
I'lIII
;8I.ror;:
R67.'Fm
"""'-rl~":'"
· I Ualor I
-i
"",.,..,ss ~B::!
>,. ili .. 8011i!aSlHi
itt:~r'OSVCCP2
RC.VccP1
'lCa/S¢i<Ald. 1~
4 1~ I~J~I'I"f·•••

~""""DO
qcT~
t;-J
P'IC~t5"m
OIO)IA:)C

P1

I
-£.
"* "'""
"""
To "TS
-¥.- ~ '0
:E on. RI

0"",,,,,0

Figura 31. EI ejemplo 3

(~nflr)lr"cilin ASCII ., I!D~


"\I",,,,",,",5CII
121 Enyi.. lit do Ifn... ccn 1004'0'....,.1 de linea
o Ec:odeloo""'ac!eI
... _loxa"'-.
R_dod.lr~ 0
R~I«dod.
c!I'AtIe'(

,>J,fd!.ASO
l~l
Agtegl.. yOl'Ce de hneulfllal ere oat:i511nu Ildttda
o 1018",,_ c~ eres ,.obJoto"""", ASOI de 1~
(3 ~I II".,., que tcbI.p.r.en.of _hodo ~

Figura 32. Configuraclon del HyperTermlnal para


EnviarjRecibir

189
Compilador C CCS y Simulador PROTEUSpara Microcontroladores PIC

Fl_ ~
D~ ~ dUll !ilia .. +,.:,",.i!I C ... r.." rJ ~r:: a '[,"
"",,~
Ar\tM ~ .... u.... l'.:o'o!>olf ~

D~ :; n1!J ~
..
~~
'" ..
o iWri\!ii ,_
Ii 1~t'~r.'1J1ITI
Rocibldo
lRecibido r:,
~ If\'PJIID',u"'tfll.Al. 2Rec;buJo
U;DllD

E'··.."....~r
L. lloltliL JRftcibido _ I..--_-At"~.,_..'c:p:::;'l~ I,:
U:'~I;
I"" "'<m
..,..~en
- t.tIJIiI£s.e~r
2Recilndo 11 ..:- > [:i
t..

4J]
Mp.j~(iZJ;.R
~I!ecibldo
~ ~tl~~ i:
iii' ~lUW
""""""'"
/ PlJUlIr - :i
a ~'11
o r f:
l'\ -.:t:
~.~
C8
.-
-
1-
,\
•• Ii
~~r!i.-"flI"*""~
.. _ ...., ¥

--
.,_;;_ [::
I',
i:;
ii
- - :!~..
c ~- ,. , • o 10"'..... ./'t .. _'oco ....
" 'J=n)(.'IJ .. c. )11'" ,.,.g IIi!
'~-'-':_-'"',~~~ ~. ~. "-.

Figura 33. Comun'cacl6n full duplex con el PC

7.3 Puerto serie sincrono (SSP)


Los dos modos de trabajo son:

• Interfaz serie de perifericos (SPT): Desarrollada por Motorota para la cornu­


nicaci6n entre microcontroladores de la misma 0 diferente familia en modo
maestro-esclavo. Full-duplex.
• Interfaz Inter-Circuitos (FC): lnterfaz dcsarrollado por Philips, con gran capa­
cidad para comunicar rnicrocontroledores y perifericos. Half-duplex.

7.3.1 Interfaz Inter·Circuitos (J2CJ


EI bus PC se basa en la cornunicacion a traves de 2 hilos. Cada dispositive co­
nectado al bus tiene una direcd6n. Puede configurarse como comunicacion de un
maestro y varies esclavos 0 una configuraci6n Mllltimaestro. En ambas configura­
ciones, el dispositivo maestro es el que tiene la iniciativa en la transferencia, decide
con quien se realiza, el sentido de la misma (envio 0 recepci6n desde eJ punto de
vista del maestro) y cuando finalize. Cuando el maestro inicia una comunicacion,
primero transmite la direccion del dispositivo con el cual sc quiere comunicar y los
esclavos comprueban si la direcci6n concuerda con la suya. La transmision puede

190
7. Transmisi6n serie

ser de lectura 0 escritura, el ultimo bit de la direction 10 indica; asi el maestro estara
en transmision y cl esc1avo en recepci6n 0 viceversa, En cualquier caso la senal de
reloj la genera el maestro.

Los dos hilos del bus PC son dos Iineas de colector abierto: la sefial de reloj SCL
o pin RC3 y la linea de datos SOA 0 pin RC4. Se deben utilizar unas resistencias
externas 0 de pull-up para asegurar un nivel alto cuando no hay dispositivos conec­
tados a) bus.
EI nurnero de dispositivos conectados y la longitud de conexi6n estan limitados
por 10 capacidad de dircccionamicnto (de 7 a 10 bits) y por la maxima carga del bus
(400 pF). La velocidad maxima estandar es de hasta 100 Kbps, la rapida hasta 400
Kbps y 10 Alta hasta los 3.4 Mbps

IC()J

Figura 34. Cafculo del valor de RL en 'unclon de la capacldad y


velocldad del bus ,cortesia de ST)

La trensmlsion se inicia con W1 bit de inicio 0 START}' termina con el bit de finali­
zacion 0 STOP. STARTse establece con una transicion de alto a bajo en la linea SOA
(normalmente a nivel alto) cuando 1alinea SCL esta a nivel alto. STOP se establece
cuando se produce una transicion de bajo a alto en Ia linea SOA cuando SCt esta
a nivel alto; de esta forma los datos en la linea SOA s610 cambian en el estado bajo

_____
u
de la Iinea SCL (figura 35).

ART

SOA

sel
s

Figura 35. Condiciones de la transmlslon

191
Compilador C CCS y Simulador PROTEUS para Mlcrocontroladores PIC

AI iniciar la transmisi6n, el master envia la direcci6n del esc1avo con e) que desea
establecer la comunicacion. La direcci6n puede ser de 7 0 10 bits con forma to de
byte (uno 0 dos bytes respectivamente). Tras la direccion se adjunta un bit de lee­
tura/escrirura (figura 36).

DIRECCION DE 7 BITS
Sumlnlslrado por el Maestro

Dlrecc:16n de 7 bit. dol Esclavo

DIRECCION DE 10 BITS

Primer byte .umlnl8lrado por 81 Maestro rr:.Del Esclavo


,

Segundo byte 8umlnlstrado POt 81M..".lro

Figura 36. Los formatos de dJreccl6n

Una vez el master envia la direcci6n (0 datos), el esclavo genera un bit de reco­
nocirniento (ACK), si el master no recibe este bit la comunicacion se interrumpe,
generando la sefial de STOP. EI maestro tarnbien puede recibir datos, en este caso
es el quien genera la serial de reconocirniento para cada byte recibido menos para el
ultimo, en este caso el esclavo libera Ia Hnea SDA y el master genera un STOP.
Existe la posibilidad de que el master, tras una transmision/recepcion, no abando­
ne el bus y siga en comunicacion con el esclavo; en esta ocasion genera una nueva
condition de START, Hamada START REPETTDA (Sr), identica a la anterior pero
despues de un pulso de reconocimiento.

En los PIC de Ja gama media existen dos modules que permitcn realizar una cornu­
nicacion PC, el BSSP (Basic SyllchroJ/ous Seria! Port) y el MMSP (Master SYllchrollolls
Serial Port), y se diferencian en modo de trabajo maestro. EI m6dulo MSSP permlte
detectar condiciones de START y STOP por interrupcion. Este modulo puede tra­
bajar en tres mod os:

• Maestro.
• Esclavo con direccion de 7 bits.
• Esclavo con direcci6n de 10 bits.
Los registros asociados a este modulo son seis: SSPCON, SSPCON2, SSPADD,
SSPBUF, SSPSTAT y el SSPSR.

192
7. Transmisi6n serie

Reglstro SSPSTAT,dlreccion RAM: 94h) [PIC16F87x]


R/W.O R/W..o R·O RoO RoO R·O RoO
I SMP I eKE lOlA Is IUA I BF
BII7 BilO

Figura 37. EI reglstro SSPSTAT

bit 7: SMP: Bit de muestreo.


SPI en modo maestro:
1 - EI data se muestrea al final de ciclo.
0= EI dato so rnuestrea en el media del ciclo.
SPI en modo esclavo:
SMP debe ponerse a '0' cuando se trabaje en modo esclavo.
PC en modo master 0 esclavo:
1 = Deshabilitacion del control Slew rate para una velocidad
estandar (100 \<Hz i 1 MHz)
0= Habili taci6n del control Sieu: rate para alta velocidad (400 kHz)

bit 6: eKE: Selecci6n de flanco de reloj en modo SPI.


CPK=O
1 = EJdato se transmite en eJ flanco de subida de CKS.
0=£1 dato se transmite en el flanco de bajada de CKS.
CKP=l
1= £1 dato se transrnite en eJ flanco de bajada de CKS.
0= Bl dato se transmite en el flanco de subida de CKS.
PC en modo master a esclavo:
1 = Niveles de entrada can forme especificaciones 5MBUS.
0= Niveles de entrada conforme especificadones Pc.

biL5: D/A: Bit de datos/ direccion (solo en el modo FC).


1 '" Indica que el ultimo byte recibido 0 transmitido era un data.
0= Indica que el ultimo byte recibido 0 transmitido era una
direccion.

bit 4: P: Bit de Stop (5610en el modo J2C).


1 = Indica que ha sido detectada una condici6n de Slop.
a =- No se he detectado la condicion de Stop.

193
Compilador C CCS Y Simulador PROTEUS para Microcontroladores PIC

bit 3: S: Bit de Start (5610en el modo rC).


1 = Indica que ha sido detectada una condicion de Start.
0= No se ha detectado la condici6n de Start.
bit 2: R/W: Bit de Lecrura/ Escritura (5610 en el modo PC). Este bit retiene la
informacion de lectura 0 escritura despues de la Ultima deteccion de di­
recd6n correcta. S610es valido desde la confirmad6n de direccion hasta el
siguiente bit de Start, Stop 0 no ACK
En PC modo esdavo:
1 = Lectura.
0= Escritura.
En PC modo master:
1 = Transmision en progreso.
0= Transmisi6n en no progreso.
bit 1: UA: Actualizacion de direccion (solo en el modo PC de 10 bits).
1 = Se necesita una actualizad6n de direcdon en el registro SSPADD.
I
0= La direction no necesi ta una actualizacion.
bit 0: BF: Bit de bttJfe:r l1eno.
Recepcion (mod os SPI e PC):
1 = Recepcion compte tad a, SSPBUF esta lleno.
o = La recepcion no ha finalizado, SSP-SUF esta "ado.
Transm ision:
1 = Transmision en proceso, SSPBUF lleno.
o = Transmisi6n completa, SSPBUF vacio.

Reglstro SSPCON (direccion RAM: 14hJ [PIC16F87xj


RIW-O RIW-O RIW-O RfW-O RIW-O RlW-O RlW-O RIW-O
I wcoi, I ss=ov I SSPEN I CKP I SSPM3 I SSPM3 I SSPM1 I SPMO f':
ir

Bit7 BilO
~~f'

Figura 38. EI registro SSPCON

bit7: WCOL:Bit de deteccion de colision.


Modo master:
1= Se ha produddo una escritura en SSPBUF sin que las condiciones
del PC sean validas.

194
7. Transmisi6n serie

o = No hay colision.
Modo Esclavo:
1 = El registro SSPBUF ha sido escrito mientras se realizaba una
transmislon previa.
0= No hay colision,

bit 6: SSPOV: Bit de ovel:f!ow (debe ser borrado par software).


En modo SPI:
1= Un nuevo dato se ha redbido cuando aun no se ha lefdo el data
anterior almacenado en SSPBUF. E1dato del registro SSPSR se pier­
de y se mantiene el anterior. 5610 se produce OllL>rJlOW en modo
esclavo.
0= No hay ooetfkno.
En modoFC:
1 = Un nuevo byte es recibido cuando aun no se ha leido el registro
SSPBUF donde se encuentra eJ byte anteriormente recibido.
O=No hay overflow.
bit 5: SSPEN: Bit de habilitacion del puerto serie sincrono.
En ambos modos, los pines han de ser correctamente configurados como
entradas 0 salidas,
En modo SP]:
1 = Habilitacion del puerto serie y configura cion de los pines SCK,
SDO, SDI YSS como fuente del puerto.
o = Puerto serie deshabilltado y pines configurados como ElS.
En modo PC:
1 = Habilitacion del puerto serie y configuraci6n de los pines SDA y
SeL como fuente del puerto.
o =Puerto serie deshabilitado y pines configurados como E/5.

bit 4: eKP: BHde seleccion de la poJaridad del reloj.


En modo SPI:
1 = El estado de reposo para e1.relojes el nivel alto.
0= El estado de reposo para el reloj es el nivel bajo,
En modo PC esc1avo: (control de liberaci6n de SCK).
1 = Habilitaci6n del reloj.
0= Mantiene e1 relo] en estado bajo.

195
Compilador C CCS Y Simulador PROTEUS para Microcontroladores PIC

bits 3:0 SSPM3:58PMO: Seleccion del modo del modulo SSP.


0000 = SPI, modo maestro, reloj = Fr::f5{.J4.
0001 = SPI, modo maestro, reloj = Fosd16.
0010 = SPT, modo maestro, reloj = Fosc/64.
. 001] = SP~ modo maestro, reloj = Salida del TMR2/2.
0100 = SPI, modo esclavo, reloj = pin 5CK, pin 5S habilitado.
0] 01 = SPI, modo esclavo, reloj = pin SCK, pin 58 deshabilitado,
Puede usarse como pin de E/S.
0110 = PC, modo esclavo, direccion de 7 bits.
0111 = PC, modo esclavo, direccion de 10 bits.
1000 = PC modo master, reloj=F".//4"(SSPADD+l».
1011= FC en modo maestro controlado por firmuare (esdavo inactivo).
1110 = PC en modo maestro control ado porjirn1llmre (direccion 7
bit con interrupcion de bit START Y STOP).
1111 = PC en modo maestro controlado por ji nnware (direcdon 10
bit con interrupcion de bit START YSTOP).
1001, lOla, 1100, 1101 = Reservado.

Registro SSPCON2 Idireccion RAM; 91 h) [PJC16F87x].


R1W-O RIW-O R1W-O R1W-O R1W-O R1W-O R1W-O R1W-O
GCEN I ACKSTAT I ACKOT I ACKEN I RCEN I PEN I RSEN I SEN 'H
Blt7 auo
;",-~~-£;~ ,._,. ~[
Figura 39. EI registro SSPCON2

bit 7: GCEN: Bit de habilitacion llamada general (5610en modo PC esclavo).


1 = Habilita la interrupcion cuando se recibe una Hamada genera]
(direccion OOOOh)en el SSPSR.
0= Deshabilitado.

bit 6: ACKSTAT: Bit de estado de reconocimiento (solo en modo PC master).


En modo master transmision:
1 =No recibido ACK del esclavo.
0= ACK recibido del esclavo.
bit 5: ACKDT: Bit de dato de reconocimiento (s610en modo PC master).

196
7. transmlslen serie

En modo master recepcion: Valor que sera transmitido cuando e1usuario


inicie una secuencia de reconocimiento a] finaJ de una reception:
l=NoACK.
O=ACK.

bit 4: ACKEN: Habilitacion secuencia de ACK (solo en modo FC master).


En modo master recepcion:
1 = Inicia secuencia de reconocimiento de SOA y SCL, Ytransmite
un ACKDT. Borrado por hardware.
0= Desactivado.
bit 3: RCEN: Bit de habilitacion de recepci6n (s610en modo PC master).
1 = Recepcion habilitada.
0= Deshabilitada.
bit 2: PEN: Habilitation de la secuencia de STOP (solo en modo FC master).
1 =Inicia condicion de Stop en SDA y seL. Borrado por hardware.
0= Deshabilitada.
bit 1: RSEN: Habilitacion de) STARTrepetido (solo en modo PC master).
1 = Inicia la condidon de SR en SOAy sa. Borrado por hardware.
0= Deshabilitada.
bit 0: SEN: Habilitacion del START (s610en modo PC master).
1 = IniOOla condition de START en SDA y SCL. Borrado por hardware.
o = Deshabilitada.
El resto de registros son:
• El registro SSPBUF (direccion Ram: 13h) es un buffer de transmision/recep­
cion serie: es el registro desde e1cual se leen 0 escriben los datos a transmitir.
• El registro SSPSR es un registro de desplazamiento SSP (no accesible direct a­
mente). Desplaza e1 dato para transmitirlo 0 recibirlo. En una transmision, el
dato se escribe desde el registro SSPBUF, mientras que en una recepcion, se
carga el dato de SSPSR a SSPBUF.
• EI registro SSPADO (direccion Ram: 93h) define Ia direcci6n de1 esdavo 0
los baudios de Ja comunicacion del master. En este registro se almacena la
direccion del esdavo; en el modo de 10 bits primero se debe cargar el byte aJto
(1111 0 A9 AS 0) Ydespues el byte bajo (A7:AO).
Otros registros relacionados con el modulo MSSP son el TRISC (direction Ram:
87h) para definir RC3 y RC4 como entradas, E1 PIRlIPIEl (direcciones Ram:

197
Compilador C CCS Y Simulador PROTEUS para Mlcrocontroladores PIC

OO1/SO,) para la gestion de interrupdones (SSPIF/SSPIE). EIpm2lPIE2 (direccio­


nes Ram: OOh/8Dh) para la gestion de la interrupclon por colisi6n del bus (BCLIF/
BCLlE) Yel INTCON (direcciones Ram: OBh/SBh/10Bh/18Bh)para la habilitacion
de las interrupciones de perifericos,

7.3.1.1 12C en C
Configuraclon generica del FC:
Ituse 12C (opciones)
Opciones: separadas por comas, pueden ser las siguientes:

MULTI_MASTER Establece modo Multirnaestro.


MASTER Establece modo maestro.
SLAVE Establece modo esdavo.
SCL=pin Especifica el pin SCL.
SOA=pin Especifica el pin SOA.
ADORESS=nn Especifica la direcci6n en modo esclavo.
FAST Utilize velocidad alta.
SLOW Utiliza velocidad baja.
RESTART_WDT Barra e) WDT mientras espera una lectura.
FORCE_HW Utiliza las funciones PC hardware.
NOfLOAT_HIGH No permite sefiales flotantes.
5MBUS Utilize el bus en formate 5MBUS.
-.
STREAM=id Asocia un identificar stream.

Esta directiva (#USE 12C) tiene efecto sobrc las funciones 12C_START, 12C_STOP,
T2C_READ, T2C_WRITC e 12C_POLL. Se utilizan funciones software a menos que
se especifique FORCE_HW. EI modo esclavo 5610 pucde sec usado can el modulo
ffsico SSP.
fuse 12C(master, sda-PIN_BO, scl-PIN_Bl)
fuse I2C(slave, sda-PIN_C4, scI-PIN e3, dddress~OxaO, rORCE_HWI
Nuse 12C(mast~r, sci-PIN BO, sda-PIN_Sl, tasc=4S0000)

Las funciones asociadas son


• 12C_WRITEO.
• I2C_STARTO.

198
7. Transmlsion serie

• 12C_READO.
• 12C_STOPO.
• I2C_POLLO.
• I2C_ISR_STATEO.
• 12C_SlaveAddr().

I2C_STARTOi
En modo master, esta funcion inicializa la transrnision. Despues de la condid6n de
Start, el reloj es puesto a nivel bajo hasta que se escribe con la fund6n 12C_WRlT£().
Si se llama a otra funci6n 12C_START antes de un 12C_STOP se esta utilizando un
START rcpetido (Sr). Esta funcion dependera de Ja respuesta del esclavo.
i2c_start (); IITnicializacion de la transmision
i2c_write (OxaO); IIDireccion del esclavo
12c_write(iJddress),­ IIDatos a esclovo
i2c_start () i IIRestact
i2c_write(OKdl); IICambio it lectu~a
as ta-12c_l"ead (0) ,- /IDatos del esclavo a1 master.
12c stcp(J; IIFinalizacion de la transmision

12C_STOP 0;
Finaliza la transmision.

12C_WRlTE(dato);
Dato es un entero de 8 bits que envla por el bus. En modo master, esta funci6n
genera la senal de relo] que marca la veJocidad de transmision del dato: en modo
esclavo espera la serial de reloj que genere el maestro.
Devuelve eJ bit de reconocimiento ACK que envla eJ receptor cuando la transmi­
sion ha terminado: 0 indica ACK, l indica un NO ACK Y un 2 indica una colision
en modo multi master.
EI bit de menor pes or (Isb) deJ primer dato transmitido tras un START indica el sen­
tido de la comunlcacion (si el bit es "0", 1a informacion se transmltira de maestro
a esclavo).

dato = 12C_REAO({ACKJ)i
Date es un entero de 8 bits leido del bus. En modo master, esta funci6n genera la
sefial de reloj; en modo esclavo espera la serial de reloj. No hay timeout por 10que
se l.1tilizajunto con 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 rnientras se espera a leer el dato, para ello se
debe incluir 1a opcion RESTART_WDTen la directive [use i2c().

199
Compilador C CCS y Simulador PROTEUSpara Microcontroladores PIC

valor = 12C_POLLOi
Se utiliza 5610 si el PIC tiene modulo SSP. Devuelve un TRUE (1) si se ha recibido
el dato en el buffer y un FALSE (0) si no se ha recibido. Cuando devuelve un TRUE,
la funcion 12C_REAOO guarda el dato leido.

I2C_SlaveAddr(int8 adr);
Se especifica la direccion de] dispositivo en modo esclavo.

estado = l2C_ISR_STATE();
Se utiliza solo si el PIC tiene modulo SSP. Devuelve e) estado del bus en modo es­
clave despues de una i.nterrupci6n.
Estado es un entero de 8 bits:
0= Indica direccion coincidente can un R{W a cero.
1-0x7F = El master ha escrito un data, se debe utilizer l2C_READ{).
Ox80 = Indica direccion coinddente can un R/W a uno, responder can 12C_
WRITE().
Ox81-OxFF = Transmision terminada y reconocida, se responde can 12C_WR!TE().
Ejemplo 4: Guarder y leer datos ell las 10 priiueras posiciones de memoria de IIIIll EE­
PROM PC. Representor los vnlores escritos y leidos en till display LCD (Figura 40). COIII­
ponentes ISIS: PIC16F877, M24512, RES Y LM016L. lnstrumentos: 12C DEBUGGER.

.. 0I011C1.I<H
OKI'C1.1<OU!'
WCI.-HNJ ........ '"
• ffAOI"~
• kAl'AAI
fW)••..,.,_
~AAI,VAEF.
IoUI,.&Jfoocr
p",,_
~[,,_A!5
kE\IANr!MH
"l:rt""10

Figura 40. EIejemplo 4

200
7. transmislen serie

La EEPROM PC 24512 ttene un byte de control (figura 41) donde la parte alta tiene
un valor fijo (Ah) y la parte baja consta de Ia direccion impuesta en sus patillas
(E2:EO)y el bit de lectura/escritura, de tal forma que si se fijan las entradas de di­
recci6n amasa, el byte de control puede tener los valores AOh para escritura y Alh
para ledura.

O.VU:'l'yp' td.nbllllr Chip En3bl. AdOI.,. fffl


:ii'
1.1 en tl5 bJ b3 1)2 D b!l

I I I I 1 Ell
.=J
Cew ... f!."If"ctCod. I 0 I 0 E2 E' RW

Figura 41. Byte de control del 24512 [eertesta de STJ


EI formate de escritura es el mostrado en la Figura 42, donde tras un START se es­
cribe la palabra de control para seleccionar el dispositivo y el modo de trabajo, dos
bytes para Ia direccion de escritura en el dispositive y el dato a escribir.

o\c" -c-, ACI< .aClo.

[ [ O~~ ~~ 11,1 ~~:;b~~i'l ~~-~ ;'~!~f' III : ~'A~<


-< 110
t~ ~~
.. ~
,_
V!

Figura 42. EI formato de escritura (cortesia de ST)

A continuaci6n se describe una funcion para la escritura en 1a EEPROM, que debe


seT llamada desde el programa principal donde se Ie pasa Ia direccion a escribir y
el dato.
void write_exl:_eeprom(long inc address, BYTE data)

short int status;


i2c_start (); llInicializa La cransmision
i2c_wrics(OxAO); IIEscribe La palabra de control (direcci6n
/IOIl T C para -esc.z
i.tuire}

i2c_wri~e(address»8}i I(Parre alta de La direccion a escrLbir en 1a


I/SEPROM
i2c_write(address); IIParte baja de La direccion a escribir en La
/IEEPMM
i2~wrice(daca); IIDato a escribir
i2c_stop () ; IIFinalizacion de la transmis~6n.
i2c_scart (); I/Reinicio
status=i2C_IVrite(OxaO); I/Leccu.ra del bit ACK, para ev itieu: escr i t ure s
Ilincorreceas

201
Compilador C CCS y Simulador PROTEUSpara Microcontroladores PIC

wbile (stiltus~l) 115i es 1 esperar a que responds el esclavo

i2c_start ();
status~i2c_1~rite(OxilO)
;

FIgura 43. Funcl6n de escrltura en la EEPROM

EI Formato de lecture puede ser de cuatro formas: lectura de la direccion actual en el


bus, lectura de una direccion cualquiera, lectura secuencial a partir de la direccion
actual y lectura secuencial a partir de una direccion cualquiera. La forma mas normal
es la de leer una direecion cualquiera (figura 44), donde el proceso es muy similar
al de escrirura y tras una reinicializacion hay dos ciclos donde se indica el modo de
lectura y se en via el dato. En este caso, el master debe devolver un NO ACK.

R....lI.OOM
.o.ODRESS
READ

FIgura 44. Lectura de una dlreccl6n cualqulera (cortesla de STI

A continuacion se describe una funcion para la lectura de la EEPROM, que debe ser
lIamada desde el programa principal donde se Ie pasa la direccion a leer.
BYTE read_ext_eeprom (long int address) (
BYTE data:
i2c_start (); IIInicia1izd 18 transmisi6n
i2c_wrice(OxAO); /IEscribe la palabra de conerol (direccion Dh
/1+ 0 para escritura)
i2c_wri te (addJ.-ess»8); //Parte alta de 18 direccion a escr~bir en 18
//EEPROM
i2c_write(address) ; //Parte baja de 18 dlrecclon a escrlblr en la
/IESPROM
i2c_sca.rt(I; IIReiniclo
12c_wrlte(Oxal); IIEscribe la palabra de conerol (direccion Oh
11+ 1 para lectura)
data-i2c_read(O); Illectura del dato
12c_seop() ; /IFinallzaclon' de 18 cransmislOn.
return (data),.

Flgur .. 45. Funcl6n de lectura de la EEPROM

202
7. Transmision serie

Para la aplicacion del ejemplo se utilizan estas funciones en eJ program a princi­


pal.
Hinclude <16F877.h>
'fuses X~,NOWDT,NOPROTECT,NQLVP
luse delayfclock-4000000)
#use i2c(Master,sda=PIN_C4,scl=PIN_C3) //Canflguracion r2C
linclude <lcd.c>

Idefine EEPROM_ADDRESS long inc

vaia 'o/rite_exf_peprom(longinc address, BYTE data)


(//inc1ua.r la funci6n exp ii cea« an teriormen tie] ~

BYTE read_ext_eepram(lanq inc address}


(I/incluir 18 tunoion explicada anteriormentej ~

void ms i n () (

incS valor-O, datol


EEPROM_ADDRESS address;,­
lcd_init (),-

for (address"'O,-address<&9,-address++)
WRITE_ EXT_ EEPROM (address, valor};
lcd_gotoxy(l,l),-
print f (lcd_putc, "enviando-ilD", valor) ;
delay_ms (500);
valor++ I

[or (address-O ,-addxess<-9 ;address++)


dato-READ_EXT_EEPROM( address};
lcd_gacaxy(l,2),-
aecor ,
printf(lcd_putc, "L'ecip;iendo··1D",
delaY_ffls (500);

Figura 46. EI programa del ejemplo 4

En el 12C debllgger se pueden seguir las transiciones del bus. En la figura 47 se


rnuestra una operacion de lecture tal como se ha explicado anteriormente. La S
significa START, la A es reconocirniento (ACK), la Sr es START repetido, la N es NO
ACK Y la P indica STOP (cornpararla con la Figura 44, en este caso la direccion es
01h ye) dato es Olh).

203
Compilador C CCS y Simulador PROTEUSpara Microcontroladores PIC

-.. 6_.l!3. 6_ Uo( • S AO .1. .00 A 01 .l. Sr A.L 1. 01 Jl ,


.. E.12J s-
-t"
t ~
~.!~~ s.
6.U3,.
".~23 So
'.1'2... s,
AD ..
00 ~
...4-
...
6.U4 J;
'_124!!.
E..1Z.f.
C l24 e · 01 ..
$r

-+.
-. L~w •6.124
a•
· "'4
01 II
:~

·
6.124 s So ~O::'
g.lZ4 P

~_._. 6_.1_l~
__' _--------------------------------------_--~--_--~~ fil
~E<f~~ ~__ ~:'

I~ .. ..~~~~~~~~~~~~,
~~~~.,~~~~ .. ~ ~~~
Figura 47. La operacion de lectura con el12C debugger

Ejemplo 5: Leer la temperatura y hora de lectura y guarder los datos en una EEPROM;
tJ

utilizar un sensor de temperatura I2C (DS1621), un reloj en tiempo real 12C (D51307) y
una EEPROM eerie I2C (M24512). La lectura se reolizarii en funcion de una orden dada
par el puerto eerie; con otra orden se vislIaiizaran los primeros datos de la EEPROM en
un monitor del puerto eerie (figure 48). Componentes ISIS: PIC16F877, M24512, RES,
COMPIM, 051621, DS1307 Y LM016L. lnstrumentos: 12C DEBUGGER.

t2C RTC
_UI_
rf===::til::!. 1;.!!:...

-... 12C SENSOR TEMP


"'_""n'
RS[ Il6I2C Eeprom
...... ,014 ~

Figura 48. EI ejemplo 5

Para facilitar el desarrollo del programa se van ha crear 3 ficheros driver para cada
uno de los peruericos. Para 1a EEPROM serie 12C M24512 se utilizaran los algorit-

204
7. Transmision serie

mos descritos en el ejemplo anterior (figura 49). La direccion asignada en el esque­


ma es la OxOD.
void write_ext_eepromllong int address, BYTE data)

short int status;


i2c_start () ;
i2c_write(OxaD):
i2c_write(address»8);
i2c_wrice(address);
i2c_write(data} ;
i.2c_iii top ();
i2e_start:: o,
status=i2c_wr~te(OxaO);
r.hile(status--l)

i2c_start:();
status=i2c_write(OxBO):

.BYTE read_ext_eeprom(long int eaaxees) {


BYTE data;
i2c_start:();
i2C_f"rite(OxaO);
i2c_write(address»8};
i2c_write(address):
lZC_SCctrt ();
i2c_write(Oxal):
data=i2c_read(O};
i2c_ scop ();
return (dar:.a);

Figura 49. Fichero EEPROM_24512.C

Para el reloj en tiempo real D51307 se necesitan conocer sus caracteristicas y es­
cribir el driver. El D51307 suministra segundos, minutes, horas, dia, mes y afio en
tiempo real (mediante una bateria y un cristal de cuarzo exterior permite un fun­
cionamiento independiente del sistema). Posee una serie de registros donde apa­
recen los datos necesarios (figura 50), los cuales se suministran en codigo BCD can
eJ formato indicado en la parte derecha de la figura. En este ejempLo solo se leeran
los segundos, minutos y horas.

Para la escritura y lectura del integrado, el fabricante recomienda los cidos indi­
cados en la figura 51. Podemos observer que el dclo de escritura se inida con Ia

205
Compilador C CCS y Simulador PROTEUSpara Microcontroladores PIC

palabra OxDOy la de lectura con OxD1.En el ciclo de escritura, el segundo byte es


un puntero que debe indicar la direcci6n de inicio (en este caso 0). En el ciclo de
lectura se realizara la lectura de los tres primeras dlrecciones de la memoria del
D51307 (los segundos, minutes y horas), el ultimo byte debe indicar un NACK al
master. Tan 5610queda convertir los bytes en BCD a binario. EI fichero se rnuestra
en la figura 52.

I'"
SECONOS
I-- MINUTES
HOURS
--r---------r--------~
elf .. ...",.
.- ;;--/i"I"I'·,11I
w.nu

-- .'"'~
"
-
_: ...

OA.Y t--- ~ r 4. --:-----~-1


().\TE '" t 0 _:_l __ fUi" __J I'
,0'''',
rL
01 ......
r-- "iONTH
YEAR
l -t--.-
r- • 'O~:'l r»n. ,t..;jll)

J7H C04'ITRO_ _ tr- ~._'_l


...IQi-"~--r_--~-
.I......
--' ~ •• 1>

3611 r
RAM J '""" "'A/4

lFH L ~.8_ ....I~ I -r t I J "'.J ~


I IICV¢ • I

051307 ADDRESS MAP OS1307 TIMEKEEPER REGISTERS


FIgura 50. Reglstros con dlreccfones y formilto.s (cortesia de Dallas Smc.)

IS
~ • !rT,,"'
Ar._roor
f • "(lI>
A ~T iIC""OWUtx..E
'W ~O"lII'JFcnoN tiT ~".O'h
Figura 51. CIcio de escrltura y lectura (cortesla de Dallas Smc.)
int BCDaBIN(inc bed) ( //ConverSJon de BCD B Binario
int varia;
ver ie • bed;
varia »- 1;
varia ~- Ox78;
~'ecurn(varJa + (VBrJlI » 2) + (bed" OxO());

206
7. Transmision serie

void tiempo(byte snox, byte &min, byl:essec)(


i2c_start(): //Escril:ura
i2c_write (OxDO); //COdLgO de escritura
i2c_wrire(OxOO): I/~Jncero a 1a primera direccion
l2c_start(}; I/Lectura
i2c_write(OxDl); //C6digo de 1ectura
sec = BCDaBIN(i2c_read()&Ox7t): //Lectura de los 7 bit de los segundos
min; BCDaBIN(i2c_read()&Ox7f): //Lectura de los 7 bit de ~os minutos
hor = BCDaBIN(12c_read(O)&Ox3f): //Lecr.urade los 6 .oLtde las horas
i2c_stop (),.

Figura 52. Flchero RTC_DS1307.C

El termometro digital y termostato I2C 051621 permite medir temperaturas entre


-55°C Y 125°C. Bl valor de temperatura se suministra en dos bytes, el byte alto es
el valor entero con resolucion de 1 °C Y el segundo byte es el valor decimal con
resolucion de 0.5 °C (figura 53).
rDIPER.!rrar DIG.IIAL orrrt'r DlGIHl. OlTPl'T
(lbnOlr\') tHt:!:)
-eST CIIII10! ceooccoo 7DOflh :'
-2:"( 0001100: 00000000 1900h
~I ,:('
ooooom IOOC«lQO OOSOl!
...o·c 00000000 OOOOCOOO O-;)IJ:lh
_,,0( 111111111000cOOO FrSllh
-::!5T 1110011100000000 ElOCll
-55'( 11001001 00000000 C900h
h
Figura 53. Formato de Ja temperatura fc:ortesia de Dallas Smc:.,

La direction asignada en el esquema es la OxOl. Tiene un registro de control para el


funcionamiento como termostato que en esta aplicaci6n DO se utiliza. La palabra de
control para Ia Iectu.ra 0 escritura es 1001A3A2A1-RJW (figura 55). Los comandos
de control pueden ser, entres OrrOS, OxAA para lectura de la temperatura, OxEE
para el inicio de 1a conversion. Con estos datos se puede escribir el fichero para el
control del 051621 (figura 54).
void init_temp(int address) (
i2c_start (),.
i2c_write(Ox901(address«l)); //Genera prLmer byte (lODIA2ALADW)
i2c_wrice(Oxee); //Inicia conversion
12c_seop(J,.

floatread_foll_terop(int address) (
signed int datah,.
.int: datal:
Iloe t: tura;

207
Cornpilador C CCS y Sirnulador PROTEUSpara Microcontroladores PIC

i2c_starc (),.
i2c_write(Ox90 I (address«l)); IIGenera primer b.yce (lOOIA2AIAO-W)
i2c_WlicerOxaa),. IILeer temperatura
l2c_start IJ;
12c_wd ce (Ox91 I (address«l); IIGenera primer byte (1001A2AIAO-R)
datah ..i2c_read(),. IILecwra parte alta
dacal-i2c_read(0); IILectura parte baja y NACK
i2c:_stop() ;
tura"'dacah; IIConversion a flotante
if (datal~p128) (U1"a-cuLa+0.5;
return (ture);

Figura 54. Flchero TEMP_OS1621.C

&l.Ho A ""IfAHOA".... ccw.w4NO ,,' ... 1..,01 C'QIff't'IAl)

Ul.llJ1.J1.fUI.rU1.rUUU1.f1.I1nJlI"tn r­
....u/, A..Ar.'W)~·.~-"'"...®"..!),~.!Xg;.l'X.~..!.-I".
III!O t , t t
'W""" ro.I¥tOI.64'iT1At0lt1Vl (~"A~
--...JUlJl ..nnn nruU1J1 n.~l1I1.nnnnnnnnn.n ..n.r­
.... \aJ 1\A..J>_r.VW'.ll.~IIDIDg:I;n~'4!!:).l.l.®:Vt®,~ fi
..... 1 .tIt :
a1...M' ..onqn:"IVll ~I

....... TO.fW0..8YB~c:c;e'I"(JII(1',;.fl.)
~\C).,.. 01...::' 04'~.'U. O$~I ... er

U u J 1nnnn..
nnnrinnrtnnn nrU1.11Il ..'11U1.I11Ul.JUUUtnnnl1I"

r_ ~JYTf ""J~' CIOWWA.'C-."" ~~' I :0'"


UA.OJ"OW.~"'.Ynf(ICIII1(1't'CQt\~lON.w.OI't.~'fll.)

r
--. nn ..n n nnI1JlJ JU1.Il.J1I1..nnn.n.n...rUlILi tJ1..fl..IUlI1..fU1.1lIU1.11.H.!1J
~
\.I/i\AJr.'iifjJ4)..
,,_A.IIi~i;y.g;.J'~~".lfiiiBlrii!'SI'.!i)'!&1R~W-.'J;'
"".I l J' l I ! ' l-. -. Ij t
llNU' AtIOAIMetTt O:s,f,;'1
IJ!, ~'. I'f '" =to'l
..., ""~"'I'1D.ADCJIIIf'II
IfNllf ....,,, OIl"'l
~:I
Q.&.t• ..".,

IillUOntOWA 'I.. f{""'~'


1"I'fIO.4YTCMGWl1:"~
..a.~ 11fl!U"1I1..f1J1J1.fl.!lJ1.n ...
nnnnnn.!lJU1.n.nnIVl.nn nn.->
-,a.J'"0~ ... ~l:O.A.N"iu....a..fi'!D£@),"' ~liQ~W:®'~ ••
t t t
SIl' I :
........ ,,at,,ta
.....
....• • • ...I1J\IUU1.J1J1.. '1...ru-­
"(ijifii:l'~~'V: ..:lSl!.{j,'j't:\...__fi"
~.... t I

lD>Tf

Figura 55. Protocolo de lectura,lescritura (cortesia de Dallas Smc.)

Puesto que la temperatura es un FLOAT no se puede guardar este dato directamente en


la EEPROM segun las funciones dadas en el fichero EEPROM_24512.C;por 10 tanto, se

208
T. Transmision serie

puede utilizar el fichero suministrado por CCS C llamado FLOATEE.Cpara guardar y


leer datos tipo FLOAT en una EEPROM. El fichero se muestra en 1afigura 56.
WRITE;_FLOAT_SXT_EEPROM(longint n, Itaet: data} (
ln t i ,
for (i = 0; i < 4: i~)
write_€iXC_eeprom(1 .,. n, • «(inc8 ~) (&daea) + i);

tioet: RE-AD_E'LOAT_EXT_EEPROl·t(long
int n)
int i;
noe t ae ta;
for (1 - 0; ~ < 4; ~H)

"«lnt8 .) (&data) + i) = read_ext_eeprom{i + n);


return (data) ;

Figura 56. Flchero FLOATEE.C

Una vez definidos Ios ficheros para eJ manejo de los perifericos se puede escribir
el programa principal. El programa se comunica con un terminal del puerto serie
de tal forma que mediante un menu se pueden elegir dos opciones: Con 1se inicia
la lecture de temperatura y tiempo para almacenarlo en Ia EEPROM y con 2 se
visualize, a traves del puerto sene, los primeros datos de la EEPROM (los 4 bytes
del FLOAT de 1a temperatura y los 3 bytes del tiempo -seg., min. y horas-), La co­
municaci6n serie se realiza por interrupcion.
~include <loF876.h>
#fuses Xl',NOWDT,NOPROTECT,WOLVP
fuse delay(clock=4000000)
'use rs232(baud=9600, xmic=pin_c6, rcv=pin_c7, bits=B,parity=N)
;luse 12c (Master,sda=PIN_C4 ,scl=PrN_C3)

#include <lcd.c>
#include <EEPROM 24SL2.c> //F~cbecos driver de los pexifericos
lIinclude <J~TC_ds1307.c>
Hinclude <TEMPds1621.c>
#include <floatee.c>

int: dat_in, cnt:, ar s mi n eec:


i

int16 eddrees=a :
inC dat_serie[7];
float dato;

!hnt_rda //rnterrUpC20n para el puerto serie

209
Compllador C CCS y Simulador PROTEUSpara Microcontroladores PIC

rd,,_isr()

dac_~n~getc(); IILee el pue.ctoserie


printt ("\.c");
if (dat_i.n~'::')/15i as "2" se visualizan los primeros datos de 111 EEPROM

for (cnt-O;cnt<-6;cnt++) IILeccu.cade los 7 prlmeros bytes de la EEPR~

dat_serie[cnt}-read_ext_eeprom(cnt);
J
for(cnc..
O:cnt<-6;cnt++) /IV~sua1iza los 7 pdmeros bytes de la EEPROM

printf("Byte tu-13u ,dac_serie[cnt)) ;


\c",C'l'
}

void main ()
lcd_init(J;
enable_lntercupts(inc_rda);
enable_interrupts(global);
address-O;

pnncf("Pu1sar para leer datos\r"); IIMenu para e1 term~nal serle


printf("Pulsar 2 para visualiza.cdatos\r");

while (1) (

ff(dac_in--'l') IIS1 es "I" se inicia III lecturll y grabado en 18 EEPROM

init_cemp(OxOl); IIInicializa e1 DS1621


delay_ms t ioc) :
tiempo(hr,min,sec): IILee c~empo del D51307
dace - read_full_cemp(OxOZ): IILea temperatura del D51621
WRITE_FLOAT_EXT_EEPROM(address,date); I/Guaeda 4 byres del FLOAT
address-address+4:

WRTTE_EXT_EEPROMladdressf',hrl; I/Guaeda byte de hora


WRITE_EXT_EEPROMladdress ~,min); I/Guarda byte de minuto
HRITE_EXT_EEPROH(lIddnUJ.· «,» A}: IIGu'3Cdabyte de seC/undo
lcd_gocoxy(l,l):
prinCf(lcd_putc,~Temp-t4.Jf C\n",daco): IIVlsuallza 1a ce~peraturD
t2u: 12c;:t2u" .nr,min,sec); IIVJ.sual1zala hera
printf (lcd_pucc,..

210
7. Transmisi6n serie

If (address--Oxf(ff) address-a: I/Cuando se termina la EEE'RON vtlelve


I/al pnncipio.
}

I
}

Figura 57. Programa principal del eJemplo 5


Se puede uriliza el HypcrTermil1(1i para cornunicarse con el PIC. La configuracion se
muestra en 1a Agura 58; el resultado se muestra en la figura 59.

Ij En....'" fll1 de IInM con lot avaI'IOe$ de linea


, I feD de m C41acle''''I!~''1)$ JocaImerle
Rete,do do linea 0
Aetaldode
ceraaler
o
AI ,eciJ. ASCI
o Agregar evetlQo de llnee '" finalde cada Irnea ,eabida
L Inle,plel!lf caaclem recIbidos como ASCII de 7 bi.s
l Ajutter Iineilt ql,l$sob,epasen el an~ de lermin!!l

I .Acepl!lf II ClII'ICeiar I
Figura 58. Conflgurad6n del HyperTermlnal

~ ~ •• lt~ ft","" ,..,....

O~ ~ CiS " _,_


Pulsar 1 pore teer datos
pulsor 2 f)t;I,.4't visu,;l ildr ~to-;
J
2
Byl. O· 0
Byl"
By 0
I' I)
2· 0
By!o S 0
lJylo 4 18
Byte Sa 12
Byte 6· 311

Figura 59. Pantalla de comunlcacl6n

211
Compilador C CCS Y Simulador PROTEUS para Microcontroladores PIC
-- -----
En e1 comando DEBUG del PROTEUS se puede visualizar la EEPROM serie me-
dlante el comando 12CMEMORY INTERNAL MEMORY (figura 60).

0000 0 0 0 18 12 0 l.8 12 0
0010
OOZO
1)
.18
16 12
3S 130
is
8 a
0
18 u
0 3S llO
0
H
8
0 ~8
0
12
.............. "......
8 •• .:I •••••• tII ••••••
0(31) 3$ S El 0 1& 12 }5 130 0 18 U 36130 ....... •1.....•• S.
aOAO a 0 18 U 36 DO
8 0 18 12 16 ilO 8 0 ..... s...... s...
0050 0 12 }6 no
lEI 8 0 0 16 12 36 HO 8 0 a 18 ••. s ••...• s..• ,'
.s..... ,w" .... ,.
OQl;O
0070
12
13El
36 130
8 0
8 0 0 18
0 18 1D 26 130
12. 37
a
130
0
8 0
0 18 10
0 18 12 )]
24 130 s ................
.................
0080
OQ90
DOM
0

27 130
0 18 10 2'; 130
18 10 l6 -130
8 0
8 0
II
0
0
16 10
0 l.8 10 Z7 130
0 18 10 lG 130
2{; :130
8 0
8 0
8 0
0 18 10
0 18 10 ~7 130
0
................
....... - ...........
00&0
coco
8 0 0 18 10 7.7130
0 18 10 27 130 8 0
S
0 18
0 0 18 "10 27 :130 II
10 28 130 8 0 0
0
18
................
..................
0000 10 zs no 8 I) 0 18 10 28 130 8 0 0 18 10 28
a
................
.................
00.0 130
MFO
0100
0
6 D
0 13 )0
0 16 10 28 130
13 30 15 -:130 8
11>130
0
8 0
0 13 30
8
0
0 0 18 10 29 130
11 )0 .1S 130
1$ 130 8 0
8
0 13
0 0
30
................
.................
CUI) 16 130 8 I) 0 13 30 16 130 8 0 0 j.l 30 16 ~30 ................
................
...... - .........
01Z0 8 I) 0 13 30 1. 130 S 0 0 13 30 1] 130 8 0
on!) o 13 30 l.7 130 8 0 0 13 30 11130 8 0 0 13
0140 30 17 130 8 0 0 13 30 V 139 El 0 0 13 30 H
e
.................
..................
0150 130 8 0 0 13 30 18 130 8 0 0 13 ]0 18 130
OlOO 0 0 13 30 16 130 8 0 0 11 30 18 1.30
13 no
B 0 0 .................
................
0170 30 18 130 8 e e 13 30 s 0 I) 13 30
IUGO
13
19 130 8 0 0 1"3 30 is 130 8 0 0 13 30 19130 ................
................
Ol~O
CIAO
8 0 0 -:13 }Q 19 130
0 11 30 lO 130 I> 0
8
0 13
0 a 1~ 30 19 US
30 20 130 8 ., 8
0 n
0
................
01BO 30 20130 Ii 0 a 13 30 20 130 S 0 0 13 lD ~O
8
................
................
OlCO 1.30 8 0 0 13 ]0 20 13() 8 0 0 13 30 Z1 130
OtoO
OlEO
0 a 13 30 2:1.130 8 0 0
l.3 30 21 -:1l0 8 0 0 13 30
13 30 :n HO
21 UO
a 0 0
0 U lO
.................
............ - ..-
01£0
0200
z ; 110 8 0 Q 11 .0 II 130
8 0 0 H 30 22 130 6 0
6 Q
8 0
0 13 3(1 U 130
0 13 30 22 HO 8 0
................
....... - .........
DUO U 30 Z2 130 8 0 0 ~3 30 2:2 110 8 o 0 u .................
0220 30
0
H 13:0 8 0 0 11 30 H 130 e 0 0 130 30 23 .................
.................
ono HO s I) 0 U 3D 13 255 2S5 2Sc5255 255 255 255 2SS 2SS
02:.40- 25S ;?SS 255 25S 255 l5S HS 25S lSS 2S~ 1SS 2:5~ lSS 1SS 255 2iS ................
...............
0250 255 2SS 2SS 2SS ~S5 255 2SS 2S5 ZSS 255 ZSS 2SS 255 ZSS .,5 255
0260 ..55 as lS5 255- 2SS 1S5 255 255 255
0270 2SI> 155 as HS 25!>.55 25"5 255 255
Z5S ass 25-5 255 255 255 2S5
25; 255 255 25S. 255 2SS zss
...............
................
02eo lS5 :155 2SS 25. 25"5 155 255 Z5S 1SS
OHO 255 2SS ZSS 2SS 2S5 255 255 255 2SS
?SS 255 255 255 255 2SS 2S5
255 255 255 255 255 255 2SS
................
..................
02';0 ZS5 255 255 255 255 255 255 ass 2SS
0190 255 ~SS 2:!-~ 255 255 255 c55 ass 2SS
~5S- l5S 25S 2S5 lSS ~5S 255
255 25$- :!SS 255 255 2SS 2SS
................
...............
1)2CI) Z55 Z55 255 >!5S ZS5 2S5 250 ZSS 255
zss 255 ass 2S5 255 255 zss 25S 255
255 2,SS 255 255 zss 255 Z55
zss zss 255 Z55 255 255 lSS
................
................
0200
OlEO as Z5S 255 255 255 255 251>Z55 255 255 2SS lSS 255 255 255 255 ................
................
GZFo 25-5 ~55 2S5 255 2!>5 2SS zss 2S5 255 25~ 255 lS5 255 255 255 255
0300 15S ess 255 255 2"SS 255 255 2,.5 25"5 .................. _.
0310 255 ~SS 2SS 15S 255 US l55 255 255
D320 !!55 lS5 2~5 ~S5 255 255 255 ?S5 2S"5
25S lSS 255 255 255 255 255
255 lSS 255 255 lS5 25'S iss
255 zss 2SS 255 ZSS 255 255
................
................
tl3·Z0 2S!> Z5S <sS ass lS5 255 255 255 255 H5 !SS 255 255 lSS 255 ~S5

Figura 60. Memoria in1ema de la EEPROM 12C

212
8. Gama Alta - PIC18

Ca itulo 8

Gama Alta - PIC1S


8" 1 Introduccion
En los ultimos an os, Microchip ha lanzado varias gamas de PIC con elevadas pres­
laciones, los PIC18, los PIC24 Y los dsPIC. Con la gama alta (PIC18), Microchip
rnantiene la arquitectura basica que tan buenos resultados ha obtenido con la gama
baja y media y, adernas, reduce las Iimitaciones de estas dos ultimas, Los PICl8
tienen una arquitectura RISC avanzada Harvard con 16 bits de bus de programa y 8
bits de bus de datos (figure 1).

M v'lORJA 16 8
PIC18 ORIA
PROGRAM A
RISC DATO
fLASH
CPU (H STA KB)
ASTA2MB)

Figura 1.Arqultectura PIC1S

La memoria de program a aumenta hasta I MWord (en realldad se manejan hasta


64 Kbytes pero llegan hasta los 2 Mbytes con memoria externa) y desaparece la pa­
ginad6n. La memoria de datos RAM puede liegar hasta 16 x 256 (4 KBytes) y hasta
los 1 Kbytes de EEPROM.

La pila aurnenta hasta 31 niveles. Incluyen tres punteros FSR que perrniten direc­
donal' la memoria de datos de forma indirecta Y sin bancos. Eljuego de instruccio­
nes aumenta hasta las 75 instrucciones. Introduce un multiplicador hardware 8x8.
La frecuencia maxima de reloj es de 40 MHZ Y la velocidad de procesador lJega a
los 10 MTPScon oscilador de 10 MHz. Inc1uye perifericos de comunicaclon avan­
zados (CAN y USB). Con la filosofia tradicional de Microchip, los P[CIS son com­
patibles con los P(C16CXX y P(C17CXX. Ademas ha desarrollado un compilador C
especifico para esta gama alta, eLC18.

213
Compilador C CCS y Simulador PROTEUSpara Microcontroladores PIC

Car.cteri~aH' PICI8F14%fI PIC18Fl51l1 PICI8F'~O PICIBT.IS!lI


ClImaAII.
Frceuencta ue ()("~OVlllz DC-40.\UIz OC-4O.\lJIz OC-lO'\fHz
!rlb.·o [,1:
li...t(y d~l.ys) POR.BOR. POR.BOR. POR. BOR. POR,BOR.
InslrucciOn RESET. In$ITUcei&nRESET. Instrurc.iOn RESET. Inmllcclon RESET.
PUp nel1Jl. PiluUena, Piblk"", Pib nona. .'
Oesbnnlamiento de Dc3bnnlamlrntD d~ Dc3bnrdaml~IO de Dc3bnrd.mien.o de
<'
Pi1u (PWRT. OST). PD. (PWRT. OST). Pil. (PWRT. OST). PI,. (PWRT. om
MCLR (opciiJnaJ).
WOT
MCt.R (opdon.».
WOT
MCLR (opdonall.
WOT
Ma.R (opdOnaI).
\\OT
i~::
Momon. de 1638-1 32768 16384 32768
PrOOl'llma (bytt'S) ~;
Memorl. d. 8191 16384 8192 16384
P~ograma :i:
IInstrucdon .. )
Memori. DJitos 768 1536 768 1536
(bl''')
Memoria O'IO~ 2.."6 156 Z$6 !56 ~!
EEl'RO\1
InlUtul)CiuneJ 19 19 20 20
Puerto< EIS Porli A.B.C.I£) Ports A.B.C.IE) POri. A.B.C.E Poru A.s,c.D.E
r~mjJjI~madoreo
M6dulosCCP 2
.. ~
1
..
I
..
I
l\l6duJo.CCP 0 0 I I
n,ejol'lldos [I
I,
Comu.nJc.cloncs MSSP. £OSARI MSSP .EUSARI MSSP..EUSART 'fSSP.£USART
mi.
Con,unic:acLones psp psp
Paral.ln
MOdl'l. AD d. 10 10C"~AU:S 10 CANALES 13CASALES L1CANALES f\
bits
'\limero de 75(8.1 Ext.) 7S(83 Exto) 15 (83 ExL) 15 (83 E'f.)
In~lrucdon6
ProgttDlllcidn SI SI SI Si c:'
eon balo .01.. 1"
Oetocd6n d. baja lSI Si SI Si
ttnsitm b
ErtCllpsul.dD. 211-pin 1'011' 28-pin POW 4()..pin PDIP "()..pio porp
Ill-pln SOle Z8-pinSOIC -U-pln QF" -U-pIoQF:\
ZlI-pluQFN Zs-Plo QfN rorr
.u.j,ill .w-iHniQFP ~i
Figura 2. Caracteristlcas de PIC 18F2420, PIC18F2520, PIC 18F4420 YPIC18F4520

8.2 Organizacion de la memoria


ElPTC18P4520 dispone de las siguientes memorias:
• Memoria de programa: memoria FLASH intema de 32768 bytes:
• Almacena instrucdones y constantes/datos.
• Puede ser escrita/leida mediante un programador extemo 0 durante la
ejecud6n del programa mediante unos punteros.
• Memoria RAM de datos: memoria SRAM interne de 1.536 bytes en la que
estan incluidos los registros de funcion especial:
• Almacena datos de forma temporal durante 1a ejecucion del programa.
• Puede ser escrita/lefda en tiempo de ejecucion mediante diversas ins­
trucciones.

214
8. Gama Alla - PIC18

• Memoria EEPROM de datos: memoria no volatil de 256 bytes.


• Almacena datos que se deben conservar aun en ausencia de tension de
alimentaci6n.
• I'uede ser escrita/lelda en tiempo de ejecuci6n a traves de reglstros,
• Pila: bloque de 31 palabras de 21 bits.
• Almacena Ia direcci6n de la instrucci6n que debe ser ejecutada despues
de una interrupci6n 0 subrutina.
• Memoria de configuracion. memoria en la que se incluyen los bits de confi­
guracion (12 bytes de memoriaflnsh) y los registros de identification (2 bytes
de memoria de solo Jectura).

8.2.1 Arquftectura HARDVARD


EI PIC18F4520 dispone de buses dlferentes para el acceso a Ia memoria de progra­
rna y a la memoria de datos (arquitectura Harvnrd):

• Bus de la memoria de programa:


• 2J lineas de direcci6n.
• 16/8 lineas de datos (16 lineas para instrucciones/8 lineas para datos).
• Bus de la memoria de datos:
• 12 lineas de direcci6n.
• 8 llneas de datos.
Esto permite acceder simultanearnente a la memoria de programa y a la memoria
de datos. Es decir, se puede ejecutar una instruccion (10que por 10general requiere
acceso a la memoria de datos) mientras se lee de la memoria de programa Ia si­
guiente instrucci6n (proceso pipeline).

8.2.2 Memoria de Programa


El 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, Ia memoria de programa puede
alrnacenar hasta 16.384 instrucciones.

Primero se almacena la parte baja de la instruccion y luego Ja parte alta (para las
instrucciones de 4 bytes primero los bytes menos significativos y luego los mas
significativos). Las instrucciones siempre empiezan en direcoones pares.
La operacion de Iectura en 1a posici6n de memoria por encima de 7FFFH da '0'
como resultado (equivalente a la instruccion NOP).

215
Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC

Direcciones especiales de la memoria de programa:

• Vectorizacion del Reset es OOOOH.


• Vectorlzacion de las interrupciones de alta prioridad es la OOOSH.
• Vectorizacion de las interrupciones de baja prioridad es Ja 0018H.

r- PC<2~
2-1-

r -
Nlvel 1 de ,; plla
-l
L
r+:
Nlvel31 de la !!!Ia

Veclor de Rosel OOOOh

~r In~ ::a---p;iOrld&d 0008h

Vector InUmupcion de baja priolfdad 001811

Memoria de Program. Intelna

mPh
8000h

leldo5 como '0'

1FrFFF'h
'-------------' 2000QOh

Figura 3. Memoria de Programa

La memoria de programs puedc ser lelda, borrada y escrita durante Is ejecucion


del programa. La operacion 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 bit mcnos significa­
tivo del PC apunta a BYTEs,no a WORDs, por 10 que es "0". E1 PC se incrementa de
dos en dos. Se dispone de los correspondientes registros auxiliares PCLATU y PCLA­
TH para actuar de forma cornbinada con el PC cuando este se escribe 0 se lee.

216
8. Gama Alta - PIC18

• PCU: parte superior del PC, registro no cfuectamente accesible; las operaciones
de lectura/escritura sobre este registro se hacen a traves del registro peLATU.
• Pell: parte alta del PC, registro no directamente accesible: las operaciones de
lectura/escrirura sobre este registro se hacen a traves del registro PCLATH.
• PCL: parte baja del PC, registro directamente accesible. Una operad6n de lee­
tura sabre PCL provoca que los valores de PCU y PCH pasen a los registros
PCLATU y PCLATH, respectivamente. Y una operad6n de escritura sobre PeL
provoca que los valores de peLAru y PCLATH pasen a peu y PCH, respecti­
vamente. El peL siempre tiene el bit menos significative a '0' debido a que las
instrucciones siempre empiezan en direcciones pares.

8.2.4 Memoria de Configuracion


Se trata de un bloque de memoria situado a partir de la posicion 30000H dela me­
moria de programa (mas alia de la zona de memoria de program a de usuario), En
esta memoria de configuracion se incluyen:

• Bits de configuraci6n: contenidos en 12 bytes de memoria flash permiten la


configura cion de algunas opciones del PIC como:
• Opciones del oscilador.
• Opciones de reset.
• Opciones del watchdog.
• Opciones de la circuiteria de depuracion y programaci6n.
• Opciones de protection contra escritura de la memoria de programa y
de 1a memoria EEPROM de datos.
Estos bits se configuran generaJrnente durante la programadon C, aunque tambien
pueden ser leidos y modificados durante la ejecuci6n del programa.

• Registros de identificacion: se trata de dos registros situados en las direccio­


nes 3FFFFEH y 3FFFFFH que contienen informacion del modele y revision
del dispositivo. Son registros de s6lo Jectura 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 bi 15Y un
puntero de 5 bits, q_uesirve para almacenar temporalmente el valor del PC cuando se
produce una Hamada a una subrutina 0 interrupci6n. El "Top Of Stack" es accesible,
se puede 1eer y escribir (sera convenrenre quitar previamente las interrupciones).
El puntero de pila (contenido en el registro STKPTR) es un contador de 5 bits que
indica la posicion actual del final de pila. El contenido del final de pila es accesible
mediante los registros TOSU, TOSH, TOSL.

217
Compilador C CCS y Simulador PROTEUSpara Microcontroladores PIC

Cuando Seprocesa una interrupcion 0 se ejecutan las instrucciones CALL 0 RCALL


(el PC esta apuntando a la siguiente instruccion] se incrementa e) STKPTR y se
almacena e1 valor del PC en el final de pila. Cuando se ejecutan las instrucciones
RETURN, RETLW 0 RETFIE se copia en el PC el valor almacenado en 1a cima de
pila y se decrementa el STKPTR.

8.2.6 Memoria de Datos


Los PIC1S tienen basta un total de 4 KBytes agrupados en 16 ban cos, con 256 bytes
cada uno. Como en el resto de las gamas, existen los registros de prop6sito general
GPR y los registros especiales SFR; estes ultimos se sinian en Ia zona mas alta (des­
de FOOhhasta 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).
Mapa de memoria
BSR<3:0> RAMde~os

Bam;oO
DOllAtcess RAM-:
FflI SPR OFl'h
_,
100II \

-
1~ DOlI
Banco 1 6PR
FAI lF1'h
~ 00II
8aoo02 SPR
~... 1
Banco 3
fFb
OOh
GPA
2Ff1I
JOan

~Fl> .JfJ1>

..
= 11100

= 0101
Banco 4

BancoS
00II

FflI
00b
GPR

GPA
~0010
oIffjl
'500ft \ BanCO de Al:ceso

l=
F1'h 5fR1
00It MOIl Rapldo
Baooo6
eon
= 0111
Banco 7
FflI
QOh :ra: Access RAM l.clW 5flI

m Access RAM HIgh 1118>


7fFb
00b 8OOt\ (SFRs) fFlo

~ 1000
Banco 8 Unusued
Read uOOh
I
=1110
To

Banc:o 14 II
fill EFAt

-- = 1111
.. Banco 15
00b

FFh
Unusued
SER ,..,
'00II
fTRl

Ffll>
Figura 4. Memoria
RAM PIC18F4520

218
8. Gama Alta - PIC18

Para acceder a W1 byte de la memoria RAM de datos primero se debe selecdonar el


banco a] que pertenece el byte mediante el registro de selecci6n de banco (BSR) y, a
continuad6n, 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 U6 bytes
de SFR (banco de acceso rapido).
La memoria RAM de datos se compone de registros de prop6sito general (GPRs) y
de registros de funcion especial (SFRs). Los SFRs son los registros mediante los cua­
les se puede monitorizar/controlar el fundonamiento de 1a CPU y de las unidades
funcionaJes del pre. En el P]C18F4520 se situa en el bloque de memoria de OxF80a
OxFFF(£igura 5). Se distinguen dos conjuntos de SFRs:

SFRs asociados con eI nucleo del PIC:


CPU: WREG, STATUS,-aSK etc.
Interrupciones: lNTCON, PIEl, PIRl, IPR1, etc.
Reset: RCON.
SFRs asociados con las unidades funcionales:
Timers: TOCON, TMRlH, TMRIL, TlCON, etc.
Convertidor AID: ADRESH, ADREsL, ADCONO, ADCONl, etc.
EUSART: TXREG, TXSTA, RCSTA, etc.
CCP: CCPRlH, CCPRlL, CCPICON, etc.
MSSP: SsPSTAT, SSPDATA, sSPCFG, etc.
Puertos de E/S: TRIsA, PORTA, TRISB, PORTB, etc.

PORTA OxF80 SPBRG OxFAF


PORTB OxF81 --
PORTC OxF82 TIMERIL OxFCE
PORTO OxF83 T1MERIH OxfCF
PORTE OxF84 -
--.--.- TIMEOL OxFD6
TRISA OxF92 TlMEROH OxFD7
TRISB OxF93 ---.-
TRISC OxF94 WERG OxFE8
TRlSD OxF95 -----
TRISE OxF96 STKPTR OxFFc:
Figura S. Reglstros SFR

8.2.7 Memoria EEPROM


El PIC18F4520 dispone una memoria EEPROM de datos de 256 bytes. A1 ser una
memoria no volatil, los datos almacenados en ella se mantienen en ausencia de

219
eompilador e ees y Simulador PROTEUS para Microcontroladores PIC

tension de alimentacion. EI acceso a esta memoria se realiza mediante los SFRs:


EECON1, EECON2, EEDATA Y EEADR. Esta memoria permite hasta 1.000.000 de
ciclos 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 interna del PIC se en­
carga de borrar previamente la posicion en la que se desea escribir, La duracion de
un ciclo complete de borrado/escritura de un byte en la memoria EEPROM suele
ser de unos 4 ms.

8.2.8 Modos de Direccionamiento


EI modo de direccicnamiento es 1a forma en la que se obtienen los datos que van a
ser utiJizados en la instruccion. Existen 4 modos de direccionamiento: INHEREN­
TE, LITERAL, DlRECTO e INDIRECTO.

• Modo de direccionamiento inherente: en este modo, a bien la instruccion no


tiene operando 0 bien el operando viene especificado en el propio codigo de
operacion de la instruccion,
• Modo de direccionamiento literal: en este modo, el valor del operando viene
indicado de forma explidta en la tnstruccion.
• Modo de direccionamiento directo: en este modo, la direccion en la que se
encuentra el valor del operando viene indicada de forma explicita en la ins­
truccion,
• Modo de direccionamiento indirecto: en este modo, la direccion de memoria
en la que se encuentra el dato viene especificado en uno de los registros FSRO,
FSRI Y FSR2.

8.2.9Interrupciones
Se dispone de dos niveles de prioridad:

• Nivel alto vectorizado en la direccion OOOSH.


• Nivel bajo, vectorizado en la direcci6n 0018H.
Todas las interrupciones pueden ser programadas con cualquiera de las dos priori­
dades, salvo la interrupcion externa 0 (que siempre tiene alta prioridad). Se puede
forzar el modo compatible "solo alta priori dad", mediante el bit lPeN = O.

GIE/GIEH & PETE/GIEL controlan los respectivos perrnisos globales. Cuando se


sirve una interrupci6n, automaticamente se quita su correspondientc permiso glo­
bal. El servicio de interrupci6n de alta prioridad impide el scrvicio de baja priori­
dad. Cuando se ejecuta RETrJE se pone el perrniso correspondiente al nivel que se
esta sirviendo.

220
8. Gama Alta _ PIC18

Todas las interrupciones disponen de 3 bits de configura cion (excepto la interrup­


cion extema 0 que tiene dos):
• Bit de hahllitacion de Interrupcion: permite habilitar a nivel individual la
interrupcion .
• Flag de interrupcion: se pone a '1' cuando se produce la condici6n de inte­
rrupcion independientemente de si la interrupcion esta habilitada 0 no. Este
flag debe ponerse '0' par software cuando se process la interrupcion.
• Bit de prioridad de interrupci6n: establece S1 la interrupcion es de alta 0 de
baja prioridad (este bit no esta disponible para la interrupcion externa 0).
El PIC18F4520 dispone de 20 mentes de interrupciones. Se distinguen dos grupos
de interrupciones:

• Grupo general de interrupciones:


Interrupckin de Temporlzadur 0
Interruption POI'cambio en PORTB
~nterruPci{in exrerna 0
Interruption externa I
Interrunclon externa 2
• Grupe de interrupciones de perifencos:
Interrupelen del SSP loterrupcion del fallo del oscllador
lnterrupclen del AID tnterrupeten del comparador
lnterrunclen de recenclon de III EUSART Interrunclon del CCP2
Interruption de trsnsmision de la £USART tnterrupcien de escrttura en HasbJEEPROl\1
tnrerrunclen del MMSP tnterruncten de collsion de bus (MSSP)
Interrupcion del CCPl Interruption de detecclen de anomallas en \J!D_
Interrupci6n del Temporlzader I tnterrupclen del Temporlzador 2
Interrupclen del Temnorizador 3

En el compilador C se modifica la directive ItINT_XXXXde taJ forma que se pue­


den incluir las palabras clave HIGH y FAST.
Una priori dad HIGH puede interrumpir a otra interrupci6n. Una prioridad FAST
se realiza sin salvar 0 restaurar registros (ver el siguiente apartado).

Asi, en los PICl8 se pueden dar las siguientes interrupciones en C:


#INT _x.x.xx Prioridad normal (baja) de interrupcion. El compilador guarda y
restaura los regisiros clave. Esta interrupcion no interrurnpe a
otras en progreso.
#INT_xxxx FAST Interruption de alta prioridad. En compilador NO guarda y i.:
rcstaura los registros clave. Esta inrerrupcion pucde interrurnpir a [:;
otras en p..!:,ogreso.S610 se pcrmiie una en el.e.r2~ramtl. rl
#J'NT_xx.xx HrGII lntcrrupclen de alta prioridad. EI eompilador guarda y rcstaura
los registros clave. Esta interrupcion puede intcrrumpir 0 oiras en
progreso.

221
Compilador C CCS V Simulador PROTEUSpara Microcontroladores PIC

• HINT_xxxx: Priori dad normal (baja) de interrupcion, El compilador guarda y


restaura los registros clave. Esta interrupcion no interrumpe a otras en pro­
greso.
• ItlNT_xxxx FAST: Interrupcion de alta prloridad. En compilador NO guarda
y restaura los registros clave. Esta interrupcion puede interrumpir a otras en
progreso. 5610 se permite una en el programa.
• ItINT_xxxx HIGH: Interrupcion de alta prioridad. El compilador guarda y
restaura los registros clave. Esta interrupci6n puede interrumpir a otras en
progreso.
illPIC18F4550 tiene las fuentes de interrupcion mostradas en la figura 6.

rTimer I) .,.,..flow f.....,., srte name)


rTIIIlI!,I)OYedJowfu;lngTIMEROn!fme)
r Time, 1 ovedlow
r Time,2 cwerlIow
r Tline, 3 O'Mfflow
r Exlemal i1Ie!fup!
rEIiteJM "'""Up!bl
rEl<IetMirlar;rpl112
r Pod B all' change on 84.fl7
rp!I~ S,- Portdata..
r Ana!oo to dgt.1 convemon c:cxrPet&
rRSm,_ved«a ....aiabIe
r RS232tr_ buffer ernpt~
r SPI 0I12C ae1JVit~
r Cept... 01 Canpare on "" 1
rC<JPiUfe 01 Compare on 1A'112
rsu: eoIIi=rGn
rLow voIloge det~
r~alOI 1 detect
rD~o eepTom Write C(lI!1Ilir.Ite
I "31Fl""",:~F

Figura 6. Fuentes de interl'upci6n del PIC18F4520 desde el Wizard del CCS

8.2.9.1 Registros de salvaguarda


Las interrupdones se disparan durante la ejecucion de codigo del program a prin­
cipal 0 de otra interrupcion. Esto hace que durante la ejecud6n de la rutina de tra­
tamiento de Ia intermpci6n se pueda modificar el valor de los registros que estan
siendo utilizados por otras partes del codigo.
Para evitar que estas modificaciones alteren el correcto funcionamiento del sistema
conviene almacenar los valores de estos registros al inicio de la interrupdon para
recuperarlos al final
Se puede salvar y restaurar el contenido de las variables deentomo (WREG, STA­
TUS y BSR) en sus respectivos registros sombra, 10 que equivale a una pila de un
solo nivel.

222
8. 6ama Alta - PIC18

8.2.10 Registro W
EI registro WREG pasa a ser un registro direcdonable (OxFES),por 10 que se puede
utilizar de forma explicita.

8.2.11 Oscilador
El PIC18F4520 permite multiples configuraciones:
LP Cristal Baia-Potencla __ima;(.200KHz)
XT Crtstal-Resenador (max. 4MHz)
HS Cristal-Resonador Alta-VeJocidad j_mn. 40MHz_l
HSPLL Crlstal-Resonador Alta-Velecidad coo habilitation de PLLJ..max. lOl\'(Hz)
RC Enema R-C con FOSCl4 salida eo RA6 (max. 4J\.IHz)
ROO ExternaR-C con 1/0 enRA6 (max. 4MHZ)
fNTIOI Oscilador Interne FOSC/4 salida en RA6 e flO en RA 7j_301500 KHz. J/4/8 MHz)
INTI02 Oscilador Interne con 1/0 en RA6 v RA7
EC Rcloj Extcrno con FOSC/4 de salida (max. 40MHz).
EC)O ReloJ Externo con I/O en RA6 (max. 40MHz).

La disponibilidad de oscilador intemo pennite multiples configuraciones (figura 7).

- ",I

31.251-.",(_cIocl<~"""&f,'HZr

31~hr (~_ de","" """' """"'0_

125KHZ

" 311-.llZ

Figura 7. Configuracl6n del oscilador interno

8.2.12 Unidades Funcionales


EI PIC18F4520 dispone de una serie de Unidades Funcionales que Ie permiten:

• Realizar tareas especificas especializadas (conversion AID, transmision/re­


cepcion de datos, generacion de seiiales digitales con temporizadones pro­
gramables, etc).

223
Compilador C CCS y Simulador PROTEUSpara Microcontroladores PIC

• Optimizar el rendimiento del PIC, ya que estas unidades trabajan en paraIelo


a la CPU permitiendo que esta se centre en otras tareas como el procesado de
datos, calculos, movimiento de datos, etc.
Las ilnidades Funcionales mas importantes del PIC18F4520 son:
Puerto de [IS Uoidad de Comparacion/Captura/PWM meiorada (ECCP)
Temporizador 0 Canal de cemunicacten serle EUSART
Temporizador 1 Canal de comuoicaci6n serie MSSP
Temnorizador 2 MOdulo 8nslol!ico de comnaraclon
Temporlzador 3 Canal de transmislon de datos en paralelo (SPP)
Convertidor AID Acceso a memoria cxrerna (EMA)
I Unidad de CompJlrllci6n/CapluralP\V'\1 (CCP)

8.2.12.1 Puertos de entrada/salida


El PIC18F4520 dispone de 5 puertos de E/S que incluyen un total de 36 lineas digi­
tales de E/S:
PUERTO. LL~SDEENTRADNSAUDA
Po.RTA 8 LlNEAS DE ENTRAD1VSALJDA
Po.RTB
PORTC
8 LINEAS DE ENTRADA/SAUDA
6 LlNEASDE ENTRADNSALIDA + 2 LINEAS DE E]\iRADA
t;
Po.RTO 8 L1NEAS DE ENTRADNSALIDA 'I'
PORTE 3 LL~AS DE ENTRADA/SALIDA + J LINEA DE ENTRADA :'i

Todas las lineas digitales de E/S disponen, como minimo, de una funcion aItema­
tiva asociada a alguna circuiteria especifica del prc. Cuando una linea trabaja en el
modo alternative no puede ser utilizada como linea digital de EjS estandar.

FRD:_:V.:::.J <--')-... ----,

Figura 8. Esquemade un terminaJ

224
8. Gama Alta - PIC18

Cada puerto de E/S tiene asociado 3 registros:


• Registro TRIS: mediante este registro se configuran cada una de las lineas de
E/S del puerto como ENTRADA (bit correspondiente a '1') 0 como SALLDA
(bit correspondiente a '0').
• Rcgistro PORT: mediante este registro se puede leer el nivel de pin de E/S y
se puede establecer cl valor dellflfelt de salida.
• Registro LAT: mediante este registro se puede leer 0 establecer el valor del
latch de salida.

8.2.12.2 Temporizadores

TEMPORlZADOR 0:
• Configurable como temporizador/contador de 8 bits/16 bits.
• Pre-escalar de 8 bits programable.
• lnlerrupcion por desbordamiento,

TEMPomZADOR 1:
• Configurable como temporlzador/contador de 16 bits.
• Dispone de un oscilador propio que puede funcionar como:
• Sefial de reloj del temporizador 1.
• Serial de relo] del PIC en mod os de bajo consume.
• Pre-escalar de 3 bits programable.
• lnterrupcion por desbordamiento.

TEMPORlZADOR 2:
• Temporizador de 8 bits (registro TMR2).
• Registro de periodo P(Z2.
• Pre-escalar de 2 bits programable (1:1, 1:4, 1:16).
• Post-escalar de 4 bits (J:1. .. l:16).
• Interrupcion por igualdad entre TMR2 y PR2.
• Se puede utilizar junto con los modules CCP y £CCp,
• Se puede utilizar como selia I de reloj del modulo MSSP en modo SPI.

TEMPORIZADOR 3:
• Con figu rable como temporizador/contador de 16 bits.
• Dispone de varias opciones de sefial de reloj en el modo temporizador:
• Oscilador principal con 0 sin pre-escalar.
• Oscilador del temporizador 1 con 0 sin pre-escalar,

225
Compilador C CCS y Simulador PROTEUSpara Microcontroladores PIC

• Pre-escalar de 3 bits program able.


• lnterrupdon por desbordarniento,

h... (filet,
I:" Nolused g.".,u.,.,
ITT rs •2...
a", Irte""" 4",
e>4_Uo_h
18m.
"'_"-Io_1 a",
3Sm. 1 S ...
nm. F,~I- 32",
64 U1
144 ...
lZ8",
298 ... Ov",flow Il"", 25.6 ...
57&"" 512 "'
1152"" LA1..:_ll!f
~ ... A'c:c_8_B~

lan, ' i.::tCI ....

A"""""," Ow:rllow ~Embled OvedllMPOIlOIf


O,.abIed
Intemol .2"" 13.1""
l'i=iutQn .0 ,- ·2",
E_ 4...
But
<62""
52.' ""
214
8 ill
11"1.",,,,,_
I G", 164m. r.; ·2w
,32", 1 r·

Figura 9. WDT Y TMRO,TMR' Y TMRZ

r'Lli Tw._.
r~3

Ol$abled
l...temai
El<lernai
El.1ef1lalSsone

2", 131ms
4\1$ 262nu
8u, S2Am:
16u: 104m.

r,equeney 5 OOQ 000

Figura 10. TMR3

8.2.12.3 Convertidor Analogico-Digital


• 10 bits de resolucion,
• 13 canales multiplexados.

226
8. Gama Alta - PIC18

• Sefial de reloj de conversion con£igurable.


• Tiernpo de adquisicion program able (Oa 20 TAD).
• Posibilidad de establecer el fango de tensionesde conversion mediante ten­
siones de referencia externas .
•n'llOII'''IfJ'.'
,,,,,,'rlgP'r,
None
ADAl A2A3AljEO E1£28283818480
'i"1l'"11 . .,
~
, ADA' A2A3A5EOE.lE2828381 B~ U""~ ()'11l23 .,
AOA1.6.2A3A5EOCI £2929381 if:
ADAl A2A3A\\EOEl £28293
, AOA1A2A3A5EOEl E2B2
OOi:k 4~, .. [

;,"
AOA1 A2A3A5 EO£l E2 Ac~$ioon line 1 2 ua y
ADA' A2A3A5 EO EI
ADA' A2A3A5EO
ADAl p.2A3A5 :
ACiAl A2A3
AOA1A2 i~:
AOA'
AD ::1:
b'
Figura 1,. Modulo AD

8.2.12.4 Canal de Comunlcaclon Serle (EUSARTJ


Caracterlsticas fundarnentales:

• Modos de trabajo:
• Modo asincrono de 8 bits.
• Modo asmcrono de 9 bits.
• Modo sincrono Mnestro.
• Modo sincrono Escitwo.
• Auto-activacion por detecci6n de dato recibido.
• Deteccion automatica de velocidad de comunicaci6n (bnNdrnte),
• Transrnision y deteeei6n de caracter de BREAK (bus UN).

RS232tl1

S~ltd 9600 1re~brl_wcl


Olr. a y
]1.-1
JFIo.lI_~
lEllor;
Roo".., C7 10RGHI(l( Figura 12.
Comunlcacl6n Serle

227
Compilador C CCS y Simulador PROTEUSpara Microcontroladores PIC

8.2.12.5 Modulo Master SSP(MSSPJ


El modulo MSSP es un interfaz serie capaz de cornunicarse con perifericos u otro
microcontrolador. Puede operar en dos modos:

• Serial Peripheral Interface (SPl).


• III ter-ln regratedCircuit (J20.
La interfaz 12C admite los siguientes mod os:

• Master mode.
• Multi-Master mode.
• Slave mode .
.flll

HOIdw",.SPl~l

Mo,t., i:.
S18..
0" ~ l!
• et.P.o C~(.()
CKP,O Ck.E.l
CI\P.'CHoO
CKP.' CX[.,
• •
DIVtda by.
DIVIde by IS ., U1.. 12': .... "1• • F~t
DIVtda by 64 • Sb•• s....
UreT_2 SO" C'
SCL C3 LJR_"_""
F~' ...
S~mpl. 01End

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

Figura 13. Modo SPI Figura 14. Modo 12C

8.2.12.6 Modulo de Compraclon/Captura/PWM ,CCP)


Dispone de tres modos de funcionarniento:

• Modo de Captura: so utiliza para rnedir eventos externos como la duracion de


puJsos digitales.
• Modo de Comparaci6n: se utiliza para generar sefiales digitales con ternpori­
zaciones program abies. Este tipo de sefiales son muy utiles para el control de
etapas de potencia (convertidores DCIDC, DC/AC, AC/DC, AC/DC).
• Modo PWM: se utiliza para generar senates de modulacion de ancho de pulso
(PWM).
Tarnbien existe un modulo de comparacion/capturalPWM mejorado (ECCP).

228
8. Gama Alta - PIC18

Dispone de cuatro modes de funcionamiento:


• Modo de Captura: se utiliza para rnedir eventos extemos como la dnracion de
puls os digi tales.
• Modo de Comparaci6n: se utiliza para generar sefiales digitales con tempori­
zaciones programables. Este tipo de seiiales son muy utiles para el control de
eta pas depotenda (convertidores DCIDC, DCI AC, ACIDC, ACIDC).
• Modo PWM: se utiliza para generar sefiales de modulacion de ancho de pulso
(PWM).
• Modo PWM mejorado: se utiliza para generar sefiales PWM complementa­
rias para el control de semipuentes de transistores,

CCPX
•.;p '9,e'"
Hod.. C1plKln
Of! • 5000.000 Khz. Out)i=O10 4
capMe
1250.000Khz DUll""O 104
Compate
F'WM 312.51)0 Khz. Duty=O fa 4

Pulse V(,dlh Modulator O!.ilpIA I)(l

,.....I"'p )-c:jI Jg
Oul' II Dr~"
FuII8ndge Olf
Full Bridge reveree C"."palato! 1 OIApul
HeU Bridge i:omparl!iof 2 oufW

PltIt A end C ShuldownSl~e Eilhet Compar~or


DrIVe pint A "nd C to '0' , AEO
ABO orCotIlparotlJll
Pir~ B and 0 Shutdown Stale ABO 01 Comp.oraior 2
Drive Pins B ar>d 0 10'0' ABO or Ellner Co~ah:>!

FIgura '5. Modulos CCPY ECCP

NOTA

El modulo ECCP no firnciona correctamente en Ja Ultima version del Proteus.


Es de esperar que LabCenter Lo solueione en breve.

229
Compilador C CCS V Simulador PROTEUS para Microcontroladores PIC

8.2.12.7 Modulo Comparador


El modulo de comparadores analogicos contiene dos comparadores que pueden ser
configurados de distintas formas. Las entradas pueden seleccionarse entre las entradas
analogicas de los pins RAO a RAS. Las salidas digitales (normal 0 invertida) son aceesi­
bles exteriormente y pueden ser leidas a traves de un registro de control
r~;;I"f

Gnd
Goo V O 1....1
Gnd
Gnd t>o I~

Figura 16. Modulo Comparador

8.2.12.8 Modulo de referencia


EI modulo de referenda esta Iormado por una red de resistencias y pennite selec­
cionar una tension de referenda.
te
Oft 2.81 1.04
~I'
1.25
1.41
2.97
3.13 . 1.25
1.46
1.56 3.28 1.S7
11
172 3.44 _ 1.00
100 ,- 3.59 2.08 tt
2.03 UOO 2.29
2.19 021 2.50
2.34 0.42 2.71
2.50 0.63 2.92
2.66 0.83 - 313
OVrer ..>F5 :::J Comp -} Vrel
~I
Figura 17. Referencia

8.2.12.9 Modulo detector de Alto/Bajo Voltaje


Este modulo program able permite, a1usuario, definir un punto umbra! de tension
y 1adireccion de cambio. Si el dispositive experimenta un cambio en la tension yen
1a direcci6n indicada sobre el punto umbral se produce una inrerrupcion.

230
8. Gama Alta - PIC18

II I(

Figura 18. HLVD Y LVD

Ejemplo 1: Diseiiar '111 Reloj en Tiempo Real (RTC) utilizando la interrupcion del TMRI
con oscilador exterior; urilizar para la visualizacion WJ display de 7 segmenfos (figura 19).
Catnponentes ISIS: PlC18F4520, RES, 7SEG-BCD !J Generador ISlS: Pulse.

Figura 19. EJemplo I

EI Proteus tiene un components 7SEC-BCD que es un display 7 de segmentos con el


decodificador 7 SEC-BCD integrado, 10 que facilita la simulacion.

EJ empleo del TIMERl con osciJador exterior permite trabajar a dicho TIMERl in­
duso cuando el PIC esta en modo sleep. EI Proteus no simula el oscilador extemo
del TMR1 con crista! de cuarzo (figura 20), por 10 que hay que sustituirlo pOT un

231
Compilador C CCS Y Simulador PROTEUS para Microcontroladores PIC

generador de pulsos con la frecuencia adecuada e inrroducirlo por el pin RCO/TlO­


SO (figura 21). Al editar las caracterlsticas del generador de pulso hay que cambiar
el Pulse (High) uoltn]: a 5 V Y La[I'eqlle7lcy a 32.768 Hz.

Para conseguir una interrupcion cada 1 seg con dicha frecuencia hace falta precar­
gal' el TMRl a Ox8000segun los calculos de la siguiente ecuaci6n.

Figura 20. TMRI con oscllador de cuarzo externo

U2(RCOI rlOSOITI 3CKII

Figura 21. TMRt con oscllador externo slmuhdo con un generador

"'_ PI" 11n~rl«:J1


• ~~I'"
","", r"'h'"~=l
fit
Au<!
",*"'Wdtli1Ulj
£I'Po"~'"
<r'M • PIAt''''odoi,f'II '50
r,?,,,,,,,,,
>I"""IS,,,,
S<Qotdo- • "_IH'~
;"'110"''' ~I~~d
CIo.,
PtfIM~ i.1)<;lwG,«,j>,

c........s""".?
l··",.eelor.
(!j...... Ed.. ?
~Ii.jol'l_'..?

Figura 22. Caracterfstlcas de. generador Pulse

232
I.II-._-PIC1I

La interrupci6n del TMR1 debera ser de alta priondad. los datos en ......,~''"''
gundos, minutes y horas) se deben paS"'f a dol' digitos en BCD.

NOTA

Sc han utilizado los puertosA, By D (ya que el C es necesario parael oscilador). En


el puerto A de los PICl8, la patilla RA4 ya NO es un Drenadot Abierfo pero el PRO­
rEUS sigue tratandola como tal, por 10que haec falta una resistenda de pull-III' a
la salida. En realidad esto no seria necesario. Por otra parte, 13 sirnuladon no es cn
tiempo real par 10 que J c;egundo de simuladon puede tardar varios segundos de
procesador del ordenador: se puede comprobar la reladon en la bema inferior del
Proteus donde nos indica el tiernpo de procesado (figura 23).

FIgura 23. Tlempo de procesado


tlnclude ,18F4520.h>
#devic~ high_ints·true /IPara manejar inter~upciones de alta prioridad
#IH.'e delay (clock-l0000000)
int:hores O,minl.lcos ..O,segutldos-O;
int LSdigito, MSd~9ito,BCD;
#IN'l'_2'IMERl high /lIncerrupci6n de alta pr1.oridad del TMRl
VOJD J.nt_tmt·l (void)
I
segundost.; //Cuenta los segundos
1f (segundos~-60J
(m.inutos+; //Cuenca los l7I.inutos

233
Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC

segundos"O; J
if (mlnutos....
60)
(horas++; IICuenta las boras
minutos~O;J
if (horas-~24) horBs~O;
set_timerl(OX8000); IIPrecarga el TNMRI anres de salir

void BINaBCD(inc valor) ( IIFuneion de conversion de Binario a BCD


MSdigito-O;
if (valor>-10)(
dol
valor-valor-IO;
MSdigiro++;
!while (valor>~lO);

J.,Sdiglto-valor; IIUnidades en BCD


MSdigito-Msdigito«4: IIOeeenas en BCD (se desplazan a la parCe
IlaHa del int)
BCD-MSdigito I LSdigito; IIOR entre los dos numeros para obcener un
Ilentero que se pueda sacar directamente por
Ilel puerto
void main ()
(

secup_adc_porrs (NO_ANALOGSIVSS_VDD);
setup_wdt(WOT_OFF);
setup_ timel._l(Tl_EXTERNALITl_DTV_BY_lJ ; IITMRI con oscilador externo
Ilmodo asincrono y prescaler-l
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE):
serup_oscillator(False) ;
enable_interrupes(INT_TIMERl);
enable_incerrupeS(GLOBAL);
set_Cimerl(OX8000); IITMRl-6SS36-(1ITOSCl)~65536-32768~32768-0x8000
whlle(rrue)

BINaBCD(segundos); IICom-ieree los segundos de binario a BCD_.


OUTPUT_D(BCD); IIIos sees por el puerto D.
BINaBCD(minutos);
OUTPUT_B (BCD);
BINa8CD (nore»);
OUTPUT_A(BCD) ;
)

Figura 24. Programa del Ejemplo t

234
8. 6ama Alta - PIC18

Es necesario deshabilitar el watchdog en el PIC (figura 25).

PCBP..,J..
Prog... r..
I'rocottoI Clock F,_
M._"'__
• N.

r_,_s.......
"",
fi,th. "om PCII~ .....
EdII"PlOIJI'II ....... '"

Figura 25. Deshabllltacion de. Watchdog

Ejemplo 2: Elcuador de tellsion (llO/tajr-boost conterter) COil realimenmcion de control (6-


gura 26). Compouentes [SIS: PIC18F4520, RES, [RF130, TNDUCTOR, 108Q015 Y CAP.

Figura 26. E'evador de tension

NOTA

En PROTeUS, el m6dulo comparador en el modelo del PICIS no funciona co­


rrectamente en la simulacion, asi tambien el modulo ECCP tiene algunos pro­
blemas. Esperemos que LabCenter 10solucione en breve.

235
Compllador C CCS y Simulador PROTEUSpara Microcontroladores PIC

Se configura el modulo ecp para trabajar en modo PWM y el comparador para


que compare la sefial de salida (dividida por un coeficiente) y la tensi6n de refe­
rencia interna (en este caso se fija a 3.59 V aunque se puede modificar su valor por
programaci6n). En cl programa se modifica el modulo de referenda con 101 funcion
setup_vrefO, pero el cornparador se modifica directamente en su registro CMCON
ya que con la funcion serup_comparatorO existe un incorrecta asignacion de valo­
res en el fichero <18F4520.h>.

El modulo de referenda se configura para obtener un valor de 3.59 V mediante la


programaci6n del registro CVRCON=ObllOOll11 0 en compilador C de CCS: se­
tup _vref(VREF ..H1GH 115IVREF _FS).

El modulo comparador se configura para introdueir la serial externa por RAO y


utillzar 101 referenda interna (figura 27) mediante la programaci6n del registro
CMCON= ObOOOOOllO, en C deberla ser setup_comparator(AO_ VR_Al_ VR) pero
se ha detectado un error en la asignaci6n #define del fichero de cabecera (se puede
modificar 0 utilizer directamente cJ valor de CMCON). La frecuencia de la sefial
PWM se ha fijado en 4 KHz.

A CM2. CMO- 110


RAO
RA3~~
• CIS:rr'~__ ClOUT

C20UT

VREF

Figura 27. Modo del comparador

EI sistema funciona en un equilibrio dlnamico, mientras la tension de salida (divi­


dida) sea rnenor que la VRlf la serial PWM acnia, si es mayor la senal PWM es O.De
esta forma se consigue una tension continua en la salida del convertidor. De esta
forma se consigue una V"Il,=20± 0.27 V.
Es importante inicializar la salida (con un label IC=S sobre el cable) para evitar
errores de convergencia en la simuJaci6n.
lIinclude <18f4520.h>
Iffuses X2', NOWDT
#use delay(clock-4000000)
(byte CMCON-OxF84
IIbyteTRISA-OxF92

236
8. Gama Alta _ PIC18

void main () (
.int16 dl,Jtcy;
TRISA- Obll1010ll;
CMCON- ObOOOOOllO; //setup_comparator(AO_t~_AI_VR);
setup_vl·ef IVRIU HIGHI151 VREF_FS); //CVRCON=Obl1001111;
setup_ cimel,_2 (T2_DIV_BY_ 4,62,1) ; /14 KHz
secup_ccpl (CCP_PWM); //CCPl en modo PWN
set_pwml_ducy (714);

while (1) (

IP(CIOUTJ dutty-714/ //S~ VoutlCoef < I'REF


.,1".. dot ty"'O; 1151 VOIJt/Co@f > VREF'
set_pwml_dl,Jey (duety) ;
)

FIgura 28.Programa del ejemplo 2

Si se quiere utilizar una VREf distinta a la interna para ajustar mas finamente la ten­
sion de salida, se puede utilizar el m6dulo comparador segun la figura 29, introdu­
ciendo la sefial por MD y una referenda extema por RA3.

CM2 ..CMO = 100

C20UT

Figura 29. Modo del Comparador

FIgura 30. Clrculto con referenda eJrterna

237
Compllador C CCS y Simulador PROTEUSpara Microcontroladores PIC

linclude <18f4520.h>
Ifuses X-,NOWDT
iuse delay(clock-4000000)
Ibyte CMCON-OxFB4
Nbyte TRISA-OxF92
void main () (
inc16 dutty;

TRISA- OblllOlOll;
CMCON- ObOOOOOlOO;
setup_tlmer_2(T2_DIV_BY_4,62,1);
setup_ccpl(CCP_PWM);
sec_pwml_duty (714);

while(l) (
IF(CIOUT) dutty-714,'
else ducty-O;
set_pwml_duty(ducty) ;
J

Figura J 1. Programa para referenda edema

238
9. Real Time Operating System - RTDS
----------------------------------------------

Capitulo 9

RTOS - Real Time


Operating System
9.1 Introduce;on
El Sistema Operatioo en Tiempo Real simplifica el desarrollo de una aplicacion y,
mediante e1 uso de tareas, reduce los errores de programacion. En general, se pue­
de definir un RTOS como un program a que trabaja en segundo plano, controla la
ejecucion de varias tareas y facilita Lacomunicaci6n entre el1as.En el caso de que se
este ejecutando mas de una tarea al mismo tiempo, el sistema se denomina multi­
tarea; cada tarea tiene asignado un tiempo de procesador.
El RTOS no es exactamente UJl SO (sistema operative) a pesar de que los dos se
basan en un nucleo (kernel) que se encarga de controlar la de ejecucion de las tareas,
La diferencia estriba en la carga inicial, si es solo el nucleo (RTOS) 0 si ademas se
cargan otros procesos (SO). El RTOS esta pensado para trabajar con los micro con­
troladores. Puede utilizarse en los PIC de gama media pero donde mayor rendi­
miento se obtiene es en los PIC de gama alta.
E1RTOS que utiliza CCS permite eJ PIC ejecute regularmente las tareas program a­
das sin necesidad de interrupciones. Este se logra a traves de la funcion RTOS_
RUNO que actua como planificador de tareas (dispatcher).La funcion del planifica­
dor consiste en dar el control del procesador ala tarea que debe ejecutarse en un
memento dado.

Cuando la tarea ha terminado de ejecutarse 0 ya no necesita del procesador, el


control de dicho procesador es devuelto al planificador el cual dara el control del
procesador a la siguJente tarea que este Iista para ejecutarse en ese momento. Este
proceso se conoce como cooperative multitarea (cooperativemulti-tnsking)
Un buen ejemplo de la optimizacion del uso del PIC con el RTOS es el PiD utilizado
en el tema sobre el modulo CCP para regular la temperatura de un homo (ejemplo

239
Compilador C CCS y Simulador PROTEUS para MicrocontroladDres PIC

5). Estudiando el program a realizado en esa ocasi6n se observa como el PIC esta
totalmente ocupado en realizar el proceso Pill; 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 elRIOS en dicho ejemplo, no solo se simplifica el programa sino que


adernas se consigue rnejorar la respuesta en el sistema ya que se optimizan los re­
cursos del micro.

De 105dos casos estudiados (tiempos de muestreo de 100 ms y 1 ms), en e1primer


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 afiadir facilmente mas tareas a1
PIC como veremos en los proximos ejemplos.

-"-~--~-fl-1t-~---
~:' =:-:-:=--=J-=-..=-c=-c=~:.=-:.=-_=--r~=-=-=-=.j.F--'-::..:-::..:-=-=r=-=-1I f-: :::_:;-I~~;:=~==ft-I _-_-_-.1;-1 --'Ij;
:-I--_-t~
..-+---+-r_-'-~-~f----j--t-..:.:.---+---:I;I-~-:.---r-y~-J-I+-J~I =r="Tl
• ~IOA~ .... 1 - I ms
_,_~I
'~~/~~~--~·~~TO~S~~----~~II.~~/I_==±~_·7-_c~omn~kr~~~~rf
~~~ __ ,_ __ Wum" '+-~-T--r--~~----T-~r
oI-I--+--I--t----I--t---+--;I··-' +- t- j- - ..--+-----1--

:~___+---l----+--~-~f__I[:~I
I

: .. --.,..,.. .L-.--:-.l.....,.. .}•.- _.... • ..- .•~ ..~-


..- 1 1-

Figura 1. Respuesta del PID con y sin programacion RTOS

9.2 RYOS en C
Las funciones que incorpora CCS para 1agestion del RTOS son las que aparecen en
1a siguiente tabla:

240
9. Real Time Operating System _ RTOS

rtos_runO lnicia la operaei6n del RTOS. Todas las iareas sc ejecutan


a traves de esta funcion.
r--- --
rtos_ terrninateO Finalize In operaci6n del RTOS y dcvuclve el control al
program a principal. a la linea siguicnte de la funcion
rtos runt), E!> como una funcion RETURN.
I·tos_cnablc(task) Habilita una de las tareas RTOS. Una \CZ la tarca os
habilitada, In funcion rlos_run() llamara a esta tarea
cuando Ie toque por tiempo. EI parametro de esta funcion
es 01 nornbre de la tarea.
rtos _disnblc(task)
- Deshabilita una de las tareas RTOS. Una vez la tarea es
dcshabilitada. In funci6n rtos runt] no llamara a esta tarea
hasta que vuclva a scr habilitada medianrc la funcion
rtos _mab/eO.EI parametro de esta funcion es el nombre
(.II! la tarea.
rtos_msg_poIlO Devuelve un TRUE si hay un dato en la cola de mensajes
de tareas.
rtos_msg_rcadO Devuelve el siguientc byte del dato contenido en la cola de
mensajes de iareas.
I'toS_Rlsg_lIend(task,byte) Envla un byte de datos para una tares concrete. EI daio cs
situado en la cola de mcns~s j~ tareas,
rtos__yieldO Sc llama desde una de las tareas y devuelve el control del
prograrna a la funei6n rtosjunt), Todas las tareas dcben
tenor una lIamada a esta funcion al final de su c6digo.
~s sigllal(scrn) Incrementa un SEMAFORO que se utiliza para difundir la
disponibilidad de un recurso lirmtado.
r-rtos_wait(scm)
---
Espera a que el rceurso asociado con el semaforo este
disponible y entonces decrementa el scmaforo para
reclarnar el recurso.
~!I_await(exprc)
- Lspera a que la EXPRESION sea TRUE antes de permitir
que la tarea continue.
-rtos_overrun(tnsk) Rctorna un TRUE si la tarca ha sobrepasado el ticmpo
permitido de ejecuci6n.
rtos _stafs(task,stat)
---
Retorna una EST ADISTICA de una tarea concrcta. La
cstadistica incluye cl tiempo minimo y maximo de
ejecuci6n de la tarea y el tiempo total que la tarea ha
sobrepasado su eiccucion.
Las directives asociadas son dos:

#use rtos (options)


Las options pueden ser las siguientes (separadas pOl'comas):
timer=X: donde X (0 a 4) indica el TIMER que se utilizara para la ejecucion de
las tareas. EI TIMER seleccionado debe utilizarse para el RTOS.
minor_cycle=time: donde TIME es un numero seguido de 5, ms, ps 0 ns, Indi­
ca el tiempo que debera tardar en ejecutarse una tarea, Los riempos de ejecu-

241
Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC

cion de cada tarea deben ser multiples de esta cantidad. Si no se especifica, el


cornpilador se encargara 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 51-
gue es una tarea de RTOS.
Las options pueden ser las siguientes (separadas por comas):
rate=time: donde TIME es un numero seguido de 5, ms, ps, 0 ns. Especifica
1a frecuencia con se ejecutara la tarea. Debe ser igual 0 multiple del valor mi­
nor_cycle.
max=time: donde TIME es un numero seguido de s, ms, /-lS,0 ns. Especifica
el tiempo de ejecucion de la tarea. Este tiempo debe ser menor 0 iguaJ que el
valor millar_cycle. EI compilador no puede hacer cumplir este tiempo por 10
que el programador debe tener cuidado en asignar el tiempo de ejecuci6n.
Ademas, este tiempo activa la funcion rfos_overnm(fask).
queue=bytes: especifica cuantos bytes son colocados en la cola de mensajes.
El valor por defecto es O.
Como primer ejemplo se puede utillzar el controlador PID (ejemplo 5) del lema
sobre el m6dulo CCP. Comparando el programa escrito en aqueUa ocaston y el que
se presenta ehora con RTOS (figura 2), se observa que el bloque del PID que estaba
en el programa principal es ahora una tarea. EI tiempo de mueslreo estaba especi­
ficado con un delaY_lIIs() y ahora se utiliza el tiempo de ejecuci6n de la tarea como
tiempo de muestreo. Tal como se ha comentado en el punto anterior, se ha obtenido
una rnejora en el funcionamiento del sistema (Figura I).
#INCLUDE <16F877.h>
[device adc-l0
fuse delay(clock-4000000)
Ifuses XT,NOWDT
IByee TRISC - Ox87

luse rtos(timer=O,minor_cycle:lms) IIDirectiva del RTOS

int16 valor; Illectura de temperatura


int16 control; Ilvalor del PWM
tloet: a-0.1243; Ilconstances del prD para lOOms
floacb=O.00006;
Iloet: c·62.1514;
float temp_11mit-5DO.O; Ilcpmperacura a alcanzar
float rT,eT,pT,qT,yT,uT; Ilvariables de ecuaciones
floatpT_l-O. 0;
float eT_l-O. 0;

242
9. Real Time Operating System _ RTOS

floatmax=lOOO.O; //limites maximo y minimo de control


float min-O.O;

Ntask(rate-lms, max#lmsj I/Indica que la siguiente funcion es una Tarea


void pid ( ); Ilque se ejecutara cada lOOms.

void ma~n() (
TRISC-O;
setup_timer_2(t2_div_by_4,249,1); //Periodo de la se~al PWM a 1ms
setup ccpl (ccp_pwm); I/Modulo CCP a modo PWM
setup_~dc_portsrall_analoq); I/Puerto A analcgico
$etLlp_adc(JlDC_CLOCK_INTERNAL) ; //reloj eonvertidor AD interne
set_sdc_channclrO); I/Lectura por e1 canal 0

rtos_run ( ); I/Inicia la operaclon de RTOS

voi.d pJ.d ( //Tare8 PID

output_bi r ( PIN_CO, 0);


valor=read adell;
yT-vDlorYSOOO.O/1024.0;
rTatemp_limlt;
eT-rT-y'1';
pT-o"lreT+pT_l,-
q2'-c· (6T-eT_1);
uT=pT+a'eT+qT;
if (u'Z'>fflax) {
uT-max; I
else (
sr (uT<min)I
uT=min;}

control-uT;
set_pwml_duty(control};
pT_ I-pT;
eT_lreT;

Figura 2. Programa del PIO con RTOS

En el ejernplo se puedc afiadir una tarea que permita visualizar en un display LCD
la temperatura que tiene en homo (figura 3). AI rnanejar varias tareas es convenien­
te utilizar la funci6n rtos_yieldO para devolver el control aJ planificador de tareas

243
Compilador C CCS Y Simulador PROTEUS para Microcontroladores PIC

y coord ina I" las tareas mediante las funciones rtos_waitO y rtos_signaJO; para utili­
zar estas dos funciones se debe utilizer un "sernaforo", el cual permite a una tarea

--~
utilizar til, recurso compartido 0 esperar en eJ casu de que este en uso.

!IIl.e

••.211'----::r-"---,1--+---+---I

~ .e /
v

L1.
~BAr'
I;

I T"""'" 35.64 I
~~~~t~ 85Sa~SgQ
~tJ ," [+I+Iffrr-

Figura 3. Dos tareas: PID y DISPLAY

En este ejemplo no se utlliza ningun recurso compartido, pOl' 10que no se utilizan


las Iunciones rtos_waitO y rtos_signaIO.
UNCLUDE <l6F877.h>
#device adc-10
#use delay(clock-4000000)
#fuses .'(2',NOWDT
#include <lcd.c>
duse x cos (t i filei=0 , mi; I) or_ cycle-lms)
Myte TRISC - Ox87
Jnc16 ve Lo r, cont.rol;
float 0-0.1243/
floa t b=t), 00006/

244
9. Real Time Operating System _ RTOS

float c-62.1S14;
float temp_llmit-SOO.O;
itoat: rT,oT,pT, qT,yT, UTi
llost pT_l-O.O;
floltt (':7_1-0. 0;
ilo~tm~x-lOOO.OI
floatmin-O.O;
floattempera;

tCaSk(rate-lmo,maxElms) //Tarea ael PID


void pid ( ),.

I/Tdred d~l DISPLAY


vo ui dl:oplay( );

vai d i n (I
nIlI (

Ic::d j nlt ();


TRISC-O;
seWp_ciml'1l_2It2_dl v_by_ 4,249,l),.
SElt· UP. cCl'l (ccp p ••'m);
sotup_udc_ports(all_dnalogl;
.... tup_itdc (ADC'_CU)(,K_INTERNALJ ,.
set_3dc channel (0);

n:os_run ( );

void p.1d ( I //Tarea del PID


{
valor-read_adc(l;
yT"valol ·SOOO. 0/1024.0;
rT-cemp_llml tl
eT-rT-yT;
pT-b*eT+pT_J;
qT-c' ter-er 1);
uT=pT+-a'eT+qT;
~[' (u2'>max)
uT-max; I
else (
if (uT<minl(
uT-mll1; J

cont.roi=ur,

245
Compilador C CCS y Simulador PROTEUS para MicrocontroladDres PIC

set_Plvml_duty (control);
pT_l=pT;
eT_l=eT;

rtos_yie1d (); liSe devuelve e1 c~ntrol al planiilcador


)

void display () IITarea del DISPLAY

1 cd_ gotoxy (1,1) ;


tempera=yTIIO;
prin tf (lcd_putc, "Temp= %F", tempera) ;

rtos_yie1d() ; liSe devuelve e1 control al p1aniticador

FIgura 4. el programa

Las variables se pueden definir de forma global a particular como en cualquier


funcion, En el caso de variables globales, todas las tareas pueden utilizarlas, perc
en el caso de funciones particulates se pueden utilizar Jas funciones de correo:
rtos_msg_pollO, rtos_msg_readO y rtos jnsg sendltask.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 correo (aunque la variable sea global tambien se pueden utilizar).
En el caso de variables glob ales puede ser interesante el usa de estas funciones en
aquellos cases en los que una de las tareas este esperando que la variable modifi­
que su valor a traves de otra tarea.
Para utilizar estas funciones en el ejemplo se modifica la llamada a la tarea DiS­
PLAY Yse anade una variable para el correo (figura 5).
INT16 valor_l;

#task(rate=lOms,max=lms,queue=2) IIC01a de 2 bytes.


void display! );
Figura 5. Modificaciones del programa II,

Se realiza el envio de la variable valor desde la tarea PID y se recibe en la tarea


DISPLAY para su posterior uso (figura 6). El resultado es similar al del ejemplo
anterior.
void pid ( )

valor=read_adc();
yT=valor*5000.011024.0;
rT=temp_limit;

246
9. Real Time Operating System _ RTOS

IIEl resto de codigo como siempre


rtos_msg_send(display,valor); IIEnvia los 2 bytes de valor a DISPLAY
rtos_yield ();

void display t )

valor l~rtos msg_read(); IIRecibe los 2 bytes de Valor

tempera-valor_l·Soo.011024. 0;
lcd_gotoxyll,l);
printf(lcd_putc, "Temp= 'l.F", tempera);

rtos_yield () ;

Figura 6. Modiflcaciones del programa (If)

Para term inar con este ejemplo se ha aiiadido una tercera tarea que permita modi­
ficar Ja temperatura limite en cualquier momenta mediante un boron en la patilla
REO. Para esta tercera opcion se ha cambiado a un PIC18F4520. Como ya se ha
comentado, el RTOS adquiere toda su eficiencia enlos PIC de gama alta (Iigura 7).

Figura 7. Tres tareas: PID, DISPLAY Y TECLA

247
Compilador C CCS Y Simulador PROTEUS para Microcontroladores PIC

Dado que en este caso se modifica una variable en dos de las tareas es conveniente
utilizar las fundones rtos_wait() y rtos_signalO (£i.gura8).
#INCLUDE <18F4520.h>
#device adc=10
luse delay(clock=4000000)
IIfusesXT,NOWD'I'
linclude <lcd.e>
luse rtos(timer=O,minor_oycle=lms)
luse standard_io(B)
juse standard_io(e)
#deEne BO PIN_BO

int16 valor; //lectura de temperatura


int16 control; //valor del PWM
floata=0.1243;
floatb=O.00006:
floatc=62.1514; //constantes del PID
float temp_limit=50D.0; //temperatura a alcanzar
floatr'I',eT,pT,qT,yT,u'I';
uos t pT_l=O. 0:
110at eT_l=O.O; //variables de ecuaciones
floatmax=1000.0;
floatmin=O.O; //1imites maximo y minimo de eoncrol.
float tempera; //Para visualizar 1a temperatura del horno.
int16 t_l; / /Para visualizar la tempera tura limite.
ine8 sem; //Variable de semaforo.

#task(rate=ims,max=lms)
void pid ( );

Itask(rate=lOms,max=lms,gueue=2)
void display( );

#task(rate=10ms,max=lms)
void teclado ( );

void maine) I

lcd_inic ();

248
9. Real Time Operating System _ RTOS

setup_timer_2(t2_div_by_4,249,lJ; Iperiodo de 1a senal Pffl~alms


setup_ccpl (ccp_pwm); I Modulo CCP a modo Pf-lM

ser.up_adc_ports(all_ana1og); //Puerto A ana16gico


setup_adC(ADC_~LOC~lNTERNALJ; //reloj converc~dor AD incerno
set_adc_channel (0) ;

sem..l;
rtos_run ( );

void pid ( )
(

;rtos_l~<Jjt (sem);

valor-read_adc(); //Lectura d~ la temperatura


yT~valor·5000.0/1024.0; / /convers ion a mV (0. 25V a 250mV)
rT-temp limit;
eT-rT-yT; //Calculo error
pT"V'eT+pT_l; //CJlculo del termino integral
qT"c' (eT-eT_1),. //C61culo ,
del termino derivativo
uT-pT+a 'eT+ql'; //Calculo de 1a salida PID

if (uT>mllx) //S811da prD s1 es mayor que e1 MAX


uT~max;,
else I
if (uT<min){ //Salida prD si es menor que e1 MIN
ur-min; }

control-uT,. //Transferenc2a de salida prD 8 se~al PWM


set_pwml duty(control);

pT_l-pT; / /cueraer vanables


eT_1-eT;

rros_signal(sem);
rtos_yleld();

void display ()

reos_wait;tsem) ;

249
Compilador C CCS Y Simulador PROTEUS para Microcontroladores PIC

tempe==yT/IO;
lcd_gotoxy(l,l);
printf(lcd_putc, «Temp=%F\n», tempera);
t_l=temp_limitllO;
printE(lco_putc, "Limite= %£u", t_l);

rtos_signal(sem);
rtos_yield();

void teclado I)

reos _ wa~t tsem);


if (input(PIN_C4)==O) temp_limit=t~o_limit+lO.O;
if (temp_limit > 1000.0) temp_limic=500.0;

rtos_signal(sem);
rtos_yield() ,-
J
Figura S. Programa con PIC! SF4520

250

10. USB - Universal Serial Bus

Capitulo 10

USB - Universal Serial Bus


NOTA DEL AUTOR

Cuando este libro estaba practicamente en imprenta, LabCenter .realizo una


actualizacion de la version 7 con unnuevo (y esperado) modelo: e] USB (USB­
CONN). CCS C ya proponia ejemplos y suministraba librerias para utilizar USB
que no se podlan simular en ISIS. Con este nuevo modele se puede abandoner
ya 1asimulacion por puerto serie RS-232 (la mayoria de los PC ya no disponen
de este puerto) y afrontar el USB.Al estar el Iibro en imprenta, solo he podido
mcluir algo de teoria basica de USBy algun ejemplo sencillo sobre emulacion
RS-232 can USB; espero que si hay mas ediciones de este libro pueda completar
y aumentar este capitulo.

10.1 Introduccio"
E1 Bus Serie Universal fue creado en los aries 90 por una asociacion de empresas con
la idea, entre otras, de mejorar las tecnicasplug-and-p7ay, es decir, permitir a los dis­
positives conectarse y desconectarse sin necesidad de reiniciacion, configurandose
automaticamente al ser conectados; ademas se le doto de transmision de energia
electrica para los dispositivos conectados.

Este bus tiene una estructura de arbol y se pueden it conectado dispositivos en


cadena, pudiendose conectar hasta 127 dispositivos permitiendo Ia transferencia
sincrona y asincrona.

Se puede clasificar segun su velocidad de transferencia de datos (desde kilobits


basta megabits): Baja Velocidad (1.0) utilizado para los Dispositivos de Inter.faz
Humana (HID) como ratones, etc., Velocidad Completa (1.1) y Alta Velocidad (2.0)
para conexiones a Internet, etc.

251
Compllador C CCS y Simulador PROTEUSpara Microcontroladores PIC

Flsfcarnente, los datos del USB se transmiten por un par trenzado (D+ y 0-) adernas
de la rnasa y alimentaci6n (+5V). Los conectores estan sujetos al estandar (tipo A,
tipo B).

USB es un bus punro a punto, con inlcio en eJ HOST y destino en un dispositivo


o en un HUB; s610 puede existir un unico HOST en la arquitectura USB. HOST se
define como el dispositive maestro que inicializa Ja comunicacion y HUB es el dis­
positivo que contiene uno 0 mas conectores 0 conexiones hacia otros dispositivos
USB; cad a conector es un puerto USB. EI protocolo de cornunicacion se basa en el
paso de testigo (tokel1), donde el HOST proporciona ellestigo al dispositivo selec­
cionado y este Ie devuelve el testigo como respuesta.

10.1.1 Migracl6n de RS232 a USB


La Interfaz serie RS-232esta desapareciendo practicamente de los ordenadores per­
sonales y esto supone un problema, ya que much as de las aplicaciones con micro­
controladores utilizan este bus para su comunicacion con el PC. La soluci6n ideal
es migrar a una interfaz USB y existen distintas forrnas de hacerlo. El metodo mas
senciJlo es ernular RS-232 con el USB, con la ventaja de que el PC vera la conexion
USB como una conexi6n COM RS-232 Y no requerira cambios en el software exis­
tente. Otra ventaja es que se urilizan drivers suministrados por Windows, por 10que
no es necesario desarrollar uno ad hoc; estos drivers son el usbser.sys y el ccport.
sys. Ademas, puesto que el protocolo USB maneja comunicaciones de bajo nivel,
los conceptos bnud rate, bit de paridad y control de flujo para el RS-232 ya no im­
portan.

'0.1.1.1 USB CDC ,CommunIcatIon Device Class'


Una clase USB es una agrupecion de dispositivos de caracteristicas comunes, es
decir, utilizan una misrna forma de comunicarse con el entomo. La dase de dis­
posltlvo permite conocer la forma en que la interfaz se cornunica con el sistema, el
cual puede localizar el driver que puede controlar la conectividad entre la intcrfaz
y el sistema.

USB solo permite aJ driller 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 endpoint y pueden ser: Bulk, Control,
lnierrupt e Isochronous. Una tuberia es un enlace virtual entre el HaSTy el dispositi­
vo USB, donde se configura eJ ancho de banda, eJ tipo de transferencia, Ia direccion
del flujo de datos y el tamafio del paquete de datos.
Estos enlaces se definen y crean durante la inicializacion del USB. Un endpoint es
un buffer dentro del dispositivo 0 periferico donde sc almacenan paquetes de infor­
macion; todos los dispositivos deben admitir el endpoint 0, el cual recibe el control y
Jas petidones de estado durante la enumeracion del dispositive. Cuando se conecta
un dispositive al HOSTse produce la enurneracion en la cual el HOST interroga al

252
10. USB - Universal Serial Bus

dispositive sobre sus caracteristicas principales, asignandole una direccion y per­


mitiendo la transferencia de datos.
La especificacion Clase de Dispositivo de Comunicacion (CDq define algunos rna­
delos de comunicacion, incluyendo la comunicacion serle. Windows suministra el
driver usber.sys para esta especificaci6n. Para la especificacion CDC se necesitan
dos interfaces USB, primero Ia interfaz C071Lmunicai ion Class usando un IN interrupt
endpoint de interrupcion y el segundo es lainte.faz Data Class usando un OUT bulk
endpoint y un IN bulk endpoint. Esta interfaz es utilizada para transferir los datos
que normalmente deberian ser transferidos a traves de la interfaz RS-232.
Desde el punto de vista de sistema USB, el dispositive puede tener distintas con­
figuraciones, para cada una de las cuales puede funcionar de forma distinta. Los
dispositivos suministran 1a informacion necesaria al sistema USB a traves de los
descriptores; estes contienen unos campos que permiten al sistema clasificar al dis­
positive Y asignarle un driver. La primera informacion que necesita es 1a del fabri­
cante y producto (USB vendor ill - VIP Yel Product ID - PID). El VIP es un numero
de 16 bits asignado por el USB implementers Forum (USB-IF) y debe ser obtenido por
el fabricante del dispositive USB; cada VTD puede contener 65.536 PID diferentes
al ser rambien un ruimero de 16 bits. Microchip suministra su VIP y los PID para
cada familia de PIC con USB.

Microsoft Windows (2000 0 XP) no tiene un fichero "Inf estandar para e1 driver CDC,
asi que es necesario suministrar este fichero cuando Be conecta un dispositive USB
pOI primer a vez al sistema. Microchip suministra e1 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 Ia simulacion de
circuitos con USB: el conector USB Ilamado USBCONN (figura 1), el cual permite
conectar y desconectar e1 bus y el visualizador de USB Ilamado Analizador de Tran­
siciones USB (figura 2); este ultimo se debe adquirir como un modulo aparte.

Figura 1. USBCONN

Ademas, elsoftware de LABCENTERincorpora los drivers necesarios para la simu­


lacion con USB. Para instalarlos hay que it a 1a opcion INIGO> PROGRAMAS>

253
Compilador C CCS Y Simulador PROTEUS para Microcontroladores PIC

PROTEUS 7 PROFESS10NAL> VIRTUAL USB> INSTALL USB DRIVERS. Tras este


proceso ya se puede trabajar con el USB CONN.

Figura 2. AnaJizador de Translclones USB

10.2.2 USB en CCS C


CCS suministra Iibrerias para comunicar PIC con el PC utilizando el bus USB, me­
diante perifericos Internes (familia PIC18F4550 0 el PIC16C765) 0 mediante dispo­
sitivos externos al PIC (del tipo USBN9603).

Las librerias suministradas son:


• pic_usb.h: driver de capa hardware de Ia familia PIC16C765.
• pic_18usb.h: driver de capa hardware de 1a familia PIC18F4550.
• usbn960x.h: dtioer de capa hardware para el dispositive extemo USBN9603/
USBN9604. De esta forma, se puede utiliza el bus USB en cualquier PIC.
o usb.h: definiciones y prototipos utilizados en el driver USB.
• usb.e El USBstack, que maneja las interrupciones USB y el USB Setup Requests
en Endpoint O.
• usb_cdc.h: driver que permite utilizar una clase de dispositivo CDC USB, emu­
lando un dispositive RS232 Y10muestra como un puerto COM en Windows.
Las funciones mas .importantes, entre otras rnuchas, son:
o usb_initO: Inicializa el hardware USB. Espera en un bucle infinito hasta que
el periferico USB es conectado al bus (aunque eso no significa que ha sido
enumerado por el PC). Habilita y utiliza la interrupcion USB.
• usb_taskO: Si se utiliza una deteccion de conexion para la inicializacion, en­
tonces se debe llamar periodicamente a esta funcion para controlar el pin de
detecci6n de conexion, Cuando el PIC es conectado 0 desconectado del bus,
esta funcion inicializa el periferico USB 0 resetea el USB stack y el periferico.

254
10. USB _ Universal Serial Bus

• usb_enumeratedO: Devuelve un TRUE si el dispositivo ha sido enurnerado


pOJ;el PC y, en este caso, el dispositive entra en modo de operacion normal y
puede enviar y recibir paquetes de datos.
Existen funciones espedficas para CDC, entre elias:
• usb_cdc_putc(c): Es identica a putic) y envia un caracter. Coloca un caracter
en el bllffer de transrnision: en el caso de que este lleno esperara hasta que
pueda enviarlo.
• usb_cdc_getc(c): Es identica a gel(c) y lee un caracter. Redbe un caracter del
bllffer de transmisicn: en el caso de estar vacio esperara hasta que se reciba.
CCS aporta varlos ejemplos de aplicacion de USB segun las clases de dispositi­
vas, par ejcmplo para el CDC encontramos el EX_USB_SERIAl.C y el EX_USB_
SERIAL2.C.

Ejemplo 1: Euuiar los datos de 111117 conversion AD nl puerto USB como Virtllal COIIIIll.
Contpoucnies ISIS: PICIBF4550, USBCONN, POTLlN, CELL, RES Y LED-BLUE.
El ejemplo se basa en la aplicacion para CDC, EX_USB_SERIAL2.C, donde el USB
emula un puerto serie COM. De todas las posibles clases de dispositivos, la CDC
es 18 mas sencilla de aplicar y entender (dada su sirnilitud con el fundonamiento
de un puerto serie). EI ejemplo EX_USB_SERIAL2.C perrnite 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_SER1AL2.C J
#Include <18F4550.h> i':,
#include <usb_cdc.h>
I iii
I USB_COC.H I
#Include <pic18_usbh>
#Include <usb_desc_cdc.h> - IUSB_OESC_COC H :1
#include «use.c> IIlnclude <usb.h>
~
USBe=]
#tnclude <usb.h>

Figura 3. Ubrerlas en EX,_CDC_SERIAL2.C

Se va ha modificar este ejemplo para adaptarlo a 105 ejemplos del tema 7 sobre los
puertos sene. Adernas de modificar el programa principal, hay que realizar una
modificacion importante en la Iibrerla de descriptores USB_DESC_CDC.H, donde
se indica, al final de la libreria, cl fabricante y el producto (VlP/PID); en este caso
aparece:

255
Compilador C CCS Y Simulador PROTEUS para Microcontroladores PIC

Ox61,Ox04,//vendor id (Ox04D8is Microchip, or is it Ox0461??) = 8,9


//product id = 10,11
Ox33,OxOO,

Para trabajar con Microchip hay que indicar en el identificador de fabricante el


VENDOR TOOx04D8 yen el identificador de productor elPRODUCT lD OxOA para
lafamilia de los PICI8. Es decir, esas dos lineas deben de quedar asf (es aconsejable
hacer una copia de la Iibreria original antes de proceder al cambio):

OxD8,Ox04,//vendorid = 8,9
OxOA,OXOO,
//product id =10,11

Estes dos identificadores permiten la conexion con el driver de Windows; al iniciarse


1a conexion, Windows recibe los dos identificadores y localiza el driver necesario
para Ia conexion. En el caso de no localizarlo, permite 1aInstalacion de los recursos
necesarios para Ia conexion: en este caso a traves del fichero mchpcdc.inf suminis­
trado por Microchip.
Por otra parte, alfinal de la libreria se encuentra la descripcion textual del disposi­
tivo que sera detectado por WiI,dowSi para ello utiliza USB_STRING_DESC. Se pue­
de modificar a gusto del usuario, teniendo cuidado con la definicion de Ia posicion
de st:'ings Y sus tamafios.
char USB_STRlNG_DESC_OFFSETO={O,4,12I;
char const USB_STRING_DESCO={
//stringO
4, //length of string index
USB_DESC_STRlNG_TYPE,//descriptor type Ox03(STRING)
Ox09,Ox04,//Microsoft Defined for US-English
J/string 1
8, /Jlength of string index
USB_DESC_STRING_TYPE,//descriptor type Ox03(STRING)
'C',O,
'C',O,
'5',0,
//string 2
30, Illength of string index
USB_DESC_STRING_TYPE, //deseriptor type Ox03(STRING)
'C',O,
'C',O,

256
10. USB - Universal Serial Bus

'5',0,
r ',0,

'R',O,
'5',0,
'2',0,
'3',0,
'2',0,
, ',0,
'0',0,
'e',O,
'm',O,
'0',0
Ii
El ejemplo (figura 4) realiza la lectura de una sefial analogica por el canal ANa y
envia el dato por el USB emulando RS-232, de forma similar a] ejemplo 2 del tema
7; el dato se enviara solo en el caso de que vade la tension.
R2
"'"
R1 D1

,..-----, RVl ... LEQ.81i£


CcmElClOlfUSB

BAn •
• •

Figura 4. Ejemplo ,

Aligual queen el tema 7 sepuede utilizar elHyperterminal de Windows (0 cualquier


otro visor del puerto serie) para visualizar los datos. En este caso, hay que esperar
a conectar el USB para que aparezca el puerto en las posibles conexiones del Hy­
perterminal.

257
Compilador C CCS y Simulador PROTEUSpara Microcontroladores PIC

t!"".f:tr~
D~ )30613
Volt age"1.BOV
Vo 1 t 69""1. 49V
Vol tlllle-2.49V
Vollagea2.99V
Volldll~~3.49V
Vollage=2 99V
Voltage=tl nov

Figura 5. Hyperterminal conectado al puerto Virtual

#include <18F4550.b>
Ifdevice adc=10
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIVl,VREGEN
luse de1ay(clock=48000000)

#defineOSB_CON_SENSE_PIN PIN_B2

#include <uso_cdc.h>

void maln () (
BYTE i, j, address, value;

int16 q,ql;
float p;
q1=0;
setup_ddcyorcs (ANOIVSS_VDD);
setup_adc(ADC_CLOCK_INTERNAL);
set adc channel (0) ;

usb_cdc_init() ;
usb_inic (J ,.

do
us.lr_task () ;
:if !uso_enumerated())

q = read ade();
if tql=ql ) I
p = 5.0 - g /1024.0;
printf(usb_cdc_putc, "\n\r Voltage = iOl.2fV", p);

258

I
10. USB _ Universal Serial Bus

ql=q;
delay_ms (SaO);

) while (TRUE);

Figura 6. Programa del ejemplo 1

La configuracion de PIC18F4550 es la habitual, tan 5610 debemos tener en cuenta


que la frecuencia debe ser de 48 MHz pero que utilizando el bit de configuraci6n
PLLS se puede emplear un cristal de cuarzo exterior de 20 MHz. Es importante
configurar el pin de deteccion del sentido de transmision (USB_CON_SENSE_PfN)
para poder controlar la conexi6n 0 desconexion delPIC al USB;la conexion fisica se
muestra en la figura 4. Antes de utilizar el puerto en el programa hay que iniciali­
zarlo (usb_cdc_initO y usb_initO) y, "muy importante", comprobar que ha sido erru­
merado por el HOST (usb_enumera"te'd(».Con eJ fin de inicializar 0 resetear La co­
nexion con el USB se debe realizer una llamada peri6dica ala funcion usb_taskO.

Al inieiar la simul ad on con e1PLAY del ISIS, el sistema permanecera inacti vo hasta
que se conecte el USBCONN (con las flechas rojas correspondientes). Tras conec­
tar, por primera vez el USB, Windows solicita la instalacion del driver (se debe indi­
car el directorio donde se guarde el fichero mchpcdc.inf) (figura 7 y figura 8).

1Mc:..~ ob.,,--
"- ......... ~-llI>.<
.:.-~~k.Mt,_...~.a... .._~~" .... ~ ..
_____

Figura 7. Pasosen la instalacion del driver

259
Compilador C CCS Y Simulador PROTEUS para Microcontroladores PIC

Tras esta instalacion y cada vez que se conecte el USBCONN aparecera el puerto
COM virtual en eJ adrninistrador de dispositivos de Windows (Figura 9). Tarnbien
desaparecera el COM virtual cada vez que se desconecte.

flndfl:UII:iMl dol AiI""onr. pall,}


h;w<ttN",.1'IUM'Q .. ntOflh ....uo
.... ' ................ -.<* .-

".1.

Figura 8. Pasos en la Instalacl6n fcontJnuacl6nJ

-.:w-"",...

::c=::=~
~=~o;.~
......
~,
• .... niIJlIotHotI,i
'''~II-.dc1'''.!.11
• ~(~.CI.~W.~(\.!SIi
• :J~_irf.'AlAf»'

..,...
·· ,-
......
......
,
-
l'1It."'rc:tII"~-"_~

.. .J "'-.1"'~~ ,~"•
..JI , i 5 i;; i
11I\.tpt=·...., ~~I'
I""~"
· J,~"* (11 ,U:l"

Figura 9. Puerto COMvirtual en el adminlstrador de disp""sitivos


En este instante el PIC queda conectado al PC y se puede abrir un visor del puerto
serie para comprobar la transrnision (figura 5).
En los ejemplos de CCS tambien se pueden encontrar aplicaciones para Mass Stora­
ge Device Class (MSO) y Human Interface Device Cinss (HJD).
Ejemplo 2: Enuiar los dntos de ulla conversion AD al puerto USB C0ll10 Virtual Comm
para detenniuar la reuntesta ell lazo aalerto de 1111 homo (figura 10). Componenies ISIS:
PIC18F4550, USBCONN, CELL, RES, LED-BLUE, SW-SPDT Y OVEN.
EI ejemplo es similar aJ anterior, en este caso se utiliza EXCEL con Visual Basic, de
tal forma que se pueden guardar los datos de tiempo y temperatura en una hoja de
calculo y representarlos graficamente.

260
10. USB _ Universal Serial Bus

Figura 10. Ejemplo 2

Para utilizar el fichero en Excel, HORNO.XLS, se debe configurar eJ puerto serie


virtual: en el fichero esta definido como el puerto 9 y ademas habilitar las macros
en el caso de tener Excel protegido (Herrtnnientns > Macro> Seguridad > Medin/Bnja).
Para carnbiarlo a la rnedida del usuario hay que abrir el editor de Visual Basic (He­
rramienios > Macro> Editor de Yisua! Basic), buscar Commport = 9 Ysustituirlo por el
nurnero adecuado de puerto serie virtual (figura 11).

Pt ,vote ~u.b (cmncuadlhlttont ClJCk()


(OtmJaudBllttOnl. 8.t~kColt1l.. PfiJ! 'Of 255, 0)
CO~\lt.to:.l.8.ckC010l" • PCI'I'~OO, ~OO# 'ZOO)
WQI~h,.~t,(··"n.l.l") .(oJ1JI!IIl\a~"''') .ll\Jt'trlf'rrOt."'Wlat .. "0.000"
Vork.b~.t.("HOlst·). (0 1wrrn.e ,lfr", .JJW1II:>4trP'OUlllllit.. ·0. (Ie"
It PUOC'to • 0 Tbell puerto • 1
Vnb ftSCOlmIl
.Sett1no~
.COb:llJ'lort
.AThre.bola • 1
• 9 +--­
• "'GOO,tI,S, I""

• Input ftotOte .. c:cbClfnpcu:l'Ioclethnar.,


.Inpuc"t..n • 0
.PortOpen .. True
End 1I1tl\
I • 0
EnOl Sub
rrlV~te Sui:) CC!M'I'IeftClSur.r:on2:Cl,elcU
(oll~nd,D\lttonl. 8eekColQr - ~G' ,0, lSS, 0)
C011ftlandBuU.On2.ht:kColor • PC;!1200, 200, ::00)

FIgura 1I. Modlflcacf6n del puerto serte

#include <l8F45S0.h>
#device eac lO
#fuses HSPLL,NOWDT,NOPRorECT,NOLVP,NODEBUG, USBDIV,PLLS,CPUDIV l,VREGEN
Kuse delay(clock-48000000/
#defineUSB_CON_SENSE_PIN PIN_B2

261
Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC

#1nclude <usb_cdc.h>
void main() (
1nc16 g,n:
float p;
int qL;
tnt qH;
inc nL,nH:
setup_adc_ports(ANO);
setup_adc(ADC_CLOCK_INTERNAL);

n~O;
uSb_cdc_init (),o
usb inic ();
delay_ms(3000),oI/Retardo para poder abrir e1 puerto con e1 Excel
do (
usb_ task();
if (usb_enumerated())

set_adc_channel(O);
delay_uS(lO);
q - read_adc();
p - 5.0 • q I 1024.0;

nL-makeB tn, 0) ;
nH·make8(n,1);
it (usb_cdc_putready() usb_cdc_putc(nL),o
if (usb_cdc_putready()) usb_cdc_putc (nH),o

qLcmake8 (q, 0) ;
qH"makeB(q,l);
if (usb_cdcpucready()) usb_cdc_putC(qL);
if (usb_cdc_putready()) usb_cdc_pucc(qH);
delay_ms(SOO); liSe envi,~n i:latos ced« 0.5 !J

n++;

) while (TRUE);

Figura' 2. Programa del ejemplo 2

Para la simulacicn se debe abrir el fichero de Excel (figura ]3); en este fichero exis­
ten dos botones para abrir el puerto y cerrarlo (tambien hay un boron para borrar
los datos adquiridos). Antes de abrir el puerto se debe arrancar el ISIS e iniciar la
simulaci6n del programa, a continuacion se puede conectar el USBCONN y, una

262
10. USB - Universal Serial Bus

vez conectado, se puede abrir el puerto con el boton de Excel para iniciar 1a ad qui­
sidon.

1\tI,(/j _p ':-""1..- fill""'. oP~ ~ ~ :


J.fIII -1(\ .... ' ilJn(1jcpc:,

a-

.. ."

...

;
·
•~
D

.·.
b
"L ~---

·
"
:;
~
1:-' • lot \Wulo'tifolnA2 r).t!n,l-j
~. /a1tDr~· II •

"'"
Figura 13. Fichero de Excel
Para ver la curva de calentam iento se puede cerrar el interruptor de) homo de tal
forma que comience a calentarse (figura 14c).

...
1 l1lw'
. .. ,.." "Jtl:t~·f"'1

..,. "..,
OJ
"""
",. ..,","",..
.t.fl.:

'f
j,
"'"
.... v._.,..
"~i
.~JIIf _-
..o. "',..
"
"""
,an" ~~--_7~ ••
/--------

··•
e
... ...
'f
..... i1~&»-

.... ''''''.................
II
.!ll1.'!

>".. U

.".
D
,0 .. ~'"-........
"
.- _,.

.'.. ."..
2

.~".
"
4",r;r •

.-, , ~\_tl'_J'<uU1 I·

.'"
Figura 14. Datos adquiridos y su represe:ntacion

263
ESIa edicion se rerminc de imprimir en junio de 2008. Publicada
por ALFAOMEGA GRUPO EDITOR, SA de C.V. Apanado Postal
73-267,03311, MexIco, D.F. La impresion y encuademaci6n se realizaron
en FUENTES TMPRESORES, SA, Centeno No. 109, Col. Granjas Esmeralda.
Iztapalapa. 09810, Mexico, D.F.
Los mierocontroladores PICmicro de Microchip han experimentado un importante
aumento de presencia en el sector industrial esto se debe. entre otros muchos fac­
tores, a la politica de ape.rtura que tiene Microchip, ya que facilita y potencia el de­
sarrollo de herramientas por parte de otras compaiiias.
En lenguajes de programacion destacan los compiladores C para PIC de companies
como CCS Inc. EI desarrollo de nn lenguaje C especifico para un microcontrolador
pennite obtener el maximo rendimiento del micro.
Los programas de simulacion permiten depurar hasta casi la perfecci6n el disefio
antes de SeTmontado en una pla ea. No hace falta explicar el ahorro de tiempo y
coste que ello supone. Tal vez uno de los mejores simuladores para microcontro­
ladores es el rSIS de PROTEUS.
En el capitulo 1 de este libro se bace nna breve, pero intensa, descripcion del ISIS
de PROTEUS, de forma que elleetor pueda afrontar la simulacion de disefios sin
ningun problema. En el capitulo 2 tambien se realiza un.repaso del compilador C
para PIC de CCS; obviamente no puede explicarse este lenguaje en un solo capi­
tulo, pero tras su lectura eualquier lector podra afrontar los pequefios programas de
disefio que se exponen en los siguientes capitulos.
Del capitule 3 al 7 se desarrollan los distintos m6dulos que integran, un PIC (ADC,
USART,CCP, etc.) a niveLhardware, enlazandolos con las correspondientes direc­
tivas y funciones del C. En cada capitulo se plantean y desarrollan sencillos ejem­
plos de aplicacion que el lecter podra estudiar y, como no, modificar para eompletar
sus conocimientos.
En el capitulo 8 se expone la gama alta (pTe18) yen el capitulo 9 una aplicacien
mas compleja, elRTOS (Real Time Operating System). Tambien en estos capitulos
se incorporan distintos ejemplos de aplicacion. Por ultimo, en el capitulo 10 se
desarrolla el USB de reciente incorporaci6n aLISIS.
Este libro esta enfocado a todos aquellos lectores movidos pOTel interes acerca de
los microcontroladores PIC sin necesidad de tener conocimientos muy profundos
en la materia. Los ejemplos desarrollados no tienen una excesiva complejidad, son
breves y permiten ir afianzando Losconocimientos capitulo a capitulo.

You might also like