Esta obra es la continuación en cuanto al aprendizaje de microcontroladores PIC, por lo que
ahora toca explicar la parte práctica sobre la configuración y programación de éstos. Para ello
es que hemos preparado el presente material para que, en poco tiempo y de una manera rela-
tivamente corta, seamos capaces de aprender a programar microcontroladores PIC.
Los microcontroladores PIC tienen el atractivo principal de que se encuentran muy difundidos,
entre aplicaciones escolares y sobre todo industriales, además de que los programadores que
se requieren los podemos encontrar de diversos precios, incluyendo aquellos que son muy
económicos, pero que nos sirven perfectamente para programar a estos microcontroladores.
Para aprender a programar microcontroladores, podemos empezar por cualquiera, al final de
cuentas lo importante es saber identificar que tenemos una necesidad, y para ello proponemos
en el presente libro comenzar por los PICs, ya que cuentan con una filosofía de operación sen-
cilla y entendible, y lo creemos apropiado para aquellas personas que van partiendo de cero,
o inclusive para aquellas personas que ya tienen conocimientos básicos sobre programación de
microcontroladores.
La forma en cómo se encuentra organizado el presente libro, es comenzar por lo elemental
sobre el manejo de cualquier microcontrolador.
El presente libro comienza explicando cómo se debe efectuar la configuración de los puertos
de un microcontrolador PIC, pasando posteriormente a la utilización de los correspondientes
puertos para ingresarles o sacar datos a través de ellos.
Posteriormente se encuentran explicadas una serie de rutinas elementales, que son indispen-
sables para que el microcontroladores PIC opere al 100%; es importante mencionar que el tipo
de microcontrolador que puede ser empleado es de 8, 18, 28 o 40 terminales.
Pues bien querido lector, en general esta obra es el resultado del impulso que en Club Saber
Electrónica queremos darles a todas aquellas personas que tengan “ganas” de aprender,
además queremos resaltar también las facilidades prestadas en el Instituto Politécnico Nacional
(IPN) y específicamente en la Escuela Superior de Cómputo del IPN para desarrollar la presente
obra y ponerla en práctica dentro de sus aulas. Esperamos que este libro sea de su total agra-
do y utilidad, muchas gracias por elegirnos y hasta la próxima.
Ing. Ismael Cervantes de Anda
Docente ESCOM IPN
icervantes@saberinternacional.com.mx
Club Saber Electrónica Nº 67. Fecha de publicación: SEPTIEMBRE de 2010. Publicación mensual editada y publicada por Editorial Quark, Herrera 761
(1295) Capital Federal, Argentina (005411-43018804), en conjunto con Saber Internacional SA de CV, Av. Moctezuma Nº 2, Col. Sta. Agueda, Ecatepec
de Morelos, México (005255-58395277), con Certificado de Licitud del título (en trámite). Distribución en Argentina: Capital: Carlos Cancellaro e Hi-
jos SH, Gutenberg 3258 - Cap. 4301-4942 - Interior: Distribuidora Bertrán S.A.C. Av. Vélez Sársfield 1950 - Cap. – Distribución en Uruguay: Rodesol
SA Ciudadela 1416 – Montevideo, 901-1184 – La Editorial no se responsabiliza por el contenido de las notas firmadas. Todos los productos o marcas
que se mencionan son a los efectos de prestar un servicio al lector, y no entrañan responsabilidad de nuestra parte. Está prohibida la reproducción to-
tal o parcial del material contenido en esta revista, así como la industrialización y/o comercialización de los aparatos o ideas que aparecen en los men-
cionados textos, bajo pena de sanciones legales, salvo mediante autorización por escrito de la Editorial.
Revista Club Saber Electrónica, ISSN: 1668-6004
1
CAPITULO I. RUTINAS BASICAS .........................................................................3
CONFIGURACION DE LOS PUERTOS COMO ENTRADA O SALIDA....................................................3
LECTURA DE DATOS DE UN PUERTO................................................................................................5
ESCRITURA DE DATOS EN UN PUERTO ............................................................................................8
ASIGNACION DE DATOS A UN REGISTRO ....................................................................................10
INCREMENTO Y DECREMENTO DE DATOS DE LOS REGISTROS ......................................................13
INCREMENTO O DECREMENTO DEL DATO DE UN REGISTRO EN UNA UNIDAD..............................14
INCREMENTO O DECREMENTO DEL DATO DE UN REGISTRO EN VALORES DIFERENTES
A LA UNIDAD...............................................................................................................................14
DISEÑO DE UN CONTADOR.........................................................................................................14
CONTADOR ASCENDENTE ...........................................................................................................15
CONTADOR DESCENDENTE .........................................................................................................16
DISEÑO DE UN RETARDO BASICO POR BUCLES ............................................................................18
SUMA ARITMETICA .......................................................................................................................22
RESTA ARITMETICA .......................................................................................................................26
MULTIPLICACION ARITMETICA.......................................................................................................30
DIVISION ARITMETICA ..................................................................................................................32
CAPITULO II. RUTINAS INTERMEDIAS ...............................................................35
FUNCION LOGICA AND Y SUS APLICACIONES .............................................................................36
FUNCION LOGICA OR Y SUS APLICACIONES................................................................................37
FUNCION LOGICA XOR Y SUS APLICACIONES..............................................................................39
FUNCIONES LOGICAS DE COMPARACION ENTRE REGISTROS (=, <, >) .........................................40
COMPARACION IGUAL (=) Ó DIFERENTE () ..................................................................................41
COMPARACION MENOR QUE (<) Ó MAYOR O IGUAL QUE () ......................................................43
COMPARACION MAYOR QUE (>) Ó MENOR O IGUAL QUE () .....................................................45
LECTURA DE UN TECLADO MATRICIAL ...........................................................................................48
CONFIGURACION DE LAS INTERRUPCIONES ................................................................................53
IMPLEMENTACION DE UN RETARDO POR TIMER ............................................................................56
EL TIMER DE 8 BITS (TMR0)............................................................................................................56
EL TIMER DE 16 BIT S (TMR1).........................................................................................................59
CONFIGURACION DE LA USART ...................................................................................................62
USART EN MODO TRANSMISION (TX)...........................................................................................63
USART EN MODO RECEPCION (RX)...............................................................................................67
CONFIGURACION DEL ADC .........................................................................................................71
2
Cervantes de Anda Ismael - Programando Microcontroladores PICs. / Ismael Cervantes de Anda ;
dirigido por Horacio Vallejo - 1a ed. - Buenos Aires : Quark, 2010. - 80 p. ; 28x20 cm.
ISBN 978-987-623-206-7
1. Electrónica. I. Vallejo, Horacio, dir. II. Titulo
HoracioCDD 621.3
Fecha de catalogación: 23/04/2010
F
a
b
r
i
c
a
c
i
ó
nd
eB
a
n
c
o
s
,
P
i
l
a
s
d
eP
l
o
mo
,
A
c
i
dy
u
nE
x
t
e
n
s
oS
u
r
t
i
d
oe
nP
i
l
a
s
p
a
r
aP
C
,
C
o
mp
a
c
y
y
C
o
mp
u
t
a
d
o
r
a
s
d
eT
o
d
a
s
l
a
s
Ma
r
c
a
s
d
eP
r
e
s
t
i
g
i
o
.
L
AC
A
S
AD
E
L
AP
I
L
A
A
G
A
I
N
&
A
G
A
I
N
L
AC
A
S
AD
EL
AP
I
L
A
a
h
o
r
at
a
mb
i
é
ne
nN
A
U
C
A
L
P
A
N
:
L
OE
S
P
E
R
A
MO
SE
N
:
A
v
.
J
a
r
d
i
n
e
sd
eS
a
nMa
t
e
oN
º
1
2
5
L
o
c
a
l
5
,
C
o
l
.
S
t
a
.
C
r
u
z
A
c
a
t
l
a
n
N
A
U
C
A
L
P
A
N
,
E
D
O
.
D
EME
X
I
C
O
C
P
:
5
3
1
5
0
T
E
L
:
T
E
L
:
5
5
-
1
2
-
2
2
-
9
9
l
a
c
a
s
a
d
e
l
a
p
i
l
a
c
e
l
d
a
@
g
ma
i
l
.
c
o
m
M
E
N
U
D
E
O
M
A
Y
O
R
E
O
AGAI
N&AGAI
N
3
En este capítulo se irán abordando diversos temas para aprender a programar
un microcontrolador PIC, aun sin saber nada acerca de estas actividades. El pre -
sente material es una guía para comenzar paso a paso, desde la configuración de
las terminales que constituyen a los puertos de los microcontroladores. Aquí se
aprenderá a realizar la correspondiente configuración de los puertos, tanto para
leer datos (puerto configurado como entrada) como para escribir datos (puerto
configurado como salida). Adquiriendo de manera complementaria, el conoci -
miento para manipular los correspondientes registros de configuración.
De manera general se continuara con la utilización de los registros, para reali -
zar operaciones elementales, tales como el incrementarles el valor del dato alma -
cenado en dichos registros; para que podamos pasar al diseño de una serie de
“rutinas básicas”, que son de mucha utilidad en operaciones que se tienen que
realizar con un microcontrolador. Estas rutinas básicas se encuentran confor -
madas por contadores (ascendente y/o descendente), rutinas de tiempo imple -
mentadas mediante bucles, además de las operaciones aritméticas como son la
suma, resta, multiplicación y división, todas estas operadas con los valores al -
macenados en distintos registros.
4
Configuración de los Puertos
como Entrada o Salida
El primer ejercicio que se realiza
con un microcontrolador es la de leer
o escribir datos discretos (digitales) a
través de sus puertos. Por lo tanto, la
primera actividad que tiene que reali-
zarse, es la de configurar sus respec-
tivos puertos ya sean como de entra-
da o de salida de datos.
Todos los microcontroladores po-
seen puertos que dependiendo de su
estructura física relacionada con la
cantidad de terminales, pueden po-
seer una cantidad de puertos igual a 1
ó 2 ó 3, etc.
A continuación describiremos la
manera en que tienen que ser confi-
gurados los puertos de un microcon-
trolador PIC, y para ello, nos basare-
mos en 4 microcontroladores PIC de
diferentes tamaños, los cuales toma-
remos como modelo y a partir de és-
tos, podremos realizar cualquier apli-
cación, no importando la cantidad de
terminales que posean los microcon-
troladores, ya que lo importante es
aprender a configurarlos y obtener el
máximo beneficio de sus herramien-
tas internas.
Para configurar los puertos de en-
trada o salida de datos digital de los
microcontroladores, se tiene que
guardar un valor en el respectivo re-
gistro de configuración del puerto a
ser empleado. El registro de configu-
ración debe ser manipulado en el lla-
mado “tris”, que dependiendo del
puerto se complementa el nombre del
registro a “trisa” si se trata del puerto
A, o “trisb” si se trata del puerto B, o
“trisc” si se trata del puerto C, etc.
Normalmente la mayor cantidad de
puertos que posee un microcontrola-
dor PIC es de 5 por lo que sólo llega-
ría hasta el puerto E.
Cabe aclarar que los microcontro-
ladores que cuentan con un sólo puer-
to como es el caso del PIC12F629, el
registro de configuración de su puerto
correspondiente, tan solo recibe el
nombre de “trisio”, ya que no es nece-
sario especificarle de qué puerto se
trata, por el hecho de que sólo posee
uno.
Los registros de configuración de
los diferentes puertos de los micro-
controladores PIC se encuentran en
el banco 1 del mapa de memoria de
datos, siendo las localidades específi-
Figura 1 Diversos microcontroladores PIC.
Tabla 1. Ubicación de los registros de configuración de algunos microcontro -
ladores PIC.
cas para cada registro de configura-
ción las siguientes:
Todos los registros tris (configura-
ción de puertos) de los diferentes
puertos que poseen los microcontrola-
dores PIC, se encuentran conforma-
dos por 8 bits, los cuales dependiendo
del estado lógico en el que se encuen-
tren, será la forma de cómo se confi-
gure su correspondiente puerto, ya
sea como entrada o salida.
Para que un puerto de algún mi-
crocontrolador PIC sea configurado
como entrada, en su correspondiente
registro tris se debe alojar un dato el
cual debe estar compuesto por 1's ló-
gicos. Expresado de otra manera, sí
se requiere que todos los bits de un
puerto sean configurados como entra-
das, entonces a cada bit del corres-
pondiente registro tris del puerto en
cuestión se le tendrá que colocar en 1
lógico. Tal como se muestra a conti-
nuación:
Registro tris = 11111111 (binario)
ó
tris = FF (hexadecimal) ó tris = 255 (decimal)
De manera contraria, para que un
puerto de algún microcontrolador PIC
sea configurado como salida, en su
correspondiente registro tris se debe
alojar un dato, el cual debe estar
constituido por 0's lógicos. Expresan-
do lo anterior de otra manera, sí se re-
quiere que todos los bits de un puerto
sean configurados como salidas, en-
tonces a cada bit del correspondiente
registro tris del puerto en cuestión se
le tendrá que colocar en 0 lógico. Tal
como se muestra a continuación:
Registro tris = 00000000 (binario)
ó
tris = 00 (hexadecimal) ó tris = 000 (decimal)
Por otra parte, no es requisito in-
dispensable configurar los bits de todo
un puerto ya sea como entrada o co-
mo salida, sino dependiendo de la
aplicación un mismo puerto puede ser
configurado, por ejemplo, mitad como
entrada y mitad como salida. Por lo
tanto el registro tris podría quedar co-
mo:
Registro tris = 00001111 (binario)
ó al revés
tris = 11110000 (binario)
De manera general, la cantidad de
bits de entrada o salida que se pue-
den configurar en un puerto depende
de las necesidades de la aplicación,
pero lo que sí debe tomarse en cuen-
ta es que los puertos cuentan con má-
ximo 8 bits, los cuales deben ser dis-
tribuidos de manera adecuada, para
considerar qué microcontrolador es el
que debemos de adquirir.
Para acceder a cualquiera de los
registros tris se tiene que apuntar en
primera instancia al banco 1 del mapa
de memoria de datos. Para ello se tie-
nen que manipular los bits rp0 y rp1
del registro “status”. Por otra parte su-
ponga que se requiere configurar al
puerto A como entrada y en el puerto
B el nible superior como entrada y el
nible inferior como salida. A continua-
ción se muestra, a manera de suge-
rencia, el código para realizar las ac-
ciones antes descritas, sobre micro-
controladores que cuentan con más
de un puerto. Ver tabla 1.2.
Para microcontroladores que sólo
tienen un puerto, y además necesita-
mos que los bits 0,1 y 2 sean configu-
rados como entradas, y los bits 3, 4 y
5 sean configurados como salidas, to-
mando en cuenta que el microcontro-
lador de un solo puerto puede ser el
PIC12F629, se presenta el fragmento
de código para configurar el puerto.
Ver tabla 1.3.
Aunque todos los registros de con-
figuración tris son de 8 bits, en el
PIC12F629 sólo son empleados los 6
bits de más bajo peso, por lo que los
bits 6 y 7 los colocamos en “0” (de to-
das maneras son colocados en el es-
tado lógico “0” de manera automáti-
ca). Para finalizar el tema de la confi-
guración de los registros de los puer-
tos, podemos decir que es a través de
los registros de configuración tris por
donde se configuran los puertos de un
microcontrolador. Por lo tanto, son los
primeros registros que deben ser ma-
nipulados cuando se diseña un pro-
grama.
Lectura de Datos de un Puerto
No importando la cantidad de bits
que conformen a un puerto, éste pue-
de ser configurado para que pueda
“leer” algún dato del exterior. Para
ello, una vez que se tiene el corres-
pondiente circuito de aplicación, se
graba en el microcontrolador PIC el
programa por medio del cual realizará
la tarea de ingresar un dato digital al
microcontrolador. Vea la tabla 2.
Para poder emplear un puerto co-
mo entrada en los microcontroladores
PIC, se tiene que comenzar con la
5
Tabla 1.3
bsf status,rp0 ;cambia al banco 1
movlw b'00000111' ;configura los bits del 0 al 2 como entrada, y los bits del 3 al 5 como salida del único puerto.
movwf trisio
Tabla 1.2
bsf status,rp0 ;cambia al banco 1
bcf status,rp1
movlw b'11111111' ;configura al puerto A como entrada
movwf trisa
movlw b'11110000' ;configura al puerto B bits del 0 a 3 como salida
movwf trisb ;bits del 4 a 7 como entrada
configuración del correspondiente re-
gistro “tris”, colocando todos sus bits
en unos “lógicos” (1's). Posteriormen-
te a la configuración del registro tris,
se tiene que emplear el registro deno-
minado “port”, llamando al puerto A
como “porta”, al puerto B como
“portb”, al puerto C como “portc” y así
sucesivamente para cada uno de los
puertos con que cuente el microcon-
trolador. Ver Tabla 3.
Los registros “port” prácticamente
se comportan como un reflejo del es-
tado lógico que se presenta en las ter-
minales físicas del microcontrolador.
Siendo más específicos, diremos que
el dato que alojemos en algún registro
port, se transmitirá a las terminales
que se encuentran relacionadas con
el registro port correspondiente, recor-
dando que el registro tris consecuente
debe encontrarse configurado de tal
forma que el puerto se comporte co-
mo entrada.
Todos los registros port se en-
cuentran constituidos por 8 bits, los
cuales indican el estado lógico en que
se encuentran las terminales físicas
6
Tabla 2. Utilización del puerto B de cualquier microcontrolador PIC para
leer datos.
Tabla 3. Utilización del puerto A para leer datos de los microcontroladores PIC16F628A y PIC16F876.
del puerto en cuestión del microcon-
trolador PIC. Para leer todos los bits
de un puerto se puede emplear el co-
mando de lectura de un registro, indi-
cando en la instrucción el puerto que
tendrá que ser intervenido, para una
mayor referencia observe el ejemplo
que se ilustra en la tabla 2. Este códi-
go es válido para todos los puertos ex-
ceptuando al puerto A de los micro-
controladores PIC. Por otra parte tam-
bién se indica el direccionamiento del
banco donde se encuentran los regis-
tros que serán empleados, actividad
que se implementa por medio de la
manipulación de los bits “rp0” y “rp1”
del registro “status”.
En las terminales del puerto A de
los microcontroladores PIC depen-
diendo de su estructura interna, pue-
den poseer ya sea convertidores ana-
lógico a digital (ADC), ó comparado-
res de voltaje, motivo por el cual como
parte de la rutina de inicialización de
los registros de los microcontrolado-
res, se les tiene que indicar de mane-
ra adicional, que se van a emplear las
terminales del puerto A para realizar
lecturas de naturaleza digital. Poste-
rior a la aplicación de un reset, las ter-
minales del puerto A se configuran de
manera predeterminada para que
sean activados ya sea el ADC ó los
comparadores de voltaje. Por lo tanto,
tendremos que recurrir al registro en
donde se configura la cantidad de
ADC's o comparadores que serán em-
pleados, pero en esta ocasión para
deshabilitarlos. Para realizar la activi-
dad de deshabilitación de ADC ó com-
paradores, basta con seleccionar 0
(cero) ADC's ó 0 (cero) comparadores
de voltaje, tal como se ilustra en el có-
digo del programa de la tabla.
Hasta este punto hemos revisado
de qué manera se leen los puertos A ó
B ó C, etc., de microcontroladores que
poseen más de un puerto (el PIC-
16F628A cuenta con 2 puertos y el
PIC16F876 cuenta con 3 puertos) co-
mo entrada, pero también podemos
encontrarnos con microcontroladores
que posean tan solo un puerto único.
Por lo tanto debemos de ser capaces
de poder trabajar con el microcontro-
lador de un solo puerto. Ver tabla 4.
Dentro de los microcontroladores
PIC, uno de los que cuenta con un so-
lo puerto es el que se identifica por
medio de la matrícula PIC12F629, el
cual posee 8 terminales de las cuales
2 son para alimentación, por lo que
sobra un puerto de tan solo 6 bits. En
este caso se trata de un microcontro-
lador que podemos considerar como
“enano” pero no por ello restringido en
su operación. Por el contrario todo de-
pende de la aplicación que queramos
realizar, y si ésta no requiere de mu-
chas terminales de entrada, el
PIC12F629 es muy adecuado.
Para emplear el puerto del micro-
controlador PIC12F629 tenemos en
primera instancia que configurar los
bits de su correspondiente registro
“trisio” de tal manera que pueda leer
datos, siguiendo la misma mecánica
que se realizó para los demás micro-
controladores. Por lo tanto se debe
colocar unos (1´s) en los respectivos
bits donde se pretende que la corres-
pondiente terminal del microcontrola-
dor sea configurada como entrada. Se
tiene que considerar que la terminal
identificada como GP3 (refiérase a la
figura 1), siempre debe ser configura-
da como de entrada, ya que la arqui-
tectura del microcontrolador
PIC12F629 así la tiene diseñada.
En la tabla 4 se ilustra un fragmen-
to de código para configurar al único
7
Tabla 4. Utilización del puerto GPIO de un PIC de 8 terminales para leer da -
tos.
puerto con el que cuenta un microcon-
trolador PIC de 8 terminales (en este
caso un PIC12F629). En el registro
“trisio” se cargan 1's en los bits 0, 1, 2,
3, 4 y 5 porque son los que se en-
cuentran disponibles para el
PIC12F629, los bits 6 y 7 no se en-
cuentran disponibles para este PIC.
Una vez que fue configurado el regis-
tro trisio, se procede a emplear el re-
gistro “gpio” para ingresar el dato que
se encuentra en las terminales del mi-
crocontrolador. Para emplear la totali-
dad de las terminales del PIC12F629,
es necesario habilitar al oscilador in-
terno del PIC, para que se puedan
emplear las 2 terminales dedicadas al
oscilador como entradas discretas
(GP4 y GP5), además de deshabilitar
la terminal del reset externo denomi-
nado MCLR, para contar con la termi-
nal GP3 exclusivamente como entra-
da. Por otra parte, cuando se habilita
al oscilador interno, se tiene que se-
leccionar la frecuencia de operación,
por lo que en el registro “osccal” se in-
gresa el valor binario “11111100” que
selecciona la frecuencia máxima de
operación que es de 4 MHz. El
PIC12F629 en las terminales identifi-
cadas como GP0 y GP1 cuentan a la
vez con comparadores de voltaje,
mismos que tienen que ser deshabili-
tados para emplear dichas terminales
como entradas digitales, siendo me-
diante la carga del valor binario
“00000111” en el registro “cmcon”. Por
último se tiene que recordar que para
interactuar con algún registro, se tiene
que direccionar al banco adecuado. El
PIC12F629 sólo cuenta con 2 bancos.
Por lo tanto basta con manipular el bit
“rp0” del registro status para acceder
al banco adecuado.
Escritura de Datos en un Puerto
Sin tomar en cuenta la cantidad de
bits que conforman a los puertos de
los microcontroladores PIC, éstos
pueden ser configurados para que se
pueda “escribir” algún dato hacia el
exterior del microcontrolador, Para
ello, una vez que se tiene el corres-
pondiente circuito de aplicación debi-
damente configurado, se graba en el
microcontrolador PIC el programa por
medio del cual realizará la tarea de
enviar un dato digital hacia el exterior
del microcontrolador.
Para poder utilizar cualquiera de
los puertos de un microcontrolador
PIC como salida, se tiene que consi-
derar como primer paso el de la confi-
guración del correspondiente registro
“tris”, colocando todos sus bits en ce-
ros “lógicos” (0's). Una vez que fue
configurado el registro tris, se tiene
que proceder con el empleo del regis-
tro denominado “port”, y de acuerdo al
puerto que se tenga que emplear se
podrá seleccionar desde el puerto A
como “porta”, al puerto B como
“portb”, al puerto C como “portc” y así
sucesivamente para cada uno de los
puertos con que cuente el microcon-
trolador.
Los registros denominados “port”
prácticamente se comportan como un
reflejo del estado lógico que se pre-
senta en las terminales físicas del mi-
crocontrolador. Siendo más específi-
cos, diremos que el dato que alojemos
en algún registro port, se transmitirá a
las terminales que se encuentran rela-
cionadas con el registro port corres-
pondiente, recordando que el registro
tris consecuente debe encontrarse
configurado de tal forma que el puerto
se comporte como salida.
En los microcontroladores PIC to-
dos los registros port se encuentran
constituidos por 8 bits, los cuales indi-
can el estado lógico en que se en-
cuentran las terminales físicas del
puerto en cuestión del microcontrola-
dor PIC. Ver tabla 5. Para escribir un
dato en todos los bits de un puerto se
8
Tabla 5. Utilización del puerto B de cualquier microcontrolador PIC para es -
cribir datos.
puede emplear el comando de escritu-
ra sobre un registro, indicando en la
instrucción el puerto que tendrá que
ser intervenido. Para una mayor refe-
rencia observe el ejemplo que se ilus-
tra en la tabla 5. El código de la tabla
5 es válido para intervenir todos los
puertos de un microcontrolador PIC
exceptuando al puerto A de los PIC,
Por otra parte también se indica el di-
reccionamiento del banco donde se
encuentran los registros que serán
empleados por medio de la manipula-
ción de los bits “rp0 y rp1” del registro
“status”, que de acuerdo al banco
donde se ubiquen los diferentes regis-
tros de configuración, se tendrá que
colocar la combinación adecuada en
los bits rp0 y rp1.
Sobre las terminales del puerto A
de cualquiera de los microcontrolado-
res PIC dependiendo de su estructura
interna, pueden contar con converti-
dores analógico a digital (ADC), ó
comparadores de voltaje, precedente
para que sea implementada la corres-
pondiente rutina de inicialización de
los registros de los microcontrolado-
res, para que de manera adicional se
le indique a las terminales del puerto
que serán empleadas para realizar la
escritura de datos digitales en el puer-
to A. Cuando se aplica un reset, las
terminales del puerto A se configuran
siempre de manera predeterminada
para que éstas sean habilitadas como
ADC ó los comparadores de voltaje.
Por lo tanto, se tendrá que recurrir al
registro en donde se configura la can-
tidad de ADC's o comparadores que
serán empleados, pero en esta oca-
sión se tendrán que deshabilitar.
Para realizar la actividad de des-
habilitación de ADC ó comparadores,
basta con seleccionar 0 (cero) ADC's
ó 0 (cero) comparadores de voltaje, tal
como se ilustra en los fragmentos de
código de los programas de la tabla.
Hemos revisado la manera de es-
cribir datos sobre los puertos A ó B ó
C, etc., de microcontroladores que
cuentan con más de un puerto (el PIC-
16F628A cuenta con 2 puertos y el
PIC16F876 cuenta con 3 puertos), pe-
ro también podemos encontrarnos
con microcontroladores que poseen
tan solo un puerto único. Por lo tanto
se debe contar con el conocimiento de
poder trabajar con algún microcontro-
lador de un solo puerto.
Dentro de la familia de los micro-
controladores PIC, uno de los que
cuenta con un solo puerto es el que se
identifica por medio de la matrícula
PIC12F629, el cual posee 8 termina-
les de las cuales 2 son para que sea
energizado (terminales Vdd y Vss),
por lo que sobra un puerto de tan so-
lo 6 bits. En este caso se trata de un
microcontrolador pequeño que pudie-
ra ser considerado como restringido
en cuanto a su cantidad de termina-
les, pero no en su operación. Por el
contrario, todo depende de la aplica-
ción que se tenga que realizar, ya que
si ésta no requiere muchas termina-
les de salida, el PIC12F629 es un mi-
crocontrolador muy adecuado.
Para emplear el puerto del micro-
controlador PIC12F629 tenemos, en
primera instancia, que configurar los
bits de su correspondiente registro
“trisio” de tal manera que se pueda es-
cribir algún dato, siguiendo la misma
9
Tabla 6. Utilización del puerto A para escribir datos en los microcontroladores PIC16F628A y PIC16F876.
mecánica que se realizó para los de-
más microcontroladores. Por lo tanto,
se deben colocar ceros (0´s) en los
respectivos bits donde se pretende
que la correspondiente terminal del
microcontrolador sea configurada co-
mo salida. Se tiene que considerar
que de las terminales con que cuenta
el PIC12F629, identificada como GP3
(refiérase a la figura 1), siempre tiene
que ser configurada como de entrada,
ya que la arquitectura del microcontro-
lador PIC12F629 así la tiene diseña-
da.
En la tabla 7 se ilustra un fragmen-
to de código para configurar al único
puerto con el que cuenta un microcon-
trolador PIC de 8 terminales (en este
caso un PIC12F629) como salida. En
el registro “trisio” se cargan 0's en los
bits 0, 1, 2, 4 y 5 porque son los que
se encuentran disponibles para el
PIC12F629, los bits 6 y 7 no se en-
cuentran disponibles para este PIC.
Una vez que fue configurado el re-
gistro trisio, se procede a emplear el
registro “gpio” para enviar hacia el ex-
terior del microcontrolador algún dato,
para que se refleje en las terminales
del microcontrolador. Para emplear la
totalidad de las terminales del
PIC12F629, es necesario habilitar al
oscilador interno del PIC, para que se
puedan emplear las 2 terminales dedi-
cadas al oscilador como salidas dis-
cretas (GP4 y GP5), además de des-
habilitar la terminal del reset externo
denominado MCLR, para contar con
la terminal GP3 exclusivamente como
“entrada”. Por otra parte, cuando se
habilita al oscilador interno, se tiene
que seleccionar la frecuencia de ope-
ración, por lo que en el registro “osc-
cal” se ingresa el valor binario
“11111100” que selecciona la frecuen-
cia máxima de operación que es de 4
MHz. El PIC12F629 en las terminales
identificadas como GP0 y GP1 cuen-
tan a la vez con comparadores de vol-
taje, los mismos que tienen que ser
deshabilitados para emplear dichas
terminales como salidas digitales,
siendo mediante la carga del valor bi-
nario “00000111” en el registro “cm-
con”. Por último se debe tomar en
cuenta que para interactuar con algún
registro, se tiene que direccionar al
banco adecuado. El PIC12F629 sólo
cuenta con 2 bancos. Por lo tanto,
basta con manipular el bit “rp0” del re-
gistro status para acceder al banco
adecuado.
Asignación de Datos
a un Registro
Una de las tareas que tiene que
realizar un microcontrolador es la de ir
almacenando datos, ya sea en sus re-
gistros de configuración, o en cual-
quier registro de memoria RAM, que
es en donde finalmente se alojan los
datos que resultan de una operación,
o la lectura de un puerto, etc.
Si la aplicación así lo requiere, se
tiene que manipular el dato de más de
un registro. Para ello, se tienen que
distribuir todos los registros involucra-
dos en el proyecto, para que en prime-
ra instancia se tengan que ubicar so-
bre los espacios de memoria RAM,
que se encuentran constituidos sobre
la memoria de datos. Por lo tanto, se
debe de conocer sobre qué banco de
memoria es sobre el que se alojará el
dato en un registro.
Para comenzar a trabajar con los
registros, la primera actividad a desa-
rrollar es la que lleva por nombre “de-
claración” de registros, o sea se le tie-
10
Tabla 7. Utilización del puerto GPIO de un PIC de 8 terminales para escribir
datos.
ne que indicar al programa editor (que
en el caso de los microcontroladores
PIC es el MPLAB) que se va emplear
por ejemplo el registro “trisa”.
Recordemos que se pueden clasi-
ficar de forma general en 2 conjuntos
los registros que emplearemos, los
cuales conocemos como registros de
configuración y registros de propósito
general. Estos últimos también tienen
la tarea de almacenar datos ya que se
trata de registros que se encuentran
implementados sobre memoria RAM.
A continuación marcaremos un mayor
énfasis sobre los registros de propósi-
to general, sin olvidar a los registros
de configuración.
Una vez que fueron declarados los
registros con los que trabajaremos, ya
los podemos emplear para escribirles
o leerles el dato que contengan. Por
lo tanto, en el ejemplo que se muestra
sobre un listado en el fragmento de
programa descrito en la tabla 8, se de-
claran los registros que serán emplea-
dos, resaltando de una manera parti-
cular a los registros de propósito ge-
neral que son los que funcionarán co-
mo localidades de memoria RAM. De
la tabla 8 se observa que se tienen
que declarar una serie de registros
que se denominan “var1”, “var2”,
“var3”, etc. Lo importante es que ocu-
pan las localidades de los registros
que van de la 20h a la 30 h, además
de que son localidades continuas. Se
debe tener en cuenta que si por algu-
na razón se requiere insertar un nue-
vo registro por ejemplo entre los iden-
tificados como var7 y var8, posterior-
mente se tienen que enumerar nueva-
mente las localidades recorriendo los
números de registro que a cada una le
corresponde de tal manera, que de
nuevo queden ordenadas.
En la tabla 9 se muestra una ma-
nera mucho más práctica en lo corres-
pondiente a la declaración de regis-
tros, en donde puede observarse que
a partir del registro var1, nos olvida-
mos de indicar por medio de la direc-
tiva “equ” la localidad que le corres-
ponde a cada registro. Tan solo tene-
mos que enumerar a todos los regis-
tros que tenemos que emplear y al co-
mienzo del bloque le colocamos el co-
mando “CBLOCK”, indicándole cuál
será la primera localidad que tendrá
que ocuparse, tal como se muestra en
el ejemplo “CBLOCK 0x20”, tal como
aparece en la tabla 9.
Para indicar en dónde termina la
declaración de registros, se tiene que
colocar el comando “ENDC” y hasta
allí termina de realizar las declaracio-
nes. Por lo tanto, si se tiene que agre-
gar un nuevo registro, tan sólo se tie-
ne que escribir dentro del bloque y de
manera automática le proporcionará
una localidad.
Cuando ya fueron declarados los
registros, posteriormente se procede
a su empleo ya sea para guardarles
un dato, o para leer el dato que con-
tengan. En la tabla 10 se muestra un
ejemplo en donde se emplea una gran
cantidad de registros, los cuales du-
rante el presente ejercicio serán em-
pleados para alojarles un dato. El da-
to será leído a través del puerto A.
Posteriormente se guardara en el re-
gistro de trabajo “W”, y por último el
dato que se encuentre en el registro
W será colocado en todos los regis-
tros que van de var1 a var17,.Aquí es
muy importante resaltar el hecho de
que la declaración de los registros fue
realizada mediante un bloque.
En el ejemplo mostrado en la tabla
10 se observa en la sección “progra-
ma principal” después de la etiqueta
“ciclo”, que de manera ordenada se
tienen que ir alojando valores en cada
uno de los registros identificados co-
mo “var”, mediante el empleo de una
instrucción para cada uno de los re-
11
Tabla 8. Declaración de registros,
para su empleo posterior.
Tabla 9. Declaración de un bloque de registros, para asignación automática de
localidades.
12
Tabla 10. Empleo de los registros una vez declarados.
Tabla 11. Empleo de los registros mediante direccionamiento indirecto.
gistros, que en este caso se trata tan
sólo de 17; para cada uno de los re-
gistros se está empleando un direc-
cionamiento directo. Supóngase el ca-
so en el que se requiera el manejo de
80 registros (no sólo 17), la pregunta
sería ¿se pondrán a escribir 80 ins-
trucciones para cada uno de los regis-
tros? Sería una cuestión de nunca
acabar, por lo que mejor recurrimos al
método de direccionamiento indirecto,
en el cual tan sólo tenemos que indi-
car dónde comienza la localidad de
los registros que serán intervenidos, y
controlar mediante un contador el ac-
ceso al siguiente registro, tal como es
ilustrado en el ejemplo de la tabla 11.
El código del programa ilustrado
en la tabla 11 es idéntico en cuanto a
la actividad que realiza el programa
que se muestra en la tabla 10, pero se
tiene un cambio a la manera de guar-
dar los datos en los registros, Si ob-
serva detenidamente ambos progra-
mas, el que corresponde a la tabla 11,
posee menos líneas de código porque
se implementó en éste el método de
direccionamiento indirecto para mani-
pular a todos los registros.
El direccionamiento indirecto con-
siste en obtener la dirección de una lo-
calidad de memoria (memoria RAM),
por medio de otro registro (File Select
Register “FSR”) que de manera inter-
media es el primero que tiene que ser
consultado.
El direccionamiento indirecto en
los microcontroladores PIC se realiza
por medio del empleo de los registros
denominados en primer término co-
mo: “FSR” que es el que contendrá
como dato a la localidad de memoria
RAM que será manipulada, e “INDF”
que es el registro en el cual se en-
cuentra la información que será escri-
ta o leída de la localidad de memoria
RAM que se está direccionando por
medio del registro FRS. Para una me-
jor comprensión observe la figura 2,
en la cual se muestra que con los bits
del 0 al 6 del registro FSR se direccio-
na una localidad de memoria RAM,
mientras que la combinación genera-
da mediante los bits 7 del registro
FSR y el bit IRP del registro STATUS
se puede acceder a cualquiera de los
4 bancos de memoria que posee un
microcontrolador PIC.
Regresando nuevamente al ejem-
plo de programa mostrado en la tabla
11, revisemos el fragmento de código
que a continuación se muestra: ver
tabla 11.2.
Para poder emplear los registros
“indf” y “fsr” tuvieron que ser declara-
dos mediante el comando “equ” con
su respectiva localidad en el mapa de
memoria de registros del microcontro-
lador PIC, que para el registro “indf”
se trata de la localidad 00h, y para el
registro “fsr” de la localidad 04h.
Cuando se requiere alojar un dato
de manera consecutiva en los regis-
tros de memoria RAM, se emplea la
instrucción “movwfindf” (previamente
tuvo que ser cargado el dato en el re-
gistro de trabajo W) tal como se mues-
tra en el programa de la tabla 11, pero
cuando se requiere realizar la opera-
ción inversa, o sea leer de manera cí-
clica a los registros de memoria RAM,
entonces la instrucción que tiene que
ser empleada es “movf indf,0” para
que el dato que contenga la localidad
de memoria RAM sea colocado en el
registro de trabajo W.
En cualquiera de los casos ya sea
de escritura o lectura de una locali-
dad de memoria RAM, lo primero que
tiene que hacerse es ingresar en el
registro FSR la localidad a ser inter-
venida.
Incremento y Decremento
de Datos de los Registros
Incrementar o decrementar los da-
tos de los registros, es una actividad
13
Figura 2. Direccionamiento Directo e Indirecto en un PIC.
Tabla 11.2
ciclo
movf porta,w ;lee un dato del puerto a
movwf indf ;aloja el dato en el registro indirecto
movlw 0x30 ;verifica si se trata del ultimo registro
xorwf fsr,w
btfsc status,z
goto otro
incf fsr,1
goto ciclo
que dependiendo de la aplicación se
realiza con mucha frecuencia dentro
de un programa. Por ello, es que se
tienen que revisar las diversas mane-
ras de manipular la información que
se encuentra alojada en los registros.
Incremento o Decremento
del Dato de un Registro
en una Unidad
Para incrementar o decrementar
el dato de un registro en una unidad,
se tienen las instrucciones “incf” y
“decf” respectivamente, los cuales de
manera simple realizan la operación
que les corresponde. Normalmente
cuando observamos de manera aisla-
da a este tipo de operaciones, en mu-
chas ocasiones las consideramos co-
mo actividades triviales, pero debe-
mos estar seguros que si las emplea-
mos de manera correcta, nuestros
programas serán muy eficientes. La
sintaxis completa de las instrucciones
“incf” y “decf” son las siguientes:
a) incf registroX,1
;Incrementa en una unidad el dato
del registro X alojando el resultado fi-
nal dentro del mismo registro X .
b) decf registroX,1
;Decrementa en una unidad el da-
to del registro X alojando el resultado
final dentro del mismo registro X1.
Existen otras instrucciones que a
parte de realizar la tarea de incremen-
tar o decrementar en una unidad al
valor del dato de algún registro, tam-
bién verifican si el resultado de la ope-
ración fue cero, teniéndose la posibili-
dad de diseñar un contador con pocas
líneas de código, y para ello se em-
plean las instrucciones que se mues-
tran con su respectiva sintaxis de ma-
nera completa a continuación:
a) incfsz registroX,1
;Incrementa en una unidad el dato
del registro X alojando el resultado fi-
nal dentro del mismo registro X1, y
salta si el resultado fue 0 (cero).
b) decfsz registroX,1
;Decrementa en una unidad el da-
to del registro X alojando el resultado
final dentro del mismo registro X1, y
salta si el resultado fue 0 (cero).
En e capítulo siguiente se mostra-
ran ejemplos a cerca del empleo de
estas instrucciones, en los cuales se
muestran en aplicaciones prácticas.
Incremento o Decremento del
Dato de un Registro en Valores
Diferentes a la Unidad
En diversas ocasiones se necesita
que se manipule el dato de un regis-
tro, para controlar una cierta variable,
para lo cual los incrementos deben
ser valores diferentes de la unidad, o
simplemente se tiene que sumar o
restar un valor de acuerdo con la apli-
cación que se está implementando.
Pues bien, para incrementar o decre-
mentar el dato de algún registro con
valores diferentes de la unidad, se tie-
nen las instrucciones de suma o resta
respectivamente, las cuales se mues-
tran junto con su sintaxis completa:
a) addwf registroX,1
;Suma el valor alojado en el regis-
tro W con el dato del registro X guar-
dando el resultado final dentro del
mismo registro X.
b) subwf registroX,1
;Resta el valor alojado en el regis-
tro W al dato del registro X guardando
el resultado final dentro del mismo re-
gistro X2.
Diseño de un Contador
Un contador es una de las prime-
ras aplicaciones básicas que tienen
que emplearse, por lo que en el desa-
rrollo del presente capítulo se explica-
rá la manera en que puede ser creado
el código de un programa en el cual
se tenga implementado un contador
básico partiendo de registros de 8
bits. En el caso de que se requieran
contadores de más de 8 bits, la meto-
dología mostrada en el presente capí-
tulo será válida, pero se tendrá que re-
currir a la suma o resta de registros
con más de 8 bits, y cuyas explicacio-
nes se encuentran en los respectivos
capítulos llamados “suma aritmética” y
“resta aritmética” que se ubican den-
tro del presente capítulo.
La estructura de un contador se
ilustra en el diagrama de flujo de la fi-
gura 3, en la cual se muestra que se
tiene que guardar un dato en un regis-
tro, que será el que funcionará como
el control del contador, el valor que se
alojará en el registro contador depen-
derá de cómo se tiene que inicializar
dicho contador. Ya inicializado el re-
gistro contador, se procede a realizar
la actividad que tiene que controlar el
contador, esto es, se realiza la activi-
dad sustancial que por ejemplo puede
una serie de sumas, una serie de lec-
turas a través de un puerto, etc. Pos-
teriormente a la realización de la acti-
vidad que controla el contador, se tie-
ne que incrementar el valor del dato
que se encuentra en el registro conta-
dor, para contabilizar la cantidad de
eventos que se han realizado. Por úl-
timo, se tiene que revisar que no se
haya rebasado la cantidad de eventos
a realizarse, por lo que ahora, la acti-
vidad siguiente es la de comparar el
valor que se encuentra dentro del re-
gistro contador, con el valor máximo
de eventos que tienen que realizarse.
Si el valor que se encuentra alojado
en el registro contador, aún no alcan-
za el valor máximo, entonces el proce-
so tiene que repetirse una vez más,
por lo tanto, se tendrá que realizar
nuevamente el evento de la actividad
que se está controlando. De otra ma-
nera, si el valor del registro contador
es igual al valor máximo de los even-
tos que tienen que realizarse, enton-
ces el programa tendrá que realizar
14
una actividad diferente de la que esta-
ba controlado con el contador, dando
por terminado el contador y accedien-
do a un nuevo proceso.
En el diagrama de flujo del conta-
dor de la figura 3, los bloques que co-
rresponden al control del contador son
resaltados, para tener presente dónde
se realiza el control del contador. Los
contadores pueden desarrollarse en
forma general de dos maneras, de-
pendiendo de si el contador se confi-
gurará como un “contador ascenden-
te” o un “contador descendente”, pero
en ambos casos la estructura del con-
tador es la misma que se ha mostrado
previamente, y a continuación se
muestra la estructura de los distintos
tipos de contador.
Contador Ascendente
El contador ascendente tiene co-
mo característica principal la de llevar
un conteo ascendente en el registro
contador, razón por la cual el registro
contador se inicializa con un valor “pe-
queño” que puede ser inclusive 0 (ce-
ro). Dicho valor tiene que ser menor al
valor máximo de eventos que tiene
que controlar el contador. Después de
haber realizado la actividad que co-
rresponde al evento que se está con-
trolando, el registro contador tiene
que ser incrementado para precisa-
mente llevar a cabo el conteo de la
cantidad de eventos que han sido
efectuados. Normalmente el incre-
mento que se aplica al registro conta-
dor es de una unidad, pero en realidad
se tiene que incrementar de acuerdo a
la aplicación que se está desarrollan-
do. Una vez que se ha incrementado
el valor del registro contador, se pro-
cede a comparar el valor del registro
contador con el valor máximo de la
cantidad de eventos que tienen que
desarrollarse. Este valor puede en-
contrarse dentro de un registro al que
podemos llamar “Valormaximo”. Si
después de “incrementar” el dato del
valor del registro contador aún no es
igual al valor máximo, entonces se tie-
ne que aplicar un nuevo incremento al
registro contador, y así sucesivamen-
te hasta que alcance su valor total.
En los ejemplos de programa ilus-
trados en la tabla 12, se propone el
empleo de un microcontrolador PIC-
16F628A, pero en realidad por el mo-
mento no es relevante el microcontro-
lador PIC que sea empleado, ya que
el código para realizar el conteo es vá-
lido para cualquier PIC. Los progra-
mas mostrados en la tabla 12 contro-
lan un contador ascendente, realizan-
do ambos programas idénticas funcio-
nes, teniendo sólo un cambio en
cuanto a las líneas de sus respectivos
códigos. El cambio existente entre los
programas radica en la instrucción
que efectúa el incremento del registro
contador. En un programa se emplea
la instrucción “incf contador,1” la cual
indica que se incremente en una uni-
dad el valor del registro “contador”
guardando el resultado en el mismo
registro. Por otra parte en el segundo
programa que también se encuentra
en la tabla 12, se emplea el par de ins-
trucciones “movlw0x01” y “addwf con-
tador,1”, las cuales en primer instan-
cia cargan el registro de trabajo W con
el valor al cual tendrá que ser incre-
mentado el registro contador, siendo
el valor de 01h para el presente ejem-
15
Figura 3. Diagrama de flujo de un
contador.
Figura 4. Diagrama de flujo de un
contador ascendente.
Figura 5. Diagrama de flujo de un
contador descendente.
plo, mientras que por medio de la ins-
trucción addwf, se realiza la suma del
registro contador con el valor que fue
cargado en el registro de trabajo W,
guardando el resultado de la suma en
el mismo registro contador; si fuera
necesario que el incremento que será
sumado al registro contador sea dife-
rente de 01h, tan sólo se tiene que car-
gar el valor correspondiente en el re-
gistro de trabajo W. Posterior al incre-
mento del registro contador se tiene
que verificar si ya se llegó al valor má-
ximo de eventos realizados. Para el
presente ejemplo el incremento se tie-
ne que realizar hasta que se alcanza
el valor máximo de 5 (el proceso de
comparación será mostrado con deta-
lle en el capítulo de funciones lógicas
que se encuentra dentro del presente
capítulo). El evento que se está con-
trolando es el de leer un dato a través
del puerto a, y escribir ese mismo da-
to en el puerto b.
Contador Descendente
El contador descendente a dife-
rencia del contador ascendente, reali-
za el control del contador a través de
un conteo descendente, tal como es
ilustrado en la figura 5.
Se observa gráficamente en el
diagrama de flujo de la figura 5 que
cuando se inicializa el registro conta-
dor, tiene que ser con el valor del total
de los eventos que tendrán que efec-
16
Tabla 12. Ejemplos de programa para un contador ascendente.
tuarse. A continuación se realiza la ac-
tividad del evento que se está contro-
lando, para posteriormente realizar un
decremento en el valor del registro
contador, recordando que el valor ini-
cial que se encuentra dentro del regis-
tro contador es el valor máximo de
eventos. El decremento que se realiza
en el registro contador puede ser de
unidad en unidad conforme se vayan
ejecutando los eventos uno a uno. Por
lo tanto, cuando se realice el último
evento, el valor que debe encontrarse
alojado en el registro contador es
igual a 0 (cero). El decremento puede
ser de unidad en unidad, o un valor di-
ferente de 1 lo que da origen el em-
pleo de las instrucciones “decf” o
“subwf” respectivamente.
En la tabla 13 se muestran 2 pro-
gramas que tienen implementados un
contador descendente cada uno, de
los cuales la diferencia radica en que
en un programa el decremento se rea-
liza mediante una instrucción que de-
crementa unidad por unidad (decf),
mientras que en el segundo programa
el decremento se realiza mediante
una instrucción de resta (subwf), en la
cual se puede definir el valor del de-
cremento, mediante un dato que se
guarda previamente en el registro de
trabajo W.
17
Tabla 13. Ejemplos de programa para un contador descendente.
Diseño de un Retardo
Básico por Bucles
Una de las aplicaciones que se re-
quiere implementar para controlar el
tiempo de un proceso es una rutina a
base de un contador en el cual se to-
ma en consideración el tiempo que
emplea una instrucción en ejecutarse.
La implementación de un retardo
por bucles (también llamado tempori-
zador) toma como base la estructura
de un contador, por lo que en primera
instancia se tiene que definir el tipo de
contador que será empleado. Normal-
mente se trata de utilizar contadores
descendentes, porque es más fácil
definir un valor inicial a partir del cual
se tendrá que ir decrementando hasta
llegar a cero. En la figura 6 se ilustra
el diagrama de flujo de un contador
descendente, a través del cual está
implementado el retardo.
La diferencia entre un temporiza-
dor y un contador es que el evento
que controla el temporizador se en-
cuentra relacionado con la función de
decrementar el dato del registro que
se emplea para contabilizar el tiempo
que está transcurriendo. La tempori-
zación se termina en el momento que
el registro decrementado llega a cero.
A partir del diagrama de flujo de la
figura 6, se obtiene el código que co-
rresponde con el programa de un tem-
porizador, el cual a su vez se muestra
en la tabla 14. Las líneas del progra-
ma que se encuentran relacionadas
de manera directa con la función del
temporizador son las que se muestran
en la tabla 14.
Del fragmento de programa mos-
trado en la tabla 14, se observa que
un registro llamado “contador” es el
que mantiene el control de la tempori-
zación, ya que en el programa este re-
gistro va decrementando su valor,
mientras se ejecutan las instrucciones
que conforman al código del tempori-
zador. Se observa también que el da-
to que se encuentra alojado en el re-
gistro “contador”, se decrementará
hasta que llegue a cero. Cuando el va-
lor del registro “contador” llegue a ce-
ro la temporización habrá terminado.
Mientras esto sucede, el microcontro-
lador se quedará cautivo realizando la
actividad de controlar al temporizador.
Hemos observado que la ejecu-
ción del programa que se encuentra
en la tabla 14 controla el tiempo de un
temporizador, pero la pregunta natural
que surge a continuación es: ¿De qué
manera podemos controlar el tiempo
en un programa temporizador? La
respuesta es la siguiente, si echamos
un vistazo al listado de instrucciones
del microcontrolador PIC, encontrare-
mos que la ejecución de las instruc-
ciones (cualquiera que sea) tienen im-
plícito el consumo de un tiempo, que
es el que se tarda la instrucción en lle-
varse a cabo (ejecutarse). Para deter-
minar el tiempo que tarda una instruc-
ción en ejecutarse, se hace referencia
a un término que nos auxilia en la de-
terminación de dicho tiempo. El térmi-
no es el denominado “ciclo de instruc-
ción” o simplemente “ciclo”. Este ciclo
a su vez se encuentra relacionado con
la frecuencia a la cual se ejecutan las
instrucciones en el microcontrolador,
recordando que se debe disponer de
un circuito oscilador el microcontrola-
dor. En el listado de instrucciones de
los microcontroladores PIC se indica
la cantidad de ciclos que consume la
ejecución de cada una de las instruc-
ciones que componen al listado.
Los ciclos de instrucción, o ciclos
en un microcontrolador PIC, equivalen
a la cuarta parte de la frecuencia que
proporciona el circuito oscilador.
18
Figura 6. Diagrama de flujo de
un retardo.
Tabla 14. Estructura básica de un temporizador.
En la tabla 15 se muestra el pro-
grama que controla a un temporiza-
dor. En él se observa de acuerdo con
el listado de instrucciones de un mi-
crocontrolador PIC, la cantidad de ci-
clos que consume cada una de las
instrucciones que conforman al pro-
grama del temporizador. Teniéndose
en cuenta que casi todas las instruc-
ciones requieren de un solo ciclo para
que la instrucción se ejecute comple-
tamente, en algunos casos las ins-
trucciones requieren 2 ciclos para
que éstas sean ejecutadas, y en otros
casos especiales, tal como es la ins-
trucción “decfsz”, requieren ya sea de
1 ó 2 ciclos, a continuación se explica
la manera en que trabaja la instruc-
ción y dependiendo de la situación la
cantidad de ciclos que consu-
me.
La instrucción “decfsz” lle-
va a cabo el decremento del
valor de un registro, y mien-
tras no llegue a cero el valor
del registro decrementado, se
ejecuta la instrucción que se
encuentra expresada debajo
de decfsz, consumiendo esta
actividad 1 ciclo. Pero si al
ejecutar la instrucción decfsz
el valor del registro decre-
mentado alcanzó el valor de cero, se
provoca un salto. Por lo tanto, el mi-
crocontrolador omitirá la ejecución de
la instrucción siguiente, pasando a la
que se encuentra en segundo término
después de decfsz, teniéndose en es-
ta actividad el consumo de 2 ciclos.
En la tabla 15 se muestran las
cantidades de ciclos que consumen
cada una de las instrucciones de un
temporizador. Por lo tanto, en princi-
pio con estos datos se deben contabi-
lizar la cantidad total de ciclos, que
fueron consumidos desde que se da
inicio con la rutina de temporización,
hasta que el valor del registro conta-
dor llega a cero. Para ello refiérase a
la tabla 16, en donde se muestra de-
talladamente la manera en que se lle-
va a cabo el conteo de los ciclos tota-
les.
El ejemplo mostrado en la tabla 16
nos indica que en el paso 1 las 2 pri-
meras instrucciones que son ejecuta-
das, cargan en el registro “contador”
el valor 02h. Por lo tanto, ya se tiene
el valor en el registro que se encarga-
rá de controlar al temporizador; como
paso siguiente se tiene la instrucción
“decfsz contador,1” que al ejecutarse
decrementa el valor del registro conta-
dor a la vez guarda el resultado en el
mismo registro; se tiene que recordar
que el valor inicial del registro “conta-
dor” es 02h, por lo que después de
ejecutar la instrucción, el valor que
ahora se encontrará en el registro
contador será el de 01h; como el re-
sultado en el registro conta-
dor no fue cero, la ejecución
de la instrucción “decfsz
contador,1” será de 1 ciclo;
posteriormente se lleva a
cabo la ejecución de “goto
bucle”, esta instrucción con-
sume 2 ciclos, y provoca
que se lleve a cabo un salto
al lugar donde se encuentra
la etiqueta bucle, preparan-
do una nueva secuencia en
el control del temporizador;
19
Tabla 16. Ejecución del programa temporizador.
Tabla 15. Cantidad de ciclos que consumen las instruc -
ciones de un temporizador.
de manera acumulada en esta etapa
se tiene un total de 3 ciclos.
En el paso 2 del programa de la
tabla 16, las instrucciones son ejecu-
tadas a partir de la ubicación de la eti-
queta bucle, por lo que a continuación
toca el turno nuevamente de la ins-
trucción “decfsz contador,1”, que al
ser procesada proporcionará como re-
sultado el decremento del valor del re-
gistro “contador”, que al inicio del pa-
so 2 se encontraba con un valor igual
a 01h, y después de ejecutar la ins-
trucción del decremento, el valor que
se encontrará en el registro “conta-
dor” será igual que cero, trayendo co-
mo consecuencia que en el paso 2 la
instrucción decfsz consuma 2 ciclos,
además de que la instrucción “goto
bucle” no será ejecutada, pasando a
la instrucción que continúa después
de goto, dando por terminado el pro-
ceso del temporizador; el paso 2 pro-
porciona un total de 2 ciclos.
La suma de los ciclos totales del
paso 1 con los del paso 2, dan un to-
tal de 5 ciclos que son los que se con-
sumen en el temporizador. Observe la
tabla 16. Para determinar el tiempo
que se consumió con la ejecución de
los 5 ciclos del programa temporiza-
dor, se debe calcular el tiempo que
consume cada ciclo de manera inde-
pendiente. Para ello nos basaremos
en las relaciones que son mostradas
en la tabla 17.
Del cálculo que se ha mostrado en
la tabla 17 se observa que el tiempo
resultante es muy pequeño. Por lo
tanto, si lo que se requiere es imple-
mentar un temporizador para un valor
de tiempo más amplio, se tiene que
20
Tabla 18. Tiempo base para un temporizador de 0.5mseg
Tabla 17. Relaciones matemáticas para calcular el tiempo.
colocar un valor más grande al regis-
tro “contador”, para que a su vez el
número de ciclos se incremente, tal
como se ilustra en el programa de la
tabla 18.
En el programa mostrado en la fi-
gura 18, se observa que las 2 prime-
ras instrucciones del paso 1 se em-
plean para cargar el valor 16610 en el
21
Tabla 19. Ejemplos con distintos valores de temporización.
Tabla 20. Programa con un temporizador de 1 segundo.
registro “contador”. Por otra parte,
mientras el valor del registro contador
sea mayor que cero, cada vez que es
decrementado el valor del registro
“contador” mediante la instrucción
decfsz, ésta consume 1 ciclo, más los
2 ciclos que aporta la instrucción goto.
Esto último significa que los 3 ciclos
resultantes se repetirán 165 veces,
porque el dato que está guardado en
el registro “contador” se estará decre-
mentando unidad por unidad, comen-
zando por valor de 16610 hasta llegar
a 110. En la tabla 18 se muestra en la
parte correspondiente al paso 1 la
cantidad de ciclos que se acumulan
mientras en valor en el registro “conta-
dor” es mayor que cero.
Para acceder al paso 2 en el pro-
grama de la tabla 18, el valor en el re-
gistro “contador” debe ser cero, por lo
que se tendrá que la ejecución de la
instrucción decfsz es de 2 ciclos. El to-
tal de ciclos se obtiene de la suma de
los generados en el paso 1 y en el pa-
so 2, dando un total de 497 ciclos.
Para calcular el tiempo en el que
se ejecutan los 497 ciclos, se hace re-
ferencia a las relaciones matemáticas
de la tabla 17, por lo que supongamos
que se tiene un oscilador de 4MHz,
con el que nos arrojará un término de
1 µseg, para cada ciclo que es ejecu-
tado, por lo tanto, los 497 ciclos son
ejecutados en 497 µseg, que a su vez
es un valor muy cercano a 500 µseg,
que también puede interpretarse co-
mo 0.5 mseg. El tiempo de 0.5 mseg
lo podemos tomar como base para a
partir de este valor generar temporiza-
dores más grandes, tal como se
muestra en los ejemplos de la tabla
19. En los ejemplos mostrados en la
tabla 19 se muestra que se puede rea-
lizar un conteo largo de tiempo, y pa-
ra ello basta con generar una estruc-
tura de contadores descendentes ani-
dados unos en otros, esto es, en el
momento que un contador ha llegado
a cero el valor de un registro, se pro-
cede a decrementar el valor de otro
registro, y así sucesivamente, hasta
que todos los registros involucrados
son decrementados totalmente, gene-
rando bases de tiempo como las mos-
tradas en los ejemplos ilustrados en la
tabla 19.
Por último, se recomienda que pa-
ra implementar una rutina con tempo-
rizador dentro de un programa, se
realice por medio de la invocación de
una subrutina, para que cuando ésta
agote el tiempo que ha sido estableci-
do mediante el cálculo correspondien-
te, el programa continúe con la se-
cuencia normal en cuanto a la ejecu-
ción de las instrucciones, y cuando
nuevamente requiera ser empleada la
rutina del temporizador, nuevamente
sea llamada mediante un servicio de
subrutina.
En la tabla 20 se muestra el pro-
grama que emplea una rutina con un
temporizador de 1 segundo, que es
llamado mediante una subrutina cada
vez que se manipula el bit 2 del puer-
to B. El temporizador es empleado pa-
ra mostrar el cambio que se manifies-
ta en el bit 1 del puerto A. Cabe recor-
dar que cada vez que es empleada la
rutina temporizadora, el microcontro-
lador dedica toda su atención a la eje-
cución del temporizador, olvidándose
durante ese período de tiempo de las
demás actividades a las que tiene que
controlar.
Suma Aritmética
La realización de operaciones arit-
méticas básicas es un factor muy im-
portante en el desarrollo del código de
un programa para un proyecto que
emplea algún microcontrolador, moti-
vo por el cual en primera instancia co-
menzaremos con la operación de la
suma aritmética, y para ello recorda-
remos la manera en cómo aprendi-
mos a realizarla en nuestros estudios
primarios, ya que para efectos de pro-
gramación en un microcontrolador se
hace de la misma manera.
Para comprender la forma en que
se hacen las sumas en un microcon-
trolador, vamos a realizar un ejemplo
con números decimales, tal como se
ilustra en la tabla 21.
Del ejemplo 1 mostrado en la tabla
21, se observa la suma de 2 números
cuya magnitud es de un dígito respec-
tivamente (2 + 3), el resultado de la
suma se expresa de igual manera me-
diante un solo digito (5). Por lo tanto
se asume que al “caber” el resultado
en un digito, el acarreo que se generó
en la suma es igual a cero. Ahora ob-
servemos el ejemplo 2 de la misma ta-
bla 21, en donde de nuevo se realiza
una suma de 2 números con magnitud
de 1 dígito en cada uno de ellos (5 +
6), el resultado en esta oportunidad es
un número que ocupa 2 dígitos (11).
Por lo tanto, el resultado no se puede
expresar en un solo digito ya que no
cabe. Para este caso el resultado final
se descompone generando un resul-
tado de un dígito (el valor 1) y un aca-
rreo (el valor decimal 1), para que se
le dé continuidad al número de dígitos
que se está empleando.
De la misma manera en que se
realiza una suma aritmética con nú-
meros decimales, se aplica el mismo
procedimiento para números binarios
que son con los que trabaja el micro-
controlador. Por lo tanto, se debe to-
mar en cuenta la cantidad de bits que
componen a los números binarios que
serán operados, ya que de acuerdo a
las cantidades que se sumen se pue-
22
Tabla 21. Ejemplos de una suma aritmética con números decimales.
den generar acarreos, los mismos que
deben tomarse en cuenta para obte-
ner un resultado real. De otra manera
sería erróneo el resultado.
En los ejemplos expresados en la
tabla 22 se muestran las sumas de
números binarios compuestos por 8
bits cada uno de ellos, y en cada una
de las operaciones se van sumando
los números bit a bit, de tal suerte que
el resultado al que se llega en el ejem-
plo 1 el acarreo es igual a cero, lo que
significa que el resultado se puede ex-
presar mediante 8 bits. Por otra parte,
el resultado que se muestra en el
ejemplo 2 requiere de un bit de más,
ya que el resultado prácticamente no
puede expresarse mediante 8 bits,
porque se perdería el dato final. Para
que el resultado de la suma pueda
considerarse como un número com-
pleto, a los 8 bits, se les tiene que
agregar un bit más que recibe el nom-
bre de bit de acarreo.
Para realizar la suma de 2 núme-
ros binarios de 8 bits en un microcon-
trolador PIC, se puede emplear una
de dos instrucciones de acuerdo a la
forma en que se requieran aplicar. Las
instrucciones de suma con las que
cuentan los microcontroladores PIC
se describen a continuación:
a) addlw k.-
Suma el dato que se encuentra en
el registro de trabajo W con el de un
valor literal dejando el resultado en el
registro de trabajo W, modificando su
valor con respecto del que tenia ante-
riormente. El dato del registro de tra-
bajo W como el del valor literal son de
8 bits.
b) addwf f,d.-
Suma el dato que se encuentra en
el registro de trabajo W con el valor de
un registro f (registro de memoria
RAM) dejando el resultado de la suma
ya sea en el registro de trabajo W o en
el registro f, dependiendo del valor
que adquiera d (para una mejor refe-
rencia consulte el capítulo “instruccio-
nes orientadas al control de registros”
e “instrucciones orientadas al control
de literales”, ambos temas pertene-
cientes al módulo I).
Cabe aclarar que siempre que se
requiera sumar el dato de 2 registros
de memoria RAM, en un microcontro-
lador PIC se tiene que hacer median-
te la carga previa del valor de uno de
los registros a W, ya que en un micro-
controlador PIC no existe una instruc-
ción que realice la suma de valores
entre 2 registros de memoria RAM de
manera directa.
A continuación procederemos a
explicar la manera en que se realiza la
suma aritmética de dos valores de 8
bits con un microcontrolador PIC, tal
como se ilustra en el bloque del dia-
grama de flujo de la figura 7, en don-
de se tiene que sumar el dato del re-
gistro var1 con el dato del registro
var2 y el resultado de la suma alojarlo
en el registro var3. Para ello en prime-
ra instancia se tiene que enviar el da-
to de cualquiera de los registros que
se van a sumar al registro de trabajo
W, para posteriormente sumar el dato
del registro W con el dato del registro
restante, tal como se ilustra en el frag-
mento de código expresado en la ta-
bla 23.
El fragmento de código mostrado
en la tabla 23 es el correspondiente al
de una suma entre registros de 8 bits,
pero si el resultado de la suma produ-
ce un acarreo, significa que el dato re-
sultante de la suma fue mayor a 8 bits.
Por lo tanto, se debe de tomar en
cuenta el bit de acarreo tal como se
ilustra en el diagrama de flujo de la fi-
gura. Después de realizar la suma
que se ilustra en el diagrama de flujo
de la figura 8, se tiene que revisar el
estado que se generó en el bit que in-
dica la formación de un acarreo cuan-
do se aplicó la operación de la suma.
El bit de acarreo se encuentra ubica-
do dentro del registro “status”, por lo
que el bit de acarreo es una bandera
23
Tabla 22. Ejemplos de una suma aritmética con números binarios.
Figura 7. Suma de 2 registros de 8 bits.
Figura 8. Diagrama de flujo de
una suma de registros de 8 bits.
Tabla 23. Suma de 2 registros.
que indica cualquiera de los siguien-
tes estados:
• Si el bit de acarreo “C” es igual a
0 ,significa que el resultado de una su -
ma es igual o menor a los 8 bits de los
registros a sumarse.
• Si el bit de acarreo “C” es igual a
1, significa que el resultado de una su -
ma es mayor de los 8 bits de los regis -
tros a sumarse.
El bit de acarreo debe tomarse en
cuenta, ya que si el resultado sólo es
expresado mediante los 8 bits, el re-
sultado final no será correcto. Es por
ello que si al verificar el bit de acarreo
éste tiene un 1 lógico, se tiene que
guardar el bit que rebasa a los 8 para
que se tenga un resultado correcto,
por lo que ahora el resultado será ex-
presado por 2 registros de 8 bits en lu-
gar de solo uno. En el diagrama de
flujo de la figura 8, el registro donde
se van acumulado los bits de acarreo
está identificado como registro de
“acarreo”. En el código expresado en
la tabla 24 se muestra el programa co-
rrespondiente a la suma del diagrama
de flujo de la figura 8.
Por otra parte, para realizar sumas
con datos de registros de más de 8
bits, implica que debemos armar da-
tos con más de un registro. Por ejem-
plo, para realizar sumas con datos de
16 bits se necesita el espacio de 2 re-
gistros. Para ello se debe tomar en
cuenta el orden de cada uno de los
bits que componen a los datos, sobre
todo para determinar el peso específi-
co de cada uno de los registros, que
en esta oportunidad al tratarse de un
dato de 16 bits, uno de los registros
será considerado como el byte menos
significativo, y el segundo registro co-
mo el byte más significativo.
En la figura 9 se ilustra la necesi-
dad de realizar una suma aritmética
entre 2 datos compuestos por 16 bits
cada uno, por lo que tendremos que
recurrir a lo expresado en la tabla 25,
en donde se muestra la manera de có-
mo deben ordenarse los registros de 8
bits, que están involucrados con la
operación de datos de 16 bits y que
pertenecen a los sumandos.
Los datos identificados como
“oper1”, “oper2” y “oper3” se encuen-
tran conformados por 2 registros de 8
bits cada uno de ellos. Dichos regis-
tros deben de ser operados en el or-
den que aparecen en la tabla 25, por-
que cada uno de los registros contie-
ne un peso específico. El resultado de
la operación de la suma se guarda en
los registros que para tal efecto fueron
24
Tabla 24. Programa que suma 2 registros de 8 bits.
Tabla 25. Estructura de una suma con datos de 16 bits.
Figura 9. Suma entre 2 datos de
16 bits.
contemplados, tomando en cuenta el
valor del posible acarreo.
Para iniciar la adición de datos de
16 bits, primero se suman entre sí los
registros de menor peso de cada ope-
rando, identificados como “reg2” y
“reg4”. El resultado de la suma se alo-
ja en el registro “reg6”. Además al re-
sultado de esta primera suma se veri-
fica si se originó un acarreo. Si fue
así, este acarreo se tiene que adicio-
nar al registro de mayor peso (“reg1”)
del primer operando. En el diagrama
de flujo de la figura 10 se ilustra una
suma de 2 operandos de 16 bits.
Posteriormente se realiza la adi-
ción de los registros de mayor peso de
cada uno de los operandos (tomando
en cuenta el acarreo, si es que lo hu-
bo, en la suma de los registros de me-
nor peso de los operandos). El resul-
tado de esta segunda suma se guarda
en el registro “reg5”.
Por último, para que el resultado
final de la suma sea correcto, debe
contemplarse además de los registros
donde se colocará el resultado (reg5 y
reg6), un registro más para que ahí se
aloje el acarreo que se origine con la
segunda adición entre los registros de
mayor peso de los operandos. De otra
manera, si existiera un acarreo y no
se tomara en cuenta, el resultado total
de la suma sería completamente erró-
neo. En la tabla 26 se muestra el có-
digo para un programa en donde se
suman 2 datos de 16 bits.
Cuando sea necesario realizar su-
mas con operandos de más de 8 bits,
el procedimiento para realizarlas es
tal como el ilustrado en la tabla 25, to-
mando en cuenta que la suma total se
va realizando por medio de registros
de 8 bits, por lo que podemos hacer
sumas con datos de 16, 24, 32, ….
Bits. En todas las sumas se debe to-
mar en cuanta el acarreo que se va
generando cada vez que se van su-
mando registros de 8 bits.
En los códigos de los programas
que se han ilustrado, se ha empleado
25
Figura 10. Diagrama de flujo de
una suma entre datos de 16 bits. Tabla 26. Programa que suma 2 datos registros de 16 bits.
un microcontrolador PIC16F628A, pe-
ro puede emplearse cualquier micro-
controlador, ya que el código de las
sumas no cambia.
Resta Aritmética
La resta es una de las operacio-
nes aritméticas que pueden realizarse
con un microcontrolador PIC, siendo
esta operación muy útil para aplicacio-
nes que tengan que desarrollarse, co-
mo lo son por ejemplo para una fun-
ción con un convertidor analógico - di-
gital. En la tabla 27 se muestra una
operación de resta típica con números
decimales. En un microcontrolador
PIC la operación de la resta se realiza
por medio de una instrucción que a su
vez recurre al método de restas por
complemento a 2. En la tabla 28 se
ilustra un ejemplo de resta que utiliza
complemento a 2 para realizar la ope-
ración.
Una resta por complemento a 2 se
realiza a través de sumas, las cuales
en primer término tiene que comple-
mentarse el operando llamado sus-
traendo tal como se ilustra en la tabla
28. Para complementar al sustraendo
se efectúa la acción de cambiar los
unos (1's) por ceros (0's) y los ceros
por unos. Posteriormente al comple-
mento se le adiciona una unidad, dan-
do como resultado el complemento a
2 del operando sustraendo. El sus-
traendo (complementado a 2) se su-
ma al minuendo obteniendo como re-
sultado el de la resta del minuendo
menos el sustraendo.
Todo el procedimiento de la resta
por complemento a 2 la tiene imple-
mentada el microcontrolador PIC a
través de 2 instrucciones que efec-
túan el mismo procedimiento. Las ins-
trucciones de resta se describen a
continuación:
a) sublw k.-
Resta el dato que se encuentra en
el registro de trabajo W con el de un
valor literal dejando el resultado en el
registro de trabajo W, modificando su
valor con respecto del que tenia ante-
riormente. El dato del registro de tra-
bajo W como el del valor literal son de
8 bits.
b) subwf f,d.-
Resta el dato que se encuentra en
el registro de trabajo W al del valor de
un registro f (registro de memoria
RAM) dejando el resultado de la suma
ya sea en el registro de trabajo W o en
el registro f, dependiendo del valor
que adquiera d (para una mejor refe-
rencia consulte el capítulo “instruccio-
nes orientadas al control de registros”
e “instrucciones orientadas al control
de literales”, ambos temas pertene-
cientes al módulo I).
Las instrucciones “sublw” y
“subwf” emplean el método de restas
por complemento a 2, además de que
ambas instrucciones operan 2 datos
de 8 bits cada una. En cualquier mi-
crocontrolador al ejecutar las instruc-
ciones de restas, el resultado debe in-
dicarse ya sea que se obtenga un va-
lor positivo o uno negativo. Para el ca-
so de los microcontroladores PIC los
números negativos y positivos se indi-
can a través de la bandera del acarreo
que se encuentra dentro del registro
status. Cuando la bandera del acarreo
se coloca en 1 lógico después de rea-
26
Tabla 27. Ejemplos de una suma aritmética con números decimales.
Tabla 28. Realización de una resta por complemento a 2.
Tabla 29. Resta con resultado negativo.
lizar una resta, significa que el resulta-
do de la resta es positivo, y por el con-
trario, cuando la bandera de acarreo
se coloca en 0 lógico después de rea-
lizar una resta, significa que el resulta-
do de la resta fue negativo, y por lo
tanto, el dato que se obtuvo tiene que
complementarse a 2 para obtener la
magnitud correcta, pero con el conoci-
miento de que el valor fue negativo, tal
como se ilustra en la tabla 29.
Las restas que se realizan directa-
mente con las instrucciones que con-
tienen los microcontroladores PIC, se
pueden operar con datos de 8 bits, re-
cordando que la resta entre sí de 2 re-
gistros de memoria RAM, no puede
realizarse de manera directa, por lo
que es necesario cargar uno de los
datos al registro W, y después aplicar
la instrucción de la resta necesaria. A
manera de ejemplo se muestra una
sustracción en el fragmento de diagra-
ma de flujo de la figura 11.
Para emplear adecuadamente las
instrucciones de resta de un micro-
controlador PIC y de acuerdo con la fi-
gura 11, el dato del primer registro que
debe cargarse al registro de trabajo
W, es el que se encuentra identificado
como var2, para posteriormente em-
plear la instrucción subwf, guardando
el resultado de la resta en el registro
de trabajo W, y por último en un si-
guiente paso enviar el dato de W al re-
gistro var3. El código correspondiente
a la descripción que se acaba de rea-
lizar se expresa por medio del frag-
mento del programa que se ilustra en
la tabla 30.
En la tabla 30 se muestra un frag-
mento de código para realizar una
resta entre 2 datos de 8 bits, en el cual
no se toma en cuenta el posible resul-
tado negativo o positivo, motivo por el
cual, para que el dato que se obtenga
de la resta este sea correcto y con la
debida interpretación, se tiene que
realizar el procedimiento que se
muestra en el diagrama de flujo de la
figura 12, en el cual se toma en cuen-
ta si el resultado de la sustracción fue
negativo o positivo, mediante la com-
paración del bit que indica el estado
de la bandera del acarreo del registro
“status”. El bit de la bandera del aca-
rreo nos indica si un resultado fue po-
sitivo o negativo, después de haber
ejecutado una instrucción de una res-
ta de acuerdo a lo siguiente:
a) Si el bit de la bandera del aca -
rreo (c) del registro status es igual a 0
(cero), el resultado de la resta fue ne -
gativo.
b) Si el bit de la bandera del aca -
rreo (c) del registro status es igual a 1
(uno), el resultado de la resta fue po -
sitivo.
Por lo tanto, si el resultado de la
resta fue positivo, no se tiene que rea-
lizar actividad alguna sobre el registro
donde se encuentra el resultado de la
sustracción, mientras que por otra
parte, si la resta presentó un resultado
negativo, entonces en el registro don-
de se guardó el dato resultante de la
sustracción contiene un
valor complementado,
por lo que a continua-
ción se tiene que reali-
zar el procedimiento de
complementar a 2 di-
cho resultado negativo
para obtener la magni-
tud del valor de la res-
ta, y aparte en otro re-
gistro activar un valor
que indique que el re-
sultado fue negativo
(para el caso del dia-
grama de flujo de la fi-
gura 12, el registro se
llama “negativo”).
En la tabla 31 se
encuentra el código del
programa de una resta
de 2 registros cuyos
datos son de 8 bits ca-
da uno. En el programa se encuentran
definidos los registros que se están
empleando para realizar la sustrac-
ción, además de la correspondiente
parte donde se realiza la verificación
del bit que funciona como bandera del
acarreo, para determinar si el resulta-
do de la resta fue negativo o positivo.
En el código del programa se mues-
tran todas las instrucciones relaciona-
das con la resta, pero para una aplica-
ción completa se debe de cambiar el
renglón que dice “siguiente proceso”,
por las instrucciones de la parte que
tenga que continuar después de ha-
27
Figura 11. Resta de 2 registros
de 8 bits.
Tabla 30. Resta de 2 registros.
Figura 12. Diagrama de flujo de una resta de re -
gistros de 8 bits.
ber realizado la operación de la sus-
tracción, pero para un empleo directo
para practicar con el programa, tan
solo cambie el renglón “siguiente pro-
ceso” por el de un “goto inicio” y tam-
bién se tienen que eliminar los puntos
suspensivos.
Ahora procederemos a explicar el
proceso que tiene que seguirse cuan-
do se requiere realizar una resta con
datos de más de 8 bits, como es el ca-
so de una resta con datos de 16 bits,
en la cual se debe de tener una meto-
dología apropiada para que se obten-
ga como resultado final una magnitud
además de un indicativo de que el re-
sultado fuese positivo o negativo. Pa-
ra realizar las restas de 16 bits se tie-
nen que reservar dos registros de 8
bits, para cada uno de los operandos
que pertenecerán a la sustracción, por
lo que cada operando tendrá que aco-
modarse de acuerdo con el peso es-
pecífico de cada uno de los bits que lo
componen. En la tabla 32 se ilustra la
estructura de una resta con datos de
16 bits. De la tabla 32 observamos
que los operandos se encuentran con-
formados de la siguiente manera; el
operador minuendo identificado como
oper1 está integrado por los registros
reg1 y reg2, de los cuales el que tiene
el menor peso es el reg2; por lo tanto
el de mayor peso es reg1. El operador
sustraendo se encuentra identificado
como oper2, y se encuentra compues-
to por los registros reg3 y reg4, de los
cuales el que tiene el menor peso es
el reg4, y el registro de mayor peso es
el reg3. El resultado de la sustracción
se guardará en el operando identifica-
do como oper3, el cual se encuentra
integrado por los registros reg5 y
reg6, de los cuales el de menor peso
es el reg6, mientras que el de mayor
peso es el registro reg5.
Cabe aclarar que los operandos
oper1, oper2 y oper3, sólo se conside-
ran como una convención para consi-
derar que se trata de datos de 16 bits.
Por lo tanto, estos operandos no exis-
ten en el código del programa, pero sí
los registros que los conforman, y por
lo tanto, los operandos se encuentran
representados por los registros que
los integran. En la figura 13 se mues-
tra la operación de una resta aritméti-
ca con datos de 16 bits, la cual es el
reflejo de la operación realizada en la
tabla 32.
Para comenzar con la resta de da-
tos de 16 bits, primero se sustraen en-
tre si los registros de menor peso de
cada operando (minuendo menos el
sustraendo), dichos registros se iden-
tifican como “reg2” y “reg4”. El resulta-
do de la resta se aloja en el registro
“reg6”, por otra parte, al resultado de
esta primera resta se verifica si se ori-
28
Tabla 31. Programa que resta 2 registros de 8 bits.
Tabla 32. Estructura de una resta con datos de 16 bits. Figura 13 Resta de 2 datos de 16 bits.
ginó un acarreo (recordando que de
esta manera se sabe si el resultado
fue negativo o positivo). Sí fue origina-
do un acarreo con un 1 lógico en la
respectiva bandera del registro status,
significa que el resultado parcial fue
positivo procediendo a realizar la si-
guiente resta entre registros de mayor
peso sin ninguna operación adicional.
Pero si en la bandera del acarreo se
originó un 0 lógico, significa que el re-
sultado parcial fue negativo, por lo
que se le tiene que restar una unidad
al registro de mayor peso del opera-
dor minuendo, en este caso el decre-
mento de una unidad se le tiene que
aplicar al registro reg1, y después se
procede a realizar la sustracción de
los registros de mayor peso del mi-
nuendo y sustraendo, en el diagrama
de flujo de la figura 14 se ilustra la res-
ta de 2 operandos de 16 bits.
Por último, se realiza la sustrac-
ción de los registros de mayor peso de
cada uno de los operandos identifica-
dos como minuendo y sustraendo (to-
mando en cuenta el acarreo, si es que
lo hubo, en la resta de los registros de
menor peso de los operandos), el re-
sultado de esta segunda resta se
guarda en el registro “reg5”.
Basándonos en el diagrama de
flujo de la figura 14, posterior al haber
encontrado el resultado completo de
la resta, y después de la determina-
ción de que el resultado fue negativo,
existe un bloque que dice “comple-
mentar a 2 el dato completo de re-
g5,reg6”, se refiere a encontrar la
magnitud del resultado final, y para
ello realizaremos la actividad que se
describe a continuación.
Para realizar el complemento a 2
de un número de 16 bits se sigue el
mismo procedimiento que se emplea
para un número de 8 bits, por lo tanto
en primer instancia se tienen que sus-
tituir los 1's por 0's y los 0's por 1's,
para posteriormente sumarle una uni-
dad al registro de 8 bits que compone
la parte baja del dato de 16 bits, se
debe de tomar en cuenta que al sumar
la unidad se puede generar un aca-
rreo que puede afec-
tar al registro de 8
bits que conforma la
parte alta de los 16
bits (recurra al capi-
tulo de la suma arit-
mética que se en-
cuentra antes del ca-
pítulo presente), en
la tabla 33 se mues-
tra un ejemplo en
donde se realiza una
resta de 2 datos de
16 bits, siendo el re-
sultado final negati-
vo, y la aplicación del
complemento a 2 del
resultado final, para
obtener la magnitud
de la resta.
Por último en
cuanto a las restas
de datos de 16 bits,
en la tabla 34 se
muestra el código del
programa correspon-
diente, en el se en-
cuentran identifica-
das por medio de co-
mentarios todas las
partes que confor-
man al diagrama de
29
Tabla 33. Complemento a 2 de un resultado negativo en una resta
de datos de 16 bits.
Figura 14. Diagrama de flujo de una resta de
datos de 16 bits.
flujo de la figura 14. 0000-+. El códi-
go del programa que se encuentra ex-
presado en la tabla 34, esta completo
en cuanto a la operación de la resta
de números de 16 bits, pero para car-
garlo en un microcontrolador PIC, se
recomienda cambiar el renglón que
tiene la siguiente leyenda “siguiente
proceso” así como los puntos, por el
código que tenga que ejecutar el mi-
crocontrolador, después de realizar la
resta de 16 bits.
Para terminar el presente capítulo
diremos que el método para realizar
restas de datos con más de 16 bits, es
prácticamente el mismo que con 16
bits, ya que de requerir números más
grandes, tan sólo se deben contem-
plar todos los registros de 8 bits, que
se requieran para conformar a los da-
tos que intervendrán en la resta, ade-
más de también contemplar al bit de
acarreo para determinar si los resulta-
dos parciales o el resultado final fue
positivo o negativo.
Multiplicación Aritmética
La operación aritmética de la mul-
tiplicación es necesaria cuando se re-
quiere emplear herramientas que po-
see un microcontrolador PIC, para
realizar procesos de mediana o alta
complejidad. En los microcontrolado-
res PIC no existe una instrucción que
de manera directa realice una multipli-
cación de 2 números, como puede ha-
cerla para las operaciones de las su-
mas y las restas.
Para implementar una multiplica-
ción de 2 datos en un microcontrola-
dor PIC, se tiene que hacer uso de la
teoría de operación de una multiplica-
ción, que se basa en una secuencia
de sumas, las cuales deben de ser
contabilizadas, por lo que en general
se recurre al empleo tanto de las su-
mas como de contadores.
Vamos a explicar la manera en
que se realiza una multiplicación por
medio de una serie de sumas, para
ello nos basaremos en el ejemplo
mostrado en la tabla 35.
Del ejemplo de la multiplicación
mostrado en la tabla 35, observamos
que para obtener un resultado se de-
be de sumar sobre si mismo el valor
expresado en el término multiplican-
do, tantas veces como el valor ex-
puesto en el operando multiplicador.
De lo anterior deducimos que la
operación de la multiplicación es un
proceso derivado de las operaciones
de sumas, por lo que se deben de
contemplar todas las características
del proceso de las sumas para obte-
ner un resultado confiable, recordan-
do que de acuerdo a la magnitud de
los operandos se puede generar un
acarreo, el cual debe alojarse o su-
marse en el registro correspondiente.
Con respecto al ó las localidades
de memoria (registros) en donde se
guardara el resultado de la multiplica-
ción, debe de reservarse la cantidad
exacta de estos para que el resultado
no se vea truncado, o se tengan regis-
tros desperdiciados sin utilizarse. Pa-
ra calcular la cantidad de registros
que se destinaran para el resultado,
se debe conocer el tamaño en bits de
los operandos (considerando que los
registros cuentan con un tamaño de 8
bits cada uno), por lo tanto, el tamaño
30
Tabla 35. Ejemplo de una multiplicación aritmética.
Tabla 34. Programa que resta 2 registros de 16 bits.
del o los registros estarán definidos
también en bits. La manera de calcu-
lar la cantidad de bits que se emplea-
ran para el resultado, se basa en la
simple suma de todos los bits que
conforman tanto al término del multi-
plicando como al del multiplicador; lo
anterior se expresa de una manera
mucho más simple a través de la si-
guiente fórmula:
(# de bits para el resultado) = (# de
bits del multiplicando) + (# de bits del
multiplicador)
En donde el símbolo # significa
número A continuación vamos a defi-
nir por medio de un diagrama de flujo,
el proceso para realizar una multipli-
cación de dos datos que se encuen-
tran conformados por 8 bits (1 registro
cada uno), por lo que para alojar el re-
sultado se necesita de un total de 16
bits (equivalente a 2 registros). En el
diagrama de flujo de la figura 15 se
ilustra el proceso que se sigue para la
realización de una multiplicación de 2
operandos de 8 bits cada uno de ellos.
Del diagrama de flujo de la figura
15 se observa que los registros identi-
ficados como “res0” y “res1”, son lo
que se encuentran destinados para
alojar el resultado de la multiplicación,
por lo tanto se debe definir el peso es-
pecífico de cada unos ellos, quedando
el registro res1 como el de mayor pe-
so, mientras que el registro res0 es el
de menor peso.
En los registros identificados co-
mo “multiplicando” y “multiplicador” se
encuentran los datos que van a ser
multiplicados. Por último el registro
identificado como “contador” es el en-
cargado de llevar el control del núme-
ro de veces que se realiza la opera-
ción de la suma. Los registros res0,
res1 y contador deber inicializados
con un valor igual a 0 (cero) al inicio
de una operación de multiplicación.
En el registro multiplicando se en-
cuentra el dato que será sumado, tan-
tas veces como lo indique el valor que
se encuentra en el registro multiplica-
dor. La serie de sumas se van reali-
zando de acuerdo con el dato que se
encuentra contenido dentro del regis-
tro multiplicando, por lo que se man-
tiene como un valor constante, siendo
el registro res0 donde se va guardan-
do el resultado de las sumas que se
van efectuando.
De a cuerdo con la cantidad de
bits que conforman a los registros de
los operandos que se están multipli-
cando, se tiene contemplado que el
resultado de la multiplicación se aloje
en 16 bits o sea 2 registros, por lo tan-
to, posterior a la suma del valor del
multiplicando se tiene que verificar si
el resultado genero un acarreo, por-
que si es así, también tiene que incre-
mentarse una unidad al valor del re-
gistro resg1.
Siempre después de realizar la su-
ma del valor del multiplicando se in-
crementa en una unidad el valor del
registro contador, para poder controlar
el número de veces que se ha efec-
tuado la suma, por lo tanto, en segui-
da que se incrementa el valor del re-
gistro contador, se realiza una compa-
ración entre el valor del registro conta-
dor con el del registro multiplicador,
cuando estos registros contengan el
mismo valor, será hasta entonces
cuando el proceso de la suma tenga
que detenerse, ya que en ese mo-
mento la multiplicación habrá termina-
do, y en los registros res0 y res1 se
tendrá el dato resultante.
Para cualquier multiplicación se
emplea el mismo procedimiento que
31
Figura 15 Diagrama de flujo de una
multiplicación con datos de 8 bits.
Tabla 36. Programa que multiplica 2 registros de 8 bits.
se mostró en el diagrama de la figura
15, teniendo en cuenta el tamaño de
los operandos, para determinar la
cantidad de registros que tendrán que
emplearse para guardar el resultado,
y para ello se debe tomar en conside-
ración el proceso que se aplica para la
realización de las sumas.
División Aritmética
La operación aritmética de la divi-
sión debe ser implementada por me-
dio del uso de instrucciones que nada
tienen que ver con una división, ya
que en un microcontrolador PIC no
existe una instrucción directa por me-
dio de la cual se realice una división
entre 2 datos.
Un método para efectuar una divi-
sión aritmética en un PIC es emplear
una serie de restas, a través de las
cuales se tendrá como resultado el
correspondiente residuo que va gene-
rando la división, mientras que a tra-
vés del conteo del número de restas
que tienen que hacerse, se obtiene el
resultado final de una división. En la
tabla 37 se muestra el ejemplo de una
división aritmética, en la cual se recu-
rre al concepto básico por medio del
cual se realizan las divisiones.
Cuando no existe una instrucción
para realizar divisiones, tal como es el
caso de un microcontrolador PIC, te-
nemos que recurrir a un procedimien-
to como el ilustrado en el ejemplo de
la tabla 37, en el cual la operación bá-
sica es una resta, por lo tanto, se tie-
ne que aplicar dicha metodología para
encontrar el resultado de la operación
de la división. Para comenzar una di-
visión por medio del empleo de restas,
se toma el valor que se encuentra en
el “dividendo”, al cual se le resta la
magnitud que se localiza en el “divi-
sor”, el resultado de la resta debe con-
tener un valor mayor que el del divisor
para que sea aplicada una nueva res-
ta; mientras se van aplicando las res-
tas, estas se van contabilizando.
Cuando el resultado de la resta es
menor que el valor del divisor, enton-
ces el número de restas es igual al va-
lor entero del “cociente” (resultado de
la división), si el “residuo” (resultado
de la última resta) obtuvo un valor
igual con cero, entonces hemos termi-
nado con la división, pero si el residuo
tiene un valor diferente de cero pero
menor que el del divisor, entonces se
considera que se coloca un punto de-
cimal en el cociente, por lo que se to-
ma el valor que se encuentra en el re-
siduo para multiplicarlo por 10 (equi-
vale a bajar un cero, tal como se ilus-
tra en el ejemplo de la tabla 37), pos-
teriormente el resultado de la multipli-
cación es asignado nuevamente al
termino dividendo, para que se reanu-
de la aplicación de las restas, toman-
do el divisor como el valor que será
restado al nuevo dividendo. Este pro-
cedimiento se repetirá tantas veces
como decimales se quieran obtener,
solo que para encontrar el siguiente
decimal, el residuo tendrá que multi-
plicarse por 100, y después por 1000
y así sucesivamente.
Lo importante para realizar una di-
visión aritmética con un microcontrola-
dor PIC, es considerar la cantidad de
decimales que confor-
maran al cociente, para
destinar los registros que
habrán de utilizarse para
expresar el resultado de
la división. Por otra par-
te, el resultado de la divi-
sión se expresara por
medio de varios regis-
tros, los cuales deben
ser tomados en cuenta
para interpretar de ma-
32
Tabla 37. Ejemplo de una división aritmética.
Figura 16. Diagrama de flujo de una división.
nera adecuada el resultado final de la
división. En el diagrama de flujo de la
figura 16 se ilustra el proceso para
realizar una división aritmética, en la
cual la operación principal es la resta
entre los registros dividendo menos el
divisor, guardando el resultado de la
resta en mismo registro dividendo, por
lo tanto, este dato se actualizara
mientras se estén realizando las res-
tas. Del proceso de la resta es impor-
tante verificar el estado de la bandera
del “acarreo” (C), recordando que es-
ta bandera se encuentra dentro del re-
gistro “status”. La importancia de la
bandera radica en el hecho de saber
si un resultado después de realizar
una resta es igual con menor que el
divisor (si el resultado de la resta, es
menor que el divisor significa que ha
terminado una fase de la división).
Mientras el resultado de la resta sea
mayor que el divisor, se contabilizan
las restas que se vayan realizando,
pasando este dato a ser parte del va-
lor del cociente. Cuando en el resulta-
do de la resta se identifica que el va-
lor es menor que el del divisor, se pro-
cede a reponer el valor que fue sus-
traído durante la última resta, para
posteriormente multiplicarlo por el va-
lor de 10 (lo que equivale a bajar un
cero en el proceso que realizamos de
una división hecha a mano), y se repi-
te nuevamente todo el desarrollo de
realización de restas para obtener
ahora la parte del cociente que se en-
cuentra después del punto decimal.
En la tabla 38 se muestra el código
que corresponde al programa de una
división, en el cual está identificada la
parte en la que se realizan las restas
para obtener el resultado entero del
cociente. Por otra parte, también se
muestra la ejecución del código que
se refiere a la multiplicación para pos-
teriormente continuar con las restas, y
así obtener la parte decimal del co-
ciente. La parte de la multiplicación se
recomienda que se realice a través de
una subrutina, para que no se dupli-
que con una gran extensión el código.
En el programa mostrado en la tabla
38 el código no se encuentra expresa-
do por medio de subrutinas, por lo que
tan sólo tiene que adecuarse el pro-
grama para que pueda ser empleada
la subrutina. *******
33
Tabla 38. Programa que realiza divisiones.
35
Las rutinas intermedias están implementadas, mediante la activación de las distin -
tas herramientas internas que posee el microcontrolador PIC, además de una serie de
conjuntos de instrucciones, que de manera organizada realizan un trabajo mediante el
cual, se auxilia el microcontrolador en las distintas tareas que tiene que desempeñar.
En primer instancia se encuentran las funciones lógicas AND, OR, y XOR, median -
te las cuales se pueden implementar “filtros” para discriminar o tomar en cuenta solo
los bits que sean interesantes, dentro de un registro completo de 8 bits por ejemplo.
Otra serie de operaciones lógicas que pueden ser desarrolladas en el microcontrola -
dor PIC, son las que permiten comparar las magnitudes del valor de los datos almace -
nados en registros de memoria RAM (memoria de datos), pudiendo realizar compara -
ciones de IGUAL, MENOR QUE, MAYOR QUE, y a partir de estas comparaciones, ob -
tener las complementarias que son: DIFERENTE, MAYOR O IGUAL, MENOR O IGUAL.
Continuando con el exposición del capítulo, nos encontraremos con una rutina que
nos permiten comunicar al microcontrolador con el exterior, para que este pueda “dia -
logar” un operador, por medio de un teclado matricial, del cual se explica ampliamen -
te la manera en que se conecta. Posteriormente, nos encontramos con la configura -
ción de las interrupciones para poder activar los timers e implementar con estos una
serie de rutinas de tiempo. También se explicara la manera en que se utiliza el módu -
lo de comunicación serial RS-232, conocido como USART, y por último el empleo del
convertidor ADC.
36
Función Lógica AND
y sus Aplicaciones
Las funciones lógicas aportan una
aplicación muy importante cuando se
programan los microcontroladores,
sobre todo cuando se efectúan tareas
de control de procesos industriales,
teniéndose en general la misión de
generar “máscaras” para el filtrado de
datos. Además también se utilizan pa-
ra fijar un determinado valor en uno o
varios de los bits de un registro (recor-
dar que los registros son de 8 bits) sin
alterar a los demás bits.
Para implementar las funciones ló-
gicas en los microcontroladores PIC,
tan sólo se tiene que hacer uso de sus
respectivas instrucciones, teniendo en
cuenta las posibilidades existentes en
cuanto a la manipulación de los datos,
esto es, los diferentes tipos de ope-
randos que pueden emplearse.
La función lógica Y (AND en in-
glés) tiene una aplicación como
una máscara, dejando pasar los
estados lógicos de los bits que
nos interesan de un registro, co-
locando los restantes bits en es-
tado lógico “0”, independiente-
mente del valor que tuvieran an-
tes de realizar la operación.
Para comprender la forma en
que se aplica la función lógica
AND, tenemos que hacer uso de
su correspondiente tabla de ver-
dad la cual se muestra en la ta-
bla 39. En la tabla de verdad, se
observan los diferentes valores
que pueden adquirir los términos
identificados como “Dato 1” y
“Dato 2”, generándose en total 4
diferentes combinaciones de és-
tos, teniendo como factor común
que en cualquiera de los datos
de ingreso que se tenga un “0”
lógico, el resultado será “0” (ce-
ro). Mientras que cuando ambos
datos de entrada adquieren el
valor de “1” lógico, el resultado
será “1” (uno), siendo éste el mo-
tivo del nombre que posee esta
función lógica, ya que para gene-
rar un “1” lógico se requiere que el Da-
to 1 “Y” el Dato 2 se encuentren en
estado lógico de “1”.
Partiendo de la tabla de verdad de
la función lógica AND, procederemos
a explicar cómo se realiza la función
lógica en un microcontrolador, y para
ello vamos a desarrollar un ejemplo
empleando registros de 8 bits, tal co-
mo se ilustra en la tabla 40.
Partiendo del ejemplo ilustrado en
la tabla 40, se advierte que al ejecutar
la función AND (&) entre los datos alo-
jados en “Registro 1” y “Registro 2”,
ésta se aplica bit a bit de acuerdo con
su respectiva tabla de verdad. Por
ejemplo, se tiene como dato un “1” ló-
gico en el bit “b0” de ambos registros,
arrojando el resultado de “1” lógico.
Por otra parte, en el correspondiente
bit “b1” se encuentra un “1” lógico en
el registro 1 y un “0” lógico en el regis-
tro 2, quedando como resultado un “0”
lógico; y así sucesivamente se tienen
que seguir realizando las operacio-
nes, aplicando la función lógica AND
tomando los correspondientes bits de
los registros en cuestión.
De acuerdo con el ejemplo ante-
rior, podemos establecer un filtro de
datos de acuerdo a los bits de un re-
gistro que necesitamos operar, y re-
gresando al ejemplo si consideramos
al registro 2 como el filtro, podemos
decir que en los bits donde se le fija-
ron ceros lógicos, el resultado fue “0”
lógico independientemente de los va-
lores que tengan los bits del registro
1, mientras que si lo bits del filtro fue-
ron establecidos como “1” lógico, el
resultado depende del correspondien-
te estado lógico del bit del registro 1.
En el ejemplo de la operación
mostrada en la tabla 41, se observa
que en el registro identificado como
“filtro” los bits que conforman al nible
superior (bits b4, b5, b6 y b7) se en-
cuentran fijos a “0” lógico, mientras
que los bits que componen al ni-
ble inferior del mismo registro
“filtro” (bits b0, b1, b2 y b3), se
aprecian en estado lógico de
“1”. De lo analizado anterior-
mente, se desprende que los
datos que nos interesan se en-
cuentran en los bits que confor-
man al nible inferior, mientras
que los del nible superior tienen
que ser colocados a “0” lógico,
debido a que no serán tomados
en cuenta para el proceso si-
guiente. Los bits contenidos en
el nible inferior del registro “da-
to”, son “filtrados” tal cual se en-
cuentren, esto es, si se tiene un
“1” lógico éste pasará como re-
sultado, mientras que si el dato
es un “0” lógico, éste también
pasará como resultado.
Cuando aplicamos la función ló-
gica AND como filtro, el objetivo
es dejar “pasar” el estado lógico
del bit que nos interesa, pero
también se puede tener otra vi-
sión en cuanto a la ocupación
para la misma función lógica
AND, siendo ésta, la de fijar de
Tabla 40. Ejemplo de aplicación entre 2
registros de la función lógica AND.
Tabla 41. Aplicación de la función lógi -
ca AND como filtro.
Tabla 39. Tabla de verdad de la
función lógica AND.
manera predeterminada un “0” lógico
en los bits donde sea necesario, per-
mitiendo que en los demás bits se alo-
je el estado lógico que tenía antes de
la aplicación de la función lógica AND.
Para una mejor comprensión observe
el ejemplo de la tabla 41, en el cual se
muestra que necesitamos que los bits
del nible superior del registro dato pa-
sen a ser “0´s” en el resultado, mien-
tras que los datos contenidos en los
bits del nible inferior del registro dato
se trasladan de manera íntegra al re-
sultado.
Para ejecutar la función lógica
AND entre 2 registros, en un micro-
controlador PIC se pueden emplear
una de dos instrucciones de acuerdo
a la forma en cómo se requieran apli-
car. Las instrucciones de la función ló-
gica AND con las que cuentan los mi-
crocontroladores PIC se describen a
continuación:
a) andlw k.- Función lógica
AND del dato que se encuentra en el
registro de trabajo W con el de un va-
lor literal dejando el resultado en el re-
gistro de trabajo W, modificando su
valor con respecto del que tenía ante-
riormente. El dato del registro de tra-
bajo W como el del valor literal son de
8 bits.
b) andwf f,d.- Función lógica
AND del dato que se encuentra en el
registro de trabajo W con el valor de
un registro f (registro de memoria
RAM) dejando el resultado de la fun-
ción AND ya sea en el registro de tra-
bajo W o en el registro f, dependiendo
del valor que adquiera d (para una
mejor referencia consulte el capítulo
“instrucciones orientadas al control de
registros” e “instrucciones orientadas
al control de literales”, ambos temas
pertenecientes al módulo I).
Cabe aclarar que los microcontro-
ladores PIC ejecutarán la operación
entre registros compuestos por 8 bits,
y siempre que se requiera aplicar la
función lógica AND sobre 2 registros
de memoria RAM, en un microcontro-
lador PIC se tiene que hacer median-
te la carga previa del valor de uno de
los registros a W, ya que en un micro-
controlador PIC no existe
una instrucción que efec-
túen la función lógica AND
entre 2 registros de memo-
ria RAM de forma directa.
En la tabla 42 se muestra el
código de un programa que
a manera de ejemplo de-
muestra la forma en que
puede ser empleada la fun-
ción lógica AND.
Función Lógica OR
y sus Aplicaciones
La función lógica O (OR en
inglés) también puede em-
plearse para generar una
máscara, solo que a dife-
rencia de la función lógica
AND, con la función lógica
OR se fijan “0´s” lógicos, en
el o los bits que nos intere-
san de un registro, y por
otra parte podremos filtrar
los estados lógicos de los
bits que nos interesan de
un determinado registro,
colocando los restantes bits
en el estado lógico de “1”,
independientemente del
valor que tuvieran antes de
realizar la operación de la
37
Tabla 42. Ejemplo de aplicación de la función lógica AND.
función lógica OR. Para estar en posi-
bilidades de concebir la forma en que
se aplica la función lógica OR, tene-
mos que recurrir al empleo uso de su
correspondiente tabla de verdad la
cual se ilustra en la tabla 43. En la ta-
bla de verdad se observan los diferen-
tes valores que pueden adquirir los
términos identificados como “Entrada
1” y “Entrada 2”, generándose en total
4 diferentes combinaciones de éstas,
teniéndose como factor común que en
cualquiera de los valores de entrada
que se tenga un “1” lógico, el resulta-
do será “1” (uno). Mientras que cuan-
do en ambas entradas se adquiera el
valor de “0” lógico, el resultado será
“0” (cero). El nombre de la función ló-
gica se adquiere a partir de su opera-
ción principal, la cual reportará un “1”
lógico cuando en la Entrada 1 “O” en
la Entrada 2 se fije el estado lógico de
“1” (se trata de la función lógica O in-
clusiva ó simplemente O).
Tomando como punto de par-
tida la tabla de verdad de la fun-
ción lógica OR, pasaremos a ex-
plicar la manera de como se rea-
liza la ejecución de la función ló-
gica en un microcontrolador, y
para ello vamos a basarnos en el
ejemplo que se ilustra en la tabla
44, en el cual se muestran 2 re-
gistros cuya longitud es de 8 bits,
y del cual cabe aclarar que si ha
de emplearse la presente fun-
ción lógica (inclusive la AND),
para registros que contengan
una mayor cantidad de bits, la
función lógica tiene que irse apli-
cando byte a byte (o sea a cada
arreglo de 8 bits), hasta encon-
trar el resultado final.
A partir del ejemplo ilustrado
en la tabla 44, nos percatamos
que al ejecutar la función lógica
OR ( | ) entre los datos alojados
en “Registro 1” y “Registro 2”, és-
ta se aplica bit a bit de acuerdo
con su respectiva tabla de ver-
dad, por ejemplo, se tiene como
dato un “0” lógico en el bit “b0” de
ambos registros, arrojando el re-
sultado de “0” lógico. Además, en el
correspondiente bit “b1” se encuentra
un “0” lógico en el registro 1 y un “1”
lógico en el registro 2, quedando co-
mo resultado un “1” lógico; y así suce-
sivamente se tienen que seguir apli-
cando las operaciones, de la función
lógica OR tomando los correspon-
dientes bits de los registros en cues-
tión.
De acuerdo con el resultado obte-
nido en el ejemplo mostrado en la ta-
bla 44, podemos construir un filtro de
datos de acuerdo con los bits de un
registro que necesitemos operar, y
nuevamente haciendo referencia al
ejemplo anterior, si consideramos al
registro 2 como el filtro, podemos de-
cir que en los bits donde se le fijaron
unos lógicos, el resultado fue “1” lógi-
co independientemente de los corres-
pondientes valores que tengan los bits
del registro 1, mientras que si lo bits
del filtro fueron establecidos como “0”
lógico, el resultado dependerá del co-
rrespondiente estado lógico del bit del
registro 1. Para una mejor compren-
sión de lo que se acaba de explicar,
refiérase al ejemplo que se ilustra en
la tabla 45, en la cual a la función lógi-
ca OR se le está considerando como
un filtro de datos, para que sea capaz
de seleccionar a uno o más bits de un
registro que contiene el dato con el
que finalmente se trabajará.
En el ejemplo de la operación
mostrada en la tabla 45, se observa
que en el registro identificado como
“filtro” los bits que conforman al nible
superior (bits b4, b5, b6 y b7) se en-
cuentran fijos a “1” lógico, mientras
que los bits que componen al nible in-
ferior del mismo registro “filtro” (bits
b0, b1, b2 y b3), se aprecian en esta-
do lógico de “0”. De lo analizado ante-
riormente se desprende que los datos
que nos interesa filtrar se encuentran
en los bits que conforman al nible in-
ferior, mientras que los del ni-
ble superior tienen que ser co-
locados a “1” lógico, debido a
que no serán tomados en
cuenta para el proceso siguien-
te. Los bits contenidos en el ni-
ble inferior del registro “dato”,
son “filtrados” tal cual se en-
cuentren, esto es, si se tiene
un “1” lógico éste pasará como
resultado, mientras que si el
dato es un “0” lógico, éste tam-
bién pasará como resultado.
Cuando se aplica la función ló-
gica OR como filtro, el objetivo
es dejar “pasar” el estado lógi-
co del bit que nos interesa, pe-
ro también se puede tener otra
perspectiva en cuanto al em-
pleo de la misma función lógi-
ca OR, siendo hasta, la de fijar
de manera predeterminada un
“1” lógico en los bits donde sea
necesario, permitiendo que en
los demás bits se aloje el esta-
do lógico que tenía antes de la
aplicación de la función lógica
OR. Para una mejor compren-
sión observe el ejemplo de la
38
Tabla 43. Tabla de verdad de la función
lógica AND.
Tabla 44. Ejemplo de aplicación entre 2 re -
gistros de la función lógica OR.
Tabla 45. Aplicación de la función lógica
OR como filtro.
tabla 45, en el cual se visualiza que se
requiere que los bits del nible superior
del registro dato pasen a ser “1´s” en
el resultado, mientras que los datos
contenidos en los bits del nible inferior
del registro dato se trasladan de ma-
nera íntegra al resultado.
Para poder hacer uso de la fun-
ción lógica OR entre 2 registros en un
microcontrolador PIC, se pueden em-
plear una de dos instrucciones de
acuerdo a la forma en como se requie-
ran aplicar; las instrucciones de la fun-
ción lógica OR con las que cuentan
los microcontroladores PIC se descri-
ben a continuación:
a) iorlw k.- Función lógica
OR del dato que se encuentra en el
registro de trabajo W con el de un va-
lor literal dejando el resultado en el re-
gistro de trabajo W, modificando su
valor con respecto del que tenia ante-
riormente. El dato del registro de tra-
bajo W como el del valor literal son de
8 bits.
b) iorwf f,d.- Función lógica
OR del dato que se encuentra en el
registro de trabajo W con el valor de
un registro f (registro de memoria
RAM) dejando el resultado de la fun-
ción OR ya sea en el registro de traba-
jo W o en el registro f, dependiendo
del valor que adquiera d (para una
mejor referencia consulte el capítulo
“instrucciones orientadas al control de
registros” e “instrucciones orientadas
al control de literales”, ambos temas
pertenecientes al módulo I).
Cabe aclarar que los microcontro-
ladores PIC ejecutarán la operación
entre registros compuestos por 8 bits,
y siempre que se requiera aplicar la
función lógica OR sobre 2 registros de
memoria RAM, en un microcontrola-
dor PIC se tiene que hacer mediante
la carga previa del valor de uno de los
registros a W, ya que en un microcon-
trolador PIC no existe una instrucción
que efectúen la función lógica OR en-
tre 2 registros de memoria RAM de
forma directa.
Por último, en cuanto a la función
lógica OR, en la tabla 46 se muestra
el código de un programa que a ma-
nera de ejemplo expone la forma en
que puede ser empleada la función ló-
gica OR, tomando en cuenta la cons-
trucción de un filtro o máscara como el
que fue ilustra en el ejemplo de la ta-
bla 45, que se encargue de dejar pa-
sar el dato del nible inferior de un re-
gistro (var1).
Sólo a manera de nota diremos
que en el código del programa de
ejemplo se está proponiendo el em-
pleo del microcontrolador PIC-
16F628A, pero también
puede emplearse cual-
quier otro microcontrola-
dor PIC, y para ello refié-
rase a los capítulos “con-
figuración de los puertos
como entrada o salida”,
“Lectura de datos de un
puerto”, “escritura de da-
tos en un puerto” y “asig-
nación de datos a un re-
gistro”, ambos temas
pertenecientes al pre-
sente módulo II.
Función Lógica XOR
y sus Aplicaciones
A diferencia de las fun-
ciones lógicas AND y
OR, la función lógica O
Exclusiva (XOR en in-
glés) no tiene un empleo
como máscara filtradora
de datos, dejando su ac-
tividad principal en la de
poder identificar el con-
tenido de 2 registros, y
reportar si éstos son
39
Tabla 46. Ejemplo de aplicación de la función lógica OR.
exactamente iguales entre sí, por lo
tanto, un campo de acción de la fun-
ción lógica XOR se encuentra en la
comparación de los datos de regis-
tros.
En la tabla 47 se muestra la tabla
de verdad de la función lógica XOR,
en la cual se observan los diferentes
valores que pueden adquirir los térmi-
nos identificados como “Entrada 1” y
“Entrada 2”, generándose en total 4
diferentes combinaciones de éstos,
teniendo como funcionamiento lo si-
guiente. Si los datos de entrada tienen
valores distintos entre sí, el resultado
será “1” (uno). Por otra parte, cuando
los datos de entrada adquieren el mis-
mo valor ya sea “0” ó “1” lógico, el re-
sultado será “0” (cero). Partiendo de
este comportamiento es que se le da
el nombre de O Exclusiva, ya que pa-
ra generar un “1” lógico se requiere
que el dato de la entrada 1 “O” el da-
to de la entrada 2 se encuentren en
estado lógico de “1”, pero no los 2 al
mismo tiempo.
Para comprender la utilidad de la
función lógica XOR, nos basaremos
en su correspondiente tabla de verdad
y a continuación presentaremos 2
ejemplos de su aplicación, tal como se
muestra en la tabla 48.
Tal como sucede con las funcio-
nes lógicas AND y OR, cuando se
aplica la función lógica
XOR entre 2 registros, se
realiza operando la función
bit a bit entre los 2 registros
involucrados de acuerdo
con la tabla de verdad mos-
trada anteriormente.
En el ejemplo que se
muestra en la tabla 48, se
percibe que al operar la
función lógica XOR (^), en-
tre los datos alojados en los
registros “Registro 1” y “Re-
gistro 2” con sus correspon-
dientes bits b0, el resultado
es un “0” lógico debido a
que ambos datos de entra-
da se encuentran en “1” ló-
gico. Lo mismo para cuan-
do se aplica la función lógica XOR a
los bits b1 de los registros “Registro 1”
y “Registro 2”, como ambos datos de
entrada son iguales, la respuesta es
nuevamente “0” lógico, y así sucesiva-
mente al ir aplicando la función lógica
cada uno de los bits, en todos los re-
sultados tendremos un “0” lógico, sal-
vo en los bits de entrada b3, porque el
b3 del “Registro 1” se encuentra en “0”
lógico, y el del “Registro 2” se encuen-
tra en “1” lógico, dando como resulta-
do un “1” lógico.
Si los datos de los registros “Re-
gistro 1” y “Registro 2” hubieran sido
iguales en el ejemplo de la tabla 48, el
resultado después de aplicar la fun-
ción lógica XOR nos entregaría “0's”
lógicos en todos los bits del resultado,
identificando.
Con este resultado que los datos
son exactamente iguales.
Para aplicar la función lógica XOR
entre 2 registros, recordemos que en
un microcontrolador PIC, primero se
debe cargar el dato de uno de ellos en
el registro de trabajo W, para poste-
riormente poder operarlo. En un mi-
crocontrolador PIC, se pueden em-
plear una de dos instrucciones de
acuerdo a la forma en como se requie-
ran aplicar las instrucciones de la fun-
ción lógica XOR, tal como a continua-
ción se explica:
a) xorlw k.- Función lógica
XOR del dato que se encuentra en el
registro de trabajo W con el de un va-
lor literal dejando el resultado en el re-
gistro de trabajo W, modificando su
valor con respecto del que tenía ante-
riormente. El dato del registro de tra-
bajo W como el del valor literal son de
8 bits.
b) xorwf f,d.- Función lógica
XOR del dato que se encuentra en el
registro de trabajo W con el valor de
un registro f (registro de memoria
RAM) dejando el resultado de la fun-
ción XOR ya sea en el registro de tra-
bajo W o en el registro f, dependiendo
del valor que adquiera d (para una
mejor referencia consulte el capítulo
“instrucciones orientadas al control de
registros” e “instrucciones orientadas
al control de literales”, ambos temas
pertenecientes al módulo I).
Después de aplicar la función lógi-
ca XOR, se tiene que saber si el resul-
tado fue cero (si son iguales los datos
entre los registros), o diferente de ce-
ro (si son diferentes los datos entre los
registros), por lo que se tiene que re-
visar también la bandera del cero (z)
del registro “status”, por lo que les pe-
dimos que pasen a revisar el siguien-
te apartado, que es en donde se
muestra de manera com-
pleta y con ejemplos de la
forma de realizar compara-
ciones entre los datos de
diferentes registros.
Funciones Lógicas de
Comparación entre
Registros (=, <, >)
Existen aplicaciones en las
que es necesario realizar
comparaciones entre los
datos de 2 registros por lo
menos, y saber a partir de
dicha comparación si los
datos son iguales, ó uno es
mayor que el otro ó uno es
40
Tabla 47. Tabla de verdad de la función
lógica XOR.
Tabla 48 Ejemplo de aplicación entre 2 regis -
tros de la función lógica XOR.
menor que el otro, etc. Siendo de vital
importancia tener en cuenta que los
datos poseen una magnitud que se
encuentra en función de los bits que la
componen. Las comparaciones que
pueden realizarse con un microcon-
trolador PIC, son las que aprendimos
en los estudios primarios, y a las cua-
les llamaremos comparaciones bási-
cas, las cuales se enumeran a conti-
nuación, indicando además, el símbo-
lo que las caracteriza.
• Igual (=)
• Menor que (<)
• Mayor que (>)
A partir de las comparaciones bá-
sicas podemos crear las llamadas
comparaciones complementarias que
prácticamente no son otra cosa que
eso (de manera literal); las compara-
ciones complementarias se muestran
a continuación.
• Diferente (≠)
Complemento de Igual
• Mayor o igual que (≥)
Complemento de Menor que
• Menor o igual que (≤)
Complemento de Mayor que
Tomando la primera de las compa-
raciones complementarias que es la
denominada “diferente”, se genera a
partir de la comparación básica
“Igual”, esto es, en el momento que se
pregunta si un dato es igual a otro, si
el resultado es no, quiere decir que
entonces son diferentes. Del mismo
modo cuando se realiza la ejecución
de la comparación básica “menor que”
entre los valores de 2 datos, si el re-
sultado es no, quiere decir entonces
que fue “mayor o igual”. Por lo tanto,
el mismo algoritmo que se desarrolle
para las comparaciones básicas es el
que se emplea para las comparacio-
nes complementarias. A continuación
comenzaremos con la explicación en
detalle de la primer comparación bási-
ca.
Comparación Igual (=)
ó Diferente ()
Para realizar una comparación en-
tre los datos de 2 registros indepen-
dientemente para saber si son igua-
les, mayores o menores, se tiene que
realizar una operación aritmética fun-
damental que consiste en una “resta”
(para una mejor referencia sobre este
tema consulte el capítulo “resta arit-
mética”, perteneciente al módulo II), y
por medio de ésta sabremos de ma-
nera específica si 2 magnitudes son
iguales, ya que si el resultado de la
resta es cero, quiere decir que los da-
tos que fueron restados son exacta-
mente iguales, mientras que si el re-
sultado es diferente de cero no impor-
tando si es positivo o negativo, quiere
decir que las cantidades que se resta-
ron son diferentes entre sí.
En el ejemplo ilustrado en la tabla
49 se muestra la manera de emplear
una resta aritmética para determinar
sí 2 cantidades numéricas son iguales
entre ellas, obteniéndose 2 posibles
resultados, uno de los resultados de la
resta puede ser cero, si es que los va-
lores de los datos fueron iguales entre
sí, o se puede tener un resultado dife-
rente de cero en la resta (positivo o
negativo), si los valores fueron de
magnitud diferente entre sí.
Del ejemplo 1 mostrado en la tabla
49, se observa la resta de 2 números
(5 - 5), siendo el resultado de la sus-
tracción un valor de 0 (cero), indican-
do que el valor del dato 1 es igual al
valor del dato 2; por otra parte, la res-
ta que se haga puede involucrar valo-
res de más de 1 registro de 8 bits, ra-
zón por la que recomendamos volver
a repasar el correspondiente capítulo
donde se abordan las restas aritméti-
cas. Ahora observemos el ejemplo 2
de la misma tabla 49, en donde de
nueva cuenta se realiza una resta de
2 números (5 - 4), el resultado en es-
ta oportunidad es un 1, por lo tanto, el
resultado expresa que los valores de
los datos 1 y 2 son diferentes. Se de-
be de tomar en cuenta que tanto para
el ejemplo 1 y 2 de la tabla 49, las res-
tas se realizan en hexadecimal (inter-
pretación del binario) dentro de un mi-
crocontrolador PIC.
Específicamente para la imple-
41
Tabla 50. Ejemplos de una comparación de valores realizada con la
función XOR.
Tabla 49. Ejemplos de una comparación de valores realizada a
partir de una resta.
mentación de una comparación entre
2 valores, y a partir de ella determinar
si estos son iguales o diferentes, a
parte de la resta también puede em-
plearse la función lógica XOR (expli-
cada en el capitulo anterior), que en la
tabla 50 se muestra un ejemplo de su
aplicación, y a partir de ella determi-
nar si 2 valores son iguales o diferen-
tes.
En los ejemplos expresados en la
tabla 50 se muestra la aplicación de la
función lógica XOR a números bina-
rios para una mejor comprensión,
siendo el mismo caso que en los
ejemplos realizados por me-
dio de una resta, si el resul-
tado es cero, significa que
los valores de los datos 1 y 2
son iguales (ejemplo 1 de la
tabla 50), mientras que cual-
quier otro resultado implica
que los valores de los datos
1 y 2 son diferentes entre sí
(ejemplo 2 de la tabla 50).
En la figura 17 se mues-
tra un rombo que es el sím-
bolo que se emplea para
realizar la comparación de
las magnitudes de los valo-
res de 2 datos, dentro del
rombo está expresada la
pregunta que compara la
magnitud de var1 con res-
pecto de var2, generando a
su vez 2 posibles resulta-
dos, los cuales nos indican
por medio de una respuesta
afirmativa que las magnitu-
des de los datos de var1 y
var2 son iguales; por otra
parte, si la respuesta es
“no”, significa que las magni-
tudes de los datos de var1 y
var2 son diferentes.
La función de compara-
ción de la figura 17 es des-
glosada para saber si los va-
lores contenidos en 2 regis-
tros son iguales o diferentes.
Por lo tanto, se muestra de
manera detallada en el dia-
grama de flujo de la figura
18, los bloques que componen el mé-
todo para poder realizar la compara-
ción, empleando en esta oportunidad
como acción fundamental la opera-
ción de la resta aritmética para deter-
minar el resultado de la comparación,
pero recuerde que la operación de la
resta puede ser sustituido por la fun-
ción lógica XOR.
Para el código que se obtendrá a
partir del diagrama de flujo de la figu-
ra 18, se presupone que se emplean
registros de 8 bits para efectos de una
mejor comprensión, pero si se quisie-
ran comparar valores que aborden
más de 8 bits en su composición, el
método sigue siendo el mismo, sola-
mente se tienen que contemplar res-
tas con registros de más de 8 bits (16,
32, etc.).
A partir del diagrama de flujo de la
figura 18 se observa que para comen-
zar con el proceso de comparación,
en primera instancia tiene que ser lim-
piada la bandera que indica que el re-
sultado de la operación de la resta es
cero (lo mismo se realiza si la opera-
ción es la XOR). Para esta acción la
bandera del cero se identifica como
“z” y se encuentra dentro del registro
“status” del microcontrola-
dor PIC.
Posteriormente se operan
los valores de los registros
var1 y var2, cargando de
manera primaria el valor de
uno de ellos en el registro
de trabajo w, para poste-
riormente aplicar el coman-
do de la resta o la función
XOR con el registro restan-
te. La aplicación de la resta
ó función XOR tendrá como
resultante 2 posibles valo-
res, que es 0 (cero) ó un va-
lor diferente de 0 (sin im-
portar su magnitud), tenien-
do que revisar el estado
que guarda la bandera z del
registro status, para saber
si el resultado de la resta o
función XOR fue 0 o no.
La bandera z arrojará un “1”
lógico si el resultado de la
resta ó la función XOR fue
0 (cero). Por otra parte, la
bandera z tendrá un “0” ló-
gico si el resultado resta ó
la función XOR fue diferen-
te de 0 (cero). Por último,
dependiendo del estado
que guarde la bandera z, se
tendrá que ejecutar una se-
cuencia de instrucciones,
para cuando el resultado de
la comparación entre los
valores de var1 y var2 indi-
que que fueron iguales. Lo
42
Figura 17. Símbolo de la función de
comparación: igual ó diferente.
Figura 18. Diagrama de flujo de la comparación: Igual ó
Diferente.
mismo sucederá cuando el resultado
de la comparación arroje que fueron
diferentes los valores de var1 y var2.
A continuación en la tabla 51 se
muestra el fragmento de código por
medio del cual se implementa el pro-
grama del diagrama de flujo de la figu-
ra 18.
Comparación Menor que (<)
o Mayor o Igual que ()
Nuevamente para realizar una
comparación entre los valores conte-
nidos en 2 registros, y saber si uno de
ellos es menor que el otro, ó saber sí
es mayor o igual uno que el otro valor,
se tiene que realizar la operación arit-
mética principal para realizar compa-
raciones que consiste en una resta
(de nueva cuenta lo referimos al capí-
tulo “resta aritmética”, perteneciente
al módulo II), y por medio de ésta sa-
bremos de manera específica cuál da-
to es menor que el otro, ya que si el
resultado de la resta es positivo, po-
dremos interpretar que uno de los da-
tos que fueron restados es en magni-
tud menor que el otro. Por otra parte,
si queremos obtener el complemento
del resultado “menor que” (compara-
ción básica), nos tenemos que referir
a el término “mayor o igual” (compara-
ción complementaria), y para ello se
tiene que revisar el resultado de la
resta, para estar en conocimiento de
que se generó un resultado igual a ce-
ro ó un resultado con valor negativo,
lo cual significa que uno de los valores
a compararse fue mayor o igual que el
otro.
Para comprender de una mejor
manera lo expresado en el párrafo an-
terior, observe el ejemplo ilustrado en
la tabla 52 en donde se muestra la
manera de emplear una resta aritmé-
tica para determinar cuál de las 2 can-
tidades numéricas es menor, obte-
niéndose 2 posibles resultados. Uno
de los resultados de la resta puede
dar un valor positivo (sin importar su
magnitud), si es que el valor del dato
2 fue menor que el valor del dato 1, ó
se puede obtener un resultado negati-
vo después de aplicar la operación de
la resta (de igual manera sin importar
su magnitud), si el valor del dato 2 re-
sultó que es mayor que el valor del
dato 1, pero también pudo haber sido
cero el resultado de la resta. Por lo
tanto, sí el resultado de la resta hubie-
se sido negativo ó cero se interpreta-
rá como que el dato 2 fue mayor o
igual que el dato 1.
Del ejemplo 1 mostrado en la tabla
52, se observa la resta de 2 números
(8 - 3), siendo el resultado de la sus-
tracción un valor de 5 (positivo), indi-
cando que el valor del dato 2 es me-
nor que el valor del dato 1; recuerde
43
Tabla 51. Código del programa de comparación: Igual ó Diferentes.
Tabla 52. Ejemplos de una comparación “menor que” ó “mayor o igual” realiza -
da a partir de una resta.
que la resta puede realizarse con re-
gistros de más de 8 bits, razón por la
cual le hacemos patente de nuevo,
que es recomendable que vuelva a re-
pasar el correspondiente capítulo
donde se abordan las restas aritméti-
cas. Ahora observemos el ejemplo 2
de la misma tabla 52, en donde de
nueva cuenta se realiza una resta de
2 números (8 - 9), el resultado en es-
ta oportunidad es -1, por lo tanto, el
resultado expresa que el valor del da-
to 2 es mayor o igual que el dato 1. Se
debe tomar en cuenta que
tanto para el ejemplo 1 y 2
de la tabla 52, las restas se
efectúan en formato hexa-
decimal por parte de un mi-
crocontrolador PIC.
En la figura 19 se mues-
tra un rombo que es el sím-
bolo de manera general
que se emplea para realizar
la comparación entre las
magnitudes de los valores
de 2 datos. Por dentro del
rombo está expresada la
pregunta mediante la cual
se compara la magnitud de
var2 con respecto de var1,
generando a su vez 2 posi-
bles resultados, los cuales
nos indican por medio de
una respuesta afirmativa
que la magnitud del dato
var2 es menor que el dato
var1; por otra parte, si la
respuesta es “no”, significa
que la magnitud del dato
var2 es mayor ó igual que
el dato de var1.
La comparación repre-
sentada por medio de la fi-
gura 19, la desglosaremos
para una mejor interpreta-
ción, y de esta manera sa-
ber si los valores conteni-
dos en 2 registros son uno
menor que el otro ó uno es
mayor o igual que el otro,
por lo tanto, se mostraran
de manera detallada por
medio del diagrama de flujo
de la figura 20, los bloques que con-
forman el método que emplearemos
para poder realizar la comparación,
utilizando en esta oportunidad como
acción fundamental la operación de la
resta aritmética para estar en posibili-
dades de tomar una decisión sobre el
resultado final de la comparación.
El código que se obtendrá a partir
del diagrama de flujo de la figura 20,
será representado por medio de regis-
tros de 8 bits, con el único fin de lograr
una mejor comprensión en la explica-
ción siguiente, pero si se quisieran
comparar valores cuyos registros re-
quieran más de 8 bits en su conforma-
ción, el método seguirá siendo el mis-
mo, solamente se tienen que contem-
plar restas con registros de más de 8
bits (16, 32, etc.).
A partir del diagrama de flujo de la
figura 20 se observa que para comen-
zar con el proceso de comparación,
en primera instancia tiene que ser lim-
piada la bandera que indica que el re-
sultado de la operación de la resta es
cero, además de la bande-
ra que indica que en el re-
sultado de la resta se gene-
ra un acarreo. Para esta
acción la bandera del cero
se identifica como “z” y la
bandera del acarreo como
“c”, encontrándose ambas
banderas ubicadas dentro
del registro “status” del mi-
crocontrolador PIC.
Posteriormente se operan
por medio de la operación
de la sustracción los valo-
res de los registros var1 y
var2, cargando en primer
instancia el valor de var2 en
el registro de trabajo w, pa-
ra posteriormente aplicar el
comando de la resta de
var1 - w (subwf var1,w).
Después de la aplicación
de la resta se preguntará si
el posible resultado fue
igual a cero, ó en su defec-
to si fue diferente de cero,
para lo cual se procede a
revisar la bandera z que se
encuentra en el registro es-
tatus. Si la bandera z se en-
cuentra en estado lógico “1”
indica que el resultado de la
resta fue cero, y por lo tan-
to, el contenido de var2 es
igual que var1; pero si la
bandera z se encuentra en
estado lógico “0” después
de realizar la resta, significa
que los datos de var2 y
var1 son diferentes entre sí,
44
Figura 20. Diagrama de flujo de la comparación: Me -
nor que ó Mayor o igual.
Figura 19. Símbolo de la función de comparación:
Menor que ó Mayor o igual.
siendo necesario realizar la verifica-
ción del estado que guarda la bande-
ra del acarreo. La bandera del acarreo
muestra si el resultado de una resta
fue positivo ó sí fue negativo, y para
ello lo que tenemos que revisar es que
la bandera c esté en estado lógico “1”
para determinar que el resultado de la
resta fue positivo, ó verificar que la
bandera c tenga un estado “0” lógico
para tener en cuenta que el resultado
de la resta fue negativo.
Si el resultado de la resta (o sea
de la comparación) fue positivo signi-
fica que var2 es menor que var1 (var2
< var1), y entonces como consecuen-
cia el control del programa se tiene
que dirigir a ejecutar las instrucciones
conducentes con el resultado mostra-
do; pero si el resultado de la resta fue
negativo ó igual a cero, significa que
como consecuencia de la compara-
ción se arrojó un resultado que seña-
la que var2 es mayor o igual que var1
(var2 ≥ var1). Por lo tanto, de igual
manera el control del programa se tie-
ne que desplazar para ejecutar la se-
rie de instrucciones que corresponden
a las actividades de cuando el resulta-
do de la comparación fue var2 ≥ var1.
A continuación en la tabla 53 se
muestra el fragmento de código por
medio del cual se implementa el pro-
grama que surge a partir del diagrama
de flujo de la figura 20.
Comparación Mayor que (>)
o Menor o Igual que ()
Como en los casos de las compa-
raciones anteriormente descritas, pa-
ra realizar una comparación entre los
datos contenidos en 2 registros, y sa-
ber si uno de ellos es mayor que el
otro, ú obtener el resultado comple-
mentario para determinar si un dato
es menor o igual que el otro, se tiene
que realizar la operación aritmética
principal para realizar comparaciones
que consiste en una resta (por enési-
ma vez lo referimos al capitulo “resta
aritmética”, perteneciente al presente
módulo II). Siendo por medio de la
aplicación de esta operación que sa-
bremos de manera específica cuál da-
to es mayor que el otro, ya que si el
resultado de la resta es positivo, po-
dremos interpretar que uno de los da-
tos que fueron restados es en magni-
tud mayor que el otro. Además, si que-
remos obtener el complemento del re-
sultado “mayor que” (comparación bá-
sica), nos tenemos que referir al térmi-
no “menor o igual” (comparación com-
plementaria), y para ello se tiene que
revisar el resultado de la resta, para
estar en conocimiento de que se ge-
neró un resultado igual a cero ó un re-
sultado con valor negativo, lo cual sig-
nifica que uno de los valores a compa-
rarse fue menor o igual que el otro.
Para comprender de una mejor
manera la explicación anterior, obser-
ve el ejemplo ilustrado en la tabla 54
en donde se muestra la manera de
emplear una resta aritmética para de-
terminar cuál de las 2 cantidades nu-
méricas es mayor, obteniéndose 2 po-
sibles resultados. Uno de los resulta-
dos de la resta puede dar un valor po-
sitivo (sin importar su magnitud), si es
45
Tabla 53. Código del programa de comparación: Menor que ó Mayor o igual.
que el valor del dato 1 fue mayor que
el valor del dato 2, ó se puede obtener
un resultado negativo después de
aplicar la operación de la
resta (de nueva cuenta
sin importar su magni-
tud), si el valor del dato 1
resultó que es menor que
el valor del dato 2, pero
también pudo haber sido
cero el resultado de la
resta. Por lo tanto, sí el
resultado de la resta hu-
biese sido negativo ó ce-
ro se interpretara como
que el dato 1 fue menor
o igual que el dato 2.
Del ejemplo 1 mos-
trado en la tabla 54, se
observa la resta de 2 nú-
meros (9 - 5), obtenién-
dose como resultado de
la sustracción un valor
igual a 4 (positivo), indi-
cando que el valor del
dato 1 es mayor que el
valor del dato 2; recuer-
de que la resta puede
realizarse con registros
de más de 8 bits, razón
por la cual le recordamos
de nueva cuenta, que es
recomendable que repa-
se el correspondiente ca-
pítulo donde se abordan
las restas aritméticas.
Ahora observemos el
ejemplo 2 de la misma
tabla 54, en donde se
realiza una resta de 2
números (7 - 9), el resul-
tado en esta oportunidad
es -2, por lo tanto, el re-
sultado expresa que el valor del dato
1 es menor o igual que el dato 2. Se
debe de tomar en cuenta que tanto
para el ejemplo 1 como para el ejem-
plo 2 de la tabla 54, las restas se efec-
túan en formato hexadecimal por par-
te del microcontrolador PIC.
En la figura 21 se muestra para la
operación de una comparación un
rombo, que es el símbolo de manera
general se emplea para efectuar la
comparación entre las magnitudes de
los valores de 2 datos; dentro del rom-
bo se está expresando una pregunta,
mediante la cual se compara la mag-
nitud de var1 con respecto de var2,
generando a su vez 2 posi-
bles resultados, los cuales
nos indican por medio de
una respuesta afirmativa
que la magnitud del dato
var1 es mayor que el dato
var2; por otra parte, si la
respuesta es “no”, significa
que la magnitud del dato
var1 es menor ó igual que
el dato de var2.
La comparación represen-
tada en la figura 21, tiene
que ser desglosada para
una mejor comprensión, y
de esta manera saber si
los valores contenidos en 2
registros son uno mayor
que el otro ó uno es menor
o igual que el otro. Por lo
tanto, se mostrará de ma-
nera detallada por medio
del diagrama de flujo de la
figura 22, los bloques que
conforman el método que
emplearemos para poder
realizar la comparación,
utilizando en esta oportuni-
dad como acción funda-
mental la operación de la
resta aritmética para estar
en posibilidades de tomar
una decisión sobre el re-
sultado final de la compa-
ración.
El código que se obtendrá
a partir del diagrama de
flujo de la figura 22, será
representado por medio de
registros de 8 bits, con el
46
Tabla 54 Ejemplos de una comparación “mayor que” ó “menor o igual” reali -
zada a partir de una resta.
Figura 21. Símbolo de la función de comparación: Ma -
yor que ó Menor o igual.
Figura 22. Diagrama de flujo de la comparación: Mayor
que ó Menor o igual.
único fin de lograr una mejor com-
prensión en la explicación que a con-
tinuación se dará, pero si se quisieran
comparar valores cuyos registros re-
quieran de más de 8 bits en su confor-
mación, el método seguirá siendo el
mismo, solamente se tienen que con-
templar restas con registros de más
de 8 bits (16, 32, etc.). A partir del dia-
grama de flujo de la figura 22 se ob-
serva que para comenzar con el pro-
ceso de comparación, en primera ins-
tancia tiene que ser limpiada la ban-
dera que indica que el resultado de la
operación de la resta es cero, además
de la bandera que indica que en el re-
sultado de la resta se genera un aca-
rreo, para esta acción la bandera del
cero se identifica como “z” y la bande-
ra del acarreo como “c”, encontrándo-
se ambas banderas ubicadas dentro
del registro “status” del microcontrola-
dor PIC.
Posteriormente se operan por me-
dio de la operación de la sustracción
los valores de los registros var1 y
var2, cargando en primer instancia el
valor de var2 en el registro de trabajo
w, para posteriormente aplicar el co-
mando de la resta de var1 - w (subwf
var1,w). Después de la aplicación de
la resta se preguntará sí el posible re-
sultado fue igual a cero, ó en su de-
fecto si fue diferente de cero, para lo
cual se procede a revisar la bandera z
que se encuentra en el registro esta-
tus. Si la bandera z se encuentra en
estado lógico “1” indica que el resulta-
do de la resta fue cero, y por lo tanto,
el contenido de var1 es igual con var2;
pero si la bandera z se encuentra en
estado lógico “0” después de realizar
la resta, significa que los datos de
var1 y var2 son diferentes entre si,
siendo necesario realizar la verifica-
ción del estado que guarda la bande-
ra del acarreo.
La bandera del acarreo muestra si
el resultado de una resta fue positivo
ó sí fue negativo, y para ello lo que te-
nemos que revisar es que la bandera
c se encuentre en estado lógico “1”
para determinar que el resultado de la
resta fue positivo, ó verificar que la
bandera c tenga un estado “0” lógico
para tener en cuenta que el resultado
de la resta fue negativo.
Si el resultado de la resta (o dicho
de otra manera de la comparación)
fue positivo significa que var1 es ma-
yor que var1 (var2 > var1), y entonces
como consecuencia el control del pro-
grama se tiene que dirigir a ejecutar
las instrucciones conducentes con el
resultado mostrado; pero si el resulta-
do de la resta fue negativo ó igual con
cero, significa que como consecuen-
cia de la comparación se arrojó un re-
sultado que señala que var1 es menor
o igual que var2 (var1 ≤ var2). Por lo
tanto, de igual manera el control del
programa se tiene que desplazar para
ejecutar la serie de instrucciones que
corresponden a las actividades de
cuando el resultado de la compara-
ción fue var2 ≤ var1.
A continuación en la tabla 55 se
muestra el fragmento de código por
medio del cual se implementa el pro-
grama que resulta del diagrama de
flujo de la figura 22.
47
Tabla 55. Código del programa de comparación: Mayor que ó Menor o igual.
Lectura de un Teclado Matricial
Un teclado es un dispositivo por
medio del cual una persona puede
“comunicarle” información a un micro-
controlador, considerándose por lo
tanto, un elemento indispensable en
aquellos proyectos en donde el usua-
rio tiene que interactuar con el micro-
controlador, por ejemplo para configu-
rar la manera de operar de la circuite-
ría, como lo es en un horno de mi-
croondas en donde se tiene que se-
leccionar el tiempo de cocción de un
alimento, por ejemplo.
Existen 2 tipos de teclados, un tipo
de teclado requiere tener disponible
una terminal de entrada de un micro-
controlador para cada una de las te-
clas, mientras que otro tipo de teclado
se encuentra bajo configuración matri-
cial, ahorrando terminales en un mi-
crocontrolador. Para comprender este
último concepto vamos a recurrir a
una situación práctica; hagamos de
cuenta que necesitamos un teclado
que en total tenga 16 teclas para dife-
rentes aplicaciones. Si utilizamos el
primer tipo de teclado enunciado en
este apartado, necesitaríamos contar
con un microcontrolador que tuviera
disponible 16 terminales de entrada,
lo cual hace totalmente impráctico el
utilizar este tipo de teclado, a menos
que multiplexemos por medio de un
circuito externo al microcontrolador la
información de las teclas (yo no lo ha-
ría). En cambio con un teclado matri-
cial de 4 filas por 4 columnas es sufi-
ciente para ingresar la información al
microcontrolador, y para emplear el
teclado de 16 teclas sólo son necesa-
rias 8 terminales del microcontrolador
(4 de entrada y 4 de salida).
El teclado matricial es un circuito
que nos ayuda a ingresar datos al mi-
crocontrolador. Para implementarlo se
requiere del uso de una serie de boto-
nes con reposición automática (push
boton) conectados de tal manera que
se tienen filas y columnas a través de
las cuales es muy fácil identificar cuál
tecla fue oprimida. El teclado matricial
más común es el que posee 4 filas y 4
columnas dando origen a un teclado
con 16 teclas, pero los teclados matri-
ciales pueden ser mucho más gran-
des, inclusive podemos disponer de
teclados del tamaño de los empleados
en las PC (102 ó 103 teclas).
La forma de operación básica de
cualquier teclado matricial es la si-
guiente: Cuando se oprime una tecla
se produce la unión de una fila con
una columna, provocando que para
un microcontrolador sea muy sencillo
identificar la tecla que fue pulsada.
Se recomienda que para imple-
mentar un teclado matricial se haga
uso de botones tipo push boton de
cuatro terminales, para que sea senci-
lla su implementación en un circuito
impreso de una sola cara. Por la ma-
nera en como se acomodaron los bo-
tones que se muestran en el diagrama
esquemático de la figura 23, se gene-
ran 4 columnas y 4 filas las cuales se
forman con la unión de las respectivas
terminales de los botones y lo reco-
mendable es seguir la conexión ex-
presada en el diagrama esquemático,
ya que prácticamente de ahí se obtie-
ne el circuito impreso. Por ejemplo en-
foquemos nuestra atención hacia el
botón identificado como S5. Este está
conectado en su parte izquierda con
el borne identificado como “C1” que
se refiere a la columna 1, y por su par-
te derecha al borne identificado como
“F1” que se refiere a la fila 1. Por lo
tanto, si es presionado este botón es-
taremos uniendo la fila 1 con la colum-
na 1.
Para todos los botones se tiene el
mismo principio de operación, por lo
que se generan combinaciones de co-
lumnas con filas, las cuales son muy
fáciles de identificar de acuerdo al bo-
tón que se oprima. El paso siguiente
es personalizar cada uno de los boto-
nes. Por ejemplo si se tratara de una
calculadora se colocarían las teclas
numéricas del 0 al 9 y los botones res-
tantes con las operaciones aritméticas
básicas, ó también se personalizar los
botones con letras, etc.
A continuación se explicará el fun-
cionamiento de un teclado matricial de
4X4, con un microcontrolador. Por lo
tanto, para que este trabaje y realice
la lectura del un teclado matricial, se
48
Figura 23. Diagrama esquemático de un teclado matricial de 4 X 4.
requiere destinar 4 de las terminales
de uno de sus puertos como salidas,
la cuales identificaremos por el mo-
mento como S0, S1, S2 y S3. A cada
una de las salidas por separado se le
tendrá que enviar un “1” lógico, mien-
tras el “1” lógico aparece sólo en una
de las salidas, las 3 restantes se fijan
con un estado de lógico de “0”. El “1”
lógico se hace llegar al teclado matri-
cial, causando que se vaya activando
una de las filas, teniendo que para ac-
tivar la fila identificada como F0 se tie-
ne que enviar un “1” lógico a través de
la salida S0, y “0” lógicos a las salidas
S1, S2 y S3. Posteriormente se tiene
que enviar un “1” lógico por la salida
S1 y “0” lógicos a las salidas S0, S2 y
S3, para que sea activada la fila F1, y
así sucesivamente hasta llegar a la fi-
la F3 que corresponde con la salida
S3. Lo que es importante observar es
el hecho de que cuando una salida se
coloca en estado lógico de “1”, las 3
salidas restantes se fijarán en estado
lógico de “0”. El “1” lógico tiene que
ser enviado sólo uno a la vez por la
salida correspondiente, para que de
esa manera se tenga el control de la
fila que se está activando.
Una vez que un “1” lógico se en-
cuentra presente en alguna de las fi-
las del teclado matricial, se tiene que
esperar un tiempo razonable (máximo
10 milisegundos) para que sea presio-
nada una tecla, y dependiendo de
cuál fue oprimida, se enviará el “1” ló-
gico a una de 4 terminales del micro-
controlador que previamente tuvieron
que ser configuradas como entradas.
Las terminales de entrada por el mo-
mento serán identificadas como E0,
E1, E2 y E3, que respectiva-
mente corresponden a las
columnas C0, C1, C2 y C3.
En el teclado matricial
cuando es presionada una
tecla, se cierra un interruptor
que interconecta una fila con
una columna. Es por ello que
sólo se envía un “1” lógico a
la vez a la fila correspondien-
te, porque ese “1” lógico se
reflejará en una columna de acuerdo
con el botón que sea oprimido. Sí fue-
ran enviados al mismo tiempo a más
de una fila los “1's” lógicos, no se po-
dría identificar claramente a los boto-
nes que sean oprimidos.
En la figura 24 se muestra la ima-
gen de un teclado matricial, con la
identificación de sus teclas, para po-
der ingresar los datos que se requie-
ran. En este ejemplo se esta emplean-
do un teclado matricial de 4X4 simu-
lando una calculadora básica. En la
tabla 56 se muestra el código ASCII
(se recomienda que se asigne código
ASCII cuando se trabaja con un tecla-
do) resultante, que será generado a
partir de la combinación de fila y co-
lumna que se presente cuando una te-
cla sea oprimida.
La tabla 56 es tan solo un ejemplo
que se recomienda emplear para utili-
zar un teclado matricial, ya que de la
tabla se observa con lujo de detalle la
fila y columna que se une, una vez
que se presiona una tecla. En el dia-
grama de bloques de la figura 25 se
muestran todas las acciones que tie-
nen que realizarse para controlar la
lectura de un teclado matricial. A con-
tinuación se procederá a realizar la
descripción del diagrama de flujo de la
figura 25, tomando en consideración
que las terminales del microcontrola-
dor que funcionarán como entradas,
serán las correspondientes terminales
del puerto A PA0 = E0, PA1 = E1, PA2
= E2 y PA3 = E3 (estas terminales co-
rresponden a las columnas del tecla-
do). Las terminales del microcontrola-
dor que tendrán que ser configuradas
como de salida, serán las del puerto B
tal como sigue PB0 = F0, PB1 = F1,
PB2 = F2 y PB3 = F3 (las terminales
del puerto B se conectan a las filas del
teclado matricial).
Tal como se explicó anteriormen-
te, para controlar la lectura de un te-
clado matricial, se tiene que ir activan-
do cada fila de manera independiente
y por lo tanto, se tiene que comenzar
por la primera fila, o sea la identifica-
da como F0.
Se recurre al comando “bsf
portb,0” para enviar un “1” lógico a la
salida S0 (PB0) del microcontrolador y
que corresponde con la fila 0 (F0). Co-
mo paso siguiente se tiene que gene-
rar un retardo ó espera de cuando
más 10 mseg, tiempo suficiente para
minimizar el rebote que se genere en
el interruptor una vez que se oprima el
teclado, posteriormente cuando termi-
na el tiempo de 10 mseg, se puede
dar por hecho que sí fue oprimida una
tecla, esta ya se estabilizo y por lo
tanto, ahora se puede acce-
der al proceso para determi-
nar la tecla que fue acciona-
da; una vez que se activo la
fila 0 del teclado, será a tra-
vés de una de las 4 columnas
que sabemos qué tecla se
oprimió.
Como paso siguiente se pre-
gunta por cuál terminal de en-
trada del microcontrolador se
49
Tabla 56. Combinación de filas y columnas del
teclado matricial.
Figura 24. Teclado matricial con sus
botones identificados.
recibe un “1” lógico (si es que se opri-
mió una tecla), recordando que son 4
alternativas las que nos reporten la
posible identificación de una tecla,
porque al momento de activar la fila 0
se tiene abierta la identificación de las
teclas “1”, “2”, “3” y “+” que correspon-
den con las columnas C0, C1, C2 y
C3, que a su vez se conectan con las
entradas PA0, PA1, PA2 y PA3 del mi-
crocontrolador. Para reconocer la te-
cla que fue oprimida, se tiene que ha-
cer uso de comparaciones las cuales
están representadas por medio del
símbolo de un rombo en el diagrama
de flujo de la figura 25. Dentro de los
bloques de comparación se encuentra
expresada una pregunta, por medio
de la cual se verifica por cuál terminal
de entrada del microcontrolador se
está reflejando el “1” lógico que se es-
tá enviando por la salida S0 del micro-
controlador. Si la pregunta se hace vá-
lida en alguna de las condiciones de
comparación, como respuesta un “si”
procediendo a guardar un dato en un
registro de memoria RAM identificado
como “varteclado”.
El valor del dato que será alojado
en el registro varteclado depende de
cuál comparación fue válida, la cual a
su vez está relacionada con la tecla
que ha sido presionada. Para el caso
de la fila 0 los valores que pueden ser
guardados son: 31H, 32H, 33H ó 2BH,
de acuerdo con la tecla que fue activa-
da. Pero sí ninguna tecla de la fila 0 es
accionada, entonces el resultado de
las comparaciones será “no” provo-
cando que como paso siguiente se re-
pita nuevamente el proceso de identi-
ficar la tecla que es accionada, pero
ahora en la siguiente fila que se iden-
tifica como F1 (fila 1).
De manera básica cuando se pasa
a la activación de la fila 1, el proceso
es el mismo que para la fila 0, sólo
que en esta oportunidad, la salida que
se activará será la identificada en el
microcontrolador como S1 (PB1) y
que corresponde con la fila 1, hacién-
dose esta operación por medio del co-
mando “bsf portb,1”. De igual manera
para evitar los rebotes mecánicos de
los interruptores del teclado, es utiliza-
do un retardo de máximo 10 mseg.
Acto seguido dependiendo en que co-
lumna se encuentra la tecla que se
oprima, será por donde se reciba el
correspondiente “1” lógico a través de
la terminal de entrada, solo que en es-
ta ocasión las posibles teclas que
pueden ser activadas son las identifi-
cadas como “4”, “5”, “6” ó “-“, que co-
rresponden con las entradas E0, E1,
E2 ó E3.
Sí fue presionada una tecla de la
fila 1, se procederá a guardar un dato
en el registro varteclado, que en esta
50
Figura 25 Diagrama de flujo para controlar al teclado matricial.
oportunidad utiliza los valores 34H,
35H, 36H ó 2DH. En caso de que no
se oprima tecla alguna de la fila 1, en-
tonces se pasará a revisar sí en la fila
2 es en donde se presionó una tecla.
La operación que se realiza para las
filas 0 y 1 es la misma que se utiliza
para las filas 2 y 3, pero buscando que
se oprima cualquiera de las teclas “7”,
“8”, “9” ó “X” para la fila 2, ó las teclas
“L”, “0”, “=” ó “/” para la fila 3, todo es-
to de acuerdo a como se observa en
51
Tabla 57. Código del programa de control de un teclado matricial parte 1.
el diagrama de flujo de la figura 25.
Para el presente ejercicio de aprendi-
zaje en la utilización del teclado, esta-
mos condicionando al programa del
microcontrolador, para que una vez
que se presiona una tecla y se le asig-
na el valor correspondiente al registro
varteclado, se proceda a realizar algu-
na otra actividad, mientras que si nin-
guna tecla se presiona, se tiene que
realizar la búsqueda de alguna tecla
mediante la activación de las diferen-
52
Tabla 58 Código del programa de control de un teclado matricial parte 2.
tes filas, terminando con esta activi-
dad cuando alguna tecla es presiona-
da.
En la fila 3 las teclas L e = las re-
lacionamos con un valor hexadecimal
igual que 01 y 0F respectivamente, ya
que la tecla L la utilizaremos por ejem-
plo para limpiar el valor del registro
varteclado, mientras que la tecla = la
emplearemos por ejemplo para mos-
trar un resultado.
En el diagrama esquemático de la
figura 26 se muestra el circuito básico
para conectar el teclado matricial al
microcontrolador, en el cual sólo
se muestran las terminales de
los puertos A y B que son em-
pleadas, pero debe tomar en
cuenta que falta la alimentación y
el cristal en caso de ser requeri-
do.
En la tabla 57 se muestra el
programa que tiene que ser car-
gado al microcontrolador para
que controle la lectura del tecla-
do matricial.
Por último, en el diagrama de
flujo de la figura 25, y en el códi-
go del programa de las tablas 57
y 58 del teclado matricial, se ha-
ce uso de una subrutina para ge-
nerar el retardo de tiempo de 10
mseg.
Configuración
de las Interpretaciones
Las interrupciones en un mi-
crocontrolador son elementos
muy importantes dentro de un
programa, sobre todo si el micro-
controlador tiene que realizar va-
rias actividades a la vez. Por
ejemplo, existen aplicaciones en
donde el microcontrolador tiene
que esperar algún dato a través
de la comunicación serial asín-
crona, y para esto, el microcon-
trolador no puede quedarse es-
perando hasta que llegue, por-
que puede pasar desde 1 milise-
gundo hasta 1 hora para que es-
to suceda, y mientras el microcontro-
lador tiene que procesar más informa-
ción originada por diversas fuentes.
Es aquí donde la actividad de las inte-
rrupciones cobra su importancia, por-
que el microcontrolador puede estar
trabajando normalmente, y sólo será
“interrumpido” de su actividad princi-
pal, para avisarle en el momento justo
cuando tiene que poner la atención
para recibir la comunicación serial.
Las interrupciones de manera ge-
neral, las podemos definir como cor-
tes que se realizan a la ejecución de
un programa. Para proceder a realizar
la ejecución de un programa alterno,
observe la imagen de la figura 27.
El programa principal dentro de un
microcontrolador puede estar en mar-
cha, ejecutando sus respectivas ins-
trucciones, mientras la causa de algu-
na interrupción que haya sido habilita-
da no se haga presente. Cuando una
interrupción es activada, el microcon-
trolador deja de ejecutar las instruc-
ciones del programa principal, acce-
diendo a una región de la memoria de
programa que es donde se encuentra
el código de un programa que
corresponde con el servicio
de la interrupción solicitada.
En el mismo instante que la
interrupción se genera, los
datos que se encuentran en
el registro contador de pro-
grama (Program Counter
PCL y PCLATH) se guardan
en un apuntador de pila (me-
moria temporal también lla-
mada Stack Pointer). Por otra
parte, también se aloja en el
Stack Pointer el dato que es-
té presente en el registro sta-
tus. Una vez que está en
marcha el código del progra-
ma que se ejecuta cuando
una interrupción se hace pre-
sente, el microcontrolador
debe realizar las actividades
pertinentes a la causa que
motivó la interrupción, esto
es, se debe dar paso a la
gestión de la información re-
lacionada con el trabajo que
tiene que realizarse solamen-
te cuando la interrupción es
provocada. Normalmente el
código de programa que es
destinado para una interrup-
ción, debe ser pequeño (de-
be contener pocas líneas)
con respecto al código del
programa principal, para que
el microcontrolador no se
quede atrapado por mucho
tiempo dentro de la interrup-
ción, y tan solo le dedique el
53
Figura 27. Programa principal e interrupción
Figura 26. Conexión de un teclado matricial de 4 X 4.
tiempo suficiente para que se ejecute
plenamente el servicio de la interrup-
ción.
Para indicarle al microcontrolador
que el programa de una interrupción
ha terminado, se emplea el comando
“retfie” y cuando éste se ejecuta, los
datos que se almacenaron previa-
mente en el Stack Pointer, regresan
de manera ordenada al registro status
y apuntador de programa, para que el
microcontrolador continué
con la marcha del programa
principal, procediendo a la
ejecución de la instrucción
siguiente de donde fue inte-
rrumpido el programa principal por
medio de la interrupción.
En un microcontrolador PIC la
configuración de las interrupciones,
se realiza por medio del empleo del
registro llamado “intcon” que es en
donde se encuentran los bits que acti-
van a las interrupciones. Para mayor
referencia observe la imagen de la fi-
gura 28, en donde se describe con de-
talle la ubicación de los bits que com-
ponen al registro “intcon” (para una
mejor referencia consulte el capitulo
“reset interrupciones y watchdog” y
“descripción de los registros”, ambos
temas pertenecientes al modulo I). De
los 8 bits que contiene el registro “int-
con” sólo nos interesan por el momen-
to los que se identifican como “GIE” y
“PEIE”.
Por medio del bit GIE se realiza la
activación de todas las interrupciones
que posee el microcontrolador PIC.
Por lo tanto, es el más importante que
debemos de contemplar, ya que sin la
activación de éste ninguna interrup-
ción surtiría efecto. Para activar el bit
GIE se necesita colocarlo en estado
lógico “1”.
El bit PEIE sirve para activar las
interrupciones del microcontrolador
que son originadas por dispositivos
periféricos, esto es, además de acti-
var todas las interrupciones por medio
del bit GIE, es necesario activar el bit
PEIE si es que la interrupción que se
habilitará pertenece a un dispositivo
periférico al microcontrolador PIC. En-
tendiéndose por dispositivos periféri-
cos, todos aquellos que de manera
externa al microcontrolador son nece-
sarios para que se haga llegar infor-
mación al PIC, por ejemplo la comuni-
cación serial asíncrona, la conversión
por medio del ADC, etc. Para activar
el bit PEIE se necesita colocarlo en
estado lógico “1”.
Nuevamente indicamos que el bit
GIE es el primero que tiene que ser
activado, para que cualquier interrup-
ción surta efecto, y posteriormente to-
mar en cuenta si la interrupción que
requerimos es originada por un dispo-
sitivo periférico, o por activación inter-
na al microcontrolador. Si la interrup-
ción se genera a través de un disposi-
tivo periférico, entonces tiene que ha-
cerse uso del bit PEIE, mientras que
en caso contrario (si es originada de
manera interna) se tendrá
que buscar cuál es el bit que
tiene que activarse.
En el código que muestra
como ejemplo en la tabla 59,
54
Figura 28. Detalle del registro INTCON.
Tabla 59. Plantilla de ejemplo para configurar una interrupción.
se muestra que para configurar una
interrupción se hace uso de los co-
mandos que vemos en la tabla 59b.
Por medio de las instrucciones
“bsf” se colocan estados lógicos “1” en
los bits toie y gie del registro intcon,
para que de esta manera sean habili-
tada la interrupción con la que trabaja-
rá el microcontrolador PIC. Como pa-
so siguiente a la ejecución de las ins-
trucciones de habilitación de la inte-
rrupción, el programa principal conti-
núa ejecutándose hasta que se pre-
sentan las condiciones que provocan
la interrupción, siendo éste el momen-
to en el que se interrumpe la secuen-
cia de ejecución de las instrucciones.
Cuando una interrupción se presenta,
se coloca en estado lógico “1” el bit
que hace la función de indicar que la
interrupción se ha generado, este bit
también recibe el nombre de bandera,
y existe uno para cada interrupción
que se encuentre presente en el mi-
crocontrolador PIC con el que este-
mos trabajando.
Una vez que se ha suscitado una
interrupción, ya mencionamos que la
ejecución normal del programa se de-
tiene, y como paso siguiente la infor-
mación que se encuentra dentro de
los registros apuntadores de progra-
ma, así como también el dato del re-
gistro status, se almacenan en el
stack pointer. Acto seguido en el
apuntador de programa se coloca el
valor 04, que corresponde con el vec-
tor de interrupción, y por lo tanto, el
microcontrolador sabe que tiene que
dirigirse a la localidad 4 de la memoria
de programa, es por ello que se decla-
ra, por medio de comando “org 4”,
dónde se encuentra dicha localidad.
Independientemente de cual haya
sido el origen de la interrupción, en el
apuntador de programa se coloca el
valor 04, esto quiere decir que sea
cual sea el motivo de la interrupción,
el microcontrolador siempre se dirigirá
al vector de interrupción, por lo que
una vez que el apuntador de progra-
ma se encuentra sobre este vector, se
tiene que preguntar de manera espe-
cífica ¿cuál es el origen de la interrup-
ción? Para ello se tiene que preguntar
por el estado lógico que tenga el bit
bandera de la interrupción, y si este se
encuentra en estado lógico “1” signifi-
ca que se ha identificado el origen de
la interrupción, por lo tanto, ahora el
microcontrolador tiene que ejecutar el
código de la rutina de interrupción. Se
debe de tomar en cuenta que existen
aplicaciones en las que se requiere
activar a más de una interrupción, y
para ello tenemos que identificar per-
fectamente dónde se encuentran los
bits bandera de cada una de las inte-
rrupciones.
Ya dentro del código de programa
de una interrupción, normalmente lo
que se tiene que hacer es desactivar
todas las interrupciones, ya que de lo
contrario estando dentro de una, pu-
diera generarse una más causando
desconcierto y pérdida de la secuen-
cia del programa del microcontrolador,
y por lo tanto, éste se “perderá” y co-
menzará a volverse loco. Quienes tie-
nen experiencia en la programación
de microcontroladores, pueden mane-
jar una interrupción dentro de otra, pe-
ro se debe considerar también que la
capacidad del stack pointer es tan so-
lo de 8 niveles, por lo que se debe te-
ner un manejo exacto de las interrup-
ciones que se van generando.
Después de ejecutar las instruccio-
nes por medio de las cuales se da el
servicio para atender la causa de la in-
terrupción, se tiene que restablecer la
activación nuevamente de la interrup-
ción, y también limpiar la bandera que
indica el estado de la interrupción, pa-
ra que el microcontrolador esté prepa-
rado para una rutina más. La instruc-
ción que se emplea para indicarle al
microcontrolador que el servicio de in-
terrupción ha sido ejecutado en su to-
talidad es el “retfie”, y cuando este se
ejecuta provoca que se obtengan los
datos que se habían alojado en el
stack pointer, restituyéndolos a los re-
gistros status y apuntador de progra-
ma, siendo el apuntador de programa
el medio a través del cual el microcon-
trolador regresa a la instrucción si-
guiente de donde iba ejecutando el
programa normalmente. Cabe hacer la
mención de que se debe contar con un
código de programa para cada una de
las interrupciones que van a ser activa-
das, para que el microcontrolador “se-
pa” el trabajo específico que tiene que
realizar de acuerdo a la causa que
generó la interrupción. Por último dire-
mos que para un microcontrolador PIC,
se tienen contempladas diversas fuen-
tes que pueden dar origen a una inte-
rrupción, por lo que se tiene que revi-
sar el manual del microcontrolador PIC
que se vaya a utilizar para determinado
proyecto. Las fuentes de interrupción
más comunes en los microcontrolado-
res PIC son las siguientes:
• Interrupción externa RB0/INT.
• Interrupción TMR0 Overflow.
• Interrupción por cambio en el es -
tado lógico de los pines del PORTB
(pines RB<7:4>).
• Interrupción por Comparador.
• Interrupción por el ADC.
• Interrupción al emplear la EE -
PROM de datos.
• Interrupción de Tx mediante
USART.
• Interrupción de Rx mediante
USART.
• Interrupción CCP (Captura/Com -
paración/PWM).
• Interrupción CCP1.
• Interrupción CCP2.
• Interrupción SSP (Puerto Serial
Síncrono).
• Interrupción PSP (Puerto Parale -
lo Esclavo).
• Interrupción TMR1 Overflow.
• Interrupción TMR2 Match.
55
bsf intcon,toie ;activa el bit que habilita la interrupción específica.
bsf intcon,gie ;activa al habilitador general de interrupciones.
Tabla 59b
Implementación
de un Retardo por Timer
El timer dentro de un microcontro-
lador es una herramienta muy valiosa,
sobre todo para establecer una tem-
porización con un buen nivel de exac-
titud. Podemos diseñar un proceso de
conteo de tiempo por medio del esta-
blecimiento de bucles de retardo, pero
el microcontrolador no tendría la ca-
pacidad de realizar más tareas, y so-
lamente se dedicaría a “perder” el
tiempo, y será sólo hasta que se con-
suma el tiempo calculado, cuando el
microcontrolador podrá dedicarse a la
atención de otras actividades. Imagi-
nen la temporización de 1 sólo minu-
to, y mientras también se está leyen-
do la información de los signos vitales
de una persona a través de los res-
pectivos sensores, si el microcontrola-
dor no hace otra cosa mientras se
consume el tiempo de la temporiza-
ción, ¡el paciente se nos puede morir!
Es aquí donde toma importancia el
empleo de los timers con los que
cuente el microcontrolador, ya que
mientras se controla el conteo de
tiempo, en el mismo momento el mi-
crocontrolador puede estar realizando
alguna otra tarea.
El timer que sea activado le avisa
al microcontrolador PIC por medio de
una interrupción que ha terminado
con un conteo de tiempo. Aunque de
manera rigurosa, lo que cuentan los ti-
mer son los ciclos de ejecución de las
instrucciones de un programa en un
microcontrolador, pero a la vez la eje-
cución de una instrucción consume un
tiempo, el cual sabemos su valor. Por
lo tanto, de manera indirecta sabre-
mos el tiempo total que se consumió
al llevar a un contador desde el valor
de 00H al valor de FFH.
Podemos decir que un timer bási-
camente es un registro, que hace la
función de un contador que puede es-
tar conformado por 8 ó 16 bits, tenien-
do como actividad principal la de ir in-
crementando unidad por unidad el va-
lor del correspondiente registro. De
manera ilustrativa explicaremos la
manera en que opera un timer, consi-
derando en primer instancia uno de 8
bits, por lo que el correspondiente
conteo en números hexadecimales
comenzará en el valor 00H, posterior-
mente continuará con el valor 01H,
después el 02H y así sucesivamente
hasta llegar al valor máximo que es
FFH, pero ahí no se detiene el conteo
del registro contador del timer, por lo
que si se presenta un incremento
más, el número siguiente será el 00H,
siendo este “desbordamiento” el que
genere una interrupción, avisando
que en el registro contador del timer
se ha llegado al conteo máximo de
eventos (para un registro de 8 bits, se-
rán 256 que van de 00 a FF en hexa-
decimal). Si el timer es de 16 bits los
valores del registro contador comen-
zarán en el número hexadecimal
0000H, continuarán en 0001H, des-
pués en 0002H, y así sucesivamente
hasta llegar al número FFFFH (para
un registro de 16 bits, se realizarán
16536 conteos que van desde 0000 a
FFFF en hexadecimal), y cuando se
genere un incremento más se produ-
cirá un “desbordamiento”, dejando en
el registro contador del timer el valor
0000H, lo cual dará origen a que
acontezca una interrupción.
El incremento del número alojado
en el registro contador del timer, se va
dando de manera automática cuando
las instrucciones del programa del mi-
crocontrolador se van ejecutando una
a una, para ello, previamente se tuvo
que haber activado y configurando el
correspondiente timer. Cada una de las
instrucciones puede consumir de 1 a 2
ciclos de instrucción, que es el tiempo
en que se ejecuta una instrucción (pa-
ra mayor referencia consulte el capitu-
lo “conjunto de instrucciones y su for-
mato” perteneciente al modulo I). Co-
mo se indicó anteriormente, el incre-
mento del registro contador se va dan-
do cuando se van ejecutando las ins-
trucciones. Por lo tanto, el programa
principal que va controlando las activi-
dades del microcontrolador puede es-
tar en operación normal realizando las
actividades correspondientes al siste-
ma de control que se implementó, y se-
rá hasta que se genere un desborda-
miento cuando se produzca una inte-
rrupción, pasando a ejecutar un pro-
grama alterno que también se encuen-
tra dentro del microcontrolador.
El Timer de 8 Bits (TMR0)
Configurar el timer de 8 bits es una
de las actividades más sencillas que
se pueden realizar dentro de un mi-
crocontrolador PIC. De hecho la acti-
vidad más compleja se realiza des-
pués, cuando se escribe el código del
programa de la interrupción del timer,
pero dejemos por el momento la expli-
cación de este detalle, y nos concen-
traremos en la tarea de configurar el
timer de 8 bits.
El registro principal que se tiene
que intervenir para configurar al timer
de 8 bits también conocido como ti-
mer0 en el microcontrolador PIC, es el
identificado como “OPTION REG” (op-
tion) y en el se configuran los bits que
se describen a continuación:
El bit 5 del registro OPTION REG
se coloca en estado lógico “0” ó “1”,
de acuerdo dónde se quiera tomar la
fuente que da origen al incremento del
conteo que se realiza en el registro
contador del timer, tomando en cuen-
ta que la manipulación del conteo se
puede dar a través del pulso que en-
tregue un circuito oscilador externo,
conectado a la terminal del microcon-
trolador identificada como RA4/T0C-
KI, o el conteo también se puede dar
empleando el circuito de reloj interno
que posee el microcontrolador. El bit 5
del registro OPTION REG se identifica
como T0CS (Bit selector del origen del
reloj del TMR0). A continuación se ex-
presan las posibilidades de configura-
ción del bit 5. Vea el cuadro 1.
A través del bit 3 del registro OP-
TION REG se configura el destino del
prescaler, que tiene como función la
de establecer cuántos ciclos de ins-
56
trucción deben ejecutarse para que se
tenga un incremento de una unidad en
el registro contador del timer. El bit 3
se identifica como PSA (Bit de asigna-
ción del Prescaler), el cual se coloca
en estado lógico “0” ó “1”, dependien-
do de las siguientes posibilidades: vea
el cuadro 2.
Los bits 2, 1 y 0 del registro OP-
TION REG se identifican como PS2,
PS1 y PS0 (Bits selectores del rango
Prescaler) respectivamente, tienen la
tarea de fijar el número de ciclos de
instrucción que se deben ejecutar pa-
ra que se incremente en una unidad el
valor del registro contador del timer.
Para ello en la tabla 60, se muestran
las combinaciones binarias que pue-
den adquirir los bits PS2, PS1 y PS0
generando las diferentes posibilida-
des de configuración de las cuales se
tiene que seleccionar la más adecua-
da en función del valor de la tempori-
zación que sea necesario habilitar.
Los bits restantes del registro OP-
TION REG que no han sido descritos
se deben colocar en estado lógico “0”
para que el timer0 sea completamen-
te configurado. Por otra parte, el deta-
lle de este registro se muestra de ma-
nera completa en la imagen de la figu-
ra 29.
Pasando a otra parte
de la configuración del ti-
mer0, se mencionará que
tiene que hacerse uso del
manejo de las interrupcio-
nes, cada vez que el re-
gistro “TMR0” (registro
contador del timer0) sufre
un desbordamiento de
sus datos (cuando pasa
del valor FFH al 00H). Es-
te desbordamiento es causa-
do por la ejecución de las ins-
trucciones en el microcontro-
lador, que de acuerdo al pres-
caler seleccionado se reque-
rirá de un cierto número de
ciclos de instrucción para que
se vaya incrementando de
unidad en unidad el valor del
registro TMR0. Para que sea
entendible la presente expli-
cación, emplearemos un
ejemplo en donde el valor del
prescaler que se ha seleccionado es
de 64, equivalente a colocar los datos
binarios “1”, “0” y “1” respectivamente
en los bits PS2, PS1 y PS0 del regis-
tro OPTION REG.
Cada vez que se desborda el re-
gistro TMR0 se tiene que producir una
interrupción para “avisar” que se ha
completado un ciclo de tiempo bien
establecido, para lo cual en primera
instancia se realizan las siguientes
operaciones: vea la fórmula 1.
Para calcular el tiempo en el que
se incrementa en una unidad el valor
del registro TMR0, hacer lo siguiente:
(Prescaler)*(Tiempo del ciclo de
instrucción) = (64)*(1 µseg) = 64 µseg
Por último, para calcular el interva-
lo de tiempo que se consume (tam-
bién llamado Ciclo de tiempo), para
generar una interrupción se efectúa la
siguiente operación:
Ciclo de tiempo = (64 µseg)*(256
conteos en el registro TMR0)
Ciclo de tiempo = 16.38 mseg
Esto quiere decir que cada 16.38
mseg se produce una interrupción,
por lo que para establecer un tiempo
base de 1 segundo tenemos que de-
terminar el número de interrupciones
que se requieren a través de la si-
guiente operación: vea la fórmula 2.
Para efectos prácticos
se tomará la cantidad
de 61 interrupciones,
para generar un tiem-
po base de 1 segundo,
claro que para esto es-
tamos considerando
un oscilador a cristal
con un valor de 4 MHz.
Dicho sea de paso es-
te tiempo no genera
exactamente 1 segun-
57
Figura 29. Detalle del registro OPTION_REG.
Tabla 60. Configuración del Prescaler
del Timer0.
Fórmula 1
1 = El Prescaler es asignado al WDT .- Esta configuración se emplea para activar al watch dog.
0 = El Prescaler es asignado al módulo Timer0 .- Esta configuración se emplea para activar al registro TMR0,
que es el registro contador del timer.
Cuadro 2
1 = Transición en el pin RA4/T0CKI.- Esta configuración se emplea para implementar un contador
externo de eventos.
0 = Ciclo de reloj Interno (CLKOUT).- Esta configuración se emplea para implementar un temporizador.
Cuadro 1
do, pero es muy cercano. Una vez que
hemos concluido con la realización de
las operaciones, y sabemos de la can-
tidad de interrupciones que se tienen
que efectuar para generar una tempo-
rización base de 1 segundo, en la ru-
tina de interrupción del microcontrola-
dor se tiene que contemplar el empleo
de un contador, cuya tarea principal
será registrar el número de interrup-
ciones que se van produciendo.
Cuando este contador llegue a un va-
lor de 61 quiere decir que ha transcu-
rrido aproximadamente 1 segundo.
Ahora contamos con una base de
tiempo con la cual podemos generar
el programa para implementar un re-
loj.
La manera de activar la interrup-
ción cuando sea detectado el desbor-
damiento del valor del registro TMR0,
es por medio del registro identificado
como “INTCON” del cual se manipu-
lan los bits 7 y 5 de acuerdo con la si-
58
Tabla 61. Programa para controlar los bits de un puerto por medio del timer de 8 bits.
guiente explicación. El bit
7 del registro INTCON
que se identifica como
GIE (Habilitación Global
de las Interrupciones), se
debe colocar en estado
lógico “1”, para que sean
habilitadas todas las inte-
rrupciones, mientras que
si es colocado un “0” lógico en el bit
GIE, implicará que las interrupciones
sean inhabilitadas. A continuación se
muestra de manera resumida lo ex-
presado.
1 = Habilita todas las interrupcio -
nes no enmascarables
0 = Deshabilita todas las interrup -
ciones
El bit 5 del registro INTCON que
se identifica como T0IE (Habilita la in-
terrupción por desbordamiento en el
TMR0), se debe colocar en estado ló-
gico “1”, para que la interrupción por
desbordamiento en el conteo del re-
gistro TMR0 surta efecto, por otra par-
te, se debe colocar en “0” lógico para
deshabilitarlo.
1 = Habilita la interrupción del
TMR0
0 = Deshabilita la interrupción del
TMR0
Los bits restantes del registro INT-
CON que no se emplean para el ti-
mer0, deben permanecer en estado
lógico “0”. El detalle del registro INT-
CON se muestra en la imagen de la fi-
gura 30.
La bandera que indica que ha sido
activada la interrupción, por desbor-
damiento en el conteo del registro
TMR0, está implementada en el bit 2
del registro INTCON el cual se identi-
fica como TOIF, siendo el estado lógi-
co de este bit el que indica que se ge-
neró una interrupción. Cuando esto
suceda el bit TOIF se colocará en el
estado lógico “1”.
En la tabla 61, se muestra el códi-
go completo para programar al micro-
controlador PIC, empleando el timer
de 8 bits para controlar el encendido y
apagado de los leds del puerto C a
una frecuencia de 1 Hz aproximada-
mente. Por otra parte, se está configu-
rando un microcontrolador PIC
16F874, pero exactamente el mismo
procedimiento se puede realizar con
cualquier otro microcontrolador PIC.
El Timer de 16 Bits (TMR1)
El timer de 16 bits es muy similar
en su forma de operar al timer de 8
bits, teniendo como diferencia princi-
pal que el timer de 16 bits, emplea 2
registros de 8 bits para realizar un
conteo ya sea de eventos o de tiempo,
por consiguiente, se dispone tanto de
una resolución como con valores mu-
cho más amplios en cuanto al estable-
cimiento de un valor de tiempo o un
número de eventos a contabilizarse
respectivamente.
El primer registro que tiene que
ser intervenido para configurar al ti-
mer de 16 bits (también conocido co-
mo timer1) en el microcontrolador
PIC, es el identificado como “T1CON”
y en el se configuran los bits que se
describen a continuación:
Los bits 5 y 4 del registro T1CON
se identifican como T1CKPS1 y
T1CKPS0 (Bits selectores del rango
Prescaler del reloj) respectivamente,
se colocan ya sea en estado lógico “0”
ó “1”, de acuerdo a la combinación bi -
naria que se forma entre los 2 bits, pa -
ra generar un valor que a su vez co -
rresponde con el número de ciclos de
instrucción que se de -
ben ejecutar para que
se incremente en una
unidad el valor del regis -
tro contador del timer.
En la tabla 62 se mues -
tran las 4 combinacio -
nes binarias que se pue -
den formar a partir de
los bits T1CKPS1 y T1CKPS0, gene -
rando las diferentes posibilidades de
configuración, de las cuales se tiene
que seleccionar la más adecuada, en
función del valor de la temporización o
el número de eventos que sea necesa -
rio contabilizar.
El bit 3 del registro T1CON que se
identifica como T1OSCEN (Bit de con-
trol del oscilador del timer1), tiene la
función de habilitar 2 terminales del
microcontrolador PIC para que a tra-
vés de ellas se reciba la información
de un disparo externo, que a su vez
alimenta a un oscilador interno en el
microcontrolador. El oscilador interno
es empleado para sincronizar la señal
externa con el proceso posterior que
realiza el timer1, contribuyendo con la
generación de una señal apropiada
tomando en cuenta que el disparo ex-
terno puede ser de no muy buena ca-
lidad, por lo que el oscilador interno
además posee de un circuito dispara-
dor de Schmitt. El disparo externo
puede emplearse para contabilizar
tiempo o número de eventos. Las ter-
minales que son habilitadas en el mi-
crocontrolador por medio del bit
T1OSCEN, se identifican como RXX-
/T1OSI/XXX y RYY/T1OSO/T1C-
KI/XXX (los términos RXX, RYY, XXX
e YYY dependen del microcontrolador
que se este empleando, por lo tanto
59
Fórmula 2
Figura 30. Detalle del registro INTCON.
Tabla 62.Configuración del Prescaler
del Timer1.
se les recomienda consultar el manual
del microcontrolador PIC correspon-
diente), estas terminales quedan con-
figuradas como entradas, por lo que
los 2 bits relacionados en el registro
TRIS de configuración del determina-
do puerto son ignorados.
1 = Oscilador habilitado .-
Esta configuración se emplea para
configurar a las terminales T1OSI y
T1OSO/T1CKI como entradas.
0 = Oscilador apagado.-
Por medio de esta configuración se
deshabilita al oscilador interno, que -
dando las terminales T1OSI y T1O -
SO/T1CKI para otras aplicaciones.
El bit 2 del registro T1CON que se
identifica como T1SYNC (Bit de con-
trol de sincronización del disparo ex-
terno), tiene la tarea de sincronizar o
no el disparo externo del timer1, con
el oscilador interno del microcontrola-
dor.
Cuando se configura el timer1 pa-
ra trabajar en el modo sincronizado, el
microcontrolador no se debe colocar
en el modo de ahorro de energía (mo-
do sleep), mientras que por otra parte,
cuando se configura el timer1 para
funcionar en el modo no sincronizado,
no importa que el microcontrolador se
encuentre en el modo de ahorro de
energía, porque el timer seguirá traba-
jando y aun así producirá su respecti-
va interrupción, provocando que el mi-
crocontrolador se “despierte”. La con-
figuración del bit T1SYNC, a su vez
depende del estado que se tenga en
el bit TMR1CS que también se en-
cuentra dentro del registro T1CON. A
continuación se expresan las posibili-
dades de configuración del bit 2.
Si el bit TMR1CS se encuentra en
1 lógico:
T1SYNC = 1.- No sin -
croniza el reloj externo.
T1SYNC = 0.- Sincro -
niza el reloj externo.
Si el bit TMR1CS se encuentra en
0 lógico:
El bit T1SYNC es ignorado, por lo
tanto, el Timer1 emplea el reloj inter -
no.
El bit 1 del registro T1CON que se
identifican como TMR1CS (Bit que
controla la selección del origen del os-
cilador), tiene la tarea de seleccionar
la fuente que origina la generación de
la señal de reloj con la que el timer
realizara su función. Se cuenta con 2
posibilidades de configuración para
por medio de la señal de reloj, incre-
mentar el valor de los registros del ti-
mer 1, estas opciones se encuentran
entre el empleo del reloj interno (equi-
valente a dividir la frecuencia del osci-
lador entre 4) del microcontrolador
PIC, y la utilización de un circuito os-
cilador externo, el cual se conectaría a
la terminal identificada como …/T1O-
SO/T1CKI/… aclarando que con la
presente configuración, el incremento
de los registros del timer 1 se darán
cuando se presente el flanco de as-
censo en la oscilación externa.
1 = Oscilador externo.-
Esta configuración permite el em -
pleo de un oscilador externo conecta -
do en la terminal T1OSO/T1CKI.
0 = Reloj interno .-
Habilitación del oscilador por me -
dio del reloj interno
(La frecuencia de oscilación se di -
vide entre 4).
El bit 0 del registro T1CON que se
identifica como TMR1ON (bit que en-
ciende la timer 1), tiene la misión de
activar la operación del timer 1.
1 = Activa el Timer 1
0 = Detiene el Timer 1
Los bits 5 y 6 del registro T1CON
no se emplean y siempre se mantie-
nen en estado lógico “0”. A continua-
ción en la imagen de la figura 31 se
muestra el detalle del registro.
Después de configurar al timer 1,
continuaremos con la explicación de
su operación tomando en cuenta el
empleo de la correspondiente inte-
rrupción, la cual se invocará cada vez
que el dato de 16 bits alojado en los
registros “TMR1H” y “TMR1L” (parte
alta y baja del dato de 16 bits), se des-
borda y pasa del valor FFFFH al
0000H.
El dato de 16 bits se va incremen-
tando de unidad en unidad, a través
de la ejecución de las instrucciones en
el microcontrolador, que de acuerdo
con el prescaler fijado anteriormente,
se requerirá un cierto número de ci-
clos de instrucción para que se vaya
incrementando el valor alojado en los
registros TMR1H y TMR1L. Para que
se entienda mejor lo que se ha descri-
to, recurriremos al empleo de un
ejemplo en el cual el valor del presca-
ler será de 4. Para ello se requiere co-
locar los estados lógicos de “1” y “0”
respectivamente en los bits T1CKPS1
y T1CKPS0 que pertenecen al registro
T1CON. Por otra parte, será imple-
mentada la operación del reloj interno,
para generar la oscilación que tenga
la misión de incrementar al valor de 16
bits. Por lo tanto, serán colocados en
estado lógico “0” los bits identificados
como T1OSCEN, T1SYNC y
TMR1CS, mientras que el bit TM-
R1ON se debe fijar en el estado lógi-
co “1” para encender al timer 1; re-
cuerde que estos bits se encuentran
dentro del registro T1CON.
A continuación mostraremos la
manera de realizar unos cálculos ma-
temáticos muy sencillos, para determi-
nar qué es lo que sucede cada vez
que se desborda el valor del dato con-
tenido en los registros
TMR1H y TMR1L. Cuando
se suscita el desborda-
miento se genera una inte-
rrupción, que será la en-
60
Figura 31. Detalle del registro T1CON.
cargada de “indicar” que se ha com-
pletado un ciclo de tiempo bien esta-
blecido, para lo cual en primera ins-
tancia se realizan las siguientes ope-
raciones: vea la fórmula 3.
Para calcular el tiempo en el que
se incrementa en una unidad el valor
del dato contenido en los registros
TMR1H y TMR1L se realiza lo siguien-
te:
( P r e s c a l e r -
)*(Tiempo del ci -
clo de instruc -
ción) = (4)*(1
µseg) = 4 µseg
Por último, para
calcular el inter-
valo de tiempo
que se consume
(también llamado
Ciclo de tiempo),
para generar una
interrupción se
efectúa la si-
guiente opera-
ción:
Ciclo de tiempo =
(4 µseg)*(65536
conteos en los re -
gistros TMR1H y
TMR1L)
Ciclo de tiempo =
262.14 mseg
El dato obtenido
en el Ciclo de
tiempo, significa
que cada 262.14
mseg se genera
una interrupción,
por lo que para
determinar un
tiempo base de 1
segundo se tiene
que contabilizar
el número de interrupciones que son
necesarias, y para calcularlas lo hace-
mos mediante la siguiente operación:
vea la fórmula 4.
El número de interrupciones es de
3.81, de las cuales se pueden conta-
bilizar perfectamente en el microcon-
trolador las 3 interrupciones, pero el
valor de 0.81 no se pude manejar por
medio de interrupciones, y como se
trata de un valor considerable porque
casi se trata del valor de una interrup-
ción (pero sin llegar a ella), se debe
considerar para que la base de tiempo
que estamos diseñando sea muy cer-
61
Fórmula 4
Fórmula 3
Tabla 63. Programa para controlar los bits de un puerto por medio del timer de 16 bits.
cana a 1 segundo. Por ello, en el pro-
grama se implementó después de
contabilizar las 3 interrupciones, un
comparador en el cual se revisa que
se encuentre el dato CF5CH en los re-
gistros TMR1H (con el valor CFH) y
TMR1L (con el valor 5CH).
El valor CF5CH equivale al 81%
del valor de un conteo total tomando
en cuenta 16 bits (del 0000H al
FFFFH), y se consideró el 81% por-
que equivale al valor de 0.81 del total
de las interrupciones.
Para efectos prácticos generar un
tiempo base de 1 segundo al conside-
rar la cantidad de 3.81 interrupciones,
se está considerando un oscilador a
cristal con un valor de 4 Mhz, y dicho
sea de paso, la base de tiempo que se
diseñó (de 1 segundo) no genera
exactamente 1 segundo, pero es muy
cercano.
Cuando hemos terminado de con-
figurar al timer 1, además de haber
calculado la cantidad de interrupcio-
nes que se tienen que generar para
lograr una temporización base de 1
segundo, se tiene que agregar en el
código correspondiente de la rutina de
interrupción del timer 1 un registro
contador, cuya misión básica es la de
verificar que el número de interrupcio-
nes que se produzcan sean precisa-
mente las que se calcularon. El regis-
tro contador recibe el nombre de “con-
tinte”. Para que se active la interrup-
ción originada por el desbordamiento
en el conteo del valor que se encuen-
tra dentro de los registros TMR1H y
TMR1L, es necesario que sean inter-
venidos los bits 7 y 6 que se encuen-
tran contenidos en el registro identifi-
cado como “INTCON”, además del bit
0 del registro “PIE1”, de
acuerdo con lo siguiente.
El bit 7 del registro INT-
CON que se identifica como
GIE (Bit de habilitación Glo-
bal de las Interrupciones),
se debe colocar en estado
lógico “1”, para que sean
habilitadas todas las inte-
rrupciones, mientras que si
un “0” lógico es colocado en el bit GIE,
todas las interrupciones serán inhabi-
litadas. A continuación se muestra un
resumen de lo expresado.
1 = Habilita todas las interrupcio -
nes no enmascarables.
0 = Deshabilita todas las interrup -
ciones.
El bit 6 del registro INTCON que
se identifica como PEIE (Bit que Habi-
lita las interrupciones por periférico),
se debe colocar en estado lógico “1”,
para que la interrupción por desborda-
miento en el conteo de los registros
TMR1H y TMR1L surta efecto, ya que
el timer 1 se encuentra clasificado co-
mo elemento periférico.
1 = Habilita las interrupciones por
periférico.
0 = Deshabilita las interrupciones
por periférico.
Los bits restantes del registro INT-
CON que no se emplean para el ti-
mer1, deben de permanecer en esta-
do lógico “0”.
El detalle del registro INTCON se
muestra en la imagen de la figura 32.
El bit 0 del registro PIE1 que se iden-
tifica como TMR1IE (Bit que Habilita la
interrupción por desbordamiento del
timer 1), se debe colocar en estado ló-
gico “1”, para que sea el encargado de
generar la correspondiente interrup-
ción por desbordamiento en el conteo
de los registros TMR1H y TMR1L.
El detalle del registro PIE1 se
muestra en la imagen de la figura 33.
1 = Habilita la interrupción por
desbordamiento en el timer 1.
0 = Deshabilita la interrupción por
desbordamiento en el timer 1.
El bit que hace la función de “ban-
dera”, por medio de la cual se indica
que ha sido activada la interrupción
por efecto del timer 1, es el que se
identifica como TOIF (bit 2) y se en-
cuentra alojado en el registro INTCON.
Este bit se coloca en estado lógico “1”
cuando ocurre la interrupción, por lo
tanto, una vez que se accede a la eje-
cución del código correspondiente, an-
tes de salir del servicio de interrupción,
se tiene que limpiar el bit TOIF (colo-
carlo en estado lógico “0”). Por último,
en la tabla 63 se muestra el código
completo para programar al microcon-
trolador PIC, empleando el timer de 16
bits para controlar el conteo ascenden-
te de los leds conectados al puerto C,
llevándose a cabo el conteo con una
frecuencia de 1 Hz aproximadamente.
Por otra parte, como una notación adi-
cional, mencionaremos que se esta
configurando un microcontrolador
PIC16F874, pero exactamente el mis-
mo procedimiento de programación se
puede implementar en cualquier otro
microcontrolador PIC.
Configuración de la USART
Los microcontroladores pueden
contar con algún módulo de comuni-
cación, para que intercambien datos
ya sea con otro microcontrolador, o
con un circuito electrónico conectado
de manera externa, o inclusive con
una PC. El módulo que se-
rá explicado a continua-
ción, de manera general se
considera como una Inter-
fase de Comunicación Se-
rial (SCI por sus siglas en
inglés) que poseen algu-
nos microcontroladores
PIC. El nombre específico
de la SCI es Universal Sin-
62
Figura 33. Detalle del registro PIE1.
Figura 32 Detalle del registro INTCON.
crona Asíncrona Receptor Transmisor
(USART).
La USART trabaja mediante el
protocolo de comunicación serial co-
nocido como RS-232, en el cual se es-
tablece que la transmisión de datos se
realiza a través de un hilo conductor,
enviando un solo bit cada vez, esto
quiere decir que sí el dato se encuen-
tra conformado por 8 bits, se estará
transmitiendo bit por bit hasta comple-
tar la transferencia de los 8 bits.
La comunicación serial implemen-
tada bajo el protocolo RS-232, implica
el manejo de un bit de inicio para que
el dispositivo transmisor (Tx) le “avise”
al receptor (Rx) que un dato va a co-
menzar a transferirse, este bit de ini-
cio se forma a partir del cambio que
sufre la señal en la línea de transmi-
sión, pasando del estado lógico “1” a
“0” (flanco de descenso), para una
mejor referencia observe la imagen de
la figura 34. Cabe hacer mención que
en la línea de transmisión cuando se
encuentra inactiva (sin datos viajando
a través de ella), se presenta el esta-
do lógico “1”, indicando que la línea se
encuentra desocupada.
Posteriormente al establecimiento
del bit de inicio, se comienza con el
envío de los bits que conforman al da-
to que se tiene que transferir, conside-
rando que el protocolo RS-232 acepta
que pueda ser de un tamaño ya sea
de 8 bits o de 9 bits, los cuales tienen
que configurarse tanto en el equipo
transmisor como en el receptor.
Como paso siguiente a la transmi-
sión de los bits que conforman al da-
to, de manera opcional se puede con-
figurar el envío de un bit de paridad, o
prescindir de éste, de acuerdo con la
norma que regula al protocolo RS-
232, y de igual manera si es configu-
rado el empleo de un bit de paridad en
el equipo transmisor, también tiene
que agregarse al correspondiente
equipo receptor.
Para dar por terminada la transmi-
sión de un dato, el equipo transmisor
le “informa” al receptor que ha termi-
nado con el envío, por medio del em-
pleo de un bit identificado como de pa-
ro, el cual puede estar implementado
por un solo bit o por 2 de acuerdo con
el protocolo RS-232. Por ejemplo
cuando se tiene la configuración de 8
bits de datos, 1 bit de paro y 0 (cero)
bits de paridad, en total se envía una
cantidad de 10 bits, considerando al
bit de inicio, más 8 bits de datos, más
1 bit de paro. El envío de esta serie de
bits, consume un determinado tiempo,
por lo tanto también se tiene que sin-
cronizar al equipo transmisor con el
equipo receptor, para que no exista
pérdida de información.
Cuando se emplea un microcon-
trolador PIC que posea el módulo de
comunicación serial USART, tan sólo
se tiene que configurar a éste ya sea
para transmitir ó recibir ó realizar am-
bas actividades. Una de las ventajas
del módulo USART es que nosotros
nos olvidamos de enviar el bit de ini-
cio, el de paro y el de paridad, ya que
cuando es habilitado el módulo
USART, tan solo debemos cargar el
dato que se tiene que transmitir, y el
USART se encarga de realizar lo de-
más de acuerdo a la forma en cómo
fue configurado. A continuación se
procederá a describir la manera de
configurar tanto el envío, como la re-
cepción de datos a través de la
USART.
USART en Modo
Transmisión (TX)
Como primer paso se debe ubicar
el lugar en donde se encuentran las
terminales del microcontrolador PIC,
que trabajan con el módulo de comu-
nicación serial RS-232. Para ello, de-
pendiendo del microcontrolador PIC
estas terminales se pueden encontrar
ya sea en el puerto B, o el puerto C,
etc. Por lo que siempre se recomien-
da revisar el correspondiente manual.
En la imagen de la figura 35 se
muestra un ejemplo de microcontrola-
dores PIC típicos, en los que se resal-
ta la ubicación de las terminales que
trabajan con la USART, y que pode-
mos tomar como modelos generales
para tomarlos de referencia con res-
pecto de cualquier otro PIC. Una vez
que se ha definido el microcontrolador
que será empleado, y a la vez ubicada
la correspondiente terminal de trans-
misión (identificada como Tx en los mi-
crocontroladores PIC, observe la figu-
ra 35), en primer lugar se tiene que
configurar el bit correspondiente del
puerto donde se ubique esta terminal,
como terminal de salida de datos. A
continuación se muestra el correspon-
diente código con el cual se ejemplifi-
ca la manera en que puede ser confi-
gurado el bit que contiene la transmi-
sión de datos; este bit tiene que ser
configurado de tal manera que la infor-
mación salga del microcontrolador, por
lo tanto, la configuración de la terminal
Tx tiene que ser como salida, recor-
dando que la ubicación de la terminal
Tx, depende del microcontrolador que
se esté empleando. Para el ejemplo
que se describe a continuación consi-
deremos que se tiene un microcontro-
lador PIC16F87X. Ver el cuadro 3.
Cuando hemos realizado la configura-
ción del puerto donde se encuentra la
terminal de transmisión, procedemos
como paso siguiente a la activación de
la herramienta USART para que el mi-
crocontrolador pueda transmitir un da-
to de manera serial, para ello se tienen
que configurar los bits que integran al
registro identificado como “TXSTA”, de
acuerdo a como se muestra a conti-
nuación. El bit 7 del registro TXSTA
63
Figura 34. Protocolo de comunicación RS-232.
que se identifica como CSRC (Bit que
controla el origen de la señal de reloj),
tiene la tarea de seleccionar un modo
de operación del microcontrolador (co-
mo maestro o esclavo), si es que su
módulo USART se encuentra configu-
rado en el modo de operación “síncro-
na”. De manera contraria, sí el modulo
USART se configuró para operar de
manera “asíncrona”, este bit tiene que
ser ignorado no importando su estado
lógico.
Sí el módulo USART está configu-
rado en modo asíncrono:
CSRC no importa el estado lógico
en que se coloque.
Sí el módulo USART está configu-
rado en modo síncrono:
CSRC = 1.- Modo Maestro (el reloj
se genera internamente del BRG).
CSRC = 0.- Modo Esclavo (el reloj
se toma de manera externa).
El bit 6 del registro TXSTA que se
identifica como TX9 (bit que habilita la
transmisión de 9 bits), se debe colocar
en estado lógico “1”, para que surta
efecto el envío de 9 bits que confor-
marán al dato que será transmitido,
mientras que al colocar el bit TX9 en
estado lógico “0”, configura a la
USART para que se transmitan datos
compuestos por 8 bits.
1 = Configura la transmisión de
datos de 9 bits.
0 = Configura la transmisión de
datos de 8 bits.
El bit 5 del registro TXSTA que se
identifica como TXEN (bit que habilita
la transmisión de datos), se debe co-
locar en estado lógico “1”, para que
sea activada la transmisión de datos
por medio del módulo USART. Cuan-
do el bit TXEN se coloca en estado ló-
gico “0” se tiene como consecuencia
la inhabilitación de la transmisión por
medio del módulo USART.
1 = Habilita la transmisión de datos.
0 = Desactiva la transmisión de datos.
Por medio del bit 4 del registro
TXSTA que se identifica como SYNC
(bit que selecciona el modo de opera-
ción de la USART), se determina el
modo de operación del módulo
USART, teniéndose la posibilidad de
seleccionar entre la operación síncro-
na o asíncrona.
1 = Modo Síncrono.
0 = Modo Asíncrono.
El bit 2 del registro TXSTA que se
64
Figura 35. Ubica -
ción de las termi -
nales de la USART
en los PICs.
bsf status,rp0 ;cambiar al banco 1
bcf status,rp1
movlw b'X0XXXXXX' ;configura el bit 6 como salida, los demás bits no importan de momento
movwf trisc ;enviar configuración al registro del puerto C
Cuadro 3
identifica como BRGH (bit
de selección de alta taza de
transferencia), tiene la tarea
de seleccionar entre las po-
sibilidades de transmitir a
baja o alta velocidad, si es
que su módulo USART se
encuentra configurado en el
modo de operación “asín-
crona”. De manera contra-
ria, sí el modulo USART se
configuro para operar de
manera “síncrona”, este bit
no se emplea, por lo que no
importa su estado lógico.
Sí el módulo USART
esta configurado en modo
asíncrono:
BRGH = 1.- Alta veloci -
dad de transmisión.
BRGH = 0.- Baja veloci -
dad de transmisión.
Sí el módulo USART
esta configurado en modo
síncrono:
BRGH no importa el es -
tado lógico en que se colo -
que.
El bit 1 del registro TXSTA que se
identifica como TRMT (bit que confi-
gura el estado de la transmisión), se
emplea para configurar la indicación
de cuando un dato sea transmitido,
esto es, se generara un aviso cuando
el dato sea transmitido completamen-
te (TSR vacío) o cuando el dato aun
no comience a transmitirse (TSR lle-
no).
1 = TSR vacío.
0 = TSR lleno.
El bit 0 del registro TXS-
TA que se identifica como
TX9D (bit que conforma al
noveno bit de datos o tam-
bién puede ser el bit de pa-
ridad), se utiliza solamente cuando se
configura al módulo USART para que
transmita 9 bits de datos, o cuando se
habilita el empleo del bit de paridad. Si
el módulo USART se configura para
transmitir 8 bits de datos, sin bit de pa-
ridad, el bit TX9D no se emplea y por
lo general se le carga el estado lógico
“0”.
El bit 3 del registro TXSTA no se
emplea por lo que debe permanecer
en estado lógico “0”. El detalle del re-
gistro TXSTA se muestra en la imagen
de la figura 36.
Cuando el registro TXSTA ha sido
configurado, procederemos a determi-
nar el valor de la tasa de trasferencia
de los datos. Este término que en in-
glés se escribe como “baud rate”, de-
talla la cantidad de bits que por segun-
do son transmitidos. Se trata de un
término muy importante, ya que si en-
tre el elemento transmisor y el recep-
tor no se tiene el mismo valor, enton-
ces se perderán bits provocando que
el dato transmitido sea totalmente di-
ferente al original.
En los microcontroladores PIC, re-
currimos a una serie de valores “co-
merciales” para configurar al módulo
USART, los cuales pueden
ser 9600 baudios (9600 bits
por segundo) ó 4800 ó 2400,
etc. Estos valores y otros más
los encontramos agrupados
65
Figura 36. Detalle del registro TXSTA.
Tabla 64. Tasa de transferencia para el modo Síncrono.
en tablas, como las que
se encuentran identifica-
das con los números 64,
65 y 66.
A continuación se ilustran
las diferentes tablas por
medio de las cuales se
determina el valor de la
tasa de transferencia de
los datos. Dentro de las
tablas se observa que
existe un valor en forma-
to decimal, que es el que
tiene que cargarse al re-
gistro “SPBRG”, para fijar
la cantidad de bits que
por segundo serán trans-
mitidos.
Para definir el valor que
se le cargará registro
SPBRG, se debe de to-
mar en cuenta el valor de
la tasa de transferencia
(baud rate), además del
valor del oscilador que se
le conecte al microcon-
trolador (FOSC). Poste-
riormente tomar en cuen-
ta el valor de la tasa de
transferencia real a la
que serán transmitidos
los datos (Kbaud), y por
ende el error involucrado.
Con este último paso ha
quedado configurado el
módulo USART para que
transmita datos, por lo
que ahora se tiene que
cargar el valor del dato
que se quiere transmitir,
en el registro llamado
“TXREG” (buffer de
transmisión). Cuando se
guarda un dato en el re-
gistro TXREG, de inme-
diato se comienza a
transferir enviando bit a
bit (obviamente de mane-
ra previa se configuro y
activo la USART) hacia la
terminal del microcontro-
lador identificada como
Tx.
66
Tabla 66. Tasa de transferencia para el modo Asíncrono cuando BRGH = 1.
Tabla 65. Tasa de transferencia para el modo Asíncrono cuando BRGH = 0.
De alguna manera, el módulo
USART debe tener el conocimiento de
cuando termine de realizar un envío
de datos, para no cometer el error de
transferir un siguiente dato cuando no
ha terminado con el anterior. Para es-
to último se cuenta con 2 posibilida-
des de configuración. En la primera de
ellas se puede activar el aviso por me-
dio de una interrupción, por medio de
fijar el estado lógico “1” en el bit TXIE
que se encuentra en el registro PIE1;
teniendo su respectiva bandera en el
bit TXIF que se encuentra en el regis-
tro PIR1, la cual se colocara en esta-
do lógico “1” cuando el dato que se
esta transmitiendo haya sido comple-
tamente transferido, o dicho de otra
manera, cuando el dato que se alojo
en el registro TXREG se ha enviado
completamente. La segunda manera
de indicar que un dato ha sido trans-
mitido, es simplemente esperar a que
sean enviados todos los bits que com-
ponen al dato, por medio de la instruc-
ción “btfss pir1, txif”, en la cual tam-
bién se puede ocupar a la bandera
TXIF del registro PIR1, para saber en
que momento se ha vaciado el buffer
de transmisión. En la tabla 67 se
muestra una propuesta de código pa-
ra configurar a la USART en el modo
de transmisión asíncrona.
USART en Modo
Recepción (RX)
Una vez que han sido identifica-
dos los pines del microcontrolador
que contienen las terminales de trans-
misión y recepción de datos mediante
el modulo USART, sabremos como
configurar dichos pines. Se muestra
en la imagen de la figura 35 para una
mejor referencia, un ejemplo típico de
la ubicación de las terminales en 3 mi-
crocontroladores PIC diferentes.
Cuando ya se sabe que microcon-
trolador a de ser empleado, en auto-
mático de conoce la ubicación de la
terminal de recepción de datos (iden-
tificada como Rx en los microcontrola-
dores PIC, observe la figura 35), en
primer instancia se tiene que configu-
rar el bit correspondiente del puerto
donde se ubique esta terminal, como
terminal de entrada de datos.
En seguida se muestra el frag-
mento de código mediante el cual se
configura al bit que contiene la recep-
ción de datos, el cual se encuentra
dentro del correspondiente registro
“tris”. Este bit tiene que ser configura-
do de tal manera que la información
pueda acceder al microcontrolador,
por lo tanto, la configuración de la ter-
minal Rx tiene que ser como entrada.
Nuevamente recordamos que la ubi-
cación de la terminal Rx depende del
microcontrolador que se este em-
pleando. Para el ejemplo que se des-
cribe a continuación consideremos
que se tiene un microcontrolador
PIC16F87X. Vea el cuadro 4.
Cuando hemos realizado la confi-
guración del puerto donde se encuen-
tra la terminal de recepción, procede-
mos a la manipulación de registros del
microcontrolador PIC para poder acti-
var la USART, dejando al microcontro-
lador en la tarea de recibir datos de
manera serial, para ello se tienen que
configurar principalmente los bits que
integran a los registros identificados
como TXSTA, SPBRG, RCSTA y
PIE1, de acuerdo a la explicación si-
guiente.
Del registro TSXTA se toma princi-
palmente el bit 7 (CSRC.-Bit que con-
trola el origen de la señal de reloj), el
bit 4 (SYNC.- bit que selecciona el
modo de operación de la USART), y el
bit 2 (BRGH.- bit de selección de alta
taza de transferencia). Los demás bits
se emplean para configurar a la activi-
dad de transmisión de datos seriales,
motivo por el cual no se manipulan a
menos que se vaya a emplear a la
USART en el modo full duplex (recep-
ción y transmisión de datos al mismo
tiempo). La explicación del detalle de
los bits CSRC, SYNC y BRGH se en-
cuentra en el apartado “USART en
modo transmisión”, y el detalle de la
composición del registro TXSTA se
muestra en la figura 36.
Otro registro que también debe
ser manipulado es el identificado co-
mo “spbrg”, siendo a través de este
registro el medio para determinar el
valor de la tasa de trasferencia de los
datos (baud rate), con la cual serán
recibidos por el microcontrolador PIC.
67
Tabla 67 Fragmento de Programa para activar la USART en modo transmisión.
bsf status,rp0 ;cambiar al banco 1
bcf status,rp1
movlw b'1XXXXXXX' ;config el bit 7 como entrada, los demás bits no importan de momento
movwf trisc ;enviar configuración al registro del puerto C
Cuadro 4
Los distintos valores de tasa de trasfe-
rencia se encuentran indicados en las
tablas 64, 65 y 66, recordando que la
tasa de trasferencia en un microcon-
trolador PIC, depende de valor que se
tenga en el circuito oscilador del PIC.
A continuación para que sea com-
pletamente configurada la herramien-
ta USART del microcontrolador PIC,
tienen que ser manipulados los bits
que integran al registro identificado
como RCSTA, tal como se explica a
continuación.
El bit 7 del registro RCSTA que se
identifica como SPEN (Bit que habilita
al puerto serie del PIC), tiene como
actividad principal la de habilitar tanto
a la terminal identificada como Tx y
Rx, para que realicen la función de co-
municar de manera serial al microcon-
trolador, por lo que una vez que ha si-
do activado este bit, se establecen los
niveles eléctricos correspondientes
sobre las terminales Tx y Rx.
1 = Puerto serial Habilitado.
0 = Puerto serial Deshabilitado.
El bit 6 del registro RCSTA que se
identifica como RX9 (bit que habilita la
recepción de 9 bits), se debe colocar
en estado lógico “1”, para que surta
efecto la recepción de 9 bits que con-
formarán al dato que será recepciona-
do, mientras que al colocar el bit TX9
en estado lógico “0”, configura a la
USART para que se reciban datos
compuestos por 8 bits. Recuerde que
se coloca la recepción de 9 bits de da-
tos, cuando en la transmisión se tie-
nen también 9 bits de datos, por lo
tanto, el dispositivo transmisor como
el receptor deben estar fijos con el
mismo número de bits que conforman
al dato que será intercambiado.
1 = Configura la recepción de da -
tos de 9 bits.
0 = Configura la recepción de da -
tos de 8 bits.
El bit 5 del registro RCSTA que se
identifica como SREN (bit que habilita
la recepción de un solo dato), tiene la
tarea de activar la recepción de un so-
lo dato, si es que su módulo USART
se encuentra configurado en el modo
de operación “síncrona”. De manera
contraria, sí el modulo USART se con-
figuro para operar de manera “asín-
crona”, este bit tiene que ser ignorado
no importando su estado lógico.
Sí el módulo USART esta configu-
rado en modo asíncrono:
SREN no importa el estado lógico
en que se coloque.
Sí el módulo USART esta configu-
rado en modo síncrono como maestro:
SREN = 1.- Activa la recepción de
un solo dato.
SREN = 0.- Desactiva la recepción
de un solo dato
Este bit se limpia antes de que la
recepción se haya completado.
Sí el módulo USART esta configu-
rado en modo síncrono como esclavo:
SREN no se emplea bajo esta va -
riante.
Por medio del bit 4 del registro
RCSTA que se identifica como CREN
(bit que habilita la recepción continua
de datos), el modulo USART del mi-
crocontrolador PIC, tiene la tarea de
recibir de manera continua todos los
datos que se le envíen, aun cuando se
encuentre configurado tanto en el mo-
do asíncrono como síncrono.
Sí el módulo USART esta configu-
rado en modo asíncrono:
CREN = 1.- Activa la recepción
continua de datos.
CREN = 0.- Desactiva la recepción
continua de datos.
Sí el módulo USART esta configu-
rado en modo síncrono:
CREN = 1.- Activa la recepción
continua de datos, hasta que el bit
CREN es limpiado (el bit CREN sobre
escribe al bit SREN).
CREN = 0.- Desactiva la recepción
continua de datos.
El bit 3 del registro RCSTA que se
identifica como ADEN (bit que habilita
la detección de direccionamiento),
realiza la activación de la carga del
dato recibido en un buffer de memo-
ria. Esta actividad solo se puede reali-
zar cuando el modulo USART se en-
cuentra en el modo de operación asín-
crona.
Sí el módulo USART esta configu-
rado en modo asíncrono, y cuando
RX9=1:
ADEN = 1.- Activa la detección de
la correspondiente dirección de me -
moria del buffer, cuando se reciben
los datos.
ADEN = 0.- Activa la detección de
memoria, teniendo la recepción de to -
dos los bits, y el noveno bit puede ser
empleado como bit de paridad.
Sí el módulo USART esta configu-
rado en modo síncrono:
ADEN no se emplea bajo esta va -
riante.
El bit 2 del registro RCSTA que se
identifica como FERR (bit bandera
que indica errores en la trama),
muestra por medio del estado lógico
“1” sí el dato que fue recibido no cum-
ple con el contenido de la informa-
ción real, este error se debe a un bit
de la información que se encuentre
erróneo, este error puede ser corregi-
do mediante la implementación del
bit de paridad.
1 = Error en la trama (Puede actua -
68
lizarse leyendo el registro RCREG,
y/o recibiendo el siguiente dato va -
lido).
0 = Sin error en la trama.
El bit 1 del registro RCSTA que
se identifica como OERR (bit ban-
dera que indica un sobre flujo de
datos), se emplea para detectar sí
en el momento que la USART se
encuentra recepcionando un dato,
llega otro antes de que el primero
termine de recepcionarse.
1 = Error por sobre flujo de da -
tos (puede limpiarse al limpiar el
bit CREN).
0 = Sin error por sobre flujo de da -
tos.
El bit 0 del registro RCSTA que se
identifica como RX9D (bit que confor-
ma al noveno bit de datos o también
puede ser el bit de paridad), se utiliza
solamente cuando se configura al mó-
dulo USART para que transmita 9 bits
de datos, o cuando se habilita el em-
pleo del bit de paridad. Si el modulo
USART se configura para transmitir 8
bits de datos, sin bit de paridad, el bit
RX9D no se emplea y por lo general
se le carga el estado lógico “0”.
El detalle del registro RCSTA se
muestra en la imagen de la figura 37.
Con la configuración del registro
RCSTA paso ha quedado
configurado el módulo
USART para que reciba
datos, por lo que ahora
debemos de tomar en
cuenta que la información
que se reciba de manera
serial se encontrará aloja-
da en el registro llamado
“RCREG” (buffer de re-
cepción). Cada vez que
se recibe un dato por me-
dio de la terminal Rx del
microcontrolador (previa
activación de la USART),
se guardan en el registro
RCREG, por lo que de in-
mediato se debe tomar el dato recep-
cionado y cambiarlo a otro registro pa-
ra almacenarlo, porque solo existe el
registro RCREG para recepcionar los
datos, y si no es guardado se perderá
cuando suceda una nueva recepción
de datos.
Cuando el modulo USART se en-
cuentra configurado en modo recep-
ción, permite que el microcontrolador
realice otras actividades, y solo pres-
tara atención al dato recibido cuando
por medio de una interrupción tome
“conciencia” de que un dato acaba de
llegar al buffer de recepción (registro
RCREG). La configuración de la inte-
rrupción se realiza por medio de la fi-
jación del estado lógico “1” en el bit
RCIE que se encuentra en el registro
PIE1. El bit bandera de la interrupción
por recepción de dato se encuentra en
el bit RCIF que se encuentra en el re-
gistro PIR1, esta bandera se colocara
en estado lógico “1” cuando el dato
que se recepcionó ha llegado de ma-
nera completa, o dicho de otra mane-
ra, cuando el dato que se alojo en el
registro RCREG se ha recibido com-
pletamente. Una vez que se produce
una interrupción, el contador de pro-
grama (program counter) se ubica en
la dirección 04, por lo que allí se debe
de preguntar cual dispositivo interno
del microcontrolador PIC es el que ha
generado la interrupción, y para esto
es que se emplea la bandera RCIF, ya
que sí se encuentra en estado lógico
“1” significa que se recibió un dato.
Como paso siguiente se tiene que di-
reccionar la ejecución del código del
programa de la interrup-
ción, por medio de un
brinco incondicional.
Ya dentro del código del
programa de la interrup-
ción, se debe colocar la
menor cantidad de ins-
trucciones, por lo que las
principales son las si-
guientes: Desactivar las
interrupciones; pasar el
dato recibido a otro re-
gistro de memoria (nor-
malmente RAM), limpiar
la bandera RCREG, vol-
ver a activar las interrup-
ciones y por último colo-
69
Figura 37. Detalle del registro RCSTA.
Tabla 68. Fragmento de Programa para activar la USART en
modo recepción.
Tabla 69. Fragmento de Programa para configurar
atender la interrupción cuando se recibió un dato
mediante la USART
car la instrucción que indica la termi-
nación de la interrupción.
En la tabla 68 se muestra el códi-
go para activar la USART del micro-
controlador PIC en modo recepción,
además en la tabla 69 a manera de
sugerencia se muestra el código de
un programa para implementar la inte-
rrupción. Se debe considerar que se
esta empleando un microcontrolador
PIC16F87X, pero si se requiere usar
otro, lo único que se tiene que cam-
biar es la ubicación de las terminales
Tx y Rx. En la tabla 70 se muestra un
programa completo, en el que el dato
que reciba el microcontrolador PIC de
manera serial lo retransmitirá, también
empleando la USART.
70
Tabla 70. Programa para transmitir y recibir datos mediante la USART.
Configuración
del ADC
Se puede implementar
un sistema de adquisición de
datos analógicos que puede
contener hasta un total de 8
canales digitalizadores, por
medio de los microcontrola-
dores PIC, para ello tenemos
que seleccionar el más con-
veniente de acuerdo con la
aplicación que tenemos que
desarrollar.
Aunque en el presente material,
no vamos explicar con lujo de deta-
lle la técnica con la que opera el
ADC del microcontrolador, si vamos
a explicar que es lo que hace el
ADC, como para que cuando llegue-
mos al planteamiento del proyecto
sepamos a que nos estamos enfren-
tando.
Un ADC (Convertidor Analógico -
Digital por sus siglas en ingles) se
encarga de convertir un valor analó-
gico de voltaje a su correspondiente
combinación binaria. Para realizar
esta operación se requiere de un
sensor, que es el encargado de leer
el estado de una variable física de
naturaleza analógica y de represen-
tar la magnitud de dicha variable en
su correspondiente valor de voltaje.
En la actualidad existen muchas va-
riables analógicas que podemos leer
de manera directa a través del sen-
sor adecuado, en otras ocasiones, al
no existir un sensor diseñado de ma-
nera explícita para determinada va-
riable, se ocupa un sensor para me-
dir una variable física diferente, pero
que se liga con la que nos interesa
por medio de una relación matemá-
tica. Lo que nos da la posibilidad de
que para cualquier proceso indus-
trial (ahí existe un número ilimitado
de variables), exista un sensor invo-
lucrado.
El sensor lee la variable física y
nos entrega una señal eléctrica que
se encuentra dentro de un rango de
valores de voltaje, siendo este el
que tenemos que hacer llegar al
ADC del microcontrolador. Teniendo
en cuenta que el ADC mide variacio-
nes de voltaje, el sensor tiene que
adecuarse con respecto del rango
mínimo y máximo que puede leer la
entrada del ADC. Para que el ADC
pueda realizar una conversión del
valor analógico, se le tiene que agre-
gar un voltaje de referencia, porque
este es el que indica precisamente
cual es el rango de operación de la
entrada del ADC. Todos los ADC de
los microcontroladores PIC aceptan
como máximo un rango de opera-
ción que llega hasta 5 Volts, por lo
que podemos establecer rangos de
operación de cualquier valor de vol-
taje, siempre y cuando no rebase-
mos los 5 volts.
El rango de operación expresado
en volts sea de la magnitud que sea,
se divide en tantas partes
como número de bits posea
el ADC, de acuerdo al
ejemplo mostrado en la fi-
gura 39. El cálculo del valor
de resolución del ADC se
hace de acuerdo a la si-
guiente expresión matemá-
tica:
Resolución = V rango / 2N
-1
En donde:
Resolución.- Rango de voltaje
en el cual se presenta un cambio de
valor en la combinación binaria.
Vrango. - Rango de operación
del ADC expresado en voltaje.
N.- Número de bits que posee el
ADC.
El ejemplo de la figura 39 con-
templa un ADC de 4 bits (el número
de bits de un ADC real cuando me-
nos es de 8), por lo tanto el número
de combinaciones binarias que esta
dado por la relación: Combinaciones
binarias = 2N da como resultado un
total de 16, las cuales van de
0000(2) hasta 1111(2). La resolución
del ADC, nos indica cuanto tiene que
variar el voltaje que entrega el sen-
sor, para que exista un cambio en la
combinación binaria correspondien-
te, por lo que a un determinado valor
71
Figura 38. Convertidor Analógico - Digital (ADC).
Figura 39. División del rango de operación del ADC (Resolución del ADC).
analógico le corresponderá una
combinación binaria que es precisa-
mente la conversión y lo que entre-
gara como resultado el ADC.
Por otra parte, la cantidad de va-
lores analógicos que el ADC puede
digitalizar, esta un función del núme-
ro de muestras que puede adquirir,
para ello se establecen de manera
automática un periodo estable de
tiempo, durante el cual el ADC ob-
tendrá las muestras, tal como se
ilustra en la figura 40.
El número de muestras mínimas
que se tienen que tomar se encuen-
tran de acuerdo al valor de frecuen-
cia de operación de la señal a digita-
lizar, y en función el “teorema de
muestreo” establecido por Nyquist,
la frecuencia de muestreo (número
de muestras por segundo) se esta-
blece de acuerdo a la siguiente ex-
presión matemática:
B = 2F
En donde:
B.- Frecuencia de muestro (nú-
mero de muestras por segundo).
F.- Frecuencia de operación de
la señal a digitalizar.
El teorema del muestreo se ocu-
pa principalmente en el caso de que
la señal a digitalizar posea una fre-
cuencia alta de operación, y por lo
tanto se tiene que tomar un
buen número de muestras y
digitalizarlas, como para en
un proceso posterior se ten-
ga que reproducir la señal
original, como es el caso de
un reproductor de CD's o un
osciloscopio digital. Por
ejemplo si la señal analógica
trabaja a una frecuencia de
1kHz, se le tiene que aplicar
una frecuencia de muestreo
de 2kHz, o sea, se deben de
tomar 2000 muestras por
segundo, y cada una de es-
tas muestras se tiene que
digitalizar, para lo que es ne-
cesario poseer además del ADC de
una memoria de por lo menos 2000
localidades para poder guardar la in-
formación de las 2000 combinacio-
nes binarias que arroje la digitaliza-
ción de la señal analógica. Todo es-
te proceso se tiene que realizar para
garantizar que si se hace el proceso
inverso, se pueda recuperar la señal
analógica original.
Para el caso de una aplicación
del tipo industrial en donde se tenga
que digitalizar el valor de una señal
analógica, como puede ser por
ejemplo la temperatura, el número
de muestras por segundo “B” no tie-
ne que ser muy grande, ya que la
temperatura no cambia tan rápido
de valor, teniéndose cambios en una
caldera que consideraremos como
un caso demasiado critico, del orden
de aproximadamente 10 segundos
para tener cambios en rangos de ca-
da 100°C. En la medición de tempe-
ratura podemos establecer periodos
de muestreo de cada segundo y por
lo tanto el espacio de la memoria en
donde debemos almacenar los valo-
res digitalizados, no tiene que ser
tan grande. Y por lo tanto depende-
rá de la naturaleza de la variable fí-
sica como para establecer la canti-
dad de muestras a tomar, y por lo
tanto la cantidad de memoria que
necesitemos, así como el proceso
para guardar la información en el mi-
crocontrolador, o en una memoria
externa o enviarla de manera para-
lela o serial a una PC por ejemplo.
Retomando el nombre de un po-
sible proyecto, se puede realizar un
“Sistema de Adquisición Hasta de 8
Canales Analógicos, y podemos em-
plear cualquier de los Microcontrola-
dores PIC12F675 ó el PIC16F876 ó
el PIC16F877”, básicamente lo que
vamos a proponer la manera en que
se debe configurar el ADC para un
sistema de adquisición de datos, a la
cual se le pueda hacer llegar la infor-
mación de hasta 8 sensores analógi-
cos, y que el microcontrolador que
se utilice se encargue de organizar
la toma de las señales de los senso-
res, y que las digitalice.
Lo que es importante resaltar es
el hecho de que tanto el microcon-
trolador PIC12F675 como el
PIC16F876 y el PIC16F877, tan so-
lo cuentan con un único módulo in-
terno para realizar las conversiones
de valores anódicos a digital (módu-
lo ADC). Por esta razón, al contar
con la posibilidad de tener hasta 8
sensores, significa que el módulo
ADC del microcontrolador tiene que
estarse compartiendo entre los dife-
rentes sensores que tenga conecta-
dos, y entonces dependerá de la
programación que le agreguemos al
PIC, la manera en que este trabaja-
rá. Otra cuestión importante es que
cualquiera de los PIC's de
acuerdo al manual efecti-
vamente nos indica que
posee hasta 8 canales pa-
ra digitalizar señales ana-
lógicas, y se encuentran fí-
sicamente ubicadas en las
terminales del puerto A, y
se encuentran identifica-
das con las nomenclaturas
RA0/AN0, RA1/AN1,
RA2/AN2, RA3/AN3, y
RA5/AN4 para el
PIC16F876, mientras que
para el PIC16F877 ade-
más de los canales del
puerto A también se tienen
72
Figura 40. Cantidad de muestreos determinada por el
“Teorema del Muestreo”.
que agregar los canales con entra-
das ADC de su puerto E, los cuales
se identifican como RE0/AN5,
RE1/AN6 y RE2/AN7, tal como se
muestra en la figura 41. Se pueden
hacer diferentes combinaciones de
acuerdo a la cantidad máxima de
sensores que pueden conectarse al
microcontrolador, ya que también el
voltaje de referencia que se requiere
para un proceso de conversión por
medio del módulo ADC tiene que to-
marse en cuenta. El voltaje de refe-
rencia para el ADC puede tomarse
de manera interna en el microcon-
trolador, o si es necesario el voltaje
de referencia se fijara de manera ex-
terna, y para ello se requiere de 1 o
2 terminales del microcontrolador
para tal efecto, y las terminales que
se llegan a ocupar para fijar una re-
ferencia externa son también del
puerto A, por lo que se restarían 2
canales con entrada para el ADC.
En la tabla 71 se muestran las com-
binaciones de operación tanto del
puerto A para el PIC16F876, como
del puerto A y puerto E para el
PIC16F877, (para el PIC12F675 es
una tabla muy similar) con respecto
a la cantidad de canales ADC que
podemos disponer del PIC.
De la tabla 71, se observa que se
encuentran identificadas cada una
de las terminales del puerto A y E
que tienen entrada al ADC, en la ta-
bla se muestra como pueden confi-
gurarse estas terminales, indicándo-
se con una letra “A” si posee entra-
da al ADC, o con una letra “D” si la
terminal se puede configurar como
una entrada o salida digital, y por úl-
timo se muestra también que termi-
nales aceptan los voltajes de refe-
rencia externo, tanto positivo como
negativo, identificados como Verf+ y
Vref- respectivamente. En la misma
tabla 71 se presenta a manera de
resumen y de acuerdo a las posibili-
dades de configuración, la cantidad
de terminales con entrada al ADC,
cantidad de terminales con voltaje
de referencia externa y la cantidad
de terminales configuradas como
entradas o salidas digitales.
Como ejemplo para leer la tabla
71, vamos a tomar la combinación
que se encuentra en la primer fila,
en donde se tienen 5 entradas con
ADC para el PIC16F876, y 8 entra-
das en total para el PIC16F877; la
referencia la toman de manera inter-
na, por lo que el Voltaje de referen-
cia positivo (Vref+) lo toma de la ali-
mentación positiva del microcontro-
lador, dicho de otra manera la termi-
nal VDD también hace la función de
terminal para Vref+, lo mismo suce-
de con el voltaje de referencia nega-
tivo, al tomar la referencia de mane-
ra interna, la terminal de alimenta-
ción VSS (se relaciona también con
GND) del microcontrolador además
hace la tarea de la terminal Vref-.
Por otra parte, en la tabla 71 se
muestra las diferentes opciones de
configuración con respecto de los
bits PCFG3, PCFG2, PCFG1 y
PCFG0, los cuales se encuentran
expresados en la columna de la iz-
quierda, mediante las combinacio-
nes binarias que podemos realizar
con estos bits, podemos establecer
la cantidad de terminales que ten-
drán acceso al convertidor Analógi-
co - Digital (ADC) del microcontrola-
dor. Por ejemplo si queremos que
aparezcan todas las terminales con-
figuradas como canales de ADC, te-
nemos que ingresar la siguiente
73
Figura 41. Disposición de las terminales de los microcontroladores PIC16F876 y PIC16F877.
combinación binaria: PCFG3 = 0,
PCFG2 = 0, PCFG1 = 0 y PCFG0 =
0, misma que se muestra en la pri-
mer fila de la tabla 71. Así podemos
elegir la configuración que se re-
quiera para nuestro proyecto, inclu-
sive aquí es en donde le indicamos
al microcontrolador que solo quere-
mos terminales con operación digital
(solo 0's y 1's lógicos, cuando no se
utiliza el ADC), y para ello tendre-
mos que ingresar la combinación bi-
naria: PCFG3 = 0, PCFG2 = 1,
PCFG1 = 1 y PCFG0 = 1, que se
muestra en la fila 7 de la tabla 71.
Para configurar a los bits
PCFG3, PCFG2, PCFG1 y PCFG0,
se tiene que acceder al registro lla-
mado ADCON1, cuyo detalle se
muestra en la imagen de la figura
42.
Por medio del registro ADCON1,
observamos la manera en que se
configuran las correspondientes ter-
minales que contienen a los canales
de acceso al ADC, ya solo falta defi-
nir la función del bit identificado co-
mo ADMF, el cual se describe a con-
tinuación. Con el bit 7 del registro
ADCON1 (ADMF) se expresa la for-
ma en que se configura el empleo
de los 10 bits, del dato digitalizado,
indicándole al microcontrolador la
manera en que tiene que justificarse
el acomodo del dato, esto es, justifi-
cación a la derecha o justificación a
la izquierda.
De una manera más sencilla, se
muestra a continuación la manera
en que se pueden justificar los bits
del dato digitalizado. Vea la tabla
71b.
Por último con respecto del re-
gistro ADCON1, los bits del 4 al 6 no
se ocupan.
Como paso siguiente ten-
dremos que emplear el re-
gistro identificado como
ADCON0. Observe la ima-
gen 43 en donde se descri-
be la ubicación de sus co-
rrespondientes bits.
La correspondiente descrip-
ción de los bits del registro
ADCON0 se realiza a conti-
nuación:
Los bits 7 y 6 cuya identifi-
cación es ADCS1 y ADCS0
74
Tabla 71b.
Figura 42. Detalle del Registro ADCON1.
Tabla 71.- Combinaciones de entradas ADC o digitales del puerto A del PIC16F876.
respectivamente, sirven
para indicar cuál será el
tiempo de conversión
de acuerdo a las combi-
naciones que pueden
realizarse, de acuerdo
con las siguientes com-
binaciones: vea la tabla
71c.
Los bits del 3 al 5
cuya identificación es
CHS0, CHS1 y CHS2
respectivamente, sirven
para de acuerdo a la
combinación binaria co-
rrespondiente, seleccio-
nar el canal ADC que se
irá activando, recordan-
do que aunque un microcontrolador
puede tener más de 1 ADC, no pue-
de ocuparlos todos a la vez, por lo
tanto, los ADC se tienen que ir acti-
vando de acuerdo a como se requie-
ra, tomando en cuenta las siguientes
combinaciones binarias: vea la tabla
71d.
El bit 2 identificado como GO-
/DONE, sirve para indicarle al micro-
controlador que puede llevar a cabo
una conversión con el ADC.
El bit 1 no se encuentra imple-
mentado.
El bit 0 identificado como
ADON0, simplemente tiene la fun-
ción de encender el modu-
lo ADC de un microcontro-
lador PIC.
Para terminar de configu-
rar al módulo ADC de un
microcontrolador, se tie-
nen que emplear los co-
rrespondientes bits de los
registros INTCON y PIE1,
con los cuales se activa la
interrupción que será em-
pleada por el ADC.
Del registro INTCON, el bit
identificado como GIE se
emplea para habilitar to-
das las interrupciones del
PIC, mientras que el bit
PEIE, se utiliza de manera
específica para activar la
interrupción por periféri-
cos, siendo el ADC un pe-
riférico.
En el registro PIE1, el bit
ADIE activa la interrupción
que pueda generar el
ADC, una vez que ha realizado un
proceso de digitalización.
Para terminar con este tema, a
continuación se encuentra el código
de un programa de ejemplo, por me -
dio del cual se emplea el ADC de un
microcontrolador PIC. ******
75
Tabla 71d.
Tabla 71c
Figura 43. Detalle del Registro ADCON0.
;************************************************************
;Configuración del ADC de un PIC
;PIC: 16F874A
;************************************************************
LIST P=PIC16F874A
#include <p16f84A.inc>
__CONFIG _CP_OFF&_DEBUG_OFF&_WRT_OFF&_CPD_OFF&_LVP_OFF&
_BODEN_OFF&_PWRTE_OFF&_WDT_OFF&_XT_OSC
;************************************************************
; Declaración de Registros
;************************************************************
w equ 0X00
status equ 0x03
porta equ 0x05
portb equ 0x06
portc equ 0x07
intcon equ 0x0b
pir1 equ 0x0c
trisa equ 0x85
trisb equ 0x86
trisc equ 0x87
pie1 equ 0x8c
adresl equ 0x9e
adcon1 equ 0x9f
adresh equ 0x1e
adcon0 equ 0x1f
adcalto equ 0x20
adcbajo equ 0x21
var1 equ 0x22
var2 equ 0x23
var3 equ 0x24
;************************************************************
; Declaración de Bits
;************************************************************
adon equ 0
go_done equ 2
rp0 equ 5
rp1 equ 6
adcs0 equ 6
peie equ 6
76
adie equ 6
adif equ 6
gie equ 7
adcs1 equ 7
;*******************************************************************************************************************************************
; Inicio
;*******************************************************************************************************************************************
reset
org 0
goto iniADC
org 4
bcf status,rp0 ;cambiar al banco 0
bcf status,rp1
btfsc pir1,adif
goto ADCinterrup
retfie
;******************************************************************************************************************************************
; Inicio de la interrupción del ADC
;******************************************************************************************************************************************
ADCinterrup
bcf status,rp0 ;cambiar al banco 0
bcf status,rp1
bcf intcon,gie ;desactivación general de interrupciones
movf adresh,w ;guarda el byte alto de la conversión en
movwf adcalto ;el registro adcalto
bsf status,rp0 ;cambiar al banco 1
bcf status,rp1
movf adresl,w ;guarda el byte bajo de la conversión en
bcf status,rp0 ;cambiar al banco 0
bcf status,rp1
movwf adcbajo ;el registro adcbajo
bcf pir1,adif
retfie
;*******************************************************************************************************************************************
; Programa principal
;*******************************************************************************************************************************************
iniADC
bsf status,rp0 ;cambiar al banco 1
bcf status,rp1
movlw 0xff ;configurar el puerto a como entradas
movwf trisa
movlw 0x00
movwf trisb ;configurar el puerto b como salidas
movwf trisc ;configurar el puerto c como salidas
movlw b'10000000' ;configura con adc todas las terminales el puerto a
movwf adcon1 ;y justificación a la derecha
bcf status,rp0 ;cambiar al banco 0
bcf status,rp1
clrf adcalto
clrf adcbajo
bsf adcon0,adcs0 ;configura la frecuencia de muestreo
bcf adcon0,adcs1 ;configura la frecuencia de muestreo
77
bsf adcon0,adon ;activa el ADC
bsf intcon,gie ;habilitador general de interrupciones
bsf intcon,peie ;activador general de interrupciones por periféricos
bsf status,rp0 ;cambiar al banco 1
bcf status,rp1
bsf pie1,adie ;activación de interrupción por ADC
ciclo
bcf status,rp0 ;cambiar al banco 0
bcf status,rp1
bcf adcon0,chs0 ;selecciona canal de adc
bcf adcon0,chs1 ;selecciona canal de adc
bcf adcon0,chs2 ;selecciona canal de adc
bsf adcon0,go_done ;iniciar la operación del ADC
movf adcbajo,w
movwf portb
movf adcalto,w
movwf portc
call ret1seg ;Llama subrutina de 1 segundo
goto ciclo
;*******************************************************************************************************************************************
; Subrutinas
;*******************************************************************************************************************************************
ret1seg ;Retardo de 1 segundo
movlw .255
movwf var1
ciclo_3
movlw .08
movwf var2
ciclo_2
movlw .166
movwf var3
ciclo_1
decfsz var3,1 ;497 microsegundos = aprox. 0.5 milisegundos
goto ciclo_1
decfsz var2,1
goto ciclo_2
decfsz var1,1
goto ciclo_3
return
end
CLUB 067 PROGRAMACION DE MICROCONTROLADORES PIC.pdf

CLUB 067 PROGRAMACION DE MICROCONTROLADORES PIC.pdf

  • 3.
    Esta obra esla continuación en cuanto al aprendizaje de microcontroladores PIC, por lo que ahora toca explicar la parte práctica sobre la configuración y programación de éstos. Para ello es que hemos preparado el presente material para que, en poco tiempo y de una manera rela- tivamente corta, seamos capaces de aprender a programar microcontroladores PIC. Los microcontroladores PIC tienen el atractivo principal de que se encuentran muy difundidos, entre aplicaciones escolares y sobre todo industriales, además de que los programadores que se requieren los podemos encontrar de diversos precios, incluyendo aquellos que son muy económicos, pero que nos sirven perfectamente para programar a estos microcontroladores. Para aprender a programar microcontroladores, podemos empezar por cualquiera, al final de cuentas lo importante es saber identificar que tenemos una necesidad, y para ello proponemos en el presente libro comenzar por los PICs, ya que cuentan con una filosofía de operación sen- cilla y entendible, y lo creemos apropiado para aquellas personas que van partiendo de cero, o inclusive para aquellas personas que ya tienen conocimientos básicos sobre programación de microcontroladores. La forma en cómo se encuentra organizado el presente libro, es comenzar por lo elemental sobre el manejo de cualquier microcontrolador. El presente libro comienza explicando cómo se debe efectuar la configuración de los puertos de un microcontrolador PIC, pasando posteriormente a la utilización de los correspondientes puertos para ingresarles o sacar datos a través de ellos. Posteriormente se encuentran explicadas una serie de rutinas elementales, que son indispen- sables para que el microcontroladores PIC opere al 100%; es importante mencionar que el tipo de microcontrolador que puede ser empleado es de 8, 18, 28 o 40 terminales. Pues bien querido lector, en general esta obra es el resultado del impulso que en Club Saber Electrónica queremos darles a todas aquellas personas que tengan “ganas” de aprender, además queremos resaltar también las facilidades prestadas en el Instituto Politécnico Nacional (IPN) y específicamente en la Escuela Superior de Cómputo del IPN para desarrollar la presente obra y ponerla en práctica dentro de sus aulas. Esperamos que este libro sea de su total agra- do y utilidad, muchas gracias por elegirnos y hasta la próxima. Ing. Ismael Cervantes de Anda Docente ESCOM IPN icervantes@saberinternacional.com.mx Club Saber Electrónica Nº 67. Fecha de publicación: SEPTIEMBRE de 2010. Publicación mensual editada y publicada por Editorial Quark, Herrera 761 (1295) Capital Federal, Argentina (005411-43018804), en conjunto con Saber Internacional SA de CV, Av. Moctezuma Nº 2, Col. Sta. Agueda, Ecatepec de Morelos, México (005255-58395277), con Certificado de Licitud del título (en trámite). Distribución en Argentina: Capital: Carlos Cancellaro e Hi- jos SH, Gutenberg 3258 - Cap. 4301-4942 - Interior: Distribuidora Bertrán S.A.C. Av. Vélez Sársfield 1950 - Cap. – Distribución en Uruguay: Rodesol SA Ciudadela 1416 – Montevideo, 901-1184 – La Editorial no se responsabiliza por el contenido de las notas firmadas. Todos los productos o marcas que se mencionan son a los efectos de prestar un servicio al lector, y no entrañan responsabilidad de nuestra parte. Está prohibida la reproducción to- tal o parcial del material contenido en esta revista, así como la industrialización y/o comercialización de los aparatos o ideas que aparecen en los men- cionados textos, bajo pena de sanciones legales, salvo mediante autorización por escrito de la Editorial. Revista Club Saber Electrónica, ISSN: 1668-6004 1
  • 4.
    CAPITULO I. RUTINASBASICAS .........................................................................3 CONFIGURACION DE LOS PUERTOS COMO ENTRADA O SALIDA....................................................3 LECTURA DE DATOS DE UN PUERTO................................................................................................5 ESCRITURA DE DATOS EN UN PUERTO ............................................................................................8 ASIGNACION DE DATOS A UN REGISTRO ....................................................................................10 INCREMENTO Y DECREMENTO DE DATOS DE LOS REGISTROS ......................................................13 INCREMENTO O DECREMENTO DEL DATO DE UN REGISTRO EN UNA UNIDAD..............................14 INCREMENTO O DECREMENTO DEL DATO DE UN REGISTRO EN VALORES DIFERENTES A LA UNIDAD...............................................................................................................................14 DISEÑO DE UN CONTADOR.........................................................................................................14 CONTADOR ASCENDENTE ...........................................................................................................15 CONTADOR DESCENDENTE .........................................................................................................16 DISEÑO DE UN RETARDO BASICO POR BUCLES ............................................................................18 SUMA ARITMETICA .......................................................................................................................22 RESTA ARITMETICA .......................................................................................................................26 MULTIPLICACION ARITMETICA.......................................................................................................30 DIVISION ARITMETICA ..................................................................................................................32 CAPITULO II. RUTINAS INTERMEDIAS ...............................................................35 FUNCION LOGICA AND Y SUS APLICACIONES .............................................................................36 FUNCION LOGICA OR Y SUS APLICACIONES................................................................................37 FUNCION LOGICA XOR Y SUS APLICACIONES..............................................................................39 FUNCIONES LOGICAS DE COMPARACION ENTRE REGISTROS (=, <, >) .........................................40 COMPARACION IGUAL (=) Ó DIFERENTE () ..................................................................................41 COMPARACION MENOR QUE (<) Ó MAYOR O IGUAL QUE () ......................................................43 COMPARACION MAYOR QUE (>) Ó MENOR O IGUAL QUE () .....................................................45 LECTURA DE UN TECLADO MATRICIAL ...........................................................................................48 CONFIGURACION DE LAS INTERRUPCIONES ................................................................................53 IMPLEMENTACION DE UN RETARDO POR TIMER ............................................................................56 EL TIMER DE 8 BITS (TMR0)............................................................................................................56 EL TIMER DE 16 BIT S (TMR1).........................................................................................................59 CONFIGURACION DE LA USART ...................................................................................................62 USART EN MODO TRANSMISION (TX)...........................................................................................63 USART EN MODO RECEPCION (RX)...............................................................................................67 CONFIGURACION DEL ADC .........................................................................................................71 2 Cervantes de Anda Ismael - Programando Microcontroladores PICs. / Ismael Cervantes de Anda ; dirigido por Horacio Vallejo - 1a ed. - Buenos Aires : Quark, 2010. - 80 p. ; 28x20 cm. ISBN 978-987-623-206-7 1. Electrónica. I. Vallejo, Horacio, dir. II. Titulo HoracioCDD 621.3 Fecha de catalogación: 23/04/2010
  • 5.
  • 6.
    3 En este capítulose irán abordando diversos temas para aprender a programar un microcontrolador PIC, aun sin saber nada acerca de estas actividades. El pre - sente material es una guía para comenzar paso a paso, desde la configuración de las terminales que constituyen a los puertos de los microcontroladores. Aquí se aprenderá a realizar la correspondiente configuración de los puertos, tanto para leer datos (puerto configurado como entrada) como para escribir datos (puerto configurado como salida). Adquiriendo de manera complementaria, el conoci - miento para manipular los correspondientes registros de configuración. De manera general se continuara con la utilización de los registros, para reali - zar operaciones elementales, tales como el incrementarles el valor del dato alma - cenado en dichos registros; para que podamos pasar al diseño de una serie de “rutinas básicas”, que son de mucha utilidad en operaciones que se tienen que realizar con un microcontrolador. Estas rutinas básicas se encuentran confor - madas por contadores (ascendente y/o descendente), rutinas de tiempo imple - mentadas mediante bucles, además de las operaciones aritméticas como son la suma, resta, multiplicación y división, todas estas operadas con los valores al - macenados en distintos registros.
  • 7.
    4 Configuración de losPuertos como Entrada o Salida El primer ejercicio que se realiza con un microcontrolador es la de leer o escribir datos discretos (digitales) a través de sus puertos. Por lo tanto, la primera actividad que tiene que reali- zarse, es la de configurar sus respec- tivos puertos ya sean como de entra- da o de salida de datos. Todos los microcontroladores po- seen puertos que dependiendo de su estructura física relacionada con la cantidad de terminales, pueden po- seer una cantidad de puertos igual a 1 ó 2 ó 3, etc. A continuación describiremos la manera en que tienen que ser confi- gurados los puertos de un microcon- trolador PIC, y para ello, nos basare- mos en 4 microcontroladores PIC de diferentes tamaños, los cuales toma- remos como modelo y a partir de és- tos, podremos realizar cualquier apli- cación, no importando la cantidad de terminales que posean los microcon- troladores, ya que lo importante es aprender a configurarlos y obtener el máximo beneficio de sus herramien- tas internas. Para configurar los puertos de en- trada o salida de datos digital de los microcontroladores, se tiene que guardar un valor en el respectivo re- gistro de configuración del puerto a ser empleado. El registro de configu- ración debe ser manipulado en el lla- mado “tris”, que dependiendo del puerto se complementa el nombre del registro a “trisa” si se trata del puerto A, o “trisb” si se trata del puerto B, o “trisc” si se trata del puerto C, etc. Normalmente la mayor cantidad de puertos que posee un microcontrola- dor PIC es de 5 por lo que sólo llega- ría hasta el puerto E. Cabe aclarar que los microcontro- ladores que cuentan con un sólo puer- to como es el caso del PIC12F629, el registro de configuración de su puerto correspondiente, tan solo recibe el nombre de “trisio”, ya que no es nece- sario especificarle de qué puerto se trata, por el hecho de que sólo posee uno. Los registros de configuración de los diferentes puertos de los micro- controladores PIC se encuentran en el banco 1 del mapa de memoria de datos, siendo las localidades específi- Figura 1 Diversos microcontroladores PIC. Tabla 1. Ubicación de los registros de configuración de algunos microcontro - ladores PIC.
  • 8.
    cas para cadaregistro de configura- ción las siguientes: Todos los registros tris (configura- ción de puertos) de los diferentes puertos que poseen los microcontrola- dores PIC, se encuentran conforma- dos por 8 bits, los cuales dependiendo del estado lógico en el que se encuen- tren, será la forma de cómo se confi- gure su correspondiente puerto, ya sea como entrada o salida. Para que un puerto de algún mi- crocontrolador PIC sea configurado como entrada, en su correspondiente registro tris se debe alojar un dato el cual debe estar compuesto por 1's ló- gicos. Expresado de otra manera, sí se requiere que todos los bits de un puerto sean configurados como entra- das, entonces a cada bit del corres- pondiente registro tris del puerto en cuestión se le tendrá que colocar en 1 lógico. Tal como se muestra a conti- nuación: Registro tris = 11111111 (binario) ó tris = FF (hexadecimal) ó tris = 255 (decimal) De manera contraria, para que un puerto de algún microcontrolador PIC sea configurado como salida, en su correspondiente registro tris se debe alojar un dato, el cual debe estar constituido por 0's lógicos. Expresan- do lo anterior de otra manera, sí se re- quiere que todos los bits de un puerto sean configurados como salidas, en- tonces a cada bit del correspondiente registro tris del puerto en cuestión se le tendrá que colocar en 0 lógico. Tal como se muestra a continuación: Registro tris = 00000000 (binario) ó tris = 00 (hexadecimal) ó tris = 000 (decimal) Por otra parte, no es requisito in- dispensable configurar los bits de todo un puerto ya sea como entrada o co- mo salida, sino dependiendo de la aplicación un mismo puerto puede ser configurado, por ejemplo, mitad como entrada y mitad como salida. Por lo tanto el registro tris podría quedar co- mo: Registro tris = 00001111 (binario) ó al revés tris = 11110000 (binario) De manera general, la cantidad de bits de entrada o salida que se pue- den configurar en un puerto depende de las necesidades de la aplicación, pero lo que sí debe tomarse en cuen- ta es que los puertos cuentan con má- ximo 8 bits, los cuales deben ser dis- tribuidos de manera adecuada, para considerar qué microcontrolador es el que debemos de adquirir. Para acceder a cualquiera de los registros tris se tiene que apuntar en primera instancia al banco 1 del mapa de memoria de datos. Para ello se tie- nen que manipular los bits rp0 y rp1 del registro “status”. Por otra parte su- ponga que se requiere configurar al puerto A como entrada y en el puerto B el nible superior como entrada y el nible inferior como salida. A continua- ción se muestra, a manera de suge- rencia, el código para realizar las ac- ciones antes descritas, sobre micro- controladores que cuentan con más de un puerto. Ver tabla 1.2. Para microcontroladores que sólo tienen un puerto, y además necesita- mos que los bits 0,1 y 2 sean configu- rados como entradas, y los bits 3, 4 y 5 sean configurados como salidas, to- mando en cuenta que el microcontro- lador de un solo puerto puede ser el PIC12F629, se presenta el fragmento de código para configurar el puerto. Ver tabla 1.3. Aunque todos los registros de con- figuración tris son de 8 bits, en el PIC12F629 sólo son empleados los 6 bits de más bajo peso, por lo que los bits 6 y 7 los colocamos en “0” (de to- das maneras son colocados en el es- tado lógico “0” de manera automáti- ca). Para finalizar el tema de la confi- guración de los registros de los puer- tos, podemos decir que es a través de los registros de configuración tris por donde se configuran los puertos de un microcontrolador. Por lo tanto, son los primeros registros que deben ser ma- nipulados cuando se diseña un pro- grama. Lectura de Datos de un Puerto No importando la cantidad de bits que conformen a un puerto, éste pue- de ser configurado para que pueda “leer” algún dato del exterior. Para ello, una vez que se tiene el corres- pondiente circuito de aplicación, se graba en el microcontrolador PIC el programa por medio del cual realizará la tarea de ingresar un dato digital al microcontrolador. Vea la tabla 2. Para poder emplear un puerto co- mo entrada en los microcontroladores PIC, se tiene que comenzar con la 5 Tabla 1.3 bsf status,rp0 ;cambia al banco 1 movlw b'00000111' ;configura los bits del 0 al 2 como entrada, y los bits del 3 al 5 como salida del único puerto. movwf trisio Tabla 1.2 bsf status,rp0 ;cambia al banco 1 bcf status,rp1 movlw b'11111111' ;configura al puerto A como entrada movwf trisa movlw b'11110000' ;configura al puerto B bits del 0 a 3 como salida movwf trisb ;bits del 4 a 7 como entrada
  • 9.
    configuración del correspondientere- gistro “tris”, colocando todos sus bits en unos “lógicos” (1's). Posteriormen- te a la configuración del registro tris, se tiene que emplear el registro deno- minado “port”, llamando al puerto A como “porta”, al puerto B como “portb”, al puerto C como “portc” y así sucesivamente para cada uno de los puertos con que cuente el microcon- trolador. Ver Tabla 3. Los registros “port” prácticamente se comportan como un reflejo del es- tado lógico que se presenta en las ter- minales físicas del microcontrolador. Siendo más específicos, diremos que el dato que alojemos en algún registro port, se transmitirá a las terminales que se encuentran relacionadas con el registro port correspondiente, recor- dando que el registro tris consecuente debe encontrarse configurado de tal forma que el puerto se comporte co- mo entrada. Todos los registros port se en- cuentran constituidos por 8 bits, los cuales indican el estado lógico en que se encuentran las terminales físicas 6 Tabla 2. Utilización del puerto B de cualquier microcontrolador PIC para leer datos. Tabla 3. Utilización del puerto A para leer datos de los microcontroladores PIC16F628A y PIC16F876.
  • 10.
    del puerto encuestión del microcon- trolador PIC. Para leer todos los bits de un puerto se puede emplear el co- mando de lectura de un registro, indi- cando en la instrucción el puerto que tendrá que ser intervenido, para una mayor referencia observe el ejemplo que se ilustra en la tabla 2. Este códi- go es válido para todos los puertos ex- ceptuando al puerto A de los micro- controladores PIC. Por otra parte tam- bién se indica el direccionamiento del banco donde se encuentran los regis- tros que serán empleados, actividad que se implementa por medio de la manipulación de los bits “rp0” y “rp1” del registro “status”. En las terminales del puerto A de los microcontroladores PIC depen- diendo de su estructura interna, pue- den poseer ya sea convertidores ana- lógico a digital (ADC), ó comparado- res de voltaje, motivo por el cual como parte de la rutina de inicialización de los registros de los microcontrolado- res, se les tiene que indicar de mane- ra adicional, que se van a emplear las terminales del puerto A para realizar lecturas de naturaleza digital. Poste- rior a la aplicación de un reset, las ter- minales del puerto A se configuran de manera predeterminada para que sean activados ya sea el ADC ó los comparadores de voltaje. Por lo tanto, tendremos que recurrir al registro en donde se configura la cantidad de ADC's o comparadores que serán em- pleados, pero en esta ocasión para deshabilitarlos. Para realizar la activi- dad de deshabilitación de ADC ó com- paradores, basta con seleccionar 0 (cero) ADC's ó 0 (cero) comparadores de voltaje, tal como se ilustra en el có- digo del programa de la tabla. Hasta este punto hemos revisado de qué manera se leen los puertos A ó B ó C, etc., de microcontroladores que poseen más de un puerto (el PIC- 16F628A cuenta con 2 puertos y el PIC16F876 cuenta con 3 puertos) co- mo entrada, pero también podemos encontrarnos con microcontroladores que posean tan solo un puerto único. Por lo tanto debemos de ser capaces de poder trabajar con el microcontro- lador de un solo puerto. Ver tabla 4. Dentro de los microcontroladores PIC, uno de los que cuenta con un so- lo puerto es el que se identifica por medio de la matrícula PIC12F629, el cual posee 8 terminales de las cuales 2 son para alimentación, por lo que sobra un puerto de tan solo 6 bits. En este caso se trata de un microcontro- lador que podemos considerar como “enano” pero no por ello restringido en su operación. Por el contrario todo de- pende de la aplicación que queramos realizar, y si ésta no requiere de mu- chas terminales de entrada, el PIC12F629 es muy adecuado. Para emplear el puerto del micro- controlador PIC12F629 tenemos en primera instancia que configurar los bits de su correspondiente registro “trisio” de tal manera que pueda leer datos, siguiendo la misma mecánica que se realizó para los demás micro- controladores. Por lo tanto se debe colocar unos (1´s) en los respectivos bits donde se pretende que la corres- pondiente terminal del microcontrola- dor sea configurada como entrada. Se tiene que considerar que la terminal identificada como GP3 (refiérase a la figura 1), siempre debe ser configura- da como de entrada, ya que la arqui- tectura del microcontrolador PIC12F629 así la tiene diseñada. En la tabla 4 se ilustra un fragmen- to de código para configurar al único 7 Tabla 4. Utilización del puerto GPIO de un PIC de 8 terminales para leer da - tos.
  • 11.
    puerto con elque cuenta un microcon- trolador PIC de 8 terminales (en este caso un PIC12F629). En el registro “trisio” se cargan 1's en los bits 0, 1, 2, 3, 4 y 5 porque son los que se en- cuentran disponibles para el PIC12F629, los bits 6 y 7 no se en- cuentran disponibles para este PIC. Una vez que fue configurado el regis- tro trisio, se procede a emplear el re- gistro “gpio” para ingresar el dato que se encuentra en las terminales del mi- crocontrolador. Para emplear la totali- dad de las terminales del PIC12F629, es necesario habilitar al oscilador in- terno del PIC, para que se puedan emplear las 2 terminales dedicadas al oscilador como entradas discretas (GP4 y GP5), además de deshabilitar la terminal del reset externo denomi- nado MCLR, para contar con la termi- nal GP3 exclusivamente como entra- da. Por otra parte, cuando se habilita al oscilador interno, se tiene que se- leccionar la frecuencia de operación, por lo que en el registro “osccal” se in- gresa el valor binario “11111100” que selecciona la frecuencia máxima de operación que es de 4 MHz. El PIC12F629 en las terminales identifi- cadas como GP0 y GP1 cuentan a la vez con comparadores de voltaje, mismos que tienen que ser deshabili- tados para emplear dichas terminales como entradas digitales, siendo me- diante la carga del valor binario “00000111” en el registro “cmcon”. Por último se tiene que recordar que para interactuar con algún registro, se tiene que direccionar al banco adecuado. El PIC12F629 sólo cuenta con 2 bancos. Por lo tanto basta con manipular el bit “rp0” del registro status para acceder al banco adecuado. Escritura de Datos en un Puerto Sin tomar en cuenta la cantidad de bits que conforman a los puertos de los microcontroladores PIC, éstos pueden ser configurados para que se pueda “escribir” algún dato hacia el exterior del microcontrolador, Para ello, una vez que se tiene el corres- pondiente circuito de aplicación debi- damente configurado, se graba en el microcontrolador PIC el programa por medio del cual realizará la tarea de enviar un dato digital hacia el exterior del microcontrolador. Para poder utilizar cualquiera de los puertos de un microcontrolador PIC como salida, se tiene que consi- derar como primer paso el de la confi- guración del correspondiente registro “tris”, colocando todos sus bits en ce- ros “lógicos” (0's). Una vez que fue configurado el registro tris, se tiene que proceder con el empleo del regis- tro denominado “port”, y de acuerdo al puerto que se tenga que emplear se podrá seleccionar desde el puerto A como “porta”, al puerto B como “portb”, al puerto C como “portc” y así sucesivamente para cada uno de los puertos con que cuente el microcon- trolador. Los registros denominados “port” prácticamente se comportan como un reflejo del estado lógico que se pre- senta en las terminales físicas del mi- crocontrolador. Siendo más específi- cos, diremos que el dato que alojemos en algún registro port, se transmitirá a las terminales que se encuentran rela- cionadas con el registro port corres- pondiente, recordando que el registro tris consecuente debe encontrarse configurado de tal forma que el puerto se comporte como salida. En los microcontroladores PIC to- dos los registros port se encuentran constituidos por 8 bits, los cuales indi- can el estado lógico en que se en- cuentran las terminales físicas del puerto en cuestión del microcontrola- dor PIC. Ver tabla 5. Para escribir un dato en todos los bits de un puerto se 8 Tabla 5. Utilización del puerto B de cualquier microcontrolador PIC para es - cribir datos.
  • 12.
    puede emplear elcomando de escritu- ra sobre un registro, indicando en la instrucción el puerto que tendrá que ser intervenido. Para una mayor refe- rencia observe el ejemplo que se ilus- tra en la tabla 5. El código de la tabla 5 es válido para intervenir todos los puertos de un microcontrolador PIC exceptuando al puerto A de los PIC, Por otra parte también se indica el di- reccionamiento del banco donde se encuentran los registros que serán empleados por medio de la manipula- ción de los bits “rp0 y rp1” del registro “status”, que de acuerdo al banco donde se ubiquen los diferentes regis- tros de configuración, se tendrá que colocar la combinación adecuada en los bits rp0 y rp1. Sobre las terminales del puerto A de cualquiera de los microcontrolado- res PIC dependiendo de su estructura interna, pueden contar con converti- dores analógico a digital (ADC), ó comparadores de voltaje, precedente para que sea implementada la corres- pondiente rutina de inicialización de los registros de los microcontrolado- res, para que de manera adicional se le indique a las terminales del puerto que serán empleadas para realizar la escritura de datos digitales en el puer- to A. Cuando se aplica un reset, las terminales del puerto A se configuran siempre de manera predeterminada para que éstas sean habilitadas como ADC ó los comparadores de voltaje. Por lo tanto, se tendrá que recurrir al registro en donde se configura la can- tidad de ADC's o comparadores que serán empleados, pero en esta oca- sión se tendrán que deshabilitar. Para realizar la actividad de des- habilitación de ADC ó comparadores, basta con seleccionar 0 (cero) ADC's ó 0 (cero) comparadores de voltaje, tal como se ilustra en los fragmentos de código de los programas de la tabla. Hemos revisado la manera de es- cribir datos sobre los puertos A ó B ó C, etc., de microcontroladores que cuentan con más de un puerto (el PIC- 16F628A cuenta con 2 puertos y el PIC16F876 cuenta con 3 puertos), pe- ro también podemos encontrarnos con microcontroladores que poseen tan solo un puerto único. Por lo tanto se debe contar con el conocimiento de poder trabajar con algún microcontro- lador de un solo puerto. Dentro de la familia de los micro- controladores PIC, uno de los que cuenta con un solo puerto es el que se identifica por medio de la matrícula PIC12F629, el cual posee 8 termina- les de las cuales 2 son para que sea energizado (terminales Vdd y Vss), por lo que sobra un puerto de tan so- lo 6 bits. En este caso se trata de un microcontrolador pequeño que pudie- ra ser considerado como restringido en cuanto a su cantidad de termina- les, pero no en su operación. Por el contrario, todo depende de la aplica- ción que se tenga que realizar, ya que si ésta no requiere muchas termina- les de salida, el PIC12F629 es un mi- crocontrolador muy adecuado. Para emplear el puerto del micro- controlador PIC12F629 tenemos, en primera instancia, que configurar los bits de su correspondiente registro “trisio” de tal manera que se pueda es- cribir algún dato, siguiendo la misma 9 Tabla 6. Utilización del puerto A para escribir datos en los microcontroladores PIC16F628A y PIC16F876.
  • 13.
    mecánica que serealizó para los de- más microcontroladores. Por lo tanto, se deben colocar ceros (0´s) en los respectivos bits donde se pretende que la correspondiente terminal del microcontrolador sea configurada co- mo salida. Se tiene que considerar que de las terminales con que cuenta el PIC12F629, identificada como GP3 (refiérase a la figura 1), siempre tiene que ser configurada como de entrada, ya que la arquitectura del microcontro- lador PIC12F629 así la tiene diseña- da. En la tabla 7 se ilustra un fragmen- to de código para configurar al único puerto con el que cuenta un microcon- trolador PIC de 8 terminales (en este caso un PIC12F629) como salida. En el registro “trisio” se cargan 0's en los bits 0, 1, 2, 4 y 5 porque son los que se encuentran disponibles para el PIC12F629, los bits 6 y 7 no se en- cuentran disponibles para este PIC. Una vez que fue configurado el re- gistro trisio, se procede a emplear el registro “gpio” para enviar hacia el ex- terior del microcontrolador algún dato, para que se refleje en las terminales del microcontrolador. Para emplear la totalidad de las terminales del PIC12F629, es necesario habilitar al oscilador interno del PIC, para que se puedan emplear las 2 terminales dedi- cadas al oscilador como salidas dis- cretas (GP4 y GP5), además de des- habilitar la terminal del reset externo denominado MCLR, para contar con la terminal GP3 exclusivamente como “entrada”. Por otra parte, cuando se habilita al oscilador interno, se tiene que seleccionar la frecuencia de ope- ración, por lo que en el registro “osc- cal” se ingresa el valor binario “11111100” que selecciona la frecuen- cia máxima de operación que es de 4 MHz. El PIC12F629 en las terminales identificadas como GP0 y GP1 cuen- tan a la vez con comparadores de vol- taje, los mismos que tienen que ser deshabilitados para emplear dichas terminales como salidas digitales, siendo mediante la carga del valor bi- nario “00000111” en el registro “cm- con”. Por último se debe tomar en cuenta que para interactuar con algún registro, se tiene que direccionar al banco adecuado. El PIC12F629 sólo cuenta con 2 bancos. Por lo tanto, basta con manipular el bit “rp0” del re- gistro status para acceder al banco adecuado. Asignación de Datos a un Registro Una de las tareas que tiene que realizar un microcontrolador es la de ir almacenando datos, ya sea en sus re- gistros de configuración, o en cual- quier registro de memoria RAM, que es en donde finalmente se alojan los datos que resultan de una operación, o la lectura de un puerto, etc. Si la aplicación así lo requiere, se tiene que manipular el dato de más de un registro. Para ello, se tienen que distribuir todos los registros involucra- dos en el proyecto, para que en prime- ra instancia se tengan que ubicar so- bre los espacios de memoria RAM, que se encuentran constituidos sobre la memoria de datos. Por lo tanto, se debe de conocer sobre qué banco de memoria es sobre el que se alojará el dato en un registro. Para comenzar a trabajar con los registros, la primera actividad a desa- rrollar es la que lleva por nombre “de- claración” de registros, o sea se le tie- 10 Tabla 7. Utilización del puerto GPIO de un PIC de 8 terminales para escribir datos.
  • 14.
    ne que indicaral programa editor (que en el caso de los microcontroladores PIC es el MPLAB) que se va emplear por ejemplo el registro “trisa”. Recordemos que se pueden clasi- ficar de forma general en 2 conjuntos los registros que emplearemos, los cuales conocemos como registros de configuración y registros de propósito general. Estos últimos también tienen la tarea de almacenar datos ya que se trata de registros que se encuentran implementados sobre memoria RAM. A continuación marcaremos un mayor énfasis sobre los registros de propósi- to general, sin olvidar a los registros de configuración. Una vez que fueron declarados los registros con los que trabajaremos, ya los podemos emplear para escribirles o leerles el dato que contengan. Por lo tanto, en el ejemplo que se muestra sobre un listado en el fragmento de programa descrito en la tabla 8, se de- claran los registros que serán emplea- dos, resaltando de una manera parti- cular a los registros de propósito ge- neral que son los que funcionarán co- mo localidades de memoria RAM. De la tabla 8 se observa que se tienen que declarar una serie de registros que se denominan “var1”, “var2”, “var3”, etc. Lo importante es que ocu- pan las localidades de los registros que van de la 20h a la 30 h, además de que son localidades continuas. Se debe tener en cuenta que si por algu- na razón se requiere insertar un nue- vo registro por ejemplo entre los iden- tificados como var7 y var8, posterior- mente se tienen que enumerar nueva- mente las localidades recorriendo los números de registro que a cada una le corresponde de tal manera, que de nuevo queden ordenadas. En la tabla 9 se muestra una ma- nera mucho más práctica en lo corres- pondiente a la declaración de regis- tros, en donde puede observarse que a partir del registro var1, nos olvida- mos de indicar por medio de la direc- tiva “equ” la localidad que le corres- ponde a cada registro. Tan solo tene- mos que enumerar a todos los regis- tros que tenemos que emplear y al co- mienzo del bloque le colocamos el co- mando “CBLOCK”, indicándole cuál será la primera localidad que tendrá que ocuparse, tal como se muestra en el ejemplo “CBLOCK 0x20”, tal como aparece en la tabla 9. Para indicar en dónde termina la declaración de registros, se tiene que colocar el comando “ENDC” y hasta allí termina de realizar las declaracio- nes. Por lo tanto, si se tiene que agre- gar un nuevo registro, tan sólo se tie- ne que escribir dentro del bloque y de manera automática le proporcionará una localidad. Cuando ya fueron declarados los registros, posteriormente se procede a su empleo ya sea para guardarles un dato, o para leer el dato que con- tengan. En la tabla 10 se muestra un ejemplo en donde se emplea una gran cantidad de registros, los cuales du- rante el presente ejercicio serán em- pleados para alojarles un dato. El da- to será leído a través del puerto A. Posteriormente se guardara en el re- gistro de trabajo “W”, y por último el dato que se encuentre en el registro W será colocado en todos los regis- tros que van de var1 a var17,.Aquí es muy importante resaltar el hecho de que la declaración de los registros fue realizada mediante un bloque. En el ejemplo mostrado en la tabla 10 se observa en la sección “progra- ma principal” después de la etiqueta “ciclo”, que de manera ordenada se tienen que ir alojando valores en cada uno de los registros identificados co- mo “var”, mediante el empleo de una instrucción para cada uno de los re- 11 Tabla 8. Declaración de registros, para su empleo posterior. Tabla 9. Declaración de un bloque de registros, para asignación automática de localidades.
  • 15.
    12 Tabla 10. Empleode los registros una vez declarados. Tabla 11. Empleo de los registros mediante direccionamiento indirecto.
  • 16.
    gistros, que eneste caso se trata tan sólo de 17; para cada uno de los re- gistros se está empleando un direc- cionamiento directo. Supóngase el ca- so en el que se requiera el manejo de 80 registros (no sólo 17), la pregunta sería ¿se pondrán a escribir 80 ins- trucciones para cada uno de los regis- tros? Sería una cuestión de nunca acabar, por lo que mejor recurrimos al método de direccionamiento indirecto, en el cual tan sólo tenemos que indi- car dónde comienza la localidad de los registros que serán intervenidos, y controlar mediante un contador el ac- ceso al siguiente registro, tal como es ilustrado en el ejemplo de la tabla 11. El código del programa ilustrado en la tabla 11 es idéntico en cuanto a la actividad que realiza el programa que se muestra en la tabla 10, pero se tiene un cambio a la manera de guar- dar los datos en los registros, Si ob- serva detenidamente ambos progra- mas, el que corresponde a la tabla 11, posee menos líneas de código porque se implementó en éste el método de direccionamiento indirecto para mani- pular a todos los registros. El direccionamiento indirecto con- siste en obtener la dirección de una lo- calidad de memoria (memoria RAM), por medio de otro registro (File Select Register “FSR”) que de manera inter- media es el primero que tiene que ser consultado. El direccionamiento indirecto en los microcontroladores PIC se realiza por medio del empleo de los registros denominados en primer término co- mo: “FSR” que es el que contendrá como dato a la localidad de memoria RAM que será manipulada, e “INDF” que es el registro en el cual se en- cuentra la información que será escri- ta o leída de la localidad de memoria RAM que se está direccionando por medio del registro FRS. Para una me- jor comprensión observe la figura 2, en la cual se muestra que con los bits del 0 al 6 del registro FSR se direccio- na una localidad de memoria RAM, mientras que la combinación genera- da mediante los bits 7 del registro FSR y el bit IRP del registro STATUS se puede acceder a cualquiera de los 4 bancos de memoria que posee un microcontrolador PIC. Regresando nuevamente al ejem- plo de programa mostrado en la tabla 11, revisemos el fragmento de código que a continuación se muestra: ver tabla 11.2. Para poder emplear los registros “indf” y “fsr” tuvieron que ser declara- dos mediante el comando “equ” con su respectiva localidad en el mapa de memoria de registros del microcontro- lador PIC, que para el registro “indf” se trata de la localidad 00h, y para el registro “fsr” de la localidad 04h. Cuando se requiere alojar un dato de manera consecutiva en los regis- tros de memoria RAM, se emplea la instrucción “movwfindf” (previamente tuvo que ser cargado el dato en el re- gistro de trabajo W) tal como se mues- tra en el programa de la tabla 11, pero cuando se requiere realizar la opera- ción inversa, o sea leer de manera cí- clica a los registros de memoria RAM, entonces la instrucción que tiene que ser empleada es “movf indf,0” para que el dato que contenga la localidad de memoria RAM sea colocado en el registro de trabajo W. En cualquiera de los casos ya sea de escritura o lectura de una locali- dad de memoria RAM, lo primero que tiene que hacerse es ingresar en el registro FSR la localidad a ser inter- venida. Incremento y Decremento de Datos de los Registros Incrementar o decrementar los da- tos de los registros, es una actividad 13 Figura 2. Direccionamiento Directo e Indirecto en un PIC. Tabla 11.2 ciclo movf porta,w ;lee un dato del puerto a movwf indf ;aloja el dato en el registro indirecto movlw 0x30 ;verifica si se trata del ultimo registro xorwf fsr,w btfsc status,z goto otro incf fsr,1 goto ciclo
  • 17.
    que dependiendo dela aplicación se realiza con mucha frecuencia dentro de un programa. Por ello, es que se tienen que revisar las diversas mane- ras de manipular la información que se encuentra alojada en los registros. Incremento o Decremento del Dato de un Registro en una Unidad Para incrementar o decrementar el dato de un registro en una unidad, se tienen las instrucciones “incf” y “decf” respectivamente, los cuales de manera simple realizan la operación que les corresponde. Normalmente cuando observamos de manera aisla- da a este tipo de operaciones, en mu- chas ocasiones las consideramos co- mo actividades triviales, pero debe- mos estar seguros que si las emplea- mos de manera correcta, nuestros programas serán muy eficientes. La sintaxis completa de las instrucciones “incf” y “decf” son las siguientes: a) incf registroX,1 ;Incrementa en una unidad el dato del registro X alojando el resultado fi- nal dentro del mismo registro X . b) decf registroX,1 ;Decrementa en una unidad el da- to del registro X alojando el resultado final dentro del mismo registro X1. Existen otras instrucciones que a parte de realizar la tarea de incremen- tar o decrementar en una unidad al valor del dato de algún registro, tam- bién verifican si el resultado de la ope- ración fue cero, teniéndose la posibili- dad de diseñar un contador con pocas líneas de código, y para ello se em- plean las instrucciones que se mues- tran con su respectiva sintaxis de ma- nera completa a continuación: a) incfsz registroX,1 ;Incrementa en una unidad el dato del registro X alojando el resultado fi- nal dentro del mismo registro X1, y salta si el resultado fue 0 (cero). b) decfsz registroX,1 ;Decrementa en una unidad el da- to del registro X alojando el resultado final dentro del mismo registro X1, y salta si el resultado fue 0 (cero). En e capítulo siguiente se mostra- ran ejemplos a cerca del empleo de estas instrucciones, en los cuales se muestran en aplicaciones prácticas. Incremento o Decremento del Dato de un Registro en Valores Diferentes a la Unidad En diversas ocasiones se necesita que se manipule el dato de un regis- tro, para controlar una cierta variable, para lo cual los incrementos deben ser valores diferentes de la unidad, o simplemente se tiene que sumar o restar un valor de acuerdo con la apli- cación que se está implementando. Pues bien, para incrementar o decre- mentar el dato de algún registro con valores diferentes de la unidad, se tie- nen las instrucciones de suma o resta respectivamente, las cuales se mues- tran junto con su sintaxis completa: a) addwf registroX,1 ;Suma el valor alojado en el regis- tro W con el dato del registro X guar- dando el resultado final dentro del mismo registro X. b) subwf registroX,1 ;Resta el valor alojado en el regis- tro W al dato del registro X guardando el resultado final dentro del mismo re- gistro X2. Diseño de un Contador Un contador es una de las prime- ras aplicaciones básicas que tienen que emplearse, por lo que en el desa- rrollo del presente capítulo se explica- rá la manera en que puede ser creado el código de un programa en el cual se tenga implementado un contador básico partiendo de registros de 8 bits. En el caso de que se requieran contadores de más de 8 bits, la meto- dología mostrada en el presente capí- tulo será válida, pero se tendrá que re- currir a la suma o resta de registros con más de 8 bits, y cuyas explicacio- nes se encuentran en los respectivos capítulos llamados “suma aritmética” y “resta aritmética” que se ubican den- tro del presente capítulo. La estructura de un contador se ilustra en el diagrama de flujo de la fi- gura 3, en la cual se muestra que se tiene que guardar un dato en un regis- tro, que será el que funcionará como el control del contador, el valor que se alojará en el registro contador depen- derá de cómo se tiene que inicializar dicho contador. Ya inicializado el re- gistro contador, se procede a realizar la actividad que tiene que controlar el contador, esto es, se realiza la activi- dad sustancial que por ejemplo puede una serie de sumas, una serie de lec- turas a través de un puerto, etc. Pos- teriormente a la realización de la acti- vidad que controla el contador, se tie- ne que incrementar el valor del dato que se encuentra en el registro conta- dor, para contabilizar la cantidad de eventos que se han realizado. Por úl- timo, se tiene que revisar que no se haya rebasado la cantidad de eventos a realizarse, por lo que ahora, la acti- vidad siguiente es la de comparar el valor que se encuentra dentro del re- gistro contador, con el valor máximo de eventos que tienen que realizarse. Si el valor que se encuentra alojado en el registro contador, aún no alcan- za el valor máximo, entonces el proce- so tiene que repetirse una vez más, por lo tanto, se tendrá que realizar nuevamente el evento de la actividad que se está controlando. De otra ma- nera, si el valor del registro contador es igual al valor máximo de los even- tos que tienen que realizarse, enton- ces el programa tendrá que realizar 14
  • 18.
    una actividad diferentede la que esta- ba controlado con el contador, dando por terminado el contador y accedien- do a un nuevo proceso. En el diagrama de flujo del conta- dor de la figura 3, los bloques que co- rresponden al control del contador son resaltados, para tener presente dónde se realiza el control del contador. Los contadores pueden desarrollarse en forma general de dos maneras, de- pendiendo de si el contador se confi- gurará como un “contador ascenden- te” o un “contador descendente”, pero en ambos casos la estructura del con- tador es la misma que se ha mostrado previamente, y a continuación se muestra la estructura de los distintos tipos de contador. Contador Ascendente El contador ascendente tiene co- mo característica principal la de llevar un conteo ascendente en el registro contador, razón por la cual el registro contador se inicializa con un valor “pe- queño” que puede ser inclusive 0 (ce- ro). Dicho valor tiene que ser menor al valor máximo de eventos que tiene que controlar el contador. Después de haber realizado la actividad que co- rresponde al evento que se está con- trolando, el registro contador tiene que ser incrementado para precisa- mente llevar a cabo el conteo de la cantidad de eventos que han sido efectuados. Normalmente el incre- mento que se aplica al registro conta- dor es de una unidad, pero en realidad se tiene que incrementar de acuerdo a la aplicación que se está desarrollan- do. Una vez que se ha incrementado el valor del registro contador, se pro- cede a comparar el valor del registro contador con el valor máximo de la cantidad de eventos que tienen que desarrollarse. Este valor puede en- contrarse dentro de un registro al que podemos llamar “Valormaximo”. Si después de “incrementar” el dato del valor del registro contador aún no es igual al valor máximo, entonces se tie- ne que aplicar un nuevo incremento al registro contador, y así sucesivamen- te hasta que alcance su valor total. En los ejemplos de programa ilus- trados en la tabla 12, se propone el empleo de un microcontrolador PIC- 16F628A, pero en realidad por el mo- mento no es relevante el microcontro- lador PIC que sea empleado, ya que el código para realizar el conteo es vá- lido para cualquier PIC. Los progra- mas mostrados en la tabla 12 contro- lan un contador ascendente, realizan- do ambos programas idénticas funcio- nes, teniendo sólo un cambio en cuanto a las líneas de sus respectivos códigos. El cambio existente entre los programas radica en la instrucción que efectúa el incremento del registro contador. En un programa se emplea la instrucción “incf contador,1” la cual indica que se incremente en una uni- dad el valor del registro “contador” guardando el resultado en el mismo registro. Por otra parte en el segundo programa que también se encuentra en la tabla 12, se emplea el par de ins- trucciones “movlw0x01” y “addwf con- tador,1”, las cuales en primer instan- cia cargan el registro de trabajo W con el valor al cual tendrá que ser incre- mentado el registro contador, siendo el valor de 01h para el presente ejem- 15 Figura 3. Diagrama de flujo de un contador. Figura 4. Diagrama de flujo de un contador ascendente. Figura 5. Diagrama de flujo de un contador descendente.
  • 19.
    plo, mientras quepor medio de la ins- trucción addwf, se realiza la suma del registro contador con el valor que fue cargado en el registro de trabajo W, guardando el resultado de la suma en el mismo registro contador; si fuera necesario que el incremento que será sumado al registro contador sea dife- rente de 01h, tan sólo se tiene que car- gar el valor correspondiente en el re- gistro de trabajo W. Posterior al incre- mento del registro contador se tiene que verificar si ya se llegó al valor má- ximo de eventos realizados. Para el presente ejemplo el incremento se tie- ne que realizar hasta que se alcanza el valor máximo de 5 (el proceso de comparación será mostrado con deta- lle en el capítulo de funciones lógicas que se encuentra dentro del presente capítulo). El evento que se está con- trolando es el de leer un dato a través del puerto a, y escribir ese mismo da- to en el puerto b. Contador Descendente El contador descendente a dife- rencia del contador ascendente, reali- za el control del contador a través de un conteo descendente, tal como es ilustrado en la figura 5. Se observa gráficamente en el diagrama de flujo de la figura 5 que cuando se inicializa el registro conta- dor, tiene que ser con el valor del total de los eventos que tendrán que efec- 16 Tabla 12. Ejemplos de programa para un contador ascendente.
  • 20.
    tuarse. A continuaciónse realiza la ac- tividad del evento que se está contro- lando, para posteriormente realizar un decremento en el valor del registro contador, recordando que el valor ini- cial que se encuentra dentro del regis- tro contador es el valor máximo de eventos. El decremento que se realiza en el registro contador puede ser de unidad en unidad conforme se vayan ejecutando los eventos uno a uno. Por lo tanto, cuando se realice el último evento, el valor que debe encontrarse alojado en el registro contador es igual a 0 (cero). El decremento puede ser de unidad en unidad, o un valor di- ferente de 1 lo que da origen el em- pleo de las instrucciones “decf” o “subwf” respectivamente. En la tabla 13 se muestran 2 pro- gramas que tienen implementados un contador descendente cada uno, de los cuales la diferencia radica en que en un programa el decremento se rea- liza mediante una instrucción que de- crementa unidad por unidad (decf), mientras que en el segundo programa el decremento se realiza mediante una instrucción de resta (subwf), en la cual se puede definir el valor del de- cremento, mediante un dato que se guarda previamente en el registro de trabajo W. 17 Tabla 13. Ejemplos de programa para un contador descendente.
  • 21.
    Diseño de unRetardo Básico por Bucles Una de las aplicaciones que se re- quiere implementar para controlar el tiempo de un proceso es una rutina a base de un contador en el cual se to- ma en consideración el tiempo que emplea una instrucción en ejecutarse. La implementación de un retardo por bucles (también llamado tempori- zador) toma como base la estructura de un contador, por lo que en primera instancia se tiene que definir el tipo de contador que será empleado. Normal- mente se trata de utilizar contadores descendentes, porque es más fácil definir un valor inicial a partir del cual se tendrá que ir decrementando hasta llegar a cero. En la figura 6 se ilustra el diagrama de flujo de un contador descendente, a través del cual está implementado el retardo. La diferencia entre un temporiza- dor y un contador es que el evento que controla el temporizador se en- cuentra relacionado con la función de decrementar el dato del registro que se emplea para contabilizar el tiempo que está transcurriendo. La tempori- zación se termina en el momento que el registro decrementado llega a cero. A partir del diagrama de flujo de la figura 6, se obtiene el código que co- rresponde con el programa de un tem- porizador, el cual a su vez se muestra en la tabla 14. Las líneas del progra- ma que se encuentran relacionadas de manera directa con la función del temporizador son las que se muestran en la tabla 14. Del fragmento de programa mos- trado en la tabla 14, se observa que un registro llamado “contador” es el que mantiene el control de la tempori- zación, ya que en el programa este re- gistro va decrementando su valor, mientras se ejecutan las instrucciones que conforman al código del tempori- zador. Se observa también que el da- to que se encuentra alojado en el re- gistro “contador”, se decrementará hasta que llegue a cero. Cuando el va- lor del registro “contador” llegue a ce- ro la temporización habrá terminado. Mientras esto sucede, el microcontro- lador se quedará cautivo realizando la actividad de controlar al temporizador. Hemos observado que la ejecu- ción del programa que se encuentra en la tabla 14 controla el tiempo de un temporizador, pero la pregunta natural que surge a continuación es: ¿De qué manera podemos controlar el tiempo en un programa temporizador? La respuesta es la siguiente, si echamos un vistazo al listado de instrucciones del microcontrolador PIC, encontrare- mos que la ejecución de las instruc- ciones (cualquiera que sea) tienen im- plícito el consumo de un tiempo, que es el que se tarda la instrucción en lle- varse a cabo (ejecutarse). Para deter- minar el tiempo que tarda una instruc- ción en ejecutarse, se hace referencia a un término que nos auxilia en la de- terminación de dicho tiempo. El térmi- no es el denominado “ciclo de instruc- ción” o simplemente “ciclo”. Este ciclo a su vez se encuentra relacionado con la frecuencia a la cual se ejecutan las instrucciones en el microcontrolador, recordando que se debe disponer de un circuito oscilador el microcontrola- dor. En el listado de instrucciones de los microcontroladores PIC se indica la cantidad de ciclos que consume la ejecución de cada una de las instruc- ciones que componen al listado. Los ciclos de instrucción, o ciclos en un microcontrolador PIC, equivalen a la cuarta parte de la frecuencia que proporciona el circuito oscilador. 18 Figura 6. Diagrama de flujo de un retardo. Tabla 14. Estructura básica de un temporizador.
  • 22.
    En la tabla15 se muestra el pro- grama que controla a un temporiza- dor. En él se observa de acuerdo con el listado de instrucciones de un mi- crocontrolador PIC, la cantidad de ci- clos que consume cada una de las instrucciones que conforman al pro- grama del temporizador. Teniéndose en cuenta que casi todas las instruc- ciones requieren de un solo ciclo para que la instrucción se ejecute comple- tamente, en algunos casos las ins- trucciones requieren 2 ciclos para que éstas sean ejecutadas, y en otros casos especiales, tal como es la ins- trucción “decfsz”, requieren ya sea de 1 ó 2 ciclos, a continuación se explica la manera en que trabaja la instruc- ción y dependiendo de la situación la cantidad de ciclos que consu- me. La instrucción “decfsz” lle- va a cabo el decremento del valor de un registro, y mien- tras no llegue a cero el valor del registro decrementado, se ejecuta la instrucción que se encuentra expresada debajo de decfsz, consumiendo esta actividad 1 ciclo. Pero si al ejecutar la instrucción decfsz el valor del registro decre- mentado alcanzó el valor de cero, se provoca un salto. Por lo tanto, el mi- crocontrolador omitirá la ejecución de la instrucción siguiente, pasando a la que se encuentra en segundo término después de decfsz, teniéndose en es- ta actividad el consumo de 2 ciclos. En la tabla 15 se muestran las cantidades de ciclos que consumen cada una de las instrucciones de un temporizador. Por lo tanto, en princi- pio con estos datos se deben contabi- lizar la cantidad total de ciclos, que fueron consumidos desde que se da inicio con la rutina de temporización, hasta que el valor del registro conta- dor llega a cero. Para ello refiérase a la tabla 16, en donde se muestra de- talladamente la manera en que se lle- va a cabo el conteo de los ciclos tota- les. El ejemplo mostrado en la tabla 16 nos indica que en el paso 1 las 2 pri- meras instrucciones que son ejecuta- das, cargan en el registro “contador” el valor 02h. Por lo tanto, ya se tiene el valor en el registro que se encarga- rá de controlar al temporizador; como paso siguiente se tiene la instrucción “decfsz contador,1” que al ejecutarse decrementa el valor del registro conta- dor a la vez guarda el resultado en el mismo registro; se tiene que recordar que el valor inicial del registro “conta- dor” es 02h, por lo que después de ejecutar la instrucción, el valor que ahora se encontrará en el registro contador será el de 01h; como el re- sultado en el registro conta- dor no fue cero, la ejecución de la instrucción “decfsz contador,1” será de 1 ciclo; posteriormente se lleva a cabo la ejecución de “goto bucle”, esta instrucción con- sume 2 ciclos, y provoca que se lleve a cabo un salto al lugar donde se encuentra la etiqueta bucle, preparan- do una nueva secuencia en el control del temporizador; 19 Tabla 16. Ejecución del programa temporizador. Tabla 15. Cantidad de ciclos que consumen las instruc - ciones de un temporizador.
  • 23.
    de manera acumuladaen esta etapa se tiene un total de 3 ciclos. En el paso 2 del programa de la tabla 16, las instrucciones son ejecu- tadas a partir de la ubicación de la eti- queta bucle, por lo que a continuación toca el turno nuevamente de la ins- trucción “decfsz contador,1”, que al ser procesada proporcionará como re- sultado el decremento del valor del re- gistro “contador”, que al inicio del pa- so 2 se encontraba con un valor igual a 01h, y después de ejecutar la ins- trucción del decremento, el valor que se encontrará en el registro “conta- dor” será igual que cero, trayendo co- mo consecuencia que en el paso 2 la instrucción decfsz consuma 2 ciclos, además de que la instrucción “goto bucle” no será ejecutada, pasando a la instrucción que continúa después de goto, dando por terminado el pro- ceso del temporizador; el paso 2 pro- porciona un total de 2 ciclos. La suma de los ciclos totales del paso 1 con los del paso 2, dan un to- tal de 5 ciclos que son los que se con- sumen en el temporizador. Observe la tabla 16. Para determinar el tiempo que se consumió con la ejecución de los 5 ciclos del programa temporiza- dor, se debe calcular el tiempo que consume cada ciclo de manera inde- pendiente. Para ello nos basaremos en las relaciones que son mostradas en la tabla 17. Del cálculo que se ha mostrado en la tabla 17 se observa que el tiempo resultante es muy pequeño. Por lo tanto, si lo que se requiere es imple- mentar un temporizador para un valor de tiempo más amplio, se tiene que 20 Tabla 18. Tiempo base para un temporizador de 0.5mseg Tabla 17. Relaciones matemáticas para calcular el tiempo.
  • 24.
    colocar un valormás grande al regis- tro “contador”, para que a su vez el número de ciclos se incremente, tal como se ilustra en el programa de la tabla 18. En el programa mostrado en la fi- gura 18, se observa que las 2 prime- ras instrucciones del paso 1 se em- plean para cargar el valor 16610 en el 21 Tabla 19. Ejemplos con distintos valores de temporización. Tabla 20. Programa con un temporizador de 1 segundo.
  • 25.
    registro “contador”. Porotra parte, mientras el valor del registro contador sea mayor que cero, cada vez que es decrementado el valor del registro “contador” mediante la instrucción decfsz, ésta consume 1 ciclo, más los 2 ciclos que aporta la instrucción goto. Esto último significa que los 3 ciclos resultantes se repetirán 165 veces, porque el dato que está guardado en el registro “contador” se estará decre- mentando unidad por unidad, comen- zando por valor de 16610 hasta llegar a 110. En la tabla 18 se muestra en la parte correspondiente al paso 1 la cantidad de ciclos que se acumulan mientras en valor en el registro “conta- dor” es mayor que cero. Para acceder al paso 2 en el pro- grama de la tabla 18, el valor en el re- gistro “contador” debe ser cero, por lo que se tendrá que la ejecución de la instrucción decfsz es de 2 ciclos. El to- tal de ciclos se obtiene de la suma de los generados en el paso 1 y en el pa- so 2, dando un total de 497 ciclos. Para calcular el tiempo en el que se ejecutan los 497 ciclos, se hace re- ferencia a las relaciones matemáticas de la tabla 17, por lo que supongamos que se tiene un oscilador de 4MHz, con el que nos arrojará un término de 1 µseg, para cada ciclo que es ejecu- tado, por lo tanto, los 497 ciclos son ejecutados en 497 µseg, que a su vez es un valor muy cercano a 500 µseg, que también puede interpretarse co- mo 0.5 mseg. El tiempo de 0.5 mseg lo podemos tomar como base para a partir de este valor generar temporiza- dores más grandes, tal como se muestra en los ejemplos de la tabla 19. En los ejemplos mostrados en la tabla 19 se muestra que se puede rea- lizar un conteo largo de tiempo, y pa- ra ello basta con generar una estruc- tura de contadores descendentes ani- dados unos en otros, esto es, en el momento que un contador ha llegado a cero el valor de un registro, se pro- cede a decrementar el valor de otro registro, y así sucesivamente, hasta que todos los registros involucrados son decrementados totalmente, gene- rando bases de tiempo como las mos- tradas en los ejemplos ilustrados en la tabla 19. Por último, se recomienda que pa- ra implementar una rutina con tempo- rizador dentro de un programa, se realice por medio de la invocación de una subrutina, para que cuando ésta agote el tiempo que ha sido estableci- do mediante el cálculo correspondien- te, el programa continúe con la se- cuencia normal en cuanto a la ejecu- ción de las instrucciones, y cuando nuevamente requiera ser empleada la rutina del temporizador, nuevamente sea llamada mediante un servicio de subrutina. En la tabla 20 se muestra el pro- grama que emplea una rutina con un temporizador de 1 segundo, que es llamado mediante una subrutina cada vez que se manipula el bit 2 del puer- to B. El temporizador es empleado pa- ra mostrar el cambio que se manifies- ta en el bit 1 del puerto A. Cabe recor- dar que cada vez que es empleada la rutina temporizadora, el microcontro- lador dedica toda su atención a la eje- cución del temporizador, olvidándose durante ese período de tiempo de las demás actividades a las que tiene que controlar. Suma Aritmética La realización de operaciones arit- méticas básicas es un factor muy im- portante en el desarrollo del código de un programa para un proyecto que emplea algún microcontrolador, moti- vo por el cual en primera instancia co- menzaremos con la operación de la suma aritmética, y para ello recorda- remos la manera en cómo aprendi- mos a realizarla en nuestros estudios primarios, ya que para efectos de pro- gramación en un microcontrolador se hace de la misma manera. Para comprender la forma en que se hacen las sumas en un microcon- trolador, vamos a realizar un ejemplo con números decimales, tal como se ilustra en la tabla 21. Del ejemplo 1 mostrado en la tabla 21, se observa la suma de 2 números cuya magnitud es de un dígito respec- tivamente (2 + 3), el resultado de la suma se expresa de igual manera me- diante un solo digito (5). Por lo tanto se asume que al “caber” el resultado en un digito, el acarreo que se generó en la suma es igual a cero. Ahora ob- servemos el ejemplo 2 de la misma ta- bla 21, en donde de nuevo se realiza una suma de 2 números con magnitud de 1 dígito en cada uno de ellos (5 + 6), el resultado en esta oportunidad es un número que ocupa 2 dígitos (11). Por lo tanto, el resultado no se puede expresar en un solo digito ya que no cabe. Para este caso el resultado final se descompone generando un resul- tado de un dígito (el valor 1) y un aca- rreo (el valor decimal 1), para que se le dé continuidad al número de dígitos que se está empleando. De la misma manera en que se realiza una suma aritmética con nú- meros decimales, se aplica el mismo procedimiento para números binarios que son con los que trabaja el micro- controlador. Por lo tanto, se debe to- mar en cuenta la cantidad de bits que componen a los números binarios que serán operados, ya que de acuerdo a las cantidades que se sumen se pue- 22 Tabla 21. Ejemplos de una suma aritmética con números decimales.
  • 26.
    den generar acarreos,los mismos que deben tomarse en cuenta para obte- ner un resultado real. De otra manera sería erróneo el resultado. En los ejemplos expresados en la tabla 22 se muestran las sumas de números binarios compuestos por 8 bits cada uno de ellos, y en cada una de las operaciones se van sumando los números bit a bit, de tal suerte que el resultado al que se llega en el ejem- plo 1 el acarreo es igual a cero, lo que significa que el resultado se puede ex- presar mediante 8 bits. Por otra parte, el resultado que se muestra en el ejemplo 2 requiere de un bit de más, ya que el resultado prácticamente no puede expresarse mediante 8 bits, porque se perdería el dato final. Para que el resultado de la suma pueda considerarse como un número com- pleto, a los 8 bits, se les tiene que agregar un bit más que recibe el nom- bre de bit de acarreo. Para realizar la suma de 2 núme- ros binarios de 8 bits en un microcon- trolador PIC, se puede emplear una de dos instrucciones de acuerdo a la forma en que se requieran aplicar. Las instrucciones de suma con las que cuentan los microcontroladores PIC se describen a continuación: a) addlw k.- Suma el dato que se encuentra en el registro de trabajo W con el de un valor literal dejando el resultado en el registro de trabajo W, modificando su valor con respecto del que tenia ante- riormente. El dato del registro de tra- bajo W como el del valor literal son de 8 bits. b) addwf f,d.- Suma el dato que se encuentra en el registro de trabajo W con el valor de un registro f (registro de memoria RAM) dejando el resultado de la suma ya sea en el registro de trabajo W o en el registro f, dependiendo del valor que adquiera d (para una mejor refe- rencia consulte el capítulo “instruccio- nes orientadas al control de registros” e “instrucciones orientadas al control de literales”, ambos temas pertene- cientes al módulo I). Cabe aclarar que siempre que se requiera sumar el dato de 2 registros de memoria RAM, en un microcontro- lador PIC se tiene que hacer median- te la carga previa del valor de uno de los registros a W, ya que en un micro- controlador PIC no existe una instruc- ción que realice la suma de valores entre 2 registros de memoria RAM de manera directa. A continuación procederemos a explicar la manera en que se realiza la suma aritmética de dos valores de 8 bits con un microcontrolador PIC, tal como se ilustra en el bloque del dia- grama de flujo de la figura 7, en don- de se tiene que sumar el dato del re- gistro var1 con el dato del registro var2 y el resultado de la suma alojarlo en el registro var3. Para ello en prime- ra instancia se tiene que enviar el da- to de cualquiera de los registros que se van a sumar al registro de trabajo W, para posteriormente sumar el dato del registro W con el dato del registro restante, tal como se ilustra en el frag- mento de código expresado en la ta- bla 23. El fragmento de código mostrado en la tabla 23 es el correspondiente al de una suma entre registros de 8 bits, pero si el resultado de la suma produ- ce un acarreo, significa que el dato re- sultante de la suma fue mayor a 8 bits. Por lo tanto, se debe de tomar en cuenta el bit de acarreo tal como se ilustra en el diagrama de flujo de la fi- gura. Después de realizar la suma que se ilustra en el diagrama de flujo de la figura 8, se tiene que revisar el estado que se generó en el bit que in- dica la formación de un acarreo cuan- do se aplicó la operación de la suma. El bit de acarreo se encuentra ubica- do dentro del registro “status”, por lo que el bit de acarreo es una bandera 23 Tabla 22. Ejemplos de una suma aritmética con números binarios. Figura 7. Suma de 2 registros de 8 bits. Figura 8. Diagrama de flujo de una suma de registros de 8 bits. Tabla 23. Suma de 2 registros.
  • 27.
    que indica cualquierade los siguien- tes estados: • Si el bit de acarreo “C” es igual a 0 ,significa que el resultado de una su - ma es igual o menor a los 8 bits de los registros a sumarse. • Si el bit de acarreo “C” es igual a 1, significa que el resultado de una su - ma es mayor de los 8 bits de los regis - tros a sumarse. El bit de acarreo debe tomarse en cuenta, ya que si el resultado sólo es expresado mediante los 8 bits, el re- sultado final no será correcto. Es por ello que si al verificar el bit de acarreo éste tiene un 1 lógico, se tiene que guardar el bit que rebasa a los 8 para que se tenga un resultado correcto, por lo que ahora el resultado será ex- presado por 2 registros de 8 bits en lu- gar de solo uno. En el diagrama de flujo de la figura 8, el registro donde se van acumulado los bits de acarreo está identificado como registro de “acarreo”. En el código expresado en la tabla 24 se muestra el programa co- rrespondiente a la suma del diagrama de flujo de la figura 8. Por otra parte, para realizar sumas con datos de registros de más de 8 bits, implica que debemos armar da- tos con más de un registro. Por ejem- plo, para realizar sumas con datos de 16 bits se necesita el espacio de 2 re- gistros. Para ello se debe tomar en cuenta el orden de cada uno de los bits que componen a los datos, sobre todo para determinar el peso específi- co de cada uno de los registros, que en esta oportunidad al tratarse de un dato de 16 bits, uno de los registros será considerado como el byte menos significativo, y el segundo registro co- mo el byte más significativo. En la figura 9 se ilustra la necesi- dad de realizar una suma aritmética entre 2 datos compuestos por 16 bits cada uno, por lo que tendremos que recurrir a lo expresado en la tabla 25, en donde se muestra la manera de có- mo deben ordenarse los registros de 8 bits, que están involucrados con la operación de datos de 16 bits y que pertenecen a los sumandos. Los datos identificados como “oper1”, “oper2” y “oper3” se encuen- tran conformados por 2 registros de 8 bits cada uno de ellos. Dichos regis- tros deben de ser operados en el or- den que aparecen en la tabla 25, por- que cada uno de los registros contie- ne un peso específico. El resultado de la operación de la suma se guarda en los registros que para tal efecto fueron 24 Tabla 24. Programa que suma 2 registros de 8 bits. Tabla 25. Estructura de una suma con datos de 16 bits. Figura 9. Suma entre 2 datos de 16 bits.
  • 28.
    contemplados, tomando encuenta el valor del posible acarreo. Para iniciar la adición de datos de 16 bits, primero se suman entre sí los registros de menor peso de cada ope- rando, identificados como “reg2” y “reg4”. El resultado de la suma se alo- ja en el registro “reg6”. Además al re- sultado de esta primera suma se veri- fica si se originó un acarreo. Si fue así, este acarreo se tiene que adicio- nar al registro de mayor peso (“reg1”) del primer operando. En el diagrama de flujo de la figura 10 se ilustra una suma de 2 operandos de 16 bits. Posteriormente se realiza la adi- ción de los registros de mayor peso de cada uno de los operandos (tomando en cuenta el acarreo, si es que lo hu- bo, en la suma de los registros de me- nor peso de los operandos). El resul- tado de esta segunda suma se guarda en el registro “reg5”. Por último, para que el resultado final de la suma sea correcto, debe contemplarse además de los registros donde se colocará el resultado (reg5 y reg6), un registro más para que ahí se aloje el acarreo que se origine con la segunda adición entre los registros de mayor peso de los operandos. De otra manera, si existiera un acarreo y no se tomara en cuenta, el resultado total de la suma sería completamente erró- neo. En la tabla 26 se muestra el có- digo para un programa en donde se suman 2 datos de 16 bits. Cuando sea necesario realizar su- mas con operandos de más de 8 bits, el procedimiento para realizarlas es tal como el ilustrado en la tabla 25, to- mando en cuenta que la suma total se va realizando por medio de registros de 8 bits, por lo que podemos hacer sumas con datos de 16, 24, 32, …. Bits. En todas las sumas se debe to- mar en cuanta el acarreo que se va generando cada vez que se van su- mando registros de 8 bits. En los códigos de los programas que se han ilustrado, se ha empleado 25 Figura 10. Diagrama de flujo de una suma entre datos de 16 bits. Tabla 26. Programa que suma 2 datos registros de 16 bits.
  • 29.
    un microcontrolador PIC16F628A,pe- ro puede emplearse cualquier micro- controlador, ya que el código de las sumas no cambia. Resta Aritmética La resta es una de las operacio- nes aritméticas que pueden realizarse con un microcontrolador PIC, siendo esta operación muy útil para aplicacio- nes que tengan que desarrollarse, co- mo lo son por ejemplo para una fun- ción con un convertidor analógico - di- gital. En la tabla 27 se muestra una operación de resta típica con números decimales. En un microcontrolador PIC la operación de la resta se realiza por medio de una instrucción que a su vez recurre al método de restas por complemento a 2. En la tabla 28 se ilustra un ejemplo de resta que utiliza complemento a 2 para realizar la ope- ración. Una resta por complemento a 2 se realiza a través de sumas, las cuales en primer término tiene que comple- mentarse el operando llamado sus- traendo tal como se ilustra en la tabla 28. Para complementar al sustraendo se efectúa la acción de cambiar los unos (1's) por ceros (0's) y los ceros por unos. Posteriormente al comple- mento se le adiciona una unidad, dan- do como resultado el complemento a 2 del operando sustraendo. El sus- traendo (complementado a 2) se su- ma al minuendo obteniendo como re- sultado el de la resta del minuendo menos el sustraendo. Todo el procedimiento de la resta por complemento a 2 la tiene imple- mentada el microcontrolador PIC a través de 2 instrucciones que efec- túan el mismo procedimiento. Las ins- trucciones de resta se describen a continuación: a) sublw k.- Resta el dato que se encuentra en el registro de trabajo W con el de un valor literal dejando el resultado en el registro de trabajo W, modificando su valor con respecto del que tenia ante- riormente. El dato del registro de tra- bajo W como el del valor literal son de 8 bits. b) subwf f,d.- Resta el dato que se encuentra en el registro de trabajo W al del valor de un registro f (registro de memoria RAM) dejando el resultado de la suma ya sea en el registro de trabajo W o en el registro f, dependiendo del valor que adquiera d (para una mejor refe- rencia consulte el capítulo “instruccio- nes orientadas al control de registros” e “instrucciones orientadas al control de literales”, ambos temas pertene- cientes al módulo I). Las instrucciones “sublw” y “subwf” emplean el método de restas por complemento a 2, además de que ambas instrucciones operan 2 datos de 8 bits cada una. En cualquier mi- crocontrolador al ejecutar las instruc- ciones de restas, el resultado debe in- dicarse ya sea que se obtenga un va- lor positivo o uno negativo. Para el ca- so de los microcontroladores PIC los números negativos y positivos se indi- can a través de la bandera del acarreo que se encuentra dentro del registro status. Cuando la bandera del acarreo se coloca en 1 lógico después de rea- 26 Tabla 27. Ejemplos de una suma aritmética con números decimales. Tabla 28. Realización de una resta por complemento a 2. Tabla 29. Resta con resultado negativo.
  • 30.
    lizar una resta,significa que el resulta- do de la resta es positivo, y por el con- trario, cuando la bandera de acarreo se coloca en 0 lógico después de rea- lizar una resta, significa que el resulta- do de la resta fue negativo, y por lo tanto, el dato que se obtuvo tiene que complementarse a 2 para obtener la magnitud correcta, pero con el conoci- miento de que el valor fue negativo, tal como se ilustra en la tabla 29. Las restas que se realizan directa- mente con las instrucciones que con- tienen los microcontroladores PIC, se pueden operar con datos de 8 bits, re- cordando que la resta entre sí de 2 re- gistros de memoria RAM, no puede realizarse de manera directa, por lo que es necesario cargar uno de los datos al registro W, y después aplicar la instrucción de la resta necesaria. A manera de ejemplo se muestra una sustracción en el fragmento de diagra- ma de flujo de la figura 11. Para emplear adecuadamente las instrucciones de resta de un micro- controlador PIC y de acuerdo con la fi- gura 11, el dato del primer registro que debe cargarse al registro de trabajo W, es el que se encuentra identificado como var2, para posteriormente em- plear la instrucción subwf, guardando el resultado de la resta en el registro de trabajo W, y por último en un si- guiente paso enviar el dato de W al re- gistro var3. El código correspondiente a la descripción que se acaba de rea- lizar se expresa por medio del frag- mento del programa que se ilustra en la tabla 30. En la tabla 30 se muestra un frag- mento de código para realizar una resta entre 2 datos de 8 bits, en el cual no se toma en cuenta el posible resul- tado negativo o positivo, motivo por el cual, para que el dato que se obtenga de la resta este sea correcto y con la debida interpretación, se tiene que realizar el procedimiento que se muestra en el diagrama de flujo de la figura 12, en el cual se toma en cuen- ta si el resultado de la sustracción fue negativo o positivo, mediante la com- paración del bit que indica el estado de la bandera del acarreo del registro “status”. El bit de la bandera del aca- rreo nos indica si un resultado fue po- sitivo o negativo, después de haber ejecutado una instrucción de una res- ta de acuerdo a lo siguiente: a) Si el bit de la bandera del aca - rreo (c) del registro status es igual a 0 (cero), el resultado de la resta fue ne - gativo. b) Si el bit de la bandera del aca - rreo (c) del registro status es igual a 1 (uno), el resultado de la resta fue po - sitivo. Por lo tanto, si el resultado de la resta fue positivo, no se tiene que rea- lizar actividad alguna sobre el registro donde se encuentra el resultado de la sustracción, mientras que por otra parte, si la resta presentó un resultado negativo, entonces en el registro don- de se guardó el dato resultante de la sustracción contiene un valor complementado, por lo que a continua- ción se tiene que reali- zar el procedimiento de complementar a 2 di- cho resultado negativo para obtener la magni- tud del valor de la res- ta, y aparte en otro re- gistro activar un valor que indique que el re- sultado fue negativo (para el caso del dia- grama de flujo de la fi- gura 12, el registro se llama “negativo”). En la tabla 31 se encuentra el código del programa de una resta de 2 registros cuyos datos son de 8 bits ca- da uno. En el programa se encuentran definidos los registros que se están empleando para realizar la sustrac- ción, además de la correspondiente parte donde se realiza la verificación del bit que funciona como bandera del acarreo, para determinar si el resulta- do de la resta fue negativo o positivo. En el código del programa se mues- tran todas las instrucciones relaciona- das con la resta, pero para una aplica- ción completa se debe de cambiar el renglón que dice “siguiente proceso”, por las instrucciones de la parte que tenga que continuar después de ha- 27 Figura 11. Resta de 2 registros de 8 bits. Tabla 30. Resta de 2 registros. Figura 12. Diagrama de flujo de una resta de re - gistros de 8 bits.
  • 31.
    ber realizado laoperación de la sus- tracción, pero para un empleo directo para practicar con el programa, tan solo cambie el renglón “siguiente pro- ceso” por el de un “goto inicio” y tam- bién se tienen que eliminar los puntos suspensivos. Ahora procederemos a explicar el proceso que tiene que seguirse cuan- do se requiere realizar una resta con datos de más de 8 bits, como es el ca- so de una resta con datos de 16 bits, en la cual se debe de tener una meto- dología apropiada para que se obten- ga como resultado final una magnitud además de un indicativo de que el re- sultado fuese positivo o negativo. Pa- ra realizar las restas de 16 bits se tie- nen que reservar dos registros de 8 bits, para cada uno de los operandos que pertenecerán a la sustracción, por lo que cada operando tendrá que aco- modarse de acuerdo con el peso es- pecífico de cada uno de los bits que lo componen. En la tabla 32 se ilustra la estructura de una resta con datos de 16 bits. De la tabla 32 observamos que los operandos se encuentran con- formados de la siguiente manera; el operador minuendo identificado como oper1 está integrado por los registros reg1 y reg2, de los cuales el que tiene el menor peso es el reg2; por lo tanto el de mayor peso es reg1. El operador sustraendo se encuentra identificado como oper2, y se encuentra compues- to por los registros reg3 y reg4, de los cuales el que tiene el menor peso es el reg4, y el registro de mayor peso es el reg3. El resultado de la sustracción se guardará en el operando identifica- do como oper3, el cual se encuentra integrado por los registros reg5 y reg6, de los cuales el de menor peso es el reg6, mientras que el de mayor peso es el registro reg5. Cabe aclarar que los operandos oper1, oper2 y oper3, sólo se conside- ran como una convención para consi- derar que se trata de datos de 16 bits. Por lo tanto, estos operandos no exis- ten en el código del programa, pero sí los registros que los conforman, y por lo tanto, los operandos se encuentran representados por los registros que los integran. En la figura 13 se mues- tra la operación de una resta aritméti- ca con datos de 16 bits, la cual es el reflejo de la operación realizada en la tabla 32. Para comenzar con la resta de da- tos de 16 bits, primero se sustraen en- tre si los registros de menor peso de cada operando (minuendo menos el sustraendo), dichos registros se iden- tifican como “reg2” y “reg4”. El resulta- do de la resta se aloja en el registro “reg6”, por otra parte, al resultado de esta primera resta se verifica si se ori- 28 Tabla 31. Programa que resta 2 registros de 8 bits. Tabla 32. Estructura de una resta con datos de 16 bits. Figura 13 Resta de 2 datos de 16 bits.
  • 32.
    ginó un acarreo(recordando que de esta manera se sabe si el resultado fue negativo o positivo). Sí fue origina- do un acarreo con un 1 lógico en la respectiva bandera del registro status, significa que el resultado parcial fue positivo procediendo a realizar la si- guiente resta entre registros de mayor peso sin ninguna operación adicional. Pero si en la bandera del acarreo se originó un 0 lógico, significa que el re- sultado parcial fue negativo, por lo que se le tiene que restar una unidad al registro de mayor peso del opera- dor minuendo, en este caso el decre- mento de una unidad se le tiene que aplicar al registro reg1, y después se procede a realizar la sustracción de los registros de mayor peso del mi- nuendo y sustraendo, en el diagrama de flujo de la figura 14 se ilustra la res- ta de 2 operandos de 16 bits. Por último, se realiza la sustrac- ción de los registros de mayor peso de cada uno de los operandos identifica- dos como minuendo y sustraendo (to- mando en cuenta el acarreo, si es que lo hubo, en la resta de los registros de menor peso de los operandos), el re- sultado de esta segunda resta se guarda en el registro “reg5”. Basándonos en el diagrama de flujo de la figura 14, posterior al haber encontrado el resultado completo de la resta, y después de la determina- ción de que el resultado fue negativo, existe un bloque que dice “comple- mentar a 2 el dato completo de re- g5,reg6”, se refiere a encontrar la magnitud del resultado final, y para ello realizaremos la actividad que se describe a continuación. Para realizar el complemento a 2 de un número de 16 bits se sigue el mismo procedimiento que se emplea para un número de 8 bits, por lo tanto en primer instancia se tienen que sus- tituir los 1's por 0's y los 0's por 1's, para posteriormente sumarle una uni- dad al registro de 8 bits que compone la parte baja del dato de 16 bits, se debe de tomar en cuenta que al sumar la unidad se puede generar un aca- rreo que puede afec- tar al registro de 8 bits que conforma la parte alta de los 16 bits (recurra al capi- tulo de la suma arit- mética que se en- cuentra antes del ca- pítulo presente), en la tabla 33 se mues- tra un ejemplo en donde se realiza una resta de 2 datos de 16 bits, siendo el re- sultado final negati- vo, y la aplicación del complemento a 2 del resultado final, para obtener la magnitud de la resta. Por último en cuanto a las restas de datos de 16 bits, en la tabla 34 se muestra el código del programa correspon- diente, en el se en- cuentran identifica- das por medio de co- mentarios todas las partes que confor- man al diagrama de 29 Tabla 33. Complemento a 2 de un resultado negativo en una resta de datos de 16 bits. Figura 14. Diagrama de flujo de una resta de datos de 16 bits.
  • 33.
    flujo de lafigura 14. 0000-+. El códi- go del programa que se encuentra ex- presado en la tabla 34, esta completo en cuanto a la operación de la resta de números de 16 bits, pero para car- garlo en un microcontrolador PIC, se recomienda cambiar el renglón que tiene la siguiente leyenda “siguiente proceso” así como los puntos, por el código que tenga que ejecutar el mi- crocontrolador, después de realizar la resta de 16 bits. Para terminar el presente capítulo diremos que el método para realizar restas de datos con más de 16 bits, es prácticamente el mismo que con 16 bits, ya que de requerir números más grandes, tan sólo se deben contem- plar todos los registros de 8 bits, que se requieran para conformar a los da- tos que intervendrán en la resta, ade- más de también contemplar al bit de acarreo para determinar si los resulta- dos parciales o el resultado final fue positivo o negativo. Multiplicación Aritmética La operación aritmética de la mul- tiplicación es necesaria cuando se re- quiere emplear herramientas que po- see un microcontrolador PIC, para realizar procesos de mediana o alta complejidad. En los microcontrolado- res PIC no existe una instrucción que de manera directa realice una multipli- cación de 2 números, como puede ha- cerla para las operaciones de las su- mas y las restas. Para implementar una multiplica- ción de 2 datos en un microcontrola- dor PIC, se tiene que hacer uso de la teoría de operación de una multiplica- ción, que se basa en una secuencia de sumas, las cuales deben de ser contabilizadas, por lo que en general se recurre al empleo tanto de las su- mas como de contadores. Vamos a explicar la manera en que se realiza una multiplicación por medio de una serie de sumas, para ello nos basaremos en el ejemplo mostrado en la tabla 35. Del ejemplo de la multiplicación mostrado en la tabla 35, observamos que para obtener un resultado se de- be de sumar sobre si mismo el valor expresado en el término multiplican- do, tantas veces como el valor ex- puesto en el operando multiplicador. De lo anterior deducimos que la operación de la multiplicación es un proceso derivado de las operaciones de sumas, por lo que se deben de contemplar todas las características del proceso de las sumas para obte- ner un resultado confiable, recordan- do que de acuerdo a la magnitud de los operandos se puede generar un acarreo, el cual debe alojarse o su- marse en el registro correspondiente. Con respecto al ó las localidades de memoria (registros) en donde se guardara el resultado de la multiplica- ción, debe de reservarse la cantidad exacta de estos para que el resultado no se vea truncado, o se tengan regis- tros desperdiciados sin utilizarse. Pa- ra calcular la cantidad de registros que se destinaran para el resultado, se debe conocer el tamaño en bits de los operandos (considerando que los registros cuentan con un tamaño de 8 bits cada uno), por lo tanto, el tamaño 30 Tabla 35. Ejemplo de una multiplicación aritmética. Tabla 34. Programa que resta 2 registros de 16 bits.
  • 34.
    del o losregistros estarán definidos también en bits. La manera de calcu- lar la cantidad de bits que se emplea- ran para el resultado, se basa en la simple suma de todos los bits que conforman tanto al término del multi- plicando como al del multiplicador; lo anterior se expresa de una manera mucho más simple a través de la si- guiente fórmula: (# de bits para el resultado) = (# de bits del multiplicando) + (# de bits del multiplicador) En donde el símbolo # significa número A continuación vamos a defi- nir por medio de un diagrama de flujo, el proceso para realizar una multipli- cación de dos datos que se encuen- tran conformados por 8 bits (1 registro cada uno), por lo que para alojar el re- sultado se necesita de un total de 16 bits (equivalente a 2 registros). En el diagrama de flujo de la figura 15 se ilustra el proceso que se sigue para la realización de una multiplicación de 2 operandos de 8 bits cada uno de ellos. Del diagrama de flujo de la figura 15 se observa que los registros identi- ficados como “res0” y “res1”, son lo que se encuentran destinados para alojar el resultado de la multiplicación, por lo tanto se debe definir el peso es- pecífico de cada unos ellos, quedando el registro res1 como el de mayor pe- so, mientras que el registro res0 es el de menor peso. En los registros identificados co- mo “multiplicando” y “multiplicador” se encuentran los datos que van a ser multiplicados. Por último el registro identificado como “contador” es el en- cargado de llevar el control del núme- ro de veces que se realiza la opera- ción de la suma. Los registros res0, res1 y contador deber inicializados con un valor igual a 0 (cero) al inicio de una operación de multiplicación. En el registro multiplicando se en- cuentra el dato que será sumado, tan- tas veces como lo indique el valor que se encuentra en el registro multiplica- dor. La serie de sumas se van reali- zando de acuerdo con el dato que se encuentra contenido dentro del regis- tro multiplicando, por lo que se man- tiene como un valor constante, siendo el registro res0 donde se va guardan- do el resultado de las sumas que se van efectuando. De a cuerdo con la cantidad de bits que conforman a los registros de los operandos que se están multipli- cando, se tiene contemplado que el resultado de la multiplicación se aloje en 16 bits o sea 2 registros, por lo tan- to, posterior a la suma del valor del multiplicando se tiene que verificar si el resultado genero un acarreo, por- que si es así, también tiene que incre- mentarse una unidad al valor del re- gistro resg1. Siempre después de realizar la su- ma del valor del multiplicando se in- crementa en una unidad el valor del registro contador, para poder controlar el número de veces que se ha efec- tuado la suma, por lo tanto, en segui- da que se incrementa el valor del re- gistro contador, se realiza una compa- ración entre el valor del registro conta- dor con el del registro multiplicador, cuando estos registros contengan el mismo valor, será hasta entonces cuando el proceso de la suma tenga que detenerse, ya que en ese mo- mento la multiplicación habrá termina- do, y en los registros res0 y res1 se tendrá el dato resultante. Para cualquier multiplicación se emplea el mismo procedimiento que 31 Figura 15 Diagrama de flujo de una multiplicación con datos de 8 bits. Tabla 36. Programa que multiplica 2 registros de 8 bits.
  • 35.
    se mostró enel diagrama de la figura 15, teniendo en cuenta el tamaño de los operandos, para determinar la cantidad de registros que tendrán que emplearse para guardar el resultado, y para ello se debe tomar en conside- ración el proceso que se aplica para la realización de las sumas. División Aritmética La operación aritmética de la divi- sión debe ser implementada por me- dio del uso de instrucciones que nada tienen que ver con una división, ya que en un microcontrolador PIC no existe una instrucción directa por me- dio de la cual se realice una división entre 2 datos. Un método para efectuar una divi- sión aritmética en un PIC es emplear una serie de restas, a través de las cuales se tendrá como resultado el correspondiente residuo que va gene- rando la división, mientras que a tra- vés del conteo del número de restas que tienen que hacerse, se obtiene el resultado final de una división. En la tabla 37 se muestra el ejemplo de una división aritmética, en la cual se recu- rre al concepto básico por medio del cual se realizan las divisiones. Cuando no existe una instrucción para realizar divisiones, tal como es el caso de un microcontrolador PIC, te- nemos que recurrir a un procedimien- to como el ilustrado en el ejemplo de la tabla 37, en el cual la operación bá- sica es una resta, por lo tanto, se tie- ne que aplicar dicha metodología para encontrar el resultado de la operación de la división. Para comenzar una di- visión por medio del empleo de restas, se toma el valor que se encuentra en el “dividendo”, al cual se le resta la magnitud que se localiza en el “divi- sor”, el resultado de la resta debe con- tener un valor mayor que el del divisor para que sea aplicada una nueva res- ta; mientras se van aplicando las res- tas, estas se van contabilizando. Cuando el resultado de la resta es menor que el valor del divisor, enton- ces el número de restas es igual al va- lor entero del “cociente” (resultado de la división), si el “residuo” (resultado de la última resta) obtuvo un valor igual con cero, entonces hemos termi- nado con la división, pero si el residuo tiene un valor diferente de cero pero menor que el del divisor, entonces se considera que se coloca un punto de- cimal en el cociente, por lo que se to- ma el valor que se encuentra en el re- siduo para multiplicarlo por 10 (equi- vale a bajar un cero, tal como se ilus- tra en el ejemplo de la tabla 37), pos- teriormente el resultado de la multipli- cación es asignado nuevamente al termino dividendo, para que se reanu- de la aplicación de las restas, toman- do el divisor como el valor que será restado al nuevo dividendo. Este pro- cedimiento se repetirá tantas veces como decimales se quieran obtener, solo que para encontrar el siguiente decimal, el residuo tendrá que multi- plicarse por 100, y después por 1000 y así sucesivamente. Lo importante para realizar una di- visión aritmética con un microcontrola- dor PIC, es considerar la cantidad de decimales que confor- maran al cociente, para destinar los registros que habrán de utilizarse para expresar el resultado de la división. Por otra par- te, el resultado de la divi- sión se expresara por medio de varios regis- tros, los cuales deben ser tomados en cuenta para interpretar de ma- 32 Tabla 37. Ejemplo de una división aritmética. Figura 16. Diagrama de flujo de una división.
  • 36.
    nera adecuada elresultado final de la división. En el diagrama de flujo de la figura 16 se ilustra el proceso para realizar una división aritmética, en la cual la operación principal es la resta entre los registros dividendo menos el divisor, guardando el resultado de la resta en mismo registro dividendo, por lo tanto, este dato se actualizara mientras se estén realizando las res- tas. Del proceso de la resta es impor- tante verificar el estado de la bandera del “acarreo” (C), recordando que es- ta bandera se encuentra dentro del re- gistro “status”. La importancia de la bandera radica en el hecho de saber si un resultado después de realizar una resta es igual con menor que el divisor (si el resultado de la resta, es menor que el divisor significa que ha terminado una fase de la división). Mientras el resultado de la resta sea mayor que el divisor, se contabilizan las restas que se vayan realizando, pasando este dato a ser parte del va- lor del cociente. Cuando en el resulta- do de la resta se identifica que el va- lor es menor que el del divisor, se pro- cede a reponer el valor que fue sus- traído durante la última resta, para posteriormente multiplicarlo por el va- lor de 10 (lo que equivale a bajar un cero en el proceso que realizamos de una división hecha a mano), y se repi- te nuevamente todo el desarrollo de realización de restas para obtener ahora la parte del cociente que se en- cuentra después del punto decimal. En la tabla 38 se muestra el código que corresponde al programa de una división, en el cual está identificada la parte en la que se realizan las restas para obtener el resultado entero del cociente. Por otra parte, también se muestra la ejecución del código que se refiere a la multiplicación para pos- teriormente continuar con las restas, y así obtener la parte decimal del co- ciente. La parte de la multiplicación se recomienda que se realice a través de una subrutina, para que no se dupli- que con una gran extensión el código. En el programa mostrado en la tabla 38 el código no se encuentra expresa- do por medio de subrutinas, por lo que tan sólo tiene que adecuarse el pro- grama para que pueda ser empleada la subrutina. ******* 33 Tabla 38. Programa que realiza divisiones.
  • 37.
    35 Las rutinas intermediasestán implementadas, mediante la activación de las distin - tas herramientas internas que posee el microcontrolador PIC, además de una serie de conjuntos de instrucciones, que de manera organizada realizan un trabajo mediante el cual, se auxilia el microcontrolador en las distintas tareas que tiene que desempeñar. En primer instancia se encuentran las funciones lógicas AND, OR, y XOR, median - te las cuales se pueden implementar “filtros” para discriminar o tomar en cuenta solo los bits que sean interesantes, dentro de un registro completo de 8 bits por ejemplo. Otra serie de operaciones lógicas que pueden ser desarrolladas en el microcontrola - dor PIC, son las que permiten comparar las magnitudes del valor de los datos almace - nados en registros de memoria RAM (memoria de datos), pudiendo realizar compara - ciones de IGUAL, MENOR QUE, MAYOR QUE, y a partir de estas comparaciones, ob - tener las complementarias que son: DIFERENTE, MAYOR O IGUAL, MENOR O IGUAL. Continuando con el exposición del capítulo, nos encontraremos con una rutina que nos permiten comunicar al microcontrolador con el exterior, para que este pueda “dia - logar” un operador, por medio de un teclado matricial, del cual se explica ampliamen - te la manera en que se conecta. Posteriormente, nos encontramos con la configura - ción de las interrupciones para poder activar los timers e implementar con estos una serie de rutinas de tiempo. También se explicara la manera en que se utiliza el módu - lo de comunicación serial RS-232, conocido como USART, y por último el empleo del convertidor ADC.
  • 38.
    36 Función Lógica AND ysus Aplicaciones Las funciones lógicas aportan una aplicación muy importante cuando se programan los microcontroladores, sobre todo cuando se efectúan tareas de control de procesos industriales, teniéndose en general la misión de generar “máscaras” para el filtrado de datos. Además también se utilizan pa- ra fijar un determinado valor en uno o varios de los bits de un registro (recor- dar que los registros son de 8 bits) sin alterar a los demás bits. Para implementar las funciones ló- gicas en los microcontroladores PIC, tan sólo se tiene que hacer uso de sus respectivas instrucciones, teniendo en cuenta las posibilidades existentes en cuanto a la manipulación de los datos, esto es, los diferentes tipos de ope- randos que pueden emplearse. La función lógica Y (AND en in- glés) tiene una aplicación como una máscara, dejando pasar los estados lógicos de los bits que nos interesan de un registro, co- locando los restantes bits en es- tado lógico “0”, independiente- mente del valor que tuvieran an- tes de realizar la operación. Para comprender la forma en que se aplica la función lógica AND, tenemos que hacer uso de su correspondiente tabla de ver- dad la cual se muestra en la ta- bla 39. En la tabla de verdad, se observan los diferentes valores que pueden adquirir los términos identificados como “Dato 1” y “Dato 2”, generándose en total 4 diferentes combinaciones de és- tos, teniendo como factor común que en cualquiera de los datos de ingreso que se tenga un “0” lógico, el resultado será “0” (ce- ro). Mientras que cuando ambos datos de entrada adquieren el valor de “1” lógico, el resultado será “1” (uno), siendo éste el mo- tivo del nombre que posee esta función lógica, ya que para gene- rar un “1” lógico se requiere que el Da- to 1 “Y” el Dato 2 se encuentren en estado lógico de “1”. Partiendo de la tabla de verdad de la función lógica AND, procederemos a explicar cómo se realiza la función lógica en un microcontrolador, y para ello vamos a desarrollar un ejemplo empleando registros de 8 bits, tal co- mo se ilustra en la tabla 40. Partiendo del ejemplo ilustrado en la tabla 40, se advierte que al ejecutar la función AND (&) entre los datos alo- jados en “Registro 1” y “Registro 2”, ésta se aplica bit a bit de acuerdo con su respectiva tabla de verdad. Por ejemplo, se tiene como dato un “1” ló- gico en el bit “b0” de ambos registros, arrojando el resultado de “1” lógico. Por otra parte, en el correspondiente bit “b1” se encuentra un “1” lógico en el registro 1 y un “0” lógico en el regis- tro 2, quedando como resultado un “0” lógico; y así sucesivamente se tienen que seguir realizando las operacio- nes, aplicando la función lógica AND tomando los correspondientes bits de los registros en cuestión. De acuerdo con el ejemplo ante- rior, podemos establecer un filtro de datos de acuerdo a los bits de un re- gistro que necesitamos operar, y re- gresando al ejemplo si consideramos al registro 2 como el filtro, podemos decir que en los bits donde se le fija- ron ceros lógicos, el resultado fue “0” lógico independientemente de los va- lores que tengan los bits del registro 1, mientras que si lo bits del filtro fue- ron establecidos como “1” lógico, el resultado depende del correspondien- te estado lógico del bit del registro 1. En el ejemplo de la operación mostrada en la tabla 41, se observa que en el registro identificado como “filtro” los bits que conforman al nible superior (bits b4, b5, b6 y b7) se en- cuentran fijos a “0” lógico, mientras que los bits que componen al ni- ble inferior del mismo registro “filtro” (bits b0, b1, b2 y b3), se aprecian en estado lógico de “1”. De lo analizado anterior- mente, se desprende que los datos que nos interesan se en- cuentran en los bits que confor- man al nible inferior, mientras que los del nible superior tienen que ser colocados a “0” lógico, debido a que no serán tomados en cuenta para el proceso si- guiente. Los bits contenidos en el nible inferior del registro “da- to”, son “filtrados” tal cual se en- cuentren, esto es, si se tiene un “1” lógico éste pasará como re- sultado, mientras que si el dato es un “0” lógico, éste también pasará como resultado. Cuando aplicamos la función ló- gica AND como filtro, el objetivo es dejar “pasar” el estado lógico del bit que nos interesa, pero también se puede tener otra vi- sión en cuanto a la ocupación para la misma función lógica AND, siendo ésta, la de fijar de Tabla 40. Ejemplo de aplicación entre 2 registros de la función lógica AND. Tabla 41. Aplicación de la función lógi - ca AND como filtro. Tabla 39. Tabla de verdad de la función lógica AND.
  • 39.
    manera predeterminada un“0” lógico en los bits donde sea necesario, per- mitiendo que en los demás bits se alo- je el estado lógico que tenía antes de la aplicación de la función lógica AND. Para una mejor comprensión observe el ejemplo de la tabla 41, en el cual se muestra que necesitamos que los bits del nible superior del registro dato pa- sen a ser “0´s” en el resultado, mien- tras que los datos contenidos en los bits del nible inferior del registro dato se trasladan de manera íntegra al re- sultado. Para ejecutar la función lógica AND entre 2 registros, en un micro- controlador PIC se pueden emplear una de dos instrucciones de acuerdo a la forma en cómo se requieran apli- car. Las instrucciones de la función ló- gica AND con las que cuentan los mi- crocontroladores PIC se describen a continuación: a) andlw k.- Función lógica AND del dato que se encuentra en el registro de trabajo W con el de un va- lor literal dejando el resultado en el re- gistro de trabajo W, modificando su valor con respecto del que tenía ante- riormente. El dato del registro de tra- bajo W como el del valor literal son de 8 bits. b) andwf f,d.- Función lógica AND del dato que se encuentra en el registro de trabajo W con el valor de un registro f (registro de memoria RAM) dejando el resultado de la fun- ción AND ya sea en el registro de tra- bajo W o en el registro f, dependiendo del valor que adquiera d (para una mejor referencia consulte el capítulo “instrucciones orientadas al control de registros” e “instrucciones orientadas al control de literales”, ambos temas pertenecientes al módulo I). Cabe aclarar que los microcontro- ladores PIC ejecutarán la operación entre registros compuestos por 8 bits, y siempre que se requiera aplicar la función lógica AND sobre 2 registros de memoria RAM, en un microcontro- lador PIC se tiene que hacer median- te la carga previa del valor de uno de los registros a W, ya que en un micro- controlador PIC no existe una instrucción que efec- túen la función lógica AND entre 2 registros de memo- ria RAM de forma directa. En la tabla 42 se muestra el código de un programa que a manera de ejemplo de- muestra la forma en que puede ser empleada la fun- ción lógica AND. Función Lógica OR y sus Aplicaciones La función lógica O (OR en inglés) también puede em- plearse para generar una máscara, solo que a dife- rencia de la función lógica AND, con la función lógica OR se fijan “0´s” lógicos, en el o los bits que nos intere- san de un registro, y por otra parte podremos filtrar los estados lógicos de los bits que nos interesan de un determinado registro, colocando los restantes bits en el estado lógico de “1”, independientemente del valor que tuvieran antes de realizar la operación de la 37 Tabla 42. Ejemplo de aplicación de la función lógica AND.
  • 40.
    función lógica OR.Para estar en posi- bilidades de concebir la forma en que se aplica la función lógica OR, tene- mos que recurrir al empleo uso de su correspondiente tabla de verdad la cual se ilustra en la tabla 43. En la ta- bla de verdad se observan los diferen- tes valores que pueden adquirir los términos identificados como “Entrada 1” y “Entrada 2”, generándose en total 4 diferentes combinaciones de éstas, teniéndose como factor común que en cualquiera de los valores de entrada que se tenga un “1” lógico, el resulta- do será “1” (uno). Mientras que cuan- do en ambas entradas se adquiera el valor de “0” lógico, el resultado será “0” (cero). El nombre de la función ló- gica se adquiere a partir de su opera- ción principal, la cual reportará un “1” lógico cuando en la Entrada 1 “O” en la Entrada 2 se fije el estado lógico de “1” (se trata de la función lógica O in- clusiva ó simplemente O). Tomando como punto de par- tida la tabla de verdad de la fun- ción lógica OR, pasaremos a ex- plicar la manera de como se rea- liza la ejecución de la función ló- gica en un microcontrolador, y para ello vamos a basarnos en el ejemplo que se ilustra en la tabla 44, en el cual se muestran 2 re- gistros cuya longitud es de 8 bits, y del cual cabe aclarar que si ha de emplearse la presente fun- ción lógica (inclusive la AND), para registros que contengan una mayor cantidad de bits, la función lógica tiene que irse apli- cando byte a byte (o sea a cada arreglo de 8 bits), hasta encon- trar el resultado final. A partir del ejemplo ilustrado en la tabla 44, nos percatamos que al ejecutar la función lógica OR ( | ) entre los datos alojados en “Registro 1” y “Registro 2”, és- ta se aplica bit a bit de acuerdo con su respectiva tabla de ver- dad, por ejemplo, se tiene como dato un “0” lógico en el bit “b0” de ambos registros, arrojando el re- sultado de “0” lógico. Además, en el correspondiente bit “b1” se encuentra un “0” lógico en el registro 1 y un “1” lógico en el registro 2, quedando co- mo resultado un “1” lógico; y así suce- sivamente se tienen que seguir apli- cando las operaciones, de la función lógica OR tomando los correspon- dientes bits de los registros en cues- tión. De acuerdo con el resultado obte- nido en el ejemplo mostrado en la ta- bla 44, podemos construir un filtro de datos de acuerdo con los bits de un registro que necesitemos operar, y nuevamente haciendo referencia al ejemplo anterior, si consideramos al registro 2 como el filtro, podemos de- cir que en los bits donde se le fijaron unos lógicos, el resultado fue “1” lógi- co independientemente de los corres- pondientes valores que tengan los bits del registro 1, mientras que si lo bits del filtro fueron establecidos como “0” lógico, el resultado dependerá del co- rrespondiente estado lógico del bit del registro 1. Para una mejor compren- sión de lo que se acaba de explicar, refiérase al ejemplo que se ilustra en la tabla 45, en la cual a la función lógi- ca OR se le está considerando como un filtro de datos, para que sea capaz de seleccionar a uno o más bits de un registro que contiene el dato con el que finalmente se trabajará. En el ejemplo de la operación mostrada en la tabla 45, se observa que en el registro identificado como “filtro” los bits que conforman al nible superior (bits b4, b5, b6 y b7) se en- cuentran fijos a “1” lógico, mientras que los bits que componen al nible in- ferior del mismo registro “filtro” (bits b0, b1, b2 y b3), se aprecian en esta- do lógico de “0”. De lo analizado ante- riormente se desprende que los datos que nos interesa filtrar se encuentran en los bits que conforman al nible in- ferior, mientras que los del ni- ble superior tienen que ser co- locados a “1” lógico, debido a que no serán tomados en cuenta para el proceso siguien- te. Los bits contenidos en el ni- ble inferior del registro “dato”, son “filtrados” tal cual se en- cuentren, esto es, si se tiene un “1” lógico éste pasará como resultado, mientras que si el dato es un “0” lógico, éste tam- bién pasará como resultado. Cuando se aplica la función ló- gica OR como filtro, el objetivo es dejar “pasar” el estado lógi- co del bit que nos interesa, pe- ro también se puede tener otra perspectiva en cuanto al em- pleo de la misma función lógi- ca OR, siendo hasta, la de fijar de manera predeterminada un “1” lógico en los bits donde sea necesario, permitiendo que en los demás bits se aloje el esta- do lógico que tenía antes de la aplicación de la función lógica OR. Para una mejor compren- sión observe el ejemplo de la 38 Tabla 43. Tabla de verdad de la función lógica AND. Tabla 44. Ejemplo de aplicación entre 2 re - gistros de la función lógica OR. Tabla 45. Aplicación de la función lógica OR como filtro.
  • 41.
    tabla 45, enel cual se visualiza que se requiere que los bits del nible superior del registro dato pasen a ser “1´s” en el resultado, mientras que los datos contenidos en los bits del nible inferior del registro dato se trasladan de ma- nera íntegra al resultado. Para poder hacer uso de la fun- ción lógica OR entre 2 registros en un microcontrolador PIC, se pueden em- plear una de dos instrucciones de acuerdo a la forma en como se requie- ran aplicar; las instrucciones de la fun- ción lógica OR con las que cuentan los microcontroladores PIC se descri- ben a continuación: a) iorlw k.- Función lógica OR del dato que se encuentra en el registro de trabajo W con el de un va- lor literal dejando el resultado en el re- gistro de trabajo W, modificando su valor con respecto del que tenia ante- riormente. El dato del registro de tra- bajo W como el del valor literal son de 8 bits. b) iorwf f,d.- Función lógica OR del dato que se encuentra en el registro de trabajo W con el valor de un registro f (registro de memoria RAM) dejando el resultado de la fun- ción OR ya sea en el registro de traba- jo W o en el registro f, dependiendo del valor que adquiera d (para una mejor referencia consulte el capítulo “instrucciones orientadas al control de registros” e “instrucciones orientadas al control de literales”, ambos temas pertenecientes al módulo I). Cabe aclarar que los microcontro- ladores PIC ejecutarán la operación entre registros compuestos por 8 bits, y siempre que se requiera aplicar la función lógica OR sobre 2 registros de memoria RAM, en un microcontrola- dor PIC se tiene que hacer mediante la carga previa del valor de uno de los registros a W, ya que en un microcon- trolador PIC no existe una instrucción que efectúen la función lógica OR en- tre 2 registros de memoria RAM de forma directa. Por último, en cuanto a la función lógica OR, en la tabla 46 se muestra el código de un programa que a ma- nera de ejemplo expone la forma en que puede ser empleada la función ló- gica OR, tomando en cuenta la cons- trucción de un filtro o máscara como el que fue ilustra en el ejemplo de la ta- bla 45, que se encargue de dejar pa- sar el dato del nible inferior de un re- gistro (var1). Sólo a manera de nota diremos que en el código del programa de ejemplo se está proponiendo el em- pleo del microcontrolador PIC- 16F628A, pero también puede emplearse cual- quier otro microcontrola- dor PIC, y para ello refié- rase a los capítulos “con- figuración de los puertos como entrada o salida”, “Lectura de datos de un puerto”, “escritura de da- tos en un puerto” y “asig- nación de datos a un re- gistro”, ambos temas pertenecientes al pre- sente módulo II. Función Lógica XOR y sus Aplicaciones A diferencia de las fun- ciones lógicas AND y OR, la función lógica O Exclusiva (XOR en in- glés) no tiene un empleo como máscara filtradora de datos, dejando su ac- tividad principal en la de poder identificar el con- tenido de 2 registros, y reportar si éstos son 39 Tabla 46. Ejemplo de aplicación de la función lógica OR.
  • 42.
    exactamente iguales entresí, por lo tanto, un campo de acción de la fun- ción lógica XOR se encuentra en la comparación de los datos de regis- tros. En la tabla 47 se muestra la tabla de verdad de la función lógica XOR, en la cual se observan los diferentes valores que pueden adquirir los térmi- nos identificados como “Entrada 1” y “Entrada 2”, generándose en total 4 diferentes combinaciones de éstos, teniendo como funcionamiento lo si- guiente. Si los datos de entrada tienen valores distintos entre sí, el resultado será “1” (uno). Por otra parte, cuando los datos de entrada adquieren el mis- mo valor ya sea “0” ó “1” lógico, el re- sultado será “0” (cero). Partiendo de este comportamiento es que se le da el nombre de O Exclusiva, ya que pa- ra generar un “1” lógico se requiere que el dato de la entrada 1 “O” el da- to de la entrada 2 se encuentren en estado lógico de “1”, pero no los 2 al mismo tiempo. Para comprender la utilidad de la función lógica XOR, nos basaremos en su correspondiente tabla de verdad y a continuación presentaremos 2 ejemplos de su aplicación, tal como se muestra en la tabla 48. Tal como sucede con las funcio- nes lógicas AND y OR, cuando se aplica la función lógica XOR entre 2 registros, se realiza operando la función bit a bit entre los 2 registros involucrados de acuerdo con la tabla de verdad mos- trada anteriormente. En el ejemplo que se muestra en la tabla 48, se percibe que al operar la función lógica XOR (^), en- tre los datos alojados en los registros “Registro 1” y “Re- gistro 2” con sus correspon- dientes bits b0, el resultado es un “0” lógico debido a que ambos datos de entra- da se encuentran en “1” ló- gico. Lo mismo para cuan- do se aplica la función lógica XOR a los bits b1 de los registros “Registro 1” y “Registro 2”, como ambos datos de entrada son iguales, la respuesta es nuevamente “0” lógico, y así sucesiva- mente al ir aplicando la función lógica cada uno de los bits, en todos los re- sultados tendremos un “0” lógico, sal- vo en los bits de entrada b3, porque el b3 del “Registro 1” se encuentra en “0” lógico, y el del “Registro 2” se encuen- tra en “1” lógico, dando como resulta- do un “1” lógico. Si los datos de los registros “Re- gistro 1” y “Registro 2” hubieran sido iguales en el ejemplo de la tabla 48, el resultado después de aplicar la fun- ción lógica XOR nos entregaría “0's” lógicos en todos los bits del resultado, identificando. Con este resultado que los datos son exactamente iguales. Para aplicar la función lógica XOR entre 2 registros, recordemos que en un microcontrolador PIC, primero se debe cargar el dato de uno de ellos en el registro de trabajo W, para poste- riormente poder operarlo. En un mi- crocontrolador PIC, se pueden em- plear una de dos instrucciones de acuerdo a la forma en como se requie- ran aplicar las instrucciones de la fun- ción lógica XOR, tal como a continua- ción se explica: a) xorlw k.- Función lógica XOR del dato que se encuentra en el registro de trabajo W con el de un va- lor literal dejando el resultado en el re- gistro de trabajo W, modificando su valor con respecto del que tenía ante- riormente. El dato del registro de tra- bajo W como el del valor literal son de 8 bits. b) xorwf f,d.- Función lógica XOR del dato que se encuentra en el registro de trabajo W con el valor de un registro f (registro de memoria RAM) dejando el resultado de la fun- ción XOR ya sea en el registro de tra- bajo W o en el registro f, dependiendo del valor que adquiera d (para una mejor referencia consulte el capítulo “instrucciones orientadas al control de registros” e “instrucciones orientadas al control de literales”, ambos temas pertenecientes al módulo I). Después de aplicar la función lógi- ca XOR, se tiene que saber si el resul- tado fue cero (si son iguales los datos entre los registros), o diferente de ce- ro (si son diferentes los datos entre los registros), por lo que se tiene que re- visar también la bandera del cero (z) del registro “status”, por lo que les pe- dimos que pasen a revisar el siguien- te apartado, que es en donde se muestra de manera com- pleta y con ejemplos de la forma de realizar compara- ciones entre los datos de diferentes registros. Funciones Lógicas de Comparación entre Registros (=, <, >) Existen aplicaciones en las que es necesario realizar comparaciones entre los datos de 2 registros por lo menos, y saber a partir de dicha comparación si los datos son iguales, ó uno es mayor que el otro ó uno es 40 Tabla 47. Tabla de verdad de la función lógica XOR. Tabla 48 Ejemplo de aplicación entre 2 regis - tros de la función lógica XOR.
  • 43.
    menor que elotro, etc. Siendo de vital importancia tener en cuenta que los datos poseen una magnitud que se encuentra en función de los bits que la componen. Las comparaciones que pueden realizarse con un microcon- trolador PIC, son las que aprendimos en los estudios primarios, y a las cua- les llamaremos comparaciones bási- cas, las cuales se enumeran a conti- nuación, indicando además, el símbo- lo que las caracteriza. • Igual (=) • Menor que (<) • Mayor que (>) A partir de las comparaciones bá- sicas podemos crear las llamadas comparaciones complementarias que prácticamente no son otra cosa que eso (de manera literal); las compara- ciones complementarias se muestran a continuación. • Diferente (≠) Complemento de Igual • Mayor o igual que (≥) Complemento de Menor que • Menor o igual que (≤) Complemento de Mayor que Tomando la primera de las compa- raciones complementarias que es la denominada “diferente”, se genera a partir de la comparación básica “Igual”, esto es, en el momento que se pregunta si un dato es igual a otro, si el resultado es no, quiere decir que entonces son diferentes. Del mismo modo cuando se realiza la ejecución de la comparación básica “menor que” entre los valores de 2 datos, si el re- sultado es no, quiere decir entonces que fue “mayor o igual”. Por lo tanto, el mismo algoritmo que se desarrolle para las comparaciones básicas es el que se emplea para las comparacio- nes complementarias. A continuación comenzaremos con la explicación en detalle de la primer comparación bási- ca. Comparación Igual (=) ó Diferente () Para realizar una comparación en- tre los datos de 2 registros indepen- dientemente para saber si son igua- les, mayores o menores, se tiene que realizar una operación aritmética fun- damental que consiste en una “resta” (para una mejor referencia sobre este tema consulte el capítulo “resta arit- mética”, perteneciente al módulo II), y por medio de ésta sabremos de ma- nera específica si 2 magnitudes son iguales, ya que si el resultado de la resta es cero, quiere decir que los da- tos que fueron restados son exacta- mente iguales, mientras que si el re- sultado es diferente de cero no impor- tando si es positivo o negativo, quiere decir que las cantidades que se resta- ron son diferentes entre sí. En el ejemplo ilustrado en la tabla 49 se muestra la manera de emplear una resta aritmética para determinar sí 2 cantidades numéricas son iguales entre ellas, obteniéndose 2 posibles resultados, uno de los resultados de la resta puede ser cero, si es que los va- lores de los datos fueron iguales entre sí, o se puede tener un resultado dife- rente de cero en la resta (positivo o negativo), si los valores fueron de magnitud diferente entre sí. Del ejemplo 1 mostrado en la tabla 49, se observa la resta de 2 números (5 - 5), siendo el resultado de la sus- tracción un valor de 0 (cero), indican- do que el valor del dato 1 es igual al valor del dato 2; por otra parte, la res- ta que se haga puede involucrar valo- res de más de 1 registro de 8 bits, ra- zón por la que recomendamos volver a repasar el correspondiente capítulo donde se abordan las restas aritméti- cas. Ahora observemos el ejemplo 2 de la misma tabla 49, en donde de nueva cuenta se realiza una resta de 2 números (5 - 4), el resultado en es- ta oportunidad es un 1, por lo tanto, el resultado expresa que los valores de los datos 1 y 2 son diferentes. Se de- be de tomar en cuenta que tanto para el ejemplo 1 y 2 de la tabla 49, las res- tas se realizan en hexadecimal (inter- pretación del binario) dentro de un mi- crocontrolador PIC. Específicamente para la imple- 41 Tabla 50. Ejemplos de una comparación de valores realizada con la función XOR. Tabla 49. Ejemplos de una comparación de valores realizada a partir de una resta.
  • 44.
    mentación de unacomparación entre 2 valores, y a partir de ella determinar si estos son iguales o diferentes, a parte de la resta también puede em- plearse la función lógica XOR (expli- cada en el capitulo anterior), que en la tabla 50 se muestra un ejemplo de su aplicación, y a partir de ella determi- nar si 2 valores son iguales o diferen- tes. En los ejemplos expresados en la tabla 50 se muestra la aplicación de la función lógica XOR a números bina- rios para una mejor comprensión, siendo el mismo caso que en los ejemplos realizados por me- dio de una resta, si el resul- tado es cero, significa que los valores de los datos 1 y 2 son iguales (ejemplo 1 de la tabla 50), mientras que cual- quier otro resultado implica que los valores de los datos 1 y 2 son diferentes entre sí (ejemplo 2 de la tabla 50). En la figura 17 se mues- tra un rombo que es el sím- bolo que se emplea para realizar la comparación de las magnitudes de los valo- res de 2 datos, dentro del rombo está expresada la pregunta que compara la magnitud de var1 con res- pecto de var2, generando a su vez 2 posibles resulta- dos, los cuales nos indican por medio de una respuesta afirmativa que las magnitu- des de los datos de var1 y var2 son iguales; por otra parte, si la respuesta es “no”, significa que las magni- tudes de los datos de var1 y var2 son diferentes. La función de compara- ción de la figura 17 es des- glosada para saber si los va- lores contenidos en 2 regis- tros son iguales o diferentes. Por lo tanto, se muestra de manera detallada en el dia- grama de flujo de la figura 18, los bloques que componen el mé- todo para poder realizar la compara- ción, empleando en esta oportunidad como acción fundamental la opera- ción de la resta aritmética para deter- minar el resultado de la comparación, pero recuerde que la operación de la resta puede ser sustituido por la fun- ción lógica XOR. Para el código que se obtendrá a partir del diagrama de flujo de la figu- ra 18, se presupone que se emplean registros de 8 bits para efectos de una mejor comprensión, pero si se quisie- ran comparar valores que aborden más de 8 bits en su composición, el método sigue siendo el mismo, sola- mente se tienen que contemplar res- tas con registros de más de 8 bits (16, 32, etc.). A partir del diagrama de flujo de la figura 18 se observa que para comen- zar con el proceso de comparación, en primera instancia tiene que ser lim- piada la bandera que indica que el re- sultado de la operación de la resta es cero (lo mismo se realiza si la opera- ción es la XOR). Para esta acción la bandera del cero se identifica como “z” y se encuentra dentro del registro “status” del microcontrola- dor PIC. Posteriormente se operan los valores de los registros var1 y var2, cargando de manera primaria el valor de uno de ellos en el registro de trabajo w, para poste- riormente aplicar el coman- do de la resta o la función XOR con el registro restan- te. La aplicación de la resta ó función XOR tendrá como resultante 2 posibles valo- res, que es 0 (cero) ó un va- lor diferente de 0 (sin im- portar su magnitud), tenien- do que revisar el estado que guarda la bandera z del registro status, para saber si el resultado de la resta o función XOR fue 0 o no. La bandera z arrojará un “1” lógico si el resultado de la resta ó la función XOR fue 0 (cero). Por otra parte, la bandera z tendrá un “0” ló- gico si el resultado resta ó la función XOR fue diferen- te de 0 (cero). Por último, dependiendo del estado que guarde la bandera z, se tendrá que ejecutar una se- cuencia de instrucciones, para cuando el resultado de la comparación entre los valores de var1 y var2 indi- que que fueron iguales. Lo 42 Figura 17. Símbolo de la función de comparación: igual ó diferente. Figura 18. Diagrama de flujo de la comparación: Igual ó Diferente.
  • 45.
    mismo sucederá cuandoel resultado de la comparación arroje que fueron diferentes los valores de var1 y var2. A continuación en la tabla 51 se muestra el fragmento de código por medio del cual se implementa el pro- grama del diagrama de flujo de la figu- ra 18. Comparación Menor que (<) o Mayor o Igual que () Nuevamente para realizar una comparación entre los valores conte- nidos en 2 registros, y saber si uno de ellos es menor que el otro, ó saber sí es mayor o igual uno que el otro valor, se tiene que realizar la operación arit- mética principal para realizar compa- raciones que consiste en una resta (de nueva cuenta lo referimos al capí- tulo “resta aritmética”, perteneciente al módulo II), y por medio de ésta sa- bremos de manera específica cuál da- to es menor que el otro, ya que si el resultado de la resta es positivo, po- dremos interpretar que uno de los da- tos que fueron restados es en magni- tud menor que el otro. Por otra parte, si queremos obtener el complemento del resultado “menor que” (compara- ción básica), nos tenemos que referir a el término “mayor o igual” (compara- ción complementaria), y para ello se tiene que revisar el resultado de la resta, para estar en conocimiento de que se generó un resultado igual a ce- ro ó un resultado con valor negativo, lo cual significa que uno de los valores a compararse fue mayor o igual que el otro. Para comprender de una mejor manera lo expresado en el párrafo an- terior, observe el ejemplo ilustrado en la tabla 52 en donde se muestra la manera de emplear una resta aritmé- tica para determinar cuál de las 2 can- tidades numéricas es menor, obte- niéndose 2 posibles resultados. Uno de los resultados de la resta puede dar un valor positivo (sin importar su magnitud), si es que el valor del dato 2 fue menor que el valor del dato 1, ó se puede obtener un resultado negati- vo después de aplicar la operación de la resta (de igual manera sin importar su magnitud), si el valor del dato 2 re- sultó que es mayor que el valor del dato 1, pero también pudo haber sido cero el resultado de la resta. Por lo tanto, sí el resultado de la resta hubie- se sido negativo ó cero se interpreta- rá como que el dato 2 fue mayor o igual que el dato 1. Del ejemplo 1 mostrado en la tabla 52, se observa la resta de 2 números (8 - 3), siendo el resultado de la sus- tracción un valor de 5 (positivo), indi- cando que el valor del dato 2 es me- nor que el valor del dato 1; recuerde 43 Tabla 51. Código del programa de comparación: Igual ó Diferentes. Tabla 52. Ejemplos de una comparación “menor que” ó “mayor o igual” realiza - da a partir de una resta.
  • 46.
    que la restapuede realizarse con re- gistros de más de 8 bits, razón por la cual le hacemos patente de nuevo, que es recomendable que vuelva a re- pasar el correspondiente capítulo donde se abordan las restas aritméti- cas. Ahora observemos el ejemplo 2 de la misma tabla 52, en donde de nueva cuenta se realiza una resta de 2 números (8 - 9), el resultado en es- ta oportunidad es -1, por lo tanto, el resultado expresa que el valor del da- to 2 es mayor o igual que el dato 1. Se debe tomar en cuenta que tanto para el ejemplo 1 y 2 de la tabla 52, las restas se efectúan en formato hexa- decimal por parte de un mi- crocontrolador PIC. En la figura 19 se mues- tra un rombo que es el sím- bolo de manera general que se emplea para realizar la comparación entre las magnitudes de los valores de 2 datos. Por dentro del rombo está expresada la pregunta mediante la cual se compara la magnitud de var2 con respecto de var1, generando a su vez 2 posi- bles resultados, los cuales nos indican por medio de una respuesta afirmativa que la magnitud del dato var2 es menor que el dato var1; por otra parte, si la respuesta es “no”, significa que la magnitud del dato var2 es mayor ó igual que el dato de var1. La comparación repre- sentada por medio de la fi- gura 19, la desglosaremos para una mejor interpreta- ción, y de esta manera sa- ber si los valores conteni- dos en 2 registros son uno menor que el otro ó uno es mayor o igual que el otro, por lo tanto, se mostraran de manera detallada por medio del diagrama de flujo de la figura 20, los bloques que con- forman el método que emplearemos para poder realizar la comparación, utilizando en esta oportunidad como acción fundamental la operación de la resta aritmética para estar en posibili- dades de tomar una decisión sobre el resultado final de la comparación. El código que se obtendrá a partir del diagrama de flujo de la figura 20, será representado por medio de regis- tros de 8 bits, con el único fin de lograr una mejor comprensión en la explica- ción siguiente, pero si se quisieran comparar valores cuyos registros re- quieran más de 8 bits en su conforma- ción, el método seguirá siendo el mis- mo, solamente se tienen que contem- plar restas con registros de más de 8 bits (16, 32, etc.). A partir del diagrama de flujo de la figura 20 se observa que para comen- zar con el proceso de comparación, en primera instancia tiene que ser lim- piada la bandera que indica que el re- sultado de la operación de la resta es cero, además de la bande- ra que indica que en el re- sultado de la resta se gene- ra un acarreo. Para esta acción la bandera del cero se identifica como “z” y la bandera del acarreo como “c”, encontrándose ambas banderas ubicadas dentro del registro “status” del mi- crocontrolador PIC. Posteriormente se operan por medio de la operación de la sustracción los valo- res de los registros var1 y var2, cargando en primer instancia el valor de var2 en el registro de trabajo w, pa- ra posteriormente aplicar el comando de la resta de var1 - w (subwf var1,w). Después de la aplicación de la resta se preguntará si el posible resultado fue igual a cero, ó en su defec- to si fue diferente de cero, para lo cual se procede a revisar la bandera z que se encuentra en el registro es- tatus. Si la bandera z se en- cuentra en estado lógico “1” indica que el resultado de la resta fue cero, y por lo tan- to, el contenido de var2 es igual que var1; pero si la bandera z se encuentra en estado lógico “0” después de realizar la resta, significa que los datos de var2 y var1 son diferentes entre sí, 44 Figura 20. Diagrama de flujo de la comparación: Me - nor que ó Mayor o igual. Figura 19. Símbolo de la función de comparación: Menor que ó Mayor o igual.
  • 47.
    siendo necesario realizarla verifica- ción del estado que guarda la bande- ra del acarreo. La bandera del acarreo muestra si el resultado de una resta fue positivo ó sí fue negativo, y para ello lo que tenemos que revisar es que la bandera c esté en estado lógico “1” para determinar que el resultado de la resta fue positivo, ó verificar que la bandera c tenga un estado “0” lógico para tener en cuenta que el resultado de la resta fue negativo. Si el resultado de la resta (o sea de la comparación) fue positivo signi- fica que var2 es menor que var1 (var2 < var1), y entonces como consecuen- cia el control del programa se tiene que dirigir a ejecutar las instrucciones conducentes con el resultado mostra- do; pero si el resultado de la resta fue negativo ó igual a cero, significa que como consecuencia de la compara- ción se arrojó un resultado que seña- la que var2 es mayor o igual que var1 (var2 ≥ var1). Por lo tanto, de igual manera el control del programa se tie- ne que desplazar para ejecutar la se- rie de instrucciones que corresponden a las actividades de cuando el resulta- do de la comparación fue var2 ≥ var1. A continuación en la tabla 53 se muestra el fragmento de código por medio del cual se implementa el pro- grama que surge a partir del diagrama de flujo de la figura 20. Comparación Mayor que (>) o Menor o Igual que () Como en los casos de las compa- raciones anteriormente descritas, pa- ra realizar una comparación entre los datos contenidos en 2 registros, y sa- ber si uno de ellos es mayor que el otro, ú obtener el resultado comple- mentario para determinar si un dato es menor o igual que el otro, se tiene que realizar la operación aritmética principal para realizar comparaciones que consiste en una resta (por enési- ma vez lo referimos al capitulo “resta aritmética”, perteneciente al presente módulo II). Siendo por medio de la aplicación de esta operación que sa- bremos de manera específica cuál da- to es mayor que el otro, ya que si el resultado de la resta es positivo, po- dremos interpretar que uno de los da- tos que fueron restados es en magni- tud mayor que el otro. Además, si que- remos obtener el complemento del re- sultado “mayor que” (comparación bá- sica), nos tenemos que referir al térmi- no “menor o igual” (comparación com- plementaria), y para ello se tiene que revisar el resultado de la resta, para estar en conocimiento de que se ge- neró un resultado igual a cero ó un re- sultado con valor negativo, lo cual sig- nifica que uno de los valores a compa- rarse fue menor o igual que el otro. Para comprender de una mejor manera la explicación anterior, obser- ve el ejemplo ilustrado en la tabla 54 en donde se muestra la manera de emplear una resta aritmética para de- terminar cuál de las 2 cantidades nu- méricas es mayor, obteniéndose 2 po- sibles resultados. Uno de los resulta- dos de la resta puede dar un valor po- sitivo (sin importar su magnitud), si es 45 Tabla 53. Código del programa de comparación: Menor que ó Mayor o igual.
  • 48.
    que el valordel dato 1 fue mayor que el valor del dato 2, ó se puede obtener un resultado negativo después de aplicar la operación de la resta (de nueva cuenta sin importar su magni- tud), si el valor del dato 1 resultó que es menor que el valor del dato 2, pero también pudo haber sido cero el resultado de la resta. Por lo tanto, sí el resultado de la resta hu- biese sido negativo ó ce- ro se interpretara como que el dato 1 fue menor o igual que el dato 2. Del ejemplo 1 mos- trado en la tabla 54, se observa la resta de 2 nú- meros (9 - 5), obtenién- dose como resultado de la sustracción un valor igual a 4 (positivo), indi- cando que el valor del dato 1 es mayor que el valor del dato 2; recuer- de que la resta puede realizarse con registros de más de 8 bits, razón por la cual le recordamos de nueva cuenta, que es recomendable que repa- se el correspondiente ca- pítulo donde se abordan las restas aritméticas. Ahora observemos el ejemplo 2 de la misma tabla 54, en donde se realiza una resta de 2 números (7 - 9), el resul- tado en esta oportunidad es -2, por lo tanto, el re- sultado expresa que el valor del dato 1 es menor o igual que el dato 2. Se debe de tomar en cuenta que tanto para el ejemplo 1 como para el ejem- plo 2 de la tabla 54, las restas se efec- túan en formato hexadecimal por par- te del microcontrolador PIC. En la figura 21 se muestra para la operación de una comparación un rombo, que es el símbolo de manera general se emplea para efectuar la comparación entre las magnitudes de los valores de 2 datos; dentro del rom- bo se está expresando una pregunta, mediante la cual se compara la mag- nitud de var1 con respecto de var2, generando a su vez 2 posi- bles resultados, los cuales nos indican por medio de una respuesta afirmativa que la magnitud del dato var1 es mayor que el dato var2; por otra parte, si la respuesta es “no”, significa que la magnitud del dato var1 es menor ó igual que el dato de var2. La comparación represen- tada en la figura 21, tiene que ser desglosada para una mejor comprensión, y de esta manera saber si los valores contenidos en 2 registros son uno mayor que el otro ó uno es menor o igual que el otro. Por lo tanto, se mostrará de ma- nera detallada por medio del diagrama de flujo de la figura 22, los bloques que conforman el método que emplearemos para poder realizar la comparación, utilizando en esta oportuni- dad como acción funda- mental la operación de la resta aritmética para estar en posibilidades de tomar una decisión sobre el re- sultado final de la compa- ración. El código que se obtendrá a partir del diagrama de flujo de la figura 22, será representado por medio de registros de 8 bits, con el 46 Tabla 54 Ejemplos de una comparación “mayor que” ó “menor o igual” reali - zada a partir de una resta. Figura 21. Símbolo de la función de comparación: Ma - yor que ó Menor o igual. Figura 22. Diagrama de flujo de la comparación: Mayor que ó Menor o igual.
  • 49.
    único fin delograr una mejor com- prensión en la explicación que a con- tinuación se dará, pero si se quisieran comparar valores cuyos registros re- quieran de más de 8 bits en su confor- mación, el método seguirá siendo el mismo, solamente se tienen que con- templar restas con registros de más de 8 bits (16, 32, etc.). A partir del dia- grama de flujo de la figura 22 se ob- serva que para comenzar con el pro- ceso de comparación, en primera ins- tancia tiene que ser limpiada la ban- dera que indica que el resultado de la operación de la resta es cero, además de la bandera que indica que en el re- sultado de la resta se genera un aca- rreo, para esta acción la bandera del cero se identifica como “z” y la bande- ra del acarreo como “c”, encontrándo- se ambas banderas ubicadas dentro del registro “status” del microcontrola- dor PIC. Posteriormente se operan por me- dio de la operación de la sustracción los valores de los registros var1 y var2, cargando en primer instancia el valor de var2 en el registro de trabajo w, para posteriormente aplicar el co- mando de la resta de var1 - w (subwf var1,w). Después de la aplicación de la resta se preguntará sí el posible re- sultado fue igual a cero, ó en su de- fecto si fue diferente de cero, para lo cual se procede a revisar la bandera z que se encuentra en el registro esta- tus. Si la bandera z se encuentra en estado lógico “1” indica que el resulta- do de la resta fue cero, y por lo tanto, el contenido de var1 es igual con var2; pero si la bandera z se encuentra en estado lógico “0” después de realizar la resta, significa que los datos de var1 y var2 son diferentes entre si, siendo necesario realizar la verifica- ción del estado que guarda la bande- ra del acarreo. La bandera del acarreo muestra si el resultado de una resta fue positivo ó sí fue negativo, y para ello lo que te- nemos que revisar es que la bandera c se encuentre en estado lógico “1” para determinar que el resultado de la resta fue positivo, ó verificar que la bandera c tenga un estado “0” lógico para tener en cuenta que el resultado de la resta fue negativo. Si el resultado de la resta (o dicho de otra manera de la comparación) fue positivo significa que var1 es ma- yor que var1 (var2 > var1), y entonces como consecuencia el control del pro- grama se tiene que dirigir a ejecutar las instrucciones conducentes con el resultado mostrado; pero si el resulta- do de la resta fue negativo ó igual con cero, significa que como consecuen- cia de la comparación se arrojó un re- sultado que señala que var1 es menor o igual que var2 (var1 ≤ var2). Por lo tanto, de igual manera el control del programa se tiene que desplazar para ejecutar la serie de instrucciones que corresponden a las actividades de cuando el resultado de la compara- ción fue var2 ≤ var1. A continuación en la tabla 55 se muestra el fragmento de código por medio del cual se implementa el pro- grama que resulta del diagrama de flujo de la figura 22. 47 Tabla 55. Código del programa de comparación: Mayor que ó Menor o igual.
  • 50.
    Lectura de unTeclado Matricial Un teclado es un dispositivo por medio del cual una persona puede “comunicarle” información a un micro- controlador, considerándose por lo tanto, un elemento indispensable en aquellos proyectos en donde el usua- rio tiene que interactuar con el micro- controlador, por ejemplo para configu- rar la manera de operar de la circuite- ría, como lo es en un horno de mi- croondas en donde se tiene que se- leccionar el tiempo de cocción de un alimento, por ejemplo. Existen 2 tipos de teclados, un tipo de teclado requiere tener disponible una terminal de entrada de un micro- controlador para cada una de las te- clas, mientras que otro tipo de teclado se encuentra bajo configuración matri- cial, ahorrando terminales en un mi- crocontrolador. Para comprender este último concepto vamos a recurrir a una situación práctica; hagamos de cuenta que necesitamos un teclado que en total tenga 16 teclas para dife- rentes aplicaciones. Si utilizamos el primer tipo de teclado enunciado en este apartado, necesitaríamos contar con un microcontrolador que tuviera disponible 16 terminales de entrada, lo cual hace totalmente impráctico el utilizar este tipo de teclado, a menos que multiplexemos por medio de un circuito externo al microcontrolador la información de las teclas (yo no lo ha- ría). En cambio con un teclado matri- cial de 4 filas por 4 columnas es sufi- ciente para ingresar la información al microcontrolador, y para emplear el teclado de 16 teclas sólo son necesa- rias 8 terminales del microcontrolador (4 de entrada y 4 de salida). El teclado matricial es un circuito que nos ayuda a ingresar datos al mi- crocontrolador. Para implementarlo se requiere del uso de una serie de boto- nes con reposición automática (push boton) conectados de tal manera que se tienen filas y columnas a través de las cuales es muy fácil identificar cuál tecla fue oprimida. El teclado matricial más común es el que posee 4 filas y 4 columnas dando origen a un teclado con 16 teclas, pero los teclados matri- ciales pueden ser mucho más gran- des, inclusive podemos disponer de teclados del tamaño de los empleados en las PC (102 ó 103 teclas). La forma de operación básica de cualquier teclado matricial es la si- guiente: Cuando se oprime una tecla se produce la unión de una fila con una columna, provocando que para un microcontrolador sea muy sencillo identificar la tecla que fue pulsada. Se recomienda que para imple- mentar un teclado matricial se haga uso de botones tipo push boton de cuatro terminales, para que sea senci- lla su implementación en un circuito impreso de una sola cara. Por la ma- nera en como se acomodaron los bo- tones que se muestran en el diagrama esquemático de la figura 23, se gene- ran 4 columnas y 4 filas las cuales se forman con la unión de las respectivas terminales de los botones y lo reco- mendable es seguir la conexión ex- presada en el diagrama esquemático, ya que prácticamente de ahí se obtie- ne el circuito impreso. Por ejemplo en- foquemos nuestra atención hacia el botón identificado como S5. Este está conectado en su parte izquierda con el borne identificado como “C1” que se refiere a la columna 1, y por su par- te derecha al borne identificado como “F1” que se refiere a la fila 1. Por lo tanto, si es presionado este botón es- taremos uniendo la fila 1 con la colum- na 1. Para todos los botones se tiene el mismo principio de operación, por lo que se generan combinaciones de co- lumnas con filas, las cuales son muy fáciles de identificar de acuerdo al bo- tón que se oprima. El paso siguiente es personalizar cada uno de los boto- nes. Por ejemplo si se tratara de una calculadora se colocarían las teclas numéricas del 0 al 9 y los botones res- tantes con las operaciones aritméticas básicas, ó también se personalizar los botones con letras, etc. A continuación se explicará el fun- cionamiento de un teclado matricial de 4X4, con un microcontrolador. Por lo tanto, para que este trabaje y realice la lectura del un teclado matricial, se 48 Figura 23. Diagrama esquemático de un teclado matricial de 4 X 4.
  • 51.
    requiere destinar 4de las terminales de uno de sus puertos como salidas, la cuales identificaremos por el mo- mento como S0, S1, S2 y S3. A cada una de las salidas por separado se le tendrá que enviar un “1” lógico, mien- tras el “1” lógico aparece sólo en una de las salidas, las 3 restantes se fijan con un estado de lógico de “0”. El “1” lógico se hace llegar al teclado matri- cial, causando que se vaya activando una de las filas, teniendo que para ac- tivar la fila identificada como F0 se tie- ne que enviar un “1” lógico a través de la salida S0, y “0” lógicos a las salidas S1, S2 y S3. Posteriormente se tiene que enviar un “1” lógico por la salida S1 y “0” lógicos a las salidas S0, S2 y S3, para que sea activada la fila F1, y así sucesivamente hasta llegar a la fi- la F3 que corresponde con la salida S3. Lo que es importante observar es el hecho de que cuando una salida se coloca en estado lógico de “1”, las 3 salidas restantes se fijarán en estado lógico de “0”. El “1” lógico tiene que ser enviado sólo uno a la vez por la salida correspondiente, para que de esa manera se tenga el control de la fila que se está activando. Una vez que un “1” lógico se en- cuentra presente en alguna de las fi- las del teclado matricial, se tiene que esperar un tiempo razonable (máximo 10 milisegundos) para que sea presio- nada una tecla, y dependiendo de cuál fue oprimida, se enviará el “1” ló- gico a una de 4 terminales del micro- controlador que previamente tuvieron que ser configuradas como entradas. Las terminales de entrada por el mo- mento serán identificadas como E0, E1, E2 y E3, que respectiva- mente corresponden a las columnas C0, C1, C2 y C3. En el teclado matricial cuando es presionada una tecla, se cierra un interruptor que interconecta una fila con una columna. Es por ello que sólo se envía un “1” lógico a la vez a la fila correspondien- te, porque ese “1” lógico se reflejará en una columna de acuerdo con el botón que sea oprimido. Sí fue- ran enviados al mismo tiempo a más de una fila los “1's” lógicos, no se po- dría identificar claramente a los boto- nes que sean oprimidos. En la figura 24 se muestra la ima- gen de un teclado matricial, con la identificación de sus teclas, para po- der ingresar los datos que se requie- ran. En este ejemplo se esta emplean- do un teclado matricial de 4X4 simu- lando una calculadora básica. En la tabla 56 se muestra el código ASCII (se recomienda que se asigne código ASCII cuando se trabaja con un tecla- do) resultante, que será generado a partir de la combinación de fila y co- lumna que se presente cuando una te- cla sea oprimida. La tabla 56 es tan solo un ejemplo que se recomienda emplear para utili- zar un teclado matricial, ya que de la tabla se observa con lujo de detalle la fila y columna que se une, una vez que se presiona una tecla. En el dia- grama de bloques de la figura 25 se muestran todas las acciones que tie- nen que realizarse para controlar la lectura de un teclado matricial. A con- tinuación se procederá a realizar la descripción del diagrama de flujo de la figura 25, tomando en consideración que las terminales del microcontrola- dor que funcionarán como entradas, serán las correspondientes terminales del puerto A PA0 = E0, PA1 = E1, PA2 = E2 y PA3 = E3 (estas terminales co- rresponden a las columnas del tecla- do). Las terminales del microcontrola- dor que tendrán que ser configuradas como de salida, serán las del puerto B tal como sigue PB0 = F0, PB1 = F1, PB2 = F2 y PB3 = F3 (las terminales del puerto B se conectan a las filas del teclado matricial). Tal como se explicó anteriormen- te, para controlar la lectura de un te- clado matricial, se tiene que ir activan- do cada fila de manera independiente y por lo tanto, se tiene que comenzar por la primera fila, o sea la identifica- da como F0. Se recurre al comando “bsf portb,0” para enviar un “1” lógico a la salida S0 (PB0) del microcontrolador y que corresponde con la fila 0 (F0). Co- mo paso siguiente se tiene que gene- rar un retardo ó espera de cuando más 10 mseg, tiempo suficiente para minimizar el rebote que se genere en el interruptor una vez que se oprima el teclado, posteriormente cuando termi- na el tiempo de 10 mseg, se puede dar por hecho que sí fue oprimida una tecla, esta ya se estabilizo y por lo tanto, ahora se puede acce- der al proceso para determi- nar la tecla que fue acciona- da; una vez que se activo la fila 0 del teclado, será a tra- vés de una de las 4 columnas que sabemos qué tecla se oprimió. Como paso siguiente se pre- gunta por cuál terminal de en- trada del microcontrolador se 49 Tabla 56. Combinación de filas y columnas del teclado matricial. Figura 24. Teclado matricial con sus botones identificados.
  • 52.
    recibe un “1”lógico (si es que se opri- mió una tecla), recordando que son 4 alternativas las que nos reporten la posible identificación de una tecla, porque al momento de activar la fila 0 se tiene abierta la identificación de las teclas “1”, “2”, “3” y “+” que correspon- den con las columnas C0, C1, C2 y C3, que a su vez se conectan con las entradas PA0, PA1, PA2 y PA3 del mi- crocontrolador. Para reconocer la te- cla que fue oprimida, se tiene que ha- cer uso de comparaciones las cuales están representadas por medio del símbolo de un rombo en el diagrama de flujo de la figura 25. Dentro de los bloques de comparación se encuentra expresada una pregunta, por medio de la cual se verifica por cuál terminal de entrada del microcontrolador se está reflejando el “1” lógico que se es- tá enviando por la salida S0 del micro- controlador. Si la pregunta se hace vá- lida en alguna de las condiciones de comparación, como respuesta un “si” procediendo a guardar un dato en un registro de memoria RAM identificado como “varteclado”. El valor del dato que será alojado en el registro varteclado depende de cuál comparación fue válida, la cual a su vez está relacionada con la tecla que ha sido presionada. Para el caso de la fila 0 los valores que pueden ser guardados son: 31H, 32H, 33H ó 2BH, de acuerdo con la tecla que fue activa- da. Pero sí ninguna tecla de la fila 0 es accionada, entonces el resultado de las comparaciones será “no” provo- cando que como paso siguiente se re- pita nuevamente el proceso de identi- ficar la tecla que es accionada, pero ahora en la siguiente fila que se iden- tifica como F1 (fila 1). De manera básica cuando se pasa a la activación de la fila 1, el proceso es el mismo que para la fila 0, sólo que en esta oportunidad, la salida que se activará será la identificada en el microcontrolador como S1 (PB1) y que corresponde con la fila 1, hacién- dose esta operación por medio del co- mando “bsf portb,1”. De igual manera para evitar los rebotes mecánicos de los interruptores del teclado, es utiliza- do un retardo de máximo 10 mseg. Acto seguido dependiendo en que co- lumna se encuentra la tecla que se oprima, será por donde se reciba el correspondiente “1” lógico a través de la terminal de entrada, solo que en es- ta ocasión las posibles teclas que pueden ser activadas son las identifi- cadas como “4”, “5”, “6” ó “-“, que co- rresponden con las entradas E0, E1, E2 ó E3. Sí fue presionada una tecla de la fila 1, se procederá a guardar un dato en el registro varteclado, que en esta 50 Figura 25 Diagrama de flujo para controlar al teclado matricial.
  • 53.
    oportunidad utiliza losvalores 34H, 35H, 36H ó 2DH. En caso de que no se oprima tecla alguna de la fila 1, en- tonces se pasará a revisar sí en la fila 2 es en donde se presionó una tecla. La operación que se realiza para las filas 0 y 1 es la misma que se utiliza para las filas 2 y 3, pero buscando que se oprima cualquiera de las teclas “7”, “8”, “9” ó “X” para la fila 2, ó las teclas “L”, “0”, “=” ó “/” para la fila 3, todo es- to de acuerdo a como se observa en 51 Tabla 57. Código del programa de control de un teclado matricial parte 1.
  • 54.
    el diagrama deflujo de la figura 25. Para el presente ejercicio de aprendi- zaje en la utilización del teclado, esta- mos condicionando al programa del microcontrolador, para que una vez que se presiona una tecla y se le asig- na el valor correspondiente al registro varteclado, se proceda a realizar algu- na otra actividad, mientras que si nin- guna tecla se presiona, se tiene que realizar la búsqueda de alguna tecla mediante la activación de las diferen- 52 Tabla 58 Código del programa de control de un teclado matricial parte 2.
  • 55.
    tes filas, terminandocon esta activi- dad cuando alguna tecla es presiona- da. En la fila 3 las teclas L e = las re- lacionamos con un valor hexadecimal igual que 01 y 0F respectivamente, ya que la tecla L la utilizaremos por ejem- plo para limpiar el valor del registro varteclado, mientras que la tecla = la emplearemos por ejemplo para mos- trar un resultado. En el diagrama esquemático de la figura 26 se muestra el circuito básico para conectar el teclado matricial al microcontrolador, en el cual sólo se muestran las terminales de los puertos A y B que son em- pleadas, pero debe tomar en cuenta que falta la alimentación y el cristal en caso de ser requeri- do. En la tabla 57 se muestra el programa que tiene que ser car- gado al microcontrolador para que controle la lectura del tecla- do matricial. Por último, en el diagrama de flujo de la figura 25, y en el códi- go del programa de las tablas 57 y 58 del teclado matricial, se ha- ce uso de una subrutina para ge- nerar el retardo de tiempo de 10 mseg. Configuración de las Interpretaciones Las interrupciones en un mi- crocontrolador son elementos muy importantes dentro de un programa, sobre todo si el micro- controlador tiene que realizar va- rias actividades a la vez. Por ejemplo, existen aplicaciones en donde el microcontrolador tiene que esperar algún dato a través de la comunicación serial asín- crona, y para esto, el microcon- trolador no puede quedarse es- perando hasta que llegue, por- que puede pasar desde 1 milise- gundo hasta 1 hora para que es- to suceda, y mientras el microcontro- lador tiene que procesar más informa- ción originada por diversas fuentes. Es aquí donde la actividad de las inte- rrupciones cobra su importancia, por- que el microcontrolador puede estar trabajando normalmente, y sólo será “interrumpido” de su actividad princi- pal, para avisarle en el momento justo cuando tiene que poner la atención para recibir la comunicación serial. Las interrupciones de manera ge- neral, las podemos definir como cor- tes que se realizan a la ejecución de un programa. Para proceder a realizar la ejecución de un programa alterno, observe la imagen de la figura 27. El programa principal dentro de un microcontrolador puede estar en mar- cha, ejecutando sus respectivas ins- trucciones, mientras la causa de algu- na interrupción que haya sido habilita- da no se haga presente. Cuando una interrupción es activada, el microcon- trolador deja de ejecutar las instruc- ciones del programa principal, acce- diendo a una región de la memoria de programa que es donde se encuentra el código de un programa que corresponde con el servicio de la interrupción solicitada. En el mismo instante que la interrupción se genera, los datos que se encuentran en el registro contador de pro- grama (Program Counter PCL y PCLATH) se guardan en un apuntador de pila (me- moria temporal también lla- mada Stack Pointer). Por otra parte, también se aloja en el Stack Pointer el dato que es- té presente en el registro sta- tus. Una vez que está en marcha el código del progra- ma que se ejecuta cuando una interrupción se hace pre- sente, el microcontrolador debe realizar las actividades pertinentes a la causa que motivó la interrupción, esto es, se debe dar paso a la gestión de la información re- lacionada con el trabajo que tiene que realizarse solamen- te cuando la interrupción es provocada. Normalmente el código de programa que es destinado para una interrup- ción, debe ser pequeño (de- be contener pocas líneas) con respecto al código del programa principal, para que el microcontrolador no se quede atrapado por mucho tiempo dentro de la interrup- ción, y tan solo le dedique el 53 Figura 27. Programa principal e interrupción Figura 26. Conexión de un teclado matricial de 4 X 4.
  • 56.
    tiempo suficiente paraque se ejecute plenamente el servicio de la interrup- ción. Para indicarle al microcontrolador que el programa de una interrupción ha terminado, se emplea el comando “retfie” y cuando éste se ejecuta, los datos que se almacenaron previa- mente en el Stack Pointer, regresan de manera ordenada al registro status y apuntador de programa, para que el microcontrolador continué con la marcha del programa principal, procediendo a la ejecución de la instrucción siguiente de donde fue inte- rrumpido el programa principal por medio de la interrupción. En un microcontrolador PIC la configuración de las interrupciones, se realiza por medio del empleo del registro llamado “intcon” que es en donde se encuentran los bits que acti- van a las interrupciones. Para mayor referencia observe la imagen de la fi- gura 28, en donde se describe con de- talle la ubicación de los bits que com- ponen al registro “intcon” (para una mejor referencia consulte el capitulo “reset interrupciones y watchdog” y “descripción de los registros”, ambos temas pertenecientes al modulo I). De los 8 bits que contiene el registro “int- con” sólo nos interesan por el momen- to los que se identifican como “GIE” y “PEIE”. Por medio del bit GIE se realiza la activación de todas las interrupciones que posee el microcontrolador PIC. Por lo tanto, es el más importante que debemos de contemplar, ya que sin la activación de éste ninguna interrup- ción surtiría efecto. Para activar el bit GIE se necesita colocarlo en estado lógico “1”. El bit PEIE sirve para activar las interrupciones del microcontrolador que son originadas por dispositivos periféricos, esto es, además de acti- var todas las interrupciones por medio del bit GIE, es necesario activar el bit PEIE si es que la interrupción que se habilitará pertenece a un dispositivo periférico al microcontrolador PIC. En- tendiéndose por dispositivos periféri- cos, todos aquellos que de manera externa al microcontrolador son nece- sarios para que se haga llegar infor- mación al PIC, por ejemplo la comuni- cación serial asíncrona, la conversión por medio del ADC, etc. Para activar el bit PEIE se necesita colocarlo en estado lógico “1”. Nuevamente indicamos que el bit GIE es el primero que tiene que ser activado, para que cualquier interrup- ción surta efecto, y posteriormente to- mar en cuenta si la interrupción que requerimos es originada por un dispo- sitivo periférico, o por activación inter- na al microcontrolador. Si la interrup- ción se genera a través de un disposi- tivo periférico, entonces tiene que ha- cerse uso del bit PEIE, mientras que en caso contrario (si es originada de manera interna) se tendrá que buscar cuál es el bit que tiene que activarse. En el código que muestra como ejemplo en la tabla 59, 54 Figura 28. Detalle del registro INTCON. Tabla 59. Plantilla de ejemplo para configurar una interrupción.
  • 57.
    se muestra quepara configurar una interrupción se hace uso de los co- mandos que vemos en la tabla 59b. Por medio de las instrucciones “bsf” se colocan estados lógicos “1” en los bits toie y gie del registro intcon, para que de esta manera sean habili- tada la interrupción con la que trabaja- rá el microcontrolador PIC. Como pa- so siguiente a la ejecución de las ins- trucciones de habilitación de la inte- rrupción, el programa principal conti- núa ejecutándose hasta que se pre- sentan las condiciones que provocan la interrupción, siendo éste el momen- to en el que se interrumpe la secuen- cia de ejecución de las instrucciones. Cuando una interrupción se presenta, se coloca en estado lógico “1” el bit que hace la función de indicar que la interrupción se ha generado, este bit también recibe el nombre de bandera, y existe uno para cada interrupción que se encuentre presente en el mi- crocontrolador PIC con el que este- mos trabajando. Una vez que se ha suscitado una interrupción, ya mencionamos que la ejecución normal del programa se de- tiene, y como paso siguiente la infor- mación que se encuentra dentro de los registros apuntadores de progra- ma, así como también el dato del re- gistro status, se almacenan en el stack pointer. Acto seguido en el apuntador de programa se coloca el valor 04, que corresponde con el vec- tor de interrupción, y por lo tanto, el microcontrolador sabe que tiene que dirigirse a la localidad 4 de la memoria de programa, es por ello que se decla- ra, por medio de comando “org 4”, dónde se encuentra dicha localidad. Independientemente de cual haya sido el origen de la interrupción, en el apuntador de programa se coloca el valor 04, esto quiere decir que sea cual sea el motivo de la interrupción, el microcontrolador siempre se dirigirá al vector de interrupción, por lo que una vez que el apuntador de progra- ma se encuentra sobre este vector, se tiene que preguntar de manera espe- cífica ¿cuál es el origen de la interrup- ción? Para ello se tiene que preguntar por el estado lógico que tenga el bit bandera de la interrupción, y si este se encuentra en estado lógico “1” signifi- ca que se ha identificado el origen de la interrupción, por lo tanto, ahora el microcontrolador tiene que ejecutar el código de la rutina de interrupción. Se debe de tomar en cuenta que existen aplicaciones en las que se requiere activar a más de una interrupción, y para ello tenemos que identificar per- fectamente dónde se encuentran los bits bandera de cada una de las inte- rrupciones. Ya dentro del código de programa de una interrupción, normalmente lo que se tiene que hacer es desactivar todas las interrupciones, ya que de lo contrario estando dentro de una, pu- diera generarse una más causando desconcierto y pérdida de la secuen- cia del programa del microcontrolador, y por lo tanto, éste se “perderá” y co- menzará a volverse loco. Quienes tie- nen experiencia en la programación de microcontroladores, pueden mane- jar una interrupción dentro de otra, pe- ro se debe considerar también que la capacidad del stack pointer es tan so- lo de 8 niveles, por lo que se debe te- ner un manejo exacto de las interrup- ciones que se van generando. Después de ejecutar las instruccio- nes por medio de las cuales se da el servicio para atender la causa de la in- terrupción, se tiene que restablecer la activación nuevamente de la interrup- ción, y también limpiar la bandera que indica el estado de la interrupción, pa- ra que el microcontrolador esté prepa- rado para una rutina más. La instruc- ción que se emplea para indicarle al microcontrolador que el servicio de in- terrupción ha sido ejecutado en su to- talidad es el “retfie”, y cuando este se ejecuta provoca que se obtengan los datos que se habían alojado en el stack pointer, restituyéndolos a los re- gistros status y apuntador de progra- ma, siendo el apuntador de programa el medio a través del cual el microcon- trolador regresa a la instrucción si- guiente de donde iba ejecutando el programa normalmente. Cabe hacer la mención de que se debe contar con un código de programa para cada una de las interrupciones que van a ser activa- das, para que el microcontrolador “se- pa” el trabajo específico que tiene que realizar de acuerdo a la causa que generó la interrupción. Por último dire- mos que para un microcontrolador PIC, se tienen contempladas diversas fuen- tes que pueden dar origen a una inte- rrupción, por lo que se tiene que revi- sar el manual del microcontrolador PIC que se vaya a utilizar para determinado proyecto. Las fuentes de interrupción más comunes en los microcontrolado- res PIC son las siguientes: • Interrupción externa RB0/INT. • Interrupción TMR0 Overflow. • Interrupción por cambio en el es - tado lógico de los pines del PORTB (pines RB<7:4>). • Interrupción por Comparador. • Interrupción por el ADC. • Interrupción al emplear la EE - PROM de datos. • Interrupción de Tx mediante USART. • Interrupción de Rx mediante USART. • Interrupción CCP (Captura/Com - paración/PWM). • Interrupción CCP1. • Interrupción CCP2. • Interrupción SSP (Puerto Serial Síncrono). • Interrupción PSP (Puerto Parale - lo Esclavo). • Interrupción TMR1 Overflow. • Interrupción TMR2 Match. 55 bsf intcon,toie ;activa el bit que habilita la interrupción específica. bsf intcon,gie ;activa al habilitador general de interrupciones. Tabla 59b
  • 58.
    Implementación de un Retardopor Timer El timer dentro de un microcontro- lador es una herramienta muy valiosa, sobre todo para establecer una tem- porización con un buen nivel de exac- titud. Podemos diseñar un proceso de conteo de tiempo por medio del esta- blecimiento de bucles de retardo, pero el microcontrolador no tendría la ca- pacidad de realizar más tareas, y so- lamente se dedicaría a “perder” el tiempo, y será sólo hasta que se con- suma el tiempo calculado, cuando el microcontrolador podrá dedicarse a la atención de otras actividades. Imagi- nen la temporización de 1 sólo minu- to, y mientras también se está leyen- do la información de los signos vitales de una persona a través de los res- pectivos sensores, si el microcontrola- dor no hace otra cosa mientras se consume el tiempo de la temporiza- ción, ¡el paciente se nos puede morir! Es aquí donde toma importancia el empleo de los timers con los que cuente el microcontrolador, ya que mientras se controla el conteo de tiempo, en el mismo momento el mi- crocontrolador puede estar realizando alguna otra tarea. El timer que sea activado le avisa al microcontrolador PIC por medio de una interrupción que ha terminado con un conteo de tiempo. Aunque de manera rigurosa, lo que cuentan los ti- mer son los ciclos de ejecución de las instrucciones de un programa en un microcontrolador, pero a la vez la eje- cución de una instrucción consume un tiempo, el cual sabemos su valor. Por lo tanto, de manera indirecta sabre- mos el tiempo total que se consumió al llevar a un contador desde el valor de 00H al valor de FFH. Podemos decir que un timer bási- camente es un registro, que hace la función de un contador que puede es- tar conformado por 8 ó 16 bits, tenien- do como actividad principal la de ir in- crementando unidad por unidad el va- lor del correspondiente registro. De manera ilustrativa explicaremos la manera en que opera un timer, consi- derando en primer instancia uno de 8 bits, por lo que el correspondiente conteo en números hexadecimales comenzará en el valor 00H, posterior- mente continuará con el valor 01H, después el 02H y así sucesivamente hasta llegar al valor máximo que es FFH, pero ahí no se detiene el conteo del registro contador del timer, por lo que si se presenta un incremento más, el número siguiente será el 00H, siendo este “desbordamiento” el que genere una interrupción, avisando que en el registro contador del timer se ha llegado al conteo máximo de eventos (para un registro de 8 bits, se- rán 256 que van de 00 a FF en hexa- decimal). Si el timer es de 16 bits los valores del registro contador comen- zarán en el número hexadecimal 0000H, continuarán en 0001H, des- pués en 0002H, y así sucesivamente hasta llegar al número FFFFH (para un registro de 16 bits, se realizarán 16536 conteos que van desde 0000 a FFFF en hexadecimal), y cuando se genere un incremento más se produ- cirá un “desbordamiento”, dejando en el registro contador del timer el valor 0000H, lo cual dará origen a que acontezca una interrupción. El incremento del número alojado en el registro contador del timer, se va dando de manera automática cuando las instrucciones del programa del mi- crocontrolador se van ejecutando una a una, para ello, previamente se tuvo que haber activado y configurando el correspondiente timer. Cada una de las instrucciones puede consumir de 1 a 2 ciclos de instrucción, que es el tiempo en que se ejecuta una instrucción (pa- ra mayor referencia consulte el capitu- lo “conjunto de instrucciones y su for- mato” perteneciente al modulo I). Co- mo se indicó anteriormente, el incre- mento del registro contador se va dan- do cuando se van ejecutando las ins- trucciones. Por lo tanto, el programa principal que va controlando las activi- dades del microcontrolador puede es- tar en operación normal realizando las actividades correspondientes al siste- ma de control que se implementó, y se- rá hasta que se genere un desborda- miento cuando se produzca una inte- rrupción, pasando a ejecutar un pro- grama alterno que también se encuen- tra dentro del microcontrolador. El Timer de 8 Bits (TMR0) Configurar el timer de 8 bits es una de las actividades más sencillas que se pueden realizar dentro de un mi- crocontrolador PIC. De hecho la acti- vidad más compleja se realiza des- pués, cuando se escribe el código del programa de la interrupción del timer, pero dejemos por el momento la expli- cación de este detalle, y nos concen- traremos en la tarea de configurar el timer de 8 bits. El registro principal que se tiene que intervenir para configurar al timer de 8 bits también conocido como ti- mer0 en el microcontrolador PIC, es el identificado como “OPTION REG” (op- tion) y en el se configuran los bits que se describen a continuación: El bit 5 del registro OPTION REG se coloca en estado lógico “0” ó “1”, de acuerdo dónde se quiera tomar la fuente que da origen al incremento del conteo que se realiza en el registro contador del timer, tomando en cuen- ta que la manipulación del conteo se puede dar a través del pulso que en- tregue un circuito oscilador externo, conectado a la terminal del microcon- trolador identificada como RA4/T0C- KI, o el conteo también se puede dar empleando el circuito de reloj interno que posee el microcontrolador. El bit 5 del registro OPTION REG se identifica como T0CS (Bit selector del origen del reloj del TMR0). A continuación se ex- presan las posibilidades de configura- ción del bit 5. Vea el cuadro 1. A través del bit 3 del registro OP- TION REG se configura el destino del prescaler, que tiene como función la de establecer cuántos ciclos de ins- 56
  • 59.
    trucción deben ejecutarsepara que se tenga un incremento de una unidad en el registro contador del timer. El bit 3 se identifica como PSA (Bit de asigna- ción del Prescaler), el cual se coloca en estado lógico “0” ó “1”, dependien- do de las siguientes posibilidades: vea el cuadro 2. Los bits 2, 1 y 0 del registro OP- TION REG se identifican como PS2, PS1 y PS0 (Bits selectores del rango Prescaler) respectivamente, tienen la tarea de fijar el número de ciclos de instrucción que se deben ejecutar pa- ra que se incremente en una unidad el valor del registro contador del timer. Para ello en la tabla 60, se muestran las combinaciones binarias que pue- den adquirir los bits PS2, PS1 y PS0 generando las diferentes posibilida- des de configuración de las cuales se tiene que seleccionar la más adecua- da en función del valor de la tempori- zación que sea necesario habilitar. Los bits restantes del registro OP- TION REG que no han sido descritos se deben colocar en estado lógico “0” para que el timer0 sea completamen- te configurado. Por otra parte, el deta- lle de este registro se muestra de ma- nera completa en la imagen de la figu- ra 29. Pasando a otra parte de la configuración del ti- mer0, se mencionará que tiene que hacerse uso del manejo de las interrupcio- nes, cada vez que el re- gistro “TMR0” (registro contador del timer0) sufre un desbordamiento de sus datos (cuando pasa del valor FFH al 00H). Es- te desbordamiento es causa- do por la ejecución de las ins- trucciones en el microcontro- lador, que de acuerdo al pres- caler seleccionado se reque- rirá de un cierto número de ciclos de instrucción para que se vaya incrementando de unidad en unidad el valor del registro TMR0. Para que sea entendible la presente expli- cación, emplearemos un ejemplo en donde el valor del prescaler que se ha seleccionado es de 64, equivalente a colocar los datos binarios “1”, “0” y “1” respectivamente en los bits PS2, PS1 y PS0 del regis- tro OPTION REG. Cada vez que se desborda el re- gistro TMR0 se tiene que producir una interrupción para “avisar” que se ha completado un ciclo de tiempo bien establecido, para lo cual en primera instancia se realizan las siguientes operaciones: vea la fórmula 1. Para calcular el tiempo en el que se incrementa en una unidad el valor del registro TMR0, hacer lo siguiente: (Prescaler)*(Tiempo del ciclo de instrucción) = (64)*(1 µseg) = 64 µseg Por último, para calcular el interva- lo de tiempo que se consume (tam- bién llamado Ciclo de tiempo), para generar una interrupción se efectúa la siguiente operación: Ciclo de tiempo = (64 µseg)*(256 conteos en el registro TMR0) Ciclo de tiempo = 16.38 mseg Esto quiere decir que cada 16.38 mseg se produce una interrupción, por lo que para establecer un tiempo base de 1 segundo tenemos que de- terminar el número de interrupciones que se requieren a través de la si- guiente operación: vea la fórmula 2. Para efectos prácticos se tomará la cantidad de 61 interrupciones, para generar un tiem- po base de 1 segundo, claro que para esto es- tamos considerando un oscilador a cristal con un valor de 4 MHz. Dicho sea de paso es- te tiempo no genera exactamente 1 segun- 57 Figura 29. Detalle del registro OPTION_REG. Tabla 60. Configuración del Prescaler del Timer0. Fórmula 1 1 = El Prescaler es asignado al WDT .- Esta configuración se emplea para activar al watch dog. 0 = El Prescaler es asignado al módulo Timer0 .- Esta configuración se emplea para activar al registro TMR0, que es el registro contador del timer. Cuadro 2 1 = Transición en el pin RA4/T0CKI.- Esta configuración se emplea para implementar un contador externo de eventos. 0 = Ciclo de reloj Interno (CLKOUT).- Esta configuración se emplea para implementar un temporizador. Cuadro 1
  • 60.
    do, pero esmuy cercano. Una vez que hemos concluido con la realización de las operaciones, y sabemos de la can- tidad de interrupciones que se tienen que efectuar para generar una tempo- rización base de 1 segundo, en la ru- tina de interrupción del microcontrola- dor se tiene que contemplar el empleo de un contador, cuya tarea principal será registrar el número de interrup- ciones que se van produciendo. Cuando este contador llegue a un va- lor de 61 quiere decir que ha transcu- rrido aproximadamente 1 segundo. Ahora contamos con una base de tiempo con la cual podemos generar el programa para implementar un re- loj. La manera de activar la interrup- ción cuando sea detectado el desbor- damiento del valor del registro TMR0, es por medio del registro identificado como “INTCON” del cual se manipu- lan los bits 7 y 5 de acuerdo con la si- 58 Tabla 61. Programa para controlar los bits de un puerto por medio del timer de 8 bits.
  • 61.
    guiente explicación. Elbit 7 del registro INTCON que se identifica como GIE (Habilitación Global de las Interrupciones), se debe colocar en estado lógico “1”, para que sean habilitadas todas las inte- rrupciones, mientras que si es colocado un “0” lógico en el bit GIE, implicará que las interrupciones sean inhabilitadas. A continuación se muestra de manera resumida lo ex- presado. 1 = Habilita todas las interrupcio - nes no enmascarables 0 = Deshabilita todas las interrup - ciones El bit 5 del registro INTCON que se identifica como T0IE (Habilita la in- terrupción por desbordamiento en el TMR0), se debe colocar en estado ló- gico “1”, para que la interrupción por desbordamiento en el conteo del re- gistro TMR0 surta efecto, por otra par- te, se debe colocar en “0” lógico para deshabilitarlo. 1 = Habilita la interrupción del TMR0 0 = Deshabilita la interrupción del TMR0 Los bits restantes del registro INT- CON que no se emplean para el ti- mer0, deben permanecer en estado lógico “0”. El detalle del registro INT- CON se muestra en la imagen de la fi- gura 30. La bandera que indica que ha sido activada la interrupción, por desbor- damiento en el conteo del registro TMR0, está implementada en el bit 2 del registro INTCON el cual se identi- fica como TOIF, siendo el estado lógi- co de este bit el que indica que se ge- neró una interrupción. Cuando esto suceda el bit TOIF se colocará en el estado lógico “1”. En la tabla 61, se muestra el códi- go completo para programar al micro- controlador PIC, empleando el timer de 8 bits para controlar el encendido y apagado de los leds del puerto C a una frecuencia de 1 Hz aproximada- mente. Por otra parte, se está configu- rando un microcontrolador PIC 16F874, pero exactamente el mismo procedimiento se puede realizar con cualquier otro microcontrolador PIC. El Timer de 16 Bits (TMR1) El timer de 16 bits es muy similar en su forma de operar al timer de 8 bits, teniendo como diferencia princi- pal que el timer de 16 bits, emplea 2 registros de 8 bits para realizar un conteo ya sea de eventos o de tiempo, por consiguiente, se dispone tanto de una resolución como con valores mu- cho más amplios en cuanto al estable- cimiento de un valor de tiempo o un número de eventos a contabilizarse respectivamente. El primer registro que tiene que ser intervenido para configurar al ti- mer de 16 bits (también conocido co- mo timer1) en el microcontrolador PIC, es el identificado como “T1CON” y en el se configuran los bits que se describen a continuación: Los bits 5 y 4 del registro T1CON se identifican como T1CKPS1 y T1CKPS0 (Bits selectores del rango Prescaler del reloj) respectivamente, se colocan ya sea en estado lógico “0” ó “1”, de acuerdo a la combinación bi - naria que se forma entre los 2 bits, pa - ra generar un valor que a su vez co - rresponde con el número de ciclos de instrucción que se de - ben ejecutar para que se incremente en una unidad el valor del regis - tro contador del timer. En la tabla 62 se mues - tran las 4 combinacio - nes binarias que se pue - den formar a partir de los bits T1CKPS1 y T1CKPS0, gene - rando las diferentes posibilidades de configuración, de las cuales se tiene que seleccionar la más adecuada, en función del valor de la temporización o el número de eventos que sea necesa - rio contabilizar. El bit 3 del registro T1CON que se identifica como T1OSCEN (Bit de con- trol del oscilador del timer1), tiene la función de habilitar 2 terminales del microcontrolador PIC para que a tra- vés de ellas se reciba la información de un disparo externo, que a su vez alimenta a un oscilador interno en el microcontrolador. El oscilador interno es empleado para sincronizar la señal externa con el proceso posterior que realiza el timer1, contribuyendo con la generación de una señal apropiada tomando en cuenta que el disparo ex- terno puede ser de no muy buena ca- lidad, por lo que el oscilador interno además posee de un circuito dispara- dor de Schmitt. El disparo externo puede emplearse para contabilizar tiempo o número de eventos. Las ter- minales que son habilitadas en el mi- crocontrolador por medio del bit T1OSCEN, se identifican como RXX- /T1OSI/XXX y RYY/T1OSO/T1C- KI/XXX (los términos RXX, RYY, XXX e YYY dependen del microcontrolador que se este empleando, por lo tanto 59 Fórmula 2 Figura 30. Detalle del registro INTCON. Tabla 62.Configuración del Prescaler del Timer1.
  • 62.
    se les recomiendaconsultar el manual del microcontrolador PIC correspon- diente), estas terminales quedan con- figuradas como entradas, por lo que los 2 bits relacionados en el registro TRIS de configuración del determina- do puerto son ignorados. 1 = Oscilador habilitado .- Esta configuración se emplea para configurar a las terminales T1OSI y T1OSO/T1CKI como entradas. 0 = Oscilador apagado.- Por medio de esta configuración se deshabilita al oscilador interno, que - dando las terminales T1OSI y T1O - SO/T1CKI para otras aplicaciones. El bit 2 del registro T1CON que se identifica como T1SYNC (Bit de con- trol de sincronización del disparo ex- terno), tiene la tarea de sincronizar o no el disparo externo del timer1, con el oscilador interno del microcontrola- dor. Cuando se configura el timer1 pa- ra trabajar en el modo sincronizado, el microcontrolador no se debe colocar en el modo de ahorro de energía (mo- do sleep), mientras que por otra parte, cuando se configura el timer1 para funcionar en el modo no sincronizado, no importa que el microcontrolador se encuentre en el modo de ahorro de energía, porque el timer seguirá traba- jando y aun así producirá su respecti- va interrupción, provocando que el mi- crocontrolador se “despierte”. La con- figuración del bit T1SYNC, a su vez depende del estado que se tenga en el bit TMR1CS que también se en- cuentra dentro del registro T1CON. A continuación se expresan las posibili- dades de configuración del bit 2. Si el bit TMR1CS se encuentra en 1 lógico: T1SYNC = 1.- No sin - croniza el reloj externo. T1SYNC = 0.- Sincro - niza el reloj externo. Si el bit TMR1CS se encuentra en 0 lógico: El bit T1SYNC es ignorado, por lo tanto, el Timer1 emplea el reloj inter - no. El bit 1 del registro T1CON que se identifican como TMR1CS (Bit que controla la selección del origen del os- cilador), tiene la tarea de seleccionar la fuente que origina la generación de la señal de reloj con la que el timer realizara su función. Se cuenta con 2 posibilidades de configuración para por medio de la señal de reloj, incre- mentar el valor de los registros del ti- mer 1, estas opciones se encuentran entre el empleo del reloj interno (equi- valente a dividir la frecuencia del osci- lador entre 4) del microcontrolador PIC, y la utilización de un circuito os- cilador externo, el cual se conectaría a la terminal identificada como …/T1O- SO/T1CKI/… aclarando que con la presente configuración, el incremento de los registros del timer 1 se darán cuando se presente el flanco de as- censo en la oscilación externa. 1 = Oscilador externo.- Esta configuración permite el em - pleo de un oscilador externo conecta - do en la terminal T1OSO/T1CKI. 0 = Reloj interno .- Habilitación del oscilador por me - dio del reloj interno (La frecuencia de oscilación se di - vide entre 4). El bit 0 del registro T1CON que se identifica como TMR1ON (bit que en- ciende la timer 1), tiene la misión de activar la operación del timer 1. 1 = Activa el Timer 1 0 = Detiene el Timer 1 Los bits 5 y 6 del registro T1CON no se emplean y siempre se mantie- nen en estado lógico “0”. A continua- ción en la imagen de la figura 31 se muestra el detalle del registro. Después de configurar al timer 1, continuaremos con la explicación de su operación tomando en cuenta el empleo de la correspondiente inte- rrupción, la cual se invocará cada vez que el dato de 16 bits alojado en los registros “TMR1H” y “TMR1L” (parte alta y baja del dato de 16 bits), se des- borda y pasa del valor FFFFH al 0000H. El dato de 16 bits se va incremen- tando de unidad en unidad, a través de la ejecución de las instrucciones en el microcontrolador, que de acuerdo con el prescaler fijado anteriormente, se requerirá un cierto número de ci- clos de instrucción para que se vaya incrementando el valor alojado en los registros TMR1H y TMR1L. Para que se entienda mejor lo que se ha descri- to, recurriremos al empleo de un ejemplo en el cual el valor del presca- ler será de 4. Para ello se requiere co- locar los estados lógicos de “1” y “0” respectivamente en los bits T1CKPS1 y T1CKPS0 que pertenecen al registro T1CON. Por otra parte, será imple- mentada la operación del reloj interno, para generar la oscilación que tenga la misión de incrementar al valor de 16 bits. Por lo tanto, serán colocados en estado lógico “0” los bits identificados como T1OSCEN, T1SYNC y TMR1CS, mientras que el bit TM- R1ON se debe fijar en el estado lógi- co “1” para encender al timer 1; re- cuerde que estos bits se encuentran dentro del registro T1CON. A continuación mostraremos la manera de realizar unos cálculos ma- temáticos muy sencillos, para determi- nar qué es lo que sucede cada vez que se desborda el valor del dato con- tenido en los registros TMR1H y TMR1L. Cuando se suscita el desborda- miento se genera una inte- rrupción, que será la en- 60 Figura 31. Detalle del registro T1CON.
  • 63.
    cargada de “indicar”que se ha com- pletado un ciclo de tiempo bien esta- blecido, para lo cual en primera ins- tancia se realizan las siguientes ope- raciones: vea la fórmula 3. Para calcular el tiempo en el que se incrementa en una unidad el valor del dato contenido en los registros TMR1H y TMR1L se realiza lo siguien- te: ( P r e s c a l e r - )*(Tiempo del ci - clo de instruc - ción) = (4)*(1 µseg) = 4 µseg Por último, para calcular el inter- valo de tiempo que se consume (también llamado Ciclo de tiempo), para generar una interrupción se efectúa la si- guiente opera- ción: Ciclo de tiempo = (4 µseg)*(65536 conteos en los re - gistros TMR1H y TMR1L) Ciclo de tiempo = 262.14 mseg El dato obtenido en el Ciclo de tiempo, significa que cada 262.14 mseg se genera una interrupción, por lo que para determinar un tiempo base de 1 segundo se tiene que contabilizar el número de interrupciones que son necesarias, y para calcularlas lo hace- mos mediante la siguiente operación: vea la fórmula 4. El número de interrupciones es de 3.81, de las cuales se pueden conta- bilizar perfectamente en el microcon- trolador las 3 interrupciones, pero el valor de 0.81 no se pude manejar por medio de interrupciones, y como se trata de un valor considerable porque casi se trata del valor de una interrup- ción (pero sin llegar a ella), se debe considerar para que la base de tiempo que estamos diseñando sea muy cer- 61 Fórmula 4 Fórmula 3 Tabla 63. Programa para controlar los bits de un puerto por medio del timer de 16 bits.
  • 64.
    cana a 1segundo. Por ello, en el pro- grama se implementó después de contabilizar las 3 interrupciones, un comparador en el cual se revisa que se encuentre el dato CF5CH en los re- gistros TMR1H (con el valor CFH) y TMR1L (con el valor 5CH). El valor CF5CH equivale al 81% del valor de un conteo total tomando en cuenta 16 bits (del 0000H al FFFFH), y se consideró el 81% por- que equivale al valor de 0.81 del total de las interrupciones. Para efectos prácticos generar un tiempo base de 1 segundo al conside- rar la cantidad de 3.81 interrupciones, se está considerando un oscilador a cristal con un valor de 4 Mhz, y dicho sea de paso, la base de tiempo que se diseñó (de 1 segundo) no genera exactamente 1 segundo, pero es muy cercano. Cuando hemos terminado de con- figurar al timer 1, además de haber calculado la cantidad de interrupcio- nes que se tienen que generar para lograr una temporización base de 1 segundo, se tiene que agregar en el código correspondiente de la rutina de interrupción del timer 1 un registro contador, cuya misión básica es la de verificar que el número de interrupcio- nes que se produzcan sean precisa- mente las que se calcularon. El regis- tro contador recibe el nombre de “con- tinte”. Para que se active la interrup- ción originada por el desbordamiento en el conteo del valor que se encuen- tra dentro de los registros TMR1H y TMR1L, es necesario que sean inter- venidos los bits 7 y 6 que se encuen- tran contenidos en el registro identifi- cado como “INTCON”, además del bit 0 del registro “PIE1”, de acuerdo con lo siguiente. El bit 7 del registro INT- CON que se identifica como GIE (Bit de habilitación Glo- bal de las Interrupciones), se debe colocar en estado lógico “1”, para que sean habilitadas todas las inte- rrupciones, mientras que si un “0” lógico es colocado en el bit GIE, todas las interrupciones serán inhabi- litadas. A continuación se muestra un resumen de lo expresado. 1 = Habilita todas las interrupcio - nes no enmascarables. 0 = Deshabilita todas las interrup - ciones. El bit 6 del registro INTCON que se identifica como PEIE (Bit que Habi- lita las interrupciones por periférico), se debe colocar en estado lógico “1”, para que la interrupción por desborda- miento en el conteo de los registros TMR1H y TMR1L surta efecto, ya que el timer 1 se encuentra clasificado co- mo elemento periférico. 1 = Habilita las interrupciones por periférico. 0 = Deshabilita las interrupciones por periférico. Los bits restantes del registro INT- CON que no se emplean para el ti- mer1, deben de permanecer en esta- do lógico “0”. El detalle del registro INTCON se muestra en la imagen de la figura 32. El bit 0 del registro PIE1 que se iden- tifica como TMR1IE (Bit que Habilita la interrupción por desbordamiento del timer 1), se debe colocar en estado ló- gico “1”, para que sea el encargado de generar la correspondiente interrup- ción por desbordamiento en el conteo de los registros TMR1H y TMR1L. El detalle del registro PIE1 se muestra en la imagen de la figura 33. 1 = Habilita la interrupción por desbordamiento en el timer 1. 0 = Deshabilita la interrupción por desbordamiento en el timer 1. El bit que hace la función de “ban- dera”, por medio de la cual se indica que ha sido activada la interrupción por efecto del timer 1, es el que se identifica como TOIF (bit 2) y se en- cuentra alojado en el registro INTCON. Este bit se coloca en estado lógico “1” cuando ocurre la interrupción, por lo tanto, una vez que se accede a la eje- cución del código correspondiente, an- tes de salir del servicio de interrupción, se tiene que limpiar el bit TOIF (colo- carlo en estado lógico “0”). Por último, en la tabla 63 se muestra el código completo para programar al microcon- trolador PIC, empleando el timer de 16 bits para controlar el conteo ascenden- te de los leds conectados al puerto C, llevándose a cabo el conteo con una frecuencia de 1 Hz aproximadamente. Por otra parte, como una notación adi- cional, mencionaremos que se esta configurando un microcontrolador PIC16F874, pero exactamente el mis- mo procedimiento de programación se puede implementar en cualquier otro microcontrolador PIC. Configuración de la USART Los microcontroladores pueden contar con algún módulo de comuni- cación, para que intercambien datos ya sea con otro microcontrolador, o con un circuito electrónico conectado de manera externa, o inclusive con una PC. El módulo que se- rá explicado a continua- ción, de manera general se considera como una Inter- fase de Comunicación Se- rial (SCI por sus siglas en inglés) que poseen algu- nos microcontroladores PIC. El nombre específico de la SCI es Universal Sin- 62 Figura 33. Detalle del registro PIE1. Figura 32 Detalle del registro INTCON.
  • 65.
    crona Asíncrona ReceptorTransmisor (USART). La USART trabaja mediante el protocolo de comunicación serial co- nocido como RS-232, en el cual se es- tablece que la transmisión de datos se realiza a través de un hilo conductor, enviando un solo bit cada vez, esto quiere decir que sí el dato se encuen- tra conformado por 8 bits, se estará transmitiendo bit por bit hasta comple- tar la transferencia de los 8 bits. La comunicación serial implemen- tada bajo el protocolo RS-232, implica el manejo de un bit de inicio para que el dispositivo transmisor (Tx) le “avise” al receptor (Rx) que un dato va a co- menzar a transferirse, este bit de ini- cio se forma a partir del cambio que sufre la señal en la línea de transmi- sión, pasando del estado lógico “1” a “0” (flanco de descenso), para una mejor referencia observe la imagen de la figura 34. Cabe hacer mención que en la línea de transmisión cuando se encuentra inactiva (sin datos viajando a través de ella), se presenta el esta- do lógico “1”, indicando que la línea se encuentra desocupada. Posteriormente al establecimiento del bit de inicio, se comienza con el envío de los bits que conforman al da- to que se tiene que transferir, conside- rando que el protocolo RS-232 acepta que pueda ser de un tamaño ya sea de 8 bits o de 9 bits, los cuales tienen que configurarse tanto en el equipo transmisor como en el receptor. Como paso siguiente a la transmi- sión de los bits que conforman al da- to, de manera opcional se puede con- figurar el envío de un bit de paridad, o prescindir de éste, de acuerdo con la norma que regula al protocolo RS- 232, y de igual manera si es configu- rado el empleo de un bit de paridad en el equipo transmisor, también tiene que agregarse al correspondiente equipo receptor. Para dar por terminada la transmi- sión de un dato, el equipo transmisor le “informa” al receptor que ha termi- nado con el envío, por medio del em- pleo de un bit identificado como de pa- ro, el cual puede estar implementado por un solo bit o por 2 de acuerdo con el protocolo RS-232. Por ejemplo cuando se tiene la configuración de 8 bits de datos, 1 bit de paro y 0 (cero) bits de paridad, en total se envía una cantidad de 10 bits, considerando al bit de inicio, más 8 bits de datos, más 1 bit de paro. El envío de esta serie de bits, consume un determinado tiempo, por lo tanto también se tiene que sin- cronizar al equipo transmisor con el equipo receptor, para que no exista pérdida de información. Cuando se emplea un microcon- trolador PIC que posea el módulo de comunicación serial USART, tan sólo se tiene que configurar a éste ya sea para transmitir ó recibir ó realizar am- bas actividades. Una de las ventajas del módulo USART es que nosotros nos olvidamos de enviar el bit de ini- cio, el de paro y el de paridad, ya que cuando es habilitado el módulo USART, tan solo debemos cargar el dato que se tiene que transmitir, y el USART se encarga de realizar lo de- más de acuerdo a la forma en cómo fue configurado. A continuación se procederá a describir la manera de configurar tanto el envío, como la re- cepción de datos a través de la USART. USART en Modo Transmisión (TX) Como primer paso se debe ubicar el lugar en donde se encuentran las terminales del microcontrolador PIC, que trabajan con el módulo de comu- nicación serial RS-232. Para ello, de- pendiendo del microcontrolador PIC estas terminales se pueden encontrar ya sea en el puerto B, o el puerto C, etc. Por lo que siempre se recomien- da revisar el correspondiente manual. En la imagen de la figura 35 se muestra un ejemplo de microcontrola- dores PIC típicos, en los que se resal- ta la ubicación de las terminales que trabajan con la USART, y que pode- mos tomar como modelos generales para tomarlos de referencia con res- pecto de cualquier otro PIC. Una vez que se ha definido el microcontrolador que será empleado, y a la vez ubicada la correspondiente terminal de trans- misión (identificada como Tx en los mi- crocontroladores PIC, observe la figu- ra 35), en primer lugar se tiene que configurar el bit correspondiente del puerto donde se ubique esta terminal, como terminal de salida de datos. A continuación se muestra el correspon- diente código con el cual se ejemplifi- ca la manera en que puede ser confi- gurado el bit que contiene la transmi- sión de datos; este bit tiene que ser configurado de tal manera que la infor- mación salga del microcontrolador, por lo tanto, la configuración de la terminal Tx tiene que ser como salida, recor- dando que la ubicación de la terminal Tx, depende del microcontrolador que se esté empleando. Para el ejemplo que se describe a continuación consi- deremos que se tiene un microcontro- lador PIC16F87X. Ver el cuadro 3. Cuando hemos realizado la configura- ción del puerto donde se encuentra la terminal de transmisión, procedemos como paso siguiente a la activación de la herramienta USART para que el mi- crocontrolador pueda transmitir un da- to de manera serial, para ello se tienen que configurar los bits que integran al registro identificado como “TXSTA”, de acuerdo a como se muestra a conti- nuación. El bit 7 del registro TXSTA 63 Figura 34. Protocolo de comunicación RS-232.
  • 66.
    que se identificacomo CSRC (Bit que controla el origen de la señal de reloj), tiene la tarea de seleccionar un modo de operación del microcontrolador (co- mo maestro o esclavo), si es que su módulo USART se encuentra configu- rado en el modo de operación “síncro- na”. De manera contraria, sí el modulo USART se configuró para operar de manera “asíncrona”, este bit tiene que ser ignorado no importando su estado lógico. Sí el módulo USART está configu- rado en modo asíncrono: CSRC no importa el estado lógico en que se coloque. Sí el módulo USART está configu- rado en modo síncrono: CSRC = 1.- Modo Maestro (el reloj se genera internamente del BRG). CSRC = 0.- Modo Esclavo (el reloj se toma de manera externa). El bit 6 del registro TXSTA que se identifica como TX9 (bit que habilita la transmisión de 9 bits), se debe colocar en estado lógico “1”, para que surta efecto el envío de 9 bits que confor- marán al dato que será transmitido, mientras que al colocar el bit TX9 en estado lógico “0”, configura a la USART para que se transmitan datos compuestos por 8 bits. 1 = Configura la transmisión de datos de 9 bits. 0 = Configura la transmisión de datos de 8 bits. El bit 5 del registro TXSTA que se identifica como TXEN (bit que habilita la transmisión de datos), se debe co- locar en estado lógico “1”, para que sea activada la transmisión de datos por medio del módulo USART. Cuan- do el bit TXEN se coloca en estado ló- gico “0” se tiene como consecuencia la inhabilitación de la transmisión por medio del módulo USART. 1 = Habilita la transmisión de datos. 0 = Desactiva la transmisión de datos. Por medio del bit 4 del registro TXSTA que se identifica como SYNC (bit que selecciona el modo de opera- ción de la USART), se determina el modo de operación del módulo USART, teniéndose la posibilidad de seleccionar entre la operación síncro- na o asíncrona. 1 = Modo Síncrono. 0 = Modo Asíncrono. El bit 2 del registro TXSTA que se 64 Figura 35. Ubica - ción de las termi - nales de la USART en los PICs. bsf status,rp0 ;cambiar al banco 1 bcf status,rp1 movlw b'X0XXXXXX' ;configura el bit 6 como salida, los demás bits no importan de momento movwf trisc ;enviar configuración al registro del puerto C Cuadro 3
  • 67.
    identifica como BRGH(bit de selección de alta taza de transferencia), tiene la tarea de seleccionar entre las po- sibilidades de transmitir a baja o alta velocidad, si es que su módulo USART se encuentra configurado en el modo de operación “asín- crona”. De manera contra- ria, sí el modulo USART se configuro para operar de manera “síncrona”, este bit no se emplea, por lo que no importa su estado lógico. Sí el módulo USART esta configurado en modo asíncrono: BRGH = 1.- Alta veloci - dad de transmisión. BRGH = 0.- Baja veloci - dad de transmisión. Sí el módulo USART esta configurado en modo síncrono: BRGH no importa el es - tado lógico en que se colo - que. El bit 1 del registro TXSTA que se identifica como TRMT (bit que confi- gura el estado de la transmisión), se emplea para configurar la indicación de cuando un dato sea transmitido, esto es, se generara un aviso cuando el dato sea transmitido completamen- te (TSR vacío) o cuando el dato aun no comience a transmitirse (TSR lle- no). 1 = TSR vacío. 0 = TSR lleno. El bit 0 del registro TXS- TA que se identifica como TX9D (bit que conforma al noveno bit de datos o tam- bién puede ser el bit de pa- ridad), se utiliza solamente cuando se configura al módulo USART para que transmita 9 bits de datos, o cuando se habilita el empleo del bit de paridad. Si el módulo USART se configura para transmitir 8 bits de datos, sin bit de pa- ridad, el bit TX9D no se emplea y por lo general se le carga el estado lógico “0”. El bit 3 del registro TXSTA no se emplea por lo que debe permanecer en estado lógico “0”. El detalle del re- gistro TXSTA se muestra en la imagen de la figura 36. Cuando el registro TXSTA ha sido configurado, procederemos a determi- nar el valor de la tasa de trasferencia de los datos. Este término que en in- glés se escribe como “baud rate”, de- talla la cantidad de bits que por segun- do son transmitidos. Se trata de un término muy importante, ya que si en- tre el elemento transmisor y el recep- tor no se tiene el mismo valor, enton- ces se perderán bits provocando que el dato transmitido sea totalmente di- ferente al original. En los microcontroladores PIC, re- currimos a una serie de valores “co- merciales” para configurar al módulo USART, los cuales pueden ser 9600 baudios (9600 bits por segundo) ó 4800 ó 2400, etc. Estos valores y otros más los encontramos agrupados 65 Figura 36. Detalle del registro TXSTA. Tabla 64. Tasa de transferencia para el modo Síncrono.
  • 68.
    en tablas, comolas que se encuentran identifica- das con los números 64, 65 y 66. A continuación se ilustran las diferentes tablas por medio de las cuales se determina el valor de la tasa de transferencia de los datos. Dentro de las tablas se observa que existe un valor en forma- to decimal, que es el que tiene que cargarse al re- gistro “SPBRG”, para fijar la cantidad de bits que por segundo serán trans- mitidos. Para definir el valor que se le cargará registro SPBRG, se debe de to- mar en cuenta el valor de la tasa de transferencia (baud rate), además del valor del oscilador que se le conecte al microcon- trolador (FOSC). Poste- riormente tomar en cuen- ta el valor de la tasa de transferencia real a la que serán transmitidos los datos (Kbaud), y por ende el error involucrado. Con este último paso ha quedado configurado el módulo USART para que transmita datos, por lo que ahora se tiene que cargar el valor del dato que se quiere transmitir, en el registro llamado “TXREG” (buffer de transmisión). Cuando se guarda un dato en el re- gistro TXREG, de inme- diato se comienza a transferir enviando bit a bit (obviamente de mane- ra previa se configuro y activo la USART) hacia la terminal del microcontro- lador identificada como Tx. 66 Tabla 66. Tasa de transferencia para el modo Asíncrono cuando BRGH = 1. Tabla 65. Tasa de transferencia para el modo Asíncrono cuando BRGH = 0.
  • 69.
    De alguna manera,el módulo USART debe tener el conocimiento de cuando termine de realizar un envío de datos, para no cometer el error de transferir un siguiente dato cuando no ha terminado con el anterior. Para es- to último se cuenta con 2 posibilida- des de configuración. En la primera de ellas se puede activar el aviso por me- dio de una interrupción, por medio de fijar el estado lógico “1” en el bit TXIE que se encuentra en el registro PIE1; teniendo su respectiva bandera en el bit TXIF que se encuentra en el regis- tro PIR1, la cual se colocara en esta- do lógico “1” cuando el dato que se esta transmitiendo haya sido comple- tamente transferido, o dicho de otra manera, cuando el dato que se alojo en el registro TXREG se ha enviado completamente. La segunda manera de indicar que un dato ha sido trans- mitido, es simplemente esperar a que sean enviados todos los bits que com- ponen al dato, por medio de la instruc- ción “btfss pir1, txif”, en la cual tam- bién se puede ocupar a la bandera TXIF del registro PIR1, para saber en que momento se ha vaciado el buffer de transmisión. En la tabla 67 se muestra una propuesta de código pa- ra configurar a la USART en el modo de transmisión asíncrona. USART en Modo Recepción (RX) Una vez que han sido identifica- dos los pines del microcontrolador que contienen las terminales de trans- misión y recepción de datos mediante el modulo USART, sabremos como configurar dichos pines. Se muestra en la imagen de la figura 35 para una mejor referencia, un ejemplo típico de la ubicación de las terminales en 3 mi- crocontroladores PIC diferentes. Cuando ya se sabe que microcon- trolador a de ser empleado, en auto- mático de conoce la ubicación de la terminal de recepción de datos (iden- tificada como Rx en los microcontrola- dores PIC, observe la figura 35), en primer instancia se tiene que configu- rar el bit correspondiente del puerto donde se ubique esta terminal, como terminal de entrada de datos. En seguida se muestra el frag- mento de código mediante el cual se configura al bit que contiene la recep- ción de datos, el cual se encuentra dentro del correspondiente registro “tris”. Este bit tiene que ser configura- do de tal manera que la información pueda acceder al microcontrolador, por lo tanto, la configuración de la ter- minal Rx tiene que ser como entrada. Nuevamente recordamos que la ubi- cación de la terminal Rx depende del microcontrolador que se este em- pleando. Para el ejemplo que se des- cribe a continuación consideremos que se tiene un microcontrolador PIC16F87X. Vea el cuadro 4. Cuando hemos realizado la confi- guración del puerto donde se encuen- tra la terminal de recepción, procede- mos a la manipulación de registros del microcontrolador PIC para poder acti- var la USART, dejando al microcontro- lador en la tarea de recibir datos de manera serial, para ello se tienen que configurar principalmente los bits que integran a los registros identificados como TXSTA, SPBRG, RCSTA y PIE1, de acuerdo a la explicación si- guiente. Del registro TSXTA se toma princi- palmente el bit 7 (CSRC.-Bit que con- trola el origen de la señal de reloj), el bit 4 (SYNC.- bit que selecciona el modo de operación de la USART), y el bit 2 (BRGH.- bit de selección de alta taza de transferencia). Los demás bits se emplean para configurar a la activi- dad de transmisión de datos seriales, motivo por el cual no se manipulan a menos que se vaya a emplear a la USART en el modo full duplex (recep- ción y transmisión de datos al mismo tiempo). La explicación del detalle de los bits CSRC, SYNC y BRGH se en- cuentra en el apartado “USART en modo transmisión”, y el detalle de la composición del registro TXSTA se muestra en la figura 36. Otro registro que también debe ser manipulado es el identificado co- mo “spbrg”, siendo a través de este registro el medio para determinar el valor de la tasa de trasferencia de los datos (baud rate), con la cual serán recibidos por el microcontrolador PIC. 67 Tabla 67 Fragmento de Programa para activar la USART en modo transmisión. bsf status,rp0 ;cambiar al banco 1 bcf status,rp1 movlw b'1XXXXXXX' ;config el bit 7 como entrada, los demás bits no importan de momento movwf trisc ;enviar configuración al registro del puerto C Cuadro 4
  • 70.
    Los distintos valoresde tasa de trasfe- rencia se encuentran indicados en las tablas 64, 65 y 66, recordando que la tasa de trasferencia en un microcon- trolador PIC, depende de valor que se tenga en el circuito oscilador del PIC. A continuación para que sea com- pletamente configurada la herramien- ta USART del microcontrolador PIC, tienen que ser manipulados los bits que integran al registro identificado como RCSTA, tal como se explica a continuación. El bit 7 del registro RCSTA que se identifica como SPEN (Bit que habilita al puerto serie del PIC), tiene como actividad principal la de habilitar tanto a la terminal identificada como Tx y Rx, para que realicen la función de co- municar de manera serial al microcon- trolador, por lo que una vez que ha si- do activado este bit, se establecen los niveles eléctricos correspondientes sobre las terminales Tx y Rx. 1 = Puerto serial Habilitado. 0 = Puerto serial Deshabilitado. El bit 6 del registro RCSTA que se identifica como RX9 (bit que habilita la recepción de 9 bits), se debe colocar en estado lógico “1”, para que surta efecto la recepción de 9 bits que con- formarán al dato que será recepciona- do, mientras que al colocar el bit TX9 en estado lógico “0”, configura a la USART para que se reciban datos compuestos por 8 bits. Recuerde que se coloca la recepción de 9 bits de da- tos, cuando en la transmisión se tie- nen también 9 bits de datos, por lo tanto, el dispositivo transmisor como el receptor deben estar fijos con el mismo número de bits que conforman al dato que será intercambiado. 1 = Configura la recepción de da - tos de 9 bits. 0 = Configura la recepción de da - tos de 8 bits. El bit 5 del registro RCSTA que se identifica como SREN (bit que habilita la recepción de un solo dato), tiene la tarea de activar la recepción de un so- lo dato, si es que su módulo USART se encuentra configurado en el modo de operación “síncrona”. De manera contraria, sí el modulo USART se con- figuro para operar de manera “asín- crona”, este bit tiene que ser ignorado no importando su estado lógico. Sí el módulo USART esta configu- rado en modo asíncrono: SREN no importa el estado lógico en que se coloque. Sí el módulo USART esta configu- rado en modo síncrono como maestro: SREN = 1.- Activa la recepción de un solo dato. SREN = 0.- Desactiva la recepción de un solo dato Este bit se limpia antes de que la recepción se haya completado. Sí el módulo USART esta configu- rado en modo síncrono como esclavo: SREN no se emplea bajo esta va - riante. Por medio del bit 4 del registro RCSTA que se identifica como CREN (bit que habilita la recepción continua de datos), el modulo USART del mi- crocontrolador PIC, tiene la tarea de recibir de manera continua todos los datos que se le envíen, aun cuando se encuentre configurado tanto en el mo- do asíncrono como síncrono. Sí el módulo USART esta configu- rado en modo asíncrono: CREN = 1.- Activa la recepción continua de datos. CREN = 0.- Desactiva la recepción continua de datos. Sí el módulo USART esta configu- rado en modo síncrono: CREN = 1.- Activa la recepción continua de datos, hasta que el bit CREN es limpiado (el bit CREN sobre escribe al bit SREN). CREN = 0.- Desactiva la recepción continua de datos. El bit 3 del registro RCSTA que se identifica como ADEN (bit que habilita la detección de direccionamiento), realiza la activación de la carga del dato recibido en un buffer de memo- ria. Esta actividad solo se puede reali- zar cuando el modulo USART se en- cuentra en el modo de operación asín- crona. Sí el módulo USART esta configu- rado en modo asíncrono, y cuando RX9=1: ADEN = 1.- Activa la detección de la correspondiente dirección de me - moria del buffer, cuando se reciben los datos. ADEN = 0.- Activa la detección de memoria, teniendo la recepción de to - dos los bits, y el noveno bit puede ser empleado como bit de paridad. Sí el módulo USART esta configu- rado en modo síncrono: ADEN no se emplea bajo esta va - riante. El bit 2 del registro RCSTA que se identifica como FERR (bit bandera que indica errores en la trama), muestra por medio del estado lógico “1” sí el dato que fue recibido no cum- ple con el contenido de la informa- ción real, este error se debe a un bit de la información que se encuentre erróneo, este error puede ser corregi- do mediante la implementación del bit de paridad. 1 = Error en la trama (Puede actua - 68
  • 71.
    lizarse leyendo elregistro RCREG, y/o recibiendo el siguiente dato va - lido). 0 = Sin error en la trama. El bit 1 del registro RCSTA que se identifica como OERR (bit ban- dera que indica un sobre flujo de datos), se emplea para detectar sí en el momento que la USART se encuentra recepcionando un dato, llega otro antes de que el primero termine de recepcionarse. 1 = Error por sobre flujo de da - tos (puede limpiarse al limpiar el bit CREN). 0 = Sin error por sobre flujo de da - tos. El bit 0 del registro RCSTA que se identifica como RX9D (bit que confor- ma al noveno bit de datos o también puede ser el bit de paridad), se utiliza solamente cuando se configura al mó- dulo USART para que transmita 9 bits de datos, o cuando se habilita el em- pleo del bit de paridad. Si el modulo USART se configura para transmitir 8 bits de datos, sin bit de paridad, el bit RX9D no se emplea y por lo general se le carga el estado lógico “0”. El detalle del registro RCSTA se muestra en la imagen de la figura 37. Con la configuración del registro RCSTA paso ha quedado configurado el módulo USART para que reciba datos, por lo que ahora debemos de tomar en cuenta que la información que se reciba de manera serial se encontrará aloja- da en el registro llamado “RCREG” (buffer de re- cepción). Cada vez que se recibe un dato por me- dio de la terminal Rx del microcontrolador (previa activación de la USART), se guardan en el registro RCREG, por lo que de in- mediato se debe tomar el dato recep- cionado y cambiarlo a otro registro pa- ra almacenarlo, porque solo existe el registro RCREG para recepcionar los datos, y si no es guardado se perderá cuando suceda una nueva recepción de datos. Cuando el modulo USART se en- cuentra configurado en modo recep- ción, permite que el microcontrolador realice otras actividades, y solo pres- tara atención al dato recibido cuando por medio de una interrupción tome “conciencia” de que un dato acaba de llegar al buffer de recepción (registro RCREG). La configuración de la inte- rrupción se realiza por medio de la fi- jación del estado lógico “1” en el bit RCIE que se encuentra en el registro PIE1. El bit bandera de la interrupción por recepción de dato se encuentra en el bit RCIF que se encuentra en el re- gistro PIR1, esta bandera se colocara en estado lógico “1” cuando el dato que se recepcionó ha llegado de ma- nera completa, o dicho de otra mane- ra, cuando el dato que se alojo en el registro RCREG se ha recibido com- pletamente. Una vez que se produce una interrupción, el contador de pro- grama (program counter) se ubica en la dirección 04, por lo que allí se debe de preguntar cual dispositivo interno del microcontrolador PIC es el que ha generado la interrupción, y para esto es que se emplea la bandera RCIF, ya que sí se encuentra en estado lógico “1” significa que se recibió un dato. Como paso siguiente se tiene que di- reccionar la ejecución del código del programa de la interrup- ción, por medio de un brinco incondicional. Ya dentro del código del programa de la interrup- ción, se debe colocar la menor cantidad de ins- trucciones, por lo que las principales son las si- guientes: Desactivar las interrupciones; pasar el dato recibido a otro re- gistro de memoria (nor- malmente RAM), limpiar la bandera RCREG, vol- ver a activar las interrup- ciones y por último colo- 69 Figura 37. Detalle del registro RCSTA. Tabla 68. Fragmento de Programa para activar la USART en modo recepción. Tabla 69. Fragmento de Programa para configurar atender la interrupción cuando se recibió un dato mediante la USART
  • 72.
    car la instrucciónque indica la termi- nación de la interrupción. En la tabla 68 se muestra el códi- go para activar la USART del micro- controlador PIC en modo recepción, además en la tabla 69 a manera de sugerencia se muestra el código de un programa para implementar la inte- rrupción. Se debe considerar que se esta empleando un microcontrolador PIC16F87X, pero si se requiere usar otro, lo único que se tiene que cam- biar es la ubicación de las terminales Tx y Rx. En la tabla 70 se muestra un programa completo, en el que el dato que reciba el microcontrolador PIC de manera serial lo retransmitirá, también empleando la USART. 70 Tabla 70. Programa para transmitir y recibir datos mediante la USART.
  • 73.
    Configuración del ADC Se puedeimplementar un sistema de adquisición de datos analógicos que puede contener hasta un total de 8 canales digitalizadores, por medio de los microcontrola- dores PIC, para ello tenemos que seleccionar el más con- veniente de acuerdo con la aplicación que tenemos que desarrollar. Aunque en el presente material, no vamos explicar con lujo de deta- lle la técnica con la que opera el ADC del microcontrolador, si vamos a explicar que es lo que hace el ADC, como para que cuando llegue- mos al planteamiento del proyecto sepamos a que nos estamos enfren- tando. Un ADC (Convertidor Analógico - Digital por sus siglas en ingles) se encarga de convertir un valor analó- gico de voltaje a su correspondiente combinación binaria. Para realizar esta operación se requiere de un sensor, que es el encargado de leer el estado de una variable física de naturaleza analógica y de represen- tar la magnitud de dicha variable en su correspondiente valor de voltaje. En la actualidad existen muchas va- riables analógicas que podemos leer de manera directa a través del sen- sor adecuado, en otras ocasiones, al no existir un sensor diseñado de ma- nera explícita para determinada va- riable, se ocupa un sensor para me- dir una variable física diferente, pero que se liga con la que nos interesa por medio de una relación matemá- tica. Lo que nos da la posibilidad de que para cualquier proceso indus- trial (ahí existe un número ilimitado de variables), exista un sensor invo- lucrado. El sensor lee la variable física y nos entrega una señal eléctrica que se encuentra dentro de un rango de valores de voltaje, siendo este el que tenemos que hacer llegar al ADC del microcontrolador. Teniendo en cuenta que el ADC mide variacio- nes de voltaje, el sensor tiene que adecuarse con respecto del rango mínimo y máximo que puede leer la entrada del ADC. Para que el ADC pueda realizar una conversión del valor analógico, se le tiene que agre- gar un voltaje de referencia, porque este es el que indica precisamente cual es el rango de operación de la entrada del ADC. Todos los ADC de los microcontroladores PIC aceptan como máximo un rango de opera- ción que llega hasta 5 Volts, por lo que podemos establecer rangos de operación de cualquier valor de vol- taje, siempre y cuando no rebase- mos los 5 volts. El rango de operación expresado en volts sea de la magnitud que sea, se divide en tantas partes como número de bits posea el ADC, de acuerdo al ejemplo mostrado en la fi- gura 39. El cálculo del valor de resolución del ADC se hace de acuerdo a la si- guiente expresión matemá- tica: Resolución = V rango / 2N -1 En donde: Resolución.- Rango de voltaje en el cual se presenta un cambio de valor en la combinación binaria. Vrango. - Rango de operación del ADC expresado en voltaje. N.- Número de bits que posee el ADC. El ejemplo de la figura 39 con- templa un ADC de 4 bits (el número de bits de un ADC real cuando me- nos es de 8), por lo tanto el número de combinaciones binarias que esta dado por la relación: Combinaciones binarias = 2N da como resultado un total de 16, las cuales van de 0000(2) hasta 1111(2). La resolución del ADC, nos indica cuanto tiene que variar el voltaje que entrega el sen- sor, para que exista un cambio en la combinación binaria correspondien- te, por lo que a un determinado valor 71 Figura 38. Convertidor Analógico - Digital (ADC). Figura 39. División del rango de operación del ADC (Resolución del ADC).
  • 74.
    analógico le corresponderáuna combinación binaria que es precisa- mente la conversión y lo que entre- gara como resultado el ADC. Por otra parte, la cantidad de va- lores analógicos que el ADC puede digitalizar, esta un función del núme- ro de muestras que puede adquirir, para ello se establecen de manera automática un periodo estable de tiempo, durante el cual el ADC ob- tendrá las muestras, tal como se ilustra en la figura 40. El número de muestras mínimas que se tienen que tomar se encuen- tran de acuerdo al valor de frecuen- cia de operación de la señal a digita- lizar, y en función el “teorema de muestreo” establecido por Nyquist, la frecuencia de muestreo (número de muestras por segundo) se esta- blece de acuerdo a la siguiente ex- presión matemática: B = 2F En donde: B.- Frecuencia de muestro (nú- mero de muestras por segundo). F.- Frecuencia de operación de la señal a digitalizar. El teorema del muestreo se ocu- pa principalmente en el caso de que la señal a digitalizar posea una fre- cuencia alta de operación, y por lo tanto se tiene que tomar un buen número de muestras y digitalizarlas, como para en un proceso posterior se ten- ga que reproducir la señal original, como es el caso de un reproductor de CD's o un osciloscopio digital. Por ejemplo si la señal analógica trabaja a una frecuencia de 1kHz, se le tiene que aplicar una frecuencia de muestreo de 2kHz, o sea, se deben de tomar 2000 muestras por segundo, y cada una de es- tas muestras se tiene que digitalizar, para lo que es ne- cesario poseer además del ADC de una memoria de por lo menos 2000 localidades para poder guardar la in- formación de las 2000 combinacio- nes binarias que arroje la digitaliza- ción de la señal analógica. Todo es- te proceso se tiene que realizar para garantizar que si se hace el proceso inverso, se pueda recuperar la señal analógica original. Para el caso de una aplicación del tipo industrial en donde se tenga que digitalizar el valor de una señal analógica, como puede ser por ejemplo la temperatura, el número de muestras por segundo “B” no tie- ne que ser muy grande, ya que la temperatura no cambia tan rápido de valor, teniéndose cambios en una caldera que consideraremos como un caso demasiado critico, del orden de aproximadamente 10 segundos para tener cambios en rangos de ca- da 100°C. En la medición de tempe- ratura podemos establecer periodos de muestreo de cada segundo y por lo tanto el espacio de la memoria en donde debemos almacenar los valo- res digitalizados, no tiene que ser tan grande. Y por lo tanto depende- rá de la naturaleza de la variable fí- sica como para establecer la canti- dad de muestras a tomar, y por lo tanto la cantidad de memoria que necesitemos, así como el proceso para guardar la información en el mi- crocontrolador, o en una memoria externa o enviarla de manera para- lela o serial a una PC por ejemplo. Retomando el nombre de un po- sible proyecto, se puede realizar un “Sistema de Adquisición Hasta de 8 Canales Analógicos, y podemos em- plear cualquier de los Microcontrola- dores PIC12F675 ó el PIC16F876 ó el PIC16F877”, básicamente lo que vamos a proponer la manera en que se debe configurar el ADC para un sistema de adquisición de datos, a la cual se le pueda hacer llegar la infor- mación de hasta 8 sensores analógi- cos, y que el microcontrolador que se utilice se encargue de organizar la toma de las señales de los senso- res, y que las digitalice. Lo que es importante resaltar es el hecho de que tanto el microcon- trolador PIC12F675 como el PIC16F876 y el PIC16F877, tan so- lo cuentan con un único módulo in- terno para realizar las conversiones de valores anódicos a digital (módu- lo ADC). Por esta razón, al contar con la posibilidad de tener hasta 8 sensores, significa que el módulo ADC del microcontrolador tiene que estarse compartiendo entre los dife- rentes sensores que tenga conecta- dos, y entonces dependerá de la programación que le agreguemos al PIC, la manera en que este trabaja- rá. Otra cuestión importante es que cualquiera de los PIC's de acuerdo al manual efecti- vamente nos indica que posee hasta 8 canales pa- ra digitalizar señales ana- lógicas, y se encuentran fí- sicamente ubicadas en las terminales del puerto A, y se encuentran identifica- das con las nomenclaturas RA0/AN0, RA1/AN1, RA2/AN2, RA3/AN3, y RA5/AN4 para el PIC16F876, mientras que para el PIC16F877 ade- más de los canales del puerto A también se tienen 72 Figura 40. Cantidad de muestreos determinada por el “Teorema del Muestreo”.
  • 75.
    que agregar loscanales con entra- das ADC de su puerto E, los cuales se identifican como RE0/AN5, RE1/AN6 y RE2/AN7, tal como se muestra en la figura 41. Se pueden hacer diferentes combinaciones de acuerdo a la cantidad máxima de sensores que pueden conectarse al microcontrolador, ya que también el voltaje de referencia que se requiere para un proceso de conversión por medio del módulo ADC tiene que to- marse en cuenta. El voltaje de refe- rencia para el ADC puede tomarse de manera interna en el microcon- trolador, o si es necesario el voltaje de referencia se fijara de manera ex- terna, y para ello se requiere de 1 o 2 terminales del microcontrolador para tal efecto, y las terminales que se llegan a ocupar para fijar una re- ferencia externa son también del puerto A, por lo que se restarían 2 canales con entrada para el ADC. En la tabla 71 se muestran las com- binaciones de operación tanto del puerto A para el PIC16F876, como del puerto A y puerto E para el PIC16F877, (para el PIC12F675 es una tabla muy similar) con respecto a la cantidad de canales ADC que podemos disponer del PIC. De la tabla 71, se observa que se encuentran identificadas cada una de las terminales del puerto A y E que tienen entrada al ADC, en la ta- bla se muestra como pueden confi- gurarse estas terminales, indicándo- se con una letra “A” si posee entra- da al ADC, o con una letra “D” si la terminal se puede configurar como una entrada o salida digital, y por úl- timo se muestra también que termi- nales aceptan los voltajes de refe- rencia externo, tanto positivo como negativo, identificados como Verf+ y Vref- respectivamente. En la misma tabla 71 se presenta a manera de resumen y de acuerdo a las posibili- dades de configuración, la cantidad de terminales con entrada al ADC, cantidad de terminales con voltaje de referencia externa y la cantidad de terminales configuradas como entradas o salidas digitales. Como ejemplo para leer la tabla 71, vamos a tomar la combinación que se encuentra en la primer fila, en donde se tienen 5 entradas con ADC para el PIC16F876, y 8 entra- das en total para el PIC16F877; la referencia la toman de manera inter- na, por lo que el Voltaje de referen- cia positivo (Vref+) lo toma de la ali- mentación positiva del microcontro- lador, dicho de otra manera la termi- nal VDD también hace la función de terminal para Vref+, lo mismo suce- de con el voltaje de referencia nega- tivo, al tomar la referencia de mane- ra interna, la terminal de alimenta- ción VSS (se relaciona también con GND) del microcontrolador además hace la tarea de la terminal Vref-. Por otra parte, en la tabla 71 se muestra las diferentes opciones de configuración con respecto de los bits PCFG3, PCFG2, PCFG1 y PCFG0, los cuales se encuentran expresados en la columna de la iz- quierda, mediante las combinacio- nes binarias que podemos realizar con estos bits, podemos establecer la cantidad de terminales que ten- drán acceso al convertidor Analógi- co - Digital (ADC) del microcontrola- dor. Por ejemplo si queremos que aparezcan todas las terminales con- figuradas como canales de ADC, te- nemos que ingresar la siguiente 73 Figura 41. Disposición de las terminales de los microcontroladores PIC16F876 y PIC16F877.
  • 76.
    combinación binaria: PCFG3= 0, PCFG2 = 0, PCFG1 = 0 y PCFG0 = 0, misma que se muestra en la pri- mer fila de la tabla 71. Así podemos elegir la configuración que se re- quiera para nuestro proyecto, inclu- sive aquí es en donde le indicamos al microcontrolador que solo quere- mos terminales con operación digital (solo 0's y 1's lógicos, cuando no se utiliza el ADC), y para ello tendre- mos que ingresar la combinación bi- naria: PCFG3 = 0, PCFG2 = 1, PCFG1 = 1 y PCFG0 = 1, que se muestra en la fila 7 de la tabla 71. Para configurar a los bits PCFG3, PCFG2, PCFG1 y PCFG0, se tiene que acceder al registro lla- mado ADCON1, cuyo detalle se muestra en la imagen de la figura 42. Por medio del registro ADCON1, observamos la manera en que se configuran las correspondientes ter- minales que contienen a los canales de acceso al ADC, ya solo falta defi- nir la función del bit identificado co- mo ADMF, el cual se describe a con- tinuación. Con el bit 7 del registro ADCON1 (ADMF) se expresa la for- ma en que se configura el empleo de los 10 bits, del dato digitalizado, indicándole al microcontrolador la manera en que tiene que justificarse el acomodo del dato, esto es, justifi- cación a la derecha o justificación a la izquierda. De una manera más sencilla, se muestra a continuación la manera en que se pueden justificar los bits del dato digitalizado. Vea la tabla 71b. Por último con respecto del re- gistro ADCON1, los bits del 4 al 6 no se ocupan. Como paso siguiente ten- dremos que emplear el re- gistro identificado como ADCON0. Observe la ima- gen 43 en donde se descri- be la ubicación de sus co- rrespondientes bits. La correspondiente descrip- ción de los bits del registro ADCON0 se realiza a conti- nuación: Los bits 7 y 6 cuya identifi- cación es ADCS1 y ADCS0 74 Tabla 71b. Figura 42. Detalle del Registro ADCON1. Tabla 71.- Combinaciones de entradas ADC o digitales del puerto A del PIC16F876.
  • 77.
    respectivamente, sirven para indicarcuál será el tiempo de conversión de acuerdo a las combi- naciones que pueden realizarse, de acuerdo con las siguientes com- binaciones: vea la tabla 71c. Los bits del 3 al 5 cuya identificación es CHS0, CHS1 y CHS2 respectivamente, sirven para de acuerdo a la combinación binaria co- rrespondiente, seleccio- nar el canal ADC que se irá activando, recordan- do que aunque un microcontrolador puede tener más de 1 ADC, no pue- de ocuparlos todos a la vez, por lo tanto, los ADC se tienen que ir acti- vando de acuerdo a como se requie- ra, tomando en cuenta las siguientes combinaciones binarias: vea la tabla 71d. El bit 2 identificado como GO- /DONE, sirve para indicarle al micro- controlador que puede llevar a cabo una conversión con el ADC. El bit 1 no se encuentra imple- mentado. El bit 0 identificado como ADON0, simplemente tiene la fun- ción de encender el modu- lo ADC de un microcontro- lador PIC. Para terminar de configu- rar al módulo ADC de un microcontrolador, se tie- nen que emplear los co- rrespondientes bits de los registros INTCON y PIE1, con los cuales se activa la interrupción que será em- pleada por el ADC. Del registro INTCON, el bit identificado como GIE se emplea para habilitar to- das las interrupciones del PIC, mientras que el bit PEIE, se utiliza de manera específica para activar la interrupción por periféri- cos, siendo el ADC un pe- riférico. En el registro PIE1, el bit ADIE activa la interrupción que pueda generar el ADC, una vez que ha realizado un proceso de digitalización. Para terminar con este tema, a continuación se encuentra el código de un programa de ejemplo, por me - dio del cual se emplea el ADC de un microcontrolador PIC. ****** 75 Tabla 71d. Tabla 71c Figura 43. Detalle del Registro ADCON0. ;************************************************************ ;Configuración del ADC de un PIC ;PIC: 16F874A ;************************************************************ LIST P=PIC16F874A #include <p16f84A.inc> __CONFIG _CP_OFF&_DEBUG_OFF&_WRT_OFF&_CPD_OFF&_LVP_OFF& _BODEN_OFF&_PWRTE_OFF&_WDT_OFF&_XT_OSC ;************************************************************ ; Declaración de Registros ;************************************************************ w equ 0X00 status equ 0x03 porta equ 0x05 portb equ 0x06 portc equ 0x07 intcon equ 0x0b pir1 equ 0x0c trisa equ 0x85 trisb equ 0x86 trisc equ 0x87 pie1 equ 0x8c adresl equ 0x9e adcon1 equ 0x9f adresh equ 0x1e adcon0 equ 0x1f adcalto equ 0x20 adcbajo equ 0x21 var1 equ 0x22 var2 equ 0x23 var3 equ 0x24 ;************************************************************ ; Declaración de Bits ;************************************************************ adon equ 0 go_done equ 2 rp0 equ 5 rp1 equ 6 adcs0 equ 6 peie equ 6
  • 78.
    76 adie equ 6 adifequ 6 gie equ 7 adcs1 equ 7 ;******************************************************************************************************************************************* ; Inicio ;******************************************************************************************************************************************* reset org 0 goto iniADC org 4 bcf status,rp0 ;cambiar al banco 0 bcf status,rp1 btfsc pir1,adif goto ADCinterrup retfie ;****************************************************************************************************************************************** ; Inicio de la interrupción del ADC ;****************************************************************************************************************************************** ADCinterrup bcf status,rp0 ;cambiar al banco 0 bcf status,rp1 bcf intcon,gie ;desactivación general de interrupciones movf adresh,w ;guarda el byte alto de la conversión en movwf adcalto ;el registro adcalto bsf status,rp0 ;cambiar al banco 1 bcf status,rp1 movf adresl,w ;guarda el byte bajo de la conversión en bcf status,rp0 ;cambiar al banco 0 bcf status,rp1 movwf adcbajo ;el registro adcbajo bcf pir1,adif retfie ;******************************************************************************************************************************************* ; Programa principal ;******************************************************************************************************************************************* iniADC bsf status,rp0 ;cambiar al banco 1 bcf status,rp1 movlw 0xff ;configurar el puerto a como entradas movwf trisa movlw 0x00 movwf trisb ;configurar el puerto b como salidas movwf trisc ;configurar el puerto c como salidas movlw b'10000000' ;configura con adc todas las terminales el puerto a movwf adcon1 ;y justificación a la derecha bcf status,rp0 ;cambiar al banco 0 bcf status,rp1 clrf adcalto clrf adcbajo bsf adcon0,adcs0 ;configura la frecuencia de muestreo bcf adcon0,adcs1 ;configura la frecuencia de muestreo
  • 79.
    77 bsf adcon0,adon ;activael ADC bsf intcon,gie ;habilitador general de interrupciones bsf intcon,peie ;activador general de interrupciones por periféricos bsf status,rp0 ;cambiar al banco 1 bcf status,rp1 bsf pie1,adie ;activación de interrupción por ADC ciclo bcf status,rp0 ;cambiar al banco 0 bcf status,rp1 bcf adcon0,chs0 ;selecciona canal de adc bcf adcon0,chs1 ;selecciona canal de adc bcf adcon0,chs2 ;selecciona canal de adc bsf adcon0,go_done ;iniciar la operación del ADC movf adcbajo,w movwf portb movf adcalto,w movwf portc call ret1seg ;Llama subrutina de 1 segundo goto ciclo ;******************************************************************************************************************************************* ; Subrutinas ;******************************************************************************************************************************************* ret1seg ;Retardo de 1 segundo movlw .255 movwf var1 ciclo_3 movlw .08 movwf var2 ciclo_2 movlw .166 movwf var3 ciclo_1 decfsz var3,1 ;497 microsegundos = aprox. 0.5 milisegundos goto ciclo_1 decfsz var2,1 goto ciclo_2 decfsz var1,1 goto ciclo_3 return end