Sunteți pe pagina 1din 118

PROGRAMACIÓN DE

MICROCONTROLADORES
PIC+ZIGBEE

LUIS GUILLERMO MONTOYA DÍAZ

Ingeniero en Instrumentación y Control


Politécnico Colombiano “Jaime Isaza Cadavid”

Especialista en Gestión Energética Industrial


“ITM Instituto Tecnológico Metropolitano”

MEDELLÍN, COLOMBIA
2013
CONTENIDO
INTRODUCCIÓN............................................................................................................................. 9

c a p ítu lo 1 . Entradas y Salidas en el Microcontrolador 16f887..................... 11

c a p ít u l o 2. Los Microcontroladores PIC de 6 p in e s.......................................37

c a p ít u l o 3. Interrupciones en el Nuevo PiC 16F 1823................................... 41

c a p ít u l o 4. Multiplexación en Display de Siete S egm entos......................... 47

c a p ít u l o 5. Visualización de Mensajes Fijos y Variables en LCD ............... 51

c a p ít u l o 6. Conversión Análogo a Digital en el PIC 16F 887........................ 61

c a p ít u l o 7. Monitoreo de Voltaje con Visualización en el L C D ..................... 67

c a p ít u l o 8. Comunicación serial a través del módulo USART...................... 71

c a p ítu lo 9. Recepción de datos por interrupción............................................ 81

c a p ít u l o 10. Modulación de Ancho de Pulso - P W M ........................................87

c a p ít u l o 11 . Teclado Capacitivo en el PiC 16F1827.......................................... 95

capítulo 12. Las Tramas API en el Protocolo Z IG B E E ................................... 105

c a p ít u l o 13. Envío d e Tramas API a través del PIC 16F887 ..........................119

c a p ít u l o 14. Tramas API en Domótica con M icrocontroladores....................123


INTRODUCCIÓN
Luego de escribir tres libros acerca de los microcontroiadores PIC, y de ver la acogida que éstos
han tenido, compruebo que este tema es realmente una pasión en nuestro medio y que es necesario
continuar con la labor para darle a conocer, a los aficionados de esta tecnología, las novedades que
la empresa MICROCHIP ha realizado en los últimos años en cuanto a las herramientas de desarro­
llo y el software de compilación y programación de los PIC.

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.

ENTRADAS Y SALIDAS EN EL MICROCONTROLADOR


16F887
Este libro se centra en el PIC 16F887, lo primero que debemos hacer es cono­
cerlo un poco en sus funciones básicas de configuración y funcionamiento.

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

Figura 1. Diagrama de pines de l PIC 16F887

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.

LUIS GUILLERMO MONTOYA DÍAZ ff


PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE

Recuerde que a diferencia de otros m icrocontroladores como ¡os ATM ELAVR


y los FREESCALE, en los PIC de M ICROCHIP las entradas se configuran
con unos y las salidas con ceros, por ejem plo si se configura el registro TR I­
SA como 01001011, el m icrocontrolador tendrá los pines RAO, RA1, RA3 Y
RA6 con la im pedancia respectiva para el trabajo como entradas y los demás
pines podrán trabajarse como salidas.

Como se ve en el diagrama de la figura 1, las líneas que se utilizan para con­


vertir señales análogas a digitales son 14 y están ubicadas en los puertos A, B
y E, denotados como ANO, AN1 ...AN13, los registros encargados de configurar
los canales análogos se llaman ANSEL y ANSELH, éstos vienen preparados
de fábrica para recibir señales análogas, por lo tanto, se deben limpiar (Cargar
con ceros) si no se va a realizar ninguna conversión A/D, así se podrán trabajar
todos los pines como entrada o salida digital. En el capítulo dedicado a la con­
versión análogo a digital se trata más a fondo el trabajo de estos registros.

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

I 12 LUIS GUILLERMO MONTOYA DÍAZ


t ít h t
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE

.* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

Programa en lenguaje ensamblador


* * * * * * * * * * * * * * * * * * ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

Se incluye archivo .inc que contiene los registros y bits especiales del PIC
** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** í* ***************************************************************

#include “p16F887.inc”
*:********** ** ** ** * * * ** ** ** ** ************* ** ** ** *• * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

Palabras de Configuración de bits generadas automáticamente por el software


******************************************************************************************

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
******************************************************************************************

Bloque para registros de propósito general


******************************************************************************************
CBLOCK 0X20 ; Inicio del bloque de registros generales
REG1, REG2, CONT ; Estos se ubican luego de la posición 0x20 de la RAM
ENDC ; Fin del bloque de registros
.* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
»

ORG 00 ; Primera posición de la memoria de programa


GOTO INICIO ; Voy a la etiqueta de inicio
ORG 05 ; Salvo el vector de interrupción
******************************************************************************************

Subrutina de retardo para milisegundos


******************************************************************************************
RETARDO ; el literal que viene en W es el número de milisegundos
; del retardo
MOVWF REG1
DOS MOVLW .110
MOVWF REG2
UNO NOP
NOP
NOP
NOP

m w .

LUIS GUILLERMO MONTOYA DÍAZ 13


Tnnt
PROGRAMACIÓN DE MÍCROCONTROLADORES PIC+ZIGBEE

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

MOVWF PORTC ; Paso W al puerto C (7 segmentos)


MOVWF PORTA ; Paso W al puerto A (Leds)
GOTO PREG ; Pregunto nuevamente por el pulsador.
END

Programa en lenguaje C
^ |* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

//Se incluye la librería xc.h que contiene los registros y bits especiales del PIC.
^*****************************************************************************************

#include <xc.h>
^ |* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

// Palabras de configuración de bits generadas automáticamente por el compilador


ji * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
// CONFIG1
#pragma config FOSC = XT // Oscillator Selection bits XT oscillator
#pragma config WDTE = OFF // Watchdog Timer Enable (WDT disabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = ON // RE3/MCLR pin function is MCLR
#pragma config CP = OFF // Code Protection bit (protection is disabled)
#pragma config CPD = OFF II Data Code Protection bit (protection is disabled)
#pragma config BOREN = ON // Brown Out Reset Selection bits
#pragma config IESO = ON // Interna! External Switchover Enable
#pragma config FCMEN = ON // Fail-Safe Clock Monitor Enabled bit
#pragma config LVP = OFF I I HV on MCLR must be used for programming
// CONFIG2
#pragma config BOR4V = BOR4QV // Brown-out Reset Reset set to 4.0V
#pragma config WRT = OFF // Flash Program Memory Self Write Enable bits
ü * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

// Definición de la velocidad del oscilador


11****************************************************************************************
#define _XTAL_FREQ 4000000
11****************************************************************************************
// Declaración de variables
II * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
char cont = 0; // Declaro variable cont como un char y la inicio en 0
II * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
// Programa principal
y y *****************************************************************************************

void mainQ
{
ÜUÜ
LUIS GUILLERMO MONTOYA DÍAZ 15
mnrr
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE

TRiSA=0; // Puerto A como salidas


TRISC=0; // Puerto C como salidas
TRISD=0X10; // RD4 entrada los demás salida
ANSEL=0; // Todos los pines digitales
ANSELH=0; // Todos los pines digitales
PORTA=0; // Limpio puerto A
PORTC=0; // Limpio puerto C
RD0=1; // Habilito salida del transistor para cátodo del display
while(1) // Inicio ciclo infinito
{
if(cont<10) // Pregunto si contador es menor que 10 y si se cumple
{
if (!RD4) // Pregunto si RD4=0. Pulsador presionado?
{
__delay_ms(200); // Retardo de 200 ms para evitar rebote de contacto
wh¡le(!RD4) // Mientras RD4 sea cero no haga nada
continué; // Si pasa a uno continua
cont=cont+1; // Incremento contador por flanco de subida
PORTC=cont; // Muestro el conteo en display de 7 segmentos
PORTA=cont; // Muestro el conteo en los leds
}
}
Else // Si contador no es menor que 10
{
cont=0; // Lo limpio
}
}
}

Algunas variaciones para optimizar el código en lenguaje C pueden ser:

1 - Definir las entradas y salidas con nombres diferentes a los pines y los puer­
tos así:

#define suiche RD4 // Nombro el pin RD4 como suiche


#define display PORTC // Nombro el puerto C como display
#define leds PORTA // Nombro el puerto A como leds
#define Q1 RDO // Nombro el pin RDO como Q1

De esta manera se puede realizar el código más fácilmente y a la hora de cam­


biar un pin o un puerto por otro, simplemente se realiza en la definición y no en
todo el programa.
JUUUUUL

16 LUIS GUILLERMO MONTOYA DIAZ


Tmrrr
PROGRAMACIÓN DE MICROCONTROLADORES P IC + Z IG B E E

2 - Se pueden crear funciones. Estas son importantes porque, si se utilizan va­


rias veces, solo se tiene que realizar el llamado. Por ejemplo, La parte de código
que incrementa y muestra el contador en los puertos en el ejemplo anterior, se
puede sacar en la siguiente función:

void incremente (void)


{
cont=cont+1;
display=cont;
leds=cont;
}
Y se hace el llamado con la instrucción
lncremente(); // El nombre de la función puede ser cualquiera

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

El código completo con los cambios es el siguiente:

// Inclusión de la librería xc.h y configuración de bits


^ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

#include <xc.h>

// CONFIG1

#pragma config FOSC = XT // Osciliator Selection bits XT oscillator


#pragma config WDTE = OFF // Watchdog Timer Enable (WDT disabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = ON // RE3/MCLR pin function is MCLR
#pragma config CP = OFF // Code Protection bit (protection is disabled)
#pragma config CPD = OFF // Data Code Protection bit (protection is disabled)
#pragma config BOREN = ON // Brown Out Reset Selection bits
#pragma config IESO = ON // Internal External Switchover Enable
#pragma config FCMEN = ON // Fail-Safe Clock Monitor Enabled bit
#pragma config LVP = OFF // HV on MCLR must be used for programming
ii.un
LUIS GUILLERMO MONTOYA DÍAZ =77
TTTTTT
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE

// CONFIG2
#pragma config BOR4V = BOR40V // Brown-out Reset Reset set to 4.0V
#pragma config WRT = OFF // Flash Program Memory Self Write Enable bits

// Definición de la velocidad del oscilador


H *****************************************************************************************

#define _XTAL_FREQ 4000000


H*****************************************************************************************

Definición de nombres para las variables


H*****************************************************************************************
#define suiche RD4 // Nombro el
#define display PORTC // Nombro el
#define leds PORTA // Nombro el
#define Q1 RD0 // Nombro el
11* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
// Declaración de variables
11* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
char cont=0; // Declaro variable cont como char y la inicio en 0
H*****************************************************************************************

// Declaración de funciones
H*****************************************************************************************

void incremente (void) // Declaro y realizo la función incremente


{
cont=cont+1; // Incremento el contador
display=cont; // Muestro el contador por display de 7 segmentos (PORTC)
leds=cont; // Muestro contador por leds (PORTA)
3
H*****************************************************************************************
// Programa principal
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

ANSEL=0; // Todos los pines digitales


ANSELH=0; // Todos los pines digitales
leds=0; // Limpio puerto A
display=0; // Limpio puerto C
Q1 =1; // Habilito salida del transistor
while(1) // Inicio ciclo infinito
{
if(cont<10) // Pregunto si cont menor que 10 y si se cumple
{
if (¡suiche) // Pregunto si suiche está presionado, en este caso = 0
{
*- __delay_ms(200); // Retardo para evitar rebote de contacto
while(!suiche) // Mientras suiche esté en cero no haga nada
continué; // S¡ pasa a uno incrementa contador por flanco de subida
incremente(); // Llamo la función incrementar
}
}
else
{
cont=0; // Si cont no es menor que 10, entonces lo limpio.
}
}
}
j
^ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

Se pueden co m p a ra r am bos pro gra m a s y n o ta r las d ife re n c ia s entre


un c o m p ila d o r y otro. A u nque soy am igo del len g u a je ensam blador,
el hecho de no te n e r que d ire c c io n a r bancos de m em oria de datos,
ni te n e r en cuenta en qué posició n de m em oria co m ie n za n los re ­
g istro s de p ro p ó sito g e n e ra l, porque en C sim p le m e n te se d e claran
las va ria b le s, adem ás de la fa c ilid a d del p ro ce sa m ie n to m a te m á tico,
hace que g e n e ra lm e n te me decida por el len g u a je C para re a liz a r
mis a p lica cio n e s .

R ecuerde que en las s ig u ie n te s p á ginas de este ca p ítu lo está el


p ro ce d im ie n to paso a paso de la re a liza ció n de estos dos e je rc ic io s
con la nueva p la ta fo rm a M P LA B X de M IC R O C H IP y los c o m p ila d o re s
m pasm V ersión 5.48 para el e n s a m b la d o r y XC8 ve rsió n 1.12 para el
tra b a jo en len g u a je C.
liiUi
LUIS GUILLERMO MONTOYA DÍAZ 1Q
Trmr
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE

Paso a paso para eS manejo del IVIPLABX


Este paso a paso (También lo puede ver en el CD) se realiza con el ejemplo
anterior, el cual enseña el manejo de entradas y salidas en el PIC 16F887. Se
utilizará la versión 1.60 que es la última en el momento de escribir el libro.

Se utilizará el compilador XC8 para el trabajo en lenguaje C y el mpasm 5.48


para el trabajo en lenguaje ensamblador.

Luego de abrir el MPLABX utilizando el icono que se crea automáticamente en


el escritorio, es bueno verificar si los compiladores a utilizar están instalados.
Para eso se ingresa por la pestaña Tools y luego en el ítem options. se llega al
siguiente cuadro de diálogo.
MPIA8 X IDE vl.60 - 3

■u,mi,
20 LUIS GUILLERMO MONTOYA DÍAZ
T irrrr
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE

En éste, en la opción Embedded. verificamos que efectivamente, tanto el compi­


lador para ensamblador mpasm 5.48, como el compilador para lenguaje C XC8,
están instalados. En caso de no hallarse, se debe hacer click en la pestaña Sean
for Build Tools y automáticamente, buscará los compiladores en el PC, siempre
y cuando se hallan instalado previamente.
Tanto el MPLABX como el compilador XC8 se bajan gratuitamente de la página
www.microchiD.com/MPLABX
Si todo está listo se comienza el ejemplo en lenguaje ensamblador creando un
nuevo proyecto como lo indica la figura siguiente:
«hte Ki,i View Navigaie Seurce Refactor Rtm Psbug Team Tools Wmttew Help
S New Project,. Ctrl*Mayúscula**N
; f§ Níwfife CtfWi
\mO * » * * * .
i a^feS|Pro|ect::

Op«n Team ¡Project..

CtessPfojíKt
CteseAfí Ps«j«ts
Qper¡ Ríe,..
GpíttReeentFile Jjjjt QuícSí Starí i |¡§f¡| Mínate Víteos

6»o{> ^ MPtAO ¡BEv8 Users - ¡MPORTAKT f | g Osffisresces fírnnMPIAB8 Q p Mf*tA8XS0EFarom

Otl+S Take a Toar ftiíTiíloríaSs» j ^^MPLABXIOEWilti

I Ü Í I Bowtifoad CorapHer* and Assemblers

Hatease Sotes and Support Qocumesitatson

8V!fl.00í|*ijjl
Wp\!<6
íj.r&
:/ ' ' , Gpen Sample Project

{ |í I !r m RAMUteds 6 @xO} Frt*! 368 1758


I |f I ‘ -SS RSMRsses-vsá: Prostectei Enags
¡ , - OH^ 819I{ex2S90)RS'<te
i !.
C .H .........J
; «Flash Used: 0(0x0) Ffee: SX92 (0x2000)
|| g g Impert MPLA8 Utgaey Projeeí

| 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

File v lueao New Project


Fs*- iét íh «■¡ce F » TíiK^ 1w« Tccls H**p
..... ibankO SesfS {cñ->3>

k:pre**et* Fite* # *)s StmPzge m ehj® ®


«M U
fp ¿s*émm7

Ü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

;■■m P1«itó8d;O03<®) Resí StS2 (flsíaf3CO>


: S® RashfcsfiTveó: Préstete tas§e
~0 tee¡jfí*¡

En el paso dos se elige el dispositivo, en este caso en la familia


de medio rango de 8 bits de Microchip se selecciona la referencia
PIC16F877. Click en Next.

El paso tres es opcional y solo aparece para aq uello s m icrocon-


tro la d o re s que poseen alguna he rram ienta especial de s im u la ­
ción. El paso cuatro es la selección del equipo para la p ro g ra m a ­
ción y/o sim ula ción del projecto. En este caso se elige el

22 E LUIS GUILLERMO MONTOYA DIAZ


PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE

PICKIT3. Si ya está con ectado a un puerto USB del PC, aparece


con el respec tivo número de serie como se aprecia en el cuadro
de diálogo. Click en Next.

á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

y -sf ' Cawpte T«sfcte«


1 f ,XCSCvl.96} [C;f rogr«!s Fies O ^^w M pV ^W l-O O ’Wn „ j
©Hsaw>
g RAM»(Sxl.?S)b¥tes
| : í -| ~ ™
i S Í RAMUsed: O{3XG) Ff6e; 368 {OxíTS)
:I
p ~ ........ ............ ...............
; í-«SRiWilasmsaáiPrssducSoníín^ »\Í>XCÍ8F ÍÍC S 4 F ?XCSi*H *
eXsicisf m c ítr síes «a
| É @ F M i ®ÍS2 #*2(366) w w ás
I !: -m
‘.... '“ 1
Flash Used; §{8x8} Fres; S i? 2 gtoOOS©)
Ivmsow F2C24F EEG34H
»\» X C tS F «KKMS* S X C ÍÍE
rsFiciSt éic2<r mcssíh
«&*i£ pssh, 3&i* «wfs
- tesares »

El paso seis permite seleccionar el compilador, inicialmente se elige mpasm 5.48


porque se trabajará en ensamblador. Click en Next.
f m M K tm v íM -

<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

® FteshUsed; nQmjftct-, 8192{0x3000}


: S FfeshReser.-ec: ProcSuct»?) ¡®a$s

z m iM n

