SlideShare una empresa de Scribd logo
1 de 80
Descargar para leer sin conexión
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.
Programación básica de PICs: configuración de puertos y rutinas elementales
Programación básica de PICs: configuración de puertos y rutinas elementales
Programación básica de PICs: configuración de puertos y rutinas elementales
Programación básica de PICs: configuración de puertos y rutinas elementales
Programación básica de PICs: configuración de puertos y rutinas elementales
Programación básica de PICs: configuración de puertos y rutinas elementales
Programación básica de PICs: configuración de puertos y rutinas elementales
Programación básica de PICs: configuración de puertos y rutinas elementales
Programación básica de PICs: configuración de puertos y rutinas elementales
Programación básica de PICs: configuración de puertos y rutinas elementales
Programación básica de PICs: configuración de puertos y rutinas elementales
Programación básica de PICs: configuración de puertos y rutinas elementales
Programación básica de PICs: configuración de puertos y rutinas elementales
Programación básica de PICs: configuración de puertos y rutinas elementales
Programación básica de PICs: configuración de puertos y rutinas elementales
Programación básica de PICs: configuración de puertos y rutinas elementales
Programación básica de PICs: configuración de puertos y rutinas elementales
Programación básica de PICs: configuración de puertos y rutinas elementales
Programación básica de PICs: configuración de puertos y rutinas elementales
Programación básica de PICs: configuración de puertos y rutinas elementales
Programación básica de PICs: configuración de puertos y rutinas elementales
Programación básica de PICs: configuración de puertos y rutinas elementales
Programación básica de PICs: configuración de puertos y rutinas elementales
Programación básica de PICs: configuración de puertos y rutinas elementales
Programación básica de PICs: configuración de puertos y rutinas elementales
Programación básica de PICs: configuración de puertos y rutinas elementales
Programación básica de PICs: configuración de puertos y rutinas elementales
Programación básica de PICs: configuración de puertos y rutinas elementales
Programación básica de PICs: configuración de puertos y rutinas elementales
Programación básica de PICs: configuración de puertos y rutinas elementales
Programación básica de PICs: configuración de puertos y rutinas elementales
Programación básica de PICs: configuración de puertos y rutinas elementales
Programación básica de PICs: configuración de puertos y rutinas elementales
Programación básica de PICs: configuración de puertos y rutinas elementales
Programación básica de PICs: configuración de puertos y rutinas elementales
Programación básica de PICs: configuración de puertos y rutinas elementales
Programación básica de PICs: configuración de puertos y rutinas elementales
Programación básica de PICs: configuración de puertos y rutinas elementales
Programación básica de PICs: configuración de puertos y rutinas elementales
Programación básica de PICs: configuración de puertos y rutinas elementales
Programación básica de PICs: configuración de puertos y rutinas elementales
Programación básica de PICs: configuración de puertos y rutinas elementales
Programación básica de PICs: configuración de puertos y rutinas elementales

Más contenido relacionado

La actualidad más candente

Pruebas de usabilidad en elos equipos medicos
Pruebas de usabilidad en elos equipos medicos Pruebas de usabilidad en elos equipos medicos
Pruebas de usabilidad en elos equipos medicos Gregorio Añez Vargas
 
4.respuesta de un_circuito_de_segundo_orden
4.respuesta de un_circuito_de_segundo_orden4.respuesta de un_circuito_de_segundo_orden
4.respuesta de un_circuito_de_segundo_ordenmanuel Luna Urquizo
 
Errores frecuentes en el cálculo de líneas y la elección de cables para Baja ...
Errores frecuentes en el cálculo de líneas y la elección de cables para Baja ...Errores frecuentes en el cálculo de líneas y la elección de cables para Baja ...
Errores frecuentes en el cálculo de líneas y la elección de cables para Baja ...Prysmian Cables y Sistemas
 
AC Circuit Theory
AC Circuit TheoryAC Circuit Theory
AC Circuit TheoryAjEcuacion
 
