Sei sulla pagina 1di 88

MICROCONTROLADORES

POR: HUGO ALBERTO MURILLO

UNIVERSIDAD EAFIT
DEPARTAMENTO DE INGENIERIA DE
DISEÑO DE PRODUCTO
MEDELLIN
2002
TABLA DE CONTENIDO

1. INTRODUCCIÓN
2. CONCEPTOS BÁSICOS 2
3. COMPUERTAS LÒGICAS 7
4. FUNCIONES LÒGICAS CON BYTES 9
5. CIRCUITO COMBINACIONAL 10
6. LATCHES 13
7. FLIP-FLOP 13
8. MEMORIAS 16
9. ARITMÉTICA BINARIA 21
10. INTRODUCCIÓN AL MICROCONTROLADOR 23
11. EXPLICACIÓN DEL REGISTRO STATUS 27
12. SINTAXIS DE LAS INSTRUCCIONES 30
13. DIRECTIVAS PARA HACER UN PROGRAMA EN MICROCONTROLADOR 31
14. EJEMPLOS SENCILLOS DE DIAGRAMAS DE FLUJO 33
15. CONFIGURACIÓN DE LOS PUERTOS 37
16. EJEMPLOS SENCILLOS CON ENTRADAS Y SALIDAS DE DATOS 38
17. RETARDOS 40
18. MANEJO DE SUBRRUTINAS 44
19. EJEMPLO UTILIZANDO RETARDOS 45
20. GENERACIÓN DE TONOS CON MICROCONTROLADORES 46
21. MOTORES PASO A PASO 48
22. EJEMPLO DE MANEJO DEL MOTOR PASO A PASO 49
23. EXPLICACIÓN DE LAS INSTRUCCIONES DE ROTACIÒN 52
24. MANEJO DE DISPLAY 7 SEGMENTOS Y ANTIREBOTE 55
25. TRABAJOS CON PULSADORES 57
26. EJEMPLO CON MANEJO DE DISPLAY 59
27. MULTIPLEXAJE DE DISPLAY 61
28. EJEMPLO DE MULTIPLEXAJE 64
29. INTERRUPCIONES 66
30. EJEMPLO UTILIZANDO INTERRUPCION POR RB0 70
31. CONVERSOR ANALOGO / DIGITAL (A/D) 73
32. EJEMPLO DE CONVERSOR ANÁLOGO DIGITAL 77
33. COMUNICACIÓN SERIAL 79
34. EJEMPLO COMUNICACIÓN SERIAL 83
BIBLIOGRAFIA
1 INTRODUCCIÓN

La guía de microcontroladores fue hecha pensando básicamente en que los


estudiantes cuenten con un material escrito que les sirva de alguna manera como
medio de consulta, en las diferentes practicas y proyectos que enfrentaran durante el
curso.

Inicialmente explica los conceptos básicos, como sistemas de numeración, compuertas


lógicas, flip – flop, memorias y aritmética binaria. Luego explica el microcontrolador
PIC16F873.

Los ejemplos que se desarrollan en esta guía son relativamente sencillos, y


seguramente no siempre será la mejor manera de hacerlos, es solo una, entre varias
posibilidades.

Agradezco el trabajo y el gran apoyo de los estudiantes Mónica Andrea López, Esteban
González y Paulina Fernández, que ayudaron en la edición de esta guía.
MICROCONTROLADORES

2. CONCEPTOS BÁSICOS:

Antes de comenzar el estudio de los Microcontroladores se estudiarán algunos


conceptos importantes para comprender bien el funcionamiento de los
Microcontroladores.

SISTEMAS DE NUMERACIÓN

BINARIO 27 26 25 24 23 22 21 20
DECIMAL ...........103 102 101 100
HEXADECIMAL .............163 162 161 160

2.1 Sistemas de Numeración Decimal (BASE 10)

Todos estamos familiarizados con el sistema decimal porque lo utilizamos día a día.
El sistema decimal es un sistema de numeración en base 10 porque los símbolos
que existen para representar cualquier número son 10, de 0 a 9. Pero mas allá de
representar cualquier número es importante conocer el peso de cada dígito.
Cuando se escribe un número decimal, cada dígito tiene un peso, por ejemplo:

1 4 1 2
Unidades
Decenas
Centenas
Miles

Se puede decir que el número es igual a:

1000 * (1) + 100 * (4) + 10 * (1) + 1 * (2)


1000 + 400 + 10 + 2 = 1412

Como se había dicho antes cada bit tiene un peso y el sistema decimal, se puede
representar:
.....104 103 102 101 100

y retomando el ejemplo
1 4 1 2

103 * (1) +102 * (4) + 101 * (1) + 100 * (2)


1000 + 400 + 10 + 2 =1412

INGENIERIA DE DISEÑO DE PRODUCTO 2


MICROCONTROLADORES

El valor de un número decimal es la suma de los dígitos después de haber


multiplicado cada dígito por su peso.

2.2 Sistema de Numeración Binario (BASE 2)

En electrónica digital es uno de los sistemas de numeración más utilizados. Es útil


porque solo utiliza dos dígitos, 1 y 0. Los dígitos binarios se utilizan para representar
los dos niveles de voltaje usados en electrónica digital ALTO O BAJO. En la
mayoría de los sistemas digitales el nivel de voltaje alto está representado por el 1,
mientras que el nivel de voltaje bajo o cero voltios lo representa el 0. El 1 representa
el estado de encendido de un interruptor, de una luz o de un transistor, mientras que
el estado apagado está representado por un 0.

Solo se tiene dos dígitos para representar cualquier número en binario, todos los
números binarios solo tienen unos y ceros y su base es dos.

Cuando se cuenta en binario se produce una situación similar al sistema decimal,


excepto que ahora solo se tiene dos dígitos, llamados bits. Empecemos a contar: 0,
1. Hasta aquí, ya hemos usado los dos dígitos, por lo que incluimos otra posición de
dígito y continuamos 10,11, nuevamente agotadas todas las combinaciones de dos
dígitos, por los que se requiere de una tercera posición. Con tres dígitos se puede
continuar contando 100, 101, 110 y 111, para continuar, necesitamos una cuarta
posición de dígito, y así sucesivamente.

........23 22 21 20

Igual que en el sistema decimal cada dígito tiene un peso.

La palabra bit es una contracción de las palabras en Inglés binary digit (Dígito
Binario). Cada posición de un número binario se conoce como bit. El número 10110
es un número de cinco bits. El primer lugar del extremo derecho recibe el nombre de
bit menos significativo (o LSB por sus siglas en Inglés), mientras que el lugar que
está en el extremo izquierdo se conoce como bit más significativo (MSB por sus
siglas en Inglés).
1 0 1 1 0

MSB LSB
1 palabra = 16 bits
1 byte = 8 bits
1 nible = 4 bits
1 byte = 1 0 1 0 1100

Nible superior Nible inferior

INGENIERIA DE DISEÑO DE PRODUCTO 3


MICROCONTROLADORES

2.3 Sistema Hexadecimal (Base 16)

Este sistema es en base 16, lo que significa que para cada columna es posible
escoger uno de entre 16 dígitos.

Estos son: 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E y F.

Donde A = 10 D = 13
B = 11 E = 14
C = 12 F = 15

Para contar en el sistema hexadecimal se inicia en la primera columna a la izquierda


y se cuenta de 0 hasta F, una vez que se llena la primera columna, se pone un 0 en
ella y se suma a la segunda columna.

0F
10
.
.
.
1F
20
21
.
.

.....163 162 161 160

De igual manera que en el sistema decimal y binario cada dígito tiene un peso.

Se suele poner una H al final del número para indicar que está representado en el
sistema hexadecimal 17H

2.4 Conversión de Binario a Decimal

Para convertir un número binario en uno decimal, se hace la lista con los valores de
cada posición y luego se suman los que corresponden a las posiciones donde hay
un 1.

Ejemplo
1 0 1 0 1
24 23 22 21 20
16 + 0 + 4 + 0 + 1=21

INGENIERIA DE DISEÑO DE PRODUCTO 4


MICROCONTROLADORES

2.5 Conversión de Decimal a Binario

El numero decimal se divide repetidamente entre 2, ignorando los residuos, hasta


que se tiene un cociente igual a cero. Después se emplean éstas para obtener la
respuesta, por ejemplo convertir 10110 en su equivalente a binario.

101 / 2 = 50 Residuo 1 LSB


50 / 2 = 25 Residuo 0
25 / 2 = 12 Residuo 1
12 / 2 =6 Residuo 0
6/2 =3 Residuo 0
3/2 =1 Residuo 1
1/2 =0 Residuo 1 MSB

RESPUESTA 1 1 0 0 1 0 12

2.6 Conversión de Hexadecimal a Decimal

Para convertir un número hexadecimal a decimal, se multiplica el valor de cada


dígito por su correspondiente peso y luego se suman todos los valores.

2B616 decimal ?

162 161 160


2 B 6
2* 256 + 11 * 16 + 6 * 1 = 694

2.7 Conversión de Binario a Hexadecimal

Nótese que cuatro bits binarios corresponden a un dígito hexadecimal. Esto es, se
refieren cuatro bits para contar de 0 hasta F. Para representar números binarios
como números hexadecimales, se forman grupos de cuatro comenzando en el punto
binario y en dirección a la izquierda. A continuación se convierte cada grupo en el
correspondiente dígito hexadecimal.

Convertir 10111100 en un numero hexadecimal

1011 1100
B C

10111100 = BC16

INGENIERIA DE DISEÑO DE PRODUCTO 5


MICROCONTROLADORES

2.8 Conversión de Hexadecimal a Binario

La conversión de hexadecimal a Binario es igual de sencilla, por cada dígito


hexadecimal se escriben los dígitos binarios correspondientes.

FF16 Binario ?

F F
1111 1111
FF16 = 11111111

2.9 Decimal codificado en Binario: (BCD)

En BCD cada dígito decimal esta representado por cuatro bits.

0……….0000
1……….0001
.
.
.
9……….1001

para representar el 25 decimal en BCD

0010 0101
2 5

2.10 Representación de los números de 0 a 15

DECIMAL BINARIO HEXADECIMAL BCD


0 0000 0 0000
1 0001 1 0001
2 0010 2 0010
3 0011 3 0011
4 0100 4 0100
5 0101 5 0101
6 0110 6 0110
7 0111 7 0111
8 1000 8 1000
9 1001 9 1001
10 1010 A 0001 0000
11 1011 B 0001 0001

INGENIERIA DE DISEÑO DE PRODUCTO 6


MICROCONTROLADORES

12 1100 C 0001 0010


13 1101 D 0001 0011
14 1110 E 0001 0100
15 1111 F 0001 0101

3. COMPUERTAS LÓGICAS

3.1 Compuerta AND: La compuerta AND genera una salida ALTO solo cuando
todas las entradas están en nivel ALTO.

A X A B X
B 0 0 0
0 1 0
1 0 0
X=A*B
1 1 1

3.2 Compuerta OR: La compuerta OR genera un nivel alto a la salida cuando


cualquiera de sus entradas están en nivel ALTO.

A A B X
X
B 0 0 0
0 1 1
X=A+B 1 0 1
1 1 1

3.3 Compuerta NOT O INVERSOR: El inversor cambia el nivel lógico de la


salida al opuesto de la entrada, cambia un 1 por 0, y un 0
por 1.

A X A X
X=A 0 1
1 0

A X
X=A

El indicador de negación es un “circulo” que indica inversión, cuando aparece


en la entrada o en la salida de un elemento lógico.

INGENIERIA DE DISEÑO DE PRODUCTO 7


MICROCONTROLADORES

3.4 Compuerta NAND: el termino NAND es una contracción de NOT-AND, e


implica una función AND con la salida negada.
A X A X A B X
B = = B
0 0 1
0 1 1
X=A*B 1 0 1
1 1 0
La compuerta NAND genera una salida a nivel bajo solo cuando todas las entradas
están a nivel alto.

Cuando cualquiera de las entradas está a nivel bajo, la salida se pondrá a nivel
ALTO.

3.5 Compuerta NOR: el termino NOR es una contracción de NOT-OR e implica


una función OR con la salida invertida.
A X A X A B X
B = B
0 0 1
0 1 0
1 0 0
X=A+B
1 1 0

La compuerta NOR genera una salida a nivel bajo cuando cualquiera de las entradas
esta a nivel alto.

3.6 Compuerta (XOR) OR –Exclusiva: la salida se pone a nivel ALTO solo


cuando las dos entradas están a niveles lógicos opuestos.

A X X = AB + AB A B X
B
0 0 0
0 1 1
1 0 1
1 1 0

3.7 Compuerta (XNOR) NOR –EXCLUSIVA: el símbolo de la compuerta XNOR


indica que su salida es opuesta a la de la compuerta XOR.

A X X = AB + A.B
A B X
B
0 0 1
0 1 0
1 0 0
1 1 1

La salida se pone a nivel ALTO solo cuando las dos entradas están a niveles lógicos
iguales.

INGENIERIA DE DISEÑO DE PRODUCTO 8


MICROCONTROLADORES

4. FUNCIONES LOGICAS CON BYTES

Así como se forman compuertas lógicas con bits también es posible hacer funciones
lógicas con bytes.

AND 1 0 1 1 0 1 1 1
0 0 0 0 1 1 1 1
0 0 0 0 0 1 1 1

OR 1 0 1 1 0 1 1 1
1 1 1 1 0 1 1 0
1 1 1 1 0 1 1 1

XOR 1 0 1 0 1 1 1 1 XOR: sirve para determinar si dos bytes


1 0 1 0 1 1 0 0 son iguales, en ese caso el resultado de la
0 0 0 0 0 0 1 1 XOR será cero (0).

5. CIRCUITO COMBINACIONAL

El circuito combinacional es un circuito cuya función de salida esta determinada por


el estado de las entradas. Se soluciona mediante compuertas lógicas.

Se analizarán algunos circuitos combinados con su respectiva función de salida, en


las que, conociendo que estado tiene las entradas se puede saber el estado de la
salida.
A
B
X

A
B

X = A*B + A*B

La salida es uno si A = 1 y B = 0, ó si A = 1 y B = 1

El numero de posibles combinaciones de un circuito combinacional esta


representado por 2n ; donde n significa el numero de entradas.

Por ejemplo un circuito combinacional con 3 entradas puede tener 8 posibles


combinaciones:

23 = 8

INGENIERIA DE DISEÑO DE PRODUCTO 9


MICROCONTROLADORES

5.1 Diseño de un circuito combinacional

Problema:

Las acciones de una sociedad están distribuidas de la siguiente manera:


El socia A tiene el 22% de las acciones, el socio B el 20%, el socio C el 27% y el
socio D el 31%. Cada decisión que toma la junta directiva compuesta por los cuatro
socios, será aprobada con el 51% como mínimo del porcentaje total de las acciones.
Cada votación de un socio es asumida como aceptada ‘1’ y como no aceptada ‘0’.

Se pide diseñar el circuito, que nos indique encendiendo un bombillo, cuando la


propuesta fue aceptada.

Pasos para el diseño de un circuito combinacional

1. Entender bien el problema.

2. Hacer la tabla de verdad. El numero de entradas determina el numero de


posibles combinaciones de la tabla de verdad con la formula 2n , donde n es
el numero de entradas.