En el paso séptimo y último, damos nombre al proyecto y elegimos la carpeta


donde se almacenarán los archivos. Click en Finish.
UÜH
LUIS GUILLERMO MONTOYA DÍAZ 23
T fT T T F
PROGRAMACIÓN DE MiCROCONTROLADORES PIC+ZIGBEE

|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

Attó feástmg ftems frem Fcldets.., € Main FSe...


M TaterisI*» ; | § j ^ Mí*tA8 X IDEWikí
Fi«á,„ roampicc.t...
SmpfyFile,,.
Cut «ksa$ Cowp¡í«rs and Assemblers
| | h «anejoJo. Capf
0 + Cfesí...
m jS-<#O e*Í Ct* Ifemfte,..'
Paste |sase Sote* má Support Oocameotatk»

■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

Ya está t e r m i n a d o el p r oy ec to donde se a lm a c e n a rá n los a r ­


chivos fu e n te y e je c u ta b l e de la a p l ic a c i ó n . S e l e c c io n a m o s en
el no mbr e del p r oy ec to la op ción Sour ce F i l e , luego New y por
último la opció n Other.

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®

Acá se encuentran las diferentes extensiones a usar en ensamblador, en este


caso se elige Assemblv.asm y click en Next.
uuu
24 LUIS GUILLERMO MONTOYA DIAZ
■mrrrr
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE

forams

MPLAB X IDE Forum

! 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.

Aparece el editor para comenzar con el código de nuestra aplicación. Lo primero


será elegir los bits de configuración entrando por la pestaña Window luego la
opción Pie Memory Views y finalmente, Confiauration Bits.

LUIS GUILLERMO MONTOYA DÍAZ : 25


PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE

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 J o J W -te fcta ard # K


%m xjojajm
pontee p
• $ Chad»*»: SsW 1
¿«{fcTsdd-ain
, i-.*f w m w m (¥5.48) [Cifrogrsm fíks fcS^ljtfcratWp’
m^.,
B (P Memory
~ ggsWS3SS<Os[S3$)b<tfas p
FC >V-
RAMmedí Oim ¡ FfWK 36$ COx»>
fj§ Adé-sss Saws
ÍNP fe007 conrsi
Vate
fffí
Raid
ro s e ~xr
Opto Caiegm
OsdBatcif Setectton ate
ssms
» « ¡¡d te ;£
m R&$ Ssaervafe Préstete isage L r WPTE ~Ofr WatohtfógTiro&rEnable Mi
É S fiash 8192 {0x2000} w *fc ♦ Fower-üg Tims< Ena&ís m _
< RESaóJR rin funciicr, j.! ^ " REffiSQRpin te s to ssm K
;--m Flash«sed: 3 {0x0} Free; 8192fMSQD) __dVdePfoMoñ ü ~ ....... Procter meiaiif •' ese» » oiecaor i aw *d
LÜ ñash Reserved: Productor* tege
8 | | fosaros

Por el momento solo se necesita el oscilador XT para trabajar a 4MHZ, deshabi­


litar el perro guardián WDT y la programación a bajo voltaje, es decir, el bit LVP
en OFF. Luego de realizar la selección se crea la palabra de configuración en la
pestaña Generate Source Code to Outout.
Im píasxm,:<«-Ms-^w.fss?3¡S¡3
Fí4« Vim? fí«.'s§aí* Seurc* Refsctor Sun CJeísug Tessm Teclí Wmdo* Htíp

^ O i l ***** -

;; Profeets * . F,¡ Sfa»rtPjügft Ha*>eJoJto_F88?^s*R S|_ lisiiSSl


láS ton®» 3í*- - * <c - - *¡
é £3 fcd«a?»5E
g 5 ia**í««£
f Q ubwaiua& e 1 fi
4 ü martai
¿ Q t4afs^joj!S8?
|j kM «
2 ; P I C 1 6 F B 8 7 C o n f í g u r a t í o n B i t Settincj ¡
;> $ tifte Ffe 3
i SwcsFte
.

,+§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

■ffli R*s«v«d; f¥odw«issnSmage


^ ^ Rasourees
i m .....

Se selecciona la palabra de configuración, se copia y se pega en la


parte inicial del editor.
ÜUil.
26 LUIS GUILLERMO MONTOYA DIAZ
Trmr
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE

H MPIA8 X IDE vlláS - MwxáoJoJFSf ' d e W t ^ j | i ¡ P ...........


Fil* EcSt Víew N*«£*te Source ftefactor Sun Debug Ttsm loois Wmdow H*»¡»

t i O £8 % - fl v ¿ ¿ ** rc:toC **< < * * * :< » Qs Seará> ¡Cti+Í!

StartP<*s« 3*1®! Ma*aq®jKsJ:®l7<as»B s*g


s# 'Ü8 rasricd
. ~ Q Marago wjrf»?
u;¿3.=S
^ i? i\ ir x < j ] r --------- c r o O T r T o z r y - '
Heasésf Fks
& j ¡ f xawísm Ffe
12 ?k‘é?'k‘k ‘k°kit'fc*k‘&ik‘k‘kik'k'kik
¿¿
BT- f e Unker Ffas
SaurceBSes
■ $g Maoejcijo^887,*sn
I í a - Ü ttesries
13 CBLOCK 0X20
|| é-Üloa&Mes

Í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

1---- . ----,--------------- ------------ILJ-------!---------- i- ;


Parsángpruefeaccs.., : ’
€ f ft -9 r p i -
| ? H " 'W 5 r T ' n b- ..í ^ '**~«süsr\

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

:- «*< " '\ . : »C . . -


jl Proseáis ««ánjpJW.** |___ _______
f»siSá
lé @ MKWjoJaJW
' ' - •; = ■.
jé © NfenejoJo_rSS7
j ^ Hesder Ptes
I *N{¡¡¡$ líKportarsi fíes

. (£1s ; PIC16F887 Configuration Bit Settinc


: • ® Pteoeí6jo_m7.*»a
* S i Ubraries
-*• ^ to®«ísM«s
m O nodubtíon
’ ü S3 ssUkpte^ # i n clude ”p 16 F 8 8 7 *i n c ”
W m™*
i O pfcl8_tempíirt*_l
SSK O pfcl2_tomp!ai»_l
* Mt Usmpla'e.i
*nt i t , ' »> &• I * ; CONFIG1
^ * Maoíjoja jm ?

■ ^»PÍCS«FS87 ; ___con.fig OxEFFl


• Chedtsum; SjíSK^í
é
:
C«^!teT*5£íStot
MP*Smm()i&4Q g Z V w to f* » &<8Wto«<«|»WJ«lá
rnMFTn roMFxai . w n ^ r Y T X, W T1TW . -

$ 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 | ^

Pwsngprueteocs,.. IV 1|1 SNS


, « M I
i. ■ ' : iP ;■ ¡ ; ,v ' • - X , es - ^ J> if _.,ii •<
í .im u im .-

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

Vam os a propiedades del proyecto con File y luego Project Properties


H M P iM X IDE v i m - m m p js
hk^M é HiF/í^ t e S w t t jtgfacfa» K

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-

Selecciono P IC K IT 3 y luego en Option Cateaories elijo P ow er y coloco el chulo


en P ow er Taraet circuit from P IC K IT 3 . Luego A p p lv y O K .
liüU
28 LUIS GUILLERMO MONTOYA DÍAZ
TTTTTT
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE

fitei £ *t V'ísa Nav-.gat* jm » s S«fa«« Ru". f*sm Im h Wtnátm H&p

: i j E a :n v - : ; ^ ................... » ■ f z . ' A- '-

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

Volvemos entonces a programar y aparece el aviso de precaución preguntando


si el dispositivo trabaja a 5VDC, click en OK.

Me H k Vimt Nawgate Sames ftíf*ct<* Rm Oefeag Team Tsc-Ss Wmdow

5 ,.J r^ ' •< 9 • " .T

' Pi# í-Jkí


pl|¡t\ lik'S§3
^ HsadarRtes
I *A ; j " W 1Ú ^i': 6 4
*■ܧ! I®portantfiSe$
t- j f j iiAüfFte 22 RETARDO
i m SourcaFte
'$•■M 23 MOVWF REGI
& f e laváÉáss
¡é -8 ManefcjsJW
¡tí: Q ¡noctíacten 24 DOS MO¥LW .110
£¡¡ mUSpfex
jééa»»
Q ?tóSJsn$atíU 25 MOVWF REG2
Yt Q fte!2Jsf?ípiaíe„l
5 Q pKÍS_%Mst8_l
"A Q » S f f i
26 UNO MOP
g rao3gcTD3
27 MOP
m ^ Mane)ojoJF897 28 MOP
r-^pffSCÍ^SS?
> | f ChedcsumtOxSECS
1 ' Cwpfa Toddw
■ f 5MMtSMWM<vS.4$ CCi5Prs§fsmFfe C « ) p a s d % f « « 8
3Q MOP
Q mxw»ry
^ | WS8kl^bytes
& :.Jl. ...................... ...... x>; Ssts
i p™ si ; 0?05
« RM4 ussái 0 (0X0) Freí! 3® ( s<i
j|j
i : W RAMtesreesá; Prs&tócsi Sb^ s
É g Ra8hSm»x2W)«a«fe
pza^zss sttaerjr: *t»s« *dá£*is « 0«í>,

Srogss»isg,..
a
=JJL
Jl l INS

Al finalizar la programación en forma correcta, aparece el aviso Proarammina/


Verifv complete.

Se verifica entonces en el hardware, presionando y soltando S3 que correspon­


de a RD4, se incrementa la cuenta en uno.
.0101
LUIS GUILLERMO MONTOYA DÍAZ 29
T F rm
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE

16T 88?

Ahora veamos los pocos cambios que se deben realizar para el


programa en lenguaje C.
K MPUB X IDE Vl.60 - MarKjo.is.F837: defauli;

lililí
1 30 LUIS GUILLERMO MONTOYA DÍAZ
flT IT I
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE

Iniciamos el proyecto nuevo. File v luego New Proiect.


U M P I A i X K l,se M arejoJoJgS? sfefaufe
Ws íafe Vsb» Vvsgaifc ¡
_____________ ______________________________________________________________ m
T&ím tí,„ss. WVsOi?* He§p
wmtA
T _ M i V.

: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

| n ; » FlashUsed: Si {8x33) Free: m : , • l . 1 ,


I 1- s-WFtóiemvgd;Pfsétómte^
ÉNjÜ ftesoutw
sSrí>g2as«i.»g/'V*íí:i£y esüsjsiees

Se elige el tipo de proyecto. Click en Next.


K ■: : í .: y ■m*- « j t / a r
Pfe i Defeug T sw Too-s Wmsfc»' N«^ :

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í

Se elige la herramienta de simulación y/o programación. En este caso PICKIT3.


Como está conectado aparece el número de serie. Click en Next.
uuu
LUIS GUILLERMO MONTOYA DÍAZ 31
TJTTTT
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE

f e Eéí Vkw» Nsvjgsía Soyscs M k íí » Rsw Oetef Team Icofs W « « «

t 3 Q Í S * ^ r . . ¿ "* i Ü ’ PCíW3 :w.-ax0;bar*0 ;jC^» (Ctrí^í)

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

En este caso se elige el com pilador para lenguaje C llamado XC8.


La versión 1.12 es la última al momento de realizar este ejercicio.
Click en Next.
I I M ? m %IDE vi,68- MaiMfoJoJ887; defauft .
_ L _
1 E#t Vcv? Nü.-syte Scyrí# <3 Tmr* Tcc!; » >1 -

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

Le doy el nombre al proyecto y selecciono la carpeta para almacenarlo. Click en Finish.

1 32 I LUIS GUILLERMO MONTOYA DÍAZ


TTTfTT
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE

^ ^ -----^iSWSÉ
File & » View N m ^m Source R*f*«t©r km Defcug T«m Tooís Wmúm Htijí

f tLiUINfe **•* ’ 1 f Ji.* jL/va U ' * ** * iácz


.■iC^íséarthCCH+J)

•Proje«t* <8 * ¡: files iílDS®

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 .) »

i ¡-S I RAMReservé Produdfc»íi«»ge


Q Pksh 8 m Cte2000) aprds

Con el proyecto listo, a la izquierda de tu PC, se selecciona Source File luego


New y finalmente C source file si está presente, sino es así, se selecciona Other
y se busca C Source File.
H mm 1H3£v i ®- Man^i&jCJrSg?; defefo
?!&«■ feíst m\’-' Í€VK¡: R#SKt« í^itt £*ft>íi^ T«í»í To<S& iV «k »' e»|S

¡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*

SS RAMUsad; 0(0x0) Free: 368 §3*1JO)


W í l » Reserves!; Prmtóton feíage
, B Q 8192 (m m ) mmés
, f™ ~~g^— —
j | U » fiash Used; 8 (Qxü) ft«e: 8192 {0x2000
} • ■* F M ¡Saserved: ftsducfen laage
£ tesuras

Se da el nombre al archivo fuente, la extensión y la ruta no son necesarias, ya


están implícitas. Click en Finish.
UÜU
LUIS GUILLERMO MONTOYA DfAZ 33
Trmr
PROGRAMACIÓN DE MÍCROCONTROLADORES PIC+ZIGBEE

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 *■

Aparece el editor y lo primero será la configuración de bits tal como se hizo en


ensamblador para obtener la palabra de configuración. Window luego la opción
Pie Memory Views y finalmente, Confiauration Bits.
n MPU8XIXvtm»Ms^JojCJ»
F.!e fcdi
• xm . ¡¡1— 1^—
So«rce Refector Rut» Debug Tssm Toste W«dew Help
■ i .m S jr.iS niij

- . J - ztfcc : W:at0:íaric0 :£ V ; :v:'::: i ^ .: 5-:

tSSBB

Por el momento solo se necesita el oscilador X T para trabajar a 4MHZ, deshabi­


litar el perro guardián WDT y la programación a bajo voltaje, es decir, el bit LVP
en OFF. Luego de realizar la selección se crea la palabra de configuración en la
pestaña Generate Source Code to Output.
UiUl
34 = LUIS GUILLERMO MONTOYA DÍAZ
Trrrrr
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE

n M P U 8 X m v i » - jfaHfrüo.CJFB87¡d thrtt
. ' '.... .
't o a » % »* -

.¡Projms StartPape * ^Ha®*jo_toJJR8«fx i ESES


RRip
! f e B e aás-fe
- .
■¥ | § ínsporiantlfe
| ¡?g§UnÉerffe
8 fe Sofaes 1 1
i ■ § 2 // PIC16F887 Configuration Bit SettinÜ
\ @-¡¡1 Ubrafes
S f e Usadabies
<9 Q H m f r ja s m 3 í
é ¡ j « e s to fe
é | f Inpsrtímtfts
: é f e UnbsrFfes
4 tinclude <xc.h>
. $ f e Ssurcsfte
I f “Ü Ufarais
I É - ^ íoadabte
f f l fte ^ js /S S ?
• fefigator
6 // CONF1G1

H foM m ¡oj»_ cjw 7
-x 'i- ^ÉDe«* f 7 tpragma config FOSC = XT
:•^PÍCJSW
* !; - gChed®m-M6FF
^ í é - l - CorrerTsddiasfi 8 tpraqma confia WDTE = OFF
H ; I L f ‘ XC8{vS,í$ [C)Pfegr8®«e»Cx8^ÍHtaw^V«*Vl.l2tó
¥>¡é-lpnwory
i i 8 |gRAM3ó8C0xí7O}bytes

| i mfmUsed:Q{m)Free:368(Gxm)
L ® RSMResavsé:?roájcto1«sa§e
E ;|§ Sash S192 (8x2)00) monis,

Se copia y se pega al inicio del editor.


H w í m j im v im - . A?feu% ¡ ¡ ¡
c£, íí; :iV : i:;?;;: Te-:,*' "ÍVa- Hih;

' ! j ......... i- < * - ' • ............ ..

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

Se define la velocidad del oscilador a 4000000 HZ y se da inicio al código en C


con la función principal void mainO

LUIS GUILLERMO MONTOYA DÍAZ 3 35 1


PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE

ü MKA8Xm vim- ;teUvli


Ríe &» Vtew Navig*it Soutca Referto? tom Sebug Team Toe* Windows- Help

SiartPag* #fpfSneJ«t_(o_C_F8S7x: GIBEIS


É Q Ks^_*}_C_F8S7
¿ j j g H^aste-Rte
3 * - ^ C v* , -. „ -
X X — ^ r K I J Í J . j 7 .. ,■— r r o g m i c D ^ 3 T ” T v :í
ai H | íapSfSafStFfci
§>Í¡§ Unterfies
é'É¡É
; ^ i^ y M y m í
39 1
©ÉSübwses m del ay ms (200) ;/ / Retare!
S Í ! taadSMes
Q ManejBjo_F887
É j l Heaásrffe
é | ¡ f Issporíwtffe
41 w h i l e {1RD4) // Mientras R
©|¡| UntePite
©*!|§ SouroeFle* 42 continué; // Si pasa a um
S ' Ü Ubrafcs
É>¡j¡t tossfeWes
t w Wane;pJo_Fi88?________
43 cont=cont+l;
iM a m f a & S j m 44 PORTOcont;
&<0Geitoe
i |-^HCÍ6W?
45 PORTA^ccmt;
$ ^¡f CowpteTastóws
! I-f> XC8 {Cífregtm fies C*85j*Htod#^s3%l..l^n|í
B ©Mramry
í r: S RAMm #X im bjf&S
j p — .. ■'■-■■“■ ; Projectloa*ig grror x >PIOc* 3 * i Cojifig Bit* <*ou«* x : Hü«»jo_k>_C_FSS7 (Oían, 3o84 „ } #2 * ManeJoJo_C J=887 (deán, BoSd,...) * ;
| » RAMUseá: * {0x4}Frtó; 3S4{SxíSC}
: &»*ving ííirtctocy ‘C;/C0aS0_PXC/ííKS*ja_io_4C_í'a8’? .X'
¡ i ~ » R»lSs»v«d:í^sájcS!SRaí!i8S

!í f 51 1 BOUS SOCCESSFÜt tira»: Sai


:Xtoad&ag esd* fresa C:/CTSSS0_PlC/H*n«3O_io_C_í8S?.X/di*t/d*£<Kile/pi!5doeticíi/'H»n»jcí_io_C_FS8?.3t.ps£>ííttci:ian.fc*x..,
\
ü i FteSí Used; 77(<MB) fres: SUS §ktFS3}
M Bi Flash teerwfe f^oduefe» fe©?
ifcMMttagt jqpfcal* tem C:/QjaS0-_?IC/íE«ae3»mii5_C_r3S7.X/íSis?;/d*ís¡(ttl5/psí5£íuc5los/H*n®3ts__Ia_c:_FSS7.K.|.'roaoes;ic!a.s:!5f...
_______ _ | Loadla^ «sss^letssi

Al terminar el código, se compila y se debe obtener, si no hay errores, el mensaje


Loadina Completed.

Puede verse el funcionamiento en el simulador Proteus o directamente en el


Hardware. Para programar se da click al icono Make and Proarammina (Flecha
verde hacia abajo)
Ble Eét Wtm Nívigste Scsutse 9ém im Km Dtbug T«*m Teefe

' -••• •=

» 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

m ñ a * Uaseb 77 COx®} ft'ae: 8HS {DíífbS)


