Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
UNIVERSIDAD EAFIT
DEPARTAMENTO DE INGENIERIA DE
DISEÑO DE PRODUCTO
MEDELLIN
2002
TABLA DE CONTENIDO
1. INTRODUCCIÓN
2. CONCEPTOS BÁSICOS 2
3. COMPUERTAS LÒGICAS 7
4. FUNCIONES LÒGICAS CON BYTES 9
5. CIRCUITO COMBINACIONAL 10
6. LATCHES 13
7. FLIP-FLOP 13
8. MEMORIAS 16
9. ARITMÉTICA BINARIA 21
10. INTRODUCCIÓN AL MICROCONTROLADOR 23
11. EXPLICACIÓN DEL REGISTRO STATUS 27
12. SINTAXIS DE LAS INSTRUCCIONES 30
13. DIRECTIVAS PARA HACER UN PROGRAMA EN MICROCONTROLADOR 31
14. EJEMPLOS SENCILLOS DE DIAGRAMAS DE FLUJO 33
15. CONFIGURACIÓN DE LOS PUERTOS 37
16. EJEMPLOS SENCILLOS CON ENTRADAS Y SALIDAS DE DATOS 38
17. RETARDOS 40
18. MANEJO DE SUBRRUTINAS 44
19. EJEMPLO UTILIZANDO RETARDOS 45
20. GENERACIÓN DE TONOS CON MICROCONTROLADORES 46
21. MOTORES PASO A PASO 48
22. EJEMPLO DE MANEJO DEL MOTOR PASO A PASO 49
23. EXPLICACIÓN DE LAS INSTRUCCIONES DE ROTACIÒN 52
24. MANEJO DE DISPLAY 7 SEGMENTOS Y ANTIREBOTE 55
25. TRABAJOS CON PULSADORES 57
26. EJEMPLO CON MANEJO DE DISPLAY 59
27. MULTIPLEXAJE DE DISPLAY 61
28. EJEMPLO DE MULTIPLEXAJE 64
29. INTERRUPCIONES 66
30. EJEMPLO UTILIZANDO INTERRUPCION POR RB0 70
31. CONVERSOR ANALOGO / DIGITAL (A/D) 73
32. EJEMPLO DE CONVERSOR ANÁLOGO DIGITAL 77
33. COMUNICACIÓN SERIAL 79
34. EJEMPLO COMUNICACIÓN SERIAL 83
BIBLIOGRAFIA
1 INTRODUCCIÓN
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:
SISTEMAS DE NUMERACIÓN
BINARIO 27 26 25 24 23 22 21 20
DECIMAL ...........103 102 101 100
HEXADECIMAL .............163 162 161 160
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
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
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.
........23 22 21 20
La palabra bit es una contracción de las palabras en Inglés binary digit (Dígito
Binario). Cada posición de un número binario se conoce como bit. El número 10110
es un número de cinco bits. El primer lugar del extremo derecho recibe el nombre de
bit menos significativo (o LSB por sus siglas en Inglés), mientras que el lugar que
está en el extremo izquierdo se conoce como bit más significativo (MSB por sus
siglas en Inglés).
1 0 1 1 0
MSB LSB
1 palabra = 16 bits
1 byte = 8 bits
1 nible = 4 bits
1 byte = 1 0 1 0 1100
Este sistema es en base 16, lo que significa que para cada columna es posible
escoger uno de entre 16 dígitos.
Donde A = 10 D = 13
B = 11 E = 14
C = 12 F = 15
0F
10
.
.
.
1F
20
21
.
.
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
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
RESPUESTA 1 1 0 0 1 0 12
2B616 decimal ?
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.
1011 1100
B C
10111100 = BC16
FF16 Binario ?
F F
1111 1111
FF16 = 11111111
0……….0000
1……….0001
.
.
.
9……….1001
0010 0101
2 5
3. COMPUERTAS LÓGICAS
3.1 Compuerta AND: La compuerta AND genera una salida ALTO solo cuando
todas las entradas están en nivel ALTO.
A X A B X
B 0 0 0
0 1 0
1 0 0
X=A*B
1 1 1
A A B X
X
B 0 0 0
0 1 1
X=A+B 1 0 1
1 1 1
A X A X
X=A 0 1
1 0
A X
X=A
Cuando cualquiera de las entradas está a nivel bajo, la salida se pondrá a nivel
ALTO.
La compuerta NOR genera una salida a nivel bajo cuando cualquiera de las entradas
esta a nivel alto.
A X X = AB + AB A B X
B
0 0 0
0 1 1
1 0 1
1 1 0
A X X = AB + A.B
A B X
B
0 0 1
0 1 0
1 0 0
1 1 1
La salida se pone a nivel ALTO solo cuando las dos entradas están a niveles lógicos
iguales.
Así como se forman compuertas lógicas con bits también es posible hacer funciones
lógicas con bytes.
AND 1 0 1 1 0 1 1 1
0 0 0 0 1 1 1 1
0 0 0 0 0 1 1 1
OR 1 0 1 1 0 1 1 1
1 1 1 1 0 1 1 0
1 1 1 1 0 1 1 1
5. CIRCUITO COMBINACIONAL
A
B
X = A*B + A*B
La salida es uno si A = 1 y B = 0, ó si A = 1 y B = 1
23 = 8
Problema:
En este caso cada socio representa una entrada, por los tanto el numero de
posibles combinaciones es 24 = 16
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
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
Nota: Dos celdas son adyacentes si entre una y otra solo cambia una
variable. Una celda es adyacente con cualquiera de sus lados, Izquierda,
derecha, arriba o abajo.
Se debe tratar de tener la menor cantidad de grupos con el mayor numero
de unos (1) posible. Un “1” puede pertenecer a varios grupos.
CD
AB 00 01 11 10
00 0 0 1 0 BD
01 0 1 1 0
11 0 1 1 1 ACD
10 0 1 1 0
AD CD
Sal = BD + AD + CD + ABC
La solución final al circuito combinacional es:
Socios A B C D
Salida
6. LATCHES
S
Q
S R Q
0 0 ESTADO PROHÍBIDO
0 1 0
Q 1 0 1
R
1 1 NO CAMBIA
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.
Flanco de Flanco de
Subida Bajada
Tabla de Verdad
Ck S R Q
X 0 0 Q NO CAMBIA
0 1 0 RESET
1 0 1 SET
1 1 ? ESTADO PROHIBIDO
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.
PRIMER CIRCUITO
1K
1K
74LS 74
1K
1K
8. MEMORIAS
0
1
Dirección
2
3
00 1 2 3 4 5 6 7
Bits
a) Memoria RAM
b) Memoria ROM
c) Memoria EPROM
d) Memoria EEPROM
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.
Los pines del A0 al A10 permiten escoger la posición de memoria que se desee leer
o escribir; los pines O0 al O7 son los datos (1 byte); las líneas OE y CE son
habilitadores que nos permiten leer y escribir en la memoria la línea; y VPP se utiliza
para grabar la memoria.
330
O7 O6 O5 O4 O3 O2 O1 O0
0 1 1 1 0 1 1 0
g f e d c b a
9. ARITMÉTICA BINARIA
Ejemplos
100 + 10
100 + 4+
10 2
110 6
10011100 + 00110011
11
10011100 + 156 +
00110011 51
11001111 207
1 11 1
10101011 +
01101100
1 00111111
Bit de acarreo
1 0 1 1 0 0 1 0 Numero Binario
0 1 0 0 1 1 0 1 Complemento a uno
Para restar dos números binarios se calcula el complemento a dos del sustraendo y
se suman el mimuendo y el complemento a dos del sustraendo. Si genera un bit de
acarreo, el resultado es positivo o cero, sino lo genera, el resultado es negativo.
Ejemplo: Restar
10111001 - 01000010
Minuendo Sustraendo
10111001+ 185 -
10111110 66
1 01110111 119
Numero Positivo
Ejemplo: Restar
10111001 - 11100011
10111001+ 185 -
00011101 227
11010110 - 42
Numero Negativo
- 42
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.
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.
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.
NOTA:
Los tres bits de menos peso son los señalizadores de ciertas condiciones en las
operaciones lógicas – aritméticas.
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:
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.
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)
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.
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.
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.
Ejemplo:
Include <P16F873.INC>
LIST P= 16F873, R=Hex
ORG 0
MOVLW 05 ;w=5
MOVWF OPERANDO1 ; w = OPERANDO1
MOVLW 02 ;w=2
MOVWF OPERANDO2 ; w = OPERANDO2
MOVF OPERANDO1 ; w = OPERANDO1
ADDWF OPERANDO2,W ; w = w+OPERANDO2
MOVWF RESULTADO ; w = RESULTADO
Include<P16F873.INC>
LIST P=16F873, R=HEX
CONTADOR EQU 20
ORG 0
MOVLW 5 ; El Programa se repite 5 veces
MOVWF CONTADOR ; Carga contador con 5
LOOP NOP ; Programa
NOP ; Programa
NOP ; programa
DECFSZ CONTADOR,F : Decrementa contador e ignora la siguiente
; instrucción si el contador es cero
GOTO LOOP ; salta a LOOP
END ; Fin del programa
Para comparar si dos números son iguales se utiliza la instrucción XORWF f,d (XOR
entre W y el registro f), si los dos números son iguales el resultado de la XORWF
será cero y la bandera Z del registro de estado se pone en “1”
Include<P16F873.INC>
LIST P=16F873, R=HEX
NUMERO 1 EQU 20
ORG 0
MOVLW .10 ; Carga W con 15
MOVWF NUMERO1 ; Lleva 15 a NUMERO1
MOVLW .15 ; Carga W con 15
XORWF NUMERO1,W ; Realiza una XOR entre W y NUMERO1
BTFSS STATUS,Z ; Pregunta si el bit Z del registro de
; estado esta en uno
GOTO NOIGUAL ; Salta a NOIGUAL
GOTO IGUAL ; Salta a IGUAL
CONTADOR EQU 20
CONTADOR=0
ORG 0
INICIO MOVLW 0 ;carga W con o
MOVWF CONTADOR ;lleva W al contador
INCREMENTAR CONTADOR
LOOP INCF CONTADOR,F ;incrementa contador
MOVLW .15
XORWF CONTADOR,W ; XOR entre W y contador.
BTFSS STATUS,Z ;si Z=1 salta una instrucción.
GOTO LOOP SI NO
Contador=15
GOTO INICIO
END
MULTIPLICADOR EQU 21
C argar m ultiplicador
RESULTADO EQU 22
Carga resultado=0
ORG 0
MOVLW .X R esultado=
MOVWF MULTIPLICANDO resultado+m ultiplicando
MOVLW .Y
MOVWF MULTIPLICADOR D ecrem enta m ultiplicador
MOVLW .0
MOVWF RESULTADO
LOOP MOVF MULTIPLICANDO,W NO M ultiplicador=0
ADDWF RESULTADO,F
DECFSZ MULTIPLICADOR,F SI
GOTO LOOP EN D
END
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:
1 RB0
1 RB1
Entrada
1 RB2
1 RB3
0 RB4
0 RB5
Salida
0 RB6
0 RB7
Configurar Puertos
Port B = 0
Si Rc 2 = 0 ?
No
RB 0 = 0 RB 0 = 1
Programa:
Include <P16F873. INC> ;LA INSTRUCCIÓN INCLUDE ME CARGA UN ARCHIVO
LIST P = 16873 = HEX DONDE SE ENCUENTRAN TODOS LOS REGISTROS
CON SUS RESPECTIVAS DIRECCIONES.
Programa
INCLUDE <P16F873.INC>
Diagrama de flujo
LIST P=16F873, R=HEX
CONTADOR EQU 20
ORG 0 INICI
MOVLW B'00000001‘ ;carga W con 00000001
TRIS PORTC ;configurar puertoB RCO como entrada
MOVLW B'00000000‘ ; carga W con 00000000
TRIS PORTB ;configurar puertoB como salida
CONTADOR=0
INICIO MOVLW .0 ;carga W con “0”
MOVWF CONTADOR ;lleva “0” de W a contador
MOVWF PORTB ;lleva “0” de W a puertoB SI NO
PUERTO BTFSC PORTC,0 ;pregunta si RC0=1
GOTO ASCENDENTE ;si RC0=0, salta a ascendente RC0=1
MOVF CONTADOR,W :si RC0=1, lleva contador a W
BTFSC STATUS,Z ;pregunta por Z=0
GOTO DESCENDENTE ;salta a descendente
DECF CONTADOR,1 ;si Z=1,decrementa contador
MOVF CONTADOR,0 ;carga W con contador
MOVWF PORTB ;lleva “contador” de W a puertoB SI SI
GOTO PUERTO ;salta a puerto Cont=15 Cont=0
DESCENDENTE MOVLW .15 ;carga W con .15
MOVWF CONTADOR ;lleva .15 de W a contador
GOTO PUERTO ;salta a puerto NO NO
ASCENDENTE MOVLW .15 ;carga W con .15
Cont=1
XORWF CONTADOR,W ;OR exclusiva de W y contador
BTFSC STATUS,Z ;pregunta por Z=0
GOTO INICIO ;salta a inicio Dec cont
INCF CONTADOR,1 ;Z=1,incrementa contador Inc cont
MOVF CONTADOR,W ;lleva contador a W
MOVWF PORTB ;lleva “contador” de W a puertoB
GOTO PUERTO ;salta a puerto
END
17. RETARDOS
INICIO
Contador = 15
Decremento de
Contador
No Contador = 0
Si
FIN
Programa:
CONTADOR EQU 20
CICLOS DE RELOJ
ORG 0
MOVLW .15 _______ 1
MOVWF CONTADOR __ 1 45 + 2 = 47
LOOP DECFSZ CONTADOR ___ 1
3 x 15 = 45
GOTO LOOP __________ 2
END
LOOP, en este caso lo hace 15 veces, ya que con este valor se carga inicialmente el
contador, se puede ver que las instrucciones: DECFSZ CONTADOR,F y GOTO
LOOP se ejecutan 15 veces y se demoran 3 ciclos de reloj, por lo tanto, 3 (ciclos de
reloj) x 15 (veces que se repite), nos da como resultado 45, además las
instrucciones MOVLW .15 y MOVWF CONTADOR solo se ejecuta una vez.
En total el tiempo de ejecución será 45 + 2 = 47 ciclos de reloj, es decir 47µs.
El numero máximo con el que se puede cargar un contador (registro de memoria) es
255 ya que cada posición de memoria es de 8 bits.
Para calcular el tiempo total de ejecución del programa se utiliza la formula:
T = 3 x N +2, donde N es el valor inicial que se le asigna al contador, esto significa
que el retardo máximo que se puede conseguir con un solo registro, es:
3 x 255 + 2 = 767µs.
Cuando se quiere retardos de tiempos mayores se utilizan 2 o 3 contadores
(registros).
Ejemplo: se quiere hacer un retardo de 40 ms (milisegundos) = 40.000 µs
(microsegundos) siempre se debe pasar el tiempo a microsegundos.
Para generar retardos mayores a 767 microsegundos utilizamos dos contadores y el
diagrama de flujo en el siguiente:
INICIO
CONTADOR 1 = M
CONTADOR 2 = N
DECREMENTA
CONTADOR 2
No CONTADOR 2 = 0
SÍ
DECREMENTA
CONTADOR 1
No CONTADOR 1 = 0
SÍ
FIN
Programa:
Include < P16F873. INC>
LIST P=16F873, R = HEX
CONTADOR 1 EQU 20
CONTADOR 2 EQU 21
ORG O
MOVLW M
MOVWF CONTADOR 1
LOOP1 MOVLW N
MOVWF CONTADOR 2
T1=3x N+2
LOOP DECFS2 CONTADOR 2, F
T 2 = (T 1 + 3) M
GOTO LOOP
DECFS2 CONTADOR 1, F ___________________1
GOTO LOOP, ___________________________2
END
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
Como se quiere un (1) segundo = 1000000 µs, para calcular L solo dividimos
1000000 = 5.09 ≈ 5
195355
T3 = 196355 x 5 = 981775
El tiempo total es T3 + 2 = 981775 + 2 = 981777
Si se cambian los valores de L, M y N lógicamente el retardo cambia, sin embargo se
siguen aplicando las mismas formulas.
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.
Configurar Puertos
RB 0 = 0
Retardo 1 segundo
RB 0 = 1
Retardo 1 segundo
Programa:
Include <P16F873.INC>
LIST P=16F873, R=HEX
REG1 EQU 20
REG2 EQU 21
REG3 EQU 22
ORG 0
MVLW 0
TRIS PORTB ;CONFIGURAR EL PUERTO B TODO COMO SALIDA.
LOOP BSF PORTB,0 ;PONE EN UNO EL BIT 0 DEL PUERTO B.
CALL RETARDO ;LLAMA UN RETARDO DE UN SEGUNDO.
BCF PORTB,0 ;PONE EN 0 EL BIT 0 DEL PUERTO B.
CALL RETARDO ;LLAMAR RETARDO DE UN SEGUNDO.
GOTO LOOP ;SALTA A LOOP.
RETARDO MOVLW .5 ;RETARDO DE UN SEGUNDO
MOVWF REG1
REP3 MOVLW .255
MOVWF REG2
REP2 MOVLW .255
MOVWF REG3
REP1 DECFSZ REG3,F
GOTO REP1
DECFSZ REG2,F
GOTO REP2
DECFSZ REG3,F
GOTO REP3
RETURN ;ESTA COMANDO ME DEVUELVE A UN PASO
MÁS DE DONDE EL RETARDO FUE LLAMADO
END ;FIN DEL PROGRAMA.
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
Inicio
Activar Salida
Desactivar Salida
Programa:
Include <P16F873.INC>
LIST P= 16F873, R=Hex
CONTADOR EQU 20
ORG 0
MOVLW B’11111110’ ;CONFIGURA EL PORTB COMO ENTRADA
EXCEPTO RB0
TRIS PORTB
LOOP BSF PORTB,0 ;PONE EN “1” RB0
CALL RETARDO ;LLAMA RETARDO DE 500µs.
BCF PORTB,0 ;PONE EN “0” RB0.
CALL RETARDO ;LLAMA RETARDO DE 500µs.
GOTO LOOP ;SALTA A LOOP
RETARDO MOVLW .166 ;RETARDO DE 500µs.
MOVWF CONTADOR
LOOP1 DECFSZ CONTADOR,F
GOTO LOOP 1
RETURN
END ;FIN DEL PROGRAMA
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.
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.
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.
PASOS Q1 Q2 Q3 Q4 PASOS Q1 Q2 Q3 Q4
1 ON OFF OFF OFF 1 OFF OFF OFF ON
2 OFF ON OFF OFF 2 OFF OFF ON OFF
3 OFF OFF ON OFF 3 OFF ON OFF OFF
4 OFF OFF OFF ON 4 ON OFF OFF OFF
1 ON OFF OFF OFF 1 OFF OFF OFF ON
Las señales que habilita cada transistor pueden venir desde un circuito integrado o
desde el microcontrolador, el transistor lleva el negativo a la bobina del motor, en el
momento en que es habilitado.
La velocidad del motor depende de la frecuencia con que se envíen los pulsos a
cada transistor.
Existen otras formas de controlar un motor paso a paso para generar más torque o
hacerlo más preciso, en el próximo ejemplo se verá una nueva forma.
Inicio
ABCD
1 1 0 0 12
0 1 1 0 6 Sentido horario No
0 0 1 1 3
1 0 0 1 9
Si
1 1 0 0 12
PortB=00001001 PortB=00000011
PortB=00001100 PortB=00000110
PortB=0000110 PortB=0001100
PortB=0000011 PortB=0001001
Programa:
Include <P16F873>
LIST P=16F873
ORG 0
MOVLW 0
TRIS PORT B ;CONFIGURAR PUERTO B TODO COMO SALIDA.
MOVLW .255
TRIS PORTC ;CONFIGURA EL PUERTO C COMO ENTRADA.
SEC BTFSS PORTC,2 ;PULSADOR DE SELECCIÓN DE DIRECCION.
GOTO HOR
LOOP MOVLW .9 ;SENTIDO ANTIHORARIO.
MOVWF PORT B
CALL RETARDO
MOVLW .3
CALL RETARDO
MOVLW .6
MOVWF PORT B
CALL RETARDO
MOVLW .12
MOVWF PORT B
CALL RETARDO
GOTO SEC
HOR MOVLW .12 ;SENTIDO HORARIO.
MOVWF PORT B
CALL RETARDO
MOVLW .6
MOVWF PORTB
CALL RETARDO
MOVLW .3
MOVWF PORTB
CALL RETARDO
MOVLW .9
MOVWF PORTB
CALL RETARDO
GOTO SEC
Registro f
Registro f
Include<P16F873.INC>
LIST P=16F873, R=HEX
ORG 0
MOVLW b'00000000' ; CARGA W CON 00000000
TRIS PORTB ; CONFIGURA EL PUERTO B COMO SALIDA
INICIO MOVLW b'11111111' ; CARGA W CON 11111111
MOVWF PORTB ; ACTIVA TODOS LOS BITS DEL PUERTO B
LOOP BCF STATUS,C ; PONE EN "0" EL BIT CARRY
RLF PORTB,F ; ROTA A LA IZQUIERDA EL PORTB
BTFSS PORTB,7 ; PREGUNTA RB7 ESTA EN UNO
GOTO INICIO ; SI RB7 = 0, SALTA A INICIO
GOTO LOOP ; SI RB7 = 1, SALTA A LOOP
END
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
Poner en 1 el carry
No RB7 =1?
Si
Rotar a derecha a
través de carry
No RB0=0?
Si
Programa:
Include <P16F873.INC>
LIST P= 16F873, R=HEX
ORG 0
MOVLW 0
TRIS PORTB ;CONFIGURA EL PUERTO B COMO SALIDA.
LOOP CLRF PORTB ;LIMPIA EL PUERTO B.
BSF PORTB,0 ;PONE EN 1 EL BIT 0 DEL PUERTO B.
CALL RETARDO ;LLAMA UN RETARDO DE UN SEGUNDO.
REP BSF STATUS,C ;COLOCA LA BANDERA DE CARRY EN 1.
RLF PORTB,F ;ROTA A LA IZQUIERDA A TRAVES DEL
CARRY (EL UNO SE ALMACENA EN F ).
CALL RETARDO ;LLAMA EL RETARDO DE UN SEGUNDO.
BTFSS PORTB,7 ;SI EL BIT7 DEL PUERTO B ES 0.
GOTO REP ;SALTA A REP
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:
CODIGO 7 SEGMENTOS
NUMERO RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0
g f e d c b a
0 X 0 1 1 1 1 1 1
1 X 0 0 0 0 1 1 0
2 X 1 0 1 1 0 1 1
3 X 1 0 0 1 1 1 1
4 X 1 1 0 0 1 1 0
5 X 1 1 0 1 1 0 1
6 X 1 1 1 1 1 0 0
7 X 0 0 0 0 1 1 1
8 X 1 1 1 1 1 1 1
9 X 1 1 0 0 1 1 1
.
.
MOVF VALOR,W CARGAR EN W VALOR A MOSTRAR
CALL TABLA LLAMAR TABLA DE DATOS
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.
No Pulsador = 1
SÍ
Retardo 200 ms
Falsa
Alarma No Pulsador = 1
SÍ El Pulsador
se oprimió
Inicio
Contador=0
w=contador
PortB=cod7 seg
Incrementar contador
No Contador=10?
Si
Programa:
Include <p16f873.inc>
List p=16f873
CONTADOR EQU 20
REG EQU 21
REG EQU 22
REG EQU 23
ORG 00
MOVLW 0
TRIS PORTB ;CONFIGURAR EL PORTB COMO SALIDA
INICIO MOVLW 0
MOVWF CONTADOR ;CARGAR EL CONTADOR CON “0”
LOOP MOVF CONTADOR,W;CONTADOR=W
CALL TABLA ;LLAMAR TABLA
MOVWF PORTB ;LLEVAR VALOR 7 SEGMENTOS A PORTB
CALL RET1S ;LLAMA RETARDO 1S.
INCF CONTADOR,F
MOVLW .10 ;COMPARA CONTADOR CON 10
XORWF CONTADOR,W
BTFSC STATUS,2
GOTO LOOP
GOTO INICIO
DECFSZ REG2,F
GOTO REP2
DECFSZ REG1,F
GOTO REP3
RETURN
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.
INICIO
W = Unidades
Llamar tabla
Llevar a PORTB
Activar RC5 y
desactivar RC4
W = decenas
Llamar tabla
Activar RC4 y
desactivar RC5
Return
Esto ocurre cuando por ejemplo, se pregunta por un pulsador, donde se llama el
retardo de 200 ms, la rutina mostrar debe estar dentro del retardo de 200ms y así
cada vez que el programa principal este dentro de un loop.
Otro caso es el retardo de un segundo, aquí también es necesario que la rutina de
mostrar haga parte del retardo de un segundo.
Valor1=5
Valor2=7
Habilitar transistor de
valor1(RC0) y deshabilitar
transistor de valor2(RC1)
Retardo de 1ms
Habilitar transistor de
valor2(RC1) y deshabilitar
transistor de valor1(RC0)
Retardo de 1ms
Programa:
INCLUDE <P16F873.INC>
LIST P=16F873, R = HEX
R12 EQU 20H
VALOR 1 EQU 21H
VALOR 2 EQU 22H
MOVLW 0
TRIS PORTB ;CONFIGURAR EL PERTO B TODO COMO SALIDA.
MOVLW 0
TRIS PORTC ;CONFIGURA EL PUERTO C COMO SALIDA.
MOVLW .7 ;CARGA W CON 7.
MOVWF VALOR 2 ;LLEVA 7 A VALOR 2.
MOVLW .5 ;CARGA W CON 5.
MOVWF VALOR 1 ;LLEVA 5 A VALOR 1.
LOOP 1 MOVF VALOR 1,W ;LLEVA VALOR 1 A W.
CALL TABLA ;LLAMA A TABLA PARA ENCONTRAR EL VALOR
7 SEGMENTOS DEL NUMERO 5.
MOVWF PORTB ;LLEVA EL VALOR 7 SEG AL PUERTO B.
MOVLW .1
MOVWF PORT C ;HABILITA EL TRANSISTOR
CORRESPONDIENTE A VALOR1 (RC0)
CALL RETARDO
MOVF VALOR 2,W ;LLEVA VALOR 2 A W.
CALL TABLA ;CONVIERTE VALOR 2 A CODIGO 7
SEGMENTOS.
MOVWF PORT B ;SACA AL PUERTO B EL VALOR 2.
MOVLW .2
MOVWF PORTC ;HABILITA EL TRANSISTOR DE VALOR2 (RC1).
CALL RETARDO
GOTO LOOP1
RETARDO MOVLW .255 ;RETARDO DE 1 mS APROX.
MOVWF R12
REP DECFSZ R12,F
GOTO REP
TABLA ADDWF PCL,F ; PCL + W
RETLW B’ 00111111’ ; CODIGO PARA EL 0
RETLW B’ 00000110’ ; CODIGO PARA EL 1
RETLW B’ 01011011’ ; CODIGO PARA EL 2
RETLW B’ 01001111’ ; CODIGO PARA EL 3
RETLW B’ 01100110’ ; CODIGO PARA EL 4
RETLW B’ 01101101’ ; CODIGO PARA EL 5
RETLW B’ 01111100’ ; CODIGO PARA EL 6
RETLW B’ 00000111’ ; CODIGO PARA EL 7
RETLW B’ 01111111’ ; CODIGO PARA EL 8
RETLW B’ 01100111’ ; CODIGO PARA EL 9
RETARDO MOVLW .255
MOVWF REG1
RET1 DECFSZ REG1,F
GOTO RET1
RETURN
END ;FIN DEL PROGRAMA.
29. INTERRUPCIONES
REGISTRO OPTION
REGISTRO INTCON
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
Habilitar nuevamente la interrupción por RB0: Bit INTE del registro INTCON
Retornar de la interrupción con la instrucción RETFIE
ORG 0
GOTO Inicio
ORG 4
GOTO INTER
INICIO :
:
BSF STATUS,5 ; CAMBIAR AL BANCO 1 DE MEMORIA
:
:
:
: PROGRAMA
: QUE DEBE
: EJECUTAR LA
: INTERRUPCIÓN
Configurar Puertos
Unidades = 0
Decenas = 0
Configurar Interrupción
por RB0
Habilitar Interrupción
por RB0
INICIO
Incrementar Unidades
Unidades = 10 Si
Decenas = 9 NO
Si
Incrementar
Unidades = 0
Decenas
Decenas = 0 Unidades = 0
Return
Programa:
Include<P16F873.INC>
LIST P=16F873, R=HEX
UNID EQU 20
DECE EQU 21
REG1 EQU 23
REG2 EQU 24
REG3 EQU 25
ORG 0
GOTO INICIO ;SALTA A INICIO
ORG 4
GOTO INTER ; SALTA A EJECUTAR LA INTERRUPCIÓN
ORG 6
INICIO MOVLW 1
TRIS PORTB ; CONFIGURA EL PORTB COMO SALIDA Y RB0 COMO
ENTRADA
MOVLW 0
TRIS PORTC ; CONFIGURA PORTC COMO SALIDA
BSF STATUS,5 ; CAMBIA AL BANCO 1 DE MEMORIA
BSF OPTION_REG,INTEDG ;SELECCIONA FLANCO DE SUBIDA PARA LA
INTERRUPCIÓN
BSF STATUS,5 ; CAMBIA AL BANCO 0 DE MEMORIA
BCF INTCON,INTF ; BORRA SEÑALIZADOR DE INTERRUPCIÓN
BSF INTCON,INTE ; HABILITA LA INTERRUPCIÓN EXTERNA POR RB0
RETURN
MOVLW .9
XORWF DECE,W
BTFSS STATUS,Z
GOTO DECREM
CLRF UNID
CLRF DECE
GOTO LOOP1
RET100 MOVLW 2
MOVWF REG3
LOOP3 MOVLW .255
MOVWF REG2
LOOP2 CALL MOSTRAR
DECFSZ REG2,F
GOTO LOOP2
DECFSZ REG3,F
GOTO LOOP3
RETURN
END ;FIN DEL PROGRAMA
Así, por ejemplo, si VREF = +5V y VREF- es 0V, la resolución es 5V/1024 = 4.8mV /bit,
cuando la señal análoga sea 0V le corresponde un numero digital = 0000000000 y
para 5V será 1111111111.
Si VREF+ = +5V y VREF- podemos determinar en todo momento a que numero digital
aproximado corresponde cualquier señal análoga de entrada, con la formula:
VEntrada. = VEntrada.
4.8mV 0.0048V
2V = 416
0.0048
REGISTRO ADCON1
A: Entrada análoga.
D: Entrada/salida digital.
Los pasos que debemos seguir para configurar el PORTA son los siguientes:
BSF STATUS,5
Para lograr este objetivo, se hace referencia a la tabla del registro ADCON1.
Como ejemplo de este punto, se supone que se quiere configurar todo el puerto A
como Entradas/Salidas digital.
MOVLW 6
MOVWF ADCON1
BCF STATUS,5
MOVLW B´00000000´
TRIS PORTA.
REGISTRO ADCON0
00 : FOSC/2
01 : FOSC/8
10 : FOSC/32
11 : FRC : Oscilador RC interno en el conversor A/D
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)
Los pasos que se deben seguir para realizar una conversión análoga son los
siguientes:
4. Iniciar la conversión
Programa:
Include <P16F873.INC>
LIST P=16F873, R=HEX
REG1 EQU 20
REG2 EQU 21
REG3 EQU 22
REG4 EQU 23
ORG 0
MOVLW 0
TRIS PORTB ; CONFIGURAR EL PORTB COMO SALIDA
TRIS PORTC ; CONFIGURAR EL POTRC COMO SALIDA
BSF STATUS,5 ; CAMBIA AL BANCO 1 DE MEMORIA
MOVLW 80 ; CONFIGURA EL PORTA COMO
; ENTRADAS ANÁLOGAS
MOVWF ADCON1
BCF STATUS,5 ; CAMBIA AL BANCO 0 DE MEMORIA
REP3 MOVLW 1 ; CONFIGURA CANAL 0, FRECUENCIA, Y
; ENCIENDE EL CONVERSOR A/D
MOVWF ADCON0
CALL RETARDO ; LLAMA RETARDO DE 767 MICROSEGUNDOS
RETURN
RETD MOVLW 2
MOVWF REG1
REP6 MOVLW 84H
MOVWF REG2
REP2 MOVLW 0FFH
MOVWF REG3
REP7 DECFSZ REG3,F
GOTO REP7
DECFSZ REG2,F
GOTO REP2
DECFSZ REG1,F
GOTO REP6
RETURN
Existen dos formas comunes de transferir información binaria entre dos equipos, la
comunicación paralela y la comunicación serial.
La comunicación serial solo utiliza tres líneas, una para recibir los datos Rx, otra
para trasmitir los datos Tx y la línea común GND.
Cada dato se transmite bit a bit, un bit a la vez, por lo tanto se hace mucho más
lenta, pero tiene la ventaja de necesitar menos líneas y las distancias a las cuales se
puede transferir la información son mayores, además con el uso de los módem se
puede trasmitir a cualquier parte del mundo.
Tx Tx
EQUIPO EQUIPO
Rx Rx
GND GND
LSB MSB
1 2 3 4 5 6 7 8
Bit de Bit de
Start 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.
Inicio
Bit de Start
Contador = 8
Colocar Tx en bajo
Rotar registro de
transmisión a la
derecha
Si
Decrementar
contador
No Contador = 0
Si
Bit de parada
Retorne
Inicio
Esta la línea
No
Rx en bajo
Si
Contador = 8
Carry = 0
Esta la línea
No Carry = 1
Rx en bajo
Rotar a la derecha
registro de recepción
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.
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.
Programa:
INCLUDE <P16F873.INC>
List P=16F873, R = HEX
CBLOCK 20H
CONT,DELAY,REGTX,REGRX,VALOR
ENDC
ORG 0
BSF STATUS,5
MOVLW B'01111111'
MOVWF TRISC
CLRF TRISB
BCF STATUS,5
BSF TRANSMISOR
MOVLW 0
CALL TABLA
MOVWF PORTB
REPETIR CALL RECEP
MOVF REGRX,W
MOVWF VALOR
MOVLW .48
SUBWF VALOR,W
CALL TABLA
MOVWF PORTB
CALL TRANS
GOTO REPETIR
;RUTINA DE TRANSMISION
END