En este caso cada socio representa una entrada, por los tanto el numero de
posibles combinaciones es 24 = 16

22% 20% 27% 31%


SALIDA
A B C D
0 0 0 0 0
0 0 0 1 0
0 0 1 0 0
0 0 1 1 1 ABCD
0 1 0 0 0
0 1 0 1 1 ABCD
0 1 1 0 0
0 1 1 1 1 ABCD
1 0 0 0 0
1 0 0 1 1 ABCD
1 0 1 0 0
1 0 1 1 1 ABCD
1 1 0 0 0
1 1 0 1 1 ABCD
1 1 1 0 1 ABCD
1 1 1 1 1 ABCD

INGENIERIA DE DISEÑO DE PRODUCTO 10


MICROCONTROLADORES

3. Sacar la función de salida, hay dos formas:

Minterminos: (Suma de Productos)


Tiene en cuenta solo los casos en que la salida es “1” y cada salida se
separa por una OR.

Maxterminos: (productos de sumas)


Tiene en cuenta solo los casos en que la salida en cero “0” y cada salida
se separa por una AND.

En el ejemplo que se está solucionando se trabajará con los minterminos.


La función de salida queda así:

Sal = ABCD + ABCD + ABCD + ABCD + ABCD + ABCD + ABCD + ABCD

4. Simplificación: Existen dos formas para simplificar un circuito combinacional,


por:
Mapas de Karnaugh
Álgebra Booleana

Mapas de Karnaugh: se procede de la siguiente manera:

a) Se dibuja el mapa de Karnaugh con el numero de celdas igual al numero


de combinaciones de la tabla de verdad. A cada celda le corresponde una
salida.

NOTA: se debe tener en cuenta que entre celda y celda solo puede cambiar
una variable.

CD
AB 00 01 11 10
00
01
11
10

b) Se llena el mapa de Karnaugh con las salidas de la tabla de verdad. A


cada salida le corresponde una celda y cada celda corresponde a una
combinación de la tabla de verdad.
Se debe ubicar inicialmente las combinaciones en que la salida es “1” y
luego los espacios restantes se llenan con ceros “o”.

INGENIERIA DE DISEÑO DE PRODUCTO 11


MICROCONTROLADORES

CD
AB 00 01 11 10
00 0 0 1 0
01 0 1 1 0
11 0 1 1 1
10 0 1 1 0

c) Se reúnen en grupos de 1, 2, 4, 8 o 16 unos que sean adyacentes.

Nota: Dos celdas son adyacentes si entre una y otra solo cambia una
variable. Una celda es adyacente con cualquiera de sus lados, Izquierda,
derecha, arriba o abajo.
Se debe tratar de tener la menor cantidad de grupos con el mayor numero
de unos (1) posible. Un “1” puede pertenecer a varios grupos.

CD
AB 00 01 11 10
00 0 0 1 0 BD
01 0 1 1 0
11 0 1 1 1 ACD

10 0 1 1 0

AD CD

d) Se elimina de cada grupo las variables ó variables que cambian de estado.


e) Se unen las funciones simplificadas con una compuerta OR.

Sal = BD + AD + CD + ABC
La solución final al circuito combinacional es:
Socios A B C D

Salida

INGENIERIA DE DISEÑO DE PRODUCTO 12


MICROCONTROLADORES

6. LATCHES

Es un dispositivo biestable que almacena información binaria (1 bit).

Latch S – R (Set - Reset)

S
Q
S R Q
0 0 ESTADO PROHÍBIDO
0 1 0
Q 1 0 1
R
1 1 NO CAMBIA

Latch S – R con entrada activa a nivel bajo.

El latch tiene dos entradas R (Reset) poner a cero, y S (Set) pone a uno y dos
salidas Q y Q. Cuando la salida Q esta a nivel alto, el latch se encuentra en estado
SET y permanecerá indefinidamente en él hasta que se aplique un nivel en la
entrada R.

Por ejemplo para encender un motor con una estación Start/ Stop, se enciende con
el Start y permanece encendido hasta que se oprima el pulsador de Stop.

7. FLIP – FLOP:

Los flip-flop son dispositivos biestables sincrónicos. En este caso sincrónico significa
que la salida varia de estado únicamente en un instante específico de una entrada
de disparo denominada reloj (clock).

Un flip-flop disparado por flanco cambia de estado con el flanco positivo (flanco de
subida) o con el flanco negativo (flanco de bajada) del pulso de reloj.

INGENIERIA DE DISEÑO DE PRODUCTO 13


MICROCONTROLADORES

Flip – Flop S-R

Flanco de Flanco de
Subida Bajada

Tabla de Verdad

Ck S R Q

X 0 0 Q NO CAMBIA

0 1 0 RESET

1 0 1 SET

1 1 ? ESTADO PROHIBIDO

Flip – Flop Tipo “D”

El flip-flop tipo D resulta muy útil cuando se necesita un único bit de datos (1 0 0) si
se añade un inversor a un flip – flop S – R obtenemos un flip – flop D básico.

D Ck Q

1 1

0 0

Existen otros tipos de flip-flop que no se tratarán en el curso tales como: Flip – Flop
JK y Tipo “T”.

Para implementar circuitos con flip – flops existen circuitos integrados con diferentes
tipos de flip-flops.

En éste caso se trabajaran con el circuito integrado 74LS74 que es un flip – flop tipo
“D” con entradas de preset y clear; se trabajará como latch S – R y como flip – flop
tipo “D”.
Además se trabajará con el circuito integrado 74LS374, este circuito contiene 8 flip –
flop tipo “D”, es decir un byte con un reloj común.

A continuación se muestran los circuitos de aplicación.

INGENIERIA DE DISEÑO DE PRODUCTO 14


MICROCONTROLADORES

PRIMER CIRCUITO

Como flip/flop set - reset

1K

1K

Como flip/flop tipo “D”

74LS 74

1K

INGENIERIA DE DISEÑO DE PRODUCTO 15


MICROCONTROLADORES

1K

8. MEMORIAS

Las memorias son unos dispositivos de almacenamiento de datos binarios que


pueden ser de largo plazo o corto plazo.
Como regla general, las memorias almacenan datos en unidades que tienen de uno
a ocho bits. En muchas aplicaciones se tratan los datos en unidades de 8 bits,
denominado byte.
Una memoria esta compuesta por una gran cantidad de latches, formando una
matriz.

0
1
Dirección
2
3
00 1 2 3 4 5 6 7

Bits

INGENIERIA DE DISEÑO DE PRODUCTO 16


MICROCONTROLADORES

Cada elemento de almacenamiento en una memoria puede almacenar un “1” ó un


“0” y se le denomina celda. Las memorias están formadas por matrices de celdas.
Cada bloque de la matriz de memoria representa una celda de almacenamiento y su
situación se puede especificar mediante una fila y una columna.

La matriz de 4 x 8, se puede entender como una memoria de 32 bits o como una


memoria de 4 bytes.
La posición de una unidad de datos en una matriz de memoria se denomina
dirección. La dirección de un bit en la matriz se especifica mediante la fila y la
columna en la que se encuentra. La dirección de un byte se especifica únicamente
mediante la fila.
La capacidad de una memoria es el número total de unidades de datos que puede
almacenar. En el ejemplo tratado la capacidad total es de 32 bits o 4 bytes.
Puesto que una memoria almacena datos binarios, los datos pueden introducirse en
la memoria y deben poderse recuperar cuando se necesiten. La operación de
escritura coloca los datos en una posición específica de la memoria y la operación
de lectura extrae los datos de una dirección especifica de memoria. La operación de
direccionamiento, que forma parte tanto de la operación de lectura como de
escritura, selecciona la dirección de manera especifica.

8.1 Diferentes Tipos de Memoria

a) Memoria RAM

La memoria RAM (Ramdom-Acces Memory; Memoria de Acceso Rápido), es un tipo


de memoria en la que se tarda lo mismo en acceder a cualquier dirección de
memoria y éstas se pueden seleccionar en cualquier orden , tanto en una operación
de lectura como de escritura. Todas las RAMs poseen la capacidad de lectura y
escritura.
Las memorias RAM reciben el nombre de memoria volátil, ya que pierden los datos
almacenados cuando se desconecta la alimentación.

b) Memoria ROM

La memoria ROM (Read_Only Memory; Memoria de solo lectura), es un tipo de


memoria en la que los datos se almacenan en forma permanente o semipermanente.
Los datos se pueden leer de una ROM, pero no existe la operación de escritura
como en las RAM.

c) Memoria EPROM

Son memorias que se programan eléctricamente y que se borran con la exposición


de la memoria a una luz ultravioleta que pasa a través de la ventana de cuarzo que
tiene en la parte superior del encapsulado.

INGENIERIA DE DISEÑO DE PRODUCTO 17


MICROCONTROLADORES

d) Memoria EEPROM

Son memorias que se pueden borrar y programar mediante impulsos eléctricos. Ya


que se pueden grabar y borrar eléctricamente, las EEPROM se pueden reprogramar
dentro del propio circuito final.

c) Memoria FLASH

Las memorias flash son memorias de lectura / escritura de alta densidad (alta
densidad se refiere a gran cantidad de almacenamiento de bits) no volátil, lo que
significa que los datos se pueden almacenar indefinidamente sin necesidad de
alimentación; En nuestro caso y como ejemplo practico trabajaremos con una
memoria EPROM (2716) que tienen una capacidad de almacenamiento de 1024
bytes.

A continuación se muestra el diagrama de la memoria 2716, identificando sus pines.

Los pines del A0 al A10 permiten escoger la posición de memoria que se desee leer
o escribir; los pines O0 al O7 son los datos (1 byte); las líneas OE y CE son
habilitadores que nos permiten leer y escribir en la memoria la línea; y VPP se utiliza
para grabar la memoria.

El ejemplo que se plantea como aplicación consiste en mostrar en un display siete


(7) segmentos, en este caso será un mensaje “HOLA”.
En la memoria se almacenan los códigos correspondientes a cada letra, iniciando en
la dirección 0, hasta la 3. En la dirección 0 se almacenan los códigos
correspondientes de la letra H, en la dirección 1 la O y así sucesivamente hasta
completar el mensaje.

Se necesitará un contador que vaya cambiando la dirección de memoria en forma


automática y cuando llegue a 4 comience de nuevo.

INGENIERIA DE DISEÑO DE PRODUCTO 18


MICROCONTROLADORES

Partiendo de un display de cátodo común y con la conexión que se muestra en la


siguiente figura, se determina el contenido de cada letra en la memoria.

330

Para determinar el código de la H, se define inicialmente que segmentos del display


se deben encender.

Como se observa, se deben encender los segmentos : b, c, e, f, y g.


Y este código se debe almacenar en la memoria.

O7 O6 O5 O4 O3 O2 O1 O0

0 1 1 1 0 1 1 0

g f e d c b a

El contador 4029 del diagrama me permite cambiar en forma automática de dirección


y de letra; cuando llega a 4 el contador automáticamente comienza en cero
nuevamente, y por lo tanto el mensaje comienza de nuevo.

INGENIERIA DE DISEÑO DE PRODUCTO 19


MICROCONTROLADORES

INGENIERIA DE DISEÑO DE PRODUCTO 20


MICROCONTROLADORES

9. ARITMÉTICA BINARIA

8.1 Suma Binaria:


Las cuatro reglas básicas para sumar dígitos binarios son:
0 + 0 = 0 suma 0 con acarreo 0
0 + 1 = 1 suma 1 con acarreo 0
1 + 0 = 1 suma 1 con acarreo 0
1 + 1 = 0 suma 0 con acarreo 1

Ejemplos
100 + 10

100 + 4+
10 2
110 6

10011100 + 00110011

11
10011100 + 156 +
00110011 51
11001111 207

Como ya se sabe en un byte el numero máximo que podemos representar es el 255,


con todos los 8 bits en uno. Cuando el resultado de una suma da un numero mayor
de 255, se genera un bit adicional llamado carry.

Ejemplo: 10101011 + 01101100

1 11 1
10101011 +
01101100
1 00111111

Bit de acarreo

9.2 Resta Binaria:


La operación de resta algunas veces podría dar valores negativos, es importante
tener presente éste signo. La resta requiere entender como sacar el “complemento
a dos”, de un numero.
Obtención del “Complemento a Uno” binario:
El “Complemento a uno” se obtiene cambiando todos los unos por ceros, y todos los
ceros por unos, como se ilustra a continuación:

INGENIERIA DE DISEÑO DE PRODUCTO 21


MICROCONTROLADORES

1 0 1 1 0 0 1 0 Numero Binario

0 1 0 0 1 1 0 1 Complemento a uno

Obtención del “Complemento a Dos” de un numero Binario:

El “Complemento a Dos” de un numero Binario se obtiene sumando uno (1) a LSB


(Dígito menos significativo) del complemento a uno.

Ejemplo: Hallar el complemento a dos de:


1 0 1 1 0 0 1 0 Numero Binario
0 1 0 0 1 1 0 1 Complemento a Uno
+ 1
0 1 0 0 1 1 1 0 Complemento a Dos

Para restar dos números binarios se calcula el complemento a dos del sustraendo y
se suman el mimuendo y el complemento a dos del sustraendo. Si genera un bit de
acarreo, el resultado es positivo o cero, sino lo genera, el resultado es negativo.

Ejemplo: Restar
10111001 - 01000010

Minuendo Sustraendo

10111001+ 185 -
10111110 66
1 01110111 119

Numero Positivo

Ejemplo: Restar
10111001 - 11100011

10111001+ 185 -
00011101 227
11010110 - 42

Numero Negativo

Para hallar el resultado se calcula el complemento a dos del resultado.


11010110
00101001 Complemento a uno
+ 1
00101010 Complemento a dos

- 42

INGENIERIA DE DISEÑO DE PRODUCTO 22


MICROCONTROLADORES

10. INTRODUCCION AL MICROCONTROLADOR

Un microcontrolador es un circuito integrado que contiene toda la estructura de un


Microcomputador, es decir, unidad de proceso (CPU), memoria RAM, memoria ROM
y circuitos de entrada/salida.

Es un dispositivo programable que puede ejecutar un sinnúmero de tareas y


procesos.
Un Microcontrolador esta compuesto básicamente por cuatro componentes
principales:

Memoria ROM, EEPROM o EPROM: es la memoria donde se almacena el


programa.
Memoria RAM o SRAM: es la memoria donde se almacenan los datos.
Líneas de Entrada / Salida (I / O): también llamada puertos, se utilizan para
conectar elementos externos al microcontrolador.
CPU: controla y ejecuta todas las instrucciones que conforman el programa.

Existen diferentes familias de microcontroladores: Intel, Motorola, Microchip, entre


otras.
En este curso solo se estudiará el microcontrolador PIC16F873, que pertenece a la
familia de Microchip; esta familia de microchip se caracteriza por tener procesador
RISC y arquitectura Harvard caracterizada por la independencia entre la memoria
de código (programa) y la de memoria de datos.

Bus de Dirección de Bus de Dirección de


Memoria de Instrucciones Datos Memoria de
Código (Flash) Procesador Datos
(SRAM)

Bus de Instrucciones Bus de Datos

El conjunto de instrucciones es de solo 35, por esto se dice es un microcontrolador


de tipo RISC (computador con set de instrucciones reducido)