| -■ tesarwsdí i^sséjcScwS-rasg*
3 ^ Resources

Si no hay problemas, debe aparecer el aviso Proarammina/Verifv complete.


UUil
i 36 LUIS GUILLERMO MONTOYA DIAZ
TfTTfT
P R O G R A M A C IÓ N DE M IC R O C O N T R O LA D O R E S PIC+ZIGBEE

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

Figura 3. Tabla comparativa para la referencia de microcontroladores 10F20X

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

8-Pin PDIP Pin Dlagrams


me . 1 sr
VOQ ~ 2 - Vss
3 & 8f ■me
©P1HCSPCLK- 4 s 5f ■ e «C S R M T
m

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

Fig ura 4 . D iagram a de p in e s de lo s PIC 10F20X (E n cap su lad o DIP y SOIC)


JLUÜUUL
LUIS GUILLERMO MONTOYA DÍAZ 37
n m r
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE

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.

En este capítulo se realizan los programas, tanto en lenguaje C como en ensam­


blador, manejando únicamente los pines como líneas de entrada y salida.

El primer programa será en lenguaje C. Simplemente, se detecta un nivei lógico


alto en el pin GP3 (Solo puede ser MCLR o pin de entrada) para activar las otras
tres salidas, es decir, GP0,1 y 2.

U1
GPO
GP1
GP2/TOCKI/FOSC4
GP3/MCLR
MC10F200

Figura 5. Plano Electrónico


Programa en lenguaje C

// Se incluye la librería principal con los bits y registros especiales del micro
^*****************************************************************************************
#include <xc.h>

// Palabras de configuración de bits creadas automáticamente por el compilador

M JU Li

38 LUIS GUILLERMO MONTOYA DÍAZ


mm
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE

// CONFIG

#pragma config WDTE = OFF // Watchdog Timer (WDT disabled)


#pragma config CP = OFF // Code Protect (Code protection off)
#pragma config MCLRE=OFF // GP3/MCLR pin fuction is digital
******************************************************************************************

// Se define la velocidad del oscilador


ir '* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

#define _XTAL_FREQ 4000000


li ­* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
li Programa principal
//'* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
void main()
{
TRIS=0x08; // Configuro GP3 como entrada. GP2, 1 y 0 como salidas
GPIO=0; // Limpio el Puerto único en este micro
OPTION=OBOOOOOOOO; // Necesario para el trabajo del pin GP2
while(1) // Inicio del ciclo infinito
{
if (GP3==1) // Pregunto por el estado del pin GP3

{
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

El anterior es el código en lenguaje C, utilizando el compilador XC8, que es


el último aprobado y revisado para todas las familias de 8 bits de MICRO-
CHIP (10F, 12F, 16F Y 18F). Este puede descargarse en forma gratuita,
bajo su versión libre, al igual que la nueva plataforma MPLABX de la página
www.microchip.com/mplabx

A continuación el código en lenguaje ensamblador


; Se incluye la librería de cabecera con los registros y bits especiales del micro
.******************************************************************************************
j

#INCLUDE <P10F200.INC>
******************************************************************************************
Palabra de configuración de bits
**************************************************************************************

_CONFIG _WDTE_OFF & _CP_OFF & _MCLRE_OFF


******************************************************************************************

Bloque para registros de propósito general si los hay


******************************************************************************************
CBLOCK 0X10
ENDC
.* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

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

En este registro se encuentra, en el bit 7, la habilitación para el perm iso general


de interrupciones, llam ado GIE y se pueden habilitar 3 causas de interrupción así:
1 - Interrupción por de sbordam iento del TIMERO: Se habilita poniendo a 1 el bit
5 llam ado TMROIE (TimerO Interrupt Enable).
2 - Interrupción por cam bio de flanco en un pin de un puerto: Se habilita ponien­
do a 1 el bit 4 llam ado INTE, (interrupt Extern) esta interrupción solo es posible a
través del pin m arcado com o INT en el diagram a de pines del m icrocontrolador,
en este caso RA2.
d ip , soic, TSSOP

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

Figura 7. Diagrama de p in e s d e l PIC16F1823

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

b!i? WPUEH: Wealc PuII-up Enabte bit


l = Alí wealc pull-ups are disafaled (except MCLR, I i! Is enabted)
0 = Wealc pylkips are enabled foy indiwdyal WPOx latcti ¥aiues
«I INTED6: intenrapt Edge Sefect bit
1 = Intenrupt orí rising edge of RBO/ÍNT pin
0 = Interrupt on faNing edge of RBC&iNT pin
bit 5 TMROCS: TiinerO Ciock Source Seiect bit
1 = Transitan « i RMÍTOCKi pin
0 = Interna! Imtmlkm cfcie cioclc (FoscM)
bit 4 T üR iS E : Timerfl Soinse Edge Seiect bit
1 = increment on high-to-low transition on RA4/T0CKI pm
0 = ímmmmú. m l©w~t©~tií§h transition on RMUOCKl pin
bit 3 PSA: Prescaier Assigoment bit
1 = Prescaier is not assigned to tie TímerO module
o = Prescaier is assigned to tfia Timerü moduie
bit 2-0 PS<2;0>: Prescaier Rate Seiect bits
Bit Valye T in »® Rafe

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©

Figura 8. Registro OPTION REG

Pueden observar el bit 6 que dice: Si deseamos flanco de subida en la interrup­


ción lo ponemos en 1 y si queremos flanco de bajada lo debemos poner en 0.
Los demás bits tienen que ver con el WDT y el timer 0.
Entonces quedará así: OPTIONREG = 10000000; eligiendo flanco de bajada.
La interrupción IOC, por cambio de nivel en algún pin del puerto A, posee más
condiciones, debido a que se debe elegir no solamente el pin ó los pines del
puerto que se desean, sino también el flanco, así las cosas, los registros que
tienen que ver con ésto, son los siguientes:
1 - IOCAP: Registro donde se elijen los pines para que llamen la interrupción por
UUM
LUIS GUILLERMO MONTOYA DÍAZ 43
Trrrrr
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE

flanco positivo, es decir, de cero a uno.


2 - IOCAN: Registro donde se elijen ios pines para que ilamen la interrupción por
flanco negativo, es decir de uno a cero.
3 - IOCAF: Registro donde se almacenan las banderas que me permitirán verificar si
efectivamente la interrupción sucedió y por cuál de los pines.
Si queremos elegir los pines RAO, RA1 y RA3 para que actúen con interrupción y además
por flanco positivo, el registro a elegir será el IOCAP y quedará así:
IOCAP = ObOOOOl 011;
El problema puede ser planteado de la siguiente manera: El microcontrolador está en su
programa normal que es un conteo de 0 a 9. Si se presenta una interrupción extema, es
decir, por RA2, éste dejará el trabajo donde va y realizará una secuencia ON-OFF cada
segundo por 10 veces visualizada en los 2 leds ubicados en los pines RA4 y RA5. Si la
interrupción es por cambio de flanco positivo, es decir, de cero a uno, en alguno de los pi­
nes configurados RAO, RA1 ó RA3, el microcontrolador activará una alarma que consiste
en prender y apagar 20 veces cada 100ms el led ubicado en el pin RC5.
Si se desea enterar por cuál de los pines habilitados en el puerto A se dio la interrupción, enton­
ces, debe hacer una operación AND con el registro de las banderas; o sea, el IOCAF, así se
pueden programar diferentes rutinas de acuerdo al pin que activo la interrupción.

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

Figura 9. Plano electrónico


El siguiente es el programa debidamente documentado:

// 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>

// Palabras de configuración de bits generadas automáticamente por el compilador


y y * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * **************** *****************************************

// 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

LUIS GUILLERMO MONTOYA DIAZ


PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE

OPTION_REG=OB10000000; // Flanco negativo para INT


LATA=LATC=0; // Inicio puertos A y C en cero
PORTA=PORTC=0; // Inicio puertos A y C en cero
while(1) // Ciclo infinito para programa principal, mientras no
// haya interrupción contador de cero a nueve cada 100 ms
{
PORTC=cont; // cont está en 0, se visualiza en display
__delay_ms(100); // Retardo de 100 ms
if(cont<=9) // Si cont es menor o igual que 9
cont=cont++; // Incremento cont
PORTC=cont; // Lo muestro en display
__delay_ms(100); // Retardo de 100 ms
}
else
{
cont=0; // Si no es menor que 9 limpio cont
}
}
void interrupt isr(void) // función para Rutinas de interrupción
{
if(INTF==1) // Pregunto si bandera en 1 para confirmar INT
{
for(i=0;i<10;i++) // for para contar de 0 a 10 cambios en RA4 y RA5
{
RA4=0; // Intermitencia entre RA4 yRA5 cada
RA5=1; // Segundo.
__delay_ms(1000);
RA4=1;
RA5=0;
__delay_ms(1000);
}
INTF=0; // Limpio bandera de interrupción
}
if(IOCIF==1) // Rutina de interrupción por puerto A
{
for(i=0;i<40;i++) // for para contar de 0 a 20
{
RC5=~RC5; // Intermitencia en la salida RC5
__delay_ms(100); // Cada segundo
}
}
IOCAF=0; // Limpio las banderas de los pines
IOCIF=0; II Limpio la bandera de la interrupción

//*****************************************************************************************
JU LU LLL
46 LUIS GUILLERMO MONTOYA DÍAZ
nmt
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE

CAPÍTULO 4.

MULTIPLEXACIÓN EN DISPLAY DE SIETE SEGMENTOS


En el siguiente programa se realiza el ejercicio de conversión de binario a BCD
y multiplexación, con un programa que cuenta desde 0 hasta 999 y visualiza el
conteo en 3 display de siete segmentos.

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

Figura 10. Plano electrónico


El proceso de conversión de binario a BCD se hace necesario debido a que se
tienen números binarios de más de un dígito que se deben visualizar en display
de siete segmentos, por lo tanto, la función de binario a BCD por restas suce­
sivas o por medio del módulo, nos entrega el número binario descompuesto en
varios números en BCD. Por ejemplo, si tengo el 758 la función binario a BCD
entrega tres números en BCD: El 7, el 5 y el 8.
Luego de tener estos tres números se deben enviar a 3 display de 7 segmentos,
pero a través del mismo decodificador de BCD a 7 segmentos, este proceso se
llama multiplexación y sencillamente lo que se hace es enviarlos cada uno du­
rante 3 milisegundos. Este tiempo corresponde a una frecuencia de 333HZ, la
cual no es perceptible al ojo humano. Así las cosas, los transistores que corres­
ponden a cada display se habilitarán solo 3 ms, prendiendo y apagando cada

LUIS GUILLERMO MONTOYA DÍAZ ~ 47


PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE

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 *****************************************************************************************

__ C O N F IG (F O S C _X T & W D T E _O F F & P W R TE _O FF & M C LR E _O N & C P _


O FF & CPD O FF & B O R E N _O N & IESO _O N & FC M E N _O N & LVP_O FF);
__ C O N FIG (B O R 4V _B C )R 40V & W R T_O FF);
y y *****************************************************************************************

// D efino velocidad del oscilad or


yy*****************************************************************************************

#define _X T A L_F R E Q 4000000


yy*****************************************************************************************

// D eclaración de variables
yy*****************************************************************************************

char unidades, decenas, centenas; // V ariables char que van de 0 a 9


int aux, cont, i; // V ariables int que van desde 0 hasta 999
yy*****************************************************************************************

D eclaración de funciones
yy*****************************************************************************************

void bin_bcd (void); // Función binario a BCD


void m ostrar (void); // Función m ostrar por m ultiplexación
y y *****************************************************************************************

// 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

ANSELH=0; // Todos los pines digitales


TRISD=0; // Todos los pines del Puerto D como salidas
TRISC=0; // Todos los pines del Puerto C como salidas
PORTC=0; // Limpio el Puerto C
while(1) // ciclo infinito, también puede serfor(;;)
{
while(cont<999) // Mientras contador sea menor a 999
{
cont++; // Incremento el contador
bin_bcd(); // Llamo la función binario a BCD
mostrar(); // Llamo la función de multiplexación
}
cont=0; // Si no es menor a 999 hágalo 0
bin_bcd(); // Llamo la función binario a BCD
mostrar(); // Llamo la función de multiplexación

void bin_bcd (void) // Función para convertir binario a BCD


{
aux=cont; // Hago aux igual a cont
centenas=0; // Hago centenas, decenas y unidades igual a 0
decenas=0;
unidades=0;
while(aux>=100) // Comienzo restas sucesivas de 100
{
aux=aux-100;
centenas=centenas+1; // Incremento centenas
}
while(aux>=10) // Comienzo restas sucesivas de 10
{
aux=aux-10;

LUIS GUILLERMO MONTOYA DÍAZ I 4§


PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE

decenas=decenas+1; // Incremento decenas


}
unidades=aux; // Paso el residuo a auxiliar
}
void mostrar (void) // Función para multiplexar en los 3 display
{
for(i=0;i=50;i++) // Tiempo para mostrar cada dígito
{
RD2=1; // Habilito transistor para las unidades
PORTC=unidades; // Llevo unidades al Puerto C
__delay_ms(3); // Tiempo de multiplexación
RD2=0; // Deshabilito transistor de unidades
RD1=1; // Habilito transistor para las decenas
PORTC=decenas; // Llevo decenas ai Puerto C
__delay_ms(3); // Tiempo de multiplexación
RD1=0; // Deshabilito transistor de decenas
RD0=1; // Habilito transistor para las centenas
PORTC=centenas; // Llevo centenas al Puerto C
__delay_ms(3); // Tiempo de multiplexación
RD0=0; // Deshabilito transistor de centenas
}

//

JÜÜUULL
JJUUÜUL

50 1 LUIS GUILLERMO MONTOYA DÍAZ


trntr
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE

CAPÍTULO 5.

VISUALIZACIÓN DE MENSAJES FIJOS Y VARIABLES EN LCD

LCD1
LM016L

CM co 10 <Q h - 00 C7) O Y- CM CO
V“ V T“ T “

Figura 11. El LCD y sus pin es de conexión

Cuando se trabaja con diseño de circuitos electrónicos, muchas veces


se tiene la necesidad de visualizar cosas como: Instrucciones de mane­
jo de una máquina, la hora en un sistema de tiempo real, el monitoreo
de una determinada variable, etc. Una opción muy interesante es el
display de cristal líquido alfanumérico, estos están formados por una
matriz de caracteres de 5x7 ó 5x10 puntos cada uno, organizados en 1,
2, 3 ó 4 filas que pueden ir desde 16 hasta 40 caracteres. El proceso
de visualización está controlado por un microcontrolador instalado en
su parte posterior.

Todos tienen 16 pines. La luz de fondo está instalada en los pines 15


y 16. Los demás tienen funciones específicas que se describen en el
cuadro siguiente:

LUIS GUILLERMO MONTOYA DÍAZ 1 51


PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE

Terminal Nomiire ;' Ftancién . Descripción


1 Vss Energía Referencia 0 V, GND
2 Vdd Energía + 5 V DC
3 Vee Ajuste Contraste Variable de 0 a 5 ¥
4 RS Comando Selección de Dato/Com ando
5 R /W Comando Control de Lectura/Escrifxira
6 t Comando Habilitación
7 DO E/S DATO LSB
8 DI E/S DATO
9 D2 E/S DATO
10 D3 E/S DATO
11 134 E/S DATO
1.2 05 E/S DATO
13 D6 E/S DATO
14 D7 E/S DATO MSB
Figura 12. Funciones de cada uno de los pines de! LCD

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;

Dirección del cursor (!/D).


Modo de entrada 0 0 0 0 ü 0 0 1 m S
Auto desplazamiento efe b pantalla©
Encendido/Apagado de la LCD (D) y d i
Gente! de pntafla y de! cursor 0 Q 0 0 0 0 i D c B :
cursor (€}, Parpadeo del cursor (8).
Desplaza pantalla o él cursor (S/C) er= la
Desplazamiento 0 0 0 0 0 1 s/c R/L X X
dirección especificada por (R/L),
tacto d sl bus de datos (DL}, Número de
Selección de Funciones 0 0 0 0 1 DL n F X X
líneas (N). Tamaño de la letra (F),
Mueve á apuntada de la CGRái a la
Mover i dirección CGláM 0 0 0 í Dirección
posición indicada,
Nueve el apuntador de la DDRAM a la
Mover a émúén PDRAM 0 0 1 Wmúm
posición indicada,
Escribir al ICO 1 0 Dato Escribe información (OGRAM o DPRAM)*

Im desde el ICO 1 1 Dato Lee información ¡C6RAM o DDRAM),

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

Descripción de los Bits


1 Movimiento del cursor a la derecha
I/D
0 Movimiento del cursor a la izquierda
1 Desplazamiento automático de ia pantalla: SI
S
0 Desplazamiento automático de la pantalla; NO
1 Pantalla encendida
D
0 Pantalla apagada
c 1 Cursor visible
0 Cursor invisible
i Cursor parpadeando
B
0 Cursor sin parpadeo
1 Desplazamiento de la pantalla
S/C
0 Desplazamiento del cursor
1 Desplazamiento a la derecha
R/L
0 Desplazamiento a la izquierda
1 Modo de 8 bits
DL
0 Modo de 4 bits
1 2 lineas
N
0 1 línea
1 5x10
F
0 5x7
Figura 14. Significado de cada uno de los bits de la matriz de configuración

Por ejemplo si desea seleccionar funciones en el LCD, se debe ubicar en la fila


4 de la matriz donde están los bits DL, N y F los cuales significan:
DL es el ancho de! bus de datos, en 1 es de 8 bits y en 0 es de 4 bits
N es el número de líneas, si es 1 es trabajo a 2 líneas, si es 0 es trabajo a 1 línea.
F es es tamaño de los caracteres, si es 1 es 5x7, si es 0 es 5x10
Así, si quiere trabajar a 8 bits, 2 líneas y caracteres de 5x7, la palabra a enviar
ai LCD debe ser 00111000. Recuerde que el 1 que hay en la matriz es obligato­
rio, en este caso el bit 5, porque es el que permite al microcontrolador del LCD
ubicarse en la columna correspondiente. El dato en decimal es 56, este número
no cabe en ninguna de las otras filas de la matriz, por la diagonal de unos obli­
gatoria que está presente en ella.
Ahora viene el programa en lenguaje C para el primer ejercicio.
// Programa para escribir un mensaje fijo en un LCD de 2 líneas x 16 caracteres

// Se incluye librería xc.h y palabras de configuración de bits, todo esto generado


// automáticamente por el compilador XC8
^ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

#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 la velocidad del oscilador necesaria para el cálculo de los delay


U *****************************************************************************************

#define _XTAL_FREQ 4000000


H *****************************************************************************************

// Defino nombres propios para pines y puerto del PIC usados para RS, E y e! dato

#define LCD_RS RD6


#define LCD_EN RD7
#define LCDDATA PORTB
H *****************************************************************************************

// Declaro funciones para el LCD

void Icdjnit (void); // Inicialización del LCD


void setjcd (void); // Configuración del LCD
void lcd_puts(const char * s); // Cadenas de caracteres al LCD
void lcd_goto(unsigned char pos); // Direcciones en el LCD
void lcd_write(unsigned char c); // Escritura en el LCD
II*****************************************************************************************
Programa principal
II*****************************************************************************************
void main()
{
TRISD=0; // Puerto D como salidas para bits RS (RD6) y E (RD7)
TRISB=0; // Puerto B como salidas para enviar el dato al LCD
PORTB=0; // Limpio Puerto B
PORTD=0; // Limpio Puerto D
ANSEL=0; // Todos los pines digitales
ANSELH=0; // Todos los pines digitales
lcd_init(); // Llamo función de inicialización
while(1)
{
lcd_goto(0); // selecciono primera línea
lcd_puts(“ BIENVENIDOS “); // Mensaje para la primera línea
Icd_goto(0x40); // Selecciono segunda línea
lcd_puts(“ LIBRO PIC “); // Mensaje para la segunda línea
while(1) // Ciclo while para no hacer nada. Ya mostró el mensaje.
mm
154 LUIS GUILLERMO MONTOYA DÍAZ
Tn rn r
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE

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

LUIS GUILLERMO MONTOYA DÍAZ S 55 5


TlTIfl
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE

Todas las funciones utilizadas pueden formar un archivo de cabecera .h para


anexar al proyecto y dejar el programa principal más corto.
LCD1
LM016L

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

Figura 15. Simulación mensaje fijo

MENSAJE VARIABLE EN EL LCD


Es muy sencillo mostrar mensajes fijos en el LCD, pero la versatilidad de estos
dispositivos es visualizar datos variables. En el ejemplo siguiente se anexa un
conteo desde 0 hasta 999 al programa anterior y en un capítulo posterior se mo-
nitoreará la variable voltaje cambiando desde 0 hasta 5 voltios.
// Programa para mostrar un mensaje variable en un display LCD de 2 x 16
// Se incluye librería xc.h con registros y bits especiales del PIC
^|*****************************************************************************************
#include <xc.h>

// Palabras de configuración de bits generadas automáticamente por el compilador

__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);
y y * ** ** ** ** ** ** ** * ** ** *********************************************************************

56 LUIS GUILLERMO MONTOYA DÍAZ


PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE

// Definición de la velocidad del oscilador

#define _XTAL_FREQ 4000000


^ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

// Definición de nombres para pines y Puerto del PIC conectados al LCD


^*****************************************************************************************
#define LCD_RS RD6
#define LCD EN RD7
#define LCD DATA PORTB
ir
char centenas, decenas, unidades; // Defino variables char. Solo van de 0 a 9
int cont=0, aux=0; // Defino variables int. Van desde 0 hasta 999
void bin_bcd (void) // Función binario a BCD
{
aux=cont; // paso cont a aux para no dañar el proceso
centenas=0; // Inicializo variables en 0;
decenas=0;
unidades=0;
while(aux>=100) // Inicio restas sucesivas para Binario BCD
{
aux=aux-100;
centenas=centenas+1;
}
while(aux>=10)
{
aux=aux-10;
decenas=decenas+1;
}
unidades=aux;

void Icdjnit (void);


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);
JÜ H i
LUIS GUILLERMO MONTOYA DÍAZ = 5/
TU TU
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE

^ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

// 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();
}

void setjcd (void)


{
LCD_RS=0;
LCD_EN=1;
__delay_ms(2);
LCD_EN=0;
}
// Voy a una posición específica del LCD
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=0;
}
// Escribo una cadena de caracteres en ei LCD //
void icd_puts(const char * s)
{
LCDRS = 1;
JMMI
LUIS GUILLERMO MONTOYA DÍAZ I 591
TTrrrr
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE

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

Figura 16. Simulación de mensaje variable

lililí
60 LUIS GUILLERMO MONTOYA DÍAZ
nrm
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE

CAPITULO 6.

CONVERSIÓN ANÁLOGO A DIGITAL EN EL PIC 16F887

MíBSj ..ygg.

JO

0 = Left Justify
mm 1 = Right Justify
N v10
v
] ADRESH APRESL

GHS<3:0>-

Figura 17. Bloque ADC del PIC16F887

El módulo del conversor en la mayoría de los microcontroladores de 8 bits de


MICROCHIP es de 10 bits, por lo tanto, su resolución será:
Resolución = Vreferencia / # de cuantificaciones (1023)
El microcontrolador 16F887 tiene 14 canales análogos llamados ANO, AN1...
AN13 distribuidos en los puertos A, B y E, los registros que permiten la selección
individual de cada canal son ANSEL y ANSELH que vienen configurados de
fábrica para recibir señales análogas, es por eso que en los programas de los
capítulos anteriores siempre se configuraron con 0 cuando en ellos iba a inter­
venir algún pin de los puertos A, B ó E como l/O digital.

LUIS GUILLERMO MONTOYA DÍAZ | gf ¡


PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE

R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1


ANS7$> ANS0« A N S 5^ AHS4 AWS3 ANS2 ANS1 ÁNS0
m i bit 0

U-0 U-0 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1


— — | ANS13 ANS12 | ANS11 ANS1G ANS9 ¡ mt
bit? bit 0

Figura 18. Registros ANSEL YANSELH

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 .................................. ......... ........................

lO-MAJD Resyf Unlmpieoieoted: Read as *o*

(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

Figura 19. Alineación del resultado digital de la conversión A/D

Los registros ADCONO y ADCON1 son los de control de la conversión A/D, en


ellos se configura la velocidad del conversor, el canal elegido, la alineación del
resultado, el voltaje de referencia, el bit de inicio de la conversión que igualmente
sirve como bandera de indicación de la finalización del proceso.
Se plantea entonces un ejercicio básico para entender la conversión A/D y en los
capítulos siguientes se trabaja con una señal de voltaje visualizada en un LCD y
una señal de temperatura enviada serialmente al PC.
Para todos los ejemplos se utiliza la alimentación como voltaje de referencia, así
ÜJJULi
62 LUIS GUILLERMO MONTOYA DÍAZ
imnt
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE

las cosas, la resolución del conversor es:


Resolución = 5V /1023 = 0,00488 V/cuantificación
Señal análoga = Señal digital * resolución
Se utiliza un potenciómetro conectado en el pin E0 del microcontrolador, que
pertenece al canal análogo AN5. Lo primero es configurar los registros ANSEL
y TRISE así:
ANSEL = 0B00100000; // Canal AN5 análogo
TRISE = 0B00000001; // Bit 0 del puerto E como entrada
Ahora el registro ADCONO
RñftM) R/W4J RIW-0 RfflMl R W -G R W 4) RW ~i R/W-G
AO C St ADCSÜ CHS3 CHS2 CHS1 CUSÍ G OIDQNE ÁDON
b i? bil 0

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