Electrónica digital: Display de 7 segmentos con compuertas lógicas
Electrónica digital: Display de 7 segmentos con compuertas lógicasElectrónica digital: Display de 7 segmentos con compuertas lógicas
Electrónica digital: Display de 7 segmentos con compuertas lógicasSANTIAGO PABLO ALBERTO
 
El club de Programación de microcontroladores PIC
El club de Programación de microcontroladores PIC El club de Programación de microcontroladores PIC
El club de Programación de microcontroladores PIC SANTIAGO PABLO ALBERTO
 
Ejercicios resonancia
Ejercicios resonanciaEjercicios resonancia
Ejercicios resonanciaequipoUFTsis2
 
Solucion de un circuito LCR en Matlab
Solucion de un circuito LCR en MatlabSolucion de un circuito LCR en Matlab
Solucion de un circuito LCR en MatlabSantiago Aguilar
 
Circuitos electronicos 2 mosfet
Circuitos electronicos 2 mosfetCircuitos electronicos 2 mosfet
Circuitos electronicos 2 mosfetAlex Quispe Ore
 
8 1 convertidor-digital-analogico
8 1 convertidor-digital-analogico8 1 convertidor-digital-analogico
8 1 convertidor-digital-analogicoRonald_Paul
 
Ejercicios (Series de Fourier)
Ejercicios (Series de Fourier)Ejercicios (Series de Fourier)
Ejercicios (Series de Fourier)ERICK CONDE
 
compuertas logicas
compuertas logicascompuertas logicas
compuertas logicasbamz19
 

La actualidad más candente (20)

Fuente de Alimentación
Fuente de Alimentación Fuente de Alimentación
Fuente de Alimentación
 
El transistor ujt scr
El transistor ujt scrEl transistor ujt scr
El transistor ujt scr
 
Pruebas de usabilidad en elos equipos medicos
Pruebas de usabilidad en elos equipos medicos Pruebas de usabilidad en elos equipos medicos
Pruebas de usabilidad en elos equipos medicos
 
4.respuesta de un_circuito_de_segundo_orden
4.respuesta de un_circuito_de_segundo_orden4.respuesta de un_circuito_de_segundo_orden
4.respuesta de un_circuito_de_segundo_orden
 
Diodo zener
Diodo zenerDiodo zener
Diodo zener
 
Errores frecuentes en el cálculo de líneas y la elección de cables para Baja ...
Errores frecuentes en el cálculo de líneas y la elección de cables para Baja ...Errores frecuentes en el cálculo de líneas y la elección de cables para Baja ...
Errores frecuentes en el cálculo de líneas y la elección de cables para Baja ...
 
Proteus vsm
Proteus vsmProteus vsm
Proteus vsm
 
AC Circuit Theory
AC Circuit TheoryAC Circuit Theory
AC Circuit Theory
 
Electrónica digital: Display de 7 segmentos con compuertas lógicas
Electrónica digital: Display de 7 segmentos con compuertas lógicasElectrónica digital: Display de 7 segmentos con compuertas lógicas
Electrónica digital: Display de 7 segmentos con compuertas lógicas
 
El club de Programación de microcontroladores PIC
El club de Programación de microcontroladores PIC El club de Programación de microcontroladores PIC
El club de Programación de microcontroladores PIC
 
Ejercicios resonancia
Ejercicios resonanciaEjercicios resonancia
Ejercicios resonancia
 
Solucion de un circuito LCR en Matlab
Solucion de un circuito LCR en MatlabSolucion de un circuito LCR en Matlab
Solucion de un circuito LCR en Matlab
 
Circuitos electronicos 2 mosfet
Circuitos electronicos 2 mosfetCircuitos electronicos 2 mosfet
Circuitos electronicos 2 mosfet
 
132315
132315132315
132315
 
Ejercicios propuestos I
Ejercicios propuestos IEjercicios propuestos I
Ejercicios propuestos I
 
8 1 convertidor-digital-analogico
8 1 convertidor-digital-analogico8 1 convertidor-digital-analogico
8 1 convertidor-digital-analogico
 