Organización de la memoria de datos RAM

INGENIERIA DE DISEÑO DE PRODUCTO 23


MICROCONTROLADORES

Mapa de Memoria del PIC16F873

Indirect addr.(*) 00h Indirect addr.(*) 80h


TMRO 01h OPTION_REG 81h
PCL 02h PCL 82h
STATUS 03h STATUS 83h
FSR 04h FSR 84h
PORTA 05h TRISA 85h
PORTB 06h TRISB 86h
PORTC 07h TRISC 87h
PORTD (1) 08h PORTD (1) 88h
PORTE (1) 09h PORTE (1) 89h
PCLATH 0Ah PCLATH 8Ah
INTCON 0Bh INTCON 8Bh
PIR1 0Ch PIE1 8Ch
PIR2 0Dh PIE2 8Dh
TMR1L 0Eh PCON 8Eh
TMR1H 0Fh 8Fh
T1CON 10h 90h
TMR2 11h SSPCON2 91h
T2CON 12h PR2 92h
SSPBUF 13h SSPADD 93h
SSPCON 14h 94h
CCPR1L 15h 95h
CCPR1H 16h 96h
CCP1CON 17h 97h
RCSTA 18h TXSTA 98h
TXREG 19h SPBRG 99h
RCREG 1Ah 9Ah
CCPR2L 1Bh 9Bh
CCPR2H 1Ch 9Ch
CCP2CON 1Dh 9Dh
ADRESH 1Eh ADRESL 9Eh
ADCON0 1Fh ADCON1 9Fh

Registros de 20h Registros de A0h


Propósito Propósito
General General
96 Bytes 80 Bytes
EFh
F0h
Mapeados con
7Fh 70h-7Fh FFh
Banco 0 Banco1
Posiciones de memoria no implementadas, leídos como ´O´
* No es un registro físico.

INGENIERIA DE DISEÑO DE PRODUCTO 24


MICROCONTROLADORES

Para seleccionar el banco al que se desea acceder en la RAM se emplean los bits 6
y 5 del registro de estado (status)
A partir de la posición de memoria 20H están los registros de propósito general,
donde se almacenan datos temporales durante la ejecución del programa. Todos
estos registros son de 8 bits, por lo tanto el numero máximo que podemos almacenar
es 255.
Existe además en el microcontrolador el registro W de 8 bits, es un registro de
trabajo y la mayor parte de las instrucciones del microcontrolador lo involucran.

Descripción de los Pines

OSC1 / CLK IN (9): Entrada del cristal de cuarzo o del oscilador externo.
OSC2 / CLK OUT (10): Salida del cristal de cuarzo.
VSS (8 - 19): Conexión a tierra (GND)
VDD (20): Conexión a positivo (+5V)
MCLR# / VPP (1): Entrada de Reset o entrada del voltaje de programación.
Si no se va a utilizar se debe poner a +5V.

INGENIERIA DE DISEÑO DE PRODUCTO 25


MICROCONTROLADORES

Puerto A : El puerto A del microcontrolador esta compuesto por 6 líneas de


entrada / salida que además nos permiten trabajar con señales
análogas.
RA0 / AN0 (2): puede funcionar como línea digital.
RA1 / AN1 (3): igual que la RA0 / AN0.
RA2 (4): línea de entrada / salida digital.
RA3 (5): línea de entrada / salida digital.
RA4 (6): línea de entrada / salida digital.
Cuando se configura como salida es de colector abierto.
RA5 (7): línea de entrada / salida digital.

Puerto B: Este puerto esta compuesto por 8 líneas que se pueden configurar
como entrada / salida digital y para interrupciones externas.
RB0 (21): línea de entrada / salida digital.
RB1 (22): línea de entrada / salida digital.
RB2 (23): línea de entrada / salida digital.
RB3 (24): línea de entrada / salida digital.
RB4 (25): línea de entrada / salida digital.
RB5 (26): línea de entrada / salida digital.
RB6 (27): línea de entrada / salida digital.
RB7 (28): línea de entrada / salida digital.

Puerto C: Este puerto esta compuesto por 8 líneas que se pueden configurar
como entrada / salida digitales, además sirve para trabajar con los
temporizadores del microcontrolador y la comunicación serial.
RC0 (11): línea de entrada / salida digital.
RC0 (12): línea de entrada / salida digital.
RC0 (13): línea de entrada / salida digital.
RC0 (14): línea de entrada / salida digital.
RC0 (15): línea de entrada / salida digital.
RC0 (16): línea de entrada / salida digital.
RC0 (17): línea de entrada / salida digital.
RC0 (18): línea de entrada / salida digital.

INGENIERIA DE DISEÑO DE PRODUCTO 26


MICROCONTROLADORES

NOTA:

El cristal determina la velocidad de ejecución del programa.

Para ejecutar un programa se necesita garantizar las siguientes conexiones.

11. EXPLICACIÓN DEL REGISTRO STATUS

El Registro de estado es el registro mas utilizado en el microcontrolador, ubicado en


la posición 03 del banco 1 de memoria y en la 83H en el banco 2 de memoria.
Su estructura es la siguiente:

IRP RP1 RP0 TO# PD# Z DC C

Los tres bits de menos peso son los señalizadores de ciertas condiciones en las
operaciones lógicas – aritméticas.

Z: Señalizador de cero: Se pone a “1” automáticamente cuando el resultado de una


operación lógica o aritmética da cero.

C: Acarreo/llevada en el bit 8: Se pone a “1” automáticamente cuando existe acarreo


en el bit de mas peso en las instrucciones de suma. También actúa como
señalizador de llevada en las instrucciones de resta, pero en este caso la
correspondencia es inversa. Es si vale “0” hay llevada.

DC: Acarreo/llevada en el bit 4: Funciona igual que el señalizador C, pero en el


cuarto bit. Es muy útil en las operaciones con números expresados en BCD.

INGENIERIA DE DISEÑO DE PRODUCTO 27


MICROCONTROLADORES

PD#: Se activa a “0” al ejecutarse la instrucción SLEEP (Modo reposo). Se pone a


“1” automáticamente tras la conexión de la alimentación, o bien al ejecutarse la
instrucción CLRWDT (Refresco del perro guardián)

TO#: Se activa a nivel bajo al desbordarse el perro guardián. Toma el valor “1” tras
la conexión de la fuente de alimentación o al ejecutarse la instrucción CLRWDT o
SLEEP.

Finalmente los tres bits de mas peso del registro de estado se emplean para
seleccionar el banco de RAM al que se desea acceder.
Se utilizan los bits RP1 y RP0 de acuerdo con la siguiente codificación:

RP1 RP0 Banco Seleccionado


0 0 Banco 0
0 1 Banco 1
1 0 Banco 2
1 1 Banco 3

En el caso del PIC16F873 solo se cuenta con dos bancos de memoria el banco 0 y
el banco 1.
El bit IRP se usa concatenado con el bit de mas peso del registro FSR para elegir el
banco de RAM en el direccionamiento indirecto.
IRP Selección del banco de RAM en direccionamiento indirecto.

0: Bancos 0 y 1
1: Bancos 2 y 3

En los primeros ejemplos que haremos solo usaremos los bits Z (cero) y C (carry)
del registro de estado.

INGENIERIA DE DISEÑO DE PRODUCTO 28


MICROCONTROLADORES

Resumen de Instrucciones del Microcontrolador Pic 16f873


NEMÓ PARÁ- SEÑALIZA-
OPERACIÓN CICLOS
NICOS METROS DORES
INSTRUCCIONES QUE MANEJAN REGISTRO
ADDWF f,d SUMA de W con f 1 C,DC,Z
ANDWF f,d AND de W con f 1 Z
CLRF f BORRADO de f 1 Z
CLRW a,e BORRADO de W 1 Z
COMF f,d COMPLEMENTO de f 1 Z
DECF f,d DECREMENTO de f 1 Z
INCF f,d INCREMENTO de f 1 Z
IORWF f,d OR de W con f 1 Z
MOVF f,d MOVIMIENTO de f 1 Z
MOVWF f MOVIMIENTO de W a f 1
NOP ae NO OPERACIÓN 1
RLF f,d ROTACION de f a izquierda con carry 1 C
RRF f,d ROTACION de f a derecha con carry 1 C
SUBWF f,d RESTA de W a f (f - W) 1 C,DC,Z
INTERCAMBIO de 4 bits de +peso por los 4
SWAPF f,d 1
de –peso.
XORWF f,d OR exclusiva de W con f 1 Z
INSTRUCCIONES QUE MANEJAN BITS
BCF f,b PUESTA a 0 del bit b de f 1
BSF f,b PUESTA a 1 del bit b de f 1
INSTRUCCIONES DE <SALTO>
BTFSC f,b PRUEBA del bit b de f; SALTA si es 0 1 (2)
BTFSS f,b PRUEBA del bit b de f; SALTA si es 1 1 (2)
DECFSZ f,d DECREMENTO de f; SALTA si es 0 1 (2)
INCFSZ f,d INCREMENTO de f; SALTA si es 0 1 (2)
INSTRUCCIONES QUE MANEJAN OPERANDOS INMEDIATOS
ADDLW k SUMA de literal con W 1 C, DC,Z
ANDLW k AND de literal con W 1 Z
IORLW k OR de literal con W 1 Z
MOVLW k MOVIMIENTO de literal a W 1
SUBLW k RESTA W de literal (k-w) 1 C,DC,Z
XORLW k OR exclusiva de literal con W 1 Z
INSTRUCCIONES DE CONTROL Y ESPECIALES
CALL k LLAMADA a subrrutina 2
CLRWDT BORRADO del WATHDOG 1 #TO, #PD
GOTO K SALTO a una dirección 2
RETFIE RETORNO de interrupción 2
RETLW k RETORNO devolviendo literal en W 2
RETURN RETORNO de subrrutina 2
SLEEP PUESTA del microprocesador en reposo 1 #TO,#PD

INGENIERIA DE DISEÑO DE PRODUCTO 29


MICROCONTROLADORES

12. SINTAXIS DE LAS INSTRUCCIONES

Todas las instrucciones del microcontrolador tienen una sintaxis, que se indica en la
tabla de instrucciones:
1) MOVLW K: carga en W el valor del literal K.
K: es una constante que puede tomar el valores de 0 a 255, ya que es de 8
bits.
Las constantes se pueden indicar en 3 sistemas de numeración diferentes:
MOVLW .255 carga 255 en W (Sistema Decimal)
MOVLW b´11111111´ carga 255 en W (Sistema Binario)
MOVLW 0FFH carga 255 en W (Sistema Hexadecimal)

2) CLRF F: pone en cero el registro F.


El registro F es cualquier posición de memoria RAM del microcontrolador,
Incluyendo los registros de propósito general. (los que empiezan a partir de la
posición 20H y son declarados por el usuario).
Ejemplo:
CLRF PORTB: pone en cero todos los bits del puerto B.

3) DECF f,d: decrementa el registro f


f: es cualquier posición de memoria RAM
d: es el destino del resultado. Solo hay dos posibles destinos: el registro W o
el registro f.
DECF contador, F : Decrementa el contador y almacena el resultado en el
mismo contador.
DECF contador, W : Decrementa el contador y almacena el resultado en el
registro w.
También se puede especificar el destino con “0” o “1” donde “0” indica
destino w y “1” destino F.
DECF contador, 1 : Decrementa el contador y almacena el resultado en el
mismo contador.
DECF contador, 0 : Decrementa el contador y almacena el resultado en el
registro w.

4) BCF f,b : pone en “0” el bit b del registro f.


f: es cualquier posición de memoria RAM.
b: es el bit específico del registro f. Este bit puede estar entre 0 y 7.
Ejemplo:
BCF PORTB,0 : pone en “0” el bit 0 del puerto B (RB0).
.
Nota: solo se incluyen algunas instrucciones, sin embargo todas las
instrucciones cumplen esta sintaxis
INGENIERIA DE DISEÑO DE PRODUCTO 30
MICROCONTROLADORES

13. DIRECTIVAS PARA HACER UN PROGRAMA EN MICROCONTROLADOR

Etiqueta Operación Operandos Comentarios


Inicio movlw 0 ; Carga el circuito w

Etiquetas:
Son nombres simbólicos que se asignan a una dirección de memoria. Por ejemplo,
cuando se escribe la palabra inicio, se le está diciendo al ensamblador que esa es la
dirección de memoria correspondiente donde quedará grabada la primera
instrucción.

Operación:
Es la instrucción del microcontrolador que se ejecuta.

Operandos:
Son los registros o cantidades sobre los que se realizan las operaciones o
instrucciones. Puede ser un registro de la memoria de datos o un valor constante
que comúnmente se conoce como “literal”.
Cuando se utilizan dos operandos, el primero es el operando fuente y el segundo es
el operando destino.

Comentario:
El ensamblador ignora esta línea en el momento de generar el código objeto, pero
para la persona que hace el programa es muy importante ya que ahí puede escribir
la idea o la explicación de lo que esta haciendo en esa línea del programa.

Punto y coma (;):


Es un delimitador. Hace que el ensamblador ignore la linea de texto que se
encuentra a la derecha de él. Se usa para escribir comentarios acerca de la
instrucción particular que se tiene y de la acción que esta ejecutando el
microcontrolador.

Clases de líneas en un programa:


Se pueden usar cuatro tipos diferentes de lineas, la de igualdad (EQU), la de origen
(ORG), la de instrucción normal y la de final (END).

Igualdades:
Se utilizan para asignar un nombre o símbolo a un valor especifico (Hexadecimal).
Por ejemplo cuando se hace:

PORT B EQU 06
Se está asignando el nombre PORTB al valor 06, que corresponde a la dirección
física del puerto B.

INGENIERIA DE DISEÑO DE PRODUCTO 31


MICROCONTROLADORES

También se puede usar para asignar nombres a un numero cualquiera, por ejemplo:

CONTADOR EQU 09

Origen:
ORG es una directiva del ensamblador que se usa para definir el sitio (de la
memoria) donde se desea escribir alguna porción de programa en particular.

ORG 0

En este caso se indica que las instrucciones que vienen a continuación quedarán a
partir de la dirección de memoria 00 en el microcontrolador.

Final:
Se usa para decirle al ensamblador que el programa ha terminado; se usa la
directiva END.

Encabezado del programa

list P = 16F873 ; indica el tipo de procesador


R = Hex ; sistema de numeración hexadecimal

Include <PIC16F873.INC> ; se incluye la definición de los registros


internos en la librería.

Ejemplo:
Include <P16F873.INC>
LIST P= 16F873, R=Hex

OPERANDO 1 EQU 20 ; DEFINE LA POSICIÓN DEL OPERADO 1


OPERANDO 2 EQU 21 ; DEFINE LA POSICIÓN DEL OPERADO 2
RESULTADO EQU 22 ; DEFINE LA POSICIÓN DEL RESULTADO

ORG 0
MOVLW 05 ;w=5
MOVWF OPERANDO1 ; w = OPERANDO1
MOVLW 02 ;w=2
MOVWF OPERANDO2 ; w = OPERANDO2
MOVF OPERANDO1 ; w = OPERANDO1
ADDWF OPERANDO2,W ; w = w+OPERANDO2
MOVWF RESULTADO ; w = RESULTADO

END ; DIRECTIVA DEL FIN DE PROGRAMA