bit 7-§ ÁDCS<1 :®>: áJD Cüiwer&ien Cl&tk Setect bife


00 = Foscl2
01 = Fdsc/8
10 = Fosc/32
11 = Frc (ctodc deiwed from a dedicated interna! osciilator = 500 kHz max)
b i 5-2 CHS<3:G>; Analog Chinee! Setect bits
0000 = ANO
0001= AH1
o o io =mi
0011 =AM3
0100 =AM4
0101 = km
o n o = Am
0111 =AN7
w m -m m
im i-A m
1010 = AN1Q
1011 = AN11
1100 = AN12
1101 = AN13
1110 " C¥pef
1111 = Fíxed Ref (0.6V fíxed voltage referente)
bi 1 GO/DONE: AID C m m m m Status bit
1 = AID conversión c^cte in progresa Seting this bitstarts an AID c m w m m cyde.
Thls bit Is automatieafíy cteared by hardware when íhe A/D conversión has completed.
0 = A/D contentan completed/hot lo progress
bi o mmm m e Enante w
1 = ADC is eiwfoied
o = ADC is disabled and consumes no operating oiirenl
Figura 20. Registro ADCONO

JÜJLULi
LUIS GUILLERMO MONTOYA DÍAZ | (¡3
TTTITT
PROGRAMACIÓN DE M1CROCONTROLADORES PIC+ZIGBEE

Para el ejercicio, si queremos velocidad Fosc/8, canal 5 y habilitar el módulo de


conversión, el ADCONO queda así:
ADCONO = 0B01010101;
Por último el ADCON1

R/W-0 m R/W-0 RflflH) U-0 U-0 U-0 U-0


mm — VCFG1 VCFGO — — — —
mi MIO

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

bi? AOFM: A/D Conversión Result Fomial Seled bit


l=Rightjustifled
o = Left justified
bit 6 Unímpiem&fited: Read as ‘0’
bits VCFG1; Vottage Reterence bit
1 = Vr e f- p h
o=Vss
bit4 VCFSi: Vtsltap Referente Mi
i=VR ff+pin
o=Voo
1)13-0 Unimplementesi; Read as 'o'
Figura 21. Registro ADCON1

Si el voltaje de referencia es el de alimentación y se quiere alinear el resultado a


la derecha, el registro ADCON1 queda así:
ADCON1 = 0B10000000;
Programa de conversión análogo a digital

// Se incluye archivo xc.h y las palabras de configuración de bits

#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

// Se define al velocidad del oscilador


//'*****************************************************************************************
#define XTAL FREQ 4000000
l i ­* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
li Programa principal
y y *****************************************************************************************

void main()

{
TRISE=0X01; // Bit 0 del puerto E como entrada para AN5

TRISB=0; // Puerto B como salida para resultado digital LSB en leds

TRISC=0; // Puerto C como salida para resultado digital MSB en leds

ADCONO=OX55; // Fosc/8, canal 5 y habilitación del módulo de conversión

ADCON 1=0X80; // Vref 5V y alineación del resultado a derecha

ANSEL=0X20; // Canal AN5 análogo, lo demás queda digital

ANSELH=0; // Todos los demás pines digitales

PORTB=0; // Limpio Puerto B

PORTC=0; // Limpio Puerto C

while(1)

{
GO=1; // Inicio el proceso de conversión

while(GO==1) // Mientras este bit este en uno está aún en el proceso

continué; // Si cambia a 0 terminó la conversión

PORTB=ADRESL; // Paso parte baja del resultado al puerto B

PORTC=ADRESH; // Paso parte alta del resultado al puerto C

__delay_ms(200); // Conversión cada 200 ms


MMM.
LUIS GUILLERMO MONTOYA DIAZ 65
rnnr
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE

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

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

RE2/AN7

LED-RED
D8
#V1
220 ik
LED-RED

D9
#
R9
♦LED-REÍ
220

D10

9
R10
220

Figura 22. Plano Electrónico

Como se puede ver en la simulación el resultado digital en los leds es


de 910, así confirmamos el valor de voltaje a la entrada m ultiplicando
por la resolución.

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 *****************************************************************************************

// Palabras de configuración de bits generadas automáticamente por el compilador

__CONFIG(FOSC_XT & WDTE_OFF & PWRTEJDFF & MCLRE_ON & CP_OFF


& CPDOFF & BOREN_ON & IESO_ON & FCMEN_ON & LVP_OFF);
__CONFIG(BOR4V_BOR40V & WRT_OFF);
J j* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

// Definición de la velocidad del oscilador


|^*****************************************************************************************
#define XTAL FREQ 4000000
^*****************************************************************************************
// Nombres a pines y puerto del PIC para el trabajo en el LCD

#defme LCD_RS RD6 // Llamo LCD_RS al pin RD6


#define LCD_EN RD7 // Llamo LCD_E al pin RD7
#define LCD_DATA PORTB // Llamo LCD_DATA al puerto B
^ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

// 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);
^ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

LUIS GUILLERMO MONTOYA DÍAZ | QJ ¡¡


PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE

// 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

LUIS GUILLERMO MONTOYA DÍAZ = gg


t t it t t
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE

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;
}

Figura 23. Simulación

JMML
70 | LUIS GUILLERMO MONTOYA DÍAZ
Tnnrr
PROGRAMACIÓN DE MiCROCONTROLADORES PIC+ZIGBEE

CAPÍTULO 8.

COMUNICACIÓN SERIAL A TRAVÉS DEL MÓDULO USART


A pesar de los tantos protocolos de com unicación existentes en la
actualidad, el protocolo de com unicación serial bajo la norma RS232
sigue estando vigente para muchas de las aplicaciones que requie­
ren de un envío o recepción de datos. Los dispositivos program ables
facilitan el trabajo porque ahora incluyen en su mayoría, un módulo
llam ado USART o a veces solo UART, debido a que la opción síncro­
na ha dejado de usarse por ser sólo Hall Dúplex y cada vez es más
necesario estar enviando y recibiendo datos al tiem po, esto se con­
sigue con la opción asincrona que permite el trabajo bidireccional
tam bién conocido como Full Dúplex.
El módulo UART particularmente en los PIC, sólo requiere que el dato
sea puesto en un registro de transmisión y listo. Las tramas ya están
calculadas por los registros de desplazamiento TSR para la transmisión
y RSR para la recepción y la velocidad está garantizada con la configu­
ración acertada del registro generador de baudios SPBRG.
Los registros asociados al proceso de transmisión y recepción con el módulo
UART del PIC 16F887 son:
TXREG: Registro donde se almacena el dato a enviar
RCREG: Registro donde se almacena el dato recibido
TXSTA: Registro de control de la transmisión
RCSTA: Registro de control de la recepción
SPBRG: Generador de baudios
Hablemos de TXSTA, RCSTA y SPBRG para entender bien el proceso.

JJiU jL
LUIS GUILLERMO MONTOYA DÍAZ | 7f ¡
T fU T T
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE

RAM RAAH3 RW-0 RAM RfW-G ram R-1 ¡mo


CSRC m txeM1> SYNC SENDB BRGH TRÜT TXiD
bi? taiQ

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

bi 7 CMC: Ciocfc Sotirce Siletí bit


áswctronoüs mode:
Dont o re
Smtímmm mode:
l = Master mofle {dock generated intemally from BRG)
0 = Slave moda {dock fforn externa! source)
bi i II»: 94* Transmi Enabla bi
1 = Sefects M i transmission
0= S iiitís 8-bi InnsiiisiiOR
bit 5 TXES: Transmi EnabiebilM
1= Transmi enabled
ú= Tnnsiiildisabtecl
bi 4 S¥MC: EUSART Mecfe Saltó Mi
1= Spefiror«ism§di
0= Aspefironous mode
bl 3 SENDB: Send Break Characier bi!
Asvnchfpnous modiei
i = Send Spic Srsai w next trarismíssiifi fdeired by hardware upe c§mptefen)
o = Sync Break transmissto completó
SvnchroiiQüs mode:
Don*! cara
bi 2 BRGH: High Bayd Rale Select bit
Asynchronous modei
1= Hpspeed
0= Lowspsed

Unuseti irt lis mode


bi 1 TRWT: Transíiii S fii Register Status bit
1= TSRempty
0 = TSR fulf
MiQ l i l i : NMit biof Transmtt Data
Can be address/data bit or a pañty bit

Figura 24. Registro de control de la transmisión TXSTA

Registro TXSTA

Para realizar una transmisión a 8 bits debemos tener en cuenta en


este registro, ei bit 5 TXEN = 1 para habilitar la transmisión, el bit 2
BRGH para calcular la palabra de configuración del registro generador
de baudios SPBRG así:
uuu,
i 72 i LUIS GUILLERMO MONTOYA DÍAZ
Trntr
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE

Si BRGH = 0 se tiene una constante K = 64 para desarrollar la fórmula, pero si


el bit BRGH = 1, se tiene una constante K = 16.

SPBRG = [Fose (Hz) / ( K * Velocidad en baudios)] - 1

Por ejemplo si desea realizar una comunicación a 9600 bps, se tiene un


oscilador de 20 Mhz y se configura el bit BRGH en 0. La paiabra a enviar
al registro SPBRG será:

SPBRG = [20000000 / (64*9600)] - 1 = 31.552 = 32

Generalmente, hay un error en la comunicación, debido a que el dato