Ejercicios (Series de Fourier)
Ejercicios (Series de Fourier)Ejercicios (Series de Fourier)
Ejercicios (Series de Fourier)
 
compuertas logicas
compuertas logicascompuertas logicas
compuertas logicas
 
Sesion1 2012
Sesion1 2012Sesion1 2012
Sesion1 2012
 
Lab 01_CIRCUITO RL RC RLC
Lab 01_CIRCUITO RL RC RLCLab 01_CIRCUITO RL RC RLC
Lab 01_CIRCUITO RL RC RLC
 

Similar a Programación básica de PICs: configuración de puertos y rutinas elementales

Microcontroladores pic (josé mª angulo usategui, ignacio angulo martínez)
Microcontroladores pic (josé mª angulo usategui, ignacio angulo martínez)Microcontroladores pic (josé mª angulo usategui, ignacio angulo martínez)
Microcontroladores pic (josé mª angulo usategui, ignacio angulo martínez)Miguel Angel Corona Lòpez
 
Microcontroladores pic diseño practico de aplicaciones
Microcontroladores pic diseño practico de aplicacionesMicrocontroladores pic diseño practico de aplicaciones
Microcontroladores pic diseño practico de aplicacionesCarlos Tovar
 
libro_microcontroladores_omarnieves
libro_microcontroladores_omarnieveslibro_microcontroladores_omarnieves
libro_microcontroladores_omarnievesomarJnieves
 
Microcontroladores: Microcontroladores PIC diseño practico de aplicaciones 1r...
Microcontroladores: Microcontroladores PIC diseño practico de aplicaciones 1r...Microcontroladores: Microcontroladores PIC diseño practico de aplicaciones 1r...
Microcontroladores: Microcontroladores PIC diseño practico de aplicaciones 1r...SANTIAGO PABLO ALBERTO
 
PLC: Modulo controladores lógicos programables para la enseñanza aprendizaje ...
PLC: Modulo controladores lógicos programables para la enseñanza aprendizaje ...PLC: Modulo controladores lógicos programables para la enseñanza aprendizaje ...
PLC: Modulo controladores lógicos programables para la enseñanza aprendizaje ...SANTIAGO PABLO ALBERTO
 
Historia y evolución de la pc wil,stefa y harry
Historia y evolución de la pc wil,stefa y harryHistoria y evolución de la pc wil,stefa y harry
Historia y evolución de la pc wil,stefa y harrytefadianis
 
Practica 8 practica indices-citas-bibliografias
Practica 8 practica indices-citas-bibliografiasPractica 8 practica indices-citas-bibliografias
Practica 8 practica indices-citas-bibliografiaserikaselenacoronel
 
Elaboracion de un flexometro con micro controladores y pantalla lcd
Elaboracion de un flexometro con micro controladores y pantalla lcd Elaboracion de un flexometro con micro controladores y pantalla lcd
Elaboracion de un flexometro con micro controladores y pantalla lcd juliodarwinsop
 
Tutorial lego mindstorm
Tutorial lego mindstormTutorial lego mindstorm
Tutorial lego mindstormsamuel luque
 
Tutorial lego-mindstorm-1
Tutorial lego-mindstorm-1Tutorial lego-mindstorm-1
Tutorial lego-mindstorm-1wendy castillo
 
Construccycontrol
ConstruccycontrolConstruccycontrol
Construccycontrolsgcskyone
 

Similar a Programación básica de PICs: configuración de puertos y rutinas elementales (20)

Microcontroladores pic (josé mª angulo usategui, ignacio angulo martínez)
Microcontroladores pic (josé mª angulo usategui, ignacio angulo martínez)Microcontroladores pic (josé mª angulo usategui, ignacio angulo martínez)
Microcontroladores pic (josé mª angulo usategui, ignacio angulo martínez)
 
Microcontroladores pic diseño practico de aplicaciones
Microcontroladores pic diseño practico de aplicacionesMicrocontroladores pic diseño practico de aplicaciones
Microcontroladores pic diseño practico de aplicaciones
 