INGENIERIA DE DISEÑO DE PRODUCTO 32


MICROCONTROLADORES

14. EJEMPLOS SENCILLOS CON DIAGRAMAS DE FLUJO

Ejemplo 1: Como hacer que un programa se ejecute N veces

Cuando se quiere que un programa se repita N veces se debe utilizar un registro de


memoria RAM que funciona como contador en forma descendente, este contador se
carga inicialmente con el numero de veces que queremos que se repita el programa.

Include<P16F873.INC>
LIST P=16F873, R=HEX

CONTADOR EQU 20

ORG 0
MOVLW 5 ; El Programa se repite 5 veces
MOVWF CONTADOR ; Carga contador con 5
LOOP NOP ; Programa
NOP ; Programa
NOP ; programa
DECFSZ CONTADOR,F : Decrementa contador e ignora la siguiente
; instrucción si el contador es cero
GOTO LOOP ; salta a LOOP
END ; Fin del programa

Ejemplo 2: Como comparar si dos números son iguales

Para comparar si dos números son iguales se utiliza la instrucción XORWF f,d (XOR
entre W y el registro f), si los dos números son iguales el resultado de la XORWF
será cero y la bandera Z del registro de estado se pone en “1”

Include<P16F873.INC>
LIST P=16F873, R=HEX

NUMERO 1 EQU 20

ORG 0
MOVLW .10 ; Carga W con 15
MOVWF NUMERO1 ; Lleva 15 a NUMERO1
MOVLW .15 ; Carga W con 15
XORWF NUMERO1,W ; Realiza una XOR entre W y NUMERO1
BTFSS STATUS,Z ; Pregunta si el bit Z del registro de
; estado esta en uno
GOTO NOIGUAL ; Salta a NOIGUAL
GOTO IGUAL ; Salta a IGUAL

INGENIERIA DE DISEÑO DE PRODUCTO 33


MICROCONTROLADORES

Hacer un programa en microcontrolador que me genere los números de 0 a 15, y cuando


EJEMPLO 3 llegue a 15, nuevamente comience el conteo desde cero.

Programa Diagrama de flujo


INCLUDE <P16F873,INC>
INICIO
LIST P=16F873, R=HEX

CONTADOR EQU 20
CONTADOR=0

ORG 0
INICIO MOVLW 0 ;carga W con o
MOVWF CONTADOR ;lleva W al contador
INCREMENTAR CONTADOR
LOOP INCF CONTADOR,F ;incrementa contador
MOVLW .15
XORWF CONTADOR,W ; XOR entre W y contador.
BTFSS STATUS,Z ;si Z=1 salta una instrucción.
GOTO LOOP SI NO
Contador=15
GOTO INICIO
END

INGENIERIA DE DISEÑO DE PRODUCTO 34


MICROCONTROLADORES

EJEMPLO 4 MULTIPLICACION DE DOS NUMEROS ENTEROS

Programa Diagrama de flujo


INCLUDE <P16F873.INC>
M U LTIPLIC AC IÓ N
LIST P=16F873, R=HEX

MULTIPLICANDO EQU 20 C argar m ultiplicando

MULTIPLICADOR EQU 21
C argar m ultiplicador
RESULTADO EQU 22
Carga resultado=0
ORG 0
MOVLW .X R esultado=
MOVWF MULTIPLICANDO resultado+m ultiplicando
MOVLW .Y
MOVWF MULTIPLICADOR D ecrem enta m ultiplicador
MOVLW .0
MOVWF RESULTADO
LOOP MOVF MULTIPLICANDO,W NO M ultiplicador=0
ADDWF RESULTADO,F
DECFSZ MULTIPLICADOR,F SI

GOTO LOOP EN D
END

INGENIERIA DE DISEÑO DE PRODUCTO 35


MICROCONTROLADORES

EJEMPLO 5 DIVISION DE DOS NUMEROS ENTEROS Y RESULTADO NUMERO ENTERO

Programa Diagrama de flujo


INCLUDE <P16F873.INC> DIVISIÓN
LIST P=16F873, R=HEX

DIVIDENDO EQU 20 Cargar dividendo


DIVISOR EQU 21
RESULTADO EQU 22
RESIDUO EQU 23 Cargar divisor
ORG 0
MOVLW .X Carga resultado=0
MOVWF DIVIDENDO
MOVLW .Y
MOVWF DIVISOR Residuo=dividendo
MOVLW .0
MOVWF RESULTADO
MOVF DIVIDENDO,W Residuo =
MOVWF RESIDUO residuo-dividendo
LOOP MOVF DIVISOR,W Incrementa
SUBWF RESIDUO,F resultado
MOVLW .0 NO
XORWF RESIDUO,W Residuo = 0
BTFSC STATUS,Z
RETURN SI
INCFSZ RESULTADO,F
GOTO LOOP END
END
INGENIERIA DE DISEÑO DE PRODUCTO 36
MICROCONTROLADORES

15. CONFIGURACIÓN DE LOS PUERTOS

Los puertos del microcontrolador se pueden configurar cada patica como entrada o
salida digital.
Cada línea de cada puerto representa un bit, por ejemplo el puerto B:

RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0

Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0

Para denotar un bit en particular, se puede decir


Portb, 6 el bit 6 del puerto b

Pasos para configurar el puerto b (PORTB) y el puerto c (PORTC):

1. Cargar en w el valor para la configuración del puerto, teniendo en cuenta que


para configurar una línea como entrada se pone el bit en “1” y si se quiere
configurar como salida se pone el bit correspondiente en “0”.

Ejemplo: configurar el puerto b de la siguiente manera:

1 RB0
1 RB1
Entrada
1 RB2
1 RB3
0 RB4
0 RB5
Salida
0 RB6
0 RB7

El valor que se debe cargar en w es “ 0 0 0 0 1 1 1 1 “ y la instrucción es:


MOVLW b”00001111”

2. Digitar la instrucción TRIS y el puerto. Si nos referimos al puerto b, la instrucción


será TRIS PORTB

INGENIERIA DE DISEÑO DE PRODUCTO 37


MICROCONTROLADORES

La configuración completa es:


MOVLW b”00001111”
TRIS PORTB

16. EJEMPLO SENCILLOS CON ENTRADA Y SALIDA DE DATOS

Este ejemplo muestra una aplicación muy simple y básica de un microcontrolador la


cual consiste en que, sí cualquier entrada (RB0) se pone en uno, la salida (RC2) se
pone en uno también.

Configurar Puertos

Port B = 0

Si Rc 2 = 0 ?

No

RB 0 = 0 RB 0 = 1

Programa:
Include <P16F873. INC> ;LA INSTRUCCIÓN INCLUDE ME CARGA UN ARCHIVO
LIST P = 16873 = HEX DONDE SE ENCUENTRAN TODOS LOS REGISTROS
CON SUS RESPECTIVAS DIRECCIONES.

ORG 0 ;ESTO INDICA QUE EL PROGRAMA COMIENZA EN LA


DIRECCIÓN CERO.
MOVLW 0
TRIS PORTB ;CONFIGURAR EL PUERTO B TODO COMO SALIDA.
MOVLW .255 ;CONFIGURAR EL PUERTO C TODO COMO ENTRADA.
TRIS PORTC
CLRF PORTB ;PONE EN 0 EL PUERTO B.
LOOP BTFSS PORTC,2 ;SI EL BIT2 DEL PUERTO C ESTA EN 0?.
GOTO H1 ;SALTA A H1.
BSF PORTB,0 ;ENTONCES COLOQUE LA SALIDA RB0 EN 1.
GOTO LOOP ;SALTA A LOOP.
H1 BCF PORTB,0 ;SI NO ENTONCES COLOQUE EN 0 LA SALIDA RB0.
GOTO LOOP
END ;FIN DEL PROGRAMA.

INGENIERIA DE DISEÑO DE PRODUCTO 38


MICROCONTROLADORES

Un contador de números de 0 a 15 en forma ascendente o descendente dependiendo de la entrada de RC0.


Si RC0=1 contador ascendente.
EJEMPLO 6 RC0=0 contador descendente.

Programa
INCLUDE <P16F873.INC>
Diagrama de flujo
LIST P=16F873, R=HEX

CONTADOR EQU 20

ORG 0 INICI
MOVLW B'00000001‘ ;carga W con 00000001
TRIS PORTC ;configurar puertoB RCO como entrada
MOVLW B'00000000‘ ; carga W con 00000000
TRIS PORTB ;configurar puertoB como salida
CONTADOR=0
INICIO MOVLW .0 ;carga W con “0”
MOVWF CONTADOR ;lleva “0” de W a contador
MOVWF PORTB ;lleva “0” de W a puertoB SI NO
PUERTO BTFSC PORTC,0 ;pregunta si RC0=1
GOTO ASCENDENTE ;si RC0=0, salta a ascendente RC0=1
MOVF CONTADOR,W :si RC0=1, lleva contador a W
BTFSC STATUS,Z ;pregunta por Z=0
GOTO DESCENDENTE ;salta a descendente
DECF CONTADOR,1 ;si Z=1,decrementa contador
MOVF CONTADOR,0 ;carga W con contador
MOVWF PORTB ;lleva “contador” de W a puertoB SI SI
GOTO PUERTO ;salta a puerto Cont=15 Cont=0
DESCENDENTE MOVLW .15 ;carga W con .15
MOVWF CONTADOR ;lleva .15 de W a contador
GOTO PUERTO ;salta a puerto NO NO
ASCENDENTE MOVLW .15 ;carga W con .15
Cont=1
XORWF CONTADOR,W ;OR exclusiva de W y contador
BTFSC STATUS,Z ;pregunta por Z=0
GOTO INICIO ;salta a inicio Dec cont
INCF CONTADOR,1 ;Z=1,incrementa contador Inc cont
MOVF CONTADOR,W ;lleva contador a W
MOVWF PORTB ;lleva “contador” de W a puertoB
GOTO PUERTO ;salta a puerto
END

INGENIERIA DE DISEÑO DE PRODUCTO 39


MICROCONTROLADORES

17. RETARDOS

Los retardos son muy utilizados en el control de procesos con microcontrolador.

Cuando se trabaja el microcontrolador a 4 MHz, cada ciclo de reloj dura


1 s = 1X10-6 segundos.
La mayoría de instrucciones se demora 1 ciclo de reloj en ejecutarse y algunas se
demoran dos ciclos de reloj.
En la información de las instrucciones de los microcontroladores se indican los ciclos
de reloj que se demora cada instrucción.
Como primer ejemplo, tenemos un contador que se carga inicialmente con 15 y se
va decrementando hasta llegar a cero.

INICIO

Contador = 15

Decremento de
Contador

No Contador = 0

Si

FIN
Programa:

Include < P16F873. INC>


LIST P=16F873, R = HEX

CONTADOR EQU 20

CICLOS DE RELOJ
ORG 0
MOVLW .15 _______ 1
MOVWF CONTADOR __ 1 45 + 2 = 47
LOOP DECFSZ CONTADOR ___ 1
3 x 15 = 45
GOTO LOOP __________ 2
END

Para calcular el tiempo que se demora el programa en ejecutarse, primero se debe


tener claro cuantos ciclo de reloj se demora cada instrucción.

Después se observa si dentro del programa existen saltos repetitivos, en el ejemplo


el programa decrementa el contador y salta si no es cero a LOOP, donde
nuevamente decrementa el contador. La siguiente pregunta es cuantas veces salta a

INGENIERIA DE DISEÑO DE PRODUCTO 40


MICROCONTROLADORES

LOOP, en este caso lo hace 15 veces, ya que con este valor se carga inicialmente el
contador, se puede ver que las instrucciones: DECFSZ CONTADOR,F y GOTO
LOOP se ejecutan 15 veces y se demoran 3 ciclos de reloj, por lo tanto, 3 (ciclos de
reloj) x 15 (veces que se repite), nos da como resultado 45, además las
instrucciones MOVLW .15 y MOVWF CONTADOR solo se ejecuta una vez.
En total el tiempo de ejecución será 45 + 2 = 47 ciclos de reloj, es decir 47µs.
El numero máximo con el que se puede cargar un contador (registro de memoria) es
255 ya que cada posición de memoria es de 8 bits.
Para calcular el tiempo total de ejecución del programa se utiliza la formula:
T = 3 x N +2, donde N es el valor inicial que se le asigna al contador, esto significa
que el retardo máximo que se puede conseguir con un solo registro, es:
3 x 255 + 2 = 767µs.
Cuando se quiere retardos de tiempos mayores se utilizan 2 o 3 contadores
(registros).
Ejemplo: se quiere hacer un retardo de 40 ms (milisegundos) = 40.000 µs
(microsegundos) siempre se debe pasar el tiempo a microsegundos.
Para generar retardos mayores a 767 microsegundos utilizamos dos contadores y el
diagrama de flujo en el siguiente:
INICIO

CONTADOR 1 = M

CONTADOR 2 = N

DECREMENTA
CONTADOR 2

No CONTADOR 2 = 0

DECREMENTA
CONTADOR 1

No CONTADOR 1 = 0

FIN

INGENIERIA DE DISEÑO DE PRODUCTO 41


MICROCONTROLADORES

Como se puede ver en el diagrama de flujo lo que se hace es decrementar el


CONTADOR 2 N veces, y el CONTADOR 1 nos indica cuantas veces debemos
repetir esto.
El programa en microcontrolador será el siguiente:

Programa:
Include < P16F873. INC>
LIST P=16F873, R = HEX

CONTADOR 1 EQU 20
CONTADOR 2 EQU 21

ORG O
MOVLW M
MOVWF CONTADOR 1
LOOP1 MOVLW N
MOVWF CONTADOR 2
T1=3x N+2
LOOP DECFS2 CONTADOR 2, F
T 2 = (T 1 + 3) M
GOTO LOOP
DECFS2 CONTADOR 1, F ___________________1
GOTO LOOP, ___________________________2
END

El tipo T1 es equivalente al primer ejemplo y la formula es la misma:


T1 = 3 x N + 2.

Suponiendo que N = 255, T1 = 767µs. El retardo que se esta calculando es de 40ms


= 40000µs.

Para calcular el tiempo 2 T2 = (T1 + 3) M . El tiempo T2 debe ser


aproximadamente 40000µs.

Para calcular M, sabiendo que T1 + 3 = 770 µs se debe dividir 40000/700 = 51.94 ≈


52 M = 52

T2 = (T1 + 3) 52 = (767 + 3) 52 = 40040 µs

Y el tiempo total del retardo es T2 + 2 = 40040 + 2 = 40042µs

El retardo máximo que se puede tener con dos contadores será:


T2 = (770) x 255 = 196350

Tiempo Total: T2 + 2 = 196352

Si se quieren retardos mayores a 196352 es necesario utilizar 3 contadores.

INGENIERIA DE DISEÑO DE PRODUCTO 42


MICROCONTROLADORES

Diagrama de Flujo
Inicio

Contador 1 = L

Contador 2 = M

Contador 3 = N

Decrementar
contador 3

No Contador 3 = 0

Si

Decrementar
contador 2

NO Contador 2 = 0

Si

Decrementar
contador 1

NO Contador 1 = 0

Si

FIN