a cargar en el SPBRG es un entero aproximado, entonces la velocidad
será un poco más o menos de lo deseado. El error para el ejemplo an­
terior es:

Error = [(Vel. Calculada - Vel. Deseada) / Vel. Deseada] *100

La velocidad deseada es 9600, pero la real calculada es:

Vel (bps) = [Fose (Hz) / (K*(SPBRG+1))] = [20000000 Hz / (64 * 32+1)] = 9469.7

Error = [(9469.7 - 9600) / 9600] * 100 = - 1.357%

Estos datos se pueden confirmar en las tablas que hay en las figuras 3 y
4 de este capítulo.

Por último se debe tener en cuenta la bandera de finalización de la


transmisión TRMT, la cual se pone en uno cuando el registro de des­
plazamiento de la transmisión TSR está vació indicando que se puede
enviar otro dato.

Para el primer ejercicio se trabaja con frecuencia de oscilación de 4


Mhz y con una velocidad de 9600 baudios, con el bit BRGH del registro
TXSTA en 1. Por lo tanto la palabra para cargar el SPBRG debe ser:

SPBRG = [4000000 / (16 * 9600)] - 1 = 25

Tenemos entonces 2 registros listos

TXSTA = 0X24; // Hablito transmisión y BRGH en 1

SPBRG = 25 ; // Velocidad 9600 bps


JUUULUL
LUIS GUILLERMO MONTOYA DÍAZ | J3
ttm f
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE

RMMD R/W-Q rew~G RW-0 raamj R-0 R-0 R-X


SPEN RX9 SREN CREN ADDEN FERR OERR RX9D
bit? bit 0

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

Mi 7 SPEN: Serial Port Enable bit


1 = Serial port enabfed {configures RX/DT and TX/CK pins as serial port pns)
0 ~ Serial port disabled (held io Reset)
bit 6 ÜXS: 9-bi Recewe Enable bit
1 = Selects M il receptiori
0 - Selects 8-brí recepílon
Di 5 SREN: Single Recete E m ite DI
AsvnchForioüs mode:
Dont tare
Svnchronous mode - Master:
1 - EnaMes single receive
0 » Usables single receive
T tis bit is cieared ater recepten is complete.
SyndgoiTOiis mode - Slave
Dont care
bit 4 CRBM: Centinuous Receive Enable Mi
Asynehronous mode:
i= Enabfes receiver
0= Disables receiver
SwitfiroftcMis TOder
1 = Enables continuüus receive until enable b i CREN is cleared (CREN overrides SREN)
0 = Dísabtes conlnuous receive
Mt 3 ADDEH: Atítíress Deletí Enable b i
A sw ic Ji c t o u s mocte 9-bit IR X 9 = i l :

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

S¥HC ~ 0¥B R fifi = 0t BRG1® - S


Fose = m o o o mm Fose -1 8,43 2 MHz ¥mc~ =11,0592 MHz Fose = 8.000 M H/
BAUD
RATE Actual %
SPBRG
Actual % SPBRG
Actual %■ SPBRG
Actual %
mmm
valué vafue waíye m ím
Rale Error Rafe Error Raí# Error Rafe Error
fcfecraalf fdecimal) (decimal) Idecimai)
300
1200 1221 1.73 255 1200 0.00 23S 12.00 0.00 143 1202 0.16 103
2400 2-404 0.16 129 2400 0 J0O 119 2409 0.00 71 2404 0.16 51
9600 9470 -0 6 32 9600 0.00 29 9660 OJO 17 «15 0.16 12
10417 10417 0.00 29 10288 -1.26 27 10165 -2.42 16 10417 o.so 11
19.21c 19.53K 1.73 15 19.20k 0.00 14 19.201 0.00 8 __ — _

5 » _ _ 57.6Q!k S i» 7 srm k 0.00 2 — __ _

ÍÍBM — — —- — _ _ _ — _ — _

SYNC - C\ BRGH - C. BRG16 = ú


mmm .
Fose « 4Mm mm FOSC - 3Ü Ü 4 « f e Fose - 2*000 MHz Fose « 1,000 MHz
RATE
Actual % SPBRG
Actual %
mmm Actyai % SPBRG Actual % SPBRG
R ite Error
¥«1*
Rale Error
m ím Rata Error
m ím Error
m i»
fíate
Ccfeciiiiafi (decimal! (tímmM) (decimal)
300 mm 0.16 207 300 0.00 191 300 0.16 tm 300 0.16 51
1206 1202 0.16 51 1200 0.00 47 1202 0.16 25 1202 0.16 12
24QG 2404 0.16 25 2400 0 00 23 2404 0.16 12 _ __ __
mm — — «00 0.00 5 _ — _ _ —
10417 10417 0.00 5 __ 10417 OCX) 2 __ __ _
19.21c — — 19.201c 0*00 2 — — — —

57.81 — — _ mmm o jo i — — __ — —

115.21c —
_ _
— — —
— — _ _

Figura 26. Tabla para configurar SPBRG con b it BRGH en 0

SYNC ~ 0, BRGH - 1, BRG16 = 0

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 — .

1041:7 10417 0.00 23 16473 0.53 21 10417 0.06 11 10417 0.06 5


19.2k 19.23k 6.16 12 1S.2lc 6.00 11 _ __ — _ _
5?,m — 57,601; 0.60 3 __ _ _ _

115.21? __
— — 115.214 6.60 1 — _ — _ __

Figura 27. Tabla para configurar SPBRG con bit BRGH en 1

LUIS GUILLERMO MONTOYA DÍAZ 75


PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE

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
^ * * * * * * * * * * * * * * * * * * * * * * * * * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

// Se incluye librería xc.h y palabras de configuración de bits


^*****************************************************************************************
#include <xc.h>
||***************** * ** ** * ** * ** * ** * ** ** * ** * ** * ** * ** ** * ** * ** * ** * ** ** * ** * ** * ** * ** ** * ** * ** * ** * *

__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);
|^************** * ** * ** ** * ** * ** * ** * ** ** * ** * ** * ** * ** ** * ** * ** * ** * ** ** * ** * ** * ** * ** ** * ** * ** * ** * *

// Definción de la velocidad del oscilador


^*****************************************************************************************
#define _XTAL_FREQ 4000000
||*****************************************************************************************
// Programa principal
y ^*****************************************************************************************

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

Figura 28. Simulación ejemplo 1.

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.

// Programa serial para envió mediante la instrucción printf al PC.


y y *****************************************************************************************

II Se incluyen las librerías necesarias


y y *****************************************************************************************

#include <xc.h>
#include <stdio.h>
y y *****************************************************************************************

// Palabras de configuración de bits generadas automáticamente por el software


y y *****************************************************************************************

__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);
y y *****************************************************************************************

// Definición de la velocidad del oscilador


y y *****************************************************************************************

#define _XTAL_FREQ 4000000


y y *****************************************************************************************

// Definición de variables y funciones


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 :|
ü

RDO ™ — - ............... ■ . ......


« |n

RD1 A.
RD2 Cordado? * fl . ■ ' ■' • '
Ccíñtador 1 • ' ■ . ' ■ - \ ;
1 i ni»

RD3
RD4 [ Contado? * 2 ' ■■■■■ _ .- ' . :.

RD5jP1B | Contador * 3 ' ' / , ■ , , ■ ■


RD8¿P1 C ¡Contador - 4 . ' .- : V •. ' . . ' ‘ .. '
[l

Figura 29. Simulación ejemplo 2

ÜJUi
| 78 E LUIS GUILLERMO MONTOYA DÍAZ
Tfffrrr
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE

Por último, en el ejemplo 3 vamos a utilizar la comunicación para monitorear una


variable análoga y enviarla al PC
// Programa de monitoreo de temperatura en el PC
^ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

// Se incluyen las librerías necesarias y las palabras de configuración de bits


^*****************************************************************************************
#include <xc.h>
#include <stdio.h>
__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);
^ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ^ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

// Definición de la velocidad del oscilador

#define _XTAL_FREQ 4000000

II Declaración de variables y funciones


|^*****************************************************************************************
ínt digital;
float temperatura;
void putch (unsigned char byte);
^*****************************************************************************************
// Programa principal

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

SPBRG=25; // Velocidad 9600 bps


RCSTA=0X80; II Habilitación del puerto serial del PIC
while(1)
{
GO=1; II Inicio la conversión AID
while(GO==1) II Mientras esté en uno continua la conversión
continué;
digital=(ADRESH*256)+ADRESL; // Unifico el valor digital del resultado
temperatura=((digitar0.488)-50); //Algoritmo para cálculo de la temperatura
printf(“\r La temperatura es:%2.2f\n”,temperatura); // Envío de la cadena de
// caracteres y la variable.
_delay_ms(200); // Cada 200 ms
}
}
void putch (unsigned char byte) // Función para el trabajo con printf
{
while(!TRMT) // Envío de cada byte de la cadena de
continué; // caracteres
TXREG=byte;
}

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-!

Figura 30. Simulación ejemplo 3

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,

RCO/ri OSO:-; 1-:w m sm a uw p p


Rcamosaflicw JÜSL Rcimos¡m>2
RAO/ANOAJLPW iJ/CI2WQ- RC
R1C
fl101S
2?P W
A«X
C3P>2
1 R
RC2 F5 A/CCP1
RC
C34JSS CK /D
S
C
AL RA2/AM2ÍVRERAímammu
JÜ X
RA1/AM 1¿O 2I
N 1 - R C3/SCK /
S O, D K F»/CVREFKZffl*
R
RA2/AM 2í
V REF '
C V REF/
C 3
W+ RC 4JS
D HS DA RCSiSOO

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

Figura 31. Simulación Recepción por interrupción

LUIS GUILLERMO MONTOYA DÍAZ


PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE

En la simulación superior se puede ver que la lectura del puerto A es 3, ya que


los pulsadores ubicados en RAO y RA1 no están presionados y la polarización
de estos es a 5V, por lo tanto se leen unos, el pulsador RA2 está presionado,
es decir, que entra un 0. La lectura es 3, es menor a 4 y por eso se activa RA1.
En la simulación inferior se puede ver que la lectura del puerto A es 7, ya que
los 3 pulsadores no están presionados y la polarización de estos es a 5V, por lo
tanto se leen unos. La lectura es 7, es mayor a 4 y por eso se activa RAO.
Mientras no haya interrupción por recepción del dato, el PIC permanece activan­
do y desactivando la salida RA2.
Programa de transmisión
^ |* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

// Se incluye la librería xc.h con bits y registros especiales del micro


^*****************************************************************************************

#include <xc.h>

// Palabras de configuración de bits


^*****************************************************************************************

// 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

LUIS GUILLERMO MONTOYA DÍAZ


PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE

// Definición de la velocidad del oscilador


yy*****************************************************************************************

#define XTAL FREQ 4000000


^ *****************************************************************************************

// 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)

aux=PORTA; // Leo el puerto A y lo llevo al registro aux


TXREG=aux; // Llevo el dato al registro de transmisión
while(TRMT==0) // Espero a que termine el envío del dato
continué; // Para continuar
__delay_ms(5000); // Retardo de 5 segundos
}
iliül
83
IflUT

LUIS GUILLERMO MONTOYA DÍAZ =


Trmnr
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE

}
^ |* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

Programa de recepción
y y *****************************************************************************************

// Se incluye librería con bits y registros especiales del micro


|^ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

#include <xc.h>

// Palabras de configuración de bits

// 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

// Definición de la velocidad del oscilador


y y *****************************************************************************************

#define _XTAL_FREQ 4000000

$um

84 LUIS GUILLERMO MONTOYA DÍAZ


mm
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE

// 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)

RA2=~RA2; // Mientras no hay interrupción, hay intermitencia en


__delay_ms(200); // salida RA2 cada 200 ms

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
.. . .,

i 86 I LUIS GUILLERMO MONTOYA DÍAZ


ITTfTT
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE

CAPÍTULO 10.

MODULACIÓN DE ANCHO DE PULSO - PWM


La modulación de ancho de pulso es una técnica que suministra poten­
cia a una carga cambiando rápidamente entre los estados ON y OFF,
es decir, carga completa y cero carga. La señal PWM se asemeja a
una onda cuadrada donde la porción alta de la señal es considerada el
estado ON y la porción baja el estado OFF. La porción alta también co­
nocida como ancho de pulso puede variar en tiempo y es definida por
pasos. Un alto número de pasos extiende el ancho de pulso y aplica
mayor potencia a la carga, disminuir el número de pasos implica acor­
tar el ancho de pulso y por lo tanto disminuir la potencia a la carga. El
período PWM es definido como la duración de un ciclo completo o la
cantidad total de tiempo combinada en alto y bajo.

La resolución PWM define el máximo número de pasos que pueden es­


tar presentes en un período PWM. Una resolución alta permite un con­
trol más preciso del tiempo del ancho de pulso y por ende de la potencia
aplicada a la carga.

El término Duty Oyele determina la proporción del tiempo en ON y OFF


y es expresado en porcentaje, donde 0% es estado OFF y 100% es es­
tado ON; por ejemplo, si tenemos el 40% de Duty Oyele, significa que
el ancho de pulso (Estado ON) es del 40% de la onda y el 60% es el
estado OFF ó bajo de la onda. En otras palabras, un Duty Oyele bajo
determina menos potencia aplicada a la carga y un Duty Oyele alto
significa más potencia aplicada a la carga.

La técnica PWM es muy utilizada para el control de motores, control


de iluminación, entre otros.

MODULACIÓN DE ANCHO DE PULSO EN LOS


MICROCONTROLADORES PIC
Se aprovecha la presencia en el mercado de los nuevos microcontrola-
dores PIC de MICROCHIP para elegir una de estas referencias nuevas,
llenas de grandes características y practicar con este tema.

Para este caso se a trabaja con un PIO de 18 pines referencia


16F1827 que posee entre otras cosas 4 módulos CCP, quiere decir
que con cada módulo se puede trabajar Comparación, Captura o
PWM. En este caso se dedica al tema de modulación de ancho de
pulso en el primer módulo, es decir el C C P1, el cual se puede tra ­
bajar a 10 bits.

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

RB6/AN5,CPS5íT1CKlíT10Sl/P1€f1teCP2l l '! i,P2A!,%CSPCLK


RB2/AN10/CPS10¡MDMINíTX!l teKSl >/RXÍ, t o T i ’ VSDA2a te D I2 !2te o O 1 í| > - Ca 11 - RB5,TO7/CPS7/P1B,T'XÍ|t a ! 1¡/SCU'2teCK2SíSSTÍ1¡
RBS/AW/CPSa'MDOUT/CCPlfi/PIAfl! - 10 ■ RB4/AN8/CPS&SCL MSCK1/MDCIN2

Figura 32, Diagrama de pines del PIC16F1827

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 .

Figura 33. Diagramas de bloques de PWM en los PIC

í 88 I LUIS G U ILLER M O MONTOYA DÍAZ


lililí
PROGRAMACIÓN DE M1CROCONTROLADORES PIC+ZIGBEE

El período, el Duty Cycle y la resolución son controladas por los siguientes


registros:
PRx: Registro de 8 bits en el que se almacena el período deseado para la
modulación
TxCON: Control para los íimer 2, 4 y 6
R E G IS T E R 21-1: T X C O N : TIM E R 2 /TIM E R 4 /TIM E R 6 C O N T R O L R E G iS T E R

U-0 R/W-Offl R/W-0/0 R/W-0/0 R/W-0/0 R/W-O/Q R/W-0/0 R/W-0/0


— TOUTPS<3:0> TMRxON TxCKPS<1:0>
bit 7 bit 0

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

bit? Unlmplemented: Read as


bit 6-3 TO UTPS<3:0>: TimerOutput Postscaler Select bits
0000 = 1:1 Postscaler
0001 = 1:2 Postscaler
0010 = 1:3 Postscaler
0011 = 1:4 Postscaler
0100 = 1:5 Postscaler
0101 = 1:6 Postscaler
0110 =1:7 Postscaler
0111 = 1:8 Postscaler
1000 = 1:9 Postscaler
1001 = 1:10 Postscaler
1010 = 1:11 Postscaler
1011 = 1:12 Postscaler
1100 = 1:13 Postscaler
1101 = 1:14 Postscaler
1110 = 1:15 Postscaler
1111 = 1:16 Postscaler
bit 2 TM RxON: Timerx On bit
I = Timerx is on
0 = Timerx is o f
bit 1-0 T x C K P S d :0>: Hmer2-typs Clock Presea le Select bits
00 = Prescaler is 1
01 = Prescaler is 4
10 = Prescaler is 16
I I = Prescaler is 64
Figura 34. Registro TX C O N

CCPRxL: Registro donde se almacenan los 8 bits más significativos para


el ancho de pulso que se desea.

CCPxCON: Registro que define el trabajo del módulo CCP, si es


PWM, los 4 bits menos significativos son los que tienen que ver con
él. Los bits 4 y 5 son los 2 bits menos significativos para com pletar
los 10 bits del ancho de pulso.
mm
LUIS GUILLERMO MONTOYA DIAZ 89
Trmr
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE

REGfSTER 23-1: CCPxCON: CCPx CONTROL REGISTER


R/W-ffl» R/W-0/0 R/W-0/0 Rm -M R/W-0/0 R/vV-Q/D RW -0/0 R/W-WO
PxM<1.U><1! DCxB<1i)> CCPxM<3:0>
bit 7 bit 0

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

b&7-6 PxM<1:0>: Enfianced PWM Outpuf Configuration bitsCJ