libro_microcontroladores_omarnieves
libro_microcontroladores_omarnieveslibro_microcontroladores_omarnieves
libro_microcontroladores_omarnieves
 
Microcontroladores: Microcontroladores PIC diseño practico de aplicaciones 1r...
Microcontroladores: Microcontroladores PIC diseño practico de aplicaciones 1r...Microcontroladores: Microcontroladores PIC diseño practico de aplicaciones 1r...
Microcontroladores: Microcontroladores PIC diseño practico de aplicaciones 1r...
 
Tesis Documento
Tesis DocumentoTesis Documento
Tesis Documento
 
Paper pic16f84
Paper pic16f84Paper pic16f84
Paper pic16f84
 
Microcontroladores
MicrocontroladoresMicrocontroladores
Microcontroladores
 
Microcontroladores
MicrocontroladoresMicrocontroladores
Microcontroladores
 
PLC: Modulo controladores lógicos programables para la enseñanza aprendizaje ...
PLC: Modulo controladores lógicos programables para la enseñanza aprendizaje ...PLC: Modulo controladores lógicos programables para la enseñanza aprendizaje ...
PLC: Modulo controladores lógicos programables para la enseñanza aprendizaje ...
 
Trabajo de informatica
Trabajo de informaticaTrabajo de informatica
Trabajo de informatica
 
Pfd Embotelladora en Scada
Pfd Embotelladora en ScadaPfd Embotelladora en Scada
Pfd Embotelladora en Scada
 
Yeison andres cataño
Yeison andres catañoYeison andres cataño
Yeison andres cataño
 
Yeison andres cataño
Yeison andres catañoYeison andres cataño
Yeison andres cataño
 
Historia y evolución de la pc wil,stefa y harry
Historia y evolución de la pc wil,stefa y harryHistoria y evolución de la pc wil,stefa y harry
Historia y evolución de la pc wil,stefa y harry
 
Practica 8 practica indices-citas-bibliografias
Practica 8 practica indices-citas-bibliografiasPractica 8 practica indices-citas-bibliografias
Practica 8 practica indices-citas-bibliografias
 
PLC: Practicas de rslogix 5000
PLC: Practicas de rslogix 5000PLC: Practicas de rslogix 5000
PLC: Practicas de rslogix 5000
 
Elaboracion de un flexometro con micro controladores y pantalla lcd
Elaboracion de un flexometro con micro controladores y pantalla lcd Elaboracion de un flexometro con micro controladores y pantalla lcd
Elaboracion de un flexometro con micro controladores y pantalla lcd
 
Tutorial lego mindstorm
Tutorial lego mindstormTutorial lego mindstorm
Tutorial lego mindstorm
 
Tutorial lego-mindstorm-1
Tutorial lego-mindstorm-1Tutorial lego-mindstorm-1
Tutorial lego-mindstorm-1
 
Construccycontrol
ConstruccycontrolConstruccycontrol
Construccycontrol
 

Último

aCARGA y FUERZA UNI 19 marzo 2024-22.ppt
aCARGA y FUERZA UNI 19 marzo 2024-22.pptaCARGA y FUERZA UNI 19 marzo 2024-22.ppt
aCARGA y FUERZA UNI 19 marzo 2024-22.pptCRISTOFERSERGIOCANAL
 
CAPITULO 4 ANODIZADO DE ALUMINIO ,OBTENCION Y PROCESO
CAPITULO 4 ANODIZADO DE ALUMINIO ,OBTENCION Y PROCESOCAPITULO 4 ANODIZADO DE ALUMINIO ,OBTENCION Y PROCESO
CAPITULO 4 ANODIZADO DE ALUMINIO ,OBTENCION Y PROCESOLUISDAVIDVIZARRETARA
 
Quimica Raymond Chang 12va Edicion___pdf
Quimica Raymond Chang 12va Edicion___pdfQuimica Raymond Chang 12va Edicion___pdf
Quimica Raymond Chang 12va Edicion___pdfs7yl3dr4g0n01
 