Suponiendo que M y N sean 255 y partiendo de los cálculos del ejemplo anterior nos
da 196352 µs.
Para calcular T3 se aplica la formula:
T3 = (T2 + 2 + 3) x L
T3 = (169350 + 2 + 3) x L
T3 = (196355) x L

INGENIERIA DE DISEÑO DE PRODUCTO 43


MICROCONTROLADORES

Como se quiere un (1) segundo = 1000000 µs, para calcular L solo dividimos
1000000 = 5.09 ≈ 5
195355

T3 = 196355 x 5 = 981775
El tiempo total es T3 + 2 = 981775 + 2 = 981777
Si se cambian los valores de L, M y N lógicamente el retardo cambia, sin embargo se
siguen aplicando las mismas formulas.

18. MANEJO DE SUBRUTINAS

Las subrutinas son subprogramas que se llaman varias veces en un programa, por
ejemplo los retardos.
Para llamar una subrutina se utiliza la instrucción CALL N, donde N es el nombre de
la subrutina. El programa salta a la subrutina y cuando termina de ejecutarla
continua con la siguiente instrucción del programa que llamo la subrutina.

Programa Principal Subrutina


.
.
. RETARDO .
LOOP BSF PORTB, 0 .
.
CALL RETARDO .
BCF PORTB, 0 .
.
CALL RETARDO RETURN
GOTO LOOP

Toda subrutina termina con la instrucción RETURN o RETLW N, donde N es


cualquier valor entre 0 y 255, en este caso al retornar, W se carga con ese valor.
Existe una diferencia entre CALL N (llamada subrutina) y GOTO N, en la primera
cuando se termina de ejecutar retorna a la siguiente instrucción del programa que lo
llamo a diferencia de la segunda (GOTO N) que puede saltar a otra parte del
programa.
Cada vez que se llama una subrutina, se almacena en el Stack-Pointer, la dirección
de retorno, es decir la dirección a donde debe regresar, cuando termina la subrutina.

INGENIERIA DE DISEÑO DE PRODUCTO 44


MICROCONTROLADORES

19. EJEMPLO UTILIZANDO RETARDOS

Este programa consiste en que por medio de un ciclo repetitivo se encienda y se


apague un led a una frecuencia constante; en este programa es necesario el empleo
de una subrutina (programa alterno) que genere lo que se llama un retardo
(1segundo aproximadamente) ya que si éste no existe, el led se prendería y se
apagaría tan rápido que se vería siempre encendido, debido a la velocidad a la que
trabaja el Microcontrolador.

Configurar Puertos

RB 0 = 0

Retardo 1 segundo

RB 0 = 1

Retardo 1 segundo

INGENIERIA DE DISEÑO DE PRODUCTO 45


MICROCONTROLADORES

Programa:
Include <P16F873.INC>
LIST P=16F873, R=HEX

REG1 EQU 20
REG2 EQU 21
REG3 EQU 22
ORG 0
MVLW 0
TRIS PORTB ;CONFIGURAR EL PUERTO B TODO COMO SALIDA.
LOOP BSF PORTB,0 ;PONE EN UNO EL BIT 0 DEL PUERTO B.
CALL RETARDO ;LLAMA UN RETARDO DE UN SEGUNDO.
BCF PORTB,0 ;PONE EN 0 EL BIT 0 DEL PUERTO B.
CALL RETARDO ;LLAMAR RETARDO DE UN SEGUNDO.
GOTO LOOP ;SALTA A LOOP.
RETARDO MOVLW .5 ;RETARDO DE UN SEGUNDO
MOVWF REG1
REP3 MOVLW .255
MOVWF REG2
REP2 MOVLW .255
MOVWF REG3
REP1 DECFSZ REG3,F
GOTO REP1
DECFSZ REG2,F
GOTO REP2
DECFSZ REG3,F
GOTO REP3
RETURN ;ESTA COMANDO ME DEVUELVE A UN PASO
MÁS DE DONDE EL RETARDO FUE LLAMADO
END ;FIN DEL PROGRAMA.

20. GENERACIÓN DE TONOS CON MICROCONTROLADORES

Para generar diferentes tonos con el microcontrolador se debe conocer la frecuencia


del tono, por ejemplo si queremos generar un tono de 1 KHz, entonces:

F= 1 KHz, por lo tanto el periodo es


T = 1/F = 1/ 1000 = 0,001 s = 1000 µs

Se puede notar que el periodo esta compuesto por el tiempo en que la salida
permanece en alto “1” y en bajo “0”.
En el caso de la frecuencia de 1KHz nos da un periodo de 1000 µs que se divide en
dos, por lo tanto T/2 = 500 µs

INGENIERIA DE DISEÑO DE PRODUCTO 46


MICROCONTROLADORES

El diagrama del circuito podría ser el siguiente:

Inicio

Activar Salida

Call retardo 500µs

Desactivar Salida

Call reardo 500µs

Programa:
Include <P16F873.INC>
LIST P= 16F873, R=Hex

CONTADOR EQU 20

ORG 0
MOVLW B’11111110’ ;CONFIGURA EL PORTB COMO ENTRADA
EXCEPTO RB0
TRIS PORTB
LOOP BSF PORTB,0 ;PONE EN “1” RB0
CALL RETARDO ;LLAMA RETARDO DE 500µs.
BCF PORTB,0 ;PONE EN “0” RB0.
CALL RETARDO ;LLAMA RETARDO DE 500µs.
GOTO LOOP ;SALTA A LOOP
RETARDO MOVLW .166 ;RETARDO DE 500µs.
MOVWF CONTADOR
LOOP1 DECFSZ CONTADOR,F
GOTO LOOP 1
RETURN
END ;FIN DEL PROGRAMA

INGENIERIA DE DISEÑO DE PRODUCTO 47


MICROCONTROLADORES

21. MOTORES PASO A PASO

Los motores paso a paso son un tipo especial de motores que permiten el
movimiento de su eje en ángulos muy precisos y por pasos, tanto a la izquierda
como a la derecha. Aplicando a ellos una secuencia de pulsos.
Cada paso tiene un ángulo muy preciso, determinado por la construcción del motor
lo que permite realizar movimientos exactos.
Son utilizados para generar movimientos precisos, por ejemplo en robots, en equipos
con movimientos X-Y, entre otros.

Existen dos tipos de motores paso a paso:

1. Motores Unipolares: este tipo de motor tienen dos bobinas en cada uno de los
estatores y cada par de bobinas tienen un punto común, es decir, tiene seis
terminales.

2. Motores Bipolares: este tipo de motor tiene dos bobinas y no poseen puntos
común, es decir tiene cuatro terminales.

Para controlar este tipo de motor paso a paso bipolar es necesario una fuente con
polaridad positiva y negativa.

INGENIERIA DE DISEÑO DE PRODUCTO 48


MICROCONTROLADORES

CONTROL DEL MOTOR PASO A PASO UNIPOLAR

Para controlar el motor paso a paso se debe conocer su secuencia y sus terminales,
de tal manera que el circuito o el programa en microcontrolador genere la secuencia
lógica de cuatro bits que energiza una bobina del motor en el orden correcto.

Para que el motor gire a la derecha se aplica la secuencia de pulsos en un sentido y


para girar a la izquierda simplemente se invierte la secuencia. Por ejemplo

GIRO A LA DERECHA GIRO A LA IZQUIERDA

PASOS Q1 Q2 Q3 Q4 PASOS Q1 Q2 Q3 Q4
1 ON OFF OFF OFF 1 OFF OFF OFF ON
2 OFF ON OFF OFF 2 OFF OFF ON OFF
3 OFF OFF ON OFF 3 OFF ON OFF OFF
4 OFF OFF OFF ON 4 ON OFF OFF OFF
1 ON OFF OFF OFF 1 OFF OFF OFF ON

Las señales que habilita cada transistor pueden venir desde un circuito integrado o
desde el microcontrolador, el transistor lleva el negativo a la bobina del motor, en el
momento en que es habilitado.
La velocidad del motor depende de la frecuencia con que se envíen los pulsos a
cada transistor.
Existen otras formas de controlar un motor paso a paso para generar más torque o
hacerlo más preciso, en el próximo ejemplo se verá una nueva forma.

22. EJEMPLO DE MANEJO DEL MOTOR PASO A PASO

En este caso se utilizará un motor de cuatro bobinas, la secuencia utilizada consiste


en alternar la posición de dos unos a lo largo de las bobinas (a,b,c,d).

INGENIERIA DE DISEÑO DE PRODUCTO 49


MICROCONTROLADORES

Inicio
ABCD
1 1 0 0 12
0 1 1 0 6 Sentido horario No
0 0 1 1 3
1 0 0 1 9
Si
1 1 0 0 12
PortB=00001001 PortB=00000011

Retardo 100ms Retardo 100ms

PortB=00001100 PortB=00000110

Retardo 100ms Retardo 100ms

PortB=0000110 PortB=0001100

Retardo 100ms Retardo 100ms

PortB=0000011 PortB=0001001

Retardo 100ms Retardo 100ms

INGENIERIA DE DISEÑO DE PRODUCTO 50


MICROCONTROLADORES

Programa:

Include <P16F873>
LIST P=16F873

REG2 EQU 20H


REG3 EQU 21H

ORG 0
MOVLW 0
TRIS PORT B ;CONFIGURAR PUERTO B TODO COMO SALIDA.
MOVLW .255
TRIS PORTC ;CONFIGURA EL PUERTO C COMO ENTRADA.
SEC BTFSS PORTC,2 ;PULSADOR DE SELECCIÓN DE DIRECCION.
GOTO HOR
LOOP MOVLW .9 ;SENTIDO ANTIHORARIO.
MOVWF PORT B
CALL RETARDO
MOVLW .3
CALL RETARDO
MOVLW .6
MOVWF PORT B
CALL RETARDO
MOVLW .12
MOVWF PORT B
CALL RETARDO
GOTO SEC
HOR MOVLW .12 ;SENTIDO HORARIO.
MOVWF PORT B
CALL RETARDO
MOVLW .6
MOVWF PORTB
CALL RETARDO
MOVLW .3
MOVWF PORTB
CALL RETARDO
MOVLW .9
MOVWF PORTB
CALL RETARDO
GOTO SEC

RETARDO MOVLW .132


MOVWF REG2
REP2 MOVLW .255
MOVWF REG3
REP1 DECFSZ REG3,F
GOTO REP1
DECFSZ REG2,F
GOTO REP2
RETURN
END ;FIN DEL PROGRAMA.

INGENIERIA DE DISEÑO DE PRODUCTO 51


MICROCONTROLADORES

23. EXPLICACIÓN DE LAS INSTRUCCIONES DE ROTACIÓN

Existen dos instrucciones de rotación de un registro a la derecha o a la izquierda a


través del carry.

RLF f,d Rotación de f a la izquierda a través del carry

Registro f

RRF f,d Rotación de f a la derecha a través del carry

Registro f

Como Utilizar las Instrucciones de Rotación

Ejemplo 1: Como ejemplo haremos un programa que inicialmente encienda todas


los bits del puerto B y luego los vaya apagando, uno por uno, comenzando
por el bit 0.

Include<P16F873.INC>
LIST P=16F873, R=HEX

ORG 0
MOVLW b'00000000' ; CARGA W CON 00000000
TRIS PORTB ; CONFIGURA EL PUERTO B COMO SALIDA
INICIO MOVLW b'11111111' ; CARGA W CON 11111111
MOVWF PORTB ; ACTIVA TODOS LOS BITS DEL PUERTO B
LOOP BCF STATUS,C ; PONE EN "0" EL BIT CARRY
RLF PORTB,F ; ROTA A LA IZQUIERDA EL PORTB
BTFSS PORTB,7 ; PREGUNTA RB7 ESTA EN UNO
GOTO INICIO ; SI RB7 = 0, SALTA A INICIO
GOTO LOOP ; SI RB7 = 1, SALTA A LOOP
END

INGENIERIA DE DISEÑO DE PRODUCTO 52


MICROCONTROLADORES

Ejemplo 2: Este programa genera una secuencia en la que un uno (led encendido)
rota desde el bit cero del RB0 hasta el bit 7 RB7 y una vez termina pone los
bits en cero desde RB0 hasta RB7.

Inicio

Poner en 0 PortB

Poner en 1 RB0

Llamar retardo 1 seg

Poner en 1 el carry

Rotar a la izq a traves


de carry

Llamar retardo 1 seg

No RB7 =1?

Si

Poner en "0" el carry

Rotar a derecha a
través de carry

Llamar retardo 1 seg

No RB0=0?

Si

Llamar retardo 1 seg

INGENIERIA DE DISEÑO DE PRODUCTO 53


MICROCONTROLADORES

Programa:

Include <P16F873.INC>
LIST P= 16F873, R=HEX

REG1 EQU 20H


REG2 EQU 21H
REG3 EQU 22H

ORG 0
MOVLW 0
TRIS PORTB ;CONFIGURA EL PUERTO B COMO SALIDA.
LOOP CLRF PORTB ;LIMPIA EL PUERTO B.
BSF PORTB,0 ;PONE EN 1 EL BIT 0 DEL PUERTO B.
CALL RETARDO ;LLAMA UN RETARDO DE UN SEGUNDO.
REP BSF STATUS,C ;COLOCA LA BANDERA DE CARRY EN 1.
RLF PORTB,F ;ROTA A LA IZQUIERDA A TRAVES DEL
CARRY (EL UNO SE ALMACENA EN F ).
CALL RETARDO ;LLAMA EL RETARDO DE UN SEGUNDO.
BTFSS PORTB,7 ;SI EL BIT7 DEL PUERTO B ES 0.
GOTO REP ;SALTA A REP

LOOP 10 BCF STATUS,C ;PONE EN CERO (0) EL CARRY


RRF PORTB,F ;ROTA A LA DERECHA A TRAVÉS DE CARRY.
CALL RETARDO ;LLAMA RETARDO DE UN SEGUNDO
BTFSS PORT B,O
GOTO LOOP 10
GOTO LOOP

RETARDO MOVLW .10


MOVWF REG1
REP3 MOVLW .132
MOVWF REG2
REP2 MOVLW .255
MOVWF REG3
REP1 DECFSZ REG3,F
GOTO REP1
DECFSZ REG2,F
GOTO REP3
DECFSZ REG1,F
GOTO REP3
RETURN

END ;FIN DEL PROGRAMA

INGENIERIA DE DISEÑO DE PRODUCTO 54


MICROCONTROLADORES

24. MANEJO DE DISPLAY 7 SEGMENTOS Y ANTIREBOTE

Conexión de Display 7 segmentos


Cuando se quiere mostrar datos en display, existen dos opciones para hacerlo, una
utilizar un decodificador BCD a 7 segmentos después del microcontrolador, y otra es
generar con el mismo microcontrolador el código 7 segmentos equivalente a cada
numero de 0 a 9.
En este caso se hará el decodificador BCD a 7 segmentos con el mismo
microcontrolador.
Antes de explicar como mostrar datos en un display con el mocrocontrolador, se
recordará que hace un decodificador BCD a 7 segmentos

El decodificador BCD a 7 segmentos me convierte el código BCD a código 7


segmentos, encendiendo los segmentos correspondientes al numero, por ejemplo el
numero cero (0000 en BCD) debe encender los segmentos a, b, c, d, e y f, el numero
cuatro (0100 en BCD) debe encender los segmentos b, c, e, f y g.

