Documente Academic
Documente Profesional
Documente Cultură
MICROCONTROLADORES
PIC+ZIGBEE
MEDELLÍN, COLOMBIA
2013
CONTENIDO
INTRODUCCIÓN............................................................................................................................. 9
El libro cuenta con 14 capítulos, en los que se maneja la programación en los micros de 6, 8, 14,
18, 28 y 40 pines, hace especial énfasis en las nuevas referencias, debido a que estas poseen unas
características adicionales muy importantes que se deben tener en cuenta, me refiero a referencias
como: PIC12F1822, PIC16F1823 y 24, PIC16F1827, PIC16F1936 y PIC16F1937, todos ellos pro
ducidos para ultra bajo consumo (XLP). Igualmente, se trabajan muchos de los programas con el
muy apreciado y conocido 16F887.
Parto de temas tan sencillos como: El manejo de entradas y salidas en el PIC 16F887, el manejo
de interrupciones en el nuevo m icrocontrolador de 14 pines 16F1823, la visualización de variables
de proceso y/o mensajes, tanto en display de 7 segmentos como en cristal líquido LCD, la conver
sión A/D, la comunicación serial, la modulación de ancho de pulso PWM y el diseño de teclados
capacitivos desde otro nuevo dispositivo con características muy especiales, como el 16F1827 de
18 pines, entre otros.
Adicionalmente, y aprovechando la era del prefijo Smart, en la que espero que efectivamente todo
sea inteligente: Smart Home ó Domótica, Smart metering ó medición inteligente de parámetros de
consumo eléctrico, etc; los últimos 3 capítulos están dedicados al protocolo de comunicación ina
lámbrica ZIGBEE que da mucho de qué hablar po r su versatilidad y facilidad de operación a nivel
residencial, comercia! e industrial; por lo tanto, se hace en el capítulo 11 una introducción a las
tramas API con las cuales se manejan redes con el protocolo ZIGBEE, usando los módulos XBEE
de DIGI. En ¡os capítulos 12 y 13 se realizan aplicaciones conectando los módulos XBEE a un m i
crocontrolador 16F887 para que los lectores conozcan de la facilidad de conexión de estos módulos
con cualquier dispositivo programable que posea un módulo UART de comunicaciones.
El software usado con los microcontroiadores PIC es la nueva plataforma MPLABX, creada bajo
NETBEANS, en su última versión 1.60 (a la hora de escribir estas líneas) la cual se puede trabajar
en Windows, Linux ó MAC. En ella se desarrollarán programas utilizando lenguaje ensamblador y
lenguaje C, este último trabajado con el compilador XC8, que es el compilador único, optimizado
po r MICROCHIP para las familias de 8 bits; es decir, 10F, 12F, 16F Y 18F. A sí mismo, existe el XC16
y el XC32 para program ar los PIC de 16 y 32 bits respectivamente.
Ambos lenguajes de programación son excelentes; el lenguaje ensamblador permite al usuario conocer el
trabajo paso a paso del microcontrolador y enfrentar con más propiedad los lenguajes de alto nivel como
el C; cabe anotar que muchos usuarios se inician de una vez con el lenguaje C y tienen igualmente mucho
éxito en sus aplicaciones. La discusión está en el aire, pero las opiniones son diversas y creo que no hay
un acuerdo, la idea es que cada quien programe con el que más cómodo se sienta, finalmente el cliente no
tiene ningún interés en saber cómo le programaron su aplicación, solo le interesa que funcione.
De todas maneras, pienso que es una ventaja tener un lenguaje ensamblador con tan pocas instrucciones
para conocer de cerca el modo de operación y la arquitectura de un dispositivo programable. Aunque
las nuevas referencias de microcontroiadores PIC poseen 49 instrucciones (14 nuevas) posibles para
facilitarnos el trabajo, podemos continuar usando las 35 que ya conocemos y los programas funcionarán
perfectamente. Esto sólo se encuentra en ios PIC de MICROCHIP, las demás marcas tienen un lenguaje
ensamblador demasiado amplio en instrucciones y es por eso que ni es fácil, ni es práctico utilizarlo.
Si desea obtener el código de los programas, además del archivo con el paso a paso a color del
manejo del MPLABX, puede solicitarlos ai correo guillerm o9834@ gm ail.com .
PROGRAMACIÓN DE MICROCONTROLADORES P IC + Z IG B E E
CAPITULO 1.
Para ello, trabajaremos algunos de los pines de sus puertos como simples líneas
de entrada o salida.
Deben tener en cuenta inicialmente, que este dispositivo posee 5 puertos llama
dos A, B, C, D y E como lo muestra la figura 1, y que cada uno de ellos tiene un
número de pines determinado, para ser utilizado como entrada digital, salida
digital ó con una de sus funciones alternas; por ejemplo, entrada para conver
sión análoga a digital, salida de PWM, transmisión o recepción de datos por
comunicación serial, etc.
RE3/MCLR/VPP RB7/ICSPDAT
RA0/AN0/ULPWU/C12IN0- RB6/1CSPCLK
RA1/AN1/C12IN1- RB5./AN13/T1G
RA2/AN2/V ref -/CV ref/C2IN+ RB4/AN11
RA3/AN3/VREF+/C1IN+ RB3/AN 9/P G M/C121N2-
RA4/T0CKI/C1OUT RB2/AN8
RA5/AN4/SS/G20UT RB1/AN10/C12IN3-
RE0/AN5 RB0/AN12/INT
RE1/AN6 V dd
RE2/AN7 Vss
V dd RD7/P1D
Vss RD6/P1C
RA7/OSC1/CLKIN RD5/P1B
RA6/OSC2/CLKOUT RD4
RCD/T10S0/T1CK1 RC7/RX/DT
RC1/T10SI/CCP2 RC6/TX/CK
RC2/P1A/CCP1 RC5/SDO
RC3/SCK/SCL RC4/SDI/SDA
RDO RD3
RD1 RD2
Las líneas físicas con las que el microcontrolador se comunica con el mundo
exterior se llaman puertos, en este caso se tienen: PORTA, PORTB, PORTC,
PORTD Y PORTE y sus correspondientes registros de configuración, es decir,
quienes deciden si los pines de los puertos serán entrada o salida, se llaman
TRIS así: TRISA, TRÍSB, TRISC, TRISD y TRISE.
Con estos conceptos básicos damos com ienzo ai prim er ejemplo, que sim
plemente permite contar de 0 a 9 los pulsos generados desde el pin RD4
del puerto D, visualizando en el puerto A a través de leds y en el puerto C,
mediante un display de siete segm entos de cátodo común conectado a un
decodificador BCD a 7 segmentos.
La cuenta sólo se incrementa con flanco de subida, así se asegura que el conteo
se incremente solo en uno cada que se presiona el pulsador.
Los planos electrónicos están diseñados para que físicamente se pueda practicar
con entrenadores que se consiguen en las tiendas de electrónica locales. Adicio
nalmente, en las últimas páginas de este capítulo se encuentra el paso a paso del
manejo del MPLABX para este ejercicio en lenguaje ensamblador y en lenguaje C,
de esta manera usted podrá realizar los siguientes ejercicios del libro sin ningún
problema con la nueva plataforma de MICROCHIP
JU ilU
.* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Se incluye archivo .inc que contiene los registros y bits especiales del PIC
** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** í* ***************************************************************
#include “p16F887.inc”
*:********** ** ** ** * * * ** ** ** ** ************* ** ** ** *• * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
CONFIG1
__config OxEFFI
__CONFIG CONFIG1, _FOSC_XT & _WDTE_OFF & _PWRTE_OFF & _MCL-
RE ON & _CP_OFF & CPD OFF & _BOREN_ON & _IESO_ON & _FCMEN_
ON & _LVP_OFF
; CONFIG2
; __config OxFFFF
__CONFIG _CONFIG2, _BOR4V_BOR40V & _WRT_OFF
******************************************************************************************
m w .
NOP
NOP
DECFSZ REG2
GOTO UNO
DECFSZ REG1
GOTO DOS
RETURN
. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Programa principal
. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
INICIO
BANKSEL TRISA Voy al banco 1 para configurar puertos
CLRF TRISA Puerto A como salidas
CLRF TRISC Puerto C como salidas
MOVLW B’00010000’ RD4 entrada y los demás
MOVWF TRISD pines del puerto D son salidas
BANKSEL ANSEL Voy al banco 3 para configurar ANSEL
CLRF ANSEL Todos los pines digitales
CLRF ANSELH Todos los pines digitales
BANKSEL PORTD Regreso al banco 0
BSF PORTD,0 Habilito transistor para cátodo del display
LIMPIAR CLRF CONT Limpio contador
MOVF CONT.W Paso contador a W
MOVWF PORTC Paso W al puerto C (0 en 7 segmentos)
MOVWF PORTA Paso W al puerto A (Leds apagados)
PREG BTFSC PORTD,4 Pregunto si RD4 está en 0, pulsador
presionado?
GOTO $-1 Si no, vuelvo a preguntar
MOVLW .200 Si RD4 está en 0, retardo de 200 ms
CALL RETARDO para evitar rebote de contacto
BTFSS PORTD,4 Pregunto si vuelve a 1 para iniciar conteo
GOTO $-1 por flanco de bajada, sino, continuo
preguntando
INCF CONT Si está en 1, incremento contador
MOVLW 0X0A Cargo W con 10 para comparación
XORWF CONT.O Xor de W con Contador y resultado en W
BTFSC STATUS,2 Pregunto por la bandera Z
GOTO LIMPIAR Si es uno, es porque el contador está en
10 y debo ir a limpiarlo
MOVF CONT.W Si no, Paso contador a W
mui
14 = LUIS GUILLERMO MONTOYA DÍAZ
rmrr
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE
Programa en lenguaje C
^ |* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
//Se incluye la librería xc.h que contiene los registros y bits especiales del PIC.
^*****************************************************************************************
#include <xc.h>
^ |* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
void mainQ
{
ÜUÜ
LUIS GUILLERMO MONTOYA DÍAZ 15
mnrr
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE
1 - Definir las entradas y salidas con nombres diferentes a los pines y los puer
tos así:
La variable cont la declaramos como char, ya que esta va solo hasta 9 y el char
es de 8 bits, pero se debe tener en cuenta que si la declaramos solo char, ésta
va desde -127 hasta 128 porque es variable signada, si necesitamos variables
mayores a 128 y menores a 255 se debe declarar como:
unsigned char cont; // Variable sin signo, es decir, con rango desde 0 hasta 255
Para números mayores a 255, las variables se deben declarar como enteros así:
Int cont; // Esta variable va desde -32767 hasta 32768
Unsigned int // Esta variable va desde 0 hasta 65535
#include <xc.h>
// CONFIG1
// CONFIG2
#pragma config BOR4V = BOR40V // Brown-out Reset Reset set to 4.0V
#pragma config WRT = OFF // Flash Program Memory Self Write Enable bits
// Declaración de funciones
H*****************************************************************************************
void main()
{
TRISA=0; // Puerto A como salidas
TRISC=0; // Puerto C como salidas
TRISD=0X10; // RD4 entrada los demás salida
iülU
18 LUIS GUILLERMO MONTOYA DIAZ
mm
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE
■u,mi,
20 LUIS GUILLERMO MONTOYA DÍAZ
T irrrr
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE
CtessPfojíKt
CteseAfí Ps«j«ts
Qper¡ Ríe,..
GpíttReeentFile Jjjjt QuícSí Starí i |¡§f¡| Mínate Víteos
8V!fl.00í|*ijjl
Wp\!<6
íj.r&
:/ ' ' , Gpen Sample Project
| p FlashRsseryed; Productio«Jmsge
f Resource? 'íf | p Sroport He* {PrebuMt; Project
? > : 9 ' ► e i i W s i r a . i A i » p i f
ÜUH
LUIS GUILLERMO MONTOYA DÍAZ 21
Tm rr
PROGRAMACIÓN DE MICROCONTROLADORES PIC+Z1GBEE
Aparece el primer paso que es elegir el tipo de proyecto a realizar. Se elige Mi-
crochip Embedded v Standalone Project. Click en Next
PiteEstó,ííi«wNav>yai*$««»«RsfecterR
#míDebugTeamT*»<*íAftwtewrtíjp
..... ; <Vásaríft.Cíis-e
■.'.fm
gksm oFíie» #ssfiStartPage"S 53Q@
j cxkmm?
$ l asómm?
•S emMSSO
& ͣ cmiSSS
ií ,'j cont9S®jS8? 1, Qmmt PmjexA
<& ás carn&á 3
2, Scfeet&ssiee
, Sefct Heasfe- Pasüíy: ;^sS-Rjs^eS-fetMaís#>JC12|'.i5/WCS’)
4 >«¡ssw
adSS
,» ¿ dspl ■I,™
. ¡í .3 ds¡s&»2: | QpM
PLABXiOÉForum
8, „ ds^scs4 ; | j p | MPtrn x ¡pe w»k»
A i
: ® 1% ptclO„teMste_l
- ■sg^Oewcs
^ ' ^K C ^sa?
i j¡ ¡ : ■J | Chedesuro: es«26FF
w ^ Cwaflte-Toaisíiaio
j®1 ;■f XC
Ó-
S{vl,M)
Q Memory
f
f I ...........
: ; «Ft»íUsed; «>CS3sS)Freei368{OxOT3 ■PL.HBX
MMI RA&fteseree&Pto&x&sxi image
\ 8 Ü ñash 8192(0x2000} sserris
áPFÜLI
* g?. «xtensSSS?
!é esstenaSS?
.& '4 fflsr«20
a; cs?st99§
|É P cs»t998_88?
* ¿ COÍWSd
js- «swacSSS
iS corrvaótaSS
jé^
!® 0-
ítepi
i, Corapíif Toddtasns
B HÍ-TECHrax
! 4, suscitad f-#«E*-^CH?ICC<v®.6g [CtiProgr»a Fíes í*SS)f«-TKB Software'?5CC?ft0^.65tm]
'i Ufaras ! 5. SéstíPhg^Somú 5■■»Ht-WCHmee &93S) ¡Ci'Pmgrm Fte fcdKJíHMBCHSoftwareWCC^-,83|ml
¡$. .jf, <ásísfecs3
"vE <á^f«es-4
| 6, StífectCo«®Ser
S-WPMCT .... ....................
ijj'; .■ S*S
I ~®30 fyia® ICspragrm Ríes ix&Wk3sái®W&\vtM$m¡
:: «wigafer
|- 4 5 0 OBtfprogramte^él(sfeSKhW «g|fl.Sl^iril
| -« X€8<s>*i,18} [a prt&im tts*{xS$í«sodsíB%c8Wi«3S$fc]
XC8 <vLl25 [Cilpregim «8» ^ V to o d # ^ V i .í2 % Ñ
^P!C16F887
<v
StariPage «1
m í¿ APiPcu
;t O «rfer*i937
i- -' caderas®?
sí U «ORW620
't | contSSS
\é U- c«ot9S9„887
l ¿ ommíM S
ásei
I é m m iz j
?! SfejffaC8í
..... . . - ..
'<*! ^^lOjCTpMite.S ' —
Ir a f
i|H• ’L-J§C
m
1
hedfcw
sBteíW> 0 p x .m m
a | C«ffeToalíh«
® - " £ * » (vi.*®) gCítpretjra* í^es {K86)V»Sícf9<^W¥L09te|,
!# 8 ®*to»ry
‘ ® C“358 •*_
byte“ 1
| ; m R»Usgd:8CSxSí f?rae: 36SC0jtl7S}
i ■SSí*R s»sí«á;v|%sduttoSni^e
! | i fc.i ^ HashS132®x200C) «aoás
z m iM n
|g»iasxs?£vim
RSe €dtt Yím Navigate Scarct t«?aster 8»fs &efem la i Tesfe Wwsfesw Help
. . _ . - ■ ■-
r$j*i?ite® ESS6Í
S|
r
í t ICD4S28
O Scd«Ssnpx -
é 9 LCD»«U£
i Q
éQ
tí Ó MansjejoJW
'ti f e HaadsrFfes
5: i É ~ (j| issportsnt files
; É ¡¡§ Linter Fies Tnitetahí €«?«««if
' S £ f f lT “
JL— Z l
í' Librad C Swtt* W«..«
é m ix x M iiw lc g ta ! Felá»
Ádsi &sí$tmg&em.„ &ssmbí^fjie.$„. *BíDEvSfeeré - (MPORTAST B SMeremes frosn MPtAB S S p «PlA BX»efoniat
■i ’
1 nal
Remw*
^ Cecp
€ * * Sewte He,..
C** HeaderFli*,.,
i Retía
■mfeN
,,. M3fc«íííe,„
!• K jt jM
i i Prsp&iiíss
S-@R< Q O»*?.,.
¡ 5 i- r ■ o* _ ■ , ............ ^¡>i9»HauñÍaading&rsr * | Pfígect l o s ^ frror *
| ;
\ m KmUsad; 0 £0x0? Free: m {¡3x178}
L * S^teiroaáítoteSim SB^e
: fsojssts "Vmmx Cstiíigsssafej,®
fxoJsssS *'S*s* Cs>s?£i¡grsi*«fei* S®®®
ofila * C :\ K ie soe
h ipS
o tos!
o S il* ®Cx\Híí;so«hijf SeúUffi
vMí2~ 87“ Í8\fflSossfeC*pJ5®iB3s\SIC;3,8F
vms-S?-ÍS«es3s:feC*p®®»cs*\fSÍ.W SIC2 ?IC3«H
|S^ 9^ O rtash sm §MSD0} words.
Sxoj«cti "S?s».y Co¡sS4gaü:«.fel.« 3®«s eS iS « "C:\}íie jpoc&tpSól'ss
* ífaS12~9?-í8\ssrc»cfeC®.pS®KS!S®\?I«®F ?SS2 prci-:s
SssjsbS "Ss*s CeaSigtssaisls 2®»s aS iS *“C rM Iie raahlp¿:lu e «as vtSlS” S?~ig\aS2rs5«afeC4j>S®a¡M\MC18F ®IC2 fXCÍ^S;
i | ! ím » Use* 9 t » ) tm s * m ® a x ®
] t e l a g 8s»j«e s '*8s» s Ceafiyazabl* Serna esfila * C :\K ie £íse
iíipSa la
s »a'ÍSÍS-í5?-lS\s¿f6»sásCa.|íSeESS'\5ÍClSf 8ÍC2 JICJÍH
I i MW I Sene oí sise f i i c "üser tonfigurable Deeto" <í&seaes«ss iss. S&sis aiust* er sía sir jtatsh. lisia caí..;>
B-3¡| Resources
M« £dst Vi*w feysfísts S»wrt« Rector Ewí Qehtx% Twn T«sfe ^mstos<f He%s - - - - - - -- ----------- --------------------------------
............ i
IsPiBÍM» <8* !s?íies jj SjaftPaae x\
f £¡ LCD4620
,t C fcd-S^px
é O ICDS®£«E ÜNewRle.
$ Q LCúvmmE
4 Q «arted Steps Choose FSefype
-i Q m m p jo jm i. Cfíaose Fáe Type Prsjecí!
■ é-(te HeastefRte#
á f e ftipoftairtfte bieTypes;
1 f c litterRfes Ma¿ÑpE«bád»i
• ;¿ C g ] Asser^íe.s
! i g AssmiWyFSe,**: i §¡¡§ Foremx
t 5 f e libraras H p c++
é ^ toaetebfcs ássessfeter 1
r '§ :i ÍShel Sís-^sts | M?Íj^8XSDEtoum
4T Q íwíMssx Matefe 1
-4 Q TOE j~ g 3CNi ; ^j^MPLA8X!CEWSti
1
Q pKi0J«np!5ía_I ;™||j Ofer
^ ¡ «awáajoj^l?
gis j-” - 0 o e ^ «
«1 0 *>icwm7
tt! ^dKtíaunsatíeFP
^ É - ^ Ccmpfer Tookhssn An tmmikt ie r» contet
H h f w/amm (vs.48} pcifragnm Bes- { « } ^
Memory
. ^ — W„
; & @RAM3S8C0xl?S}bytes
.......
i ! • ■ R « 4Í&e*í!|3!í®Fírga:®|33E Í^
i |
!-18S»iTouchCspi}sao*\PICISF PIC24F FIC24H
-- 1B RAMR«»vesfcPrstó£«íwsge !-i8\»ToaehC*pí)«3aos\PICIS2' 2IC24? PIC24H
: S @ ñash 3 m (QK2S00) words
; Hert>~~] ’ - s* \ C&zé ~| f-S8\»XoaoiiC*pB«3ac®\3?IClgF SICZiS ÍICSÍH
fZZTZMTirTZ
: » Fteshm
tét«im)nmun{$xm
vi¡ f-lSS^Íaw&fiapJHKSosVPICiSr nC2*1 UCHU
f-ÍS\fiTsiíC
& e$g Sssss\«C ÍSJ- 5
IC2 4FP1C24B
: Fteh R «¥*d; í^odMCfáon fege
£ th« filas ía vhiM 2ioj«ct "0s#5 Coofijaratole Seso* !S2 ¿» «fesís BS3S» ÓE t&eiff JWtfc. TháS OOQ
^¡[ ftes«r®
forams
! ESPIAS XIDEWiki
Para facilitar las cosas, le damos el mismo nombre al archivo fuente (sin exten
sión) y se almacenará automáticamente en la carpeta donde está ubicado el
Proyecto. Click en Finish.
gg ynA BX Pc jW B B B B B I
File £dít .ib Nswgate 5o«r« ftefsatw Rm Dífeyg Tea» Toáis . v > Hti^s
- ¥ -ís-Si-l.- .>
•í
i
____
g 10)46»’.....
?!!!» *«* Mí«!jojo_?S87.ssffi *[_ IíIDBS
é 53 ícd«Oi>*>x
é Q LCE»«Sá£
$ Q l€ESf«lA&£
gtQ m
asto
j é S MansjeJo_?^?
. $
XÍH
Éfe f^es JSBpOrtaíítPte
i. ^ linter Ffe
£ £ ScsjrceFfe
; , | | Mar>«|»JO_FSS7,«SB5
X Ü libra-es
a & toadabtes
<jfs- 5 raedufeocfi
i. Q rsulfepísx
^ O i l ***** -
,+§jf ttorsss
gg W»»1oJoJ!a8?<Wíi
4 # in c lu d e f?p l 6 F 8 8 7 , i n c l? j
£ to®áa«es
® S «sodufew 5
$ Q mil®ex
,-f Q «HiX
>- 8sví^*t«r {• Manejo„ío_fS8? - OrobtMar* <t * : 6 ; CONFXG1
H pg m s p j o j m j
1»» ¡8
|
0*VfOE
0t?IC16F88?
|j 7 ; _ _ c o n fig OxEFFl
J | 1 1 t - H ChedswR: Sx26FF
; ™ !É ^ CowptefTooichaf)
; ■ ■f MPASMWÍM(V5.485 [C:!progriW! Ffe (xS6)y>toochp^«
ñ rn M F x n r m iF lG i . F n .q r YT £ WTYFT«!( -
j # !¿-QMemory !«
i B ® RAM368 (8*1%) byte»
U;0«íput 9 * IComsrntíkrnma i
n - ¡Con8s¡ufjitipn lo^Sng Sttar * |pf^tlcaáwg5ff0f * i C
® RAMUsed: 0 {2’<8} 36S tOxl'XÍ)
\ \ } ■ ■ R*SesKV«l;PríSíisKteíísag®
i i é - 11 s m (Qxzm) vitxás
ÍK Q rauftste*
14 REGI, REG2, CONT
|é " ® iwe
| « || p(c»jwptrtO 15 ENDC
'T S pleUJtanptateJl
jé~@ l*:*jw pi»te_í
16 f
• &^ik'k-&;ik'?kik‘k'!k*k-ikik-k'kik?k
i• ManejoJoJ887 - Oashfccartl « i
» [ i HsnejcjoJSS? 17 ORG 00 Primera pos
\ m ®<#D*vkC
- « : ^«ClSFSa?
{ ■ { _ K Os<K»C5um;ft¡s$SCS 18 GOTO INICIO Voy a la ef
| ' 0¡ Osrapfe TüOfchSR
“ I l - WASMW3NCvS,«) |Citro^ m Rfes ,
s í-f| Memory
iá 8 RAM368§¡xl») byte
|o»J-«87 (Oeaa, Bwid, ~¿j¡ #4
i i M RAMUskSí O(Í&0} Free¡ 368 (OxiTEft
¡ ¡ ; ® R * R « ^ ^ ;to d tic S M :Br(iS5ft
* TMtviag <üs*«w»:y
i. O P «**> 8m ÍQx$mJJ»._*AW* _ I a m a m x s a s m * i setal si®*; i»)
liosáira® ea-S* «rom C;/«?SSS5>_»IC/5í*n*íB_io_í'S8?.X/!Í 7. X. jkciS^actieo. h
*MI «sUsed; Si £&&3) Fress Si4i{Sx«$)
i loadles *s*teei.» £*«» Ct/CtJÜSO_»IC/KiK>«3o_i
: m FlashReserwsfc Pastóte Sas^e
■
jíiosKtinsj easgsl*»¡tó
&-<|:t IfeSBWttB
Inicia el código y al finalizar se compila desde el icono Clean and Build (Escoba
y martillo). Si no hay errores debe aparecer la frase Loadina Completed.
El código completo con sus respectivos comentarios y la explicación del proyec
to se encuentra en la parte inicial de este capítulo.
Ahora se procede con la programación. Si el programador está conectado, como en
este caso que tenemos seleccionado y conectado a nuestra aplicación el PICKIT3, se
debe habilitar la alimentación a través del puerto USB donde está conectado el PIC-
KIT3, esto se hace si la aplicación no tiene alimentación independiente. Si alimentamos
a través del PICKIT3, se debe verificar que el consumo de corriente del proyecto no
supere los 500 mA para no poner en riesgo el puerto USB del PC.
| f jm A g x ioe vj.m - ^ 1 8 1
Flifi Mk Ymv Stock» Kéz&cr íbm tMm§ Team Tods Wm&m Hslp
$ 4 ÍM H W y i l o«tpU<
f -■ QftAM3689xl7Q}i>ySeii
{Osan, »!>!«,._} #4 * 1n m m j i j ms t i0 e » » ,*M t ~lím¡ >
i s sé ii r r r . i
¡ : ; WRAM8es^¥sd;Produ<ae)nímBge ■ H ¡ <ív*i ^ zwg ««e
í 5 é '8 fe * * r a « ta 2 0 0 ® w « * | |
í i $ y •: | As< <®cssms***í&
! : « Rí^üsed: S1£C8<335Frse:8J41 «KstlFCO} j lj »*«» «• Wwc»io»....... 01.S8.40
FfeíhRessrved: PrcxfccSon¡mags j jl j irlBK* r * 1:sít>* ........................ -*cs?e
| S- & Rasources ■»- j j | ^
jum
LUIS GUILLERMO MONTOYA DÍAZ 27
T T T IT r
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE
La program ación se hace desde el icono Make and Proaram m ina Device (Flecha
verde hacia abajo). El aviso en rojo aparece cuando la aplicación no posee ali
mentación y debem os habilitarla a través del puerto U S B del P IC K IT 3 así:
| | MPIASX IDE vi 60 - M i
ífejEdffc Vmbw Msvtgrte Sowce Rsfactcr Rm Defawq Team Toí
ti í>tew Cí.rt^Msyfesjtes+f'l | !*<kc ¡ WsjSXOibankSÍ;
Q MewFík» Ctfí+N |
Sart*»g* w jll
¡f M Op«nProjtd,., Ctrf-í-Msyóseütei-í-O
Open faentPfOjset H
| Ím¡»ít »| 1
| Op«n T sk » Project„
Ota» Cfs?a«ej»Jíf_f®7|
2 ; PIC16FB87 Configuration Bit Settinc
Open File». 3
%mReeentFíls *\
►¡
4 tinclude "pl6F887.inc?l
PwJ«ct Pf0fs«rt*« {M«Rej«j8,5®87|
5
| ; S.JYS &rkS"
¡H
S«v«As..,
S »* « Ctel*M«y«s;£üUs*S |
6 ; CONFIG1
PígeSeh^»™
Ctrí+Ait+Msy«5í«i*5+P j
7 ; _config OxEFFl
: M ts W M L . R ccm w ja rn N w im POBO YT mrvw. -
1 M
p ; m ram om i r « k 3 » Q x m
1; i ; j PS es¡®js2»*«
í ScssaXasáisg *!?.♦.
Ii É®FM»8»2{0x2fiGQ>swiKÍs
1 ~. ... '** ... ' i ; &£ dmí;xi2ád e sliese
j tixmmsm Sais« 'Hueñis
I1
M Hsssh¡Useá: Si px3%Free: 8141 (8s£i?CD)
UWI Prestóte* Jsiage
¡Fifflwaas .....
j¿ ftaseurf**
ParsSig písabaos
tj , . Ü ■"... ;
fí-oveets
~jp r'lirn '
3BH
fS §§i miiÑcd
®S3MssmjoJW HRRHHMRiRiR
Q
¥ © Header files
í H f IraporísntFte
j a O Conf: {defsuftj
i ; i' ®8Í3 >i!»w terget ofCíH Son; PIdatS fí
f ÉQLirte-fifes Bit Settinc
3 SourceFfe
Ü Manejo »JS »7 m ■ BuÜefeg
* üferariss
i. Ü f loadásfes
• s^ssm
¿ S pfcl¡>_t¡mip¡ats_J
Í-#
8 © pfei&Jwp¡ste_i
- •*anfj»>J*88 7
e #Devfee
¡ OpteDesoijstet iPfegwms’tsKGiií
fe- *§' CssipferTaofchaín Y T jo w t y t i^ - i
‘f NPASHWK CvS,«5 {fofragran «fes
6 ¡S§MS¡»»>
i £,- É£ 363CaxIJÜ) bytes
! í t-fI » "R — « .." '"I
Ü üssd: D8),«5 Rae: m
* <j »f
’ * ¡^Rísm^Preducbori Jmage
i S ®fissh8192(Sx2DOO)ís<jr& MaftsgeCorí%ratí«i5„
i"..__-H —
;• « Rash «sed: Sí (9x33) Frse: S141
1 ÜS FisshReserved: Pfc-Ajcttor¡ Imagí
* 4 r-
szgss
i # '© *snej#j»jw?
* I
iit t j .......... .........._ _ _
. £ O M«Rejc»>J=SS?
f-jfc j HeadsrFte
t i | I«>pQríantffes
i ¡
í | | j bsteFte
r £ SawrteFáes
2 ; PIC16F887 Configuration Bit Settinc
■ §0 M a r ^ jo jm * » »
,f § | ¡¿brartes
s I : f e Lsaásbtes
i) 3
*O* J f MPIÁ8 ¡■i W- pe
j 8»
; $ - © pe©Jípate,.!
|.
IV
CAtmONXh^kti^Íheá«vices«teetedmWlA8!recmsm7)ístiiíeian!*on« i
thatis physrcaliy a&fcschecJte the dsíwg too!. Sstówg * 5¥ <fevk« whert a 3J V
;S. Q ¡^HJstnpte*íí.J. ó«wee » «>«s«tíed cao f«saft mdamage to the « £ t wfeessth« áeb«§§« dieds
tíi* «Swke 10. Do ymi v«s)>to cewíwse?
| ¿ - a ¡MCiSj£mpiate_i
:oJe„F88?-OMÍlibO»ftí <8*
!|| i%Mar«joJoJ=aS7
^ b # O e v te «
^ | <#í>£€JSF8S?
;|||j - ^ Oséete*: &¡£»S
* | s ~¡J Carspta-Taoteisaín
B | <§■ «PASMWSí $$M) {efnsgra® «es f*)ltaehk!JTOS
FH.qr Y T £ . WTYFT?
j# p* Q»»«y
i h ,,.j™
5 í -
™ ™ ~ — »— •-| {£3R3n,B»á4..4#4 x j Hanejo,»J=8S7 (Cfean, „> #2 *
J M CCflfigwMton S*s_ j
Síanejo_*CF«í7 (Ctesn, BaM, .„} #3 * Httat3 * {8uíkí, üsrf, ) .
S » RAMUsed: 0 (ffiíO)Ffea: 368 (0x170'
I «á$ RAMRumiad: Pradutísan tsssge
i *3 8 ñzíh 8192 fflx»e0) «,-ards
I crrr~«v
» fiaánUsed: Si (<^33) Fr«e: S141 (at^CD)
CosísscSitss s« iíSMB PZCkzv 3.».
Firswss* SuS.t« Versión__..31.28.43
{ i ; Hñs#sRasm-«Í!Proáicfe?f!i^a
Firasísj» t¡£$>»___________ .^iásíaags
| - ti
Srogss»isg,..
a
=JJL
Jl l INS
16T 88?
lililí
1 30 LUIS GUILLERMO MONTOYA DÍAZ
flT IT I
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE
:Projetó»
Sg r<tejojo_F8S?
<818í fswage ¡1 SUS©
i \ '\ 5s«sss>{.:wjaK:. . . . .
¡ é f § HeaderSes
j ghfHSSpertBiltffeS í|§ V •-=>:•P ' ~ “ ........ ......X r X \ \
í f | | LWarFÉes
S |£j SouroeFte ChooseVroject
j ! áv ¡Él Ubrañes í. C tase Project
¡ Í ¿ l t iM á t í *
陧§MsmfiJoJW? “1ÍQsssntítePrí^
■ I) O te &tefeted ] ;Q Ewsbogm m m vg íto^ct
É"S méhom -1 fe Ssmptes “| PrsMtfteft£sá*fcfaa^}^si^
|é Qfnuiüptof | Usr^ypf^etí
Q «m 1 Fonsms
jéS
® S i»cía„te0fete„i | Ü S ) ÍIPLAS X ÍCEForum
¿ ~ fü í*iS_t£inpfete_í
» Q POS® i I^MPiASIieE'íW
_» S^OJSCTQB
tó Hsní^joj®?
!<sx
\j 0 P l£ t& W ?
■ H CbedsurcOxSCS
' « ' £ ^C í^e T s o S c h *
;H ! ^MPASMWe^^gS^rogfwiiílw^íí I
># R
\j ' ZQW H36«C0s<»;b¥te
p - — — ™.
» Rm üssd; 0 {OxCf Fres: 368 {ÜklM
i Ü ¡ ÍWS Reservé PswtóiOR Iwage
i i É @Ba*B2S2»<»0)«r«fe
S «k*#U ojW ?
® -fe HeaderSas
í §f 3rsportantFíe® ^'HÍSÍSiiS Ü D
ɧ|
É - |§ Soureeffes i i Steps SetectTool j l
PÉt U»wfes I 1. Choo»f¥o|Kt ................................................................................. ■
®flt loodáfc» 2, SeteSOm* HgrsfesreTaate *.
QMawgsjoJW 3<
4.
&ílesíHe®ds
s*átó«
■»KS3
il
£¡j »tk«aoeri
5. S e te ctf^Jtoá ' ' ooW xM
é S3 <»*#**
í"®*** 7. v r.s m .m m m . Q ¥&mm%
"t! Q pfcajsmptetej. FtAáer i oW3 i3
í-«®R«ÍKS
é"® pfci^jsnpfatej.
| íjíiw":',.
m •»»><»
f-J j*cí$jwftoie_J 1i X J C l# /WWW' !#-s¿ «íss^íStarter¡Sts
é~® POIBBffi i»lA8SCa«Wlfel
O"
O pacoEcros - «MicRosnac
ite&atef *S»03E33««© Mü
¡í ¡¡ : -#Sffie Mensrsf
» %«erwüojojW H l-osKEeiraaFj
- #D e« ^SS^PICS^i
M «dssdmr-QxSKS
s£1f Ca^erTookteí i í: ■<:" ¡ 0 " . : 4 / / "
i-J - » « S (vS.«) [<
# G QMs»ar>'
% i I I . ■
j .®«i»Used:S$M5l=f8K^8SKiS3| ■ P L ftB J C
i RíWResero®!; ft-oslscte
•-■ g Fiash 8» 2 pt'ám } 'mrás
j <tek || $text> | I Cstó t!....Heia J
¡ L-H Ftos %gmtr®sá'. Ps-oduclteIwsefe
- Rsisourisí
iíProjeefe ís p f S e s SUBIS
: é ' H HesdarFfc
! Iwpatant Bles §fNe»-noec
í ®Ü «*»«»
; §Í0 Sowroefñíe»
; é'HSf l&raries íhoase Pmject
í é # Umááks Setect0ev«e . CompteToctehars
fg -S Manejojo_F887 SeSestHsaáef I b -«- t h h ?icc
SéttfTcc! | ¡ ©HI-TECHPICC (vS.SS) [Cifrogram Rtes 0«86}^I-TEOí SoftwareflCC^RQ$.65$in]
f Q mostósáon
SefectHugtntará
$-(Ü Setecfc Compite* > & HI-TECHPICC (vS.83) [OV*rogr«m«es {x86)W-7ECH SofevafeVlCC#.83W l
r 8«w Seles*PrssjsctHazsemé 18 rapssm ! ÍÜ|| Fomms
■ aispssm (¥5,43} {Ofrograraffes
É - f ¡ (MS.tafbte.1
r <3>XC8(vi.00} ¡e:spfo«a» Ffes C¡í86)V»tefod%te8\vi.OOtán] i 9 Mf^BXlDEFonim
& f § pzl& jm fe tej. L OXCSCvLSl} [C:^programBles 1,01^1
¿ Q koísee 1■■■»XC8 (vi. 20) [C;frogram Fte <x86)|toch»^gSVl. 18$*] i ^j^MPlABXiPEWIki
f Q mOJECTC>3
MatizojB_p88?
air<0; 0 m w m Devtas
■14■*■$•siÚmdsm:OxSECS
fin i ‘ f M W S W #5,48} {fcftagra» «8$ (x8S}$ ¡
i-|¡§H«s«y
\i ! ...—ffij*— ——
|
f i «R » U $tóe^)free:358$3d;?0)
s ; WR*&«^f¥8dsft,8ásíS»i8a8*
\ 4'®fte*#mí})íí9O0|»«rdb
! iT i% i
, m náhik¿Bíi 5i{o*zi}ff<K; s m coxsfcfc
3
'■■SM ffesh Resarveá: Producto Image
Resources
iPjüjgrsmmisg_
i Hzaqzxmú.tt%/Vezi£y
4
W f'*W
3íb®*8¡
hProjsst» 4l«>>Mss |[ifert?a§e it] ^ I D i3 @
S Q H sieiojojw ? íiís íííí ;: íííjsríísj; .» •:* * t r ? ;rf \ \
f JQ BeafeBes H H B l • x
.......... ................... — —
! $ - 'i | tW ffc ÍT H J S jH k '
\ . .. X
®"¡|§ SourceSes Steps 5etectfft>j<“<±88me ard foiáer
é | | Iforactes 1. ChsasePrsject
| § ioadafes 2. ^ectOeto
Q Man^jo_fS87 3. SésátísséiT
4. Stó:Ted
® Q ffíKWaoen
5. SdecíWugífsSoafd ftojíd locafcn: : :.c-jk
!*í Q mutepíex 6. S^KtXoMsr
Prestí fs te ; CíWSO_PlCs«aM3»_*>„e_F88?.X
Q««x ?. SetectPwjedtSaa^aiErf
folder
-§§ s&í8jem$stgj D\«-«nte «xisfeg sfojad
Q pcl2Jiitrtistz J.
ü Q s«i6jei!pate_i jPk®éátfgmm!e$>
: H ?QUXBE£ 'jMastMtepraíeEt
§ mojamos
H . .v .
% «anejajojF887
é -^ D a É *
¡ r 0mim$y
Ü ChaássumiOxSKX
iá- *5“ Cos^erToddw'
¡ •■ ? WA»V»Í¥S,-<»3{e;^<3gw =>‘ - H
2 Q Manar/
| B1|35^ tedies ErtcoíSiig: ISO-8859-1
i ; | “ SS""~ ” 1
. | ‘ ‘-üRWlRMeoadsfswdfaattifcass
S PLR BM
| &SW i8a2C0*^0S}wor!ls
í i f " " ir 71
1: ' • Bssli Used: SI {0x33} Fres; 8141 (OxlFCÉ
i: W ftesh Reservad; Prodjcüon Image
iPrsgzrasaíng...
Resources
ÍPaío^íasmioflA'erifY e s ^ I« te
^ ^ -----^iSWSÉ
File & » View N m ^m Source R*f*«t©r km Defcug T«m Tooís Wmúm Htijí
Aí$efná%Ffe»««„.
ItewtsfteSÍFeMw C Scurce Ftfe.,,
Ádd&s$tíngtam~. ss C HeáderFíls»,
Áéá £*isfe§ ítems fmm fe Wíw,„ y Áiswáb!j’F3eA«
m CM*»Ffe„< I m m * ví ® s« (¡¡¡3 Forurast
m msinpíefci:..,
fopSyRfew m v» feer» - MWWAÜT 1 » e r® B « * fr-em S¡S?US8 Í ¡ § «m ASXSBgfM»
ü
; C** Cbss,„
I ^^SFtASX $8EW iki
\ m ; €* * Wsfe í*S»,i.
m
fs¡áCempSer» má AssemMers
© C+* Hwwfef fite-
N\- ~ -Aoewoe ti MsWfe,.,
"ptetes má Sappotí Sc«w»síi$s8£»
> ■-
. |¿
• I^CbsdswseíMáFF
Cosspte Tsctehaífi
ffl Othtr-
• H
c U Mmexy
1 :om<m Ws C B s & s
i Q m ñ m (0*158) bytes
i I i-Í
j {
11 i
* 8AHU»d; 8 {m ¡ Free; MS $xi?85
m«m..P>JS8? ■'&»** to 34 .) »
¡mmm.
g -P
\ é f¡§ Hsatíetffe
« & Saporianífte:
i é -jfe üntarfieg
i r S t Uwanes
® tsadaife
É S MsNfeJB-JW?
I I g[] Hescterlfe
’ '* Ü í SrísremtFfe
I ’t! Ü3 UnterHtes
i m SoiírceFfa
® f t librarte*
É Ü loaáa&íss
í
¿§¡
| é Ss
tós * Hs-sej»ja_€Jí
E «#»*»
tu CfeásswxtSiúBF?
£ V Corete 'T«otósaf?
i ‘f 5C8 ( v i l » [€:1f?sgra« fte (^ ¡ ¡t a a *
8*»ry
;' %RftN368(Sx:Pg>Ma*
H » IÁ S XIDI v i rn - M
Ríe &M
s w lW
Mwgste Ssufes
; áeftót
8 * Befesif ?«sw Teeís ¡V
iO&*6Mé
Cfc!*l i«fc« :W:<kü:ísaf^8Íi Xt^ú
i Projects -t
■ á
ra« Cifl+2
C«*9 "OIS©
8 Q M ^ o jo jB jis ?
i gr¡¡§ HeadarSes Si fawríte C«»3: ■: fe d i ' í,
! $~§| tepcfíanífte
: ?>® Unterfites
\w
| Tssis
<irl*5
Ciri+S
3
; é ||Ü SS6ür«íFfe& Baslífeosfd
■- f t j Maneio_toj:jSS?.c
; é ~ i | mm'«s
fevigatírsg
i íí ¿&-sadsbtes
&-§¡g Wsn<So>JeJ887 Odhsfggmgi
i é - f e H&sste-pfes V«rsi«Bmg
i iMpWtaíStffeS flChtencsyWms ►f ! Piogram Memory
; ¿ ~ Í1 Unterí*»
S'smslaíor ( §3 f ite Registe
é Ü3 Ssurosffe
i é Ü Uteafe* Otbtr ¡M SF%
•®Si tossfeÉfe Editor 19 CcsfifMriítioftBsts
i H t SE&aígfetewwy
Oosé Wiftctow OW+W
i?U m m M S L J& l - O » - . !9 i t e lS Messioisy
V«»míz*Wtfid®w &foyúsasl*s+1Esc3ps
UndtecfcWíádtow ¿S*l»fe5P&cüj»s+D
, í h¡pncM ;
H - lí, Gsedcsurs: OxÜSFF Cto«&<x«me»t
( 3 *1" Co5» ^ Cióse ASI 0os«m«ííts Ctri* Msyés«síte*W
< ¡ 1 f K » {vi. 12) {CsVragraw«es fragu a d » » * »», X2$fc¡! i
0 $j¡3 Manar*
Cíase Otihet Documente
3 g R«-1 568 (0x273) bytes Ssses»e»ts.„ Mayúsc«las+R
íjo_»_FS8?C&*ü4ie34~-} -
» RAfí Lfefté 8 (0x8) Ree: 388 $xHG| M U k
1 i WRws®$evírf;»5s!fa:tel«age
¡T&® fellcwxiMjf ®®¡8¡®sy srsaí»
! - o « a * m z COxS»! vwds
I f“ 7«*.^.. ..
: «RaAUS9íí:Q 85x0) Pree:SlS2 (0x2000)
i f>r»0sass mssssry; srs*xs «ífcfe«
i ccríf igyr.
® F tó 8«s«ved¡ ProdudicmImsge
Ó-Resources *■
tSSBB
n M P U 8 X m v i » - jfaHfrüo.CJFB87¡d thrtt
. ' '.... .
't o a » % »* -
| i mfmUsed:Q{m)Free:368(Gxm)
L ® RSMResavsé:?roájcto1«sa§e
E ;|§ Sash S192 (8x2)00) monis,
Profeeís a rta * tt K]
8f¡ tefejojCJBS? ..■i - -
<*> f e Headerffe
; é Ü 5®pertanl«es YO ffpragma corifig WRT UFF^ 7/ ■
^ f e triser»es
í tí S i Souroefites
Mae^ejo_Cj^87.c
21
•■ ® l l Libraras
¿ j¡? ts a re s
8 S ^»nej®JiJW
22 ♦define XTAL FREQ 4000000
r |£ j Hewterffe
8 -¡§ | IsaperterArtes 23
é j | lirfarflte
$-§ § Seurce files
é - f c tt ó s s
24 void m a i n ()
é " Ü üsa&étes
j j Manejo.e_F8g7 25 5 {
H MareajejCJSB?
26
| i~ 0 n c í s m T
—
j
-
; í|CW»¡m;Ox36Ff
Corear TsokhaíR
27 ^ }
13 ■ txcaC ¥í,i2)[c!^ » F t e C * } P f f « ^ W V í . i 2 »
H F Bfctew y
«¡ QftAH3e»§>j¡178i}»¥íes
: I i ¡ Hl ! 0% ' J j%g^«loa<in9BT<y ¿ } 'p £ m 3 x m r n t^ r n jm ? (BaM, im á , * Cofrfjg8*rsSo«rce t
m RAMUssrfí a (0x0) fres: 3S8 ©xl»>
iW Producto Snsge m ¿i
C flash m z COxSSOS)vsords
n F "— i% 7 i üseiaSa
M ^áRashitelíOfxffitejSSSiM ias)
|; ■ Ha* Sas*msd; ^ g áy ete fessge
Pe» <■ „ // em
OW rUl
1 "X v$v3,U*%ss*:i CeymtíUs»*«M»«r « . . c&ys’j r ss
' -••• •=
» J p HwáejsjqjBK?
* 13 HeaderFfc
s é "Ü | taparte*)*»
I É 'Ü l yete Ras
’i S 'f e Soureefiiss
■-fg
39 í
! ® w lásrafáss
; ¿ t | Usadstóes Ú délay ms (200);// Retard
i - i r n m jo jm i
: m He*ferFtes ;41 while(!RD4) // Mientras R
7~ ¡j¡¡$ ísportanífite
• É-Ü¡ irteRta»
| 04ÉI S««*n« ■42 continué; // Si pasa a un
1 ¿ " H Urwles
! ¿#
S - B Wan»jBjB87 __ 43 cont^cont+1;
i; MWWtOjOJpJFWHr - SíS.„
Oeste
'44 PORTC=cont;
s r 0 MCím$3
^ OTSctem; 0>;Be08
á 1 ' Cos-pief Tookha«
45 PORTA—cont;
lLJf
- S S »13SS ®xm ) bytta
Msnepjojcjemt {Oca». 8a<iá,,4 #2 * ) C8>>a»laa4> m) *
i m RATÍSíJstíét4 (0x4) Freí: BS4(SxJSC)
^ RAÍ»! Rwrvad: íreducte feisgg i
; Th* tmsms%> t¡
af ^ « i SiS3 (OxKSOOl w sfc
CAPÍTULO 2.
LOS MICROCONTROLADORES PIC DE 6 PINES
Existe en M1CROCHIP la referencia de microcontroladores PIC de 6 pines llamada
10F20X, que incluye cuatro modelos: 10F200, 10F202, 10F204 y 10F206, estos difie
ren entre sí, básicamente, por el tamaño de sus memorias de datos y programa.
Program Meutorf Data. Memory Timers
no Comparator
Flasft (worés} SRAM (bytes) i-feit
PIC10F200 256 16 4 I 0
PIC1ÜF202 512 24 4 1 0
P1C18F254 258 16 4 1 i
PIC10F206 512 24 4 1 i
O bviam ente, con tan pocos pines, no existe la posibilidad de conectar un osci
lador externo, éste siem pre es interno con frecuencia única de 4 M hz. A sí las
cosas, quedan los dos pines de alim entación y 4 líneas, una de ellas para la
conexión del reset ó M CLR, que tam bién puede ser co nfigurada com o entrada y
las otras tres pueden ser configuradas com o entrada o salida.
El usuario debe tener en cuenta que estos micros en encapsulado DIP poseen 8 pines, pero
dos de ellos no se conectan. En montaje superficial estas referencias si tienen los seis pines
exactos como puede verse en la figura siguiente que nos enseña los diagramas de pines.
SOT-23 Pin Diagrams
N /C : 1 a G TO O JW ff
Veo - 12 i 7 V ss
3
OP2/TOCK1/COUT/FOSOI - 13 G mm
GP1/ICSPCLK/CtN- - 1
14 O 5 GP8#l€3SPDAT#CIM-i-
m
Creo que hay muchos aficionados a los PIC que poseen aplicaciones con dispo
sitivos de 8, 14 y hasta 18 pines, y solo utilizan 2 ó 3 líneas de entrada y salida,
encareciendo así su producto para el usuario final y quizás disminuyendo las
posibilidades de competir en el mercado, simplemente, porque desconocen la
existencia de los 10F20X.
U1
GPO
GP1
GP2/TOCKI/FOSC4
GP3/MCLR
MC10F200
// Se incluye la librería principal con los bits y registros especiales del micro
^*****************************************************************************************
#include <xc.h>
M JU Li
// CONFIG
{
GPIO=7; // Si está en uno activo las salidas GP2, 1 y 0
}
else
{
GPIO=0; II si no está en uno apago las salidas GP2, 1 y 0
//r * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
MUUUl
LUIS GUILLERMO MONTOYA DÍAZ 39
nnwr
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIOBEE
#INCLUDE <P10F200.INC>
******************************************************************************************
Palabra de configuración de bits
**************************************************************************************
ORG 00
GOTO MAIN ; Voy a programa principal
ORG 05 ; Salvo el vector de interrupciones
MAIN
MOVLW B’1000’ Configuro GP3 como entrada y GP2,1 y 0
TRIS GPIO como salidas
MOVLW B’0000’ Limpio el option para el buen trabajo del
OPTION pin GP2
PREG BTFSS GPIO,3 Pregunto por el estado del pin GP3
GOTO OFF Si está en cero voy a apagar salidas
MOVLW B’111’ Si está en uno activo las salidas GP2,1, 0
MOVWF GPIO
GOTO PREG ; y retorno a preguntar por GP3
OFF CLRF GPIO ; Apago las salidas
GOTO PREG ; y retorno a preguntar por GP3
END
r * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
//'
ü ii ü
rom
40 LUIS GUILLERMO MONTOYA DÍAZ
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE
CAPÍTULO 3.
INTERRUPCIONES EN EL NUEVO PIC 16F1823
Antes de empezar, tenga en cuenta que el trabajo de interrupciones con el m¡-
crocontrolador 16F1823 de 14 pines, se puede utilizar para trabajar interrupcio
nes con los PIC de 8 bits de última generación como el 12F1822 de 8 pines, el
16F1827 de 18 pines, el 16F1936 de 28 pines y el 16F1937 de 40 pines, debido
a que los registros son los mismos y funcionan de igual manera.
Las interrupciones son eventos que están por fuera del flujo normal del programa. El micro-
controlador ejecuta secuencialmente el programa, si sucede un llamado por alguna causa
de interrupción, éste almacena la dirección actual del contador de programa (PCL) en la pila
o stack y va a atender el llamado, luego de realizar la tarea programada para la interrup
ción, vuelve a la pila, recupera la dirección previamente guardada y la lleva nuevamente al
PCL, que es el que decide en qué dirección continua su trabajo el microcontrolador.
Para explicar mejor este comportamiento, vamos a realizar un ejercicio donde se
muestren varias causas de interrupción. Para esto se debe analizar el registro prin
cipal de control de interrupciones llamado INTCON. Particularmente, se va a estu
diar el tema en el nuevo microcontrolador PIC 16F1823
REGISTER 8-1: INTCON: INTERRUPT CONTROL REGISTER
R/W.O/O R/W.O/O R/W.O/O R/W.O/O R/W.O/O R/W.O/O R/W.O/O R.O/O
G IE ¡ P E IE | T M R O IE | IN T E | IO C IE | T M R O IF | IN T F ¡ IO C IF
Bit 7 bit 0
Legend:
R = R e a d a b le Bit W = W ritab le bit U = U n im p le m e n te d bit, read as 'o '
u = Bit is u n ch an g ed x = Bit is unknow n -n /n = V a lu é a t P O R and B O R /V a lu e a t all o th er resets
'1 '= Bit is se t '0 '= Bit is c ie ared
B it 7 G IE : G lo b a l In t e r r u p t E n a b le b it
1 = E n a b le s all a c tiv e in t e r r u p t s
0 = D is a b le s all in te r r u p ts
B it 6 PEIE: P e r ip h e r a l In t e r r u p t e n a b le b it
1 = E n a b le s all a v tiv e p e r ip h e r a l in t e r r u p t s
0 = D id a b le s all p e r ip h e r a l in t e r r u p t s
B it 5 T M R O IE : T im e r O O v e r f lo w In t e r r u p t E n a b le b it
1 = E n a b le s t h e T im e r O in t e r r u p t
0 = D is a b le s t h e T im e r O in t e r r u p t s
B it 4 IN T E : IN T E x te rn a l In t e r r u p t E n a b le b it
1 = E n a b le s t h e IN T e x t e r n a l in t e r r u p t
0 = D is a b le s t h e IN T e x te r n a l i n t e r r u p t
B it 3 ¡O C IE : In t e r r u p t - o n - C h a n g e E n a b le b it
1 = E n a b le s t h e in t e r r u p t - o n - c h a n g e
0 = D is a b le s t h e in t e r r u p t - o n - c h a n g e
B it 2 T R M O IF : T im e r O O v e r f lo w In t e r r u p t F lag b it
1 = T M R O r e g is te r has o v e r f lo w e d
0 = T M R O r e g is te r d id n o t o v e r f lo w
B it 1 IN T F : IN T E x te rn a l In t e r r u p t F lag b ir
1 = T h e IN T e x te r n a l In t e r r u p t o c u r r e d
0 = T h e IN T e x t e r n a l in t e r r u p t d id n o t o c c u r (1)
B it O IO C IF : In t e r r u p t - o n - C h a n g e In t e r r u p t F lag b i t (1)
1 = W h e n a t le a s t o n e o f t h e in t e r r u p t - o n - c h a n g e p in s c h a n g e d S ta te
O = N o n e o f t h e in t e r r u p t - o n - c h a n g e p in s h a v e c h a n g e d S ta te
N o t e 1: T h e IO C IF F lag b it is r e a d -o n ly a n d c ie a r e d w h w n all in t e r r u p t - o n - C h a n g e fla g s in t h e
IO C A F r e g is te r h a v e b e e n c ie a r e d b y s o ftw a r e .
Figura 6. Registro INTCON
ULUJÜL
LUIS GUILLERMO MONTOYA DIAZ 41
mimr
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE
Vdd- [1 14 ] — Vss
T1CKI/T10SI/GSC1/CLK1N/RA5 ■ 12 1 3 ] * - RAO/ANO/CPSO/C1IN+ÍDAC0UT/TX%KÍ%SPDAT1CDDAT
T1G^1IfSDOfl/CLKRíT10SQ/CLKQUTOSC2ÍCPS3/AN3/RA4 - L¡3 8 12 RA1/AN1/CPS1/C12INtHVREF/SRI/RXf1)/DTl1¡/iCSPCLK
MC¡SWpp/T1G¡1I/SP/RA3- [4 RA2/AN2/CPS2/T0CKI/INT/C1OUT/SRQ/FLT0
MDCIN2í¡X<1toT%CP1/P1A/RC5 • [5 i 100 - RC0/AN4/CPS4/C2IN+/SCL'SCK
MD0UT7TX%K(%P1 B/SRNQ/C20UT7RC4 • [6 | 9 ]- RC1/AN5/CPS5/C12IN1-/SDA/SDI
MDMINÍSS*%P1C/C12IN3-/CPS7/AN7/RC3 ■ O? 8 t i - * RC2/AN6/CPS6/C12iN2-/P1D/SOO(1)/MDCIN1
3 - Interrupción por cam bio de nivel en cualqu ier pin de un puerto específico: Se
habilita poniendo a 1 el bit 3 IO CIE (Interrupt On C hange). En este PIC 16F1823
será el puerto A.
El bit 6 PEIE (Peripheral Interrupt E nable) co rresponde a la habilitación de las
dem ás interrupciones que posee el m icrocontrolador, las cuales son llam adas
periféricas: por ejem plo, la interrupción por finalización de una conversión A/D ,
interrupción por finalización de escritura en la m em oria EE PR O M , entre otras.
Los bits 0 ,1 y 2 son las banderas que perm iten ve rificar si efectivam ente la inte
rrupción sucedió. P or eso tienen el m ism o nom bre de la interrupción, cam biando
solo la letra E de E nable por la letra F de Flag ó bandera.
C uando el m icroco ntrola dor está atendiendo una rutina de interrupción, no pue
de hacer otra cosa hasta no fin a liza r el trabajo, no puede presentarse incluso
otro llam ado a interrupción, porque no será atendido.
Se inicia entonces el ejemplo habilitando en el registro INTCON las interrupciones por
cambio de nivel en un pin del micro, es decir, la interrupción INT y, además, habilitamos
la interrupción por cambio de nivel lógico en algún pin del puerto A. Estamos hablando
de la interrupción por cambio IOC. Adicionalmente, se debe habilitar el permiso general
de interrupciones GIE. El registro INTCON queda entonces así:
INTCO N = 0b10011000;
m ui
42 LUIS GUILLERMO MONTOYA DÍAZ
tu tu
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE
Ahora se ve el registro OPTION_REG que tiene que ver con la elección del flan
co de subida o bajada para la interrupción INT, es decir, por el pin RA2.
REGISTER 20-1: OPTION REG: OPTION REGISTER
ww-m mm-m RW -1/1 ñm -m ww - m RA/V-1/1
WPÜEN INTEDG rum os TMROSE PSA FS<2:0>
mi bltO
Legend:
R = Readabte M W = Wiftabie Hit II = Unlmpiemented b it read as W
u = BU is unchanged x = Bit Is unkriown -n/n = Valué at POR and BOR/Value ai aíl o tier Resets
T = Bit is set W = Bit is clearsd
00i 1 :2
§61 1 :4
010 1 :8
011 1 :1 6
100 1 :32
mi 1 :6 4
110 1:128
n i 1:25©
R2 R3 (1 R4Í1 R5
10k 10k I 1 10k I 1Ük
U1
RAG/ANO/CPSO/C1IN+/VREF-/DACGUT/TX/CK/ÍCSPDAT
RA1 /AN1 /C P S 1/C 12JN0-/VREF+/SRf/RX/DT/ICSPCLK
RA2/AN2/CPS2/T0CKÍ/ÍNT7C1 OUT/SRQ/FiTO
RA3/SS/T1G/VPP/MCLR
RA4/AN3/CPS3/OSC2/CLKOUT/T1OSQ/CLKR/SDO/T1G
2
RA5/CLKSN/OSC1/T1OSÍ/T1 OKI U2
10
RC0/AN4/CPS4/C2IN+/SCL/SCK A QA
9 1
mC1/AM5/CFS5/C12IN 1-/SDA/SDI
2 8 QB
RC2/AN8/CPS6/C12IN2-/P1 P/SOO/MPQiN 1
RC3/ANT/CPS7/C12IN3-/P1C/SS/MDM !N
7 6 O:
D
QC
QD
.8 . 4
RC4/C20UT/SRNQ /P1B/TX/CK/MDOÜT St/RBO QE
5
RC5/P1A/CCP1/RX/DT/MOC1N2 RBÍ QF
LT QO
D2
R6
r LED-RED
D3
220
R7
220
D1
R1
// Se incluye librería xc.h con los registros y bits especiales del micro
muí
44 LUIS GUILLERMO MONTOYA DIAZ
mrrr
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE
y y * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *********************************************************
#include <xc.h>
// CONFIG1
#pragma config FOSC = INTOSC // Oscillator interno
#pragma config WDTE = OFF // Watchdog Timer Enable (WDT disabled)
#pragma config PWRTE = OFF // Power-up Timer PWRT disabled
#pragma config MCLRE = OFF // MCLR Pin Function Select
#pragma config CP = OFF // Program memory code protection is disabled
#pragma config CPD = OFF // Data Memory Code Protection Disable
#pragma config BOREN = ON // Brown-out Reset Enable
#pragma config CLKOUTEN = OFF // Clock Out Disable
#pragma config IESO = ON // Internal/External Switchover
#pragma config FCMEN = ON // Fail-Safe Clock Monitor Enable
// CONFIG2
#pragma config WRT = OFF // Flash Memory Self-Write Protection
#pragma config PLLEN = OFF // PLL Enable (4x PLL disabled)
#pragma config STVREN = ON // Stack Overflow/Underflow Reset Enable
#pragma config BORV = LO // Brown-out Reset Voltage Selection
#pragma config LVP = OFF
/Ar* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
#define _XTAL_FREQ 4000000
y y *****************************************************************************************
// Declaración de variables
y y *****************************************************************************************
char i, cont=0;
*****************************************************************************************
//'
// Programa principal
*****************************************************************************************
//'
void main()
{
TRISA=0B001111; II Configuro entradas 0,1,2,3. Salidas 4 y 5 en el puerto A
TRISC=0; // Configuro el puerto C todo como salidas
OSCCON=OX6B; // Oscilador interno configurado a 4MHZ
IOCAP=0B001011; // Habilito los pines RAO, RA1 y RA3
I I para generar int y por flanco positivo.
IOCAN=0; // Ningún pin habilitado por flanco negativo
IOCAF=0; // Inicio banderas en cero
ANSELC=0; // Deshabilito conversores A/D en puerto C
ANSELA=0; I I Deshabilito conversores A/D en puerto A
!NTCON=OB10011000; // Habilito interrupciones INT e IOC
//*****************************************************************************************
JU LU LLL
46 LUIS GUILLERMO MONTOYA DÍAZ
nmt
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE
CAPÍTULO 4.
U1 U2
RE3/MCLRA/PP RCO/T10SO/T1CKi A QA
16 1
RC1/T10S1/CCP2 B QB
17 2
RAO/ANO/ULPW U/C121N0- RC2/P1A/CCP1 C QC
18 6
RA1/AN1/C121N1- RC3/SCK/SCL D GD
RA2/AN2/VREF-/CVREF/C2IN+ RC4/SDI/SDA -4 Bi/RBO QE
RA3/AN3/VREF+/C1IN+ RC5/SD0 JL RBI QF
RA4/TGCK1/C10UT RC6/TX/CK JLñ LT QG
RA5/AN4/8S/C20UT RC7/RX/DT
RA6/OSC2/CLKOUT
RA7/0SC1 /CLKIN REJO
RD1
RB0/AN12/INT RD2
R B 1 /A N 1 0 /C 1 » RD3
RB2/AN8 RD4
RB3/AN9/PGM/C12IN2- RD5/P1B
RB4/AN11 RD6/P1C
RB5/AN13/T1G RD7/P1D
RB6/ICSPCLK
RB7/ICSPDAT REG/AN5
RE1/AN6
RE2/ANT
PIC16F887
2.7K
dispiay para perm itir la visualización del siguiente dígito, pero no se va a notar
ningún problem a en la visualización.
P rogram a en lenguaje C
// Se incluye archivo xc.h con registros y bits especiales del m icro
#¡nclude <xc.h>
y y *****************************************************************************************
// Palabra de configuración de bits generada au tom áticam ente por el co m pila dor
y y *****************************************************************************************
// D eclaración de variables
yy*****************************************************************************************
D eclaración de funciones
yy*****************************************************************************************
// P rogram a principal
y y *****************************************************************************************
void m ain()
{
A N S E L=0; // Todos los pines digitales
m ili
48 LUIS G U ILLE R M O M O N TO Y A D IA Z
tm r r
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE
//
JÜÜUULL
JJUUÜUL
CAPÍTULO 5.
LCD1
LM016L
CM co 10 <Q h - 00 C7) O Y- CM CO
V“ V T“ T “
Los bits RS, WR y E son los que permiten el control del LCD, aunque el bit WR, general
mente se encuentra conectado a GND, debido a que siempre se está escribiendo en el
LCD y para eso este bit debe estar en 0. La función de lectura es utilizada para consultar
la bandera de ocupado o Busy Flag del LCD, pero como el tiempo máximo que tarda
éste en realizar una operación, ya sea de configuración o visualización de un carácter es
de 1,64 ms, simplemente, se da un retardo de 2 ms cada que se requiera una operación
y se evita así la consulta del Busy Flag.
El RS por el contrario, tiene un trabajo muy importante que es el de decidir si el dato en
viado al LCD es para configuración del mismo, es decir, si se desea que trabaje a una o
dos líneas, a cuatro u ocho bits, con cursor visible o no, etc. O si el dato es para visualizar.
En el primer caso, este bit debe estar en 0 y en segundo caso debe estar en 1.
El bit enable (E) es para autorizar cualquiera de las 2 operaciones anteriores en el LCD.
Para permitir la operación, el bit E debe estaren 1 y para terminarla, debe ponerse en 0.
Para configurar el LCD se utiliza la matriz que se ve en el cuadro siguiente;
Figura 13. Matriz para la configuración del modo de trabajo del LCD
U L iU U L
52 LUIS GUILLERMO MONTOYA DIAZ
nrríT
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE
#include <xc.h>
M UI
LUIS GUILLERMO MONTOYA DIAZ 53
TTTTTT
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEÉ
__CONFIG(FOSC_XT & WDTE_OFF & PWRTE OFF & MCLRE_ON & CP_
OFF & CPD OFF & BOREN ON & IESO_ON & FCMEN ON & LVP_OFF);
__CONFIG(BOR4V_BOR40V & WRT_OFF);
// Defino nombres propios para pines y puerto del PIC usados para RS, E y e! dato
continué;
}
// Finalización del programa principal
}
void icd jn it (void) // función de inicialización del LCD
{
LCD_DATA=2; // Mando el dato 2 al Puerto para iniciar el LCD
set_lcd(); // Llamo la función de configuración
LCD_DATA=56; // Mando el dato 56 al Puerto para 8 bits, 2 líneas y 5x7
set_lcd(); // Llamo función de configuración
LCD_DATA=15; // Mando el dato 15 para prender LCD con cursor
setjcd();
LCD_DATA=6;
set_lcd();
LCD_DATA=1;
set_lcd();
}
void setjcd (void) // Función de configuración
{
LCD_RS=0; // RS en 0 para indicar al LCD que es configuración
LCD_EN=1; // Habilito la operación
__delay_ms(2); // Retardo necesario para la operación
LCD_EN=0; // Termina la operación
}
void lcd_goto(unsigned char pos) // Función de direcciones
{
LCDRS = 0; // RS en 0 para configuración
Icd_write(0x80+pos); // Sumo 80H a pos que viene con un dato
}
void lcd_write(unsigned char c) // Función de escritura en el LCD
{
LCD_EN=1; // Habilito la operación
LCD_DATA = ( c ); // Mando al puerto el dato que hay en c.
__delay_ms(2); // Retardo necesario para operación
LCD_EN=0; // Termina la operación
}
/* Escribo una cadena de caracteres en el LCD */
void lcd_puts(const char * s)
{
LCD_RS = 1; // Habilito la operación
while(*s) // Mientras haya caracteres en la cadena enviada
lcd_write(*s++); // Pase al siguiente
jÜUULJLL
BIENUENIDOS
LIBRO PIC U1
RE3/MCLRA/PP RC0/T1OSO/T10KI «15
■ 16
2* RAÜ/AN0/ULPW U/G12fN0~
RC1/T10SI/CCP2
RC2/P1A/CCP1
«17
3» ■18
4* RA1/AN1/C12IN1» RC3/SCK/SCL
RA2/AN2/¥REF-/CVREF/C2?N+ RC4/SDI/SDA ^23
5« RC5/SDO
*24
6» RA3/AN3A/REFM01iN*
RA4/T0CKI/C1G U I RC8/TX/CK
«25
7m RA5/AN4/SS/G20UT RG7/RX/OT
lJ26
14»
RA6/OSC2/CLKOUT
13» ■19
RA7/OSC1/CLKIN RD0
*20
RD1
33» ■21
R8Ü/AN12/ÍNT RD2
34 » ■ 22
R81/AN10/C12IN3- RD3
35 » ■ 27
RB2/ANS RD4
36 * ■ 26
RB3/AN9/PGM/C12IN2- RD5/P1B
37 *
R84/AN11 _____ R06/P1C
^29
38 » «30
39» RB5/AN13/T1G
RB6/ICSPCLK
RD7/P1D
40 *
R87/IGSPDAT RE0/AN5
«9
RE1/AN8
«10
RE2/AN7
P1C16F887
^ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
// Programa principal
ü * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
void main()
{
TRISD=0;
TRISB=0;
PORTB=0;
PC)RTD=0;
PORTC=0;
ANSEL=0;
ANSELH=0;
lcdjnií();
while(1)
{
lcd_goto(0); // selecciono primera línea
lcd_puts(“ CONTADOR “);
Icd_goto(0x40); // Selecciono segunda línea
lcd_puts(“ IGUALA: “);
while(cont<999)
{
cont++;
bin_bcd();
lcd_goto(0x4C); // Ubico centenas en posición CC del LCD
lcd_putch(centenas+48); // Sumo 48 para pasar a ASCII
lcd_goto(0x4D); // Ubico decenas en posición CD del LCD
lcd_putch(decenas+48); // Sumo 48 para pasar a ASCII
lcd_goío(0x4E); II Ubico unidades en posición CE del LCD
lcd_putch(unidades+48); // Sumo 48 para pasar a ASCII
__delay_ms(500); // Incremento cuenta cada 500 ms
}
}
void lcdjnit(void)
{
LCD_DATA=2;
mui
58 1 LUIS GUILLERMO MONTOYA DlAZ
TTTT1T
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE
set_lcd();
LCD_DATA=56;
set_lcd();
LCD_DATA=15;
set_lcd();
LCD_DATA=6;
set_lcd();
LCD_DATA=1;
set_lcd();
}
while(*s)
lcd_write(*s++);
}
// Escribo un caráeter en el LCD
void lcd_putch(char c)
{
LCD RS = 1; // Habilito escritura en el LCD
lcd_write( c );
}
^ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
LCD1
LM018L
U1
1» RE3/MCLR/VPP RCO/T10SO/TI CKI
JM5.
«16
2« RA0/AN0/ULPW U/C12IN0-
RG1/T1OS J/CCP2
RC2/P1A/CCP1
>17
3« «18
RA1/AN1/C12ÍN1- RC3/SCK/SCL
4» «23
RA2/AN2A/REF-/CVREF/C2IN+ RC4/SDJ/SDA
5» *24
RA3/AN3A/REF+/G1ÍN+ RC5/SDO
6» RA4/T0CKI/G1OUT RC6/TX/CK
«25
7» «26
RA5/AN4/SS/C20UT RC7/RX/OT
14»
RA6/QSC2/CLKOÜT
13» «19
RA7/OSC1 /CLKIN ROO
«20
RD1
33» «21
RBÜ/AN12/INT R02
34» *22
RB1/AN10/C12IN3» RD3
35» «27
RB2/AN8 RD4
36* «28
R83/AN9/PGy/C12IN2- rCIJO/Plo
37« *29
RB4/AN11 RD6/P1G
38» *30
R85/AN13/T1G RD7/P1D
39»
RB8/1CSPCLK
4 0*
RB7/1CSPDAT RE0/AH5
*8
RE1/AN6
RE2/AN7
PÍC18F887
lililí
60 LUIS GUILLERMO MONTOYA DÍAZ
nrm
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE
CAPITULO 6.
MíBSj ..ygg.
JO
0 = Left Justify
mm 1 = Right Justify
N v10
v
] ADRESH APRESL
GHS<3:0>-
Si observan el diagrama de pines del 16F887 en el capítulo 1, pueden ver que los
canales ANO a AN7 están ubicados en los puertos A y E; por lo tanto, el ANSEL
tiene que ver con la conversión en cualquiera de esos canales. Los canales 8 al 13
están ubicados en el puerto B y por eso es el ANSELH el que se encargará de ellos.
Por ejemplo, si deseo configurar el canal 3 para la conversión A/D de una señal análoga
a digital, debo poner en uno el bit 3 del registro ANSEL y obviamente configurar como
entrada el bit 3 del registro TRISA para que quede como entrada el bit 3 del puerto A.
ANSEL= 0B00001000; // En hexadecimal 0x08;
TRISA =0B00001000;
Adicionalmente, existen otros registros relacionados con la conversión análogo
a digital como son: ADCONO, ADCON1, ADRESH y ADRESL, los dos últimos
son los que almacenan el resultado digital de la conversión, ya que el módulo de
conversión es a 10 bits, esos 10 bits del resultado se pueden alineara izquierda
o a derecha con la configuración del bit ADFM del registro ADCON1.
l i l i ' I 1 1 i r
ADRESH ADRESL
{ADFM = 0) [ ¡yiSB j | Ils b i i i | |
mi ititQ bil7 mü
.V .................................. ......... ........................
(ADFM = D l i 1 1 1 1 1
bit T
M m |
bit0
| 1 ¡ l l l l l
bit 7
| | LSB
biO
W---- ---- _ ...
UrafipteRieriecf: Bmú as *0* 1 0 -b iM ) Resutt
Ligarte!:
R = R iiia fe bil W = Wrttabte bft U = Unimplemerrted bit, read as W
-fi = ¥aJ«e ai POR i* = Bi is set W = Bi Is deired x = Bilis wúmmm
JÜJLULi
LUIS GUILLERMO MONTOYA DÍAZ | (¡3
TTTITT
PROGRAMACIÓN DE M1CROCONTROLADORES PIC+ZIGBEE
L ip n i:
R = Readabte bit W= Wrltabte bit U = Unimplemerted bit, read as V
-n = VaíueatPOR T = Bit ís set *0*=Bit is cleared k.= Bit ís urtnown
#include <xc.h>
__CONFIG(FOSC_XT & W DTEOFF & PWRTE_OFF & MCLRE ON & CP_
OFF & CPD_OFF & BOREN_ON & IESO_ON & FCMEN ON & LVP_OFF);
__CONFIG(BOR4V_BOR40V & WRT_OFF);
lililí
64 LUIS GUILLERMO MONTOYA DÍAZ
TTTTTT
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE
void main()
{
TRISE=0X01; // Bit 0 del puerto E como entrada para AN5
while(1)
{
GO=1; // Inicio el proceso de conversión
D1
££g-RED
U1
RE3/MCLR/VPP RC O /TIO SO /TIC K I
C1
220
ra-RED 2* R C 1/T10SI/C C P2
«17
R3 3^ RA0/AN0/ULPW U/C12IN0- RC2/P1A/CCP1
■18
4» RA1/A N1/C12IN1- RC3/SCK/SCL
*2 3
5»
RA2/AN2/VREF-/CVREF/C2IN+ RC4/SDI/SDA
±24
0&$-RED
220
6» RA3/AN3W REF+/C1 IN+
RA4/TOCKI/CÍOUT
RC5/SDO
RC6/TX/CK
*25
R4 7»
O-
g g - REO
220
14»
13*
RA5/AN4/SS/C 20U T
RA6/OSC2/CLKOUT
RA7/OSC1/CLKIN
RC7/RX/DT
RD0
RD1
■ 19
£20
R5 33»
RB0/AN12/INT RD2
■21
34» «22
35^ R81/A N10/C12IN3- RD3
«27
W'RED
220
36^ DD
RB2/AN8
OÍA OIKIO
ÁI?* 4
KDO/ANy/rVj»fvi/Lr1
RD4
K U o /r lo
■ 28
R6 37 «
RB4/AISI11 RD6/P1C
«2 9
*3 0
RB5/AN13/T1G RD7/P1D
S i U1(RE0/AN5)
RB6/ICSPCLK
£$p-RED / / V=4.45
R87/1CSPDAT RE0/AN5
RE1/AN6 lsio
i
RE2/AN7
LED-RED
D8
#V1
220 ik
LED-RED
D9
#
R9
♦LED-REÍ
220
D10
9
R10
220
Señal análoga = 910 * 0.00488 = 4.44V que es lo que nos muestra el medidor a
la entrada.
.nuil.
1 66 1 LUIS GUILLERMO MONTOYA DÍAZ
unir
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE
CAPÍTULO 7.
MONITOREO DE VOLTAJE CON VISUALIZACIÓN EN EL LCD
En esta oportunidad se combina ia visualización en ei LCD con la conversión
AID para realizar así, algunas aplicaciones particulares.
A continuación el programa en lenguaje C con su respectiva documentación
// Se incluye el archivo xc.h con los bits y registros especiales del PIC
#include <xc.h>
y y *****************************************************************************************
// Declaración de variables
Unsigned int voltaje, digital, temp; // Declaro variables enteras sin signo
char diezmil, miles, centenas, decenas, unidades; // Declaro variables char
y y *****************************************************************************************
// Declaración de funciones
^*****************************************************************************************
void binbcd (void); // Función para conversión de binario a BCD
void Icdjnit (void); // 6 funciones necesarias para trabajar el LCD
void setjcd (void);
void lcd_puts(const char * s);
void lcd_putch(char c);
void lcd_goto(unsigned char pos);
void lcd_write(unsigned char c);
^ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
// Programa principal
void main()
{
TRISD=0; // Puerto D como salidas para pines RS (RD6) y E (RD7)
TRISB=0; // Puerto B como salidas para envío del dato al LCD
PORTB=0; // Limpio Puerto B
PORTD=0; // Limpio Puerto D
TRISE=0X01; // Bit 0 del Puerto E como entrada. Canal análogo AN5
ADCONO=OX55; // Velocidad Fosc/8, Canal 5, Módulo conversor en ON
ADCON 1=0X80; // Vref = 5V, Alineación del resultado a derecha
ANSEL=0X20; // Selección únicamente canal 5 como análogo
ANSELH=0; // los demás pines digitales
lcd_init(); // Llamo función de inicialización del LCD
while(1) // Inicio ciclo infinito
{
lcd_goto(0); // Selecciono primera línea
lcd_puts (“ EL VOLTAJE DEL “); // Mensaje para la primera línea
lcd_goto (0x40); // Selecciono segunda línea
lcd_puts (“PROCESO ES: . “); // Mensaje para la segunda línea
GO=1; // inicio el proceso de conversión
while(GO==1) // Mientras GO=1, está en proceso
continué; // Si pasa a 0 continuo
digital=(ADRESH*256)+ADRESL; //Algoritmo cálculo dato digital
voltaje=digitar49; // Multiplico por resolución
binbcd(); // Voy a conversión BIN a BCD
lcd_goto(0x4C); // Ubico entero en CC del LCD
lcd_putch(diezmil+48); // Sumo 48 para convertir a ASCII
lcd_goto(0x4E); // Ubico decimal en CE del LCD
lcd_putch(miles+48); // Sumo 48 para convertir a ASCII
lcd_goto(0x4F); // Ubico otro decimal en CF del LCD
lcd_putch(centenas+48); // Sumo 48 para convertir a ASCII
__delay_ms(500); // Repito proceso cada 500 ms
}
}
void lcdjnit(void) // Función de inicialización del
LCD
{
LCD_DATA=2; // Ver capítulo de manejo del LCD
set_lcd();
LCD_DATA=56;
set_lcd();
UMU
I 68 i LUIS GUILLERMO MONTOYA DÍAZ
TTm r
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE
LCD_DATA=15;
setJcdQ;
LCD_DATA=6;
setjcd();
LCD_DATA=1;
setjcd();
}
void se tjcd (void)
{
LCD_RS=0;
LCD_EN=1;
__delay_ms(2);
LCD_EN=0;
}
void lcd_goto(unsigned char pos)
{
LCD_RS = 0;
Icd_write(0x80+pos);
}
void lcd_write(unsigned char c)
{
LCD_EN=1;
LCD_DATA = ( c );
__delay_ms(2);
LCD_EN=Q;
}
/* Escribo una cadena de caracteres en e! LCD 7
void lcd_puts(const char * s)
{
LCD_RS = 1;
while(*s)
lcd_write(*s++);
}
/* Escribo un caracter en ei LCD *1
void lcd_putch(char c)
{
LCD RS = 1; // write characters
lcd_write( c );
}
void binbcd (void)
{
temp=voltaje; // Paso voltaje a registro temp para no dañar el resultado
diezmil=0; // Inicializo variables en 0
miles=0;
jiim
mn
centenas=0;
decenas=0;
unidades=0;
while(temp>10000) // Inicio restas sucesivas para obtener datos en BCD
{
temp=temp-10000;
diezmil=diezmil+1;
}
while(temp>1000)
{
temp=temp-1000;
miles=miles+1;
}
while(temp>100)
{
temp=temp-100;
centenas=centenas+1;
}
while(temp>10)
{
temp=temp-10;
decenas=decenas+1;
}
unidades=temp;
}
JMML
70 | LUIS GUILLERMO MONTOYA DÍAZ
Tnnrr
PROGRAMACIÓN DE MiCROCONTROLADORES PIC+ZIGBEE
CAPÍTULO 8.
JJiU jL
LUIS GUILLERMO MONTOYA DÍAZ | 7f ¡
T fU T T
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE
Ugemfc
R =Readabie bit W =Wiftable bit U =UniífipiiraiifecJ bit, ¡tal as W
-n =Vaiya at POR T =Bilis set V =iit is ctearad i =B i is urfowm
Registro TXSTA
Estos datos se pueden confirmar en las tablas que hay en las figuras 3 y
4 de este capítulo.
Lsgtnd:
R = ReadaWe b i W = WniaMe btt ü = Unimpiemenied bit, re a i as W
-n = V a te at POR T = Bit Is set W = Bit is cleared x = Bit is unknown
1 = Enables addiess detectton, enable iníerrypt and load fie receive touffer when ¡RSfR<8» is set
0 = Pisabfes address defectlon, al! byles are received and nirth bit can be ysed as paiity bit
M m ú im m m mode 8~bit CRX9 = o):
Dont ese
bit 2 FERR: Framing Error bit
1 = Framing error {can be updafed by reading RCREG regíster and receive next valíd byte)
0 = No framing error
bit 1 O E ññ: Overruo Entrar MI
1 = Overrun a m r (can be cleared by dearing bl! CREN)
0 = No overrun error
bil 0 m m : N inti Wt of Received Data
TWs can be addressMata b i or a parify bit and must be calcoiated by aser inuware.
Figura 25. R e gistro de c o n tro l de la recep ció n RCSTA
Aunque solo vamos a transmitir, el bit de habilitación del puerto serial se encuen
tra en el registro RCSTA (bit 7 llamado SPEN). Por lo tanto, se debe poner ese
bita 1
SPEN = 1;
74 | LU IS G U ILLE R M O M O N TO Y A D ÍA Z
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE
ÍÍBM — — —- — _ _ _ — _ — _
57.81 — — _ mmm o jo i — — __ — —
115.21c —
_ _
— — —
— — _ _
—
BAtíP Fose « 26,660 MHz Fose -1 1,43 2 ü h z ‘ fo s e 5» 11.0592 MMz Fose » 8.666 « t e
RATE SPBRG SPBRG SPBRG SPBRG
Actual % Actual % Actual % Actual %
¥Ü¡IK valué m im valse
Rafe Error ¡late Error Rat» Error Mate Error
fctecimaí) |d^€w al| {decimal) {rtBciinaf!
mm
1200 — — — - - - — — -
2460 2404 0.16 20?
9809 9615 0.16 129 9600 6 .0 0 119 9660 M Í 71 9615 0.16 51
10417 10417 0.66 11» 10378 "0.37 110 10473 6.53 65 10417 O .» 47
19.2H 19.231c 0.16 64 19.20fc 0.00 59 19.201c 0.00 35 19231 0.1:6 25
S IM k m M 2k -1.36 21 57.601c 0..CM3 19 57.601c 0.00 11 55556 -3.55 a
115.21c 113.« fe -1.36 10 115.21 0.00 § 115.2k 0.00 5 — —
m m c - 0, BRGH - I , SR 016 - 0
BAIIO Fose - 4.960 m m Foso = 3.1864 mm Fose - 2,696 MHz Fose = 1,606 mm
RATE SPBRG SPBRG SPBRG SPBRG
Actual % Actual % Actual % Actual %
Rale valué %mXtm vaiya
Error Mal# Error
|«fecií»al| fémtímai} Raí» Error fdeciraali Rale Error
fd eclim i
300 __ __ ___ __ — — — 300 0.16 207
12» 1202 0.16 207 1200 0.00 191 1202 0.16 103 1202 0.16 51
2460 2404 0.16 103 2400 0.00 95 2404 6.16 51 2404 0.16 25
9600 9615 0.16 25 9600 0.00 23 9615 0.16 12 — .
115.21? __
— — 115.214 6.60 1 — _ — _ __
Hagamos uso de los registros configurados para el primer ejemplo que será
simplemente enviar un carácter al PC.
// Programa de comunciación serial básico
^ * * * * * * * * * * * * * * * * * * * * * * * * * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
void main()
{
TRISC=0; // Puerto C como salidas para el pin de transmisión
TXSTA=0X24; // Habilito la transmission y bit BRGH en 1
SPBRG=25; // Velocidad a 9600 bps
SPEN=1; // Habilito el Puerto serial del PIC
while(1)
{
TXREG=65; // Envío la letra A en ASCII
while(TRMT==0) // Pregunto si TSR está vacío para enviar nuevamente
continué;
__delay_ms(500); // Envío cada 500 ms
}
//'* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
mui
76 LUIS GUILLERMO MONTOYA DÍAZ
TTrrrr
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE
*15
RC0/T1OSO/T1CKI
«16
RC1/Í10SKCP2
«17
0- RC2¿P1AC€P1
RC3/SCK.ÍSCL Jim
■23
7C2IN+ RC4/SDÍ/SDA
RC5/SDG JS21
RC6/TXCK 2L-
ñ c im m JS2&.
«19
RDO
RD1 •ssl
«21
RD2
*22
RD3
RD4
^27
a28
RD5/P18
*29
Cuando desee enviar cadenas de caracteres existe la instrucción printf que hace
parte de la librería stdio.h.
Veamos un ejemplo donde se envía una cadena de caracteres y una variable.
#include <xc.h>
#include <stdio.h>
y y *****************************************************************************************
char cont;
void putch (unsigned char byte);
y y *****************************************************************************************
l i lilí
LUIS GUILLERMO MONTOYA DÍAZ 77 1
nmr
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE
void main()
{
TRISC=0; // Puerto C como salidas para pin de transmisión
SPEN=1; // Habilitación del Puerto serial del PIC
SPBRG=25; // Velocidad 2400 bps
TXSTA=0X20; // Habilito la transmisión y bit BRGH en 0
while(1)
{
for(cont=0;cont<10;cont++) // for para el conteo de 0 a 9
{
printf(“\r Contador = %d\n”,cont); // Envío del mensaje y la variable cont
_delay_ms(1000); // Envío cada segundo
}
}
}
void putch (unsigned char byte) // Función para envío con printf
{
while(!TRMT) // Pregunto si TRMT cambio a 1
continué;
TXREG=byte; // Envío el siguiente byte
}
^ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
■ i ......................
1 s
TXD 9
■
RTS m
*
i L-! w
- 15
"1OSO/T1CKI
11 I vw llv v r
i’
:2F1ACCP1
IC3BCKBCL
ñ cm m & ü A JÜ S
RC5/SDO ~24
RC8/TXCK 25
«26
RC7,*RXJPT
Virtual Terminal :|
ü
RD1 A.
RD2 Cordado? * fl . ■ ' ■' • '
Ccíñtador 1 • ' ■ . ' ■ - \ ;
1 i ni»
RD3
RD4 [ Contado? * 2 ' ■■■■■ _ .- ' . :.
ÜJUi
| 78 E LUIS GUILLERMO MONTOYA DÍAZ
Tfffrrr
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE
void main()
{
TRISE=0X02; II
TRISC=0; II
ADCONO=OX59; II
ADCON 1=0X80; II
ANSEL=0X40; II
ANSELH=0; II
TXSTA=0X26; II
mm
LUIS GUILLERMO MONTOYA DIAZ 79
mm
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE
I
g fl RXD
U1
TKD
Virtual Terminal >SO/T1CKI JüSl
■16
OSÍCCP2 RTS
&1ACCP1
La tetipératura m ñJM m cm ci MB CTS
U fenparatura, m iZIM mmmm m23
U . t mprnAum m :2?49-
U twperatúrá miÜM msBm *2L
mmMM m
' La tetipfif at u r o $
%cjmm 26
«19
: ROO
RD1 JE
nm ■21
RD3
RD4 m
SE
l
«D&P1B
■ RD8íP1C
2$
m?mo U2
' REOíAN5
Sfl.:. VOUT SliSIS
REI íAN8
RE2/AN7 jm¡
MCP370 0
PÍC18F887 «-je st-!
iliü l
| 80 S LUIS GUILLERMO MONTOYA DÍAZ
IfffW
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE
CAPÍTULO 9.
RECEPCIÓN DE DATOS POR INTERRUPCIÓN
Generalmente hablamos de transmitir datos, pero nunca nos ocupamos de la
recepción. En este capítulo se plantea una forma muy práctica de recibir datos
utilizando la interrupción por recepción.
Se envía un dato desde un microcontrolador a otro, donde se compara y se
anuncia en dos leds si es mayor o menor que el dato elegido en el receptor.
Si la lectura del puerto A que tiene 3 entradas, es decir, que puede estar entre 0 y 7,
es mayor a 4 que fue el número elegido para comparar en el receptor, se activa RAO,
pero si es menor a 4 , se activa RA1. El número recibido serialmente por medio de una
interrupción por recepción siempre se muestra en el display de siete segmentos.
RE^tCtiWPP RCW10S0m<Ki R
RcsÍífM
C -iofC
so/na-s Emuo.mw
2/S
PI1 RC2«lOAS¿tCCPP1S RA0/A:P »I»
At/A.W 12^!IN
M 0I--
R
RA
A9íA»«C
1M UiW U/C12¡N0- R
i»Í-. CC
R SA
JK
CCíC
SP
O1. Rc
mm4
mníSm» ® a RA3/R
R
ÁA
M 3,T
V
NI/C
R£K FI+ C 1W +
mm m umK ozm
uf i . Bcim
mxm m m
Rcrm mm R
m .lí4
&m A/m
NQ4cC
/S ¿C
iK /C120
im
Ü
0mUT f
fm
RASm
ÍOStfs&
C 2 C LKO U T m i m u R A ? l
O S C 1 ¿ € tf® i
RA?iOSC1^ClK¡M RDG jaai...
jI siOil RD1 RN8Q /ACN1122S
;?N
RS
ñ
mmz *22 nm R81ÍA 1Q RB 2/Á N3T
N -
8
É1Ü
/ANÉ10Í312IN3- n
Rm»
2 2 *.
2B¿m RD4tB
m
É Ü msm & m m m R 8 4S & N 1
1
RB
B4
5A
/AN 11 m RBB SÍT A«1 3/T 10
R
rR
@ W p3c/ria mrn
wm mc m?pw R
S W í.CCSSPPCD1AKT
88
7ícsP
ÍCS D «T
A ñ
mmmm m 'J S u
n
mmm mm
mziAW
m
nm mmm JM u,
RA
A3/AÍ'4C
3A
KÍ//R
CEF+ /T
C1W + RC5ÍSDO RC6fm/TX.m
CK RA 4/T04CKJS ÍC 12O U TT
JS 2 1
4¿1Q 1O
RA5/AN4/SSA:20UT
U m m xm
m tm m
2£~_ m RA& A N JS
RA$/OSC2/aKOUT
ÍC Q U
RA7JÜSC1/CtKiN RD G J& L .
RDO
R012 RA?»SC1/CLK!N
RBÍ0 P RD 1 *28
R
RD
0 3
,K10
2C
SN1T»I3- R&2 JBHL
R 1 PNH8
1 R
RE>3
& 4 R
RD4
R
RB
B
R8
B5
2
3»/
A
4/M N
Mg
1P
1O f
c
__SíC12¡N2- R D S«8
mmm
íc R0
DS6#ÍP118
R om o
C RB3/AM»Ó?R
R B 5ÍA
«B
24
N
1/2A
13
P
/
TM21-1
1 G
R
R A N13f
P J 0 mw RBB7
8í.I1CC S PEO .K
R0
S67JCCS
SP
PCA
OLKT mmm
R S P >A T
<R
£2fAH7
#include <xc.h>
// CONFIG1
#pragma config FOSC = XT // XT oscillator
#pragma config WDTE = OFF // Watchdog Timer Disable
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = ON // pin function is MCLR
#pragma config CP = OFF // Program memory code protection is disabled
#pragma config CPD = OFF // Data memory code protection is disabled
#pragma config BOREN = ON // BOR enabled
#pragma config IESO = ON // Internal External Switchover
#pragma config FCMEN = ON // Fail-Safe Clock Monitor Enabled bit
#pragma config LVP = OFF // HV on MCLR must be used for programming
// CONFIG2
#pragma config BOR4V = BOR21V // Brown-out Reset set to 2.1 V
#pragma config WRT = OFF // Flash Program Memory Disable
// Declaración de variables
yy*****************************************************************************************
char aux=0;
yy*****************************************************************************************
// Programa principal
^*****************************************************************************************
void main()
{
TRISC=0X00; // Puerto C como salidas para pin TX
TRISA=0XFF; // Puerto A como entradas para lectura de pulsadores
TXSTA=0X26; // Habilito transmisión y bit BRGH en 1
SPBRG=25; // Velocidad a 9600 bps
SPEN=1; // Habilito Puerto serial del PIC
ANSEL=0; // Todos los pines digitales
ANSELH=0; // Todos los pines digitales
while(1)
}
^ |* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Programa de recepción
y y *****************************************************************************************
#include <xc.h>
// CONFIG1
#pragma config FOSC = XT // XT oscillator
#pragma config WDTE = OFF // Watchdog Timer Disable
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = ON // pin function is MCLR
#pragma config CP = OFF // Program memory code protection is disabled
#pragma config CPD = OFF // Data memory code protection is disabled
#pragma config BOREN = ON // BOR enabled
#pragma config IESO = ON // Interna! External Switchover
#pragma config FCMEN = ON // Fail-Safe Clock Monitor Enabled bit
#pragma config LVP = OFF // HV on MCLR must be used for programming
II CONFIG2
#pragma config BOR4V = BOR21V // Brown-out Reset set to 2.1V
#pragma config WRT = OFF // Flash Program Memory Disable
$um
// Declaración de variables
char temp=4;
char aux;
// Programa principal
y y *****************************************************************************************
void main()
{
TRISC=0X80; // Puerto C como salidas para display solo C7 entrada para RX
TRISA=0; // Puerto A como salidas para los leds indicadores
TRISD=0; // Puerto D como salidas para habilitar transistor de display
TXSTA=0X26; // Habilito transmisión y bit BRGH en 1
SPBRG=25; // Velocidad 9600 bps
RCSTA=0X90; // Habilito puerto serial y recepción de datos
INTCON=OXCO; // Habilito interrupciones periféricas
RCIE=1; // Habilito interrupción por recepción
ANSEL=0; // Todos los pines digitales
ANSELH=0; // Todos los pines digitales
PORTA=0; // Limpio Puerto A
PORTD=0; // Limpio Puerto D
PORTC=0; // Limpio puerto C
RD0=1; // Habilito transistor para el display
while(1)
mui
LUIS GUILLERMO MONTOYA DÍAZ 5 85
Trrm
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE
}
void interrupt ¡sr() // Función de interrupción
{
PORTC=RCREG; // Paso dato recibido al Puerto C para mostrar
aux=RCREG; // Paso dato recibido al registro aux para comparación
if(aux>temp) // Comparo dato recibido con la constante temp
{
RA0=1; // Si dato recibido es mayor activo RAO por un segundo
__delay_ms(1000);
RA0=0;
}
else // Si es menor, active RA1 por un segundo
{
RA1=1;
__delay_ms(1000);
RA1=0;
}
RCIF=0; // Limpio bandera de interrupción
__delay_ms(100);
}
|^ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ^ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
, 111111
.. . .,
CAPÍTULO 10.
MUI
LUIS GUILLERMO MONTOYA DÍAZ =87 i
Trrrrr
PROGRAMACIÓN DE MICROCONTROLADORES PIG+ZiGBEE
RA2íAN2/CPS2/C12IN2-ei2lNtí\'REf,'DACOUT-^— Q l w 18 - RA1.'AN1/CPS1/C12IN1-SS2«
RA3;AN3;CPS3'C12!N3j'C1)N+í'/REr<'/C10UT/CCP3e >.,SRQ «—-[ 2 17 • RA0/AN0i'CPS0/C12W0-/SDO2®
RA4!AN4¡CPS4O3UT/T0CKt'CCP4ffl/SRN0 — — [
g 16 ■ RA7fOSC1/CLK1NíP1C<1í,CCP2«-2l/P2A!1í)
R A S M C L fW P W S S it li) -----,
L4 I 15 • RA6/'OSC2ÍCLKOUT;CLKRi'P1 D<5l'P2B!W!ÍSD01! 1>
VSS ------ ¿ 5 í 14 - V dd
RBOíSRniGCCP1nlP lA i1i<INTíSRI,'FLTO-
RB1¡AN11/CPS11/RXt|>¡DTÍ!¡IS0Ai;SD!í -
1
-*
13
12
RB7/AN®CPS0,T1OSO;P1DÍ,!/P2B>i '2I>MDCIN1i1CSPDAT
S puede ver en el diagrama de pines que el módulo CCP1 tiene salida por los
pines RBO ó por el pin RB3. Se selecciona en el registro APFCON.
• P e if o d
- í Pulse W id t h * - ----------------- 1 L
TM R x = PRx
- T M R x = C C P R x H :C C P x C O N « 5 :4 *
-T M R x = C
F IG U R E 23-4: SIMPLIFSEO P W M B LO C K
DiAGFLAM
C C P x C O N < 5 :4 >
£ X ¡ty C y t í e R e g i s t e i s
C C P R xL .
f
>
C C P R x H 12» m im e }
CCPx
4 }r
R Q
m S
TUR x
TRIS
C o m p a ra to r
O le a r n m e r
í o g g t ee C
CC C P )x p i n a n d
la t e n! calu
i t y c y c le
PRx
N o te 1: T h e 8 - b i t t i m e r T M R x r e g t s f e r ss c o n c a t e n a t e d
w r th t t ie 2 - b it in te r n a ! s y s te m d o c k (F o s e ), o r
2 b it s o f t h e p r e s c a le r , t o c r e a t e t b e 1 0 - b í t t im e
base.
2: Ir» P W M m o d e , C C P R x H ?s a r e a d - o n t y r e q is t e r .
Legend:
R = Readable bit W = Wrrtable bit U = UrSmplemented bit, read as ‘0’
u = Bit is unchanged x = Bit is unknown -nln = Valué at POR and BOR/Value at all other Resets
T = Bit is set ‘0’ = Bit is cleared
Legend:
R = Readable bit W = Writable bit U = Unimpfemented bit, read as '0'
u = Bit is uncftanged x = Bit is mtoiown -n/n = Valué at POR and BQR/Vaiue at all ofier Reset
T - Bit® set V = Bit is cieared
// CONFIG1
#pragma config FOSC = HS // Oscillator Selection HS Oscillator, High-speed
#pragma config WDTE = OFF // Watchdog Timer Enable (WDT disabled)
#pragma config PWRTE = OFF // Power-up Timer Enable (PWRT disabled)
#pragma config MCLRE = ON // MCLR Pin Extern
#pragma config CP = OFF // Flash Program Memory Code Protection disable
#pragma config CPD = OFF // Data Memory Code Protection disabled
#pragma config BOREN = ON // Brown-out Reset Enable
#pragma config CLKOUTEN = OFF // Clock Out Disable
#pragma config IESO = ON // Internal/External Switchover
#pragma config FCMEN = ON // Fail-Safe Clock Monitor Enable
// CONFIG2
#pragma config WRT = OFF // Flash Memory Self-Write Protection
#pragma config PLLEN = OFF // PLL Enable (4x PLL disabled)
#pragma config STVREN = ON // Stack Overflow/Underflow Reset Enable
#pragma config BORV = LO // Brown-out Reset Voltage Selection
#pragma config LVP = OFF // Low-Voltage Programming Disable
ir* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
// Definición de la velocidad del oscilador
y y *****************************************************************************************
unsigned int i;
y y *****************************************************************************************
// Programa principal
y y *****************************************************************************************
void main ()
{
TRISB=255; // Deshabilito la salida del módulo CCP1, mientras se
jü m
LUIS GUILLERMO MONTOYA DIAZ § Q1
TTTTTT
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE
TMR2=0;
for (i=0;i<250;i++)
{
TMR20N=1;//Activo TMR2
while (TMR2IF==0) // Espero mientras TMR2 incrementa
continué; // Si TMR2 desbordado, continuo (TMR2IF=1)
TMR2IF=0; / / Limpio Bandera de TMR2
}
Las fórmulas para hallar los diferentes parámetros son las siguientes:
1 - Período PWM = (PRx + 1) * 4 * Tose * Preescala del TIMER
2 - Ancho de pulso = CCPRxL:CCPxCON(4:5) * Tose * Preescala del TIMER
3 - Duty Cycle = {CCPRxL:CCPxCON(4:5)} / { 4(PRx + 1)}
4 - Resolución = log {4 (PRx + 1)} / log (2)
5 - Frecuencia PWM = 1 / Período PWM
Ejemplo: En el programa anterior se tiene el PIC 16F1827 trabajando a una Fose
de 20 MHZ, un periodo PWM máximo configurado en el registro PR2 = 255 y un
ancho de pulso configurado como 10000000 00 en el registro CCPR1L y en los
COUNTER TIMER
VIRTUAL TERMINAL
SPI DEBUGGER
12C DEBUGGER
SíGNAL 6ENERAT0F
PATTERN GENERAL
DCV01TMETER
DCAMMETER
ACVCLTMETER
ACAMMETER
{
TRISB=255; // Deshabilito la salida del módulo CCP1, mientras se
// realiza la configuración de los registros
APFCONO=C); // Elijo RB3 para salida CCP1, en 1 es RBO
PR2=255; // Período para la señal PWM + 2 bits del oscilador int
CCPTMRS=0;// Bits 0 y 1 para elegir el timer para CCP1. TMR2=0;
CCPR1L= 0: // Ancho de pulso 8 MSB se inicia en 0.
CCP1CON=OXOC; // Bits 4 y 5 LSB para ancho de pulso y bits 0,1,2,3
//11 xx = para modo PWM
TMR2!F=0; // Limpio bandera de desbordamiento del TMR2
T2CC)N=0B00000010; // Preescala y activación del timer2
TRISB=0; // Habilito el módulo CCP1
while(1)
{
TMR2=0;
for (i=0;i<250;i++)
{
TMR20N=1; // bit 2 del T2CON se activa TMR2
while (TMR2IF==0)
continué;
TMR2IF=0;
}
CCPR1L = CCPR1L +1: Se incrementa ancho de pulso en uno
}
}
MMR
| 94 LUIS GUILLERMO MONTOYA DÍAZ
Tnrrr
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE
CAPÍTULO 11
PIC
RA4/AN4/CPS4/C2OUm0CKI/CCP4(2!íSRNQ RA7/OSC1/CLKIN/P1Cl1>/CCP2<1'2l/P2A(u !
IW/MCLroVPP/ígíM! RA6/OSCmKOUTCLKR/P1D(V2B(1% D O lW
Vss VOD
RB0/SRimGCCP1<%1A<1ta S R I/F L T 0 RB7/AN6/CPS6/T10S0ZP1 D(1)/P2B¡1.2>M)Cim/ICSPDAT
este caso es el dedo del usuario. La frecuencia es mucho menor que cuando no
hay carga capacitiva.
Para la implementación se requiere:
Configuración de las respectivas entradas análogas, de acuerdo con el
número de teclas requeridas.
Uso adecuado del oscilador de sensado capacitivo
El trabajo de al menos 2 timers
Control por software de la base de tiempo fija y las frecuencias nominal
y reducida.
El programa plantea un pad conectado al canal CPSO, ubicado en el pin RAO.
Al acercar el dedo al pad, se debe activar la salida ubicada en el pin RBO (led) y
cuando se aleja nuevamente el dedo, la salida debe desactivarse.
El oscilador de sensado capacitivo está diseñado para manejar una carga capa
citiva (pad en el PCB) y además sirve como fuente de reloj para el timer asociado
a él, se debe configurar en el registro CPSCONO.
REGISTER 26-1: CPSCONO: CAPACITIVE SENSING CONTROL REGISTER 0
Legend:
R = Readable bit W = Writable bit U = Unimptemented bit, read as '0'
u = Bit is unchanged x = Bitis unknown -n/n = Valué at POR and BOR/Vaíue at all other Resets
T = Bit is set *0’ = Bit is deared
JjLUJLL
LUIS GUILLERMO MONTOYA DÍAZ I QJ
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE
Legend:
R = Readable bit W = Wrrtable btt U = Uriimplemented bit, read as ‘0’
u = Bit is unchanged x = Bit is unknown -n/n = Valué at P O R and BOR/Value at all other Resets
‘ 1’ = B it is set '0' = Bit is cleared
Se debe hablar también del TMR1 y su uso con el control por Gate asociado al
TMRO, está configuración permite que al desbordarse el TMRO; es decir, al ter
minar la base de tiempo fija, el valor del TMR1 queda retenido y se puede hacer
la lectura del número de pulsos sucedidos.
Legend:
R = Readable bit W = Writable bit U = Unimplemented bit, read as ‘0'
u = Bit is unchanged x=Bitisunknown -n!n = Valué at POR and BOR/V'alue at all other Resets
T = Bítisset ‘0’ = Bit is deared
TMR1CS<1:0> = 0X
This bit is ignorad. Timerl uses the intemal dock when TMR1 CS<1:0> = íx .
bit 1 Unimptemented: Read as '0'
bitO TMR1 ON: Timerl On bit
1 = EnaWes Tfmerl
0= Stops Timerl
Clears Timerl Gate flip-flop
Fig. 41 Registro de control del TMR1
T1G C O N = 0XE1; // D isparo del TMR1 asociado al de sbo rdam iento del TM R 0
.uní,!.
LUIS GUILLERMO MONTOYA DÍAZ ¡ QQ
TTTTTT
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE
Legend:
R = Readabie bit W = Writable bit U - Unimplemented bit, read as ‘O*
u = Bit is unchanged x = Sft is unknovm -nfti = Valué at POR and BOR/Value at al! otber Resets
"1' = Bit is set ‘0‘ = Bit is deared HC = Bit is deared by hardware
Si el TMR1 está activo, el bit 7 del T1GCON en 1, permite la activación del dispa
ro para la retención del valor de TMR1 cuando se desborda el TMRO y ¡os bits 0
y 1 configuran en este caso, el TMR1 asociado al TMRO configurándolos en 01.
Adicionalmente, se requiere configurar e! registro INTCON, para habilitar las in
terrupciones globales con el bit 7 GIE en 1 y las periféricas con el bit 6 PEIE
igualmente en 1 necesarias para trabajar la interrupción de disparo por Gate
con el bit TMR1GIE y su bandera TMR1GIF, además del OPTION REG para la
preescala del TMRO y calcular con ella la base de tiempo fija.
INTCON = OXCO // Interrupciones globales y periféricas habilitadas
OPTION_REG = 0X83 // Preescala del TMRO en 16.
iü lil
1 100 LUIS GUILLERMO MONTOYA DÍAZ
iwnr
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE
U1
17
RAQ/AN0/CPS0/C12IN0-SDO2
18
RA1/AN1/CPS1 C1 2IN1-ÍSS2
1
RA2/AN2/CPS2/C12IN2VC12IN+/VREF-JDACOUT
2
R A3/AM3 A;P S3 Í C 121N3-/C11N+¿VR E F+ C10 U T/CC P 3/SR Q
R A4/AN 4/CP S 4/C 20 UT/T0CKI/CCP4/SRNQ
RA5/MCLR /VPPjSSI
15
R A6/O SC 2.C LK O U T/CLKR /P1 DIP 2B/SD 01
16
RA7/0SC1C LKIN/P 1C CCP2/P2A
R1
RB0/SRI/T1G/CCP1/P1 A/IN T/SRI/FLTO
RB1/AN11 /CPS11 /RX/DT/SDA1EDI1
R B 2/AN10/CP S1 0/MDMIN /TX JC K /R X/DT/SD A2 /SDI2SD 01
D1
9 LED-RED
RB3/AN9/CP S9/M DOUTCCP1JP1A
10
R B 4/AM 8jC P S 8 ¿S C L 1/S C K 1/MDC IN 2
11
RBS/AN 7/CPS7/P1B/TX/CK/SCL2/SCK2/SS1
RB6/AN5/CP S5/T1 CKI/T1 OSIjP1C/CCP2/P2A/ICSPCLK
12
13
R B7/AN6/CP S6/T1O S O Í' 1D/P2B/M DCIN1 /ICSP DAT
P IC 16 F 1827
Programa en lenguaje C
#include <xc.h>
y |* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
// CONFIG1
#pragma config FOSC = INTOSC // Oscillator Selection (INTOSC oscillator)
#pragma config WDTE = OFF // Watchdog Timer Enabie (WDT disabled)
#pragma config PWRTE = OFF // Power-up Timer Disable
#pragma config MCLRE = OFF // MCLR Disable
#pragma config CP = OFF // Program memory protection disabled
#pragma config CPD = OFF // Data memory code protection disabled
#pragma config BOREN = ON // Brown-out Reset enabled
#pragma config CLKOUTEN = OFF // Clock Out Disable
#pragma config IESO = ON // Internal/External Switchover
#pragma config FCMEN = ON // Fail-Safe Clock Monitor Enable
// CONFIG2
#pragma config WRT = OFF // Flash Memory Self-Write Protection
#pragma config PLLEN = OFF // PLL Enable (4x PLL disabled)
#pragma config STVREN = ON // Stack Overflow/Underflow Reset Enable
#pragma config BORV = LO // Brown-out Reset Voltage Selection
#pragma config LVP = OFF // Low-Voltage Programming Disable
m i
=102E LUIS GUILLERMO MONTOYA DÍAZ
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE
Programa principal
^ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
void mainQ
{
ANSELA=0X01; // CPSO para conectar tecla (pad)
ANSELB=0; // Pines del puerto B digitales para usar BO para led
TRISA=0X01; // Entradas RAO para canal capacitivo
TRISB=0; // Puerto B como salidas para usar BO
CPSCONO=OX8C; II Módulo capacitivo ON y TMRO Fosc/4
CPSCON1=0; II sensor 0 para conectar tecla
T1CON=OB 11000101; // TMR1 asociado al módulo de sensado capacitivo, sin
II preescala, sin fuente de reloj externa, TMR1 activo
T1GCON=OXE1; //Activar Gate asociado a TMRO
OSCCON= OXEA; // Oscilador interno a 16 Mhz
OPT!ON_REG=OX83; // Preescala para el TMRO 1:16
INTCON=OXCO; // Interrupciones globales y periféricas habilitadas
PORTB=0; // Limpio puerto B para salida BO
T0IF=0; II Bandera del TMRO en 0
T0!E=1; // Habilitación por desbordamiento del TMRO habilitada
TMR1GIF=0; // Bandera de retención del valor de TMR1 en 0
TMR1GIE=1; // Interrupción de retención del valor del TMR1 activa
RB0=0; II Limpio salida BO
while(1)
{
if(lectura>umbrai) // Si valor del TMR1 mayor a umbral no tecla presionada
{
RB0=0; // Salida inactiva
}
else // Si valor del TMR1 menor a umbral tecla presionada
{
RB0=1; // Salida activa
}
void reset_tm1(void) // Función de reset del TMR1
{
TMR1L=0; // Parte alta del TMR1 en 0
TMR1H=0; // Parte baja del TMR1 en 0
TMR10N=1; // Reinicia el TMR1
}
void iníerrupt isr() // Función de interrupción por base de tiempo fija. TMRO
{
¡f (T0IF==1) // Verifico si TMRO desbordado
{
TOIF = 0; // limpia bandera activada por desbordamiento de TMRO
}
if(TMR1 GIF==1) // Verifico si TMR1 gate activo
{
TMR1GIF = 0; // limpia la bandera correspondiente
TMR10N = 0; //TMR1 apagado
lectura = (TMR1 H*256)+TMR1 L; // Leo valor del TMR1
reset_tm1 (); // Llamo función de reset del TMR1
iU L Ü L
CAPITULO 12
En el protocolo ZIGBEE las tramas API son varias, debido a que cada una tiene
una función especial de acuerdo a la aplicación que deseemos realizar.
JLLLÜLL
APS F ra m e Ñ a m e s A P I ID
AT Command 0x08
AT Command - Queue Parameter Valué 0x09
ZigBee Transmit Request 0x10
Explicit Addressing ZigBee Command Frame 0x11
Remóte Command Request 0x17
Create Source Route 0x21
AT Command Response 0x88
Modem Status 0x8A
ZigBee Transmit Status Qx8B
ZigBee Receive Packet (A0=0) 0x90
ZigBee Explicit Rx Indicator (AO=1) 0x91
ZigBee IO Data Sample Rx Indicator 0x92
XBee Sensor Read Indicator (AO=G) 0x94
Node Identification Indicator (A0=0) 0x95
Remóte Command Response 0x97
Over-the-Air Firmware Update Status OxAO
Route Record Indicator QxA1
Vamos a utilizar este capítulo para realizar algunos ejercicios con tramas API y
así dejar claro este tema para todos los usuarios de esta tecnología.
Iniciemos diciendo que cada módulo XBEE serie 2 puede ser configurado de
forma diferente; por ejemplo, puede ser: Un ROUTER AT ó API, un COORDI
NADOR AT o API y finalmente puede ser un END DEVICE AT o API.
Para el trabajo de redes con API, es necesario que mínimamente el coordinador
sea API, este tiene la función de iniciar la red, eligiendo el canal más limpio de
los 14 posibles y elegir una identificación de red PAN ID tanto de 16 como de
64 bits; de acá en adelante los Routers o End Devices que se asocien a la red
lo harán con el canal y las identificaciones de red dadas por el coordinador. Re
cuerden que tanto el coordinador como el router son FFD (full function device),
quiere decir que tienen la capacidad de trabajar todas las características del pro
tocolo ZIGBEE, mientras que los end devices son RFD (reduced function device)
quiere decir que sus características son reducidas debido a que pueden trabajar
en modo de bajo consumo y esto les impide realizar otras actividades.
liUlL
i 106= LUIS GUILLERMO MONTOYA DÍAZ
ttttit
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE
Iniciamos el trabajo con tramas API, diciendo que con solo tener un Router API o
AT asociado a la red con ¡a dirección del coordinador API y un tiempo de mues-
treo establecido, ya estaremos recibiendo en el coordinador el estado de las
entradas análogas y/o entradas o salidas digitales configuradas previamente en
dicho Router, esta es una trama que nos permitirá tener información de nuestras
variables de proceso en forma fácil y rápida.
Veamos paso a paso como se hace:
1 - Mediante el software X-CTU de DIGI que se puede bajar gratis de internet
conectamos un módulo XBEE serie 2 y lo configuramos como Coordinador API
Lo primero que vemos es que al configurar este módulo como Router AT, éste se
asocia a la red con el mismo canal elegido por el coordinador y asume las mismas
identificaciones de red, tanto de 16 como de 64 bits. (Ver recuadro superior y com
parar con el coordinador). Podemos ver que los parámetros DH y DL vienen de
fábrica en cero, es allí donde debemos poner el serial alto y bajo (SH y SL) del
mui
= 108 LUIS GUILLERMO MONTOYA DÍAZ
TTrrrr
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE
coordinador y quedará como la dirección destino del Router. Ver figura siguiente:
Addressing
| |... (13A200J SH - Serial Number High
j. |... El (4060205A) SL - Serial Number Low
E3 (9E11) MY - 1 6-bit NetWork Address
(13A200) DH - Destinaron Address High
£3 (403B0C70) DL - Destinaron Address Low
fROUTER] NI - Node Identifier
# vcc ADO/DIOO H 20
1
2 # DOUT AD1/DI01# 19
3 % DIN/CONFIG AD2/DI02 # 18
4 # 008 AD3/DI03 # 17
5 H RESET RTS/AD6ÍDI06 16
8 ^ PWMO/RSSI AD5/DI05 I# 15
7 t§ PWM1 VREF # 14
8 IÜ [reservado] ON/SLEEP % 13
9 # DTR/SLEEP_RQ/DI8 CTS/DI07 (* 12
10 # GND AD4/DI04 )9 11
VISTA SUPERIOR
Fig. 49 Diagrama de Pines de los Módulos X B EE de Digi
O b s e r v e m o s , l u e g o de c o n f i g u r a r y l e e r ei R o u t e r , c o m o
q u e d ó la c o n f i g u r a c i ó n : En p r i m e r l u g a r DO y D1 q u e d a r o n
c o m o 2 q u e e q u i v a l e a s e r e n t r a d a a n á l o g a , D2 q u e d ó
JUJULU
LUIS GUILLERMO MONTOYA DÍAZ 109
TTTTTs
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE
En el r e c u a d r o i n f e r i o r , e l e g i m o s un t i e m p o de m u e s t r e o de
15 s e g u n d o s q u e c o m o se o b s e r v a , e s t á en h e x a d e c i m a l 3
A 9 8 q u e es i g u a l a 1 5 0 0 0 m i l i s e g u n d o s . El r a n g o p a r a el
t i e m p o de m u e s t r e o e s t á d a d o en m i l i s e g u n d o s y va d e s d e
0 x 3 2 h a s t a O x F FF F, q u e en d e c i m a l es e q u i v a l e n t e a 50 ms
h a s t a 6 5 5 3 5 ms.
Set the 10 sampling rate to enable periodic sampling. If set >0, all enabled digital 10 and
analog inputs will be sampled and transmitted everv IR milliseconds. 10 Sampies are
transmitted to the address specified bv DH+DL.
RANGE:CUK32-(KFFFF X 1 MS
sm wsmBm ,» , .
fife [C-0M11] X-CTU
i
! Afaout XModem
J
PC Settings Range Test Terminal •Modem Configuraron ]
.• , A 4
un ebiatus
AsseFt Clnse Assemble Clear ' Hide !
CTS v íffij ÍÜ 3 S DTR R ÍS ¿ Breal ComPort Packet Screen Hex j
5A
/
JJilLL
^112 = LUIS GUILLERMO MONTOYA DÍAZ
TfTSTT
_gs[COM15] X-CTU i
Reinóte Canfigyration... Versions...;
PC Settings ¡ Rarge Test j Tenroiai Modera Configuraron [ PC Se'Ungs ¡ Rar.ge 1 =tl Temv.nal Modtm Conüguralion ¡
Modem Perameter and Fumwaie —- - Pafarrieter View ; ¡ ñofiie : Modem Pasameter and Fiimivare • Parameter View
fiead I Wnte j Restore j Ciear Screen ¡ i : Save i Read \ Write | Restore j i Cleat SciecnJ
Fig. 53 Trama A P I 97
m m i
||E N » ÑetwGffüng
£3 (QjID-PAN ID
H Í3FFF) SC •Sean Channeis
■
■6 [3}S0 -Sean Duratíon
- i | Í2]2S -ZigBeeSteck Profile
■■ i | [FF] N J - Node Joín Tíme
U (E20FC6C8FDD756C4J 0 P •Operating PAN ID
U (19A7) OI •Operating 16-bit PAN !D
• 0 (E) CH -Operating Channel
- B (Al NC -Number of Remairiing Chiidren
IIB Ü Addressing
‘ I [124200) SH • Serial Number High
B (40602081) S L - Serial Number Low
¡ |! : ;...Ü (Oj MY - 1 8-bit NetWork Address
MSB 1 QxfiO
Length Numher of bytes befweert the length and the eheclsum
LSB 2 0x13
Fom e Type 3 0x97
This ¡s the same v a l* passed m to the tequest
. Frarne B 4 0x55
MSB 5 0x00
6 0x13
7 0xA2
21 ObcAA
Checkwm 22 OxF0 Q xfr - the 8 bit san of bytes from offset 3 to this bjte.
Fig. 55 Trama A P I 97
Para terminar el tema de las tramas API, trabajemos la que se encarga de enviar
datos, que corresponde a ¡a trama API tipo 10.
En este caso vamos a enviar desde ei coordinador API hacia el Router que lo
pondremos como AT, la palabra SUCONEL.
7E 00 15 1 0 0 1 C 0 Í3 A 2 Í 40 6E 83 ES FF FE O (853 55 C ¥ * 45 ¡C K
MILU
LUIS GUILLERMO MONTOYADÍAZ :f/7
TOTTT
PROGRAMACIÓN DE MICROCONTROLADORES P IC + Z IG B E E
CAPÍTULO 13.
ENVÍO DE TRAMAS API A TRAVÉS DEL PIC 16F887
La idea de trabajar en red mediante tramas API con ios módulos XBEE
de DIGI es poder automatizar nuestras aplicaciones desde un disposi
tivo programable, como se plantea en esta ocasión con el PIC 16F887.
U1
RE3/MCLR/VPP RCO/TIOSO/TICKI
RC1/T10SI/CCP2
_ 2_
RA0/AN0/ULPWU/C121N0- RC2'P1A/CCP1
_3_
RA1/AN1/C12IN1- RC3/SCK/SCL
_4_
RA2/AM2A,REF-/CVR EF/C2N+ RC4/SDI/SDA
_5_
RA3/AN3/VREF+/CÍ !N+ RC5/SD0
_ 6_
RA4/T0CKI/C1OUT RC6/TX/CK
7
RA5/AN4/SS/C20UT RC7/RX/DT
_14_
RA6/OSC2/CLKOUT
ÜL RA7/0SC1/CLKIN ROO
RD1
33.
RB0/AN12/INT RD2
34_
RB1/AM10/C12IN3- RD3
35_
RB2/AN8 RD4
35_
RB3IAN9/PGM/C121N2- RD5/P1B
37_
RB4/AN11 RD6/P1C
38.
RB5/AN13/T1 G RD7/P1D
39.
RB6/ICSPCLK
40
RB7/ICSPDAT RE0/AN5 3.3VDC
RE1/AN6
ae jC Q M S : X-CTU
■Sü
Páremete? Prcfííé R em óte C oí’ ftg u ra tie n ;
P C S e íitn gs; R a rig e T e s t’ T e n ina ! M odem C cdigua& on PCSetángs j Range Tes* j Terminal Modem C o n fig ú ra te |
PatameterView r » Veisions
CtedfScreen j i Save Downícad new
S hcw D eíauM Load versions..
// Declaración de variables
jy * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
char cont=0;
y y *************************************************************************************
char trama_off[20]={0X7E,0X00,0X10,0X17,0X01,0X00,0X13,0XA2,0X00,
0X40, 0X60,0X20,0X5B,0XFF,0XFE,0X02,0X44,0X33,0X04,0X9D};
char trama_on[20]={0X7E,0X00,0X10,0X17,0X01,0X00,0X13,0XA2,0X00,
0X40,0X60,0X20,0X5B,0XFF,0XFE,0X02,0X44,0X33,0X05,0X9C};
y y *************************************************************************************
// Programa principal
y y *************************************************************************************
void mainQ
{
TRISD=0XFF; // Puerto D como entradas para el pulsador en D4
TRISC=0; // Puerto C como salidas para el pin TX
SPEN=1; // Habilitación del Puerto serial para trabajar con USART
TXSTA=0X26; //Activación de TX y bit BRGH en 1 para calcular SPBRG
SPBRG=25; // Calculado para 9600 bps
JjLUJUL
LUIS GUILLERMO MONTOYA DÍAZ 121
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE
while(1)
{
if(RD4) // Pregunto si el pulsador esta inactivo (RD4=1)
{
while(cont<20) // While para enviar la trama de activación
{
TXREG=trama_on[cont]; // Envió los 20 bytes del arreglo
}
cont=0; // Limpio el contador
}
else // Si RD4 está en 0, envío trama de desactivación
{
while(cont<20) // While para enviar la trama de desactivación
{
TXREG=trama_off[cont]; // Envió los 20 bytes del arreglo
while(TRMT==0) // Bandera de finalización de envío de dato
continué; // Cuando se ponga en 1 continuo con el byte siguiente
cont++; // Hasta completer los 20, es decir, trama completa
}
cont=0; // Limpio el contador
CAPITULO 14.
TRAMAS API EN DOMÓTICA CON MICROCONTROLADORES
El siguiente proyecto es una demostración sencilla de lo que se puede hacer con la ex
celente combinación de los microcontroladores y los módulos XBEE en aplicaciones de
domótica.
U1
RQMO RfVPP RCO/TIOSO/TICKI
CIRCUITO DE ILUMINACION N RC1/T10SI/CCP2
RAQ/AN0/ULPWU/C12» RC2/P1A/CCP1
RA1/AN1/C12IN1- RC3/SCK¡SOL
RA2AN2WREF-/CVREF/C2N+ RC4/SDI/SDA
RASAN3AÍREMC1W* RC5/SD0
RA4TO€Kt'C10UT RC6/TX/CK
RA5/AN4KS/OOUT RC7/RX/0T
RA6ÍOSC2€lKOlir
RA7/0SC1/aKW RDO
RD1
RBBAN12W RD2
RB1ÍAH1WC12IN3. RD3
oat
OO l o ±7 0 X 0 0 X 3 Á2 OO 40 6 0 20
[ . . D3 . . ¡5B FF FE 02 44 33 05 9d 7E OO OF 97
O I OO X3 A 2 O O 40 60 20 5B 2X CE 44
E ! I ¿ 3 !X 33 OO 31
|7E OO 1 0 1 7 DI 0 0 1 3 A 2 OO 4 0 SO 2 0 SB FF FE 0 2 4 4 3 3 0 5 3C
Esta trama hace que se active la salida D3 con un nivel alto en el módulo re
moto que está configurado como router API. El microcontrolador recibe este
nivel alto en el pin C7 y devuelve la trama 10 con el mensaje IL_ON.
l il il í
LUIS GUILLERMO MONTOYA DIAZ 123
Tmrr
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE
Todo el circuito está alimentado con 3.3VDC, que es la alimentación de los módu
los XBEE. Recuerde que para que el PIC trabaje a 3.3V, se debe configurar el bit
de bajo voltaje en 2.1 V como se muestra en la configuración de bits del programa.
A continuación el programa en el PIC16F887
jI * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
// Se incluye librería con los registros y bits especiales del micro
II *************************************************************************************
#include <xc.h>
II * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
// Palabras de configuración de bits generadas automáticamente por el compilador
II * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
// CONFIG1
#pragma config FOSC = XT // XT oscillator
#pragma config WDTE = OFF // Watchdog Timer Disable
#pragma config PWRTE = OFF // Power-up Timer PWRT disabled
#pragma config MCLRE = ON // pin function is MCLR)
#pragma config CP = OFF // Program memory code protection is disabled
#pragma config CPD = OFF // Data memory code protection is disabled
#pragma config BOREN = ON // Brown Out Reset Selection bits (BOR enabled)
#pragma config IESO = ON // Internal External Switchover bit
#pragma config FCMEN = ON // Fail-Safe Clock Monitor is enabled
#pragma config LVP = OFF // HV on MCLR must be used for programming)
// CONFIG2
#pragma config BOR4V = BOR21V // Brown-out Reset set to 2.1V
#pragma config WRT = OFF II Flash Memory Self Write Enable bits
II * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
// Definición de la velocidad del oscilador
*************************************************************************************
II
#define _XTAL_FREQ 4000000
II *************************************************************************************
7:7®".T I in . IL_ON .