Cacture mode:
Unused
Goma r e mode;
Unused
jfccPxM<3a> = oo.a i, ic;
xx = PxA assigned as Capture/Compare input; PxB, PxC, PxD assigrted as port pins
tfC C P *M <V7>= 11-
00 = Single output: PxA modufated; PxB, PxC, PxD assigned as port pire
01 = Fuil-Bridge auiput fbrward; PxD modutated; PxA active; PxB, PxC imaCSve
10 = Haif-Bridge output; PxA, PxB moduiaíed witi dead-band sonto!; PxC, PxD assigned as port pins
11 = Full-Brktge output reverse; PxB nioduteted; PxC active; PxA, PxD hacfive
bit 5 4 DC*B<1:0>: PWM Duty Cycte Least Significant bits
Capture mode:
Unused
Compare mode:
Unused
P W M nw<fe:
These bits are (he two LSbs of the PWM duty eycle. The eight MSbs are feund in CCPRxL.
bit 3-0 CCPxM<3:0>: ECCPx Mode Select bKs
0000 = Capture/Compare/PWM of {resets ECCPx module)
0001= Reserved
OOIQ = Compare mode: toggle output on match
0011= Reserved
0100 = Capture mode: every feJBng edge
0101 = Capture mode: every rising edge
O lla = Capture mode: every 4#i rising edge
0111 = Capture mode: every 16i» rising edge
1000 = Compare mode: ¡nitiaiize ECCPx pin low; set output on compare match (set CCPxIF)
1001 = Compare mode: iniSaltze ECCPx pin high; etesr output on compare match (set CCPxIF)
1010 = Compare mode: generate software interrupt oniy; ECCPx pin reverts to 1/0 State
1011 = Compare mode: SpeciaS Event Trigger (ECCPx reseis TMR1 or TMR3, sets CCPxIF bit, ECCP2 trigger
also starts A/D conversión if AID module is enabied)^
CCP Modules orclv:
llz z = PWM mode
ECCP Modules oniy:
UOS = PWM mode: PxA, PxC active-higb; PxS, PxD acüve-high
1101 = PWM mode: PxA, PxC active-high; PxB, PxD active-tas
1110 = PWM mode; PxA, PxC active-low; PxB, PxD active-htgti
1111 = PWM mode: PxA, PxC acBve-low; PxB, PxD actíve-tow
Note 1: These bits are not impiemented on CCP<4:3>.

Figura 35. Registro CCPXCON


ÜUU
= 90 = LUIS GUILLERMO MONTOYA DÍAZ
T rm r
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE

Obviamente, el correspondiente registro TRISB debe ser limpiado en RBO ó


RB3, según la salida a utilizar en la modulación.
Veamos un ejemplo para explicar de una mejor manera la técnica PWM
y y *****************************************************************************************

// Se incluye archivo xc.h con registros y bits especiales del micro


Iy * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
#include <xc.h>
y y *****************************************************************************************

// Palabras de configuración de bits generadas automáticamente por el compilador


y y *****************************************************************************************

// 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 *****************************************************************************************

#define _XTAL_FREQ 20000000


jy * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
// Declaración de variables
jj-k-k-k * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

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

// 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
CCPTMRS=0; // Bits 0 y 1 para elegir el timer para CCP1.
TMR2=0;
CCPR1L= 128; //Ancho de pulso 8 MSB
CCP1 CON=OXOC; // Bits 4 y 5 LSB para ancho de pulso y bits 0,1,2,3
//11 xx = para modo PWM
TMR2IF=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;//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

92 = LUIS GUILLERMO MONTOYA DÍAZ


TrrnT
PROGRAMACIÓN DE MICROCONTROLADORES P iC + Z IG B E E

bits 4 y 5 del registro CCP1CON, es decir un ancho de pulso de 512, además de


una preescala para el TIMER2 de 16 configurada en el registro T2CON. Así las
cosas, el cálculo de cada uno de los parámetros queda así:
1 - Período PWM = (255 + 1) * 4 * i/Fose * 16 = 2 5 6 * 4 * 0,05us * 16 = 819us
2 - Ancho de pulso = 512* 0,05us * 16 = 410us
3 - Duty eyele = ( 512 / 1024 ) * 100 = 50% ON y 50% OFF
4 - Resolución = log (1024) / log(2)-= 10 bits
5 - Frecuencia PWM = 1 /819us = 0,00122 MHZ = 1,22 KHZ
La base de tiempo para la modulación por CCP1 será el Timer2, es decir, el TMR2
se activa y empieza a compararse con el valor de ancho de pulso configurado,
el nivel de salida en el pin CCP1 inicia en alto, cuando son iguales el TMR2 y
el ancho de pulso configurado, la salida del CCP1 pasa a nivel bajo, ei TMR2
sigue incrementándose, pero esta vez se compara con el período configurado,
cuando son iguales, ei TMR2 se hace 0 y la salida del CCP1 vuelve a nivel alto
para iniciar un nuevo ciclo.
Los valores se pueden confirmar en la simulación mostrada en la figura siguiente:

COUNTER TIMER
VIRTUAL TERMINAL
SPI DEBUGGER
12C DEBUGGER
SíGNAL 6ENERAT0F
PATTERN GENERAL
DCV01TMETER
DCAMMETER
ACVCLTMETER
ACAMMETER

Figura 36. Simulación

LUIS GUILLERMO MONTOYA DÍAZ | 9 3


PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE

Si se quiere ir incrementando el ancho de pulso poco a poco, simplemente se


inicia el registro que tiene que ver con el ancho de pulso, es decir el CCPR1L
en 0 y se va incrementando en uno en el programa principal. El código para ese
programa quedaría así:
void main ()

{
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

TECLADO CAPACITIVO M_TOUCH EN EL PIC 16F1827


Los teclados capacitivos permiten ai usuario interactuar con un circuito electróni­
co sin necesidad de un dispositivo mecánico o electromecánico como: pulsado­
res, membranas, etc. Con la técnica m_touch utilizada en ¡os microcontroladores
de MICROCHIP, solo se necesita un pad de cobre, ojalá del tamaño del toque
del dedo, en el circuito impreso conectado a través de la respectiva línea de
cobre, al pin elegido en el micro como canal de sensado CPSX.

PIC

Fig. 37 Técnica mjtouch

En este ejercicio se explica la técnica m_touch en un microcontrolador 16F1827,


que tiene 12 pines para el trabajo de teclados capacitivos; es decir, se puede
implementar un teclado de hasta 12 entradas. Cada pin tiene el nombre CPSX,
como se puede ver en el diagrama de pines CPSO hasta CPS4 están ubicados
en los pines RAO a RA4 y los restantes CPS5 hasta CPS11, están ubicados en
los pines del puerto B, con excepción de RBO.
RA2/AN2/CPS2ÍC12IN2-/C12IN+/VREF-/DACOUT RA1/AN1/CPS1/C12IN1-/SS2I2)

RA3/AN3/CPS3/C121N3-/C1IN+/VREF+/C1 OUT/CCPS^/SRQ RA0ÍANÜ/CPS0;C12IN0-/SOO2(2)

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

RB1/AN11/CPS11ÍRX*%)T<%DA1/SD11 RB6/AN5/CPS5/T1CKIfnOSI/P1C(,i/CCP2íu >/P2A(1%CSPCLK

RB2/AN10/CPS10/MDMIN/TX11)/CK<I >/RXÍ1I/DTI1)/SDA2B/SDI#I/SD01Í1) msiAmicpsimBnx^ic^isc^iscK^Issi1


-1'!
RB3/AN9/CPS9/MIX>UT/CCP1(1!/P1A11! RB4/AN8/CPS8/SCL1/SCK1/MDCIN2

Fig. 38 Pines CPSX de sensado capacitivo en el PIC 16F1827

La técnica m_touch plantea simplemente un cambio de frecuencia detectado en


un canal de entrada CPSX, debido a la cercanía de una carga capacitiva, que en
jJUÜi
LUIS GUILLERMO MONTOYA DÍAZ § gg :
TTHH
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE

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

R jw -rn U-0 U-0 U-0 R/W-0/0 R/W-0/0 R-0/0 R/W-0/0


CPSON ■: —■ — — CPSRNG1 CPSRNGO CPSOUT TOXCS
bit 7 bit 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

bit 7 CPSON: Capacitive Sensing Module Enabie bit


i = Capacitive sensing module tsenabted
0 = Capacitive sensing module is dísabled
bit 6-4 Unimplemented: Read as '0'
bit 3-2 CPSRNG<1 :Q>: Capacitive Sensing Gsciliator Range bits
00 = Osa Bator is off
01 = Qsd Bator is in iow range ChargeASscharge current is nominally 0.1 pA„
10 = Osd Bator is in médium range. Charge/discharge current is nominally 12 pA.
11 = Osdllator is in high range. Charge/discharge current is nominally 18 |iA.
bit 1 CPSOUT: Capacitive Sensing Oscillator Status bit
1 = Oscillator is sourdng current (Current flowing out the pin)
0 = Oscillator is sinking current (Current flowing into the pin)
bit 0 TOXCS: TimerO Externa! Clock Source Select bit
tf TMROCS = 1
The TOXCS bit Controls wfiich dock external to the core/Iimeifl module supplies TimerO:
1 = TimerO dock source is the capacitive sensing oscillator
o = TimerO clock so urce ¡s the TOCKí pin
¡f TMROCS = 0
TimerO dock source is controlled bythe core/TimerO module and is Fosc/4
Fig. 39 Registro de control CPSCONO
,HiH!

96 Í LUIS GUILLERMO MONTOYA DÍAZ


1TTTTT
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE

El bit 7 h a b ilita el tra b a jo con el m ódulo de sensado c a p a citivo ,


los bits 2 y 3 le dan rango a éste e ig u alm en te perm iten c o n fig u ­
rarle la co rrie n te de carga y descarg a que tien e com o p ropó sito
m a xim izar el núm ero de cue nta s de un tim e r para una base de
tiem po fija o m a xim izar el conteo d ife re n c ia l en un tim e r durante
un cam bio de fre cu e n cia y por últim o el bit 0 decide la fu e n te de
reloj para e! TMRO.
Para el programa planteado el registro CPSCONO queda así:
CPSCONO = 0X8C /* Habilitado con alto rango, máxima corriente y
con Fosc/4 como fuente de reloj para el TMRO que será quien lleve la
base de tiempo fija*/
La base de tiempo fija es necesaria para medir la frecuencia del oscila­
dor de sensado capacitivo, en este caso se elige el TMRO para este tra­
bajo. El timer elegido para la base de tiempo fija no puede ser el mismo
con el que se detecte la frecuencia de! oscilador de sensado capacitivo,
se elige entonces para esta labor el TMR1 configurando los bits respec­
tivos en el registro T 1CON.
La idea es contar los pulsos generados por ei oscilador de sensado ca­
pacitivo cuando no existe ninguna carga capacitiva en el pad de cobre,
durante la base de tiempo fija, esa lectura es llamada frecuencia nomi­
nal, y medir esos mismos pulsos, cüando existe una carga capacitiva
adicional en el pad de cobre, es decir, cuando hay un dedo tocando el
pad, esa lectura es llamada frecuencia reducida.
Es ideal colocar un umbral entre las dos frecuencias, así, se puede com­
parar la frecuencia detectada en el canal CPSX con ese umbral y decidir si
hay tecla presionada o no.
Para la aplicación planteada se necesita lo siguiente:
C onfigurar el registro ANSELA con el bit 0 en 1, debido a que se sen-
sa allí una entrada análoga proveniente del pad de cobre y obvia­
mente, el respectivo bit del registro TRISA para dejarlo configurado
como entrada
ANSELA = 0X01; // Canal capacitivo CPSO en pin RAO
TRISA = 0X01; // Pin RAO configurado como entrada
Adicionalmente, se requiere el registro CPSCON1 (Fig. 4) que es el que
decide el canal CPSX a escanear, como en este programa solo se utiliza
el canal CPSO, de una vez, se deja así:
CPSCON1 = 0; // Selección del canal CPSO para detectar tecla presionada

JjLUJLL
LUIS GUILLERMO MONTOYA DÍAZ I QJ
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE

REGiSTER 26-2: CPSC0N1: CAPACITIVE SENSING CONTROL REGISTER 1


U-0 U-0 U-0 U-0 R/W-0/0 R/W-0/0 R/W-0/0 R/W-0/0
— — — — C PSCH3 CPS C H 2 CPSCH1 CPSCHQ
bit 7 bit 0

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

bit 7 4 Unimpfemeníed: Read as *0'


bit 3-0 CFSCH<3:0>: Capacitive Sensing Channel Seled bits
If C P S Q N = 0:
These bits are ignored. No channel is selected.
If CPSQN= 1:
0000= channel 0, (CPSQ)
0 0 01 = channel 1, (CPS1)
0 0 10 = channel 2, (CPS2)
0 0 11= channel 3, (CPS3)
01 00 = channel 4, (CPS4)
0 10 1= channel 5, (CPS5)
ouo= channel 6, (CPS6)
0 1 1 1 = channel 7 , (CPS7)
10 00= channel 8, (CPS8)
10 0 1= channel 9, (CPS9)
10 10 = channel 10, (CPS10)
10 11 = channel 11, (CPS11)
noo= Reserved. Do noí use.
110 1= Reserved. Do not use.
m o= Reserved. Do not use.
n ii= Reserved. Do not use.
Fig. 40 Registro de selección de canal capacitivo CPSCON1

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.

Se debe recordar resetear el TMR1 y la bandera de disparo de control, todo lo


anterior se encuentra en los registros T1CON que es quien controla al TMR1 y el
T1GCON que controla el disparo de retención del TMR1 y su asociación a otro
timer, quedan así:

T1CON = 0XC5; /* TMR1 Asociado al módulo de sensado capacitivo, con prees-


cala 1:1, no asociado al reloj de fuente externa y activado */

98 Í LUIS GUILLERMO MONTOYA DÍAZ


PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE

R EG ISTER 20-1; T1CON: TIMER1 C O N TRO L REGISTER

WW-O/u RA/V-0/u R/W-0/u R/W-0/u RW-O/u RW-0/u U-0 RM-0/u


TMR1CS<1:0> T1CKPS<1:0> T1 OSCEN T1SYNC ~ TMR10M
bit 7 bit 0

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

bit 7-6 TMR1CS<1:0>: Tímerl Clock Source Select bits


11 =Timer1 dock source is Capacitive Sensing Osdiiator (CAPOSC)
10 = Timerl dock source is pin oroscillator:
If T1QSCEN = 0:
Externa! dock from T1CK1 pin ton the risinq edge)
IfT t OSCEN = 1:
Cfystal osdiiator on T 10SI/T1 OSO pins
o í = Tímerl dock source is system dock (Fose)
00=Timer1 ctock source is instruction dock (Fosc/4)
bit 5 4 T1 CKPS<1:0>: Timerl Input Clock Prescale Seled bits
11 = 1:8 Prescale valué
10 = 1:4 Prescale valué
01 = 1:2 Prescale valué
00 = 1:1 Prescale valué
bit 3 TI OSCEN: LP Osdiiator Enable Control bit
1= Dedícated Tímerl osdiiator circuit enabled
0 = DecRcated Tímerl osdiiator drcuít disabied
bit 2 T1SYNC: Timerl Extema] Clock Input Synchronization Control bit
TMR1CS<1:0> = IX
1 = Donot synchronize extemal dock input
o = Synchronize extemal dock input witti system dock (Fose)

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

Los bits 6 y 7 en 11 asocian el TMR1 con el m ódulo de sensado capacitivo, los


bits 4 y 5 perm iten la configuración de la preescala, el bit 2 no perm ite que se
sincronice con una fuente de reloj externa, ya que debe estar sincronizado con
los pulsos del m ódulo de sensado capacitivo, por últim o el bit 0 en 1 perm ite su
activación.

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

R E G IS TE R 20-2: T 1G C O N : TIM ER 1 G ATE C O N TR O L R EG IS TE R

R/W-0/u R/W-O/u RW-Q/u R/W-O/u RAWHC-O/u R-xJx R/W-0/u R/W-0/u


TMR1GE T1GPOL T1GTM T1GSPM T1GGO/ T1GVAL T1GSS<1 :Q>
DONE
b it? bit 0

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

bit 7 TMR1GE: Tim erl Gate Enable bit


If TMR1QN - O:
This bit is ignored
If TM R1QN = 1:
i = Ttmerl countirtg is controlled by the Timerl gate function
0 = Timert counts regardiess of Tim erl gate function
bit 6 Tí GPOL: Tim erl Gate Polaiity bit
1 = Timeri gate is active-high (Timerl counts when gate is hígh)
0 = Tim erl gate is acfive-few (Tim erl counts when gate is iow)
bit 5 T1GTM: Tim erl Gate Toggle Mode bit
1 = Ttmerl Gate Toggle mode ¡s enabted
0 = Timerl Gate Toggle mode is disabted and toggle flip flop is deared
Timerl gate flip-flop toggles on every rísing edge.
bit 4 T1GSPM: Timerl Gate Single-Pulse Mode bit
1= Tim erl gate Single-Pulse mode is enabted and is controfling Ttmerl gate
0 = Tim erl gate Single-Pulse mode is disabled
bit 3 TtGGO/DONE: Timerl Gate Single-Pulse Acquisition Status bit
1 = Timerl gate single-pulse acquisition is reacfy, waiting foran edge
o = Timerl gate single-pulse acquisition has completed or has not been started
bit 2 T1GVAL: Timerl Gate Current State bit
Indícales the current State of the Tim erl gate that could be provided to TM R1HTM R1L
Unaffectedby Timerl Gate Enable (TMR1GE).
bit 1-0 T1GSS<1:0>: Timerl Gate Source Seiect bits
00 = Ttmerl Gate pin
o í = TtmerO overflow output
10 = Comparator 1 optkmally synchronized output (SYNCC1QUT)
11 = Comparator 2 opfionalíy synchronized output (SY N C C 2Q U T)
Fig. 42 Registro de control disparo del TMR1 T1GCON

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

El programa consiste inicialmente en configurar todos los registros que acaba­


mos de ver, en la función principal e inicializar el TMR1, luego se entra a una
ciclo while infinito que está siempre preguntando si hay tecla presionada o no
para decidir si activa la salida programada. Cada que hay una interrupción por
desbordamiento del TMRO, el micro va a la rutina de interrupción, donde inicial­
mente, se limpia la bandera de interrupción TOIF y luego se verifica que la ban­
dera de disparo del TMR1, es decir, TMR1GIF se haya puesto en 1, eso quiere
decir que el valor del TMR1 está retenido listo para leerse y compararse con el
umbral y así decidir si hay tecla presionada o no. Por último, se resetea el TMR1
y retorna al programa principa! a activar o no ¡a salida.
Si se desea escanear varias teclas, cada canal debe ser configurado en el re­
gistro CPSCON1; además, se puede mejorar el software de control sacando
promedios de las lecturas de frecuencia y mejorando la sensibilidad.

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