Así se podría seguir indicando que segmentos se encienden con cada numero, sin
embargo nos centraremos en la forma como el microcontrolador lo hará.
Se pretende que el mismo microcontrolador maneje directamente el display sin
utilizar decodificadores.
La conexión del microcontrolador con el display será la siguiente:

INGENIERIA DE DISEÑO DE PRODUCTO 55


MICROCONTROLADORES

Para lograr este objetivo se necesita entender el manejo de tablas con


microcontroladores, en la tabla se almacena cada uno de los códigos 7 segmentos
de cada numero.

CODIGO 7 SEGMENTOS
NUMERO RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0
g f e d c b a
0 X 0 1 1 1 1 1 1
1 X 0 0 0 0 1 1 0
2 X 1 0 1 1 0 1 1
3 X 1 0 0 1 1 1 1
4 X 1 1 0 0 1 1 0
5 X 1 1 0 1 1 0 1
6 X 1 1 1 1 1 0 0
7 X 0 0 0 0 1 1 1
8 X 1 1 1 1 1 1 1
9 X 1 1 0 0 1 1 1

Las tablas se manejan como si se trataran de rutinas. La clave esta en colocar en W


el valor que se quiere mostrar en el display, lógicamente este valor debe estar entre
0 y 9, y hacer el llamado a la dirección base de la tabla. Dentro de la tabla debe
existir una primera instrucción que realiza una suma sobre el contador del programa,
lográndose un salto relativo a éste. En la dirección en la cual el programa salte
deberá incluir alguna instrucción que obliga a W a regresar o retornar el código
correspondiente al valor 7 segmentos.
Las instrucciones respectivas y la tabla son las siguientes:

INGENIERIA DE DISEÑO DE PRODUCTO 56


MICROCONTROLADORES

.
.
MOVF VALOR,W CARGAR EN W VALOR A MOSTRAR
CALL TABLA LLAMAR TABLA DE DATOS

MOVWF PORTB MOSTRAR VALOR EN PORTB

TABLA ADDWF PCL,F PCL + W

RETLW B’ 00111111’ CODIGO PARA EL 0

RETLW B’ 00000110’ CODIGO PARA EL 1

RETLW B’ 01011011’ CODIGO PARA EL 2

RETLW B’ 01001111’ CODIGO PARA EL 3

RETLW B’ 01100110’ CODIGO PARA EL 4

RETLW B’ 01101101’ CODIGO PARA EL 5

RETLW B’ 01111100’ CODIGO PARA EL 6

RETLW B’ 00000111’ CODIGO PARA EL 7

RETLW B’ 01111111’ CODIGO PARA EL 8

RETLW B’ 01100111’ CODIGO PARA EL 9

La instrucción ADDWF PCL,F suma el contenido de PCL + W y deja el resultado en


PCL, esto hace que el microcontrolador salte a la posición correspondiente al código
para cada numero y en esta posición encuentra la instrucción RETLW B’ xxxxxxxx’,
ésta instrucción le dice al microcontrolador que retorne de la subrutina pero que a
su vez regrese en W el valor correspondiente al código 7 segmentos del numero.

25. TRABAJOS CON PULSADORES (ANTIRREBOTES)

Cuando se trabaja con pulsadores o suiches, en el momento en que estos cambian


de estado se genera una señal como la que se muestra en la figura:
1

Es decir, el suiche o pulsador genera unos y ceros hasta que finalmente se estabiliza
debido a que es un dispositivo electromecánico, el microcontrolador con su velocidad
de trabajo se da cuenta de esto.

INGENIERIA DE DISEÑO DE PRODUCTO 57


MICROCONTROLADORES

Para evitar errores en la detección de pulsadores y suiches se utilizan retardos de


150 a 300ms aproximadamente, en el momento en que se detecta que un pulsador o
suiche cambió de estado, este tiempo es suficiente mientras se estabiliza y luego, se
pregunta nuevamente por el estado del suiche.

No Pulsador = 1

Retardo 200 ms

Falsa
Alarma No Pulsador = 1

SÍ El Pulsador
se oprimió

El programa para detectar si un pulsador se oprimió, es el siguiente:


Supongamos que el pulsador esta conectado a RC1.
.
.
LOOP BTFSS PORTC,1 SI RC1 = 1, IGNORE LA SIGUIENTE INSTRUCCIÓN
GOTO LOOP SALTA A LOOP
CALL RET200ms LLAMA RETARDO DE 200 MS
BTFSS PORTC,1 SI RC1 = 1, IGNORE LA SIGUIENTE INSTRUCCIÓN
GOTO FALSO SALTA A FALSO
GOTO INCREM SALTA A INCREM
.

INGENIERIA DE DISEÑO DE PRODUCTO 58


MICROCONTROLADORES

26. EJEMPLO CON MANEJO DE DISPLAY

En este ejemplo se hará un conteo de 0 a 9 incrementando cada segundo y cuando


llega a 9, comienza de nuevo el conteo.

Inicio

Contador=0

w=contador

Saltar a tabla para


obtener codigo 7
segmentos

PortB=cod7 seg

Llamar retardo 1seg

Incrementar contador

No Contador=10?

Si

INGENIERIA DE DISEÑO DE PRODUCTO 59


MICROCONTROLADORES

Programa:
Include <p16f873.inc>
List p=16f873

CONTADOR EQU 20

REG EQU 21
REG EQU 22
REG EQU 23

ORG 00
MOVLW 0
TRIS PORTB ;CONFIGURAR EL PORTB COMO SALIDA
INICIO MOVLW 0
MOVWF CONTADOR ;CARGAR EL CONTADOR CON “0”
LOOP MOVF CONTADOR,W;CONTADOR=W
CALL TABLA ;LLAMAR TABLA
MOVWF PORTB ;LLEVAR VALOR 7 SEGMENTOS A PORTB
CALL RET1S ;LLAMA RETARDO 1S.
INCF CONTADOR,F
MOVLW .10 ;COMPARA CONTADOR CON 10
XORWF CONTADOR,W
BTFSC STATUS,2
GOTO LOOP
GOTO INICIO

RET1S MOVLW .10


MOVWF REG1
REP3 MOVLW .132
MOVWF REG2
REP2 MOVLW .255
MOVWF REG3
REP1 DECFSZ REG3,F
GOTO REP1

DECFSZ REG2,F
GOTO REP2
DECFSZ REG1,F
GOTO REP3
RETURN

TABLA ADDWF PCL,F ; PCL + W


RETLW B’ 00111111’ ; CODIGO PARA EL 0
RETLW B’ 00000110’ ; CODIGO PARA EL 1
RETLW B’ 01011011’ ; CODIGO PARA EL 2
RETLW B’ 01001111’ ; CODIGO PARA EL 3
RETLW B’ 01100110’ ; CODIGO PARA EL 4
RETLW B’ 01101101’ ; CODIGO PARA EL 5
RETLW B’ 01111100’ ; CODIGO PARA EL 6
RETLW B’ 00000111’ ; CODIGO PARA EL 7
RETLW B’ 01111111’ ; CODIGO PARA EL 8
RETLW B’ 01100111’ ; CODIGO PARA EL 9
END ;FIN DEL PROGRAMA.

INGENIERIA DE DISEÑO DE PRODUCTO 60


MICROCONTROLADORES

27. MULTIPLEXAJE DE DISPLAY

En muchas ocasiones se requiere mostrar números en display de mas de un dígito,


es decir, 2, 3, o 4 dígitos.
Si se pretende controlar cada display, se necesitan siete (7) líneas del
microcontrolador por cada uno, esto ocuparía todas las líneas disponibles en cada
puerto del microcontrolador, sin embargo existe una técnica llamada multiplexaje que
consiste en conectar a las mismas 7 líneas los 2,3 o 4 display e ir encendiendo uno
a uno los display, a través de un transistor, tan rápidamente que perecen
encendecen todos al mismo tiempo.
Cualquier elemento que se encienda y apague con una frecuencia mayor a 25Hz es
imperceptible para el ojo humano, éste lo verá encendido en todo momento.

El circuito para manejar 2 display multiplexados puede ser el siguiente:

Nota: los segmentos de cada display van unidos entre si, es decir a con a, b con b,
hasta el g con g. y por cada display adicional se necesita un transistor y solo una
línea mas del microcontrolador.
En este diagrama se asume que las unidades están en el display de la derecha y las
decenas en el display de la izquierda.

El diagrama de flujo para mostrar datos en el display es el siguiente:

INGENIERIA DE DISEÑO DE PRODUCTO 61


MICROCONTROLADORES

INICIO

W = Unidades

Llamar tabla

Llevar a PORTB

Activar RC5 y
desactivar RC4

Llamar retardo 1ms

W = decenas

Llamar tabla

Activar RC4 y
desactivar RC5

Llamar retardo 1ms

Return

Es importante aclarar que cuando se utiliza el multiplexaje con el display, se debe


estar llamando constantemente en el programa principal la rutina de mostrar, es
decir que siempre que el programa principal este en un loop, dentro de ese loop se
debe llamar la subrutina de mostrar.

INGENIERIA DE DISEÑO DE PRODUCTO 62


MICROCONTROLADORES

El programa para la subrutina que me permite mostrar los números en el display,


según el diagrama de flujo anterior es el siguiente:

MOSTRAR MOVF DECE,W ; CARGA EN W EL VALOR DE LAS DECENAS


CALL TABLA ; LLAMA TABLA
MOVWF PORTB ; LLEVA DECENAS A PORTB
BSF PORTC,4 ; ACTIVA TRANSISTOR DE LAS DECENAS
BCF PORTC,5 ; DESACTIVA TRANSISTOR DE LAS UNIDADES
CALL RETARDO ; LLAMA RETARDO DE 774 MICROSEGUNDOS
MOVF UNID,W ; CARGA EN W EL VALOR DE LAS UNIDADES
CALL TABLA ; LLAMA TABLA
MOVWF PORTB ; LLEVA UNIDADES A PORTB
BSF PORTC,5 ; DESACTIVA TRANSISTOR DE LAS DECENAS
BCF PORTC,4 ; ACTIVA TRANSISTOR DE LAS UNIDADES
CALL RETARDO ; LLAMA RETARDO DE 774 MICROSEGUNDOS
RETURN ; RETORNA DE LA SUBRUTINA

TABLA ADDWF PCL,F ; PCL + W


RETLW B’ 00111111’ ; CODIGO PARA EL 0
RETLW B’ 00000110’ ; CODIGO PARA EL 1
RETLW B’ 01011011’ ; CODIGO PARA EL 2
RETLW B’ 01001111’ ; CODIGO PARA EL 3
RETLW B’ 01100110’ ; CODIGO PARA EL 4
RETLW B’ 01101101’ ; CODIGO PARA EL 5
RETLW B’ 01111100’ ; CODIGO PARA EL 6
RETLW B’ 00000111’ ; CODIGO PARA EL 7
RETLW B’ 01111111’ ; CODIGO PARA EL 8
RETLW B’ 01100111’ ; CODIGO PARA EL 9

RETARDO MOVLW .255


MOVWF REG1
RET1 DECFSZ REG1,F
GOTO RET1
RETURN

Esto ocurre cuando por ejemplo, se pregunta por un pulsador, donde se llama el
retardo de 200 ms, la rutina mostrar debe estar dentro del retardo de 200ms y así
cada vez que el programa principal este dentro de un loop.
Otro caso es el retardo de un segundo, aquí también es necesario que la rutina de
mostrar haga parte del retardo de un segundo.

INGENIERIA DE DISEÑO DE PRODUCTO 63


MICROCONTROLADORES

28. EJEMPLO DE MULTIPLEXAJE

En este ejemplo solo mostraremos el numero 57 en los displays.

Valor1=5

Valor2=7

Llevar valor1 a PortB

Habilitar transistor de
valor1(RC0) y deshabilitar
transistor de valor2(RC1)

Retardo de 1ms

Llevar valor2 a PortB

Habilitar transistor de
valor2(RC1) y deshabilitar
transistor de valor1(RC0)

Retardo de 1ms

INGENIERIA DE DISEÑO DE PRODUCTO 64


MICROCONTROLADORES

Programa:
INCLUDE <P16F873.INC>
LIST P=16F873, R = HEX
R12 EQU 20H
VALOR 1 EQU 21H
VALOR 2 EQU 22H

MOVLW 0
TRIS PORTB ;CONFIGURAR EL PERTO B TODO COMO SALIDA.
MOVLW 0
TRIS PORTC ;CONFIGURA EL PUERTO C COMO SALIDA.
MOVLW .7 ;CARGA W CON 7.
MOVWF VALOR 2 ;LLEVA 7 A VALOR 2.
MOVLW .5 ;CARGA W CON 5.
MOVWF VALOR 1 ;LLEVA 5 A VALOR 1.
LOOP 1 MOVF VALOR 1,W ;LLEVA VALOR 1 A W.
CALL TABLA ;LLAMA A TABLA PARA ENCONTRAR EL VALOR
7 SEGMENTOS DEL NUMERO 5.
MOVWF PORTB ;LLEVA EL VALOR 7 SEG AL PUERTO B.
MOVLW .1
MOVWF PORT C ;HABILITA EL TRANSISTOR
CORRESPONDIENTE A VALOR1 (RC0)
CALL RETARDO
MOVF VALOR 2,W ;LLEVA VALOR 2 A W.
CALL TABLA ;CONVIERTE VALOR 2 A CODIGO 7
SEGMENTOS.
MOVWF PORT B ;SACA AL PUERTO B EL VALOR 2.
MOVLW .2
MOVWF PORTC ;HABILITA EL TRANSISTOR DE VALOR2 (RC1).
CALL RETARDO
GOTO LOOP1
RETARDO MOVLW .255 ;RETARDO DE 1 mS APROX.
MOVWF R12
REP DECFSZ R12,F
GOTO REP
TABLA ADDWF PCL,F ; PCL + W
RETLW B’ 00111111’ ; CODIGO PARA EL 0
RETLW B’ 00000110’ ; CODIGO PARA EL 1
RETLW B’ 01011011’ ; CODIGO PARA EL 2
RETLW B’ 01001111’ ; CODIGO PARA EL 3
RETLW B’ 01100110’ ; CODIGO PARA EL 4
RETLW B’ 01101101’ ; CODIGO PARA EL 5
RETLW B’ 01111100’ ; CODIGO PARA EL 6
RETLW B’ 00000111’ ; CODIGO PARA EL 7
RETLW B’ 01111111’ ; CODIGO PARA EL 8
RETLW B’ 01100111’ ; CODIGO PARA EL 9
RETARDO MOVLW .255
MOVWF REG1
RET1 DECFSZ REG1,F
GOTO RET1
RETURN
END ;FIN DEL PROGRAMA.

INGENIERIA DE DISEÑO DE PRODUCTO 65


MICROCONTROLADORES

29. INTERRUPCIONES

Las llamadas subrutinas mediante la instrucción CALL hacen que el programa


ejecute un subprograma y luego regrese al programa principal, sin embargo el
programador esta definiendo en que momento debe saltar a ejecutar la subrutina
mediante las instrucciones, por esta razón se consideran sincronas.
Las interrupciones son desviaciones de flujo de control del programa originadas
asincronicamente por diversos sucesos que no dependen del programador, es decir,
ocurren en cualquier momento.
Las interrupciones ocurren por sucesos externos como la generación de un flanco o
nivel en una patica del microcontrolador o eventos internos tales como el
desbordamiento de un contador.

