MICROCONTROLADORES
POR: HUGO ALBERTO MURILLO
UNIVERSIDAD EAFIT DEPARTAMENTO DE INGENIERIA DE DISEÑO DE PRODUCTO MEDELLIN 2002
TABLA DE CONTENIDO 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34.
INTRODUCCIÓN CONCEPTOS BÁSICOS COMPUERTAS LÒGICAS FUNCIONES LÒGICAS CON BYTES CIRCUITO COMBINACIONAL LATCHES FLIP-FLOP MEMORIAS ARITMÉTICA BINARIA INTRODUCCIÓN AL MICROCONTROLADOR EXPLICACIÓN DEL REGISTRO STATUS SINTAXIS DE LAS INSTRUCCIONES DIRECTIVAS PARA HACER UN PROGRAMA EN MICROCONTROLADOR EJEMPLOS SENCILLOS DE DIAGRAMAS DE FLUJO CONFIGURACIÓN DE LOS PUERTOS EJEMPLOS SENCILLOS CON ENTRADAS Y SALIDAS DE DATOS RETARDOS MANEJO DE SUBRRUTINAS EJEMPLO UTILIZANDO RETARDOS GENERACIÓN DE TONOS CON MICROCONTROLADORES MOTORES PASO A PASO EJEMPLO DE MANEJO DEL MOTOR PASO A PASO EXPLICACIÓN DE LAS INSTRUCCIONES DE ROTACIÒN MANEJO DE DISPLAY 7 SEGMENTOS Y ANTIREBOTE TRABAJOS CON PULSADORES EJEMPLO CON MANEJO DE DISPLAY MULTIPLEXAJE DE DISPLAY EJEMPLO DE MULTIPLEXAJE INTERRUPCIONES EJEMPLO UTILIZANDO INTERRUPCION POR RB0 CONVERSOR ANALOGO / DIGITAL (A/D) EJEMPLO DE CONVERSOR ANÁLOGO DIGITAL COMUNICACIÓN SERIAL EJEMPLO COMUNICACIÓN SERIAL
BIBLIOGRAFIA
2 7 9 10 13 13 16 21 23 27 30 31 33 37 38 40 44 45 46 48 49 52 55 57 59 61 64 66 70 73 77 79 83
TABLA DE CONTENIDO 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34.
INTRODUCCIÓN CONCEPTOS BÁSICOS COMPUERTAS LÒGICAS FUNCIONES LÒGICAS CON BYTES CIRCUITO COMBINACIONAL LATCHES FLIP-FLOP MEMORIAS ARITMÉTICA BINARIA INTRODUCCIÓN AL MICROCONTROLADOR EXPLICACIÓN DEL REGISTRO STATUS SINTAXIS DE LAS INSTRUCCIONES DIRECTIVAS PARA HACER UN PROGRAMA EN MICROCONTROLADOR EJEMPLOS SENCILLOS DE DIAGRAMAS DE FLUJO CONFIGURACIÓN DE LOS PUERTOS EJEMPLOS SENCILLOS CON ENTRADAS Y SALIDAS DE DATOS RETARDOS MANEJO DE SUBRRUTINAS EJEMPLO UTILIZANDO RETARDOS GENERACIÓN DE TONOS CON MICROCONTROLADORES MOTORES PASO A PASO EJEMPLO DE MANEJO DEL MOTOR PASO A PASO EXPLICACIÓN DE LAS INSTRUCCIONES DE ROTACIÒN MANEJO DE DISPLAY 7 SEGMENTOS Y ANTIREBOTE TRABAJOS CON PULSADORES EJEMPLO CON MANEJO DE DISPLAY MULTIPLEXAJE DE DISPLAY EJEMPLO DE MULTIPLEXAJE INTERRUPCIONES EJEMPLO UTILIZANDO INTERRUPCION POR RB0 CONVERSOR ANALOGO / DIGITAL (A/D) EJEMPLO DE CONVERSOR ANÁLOGO DIGITAL COMUNICACIÓN SERIAL EJEMPLO COMUNICACIÓN SERIAL
BIBLIOGRAFIA
2 7 9 10 13 13 16 21 23 27 30 31 33 37 38 40 44 45 46 48 49 52 55 57 59 61 64 66 70 73 77 79 83
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 DECIMAL HEXADECIMAL 2.1
27 26 25 24 23 22 21 20 ...........10 3 102 101 100 .............163 162 161 160
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) + 10 1 * (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 1 1 0 0 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 B = 11 C = 12
D = 13 E = 14 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 / 2 25 / 2 12 / 2 6/2 3/2 1/2
= 50 = 25 = 12 =6 =3 =1 =0
Residuo Residuo Residuo Residuo Residuo Residuo Residuo
1 LSB 0 1 0 0 1 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 0 1 2 3 4 5 6 7 8 9 10 11
BINARIO 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011
INGENIERIA DE DISEÑO DE PRODUCTO
HEXADECIMAL 0 1 2 3 4 5 6 7 8 9 A B
BCD 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 0001 0000 0001 0001 6
MICROCONTROLADORES
12 13 14 15
1100 1101 1110 1111
C D E F
0001 0010 0001 0011 0001 0100 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 B
X
X=A*B
3.2
B
X
0 0 1 1
0 1 0 1
0 0 0 1
Compuerta OR: La compuerta OR genera un nivel alto a la salida cuando cualquiera de sus entradas están en nivel ALTO. A B
X
X=A+B
3.3
A
A
B
X
0 0 1 1
0 1 0 1
0 1 1 1
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 X=A
A
A
X
0 1
1 0
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 B
X
=
A B
=
X
X=A*B
A
B
X
0 0 1 1
0 1 0 1
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 B
X
A B
=
X
X=A+B
A
B
X
0 0 1 1
0 1 0 1
1 0 0 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 B
3.7
X
X = AB + AB
A
B
X
0 0 1 1
0 1 0 1
0 1 1 0
Compuerta (XNOR) NOR –EXCLUSIVA: el símbolo de la compuerta XNOR indica que su salida es opuesta a la de la compuerta XOR. A B
X
X = AB + A.B
A
B
X
0 0 1 1
0 1 0 1
1 0 0 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.
5.
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 1 0 1 0 1 1 0 0 0 0 0 0 0 0 1 1
XOR:
sirve para determinar si dos bytes son iguales, en ese caso el resultado de la XOR será cero (0).
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% A 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1
20% B 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1
INGENIERIA DE DISEÑO DE PRODUCTO
27% C 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1
31% D 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
SALIDA 0 0 0 1 0 1 0 1 0 1 0 1 0 1 1 1
ABCD ABCD ABCD ABCD ABCD ABCD ABCD ABCD
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 01
0
1
1
0
11
0
1
1
1
10
0
1
1
0
AD
BD ACD
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
R
Q
Q
S
R
0 0 1 1
0 1 0 1
Q ESTADO PROHÍBIDO
0 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 Subida
Flanco de 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 Dirección
1 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 O 0 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
5
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 + 1 + 1 + Ejemplos
0 1 0 1
= = = =
0 1 1 0
suma suma suma suma
0 con acarreo 1 con acarreo 1 con acarreo 0 con acarreo
0 0 0 1
100 + 10 100 + 10 110
4+ 2 6
1 00 11 10 0 + 0 01 10 01 1 11 10011100 + 00110011 11001111
156 + 51 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:
1 01 01 01 1 + 0 11 01 10 0 1 11 1 1 0 10 1 01 1 + 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 0 1 0 0 1 1 0 1 + 1 0 1 0 0 1 1 1 0
Numero Binario Complemento a Uno 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+ 10111110 1 01110111
185 66 119
Numero Positivo Ejemplo:
Restar 10111001
- 11100011
10111001+ 00011101 11010110
185 227 - 42
Numero Negativo
Para hallar el resultado se calcula el complemento a dos del resultado. 11010110 00101001 + 1 00101010
Complemento a uno 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.
Memoria de Código (Flash)
Bus de Dirección de Instrucciones
Bus de Dirección de Datos
Procesador
Bus de Instrucciones
Memoria de Datos (SRAM)
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
TMRO PCL STATUS FSR PORTA PORTB PORTC PORTD (1) PORTE (1) PCLATH INTCON PIR1 PIR2 TMR1L TMR1H T1CON TMR2 T2CON SSPBUF SSPCON CCPR1L CCPR1H CCP1CON RCSTA TXREG RCREG CCPR2L CCPR2H CCP2CON ADRESH ADCON0 Registros de Propósito General 96 Bytes
01h 02h 03h 04h 05h 06h 07h 08h 09h 0Ah 0Bh 0Ch 0Dh 0Eh 0Fh 10h 11h 12h 13h 14h 15h 16h 17h 18h 19h 1Ah 1Bh 1Ch 1Dh 1Eh 1Fh 20h
Indirect addr.(*)
OPTION_REG PCL STATUS FSR TRISA TRISB TRISC PORTD (1) PORTE (1) PCLATH INTCON PIE1 PIE2 PCON
SSPCON2 PR2 SSPADD
TXSTA SPBRG
ADRESL ADCON1 Registros de Propósito General 80 Bytes
80h 81h 82h 83h 84h 85h 86h 87h 88h 89h 8Ah 8Bh 8Ch 8Dh 8Eh 8Fh 90h 91h 92h 93h 94h 95h 96h 97h 98h 99h 9Ah 9Bh 9Ch 9Dh 9Eh 9Fh A0h
EFh 7Fh Banco 0
Mapeados con 70h-7Fh
F0h FFh
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 0 0 1 1
RP0 0 1 0 1
Banco Seleccionado Banco 0 Banco 1 Banco 2 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Ó NICOS
PARÁMETROS
OPERACIÓN
CICLOS
SEÑALIZADORES
INSTRUCCIONES QUE MANEJAN REGISTRO ADDWF ANDWF CLRF CLRW COMF DECF
f,d f,d f a,e f,d f,d
SUMA de W con f AND de W con f BORRADO de f BORRADO de W COMPLEMENTO de f DECREMENTO de f
1 1 1 1
INCF IORWF MOVF MOVWF NOP RLF RRF SUBWF
f,d f,d f,d f ae f,d f,d f,d
INCREMENTO de f OR de W con f MOVIMIENTO de f MOVIMIENTO de W a f
1 1 1 1 1 1 1 1
SWAPF
f,d
XORWF
f,d
NO OPERACIÓN ROTACION de f a izquierda con carry ROTACION de f a derecha con carry RESTA de W a f (f - W) INTERCAMBIO de 4 bits de +peso por los 4 de –peso. OR exclusiva de W con f
1 1
C,DC,Z Z Z Z Z Z Z Z Z
C C C,DC,Z
1 1
Z
INSTRUCCIONES QUE MANEJAN BITS BCF BSF
f,b f,b
PUESTA a 0 del bit b de f PUESTA a 1 del bit b de f
1 1
INSTRUCCIONES DE
BTFSC BTFSS DECFSZ INCFSZ
f,b f,b f,d f,d
PRUEBA del bit b de f; SALTA si es 0 PRUEBA del bit b de f; SALTA si es 1 DECREMENTO de f; SALTA si es 0 INCREMENTO de f; SALTA si es 0
1 (2) 1 (2) 1 (2) 1 (2)
INSTRUCCIONES QUE MANEJAN OPERANDOS INMEDIATOS ADDLW ANDLW IORLW MOVLW SUBLW XORLW
k k k k k k
SUMA de literal con W AND de literal con W OR de literal con W MOVIMIENTO de literal a W RESTA W de literal (k-w) OR exclusiva de literal con W
1 1 1 1 1 1
C, DC,Z Z Z C,DC,Z Z
INSTRUCCIONES DE CONTROL Y ESPECIALES CALL CLRWDT GOTO RETFIE RETLW RETURN SLEEP
k K k
LLAMADA a subrrutina BORRADO del WATHDOG SALTO a una dirección RETORNO de interrupción RETORNO devolviendo literal en W RETORNO de subrrutina PUESTA del microprocesador en reposo
INGENIERIA DE DISEÑO DE PRODUCTO
2 1 2 2 2 2 1
#TO, #PD
#TO,#PD
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 Inicio
Operación movlw
Operandos 0
Comentarios ; 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 R = Hex
; indica el tipo de procesador ; sistema de numeración hexadecimal
Include ; se incluye la definición de los registros internos en la librería. Ejemplo: Include LIST P= 16F873, R=Hex OPERANDO 1 EQU OPERANDO 2 EQU RESULTADO EQU ORG MOVLW MOVWF MOVLW MOVWF MOVF ADDWF MOVWF
20 21 22
; DEFINE LA POSICIÓN DEL OPERADO 1 ; DEFINE LA POSICIÓN DEL OPERADO 2 ; DEFINE LA POSICIÓN DEL RESULTADO
0 05 OPERANDO1 02 OPERANDO2 OPERANDO1 OPERANDO2,W RESULTADO
END
INGENIERIA DE DISEÑO DE PRODUCTO
;w=5 ; w = OPERANDO1 ;w=2 ; w = OPERANDO2 ; w = OPERANDO1 ; w = w+OPERANDO2 ; w = RESULTADO ; DIRECTIVA DEL FIN DE PROGRAMA
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 LIST P=16F873, R=HEX CONTADOR
EQU
20
LOOP
ORG MOVLW MOVWF NOP NOP NOP DECFSZ GOTO END
0 5 CONTADOR
; El Programa se repite 5 veces ; Carga contador con 5 ; Programa ; Programa ; programa CONTADOR,F : Decrementa contador e ignora la siguiente ; instrucción si el contador es cero LOOP ; salta a LOOP ; 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 LIST P=16F873, R=HEX NUMERO 1
EQU
20
ORG MOVLW MOVWF MOVLW XORWF BTFSS
0 .10 NUMERO1 .15 NUMERO1,W STATUS,Z
GOTO GOTO
NOIGUAL IGUAL
INGENIERIA DE DISEÑO DE PRODUCTO
; Carga W con 15 ; Lleva 15 a NUMERO1 ; Carga W con 15 ; Realiza una XOR entre W y NUMERO1 ; Pregunta si el bit Z del registro de ; estado esta en uno ; Salta a NOIGUAL ; Salta a IGUAL
33
S E R O D A L O R T N O C O R C I M
. o o d r n e a c u e c d y s , e 5 d 1 o a t e 0 n e o c d l s e o r e e c n m i ú e n m s o o c l e e r t e n n e e m g a v e e m u n e , u 5 q 1 r a o d e a u l g o r e t l n l o c o r c i m n e a m a r g o r p n u r e c a H
3 O L P M E J E
o j u l f e d a m a r g a i D
a m a r g o r P
O I C I N I
> C X N I , E 3 H 7 = 8 R F , 6 3 1 7 P 8 < F 6 E 1 D = U P L T C S I N I L
R O D A T N O C R A T N E M E R C N I
0 = R O D A T N O C
O N 5 1 = r o d a t n o C
I S
0 2
. n . ó r i o c d c a u t r r n t r o s o o d n i c a d t y a a n n o t n o W u c n o c a a o l e r t l c a t t n n a W W e e s a a m R 1 e = g r v r O Z c a l e i X i n c ; s ; l ; ; ; F W , , R R R O O O Z , D D D S A A A U T T T T P O I N N N A O C O O 5 O T O I 0 0 C C 1 . C S L N I
U Q E
W F W F S L W L W G V V F V R S F R O O C O O T N M X B O M M I
R O D A T N O C
O I C I N I
P O O L
4 3
O O T T D O O N G G E
O T C U D O R P E D O Ñ E S I D E D A I R E I N E G N I
S E R O D A L O R T N O C O R C I M
S O R E T N E S O R E M U N S O D E D N O I C A C I L P I T L U M
o j u l f e d a m a r g a i D
4 O L P M E J E
a m a r g o r P
N Ó I C A C I L P I T L U M
> C X N E I . 3 H 7 = 8 R F , 6 3 1 7 P 8 F < 6 E 1 D = U P L T C S N I I L
o d n a c i l p i t l u m r a g r a C
r o d a c i l p i t l u m r a g r a C
0 1 2 2 2 2
U U U Q Q Q E E E
O R D O N D A A O C I C D I L L A T P I P I L T T U L L S U U E M M R
0 = o d a t l u s e r a g r a C
o d n a c i = l p o i d t l a u t l m u + s e o R d a t l u s e r
r o d a c i l p i t l u m a t n e m e r c e D
5 3
0 = r o d a c i l p i t l u M
I S
D N E
O N
W F , , R R O O D O D F O N D N , D O A O A A A D C D I C C C I I A I A L L L L T T P P L P I I I L P I T T U T U T P L L S L S L O U U E U E U O 0 X . M Y . M 0 . R M R M L Z F S W F W F W F L W L W L W F W F O G V V V V V V V D C T D R O O O O O O O D E O N O M M M M M M M A D G E
P O O L
O T C U D O R P E D O Ñ E S I D E D A I R E I N E G N I
S E R O D A L O R T N O C O R C I M
O R E T N E O R E M U N O D A T L U S E R Y S O R E T N E S O R E M U N S O D E D N O I S I V I D
o j u l f N I e Ó I d S V a I D m a r g a i D
5 O L P M E J E
> X E a . H = m R , a 3 r 7 g 8 < F o r 6 1 = P P T S I L
o d n e d i v i d r a g r a C
r o s i v i d r a g r a C
0 = o d a t l u s e r a g r a C
o d n e d i v i d = o u d i s e R
o d n = e i o d v u i d i d s e o u R d i s e r
0 = o u d i s e R
6 3
I S
D N E
O N
a o t n d e t a l m u e r s c e n r I
W O , F O O W D , W , Z , D , A D O O O R N R T N S U U E O L E U O U D D I D U I I T D D S S I I S I S I S S A U U U U V I V I E V I E V I E E T Q Q Q Q X Y 0 0 E E E E 0 . D . D . R D R D R . R S 0 1 2 3 2 2 2 2
O O D D A O R T U N L E O D U I D S I I S S V I V I E E D D R R
F , O D A T L P U S O E O R L
F F F F F F N Z W W W W C R S L W L W L W F W F W L W O S U V V V V V V V V V B V R T D G F T F C O O O O O O O O O R O O U O T E N N O M M M M M M M M M S M X B R I G E P O O L
O T C U D O R P E D O Ñ E S I D E D A I R E I N E G N I
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 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 1 1 1 0 0 0 0
RB0 RB1 RB2 RB3 RB4 RB5 RB6 RB7
Entrada
Salida
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
Rc 2 = 0 ?
Si
No
RB 0 = 0
RB 0 = 1
Programa: Include LIST P = 16873 = HEX
LOOP
H1
ORG
0
MOVLW TRIS MOVLW TRIS CLRF BTFSS GOTO BSF GOTO BCF GOTO END
0 PORTB .255 PORTC PORTB PORTC,2 H1 PORTB,0 LOOP PORTB,0 LOOP
;LA INSTRUCCIÓN INSTRUCCIÓN INCLUDE ME CARGA UN ARCHIVO DONDE SE ENCUENTRAN TODOS LOS REGISTROS CON SUS RESPECTIVAS DIRECCIONES. ;ESTO INDICA QUE EL PROGRAMA COMIENZA EN LA DIRECCIÓN CERO. ;CONFIGURAR EL PUERTO B TODO COMO SALIDA. ;CONFIGURAR EL PUERTO C TODO COMO ENTRADA. ;PONE EN 0 EL PUERTO B. ;SI EL BIT2 DEL PUERTO C ESTA EN 0?. ;SALTA A H1. ;ENTONCES COLOQUE LA SALIDA RB0 EN 1. ;SALTA A LOOP. ;SI NO ENTONCES COLOQUE EN 0 LA SALIDA RB0. ;FIN DEL PROGRAMA.
INGENIERIA DE DISEÑO DE PRODUCTO
38
S E R O D A L O R T N O C O R C I M
. . . 0 t e e C n t n R e e e d d n d n e e a c c d s s a e r a t r d n o r e d o a d a t l a t e n n d o c o o 1 c d = 0 n 0 = e C 0 i d R C n i R e S p e d e t n e d n e c s e d o e t n e d n e c s a a m r o f n e 5 1 a 0 e d s o r e m ú n e d r o d a t n o c n U
o j u l f e d a m a r g a i D
6 O L P M E J E
X E H = R > C N I . , 3 3 7 7 8 8 F F 6 6 1 1 P = < P
a m a r g o r P
E D U L T C I S N I L
I C I N I
0 = R O D A T N O C
O N
0 = t n o C I S
1 = 0 C R I S
5 1 = t n o C I S
O N
1 = t n o C
O N
t n o c c e D
9 3
t n o c c n I
a d a r t n e a B B r o d o o t t o e i l r r t r m a d e e n W o o s a a u t u e d p c r r r n p d r a o o o o t B 0 o n o d 1 O 0 m d o e d a a d n c r a 0 C 0 o t a t a o o t c t a t y 0 R 0 c n r c n e s n t e d W n W 0 0 o u 1 a o n t a e a t o W e 0 B 0 B o W c c p c d = d 0 0 a c e n n 0 t o t o ” 5 5 e 0 a = ” = 0 r 0 a a d a a ” r 0 o e a r a 0 1 1 d t t v Z n m c o C l 0 e e “ . . Z n r r o t o o o W n r e a r o d u W W R a l t e o c e n d t n u o e d r n r n r v o i o p n i s l r o t i a e a o p o o o e e s e e c t s p p c a , , c c n u c d u c s i m r c d d c r t n e e e 0 1 e a a u n r n o u a = = t a d d o p 5 p l t a i r W ” ” t c c o c p W r W W W , u W u 0 0 c 1 n n n 0 0 a a a a “ “ “ . x n c “ a a 1 g g u u a = a a a a a e u a i a i , a a a f g i f a a a g C C g l a l a l g l g g g g g t t t t t 1 r n r n r r r r v v R R Z v v v v l e e e a R = a o c o a l i i r a i a l a l a r a l e l e r e a e a e l e a l l c c c c l p s s p s s c l s c l s c O p s l Z ; ; ; ; ; ; ; ; ; : ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; s ;
0 2
E T 1 0 E W W 1 , , , W , T N , , ‘ ‘ R R R R R R R R E N 1 0 O 0 E O Z O O O Z 0 0 , D O , O O 0 0 , D D S N D D O D O D S D D O 0 C 0 B D B C N A E A A B T A T A U A A B T 0 T 0 T A O T T T R T T T E T U 0 0 T C T T T R T R T T I N N R E 0 R 0 R N R R C N A S N N R E N E N A C 0 O ' 0 O O O O S O T E O O O U 5 O U 5 O T I O O O U ' 0 1 1 N 0 B P B P . C P P A C S D C C P P . C P . C S I C C P P
F F F W F W F F W W W C O F C O F F W C O F W L L L W W L W L O O W O S V I S V V V S T V S T C V V T V V T V R S T F V V T D U G V I F F F C Q R O R O R O O O T O O T O E O O O O O O O O T O N O O O N E O M T M T M M M B G M B G D M M G M M G M X B G I M M G E E T E N T R E N O D E D N D O A T E N O T R C E I N E S C C I O E U S N C I P D A
O T C U D O R P E D O Ñ E S I D E D A I R E I N E G N I
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 1s = 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
LOOP
EQU
20
ORG 0 MOVLW .15 _______ 1 MOVWF CONTADOR __ 1 DECFSZ CONTADOR ___ 1 GOTO LOOP __________ 2 END
CICLOS DE RELOJ 45 + 2 = 47 3 x 15 = 45
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). 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: Ejemplo:
INICIO CONTADOR 1 = M CONTADOR 2 = N DECREMENTA CONTADOR 2
No
CONTADOR 2 = 0
SÍ
DECREMENTA CONTADOR 1
No
CONTADOR 1 = 0
SÍ
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 CONTADOR 2
LOOP1 LOOP
EQU EQU
20 21
ORG MOVLW MOVWF MOVLW MOVWF DECFS2 GOTO DECFS2 GOTO END
O M CONTADOR 1 N CONTADOR 2 T1= 3x N +2 CONTADOR 2, F LOOP CONTADOR 1, F ___________________1 LOOP, ___________________________2
T 2 = (T 1 + 3) M
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 T 2 + 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 195355
≈
5
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 . . .
LOOP BSF PORTB, 0 CALL RETARDO BCF PORTB, 0 CALL RETARDO GOTO LOOP
Subrutina RETARDO . . . . . . RETURN
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 LIST P=16F873, R=HEX
REG1 REG2 REG3
EQU EQU EQU
20 21 22
LOOP
ORG MVLW TRIS BSF CALL BCF CALL GOTO
0 0 PORTB PORTB,0 RETARDO PORTB,0 RETARDO LOOP
MOVLW MOVWF MOVLW MOVWF MOVLW MOVWF DECFSZ GOTO DECFSZ GOTO DECFSZ GOTO RETURN
.5 REG1 .255 REG2 .255 REG3 REG3,F REP1 REG2,F REP2 REG3,F REP3
RETARDO REP3 REP2 REP1
END
20.
;CONFIGURAR EL PUERTO B TODO COMO SALIDA. ;PONE EN UNO EL BIT 0 DEL PUERTO B. ;LLAMA UN RETARDO DE UN SEGUNDO. ;PONE EN 0 EL BIT 0 DEL PUERTO B. ;LLAMAR RETARDO DE UN SEGUNDO. ;SALTA A LOOP. ;RETARDO DE UN SEGUNDO
;ESTA COMANDO ME DEVUELVE A UN PASO MÁS DE DONDE EL RETARDO FUE LLAMADO ;FIN DEL PROGRAMA.
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 F
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: CONTADOR
LOOP
RETARDO LOOP1
Include LIST P= 16F873, R=Hex EQU
20
ORG MOVLW
0 B’11111110’
TRIS BSF CALL BCF CALL GOTO
PORTB PORTB,0 RETARDO PORTB,0 RETARDO LOOP
MOVLW MOVWF DECFSZ GOTO RETURN END
.166 ;RETARDO DE 500 µs. CONTADOR CONTADOR,F LOOP 1
INGENIERIA DE DISEÑO DE PRODUCTO
;CONFIGURA EL PORTB COMO ENTRADA EXCEPTO RB0 ;PONE EN “1” RB0 ;LLAMA RETARDO DE 500 µs. ;PONE EN “0” RB0. ;LLAMA RETARDO DE 500 µs. ;SALTA A LOOP
;FIN DEL PROGRAMA
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 PASOS 1 2 3 4 1
GIRO A LA IZQUIERDA
Q1
Q2
Q3
Q4
ON OFF OFF OFF ON
OFF ON OFF OFF OFF
OFF OFF ON OFF OFF
OFF OFF OFF ON OFF
PASOS 1 2 3 4 1
Q1
Q2
Q3
Q4
OFF OFF OFF ON OFF
OFF OFF ON OFF OFF
OFF ON OFF OFF OFF
ON 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 0 0 1 1
1 1 0 0 1
0 1 1 0 0
0 0 1 1 0
12 6 3 9 12
INGENIERIA DE DISEÑO DE PRODUCTO
Sentido horario
No
Si
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
50
MICROCONTROLADORES
Programa: Include LIST P=16F873 REG2 REG3
SEC LOOP
HOR
RETARDO REP2 REP1
EQU EQU
20H 21H
ORG MOVLW TRIS MOVLW TRIS BTFSS GOTO MOVLW MOVWF CALL MOVLW CALL MOVLW MOVWF CALL MOVLW MOVWF CALL GOTO MOVLW MOVWF CALL MOVLW MOVWF CALL MOVLW MOVWF CALL MOVLW MOVWF CALL GOTO
0 0 PORT B .255 PORTC PORTC,2 HOR .9 PORT B RETARDO .3 RETARDO .6 PORT B RETARDO .12 PORT B RETARDO SEC .12 PORT B RETARDO .6 PORTB RETARDO .3 PORTB RETARDO .9 PORTB RETARDO SEC
MOVLW MOVWF MOVLW MOVWF DECFSZ GOTO DECFSZ GOTO RETURN END
.132 REG2 .255 REG3 REG3,F REP1 REG2,F REP2
INGENIERIA DE DISEÑO DE PRODUCTO
;CONFIGURAR PUERTO B TODO COMO SALIDA. ;CONFIGURA EL PUERTO C COMO ENTRADA. ;PULSADOR DE SELECCIÓN DE DIRECCION. ;SENTIDO ANTIHORARIO.
;SENTIDO HORARIO.
;FIN DEL PROGRAMA.
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 LIST P=16F873, R=HEX
INICIO LOOP
ORG 0 MOVLW b'00000000' TRIS PORTB MOVLW b'11111111' MOVWF PORTB BCF STATUS,C RLF PORTB,F BTFSS PORTB,7 GOTO INICIO GOTO LOOP END
INGENIERIA DE DISEÑO DE PRODUCTO
; CARGA W CON 00000000 ; CONFIGURA EL PUERTO B COMO SALIDA ; CARGA W CON 11111111 ; ACTIVA TODOS LOS BITS DEL PUERTO B ; PONE EN "0" EL BIT CARRY ; ROTA A LA IZQUIERDA EL PORTB ; PREGUNTA RB7 ESTA EN UNO ; SI RB7 = 0, SALTA A INICIO ; SI RB7 = 1, SALTA A LOOP
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 LIST P= 16F873, R=HEX REG1 REG2 REG3
EQU EQU EQU
20H 21H 22H
LOOP
ORG MOVLW TRIS CLRF BSF CALL BSF RLF
0 0 PORTB PORTB PORTB,0 RETARDO STATUS,C PORTB,F
CALL BTFSS GOTO
RETARDO PORTB,7 REP
LOOP 10
BCF RRF CALL BTFSS GOTO GOTO
STATUS,C PORTB,F RETARDO PORT B,O LOOP 10 LOOP
RETARDO
MOVLW MOVWF MOVLW MOVWF MOVLW MOVWF DECFSZ GOTO DECFSZ GOTO DECFSZ GOTO RETURN
.10 REG1 .132 REG2 .255 REG3 REG3,F REP1 REG2,F REP3 REG1,F REP3
REP
REP3 REP2 REP1
END
INGENIERIA DE DISEÑO DE PRODUCTO
;CONFIGURA EL PUERTO B COMO SALIDA. ;LIMPIA EL PUERTO B. ;PONE EN 1 EL BIT 0 DEL PUERTO B. ;LLAMA UN RETARDO DE UN SEGUNDO. ;COLOCA LA BANDERA DE CARRY EN 1. ;ROTA A LA IZQUIERDA A TRAVES DEL CARRY (EL UNO SE ALMACENA EN F ). ;LLAMA EL RETARDO DE UN SEGUNDO. ;SI EL BIT7 DEL PUERTO B ES 0. ;SALTA A REP ;PONE EN CERO (0) EL CARRY ;ROTA A LA DERECHA A TRAVÉS DE CARRY. ;LLAMA RETARDO DE UN SEGUNDO
;FIN DEL PROGRAMA
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.
NUMERO RB7 0 1 2 3 4 5 6 7 8 9
X X X X X X X X X X
RB6 g 0 0 1 1 1 1 1 0 1 1
CODIGO 7 SEGMENTOS RB5 RB4 RB3 RB2 f e d c 1 0 0 0 1 1 1 0 1 1
1 0 1 0 0 0 1 0 1 0
1 0 1 1 0 1 1 0 1 0
1 1 0 1 1 1 1 1 1 1
RB1 b
RB0 a
1 1 1 1 1 0 0 1 1 1
1 0 1 1 0 1 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 TABLA
CARGAR EN W VALOR A MOSTRAR LLAMAR TABLA DE DATOS
PORTB
MOSTRAR VALOR EN PORTB
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
CALL MOVWF . TABLA
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
0
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
SÍ
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 GOTO CALL BTFSS GOTO GOTO .
PORTC,1 LOOP RET200ms PORTC,1 FALSO INCREM
INGENIERIA DE DISEÑO DE PRODUCTO
SI RC1 = 1, IGNORE LA SIGUIENTE INSTRUCCIÓN SALTA A LOOP LLAMA RETARDO DE 200 MS SI RC1 = 1, IGNORE LA SIGUIENTE INSTRUCCIÓN SALTA A FALSO SALTA A INCREM
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 List p=16f873
CONTADOR
EQU
20
REG REG REG
EQU EQU EQU
21 22 23
ORG MOVLW TRIS MOVLW MOVWF MOVF CALL MOVWF CALL INCF MOVLW XORWF BTFSC GOTO GOTO
00 0 PORTB ;CONFIGURAR EL PORTB COMO SALIDA 0 CONTADOR ;CARGAR EL CONTADOR CON “0” CONTADOR,W;CONTADOR=W TABLA ;LLAMAR TABLA PORTB ;LLEVAR VALOR 7 SEGMENTOS A PORTB RET1S ;LLAMA RETARDO 1S. CONTADOR,F .10 ;COMPARA CONTADOR CON 10 CONTADOR,W STATUS,2 LOOP INICIO
MOVLW MOVWF MOVLW MOVWF MOVLW MOVWF DECFSZ GOTO
.10 REG1 .132 REG2 .255 REG3 REG3,F REP1
DECFSZ GOTO DECFSZ GOTO RETURN
REG2,F REP2 REG1,F REP3
ADDWF RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW END
PCL,F B’ 00111111’ B’ 00000110’ B’ 01011011’ B’ 01001111’ B’ 01100110’ B’ 01101101’ B’ 01111100’ B’ 00000111’ B’ 01111111’ B’ 01100111’
INICIO LOOP
RET1S REP3 REP2 REP1
TABLA
INGENIERIA DE DISEÑO DE PRODUCTO
; PCL + W ; CODIGO PARA EL 0 ; CODIGO PARA EL 1 ; CODIGO PARA EL 2 ; CODIGO PARA EL 3 ; CODIGO PARA EL 4 ; CODIGO PARA EL 5 ; CODIGO PARA EL 6 ; CODIGO PARA EL 7 ; CODIGO PARA EL 8 ; CODIGO PARA EL 9 ;FIN DEL PROGRAMA.
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 CALL MOVWF BSF BCF CALL MOVF CALL MOVWF BSF BCF CALL RETURN
DECE,W TABLA PORTB PORTC,4 PORTC,5 RETARDO UNID,W TABLA PORTB PORTC,5 PORTC,4 RETARDO
; CARGA EN W EL VALOR DE LAS DECENAS ; LLAMA TABLA ; LLEVA DECENAS A PORTB ; ACTIVA TRANSISTOR DE LAS DECENAS ; DESACTIVA TRANSISTOR DE LAS UNIDADES ; LLAMA RETARDO DE 774 MICROSEGUNDOS ; CARGA EN W EL VALOR DE LAS UNIDADES ; LLAMA TABLA ; LLEVA UNIDADES A PORTB ; DESACTIVA TRANSISTOR DE LAS DECENAS ; ACTIVA TRANSISTOR DE LAS UNIDADES ; LLAMA RETARDO DE 774 MICROSEGUNDOS ; RETORNA DE LA SUBRUTINA
TABLA
ADDWF RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW
PCL,F B’ 00111111’ B’ 00000110’ B’ 01011011’ B’ 01001111’ B’ 01100110’ B’ 01101101’ B’ 01111100’ B’ 00000111’ B’ 01111111’ B’ 01100111’
; PCL + W ; CODIGO PARA EL 0 ; CODIGO PARA EL 1 ; CODIGO PARA EL 2 ; CODIGO PARA EL 3 ; CODIGO PARA EL 4 ; CODIGO PARA EL 5 ; CODIGO PARA EL 6 ; CODIGO PARA EL 7 ; CODIGO PARA EL 8 ; CODIGO PARA EL 9
RETARDO
MOVLW MOVWF DECFSZ GOTO RETURN
.255 REG1 REG1,F RET1
RET1
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:
R12 VALOR 1 VALOR 2
INCLUDE LIST P=16F873, R = HEX EQU EQU EQU
20H 21H 22H
MOVLW TRIS MOVLW TRIS MOVLW MOVWF MOVLW MOVWF MOVF CALL
0 PORTB 0 PORTC .7 VALOR 2 .5 VALOR 1 VALOR 1,W TABLA
MOVWF MOVLW MOVWF
PORTB .1 PORT C
CALL MOVF CALL
RETARDO VALOR 2,W TABLA
MOVWF MOVLW MOVWF CALL GOTO
PORT B .2 PORTC RETARDO LOOP1
MOVLW MOVWF DECFSZ GOTO
.255 R12 R12,F REP
;RETARDO DE 1 mS APROX.
TABLA
ADDWF RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW
PCL,F B’ 00111111’ B’ 00000110’ B’ 01011011’ B’ 01001111’ B’ 01100110’ B’ 01101101’ B’ 01111100’ B’ 00000111’ B’ 01111111’ B’ 01100111’
; PCL + W ; CODIGO PARA EL 0 ; CODIGO PARA EL 1 ; CODIGO PARA EL 2 ; CODIGO PARA EL 3 ; CODIGO PARA EL 4 ; CODIGO PARA EL 5 ; CODIGO PARA EL 6 ; CODIGO PARA EL 7 ; CODIGO PARA EL 8 ; CODIGO PARA EL 9
RETARDO
MOVLW MOVWF DECFSZ GOTO RETURN
.255 REG1 REG1,F RET1
LOOP 1
RETARDO REP
RET1
END
INGENIERIA DE DISEÑO DE PRODUCTO
;CONFIGURAR EL PERTO B TODO COMO SALIDA. ;CONFIGURA EL PUERTO C COMO SALIDA. ;CARGA W CON 7. ;LLEVA 7 A VALOR 2. ;CARGA W CON 5. ;LLEVA 5 A VALOR 1. ;LLEVA VALOR 1 A W. ;LLAMA A TABLA PARA ENCONTRAR EL VALOR 7 SEGMENTOS DEL NUMERO 5. ;LLEVA EL VALOR 7 SEG AL PUERTO B. ;HABILITA EL TRANSISTOR CORRESPONDIENTE A VALOR1 (RC0) ;LLEVA VALOR 2 A W. ;CONVIERTE VALOR 2 A CODIGO 7 SEGMENTOS. ;SACA AL PUERTO B EL VALOR 2. ;HABILITA EL TRANSISTOR DE VALOR2 (RC1).
;FIN DEL PROGRAMA.
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 0 1 1 1 1
0 0 1 1 0 0 1 1
0 1 0 1 0 1 0 1
1:2 1:4 1:8 1:16 1:32 1:64 1:128 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 GOTO ORG GOTO INICIO
0 Inicio 4 INTER
: : BSF
STATUS,5
; CAMBIAR AL BANCO 1 DE MEMORIA
BSF OPTION – REG, INTEDG BCF STATUS,5 BCF INTCON, INTF BSF INTCON, GIE BSF INTCON, INTE
; SELECCIONA FLANCO DE SUBIDA PARA LA INTERRUPCIÓN POR RB0 ;CAMBIAR AL BANCO 0 DE MEMORIA ; LIMPIA EL BIT SEÑALIZADOR DE INTERRUPCIÓN POR RB0 ; HABILITA LAS INTERRUPCIONES EN FORMA GLOBAL ; 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 CALL Mostrar
Para la interrupción: INICIO Incrementar Unidades
Unidades = 10
Si
Decenas = 9
NO
Si
Unidades = 0
Incrementar Decenas
Decenas = 0
Unidades = 0
Return INGENIERIA DE DISEÑO DE PRODUCTO
70
MICROCONTROLADORES
Programa: UNID DECE REG1 REG2 REG3
INICIO
Include LIST P=16F873, R=HEX EQU EQU EQU EQU EQU
20 21 23 24 25
ORG GOTO ORG GOTO
0 INICIO 4 INTER
ORG 6 MOVLW TRIS
1 PORTB
MOVLW 0 TRIS PORTC BSF STATUS,5 BSF OPTION_REG,INTEDG
;SALTA A INICIO ; SALTA A EJECUTAR LA INTERRUPCIÓN
; CONFIGURA EL PORTB COMO SALIDA Y RB0 COMO ENTRADA
BSF BCF BSF
; CONFIGURA PORTC COMO SALIDA ; CAMBIA AL BANCO 1 DE MEMORIA ;SELECCIONA FLANCO DE SUBIDA PARA LA INTERRUPCIÓN STATUS,5 ; CAMBIA AL BANCO 0 DE MEMORIA INTCON,INTF ; BORRA SEÑALIZADOR DE INTERRUPCIÓN INTCON,INTE ; HABILITA LA INTERRUPCIÓN EXTERNA POR RB0
BSF CLRF CLRF CALL GOTO
INTCON,GIE UNID DECE MOSTRAR LOOP
MOSTRAR
MOVF CALL MOVWF BSF BCF CALL MOVF CALL MOVWF BSF BCF CALL RETURN
DECE,W TABLA PORTB PORTC,4 PORTC,5 RETARDO UNID,W TABLA PORTB PORTC,5 PORTC,4 RETARDO
RETARDO
MOVLW MOVWF DECFSZ GOTO
0FFH REG1 REG1,F REP
LOOP
REP
; HABILITA LAS INTERRUPCIONES ; PONE EN CERO LAS UNIDADES ; PONE EN CERO LAS DECENAS
RETURN INGENIERIA DE DISEÑO DE PRODUCTO
71
MICROCONTROLADORES
TABLA
ADDWF RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW
INTER
BCF INTCON,INTE BCF INTCON,INTF
DECREM LOOP1
RET100 LOOP3 LOOP2
PCL,F B’ 00111111’ B’ 00000110’ B’ 01011011’ B’ 01001111’ B’ 01100110’ B’ 01101101’ B’ 01111100’ B’ 00000111’ B’ 01111111’ B’ 01100111’
; PCL + W ; CODIGO PARA EL 0 ; CODIGO PARA EL 1 ; CODIGO PARA EL 2 ; CODIGO PARA EL 3 ; CODIGO PARA EL 4 ; CODIGO PARA EL 5 ; CODIGO PARA EL 6 ; CODIGO PARA EL 7 ; CODIGO PARA EL 8 ; CODIGO PARA EL 9
; DESHABILITA INTERRUPCION POR RB0 ; BORRA SEÑALIZADOR DE INTERRUPCION ; POR RB0
INCF MOVLW XORWF BTFSS GOTO
UNID,F .10 UNID,W STATUS,Z LOOP1
MOVLW XORWF BTFSS GOTO
.9 DECE,W STATUS,Z DECREM
CLRF CLRF GOTO
UNID DECE LOOP1
INCF CLRF CALL BSF RETFIE
DECE,F UNID RET100 INTCON,INTE ; HABILITA INTERRUPCIONES POR RB0 ; RETORNA DE LA INTERRUPCIÓN
MOVLW MOVWF MOVLW MOVWF CALL DECFSZ GOTO
2 REG3 .255 REG2 MOSTRAR REG2,F LOOP2
DECFSZ GOTO
REG3,F LOOP3
RETURN END
INGENIERIA DE DISEÑO DE PRODUCTO
;FIN DEL PROGRAMA
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 V REF = +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 V REF+ = +5V y V REF- 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: ADRESL: ADCONO: ADCONI:
Parte alta del resultado de la conversión Parte baja del resultado de la conversión Registro de control 0 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
-------
PCFG2:PCFG0 000 001 010 011 100 101 11X
RA0 A A A A A A D
-------
-------
RA1 A A A A A A D
RA2 A A A A D D D
PCFG3
RA5 A A A A D D D
PCFG2
PCFG1
RA3 A V REF A V REF A V REF D
PCFG0
V REF V DD RA3 V DD RA3 V DD RA3 -------
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 LIST P=16F873, R=HEX
REP3
REG1 REG2 REG3 REG4
EQU EQU EQU EQU
ORG MOVLW TRIS TRIS BSF MOVLW
0 0 PORTB PORTC STATUS,5 80
MOVWF BCF MOVLW
ADCON1 STATUS,5 1
MOVWF CALL
ADCON0 RETARDO
INGENIERIA DE DISEÑO DE PRODUCTO
20 21 22 23
; CONFIGURAR EL PORTB COMO SALIDA ; CONFIGURAR EL POTRC COMO SALIDA ; CAMBIA AL BANCO 1 DE MEMORIA ; CONFIGURA EL PORTA COMO ; ENTRADAS ANÁLOGAS ; CAMBIA AL BANCO 0 DE MEMORIA ; CONFIGURA CANAL 0, FRECUENCIA, Y ; ENCIENDE EL CONVERSOR A/D ; LLAMA RETARDO DE 767 MICROSEGUNDOS
77
MICROCONTROLADORES
REP1
BSF
ADCON0,2
; INICIA LA CONVERSIÓN
REP
BTFSC GOTO MOVF
ADCON0,2 REP ADRESH,W
MOVWF BSF MOVF
PORTC STATUS,5 ADRESL,W
BCF MOVWF CALL GOTO
STATUS,5 PORTB RETD REP3
; PREGUNTA SI YA TERMINO LA CONVERSIÓN ; SALTA A REP SI NO HA TERMINADO ; PASA EL VALOR DE ADRESH A W (BITS ; MÁS SIGNIFICATIVOS DE LA CONVERSIÓN) ; MUESTRA EN EL PORTC ; CAMBIA AL BANCO 1 DE MEMORIA ; PASA EL VALOR DE ADRESL A W (BITS ; MENOS SIGNIFICATIVOS DE LA CONVERSIÓN) ; CAMBIA AL BANCO 0 DE MEMORIA ; MUESTRA EN EL PORTC ; LLAMA RETARDO DE 100 MILISEGUNDOS ; SALTA A REP3 (COMENZAR DE NUEVO ; LA CONVERSIÓN)
MOVLW MOVWF DECFSZ GOTO
.255 REG4 REG4,F REP4
RETARDO REP4
RETURN RETD REP6 REP2 REP7
MOVLW MOVWF MOVLW MOVWF MOVLW MOVWF DECFSZ GOTO DECFSZ GOTO DECFSZ GOTO RETURN
2 REG1 84H REG2 0FFH REG3 REG3,F REP7 REG2,F REP2 REG1,F REP6
END
INGENIERIA DE DISEÑO DE PRODUCTO
; FIN DEL PROGRAMA.
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
EQUIPO
Bus de 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
GND
Rx
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
1
MSB
2
Bit de Start
3
4
5
6
7
8
Bit de 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 Rx en bajo
No
Si
Call retardo 1.5 bits Contador = 8 Carry = 0
Esta la línea Rx en bajo
No
Carry = 1
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 List P=16F873, R = HEX CBLOCK 20H CONT,DELAY,REGTX,REGRX,VALOR ENDC
#DEFINE #DEFINE
REPETIR
TRANSMISOR PORTC,7 RECEPTOR PORTC,6 ORG BSF MOVLW MOVWF CLRF BCF BSF MOVLW CALL MOVWF CALL MOVF MOVWF MOVLW SUBWF CALL MOVWF CALL GOTO
0 STATUS,5 B'01111111' TRISC TRISB STATUS,5 TRANSMISOR 0 TABLA PORTB RECEP REGRX,W VALOR .48 VALOR,W TABLA PORTB TRANS REPETIR
;RUTINA DE TRANSMISION TRANS
TOTRO
MOVWF MOVLW MOVWF BCF CALL BCF BCF RRF BTFSC BSF CALL DECFSZ GOTO BSF CALL RETURN
REGTX .8 CONT TRANSMISOR RETAR1 TRANSMISOR STATUS,C REGTX,F STATUS,C TRANSMISOR RETAR1 CONT,F TOTRO TRANSMISOR RETAR1
INGENIERIA DE DISEÑO DE PRODUCTO
;DEFINO DATO DE 8 BITS ;INICIALIZO BIT DE START ;LLAMO RUTINA DE 1 BIT ;TX = 0 ;CARRY = 0 ;ROTO REGISTRO DE TRANSMISION ;PREGUNTO SI CARRY = 0 ;NO ES CERO, ENTONCES TX = 1 ;SI ES CERO, LLAMO RUTINA DE 1 1 BIT ;DECREMENTO CONTADOR DE # DE BITS ;CONTADOR NO ES CERO, TRANSMITO DATO ;INICIALIZO BIT DE STOP ;LLAMO RUTINA DE 1 BIT ;RETORNO A PROGRAMA PPAL
84
MICROCONTROLADORES
;RUTINA DE RECEPCION DE DATOS RECEP
ROTRO
CLRF BTFSC GOTO CALL MOVLW MOVWF BCF BTFSC BSF RRF CALL DECFSZ GOTO RETURN
REGRX RECEPTOR RECEP RETAR2 .8 CONT STATUS,C RECEPTOR STATUS,C REGRX,F RETAR1 CONT,F ROTRO
;ASEGURO LECTURA CORRECTA ;PREGUNTO RX = 0 (INICIO COMUNICACION) ;NO ES CERO (PREGUNTO NUEVAMENTE) ;SI ES CERO, LLAMO RUTINA DE BIT Y MEDIO ;DEFINO DATOS DE 8 BITS ;CARRY = 0 ;PREGUNTO LINEA DE RX = 0 ;NO ES CERO, ENTONCES CARRY = 1 ;EMPAQUETO DATO EN REGISTRO DE RECEPC ;LLAMO RUTINA DE 1 BIT ;DECREMENTO CONTADOR DE # DE BITS ;CONTINUA LA RECEPCION HASTA CONT = 0 ;CONT = 0, RETORNO A PROGRAMA PPAL
;RUTINA DE RETARDO PARA TIEMPO DE UN BIT A 9600 BPS RETAR1 CICLO
MOVLW MOVWF DECFSZ GOTO RETURN
.32 DELAY DELAY,F CICLO
;RUTINA DE RETARDO PARA TIEMPO DE UN BIT Y MEDIO A 9600 BPS RETAR2 CICLO1
TABLA
MOVLW MOVWF DECFSZ GOTO RETURN
.50 DELAY DELAY,F CICLO1
ADDWF RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW
PCL,F B’ 00111111’ B’ 00000110’ B’ 01011011’ B’ 01001111’ B’ 01100110’ B’ 01101101’ B’ 01111100’ B’ 00000111’ B’ 01111111’ B’ 01100111’
; PCL + W ; CODIGO PARA EL 0 ; CODIGO PARA EL 1 ; CODIGO PARA EL 2 ; CODIGO PARA EL 3 ; CODIGO PARA EL 4 ; CODIGO PARA EL 5 ; CODIGO PARA EL 6 ; CODIGO PARA EL 7 ; CODIGO PARA EL 8 ; CODIGO PARA EL 9
END
INGENIERIA DE DISEÑO DE PRODUCTO
85