Fig. 43 Arreglo electrónico

Programa en lenguaje C

// PIC16F1827 Configuration Bit Settings


j^ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
II Se incluye librería con bits y registros especiales del PIC
^y *****************************************************************************************

#include <xc.h>
y |* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

// Palabras de configuración de bits generadas automáticamente por el compilador


*****************************************************************************************

LUIS GUILLERMO MONTOYA DÍAZ


PROGRAMACIÓN DE MICROCONTROLADORES PiC+ZIGBEE

// 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

// Defino velocidad del oscilador

#define _XTAL_FREQ 16000000

// Declaración de variables y funciones

int umbral=1500; // Defino umbral en 1500.


int lectura; // Registro para leer el TMR1. En simulación dio 1800
// Sin carga capacitiva, con carga dió 1230
void reset_tm1(void); // Función de reset para el TMR1

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

LUIS GUILLERMO MONTOYA DÍAZ 1 f Q;


PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE

}
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

104 LUIS GUILLERMO MONTOYA DÍAZ


trntr
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE

CAPITULO 12

LAS TRAMAS API EN EL PROTOCOLO ZIGBEE


La ALLIANCE es una organización que asocia a las grandes empresas dei mun­
do que producen instrumentación industrial y de medida como: SIEMENS, HO-
NEYWELL; empresas productoras de circuitos integrados y sistemas embebidos
como: MICROCHIP, THOMSON, TEXAS INSTRUMENTS, ANALOG DEVICES
y DIGI y, finalmente, empresas fabricantes de equipos de audio y video como
LG, SONY, PANASONIC, entre otros.

En total, son más de 300 empresas pertenecientes a la ALLIANCE y que tienen


por objetivo el desarrollo de un protocolo de comunicaciones inalámbricas de
bajo consumo, baja tasa de transferencia de datos y alcances importantes, para
aplicarlo a sus productos.

En nuestro caso nos referiremos a DIGI (Representada por SUCONEL S.A en


Colombia) que es una de las empresas de la ALLIANCE que más ha avanzado
en el desarrollo de productos con protocolo ZIGBEE, conocidos como XBEE.

Los XBEE se pueden comunicar en forma inalámbrica mediante comandos AT


o tramas API, las segundas son las que permiten el trabajo óptimo de redes con
los dispositivos XBEE serie 2 de DiGI.

Fig. 44 Módulos XBEE de Digi

Los protocolos de redes utilizan generalmente, en la capa de enlace de datos, el


encapsulamiento de la información en tramas. Cada protocolo tiene estandariza­
das las diferentes partes de esas tramas; por ejemplo, el protocolo TCP/IP divide
sus tramas en un preámbulo de 7 bytes, un deiimitador de trama de 1 byte, las
direcciones físicas (MAC) de destino y origen de 6 bytes cada una, la longitud de
la trama de 2 bytes, la información que puede estar entre 46 y 1500 bytes y por
último, utiliza 4 bytes para el algoritmo de verificación de la recepción completa
de la información.

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

LUIS GUILLERMO MONTOYA DÍAZ E 105™


TTTTTr
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE

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

Fig. 45 D iferen tes tipos de tram as A PI en el p rotocolo ZIG BEE

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

Modero Para meter Prcfife Remóte Configuraban.


PC Settings j R angeTest; Terminal Modem Configuraron j
Modem Pararneter and Firmware Pararneter View
Read ! Wrile I Restore Clear Screen
r Always Update Firmware Show Defaults

Modem: XBEE Fun _ _ _ _ _


XB24ZB JT~1 ¡ZIGBEE COORDINATOR API
E h l l l Networking
Q [0] ID - PAN ID
Q (1FFE) SC - Sean Channels
[3) SD - Sean Duration
¡Sj (0] ZS - ZigBee Stack Profile
FF) NJ - Node Join Time
613B58CB4D 353FCA) 0P ■Dperating PAN ID
E3 (4935) OI • Operating 16-bit PAN ID
15) CH - Operating Channel
er or Remalning Children
ÉH1S Addressing
fej (403B0C70) SL - Serial Number Low
0 (fl) MV- 16-bit Network Áddress
¡¿3 (0) DH - Destination Address High
0 l'FFFF) DL - Destination Address Low
El (SUCONEL) NI - Node Identifier

Fig. 46 Datos del Coordinador

Podemos observar que el Coordinador eligió el canal 15 como el más limpio;


además, las identificaciones de red escogidas son: (Ver recuadro superior)
Operation 16-bit PAN ID = 4995
Operation PAN ID 64 bit = 613B58CB4D353F0A

LUIS GUILLERMO MONTOYA DlAZ


PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE

El recuadro inferior muestra la dirección de 64 bits del módulo dividida en par­


te alta SH y parte baja SL, esto a su vez representa el número de serie que lo
identifica como único a nivel del mundo, es decir que no existe otro módulo con
esa identificación. Podemos hacer la analogía con la dirección MAC dada a las
tarjetas de red (NIC) por la IEEE.
El paso siguiente es configurar otro dispositivo Router o End Device AT o API con la
dirección destino del Coordinador, las salidas y/o entradas digitales y las entradas aná­
logas que queremos monitoreary un tiempo de muestreo. Al configurar esto, inmediata­
mente estaremos recibiendo la primera trama API en el coordinador.

M cdem P a ra m e te r P ro file R e m ó te C o n fig u ra tio n ... V e rsio n s...


PC Settings | R a n g e T e s tj Terminal Modem Configuration i
Modem Parameter and Firmware Parameter View- F'rofiie Versions
Read 1 Write J Restore j Clear S creen Save Download new I
Always Update Firmware Show Defaults Load versions... j

Modem: XBEE-PRQ Funetion Set _ V ersiori