El comportamiento del microcontrolador ante la interrupción es similar al de la


instrucción CALL de llamada a subrutina. En ambos casos se detiene la ejecución
del programa en curso, se guarda la dirección a donde debe retornar cuando termine
de ejecutar la interrupción y salta a la dirección de la interrupción que siempre será
la dirección 004H.
Existen 13 diferentes causas que producen una interrupción, por lo tanto el primer
paso de la rutina de interrupción será identificar la causa de la interrupción.
Nosotros solo trataremos la interrupción externa por cambio de estado en la patica
RB0.
Para entender los pasos necesarios para trabajar con las interrupciones es
importante conocer algunos registros del microcontrolador que tienen que ver
directamente con las interrupciones.

REGISTRO OPTION

RBPU# INTEDG TOCS TOSE PSA PS2 PS1 PS0

PS2 PS1 PS0 DIVISION DEL


TMR0
0 0 0 1:2
0 0 1 1:4
0 1 0 1:8
0 1 1 1:16
1 0 0 1:32
1 0 1 1:64
1 1 0 1:128
1 1 1 1:256

INGENIERIA DE DISEÑO DE PRODUCTO 66


MICROCONTROLADORES

PSA : Asignación del divisor de frecuencias


1 = El divisor de frecuencias se le asigna al WDT
0 = El divisor de frecuencias se le asigna al TMR0

TOSE : tipo de flanco en TOCKI


1 = Incremento del TMR0 cada flanco descendente
0 = Incremento del TMR0 cada flanco ascendente

TOCS : Tipo de reloj para TMR0


1 = Pulsos introducidos a través de TOCKI (contador)
0 = Pulsos de reloj interno FOSC/4 (temporizador)

INTEDG : Flanco activo de interrupción externa


1 = Flanco de subida
0 = Flanco de bajada

RBPUH : Resistencias de pull – up de la puerta B


1 = Desactivadas
0 = Activadas

REGISTRO INTCON

GIE PEIE TOIE INTE RBIE TOIF INTF RBIF

GIE : Bit de permiso global de interrupciones


1 = Permitido
0 = Prohibido

PEIE : Habilitación de interrupciones de periféricos


0 = Las deshabilita
1 = las habilita

TOIE : Habilitación de interrupción del temporizador TMR0


0 = las deshabilita
1 = las habilita

INGENIERIA DE DISEÑO DE PRODUCTO 67


MICROCONTROLADORES

INTE : Bit de permiso de la interrupción externa por RB0/INT


0 = La deshabilita
1 = La habilita

RBIE : Bit de permiso de la interrupción por cambio RB4 – RB7


0 = La deshabilita
1 = La habilita

TOIF : Señalizador de desbordamiento en TMR0


Se coloca en “1” cuando el TMR0 pasa de offh a ooh; esta debe ser
puesta a “0” por programa

INTF : Señalizador de activación de la patica RB0/INT


Se coloca en “1” cuando la interrupción INT (RB0) ocurre; esta debe
ser puesta a “0” por programa

RBIF : Señalizador de cambio RB4 – RB7


Se coloca en “1” cuando una de las entradas RB(7:4) cambia; esta
debe ser puesta a "0“ por programa

Los pasos que se siguen en general para habilitar y atender una interrupción por
cambio de nivel en RB0 son los siguientes:
1. En el programa principal seleccionar el flanco activo de la interrupción: Bit INTEG
del registro OPTION – REG
2. Limpiar el señalizador de interrupción: Bit INTF del registro INTCON
3. Habilitar el bit de permiso global de interrupciones: Bit GIE del registro INTCON
4. Habilitar la interrupción por RB0: Bit RBIE del registro INTCON

En la rutina de interrupción

1. Deshabilitar la interrupción por RB0: Bit INTE del registro INTCON


2. Limpiar señalizador de interrupción por RB0: Bit INTF del registro INTCON

Al terminar la rutina de interrupción:

Habilitar nuevamente la interrupción por RB0: Bit INTE del registro INTCON
Retornar de la interrupción con la instrucción RETFIE

INGENIERIA DE DISEÑO DE PRODUCTO 68


MICROCONTROLADORES

El programa quedará de la siguiente manera:

ORG 0
GOTO Inicio
ORG 4
GOTO INTER

INICIO :
:
BSF STATUS,5 ; CAMBIAR AL BANCO 1 DE MEMORIA

BSF OPTION – REG, INTEDG ; SELECCIONA FLANCO DE SUBIDA PARA LA


INTERRUPCIÓN POR RB0
BCF STATUS,5 ;CAMBIAR AL BANCO 0 DE MEMORIA
BCF INTCON, INTF ; LIMPIA EL BIT SEÑALIZADOR DE
INTERRUPCIÓN POR RB0
BSF INTCON, GIE ; HABILITA LAS INTERRUPCIONES EN
FORMA GLOBAL
BSF INTCON, INTE ; HABILITA LA INTERRUPCIÓN POR RB0

:
:
:

INTER BCF INTCON, INTE ; DESHABILITA LA INTERRUPCIÓN POR RB0

BCF INTCON, INTF ; BORRA SEÑALIZADOR DE INTERRUPCIÓN POR


RB0

: PROGRAMA
: QUE DEBE
: EJECUTAR LA
: INTERRUPCIÓN

BSF INTCON, INTF ; HABILITA LA INTERRUPCIÓN POR RB0

RETFIE ; RETORNO DE LA INTERRUPCIÓN

INGENIERIA DE DISEÑO DE PRODUCTO 69


MICROCONTROLADORES

30. EJEMPLO UTILIZANDO INTERRUPCIONES POR CAMBIO DE RB0

Se plantea un ejercicio de un contador de 0 a 99, que solo incrementa cuando hay


una interrupción, en este caso será causada por un flanco de subida por la patica
RB0.

El diagrama de flujo correspondiente al ejercicio es el siguiente:

Para el programa principal: INICIO

Configurar Puertos

Unidades = 0

Decenas = 0

Configurar Interrupción
por RB0

Habilitar Interrupción
por RB0

Para la interrupción: CALL Mostrar

INICIO

Incrementar Unidades

Unidades = 10 Si

Decenas = 9 NO

Si

Incrementar
Unidades = 0
Decenas

Decenas = 0 Unidades = 0

Return

INGENIERIA DE DISEÑO DE PRODUCTO 70


MICROCONTROLADORES

Programa:
Include<P16F873.INC>
LIST P=16F873, R=HEX

UNID EQU 20
DECE EQU 21
REG1 EQU 23
REG2 EQU 24
REG3 EQU 25

ORG 0
GOTO INICIO ;SALTA A INICIO
ORG 4
GOTO INTER ; SALTA A EJECUTAR LA INTERRUPCIÓN

ORG 6
INICIO MOVLW 1
TRIS PORTB ; CONFIGURA EL PORTB COMO SALIDA Y RB0 COMO
ENTRADA
MOVLW 0
TRIS PORTC ; CONFIGURA PORTC COMO SALIDA
BSF STATUS,5 ; CAMBIA AL BANCO 1 DE MEMORIA
BSF OPTION_REG,INTEDG ;SELECCIONA FLANCO DE SUBIDA PARA LA
INTERRUPCIÓN
BSF STATUS,5 ; CAMBIA AL BANCO 0 DE MEMORIA
BCF INTCON,INTF ; BORRA SEÑALIZADOR DE INTERRUPCIÓN
BSF INTCON,INTE ; HABILITA LA INTERRUPCIÓN EXTERNA POR RB0

BSF INTCON,GIE ; HABILITA LAS INTERRUPCIONES


CLRF UNID ; PONE EN CERO LAS UNIDADES
CLRF DECE ; PONE EN CERO LAS DECENAS
LOOP CALL MOSTRAR
GOTO LOOP

MOSTRAR MOVF DECE,W


CALL TABLA
MOVWF PORTB
BSF PORTC,4
BCF PORTC,5
CALL RETARDO
MOVF UNID,W
CALL TABLA
MOVWF PORTB
BSF PORTC,5
BCF PORTC,4
CALL RETARDO
RETURN

RETARDO MOVLW 0FFH


MOVWF REG1
REP DECFSZ REG1,F
GOTO REP

RETURN

INGENIERIA DE DISEÑO DE PRODUCTO 71


MICROCONTROLADORES

TABLA ADDWF PCL,F ; PCL + W


RETLW B’ 00111111’ ; CODIGO PARA EL 0
RETLW B’ 00000110’ ; CODIGO PARA EL 1
RETLW B’ 01011011’ ; CODIGO PARA EL 2
RETLW B’ 01001111’ ; CODIGO PARA EL 3
RETLW B’ 01100110’ ; CODIGO PARA EL 4
RETLW B’ 01101101’ ; CODIGO PARA EL 5
RETLW B’ 01111100’ ; CODIGO PARA EL 6
RETLW B’ 00000111’ ; CODIGO PARA EL 7
RETLW B’ 01111111’ ; CODIGO PARA EL 8
RETLW B’ 01100111’ ; CODIGO PARA EL 9

INTER BCF INTCON,INTE ; DESHABILITA INTERRUPCION POR RB0


BCF INTCON,INTF ; BORRA SEÑALIZADOR DE INTERRUPCION
; POR RB0
INCF UNID,F
MOVLW .10
XORWF UNID,W
BTFSS STATUS,Z
GOTO LOOP1

MOVLW .9
XORWF DECE,W
BTFSS STATUS,Z
GOTO DECREM

CLRF UNID
CLRF DECE
GOTO LOOP1

DECREM INCF DECE,F


CLRF UNID
CALL RET100
LOOP1 BSF INTCON,INTE ; HABILITA INTERRUPCIONES POR RB0
RETFIE ; RETORNA DE LA INTERRUPCIÓN

RET100 MOVLW 2
MOVWF REG3
LOOP3 MOVLW .255
MOVWF REG2
LOOP2 CALL MOSTRAR
DECFSZ REG2,F
GOTO LOOP2

DECFSZ REG3,F
GOTO LOOP3

RETURN
END ;FIN DEL PROGRAMA

INGENIERIA DE DISEÑO DE PRODUCTO 72


MICROCONTROLADORES

31. CONVERSOR ANALOGO/DIGITAL (A/D).

Los microcontroladores PIC16F873 poseen un conversor análogo/digital de 10 bits y


5 canales de entrada.
Una señal análoga es una señal continua, por ejemplo una señal de 0 a 5V es una
señal análoga y puede tomar valores (1V, 2V, 2.5 V, etc.).
Una señal digital solo puede tomar dos valores 0V ó 5V, abierto o cerrado, activado
o desactivado.
Un sensor de nivel que me genere una señal análoga no solo me indica si el tanque
esta lleno o vacío, sino que además me indica que nivel tiene el tanque en todo
momento y la señal será proporcional al nivel del tanque.
Un conversor A/D me convierte la señal análoga en un numero digital (binario), él
número es proporcional a la señal análoga.
En el caso del microcontrolador PIC16F873 el conversor A/D tiene 10 bits y la señal
análoga de entrada puede estar entre 0V y 5V, sin embargo el conversor A/D tiene
dos niveles de referencia VREF+ y VREF- que me indican entre que valores será la
señal análoga de entrada. El voltaje mínimo diferencial es de 2V, es decir la
diferencia entre VREF+ y VREF- no puede ser mayor a 2V.
Con 10 bits el mayor numero binario que podemos tener es 1024, por lo tanto la
resolución del conversor A/D esta dada por la formula:

Resolución = (VREF+ - VREF-) / 1024

Así, por ejemplo, si VREF = +5V y VREF- es 0V, la resolución es 5V/1024 = 4.8mV /bit,
cuando la señal análoga sea 0V le corresponde un numero digital = 0000000000 y
para 5V será 1111111111.
Si VREF+ = +5V y VREF- podemos determinar en todo momento a que numero digital
aproximado corresponde cualquier señal análoga de entrada, con la formula:

VEntrada. = VEntrada.
4.8mV 0.0048V

Por ejemplo si la señal análoga es 2V, el número digital aproximado, será:

2V = 416
0.0048

La tensión de referencia VREF+ puede implementarse con la tensión interna de


alimentación VDD, o bien, con una externa que se pone en la patica RA2/AN2/ VREF-.
Para el funcionamiento del conversor A/D se necesita trabajar con 4 registros:

ADRESH: Parte alta del resultado de la conversión


ADRESL: Parte baja del resultado de la conversión
ADCONO: Registro de control 0
ADCONI: Registro de control 1

INGENIERIA DE DISEÑO DE PRODUCTO 73


MICROCONTROLADORES

El registro ADCONO controla la operación del conversor A/D, mientras que el


ADCON1 sirve para configurar las paticas del puerto A como entradas análogas o
entradas y salidas digitales.

REGISTRO ADCON1

ADFM ------- ------- ------- PCFG3 PCFG2 PCFG1 PCFG0

PCFG2:PCFG0 RA0 RA1 RA2 RA5 RA3 VREF


000 A A A A A VDD
001 A A A A VREF RA3
010 A A A A A VDD
011 A A A A VREF RA3
100 A A D D A VDD
101 A A D D VREF RA3
11X D D D D D -------

A: Entrada análoga.
D: Entrada/salida digital.

ADFM: Selecciona el formato del resultado de la conversión si vale 1, el resultado


esta justificado en el registro ADRESH, que tiene sus 6 bits de mas peso a 0,
mientras que si vale ”0” la justificación se realiza sobre el registro ADRESL, que
tiene sus 6 bits de mas peso a 0.

Veamos como configurar el PORTA para diferentes aplicaciones:

Los pasos que debemos seguir para configurar el PORTA son los siguientes:

1. Paso al banco 1 de memoria:

BSF STATUS,5

2. Configurar el Registro ADCON1 con la configuración deseada. El puerto A solo


tiene 6 líneas disponibles desde RA0 hasta RA5, la patica RA4 solo puede
funcionar como Entrada/Salida digital, cuando funciona como salida hay que
tener en cuenta que es una salida de colector abierto, es decir, se debe poner
una resistencia entre la salida y 5V.

Para lograr este objetivo, se hace referencia a la tabla del registro ADCON1.

INGENIERIA DE DISEÑO DE PRODUCTO 74


MICROCONTROLADORES

Como ejemplo de este punto, se supone que se quiere configurar todo el puerto A
como Entradas/Salidas digital.

El valor que se debe cargar en el Registro ADCON1 será la combinación 00000110


o 00000111 (6 0 7 en decimal), como nos los indica el Registro ADCON1. La X
significa que el estado de este bit no importa.

MOVLW 6
MOVWF ADCON1

3. Paso al banco 0 de memoria.

BCF STATUS,5

4. Configurar el puerto A como lo necesitamos, es decir cuales de los pines


funcionaran como entradas o salidas.
En este paso configuramos el PORTA como lo hemos hecho siempre.

MOVLW B´00000000´
TRIS PORTA.

REGISTRO ADCON0

ADCS1 ADCS0 CHS2 CHS1 CHS0 G0/ DONE H -------- ADON

ADCS1: ADSC0 : Selección del reloj de conversión.

00 : FOSC/2
01 : FOSC/8
10 : FOSC/32
11 : FRC : Oscilador RC interno en el conversor A/D