ARBOL DE CAUSAS ANA INVESTIGACION DE ACC.ppt
ARBOL DE CAUSAS ANA INVESTIGACION DE ACC.pptARBOL DE CAUSAS ANA INVESTIGACION DE ACC.ppt
ARBOL DE CAUSAS ANA INVESTIGACION DE ACC.pptMarianoSanchez70
 
CLASe número 4 fotogrametria Y PARALAJE.pptx
CLASe número 4 fotogrametria Y PARALAJE.pptxCLASe número 4 fotogrametria Y PARALAJE.pptx
CLASe número 4 fotogrametria Y PARALAJE.pptxbingoscarlet
 
Voladura Controlada Sobrexcavación (como se lleva a cabo una voladura)
Voladura Controlada  Sobrexcavación (como se lleva a cabo una voladura)Voladura Controlada  Sobrexcavación (como se lleva a cabo una voladura)
Voladura Controlada Sobrexcavación (como se lleva a cabo una voladura)ssuser563c56
 
Elaboración de la estructura del ADN y ARN en papel.pdf
Elaboración de la estructura del ADN y ARN en papel.pdfElaboración de la estructura del ADN y ARN en papel.pdf
Elaboración de la estructura del ADN y ARN en papel.pdfKEVINYOICIAQUINOSORI
 
ECONOMIA APLICADA SEMANA 555555555555555555.pdf
ECONOMIA APLICADA SEMANA 555555555555555555.pdfECONOMIA APLICADA SEMANA 555555555555555555.pdf
ECONOMIA APLICADA SEMANA 555555555555555555.pdffredyflores58
 
PERFORACIÓN Y VOLADURA EN MINERÍA APLICADO
PERFORACIÓN Y VOLADURA EN MINERÍA APLICADOPERFORACIÓN Y VOLADURA EN MINERÍA APLICADO
PERFORACIÓN Y VOLADURA EN MINERÍA APLICADOFritz Rebaza Latoche
 
PPT ELABORARACION DE ADOBES 2023 (1).pdf
PPT ELABORARACION DE ADOBES 2023 (1).pdfPPT ELABORARACION DE ADOBES 2023 (1).pdf
PPT ELABORARACION DE ADOBES 2023 (1).pdfalexquispenieto2
 
Comite Operativo Ciberseguridad 012020.pptx
Comite Operativo Ciberseguridad 012020.pptxComite Operativo Ciberseguridad 012020.pptx
Comite Operativo Ciberseguridad 012020.pptxClaudiaPerez86192
 
Manual_Identificación_Geoformas_140627.pdf
Manual_Identificación_Geoformas_140627.pdfManual_Identificación_Geoformas_140627.pdf
Manual_Identificación_Geoformas_140627.pdfedsonzav8
 
Obras paralizadas en el sector construcción
Obras paralizadas en el sector construcciónObras paralizadas en el sector construcción
Obras paralizadas en el sector construcciónXimenaFallaLecca1
 
NTP- Determinación de Cloruros en suelos y agregados (1) (1).pptx
NTP- Determinación de Cloruros  en suelos y agregados (1) (1).pptxNTP- Determinación de Cloruros  en suelos y agregados (1) (1).pptx
NTP- Determinación de Cloruros en suelos y agregados (1) (1).pptxBRAYANJOSEPTSANJINEZ
 
Falla de san andres y el gran cañon : enfoque integral
Falla de san andres y el gran cañon : enfoque integralFalla de san andres y el gran cañon : enfoque integral
Falla de san andres y el gran cañon : enfoque integralsantirangelcor
 
UNIDAD 3 ELECTRODOS.pptx para biopotenciales
UNIDAD 3 ELECTRODOS.pptx para biopotencialesUNIDAD 3 ELECTRODOS.pptx para biopotenciales
UNIDAD 3 ELECTRODOS.pptx para biopotencialesElianaCceresTorrico
 