[XBP24-ZB fzÍGBEE ROUTER AT _ £ j j 228C \z¡
E h @ l N etworking
S(0) ID - PAN ID
|3
(1FFE) SC - Sean Chanriels
B(3) SD - Sean Duration
H(0) ZS - ZigBee Stack Profile
0(FF'J NJ - Node Join Time
|l
(0) NW - NetWork. W atchdog Tirneout
¡S
(1) JV - Channel Verification
... Efm jN - Join Notification
U (SI 3B58CB4D353FQA) 0P - Operating PAN ID
S (4395) 01 - Operating 16-bit PAN ID
[15] CH - OperatingChannel
(C) NC - Number of Remaining Children
É - Q l Addressing
(13A2G0) SH - Serial Number High
(40G0205A) SL - Serial Number Low
I9E111 MY - 16-bit NetWork Address
(0) DH - Destination Address High
(Oj DL - Destination Address Low

Fig. 47 Datos del Router

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

Fig. 48 Dirección Destino del Router

Adicionalmente, se puede ver en ei campo MY que el coordinador asignó una di­


rección corta de 16 bits 9E11 (dirección lógica) al Router, ésta es la que utilizan
todos los dispositivos asociados a la red para armar sus tablas de direcciones y
realizar los enrutamientos respectivos cuando corresponda.
Ahora configuremos DO ubicado en el pin 20 y D1 ubicado en el pin 21 como
entradas análogas, D2 ubicado en el pin 18 como salida digital alta y D3 ubicado
en el pin 17 como entrada digital.

# 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

c o m o 5 que e q u iv a le a s e r s a lid a d ig ita l alta y por ú ltim o


D3 q u e d ó c o m o 3 q u e es e q u i v a l e n t e a s e r e n t r a d a d i g i t a l .
V e r r e c u a d r o s u p e r i o r en la f i g u r a 7.

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.

Modem: XBEE-PR0 Function Set ___ Versión


XBF'24-ZB j J jziGBEE R0UTER AT
R -F 1 I / 0 Settinas
(2) DO - ADO/DIOO Configuration
¡3 (2)D1 -AD1/DI01 Configuration
Q (5) D2 - AD2/DI02 Configuration
Ü (3) D3 - AD3/DIÜ3 Configuration
I f [ÜJÜ4 - Di0 4 Configuration
23 (1) D5 - DI05/Assoe Configuration
E¡ (1) PO - DI010/FWMO Configuration
5 (0)P1 - D I011 Configuration
|3 (0) P2 - DI012 Configuration
l i (1FFF) PR - Pull-up Resistor Enable
¡Ej (0) LT - Associate LED Blink Time
Ü (28) RP ■RSSI FWM Timer
I/0 Sampling
■ B (3498) IR 0 Sampling Rate j
H (UJIU - Uigilal IU L'hange Petection
B (0) V+ - Supply Voltage High Threshold
H - i ' l Diagnostic Commands
i...Ü (228C) VR - Firmware Versión
b n A.1C1 u w . w=rH,
s rriiA ia rc i

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

C0MG SG00 8-N-1 FL0W:N0NE XBP24-ZB Ver:228C

Fig. 50 Configuración l/O y tiempo de muestreo

A partir de este momento y cada 15 segundos estaremos recibiendo tra­


mas API con el estado de las l/O configuradas. Analicemos una de ellas
vista en la ventana terminal del X-CTU
m ui
110 LUIS GUILLERMO MONTOYA DIAZ
irmT
PROGRAMACIÓN DE MICROCONTROLADORES P IC + Z IG B E E

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
/

Fig. 51 Trama API 92

La trama es en hexadecima! y significa ¡o siguiente:


7E es el delimitador de las tramas API, toda trama API debe empezar por 7E
00 18 son los 2 bytes que representan la longitud de la trama, quiere decir
que a partir de ahí el número de datos es 16H, o sea 22 en decimal, sin con­
tar el último bvte que es el algoritmo de verificación de que la información
Negó completa (Checksum)
92 es el tipo de trama AP!, ésta específicamente es la recepción de mues­
tras de l/O ZIGBEE
00 13 A2 00 40 60 20 5A son la dirección o serial del módulo fuente, es decir
el Router que envía la información. Parte alta SH y baja SL respectivamente.
9E 11 es la d ire c c ió n co rta ó de 16 b its de! m ódulo fu e n te a sig n a d a
por el c o o rd in a d o r
01 es el ACK o acknowledgement que debe devolver el receptor para indicar
que llegó la trama, debe ser un número diferente de cero.
01 número de muestras solicitadas, en este caso solo una muestra de
todas las l/O configuradas.
00 0C entradas y/o salidas digitales configuradas. Recordemos que ¡as digi­
tales D2 y D3 las tenemos como salida digital alta y entrada digital respecti­
vamente, entonces el 00 0C debe ser consecuente con esto, veamos:
0000 0000 0000 1100 = 00 0C. Los dos unos son efectivamente D2 y D3.
03 entradas análogas configuradas 0000 0011 = 03 los dos unos implican
que DO y D1 están configuradas como entradas análogas.
00 04 representa el estado de las l/O digitales configuradas, es decir
D2 y D3, en este caso viéndolo en binario 0000 0000 0000 0100 = 00 04
indica que la salida D2 está entregando nivel alto y que la entrada D3
está recibiendo un nivel bajo.

LUIS GUILLERMO MONTOYA DÍAZ | f


PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE

02 2F en decimal 559, es el valor de la entrada análoga DO. Partiendo de


que el voltaje de referencia en los módulos XBEE serie 2 es interno y tiene
un valor de 1,2 voltios y que el módulo ADC es de 10 bits (1023), podemos
decir que el voltaje en esa entrada es de:
Valor señal análoga = Resolución * valor digital leido
(1,2V / 1023) x 559 = 0,65V que los puedo medir en el pin 20 del módulo
XBEE
03 FF en decimal 1023, es el valor de la entrada análoga D1, realizando el mis­
mo cálculo, tenemos que el valor de voltaje en el pin 19 del módulo XBEE es de:
(1,2V / 1023) x 1023 = 1,2V
A7 es el checksum o algoritmo de verificación de información recibida com­
pleta. El algoritmo utilizado por el protocolo ZIGBEE simplemente suma to­
dos los bytes de la trama partiendo desde el tipo de trama y luego coge
el byte menos significativo del resultado y lo resta de FF. Comprobemos el
checksum de esta trama así:
92 + 00 + 13 + A2 + 00 + 40 + 60 + 20 + 5A + 9E + 11 +01 +01 + 00 + 0C +
03 + 00 + 04 + 02 + 2F + 03 + FF = 458 solo me sirve 58, entonces:
Checksum = FF - 58 = A7
Así finalizamos el análisis de una de las tramas más sencillas y útiles del
protocolo ZIGBEE.
A n a lic e m o s ahora o tro s dos tip o s de tram a del p ro to c o lo ZIG B E E ,
esta vez e le g ire m o s la núm ero 17 que es R em óte C om m and Re-
q u e st de i a cual d ebem os re c ib ir una tram a re s p u e s ta 97 que es
R em óte C om m and R esponse.
Mediante la trama 17 puedo cam biar el estado de una salida en un m ódu­
lo remoto ó configurar el parám etro que desee en éste.
Por ejem plo: Vamos a ca m b ia r desde un R outer API el estado de la
salida d ig ita l D3 a nivel alto en un c o o rd in a d o r API que será, en este
caso, nuestro d isp o sitivo rem oto. R ecuerden que luego de in ic ia r la
red, el co o rd in a d o r pasa a ser un R outer más y en las redes ZIG BEE
todos se pueden co m u nica r con todos.
En la siguiente figura, al lado izquierdo, podemos ver que ya el coordinador eligió
el canal 0E como el canal más limpio y las respectivas identificaciones de red
de 16 y 64 bits. A la derecha vemos eí Router asociado a la red, obviamente en
el mismo canal y con iguales identificaciones de red, todo esto es automático,
yo no tengo acceso a cambiar estas configuraciones, además tiene asignada
por parte del coordinador la dirección corta MY 97F4. El Router tiene dirección
destino DH y DL en cero, pero en este caso no interesa porque todo se hará por
comandos remotos mediante tramas API.

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

H Í # á b W 3 1 5 5 3 i i i Load r AIwsjjs Update Fumwate Show D efaiisl

Modem: XBEE-PRO Function Set XBEE-PRO Function Set


C fif :>.jat 'op 7 . p ¡ |XBP24-ZB z ¡ ¡¿GBEE ROUTER API
-¿J MetwoíKmg B \_3 Networking
G¡} [Új ID • PAN ÍD E3 [0] ID - PAN ID
§ ‘.?Ff-Tj SC - Sean Channefc U (IFFEjSC ■Sean Chaméis
• ! l i3! SD • o can Dureíion U Í33 SD - Scz-r. Duratior
: U ¡2)ZS •ZigBeeStack Proffe j~i (2) ZS - ZigB&e Stack Picfiie
Si (FfjN J • Node Jor, Trna B (FF) NJ - Node Join Time
S IE20FC6C8F00758C41OP - Opeiatmg PAN iD fe (O) NW • Me'work Waichdog Tin-.eoi.it
B |19A7) 01 • Operating 16W PAN ID 6 (1JJV • Channel Verificaron
{£! CH ■Operating Diannel § fOJJN ■Join Nütáicstiori
L~ M ¡A) NC - Numbet of Remáning Chüdren U (E20FC6C6F0D756C4) OP ■Opeiating PAN ID
■|¡1 Addressing ^ (19A7J 01 • Operatmg 16-bit PAN ID
Í- - 1 0 3A20Ü) SH - Secid Nunfce High y (E) CH • Operating Channel
{•■ S Í40602KS1 ] SL - Serlai Nurtibei Low ^ (C) NC • Number of Remaining Children
f 6 COIM Y-16-bkNehwfkAdsess
f~ § (0) DH - Destraben Address Hgh D 3A200) SH • Serial Number High
!- 5 fFFFF] DL - Des&vsbon Address Low & ¡4IK £8^6) SI.-Serial Number Low
- ! l { ) ífi - Node idenbfer £3 (97F4) MY • 16-bit NetWork Address
Ü H Ej * HaíámiFR Hops £ l {0) OH - Destinaron Address High
§ íffi BH - Brosdeast Racfes 1¡ (0) DL - Deslinden Address Low

Fig, 52 R o u te ry C oordinador A sociados

Veamos entonces ía composición de ia trama API tipo 17 y acomodémosla para


cambiar el estado de la salida D3 en ei Coordinador API, desde el Router API.

S tart Delimite** . ¡11 G Ox7E


t— M 8 B 1 OxCO
Muratoer o f byíes foetweerii íh e lengflh and 8he chedksum
LSu 2
F?sí'rrg“9f3ecif^c 0-ssi© O-xlT
Identifies the UÁ RT dala frame for t t e host lo cífretele
4 0x01 wat» a sybsequent ACK (ac.taowledgsmení). If set fe Os
no respofise is s e n t
m sb V 0x00

W::-'" ' ' 0x13


7 0xA2
Set to th-e S4-Í3ÍI address -of f t e desSnation devlce. The
fí3llowrríg addresses are ateo sypported:
64-bi? D^3tinat!on 8 Ox-CKÍ 0x0000000000006000 - Reservad &4~bñ address for Ihe
..." 1 coordlnalor
- : 9 0x40
OxOOOOOOOOOOOOFFFF - Broadcast address
10 0x40
f i))5.KJ^~^ 11 0x1.1
¡s il1 ‘€ ; rf- LSB 12 0x22
M SB 13 OxFF Seí. to the 10-fosí address of ihe destirsafi©» devlce, if
known. S e l to OxFFFE if Ihe address is ynfonown, m If
LSB 14 OxFE sendirsg a broadeast..
!■■ .■ 0x0 2 - Apply ciianges oo remóte. (If
0«02{3pply not selcÁC cam m and must be semf.
15 changes)
belore changes wftii fake e fe c l .)
AH offier t>!-ts mysí iae set to O.
16 0x42 (B> ■fíame 0I the
1? Ox4B command
If present, indícales «be requesíed
: ■ pararoeter valué feoset fiie gwen
. ia 0x01
register. If fio ctsaracters presen!.
Site regrsler is queried.
| _ _
‘ Ch ecksym | 18 OxFF - íh e 8 bit sarrs of foyfes from o fe e t 3 to f tis foyle.

Fig. 53 Trama A P I 97

Procedo entonces a armar ¡a trama de acuerdo a lo que pide este cuadro.


Comencemos:
En la pestaña Terminal de! Router, en el software X-CTU abrimos la opción As-
semble Packet y comienzo a armar Sa trama en formato hexadecimal (escoger
HEX en cuadro inferior derecho).

LUIS GUILLERMO MONTOYA DÍAZ = |f f 3 j


Tfnrr
PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE

7E Delimitador de inicio de trama API


00 10 longitud de la trama, son entonces 16 datos a partir de 17 y sin contar el
checksum.
17 Tipo de trama API: Requisición de comando remoto
01 ACK que debo recibir del RX si llegó la trama
00 13 A2 00 40 60 20 61 Dirección destino o sea SH y SL del Coordinador.
FF FE Dirección corta del Coordinador, como no siempre es posible conocerla
podemos colocar FF FE.
02 Parámetro para que se apliquen los cambios
44 33 Equivalente al parámetro que deseamos cambiar D3 pero en HEXA D=44 y 3=33
05 Comando a enviar, 05 significa salida en nivel alto
96 Cheksum, resultado de sumar desde 17 hasta 05 en hexa = 469 y FF - 69 = 96
Luego de armar la trama procedo a enviarla dando click en Send Data. Si todo
está bien hecho, debo recibir la trama 97 como respuesta y obviamente puede
verse el cambio en el hardware, en mi caso estoy trabajando en un entrenador
para módulos ZIGBEE con las diferentes opciones para el trabajo con entradas
análogas y entradas y/o salidas digitales.
La trama enviada es la de color azul y la recibida es la de color rojo.

m m i

lí Modem; XSEE-PR0 Funciion Set


|X 8P 24ÍÍ___! COORD|NAjOR Apj

||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

Fig. 54 Trama AP117 para enviar

Analicemos entonces la trama tipo 97 recibida como respuesta

7E Delimitador de inicio de trama API


00 0F L o ng itu d de la tra m a , son e n to n ce s 15 da to s a p a rtir de 97 y
sin c o n ta r el che cksum .
iu jh
1114 LUIS GUILLERMO MONTOYA DIAZ
Tnrrr
PROGRAMACIÓN DE MICROCONTROLADORES PIC + Z IG B E E

97 Tipo de trama API: Respuesta a comando remoto


01 A C K que debo recibir del R X si llegó la trama
00 13 A2 00 40 60 20 61 Dirección fuente o sea SH y S L del Coordinador.
00 00 Dirección corta del coordinador, es decir M Y que está en 00 00.
44 33 Equivalente al parámetro que deseamos cambiar D3 pero en HEXA D=44 y 3=33
00 Recibido con éxito
1A Cheksum, resultado de sumar desde 97 hasta 00 en hexa = 2E5 y FF - E5 = 1a

El resultado es efectivamente lo que nos dice la teoría acerca de lo que compone


una trama API tipo 97. Confirmémoslo en el siguiente cuadro.

;F:r»r¡*e R e iü s O ffs e t E s a n íjjíe D ís c rs p tlo n


Start Defimíter 0 0x7E

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

64-brt Souree 8 0x00


The address of fie remóte radio retuming this response.
(remóte) M dtess
9 0x40
10 0x52
11 0x2B
LSB 12 OxM
h MSB 13 0x7D Set to the IS-bit rseswsrk
Franse-speeific Data
l& h it& H ire e aatótess of fue remóte.
freraoísi f t É f e t IS B 14 0x84 Set to OxFFFE if
unknown.
15 0x53
AT Commaads Ñame of t e connmand
16 Gx4C
0 = OK
1 = ERROR
CommanS Status 17 0x00
2 = Invalid Command
3 = Invalid f arameter
IB 0x40

. 19 Qbc52 Register data ¡a binaiy form al If the register was set,


Command 0<sB
2tf 0x2B fie n this field k noí retamal

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.

LUIS GUILLERMO MONTOYA DÍAZ H


PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE

F ram e Ftelds O ffsets ü xarn p ie D es crip tio n


Stait D e h ite r 0 0x7E
Length MSS1 0x00
Number of bytes between (he iength and the checksum
L5S2 0x16
Frame-specifíc Data Frame Type 3 0*10
Idenffles the UART data frame for ihe host to correlato
Frame lü 4 0x01 with a subsequeni ACK (ackriowledgement). If set to 0,
no response is sent.
MSB 5 0x00
6 0x13
Set to the 84-M address of (he destirsation dance. The
7 QxA2
follDwing addresses are also supported:
64-bit Destinaron
8 0x00 OxOOOOTOOQOCfflffiOOO - Reserved 64-bit address for the
Address
9 0x40 coordtator
OxOOOíSKKKWOOOFFFF - Broadcast address
A 10 OxOA
P
11 0x01
i
LSB12 0x27
p MSB 13 OxFF Set to fríe 16-bit address of the destínate device, if
g 16-bit Destiration
known. Set to QxFFFE if the address is URknown, or if
c Nefwork Address LSB 14 OxFE sending a broadcast.
k
e Sets máximum mimber of hops a
i broacfcast transmission cari occur.
BroadcasíRadiu» 15 0x00
If set to0, the taoadcast radias will
be set to the máximum hops vate.
Options 16 0x00 AH other bife musí be set to 0.
17 0x54
18 0x78
19 0x44
20 0x61
¡ i RFData Data that is sent to the d e s tra te dewce
21 0x74
22 0x61
23 0x30
24 0x41
Checksum 25 0x13 OxFF - the 8 bit sum of bytes from offset 3 to M s byte.

Fig. 56 Trama AP110

En este caso vamos a enviar desde ei coordinador API hacia el Router que lo
pondremos como AT, la palabra SUCONEL.

Descripción de la trama a enviar:

7E Delimitador de inicio de trama API

00 15 longitud de la trama, son entonces 21 datos a partir de 10 y sin


contar el checksum.
iJLU.ll
i 116 LUIS GUILLERMO MONTOYA DIAZ
" tttttt
PROGRAMACIÓN DE MICROCONTROLADORES P IC + Z IG B E E

10 Tipo de trama API: Requisición de comando remoto

01 ACK que debo recibir del RX si llegó ¡a trama

00 13 A2 00 40 6E 83 E6 Dirección destino o sea SH y SL del R outer.

FF FE D irección corta del Router, como no siem pre es posible cono­


cerla podemos colocar FF FE.

00 Número de saltos desde el coordinador hasta el Router

00 Byte obligatorio en ceros

53 55 43 4F 4E 45 4C Palabra SUCONEL en hexadecima!

0C C heksum , re su lta d o de sum ar desde 10 hasta 4C en hexa =


6F3 y FF - F3 = 0C

Luego de arm ar la tram a procedo a enviarla dando click en S e r s d


Data. Si todo está bien hecho, deberá aparecer ia palabra SUCONEL
en el router, como claram ente lo muestra el cuadro siguiente:
||| f ! | í M iC O M líjX -C T U
{C0MÍ5]X-CTK
SI
piarfom Afeoy? : m■ 4 bcu í XModem

PCSelSngs| RanjeTest Tetmnal jModernContiguraHon|


?¡es PC Seíiings j RangeTesl Termina! j Modem Configuraron j
i Une Status -... ; Asseit.... -
Clase Assernble Cleai Show
* * - - - - - - - - - - - - - - - - - - O ta a s E D ü S D T R T ^ R T s F S ir
lilao iD T R F ls F | B re * r Com
Port Packeí Screen i................. i i ....................
ComPort Packet Scieen He*

|7E 00" 1 5 1 0 01 00" 13 A2 00 4010! SUCONEL


SUCO E5 FF FE 00 00 53 55 43 4P 4E 45 4C
OC 7E 00 07 8B 01 B6 02 00 00 00 EB

JC0M15] Send Pscket


-

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

Byte count: 25 Display


!• HEX enes
Cío® Clea
C ASCII

Fig. 57 Trama AP110 para enviar

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.

Para hacerlo muy sencillo de entender, enviaremos una trama 17,


que como se vió en el capítulo anterior, nos permite activar o des­
activar una salida remota o bien cambiar cualquier parámetro AT
que deseemos en otro módulo XBEE.

La condición es que si la entrada RD4 de! PIC16F887 está en 1, éste


envía la trama 17 al XBEE transmisor que está configurado como
coordinador API, éste a su vez, via RF, envía esta trama ai módulo
XBEE remoto, que está configurado como router AT para que se ac­
tive la salida D3 en él.

El arreglo electrónico es el siguiente:

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

Fig, 58 Arreglo Electrónico

Se puede ver en la figura 2, mediante el software X-CTU que tanto


coordinador como router están asociados y a partir de la dirección
de 64 bits (SH y SL) del router, que es nuestro destino, se arma
la trama 17 para activación y desactivación de la salida D3 en el
router, lo anterior depende del estado de la entrada D4 en el mi-
crocontrolador.
UÜLÜi
LUIS GUILLERMO MONTOYA DÍAZ HQ
Trrrrr
PROGRAMACIÓN DE MICROCONTROLADORES P IC + Z IG B E E

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..

McduSSSm tocaonSel___ Versión


|;< B P 2 4 -Z B _ £ j JZ IG B E E R O U T E R A T ¡Z IG B E E COORDINATOR API - -W Zl
•Networking
| T - ^ O l l í ^ PAN ID ! ID-PAN ID
B S3FFF3.SC - Sean Channels É Í3FFF) SC • Sean Channeís
Í (3 )S D -8 c a n D i¡ra tb n i l (3) SO • Sean Duiation
I {212S -ZigBee Stack Protíle •l {2}2S -ZigBee Stack Proíile
I I [FF]N J - NodeJ.oin Time ¡1 (FF| NJ - Node Join Time
¡ | [0] H W - Network W atehdog Tímeout •| (F0FF40DB8A27E83) OP ■Operating PAN ID
l l H1JV - Channel Verificafcn 1 (AE17J OI - Operating 16-bit PAN ID
| ¡ (O)Ji'! • Join Notificaron • | ¡ (17} CH - Operating Channel
1 (F0FF40DB8A27E83) OP • Operating PAN ID ¡ i {A) NC - Number of Remaining Chiidren
6 (AE17JOI • Operating 16-bit PAN ID Addressing
S (1?}CH - Operating Channel 6 (13A200) SH - Serial Number High
B (ClN C - Number oí Remaining Chiidien - i ¡ (40SE83E6) SL • Serial Number Low
¡ ! (0) MY -1 S-bit Network Address
I (13A200)SH • Serial NumberHigh • 1¡ (01DH -Destinatíon Address High
12056) S L • S erial N umbsr Low Ü ífFFF} D L • Destinaron Address Low
w rftiíB a 'ffla • ¡ | ( } Ni - Node Identifier
• H (0]DH - Destination Address High i l p EjN H - Máximum Hops
•• ¡ ¡ |13}DL-De$fe«íon Address Low f¡| (0) BH • Bmádcast Radius
P” 3 . U ¿mii.tr,.U na fim ita Prnarir-agt Timo

Fig. 59 R o u te ry Coordinador Asociados

La trama para activar la salida D3 queda como sigue:


7E 00 10 17 01 00 13 A2 00 40 60 20 5B FF FE 02 44 33 05 9C
Que significa lo siguiente:
7E Delimitador de tramas API
00 10 Longitud de datos, en este caso son 16 bytes contados desde el tipo de
trama hasta el final de la trama, sin incluir el checksum
17 Tipo de trama
01 ACK debe ser un número diferente de 0
00 13 A2 00 Parte alta de la dirección de 64 bits (SH) del destino
40 60 20 5B Parte baja de la dirección de 64 bits (SL) del destino
FF FE Dirección de 16 bits del destino, si no se conoce puede ser FF FE
02 Para que se apliquen los cambios
44 33 parámetro AT en Hexadecimal para expresar D3 que es la salida a
cambiar
05 Saiida digital alta para D3
9C Checksum
La trama para desactivar la saiida D3 queda como sigue:
7E 00 10 17 01 00 13A2 0 40 60 20 5B FF FE 02 44 33 04 9D
Los únicos cambios son:
04 Salida digital baja para D3
9D Checksum
Programa en lenguaje C con el compilador XC8 de Microchip y desarrollado

LUIS GUILLERMO MONTOYA DIAZ


PROGRAMACIÓN DE MICROCONTROLADORES PIC+ZIGBEE

sobre ¡a plataforma MPLABX


y y *************************************************************************************

#¡nclude <xc.h> // Se incluye archivo de cabecera


jy * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
II Palabras de configuración generadas automáticamente por el compilador
jjk k kk k k * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

__CONFIG(FOSC_XT & WDTE_OFF & PWRTE_OFF & MCLRE__ON & CP_


OFF & CPD_OFF & BOREN_ON & IESO_ON & FCMEN_ON & LVP_OFF);
__CONFIG(BOR4V_BOR21 V & WRT_OFF);
y ^*************************************************************************************

// Definición de la velocidad del oscilador


y y *************************************************************************************

#define _XTAL_FREQ 4000000


y y ************* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** *** ** *** ** *** *** ** *** *** ** *** ** *** ** * *

// Declaración de variables
jy * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
char cont=0;
y y *************************************************************************************

// Declaración de arreglos (Tramas_on y off)


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

while(TRMT==0) // Bandera de finalización de envío de dato

continué; II Cuando se ponga en 1 continuo con el byte siguiente

cont++; // Hasta completer los 20, es decir, trama completa

}
cont=0; // Limpio el contador

__delay_ms(5000); // Envío cada 5 segundos

}
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

__delay_ms(5G00); // Envío cada 5 segundos

LUIS GUILLERMO MONTOYA DIAZ


PROGRAMACIÓN DE MICROCONTROLADORES P IC + Z IG B E E

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

Figura 60. Esquema electrónico

La ¡dea es enviar una trama 17 desde un XBEE coordinador conectado al PC a un


dispositivo remoto para activar la salida D3 en éste último. El nivel alto de la salida D3
llegará al pin C7 del microcontrolador, que está a todo momento pendiente del cambio
de nivel de 0 a 1 en este pin. Cuando el PIC sense este nivel alto en el pin RC7, inme­
diatamente, activa la salida AO del microcontrolador, la cual tiene conectado a través
del respectivo arreglo de potencia un circuito de iluminación. A su vez el PIC devuelve
al XBEE remoto una trama API tipo 10 con el mensaje: IL_ON y éste la envía via RF al
coordinador, que transmite igualmente el mensaje al PC para visualizarlo.
« ■ ccorvi9'i x-cnu 'Si
A to o tit X M o d e m :

P C Settings j R a n g e T e st Ttsrminal jj M o dem Conf¡guradon |


Line S tatus ~
Lióse i :Assem ble i Clear 1 H id e I
i cfsllfflil Corn Port | P a c k e t 1 S cre en ¡j H e x 1

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

ZOMQJ Sersd Packet

|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

Bjr'te count: 2 0 - Dispiay -•


<«* HEX
Cióse 1 S e n d D ata
’T'* ASCII

Figura 61. Trama 17 que se envía desde el Coordinador conectado al PC.

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 *************************************************************************************

// Declaración de variables y arreglos


11 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
char aux=0;
char trama_IL_ON[23]={OX7E,0X00,0X13,0X10,0X01,0X00,0X13,0XA2,0X00,
0X40,0X6E,0X83,0XE6,0XFF,0XFE,0X00,0X00,0X49,0X4C,0X5F,0X4F,0X4E,0X94};
II * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
// Programa principal
*************************************************************************************
//'
void main()
{
TRISC=0X80; II Puerto C con C7 como entrada para recibir pulso del XBEE y C6 salida paraIX
TRISA=0; // Puerto A como salida para activar circuito de iluminación a través de AO
TXSTA=0X26; // Habilito transmisión y bit BRGH en 1
SPBRG=25; // Velocidad 9600 bps
SPEN=1; // Habilito Puerto serial del PIC

LUIS GUILLERMO MONTOYA DIAZ


ANSEL=0; // Todos los pines digitales
ANSELH=0; // Todos los pines digitales
PORTADO; // Limpio el Puerto A
while(1)
{
while (RC7==0) // Mientras la entrada en RC7 esté en 0, no haga nada
continué; // Si recibe el nivel alto del XBEE continua el programa
RA0=1; // Activa circuito de iluminación
while (aux<23) // Ciclo while para el envío de la trama 10
{
TXREG=tramaJL_ON[aux]; // Inicio del envío de la trama 10
while(TRMT==0) // Bandera finalización de envío del dato
continué; // Para poder continuar con el siguiente byte
aux++; // Por eso aumento la posición del arreglo
}
aux=Q; // Limpio el apuntador al terminar el envío de la trama
__delay_ms(1000); // Retardo de 1 segundo
}
}
IJ^k* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

La explicación de la trama 10 es la siguiente:


7E Delimitador de las tramas API
00 13 Longitud de los datos, en decimal 19 bytes contados a partir del tipo de
trama y sin el checksum
10 Tipo de trama
01 ACK byte de reconocimiento de trama, debe ser diferente de 0
00 13 A2 00 Parte alta de la dirección de 64 bits (SH)
40 6E 83 E6 Parte baja de la dirección de 64 bits (SL)
FF FE Dirección corta del destino si no se conoce
00 Número de saltos
00 Byte obligatorio
49 4C 5F 4F 4E Mensaje en Hexadecimal IL_ON
94 Checksum que sale de sumar todo desde el tipo de trama y restar el LSB
de FF
En este caso la suma da 66B, entonces FF - 6B = 94
QD [COM 9] X-CTU £2
About XM odem
PC Settings ! Rarige Test Terminal ! Modem Configuration j
Line S tatus— ......... Assert
Cióse Assemble j Clear Show
cTs:asüaa P 'lR T S 'S ' B re a k f Com Fort P ackeí j S creen Hex ;

7:7®".T I in . IL_ON .

F ig u ra 62. Tram a 10 re c ib id a p o r e l c o o rd in ád o r, en via d a p o r e l rem o to. Se p u e d e


a p re c ia r el m e n s aje IL _ O N en el PC.

LUIS GUILLERMO MONTOYA DÍAZ 12 .

S-ar putea să vă placă și