CHS2: CHS0 : Bits de selección de canales análogos

000 : Canal 0, (RA0/AN0)


001 : Canal 1, (RA1/AN1)
010 : Canal 2, (RA2/AN2)
011 : Canal 3, (RA3/AN3)
111 : Canal 4, (RA4/AN4)

INGENIERIA DE DISEÑO DE PRODUCTO 75


MICROCONTROLADORES

GO/DONE : Bit de estado de la conversión

Si ADON = 1
1: Conversión A/D en progreso (poniendo este bit en 1
comienza la conversión A/D)
0: No hay conversión A/D (este bit es borrado automáticamente
cuando la conversión A/D termina)

ADON : Bit de activación del conversor A/D

1: Esta operando la conversión


0: Modulo del conversor esta inactivo.

Los pasos que se deben seguir para realizar una conversión análoga son los
siguientes:

1. Configurar el modulo A/D

• Configurar los pines análogos/ voltajes de referencia/ pines digitales (Registro


ADCON1)
• Seleccionar el canal de entrada A/D (Registro ADCONO)
• Seleccionar reloj de conversión (Registro ADCONO)
• Activar el modulo A/D (registro ADCONO)

2. Configurar la interrupción de modulo A/D (si lo desea)

3. Esperar a que termine el tiempo de muestreo (típico de 20 s)

4. Iniciar la conversión

• Poner en uno el bit GO/DONE (Registro ADCONO)

5. Esperar a que termine la conversión A/D

• Revisando que el bit GO/DONE se ponga en cero


• Esperando la interrupción del modulo A/D

6. Leer el resultado de los registros ADRESH y ADRESL y borrar el bit ADIF

Para la próxima conversión se debe regresar al paso 1 ó al 2 según se requiera.

INGENIERIA DE DISEÑO DE PRODUCTO 76


MICROCONTROLADORES

32. EJEMPLO DE CONVERSOR ANÁLOGO DIGITAL

A continuación se describe un ejemplo en el que la entrada análoga viene de una


resistencia variable por RA0 y el resultado de la conversión se muestra en binario
por el puerto B y parte del puerto C (RC0 y RC1).
El diagrama del circuito es el siguiente:

Programa:

Include <P16F873.INC>
LIST P=16F873, R=HEX

REG1 EQU 20
REG2 EQU 21
REG3 EQU 22
REG4 EQU 23

ORG 0
MOVLW 0
TRIS PORTB ; CONFIGURAR EL PORTB COMO SALIDA
TRIS PORTC ; CONFIGURAR EL POTRC COMO SALIDA
BSF STATUS,5 ; CAMBIA AL BANCO 1 DE MEMORIA
MOVLW 80 ; CONFIGURA EL PORTA COMO
; ENTRADAS ANÁLOGAS
MOVWF ADCON1
BCF STATUS,5 ; CAMBIA AL BANCO 0 DE MEMORIA
REP3 MOVLW 1 ; CONFIGURA CANAL 0, FRECUENCIA, Y
; ENCIENDE EL CONVERSOR A/D
MOVWF ADCON0
CALL RETARDO ; LLAMA RETARDO DE 767 MICROSEGUNDOS

INGENIERIA DE DISEÑO DE PRODUCTO 77


MICROCONTROLADORES

REP1 BSF ADCON0,2 ; INICIA LA CONVERSIÓN

REP BTFSC ADCON0,2 ; PREGUNTA SI YA TERMINO LA CONVERSIÓN


GOTO REP ; SALTA A REP SI NO HA TERMINADO
MOVF ADRESH,W ; PASA EL VALOR DE ADRESH A W (BITS
; MÁS SIGNIFICATIVOS DE LA CONVERSIÓN)
MOVWF PORTC ; MUESTRA EN EL PORTC
BSF STATUS,5 ; CAMBIA AL BANCO 1 DE MEMORIA
MOVF ADRESL,W ; PASA EL VALOR DE ADRESL A W (BITS
; MENOS SIGNIFICATIVOS DE LA CONVERSIÓN)
BCF STATUS,5 ; CAMBIA AL BANCO 0 DE MEMORIA
MOVWF PORTB ; MUESTRA EN EL PORTC
CALL RETD ; LLAMA RETARDO DE 100 MILISEGUNDOS
GOTO REP3 ; SALTA A REP3 (COMENZAR DE NUEVO
; LA CONVERSIÓN)

RETARDO MOVLW .255


MOVWF REG4
REP4 DECFSZ REG4,F
GOTO REP4

RETURN

RETD MOVLW 2
MOVWF REG1
REP6 MOVLW 84H
MOVWF REG2
REP2 MOVLW 0FFH
MOVWF REG3
REP7 DECFSZ REG3,F
GOTO REP7
DECFSZ REG2,F
GOTO REP2
DECFSZ REG1,F
GOTO REP6
RETURN

END ; FIN DEL PROGRAMA.

INGENIERIA DE DISEÑO DE PRODUCTO 78


MICROCONTROLADORES

33. COMUNICACIÓN SERIAL

Existen dos formas comunes de transferir información binaria entre dos equipos, la
comunicación paralela y la comunicación serial.

En la comunicación en forma paralela los datos se transfieren en forma simultánea y


existen algunas líneas adicionales de control que permite la comunicación entre los
dos equipos.
Bus de
Datos

EQUIPO Bus de EQUIPO


Control

Una de las desventajas de la comunicación paralela es la cantidad de líneas que


necesita, esto aumenta los costos y más cuando la distancia entre los equipos es
grande.

La comunicación serial solo utiliza tres líneas, una para recibir los datos Rx, otra
para trasmitir los datos Tx y la línea común GND.

Cada dato se transmite bit a bit, un bit a la vez, por lo tanto se hace mucho más
lenta, pero tiene la ventaja de necesitar menos líneas y las distancias a las cuales se
puede transferir la información son mayores, además con el uso de los módem se
puede trasmitir a cualquier parte del mundo.

Tx Tx
EQUIPO EQUIPO
Rx Rx

GND GND

Existen dos formas de comunicación serial:


Sincrónica
Asincrónica

Comunicación Sincrónica: en esta comunicación además de una línea sobre la que


se transfieren los datos, se necesita otra que contenga pulsos de reloj que indiquen
que el dato es válido; la duración del bit está determinada por la duración del pulso
de sincronismo.

INGENIERIA DE DISEÑO DE PRODUCTO 79


MICROCONTROLADORES

Comunicación Asincrónica: en esta comunicación los pulsos de reloj no son


necesarios y se utilizan otros mecanismos para realizar la transferencia de datos. La
duración de cada bit esta determinada por la velocidad con la cual se realiza la
trasferencia de datos, por ejemplo si trasmitimos a 1200 bits por segundo (baudios),
la duración de cada bit es de 833 microsegundos.
Las velocidades de transmisión más comunes son 300, 600,1200, 2400, 9600,
14400 y 28800 baudios.

En este curso solo se estudiará la comunicación asincrónica.

LSB MSB

1 2 3 4 5 6 7 8

Bit de Bit de
Start Stop

En la figura se muestra la forma como se trasmite un dato cuando se realiza alguna


transferencia, la línea del transistor permanece en alto. Para empezar a transmitir
datos esta línea se pone en bajo durante un bit, lo cual se conoce como bit de Start,
y luego comienza a transmitir los bits correspondientes al dato, empezando por el bit
menos significativo (LSB) y terminando con el más significativo (MSB). Al finalizar se
agrega el bit de paridad, si está activada esta opción, y por ultimo los bits de stop,
que pueden ser 1 o 2, en los cuales la línea regresa a nivel alto.

En el ejemplo de la figura, después del bit de start se trasmite el dato 01101001 y al


final hay un bit de stop.

Esto significa que la configuración de la transmisión serial es: 1 bit start, 8 bits dato,
no paridad y 1 bit de stop.

El receptor no está sincronizado con el transistor y no sabe cuando va a recibir


datos. La transición de alto a bajo de la línea del transmisor, activa el receptor y este
genera un conteo de tiempo de tal manera que realiza una lectura de la línea medio
bit después del evento; si la lectura realizada es un estado alto, asume que la
transición ocurrida fue ocasionada por ruido en la línea; si por el contrario la lectura
es un estado bajo, considera como válida la transición y empieza a realizar lecturas
secuenciales a intervalos de un bit hasta conformar el dato transmitido. Lógicamente
tanto el transmisor como el receptor deberán tener los mismos parámetros de
configuración (velocidad, numero bits del dato, paridad y bits de parada)

INGENIERIA DE DISEÑO DE PRODUCTO 80


MICROCONTROLADORES

Diagrama de Flujo de la Rutina Transmitir

Inicio

Bit de Start

Contador = 8

Colocar Tx en bajo

Rotar registro de
transmisión a la
derecha

Carry = 0 ? No Colocar Tx en bajo

Si

Call retardo 1 bit

Decrementar
contador

No Contador = 0

Si

Bit de parada

Retorne

INGENIERIA DE DISEÑO DE PRODUCTO 81


MICROCONTROLADORES

Diagrama de Flujo Para la Recepción de Datos

Inicio

Esta la línea
No
Rx en bajo

Si

Call retardo 1.5 bits

Contador = 8

Carry = 0

Esta la línea
No Carry = 1
Rx en bajo

Rotar a la derecha
registro de recepción

Call retardo 1 bits

Decrementar
contador

No Contador = 0

Si

Retornar

Para la comunicación serial se utiliza el protocolo RS-232, según esta norma un uno
lógico es un voltaje comprendido entre –5V y –15V y entre –3V y –25V en el
receptor.
Un cero lógico es un voltaje comprendido entre 5V y 15V en el transmisor y entre 3V
y 25V en el receptor.

INGENIERIA DE DISEÑO DE PRODUCTO 82


MICROCONTROLADORES

Según lo anterior, se debe utilizar dispositivos que permitan convertir niveles TTL a
niveles RS-232 y viceversa, de esta función se encarga el circuito integrado
MAX232.

34. EJEMPLO COMUNICACIÓN SERIAL

Como ejemplo de aplicación se plantea un ejercicio donde se conecta un display 7


segmentos al microcontrolador, el cual recibe información en forma serial desde el
computador y el dato que envía, que lógicamente es un numero entre 0 y 9 es
mostrado en el display. El diagrama del circuito es el siguiente.

INGENIERIA DE DISEÑO DE PRODUCTO 83


MICROCONTROLADORES

Programa:
INCLUDE <P16F873.INC>
List P=16F873, R = HEX

CBLOCK 20H
CONT,DELAY,REGTX,REGRX,VALOR
ENDC

#DEFINE TRANSMISOR PORTC,7


#DEFINE RECEPTOR PORTC,6

ORG 0
BSF STATUS,5
MOVLW B'01111111'
MOVWF TRISC
CLRF TRISB
BCF STATUS,5
BSF TRANSMISOR
MOVLW 0
CALL TABLA
MOVWF PORTB
REPETIR CALL RECEP
MOVF REGRX,W
MOVWF VALOR
MOVLW .48
SUBWF VALOR,W
CALL TABLA
MOVWF PORTB
CALL TRANS
GOTO REPETIR

;RUTINA DE TRANSMISION

TRANS MOVWF REGTX


MOVLW .8 ;DEFINO DATO DE 8 BITS
MOVWF CONT
BCF TRANSMISOR ;INICIALIZO BIT DE START
CALL RETAR1 ;LLAMO RUTINA DE 1 BIT
TOTRO BCF TRANSMISOR ;TX = 0
BCF STATUS,C ;CARRY = 0
RRF REGTX,F ;ROTO REGISTRO DE TRANSMISION
BTFSC STATUS,C ;PREGUNTO SI CARRY = 0
BSF TRANSMISOR ;NO ES CERO, ENTONCES TX = 1
CALL RETAR1 ;SI ES CERO, LLAMO RUTINA DE 1 1 BIT
DECFSZ CONT,F ;DECREMENTO CONTADOR DE # DE BITS
GOTO TOTRO ;CONTADOR NO ES CERO, TRANSMITO DATO
BSF TRANSMISOR ;INICIALIZO BIT DE STOP
CALL RETAR1 ;LLAMO RUTINA DE 1 BIT
RETURN ;RETORNO A PROGRAMA PPAL

INGENIERIA DE DISEÑO DE PRODUCTO 84


MICROCONTROLADORES

;RUTINA DE RECEPCION DE DATOS

RECEP CLRF REGRX ;ASEGURO LECTURA CORRECTA


BTFSC RECEPTOR ;PREGUNTO RX = 0 (INICIO COMUNICACION)
GOTO RECEP ;NO ES CERO (PREGUNTO NUEVAMENTE)
CALL RETAR2 ;SI ES CERO, LLAMO RUTINA DE BIT Y MEDIO
MOVLW .8 ;DEFINO DATOS DE 8 BITS
MOVWF CONT
ROTRO BCF STATUS,C ;CARRY = 0
BTFSC RECEPTOR ;PREGUNTO LINEA DE RX = 0
BSF STATUS,C ;NO ES CERO, ENTONCES CARRY = 1
RRF REGRX,F ;EMPAQUETO DATO EN REGISTRO DE RECEPC
CALL RETAR1 ;LLAMO RUTINA DE 1 BIT
DECFSZ CONT,F ;DECREMENTO CONTADOR DE # DE BITS
GOTO ROTRO ;CONTINUA LA RECEPCION HASTA CONT = 0
RETURN ;CONT = 0, RETORNO A PROGRAMA PPAL

;RUTINA DE RETARDO PARA TIEMPO DE UN BIT A 9600 BPS

RETAR1 MOVLW .32


MOVWF DELAY
CICLO DECFSZ DELAY,F
GOTO CICLO
RETURN

;RUTINA DE RETARDO PARA TIEMPO DE UN BIT Y MEDIO A 9600 BPS

RETAR2 MOVLW .50


MOVWF DELAY
CICLO1 DECFSZ DELAY,F
GOTO CICLO1
RETURN

TABLA ADDWF PCL,F ; PCL + W


RETLW B’ 00111111’ ; CODIGO PARA EL 0
RETLW B’ 00000110’ ; CODIGO PARA EL 1
RETLW B’ 01011011’ ; CODIGO PARA EL 2
RETLW B’ 01001111’ ; CODIGO PARA EL 3
RETLW B’ 01100110’ ; CODIGO PARA EL 4
RETLW B’ 01101101’ ; CODIGO PARA EL 5
RETLW B’ 01111100’ ; CODIGO PARA EL 6
RETLW B’ 00000111’ ; CODIGO PARA EL 7
RETLW B’ 01111111’ ; CODIGO PARA EL 8
RETLW B’ 01100111’ ; CODIGO PARA EL 9

END

INGENIERIA DE DISEÑO DE PRODUCTO 85


BIBLIOGRAFIA

ANGULO USATEQUI, José María. Microcontroladores PIC: Diseño Práctico de


aplicaciones. Segunda Edición. Editorial Mc Graw-Hill. 1999.

ANGULO USATEQUI, José María. Microcontroladores PIC: Diseño Práctico de


aplicaciones. Segunda Parte. Editorial Mc Graw-Hill. 2000.

FLOYD, T.L. Fundamentos de Sistemas Digitales. Sexta Edición


Editorial Prince Hall. 1997

Potrebbero piacerti anche