CHARLA DE INDUCCIÓN SEGURIDAD Y SALUD OCUPACIONAL
CHARLA DE INDUCCIÓN SEGURIDAD Y SALUD OCUPACIONALCHARLA DE INDUCCIÓN SEGURIDAD Y SALUD OCUPACIONAL
CHARLA DE INDUCCIÓN SEGURIDAD Y SALUD OCUPACIONALKATHIAMILAGRITOSSANC
 
TEXTURA Y DETERMINACION DE ROCAS SEDIMENTARIAS
TEXTURA Y DETERMINACION DE ROCAS SEDIMENTARIASTEXTURA Y DETERMINACION DE ROCAS SEDIMENTARIAS
TEXTURA Y DETERMINACION DE ROCAS SEDIMENTARIASfranzEmersonMAMANIOC
 
04. Sistema de fuerzas equivalentes II - UCV 2024 II.pdf
04. Sistema de fuerzas equivalentes II - UCV 2024 II.pdf04. Sistema de fuerzas equivalentes II - UCV 2024 II.pdf
04. Sistema de fuerzas equivalentes II - UCV 2024 II.pdfCristhianZetaNima
 
clasificasion de vias arteriales , vias locales
clasificasion de vias arteriales , vias localesclasificasion de vias arteriales , vias locales
clasificasion de vias arteriales , vias localesMIGUELANGEL2658
 

Último (20)

aCARGA y FUERZA UNI 19 marzo 2024-22.ppt
aCARGA y FUERZA UNI 19 marzo 2024-22.pptaCARGA y FUERZA UNI 19 marzo 2024-22.ppt
aCARGA y FUERZA UNI 19 marzo 2024-22.ppt
 
CAPITULO 4 ANODIZADO DE ALUMINIO ,OBTENCION Y PROCESO
CAPITULO 4 ANODIZADO DE ALUMINIO ,OBTENCION Y PROCESOCAPITULO 4 ANODIZADO DE ALUMINIO ,OBTENCION Y PROCESO
CAPITULO 4 ANODIZADO DE ALUMINIO ,OBTENCION Y PROCESO
 
Quimica Raymond Chang 12va Edicion___pdf
Quimica Raymond Chang 12va Edicion___pdfQuimica Raymond Chang 12va Edicion___pdf
Quimica Raymond Chang 12va Edicion___pdf
 
ARBOL DE CAUSAS ANA INVESTIGACION DE ACC.ppt
ARBOL DE CAUSAS ANA INVESTIGACION DE ACC.pptARBOL DE CAUSAS ANA INVESTIGACION DE ACC.ppt
ARBOL DE CAUSAS ANA INVESTIGACION DE ACC.ppt
 
CLASe número 4 fotogrametria Y PARALAJE.pptx
CLASe número 4 fotogrametria Y PARALAJE.pptxCLASe número 4 fotogrametria Y PARALAJE.pptx
CLASe número 4 fotogrametria Y PARALAJE.pptx
 
Voladura Controlada Sobrexcavación (como se lleva a cabo una voladura)
Voladura Controlada  Sobrexcavación (como se lleva a cabo una voladura)Voladura Controlada  Sobrexcavación (como se lleva a cabo una voladura)
Voladura Controlada Sobrexcavación (como se lleva a cabo una voladura)
 
Elaboración de la estructura del ADN y ARN en papel.pdf
Elaboración de la estructura del ADN y ARN en papel.pdfElaboración de la estructura del ADN y ARN en papel.pdf
Elaboración de la estructura del ADN y ARN en papel.pdf
 
ECONOMIA APLICADA SEMANA 555555555555555555.pdf
ECONOMIA APLICADA SEMANA 555555555555555555.pdfECONOMIA APLICADA SEMANA 555555555555555555.pdf
ECONOMIA APLICADA SEMANA 555555555555555555.pdf
 
PERFORACIÓN Y VOLADURA EN MINERÍA APLICADO
PERFORACIÓN Y VOLADURA EN MINERÍA APLICADOPERFORACIÓN Y VOLADURA EN MINERÍA APLICADO
PERFORACIÓN Y VOLADURA EN MINERÍA APLICADO
 
