Professional Documents
Culture Documents
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
[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.
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,
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
~+ - ......._,
"---
~ .... ~"~_: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.
1
Compllador C CCS y Simulador PROTEUS para Microcontroladores PIC
Vontuna de Edicl6n
)lentajJa de Trabajo
Barra de slm~elOn
CQI7Iando.s de:
BaI1il de estadc>
rolllclcln oj r~f[exl6n
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
3
Compilador C CCS V Simulador PROTEUSpara MicrocontroJadores PIC
Encapsulado
para placa
PI LJ
.n'lI~IIII'-
E'_C16f876
RE"S
SW·SPST·MOM
4
1. ISIS de PROTEUS VSM
~
+
E
B~PI L I
.
:i
:Q: LED·BLUE
~ PlC16fIYS
. '-
C>
CI
;~
S'W·SPST·MOM ft:
r:
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.
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
5
Compllador C CCS Y Simulador PROTEUS para Microcontroladores PIC
+ Drao Object
Edit PIope.tles CttI't-€
DeleteOb)ojtt
Figura 12. Menu contextual de un componente actlvado por el boton derecho del raton
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!
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
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.
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
8
1. ISIS de PROTEUS VSM
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).
.,,.
:f>-
+
I®
-=0,;
~<
n-
lAlfl C-~
~:
".
:(J: PI "1'
II: ~
<:>
OUTPUT
CI BfOIR
D- POWER
QROUND
L BUS
@
\0)
~".
9
Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC
OSC1/CLKIN
OSC21CLKOUT
L-_":""; MCLRNpp/lHV
RAOfANQ
RA11ANl
RA2JAN2NREF
RA3lAN3I\IREB
RA4fTDCKr
RASlAN4ISS
10
1. ISIS de PROTEUS VSM
~~~ ~-:=~=
..-=~=~.::
..','~-.~-
'--::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,
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
11
Compilador C CCS Y Simulador PROTEUS para Microcontroladores PIC
-. 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
12
1. ISIS de PROTEUS VSM
1. borra.asm
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.
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).
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
14
1. ISIS de PROTEUS VSM
SVV5
R1 ••
1M
R2
1M
SVV2
••
SW-SPST
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~
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
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.
FI2
Exeat. WlthotA a.... ;pOi1ts 1\11.+1'12
Exeate lot ~Jied Time
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
16
1. ISIS de PROTEUS VSM
/
o
o
~""
A
...lSI
"'~Aad~'
_
SOow_._
~l\1)ffi
.._
"'S"'cM'k.!Itd"lE~1
17
Compilador C CCS Y Simulador PROTEUS para Microcontroladores PIC
ET G
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:)
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.
18
1. ISIS de PROTEUS VSM
I ".( it .ua,
Figura 46. Los controles para 5a simufacion
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
"'lbr6tYT8f1'II)I.;te~HaIt;
ChloH'l~
__ ._t,,,.
R.... POllJp _
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
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> ",'
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
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.
NOTA
23
Compilador C CCS y Simulador PROTEUSpara Microcontroladores PIC
18161>
delay alock
XT mwD1'
~'.ndArd_ ~o • ._____ Directivas
Min
___
.-
------ Funci6n principal
".t.. _tlJD..:_O P..TCC I~"ERNAL "''Tee DIV :
.".
"
to
....
"'"
24
2. Compilador CCS C
Int16
Long
16 bit o a 65.535 Entero de 16 bit
123 Decimal
0123 Octal (0)
Ox123 Hexadecimal (Ox)
ObOl0010 Binario (Ob)
'x' Caracter
'\010' Caracter octal
'\)cAS' Caracter hexadecimal
lnt8 1270
Long 80UL
Signed INT16 BOL
Float 3.14F
Char Can comillas simples 'C'
\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:
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
void main ( )
• 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
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
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
a-a"laa,.
a-floor (a) ;
a ..a~O.OJ.;
a-b+a,.
return (aJ,.
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 "}".
• 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
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;}
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;]
NOTA
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,
sentencias;
NOTA
34
2. Compilador CCS C
For ( ;)
sentenciils;
Ejemplo:
IMPRlMIR N
N-N'I
L
2.8.4 WHILE I DO-WHILE
WHILE se utiliza para repetir sentencias.
while (expresion)
sentencias;
35
Compilador C CCS Y Simulador PROTEUS para Microcontroladores PIC
Do
sencenci~s;
while (eApresion);
While (1)
(
sarrcencias i
DO
serit.erici.es :
While (1)
Ejemplos:
36
2. Compilador CCS C
51 A=1,
8=2,
,
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.
37
Compilador C CCS Y Simulador PROTEUS para Mlcrocontroladores PIC
A 10 largo del presente libro se iran viendo varias directivas en su ambito de apli
cacion particular.
38
2. Compilador CCS C
#device PIC16F84
Hdevice PIC16F84
#fuses XT, NOWDT, PUT, NOPROTECT
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)
/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.
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
..
Barra de
SubComandos
Pestaila
Del
Programa
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.
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).
... '.
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''''''
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
~_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
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
47
Compilador C CCS y SimuJador PROTEUS para MicrocontroJadores PIC
#include <16F876.b>
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
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.
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
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...
NOTA
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
)......, - ~)
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,;-
rsc,""' ....
r 168111!X r-.,
("~ '~~
Q_ .........
l Dot... P_w_
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""""_'
i!
lCO
Open
s..veAf
Close AI
Co~
PICWlZMd
SlCWa",d
Oesajptloru
52
2. Compilador CCS C
? )(
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)
53
Compilador C CCS V Simulador PROTEUS para Mjcrocontroladores PIC
x
Address
OXl9
54
3. La gesti6n de los puertos
Capitulo 3
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.
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
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
Tambien existen algunos terminales que poseen unas caracteristicas especiales, por
ejemplo:
56
3. La gesti6n de los puertos
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.
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
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:
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
59
Compilador C CCS V Simulador PROTEUSpara Microcontroladores PIC
IIdefine PIN_AO 40
#de6ne PIN_A141
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);
61
Compilador C CCS Y Simulador PROTEUS para Microcontroladores PIC
if (input(PIN_BO) == 1
outPut_~ow(PIN_Bl);
else
outPuc_high(PIN_Bl);
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)
•• ,\,..-<.
t~ .'
;, ~
.. .1,
12
••
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
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.
64
3. La gestio" de los puertos
• C) lCDconar,v
1.·Vss ("'''SOl)
n I
t,~:
• • ,_, =-,
Figura 10. EI patlllaJe de un LCDtlplco
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.
65
Compilador C CCS Y Simulador PROTEUS para Microcontroladores PIC
\£ 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)
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:
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
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
R2
.i:«
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)
1M1n I) (
r Item: II variables de funclones
69
Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC
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:
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:
70
_._
3. La gesti6n de los puertos
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
glcd_updateO
Escribe en la RAM del LCD; s610 es posible si esta definido FAST_GLCD.
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
.,
#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
73
Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC
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);
74
3. La ges1i6n de los puertos
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'}};
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
~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
76
3. La gestion de los puertos
.......
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
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) ;
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------
#;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
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:
J PWML J
255
~
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);
81
Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC
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
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
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
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.
85
Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC
86
4. Las Interrupciones y los temporizadores
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):
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.
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.
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
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
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
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).
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.
94
4. las interrupciones y los temporizadores
l=WDT.
O=TMRO.
bit 2:0: PS2:PS1;PSO:Deterrnina el divisor de frecuencias a actuar segun Ia
siguiente tabla.
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):
RTCC EXT_L_TO_H
00100000
~ 20h
95
Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC
RTCC_DIV_256
00000111
07h
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
IffusesWDT Activado.
set_timerO (valor),
valor: entero de 8 bits.
Para leer el valor actual del registro:
valor = get_timeT() Oi
oalar: entero de 8 bits.
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
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
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.
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
I Bil7
.~
I
-
IT1CKPS1
-.
I nCKPSO I nOSCEN I T1SYNC I TMR1CS I TMR10N
BltO
t
.",
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.
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:
] = 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:
TeM =4/Fosc
101
Compilador C CCS Y Simulador PROTEUS para Microcontroladores PIC
---------- -- ------
TeM = 4/Fosc
Setup_Timer_l(modo); TICON(lOh)
00000000
Tl_DISABLED
DOh
102
4. las interrupciones y los temporizadores
Tl_INTERNAL 10000101
85h
Tl_EXTERNAL 10000111
87h
Tl_EXTERNAL_SYNC
10000011
83h
Tl_CLK_OUT
00001000
08h
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
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
104
4. las interrupciones y los temporizadores
NOTA
iinclude <J6f876.h>
#{lJses XT,NOWDT
#use delay (clock=4000000J
ruse st.:Jnd:Jrd_~o(b)
luLl ("on(-O:
main I)
while (1):
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
con c++;
main ()
while (11 (
templs () ; II Llamada a la funci6n de cemporizacion
LC02
LMOII!I.
102.0uS
106
4. las interrupclones y los temporizadores
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
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)
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
{(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
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
, .. -
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
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
VOID MAIN()
(
CHAR K,kant-'O';
cha r PWMH-O,PWHL 0;
lcd_lnit ();
kbd_init ()/
PORT_B_PULWPS (TRUE),.
WHTLE (l) I
k-kbd_getc
if (k-' \0') k-kanc,.
112
4. Las interrupciones y los temporizadores
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»'
.. .,
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)
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
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 {
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
/ /. " 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
116
5. Convertidor Analogico - Digital
Ca .tulo 5
SALIDA
ENTRADA
ANALOGICA
~
i v .1
•• j
AID DIGITAL
S/H
• 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.
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
119
Compilador C CCS Y Simulador PROTEUS para Microcontroladores PIC
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
ADFM=1 AOFM=O
7 2 10 7 o 7 0765
000000 I 000000
AORESH,- __ L _ AORESL
_ _, AORESH AORESL
: Resultado 10 bit :
"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()
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.
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.
a. ADIF =0;
b. GIE =r PEIE = ADlE '" 1.
3. Esperar el tiempo de adquisicion.
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
(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
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
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
. : ; ~...
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,
124
5. Convertidor AnalOgico - Digital
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
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
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:
ADC=II x x 0-7FF x
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
• •
• . ~
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 .!.:! ,
;FUSES X'l',NOWDT
IFUSES
luse delay(clock=400000Qj
#include <LCD.C>
void main ()
int16 q:
Ilaet: PI
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
delay_ms (100) ;
}
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:.
Q£
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
128
5. Convertidor Analogico - Digital
IT ~ 25.45C
1~~
,.,---r::::~'-"iP!~~-I RAOI_
RA11ANl
F!A2/i'J<1'VREf'
RA3IAA3M<EF'
AA4fT0CKl
RJI5I/lmIlS
=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),.
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
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~=~
.----"-_
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
I I I I I I
l!) 40 Q) 110 100 11'0 "'' ' <If (OIlWOo)
"...... 1a....lII&r.j
15.115~ :tU(oPOI
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:
131
Compilador C CCS y Simulador PROTEUS para Mlcrocontroladores PIC
LCD1
p= 99.S7 Kpa
T = 2S.35C
M1
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
133
Compilador C CCS y SimuJador PROTEUS para Microcontroladores PIC
delay_ms (100) ;
)
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);
}
135
6. Modulo CCP - Comparador, Captura y PWM
Capitulo 6
137
Compilador C CCS y Sjmulador PROTEUS para Microcontroladores PIC
bit 5:4 CCPxX:CCPxY: bitl y bitO del Duty Cycle deJ PWM.
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.
• 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.
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.
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.
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).
.._-.. ...----.-
140
6. Modulo CCP- Comparador, Captura V PWM
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)
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.
OutPUL
Ton
V mod L
Too ccV mod
T =cte.
Vmod t
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.
• 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
142
6. Modulo CCP - Comparador. Captura y PWM
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
Ij20'106)
, 1200
resolucion = > to bits
Ig2
Para porter en marcha el modo PWM se deben dar los siguientes pasos:
143
Compilador C CCS Y Simulador PROTEUS para Microconlroladores PIC
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
#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
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
} while (TRUE);
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
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
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.
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).
148
6. Modulo CCP - Comparador. Captura y PWM
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
#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 main () (
disable_interrupts(global);
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).
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);
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
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)
'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
U(z) b ( -I
--=a+--+c l-z )
E(z) 1- Z-I
donde:
K-T
a=K,1 b=-P-
1';
integral
u(kT)
155
Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC
( AD )
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)
156
6. Modulo CCP - Comparador, Captura y PWM
Ccrnponel'd8Er~EnCe Hldden
CIl'fol1Ol100t ~oIvc: OVEN IbciJM
r--
U$AModclF'de 'H.j;,AI
Mi!lllted I'!op!ltlet
..... ·'1126 lido ...
-
Ot~_~_~.
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_" ... ,...
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.
E_",,",~
E~"""PC8~~
E<iljl_~.....,*'"
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
BAT1
SW1
••
SW-SPST
100
50 .11
111.00
HOMor e.ee
ANAlOGUE
DIGITAL
MIXED
FREQUEtltv
TRANSFER
'~DISE
ISTORllON
OURIER
AUDIO
':II
~) COliroriMANCf
~ OCSWEEP
'",," AC SWEEP
r;;
/
I;OnI",_".An "'(111"' /
QoOI,t. _ Carl", ". ANoI, ..
159
Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC
G,.,n,'j" I~TERACTI\I£NIAL)'S,s
1.,... ,....
itoolr.. ~
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:
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
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
,.. 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,
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
163
Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC
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;
)
165
7. Transmisi6n serie
Capitulo 1
Transmision serie
7.1 Introducc;on
Los PIC utili zan, entre otros, dos modos de transmision en serie:
• 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.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.
168
7. Transmisi6n serie
Datos
Reloj
1 I 0 I I I I I I I I 11 ,____I
Bit start Bit stop
169
Compilador C CCS y Simulador PROTEUSpara Microcontroladores PIC
170
7. Transmision serie
.'-.-.-."T~~~'~
'1"'1
!
,TX9=1 1 bit ;
'. --- _.- ------------ ---~
171
Compilador C CCS y Simulador PROTEUS para Microconlroladores PIC
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.
..,.
..........., , 8 bit
,,
,.
1 bit , , ttl
.... '~
Buffer 0
IL
RX9D RCREG
u::
!",,,
173
Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC
En modo asincrono:
174
7. Transmislon serie
175
Compilador C CCS Y Simulador PROTEUS para Microcontroladores PIC
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).
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;
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
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
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
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);
Con el programa VIRTUAL TERMINAL (boton derecho: Hex display mode) se pue
den visualizar los datos del bus serie (figura 12).
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.
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).
DISPOSITIVO
Modulo I
INTERFAZ
SERJE-USB BUS I USB
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
-JO )(
_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.
182
7. Transmisi6n serle
o E.RRCR 0
COMPIM
CABLE
HEMBRA-HEMBRA
+ USB-SERlE
183
Compilador C CCS Y Simulador PROTEUS para Microcontroladores PIC
~~"'er>e~- pj
CoMponent ~4AJe: caMPtI-!
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
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
185
Compilador C CCS y Simulador PROTEUSpara Microcontroladores PIC
~ EJEMPL02
C6tigo de .§lea
» odu
, one
Bhpco __ rn._••
_dar ..
~di.'amo.
C«"Irpft !'.!ON,..
IJiItIn;!t tf.-dor..
C;:. %1 .g
186
7. Transmision serie
Conocl.. Ccrill)l.r~
_.."''''''''''I
• Itdlnllll''''''''''
2: ~~da'jMs!llWClClcaddli""l~
InleI7ttf.-~elel ~-CCJit'IoASOI cte 7 bib
'" AjUll!l' IlneO}4'& rot.!petd'l. aneho de temw:aI
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);
}
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);
)
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
,>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 ~
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!
'~-'-':_-'"',~~~ ~. ~. "-.
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
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
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
DIRECCION DE 10 BITS
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
193
Compilador C CCS Y Simulador PROTEUS para Microcontroladores PIC
Bit7 BilO
~~f'
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,
195
Compilador C CCS Y Simulador PROTEUS para Microcontroladores PIC
196
7. transmlslen serie
197
Compilador C CCS Y Simulador PROTEUS para Mlcrocontroladores PIC
7.3.1.1 12C en C
Configuraclon generica del FC:
Ituse 12C (opciones)
Opciones: separadas por comas, pueden ser las siguientes:
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)
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
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.
I I I I 1 Ell
.=J
Cew ... f!."If"ctCod. I 0 I 0 E2 E' RW
201
Compilador C CCS y Simulador PROTEUSpara Microcontroladores PIC
i2c_start ();
status~i2c_1~rite(OxilO)
;
R....lI.OOM
.o.ODRESS
READ
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),.
202
7. Transmision serie
void ms i n () (
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
203
Compilador C CCS y Simulador PROTEUSpara Microcontroladores PIC
-+.
-. 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;.!!:...
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
i2c_start:();
status=i2c_write(OxBO):
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
I'"
SECONOS
I-- MINUTES
HOURS
--r---------r--------~
elf .. ...",.
.- ;;--/i"I"I'·,11I
w.nu
-- .'"'~
"
-
_: ...
3611 r
RAM J '""" "'A/4
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
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);
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
--. 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• ..".,
lD>Tf
208
T. Transmision serie
tioet: RE-AD_E'LOAT_EXT_EEPROl·t(long
int n)
int i;
noe t ae ta;
for (1 - 0; ~ < 4; ~H)
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>
int16 eddrees=a :
inC dat_serie[7];
float dato;
209
Compllador C CCS y Simulador PROTEUSpara Microcontroladores PIC
rd,,_isr()
dat_serie[cnt}-read_ext_eeprom(cnt);
J
for(cnc..
O:cnt<-6;cnt++) /IV~sua1iza los 7 pdmeros bytes de la EEPROM
void main ()
lcd_init(J;
enable_lntercupts(inc_rda);
enable_interrupts(global);
address-O;
while (1) (
210
7. Transmisi6n serie
I
}
I .Acepl!lf II ClII'ICeiar I
Figura 58. Conflgurad6n del HyperTermlnal
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
212
8. Gama Alta - PIC18
Ca itulo 8
M v'lORJA 16 8
PIC18 ORIA
PROGRAM A
RISC DATO
fLASH
CPU (H STA KB)
ASTA2MB)
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
214
8. Gama Alla - PIC18
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
r- PC<2~
2-1-
r -
Nlvel 1 de ,; plla
-l
L
r+:
Nlvel31 de la !!!Ia
mPh
8000h
1FrFFF'h
'-------------' 2000QOh
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.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
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
~ 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
219
eompilador e ees y Simulador PROTEUS para Microcontroladores PIC
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.9Interrupciones
Se dispone de dos niveles de prioridad:
220
8. Gama Alta _ PIC18
221
Compilador C CCS V Simulador PROTEUSpara Microcontroladores PIC
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).
- ",I
31.251-.",(_cIocl<~"""&f,'HZr
125KHZ
" 311-.llZ
223
Compilador C CCS y Simulador PROTEUSpara Microcontroladores PIC
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.
224
8. Gama Alta - PIC18
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
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~
r'Lli Tw._.
r~3
Ol$abled
l...temai
El<lernai
El.1ef1lalSsone
2", 131ms
4\1$ 262nu
8u, S2Am:
16u: 104m.
226
8. Gama Alta - PIC18
;,"
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
• 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
227
Compilador C CCS y Simulador PROTEUSpara Microcontroladores PIC
• 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
,',.,";""-~:':'-'---~
228
8. Gama Alta - PIC18
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
,.....I"'p )-c:jI Jg
Oul' II Dr~"
FuII8ndge Olf
Full Bridge reveree C"."palato! 1 OIApul
HeU Bridge i:omparl!iof 2 oufW
NOTA
229
Compilador C CCS V Simulador PROTEUS para Microcontroladores PIC
Gnd
Goo V O 1....1
Gnd
Gnd t>o I~
230
8. Gama Alta - PIC18
II I(
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.
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
Para conseguir una interrupcion cada 1 seg con dicha frecuencia hace falta precar
gal' el TMRl a Ox8000segun los calculos de la siguiente ecuaci6n.
c........s""".?
l··",.eelor.
(!j...... Ed.. ?
~Ii.jol'l_'..?
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
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
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)
234
8. 6ama Alta - PIC18
PCBP..,J..
Prog... r..
I'rocottoI Clock F,_
M._"'__
• N.
r_,_s.......
"",
fi,th. "om PCII~ .....
EdII"PlOIJI'II ....... '"
NOTA
235
Compllador C CCS y Simulador PROTEUSpara Microcontroladores PIC
C20UT
VREF
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) (
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.
C20UT
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
238
9. Real Time Operating System - RTDS
----------------------------------------------
Capitulo 9
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.
-"-~--~-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
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
241
Compilador C CCS y Simulador PROTEUS para Microcontroladores PIC
#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
242
9. Real Time Operating System _ RTOS
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
control-uT;
set_pwml_duty(control};
pT_ I-pT;
eT_lreT;
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-
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;
vai d i n (I
nIlI (
n:os_run ( );
cont.roi=ur,
245
Compilador C CCS y Simulador PROTEUS para MicrocontroladDres PIC
set_Plvml_duty (control);
pT_l=pT;
eT_l=eT;
FIgura 4. el programa
valor=read_adc();
yT=valor*5000.011024.0;
rT=temp_limit;
246
9. Real Time Operating System _ RTOS
void display t )
tempera-valor_l·Soo.011024. 0;
lcd_gotoxyll,l);
printf(lcd_putc, "Temp= 'l.F", tempera);
rtos_yield () ;
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).
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
#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
sem..l;
rtos_run ( );
void pid ( )
(
;rtos_l~<Jjt (sem);
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)
rtos_signal(sem);
rtos_yield() ,-
J
Figura S. Programa con PIC! SF4520
250
•
10. USB - Universal Serial Bus
Capitulo 10
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.
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 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
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.
Figura 1. USBCONN
253
Compilador C CCS Y Simulador PROTEUS para Microcontroladores PIC
254
10. USB _ Universal Serial Bus
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>
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
OxD8,Ox04,//vendorid = 8,9
OxOA,OXOO,
//product id =10,11
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
BAn •
• •
Figura 4. Ejemplo ,
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
#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);
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... .._~~" .... ~ ..
_____
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.
".1.
-.: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"
260
10. USB _ Universal Serial Bus
#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);
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.
a-
l
.. ."
...
;
·
•~
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.