PPT ELABORARACION DE ADOBES 2023 (1).pdf
PPT ELABORARACION DE ADOBES 2023 (1).pdfPPT ELABORARACION DE ADOBES 2023 (1).pdf
PPT ELABORARACION DE ADOBES 2023 (1).pdf
 
Comite Operativo Ciberseguridad 012020.pptx
Comite Operativo Ciberseguridad 012020.pptxComite Operativo Ciberseguridad 012020.pptx
Comite Operativo Ciberseguridad 012020.pptx
 
Manual_Identificación_Geoformas_140627.pdf
Manual_Identificación_Geoformas_140627.pdfManual_Identificación_Geoformas_140627.pdf
Manual_Identificación_Geoformas_140627.pdf
 
Obras paralizadas en el sector construcción
Obras paralizadas en el sector construcciónObras paralizadas en el sector construcción
Obras paralizadas en el sector construcción
 
NTP- Determinación de Cloruros en suelos y agregados (1) (1).pptx
NTP- Determinación de Cloruros  en suelos y agregados (1) (1).pptxNTP- Determinación de Cloruros  en suelos y agregados (1) (1).pptx
NTP- Determinación de Cloruros en suelos y agregados (1) (1).pptx
 
Falla de san andres y el gran cañon : enfoque integral
Falla de san andres y el gran cañon : enfoque integralFalla de san andres y el gran cañon : enfoque integral
Falla de san andres y el gran cañon : enfoque integral
 
UNIDAD 3 ELECTRODOS.pptx para biopotenciales
UNIDAD 3 ELECTRODOS.pptx para biopotencialesUNIDAD 3 ELECTRODOS.pptx para biopotenciales
UNIDAD 3 ELECTRODOS.pptx para biopotenciales
 
CHARLA DE INDUCCIÓN SEGURIDAD Y SALUD OCUPACIONAL
CHARLA DE INDUCCIÓN SEGURIDAD Y SALUD OCUPACIONALCHARLA DE INDUCCIÓN SEGURIDAD Y SALUD OCUPACIONAL
CHARLA DE INDUCCIÓN SEGURIDAD Y SALUD OCUPACIONAL
 
TEXTURA Y DETERMINACION DE ROCAS SEDIMENTARIAS
TEXTURA Y DETERMINACION DE ROCAS SEDIMENTARIASTEXTURA Y DETERMINACION DE ROCAS SEDIMENTARIAS
TEXTURA Y DETERMINACION DE ROCAS SEDIMENTARIAS
 
04. Sistema de fuerzas equivalentes II - UCV 2024 II.pdf
04. Sistema de fuerzas equivalentes II - UCV 2024 II.pdf04. Sistema de fuerzas equivalentes II - UCV 2024 II.pdf
04. Sistema de fuerzas equivalentes II - UCV 2024 II.pdf
 
clasificasion de vias arteriales , vias locales
clasificasion de vias arteriales , vias localesclasificasion de vias arteriales , vias locales
clasificasion de vias arteriales , vias locales
 

Programación básica de PICs: configuración de puertos y rutinas elementales

  • 1.
  • 2.
  • 3. 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
  • 4. 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
  • 6. 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.
  • 7. 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.
  • 8. 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
  • 9. 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.
  • 10. 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.
  • 11. 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.
  • 12. 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.
  • 13. 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.
  • 14. 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.
  • 15. 12 Tabla 10. Empleo de los registros una vez declarados. Tabla 11. Empleo de los registros mediante direccionamiento indirecto.
  • 16. 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
  • 17. 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
  • 18. 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.
  • 19. 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.
  • 20. 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.
  • 21. 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.
  • 22. 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.
  • 23. 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.
  • 24. 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.
  • 25. 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.
  • 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 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.
  • 28. 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.
  • 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 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.
  • 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 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.
  • 34. 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.
  • 35. 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.
  • 36. 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.
  • 37. 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.