Sie sind auf Seite 1von 236

Microcontroladores Fundamentos y Aplicaciones

DISEO EMBEBIDO CON SIMULACIONES INTERACTIVAS

Carlos Valdivieso A.
Douglas Plaza G.
Ronald Sols M.

Microcontroladores Fundamentos y Aplicaciones.


Diseo embebido con simulaciones interactivas.
No est permitida la reproduccin total o parcial de este libro,
ni su tratamiento informtico, ni la transmisin de ninguna
forma o por cualquier medio, ya sea electrnico, mecnico, por
fotocopia, por registro u otros mtodos, sin el permiso previo
y por escrito de los titulares del Copyright.
Este texto forma parte de la Iniciativa Latinoamericana
de Libros de Texto abiertos (LATIn), proyecto financiado
por la Unin Europea en el marco de su Programa ALFA
III EuropeAid. El Proyecto LATIn est conformado por:
Escuela Superior Politcnica del Litoral, Ecuador (ESPOL);
Universidad Autnoma de Aguascalientes, Mxico (UAA),
Universidad Catlica de San Pablo, Per (UCSP); Universidade Presbiteriana Mackenzie, Brasil(UPM); Universidad
de la Repblica, Uruguay (UdelaR); Universidad Nacional de
Rosario, Argentina(UR); Universidad Central de Venezuela,
Venezuela (UCV), Universidad Austral de Chile, Chile
(UACH), Universidad del Cauca, Colombia (UNICAUCA),
Katholieke Universiteit Leuven, Blgica (KUL), Universidad
de Alcal, Espaa (UAH), Universit Paul Sabatier, Francia
(UPS).

ISBN Obra Independiente: 978-9942-14-295-5


Codigo IEPI: GYE-006663
IMPRESO EN ECUADOR - PRINTED IN ECUADOR

Prefacio
Este trabajo ha sido desarrollado gracias a la interaccin como docente
universitario en la enseanza terica y prctica de la materia de microcontroladores, con diversos grupos de estudiantes por alrededor de 15 aos.
Es con sus exigencias, cuestionamientos y colaboraciones con sus proyectos
prcticos implementados en los cursos dictados, que se ha podido construir
una gua comprensiva, que trate de responder de una forma adecuada las
mltiples dudas de los estudiantes en su proceso de aprendizaje. La disponibilidad de tiempo en el aula de clase muchas veces no es suficiente para
responder las inquietudes de los estudiantes; as que, se espera que con este
trabajo se contribuya a proporcionar al lector un cmulo de informacin
que le ayuden de una manera prctica y escalonada a comprender la base
terica de los microcontroladores PIC de la gama media (captulos 1 al 10),
con implementaciones prcticas bsicas (captulo 11). Al final se citan libros
de referencia que pueden consultarse para profundizar los temas tratados.
Todos los microcontroladores tienen algunos de los componentes que se explican en el presente trabajo y a veces muchos ms. Lo interesante es que al
conocer la base terica de un microcontrolador de la gama media como el
PIC16F887, este conocimiento constituye un pilar bsico para el estudio de
otros tipos de microcontroladores ms avanzados.
Para las simulaciones se ha utilizado el programa Proteus de Labcenter
Electronics que es una empresa del Reino Unido (UK) que nos proporciona
una ayuda visual, de elementos difciles de explicar sin estas ayudas. Proteus
se enlaza con Ares que es un programa que permite el diseo de una tarjeta
de circuitos impresos.
El uso de diversos componentes perifricos que son posible ver o disear
en Ares hace posible una interesante experiencia educativa. Esto cautiva
el inters del estudiante, quien en sus proyectos se inclina por el uso de
diversos tipos de sensores o elementos de comunicaciones. Las simulaciones
interactivas estimulan el aprendizaje y permiten observar el comportamiento
de los circuitos en pantalla, antes de ser llevados a una implementacin
prctica sobre una tarjeta de circuitos impresos.

Introduccin
Este libro proporciona una introduccin bsica al tema de los microcontroladores mediante el uso de un microcontrolador de gama media de
arquitectura RISC, que constituye un computador en un solo chip. Esto facilita enormemente el aprendizaje de los microcontroladores, ya que se evitan
conjuntos de instrucciones como el de los microcontroladores de arquitectura CISC, con cientos de instrucciones que causan temor al usuario. Otro
de los elementos que facilita el aprendizaje de los microcontroladores fue el
advenimiento, en su debido momento, de la memoria flash; porque el usuario
tuvo la capacidad de reusar la memoria para reescribir nuevos programas,
con la gran ventaja de mantener el programa en memoria aun cuando el PIC
se prende y apaga. Suficientes razones para considerar al PIC16F887, para
la enseanza de microcontroladores, el mismo que contiene una cantidad
interesante de recursos que son imposibles de cubrir a cabalidad en un solo
texto, pero que en este trabajo, se les da un tratamiento lo suficientemente
significativo, para las carreras de ingeniera que consideren el estudio de los
microcontroladores en su malla.
Luego de adquirir conocimientos bsicos se empieza a programar en lenguaje de mquina o lenguaje ensamblador, que constituye la forma ms bsica de programacin pero es all donde se observa y comprende la estructura
interna de los microcontroladores, descubriendo el formato de las instrucciones y analizando su funcionamiento mediante diagramas de bloques que
interactan con memoria, unidad aritmtica lgica y los dems recursos del
sistema. Posteriormente se empieza el estudio del lenguaje C para PICs y se
lo utiliza para la realizacin de sistemas ms complejos.
Con estos recursos y el empleo de un software de simulacin como el
Proteus, se lleva al lector al diseo de sistemas completos con muy pocos
elementos y el microcontrolador como elemento principal. A todo esto se
aade que puede hacerse uso del programa Ares que viene interconectado con
el Proteus, El Ares utiliza las simulaciones de un sistema en funcionamiento,
para producir archivos con las pistas necesarias para generar una placa de
circuitos impresos. Estos archivos pueden llevarse a un laboratorio para su
fabricacin.

ndice general
ndice de figuras

11

1. Arquitectura Interna
1.0.1. Caractersticas Generales . . . . . . . .
1.0.2. Patitas multifuncionales . . . . . . . . .
1.0.3. Unidad Central de Procesamiento CPU
1.0.4. Memorias . . . . . . . . . . . . . . . . .
1.0.5. Memoria ROM o de Programa . . . . .
1.0.6. Memoria EEPROM . . . . . . . . . . .
1.0.7. Memoria de Datos o Memoria RAM . .
1.0.8. Registros de Propsito General . . . . .
1.0.9. Registros de Funciones Especiales (SFR)
1.0.10. Banco de Datos . . . . . . . . . . . . . .

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

16
17
18
19
19
19
20
20
21
21
22

2. Conjunto de Instrucciones
2.1. Clasificacin de las Instrucciones . . . . . .
2.1.1. Instrucciones orientadas a byte . . .
2.1.2. Instrucciones orientadas a bit . . . .
2.1.3. Instrucciones de literales y control .
2.2. Ciclo de Instruccin . . . . . . . . . . . . .
2.3. Detalle de las principales Instrucciones . . .
2.4. Direccionamiento . . . . . . . . . . . . . . .
2.4.1. Direccionamiento inmediato . . . . .
2.4.2. Direccionamiento directo . . . . . .
2.4.3. Direccionamiento indirecto . . . . .
2.4.4. Direccionamiento Directo e indirecto
2.5. Registros de trabajo . . . . . . . . . . . . .
2.5.1. STATUS . . . . . . . . . . . . . . .
2.5.2. OPTION REG . . . . . . . . . . . .
2.5.3. PCON . . . . . . . . . . . . . . . . .
2.5.4. PC=PCLATH y PCL . . . . . . . .
2.6. Registros de Configuracin . . . . . . . . . .
2.6.1. Directiva: CONFIG . . . . . . . . .

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

23
23
23
25
26
28
29
35
35
35
35
37
38
38
39
40
41
42
42

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

2.6.2. Directiva: INCLUDE P16F887.INC . . . . . . . . . . .


2.7. Resistencias de PULL UP del PORTB . . . . . . . . . . . . .
2.8. Retardos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.8.1. Uso de retardos causados por instrucciones . . . . . .
2.8.2. Retardos Mediante decremento de registros . . . . . .
2.8.3. Retardos Mediante el uso de temporizadores e interrupciones . . . . . . . . . . . . . . . . . . . . . . . . .
2.9. Tablas de Bsqueda . . . . . . . . . . . . . . . . . . . . . . .
2.10. Display de 7 Segmentos . . . . . . . . . . . . . . . . . . . . .
2.11. Manejo de Botoneras, Interruptores y LEDS . . . . . . . . .
2.11.1. Conexin de leds . . . . . . . . . . . . . . . . . . . . .
2.12. Sistema de Reloj . . . . . . . . . . . . . . . . . . . . . . . . .
2.12.1. El Oscilador Externo . . . . . . . . . . . . . . . . . . .
2.12.2. Resonadores Cermicos en modo XT O HS . . . . . .
2.12.3. Oscilador Externo en modos RC Y RCIO . . . . . . .
2.12.4. Modos de Reloj Interno . . . . . . . . . . . . . . . . .
2.12.5. Configuracin del Oscilador Interno . . . . . . . . . .
2.13. Temporizadores . . . . . . . . . . . . . . . . . . . . . . . . . .
2.13.1. TMR0 . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.13.2. TMR1 . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.13.3. TMR2 . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.13.4. Perro Guardin como recurso del ncleo del CPU . . .
3. Sistema de Interrupciones
3.1. Tratamiento de una Interrupcin
3.2. Diversas Causas de Interrupcin
3.3. Registro INTCON . . . . . . . .
3.4. Registro PIE1 . . . . . . . . . . .
3.5. Registro PIE2 . . . . . . . . . . .
3.6. Registro PIR1 . . . . . . . . . . .
3.7. Registro PIR2 . . . . . . . . . . .

44
45
46
46
47
47
47
48
49
50
51
52
52
53
54
55
57
57
61
67
69

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

71
72
72
73
74
75
76
77

4. Memorias
4.1. ROM con Mscara . . . . . . . . . . . . . .
4.2. OTP . . . . . . . . . . . . . . . . . . . . . .
4.3. EPROM . . . . . . . . . . . . . . . . . . . .
4.4. FLASH . . . . . . . . . . . . . . . . . . . .
4.5. Memoria EEPROM en el PIC16F887 . . . .
4.6. LECTURA DE LA MEMORIA EEPROM .
4.7. Escritura de Memoria EEPROM . . . . . .

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

78
79
79
80
81
81
82
83

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

5. Mdulos ADC
5.1. Principios de Conversin A/D, Discretizacin . . . . . . . .
5.2. ADC Funcin de Transferencia . . . . . . . . . . . . . . . .
5.3. Principios de Conversin A/D: Discretizacin Temporal . .
5.4. Principios de Conversin A/D: Discretizacin de Amplitud
5.5. Convertidor Analgico a Digital (ADC) . . . . . . . . . . .
5.6. ADC Tiempo de Conversin . . . . . . . . . . . . . . . . . .
5.7. A/D: Ciclos TAD en la conversin . . . . . . . . . . . . . .
5.8. Funciones ADC de MikroCPro . . . . . . . . . . . . . . . .

.
.
.
.
.
.
.
.

84
86
86
87
88
89
90
90
91

6. Lenguaje C para Microcontroladores


92
6.1. Directivas del Preprocesador . . . . . . . . . . . . . . . . . . . 94
6.2. Tipos de Datos en Lenguaje C . . . . . . . . . . . . . . . . . 95
7. Fundamentos bsicos del lenguaje C
7.1. Punteros . . . . . . . . . . . . . . . . . . . . . .
7.2. Declaraciones de Variables . . . . . . . . . . . .
7.3. Constantes . . . . . . . . . . . . . . . . . . . .
7.3.1. Constantes enteras . . . . . . . . . . . .
7.3.2. Constantes Character (ASCII) . . . . .
7.3.3. Constantes tipo string . . . . . . . . . .
7.3.4. Constantes Enumeradas . . . . . . . . .
7.4. Operadores, Operaciones y Expresiones . . . .
7.4.1. Operadores Aritmticos . . . . . . . . .
7.4.2. Operadores de Asignacin . . . . . . . .
7.4.3. Operadores de incremento y decremento
7.4.4. Operadores Relacionales . . . . . . . . .
7.4.5. Operadores Lgicos . . . . . . . . . . .
7.4.6. Operadores Lgicos de bit a bit . . . . .
7.4.7. Operadores Condicionales . . . . . . . .
7.5. Conversin Tipo de Datos . . . . . . . . . . . .
7.6. Insertar cdigo en lenguaje ensamblador . . . .
7.7. Arreglos . . . . . . . . . . . . . . . . . . . . . .
7.8. Arreglos de dos dimensiones . . . . . . . . . . .
7.9. Funciones . . . . . . . . . . . . . . . . . . . . .

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

97
97
98
98
98
99
99
100
100
101
101
102
102
103
104
104
107
108
109
110
111

8. Modulacin por ancho de pulso (PWM)


113
8.1. Mdulos CCP . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
8.2. Mdulo CCP1 . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
8.2.1. CCP1 en modo captura . . . . . . . . . . . . . . . . . 115
8.2.2. CCP1 en modo comparacin . . . . . . . . . . . . . . 116
8.2.3. CCP1 en modo PWM . . . . . . . . . . . . . . . . . . 117
8.2.4. Registro CCP1_CON . . . . . . . . . . . . . . . . . . 121
8.2.5. Pasos para la Configuracin del CCP1 en Modo PWM 122

8.3. Mdulo CCP2 . . . . . . . . . . . . . . . . . . . . . . . . . . . 123


8.3.1. Registro CCP2_CON . . . . . . . . . . . . . . . . . . 124
8.4. Funciones PWM de MikroCPro . . . . . . . . . . . . . . . . . 125
9. Teclados
126
9.1. Teclado Matricial 4X4 . . . . . . . . . . . . . . . . . . . . . . 126
9.2. Manejo de Interruptores, Botoneras y Teclados . . . . . . . . 127
9.3. Funciones para el Teclado de MikroCPro . . . . . . . . . . . . 128
10.Mdulos de Comunicacin
10.1. Mdulo UART para comunicacin Serial Asncrona . . . . .
10.1.1. Margen de Ruido . . . . . . . . . . . . . . . . . . . .
10.1.2. Asignacin de Pines, conversiones y comunicaciones.
10.1.3. El Transmisor . . . . . . . . . . . . . . . . . . . . . .
10.1.4. El Receptor . . . . . . . . . . . . . . . . . . . . . . .
10.1.5. El UART . . . . . . . . . . . . . . . . . . . . . . . .
10.1.6. Modo Asncrono . . . . . . . . . . . . . . . . . . . .
10.1.7. Registro TXSTA . . . . . . . . . . . . . . . . . . . .
10.1.8. Registro RCSTA . . . . . . . . . . . . . . . . . . . .
10.1.9. Generador de Baudios . . . . . . . . . . . . . . . . .
10.1.10.Funciones UART de MikroCPro . . . . . . . . . . .
10.2. Comunicacin Serial Sincrnica SPI . . . . . . . . . . . . .
10.2.1. SPI Caractersticas Bsicas . . . . . . . . . . . . . .
10.2.2. Funciones SPI de MikroCPro . . . . . . . . . . . . .
10.3. Comunicacin Serial Sncrona I2C . . . . . . . . . . . . . .
10.3.1. I2C Caractersticas Bsicas . . . . . . . . . . . . . .
10.3.2. Funciones I2C de MikroCPro . . . . . . . . . . . . .

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

129
129
129
133
136
136
136
137
141
142
143
146
148
148
149
149
150
153

11.Prcticas de Laboratorio
11.1. Encendido de LEDS mediante interruptores . . . . . . . . .
11.1.1. Objetivo . . . . . . . . . . . . . . . . . . . . . . . . .
11.1.2. Contenido . . . . . . . . . . . . . . . . . . . . . . . .
11.1.3. Creacin de un proyecto nuevo . . . . . . . . . . . .
11.1.4. Ejecucin paso a paso . . . . . . . . . . . . . . . . .
11.1.5. Observacin de varios registros . . . . . . . . . . . .
11.1.6. Simulacin en PROTEUS . . . . . . . . . . . . . . .
11.1.7. Preguntas Prctica 1 . . . . . . . . . . . . . . . . . .
11.2. Encendido y apagado de LEDS en PORTB usando retardos
11.2.1. Objetivo . . . . . . . . . . . . . . . . . . . . . . . . .
11.2.2. Contenido . . . . . . . . . . . . . . . . . . . . . . . .
11.2.3. Instrucciones . . . . . . . . . . . . . . . . . . . . . .
11.2.4. Especificaciones . . . . . . . . . . . . . . . . . . . . .
11.2.5. Cdigo P2-RET.ASM . . . . . . . . . . . . . . . . .
11.2.6. Especificaciones Parte 2 . . . . . . . . . . . . . . . .

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

155
155
155
156
156
165
165
168
170
171
171
171
172
172
173
175

11.2.7. Cdigo P2-RET2.ASM . . . . . . . . . . . . . . . . . . 175


11.2.8. Preguntas Prctica 2 . . . . . . . . . . . . . . . . . . . 177
11.3. Subrutinas y pulsadores . . . . . . . . . . . . . . . . . . . . . 178
11.3.1. Objetivo . . . . . . . . . . . . . . . . . . . . . . . . . . 178
11.3.2. Contenido . . . . . . . . . . . . . . . . . . . . . . . . . 178
11.3.3. Especificaciones Parte 1 . . . . . . . . . . . . . . . . . 178
11.3.4. Cdigo P3A_RA.ASM . . . . . . . . . . . . . . . . . . 179
11.3.5. Especificaciones Parte 2 . . . . . . . . . . . . . . . . . 180
11.3.6. Cdigo P3B_RA.ASM . . . . . . . . . . . . . . . . . . 180
11.3.7. Preguntas Prctica 3 . . . . . . . . . . . . . . . . . . . 183
11.4. Interrupciones y temporizadores . . . . . . . . . . . . . . . . 184
11.4.1. Objetivo . . . . . . . . . . . . . . . . . . . . . . . . . . 184
11.4.2. Contenido . . . . . . . . . . . . . . . . . . . . . . . . . 184
11.4.3. Timer 0 . . . . . . . . . . . . . . . . . . . . . . . . . . 184
11.4.4. Timer 1 . . . . . . . . . . . . . . . . . . . . . . . . . . 185
11.4.5. Descripcin Parte 1 . . . . . . . . . . . . . . . . . . . 187
11.4.6. Cdigo P4A.ASM . . . . . . . . . . . . . . . . . . . . 187
11.4.7. Descripcin Parte 2 . . . . . . . . . . . . . . . . . . . 189
11.4.8. Cdigo P4B.ASM . . . . . . . . . . . . . . . . . . . . 189
11.4.9. Descripcin Parte 2 . . . . . . . . . . . . . . . . . . . 191
11.4.10.Cdigo P4C.ASM . . . . . . . . . . . . . . . . . . . . 191
11.4.11.Preguntas Prctica 4 . . . . . . . . . . . . . . . . . . . 194
11.5. Contadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
11.5.1. Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . 195
11.5.2. Contenido . . . . . . . . . . . . . . . . . . . . . . . . . 195
11.5.3. Contador de un dgito con display . . . . . . . . . . . 196
11.5.4. Cdigo P5A.ASM . . . . . . . . . . . . . . . . . . . . 196
11.5.5. Contador de dos dgitos con display . . . . . . . . . . 199
11.5.6. Cdigo P5B.ASM . . . . . . . . . . . . . . . . . . . . 199
11.5.7. Contador de dos dgitos multiplexados . . . . . . . . . 203
11.5.8. Cdigo P5C.ASM . . . . . . . . . . . . . . . . . . . . 203
11.5.9. Preguntas Prctica 5 . . . . . . . . . . . . . . . . . . . 206
11.6. Interrupciones y Temporizadores en Lenguaje C . . . . . . . . 207
11.6.1. Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . 207
11.6.2. Contenido . . . . . . . . . . . . . . . . . . . . . . . . . 207
11.6.3. Creacin de un proyecto nuevo en lenguaje C . . . . . 207
11.6.4. Ejercicio sobre interrupciones y temporizadores. Parte 1210
11.6.5. Cdigo a ser utilizado en la primera parte de la prctica211
11.6.6. Responder las siguientes preguntas . . . . . . . . . . . 211
11.6.7. Ejercicio sobre interrupciones y temporizadores. Parte 2212
11.6.8. Responder las siguientes preguntas . . . . . . . . . . . 212
11.6.9. Ejercicio interrupciones y temporizadores. Parte 3 . . 213
11.6.10.Responder las siguientes preguntas . . . . . . . . . . . 213
11.6.11.Ejercicio sobre interrupciones y temporizadores. Parte 4214
8

11.6.12.Responda la siguiente pregunta . . . . . . . . . . . . . 214


11.7. EEPROM y contadores de dos dgitos . . . . . . . . . . . . . 215
11.7.1. Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . 215
11.7.2. Contenido . . . . . . . . . . . . . . . . . . . . . . . . . 215
11.7.3. Uso de la memoria EEPROM . . . . . . . . . . . . . . 215
11.7.4. Programa relacionado al uso de la memoria EEPROM 216
11.7.5. Ejercicio adicional . . . . . . . . . . . . . . . . . . . . 217
11.7.6. Contador BCD de dos dgitos . . . . . . . . . . . . . . 217
11.7.7. Programa contador BCD de dos dgitos . . . . . . . . 217
11.7.8. Ejercicio adicional . . . . . . . . . . . . . . . . . . . . 217
11.8. Manejo del display LCD y teclado matricial . . . . . . . . . . 219
11.8.1. Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . 219
11.8.2. Contenido . . . . . . . . . . . . . . . . . . . . . . . . . 219
11.8.3. Manejo del LCD . . . . . . . . . . . . . . . . . . . . . 219
11.8.4. Programa relacionado al manejo del LCD . . . . . . . 219
11.8.5. Ejercicio adicional . . . . . . . . . . . . . . . . . . . . 221
11.8.6. Manejo del teclado 4X4 . . . . . . . . . . . . . . . . . 221
11.8.7. Programa relacionado al manejo del teclado . . . . . . 221
11.8.8. Ejercicio adicional . . . . . . . . . . . . . . . . . . . . 224
11.9. Manejo de la unidad PWM y del convertidor ADC . . . . . . 225
11.9.1. Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . 225
11.9.2. Contenido . . . . . . . . . . . . . . . . . . . . . . . . . 225
11.9.3. Manejo del PWM . . . . . . . . . . . . . . . . . . . . 225
11.9.4. Programa relacionado al manejo del PWM . . . . . . 225
11.9.5. Ejercicio adicional . . . . . . . . . . . . . . . . . . . . 227
11.9.6. Manejo del convertidor ADC . . . . . . . . . . . . . . 228
11.9.7. Programa relacionado al manejo del ADC . . . . . . . 229
11.9.8. Ejercicio adicional . . . . . . . . . . . . . . . . . . . . 229
11.10.Comunicacin RS232 va USART y comunicacin I2C . . . . 230
11.10.1.Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . 230
11.10.2.Contenido . . . . . . . . . . . . . . . . . . . . . . . . . 230
11.10.3.Comunicacin USART . . . . . . . . . . . . . . . . . . 230
11.10.4.Programa relacionado al manejo de la comunicacin
USART . . . . . . . . . . . . . . . . . . . . . . . . . . 231
11.10.5.Ejercicio adicional . . . . . . . . . . . . . . . . . . . . 232
11.10.6.Comunicacin I2C . . . . . . . . . . . . . . . . . . . . 232
11.10.7.Programa relacionado al manejo de la comunicacin I2C233
11.10.8.Ejercicio adicional . . . . . . . . . . . . . . . . . . . . 233
12.Libros de referencia

234

ndice de figuras
1.1.
1.2.
1.3.
1.4.
1.5.

Microcontrolador PIC16F887 . . .
Pines Microcontrolador PIC16F887
Diagrama de bloques del PIC . . .
Memoria RAM . . . . . . . . . . .
Acceso a los Bancos de Registros .

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

16
18
19
20
22

2.1. Formato de instruccin orientada a byte . . . .


2.2. Instrucciones de byte . . . . . . . . . . . . . . .
2.3. Formato instrucciones orientadas a bit . . . . .
2.4. Instrucciones orientadas a bit . . . . . . . . . .
2.5. Formato instrucciones de literales . . . . . . . .
2.6. Instrucciones de literales y control . . . . . . .
2.7. Ciclo de Instruccin . . . . . . . . . . . . . . .
2.8. Ejemplo de direccionamiento directo . . . . . .
2.9. Direccionamiento indirecto . . . . . . . . . . . .
2.10. Ejemplo Direccionamiento indirecto . . . . . .
2.11. Direccionamiento Directo e Indirecto . . . . . .
2.12. Registro STATUS . . . . . . . . . . . . . . . . .
2.13. Registro OPTION REG . . . . . . . . . . . . .
2.14. Tabla Pre-escalador . . . . . . . . . . . . . . .
2.15. Registro PCON . . . . . . . . . . . . . . . . . .
2.16. Registro PC . . . . . . . . . . . . . . . . . . . .
2.17. Ubicacin en bancos del registro PC . . . . . .
2.18. Ejemplo de Configuracin en MPLAB . . . . .
2.19. Ejemplo de la directiva INCLUDE . . . . . . .
2.20. Puerto WPUB . . . . . . . . . . . . . . . . . .
2.21. Pines con Rpull-up . . . . . . . . . . . . . . . .
2.22. Display de 7 Segmentos . . . . . . . . . . . . .
2.23. Display de 7 Segmentos nodo y ctodo comn
2.24. Conexin de Botoneras . . . . . . . . . . . . . .
2.25. Conexin de leds . . . . . . . . . . . . . . . . .
2.26. Diagrama de Bloques del Sistema de Reloj . . .
2.27. Oscilador externo . . . . . . . . . . . . . . . . .

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

23
24
25
25
26
27
28
35
36
36
37
38
39
40
40
41
42
43
44
45
45
48
49
50
50
51
52

10

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

2.28. Modo RC . . . . . . . . . . . . . . . . . . . .
2.29. Modo RCIO . . . . . . . . . . . . . . . . . . .
2.30. Modo INTOSC . . . . . . . . . . . . . . . . .
2.31. Modo INTOSCIO . . . . . . . . . . . . . . . .
2.32. Diagrama de configuracin oscilador interno .
2.33. Registro OSCCON . . . . . . . . . . . . . . .
2.34. Registro OPTION REG . . . . . . . . . . . .
2.35. Preescalador TMR0 . . . . . . . . . . . . . .
2.36. Funcin del bit con PSA 0 del OPTION REG
2.37. Funcin del bit con PSA 1 del OPTION REG
2.38. Timer TMR0 . . . . . . . . . . . . . . . . . .
2.39. TMR1 . . . . . . . . . . . . . . . . . . . . . .
2.40. T1CON controla TMR1 . . . . . . . . . . . .
2.41. T1CON registro de control del TMR1 . . . .
2.42. Preescalador del TMR1 . . . . . . . . . . . .
2.43. TMR1 en modo timer . . . . . . . . . . . . .
2.44. TMR1 en modo oscilador . . . . . . . . . . .
2.45. TMR1 en modo contador . . . . . . . . . . .
2.46. Diagrama de bloques general del TMR1 . . .
2.47. TMR2 . . . . . . . . . . . . . . . . . . . . . .
2.48. T2CON . . . . . . . . . . . . . . . . . . . . .
2.49. Postescalador del TMR2 . . . . . . . . . . . .
2.50. Preescalador del TMR2 . . . . . . . . . . . .
2.51. Diagrama de bloques del Perro Guardin . .
2.52. Registro WDTCON . . . . . . . . . . . . . .
2.53. Bits del Registro WDTCON . . . . . . . . . .

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

53
54
54
55
56
56
58
59
59
60
61
61
62
62
63
64
65
65
66
67
68
68
68
69
70
70

3.1.
3.2.
3.3.
3.4.
3.5.
3.6.

Interrupcin por TMR0


Registro INTCON . . .
Registro PIE1 . . . . . .
Registro PIE2 . . . . . .
Registro PIR1 . . . . . .
Registro PIR2 . . . . . .

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

72
73
74
75
76
77

5.1. Mdulo ADC . . . . . . . . .


5.2. ADRESH y ADRESL . . . .
5.3. Discretizacin . . . . . . . . .
5.4. Funcin de transferencia . . .
5.5. Funcin de transferencia N=3
5.6. Discretizacin Temporal . . .
5.7. Discretizacin de Amplitud .
5.8. FOSC . . . . . . . . . . . . .
5.9. TAD . . . . . . . . . . . . . .
5.10. Voltaje en el mdulo ADC . .

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

84
85
86
86
87
87
88
90
90
91

11

6.1.
6.2.
6.3.
6.4.
6.5.

Compilacin desde lenguaje C


Estructura del lenguaje C . .
Tipos de datos . . . . . . . .
Float y double . . . . . . . .
Keywords . . . . . . . . . . .

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

93
94
95
95
96

7.1. Constantes Enteras . . . . . . . . . . . .


7.2. Operadores Aritmticos . . . . . . . . .
7.3. Operadores de Asignacin . . . . . . . .
7.4. Operadores de incremento y decremento
7.5. Operadores Relacionales . . . . . . . . .
7.6. Operadores Lgicos . . . . . . . . . . . .
7.7. Operadores Lgicos de bit a bit . . . . .
7.8. Prioridad de datos . . . . . . . . . . . .
7.9. Lenguaje ASM . . . . . . . . . . . . . .
7.10. Arreglo SHELF . . . . . . . . . . . . . .
7.11. Arreglo de dos dimensiones . . . . . . .
7.12. Ejemplo de una matriz . . . . . . . . . .

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

99
101
101
102
102
103
104
107
108
109
110
110

8.1. Microcontrolador PIC16F887 . . . . . . . .


8.2. Registro CCP1CON . . . . . . . . . . . . .
8.3. CCP1 en Modo Captura . . . . . . . . . . .
8.4. CCP1 en Modo Comparacin . . . . . . . .
8.5. CCP1 en Modo PWM . . . . . . . . . . . .
8.6. Generar seales en Modo PWM . . . . . . .
8.7. Diagrama de bloques del modo PWM . . .
8.8. Frmula del Periodo de pulso . . . . . . . .
8.9. Frmula del ancho de pulso . . . . . . . . .
8.10. Frecuencias y Resoluciones del modo PWM
8.11. Registro CCP1_CON . . . . . . . . . . . .
8.12. Pines P1M1 y P1M0 . . . . . . . . . . . . .
8.13. Pines CCP1M3 y CCP1M0 . . . . . . . . .
8.14. Mdulo CCP2 . . . . . . . . . . . . . . . . .
8.15. Registro CCP2_CON . . . . . . . . . . . .
8.16. Pines CCP2M3 y CCP2M0 . . . . . . . . .

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

113
114
115
116
117
118
119
119
119
120
121
121
122
123
124
124

9.1. Teclado 4X4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126


9.2. Deteccin del pulsador . . . . . . . . . . . . . . . . . . . . . . 127
10.1. Niveles lgicos TTL . . . . . . .
10.2. Niveles lgicos CMOS . . . . . .
10.3. Niveles lgicos RS232 . . . . . .
10.4. Convertidor de niveles MAX 232
10.5. Conexiones de MAX 232 . . . . .
10.6. Trama desde PC . . . . . . . . .
12

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

130
130
131
131
132
132

10.7. Trama desde PIC . . . . . . . . . . . . .


10.8. Asignacin de Pines en conector DB9 . .
10.9. Asignacin de Pines en conector DB25 .
10.10.Sincronizacin de datos con el reloj . . .
10.11.Mdem Nulo . . . . . . . . . . . . . . .
10.12.Comunicacin serial usando DB25 . . .
10.13.Transmisor Asncrono . . . . . . . . . .
10.14.Mdulo UART conectado al MAX232 .
10.15.Registro TXSTA . . . . . . . . . . . . .
10.16.Registro RCSTA . . . . . . . . . . . . .
10.17.Caractersticas del Registro RCSTA . .
10.18.Caractersticas del Registro RCSTA 2 .
10.19.Registro BAUDCTL . . . . . . . . . . .
10.20.Caractersticas del Registro BAUDCTL
10.21.Seleccin de la frecuencia en Baudios . .
10.22.Estndar de Comunicacin del SPI . . .
10.23.Conexiones bsicas del SPI . . . . . . .
10.24.Estndar de Comunicacin del I2C . . .
10.25.Caractersticas del I2C . . . . . . . . . .
10.26.Esquema de conexin del I2C . . . . . .
10.27.Definiciones bsicas del I2C . . . . . . .
10.28.Conexin a nivel fsico . . . . . . . . . .
10.29.Conexin a nivel lgico . . . . . . . . . .
10.30.Formato de los mensajes . . . . . . . . .
10.31.Direccionamiento de los esclavos . . . .

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

133
133
134
134
135
135
137
140
141
142
142
143
144
144
145
148
148
149
150
150
151
151
152
152
153

11.1. Diagrama esquemtico general . .


11.2. Ventana inicial de MPLAB. Paso 2
11.3. Paso 5 . . . . . . . . . . . . . . . .
11.4. Paso 6 . . . . . . . . . . . . . . . .
11.5. Paso 7 . . . . . . . . . . . . . . . .
11.6. Paso 8 . . . . . . . . . . . . . . . .
11.7. Paso 9 . . . . . . . . . . . . . . . .
11.8. Paso 10 . . . . . . . . . . . . . . .
11.9. Paso 11 . . . . . . . . . . . . . . .
11.10.Paso 12 . . . . . . . . . . . . . . .
11.11.Paso 13 . . . . . . . . . . . . . . .
11.12.Paso 14 . . . . . . . . . . . . . . .
11.13.Paso 15 . . . . . . . . . . . . . . .
11.14.Paso 16 . . . . . . . . . . . . . . .
11.15.Paso 17 . . . . . . . . . . . . . . .
11.16.Paso 1 . . . . . . . . . . . . . . . .
11.17.Paso 1 . . . . . . . . . . . . . . . .
11.18.Paso 2 . . . . . . . . . . . . . . . .

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

155
157
159
159
160
160
161
161
162
162
163
163
163
164
164
165
166
166

13

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

11.19.Paso 3 . . . . . . . . . . . . . . . . . . . . . . . .
11.20.Paso 4 . . . . . . . . . . . . . . . . . . . . . . . .
11.21.Paso 1 . . . . . . . . . . . . . . . . . . . . . . . .
11.22.Paso 2 . . . . . . . . . . . . . . . . . . . . . . . .
11.23.Paso 6 . . . . . . . . . . . . . . . . . . . . . . . .
11.24.Diagrama esquemtico general . . . . . . . . . .
11.25.Diagrama esquemtico general. Parte 1 . . . . . .
11.26.Diagrama esquemtico general. Parte 2 . . . . . .
11.27.OPTION register . . . . . . . . . . . . . . . . . .
11.28.Temporizador TMR1 . . . . . . . . . . . . . . . .
11.29.T1CON . . . . . . . . . . . . . . . . . . . . . . .
11.30.PIE1 . . . . . . . . . . . . . . . . . . . . . . . . .
11.31.PIR1 . . . . . . . . . . . . . . . . . . . . . . . . .
11.32.Interrupciones. Parte 1 . . . . . . . . . . . . . . .
11.33.Interrupciones. Parte 2 . . . . . . . . . . . . . . .
11.34.Interrupciones. Parte 3 . . . . . . . . . . . . . . .
11.35.Contador de un dgito . . . . . . . . . . . . . . .
11.36.Contador de dos dgitos . . . . . . . . . . . . . .
11.37.Contador de dos dgitos con multiplexacin . . .
11.38.Nuevo proyecto en mikroC. Paso 3 . . . . . . . .
11.39.Detalles del proyecto. Paso 4 . . . . . . . . . . .
11.40.Archivos dentro del proyecto. Paso 5 . . . . . . .
11.41.Library manager. Paso 6 . . . . . . . . . . . . . .
11.42.Fin de creacin del proyecto. Paso 7 . . . . . . .
11.43.Hardware . . . . . . . . . . . . . . . . . . . . . .
11.44.Esquema de la prctica . . . . . . . . . . . . . .
11.45.Lenguaje C . . . . . . . . . . . . . . . . . . . . .
11.46.Manejo del LCD: Hardware . . . . . . . . . . . .
11.47.Hardware correspondiente al manejo del teclado .
11.48.Manejo del PWM: hardware . . . . . . . . . . . .
11.49.Control de velocidad de un motor DC . . . . . .
11.50.Grfica de la seal de voltaje . . . . . . . . . . .
11.51.Manejo del ADC: hardware . . . . . . . . . . . .
11.52.Comunicacin USART: hardware . . . . . . . . .
11.53.Comunicacin I2C: hardware . . . . . . . . . . .

14

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

167
167
169
169
170
171
178
180
185
185
186
186
186
187
189
191
196
199
203
208
208
209
209
210
210
215
217
219
221
225
227
228
228
230
232

Captulo 1

Arquitectura Interna
Esencialmente, un microcontrolador es un circuito integrado programable
(Figura 1.1), capaz de ejecutar las rdenes grabadas en su memoria. Est compuesto de varios bloques funcionales, los cuales cumplen una tarea
especfica. Un microcontrolador incluye en su interior las tres principales
unidades funcionales de una computadora: unidad central de procesamiento, memoria y perifricos de entrada/salida.
Adems tiene un conjunto de instrucciones que definen acciones que puede
realizar el micro. stas constituyen el lenguaje del micro o software.

Figura 1.1: Microcontrolador PIC16F887

15

1.0.1.

Caractersticas Generales

El microcontrolador cuenta con solo 35 instrucciones diferentes.


Todas las instrucciones son uni-ciclo excepto por las de ramificacin o salto.
Frecuencia de operacin 0-20 MHz.
Oscilador interno de alta precisin.
Calibrado de fbrica.
Rango de frecuencia de 8 MHz a 31 kHz seleccionado por software.
Voltaje de la fuente de alimentacin de 2.0 V a 5.5 V.
Consumo: 220 A (2.0 V, 4 MHz), 11 A (2.0 V, 32 kHz) 50 nA (en modo
de espera).
Ahorro de energa en el Modo de suspensin.
Brown-out Reset (BOR) con opcin de control por software.
35 pines de entrada/salida.
Alta corriente de fuente y de drenador para manejo de LED.
Resistencias pull-up programables individualmente por software.
Interrupcin al cambiar el estado del pin.
Memoria ROM de 8 kB con tecnologa FLASH.
El chip se puede reprogramar hasta 100.000 veces.
Opcin de programacin serial en el circuito.
El chip se puede programar incluso incorporado en el dispositivo de destino.
256 bytes de memoria EEPROM cuyos datos pueden grabarse hasta 1000.000
de veces.
Los datos se pueden grabar ms de 1.000.000 veces.
368 bytes de memoria RAM
Convertidor A/D con 14 canales con resolucin de 10 bits.
3 temporizadores/contadores independientes: Timer0, Timer1 y Timer2.
Temporizador perro guardin.
Mdulo comparador analgico con dos comparadores analgicos.
Referencia de voltaje fija (0.6 V).
Referencia de voltaje programable en el chip.
Mdulo PWM incorporado.
Mdulo USART mejorado.
Soporta las comunicaciones seriales RS-485, RS-232 y LIN2.0.
Auto deteccin de baudios.
Puerto Serie Sncrono Maestro (MSSP).
Soporta los modos de comunicacin serial sincrnica SPI e I2C.

16

1.0.2.

Patitas multifuncionales

Como puede ver en el pin RA3: RA3/AN3/Vref+/C1IN+ (Figura 1.2)


Significa que tiene varias funcionalidades:
RA3 Port A entrada/salida digital 3
AN3 Entrada analgica 3
Vref+ Referencia de voltaje positiva
C1IN+ Entrada positiva de comparador C1.
Estas caractersticas no pueden usarse en forma simultnea pero pueden
cambiarse durante la operacin.

Figura 1.2: Pines Microcontrolador PIC16F887

17

1.0.3.

Unidad Central de Procesamiento CPU

El CPU representado por bloques funcionales en la Figura 1.3, reconoce


35 instrucciones a diferencia de otros microcontroladores con ms de 200
instrucciones.
El tiempo de ejecucin de una instruccin es de 4 ciclos de reloj (excepto
las de instrucciones de salto que demoran el doble). Esto significa que si
la velocidad de operacin del microcontrolador es de 20 MHz el tiempo de
ejecucin de cada instruccin es de 200 ns. Es decir que trabajando a 20
MHz el programa ejecutar 5000.000 de instrucciones por segundo.

Figura 1.3: Diagrama de bloques del PIC

1.0.4.

Memorias

El microcontrolador PIC16F887 tiene 3 tipos de memoria:


ROM FLASH
RAM
EEPROM

1.0.5.

Memoria ROM o de Programa

Almacena en forma permanente el programa a ejecutarse y se la llama generalmente Memoria de programa. El PIC16F887 posee 8 kB.
Se la divide en cuatro pginas indicadas por el registro PCLATH BITS 4 y
3 que son los bits ms significativos del registro contador del programa que
es la concatenacin de los registros PCL y PCLATH.

18

La memoria ROM est implementada con tecnologa FLASH. Para grabar


la memoria FLAH se utiliza un programador que emplea un voltaje de programacin de 13 V.

1.0.6.

Memoria EEPROM

Similar a la memoria de programa, el contenido de la memoria EEPROM


se guarda permanentemente al apagar la fuente de alimentacin. Sin embargo, a diferencia de la ROM, el contenido de la EEPROM se puede cambiar
durante el funcionamiento del microcontrolador. Es la razn por la que esta memoria (256 localidades) es perfecta para guardar permanentemente
algunos resultados creados y utilizados durante la ejecucin del programa.

1.0.7.

Memoria de Datos o Memoria RAM

Es la tercera y la parte ms compleja de la memoria del microcontrolador.


Est dividido en dos partes: en registros de propsito general y en los registros de funciones especiales (SFR). Todos estos registros se dividen en cuatro
bancos de memoria de los que vamos a hablar ms tarde en este captulo
(Figura 1.4). Aunque los dos grupos de registros adoptan valores iniciales
al apagar la fuente de alimentacin, estn fabricados de la misma forma y
se comportan de manera similar, sus funciones no tienen muchas cosas en
comn.

Figura 1.4: Memoria RAM

19

1.0.8.

Registros de Propsito General

Los registros de propsito general se utilizan para almacenar los datos temporales y los resultados creados durante el funcionamiento. Por ejemplo, si
el programa realiza el conteo (de los productos en una cadena de montaje),
es necesario tener un registro que representa lo que en la vida cotidiana llamamos suma. Como el microcontrolador no es nada creativo, es necesario
especificar la direccin de un registro de propsito general y asignarle esa
funcin. Se debe crear un programa simple para incrementar el valor de este
registro por 1, despus de que cada producto haya pasado por el sensor.
Ahora el microcontrolador puede ejecutar el programa ya que sabe qu es
y dnde est la suma que se va a incrementar. De manera similar, a cada
variable de programa se le debe pre-asignar alguno de los registros de propsito general.
Ejemplo:
/* En esta secuencia, la variable en el registro sum se aumenta cada vez que
se lleve un uno (1) lgico en el pin de entrada RB0. */
...
if (PORTB.0 = 1) // Comprobar si el pin RB0 est a uno
sum++ ; // Si est, el valor de la variable se aumenta por 1
... // Si no est, el programa sale de la sentencia if

1.0.9.

Registros de Funciones Especiales (SFR)

Los registros de funciones especiales son tambin parte de la memoria RAM.


A diferencia de los registros de propsito general, su propsito es predeterminado durante el proceso de fabricacin y no se pueden cambiar. Como
los bits estn conectados a los circuitos particulares en el chip (convertidor
A/D, mdulo de comunicacin serial, etc), cualquier cambio de su contenido
afecta directamente al funcionamiento del microcontrolador o de alguno de
los circuitos.
Por ejemplo, el registro ADCON0 controla el funcionamiento del convertidor A/D. Al cambiar los bits se determina qu pin del puerto se configurar
como la entrada del convertidor, el momento del inicio de la conversin as
como la velocidad de la conversin.
Otra caracterstica de estas localidades de memoria es que tienen nombres
(tanto los registros como sus bits), lo que simplifica considerablemente el
proceso de escribir un programa. Como el lenguaje de programacin de alto
nivel puede utilizar la lista de todos los registros con sus direcciones exactas,
basta con especificar el nombre de registro para leer o cambiar su contenido.

20

Ejemplo:
// En esta secuencia, el contenido de los registros TRISC y PORTC ser
modificado
...
TRISC = 0x00 // un cero lgico (0) se escribe en el registro TRISC (todos
// los pines del puerto PORTC se configuran como salidas)
PORTC = 0b01100011 // cambio de estado lgico de todos los pines del
puerto PORTC.

1.0.10.

Banco de Datos

La memoria RAM se divide en cuatro bancos de datos. Antes de acceder a


un registro debe seleccionarse el banco en donde est ubicado dicho registro.
Los BITS 5 y 6 del registro STATUS son utilizados para la seleccin de
bancos. Los registros SFR ms comunes tienen la misma direccin en todos
los bancos permitiendo su fcil acceso.
Trabajar con bancos puede ser difcil slo si se escribe un programa en lenguaje ensamblador. Al utilizar el lenguaje de programacin de alto nivel
como es C y el compilador como es mikroC PRO for PIC, basta con escribir
el nombre del registro. A partir de esa informacin, el compilador selecciona
el banco necesario (Figura 1.5).

Figura 1.5: Acceso a los Bancos de Registros

21

Captulo 2

Conjunto de Instrucciones
2.1.

Clasificacin de las Instrucciones

El conjunto de instrucciones es altamente ortogonal y estn agrupadas en


tres categoras bsicas.
1.- Instrucciones orientadas a byte.(Figura 2.1 y Figura 2.2) .
2.- Instrucciones orientadas a bit.(Figura 2.3 y Figura 2.4)
3.- Instrucciones de literales y de control.(Figura 2.5 y Figura 2.6)

2.1.1.

Instrucciones orientadas a byte

Figura 2.1: Formato de instruccin orientada a byte


Si d=0 el destino es W.
Si d=1 el destino es f.
f es la direccin de 7 bits del registro.
El formato de todas las instrucciones consiste de una palabra de 14 bits
dividida en un cdigo de operacin que especifica el tipo de instruccin de
uno o ms operandos.
En esta pgina y las siguientes se muestra los tres formatos generales que
las instrucciones pueden tener.

22

Ejemplo:
MOVF f, d.
cdigo: 00 1000 dfff ffff.
Operacin: f- destino, actualiza bandera Z.
si d=0 entonces f- w.
si d=1 entonces f- f, en este caso se utiliza para saber si el contenido de f
es cero.
En estas instrucciones f representa un registro SFR (ej: PORTA) o el
nombre de una variable RAM (TEMP1), que sirve como operando fuente o
destino.
d representa al operando destino: si d=0 el destino es el registro W, si
d=1 el destino es el file f especificado en la instruccin.

Figura 2.2: Instrucciones de byte

23

2.1.2.

Instrucciones orientadas a bit

Figura 2.3: Formato instrucciones orientadas a bit


bbb es el nmero en binario del bit.
f es la direccin de 7 bits del registro.

Ejemplo.
BSF f, b
cdigo: 01 01bb bfff ffff
operacin: 1- bit (bbb) de f
As: BSF f, 5 realiza 1 - f5.
En estas instrucciones b representa un campo de 3 bits que selecciona el
nmero de bit afectado en la operacin, mientras que f representa el registro en el cual el bit est localizado.

Figura 2.4: Instrucciones orientadas a bit

24

2.1.3.

Instrucciones de literales y control

Figura 2.5: Formato instrucciones de literales


k es un valor inmediato o constante de 8 bits.
En la mayora de las instrucciones k representa un dato de 8 bits.

Ejemplo
En estas instrucciones k representa una constante de 8 u 11 bits, llamada
literal.
XORLW k
cdigo: 11 1010 kkkk kkkk
operacin: W kkkkkkkk W
As: XORLW 32, entonces: W 00100000 W
En la mayora de estas instrucciones como XORLW k, donde k es un byte,
ste es un dato.
GOTO k
cdigo: 101kkk kkkk kkkk
operacin: PC12PC11 kkkkkkkkkkk- PC
En las instrucciones de control como GOTO k, el literal k de 11 bits se usa
para hallar una direccin.

25

Figura 2.6: Instrucciones de literales y control

26

2.2.

Ciclo de Instruccin

Cada ciclo de instruccin demora 4 ciclos de reloj. Durante el proceso de una


instruccin el microcontrolador gracias a que su hardware emplea la tcnica
de tuberas, realiza la bsqueda de la prxima instruccin mientras realiza
la ejecucin de la anterior (Figura 2.7) , la mayora de las instrucciones de
los PIC demoran un ciclo de instruccin.
La excepcin son las instrucciones de salto o ramificacin, donde al no poder
solapar su ejecucin con la bsqueda de la siguiente, son necesarios los dos
ciclos de instruccin.

Figura 2.7: Ciclo de Instruccin


El ciclo de instruccin demora cuatro ciclos de reloj que de acuerdo al grfico
anterior siendo Q1=Q2=Q3=Q4 se obtiene:
CI=Ciclo de Instruccin=4Q=4Tosc
Donde: Tosc = 1/Fosc
Ejemplos:
Para fosc = 4 MHz: CI =4Q= 4Tosc = 4(1/4 MHz) = 1 s
Para fosc = 20 MHz: CI = 4Q=4Tosc = 4 x 1/20 MHz = 0.2 s = 200 ns

27

2.3.

Detalle de las principales Instrucciones

Este conjunto de instrucciones es aplicable a la gama media de los microcontroladores de Microchip a la que pertenece el PIC16F887.
Estas instrucciones han sido optimizadas para tener una mayor velocidad
de trabajo, una arquitectura ms simple y un cdigo ms compacto. Por el
reducido nmero de instrucciones la arquitectura de estos dispositivos se la
conoce como arquitectura RISC.
Antes de continuar se definen las abreviaturas usadas para explicar las instrucciones:
f: cualquier registro del microcontrolador
W: registro de trabajo
b: posicin de un bit en el registro f
d: destino, puede ser f (d=1) o W (d=0)
etiqueta: grupo de caracteres que marcan el inicio de una parte del programa
Conjunto de instrucciones se detalla a continuacin:

ADDWF: Suma W y f
Suma el contenido del registro W y el registro f. Si d es 0, el resultado se
almacena en el registro W. Si d es 1 el resultado se almacena en el registro
f.
Sintaxis: [etiqueta]ADDWF f,d
Operacin: (W) + (f) (destino)
Flags afectados: C, DC, Z
Ejemplo: ADDWF REG,1
Antes de la instruccin: W=0x03, REG=0x04
Despus de la instruccin: W=0x03, REG=0x07
ANDWF: W AND f
Realiza la operacin lgica AND entre el registro W y el registro f. Si d
es 0 el resultado se almacena en el registro W. Si d es 1, el resultado se
almacena en el registro f.
Sintaxis: [etiqueta]ANDWF f,d
Operacin: (W) AND (f) (destino)
Flags afectados: Z
Ejemplo: ANDWF REG,1
Antes de la instruccin: W=0x17, REG=0XC2
Despus de la instruccin: W=0x17, REG=0x02

28

CLRF: Borra un registro


Borra el contenido del registro f y se activa el flag Z.
Sintaxis: [etiqueta] CLRF f
Flags afectados: Z
Ejemplo: CLRF REG
Antes de la instruccin: REG=0x54
Despus de la instruccin: REG=0x00,Z=1
CLRW: Borra el registro de trabajo W
Borra el contenido del registro W y se activa el flag Z. Esta
instruccin no tiene operandos.
Sintaxis: [etiqueta] CLRW
Flags Afectados: Z
Ejemplo: CLRW
Antes de la instruccin: W=0x54
Despus de la instruccin: W=0x00,Z=1
COMF: Complementa el registro f
El contenido del registro f se complementa.
Si d=0 el resultado se almacena en el registro W.
Si d=1 el resultado se almacena en el registro f.
Sintaxis: (etiqueta ) COMF f,d
Flags afectados: Z
Ejemplo: COMF REG,0
Antes de la instruccin: REG=0x13
Despus de la instruccin: REG=0x13, W=0xEC
DECF: Decrementa f en 1
De decrementa en uno el contenido del registro f.
Si d=0, el resultado se almacena en W.
Si d=1, el resultado se almacena en f.
Sintaxis: (etiqueta) DECF f,d
Flags afectados: Z
Ejemplo: DEC CONT,1
Antes de la instruccin: CONT=0x01, Z=0
Despus de la instruccin: CONT=0x00, Z=1
DECFSZ: Decrementa en 1 y salta si el resultado es 0
El contenido del registro f se decrementa. Si d=0, el resultado se coloca en
el registro W. Si d=1, el resultado se coloca en el registro f. Si el resultado
es 0, se salta a la siguiente instruccin y se contina con la ejecucin.
Sintaxis: [etiqueta]DECFSZ f,d.
Flags afectados: Ninguno.

29

INCF: Incrementa el registro f


Incrementa en 1 el contenido del registro f. Si d=0, el resultado se almacena en W. si d=1, el resultado se almacena en f.
Sintaxis: [label] INCF f,d.
Flags afectados: Z.
Ejemplo: INCF CONT,1
Antes de la Instruccin: CONT=0xFF, Z=0
Despus de la instruccin: CONT=0x00, Z=1
INCFSZ: Incrementa en 1 y salta si el resultado es 0
El contenido del registro f se incrementa si d=0, el resultado se coloca en
el registro W si d=1, el resultado se coloca en el registro f. Si el resultado
es 0, se salta la siguiente instruccin y se contina con la ejecucin.
Sintaxis: [etiqueta] INCFSZ f,d
Flags afectados: Ninguno
IORWF: W OR f
Realiza la operacin lgica OR entre el registro W y el registro f. Si d=0
el resultado se almacena en el registro W. Si d=1, el resultado se almacena
en el registro f.
Sintaxis: [etiqueta] IORWF f,d
Flags afectados: Z
Ejemplo: IORWF REG, 0
Antes de la instruccin: REG=0x13, W=0x91
Despus de la instruccin: REG=0x13, W=0x93
MOVF: Mover el registro f
El contenido del registro f se mueve al destino d. Si d=0, el destino es
el registro W.
Si d=1, el destino es el propio registro f.
Sintaxis: [etiqueta] MOVF f,d
Flags afectados: Z
Ejemplo: MOVF REG,0
Despus de la instruccin: W=REG
RLF: Rota el registro f a la izquierda
El contenido del registro f se rota una posicin a la izquierda. El bit de
ms peso pasa al carry y el carry se introduce por el bit de menos peso de
f. Si d=0, el resultado se coloca en el registro W. Si d=1, el resultado
queda en el registro f.
Sintaxis: [etiqueta] RLF f,d
Flags afectados: C

30

RRF: Rota el registro f a la derecha


El contenido del registro f se rota una posicin a la derecha. El bit de menos peso pasa al carry y el carry se introduce por el bit de ms peso de f.
Si d=0, el resultado se coloca en el registro W. Si d=1, el resultado queda
en el registro f.
Sintaxis: [etiqueta] RLF f, d
Flags afectados: C
SUBWF: Resta f W
Resta el contenido del registro f menos el contenido del registro W. Si d=0,
el resultado se almacena en el registro W. Si d=1, el resultado se almacena
en el registro f.
Sintaxis: [etiqueta] SUBWF f, d
Flags afectados: C, DC, Z
Ejemplo: SUBWF REG, 1
SWAPF: Intercambio de f
El nibble bajo del registro f se intercambia con el nibble alto del mismo. Si
d=0, El resultado se coloca en el registro W. Si d=1, el resultado queda en
el registro f.
Sintaxis: [etiqueta] SWAPF f, d.
Flags afectados: Ninguno
Ejemplo: SWAPF REG, 1
Antes de la instruccin: REG=0x54
Despus de la instruccin: REG=0x45
XORWF: W XOR f
Realiza la funcin lgica OR exclusiva entre el contenido del registro W y
el registro f.
Si d=1, el resultado se almacena en el registro f.
Sintaxis: [etiqueta] XORWF f, d.
Flags afectados: Z
Ejemplo: XORWF REG, 1
Antes de la instruccin: REG=0xAF, W=0xB5
Despus de la instruccin: REG=0x1A, W=0xB5
BCF: Borrar un bit
Borrar el bit b del registro f.
Sintaxis: [etiqueta] BCF f,b.
Ejemplo: BCF REG,0
Antes de la instruccin: REG=b01101101
Despus de la instruccin: REG=b01101100

31

BSF: Activa un bit


Activa el bit b del registro f.
Sintaxis: [etiqueta] BSF f,b.
Ejemplo: BSF REG,2
Antes de la instruccin: REG=b01001001
Despus de la instruccin: REG=b01001101
BTFSC: Chequea un bit y salta si es 0
Si el bit b del registro f es 0, se salta una instruccin y contina con la
ejecucin.
Sintaxis: [etiqueta] BTFSC f,b.
BTFSS: Chequea un bit y salta si es 1
Si el bit b del registro f es 1, se salta una instruccin y contina con la
ejecucin.
Sintaxis: [etiqueta] BTFSS f,b.
NOP: No operacin
No realiza ninguna operacin, solo consume un ciclo de reloj.
Sintaxis: [etiqueta] NOP
ANDLW: W AND literal
Realiza la operacin lgica AND entre el registro W y la constante k. El
resultado se almacena en el registro W.
Sintaxis: [label] ANDWL k
Flags afectados: Z
Ejemplo: ANDLW 0x5F
Antes de la instruccin: W=0xA3
Despus de la instruccin: W=0x03
CALL: Llamada a subrutina
La direccin de retorno se guarda en el stack. La constante k de 8 bits
forma la direccin de salto y se carga en los bits del PC.
Los bits del PC se cargan con los del registro STATUS. PC cambia a 0.
Sintaxis: [etiqueta] CALL k
Ejemplo: INICIO CALL DESTINO
Antes de la instruccin: PC=INICIO
Despus de la instruccin: PC=DESTINO
CLRWDT: Borrar el watchdog timer
Esta instruccin borra tanto el watchdog como el pre-escalador. Los bits
TO y PD del registro de estado se pone a "1".
Sintaxis: [label] CLRWDT
Flags afectados: TO,PD
32

GOTO: Salto Incondicional


Se trata de un salto condicional. Los 9 bits de la constante "k"que forman
la instruccin, se cargan en los bits del registro PC y forman la direccin de
salto. Los bits del PC se cargan con los bits del registro de estado.
Sintaxis: [label] GOTO k
Ejemplo: INICIO GOTO DESTINO
Antes de la instruccin: PC=0
Despus de la instruccin: PC=DESTINO
RETLW: Regresa de una subrutina y carga el valor K en W
El programa regresa de la subrutina y carga el valor de 8 bits del registro k
en el registro W.
Sintaxis: [etiqueta] RETLW, k
Ejemplo: RETLW, 0x45
Antes de la instruccin: W=xx
Despus de la instruccin: W=0x45
RETFIE: Regresa de la rutina de servicio
Sintaxis: [etiqueta] RETFIE
SLEEP: Entra en estado de reposo
Al salir, activa el bit de estado TO y borra el PD. El WDT y el preescalador
se borran.
Al entrar en el modo SLEEP, se detiene el oscilador.
Sintaxis: [etiqueta] SLEEP
Flags afectados: TO, PD, GPWUF
XORLW: W XOR literal
Realiza la funcin lgica OR exclusiva entre el contenido del registro W y
la constante k de 8 bits. El resultado se almacena en el registro W.
Sintaxis: XORLW k
Flags afectados: Z
Ejemplo: XORLW 0xAF
Antes de la instruccin: W = 0xB5
Despus de la instruccin: W = 0x1A
SUBLW: Resta L W
A una constante k de 8 bits se le resta el registro W. El resultado es guardado en el mismo registro W.
Sintaxis: SUBLW k
Flags afectados: C, DC, Z

33

2.4.
2.4.1.

Direccionamiento
Direccionamiento inmediato

Ocurre en instrucciones con literales que forman parte de la instruccin.


Es decir que el dato se encuentra en la misma instruccin. En el cdigo de
mquina est embebido el dato.

2.4.2.

Direccionamiento directo

Ocurre en las instrucciones que contienen la direccin del dato requerido.


En el cdigo de mquina est embebido la direccin del dato.
Con el direccionamiento directo el cual es lgico y claro por s mismo, es
suficiente direccionar un registro para leerlo (Figura 2.8).

Figura 2.8: Ejemplo de direccionamiento directo

2.4.3.

Direccionamiento indirecto

Ocurre cuando en la instruccin se tiene una operacin con el registro INDF,


lo cual indica que el valor del dato se encuentra en la direccin guardada en
el registro FSR (7-BITS menos significativos).
El microcontrolador PIC16F887 es adems capaz de hacer direccionamiento
indirecto por medio de los registros INDF y FSR. Algunas veces el direccionamiento indirecto simplifica considerablemente la escritura de un programa
(Figura 2.9).

34

Figura 2.9: Direccionamiento indirecto


El direccionamiento indirecto emplea el registro INDF, el cual, no es un
registro verdadero (fsicamente no existe), solamente especifica el registro
apuntado por el registro FSR. Debido a esto la lectura/escritura sobre el
registro INDF significa la lectura/escritura del registro apuntado por el registro FSR. En otras palabras en el registro FSR se especifican las direcciones
de los registros apuntados y en INDF se colocan sus valores(Figura 2.10).

Figura 2.10: Ejemplo Direccionamiento indirecto

35

2.4.4.

Direccionamiento Directo e indirecto

Se presenta una explicacin grfica de los dos direccionamientos (Figura


2.11):

Figura 2.11: Direccionamiento Directo e Indirecto

36

2.5.
2.5.1.

Registros de trabajo
STATUS

Figura 2.12: Registro STATUS


El registro STATUS contiene (Figura 2.12): el estado aritmtico de datos en
el registro W, el estado RESET, los bits para seleccionar el banco para los
datos de la memoria.
IRP - Bit de Seleccin de Banco de Registros (usado para direccionamiento
indirecto)
0 - Bancos 0 y 1 son activos (localidades de memoria 00h-FFh)
1 - Bancos 2 y 3 son activos (localidades de memoria 100h-1FFh)
RP1,RP0 - Bits de Seleccin de Banco de Registros (usado para direccionamiento directo).
RP1 RP0 BANCO ACTIVO
0
0
Banco 0
0
1
Banco 1
1
0
Banco 2
1
1
Banco 3
TO - Time-out bit (bit de salida del temporizador perro guardin)
1 - Despus de encender el microcontrolador, despus de ejecutarse la instruccin CLRWDT que reinicia al WDT (temporizador perro guardin) o
despus de ejecutarse la instruccin SLEEP que pone al microcontrolador
en el modo de bajo consumo.
0 - Despus de acabarse el tiempo del WDT.
PD - Power-down bit (bit de apagado)
1 - Despus de encender el microcontrolador, despus de ejecutar la instruccin CLRWDT que reinicia al WDT.
0 - Despus de ejecutarse la instruccin SLEEP que pone al microcontrolador en el modo de bajo consumo.
Z - Zero bit (bit cero)
1 - El resultado de una operacin lgica o aritmtica es 0.
0 - El resultado de una operacin lgica o aritmtica es distinto de 0.
DC - Digit carry/borrow bit (bit de acarreo/prstamo de dgito) cambia
al sumar o al restar si ocurre un desbordamiento o un prstamo en el
resultado.
1 - Hubo acarreo del cuarto bit de orden bajo (nibble bajo) en el resultado.
0 - No hubo acarreo del cuarto bit de orden bajo (nibble bajo) en el resultado.
37

C - Carry/Borrow bit (bit de acarreo/prstamo) cambia al sumar o al restar


si ocurre un desbordamiento o un prstamo en el resultado, o sea si el
resultado es mayor de 255 o menor de 0.
1 - Ocurri acarreo en el bit ms significativo (MSB) del resultado.
0 - No ocurri acarreo en el bit ms significativo (MSB) del resultado.

2.5.2.

OPTION REG

Figura 2.13: Registro OPTION REG


El registro OPTION REG contiene (Figura 2.13):
RBPU - Port B Pull up
1 - PortB pull-ups deshabilitados.
0 - PortB pull-ups habilitados.
INTEDG Seleccin del Flanco de Interrupcin
1 Interrupcin con el flanco de subida del bit RB0/INT.
0 - Interrupcin con el flanco de bajada del bit RB0/INT.
T0CS Selecciona el origen del reloj del TMR0
1 Como contador de pulsos del pin TOCKI.
0 Reloj de instrucciones interno (Fosc/4).
T0SE Seleccin del flanco de conteo del TMR0 desde TOCK1
1 Incrementa en flanco de bajada del pin RA4/TOC1.
0 - Incrementa en flanco de subida del pin RA4/TOC1.
PSA Asignacin del pre-escalador al WDT o al TMR0
1 Pre-escalador se asigna al WDT.
0 Pre-escalador se asigna al TMR0.
PS2, PS1, PS0 Bits de seleccin del Pre-escalador
La divisin del Pre-escalador es seleccionada mediante tres bits (Figura
2.14)y se lo asigna al (TMR0) o al perro guardin (WDT) de acuerdo a
la siguiente tabla:

38

Figura 2.14: Tabla Pre-escalador

2.5.3.

PCON

Figura 2.15: Registro PCON


El registro PCON (Figura 2.15)contiene dos banderas para diferenciar entre:
POR,BOR,MCLR y WDT reset. As como tambin un control para Ultra
low power reset y un habilitador por software del BOR.
ULPWUE Bit habilitador de Ultra Low-Power Wake-up
1 Habilitador de Ultra low Power Wake-up.
0 - Deshabilitador de Ultra low Power Wake-up.
SBOREN - Bit habilitador de Software BOR Enable
1 - Habilitador de Brown-out Reset.
0 - Deshabilitador de Brown-out Reset.
POR Bit de Power-on Reset
1 Cuando no ha ocurrido POR
0 - Cuando ha ocurrido POR. Este bit tiene que ser seteado por software
BOR - Bit de Brown-out Reset
1 - Cuando no ha ocurrido un Brown-out Reset
0 - Cuando ha ocurrido un Brown-out Reset . Este bit debe de ser seteado
por software luego de un BOR.

39

2.5.4.

PC=PCLATH y PCL

Figura 2.16: Registro PC


El tamao de la memoria ROM del microcontrolador es de 8 kB. Es decir
8.192 posiciones para almacenar programas. Por esta razn el contador de
programa debe ser de 13 bits de ancho, conformado por 8 bits del registro
PCL y 5 bits del registro PCLATH (Figura 2.16).
El contador del programa cuenta normalmente hasta 2 kB por esta razn
la memoria ROM se divide en cuatro pginas de 2 kB. Para saltar entre
pginas es necesario programar los bits 4 y 3 de PCLATH (que son los indicadores de pgina) (Figura 2.17).
En llamadas a subrutinas o ejecuciones de saltos (instrucciones CALL y
GOTO), el microcontrolador es capaz de proveer solo 11-bits de direccionamiento. Por esta razn en forma similar a la memoria RAM dividida en
bancos, la memoria ROM se divide en cuatro pginas de 2 kB cada una.
Las instrucciones ejecutadas dentro de una pgina no tienen problema pero
para saltar entre pginas es necesario programar los bits 4 y 3 de PCLATH
(que son los indicadores de pgina). Cuando las subrutinas alcanzan las instrucciones RETURN, RETLW o RETFIE retornan al programa principal y
el microcontrolador simplemente contina con la ejecucin del programa a
partir de la direccin almacenada en la PILA o STACK.

40

Figura 2.17: Ubicacin en bancos del registro PC

2.6.

Registros de Configuracin

Un microcontrolador posee registros especiales que deben ser configurados


para su correcto funcionamiento entre los que destacamos:
Registro de Configuracin.
Configuracin de Puertos: Puertos de Entrada y Salida.
UNIDAD ULPWU.
Resistencias de PULL UP del PORTB.
Pines RB6 y RB7 del PORTB.

2.6.1.

Directiva: CONFIG

El Registro de Configuracin del 16F887 consta de dos registros CONFIG1


y CONFIG2 que se encuentran en las localidades 2007h y 2008h de la memoria de programa. Este es un espacio de configuracin de memoria especial
(2000h-3FFFh) al que solo se puede acceder en el momento de la programacin del microcontrolador.
La directiva CONFIG se emplea para programar los bits del Registro de
configuracin, la misma que se utiliza al inicio de un programa como por
ejemplo:
__CONFIG _CONFIG1, _CP_OFF & _WDT_OFF & _XT_OSC

41

La cual indica que se est configurando en la palabra de configuracin CONFIG1 : Cdigo de Proteccin deshabilitado permitiendo grabaciones posteriores, Perro Guardin apagado, Oscilador XT (4-10 MHz).
En el caso de utilizar un reloj de 20 MHz es necesario cambiar XT por HS
Antes de programar un microcontrolador se debe observar el registro de
configuracin. En el caso de utilizar el MPLAB se observa la ventana que
se ve en la Figura 2.18. En este momento es posible cambiar parmetros y
aquellos cambios que se realicen prevalecen sobre aquellos expresados en la
directiva CONFIG.

Figura 2.18: Ejemplo de Configuracin en MPLAB

42

2.6.2.

Directiva: INCLUDE P16F887.INC

Se la utiliza al inicio de un programa para indicar al compilador la ubicacin


de los registros de control (SFR) dentro de la memoria de datos.
El contenido del archivo P16F887.INC se lo encuentra en el sitio donde se
instal el compilador al cargar el programa MPLAB.
INCLUDE P16F887.INC ;Define los SFRs y bits de control del P16F887.
Entre las tareas a realizar antes de iniciar un programa est el hecho de
seleccionar directivas de trabajo entre las que se encuentran las directivas
INCLUDE y CONFIG para luego crear las variables necesarias en el programa. Slo a partir de este momento se puede iniciar un programa para
lo cual se usa la directiva ORG indicando el inicio del programa ejecutable
(Figura 2.19).
Lo primero que se hace al iniciar un programa es inicializar los puertos y
las variables que se utilizarn. Es aqu donde procedemos a configurar los
registros TRIS respectivos con (0) para configurar un pin como salida y con
(1) para configurarlo como entrada.

Figura 2.19: Ejemplo de la directiva INCLUDE

43

2.7.

Resistencias de PULL UP del PORTB

Figura 2.20: Puerto WPUB


Los pines del PORTB tienen resistencias de pull up integradas, completamente programables por medio del Registro WPUB (Figura 2.20). Esto
facilita la conexin con pulsadores, interruptores y optoacopladores. Con 1
se habilita la resistencia del bit respectivo habiendo activado previamente
el bit habilitador global (OPTION-REG ,7). Cuando se configuran los pines
como salida automticamente se deshabilitan los pull up (Figura 2.21).

Figura 2.21: Pines con Rpull-up

44

2.8.

Retardos

Los retardos pueden implementarse de diversa manera entre las que se destacan:
a) Mediante el empleo de retardos de tiempo causados por las instrucciones.
b) Mediante decremento de registros.
c) Mediante el uso de temporizadores e interrupciones.

2.8.1.

Uso de retardos causados por instrucciones

La forma ms sencilla de producir pequeos retardos es mediante el empleo


de la demora de cada instruccin, cuyo tiempo depende del reloj con el que
se trabaje:
Recuerde que las instrucciones simples demoran un ciclo de instruccin y las
dobles (de salto o llamado a subrutinas) demoran dos.
El ciclo de instruccin depende de la velocidad del reloj empleado:
Ciclo de instruccin=4/fosc= 4Tosc
Ejemplos segn el reloj utilizado
Para 20 MHz el ciclo de trabajo es de 0.2 s
Para 10 MHz el ciclo de trabajo es de 0.4 s
Para 4 MHz el ciclo de trabajo es de 1.0 s
Demora de algunas instrucciones
NOP demora 1 ciclo de instruccin
CLRF demora 1 ciclo de instruccin
CALL demora 2 ciclos de instruccin
DECFSZ demora 1 o 2 ciclo de instruccin
GOTO demora 2 ciclos de instruccin
BSF demora 1 ciclo de instruccin
MOVWF demora 1 ciclo de instruccin
RETURN demora 2 ciclos de instruccin

45

2.8.2.

Retardos Mediante decremento de registros

Otra forma de causar retardos es decrementando registros creados en la memoria de datos, los mismos que pueden anidarse para producir un mayor
retardo.
Si se emplea un solo registro el mximo retardo que podr causar ocurre
cuando se lo inicializa con 0x00.
Cuando se usan retardos anidados se pueden construir retardos mayores.

2.8.3.

Retardos Mediante el uso de temporizadores e interrupciones

Es una de las formas ms empleadas para producir retardos de precisin.


Este tema se lo estudiar cuando se estudien los temporizadores y las interrupciones.

2.9.

Tablas de Bsqueda

Una tabla es una subrutina que contiene una lista de valores de retorno, al
entregarle un valor retorna con otro valor. Razn por la que es usada para
construir decodificadores. Las tablas se hacen con ayuda del registro PCL.
Con una tabla se convierte fcilmente de cdigo BCD a cdigo de 7 segmentos.
Ejemplo de tabla de conversin de BCD a cdigo de 7 segmentos (ctodo
comn)
TABLA
ADDWF PCL,F ; PCL + W = W
RETLW 0x3F ; Retorna con el cdigo del 0
RETLW 0x06 ; Retorna con el cdigo del 1
RETLW 0x5B ; Retorna con el cdigo del 2
RETLW 0x4F ; Retorna con el cdigo del 3
RETLW 0x66 ; Retorna con el cdigo del 4
RETLW 0x6D ; Retorna con el cdigo del 5
RETLW 0x7D ; Retorna con el cdigo del 6
RETLW 0x07 ; Retorna con el cdigo del 7
RETLW 0x7F ; Retorna con el cdigo del 8
RETLW 0x67 ; Retorna con el cdigo del 9
END ; Fin del programa fuente

46

Para construir Tablas a menudo se usa la directiva DT. La misma tabla de


bsqueda anterior se la puede construir as:
TABLA
ADDWF PCL,F ; PCL + W = W
DT 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x67F
Como se puede observar la primera de la lnea se mantiene, mientras que
todos los valores de retorno de los RETLW se los ordena en la misma lnea
con la directiva DT.

2.10.

Display de 7 Segmentos

Un display 7 segmentos es un arreglo de leds dispuesto en un solo encapsulado que permite formar nmeros del 0 al 9.
Cada led es un segmento y van desde la a hasta la g, algunos displays contienen un octavo segmento correspondiente al punto decimal (Figura 2.22). Vea la siguiente figura la representacin en un display de 7 segmentos de la instruccin RETLW que retorna el cdigo del nmero 3.

Figura 2.22: Display de 7 Segmentos


Un display de 7 segmentos puede ser de nodo comn o de ctodo comn
(Figura 2.23).
Un segmento de nodo comn se ilumina con un 0 en su entrada aplicado
a travs de una resistencia limitadora de corriente.
Un segmento de ctodo comn se ilumina con un 1 en su entrada aplicado
a travs de una resistencia limitadora de corriente.

47

Figura 2.23: Display de 7 Segmentos nodo y ctodo comn

2.11.

Manejo de Botoneras, Interruptores y LEDS

Las botoneras, los interruptores, LEDS y los despliegues visuales de 7 segmentos permiten la interaccin entre el usuario y el microcontrolador.
Como se recordar el PORTB tiene resistencias de pull up stas se activan
por programa cuando funcionan como entradas. Una de sus funciones importantes es su capacidad de permitir la conexin de botoneras e interruptores
sin necesidad de resistencias de pull up externas, facilitando el uso de estos
dispositivos.
Los leds y los despliegues visuales de 7 segmentos actan como dispositivos
de salida. Para su conexin al microcontrolador hay que hacerlo mediante
resistencias limitadoras de corriente para no exceder la capacidad de manejo
de corriente de cada pin y la mxima potencia del microcontrolador.

48

Conexin de Botoneras
Las botoneras pueden conectarse de dos maneras (Figura 2.24):
a) Presentando un 1 cuando no est presionada
b) Presentando un 0 cuando no est presionada

Figura 2.24: Conexin de Botoneras

2.11.1.

Conexin de leds

Los leds deben conectarse a travs de una resistencia limitadora ya sea a la


fuente de voltaje o a tierra (Figura 2.25):
a) Cuando se conectan a tierra es necesario un 1 lgico en la salida del
microcontrolador para encenderlo.
b) Cuando se conectan a la fuente es necesario un 0 lgico en la salida del
microcontrolador para encenderlo.

Figura 2.25: Conexin de leds

49

2.12.

Sistema de Reloj

Todos los microcontroladores para poder funcionar necesitan de un reloj u


oscilador. El PIC16F887 puede funcionar con oscilador interno o externo.
Un oscilador externo est instalado fuera del microcontrolador y conectado
a los pines OSC1 y OSC2. Es denominado externo porque utiliza componentes externos para generar una seal de reloj y estabilizar la frecuencia.
Estos son: cristal de cuarzo, resonador cermico o circuito resistor capacitor.
El modo de funcionamiento del oscilador se selecciona por los bits, que se
envan durante la programacin, denominados Palabra de Configuracin.
El oscilador interno consiste en dos osciladores internos separados (Figura
2.26):
El HFINTOSC es un oscilador interno de alta frecuencia calibrado a 8 MHz.
El microcontrolador puede utilizar una seal de reloj generada a esta frecuencia o despus de haber sido dividida en el pre-escalador.
El LFINTOSC es un oscilador interno de baja frecuencia calibrado a 31 kHz.
Sus pulsos de reloj se utilizan para funcionamiento de los temporizadores de
encendido y perro guardin, asimismo puede utilizarse como fuente de seal
de reloj para el funcionamiento de todo el microcontrolador.

Figura 2.26: Diagrama de Bloques del Sistema de Reloj

50

2.12.1.

El Oscilador Externo

Los modos LP, XT y HS utilizan un oscilador externo como una fuente de


reloj cuya frecuencia est determinada por un cristal de cuarzo o por resonadores cermicos conectados a los pines OSC1 y OSC2 (Figura 2.27).
Dependiendo de las caractersticas de los componentes utilizados, seleccione
uno de los siguientes modos:
Modo LP - (Baja potencia) se utiliza slo para cristal de cuarzo de baja
frecuencia. Este modo est destinado para trabajar con cristales de 32.768
kHz normalmente embebidos en los relojes de cristal. Es fcil de reconocerlos
por sus dimensiones pequeas y una forma cilndrica. Al utilizar este modo
el consumo de corriente ser menor que en los dems modos.
Modo XT se utiliza para cristales de cuarzo de frecuencias intermedias hasta 8 MHz. El consumo de corriente es media en comparacin con los dems
modos.
Modo HS - (Alta velocidad) se utiliza para cristales de reloj de frecuencia
ms alta de 8 MHz. Al utilizar este modo el consumo de corriente ser mayor
que en los dems modos.

Figura 2.27: Oscilador externo

2.12.2.

Resonadores Cermicos en modo XT O HS

Los resonadores cermicos son similares a los cristales de cuarzo segn sus
caractersticas, por lo que se conectan de la misma manera. A diferencia de
los cristales de cuarzo, son ms baratos y los osciladores que hacen uso de
ellos son de calidad ms baja. Se utilizan para las frecuencias de reloj entre
100 kHz y 20 MHz.

51

2.12.3.

Oscilador Externo en modos RC Y RCIO

El uso de los elementos para estabilizar la frecuencia sin duda alguna tiene
muchas ventajas, pero a veces realmente no es necesario. En la mayora de
casos el oscilador puede funcionar a frecuencias que no son precisamente
definidas, as que sera una prdida de dinero utilizar tales elementos. La
solucin ms simple y ms barata en estas situaciones es utilizar una resistencia y un capacitor para el funcionamiento del oscilador. Hay dos modos:
Modo RC : Cuando el oscilador externo se configura a funcionar en modo
RC, el pin OSC1 debe estar conectado al circuito RC como se muestra en la
figura. La seal de frecuencia del oscilador RC dividida por 4 est disponible
en el pin OSC2. Esta seal se puede utilizar para la calibracin, sincronizacin o para otros propsitos (Figura 2.28).

Figura 2.28: Modo RC

52

Modo RCIO : De manera similar, el circuito RC est conectado al pin OSC1.


Esta vez, el pin OSC2 est disponible para ser utilizado como pin de E/S
de propsito general (Figura 2.29).

Figura 2.29: Modo RCIO

2.12.4.

Modos de Reloj Interno

Oscilador interno en modo INTOSC : En este modo, el pin OSC1 est disponible para ser utilizado como pin de E/S de propsito general. La seal
de frecuencia del oscilador interno dividida por 4 est disponible en el pin
OSC2 (Figura 2.30).

Figura 2.30: Modo INTOSC

53

Oscilador interno en modo INTOSCIO : En este modo, los dos pines estn
disponibles como pines de E/S de propsito general (Figura 2.31).

Figura 2.31: Modo INTOSCIO

2.12.5.

Configuracin del Oscilador Interno

El oscilador interno consiste en dos circuitos separados (Figura 2.32):


1. El oscilador interno de alta frecuencia HFINTOSC est conectado al postescalador (divisor de frecuencias). Est calibrado de fbrica y funciona a 8
MHz. Al utilizar el post-escalador, este oscilador puede producir una seal
de reloj a una de siete frecuencias. La seleccin de frecuencia se realiza dentro del software utilizando los pines IRCF2, IRCF1 y IRCF0 del registro
OSCCON.
El HFINTOSC est habilitado al seleccionar una de siete frecuencias (entre
8 MHz y 125 kHz) y poner a uno el bit de la fuente de reloj del sistema (SCS) del registro OSCCON. Como se muestra en la siguiente figura,
todo el procedimiento se realiza por medio de los bits del registro OSCCON.
2. El oscilador de baja frecuencia LFINTOSC no est calibrado de fbrica
y funciona a 31 kHz. Est habilitado al seleccionar la frecuencia (bits del
registro OSCCON) y poner a uno el bit SCS del mismo registro.

54

Figura 2.32: Diagrama de configuracin oscilador interno

Figura 2.33: Registro OSCCON


El registro OSCCON controla el oscilador del microcontrolador y las opciones de seleccin de reloj. Contiene los siguientes bits: bits de seleccin
de frecuencia (IRCF2, IRCF1, IRCF0), bits de estado de frecuencia (HTS,
LTS), bits de control de reloj del sistema (OSTA, SCS) (Figura 2.33).
OSTS - Oscillator Start-up Time-out Status bit (bit de estado del temporizador de encendido) indica cul fuente de reloj est actualmente en uso. Es
un bit de slo lectura.
1 - Se utiliza el oscilador de reloj externo.
0 - Se utiliza 1 oscilador de reloj interno (HFINTOSC o LFINTOSC). HTS
- HFINTOSC Status bit (8 MHz - 125 kHz) (bit de estado del HFINTOSC)
indica si el oscilador interno de alta frecuencia funciona en modo estable.
1 - HFINTOSC est estable.
0 - HFINTOSC no est estable.
LTS - LFINTOSC Stable bit (31 kHz) (bit de estado del LFINTOSC) indica
si el oscilador de baja frecuencia funciona en modo estable.
1 - LFINTOSC est estable.
0 - LFINTOSC no est estable.
SCS - System Clock Select bit (bit de seleccin del reloj del sistema) determina cul oscilador se utilizar como una fuente de reloj.
1 - Oscilador interno se utiliza como reloj del sistema.
0 - Oscilador externo se utiliza como reloj del sistema.El modo del oscilador
se configura por medio de los bits, denominados Palabra de Configuracin.
55

2.13.

Temporizadores

Se emplean para controlar periodos de tiempo (temporizadores) y para llevar la cuenta de acontecimientos que suceden en el exterior (contadores).
Para la funcin de temporizador se carga un registro con el valor adecuado
y a continuacin dicho valor se va incrementando o decrementando al ritmo
de los impulsos de reloj o algn mltiplo hasta que se desborde y llegue a 0,
momento en el que se produce un aviso.
Para la funcin de contador se pueden contar acontecimientos que se materializan por cambios de nivel o flancos en alguna de las entradas del microcontrolador, el mencionado registro se va incrementando o decrementando
al ritmo de dichos impulsos.
Para desempear las funciones de temporizador y contador los microcontroladores tienen registros especiales llamados temporizadores que en el caso
del PIC16F887 son:
a) Timer0 (TMR0)
b) Timer1 (TMR1)
c) Timer2 (TMR2)
d) Perro Guardin (WDT)

2.13.1.

TMR0

El TMR0 tiene una amplia gama de aplicaciones prcticas. Muy pocos programas no lo usan de alguna manera. Es muy conveniente de usarlo en
programas para generar pulsos, medir la duracin de pulsos externos o contar los pulsos recibidos.
El mdulo TMR0 tiene las siguientes caractersticas:
Contador/temporizador de 8-bits
Preescalador compartido con el WDT de 8-bits
Reloj interno programable o fuente de reloj externa
Interrupcin por desbordamiento
Seleccin de flanco de reloj externo programable

56

Figura 2.34: Registro OPTION REG


El regitro OPTION REG contiene (Figura 2.34):
RBPU Habilitador de Pull-up del PORTB
1 Deshabilita las resistencias pull-up
0 - Habilita las resistencias pull-up
INTEDG Selecciona el flanco que provoca la interrupcin externa
1 Interrupcin provocada por el flanco de subida de la seal INT enRB0
0 - Interrupcin provocada por el flanco de bajada de la seal INT enRB0
T0CS Seleccionador de origen de reloj
1 Contador de pulsos provenientes del pin RA4
0 Ciclos de reloj (Fosc/4).
T0SE - Selecciona el flanco que incrementa el TMR0
1 Incrementa en el flanco negativo
0 Incrementa en flanco positivo
PSA Asignacin del preescalador
1 Preescalador es asignado al WDT (Figura 2.37)
0 -Preescalador es asignado al temporizador/contador TMR0 (Figura 2.36)
PS2, PS1, PS0 Bits para la seleccin del preescalador (Figura 2.35). La
combinacin de estos tres bits permite la seleccin de diferentes rangos de
divisin asignados al TMR0 al WDT segn la seleccin hecha con anticipacin por el bit PSA.

57

Figura 2.35: Preescalador TMR0

Figura 2.36: Funcin del bit con PSA 0 del OPTION REG

58

Figura 2.37: Funcin del bit con PSA 1 del OPTION REG
Uso de frmula para calcular tiempos de temporizacin con el TMR0:
Formula: 4 x Tosc x [256 (valor a cargar en TMR0)] x (Preescalador del
TMR0)
Con esta frmula se pueden programar pequeos retardos usando la temporizacin del TMR0. Dado por ejemplo la temporizacin requerida en s se
puede escoger un preescalador adecuado y despejar de la frmula anterior el
valor a cargar en el TMR0 (Figura 2.38).
Cuando el microcontrolador entra en el modo SLEEP, el oscilador se detiene, por tanto el TMR0 no puede contar ni causar interrupciones para salir
del modo SLEEP.
Cuando el preescalador est asignado al TMR0, cualquier escritura al TMR0
pondr en cero al preescalador. En forma similar cuando el preescalador est
asignado al WDT, la instruccin CLRWDT pondr en cero tanto el WDT
como el preescalador.

59

Figura 2.38: Timer TMR0

2.13.2.

TMR1

El timer TMR1 es un contador de 16 bits y combina dos registros el TMR1L


y el TMR1H. Puede contar hasta 65.535 generar una bandera de sobrecarga
y producir una interrupcin (en caso de estar habilitada) (Figura 2.39).

Figura 2.39: TMR1


En forma similar al TMR0, este registro puede leerse y escribirse en cualquier momento. Si ocurre un overflow puede causar una interrupcin (en
caso de estar habilitada).
El timer TMR1 puede operar tambin como temporizador o como contador
aunque a diferencia del TMR0 cada mdulo tiene funciones diferentes (Figura 2.41).

60

Figura 2.40: T1CON controla TMR1

Figura 2.41: T1CON registro de control del TMR1


El Registro T1CON controla TMR1 a travs de (Figura 2.41): T1GINV Bit de inversin de puerta del TMR1
1 TMR1 cuenta cuando el pin T1G o bit C2OUT es alto (1)
0 TMR1 cuenta cuando el pin T1G o bit C2OUT es bajo (0)
TMR1GE Puerta habilitadora del TMR1
Si el TMR1ON = 0
Este bit es ignorado
Si TMR1ON = 1
1 = TMR1 como contador es controlado por la funcin de la puerta TMR1
0 = TMR1 est siempre contando.
T1CKPS1, T1CKPS0 Bits de seleccin del preescalador del TMR1 (Figura
2.42).
T1SYNC: Bit de sincronizacin del reloj externo del TMR1
TMR1CS = 1:
1 = No se sincroniza la entrada de reloj externa.
0 = Si se sincroniza la entrada de reloj externa.
TMR1CS = 0:
Este bit es ignorado. TMR1 usa el reloj interno.
TMR1CS: Bit de seleccin de la fuente del TMR1
1 = Reloj externo del pin T1CKI (en el flanco positivo)
0 = Reloj interno (FOSC/4)
TMR1ON: Bit de habilitacin del TMR1
1 = Habilita el TMR1
0 = Deshabilita el TMR1
61

Preescalor del TIMER 1:

Figura 2.42: Preescalador del TMR1


Como no es posible apagar el preescalador debe escogerse adecuadamente
su valor programando los bits T1CKPS1 y T1CKPS0 del registro T1CON.
La fuente de reloj debe de seleccionarse con TMR1CS (Bit de T1CON ) :
- TMR1CS = 0 La fuente de reloj para el TMR1 es el reloj interno (Fosc/4).
- TMR1CS =1 La fuente de reloj para el TMR1 es un reloj externo en el
pin T1CKI .
Colocando T1OSCEN=1 (del registro T1CON ) se habilita el TMR1 y los
registros TMR1H and TMR1L se incrementan por cada entrada de reloj,
haciendo T1OSCEN=0 se para el conteo.
El preescalador se borra haciendo cero o escribiendo los registros del TMR1.
Cuando el TMR1 se desborda la bandera TMR1IF se hace uno y el TMR1
empieza a contar nuevamente desde cero.
Preescalador del TMR1
El TMR1 tiene su propio preescalador que permite divisiones del reloj de
entrada para 1, 2, 4 u 8. El preescalador no puede ser ledo o escrito directamente, sin embargo el preescalador es automticamente encerado cuando
se escriben los registros TMR1H o TMR1L.
Oscilador del TMR1
Los pines RC0/T1OSO and RC1/T1OSI son usados para registrar pulsos
provenientes de perifricos, pero tienen una funcin adicional. Pin RC1 es
configurado como entrada y pin RC0 es configurado como salida, del oscilador adicional de cuarzo LP, en forma simultanea. Este circuito adicional
es para operar a bajas frecuencias (hasta los 200 kHz), mas precisamente
para utilizar cristales de cuarzo de 32.768 kHz. Tales cristales son usados en
62

relojes de cuarzo porque es fcil obtener pulsos de un segundo de duracin


dividiendo simplemente esta frecuencia. Dado que este oscilador no depende
del reloj interno, puede operar an en el modo SLEEP. Se lo habilita con
T1OSCEN =1 (bit del registro T1CON). El usuario deber proveer por software un retardo de tiempo ( de unos cuantos milisegundos) para asegurar
la operacin adecuada del oscilador.
Para seleccionar este modo es necesario hacer TMR1CS =0. Despus de esto
el TMR1 se incrementar con cada pulso proveniente del oscilador interno.
Si se usara un cristal de 4 MHz se incrementara cada microsegundo.
En este modo el bit T1SYNC no afecta al timer porque se estn contando
pulsos internos de reloj y no es necesario sincronizacin (Figura 2.43).

Figura 2.43: TMR1 en modo timer


El consumo de potencia del microcontrolador se reduce al mnimo en el modo SLEEP. El punto es el de apagar el oscilador. Es fcil colocar al timer
en este modo escribiendo la instruccin SLEEP en el programa. Pero el problema est al despertar el microcontrolador porque solo una interrupcin
puede hacerlo. Dado que el microcontrolador est en estado SLEEP una
interrupcin deber ser causada por un circuito externo. Puede tornarse extremadamente complicado si se necesita despertar al microcontrolador en
intervalos regulares.
Para resolver este problema, el PIC16F887 permite la operacin de un oscilador de cuarzo de bajo consumo (Low Power quartz oscillator), capaz de
operar en el modo SLEEP. Este oscilador es habilitado con el bit T1OSCEN
=1 (del registro T1CON). Luego de esto con el bit TMR1CS (T1CON) se
selecciona el origen de oscilacin.
Las seales del oscilador de cuarzo pueden sincronizarse con el reloj del microcontrolador colocando T1SYNC =0. Pero en este caso el TMR1 no puede
63

trabajar en el modo SLEEP porque el registro de sincronismo usa el reloj del


microcontrolador (el cual en el modo SLEEP no opera). Las interrupciones
por desbordamiento del TMR1 pueden habilitarse y ocurrir interrupciones
en el modo SLEEP (Figura 2.44).

Figura 2.44: TMR1 en modo oscilador


El TMR1 opera como contador con TMR1CS=1 incrementndose con el
flanco positivo de la seal de reloj externa CLOCKI. Si el bit de control
T1SYNC est en cero.
La seal externa se sincronizar con el reloj interno en su camino al registro
TMR1.
Cuando el microcontrolador opera en el modo SLEEP no funcionar el conteo debido a que no se produce sincronizacin a causa de la desaparicin del
oscilador (Figura 2.45).

Figura 2.45: TMR1 en modo contador

64

Este diagrama engloba el funcionamiento del TMR1 y se lo usar como referencia en el estudio del TMR1 (Figura 2.46):

Figura 2.46: Diagrama de bloques general del TMR1

65

2.13.3.

TMR2

El TMR2 es un registro de 8-bits que opera comparando su valor con PR2


hasta alcanzarlo. Posee un preescalador y un postescalador (Figura 2.47).

Figura 2.47: TMR2


Su entrada de reloj es el reloj interno (FOSC/4) que pasa por el preescalador (con opciones de 1:1, 1:4 hasta 1:16). La salida del preescalador es usada
para para incrementar el registro TMR2. Los valores de TMR2 y PR2 se
comparan constantemente para determinar su igualdad, TMR2 incrementar desde cero hasta que su valor sea igual a PR2. Cuando ocurre la igualdad:
TMR2 regresa a cero en el prximo ciclo de incremento
Luego de generada la seal EQ, sta pasa por el postescalador del TMR2
(1:1 a 1:16 ) el cual divide la seal de acuerdo al valor escogido. Ej. Si el
preescalador es de 1:5, cada 5 seales EQ provocarn un uno en la bandera.
Los registros TMR2 y PR2 pueden leerse y escribirse.
Tras un RESET, TMR2 se hace 00h y PR2 se hace FFh.
TMR2 se habilita con TMR2ON=1 y deshabilita con TMR2ON=0.
El preescalador del TMR2 se controla con los bits T2CKPS (registro T2CON)
Los contadores del preescaldor y postescaldor se hacen cero cuando:
Se escribe sobre el TMR2
Cuando se escribe sobre el T2CON
Cuando ocurre un RESET: Power-on Reset, MCLR Reset, Watchdog Timer
Reset, or Brown-out Reset).

66

Registro T2CON (Figura 2.48):

Figura 2.48: T2CON


TOUTPS<3:0>: TMR2 Postescalador (Figura 2.49):

Figura 2.49: Postescalador del TMR2


TMR2ON: Habailitador del TMR2
1 = TMR2 ON
0 = TMR2 OFF
T2CKPS<1:0>: TMR2 Preescalador (Figura 2.50) :

Figura 2.50: Preescalador del TMR2

67

2.13.4.

Perro Guardin como recurso del ncleo del CPU

Cuando un ordenador personal se bloquea por un fallo del software u otra


causa, se pulsa el botn del reset y se reinicializa el sistema.
En la mayora de los casos y a diferencia de un ordenador personal, un
microcontrolador funciona sin el control de un supervisor y de forma continuada las 24 horas del da y 365 das al ao. El Perro guardin consiste en
un temporizador que, cuando se desborda y pasa por 0, provoca un RESET
automticamente en el sistema (Figura 2.51).
Se debe disear el programa de trabajo que controla la tarea de forma que
refresque o inicialice al Perro guardin antes de que provoque el reset. Si
falla el programa o se bloquea, el programa no refrescar al Perro guardin
y, al completar su temporizacin, provocar el reset del sistema. La base
de tiempo del Perro Guardin est dada por el reloj interno de 31 kHz y
el postdivisor de frecuencia indicado por los bits WDTPS0-3 del Registro
WDTCON. Pudiendo programarse para retardos de 1ms hasta 2 segundos.
Luego de un RESET su registro de control se carga con: WDTCON=1000.
Este valor indica que el postdivisor del WDT (bits WDTPS0-3) se carga a
100 equivalente 512 como se podr apreciar en la lmina del WDTCON en
tal forma que:
Temporizacin de WDT = (1/31.000)*(valor en postdivisor)
= (1/31.000)*(valor en postdivisor) = 17ms.

Figura 2.51: Diagrama de bloques del Perro Guardin

68

Registro WDTCON (Figura 2.52):

Figura 2.52: Registro WDTCON


Bits de configuracin WDTCON (Figura 2.53):

Figura 2.53: Bits del Registro WDTCON

69

Captulo 3

Sistema de Interrupciones
Las interrupciones constituyen una de las fortalezas ms importantes de los
microcontroladores especialmente para su conexin con el mundo exterior.
El funcionamiento de las interrupciones es muy similar al de las subrutinas.
Una subrutinas se ejecuta cada vez que aparece en el programa una instruccin CALL, una interrupcin se ponen en marcha en el momento en que un
evento externo al programa lo requiere. Estos eventos pueden ser entre otros:
Eventos de hardware, como una transicin de estado causado en un pin por
una tecla o pulsador Resultado de la llegada a cero de ciertos temporizadores
como el TMR0, TMR1, WDT.
La sealizacin de una operacin llevada a cabo. Como por ejemplo el fin
de escritura de la memoria EEPROM.
Como consecuencia de un error producido. Como la falta del reloj externo.
Tomando como ejemplo la interrupcin por desbordamiento del TMR0, muy
usada para programar tiempos de procesos, cada vez que se desborda el
TMR0 se produce un requerimiento de interrupcin que se manifiesta mediante el seteo de una bandera o bit de interrupcin (IF) la misma que indica
que hay una seal que desea interrumpir el programa principal.
La interrupcin es viable solamente si los habilitadores correspondientes lo
permiten. Para el caso del TMR0 se requieren que tanto el Habilitador de
Interrupcin del TMR0 (TMR0IE) y el Habilitador Global de Interrupciones (GIE) estn habilitados (Figura 3.1).

70

Figura 3.1: Interrupcin por TMR0

3.1.

Tratamiento de una Interrupcin

Cuando ocurre un requerimiento de interrupcin se enciende una bandera


de interrupcin IF (interrupt flag), esta interrupcin es permitida, si los correspondientes Bits de IE (interrupt enable Bits) estn habilitados.
Para determinar la fuente de interrupcin es necesario chequear las banderas. Una vez detectada, se guardan los registros importantes, se ejecuta
la rutina de interrupcin a la que se accede por medio del vector de interrupcin que est en la posicin 0x04 de la memoria de datos, luego se
restablecen los registros importantes, se borra por software la bandera que
caus la interrupcin y se retorna al programa principal con la instruccin
RETFIE.
La instruccin en el vector de interrupcin, posicin de 0x04 de la memoria
de programa, es generalmente una instruccin de salto al inicio de la rutina
de interrupcin. Como por ejemplo:
GOTO INTERRUPCION.
Para habilitar interrupciones por el cambio de estado del puerto B, es necesario habilitarlas bit a bit por medio del registro IOCB.
Se podr observar las diferentes formas en que el PIC16F887 se puede interrumpir. Notndose 14 interrupciones que requieren de la habilitacin del
bit PEIE (Habilitador de interrupciones perifricas) y 3 que no lo requieren.
Eso s, todas necesitan del bit GIE (Habilitador global de interrupciones)
para poder funcionar.

3.2.

Diversas Causas de Interrupcin

El PIC16F887 presenta 17 causas de interrupcin. Notndose 14 interrupciones que requieren del bit habilitador de interrupciones perifricas (PEIE)
y 3 que no lo requieren. Eso s todas necesitan del bit GIE (Habilitador
global de interrupciones) para poder funcionar.

71

Las 3 interrupciones que marcan la diferencia son:


La interrupcin por el Timer 0 (TMR0)
La interrupcin externa que usa el Pin RB0/INT
La interrupcin por cambio de estado del puerto B (IOC RB0-7). Esta interrupcin tiene adicionalmente habilitadores individuales para cada bit del
puerto B ubicados en el Registro IOCB (BANK1). Los habilitadores individuales son IOCB0-7.
Algo particular de las tres interrupciones mencionadas es que tienen sus
habilitadores y banderas en el registro de control de interrupciones INTCON.
Las 14 interrupciones restantes hacen uso de los registros PIE1 y PIE2
(BANK1) para sus habilitadores de interrupcin y los registros PIR1 y PIR2
(BANK2) para sus banderas de interrupcin:

3.3.

Registro INTCON

El registro INTCON contiene (Figura 3.2):


RBIE Interrupcin por cambio de estado del puerto B - Cuando el puerto
B est configurado como entrada puede causar interrupcin por cambio de
estado de los pines del puerto B.
1 Habilita las interrupciones por cambio de estado del puerto B.
0 - Deshabilita las interrupciones por cambio de estado del puerto B.
T0IF Bandera de interrupcin por desbordamiento del TMR0
1 Cuando hay desbordamiento del TMR0 (borrada por software).
0 Cuando no hay desbordamiento del TMR0.
INTF Bandera de interrupcin externa Registra cambios de estado lgico del pin RB0/INT.
1 Cuando ocurre una interrupcin externa (borrada por software).
0 Cuando no ocurre una interrupcin externa.
RBIF - Bandera por cambio de estado del puerto B actuando como entrada.
1 Cuando al menos uno de los bits del puerto B ha cambiado su estado
lgico, RBIF debe de ser borrado por software.
0 - Cuando ninguno de los bits del puerto B ha cambiado su estado lgico.

Figura 3.2: Registro INTCON

72

3.4.

Registro PIE1

El registro PIE1 contiene (Figura 3.3):


ADIE Habilitador de interrupcin por convertidor A/D.
1 Habilita las interrupciones por el ADC (analog to digital converter).
0 Deshabilita las interrupciones por el ADC.
RCIE Habilitador de interrupcin por recepcin del EUSART.
1 - Habilita las interrupciones por recepcin del EUSART.
0 - Deshabilita las interrupciones por recepcin del EUSART.
TXIE - Habilitador de interrupcin por trasmisin del EUSART.
1 - Habilita las interrupciones por transmisin del EUSART.
0 - Deshabilita las interrupciones por transmisin del EUSART.
SSPIE Habilitador de interrupcin del puerto serial sincrnico Master
Habilita un requerimiento de interrupcin generado despus de cada transferencia de datos via el mdulo de comunicacin serial sincrnico (modo SPI
o I2C).
1 Habilita la interrupcin del MSSP.
0 - Deshabilita la interrupcin del MSSP.
CCP1IE - Habilitador de interrupcin del CCP1 - Posibilita los requerimientos de interrupcin generados por el mdulo CCP usado en el procesamiento
de seales PWM.
1 Habilita interrupciones por el CCP1.
0 - Deshabilita interrupciones por el CCP1.
TMR2IE Habilitador de interrupciones por coincidencia del TMR2 y PR2.
1 Habilita la interrupcin por igualdad del TMR2 con el PR2.
0 - Deshabilita la interrupcin por igualdad del TMR2 con el PR2.
TMR1IE Habilitador de interrupcin por desborde del TMR1.
1 Habilita la interrupcin por desborde del TMR1.
0 - Deshabilita la interrupcin por desborde del TMR1.

Figura 3.3: Registro PIE1

73

3.5.

Registro PIE2

El registro PIE2 contiene (Figura 3.4):


OSFIE Habilitador de interrupcin por falla del oscilador (Oscillator Fail
Interrupt Enable bit).
1 Habilita interrupcin por falla del oscilador.
0 - Deshabilita interrupcin por falla del oscilador.
C2IE - Habilitador de interrupcin del Comparador C2.
1 - Habilita interrupcin por el comparador C2.
0 - Deshabilita interrupcin por el comparador C2.
C1IE - Habilitador de interrupcin del Comparador C1.
1 - Habilita interrupcin por el comparador C1.
0 - Deshabilita interrupcin por el comparador C1.
EEIE Habilitador de interrupcin por escritura de la EEPROM.
1 - Habilita interrupcin por escritura de la EEPROM.
0 - Deshabilita interrupcin por escritura de la EEPROM.
BCLIE Habilitador de interrupcin por colisin en el BUS (Bus Collision
Interrupt Enable bit).
1 - Habilita interrupcin por colisin.
0 - Deshabilita interrupcin por colisin.
ULPWUIE Habilitador de interrupcin por despertar el microcontrolador
en modo de consumo ultra bajo de energa (Ultra Low-Power Wake-up Interrupt Enable bit).
1 Habilita interrupcin por despertar al microcontrolador en modo de consumo ultra bajo de energa.
0 - Deshabilita interrupcin por despertar al microcontrolador en modo de
consumo ultra bajo de energa.
CCP2IE - Habilitador de interrupcin por CCP2.
1 - Habilita interrupcin por CCP2.
0 - Deshabilita interrupcin por CCP2.

Figura 3.4: Registro PIE2

74

3.6.

Registro PIR1

El registro PIR1 contiene (Figura 3.5):


ADIF Bandera de interrupcin del convertidor A/D.
1 Conversin completa (el bit debe de ser borrado por software).
0 La conversin A/D no ha empezado o no ha terminado.
RCIF - Bandera de interrupcin del EUSART.
1 El buffer de recepcin del EUSART est lleno. Este Bit se borra cuando
el registro RCREG es ledo.
0 - El buffer de recepcin del EUSART no est lleno
TXIF Bandera de transmisin de interrupcin del EUSART .
1 EL buffer de transmisin del EUSART est vaco. Este Bit se borra
cuando se escribe sobre el registro TXREG.
0 El buffer de transmisin del EUSART est lleno.
SSPIF Bit de interrupcin del puerto serial sincrnico maestro (MSSP).
1 Cuando ocurre una condicin de interrupcin en el registro por transmisin/recepcin de datos. Estas condiciones difieren del modo de operacin
del MSSP (SPI o I2C). Este bit debe de ser borrado por software antes de
retornar de la rutina de interrupcin.
0 Cuando no ha ocurrido una condicin de interrupcin en el registro
MSSP. CCP1IF - Bandera de interrupcin del CCP1.
1 Una condicin de interrupcin del CCP1 ha ocurrido (CCP1 es una
unidad para la captura, comparacin y generacin de seales PWM ). Dependiendo de que modo de comparacin o captura ha ocurrido, en ambos
casos, este bit debe de ser borrado por software. Este bit no se usa en modo
PWM.
0 No ha ocurrido una condicin de interrupcin del CCP1. TMR2IF - Bandera de interrupcin cuando el Timer2 alcanza el valor del registro PR2.
1 El registro TMR2 (8-bit ) se ha igualado al registro PR2. Este bit debe
de ser borrado por software antes de retornar de la rutina de interrupcin.
0 Los registros TMR2 y PR2 no se han igualado.
TMR1IF - Bandera de interrupcin por desbordamiento del Timer1 .
1 El registro TMR1 se ha desbordado. Este bit debe de ser borrado por
software.
0 El TMR1 no se ha desbordado.

Figura 3.5: Registro PIR1

75

3.7.

Registro PIR2

El registro PIR2 contiene (Figura 3.6):


OSFIF Bandera de interrupcin por falla del oscilador.
1 El sistema de oscilador fall y la entrada de reloj ha sido cambiado al
oscilador interno INTOSC. Este bit debe de ser borrado por software.
0 El oscilador del sistema opera normalmente.
C2IF - Bandera de interrupcin del Comparador C2.
1 La salida del comparador C2 ha cambiado (bit C2OUT). Este bit debe
de ser borrado por software.
0 - La salida del comparador C2 no ha cambiado
C1IF - Bandera de interrupcin del Comparador C1.
1 - La salida del comparador C1 ha cambiado (bit C1OUT). Este bit debe
de ser borrado por software.
0 - - La salida del comparador C1 no ha cambiado.
EEIF - Bandera de interrupcin por escritura en la EEPROM .
1 Se ha completado la escritura de la EEPROM. Este bit debe de ser
borrado por software.
0 La escritura de la EEPROM no se ha completados o no ha empezado,
BCLIF - Bandera de interrupcin por colisin en el (Bus Collision Interrupt
Flag bit).
1 Una colisin de bus ha ocurrido en el MSSP. Este bit debe de ser borrado
por software.
0 - No ha ocurrido colisin en el bus.
ULPWUIF Bandera de interrupcin de Ultra Low-power Wake-up.
1 Ha ocurrido una condicin de Wake-up. Este bit debe de ser borrado
por software.
0 - No ha ocurrido una condicin de Wake-up.
CCP2IF - Bandera de interrupcin del CCP2.
1 Una condicin de interrupcin por el CCP2 ha ocurrido (unidad para
la captura, comparacin y generacin de seales PWM). Dependiendo del
modo de operacin ocurrido, captura o comparacin. En ambos casos este
bit debe de ser borrado por software. Este bit no se usa en modo PWM.
0 - Una condicin de interrupcin por el CCP2 no ha ocurrido.

Figura 3.6: Registro PIR2

76

Captulo 4

Memorias
En los microcontroladores la memoria de instrucciones y datos est en un
mismo circuito integrado. Una parte de la memoria es no voltil, tipo ROM,
y se destina a contener el programa de instrucciones que gobierna la aplicacin. Otra parte de la memoria es tipo RAM, voltil, y se destina a guardar
las variables y datos. Adicionalmente varios microcontroladores poseen una
memoria EEPROM separada, para el almacenamiento de datos permanentes, como configuraciones especiales y parmetros de inicio.
Como un microcontrolador se destina a una tarea especfica, en la memoria
de programa, slo hay que almacenar un nico programa de trabajo.
La memoria de datos (RAM) en estos dispositivos es de poca capacidad
pues slo debe contener las variables y los cambios de informacin que se
produzcan en el transcurso del programa. Por otra parte, como slo existe
un programa activo, no se requiere guardar una copia del mismo en la RAM
pues se ejecuta directamente desde la memoria de programa (ROM).
El usuario de PC est habituado a manejar Megabytes de memoria, pero los
diseadores con microcontroladores trabajan con capacidades de memoria
de programa de 512 bytes, 1K, 2K (hasta unos 64K) y de RAM de 20 bytes,
68 bytes, 512 bytes (hasta unos 4K).
Segn el tipo de memoria de programa que dispongan los microcontroladores, la aplicacin y utilizacin de los mismos es diferente. Se describen las
cinco versiones de memoria no voltil que se pueden encontrar en los microcontroladores del mercado.

77

4.1.

ROM con Mscara

Es una memoria no voltil de slo lectura cuyo contenido se graba durante la


fabricacin del chip. Mscara viene de la forma cmo se fabrican los circuitos integrados. Estos se fabrican en obleas que contienen varias decenas de
chips. Estas obleas se obtienen a partir de procesos fotoqumicos, donde se
impregnan capas de silicio y oxido de silicio, y segn convenga, se erosionan
al exponerlos a la luz. Como no todos los puntos han de ser erosionados,
se sita entre la luz y la oblea una mscara con agujeros, de manera que
donde deba incidir la luz, sta pasar. Con varios procesos similares pero
ms complicados se consigue fabricar los transistores y diodos que componen un circuito integrado.El elevado coste del diseo de la mscara slo hace
aconsejable el empleo de los microcontroladores con este tipo de memoria
cuando se precisan cantidades superiores a varios miles de unidades.

4.2.

OTP

El microcontrolador contiene una memoria no voltil de slo lectura "programable una sola vez"por el usuario. OTP (One Time Programmable). Es
el usuario quien puede escribir el programa en el chip mediante un sencillo
grabador controlado por un programa desde un PC. La versin OTP es recomendable cuando es muy corto el ciclo de diseo del producto, o bien, en
la construccin de prototipos y series muy pequeas.
Tanto en este tipo de memoria como en la EPROM, se suele usar la encriptacin mediante fusibles para proteger el cdigo contenido.

78

4.3.

EPROM

Los microcontroladores que disponen de memoria EPROM (Erasable Programmable Read Only Memory) pueden borrarse y grabarse muchas veces.
La grabacin se realiza, como en el caso de los OTP, con un grabador gobernado desde un PC. Si, posteriormente, se desea borrar el contenido, disponen
de una ventana de cristal en su superficie por la que se somete a la EPROM
a rayos ultravioleta durante varios minutos. Las cpsulas son de material
cermico y son ms caros que los microcontroladores con memoria OTP que
estn hechos con material plstico. Hoy da se utilizan poco, siendo sustituidas por memorias EEPROM o Flash.
Se trata de memorias de slo lectura, programables y borrables elctricamente EEPROM (Electrical Erasable Programmable Read Only Memory).
Tanto la programacin como el borrado, se realizan elctricamente desde el
propio grabador y bajo el control programado de un PC. Es muy cmoda y
rpida la operacin de grabado y la de borrado. No disponen de ventana de
cristal en la superficie.
Los microcontroladores dotados de memoria EEPROM una vez instalados
en el circuito, pueden grabarse y borrarse varias veces sin ser retirados de
dicho circuito. Para ello se usan "grabadores en circuito"que confieren una
gran flexibilidad y rapidez a la hora de realizar modificaciones en el programa de trabajo.
El nmero de veces que puede grabarse y borrarse una memoria EEPROM
es finito, por lo que no es recomendable una reprogramacin continua. Hoy
da estn siendo sustituidas por memorias de tipo Flash.
Se va extendiendo en los fabricantes la tendencia de incluir una pequea
zona de memoria EEPROM en los circuitos programables para guardar y
modificar cmodamente una serie de parmetros que adecuan el dispositivo
a las condiciones del entorno.
Este tipo de memoria es relativamente lenta.

79

4.4.

FLASH

Se trata de una memoria no voltil, de bajo consumo, que se puede escribir


y borrar. Funciona como una ROM y una RAM pero consume menos y es
ms pequea.
A diferencia de la ROM, la memoria FLASH es programable en el circuito.
Es ms rpida y de mayor densidad que la EEPROM.
La alternativa FLASH est recomendada frente a la EEPROM cuando se
precisa gran cantidad de memoria de programa no voltil. Es ms veloz y
tolera ms ciclos de escritura/borrado. Son idneas para la enseanza y la
Ingeniera de diseo.
Las memorias EEPROM y FLASH son muy tiles al permitir que los microcontroladores que las incorporan puedan ser reprogramados en circuito,
es decir, sin tener que sacar el circuito integrado de la tarjeta. As, un dispositivo con este tipo de memoria incorporado al control del motor de un
automvil permite que pueda modificarse el programa durante la rutina de
mantenimiento peridico, compensando los desgastes y otros factores tales
como la compresin, la instalacin de nuevas piezas, etc. La reprogramacin
del microcontrolador puede convertirse en una labor rutinaria dentro de la
puesta a punto.

4.5.

Memoria EEPROM en el PIC16F887

La EEPROM es un segmento de memoria separado, que no pertenece a


la memoria de programa (ROM), tampoco a la memoria de datos (RAM).
Aunque a estas localidades de memoria no se les puede acceder fcil y rpidamente, su propsito es insustituible. Los datos almacenados en la EEPROM
estn permanentemente guardados incluso al apagar la fuente de alimentacin, y pueden ser cambiados en cualquier momento. Por estas caractersticas
excepcionales cada byte de la EEPROM se considera valioso.
El microcontrolador PIC16F887 dispone de 256 localidades de memoria EEPROM controlados por los bits de los siguientes registros:
EECON1 (registro de control);
EECON2 (registro de control);
EEDAT (almacena los datos listos para escritura y lectura); y
EEADR (almacena la direccin de la EEPROM a la que se accede).
Adems, el registro EECON2 no es un registro verdadero, no existe fsicamente en el chip. Se utiliza slo durante la escritura de los datos en la
memoria. Los registros EEDATH y EEADRH se utilizan durante la escritura y lectura de la EEPROM. Por considerar esto una zona de riesgo (por
supuesto usted no quiere que el microcontrolador borre su propio programa
por casualidad), no vamos a discutirlo aqu, no obstante le avisamos que
tenga cuidado.

80

4.6.

LECTURA DE LA MEMORIA EEPROM

Para leer los datos de la memoria EEPROM, siga los siguientes pasos:
Paso 1: Escribir la direccin (00h - FFh) en el registro EEADR.
Paso 2: Seleccionar el bloque de memoria EEPROM al poner a cero el bit
EEPGD del registro EECON1.
Paso 3: Poner a uno el bit RD del mismo registro para leer el contenido de
la localidad.
Paso 4: El dato se almacena en el registro EEDAT y est listo para su uso.
El siguiente ejemplo muestra el procedimiento anteriormente descrito al escribir un programa en lenguaje ensamblador:
Ejemplo lectura memoria EEPROM
BSF STATUS, RP1;
BCF STATUS, RP0; Acceder al banco
MOVF ADDRESS,W; Mover la direccin al registro W
MOVWF EEADR; Escribir la direccin
BSF STATUS,RP0; Acceder al banco 3
BCF EECON1,EEPGD; Seleccionar la EEPROM
BSF EECON1,RD; Leer los datos
BCF STATUS,RP0; Acceder al banco 2
MOVF EEDATA,W; Dato se almacena en el registro W

81

4.7.

Escritura de Memoria EEPROM

Antes de escribir los datos en la memoria EEPROM es necesario escribir la


direccin en el registro EESADR y los datos en el registro EESAT. Slo ha
quedado seguir a una secuencia especial para iniciar la escritura para cada
byte. Durante el proceso de escritura las interrupciones deben estar deshabilitadas.
El ejemplo que sigue muestra el procedimiento anteriormente descrito al escribir un programa en lenguaje ensamblador.
BSF STATUS, RP1;
BSF STATUS, RP0;
BTFSC EECON, WR1; Esperar a que se complete la escritura anterior
GOTO $-1;
BCF STATUS, RP0; Acceder al banco 2
MOVF ADDRESS, W; Mover la direccin al registro W
MOVWF EEADR; Escribir la direccin
MOVF DATA, W; Mover los datos a W
MOVWF EEDATA; Escribir los datos
BSF STATUS, RP0; Acceder al banco 3
BCF EECON1, EEPGD; Seleccionar la EEPROM
BSF EECON1, WREN; Escritura a la EEPROM habilitada
BCF INTCON GIE; Todas las interrupciones deshabilitadas
BSF INTCON, GIE; Interrupciones habilitadas
BCF EECON1, WREN; Escritura a la EEPROM deshabilitada
MOLW 55h
MOVWF EECON2
MOLW AAh
MOVWF EECON2
BSF EECON1, WR

82

Captulo 5

Mdulos ADC
El mdulo ADC tiene las siguientes caractersticas:
El convertidor usa el mtodo de aproximaciones sucesivas y almacena el resultado de la conversin en los registros ADC (ADRESH ADRESL)(Figura
5.1).
Tiene 14 entradas analgicas
El convertidor A/D (Analgico/Digital)convierte una seal analgica en un
nmero binario de 10 bits.
La resolucin mnima o calidad de la conversin puede ser ajustada de diversa manera seleccionando los voltajes de referencia Vref- y Vref+.

Figura 5.1: Mdulo ADC

83

El resultado de la conversin A/D se lo almacena en ADRESH ADRESL


de acuerdo al bit ADFM del registro ADCCON1 (Figura 5.2):
Con ADFM=1 el resultado se justifica a la derecha.
Con ADFM=0 el resultado se justifica a la izquierda.

Figura 5.2: ADRESH y ADRESL


Para que el ADC cumpla con la tarea de adquisicin, es necesario presentar un retardo entre la seleccin de la entrada analgica y la medida del
valor adquirido. Este valor se llama tiempo de adquisicin y depende de la
impedancia de la fuente. Existe una ecuacin para calcular este tiempo con
exactitud que en el peor de los casos es de 20us.

84

5.1.

Principios de Conversin A/D, Discretizacin

Discretizacin de Amplitud: Se representa un nmero discreto de valores de


tensin (Cuantificacin).
Discretizacin Temporal: Se toma el valor de tensin en instantes discretos
de tiempo (Muestreo).
Representacin grfica de la discretizacin (Figura 5.3):

Figura 5.3: Discretizacin

5.2.

ADC Funcin de Transferencia

Representacin grfica de la funcin de transferencia (Figura 5.4):

Figura 5.4: Funcin de transferencia

85

Funcin de transferencia para n=3 (Figura 5.5):

Figura 5.5: Funcin de transferencia N=3

5.3.

Principios de Conversin A/D: Discretizacin


Temporal

Los Principios de Conversin A/D: Discretizacin Temporal (Figura 5.6):

Figura 5.6: Discretizacin Temporal

86

5.4.

Principios de Conversin A/D: Discretizacin


de Amplitud

La tensin se representa con un nmero de bits N, dando lugar a 2N combinaciones distintas que nos permite representar 2N valores distintos de tensin.
Los Principios de Conversin A/D: Discretizacin de Amplitud se muestran
a continuacin (Figura 5.7):

Figura 5.7: Discretizacin de Amplitud

87

5.5.

Convertidor Analgico a Digital (ADC)

La tensin de cuantificacin de un ADC se representa por la siguiente ecuacin:


Peso de bit =

+
(Vref
Vref
)
Vref
= n
n
2
2
El peso de un bit es de Vref /2n el cual multiplicado por el nmero de bits en
binario empleados en la digitalizacin da como resultado el voltaje analgico
equivalente:
V in = (Vref /2n )IN T (N )
Vin = Voltaje de entrada analgico
Vref = Voltaje de referencia
N = Nmero decimal
INT(N) = La parte entera de N en base 10 que luego se convierte a binario
para determinar la salida actual del ADC
De la ecuacin anterior se despeja INT(N) y se lo convierte a binario para
conocer el valor Digital obtenido con la entrada analgica Vin :
IN T (N ) =

Vin 2n
Vref

El voltaje en la parte derecha de la ecuacin puede cambiar solamente por


un paso incremental dado por:
V =

Vref
2n

Para el funcionamiento correcto del ADC de un PIC se requiere que:


0 <Vin <Vref y tambin que: 2 V <Vref <VDD

88

5.6.

ADC Tiempo de Conversin

El tiempo requerido para completar un bit de conversin se lo conoce como


TAD. El cual se requiere que sea de por lo menos 1.6us. Una conversin de
10 bits involucra 11TAD, es decir un poco ms de lo esperado. La frecuencia
de conversin es especificada por software antes del inicio de conversin
mediante los bits ADCS1 y ADCS0 del registro ANCON0 (Figura 5.8).
NOTA: Valores inferiores a 1.6us estn fuera de lo permitido.

Figura 5.8: FOSC

5.7.

A/D: Ciclos TAD en la conversin

Al final de la conversin A/D se genera la bandera ADIF y si est habilitada


la interrupcin del ADC con el bit ADIE se producir una interrupcin.
La bandera ADIF debe ser borrada por software (Figura 5.9).

Figura 5.9: TAD

89

Para habilitar el convertidor A/D es necesario considerar:


EL convertidos A/D no distingue entre entradas analgicas y digitales. Para
evitar errores, es preciso configurar sus pines como entradas utilizando los
registros: TRIS, ANSEL y ANSELH.
El voltaje medido por el convertidor resulta de la comparacin del voltaje
de entrada con una escala interna de 1024 marcas (Figura 5.10).

Figura 5.10: Voltaje en el mdulo ADC

5.8.

Funciones ADC de MikroCPro

ADC_Read Inicializa el mdulo ADC, luego lee la entrada analgica y


nos devuelve un valor entero sin signo de 10 a 12 bits.
Su sintaxis es la siguiente:
unsigned ADC_Read (unsigned short channel);
ADC_Init Inicializa nuestro PIC para que el mdulo ADC empiece a trabajar con el reloj, y ste a su vez determine el periodo necesario para que
realice el muestreo y la conversin analgica a digital. Por ser void no devuelve nada.
Su sintaxis es la siguiente:
void ADC_Init();
ADC_Get_Sample Slo lee la entrada analgica sin inicializar el mdulo
ADC y nos devuelve un valor entero sin signo de 10 a 12 bits.
Su sintaxis es la siguiente:
unsigned ADC_Get_Sample (unsigned short channel);

90

Captulo 6

Lenguaje C para
Microcontroladores
Como el proceso de escribir directamente cdigo ejecutable es extremadamente cansado, se cre entonces el programa ensamblador. Sin embargo, la
programacin en ensamblador sigue complicada y muy dependiente de la
arquitectura interna del PIC, pero al menos la programacin dej de ser
una pesadilla.
Las instrucciones en lenguaje ensamblador se representan en forma abreviada mediante smbolos con sentido funcional, el proceso de ensamblado se
lo deja al programa ensamblador que genera cdigo ejecutable.
Sin embargo los programadores siempre han necesitado de un lenguaje de
programacin muy prximo o cercano al lenguaje comn que usamos para
comunicarnos.
Como resultado de esta necesidad se han creado los lenguajes de nivel alto.
La ventaja principal de estos lenguajes es la simplicidad en la escritura
de programas, ya no es de mucho inters conocer con exactitud cmo los
comandos se ejecutan.
En casos que requieran exactitud, es fcil insertar en el programa una secuencia de instrucciones en ensamblador, habilitndolo.
Algo similar al lenguaje ensamblador, un programa especializado llamado
COMPILADOR que corre en una PC, es el encargado de compilar el programa fuente a lenguaje de mquina.
A diferencia del programa ensamblador, un compilador genera cdigo ejecutable que no siempre es el ms corto posible, en este sentido el ensamblador
es ms eficiente.

91

En la siguiente grfica (Figura 6.1) se ilustra lo que ocurre durante el proceso de compilacin de un programa desde lenguaje de alto nivel a lenguaje
de bajo nivel.

Figura 6.1: Compilacin desde lenguaje C


Los PICs basan su funcionamiento en una arquitectura RISC, es decir carecen de muchas instrucciones, tal como: multiplicacin, divisin, comparacin, etc.
Cada problema tiene una solucin, por ejemplo, la multiplicacin fcilmente
se sustituye por sumas sucesivas.
Esto no es motivo de preocupacin, porque el lenguaje C ha solucionado
este problema y muchos otros (Figura 6.2).

92

Figura 6.2: Estructura del lenguaje C

6.1.

Directivas del Preprocesador

Un preprocesador es parte integral del compilador C y su funcin es reconocer y ejecutar instrucciones del preprocesador.
Las instrucciones del preprocesador son especiales ya que no pertenecen al
lenguaje C, pero son parte del paquete (software) que viene con el compilador C.
Cada comando del preprocesador inicia con signo numeral. Antes de la compilacin del programa, el compilador C activa el preprocesador que recorre
el programa buscando estos signos numerales.
Si encuentra alguno el preprocesador los reemplazara con otro texto, que
depende del tipo de comando, podra ser el contenido de un archivo o una
secuencia corta de caracteres. Luego de esto, se inicia el proceso de compilacin.
El comando numeral include obtiene texto desde otro documento para formar parte del programa.
Con la finalidad de acelerar el proceso de escritura de un programa, los comandos, comentarios y declaraciones que se repiten varias veces se agrupan
en ficheros especiales que fcilmente se incluyen usando esta directiva.

93

El comando numeral define provee expansin macro reemplazando identificadores en el programa por sus valores.
numeral define symbol sequence of characters. Ejemplo:
...
numeral define PI 3.14
...
La idea principal de escribir un programa en lenguaje C es dividir un problema grande en mdulos ms pequeos.
Por ejemplo nos piden escribir un programa para leer temperatura y visualizar resultados en una pantalla LCD. Este problema se lo podra dividir en
cuatro partes que se procesan con determinado orden:
1. Configurar mdulo ADC del PIC.
2. Leer seal analgica.
3. Calcular temperatura.
4. Enviar datos con formato a pantalla LCD.Como se puede ver este problema se resuelve escribiendo cuatro funciones que se ejecutan repetidamente
en lazo infinito.
Todo se basa en funciones.

6.2.

Tipos de Datos en Lenguaje C

La tabla (Figura 6.3) muestra el rango de valores, que estos datos tienen en
su forma bsica.

Figura 6.3: Tipos de datos


Los tipos float, double y long son considerados como iguales (Figura 6.4).

Figura 6.4: Float y double

94

Cualquier nmero que cambia su valor durante la operacin del programa


se llama variable.
Si un programa suma dos nmeros (NUM1 + NUM2), es necesario tener un
valor que represente lo que en la vida diaria se denomina SUMA.
En este caso NUM1, NUM2 y SUMA son variables.
Un nombre de variable puede incluir cualquier caracter alfabtico A Z (a
z), los dgitos 0 9 y el caracter guin bajo.
El compilador es sensitivo por lo que diferencia las maysculas de las minsculas.
Los nombres de funciones y variables generalmente contienen letras minsculas, mientras que los nombres de constantes contienen letras maysculas.
Los nombres de variables no deben comenzar con dgitos.
Nombres reservados para el compilador (key words) no deben usarse como
variables.
A continuacin se muestra una lista de key words reconocidas por mikroC
(Figura 6.5).

Figura 6.5: Keywords

95

Captulo 7

Fundamentos bsicos del


lenguaje C
7.1.

Punteros

Un puntero es una variable especial que contiene la direccin de una variable. En otras palabras, un puntero apunta a otra variable. Un puntero se
declara como sigue:
Tipo de variable *nombre_puntero.
A fin de asignar la direccin de una variable a un puntero, es necesario usar
el = y anteponer al nombre de la variable el &.
Para cambiar el valor de la variable apuntada, es suficiente escribir el caracter * adelante de su puntero y asignarle un valor nuevo.
*multiplex = 6; //a variable multiplex se asigna el nmero 6
De manera similar, para leer el valor de la variable apuntada, es suficiente
escribir temp = multiplex; // el contenido de variable display1 se copia en
temp.
Hay pocas maneras de cambiar solamente un bit en una variable. La ms
simple es especificar el nombre del registro, posicin del bit o su nombre y
el estado deseado:
(PORTD.F3 = 0) ; // encera el bit RD3 ...
(PORTC.RELAY = 1) ; // enciende el bit de salida RELAY de PORTC
//(previamente definido como constante RELAY)

96

7.2.

Declaraciones de Variables

Toda variable debe declararse antes de usarse por primera vez en un programa.
Puesto que las variables se almacenan en memoria RAM, es necesario reservar espacio para ellas. El programador sabe que tipo de datos escribe, o
espera como resultado de una operacin.
No olvidar que el programa manipula variables que el programador define
con nombre y tipo. El compilador las reconoce como registros de memoria
RAM.
Las variables generalmente se definen al inicio del programa.
unsigned int gato; // declara nombre y tipo de variable gato
Generalmente a las variables se les asigna valores iniciales, por ejemplo:
gato= 20; //asigna el valor 20 a variable gato.
El proceso de declarar variables y asignar valores iniciales se lo puede hacer
en un slo paso.
Ejemplo:
signed int num1=0, suma=0; // declara las variables num1 y suma
// con valor inicial 0.

7.3.
7.3.1.

Constantes
Constantes enteras

Una constante o caracter es un valor fijo que no cambia durante la ejecucin


del programa.
A diferencia de las variables, las constantes se almacenan en la memoria de
programa (flash) con la finalidad de ahorrar espacio valioso en la memoria
RAM.
El compilador las reconoce por su nombre y por el prefijo const.
Las constantes enteras pueden ser: decimales, hexadecimales, octales o binarias (Figura 7.1).
El compilador reconoce su formato basndose en un prefijo.
Si el nmero no tiene prefijo, se lo considera decimal por defecto. El tipo de
una constante es automticamente reconocido por su tamao.
En el siguiente ejemplo la constante MINIMUM ser automticamente considerada un entero con signo y almacenada en dos bytes (16 bits) de memoria
flash.
const MINIMUM = -100; // declara constante MINIMUM

97

Figura 7.1: Constantes Enteras

Constantes de Punto Flotante


Las constantes de punto flotante consisten de una parte entera, de punto,
una parte fraccionaria y una e E opcional seguida de un exponente entero
con signo.
const T_MAX = 32.60; // declara temperature T_MAX
const T_MAX = 3.260E1; // declara la misma constante
En ambos casos se declara una constante T_MAX que tiene el valor 32.60.

7.3.2.

Constantes Character (ASCII)

Una constante character es un caracter encerrado entre apstrofes.


const I_CLASS = A; // declara constante I_CLASS
const II_CLASS = B; // declara constante II_CLASS Ejecutando comandos que transfieran estas constantes a una pantalla LCD, se visualizar el
caracter A y B respectivamente.

7.3.3.

Constantes tipo string

Es una constante que consiste en una cadena de caracteres.


Las constantes string se encierran entre comillas.
const Mensaje_1 = Apriete botn de Inicio; // Mensaje 1 para LCD.
const Mensaje_2 = Apriete botn derecho; // Mensaje 2 para LCD.
const Mensaje_3 = Apriete botn izquierdo; // Mensaje 3 para LCD.
En este ejemplo, enviando la constante Mensaje_1 a la pantalla LCD, se
visualiza el mensaje Aprete botn Inicio.

98

7.3.4.

Constantes Enumeradas

Las constantes enumeradas son un tipo especial de constantes enteras, las


que hacen que un programa sea comprensible y ms fcil de seguir, asignando a los elementos nmeros ordinales. En el siguiente ejemplo, al primer
elemento dentro de las llaves, automticamente se le asigna el valor 0, al
segundo el valor 1, al tercero el valor 2 etc.
enum MOTORS IZQ, DERECHA,ARRIBA, ABAJO; // declara constante
MOTORS.
Con cada ocurrencia de las palabras IZQ, DERECHA, ARRIBA y ABAJO en el programa el compilador las reemplazar con los nmeros apropiados 0, 1, 2 3.
Concretamente, si los pins 0, 1, 2 3 de PORTB se conectan a motores que
hacen que algo vaya de arriba, abajo, izquierda y derecha, el comando para
que el motor gire a la derecha conectado a pin 3 de PORTB es como sigue:
PORTB.ABAJO = 1; // enciende PORTB bit 3

7.4.

Operadores, Operaciones y Expresiones

Un operador es un smbolo que denota una operacin aritmtica, lgica o


de otro tipo.
Hay ms de 40 operadores disponibles en lenguaje C, pero en la prctica se
usan entre 10 15 operadores.
Cada operacin se desarrolla sobre uno o ms operandos que pueden ser variables o constantes. Adems, cada operacin se caracteriza por su prioridad
y asociatividad.

99

7.4.1.

Operadores Aritmticos

Los operadores aritmticos (Figura 7.2) se usan en operaciones aritmticas


y siempre retornan valores positivos.
A diferencia de las operaciones unitarias que actan con un solo operando,
las operaciones binarias demandan dos operandos. En otras palabras, se requieren dos nmeros para ejecutar una operacin binaria.
Por ejemplo: a+b a/b.

Figura 7.2: Operadores Aritmticos

7.4.2.

Operadores de Asignacin

Hay dos tipos de operadores de asignacin en lenguaje C.


Operador simple asigna valores a variables usando el caracter =. Por ejemplo: a=8;
Operador de asignacin compuesto que es especfico del lenguaje C y consiste de dos caracteres (Figura 7.3).
Una expresin puede escribirse de forma diferente, pero sta genera un cdigo de mquina ms eficiente.

Figura 7.3: Operadores de Asignacin

100

7.4.3.

Operadores de incremento y decremento

Las operaciones de incremento y decremento en 1 se denotan por ++ y -.


Estos caracteres pueden ir antes o despus de una variable (Figura 7.4).
En el primer caso (++X), la variable X primero se incrementa y luego usada
en la expresin.
En el segundo caso (X++), la variable X primero es usada en la expresin
y luego se incrementa en uno.
Lo mismo se aplica para la operacin de decremento.

Figura 7.4: Operadores de incremento y decremento

7.4.4.

Operadores Relacionales

Los operadores relacionales se usan para comparar dos variables las cuales
pueden ser nmeros enteros o de punto flotante (Figura 7.5).
Si una expresin evala verdadero retorna 1, con falso retorna 0. stas son
usadas en sentencias condicionales, tales como If. . . Then. . . else.

Figura 7.5: Operadores Relacionales

101

7.4.5.

Operadores Lgicos

En lenguaje C hay tres tipos de operadores lgicos: AND, OR y NOT (Figura 7.6).
Para mayor claridad, en las tablas el falso se representa con 0 y el verdadero
con 1.
Los operadores lgicos retornan verdadero (1) si la expresin evala con valor distinto de cero, y falso (0) si evala con valor igual a cero (0).
Esto es muy importante ya que los operadores lgicos se usan comnmente
con expresiones (operandos) y no con nmeros.
Por ejemplo, 1 && 0 es lo mismo que (expresin verdadera) && (expresin
falsa), el resultado es 0, es decir falso.

Figura 7.6: Operadores Lgicos

102

7.4.6.

Operadores Lgicos de bit a bit

A diferencia de los operadores lgicos que usan variables como operandos,


los operadores bit a bit manipulan bits dentro de los operandos (Figura 7.7).
Los operadores bit a bit se usan para modificar bits dentro de una variable.

Figura 7.7: Operadores Lgicos de bit a bit

7.4.7.

Operadores Condicionales

Operador Condicional if
if (expresin) operacin;
Si el resultado de expresin es diferente de cero (verdadera) entonces se
ejecuta operacin, pero si el resultado de expresin es igual a cero (falso)
entonces no se ejecuta operacin.
Operador Condicional if - else
if (expresin) operacin1 else operacin2;
Si el resultado de expresin es diferente de cero (verdadera) se ejecuta operacin1, pero si el resultado de expresin es igual a cero (falso) entonces se
ejecuta operacin2.
Si operacin1 u operacin2 es compuesta, es decir consta de varias sentencias, estas deben encerrarse entre llaves { }.
if(expresin) {
...
operacin1
... }
else
operacin2

103

El operador if-else puede escribirse usando el operador condicional ?: como


se lista abajo:
(expresin1)? expresin2 : expresin3
Si expresin1 es verdadera el resultado de toda la expresin ser igual al
resultado de expresin2, si es falsa el resultado de toda la expresin ser
igual al resultado de expresin3.

Operacin SWITCH
A diferencia de la sentencia If else que hace la seleccin entre dos opciones,
el operador switch nos permite escoger entre varias operaciones. La sintaxis
de la sentencia switch es:
switch (selector)
{
case constant1:
operation1 // Grupo de operadores son ejecutados si
... // selector y constante1 son iguales.
break;
case constant2:
operation2 // Grupo de operadores son ejecutados si
... // selector y constante2 son iguales.
break;
...
default:
expected_operation // Grupo de operadores son ejecutados si no
... // son iguales ninguna constante y el selector.
break;
}
La operacin switch funciona de la manera siguiente:
Primero se ejecuta selector y luego se compara con constant1, si es igual
entonces ejecuta el grupo de sentencias de ese bloque hasta encontrar break
o el fin de switch. Si no es igual, entonces selector se compara con contant2,
si son iguales se ejecuta el grupo de sentencias de ese bloque hasta encontrar
break o fin de switch y as sucesivamente.
Si selector no compara con ninguna constante, entonces se ejecuta el grupo
de sentencias despus del operador default.

104

Lazo WHILE
while(expresin){
sentencias
...
}
Las sentencias se ejecutan repetidamente hasta que expresin se haga falsa.
Si se entra a lazo while con expresin falsa el lazo (grupo de sentencias) no
ser ejecutado.
Si expresin permanece siempre verdadera estamos frente a un lazo infinito.

Lazo FOR
for(initial_expression; condition_expression; change_expression)
{
operaciones
...
}
Initial_expresion setea el valor inicial de la variable del lazo, que luego se
compara con condition_expression antes de entrar al lazo. Las operaciones
dentro del lazo se ejecutan repetidamente, despus de cada ejecucin del
grupo de sentencias el valor de la expresin se cambia. Esto se repite hasta
que condition_expression evale a falsa.

Lazo DO-WHILE
do
{
operaciones
......
}
while (condicin_salida);
Las operaciones se repiten indefinidamente hasta que condicin_salida sea
falsa.
Las operaciones se ejecutan al menos una vez ya que la condicin_salida se
verifica al final del lazo.

105

7.5.

Conversin Tipo de Datos

Los tipos de datos principales se ponen en orden jerrquico como sigue (Figura 7.8):

Figura 7.8: Prioridad de datos


Si dos operandos de distinto tipo se usan en una operacin aritmtica, el
tipo de operando de ms baja prioridad , se convierte automticamente al
tipo de operando de ms alta prioridad.
Si el operando de prioridad ms alta es de tipo double, entonces los tipos de
todos los otros operandos en la expresin as como tambin el resultado se
convierten automticamente a tipo double.
Si el operando de ms alta prioridad es de tipo long, entonces los tipos de
todos los otros operandos en la expresin as como tambin el resultado se
convierten automticamente a tipo long.
En operaciones de asignacin tambin ocurre auto conversin. El resultado
de la expresin a la derecha del operador de asignacin siempre se convierte
al tipo de variable a la izquierda del operador de asignacin.
Si el resultado es de tipo ms alto, se trunca o redondea con la finalidad de
coincidir con el tipo de variable.

106

7.6.

Insertar cdigo en lenguaje ensamblador

Programacin en lenguaje ASM(Figura 7.9).

Figura 7.9: Lenguaje ASM

Ejemplo:
unsigned char VAR1 = 100; // declara variable VAR1
asm
{ // Inicio de cdigo ensamblador
MOVF VAR1,W // W = VAR1 = 100
...
} // Fin de cdigo ensamblador

107

7.7.

Arreglos

A un grupo de variables del mismo tipo se denomina ARREGLO.A los elementos de un ARREGLO se denominan componentes.
Un arreglo se declara especificando su nombre, el tipo y nmero de elementos que lo componen.
Tipo_componente nombre_arreglo [nmero_de_componentes];
La figura de abajo (Figura 7.10) muestra el arreglo SHELF que consta de
100 elementos. A cada elemento se le asigna un nmero ordinal (la numeracin siempre inicia con 0). En este ejemplo cada elemento representa el
nmero de productos que la estantera contiene.

Figura 7.10: Arreglo SHELF


En el cuadro anterior (Figura 7.10), una variable representada como un arreglo define con cada elemento del arreglo el nmero de productos que contiene
una estantera.
Los elementos se acceden, especificando su correspondiente nmero ordinal
(ndice).
A los elementos se les puede asignar contenido durante la declaracin del
arreglo.
Ejemplo.
unsigned char calendar [12] = 31,28,31,30,31,30,31,31,30,31,30,31;
Unsigned char tabla [12]=1,2,3,4,5,6,7,8,9,10,11,12;
Temp=tabla[6];

108

7.8.

Arreglos de dos dimensiones

A los arreglos de dos dimensiones se denominan matrices que se las puede


visualizar como TABLAS (Figura 7.11).
Un arreglo de dos dimensiones se declara especificando el tipo de arreglo, el
nombre del arreglo y el tamao de cada dimensin.
component_type array_name [number_of_rows] [number_of_columns];
Ejemplo:
int Table [3][4]; // Tabla de 3 filas y 4 columnas

Figura 7.11: Arreglo de dos dimensiones


A los elementos de una matriz se pueden asignar valores durante la declaracin del arreglo. Veamos el ejemplo siguiente:
int Table[2][3] = 3,42,1, 7,7,19;
Como se ve tenemos un arreglo de 2 filas 3 columnas.
Su representacin en forma de tabla es (Figura 7.12):

Figura 7.12: Ejemplo de una matriz

109

7.9.

Funciones

Todo programa escrito en lenguaje C basa su estructura en funciones. La


idea principal es dividir un programa en varias partes usando funciones para
resolver el problema de una forma ms fcil.
El cuerpo de una funcin generalmente consiste de varios comandos que se
ejecutan en el orden especificado.
Cada funcin debe declarase de manera apropiada para que durante el proceso de compilacin sea interpretada de forma correcta.
La declaracin contiene los elementos siguientes:
Nombre
Cuerpo de la funcin
Lista de parmetros
Declaracin de parmetros
Tipo del resultado de la funcin
A continuacin se tiene la estructura de una funcin.
type_of_result function_name (type argument1, type argument2,...)
{
Command;
Command;
...
}
Hay funciones que no requieren parmetros, pero el parntesis siempre tiene que estar presente. Otras en cambio no retornan resultados al programa
principal, el compilador reconoce estas funciones por el tipo de resultado
especificado por void. Esta funcin requiere de parmetros pero no retorna
resultados al programa principal.
void function_name (type argument1, type argument2,...)
{
Commands;
}
Esta funcin no requiere parmetros y no retorna resultados al programa
principal.
void function_name (void)
{
Commands;
}

110

Para que una funcin retorne resultados al programa principal, se usa el


comando return seguido de una expresin, por ejemplo:
type_of_result function_name (type argument1, type argument2,...)
{
Commands;
...
return expression;
}
Si la funcin contiene el comando return sin expresin, la funcin detiene
su ejecucin cuando encuentra return y contina con el comando que est
inmediatamente despus de la llave que cierra.
Aparte de las funciones propias del lenguaje C y que automticamente las
reconoce, hay tambin funciones completamente nuevas usadas en los programas.
Cada funcin nueva debe declararse al inicio del programa. La declaracin
de una funcin se denomina prototipo y se ve as:
type_of_result function_name (formal parameters)
{
descripcin de parmetros
definicin y declaracin
operadores
...
}
El tipo de funcin que no retorna valores es void. Si el tipo de resultado no se
declara especficamente en el programa se considera ser tipo int (entero con
signo). A los parmetros de la funcin prototipo se llaman PARMETROS
FORMALES.
El siguiente ejemplo declara una funcin que calcula el volumen de un cilindro.
const double PI = 3.14159; // Declara constante PI
float volumen (float r, float h) // Declara tipo float para
{ // parmetros formales r y h
float v; // Declara tipo de resultado v
v = PI*r*r*h; // Evala el volumen del cilindro
return v;
}

111

Captulo 8

Modulacin por ancho de


pulso (PWM)
El PIC16F887 ( Figura 8.1 dispone de dos mdulos CCP, llamados CCP1 y
CCP2 que permiten al usuario controlar diversos eventos.
Estos mdulos trabajan en tres modos:
1. Modo captura.
2. Modo comparacin.
3. Modo modulacin de anchura de pulsos (PWM).

Figura 8.1: Microcontrolador PIC16F887

112

8.1.

Mdulos CCP

MODO CAPTURA: Provee acceso al estado de un registro que constantemente cambia su valor en este caso el TMR1.
MODO COMPARACIN: Compara constantemente dos registros uno de
ellos es el TMR1. El circuito tambin permite al usuario empezar un evento
externo cuando ha pasado un determinado tiempo PWM: (Modulacin por
Ancho de pulso) puede generar pulsos de diversa frecuencia y ciclo de trabajo en los pines de salida CCP1 y CCP2.
Los dos mdulos son idnticos excepto por el modo extendido que se aplica
slo al CCP1.

8.2.

Mdulo CCP1

Una parte central de este circuito es un registro de 16 bits CCPR1 que


consiste de dos registros CCPR1L y CCPR1H. Usado para capturar o comparar nmeros binarios almacenados en el temporizador TMR1 (TMR1H y
TMR1L).
El registro CCP1CON (Figura 8.2) controla el mdulo CCP1.

Figura 8.2: Registro CCP1CON

113

8.2.1.

CCP1 en modo captura

En este modo (Figura 8.3) el TMR1(TMR1H TMR1L) se copia al CCP1(CCP1H


CCP1L) en los siguiente casos:
1.2.3.4.-

Cada
Cada
Cada
Cada

flanco descendente (1 ->0) en el pin RC2/CCP1;


flanco ascendente (0 ->1) en el pin RC2/CCP1;
4 flancos ascendente (0 ->1) en el pin RC2/CCP1;
16 flancos ascendente (0 ->1) en el pin RC2/CCP1;

Una combinacin de cuatro bits (CC1M3 CCP1M0 ) del registro de control CCP1CON determina el evento a ocurrir, siempre y cuando:
El pin RC2/CCP1 sea configurado como entrada.
El TMR1 opere como timer o contador sincrnico.

Figura 8.3: CCP1 en Modo Captura


Al efectuarse la captura la bandera CCP1IF se hace 1 y si el bit CCP1IE=1
ocurre una interrupcin.

114

8.2.2.

CCP1 en modo comparacin

En este modo (Figura 8.4) el valor almacenado en el registro CCP1 es constantemente comparado con TMR1 y cuando son iguales el estado lgico del
pin de salida RC2(CCP1 puede cambiarse, dependiendo del estado de los
bits de control CCP1M3 CCP1M0 del registro CCP1CON. Simultneamente la bandera CCP1F se hace 1.
Para que opere el modo de comparacin se deben de reunir dos condiciones:
El pin RC2/CCP1 debe estar configurado como salida.
El TMR1 debe estar sincronizado con el reloj interno.

Figura 8.4: CCP1 en Modo Comparacin

115

8.2.3.

CCP1 en modo PWM

Seales de frecuencia y ciclo de trabajo variable tienen una amplia aplicacin


en Automatizacin. Un ejemplo tpico es un circuito de control de potencia.
SI lgica 0 indica apagado y lgica 1 indica prendido, la potencia elctrica consumida es directamente proporcional a la duracin del pulso (Figura
8.5).

Figura 8.5: CCP1 en Modo PWM

116

Otra de las aplicaciones prcticas comunes es la generacin de seales de


formas arbitrarias como las ondas sinusoidales (Figura 8.6).
Dispositivos que operan de esta manera son usados frecuentemente para el
control de velocidad, aceleracin y desaceleracin de motores elctricos mediante ajuste de frecuencia.

Figura 8.6: Generar seales en Modo PWM


El diagrama de bloques del Modo PWM (Figura 8.7), muestra un pulso de
salida cuyo perodo y ancho de pulso deben ser configurados.

117

Figura 8.7: Diagrama de bloques del modo PWM


El perodo del pulso de salida (T) (Figura 8.8)se determina por medio del
registro PR2 del TMR2. El perodo del PWM puede calcularse de la siguiente frmula:

Figura 8.8: Frmula del Periodo de pulso


El ciclo de trabajo del PWM se lo especifica mediante 10 bits: ocho del
CCPR1L y los dos bits menos significativos de CCP1CON(DC1B1 y DC1B0).
El resultado es un nmero de 10 bits contenido en la frmula (Figura 8.9):

Figura 8.9: Frmula del ancho de pulso


Una seal PWM no es mas que una secuencia de pulsos de ancho de pulso
variable. Para una frecuencia determinada hay un nmero limitado de ciclos
de trabajo permitidos. Este nmero representa una resolucin medida mediante bits (Figura 8.10). Por ejemplo: Una resolucin de 10 bits resulta en
118

1024 ciclos de trabajo(duty cycles) discretos mientras que una resolucin de


8 bits resulta en 256 ciclos de trabajo, etc.
La resolucin es determinada por el registro PR2. El mximo valor es obtenido con FFh.

Figura 8.10: Frecuencias y Resoluciones del modo PWM

119

8.2.4.

Registro CCP1_CON

Este registro es de 8 bits (Figura 8.11).

Figura 8.11: Registro CCP1_CON


P1M1, P1M0 Estos pines afectan el funcionamiento del PWM de la siguiente manera (Figura 8.12):

Figura 8.12: Pines P1M1 y P1M0


DC1B1, DC1B0 Representan los dos bits menos significativos cuando se
emplea la resolucin del PWM a 10 bits. Los 8 bits ms significativos estn
almacenados en el registro CCPR1L.

120

CCP1M3 - CCP1M0
Estos pines seleccionan el modo de trabajo del mdulo CCP1 (Figura 8.13):

Figura 8.13: Pines CCP1M3 y CCP1M0

8.2.5.

Pasos para la Configuracin del CCP1 en Modo PWM

Los pasos para la configuracin del modo PWM son los siguientes:
1.- Deshabilite el CCP1. Pin CCP1 debe ser configurado como entrada
2.- Ingrese en PR2 el perodo del PWM
3.- Configure el mdulo CCP para trabajar en el modo PWM configurando
los bits del CCP1CON.
4.- Configure el ciclo de trabajo cargando CCPR1L y usando los bits DC1B1
y DC1B0 del registro CCP1CON.
5.- Configure y empiece el TMR2.
6.- Habilite el pin de salida del PWM despus de completar un ciclo de trabajo.

121

8.3.

Mdulo CCP2

Excluyendo los diferentes nombres de registros y bits, este mdulo (Figura


8.14) es una buena copia del CCP1 con una sola diferencia, cuando opera
en modo de comparacin.
La diferencia se refiere a cuando se produce la seal de RESET del TMR1.
Si est habilitada la conversin A/D al momento en que TMR1 y CCPR2
se igualan automticamente se produce, adems del RESET provocado por
el TMR1, un inicio de conversin A/D.
Similar al CCP1, este circuito es controlado por el registro CCP2CON.

Figura 8.14: Mdulo CCP2

122

8.3.1.

Registro CCP2_CON

DC2B1, DC2B0 Representan los dos bits menos significativos cuando se


emplea la resolucin del PWM a 10 bits (Figura 8.15). Los 8 bits ms significativos estn almacenados en el registro CCPR2L.

Figura 8.15: Registro CCP2_CON


CCP2M3 CCP2M0
Estos pines seleccionan el modo de trabajo del mdulo CCP2 (Figura8.16):

Figura 8.16: Pines CCP2M3 y CCP2M0

123

8.4.

Funciones PWM de MikroCPro

PWM1_Init
Inicializa este mdulo interno PWM con una relacin de trabajo de cero.
Esta funcin debe ser llamada antes de utilizar cualquier otra funcin de la
librera PWM.
Su sintaxis es la siguiente:
void PWM1_Init(const long freq);

PWM1_Set_Duty
Establece la relacin de trabajo PWM, este parmetro tiene un rango de 0
a 255 en donde el 0 es el 0 %, 127 es el 50 % y 255 es el 100 % de relacin de
trabajo.
Su sintaxis es la siguiente:
void PWM1_Set_Duty(unsigned short duty_ratio);

PWM1_Start
Permite que el PIC comience a realizar el proceso de modulacin PWM.
Su sintaxis es la siguiente:
void PWM1_Start(void);

PWM1_Stop
Permite que el PIC detenga el proceso de modulacin PWM.
Su sintaxis es la siguiente:
void PWM1_Stop(void);

124

Captulo 9

Teclados
9.1.

Teclado Matricial 4X4

Los teclados matriciales son muy utilizados con los microcontroladores, ya


que ofrecen el control de varias teclas con pocas seales; en concreto, con n
seales se pueden controlar hasta 2n teclas. Se utilizar el teclado matricial
de 4x4 teclas (16) cuyo circuito se muestra a continuacin (Figura 9.1)

Figura 9.1: Teclado 4X4

125

9.2.

Manejo de Interruptores, Botoneras y Teclados

Recordemos que para usar botoneras, interruptores y teclados en lo posible se debe usar el PORTB dado que estos pines tienen resistencias de
Pull-Up que se habilitan en forma general con el bit RBPU=0 del registro
OPTION_REG y en forma individual con los bits del registro WPUB.
Para reaccionar a los cambios de nivel en las entradas donde se conectan,
los mencionados dispositivos, no es necesario escribir un programa de deteccin de flancos sino simplemente habilitar las interrupciones por cambio de
estado en el pin respectivo utilizando los registros IOCB e INTCON.
En el manejo de interruptores, botoneras y teclados hay que tomar en cuenta
el efecto antirebote ocasionado por las partes mecnicas lo cual se soluciona
por SOFTWARE mediante la incorporacin de una rutina de retardo (alrededor de 20ms.); o por HARDWARE mediante un circuito RC que ocasione
un retardo al presionar la tecla .
Los pines del PORTB son comnmente usados para detectar pulsadores de
teclados. En el esquema presentado (Figura 9.2), los pines RB0-RB3 se configuran como entradas con resistencias a tierra (Pull-Down), mientras que
x, y, z (columnas) son salidas en alto. Cuando se presione un pulsador ocasiona una interrupcin que define la fila que la ocasion. Inmediatamente en
el programa principal con la fila detectada se cambian x, y, z a entradas y
se lee su estado para determinar la columna. Con fila y columna definidas
se identifica mediante una tabla la tecla apretada.

Figura 9.2: Deteccin del pulsador

126

9.3.

Funciones para el Teclado de MikroCPro

Keypad_Init
Inicializa los puertos de entrada digital para trabajar con un teclado.
Su sintaxis es la siguiente:
void Keypad_Init(void);

Keypad_Key_Press
Retorna cero si no se presiona nada, caso contrario entrega nmeros entre
el 1 y 16 de tipo char.
Su sintaxis es la siguiente:
void Keypad_Key_Press(void);

Keypad_Key_Click
Funciona de igual manera a Keypad_Key_Press() pero es con el clic del
ratn. Retorna cero si no se presiona nada, caso contrario entrega nmeros
entre el 1 y el 16 de tipo char.
Su sintaxis es la siguiente:
void Keypad_Key_Click(void);

127

Captulo 10

Mdulos de Comunicacin
10.1.

Mdulo UART para comunicacin Serial Asncrona

Asncrona significa que no hay reloj de sincronizacin.


Tiene que sincronizarse por si misma, y lo hace mediante dos bits de control.
Los bits de control son: bit START y bit STOP.
En lugar de usar los voltajes normales de 0 y 5 voltios, ste usa +12 y -12
voltios.

10.1.1.

Margen de Ruido

Niveles lgicos TTL


Los fabricantes establecen un margen de seguridad para no sobrepasar los
valores crticos de tensin conocido como MARGEN DE RUIDO.
Para la familia TTL observar los niveles lgicos y mrgenes de ruido(0.4V)
permitidos en el grfico siguiente (Figura 10.1).

128

Figura 10.1: Niveles lgicos TTL


Niveles lgicos TTL
Ruido es cualquier perturbacin involuntaria que puede originar un cambio
no deseado en la salida del circuito. El ruido puede generarse externamente
por la presencia de escobillas en motores o interruptores, por acoplo por
conexiones o lneas de tensin cercanas o por picos de la corriente de alimentacin. Para la familia CMOS observar los niveles lgicos y mrgenes de
ruido (1.4V) permitidos en el grfico siguiente (Figura 10.2).

Figura 10.2: Niveles lgicos CMOS

129

Niveles lgicos RS232


Los niveles lgicos se muestran a continuacin (Figura 10.3).

Figura 10.3: Niveles lgicos RS232

MAX 232
El convertidor de niveles MAX 232 tiene el siguiente diagrama de pines
(Figura 10.4 y Figura 10.5)

Figura 10.4: Convertidor de niveles MAX 232

130

Figura 10.5: Conexiones de MAX 232

Protocolo RS232
La trama desde PC del protocolo RS232 se representa de la siguiente forma(Figura 10.6).

Figura 10.6: Trama desde PC

131

La trama desde PIC del protocolo RS232 se representa de la siguiente forma(Figura 10.7).

Figura 10.7: Trama desde PIC

10.1.2.

Asignacin de Pines, conversiones y comunicaciones.

Asignacin de Pines en conector DB9 (Figura 10.8):

Figura 10.8: Asignacin de Pines en conector DB9

132

Asignacin de Pines en conector DB25 (Figura 10.9):

Figura 10.9: Asignacin de Pines en conector DB25


Sincronizacin de datos con el reloj (Figura 10.10):

Figura 10.10: Sincronizacin de datos con el reloj

133

Mdem Nulo (Figura 10.11):

Figura 10.11: Mdem Nulo


Comunicacin serial usando DB25 (Figura 10.12):

Figura 10.12: Comunicacin serial usando DB25

134

10.1.3.

El Transmisor

La salida del PIC debe estar en la condicin STOP, es decir en nivel alto.
Este pin siempre est en alto, excepto cuando se est transmitiendo datos.
Para generar el bit START, simplemente llevamos a nivel bajo la salida del
PIC y generamos un retardo de 104 us ( A una velocidad de 9600 bps).
Ahora podemos transmitir los 8 bits datos, comenzando con el bit menos
significativo, cada vez que se fija un bit en el pin de salida se genera un
retardo de 104 us En tal forma de que cada bit tenga la duracin correcta.
Luego generamos el bit STOP poniendo en alto la salida del PIC y generando
el correspondiente retardo de 104 us El bit STOP no necesariamente tiene
que durar los 104 us puede ser mayor.

10.1.4.

El Receptor

El pin de entrada del PIC se encuentra en un lazo de espera hasta que recibe
un nivel bajo, lo que significa un bit de START.
Luego espera solamente la mitad de tiempo de bit (52 us para 9600 bps)
y chequea nuevamente para asegurar su permanencia en nivel bajo, este
retardo de 52 us significa que estamos leyendo el bit START exactamente
en la mitad del bit.
Una vez detectado con xito el bit de START procedemos a leer los bits
de datos. Como nos encontramos en el centro del bit START, simplemente
esperamos 104 us (tiempo de bit) que nos lleva al centro del primer bit
dato, entonces leemos nuevamente el pin de entrada. Luego procesamos los
siguientes bits datos esperando 104 us antes de leerlos.
Finalmente se considera el bit de STOP, nuevamente se espera 104 us
para detectar el centro del bit y procedemos a leer el pin de entrada, si no
est en alto hay un error y debera leerse nuevamente la trama.
Recibido correctamente el bit de STOP se dispone del dato recibido, en el
registro SFR de la memoria de datos RCREG para transferirlo al lugar que
se desee.

10.1.5.

El UART

El UART tiene las caractersticas siguientes:


Transmisor y Receptor asncrono FULL - DUPLEX
Trama de 8 9 bits programable
Deteccin de direccin en modo 9 bits
Deteccin de sobrecarga del buffer de entrada
Comunicacin HALF DUPLEX en modo sincrnico

135

10.1.6.

Modo Asncrono

Este modo no usa seal de reloj, y el formato de los datos que se transfieren
es muy simple como se ilustra abajo.
El UART transmite y recibe datos usando el formato non-return-to-zero
(NRZ).

Transmisor Asncrono
Transmisor Asncrono (Figura 10.13):

Figura 10.13: Transmisor Asncrono


Para habilitar el transmisor del UART es necesario definir el estado de los
siguientes bits (Figura 10.13):
TXEN=1 habilita el transmisor;
SYNC=0 define modo asncrono;
SPEN=1 bit del registro RCSTA, habilita el UART y el pin TX/CK se
configura automticamente como salida.
La parte central del transmisor es el registro de desplazamiento TSR, que
no es accesible por el usuario.

136

Cada dato se trasfiere de la manera siguiente:


En reposo, la lnea TX tiene nivel lgico alto (1);
La transmisin se inicia con el bit START que siempre es un cero (0);
Cada dato puede ser de 8 o 9 bits ( el bit LSB se transfiere primero);
La transmisin termina con el bit STOP que siempre es un uno (1);
La comunicacin se ajusta al estndar RS232;
El integrado MAX 232 se usa para la conversin de los niveles de voltaje.
El dato a transmitir debe cargarse en el registro TXREG, que causa los
eventos siguientes:
El byte se transfiere de manera inmediata al registro TSR;
TXREG permanece vaco, lo que se indica encendiendo la bandera TXIF
del registro PIR1. Si el bit TXIE de PIE1 est encendido entonces se genera
una interrupcin;
La bandera TXIF no se encera por software, sino escribiendo un nuevo dato
en TXREG.
Los datos se ubican en la patita TX en sincronizacin con el reloj interno:
bit START. . . .datos. . . .bit STOP.
Cuando el ltimo bit sale del registro TSR automticamente se enciende la
bandera TRMT del registro TXSTA;
Mientras tanto , si el registro TXREG ha recibido un nuevo dato, todo el
procedimiento se repetir tan pronto se termine de transmitir el bit STOP
del dato previo.

137

Receptor Asncrono
Para habilitar la recepcin asncrona de datos se requiere definir el estado
de los bits siguientes:
CREN = 1 Habilita receptor, bit del registro RCSTA;
SYNC = 0 define modo asncrono, bit de registro TXSTA.
SPEN = 1 bit de registro RCSTA , habilita UART y el pin RX/DT es
automticamente configurado como entrada.
Cuando todo esto se cumple y se detecta el bit START, el dato se transfiere
al registro de desplazamiento RSR a travs del pin RX.
Cuando se recibe el bit STOP los eventos siguientes ocurren:
El dato recibido automticamente se transfiere al registro RCREG (si est
vaco);
La bandera RCIF se enciende, se genera interrupcin si est habilitada con
RCIE del registro PIE1.
La bandera RCIF se encera solamente leyendo el buffer RCREG que es una
FIFO que permite la recepcin de dos caracteres.
Si el buffer RCREG est lleno con dos caracteres y el registro de desplazamiento RSR detecta un nuevo bit STOP, entonces el bit de error OEER se
enciende. No es posible recibir datos con OEER=1. El bit de error OEER
debe encerarse, para lograrlo se reinicia la comunicacin y luego se enciende
el bit CREN, de esta forma el receptor queda nuevamente operativo.
Si el bit STOP es cero en el instante de su muestreo se enciende el bit de
error FERR del registro RCSTA.
Para habilitar la recepcin de datos de 9 bits, debe encenderse el bit RX9
del registro TXSTA.

138

Deteccin de error FERR


El error FERR (FERR=1) no genera Interrupcin por si solo si este bit est
encendido, el ltimo dato recibido tiene error.
El error FERR (FERR=1) no bloquea la recepcin de nuevos datos.
FERR se encera leyendo el buffer RCREG, lo que significa que debemos
verificar su estado antes de leer el dato recibido.
FERR no se encera por software. Si es necesario hacerlo, lo logramos encerando el bit SPEN del registro RCSTA que tambin genera un RESET
completo del EUART.
Las consecuencias de este error son:
Los datos almacenados en FIFO pueden leerse normalmente;
No es posible recibir datos mientras OERR=1, sino hasta que OERR=0.
Este bit OERR no se accede directamente; para encerarlo es necesario encerar el bit CREN del registro RCSTA o provocar un RESET del sistema
UART encerando el bit SPEN en el registro RCSTA.
Esquemtico de conexiones PIC-MDULO UART (Figura 10.14):

Figura 10.14: Mdulo UART conectado al MAX232

139

10.1.7.

Registro TXSTA

Figura 10.15: Registro TXSTA


El Registro TXSTA contiene (Figura 10.15):
CSRC Clock Source Select bit- determina la fuente de reloj.
Se utiliza slo en modo sincrnico.
Modo Maestro. Reloj se genera internamente desde Baud Rate Generator.
Modo esclavo. Reloj se genera a partir de una fuente externa.
TX9 - 9-bit Transmit Enable bit
La transmisin de datos de 9 bits a travs del sistema EUSART - 1.
La transmisin de datos de 8 bits a travs del sistema EUSART - O.
TXEN - Transmitir Enable bit
1 - Transmisin habilitado.
O - Transmisin desactivada.
SYNC - EUSART Mode Selec bit
1 - EUSART funciona en modo sncrono.
O - EUSART funciona en modo asncrono.
SENDB Send Break Character bit es utilizado en modo asncrono y cuando se requiere observar estndar de bus LIN.
1 - transmisin de caracteres rotura est habilitada.
O - se completa la transmisin de caracteres Break.
BRGH High Baud Rate Selec bit determina la velocidad de transmisin
en modo asncrono. No afecta EUSART en modo sncrono.
1 - EUSART funciona a alta velocidad.
O - EUSART opera a baja velocidad.
TRMT Transmit Shift Register Status bit
1 - TSR registro est vaca.
O - T AR registro est lleno.
TX9D Ninth bit of Transmit Data se puede utilizar como direccin o bit
de paridad.

140

10.1.8.

Registro RCSTA

Contenido y caractersticas del Registro RCSTA se presentan en la Figura


10.16, Figura 10.17, Figura 10.18:

Figura 10.16: Registro RCSTA

Figura 10.17: Caractersticas del Registro RCSTA

141

Figura 10.18: Caractersticas del Registro RCSTA 2

10.1.9.

Generador de Baudios

El generador de baudios es un timer de 8 o 16 bits. Por defecto opera en


modo 8 bits. Encendiendo el bit BRG16 del registro BAUDCTL se obtiene
modo 16 bits.
El par de registros SPBRGH y SPBRG determina el perodo del timer.
En modo asncrono la frecuencia en baudios (bps) la determinan: el bit
BRGH del registro TXSTA y el bit BRGH16 del registro BAUDCTL.

142

Registro de Control de Baudios BAUDCTL


Caractersticas del Registro BAUDCTL (Figura 10.19) y (Figura 10.20):

Figura 10.19: Registro BAUDCTL

Figura 10.20: Caractersticas del Registro BAUDCTL

143

Seleccin de la frecuencia en Baudios (Figura 10.21):

Figura 10.21: Seleccin de la frecuencia en Baudios


Ejemplo de error de tasa de baudios
Para un dispositivo con Fosc de 16 MHz, baud rate (velocidad en Baudios)
de 9600, modo asncrono, 8-bit BRG.
Baud rate deseado= Fosc/(64([SPRGH:SPBRG]+1))
Resolviendo para SPBRHG:SPBRG:
X=((Fosc/(Baud Rate deseado))/64)-1
X=((16000/9600)/64)-1
X=[25.042]=25
Baud Rate Calculado= 16000000/(64(25+1)) Baud Rate Calculado=9615
Error=(Baud Rate Calculado-Baud Rate Deseado)/(Baud Rate Deseado)
Error= 9615/9600=0.16

144

10.1.10.

Funciones UART de MikroCPro

UART1_Init
Inicializa la comunicacin serial con la velocidad de transmisin deseada.
Su sintaxis es la siguiente:
void UARTx_Init(const unsigned long baud_rate);

UART1_Data_Ready
Permite saber si el dato dentro del buffer de recepcin est completo y listo
para ser ledo. Devuelve 1 si el dato fue transmitido.
Su sintaxis es la siguiente:
char UARTx_Data_Ready();

UART1_Tx_Idle
Permite saber si el dato ya fue enviado y el buffer de transmisin ya est
vaco. Devuelve 1 si el dato fue transmitido.
Su sintaxis es la siguiente:
char UARTx_Tx_Idle();
UART1_Read
Obtiene un byte recibido mediante comunicacin UART.
Su sintaxis es la siguiente:
char UARTx_Read();

UART1_Read_Text
Obtiene caracteres mediante la comunicacin UART y los almacena a en
la variable output, la cantidad de caracteres que almacenera depender del
valor de la variable attempts, o si el caracter recibido coincide con el valor
de la variable delimiter. Si aattempts tiene un valor de 255, el PIC dejara
de almacenar nicamente cuando el valor recibido coincida con la variable
delimiter.
Su sintaxis es la siguiente:
void UARTx_Read_Text(char *Output, char *Delimiter, char Attempts);

145

UART1_Write
Transmite un byte (data_) mediante comunicacin UART.
Su sintaxis es la siguiente:
void UARTx_Write(char data_);

UART1_Write_Text
Transmite un caracter (UART_Text) mediante comunicacin UART.
Su sintaxis es la siguiente:
void UARTx_Write_Text(char *UART_Text);

UART_Set_Active
Permite especificar las funciones de cual UART se va a trabajar en caso de
que el PIC posea mas de un mdulo UART.
void UART_Set_Active(char (*read_ptr)(), void (*write_ptr)(unsigned
char data_), char (*ready_ptr)(), char (*tx_idle_ptr)());

146

10.2.

Comunicacin Serial Sincrnica SPI

Comunicacin SPI (Figura 10.22):

Figura 10.22: Estndar de Comunicacin del SPI

10.2.1.

SPI Caractersticas Bsicas

Conexiones bsicas del SPI (Figura 10.23):

Figura 10.23: Conexiones bsicas del SPI

147

10.2.2.

Funciones SPI de MikroCPro

SPIx_Init
Habilita y configura el mdulo SPI. Comando necesario previo el uso del
mdulo SPI.
Su sintaxis es la siguiente:
void SPIx_Init();
SPIx_Read
Retorna el dato ledo del bus de datos SPI.
Su sintaxis es la siguiente:
unsigned short SPIx_Read(unsigned short buffer);
SPIx_Write
Enva data_ a travs del bus de datos SPI.
Su sintaxis es la siguiente:
void SPIx_Write(unsigned short data_);
SPI_Set_Active
Comando solo para PICs con ms de un mdulo SPI. Selecciona el mdulo
activo que ejecutar las rutinas.
Su sintaxis es la siguiente:
void SPI_Set_Active(char (read_ptr)(char), void(write_ptr)(char));

10.3.

Comunicacin Serial Sncrona I2C

Comunicacin I2C (Figura 10.24):

Figura 10.24: Estndar de Comunicacin del I2C

148

10.3.1.

I2C Caractersticas Bsicas

Caractersticas del I2C (Figura 10.25):

Figura 10.25: Caractersticas del I2C


Esquema de conexin del I2C (Figura 10.26):

Figura 10.26: Esquema de conexin del I2C

149

Definiciones bsicas del I2C (Figura 10.27):

Figura 10.27: Definiciones bsicas del I2C


Conexin a nivel fsico (Figura 10.28):

Figura 10.28: Conexin a nivel fsico

150

Conexin a nivel lgico (Figura 10.29):

Figura 10.29: Conexin a nivel lgico


Formato de los mensajes (Figura 10.30):

Figura 10.30: Formato de los mensajes

151

Direccionamiento de los esclavos (Figura 10.31):

Figura 10.31: Direccionamiento de los esclavos

10.3.2.

Funciones I2C de MikroCPro

I2C1_Init
Habilita y configura el mdulo I2C con los parmetros por defecto y la tasa
de reloj deseada clock.
Su sintaxis es la siguiente:
void I2C1_Init(const unsigned long clock);

I2C1_Start
Determina si no hay comunicaciones en curso en el bus I2C y enva una
seal de Start. Si no hay error, retorna 0.
Su sintaxis es la siguiente:
unsigned short I2C1_Start(void);

I2C1_Repeated_Start
Enva seales de Start continuamente al bus I2C.
Su sintaxis es la siguiente:
void I2C1_Repeated_Start(void);

152

I2C1_Is_Idle
Revisa si el bus I2C est libre para comunicaciones. Retorna 1 si est libre,
0 si est ocupado.
Su sintaxis es la siguiente:
unsigned short I2C1_Is_Idle(void);

I2C1_Rd
Lee un byte del esclavo y enva la seal not acknowledge si el parmetro ack
es 0, de lo contrario enva acknowledge.
Su sintaxis es la siguiente:
unsigned short I2C1_Rd(unsigned short ack);

I2C1_Wr
Enva un byte de informacin a travs del bus I2C, retorna 0 si no hubo
error durante la transmisin.
Su sintaxis es la siguiente:
unsigned short I2C1_Wr(unsigned short data);

I2C1_Stop
Enva una seal de STOP a travs del bus I2C.
Su sintaxis es la siguiente:
void I2C1_Stop(void);

153

Captulo 11

Prcticas de Laboratorio
11.1.

Encendido de LEDS mediante interruptores

Figura 11.1: Diagrama esquemtico general

11.1.1.

Objetivo

Familiarizarse con el funcionamiento del MPLAB y del Proteus, para lo cual


se utilizar un programa sencillo que permite encender LEDS en el Puerto
B mediante el cambio de un interruptor colocado en el Puerto A.

154

11.1.2.

Contenido

Creacin de un proyecto nuevo con el MPLAB


Ejecucin paso a paso
Observacin de registros varios
Simulacin en PROTEUS

11.1.3.

Creacin de un proyecto nuevo

Lo primero que se necesita es un archivo .asm que puede ser creado en


cualquier procesador de texto o en el ambiente del MPLAB. Esta segunda
alternativa combinada con el Project Wizard es la que se sigue a continuacin:
1. En el directorio C: cree una carpeta de trabajo G#NN. Donde G es
por Grupo # debe indicar el nmero de grupo y NN son las iniciales de
los nombres de los integrantes del grupo. Ejemplo: G5JM pertenece al
Grupo #5 de Jose y Maritza. sta ser su carpeta temporal de trabajo
para la prctica del da. La misma que deber ser borrada al finalizar
la prctica.
2. Abra el programa MPLAB y seleccione FILE NEW y aparecer
una ventana sin ttulo tal como se muestra en la figura 11.2.
3. En Untitled digite el programa 1
4. Guarde el documento creado con su carpeta de trabajo con el A1NN.asm
(Donde NN son las iniciales de los integrantes del Grupo).
5. Seleccione Project Wizard. Figure 11.3.
6. Presione Siguiente. Figure 11.4.
7. De la ventana desplegable seleccione el microcontrolador 16F887 y
presione Siguiente. Figure 11.5.
8. Si tiene seleccionado Microchip MPASM Toolsuite (En caso de no tenerlo seleccionado tendr que hacerlo) presione siguiente. Figure 11.6.
9. Con el botn de BROWSE seleccione su directorio de trabajo. Figure
11.7.
10. En Nombre Ingrese el nombre del proyecto p1_led y seleccione el botn
Guardar. Figura 11.8.

155

11. Presione siguiente. Figura 11.9.


12. Seleccione su programa p1_led.asm (programa 1) y pulse el botn
ADD. Figura 11.10.
13. Luego presione siguiente. Figura 11.11.
14. Presione Finalizar. Figura 11.12.
15. Seleccione Debugger Select Tool MPLAB SIM y se habilitarn
los conos que permiten la ejecucin paso a paso. Figura 11.13.
16. Para compilar el programa *.asm, seleccione Project Build All. Si
la compilacin es exitosa deber aparecer el archivo .asm con una
flecha verde que seala la primera instruccin a ejecutarse. En caso
de errores de compilacin habr que corregirlos antes de continuar.
Haciendo doble clic en el error lo conduce al sitio del error. Nota: En
ltimas versiones del programa MPLAB cuando se manda a
compilar sale una pregunta sobre cmo le gustara generar
el cdigo del proyecto. En esta opcin escoger ABSOLUTE.
Figura 11.14.
17. Seleccione Configure Configuration Bits y observe los valores de
configuracin que deben de coincidir con los ingresados con la directiva
_config en el programa. Figura 11.15.

Figura 11.2: Ventana inicial de MPLAB. Paso 2

156

Programa 1 Encendido de LEDS


;
; LECTURA DE SWITCH EN PORTA Y ENCENDIDO DE LEDS EN PORTB
;
;
NOMBRE:
p1_led . asm
;
FECHA:
26/05/2010
;
VERSION :
1.00
;
PROGRAMADOR:
Carlos Valdivieso
;
;
DESCRIPCION :
; Se c o l o c a un i n t e r r u p t o r en RA0 . Cuando RA0=1 en e l Puerto B
; d e b e r a l e e r s e e l v a l o r h e x a d e c i m a l AA y cuando RA0=0 d e b e r a
; cambiar a l v a l o r h e x a d e c i m a l 5 5 .
;
LIST
p=16F887
; Tipo de m i c r o c o n t r o l a d o r
INCLUDE
P16F887 . INC
; D e f i n e l o s SFRs y b i t s d e l
; P16F887
__CONFIG _CONFIG1, _CP_OFF&_WDT_OFF&_XT_OSC
; I n g r e s a p a r a m e t r o s de
; Configuracion
errorlevel

302

; D e s h a b i l i t a m e n s a j e s de
; A d v e r t e n c i a por cambio
; Bancos
;
; INICIO DEL PROGRAMA
ORG

0 x00

; Comienzo d e l programa ( V e c t o r de R e s e t )

; SETEO DE PUERTOS
BANKSEL
CLRF
CLRF
BANKSEL
CLRF
BSF
BANKSEL
CLRF

ANSEL
ANSEL
ANSELH
TRISB
TRISB
TRISA , 0
PORTB
PORTB

;
;
;
;

c o n f i g u r a p u e r t o s con e n t r a d a s d i g i t a l e s
c o n f i g u r a p u e r t o s con e n t r a d a s d i g i t a l e s
s e l e c c i o n a e l banco c o n t e n i e n d o TRISB
p u e r t o B c o n f i g u r a d o como s a l i d a

; s e l e c c i o n a e l p u e r t o B como s a l i d a

; DESARROLLO DEL PROGRAMA


LOOP
BTFSS
GOTO
MOVLW
MOVWF
GOTO

PORTA, 0 ; prueba d e l b i t 0 d e l p u e r t o A
NUEVO_VALOR
B 1 0 1 0 1 0 1 0
; mueve 0xAA a l r e g i s t r o W
PORTB
; pasa e l v a l o r a l p u e r t o B
LOOP

NUEVO_VALOR
MOVLW
MOVWF
GOTO

B 0 1 0 1 0 1 0 1
PORTB
LOOP

END

; mueve 0 x55 a l r e g i s t r o W
; pasa e l v a l o r a l p u e r t o B

; f i n d e l programa

157

Figura 11.3: Paso 5

Figura 11.4: Paso 6

158

Figura 11.5: Paso 7

Figura 11.6: Paso 8

159

Figura 11.7: Paso 9

Figura 11.8: Paso 10

160

Figura 11.9: Paso 11

Figura 11.10: Paso 12

161

Figura 11.11: Paso 13

Figura 11.12: Paso 14

Figura 11.13: Paso 15

162

Figura 11.14: Paso 16

Figura 11.15: Paso 17

163

11.1.4.

Ejecucin paso a paso

Una vez compilado el programa se podr ejecutar paso a paso. Para lo cual
es recomendable ordenar el espacio de trabajo segn las siguientes recomendaciones:
1. Con View Special Function Registers abra los registros de funciones
especiales SFR y colqueles del lado derecho tal como se muestra en
la figura 11.16.
2. Ahora podr ejecutar paso a paso el cdigo con Debugger Step into
o su cono equivalente F7. En los registros SFR se podrn observar
los cambios que sufren los registros de acuerdo con la ejecucin de cada
instruccin.
3. Analice el comportamiento de cada uno de los conos del MPLAB
SIM (Que son aquellos que aparecen cuando se selecciona Debugger
Select Tool MPLAB SIM y en el ANEXO DE RESPUESTAS
DE LA PRCTICA 1 indique el funcionamiento de cada uno de ellos.

Figura 11.16: Paso 1

11.1.5.

Observacin de varios registros

1. Con View File Registers se pueden observar los contenidos de los


cuatro bancos de datos del 16F887. Figura 11.17.
2. Con View EEPROM observar el contenido de las 256 posiciones
de memoria EEPROM del 16F887. Figura 11.18.

164

3. Con View Hardware Stack observar los 8 niveles de stack disponibles en los microcontroladores de la gama media. Figura 11.19.
4. Con View Program Memory pueden mirarse detalles de cada una
de las instrucciones en la memoria de programa. Figura 11.20.

Figura 11.17: Paso 1

Figura 11.18: Paso 2

165

Figura 11.19: Paso 3

Figura 11.20: Paso 4

166

11.1.6.

Simulacin en PROTEUS

La simulacin en el Programa PROTEUS nos permite una excelente visualizacin del comportamiento del PIC programado dentro del circuito utilizado.
Siga los siguientes pasos:
1. En el Programa PROTEUS abra ISIS. Figura 11.21.
2. Seleccione Component y luego P. Esto abrir una ventana de seleccin
de componentes en donde escogeremos los que vamos a utilizar. Figura
11.22.
3. En Keywords ingresamos 16F887 y hacemos doble clic en el elemento
respectivo de la derecha, esto transfiere el componente a nuestro ambiente de trabajo. Hacemos lo mismo con switch, res 330R y led green,
para que tambin se transfieran.
4. Guarde la hoja de ISIS con el nombre p1_led.
5. Con estos elementos se puede empezar a dibujar el circuito arrastrando
y pegando elementos del espacio de trabajo al plano de dibujo.
6. Acercando el Mouse a los terminales de los componentes se los va
uniendo. El bus se lo hace con el cono de buses del margen izquierdo del Proteus y las etiquetas se crean con el cono LBL del mismo
margen. El resultado se observa en la siguiente grfica: Figura 11.23.
7. Haga un clic derecho en el centro del Microcontrolador y en la ventana
que se abre seleccione en la lnea de Program File el cono de la carpeta y aparecer un directorio de bsqueda que tenemos que hacerlo
apuntar al archivo p1_led.hex que se form como resultado de la compilacin y que debe de estar en su carpeta de trabajo. Luego presione
OK y est listo para la simulacin.
8. Presione PLAY en la parte inferior izquierda de la pantalla de ISIS
y empezar la simulacin. Observe que haciendo clic sobre el switch
causar que ste se abra o cierre y afecte el valor de prendido o apagado
de los LEDS.

167

Figura 11.21: Paso 1

Figura 11.22: Paso 2

168

Figura 11.23: Paso 6

11.1.7.

Preguntas Prctica 1

INTEGRANTE 1: ______________________
INTEGRANTE 2: ______________________
PARALELO: _______
GRUPO: ____
Indique la funcin que desempean cada uno de los siguientes conos:
Run .Halt.Animate.Step Into.Step Over.Step Out.Reset.-

169

Figura 11.24: Diagrama esquemtico general

11.2.

Encendido y apagado de LEDS en PORTB


usando retardos

11.2.1.

Objetivo

Familiarizarse con el uso de retardos.


Comprender el uso de la directiva CBLOCK.
Entender el funcionamiento del sistema de reloj y su registro de control
OSCCON

11.2.2.

Contenido

Instrucciones
Especificaciones
Cdigo P2_RET.ASM
Especificaciones parte 2
Cdigo P2_RET2.ASM

170

11.2.3.

Instrucciones

Utilizando la metodologa de la Prctica 1 para crear un archivo nuevo


al que llamar p2_ret.asm (programa 2) y luego con el Project Wizard
crear el proyecto p2_ret (programa 3). Use el programa proporcionado a
continuacin y conteste las preguntas planteadas en el anexo de la prctica.

11.2.4.

Especificaciones

Este ejercicio es similar al p1_led.asm con la novedad que ahora no se usa el


interruptor en RA0 sino que se crean retardos de tiempo con la instruccin
"decfsz counter"(decremente la variable counter y salte si es cero). Dicha
instruccin decrementa el file counter, previamente cargado con FFh hasta
00h. Cuando counter alcanza el valor de cero se salta la prxima instruccin
y contina el programa, esto permite que se genere un retardo que depende
del reloj y del valor cargado en counter. El mismo retardo se usar para
mantener los LEDs encendidos o apagados.
En este ejercicio el reloj parte a una velocidad de 4MHz porque se usa
un oscilador externo, para luego por software seleccionar el reloj interno a
32KHz mediante el registro OSCCON.

171

11.2.5.

Cdigo P2-RET.ASM

Programa 2 Encendido de LEDS con retardo.


;
;ENCENDIDO Y APAGADO DE LEDS EN PORTB USANDO ;RETARDOS
;
;
NOMBRE:
p2_ret . asm
;
FECHA:
31/05/2010
;
VERSION :
1.00
;
PROGRAMADOR:
Carlos Valdivieso
;
LIST
INCLUDE

p=16F887
P16F887 . INC

; Tipo de m i c r o c o n t r o l a d o r
; D e f i n e l o s SFRs y b i t s d e l
; P16F887

__CONFIG _CONFIG1, _CP_OFF&_WDT_OFF&_XT_OSC


; S e t e a p a r a m e t r o s de
; configuracion
errorlevel

302

; D e s h a b i l i t a m e n s a j e s de
; a d v e r t e n c i a por cambio
; bancos
;
; DEFINICION DE VARIABLES
; Las v a r i a b l e s en e l 16 F887 pueden e s c r i b i r s e a p a r t i r de l a
; p o s i c i o n de memoria de d a t o s 0 x20
cblock

0 x20

; Bloque de v a r i a b l e s empieza en l a
; d i r e c c i o n 20h
; V a r i a b l e " c o u n t e r " en d i r e c c i o n 20h

counter
endc
;
; INICIO DEL PROGRAMA
org
0 x00
; D i r e c c i o n de l a p r i m e r a i n s t r u c c i o n
; d e l programa
b a n k s e l OSCCON

; s e l e c c i o n a e l banco en memoria que


; c o n t i e n e r e g i s t r o OSCCON
bcf
OSCCON, 6
; s e l e c c i o n a o s c i l a d o r i n t e r n o LFINTOSC
bcf
OSCCON, 5
; con f r e c u e n c i a de 32KHz
bcf
OSCCON, 4
bsf
OSCCON, 0
; M i c r o c o n t r o l a d o r usa o s c i l a d o r i n t e r n o
;SETEO DE PUERTOS
banksel
ANSEL
clrf
ANSEL
clrf
ANSELH

172

Programa 2 Encendido de LEDS con retardo. (Continuacin)


banksel

TRISB

; s e l e c c i o n a banco que c o n t i e n e
; r e g i s t r o TRISB
clrf
TRISB
; Todos l o s p i n e s d e l Puerto B
; c o n f i g u r a d o s como s a l i d a s
banksel
PORTB
; s e l e c c i o n a banco que c o n t i e n e
; r e g i s t r o PORTB
; INICIALIZACION DE VARIABLES
clrf
PORTB
clrf
counter
;DESARROLLO DEL PROGRAMA
; s e c a r g a n p a t r o n e s a l t e r n a d o s de unos y c e r o s en e l p u e r t o B
; e n t r e cada p a t r o n de numeros s e l l a m a a un r e t a r d o .
inicio
movlw
B 0 1 0 1 0 1 0 1
; numero b i n a r i o 01010101 pasa a W
movwf
PORTB
; numero e s movido a PORTB
movlw
h FF
; numero hFF e s movido a W
movwf
counter
; numero e s movido a v a r i a b l e
; " counter "
call
retardo
movlw
movwf
movlw
movwf
call
goto

B 1 0 1 0 1 0 1 0
; numero b i n a r i o 10101010 pasa a W
PORTB
; numero e s movido a PORTB
h FF
; numero hFF e s movido a W
counter
; numero e s movido a v a r i a b l e
; " counter "
retardo
inicio

retardo
decfsz

counter

goto
return

retardo

;
;
;
;

Variable " counter " es


decrementada en 1 y s i l l e g a a 0
s a l t a l a i n s t r u c c i o n inmediata
permanece en l a z o r e t a r d o

end
; Fin d e l programa
;

173

11.2.6.

Especificaciones Parte 2

En este ejercicio la variable counter1 se decrementa 255 veces en el lazo


ret1 (lazo corto) para seguidamente decrementar counter 2 en el lazo ret2
(lazo largo). El retardo conseguido por el anidamiento de dos contadores
se lo usa para mantener durante el tiempo que dura el retardo visibles los
valores cargados previamente en PORTB. Use un reloj de 4MHz.

11.2.7.

Cdigo P2-RET2.ASM

Programa 3 Encendido de LEDS con retardos anidados.


;
;
ENCENDIDO Y APAGADO DE LEDS EN PORTB USANDO
;
DOS RETARDOS ANIDADOS
;
;
NOMBRE:
p2_ret2 . asm
;
FECHA:
07/06/2010
;
VERSION :
1.00
;
PROGRAMADOR:
Carlos Valdivieso
;

LIST
INCLUDE

p=16F887
P16F887 . INC

; Tipo de m i c r o c o n t r o l a d o r
; D e f i n e l o s SFRs y b i t s d e l
; P16F887

__CONFIG _CONFIG1, _CP_OFF&_WDT_OFF&_XT_OSC


; S e t e a p a r a m e t r o s de
; configuracion
errorlevel

302

; D e s h a b i l i t a m e n s a j e s de
; a d v e r t e n c i a por cambio
; bancos

;
; DEFINICION DE VARIABLES
cblock

0 x20

; Bloque de v a r i a b l e s empieza en l a
; d i r e c c i o n 20h
; V a r i a b l e " c o u n t e r 1 " en d i r e c c i o n 20h
; V a r i a b l e " c o u n t e r 2 " en d i r e c c i o n 21h

counter1
counter2

endc
;
o r g 0 x00
; Address o f t h e f i r s t program i n s t r u c t i o n
;SETEO DE PUERTOS
b a n k s e l ANSEL
clrf
clrf
B a n k s e l TRISB
clrf
banksel

ANSEL
ANSELH
; S e l e c t s bank c o n t a i n i n g r e g i s t e r TRISB
TRISB ; C l e a r s TRISB
PORTB ; S e l e c t s bank c o n t a i n i n g r e g i s t e r PORTB

174

Programa 3 Encendido de LEDS con retardos anidados. (Continuacin)


; INICIALIZACION DE VARIABLES
; Es i m p o r t a n t e i n i c i a l i z a r t o d a s l a s v a r i a b l e s para t e n e r un
; punto de p a r t i d a c o n o c i d o
clrf
PORTB
clrf
counter1
clrf
counter2
;DESARROLLO DEL PROGRAMA
; s e c a r g a n p a t r o n e s a l t e r n a d o s de unos y c e r o s en e l p u e r t o B
; e n t r e cada p a t r o n de numeros s e l l a m a a un r e t a r d o ( en e s t a
; o c a s i o n s e usa un r e t a r d o a n i d a d o ) .
inicio
movlw
movwf
call
movlw
movwf
call
goto

B 1 1 1 1 0 0 0 0 ; Binary number 11110000 i s moved t o W


PORTB
; Number i s moved t o PORTB
retardo_anidado
B 0 0 0 0 1 1 1 1 ; Binary number 00001111 i s moved t o W
PORTB
; Number i s moved t o PORTB
retardo_anidado
inicio

retardo_anidado
; Observe a l c o n s t r u i r e l r e t a r d o que s e l o i n i c i a c o l o c a n d o c e r o
; en l o s c o n t a d o r e s y no FF . Con l a i n s t r u c c i o n d e c f s z a l
; d e c r e m e n t a r e l c e r o e l c o n t a d o r s e hace FF .
clrf
clrf

counter1
counter2

decfsz
goto
decfsz
goto
return

counter1
ret1
counter2
ret1

ret1
;
;
;
;

Decrements " c o u n t e r 1 " by 1 . I f


s k i p next i n s t r u c t i o n
Decrements " c o u n t e r 2 " by 1 . I f
s k i p next i n s t r u c t i o n

result is 0
result is 0

END
; Fin d e l programa
;

175

11.2.8.

Preguntas Prctica 2

INTEGRANTE 1: ______________________
INTEGRANTE 2: ______________________
PARALELO: _______
GRUPO: ____
RESPONDER
1) Usando un breakpoint (cono breakpoint color rojo) mida con el STOPWATCH (Debugger->StopWatch) el tiempo que demora la subrutina de
retardo en la parte 1.
2) Revise la hoja de datos del P16F887 y explique el uso de OSCCON y
que significan cada uno de los siguientes modos de reloj LP, XT, HS, EC y
RC.
3) Con la herramienta STOPWATCH mida el retardo provocado por la
subrutina RETARDO_ANIDADO.
4) En base al programa propuesto en p2_ret2.asm elabore un nuevo programa con tres retardos anidados. Use un reloj de 4MHz. a. Cul es el
mximo retardo conseguido? b. Indique los valores que debern modificarse
para conseguir un retardo de un segundo (haga uso del stopwatch).

176

11.3.

Subrutinas y pulsadores

11.3.1.

Objetivo

Comprender el uso de instrucciones de desplazamiento as como las operaciones lgicas.

11.3.2.

Contenido

Especificaciones parte 1
Cdigo P3A_RET.ASM
Especificaciones parte 2
Cdigo P3B_RET.ASM

11.3.3.

Especificaciones Parte 1

En este ejercicio se realiza el desplazamiento de leds y cuando se presiona


la botonera se detiene el desplazamiento. El diagrama esquemtico general
se lo aprecia en la figura 11.25.

Figura 11.25: Diagrama esquemtico general. Parte 1

177

11.3.4.

Cdigo P3A_RA.ASM

El cdigo del programa a ser utilizado en esta prctica se lo presenta a


continuacin (programa 4).
Programa 4 Uso de subrutinas y pulsadores
;
USO DE SUBRUTINAS Y PULSADORES
;
;
NOMBRE:
p3a_ra . asm
;
FECHA:
14/06/2010
;
VERSION :
1.00
;
LIST
p=16F887
; Tipo de m i c r o c o n t r o l a d o r
INCLUDE
P16F887 . INC
; D e f i n e l o s SFRs y b i t s d e l
; P16F887
__CONFIG _CONFIG1, _CP_OFF&_WDT_OFF&_XT_OSC
; S e t e a p a r a m e t r o s de
; configuracion
errorlevel
302
; D e s h a b i l i t a m e n s a j e s de
; a d v e r t e n c i a por cambio
; bancos
;
;
Header
; DEFINING VARIABLES
cblock
0 x20
; Block o f v a r i a b l e s s t a r t s a t a d d r e s s 20h
counter1
; V a r i a b l e " c o u n t e r 1 " a t a d d r e s s 20h
counter2
; V a r i a b l e " c o u n t e r 2 " a t a d d r e s s 21h
endc
; Block o f v a r i a b l e s ends
; MAIN PROGRAM
org
banksel
clrf
clrf
banksel
clrf
movlw
movwf
banksel
movlw
movwf

0 x00
; Address o f t h e f i r s t program i n s t r u c t i o n
ANSEL
; S e l e c t s bank c o n t a i n i n g r e g i s t e r ANSEL
ANSEL
; C l e a r s r e g i s t e r s ANSEL and ANSELH t o
ANSELH
; c o n f i g u r e a l l inputs as d i g i t a l
TRISB
; S e l e c t s bank c o n t a i n i n g r e g i s t e r TRISB
TRISB
; All port B pins are c o n f i g u r e d as outputs
B 0 0 0 0 0 0 1 0
TRISA
; Pin RA1 i s i n p u t
PORTB
; S e l e c t s bank c o n t a i n i n g r e g i s t e r TRISB
B 0 0 0 0 0 0 0 1
; Writes 1 to r e g i s t e r W
PORTB
; Number i s moved t o PORTB

rlf
call

PORTB, f
DELAY

; Port B b i t s r o t a t e s by one p l a c e l e f t
; C a l l s s u b r o u t i n e "DELAY"

btfss
goto
goto

PORTA, 1
loop3
loop

; Tests the f i r s port A b i t


; " 0 " i s a p p l i e d t o p i n . Go t o l a b e l " l o o p 3 "
; " 1 " i s a p p l i e d t o p i n . Go t o l a b e l " l o o p "

loop

loop3

178

Programa 4 Uso de subrutinas y pulsadores. (Continuacin)


; SUBROUTINES
DELAY
clrf
counter2
; Clears v a r i a b l e " counter2 "
loop1
clrf
counter1
; Clears v a r i a b l e " counter1 "
loop2
decfsz
counter1
; Decrements v a r i a b l e " c o u n t e r 1 " by 1
goto
loop2
; R e s u l t i s not 0 . Go t o l a b e l l o o p 2
decfsz
counter2
; Decrements v a r i a b l e " c o u n t e r 2 " by 1
goto
loop1
; R e s u l t i s not 0 . Go t o l a b l o o p 1
return
; Return from s u b r o u t i n e "DELAY"
end

11.3.5.

; End o f program

Especificaciones Parte 2

En esta parte de la prctica se har uso de un switch para modificar la


ejecucin del programa. El diagrama esquemtico general se lo aprecia en la
figura 11.26.

11.3.6.

Cdigo P3B_RA.ASM

El cdigo del programa a ser utilizado en esta prctica se lo presenta a


continuacin (programa 5).

Figura 11.26: Diagrama esquemtico general. Parte 2

179

Programa 5 Uso de subrutinas y pulsadores. Parte 2.


;
;DESPLAZAMIENTO DE LEDS
;
;
NOMBRE: p3b_ret . asm
;
FECHA:
31/05/2010
;
VERSION :
1.00
;
LIST
INCLUDE

p=16F887
P16F887 . INC

; Tipo de m i c r o c o n t r o l a d o r
; D e f i n e l o s SFRs y b i t s d e l
; P16F887

__CONFIG _CONFIG1, _CP_OFF&_WDT_OFF&_XT_OSC


; S e t e a p a r a m e t r o s de
; configuracion
errorlevel

302

; D e s h a b i l i t a m e n s a j e s de
; a d v e r t e n c i a por cambio bancos
;
; DEFINICION DE VARIABLES
; Las v a r i a b l e s en e l 16 F887 pueden e s c r i b i r s e a p a r t i r de l a
; p o s i c i o n de memoria de d a t o s 0 x20
cblock

0 x20

; Bloque de v a r i a b l e s empieza en l a
; d i r e c c i o n 20h
c o u n t e r 1 ; V a r i a b l e " c o u n t e r " en d i r e c c i o n 20h
counter2
counter3

endc
;
; INICIO DEL PROGRAMA
org
0 x00

; D i r e c c i o n de l a p r i m e r a i n s t r u c c i o n

;SETEO DE PUERTOS
b a n k s e l ANSEL
clrf
clrf
b a n k s e l TRISB
clrf
clrf
clrf
bsf
b a n k s e l PORTB
; INICIALIZACION DE VARIABLES
clrf
clrf
clrf
clrf
bcf
;DESARROLLO DEL PROGRAMA

ANSEL
ANSELH
TRISB
TRISC
TRISD
TRISA , 0
; s e l e c c i o n a banco que c o n t i e n e

PORTB
PORTC
PORTD
counter1
STATUS, 0

inicio
btfss
goto

PORTA, 0
sube

180

Programa 5 Uso de subrutinas y pulsadores. Parte 2. (Continuacin)


baja
movlw
movwf
movwf
movlw
movwf

0 x10
PORTB
PORTD
0x3C
PORTC

rlf
movf
andlw
iorwf
bcf
rlf
movf
andlw
iorwf
bcf
rlf
movf
andlw
iorwf
bcf
call
btfsc
goto

PORTB, f
STATUS,W
0 x01
PORTB, f
STATUS, 0
PORTC, f
STATUS,W
0 x01
PORTC, f
STATUS, 0
PORTD, f
STATUS,W
0 x01
PORTD, f
STATUS, 0
DELAY2
PORTA, 0
baja2

movlw
movwf
movwf
movlw
movwf

0 x08
PORTB
PORTD
0x3C
PORTC

rrf
swapf
andlw
addlw
andlw
iorwf
bcf
rrf
swapf
andlw
addlw
andlw
iorwf
bcf
rrf
swapf
andlw
addlw
andlw
iorwf
bcf
call
btfss
goto
goto

PORTB, f
STATUS, w
0 x10
0 x70
0 x80
PORTB, f
STATUS, 0
PORTC, f
STATUS, w
0 x10
0 x70
0 x80
PORTC, f
STATUS, 0
PORTD, f
STATUS, w
0 x10
0 x70
0 x80
PORTD, f
STATUS, 0
DELAY2
PORTA, 0
sube2
baja

baja2

sube

sube2

181

Programa 5 Uso de subrutinas y pulsadores. Parte 2. (Continuacin)


DELAY2
movlw
movwf

.10
counter3

movlw
movwf

.57
counter2

movlw
movwf

.57
counter1

loop3

loop4

loop5
decfsz
counter1
; Decrements v a r i a b l e " c o u n t e r 1 " by 1
goto
loop5
; R e s u l t i s not 0 . Go t o l a b e l l o o p 5
decfsz
counter2
; Decrements v a r i a b l e " c o u n t e r 2 " by 1
goto
loop4
; R e s u l t i s not 0 . Go t o l a b l o o p 4
decfsz
counter3
goto
loop3
return
; Return from s u b r o u t i n e "DELAY2"
;
end
; Fin d e l programa
;

11.3.7.

Preguntas Prctica 3

INTEGRANTE 1: ______________________
INTEGRANTE 2: ______________________
PARALELO: _______
GRUPO: ____
RESPONDER
1) Modifique el programa de la parte 1 colocando un interruptor en RA1 en
lugar del pulsador, de tal forma que con el interruptor se pueda cambiar la
direccin de giro de los leds.
2) Modifique el programa de la parte 2 de tal forma que cuando se cierre el interruptor se muestre una de las iniciales de los integrantes del grupo
y se desplace hacia abajo. Cuando se abra el interruptor se muestra la inicial
del otro integrante del grupo desplazando hacia arriba.

182

11.4.

Interrupciones y temporizadores

11.4.1.

Objetivo

Comprender el uso de las interrupciones


Trabajar con el Timer 0 y Timer 1

11.4.2.

Contenido

1. Timer 0
2. Timer 1
3. Descripcin parte 1
4. Cdigo P4A.ASM
5. Descripcin parte 2
6. Cdigo P4B.ASM
7. Descripcin parte 3
8. Cdigo P4C.ASM

11.4.3.

Timer 0

El Timer 0 es un mdulo temporizador/contador de 8 bits que cuenta con un


preescalador programable tambin de 8 bits. Puede funcionar como temporizador o como contador. En modo temporizador el valor del registro TMR0
se incrementa con cada ciclo de instruccin (o cada X ciclos dependiendo del
preescalador). En modo contador el valor del registro TMR0 se incrementa
en cada flanco (ascendente o descendente) del pin RA4/T0CKI. En ambos
casos al desbordarse (pasar de 0xFF a 0x0) el registro TMR0 la bandera de
interrupcin del timer 0 (bit T0IF del registro INTCON) se pone a 1.
El modo temporizador se selecciona poniendo a cero el bit T0CS del registro
OPTION (ver figure 11.27). Poniendo a uno ese bit el modulo trabaja en
modo contador, en este modo de operacin adems se debe seleccionar si el
incremento se producir en cada filo ascendente o descendente, al poner a
cero el bit T0SE del registro OPTION se selecciona el filo ascendente.
El preescalador es compartido por el Timer 0 y por el Watchdog. Se asigna a
un mdulo o a otro mediante el bit PSA del registro OPTION. Poniendo el
bit a 1 el preescalador se asigna al Watchdog y ponindolo a 0 el preescalador
se asigna al Timer 0. El valor del preescalador se selecciona con los bits
PS2:PS0 de la manera expuesta en la tabla 11.1.

183

Figura 11.27: OPTION register


Cuadro 11.1: Valor del preescalador
PS02:PS0 TMR0 WDT
000
1:2
1:1
001
1:4
1:2
010
1:8
1:4
011
1:16
1:8
100
1:32
1:16
101
1:64
1:32
110
1:128
1:64
111
1:256
1:128

11.4.4.

Timer 1

En la figure 11.28 vemos que el mdulo del temporizador Timer1 es un temporizador/contador de 16 bits, lo que significa que consiste en dos registros
(TMR1L y TMR1H). Puede contar hasta 65535 pulsos en un solo ciclo, o
sea, antes de que el conteo se inicie desde cero.

Figura 11.28: Temporizador TMR1

Timer 1 en el modo temporizador


Para seleccionar este modo, es necesario poner a 0 el bit TMR1CS. Despus
de eso, el registro de 16 bits ser incrementado con cada pulso generado por
el oscilador interno. Si se utiliza el cristal de cuarzo de 4 MHz, el registro
ser incrementado cada microsegundo.
En este modo, el bit T1SYNC no afecta al temporizador porque cuenta los
pulsos de reloj interno. Como todos los dispositivos utilizan estos pulsos, no
hace falta sincronizarlos.
184

Timer 1 en modo contador


El temporizador Timer1 se pone a funcionar como un contador al poner a 1
el bit TMR1CS (Ver figura 11.29). Este bit cuenta los pulsos llevados al pin
RC0/T1CKI y se incrementa en el flanco ascendente de la entrada del reloj
externo T1CKI. Si el bit de control T1SYNC del registro T1CON se pone a 0,
las entradas del reloj externo se sincronizarn en su camino al temporizador
Timer1. En otras palabras, el temporizador Timer1 se sincroniza con el reloj
interno del microcontrolador y se le denomina contador sncrono.

Figura 11.29: T1CON

Cuadro 11.2: Bits de control


T1CKPS<1:0> PREESCALADOR
11
1:8
10
1:4
01
1:2
00
1:1
Los registros para habilitar la interrupcin por desborde de TIMER1 y para la bandera de sealizacin del desborde son los siguientes: PIE1 (figura
11.30) y PIR1 (figura 11.31).

Figura 11.30: PIE1

Figura 11.31: PIR1

185

11.4.5.

Descripcin Parte 1

Luego de realizar la prctica anterior habr notado una desventaja de los


retardos mediante lazos anidados y es que mientras ocurren los retardos el
microcontrolador no hace nada ms que esperar. Esta prdida de tiempo
es inaceptable y otro mtodo debe aplicarse. Este ejercicio enlaza al TMR0
y las interrupciones. Las conexiones se mantienen iguales pero esta vez los
retardos para notar los cambios en el PORTB se los conseguir mediante
la temporizacin del TMR0 haciendo uso de su preescalador (1:256). Cada
vez que el TMR0 se desborda (con la interrupcin por TMR0 habilitada)
ocurre una interrupcin. La rutina de interrupcin incrementa en uno el valor
mostrado en PORTB; este procedimiento se realiza detrs del escenario
del proceso completo, permitiendo al microcontrolador hacer otras cosas. El
hardware relacionado a esta prctica se lo aprecia en la figura 11.32.

Figura 11.32: Interrupciones. Parte 1

11.4.6.

Cdigo P4A.ASM

El cdigo del programa a ser utilizado en la primera parte de esta prctica


corresponde al programa 6.

186

Programa 6 Enlace entre el TMR0 y las interrupciones.


; HEADER
;
LIST
p=16F887
INCLUDE
P16F887 . INC
__CONFIG _CONFIG1, _CP_OFF&_WDT_OFF&_XT_OSC
errorlevel
302
; START OF PROGRAM
; forma de i n i c i a r programa que usa i n t e r r u p c i o n e s
;
org
0 x00
; v e c t o r de r e s e t
goto
main
; s a l t o a l a b e l " main "
org
0 x04
; v e c t o r de i n t e r r u p c i o n
goto
inter
; salto a interrupcion
org
0 x05
; c o n t i n u a c i o n de programa
; MAIN PROGRAM
; i n i c i o de programa p r i n c i p a l
;
;SETEO DE PUERTOS Y REGISTROS
main
banksel
TRISB
; S e l e c t s bank c o n t a i n i n g r e g i s t e r TRISB
clrf
TRISB
; All port B pins are c o n f i g u r e d as outputs
banksel
ANSEL
; Bank c o n t a i n i n g r e g i s t e r ANSEL
clrf
ANSEL
; C l e a r s r e g i s t e r s ANSEL and ANSELH
clrf
ANSELH
; All pins are d i g i t a l
banksel
OPTION_REG
; Bank c o n t a i n i n g r e g i s t e r OPTION_REG
movlw
b00000111
; c a r g a d i v i s o r con 2 5 5 , s e l o a p l i c a a
;TMR0
; PSA =0 ( BIT 3 ) ; s e a p l i c a e l d i v i s o r
; a l TMR0
;TOCS=0 ( BIT 5 ) ; TMR0 o r i g e n de p u l s o s
; Fosc /4
movwf
OPTION_REG
movlw
b10100000
; h a b i l i t a i n t e r r u p c i o n por Timer 0 y
; Global
; GIE=0 ( BIT 7 ) ; h a b i l i t a i n t e r r u p c i o n e s
; globales
; TMR0IE=0 ( BIT 5 )
; h a b i l i t a i n t e r r u p c i o n e s por TMR0
movwf
INTCON
bsf
INTCON, TMR0IE
; TMR0 i n t e r r u p t o v e r f l o w
; enabled
bsf
INTCON, GIE
; Global i n t e r r u p t enabled
banksel
PORTB
; Bank c o n t a i n i n g r e g i s t e r PORTB
clrf
PORTB
; C l e a r s Port B
loop
nop
goto
loop
; Permanece en e l l a z o
; INTERRUPT ROUTINE
; I n i c i o de r u t i n a de i n t e r r u p c i o n l l a m a d o d e s d e o r g 0 x04
;
inter
incf
PORTB
; I n c r e m e n t s r e g i s t e r PORTB by 1
bcf
INTCON, TMR0IF
; C l e a r s i n t e r r u p t f l a g TMR0IF
retfie
; Return from i n t e r r u p t r o u t i n e
;
; IMPORTANTE: r u t i n a de i n t e r r u p c i o n t e r m i n a en r e t f i e
;
end
; Fin de programa

187

11.4.7.

Descripcin Parte 2

Este ejercicio ejecuta de nuevo al TMR0 con su interrupcin. En el ejercicio


anterior se us al TMR0 en modo temporizador pero en esta ocasin ser
usado en modo contador. La fuente de pulsos que contar el TMR0 ser
una seal de reloj o ser de manera manual. Cada vez que el TMR0 se desborda (con la interrupcin por TMR0 habilitada) ocurre una interrupcin.
La rutina de interrupcin complementa el valor mostrado en PORTB; este
procedimiento se realiza detrs del escenario del proceso completo, permitiendo al microcontrolador hacer otras cosas. El hardware relacionado a
esta prctica se lo aprecia en la figura 11.33.

Figura 11.33: Interrupciones. Parte 2

11.4.8.

Cdigo P4B.ASM

El cogido del programa a ser utilizado en la primera parte de esta prctica


corresponde al programa 7.

188

Programa 7 Enlace entre el TMR0 y las interrupciones. Parte 2


; HEADER
;
LIST
p=16F887
INCLUDE
P16F887 . INC
__CONFIG _CONFIG1, _CP_OFF&_WDT_OFF&_XT_OSC
errorlevel
302
; START OF PROGRAM
; forma de i n i c i a r programa que usa i n t e r r u p c i o n e s
;
org
goto
org
goto
org

0 x00
main
0 x04
inter
0 x05

;
;
;
;
;

v e c t o r de r e s e t
s a l t o a l a b e l " main "
v e c t o r de i n t e r r u p c i o n
salto a interrupcion
c o n t i n u a c i o n de programa

; MAIN PROGRAM
; i n i c i o de programa p r i n c i p a l
;
;SETEO DE PUERTOS Y REGISTROS
main
b a n k s e l ANSEL
; Bank c o n t a i n i n g r e g i s t e r ANSEL
clrf
ANSEL
; C l e a r s r e g i s t e r s ANSEL and ANSELH
clrf
ANSELH ; A l l p i n s a r e d i g i t a l
banksel
TRISB
; S e l e c t s bank c o n t a i n i n g r e g i s t e r TRISB
clrf
TRISB
; All port B pins are c o n f i g u r e d as outputs
clrf
TRISC
bsf
TRISA , 4
banksel
OPTION_REG ; Bank c o n t a i n i n g r e g i s t e r OPTION_REG
movlw
b 0 0 1 1 1 0 0 1 ; c a r g a d i v i s o r con 2 5 5 , s e l o a p l i c a a
movwf
OPTION_REG
movlw
b 1 0 1 0 0 0 0 0 ; h a b i l i t a i n t e r r u p c i o n por Timer 0
movwf
INTCON
bsf
INTCON, TMR0IE ; TMR0 i n t e r r u p t o v e r f l o w
bsf
INTCON, GIE
; Global i n t e r r u p t enabled
banksel
PORTB
; Bank c o n t a i n i n g r e g i s t e r PORTB
clrf
PORTB
; C l e a r s Port B
clrf
PORTC
movlw
.251
movwf
TMR0
loop
comf
TMR0,W
movwf
PORTC
nop
goto
loop
; Permanece en e l l a z o
; INTERRUPT ROUTINE
; I n i c i o de r u t i n a de i n t e r r u p c i o n l l a m a d o d e s d e o r g 0 x04
;
inter
comf
PORTB, f
; I n c r e m e n t s r e g i s t e r PORTB by 1
bcf
INTCON, TMR0IF
; C l e a r s i n t e r r u p t f l a g TMR0IF
movlw
.251
movwf
TMR0
retfie
; Return from i n t e r r u p t r o u t i n e
end

; Fin de programa

189

11.4.9.

Descripcin Parte 2

Este ejercicio muestra el manejo de 2 fuentes de interrupcin distintas. Se


observar cmo manejar la interrupcin por el desborde del TMR0 y por
interrupcin externa. Cada vez que el TMR0 se desborda (con la interrupcin
por TMR0 habilitada) ocurre una interrupcin. La rutina de interrupcin
incrementa en uno el valor mostrado en PORTC. Cuando se produce un
flanco ascendente en PORTB0 ocurre la interrupcin externa. La rutina de
interrupcin desplaza hacia la derecha el valor de PORTD 20 veces. Ambos
procedimientos de interrupcin se realizan detrs del escenario del proceso
completo, permitiendo al microcontrolador hacer otras cosas. El hardware
relacionado a esta prctica se lo aprecia en la figura 11.34.

Figura 11.34: Interrupciones. Parte 3

11.4.10.

Cdigo P4C.ASM

El cdigo del programa a ser utilizado en la primera parte de esta prctica


corresponde al programa 8.

190

Programa 8 Enlace entre el TMR0 y las interrupciones. Parte 2


; HEADER
;
LIST
p=16F887
INCLUDE
P16F887 . INC
__CONFIG _CONFIG1, _CP_OFF&_WDT_OFF&_XT_OSC
errorlevel
302
;
; b l o q u e de v a r i a b l e s
;
c b l o c k 0 x20
counter1
counter2
counter3
endc
; START OF PROGRAM
; forma de i n i c i a r programa que usa i n t e r r u p c i o n e s
;
Org
0 x00
; v e c t o r de r e s e t
Goto
main
; s a l t o a l a b e l " main "
Org
0 x04
; v e c t o r de i n t e r r u p c i o n
Goto
inter
; salto a interrupcion
org
0 x05
; c o n t i n u a c i o n de programa
; MAIN PROGRAM
; i n i c i o de programa p r i n c i p a l
;
;SETEO DE PUERTOS Y REGISTROS
main
b a n k s e l ANSEL
; Bank c o n t a i n i n g r e g i s t e r ANSEL
clrf
ANSEL
; C l e a r s r e g i s t e r s ANSEL and ANSELH
clrf
ANSELH
; All pins are d i g i t a l
b a n k s e l TRISC
clrf
TRISC
clrf
TRISD
bsf

; S e l e c t s bank c o n t a i n i n g r e g i s t e r TRISB
; All port C pins are c o n f i g u r e d as outputs
; All port D pins are c o n f i g u r e d as outputs
TRISB , 0 ;PORTB, 0 c o n f i g u r a d o como e n t r a d a

b a n k s e l OPTION_REG
; Bank c o n t a i n i n g r e g i s t e r OPTION_REG
movlw
b00000111
; c a r g a d i v i s o r con 2 5 5 , s e l o a p l i c a a
;TMR0
; PSA =0 ( BIT 3 ) ; s e a p l i c a e l d i v i s o r
; a l TMR0
;TOCS=0 ( BIT 5 ) ; TMR0 o r i g e n de p u l s o s
; Fosc /4
movwf
OPTION_REG
movlw
b10110000
; h a b i l i t a i n t e r r u p c i o n por Timer 0 y G l o b a l
; GIE=1 ( BIT 7 ) ; h a b i l i t a i n t e r r u p c i o n e s g l o b a l e s
; TMR0IE=1 ( BIT 5 ) ; h a b i l i t a i n t e r r u p c i o n e s por
;TMR0
; INTE=1 ( BIT 4 ) ; h a b i l i t a i n t e r r u p c i o n e s por RB0
movwf
INTCON
banksel
clrf
clrf
incf

PORTC
PORTC
PORTD
PORTD

; Bank c o n t a i n i n g r e g i s t e r PORTC
; C l e a r s Port C
; C l e a r s Port D

191

Programa 8 Enlace entre el TMR0 y las interrupciones. Parte 2. (Continuacin)


loop
goto

nop
loop

; Permanece en e l l a z o

; INTERRUPT ROUTINE
; I n i c i o de r u t i n a de i n t e r r u p c i o n l l a m a d o d e s d e o r g 0 x04
;
inter
movlw
movwf
btfss
goto
incf
bcf
goto

.20
counter3
INTCON, TMR0IF
externo
PORTC
INTCON, TMR0IF
Seguir

; I n c r e m e n t s r e g i s t e r PORTC by 1
; C l e a r s i n t e r r u p t f l a g TMR0IF

externo
rrf
call
decfsz
goto
bcf

PORTD
DELAY
counter3
externo
INTCON, INTF

Seguir
retfie
; Return from i n t e r r u p t r o u t i n e
;
; IMPORTANTE: r u t i n a de i n t e r r u p c i o n t e r m i n a en r e t f i e
;
; SUBROUTINES
DELAY
clrf
counter2
; Clears v a r i a b l e " counter2 "
loop1
clrf
counter1
; Clears v a r i a b l e " counter1 "
loop2
decfsz
counter1
; Decrements v a r i a b l e " c o u n t e r 1 " by 1
goto
loop2
; R e s u l t i s not 0 . Go t o l a b e l l o o p 2
decfsz
counter2
; Decrements v a r i a b l e " c o u n t e r 2 " by 1
goto
loop1
; R e s u l t i s not 0 . Go t o l a b l o o p 1
return
; Return from s u b r o u t i n e "DELAY"
;
End
; Fin de programa

192

11.4.11.

Preguntas Prctica 4

INTEGRANTE 1: ______________________
INTEGRANTE 2: ______________________
PARALELO: _______
GRUPO: ____
RESPONDER
1) Modifique el programa de la parte 1 de tal manera que el funcionamiento
sea el mismo pero la temporizacin venga dada por el TMR1 y ya no por el
TMR0.
2) Modifique el programa de la parte 2 de tal forma que cada 20 pulsos
en RC0 se genere un cambio de estado en PORTB. (Los pulsos en RC0 obligan a usar el TMR1 en modo contador)

193

11.5.

Contadores

11.5.1.

Objetivos

Comprender el uso de los contadores


Familiarizarse con la tcnica de multiplexacin de displays en un mismo puerto

11.5.2.

Contenido

Contador de un dgito con display


Cdigo P5A.ASM
Contador de dos dgitos con display
Cdigo P5B.ASM
Contador de dos dgitos multiplexado
Cdigo P5C.ASM

194

11.5.3.

Contador de un dgito con display

En esta primera parte de la prctica se visualizar en un display de siete segmentos el incremento de un dgito decimal. Para esto se emplea el
TMR0 como base de tiempo de 10 ms para contar cada segundo. Se trata
de incrementar un contador cada segundo y mostrar su valor en el display.
Se programa el TMR0 para que genere una interrupcin cada 0.01 seg. (10
mS) que se repetir 50 veces con el objeto de activar el conteo cada 500 ms
utilizando el reloj de 4MHz. El hardware relacionado a esta prctica se lo
aprecia en la figura 11.35.

Figura 11.35: Contador de un dgito

11.5.4.

Cdigo P5A.ASM

El cogido del programa a ser utilizado en la primera parte de esta prctica


corresponde al programa 9.

195

Programa 9 Contador con display. Parte I.


;
;
CONTADOR CON DISPLAY DE SIETE SEGMENTOS
;
USANDO EL TMR0 COMO BASE DE TIEMPO DE 10ms
;
PARA CONTAR CADA SEGUNDO
;
;
NOMBRE:
p5a_1d . asm
;
FECHA:
21/06/2010
;
VERSION :
1.00
;
PROGRAMADOR:
Carlos Valdivieso
;
; DIRECTIVAS
LIST
p=16F887
; Tipo de m i c r o c o n t r o l a d o r
INCLUDE
P16F887 . INC
; D e f i n e l o s SFRs y b i t s d e l
; P16F887
__CONFIG _CONFIG1, _CP_OFF&_WDT_OFF&_XT_OSC
; S e t e a p a r a m e t r o s de
; configuracion
errorlevel

302

; D e s h a b i l i t a m e n s a j e s de
; a d v e r t e n c i a por cambio
bancos
; La d i r e c t i v a " c b l o c k 0X20 . . . endc " r e s e r v a e s p a c i o s de memoria a p a r t i r de 0 x20
CBLOCK
0X020
contador
; Cuenta 100 i n t e r r u p c i o n e s
unidades
; r e g i s t r o de u n i d a d e s
uni_cod
; Codigo de 7 s e g m e n t o s de u n i d a d e s
ENDC
; INICIO DE PROGRAMA
ORG
0 x00
; V e c t o r de RESET
GOTO
MAIN
ORG
0 x04
; V e c t o r de i n t e r r u p c i o n
GOTO
INTERRUPCION
INTERRUPCION
decfsz
contador , f
; Decrementa e l c o n t a d o r 100 v e c e s
goto
Seguir
; No , t o d a v i a
movf
unidades ,w
; Ya o c u r r i e r o n 100 i n t de 10ms( 1 0 0 0ms )
call
tabla
movwf
uni_cod
movf
uni_cod , w
movwf
PORTB
INCF
unidades , f
movlw
.10
subwf
unidades ,w
btfss
STATUS, 2
goto
cont
clrf
unidades
cont
movlw
.100
movwf
contador
; Repone e l c o n t a d o r con 100
Seguir
movlw
.217
; " ~ . 3 9 " e s e l complemento a 256
; equivale a ".217"
movwf
TMR0
; Repone e l TMR0 con 217
bcf
INTCON, T0IF
; Repone f l a g d e l TMR0
RETFIE
; Retorno de i n t e r r u p c i o n

196

Programa 9 Contador con display. Parte I. (Continuacin)


MAIN
;SETEO DE PUERTOS
BANKSEL ANSEL
CLRF
ANSEL
CLRF
ANSELH
BANKSEL
TRISB
; S e l e c c i o n a e l Bank1
CLRF
TRISB
;PORTB c o n f i g u r a d o como s a l i d a
;PROGRAMACION DEL TMR0
b a n k s e l OPTION_REG
movlw
b00000111
; Programa TMR0 como t e m p o r i z a d o r
movwf
OPTION_REG
; con p r e e s c a l e r de 256
; INICIALIZACION
BANKSEL
PORTB
; S e l e c c i o n a e l Bank 0
CLRF
PORTB
clrf
unidades
; El v a l o r c a l c u l a d o para c a r g a r en TMR0 e s de 217 con un p r e e s c a l e r
; de 256 y a una f r e c u e n c i a de 4MHz, para o b t e n e r una i n t e r r u p c i o n
; cada 10mS .
movlw
.217
; V a l o r d e c i m a l 217
movwf
TMR0
; Carga e l TMR0 con 217
movlw
.100
; Cantidad de i n t e r r u p c i o n e s a c o n t a r
movwf
contador
;N de v e c e s a r e p e t i r l a i n t e r r u p c i o n
;PROGRAMACION DE INTERUPCION
movlw
b10100000
movwf
INTCON
; A c t i v a l a i n t e r r u p c i o n d e l TMR0
;MOSTRAR CERO INICIAL
clrw
call
tabla
movwf
uni_cod
movf
uni_cod , w
movwf
PORTB
INCF
unidades , f
Loop
nop
goto
Loop
; TABLA DE CONVERSION
tabla
ADDWF
PCL, F
; PCL + W > PCL
; El PCL s e i n c r e m e n t a con e l
; v a l o r de W p r o p o r c i o n a n d o un
; salto
RETLW
0x3F
; Retorna con e l c o d i g o d e l 0
RETLW
0 x06
; Retorna con e l c o d i g o d e l 1
RETLW
0x5B
; Retorna con e l c o d i g o d e l 2
RETLW
0x4F
; Retorna con e l c o d i g o d e l 3
RETLW
0 x66
; Retorna con e l c o d i g o d e l 4
RETLW
0x6D
; Retorna con e l c o d i g o d e l 5
RETLW
0x7D
; Retorna con e l c o d i g o d e l 6
RETLW
0 x07
; Retorna con e l c o d i g o d e l 7
RETLW
0x7F
; Retorna con e l c o d i g o d e l 8
RETLW
0 x67
; Retorna con e l c o d i g o d e l 9
END
; Fin d e l programa f u e n t e
;CALCULO DEL VALOR A CARGAR EN TMR0 A 4MHz
;PARA OBTENER TEMPORIZACION DE 10 MILISEGUNDOS
;CON PREESCALADOR DE 1 : 2 5 6
; T e m p o r i z a c i o n =(4 Tosc )(256 ValorTMR0 ) ( p r e e s c a l a d o r )
; 0 . 0 1 0 = ( 4 Tosc )(256 ValorTMR0 ) ( 2 5 6 )
; ValorTMR0=217

197

11.5.5.

Contador de dos dgitos con display

Se trata de incrementar un contador cada segundo y mostrar su valor en


dos displays. Uno para unidades y otro para decenas. El TMR0 se programa
para que genere una interrupcin cada 0.01 seg. (10 ms) que se repetir 100
veces con el objeto de activar el conteo cada 1000 mS. Usaremos un reloj
de 4MHz. El hardware relacionado a esta prctica se lo aprecia en la figura
11.36.

Figura 11.36: Contador de dos dgitos

11.5.6.

Cdigo P5B.ASM

El cogido del programa a ser utilizado en la segunda parte de esta prctica


corresponde al programa 10.

198

Programa 10 Contador de dos dgitos con display


;
;
CONTADOR DE DOS DIGITOS CON DISPLAY DE SIETE SEGMENTOS
;
USANDO EL TMR0 COMO BASE DE TIEMPO DE 10ms( 1 0 x100 )
;
PARA INCREMENTAR SU VALOR CADA SEGUNDO DE 0099
;
;
NOMBRE:
p5b_2d . asm
;
FECHA:
21/06/2010
;
VERSION :
1.00
;
PROGRAMADOR:
Carlos Valdivieso
;
; DIRECTIVAS
LIST
INCLUDE

p=16F887
P16F887 . INC

; Tipo de m i c r o c o n t r o l a d o r
; D e f i n e l o s SFRs y b i t s d e l
; P16F887

__CONFIG _CONFIG1, _CP_OFF&_WDT_OFF&_XT_OSC


; S e t e a p a r a m e t r o s de
; configuracion
errorlevel

302

; D e s h a b i l i t a m e n s a j e s de
; a d v e r t e n c i a por cambio
; bancos

CBLOCK 0X020
contador
; Cuenta 100 i n t e r r u p c i o n e s
unidades
uni_cod
decenas
dec_cod
ENDC
;
;PROGRAMA
ORG
0 x00
; V e c t o r de RESET
GOTO
MAIN
ORG
0 x04
; V e c t o r de i n t e r r u p c i o n
GOTO
Interrupcion
; Va a r u t i n a de i n t e r r u p c i o n
;DURANTE LA INTERRUPCION SE CUENTAN 100 INTERRUPCIONES
;PARA COMPLETAR 10 x100 =1000ms .
Interrupcion
movf
unidades ,w
call
tabla
movwf
uni_cod
movf
uni_cod , w
movwf
PORTB
movf
decenas ,w
call
tabla
movwf
dec_cod
movf
dec_cod , w
movwf
PORTC
decfsz
contador , f
; Cuenta e s p a c i o s de 10ms
goto
Seguir
; Aun , no son 100 i n t e r r u p c i o n e s
INCF
unidades , f
; Ahora s i 10 x100 =1000ms=1s e g
movlw
.10
subwf
unidades ,w
btfss
STATUS, 2
goto
cont
clrf
unidades
incf
decenas

199

Programa 10 Contador de dos dgitos con display. (Continuacin).


movlw
subwf
btfss
goto
clrf

.10
decenas ,w
STATUS, 2
cont
decenas

movlw
movwf

.100
contador

bcf
movlw
movwf
retfie

INTCON, T0IF
.217
TMR0

cont
; P r e c a r g a c o n t a d o r con 100

Seguir

MAIN
;SETEO DE PUERTOS
BANKSEL ANSEL
CLRF
CLRF
BANKSEL
CLRF
CLRF
; INICIALIZACION
BANKSEL
CLRF
CLRF
CLRF
CLRF

; Repone f l a g d e l TMR0
; Repone e l TMR0 con ~ . 3 9
; Retorno de i n t e r r u p c i o n

ANSEL
ANSELH
TRISB
TRISB
TRISC

; S e l e c c i o n a e l Bank1
;PORTB c o n f i g u r a d o como s a l i d a
;PORTC c o n f i g u r a d o como s a l i d a

PORTB
PORTB
PORTC
unidades
decenas

; S e l e c c i o n a e l Bank0
; Borra l a t c h de s a l i d a de PORTB
; Borra l a t c h de s a l i d a de PORTC

; El v a l o r c a l c u l a d o para c a r g a r en TMR0 e s de 217 con un


; p r e e s c a l e r de 256 y a una f r e c u e n c i a de 4MHz, para o b t e n e r
; una i n t e r r u p c i o n cada 10mS . C a l c u l o a l f i n a l d e l e j e r c i c i o .
;PROGRAMACION DEL TMR0
b a n k s e l OPTION_REG
movlw
b00000111
movwf
OPTION_REG
BANKSEL TMR0
movlw
.217
movwf
TMR0

;TMR0 como t e m p o r i z a d o r
; con p r e e s c a l e r de 256
; V a l o r d e c i m a l 217
; Carga e l TMR0 con 217

;PROGRAMACION DE INTERRUPCION
movlw
b10100000
movwf
INTCON
; A c t i v a l a i n t e r r u p c i o n d e l TMR0
movlw
.100
; Cantidad de i n t e r r u p c i o n e s a c o n t a r
movwf
contador
;N de v e c e s a r e p e t i r l a i n t e r r u p c i o n
Loop
nop
goto

Loop

200

Programa 10 Contador de dos dgitos con display. (Continuacin).


; TABLA DE CONVERSION
tabla
ADDWF

RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
END

PCL, F

;
;
;
;
;
;
;
;
;
;
;
;
;
;
;

0x3F
0 x06
0x5B
0x4F
0 x66
0x6D
0x7D
0 x07
0x7F
0 x67

PCL + W > PCL


El PCL s e i n c r e m e n t a con e l
v a l o r de W p r o p o r c i o n a n d o un
salto
Retorna con e l c o d i g o d e l 0
Retorna con e l c o d i g o d e l 1
Retorna con e l c o d i g o d e l 2
Retorna con e l c o d i g o d e l 3
Retorna con e l c o d i g o d e l 4
Retorna con e l c o d i g o d e l 5
Retorna con e l c o d i g o d e l 6
Retorna con e l c o d i g o d e l 7
Retorna con e l c o d i g o d e l 8
Retorna con e l c o d i g o d e l 9
Fin d e l programa f u e n t e

;CALCULO DEL VALOR A CARGAR EN TMR0 A 4MHz


;PARA OBTENER TEMPORIZACION DE 10 MILISEGUNDOS
;CON PREESCALADOR DE 1 : 2 5 6
; T e m p o r i z a c i o n =(4 Tosc )(256 ValorTMR0 ) ( p r e e s c a l a d o r )
; 0 . 0 1 0 = ( 4 Tosc )(256 ValorTMR0 ) ( 2 5 6 )
; ValorTMR0=217

201

11.5.7.

Contador de dos dgitos multiplexados

Se trata de incrementar un contador cada segundo y mostrar su valor en dos


displays colocados en el puerto B usando la tcnica de multiplexacin. Uno
para unidades y otro para decenas. Los displays se refrescan cada 20ms. El
tmr0 se programa para que genere una interrupcin cada 0.01 seg. (10 mS)
que se repetir 100 veces con el objeto de activar el conteo cada 1000 mS.
Use un reloj de 4MHz. El hardware relacionado a esta prctica se lo aprecia
en la figura 11.37.

Figura 11.37: Contador de dos dgitos con multiplexacin

11.5.8.

Cdigo P5C.ASM

El cdigo del programa a ser utilizado en la segunda parte de esta prctica


corresponde al programa 11.

202

Programa 11 Contador de dos dgitos con display multiplexado.


;
;
CONTADOR DE DOS DIGITOS MULTIPLEXADO CON DISPLAY DE
;
SIETE SEGMENTOS USANDO EL TMR0 COMO BASE DE TIEMPO
;
DE 10ms ( 1 0 x100 ) PARA INCREMENTAR SU VALOR CADA
;
SEGUNDO DE 0099
;
;
NOMBRE:
p5c_2dm . asm
;
FECHA:
21/06/2010
;
VERSION :
1.00
;
PROGRAMADOR:
Carlos Valdivieso
;
; DIRECTIVAS
LIST
p=16F887
; Tipo de m i c r o c o n t r o l a d o r
INCLUDE
P16F887 . INC
; D e f i n e l o s SFRs y b i t s d e l
; P16F887
__CONFIG _CONFIG1, _CP_OFF&_WDT_OFF&_XT_OSC
; S e t e a p a r a m e t r o s de
; configuracion
errorlevel
302
; D e s h a b i l i t a m e n s a j e s de
; a d v e r t e n c i a por cambio bancos
CBLOCK 0X020
contador
; Cuenta 100 i n t e r r u p c i o n e s
unidades
uni_cod
decenas
dec_cod
sel
ENDC
;
;PROGRAMA
ORG
0 x00
; V e c t o r de RESET
GOTO
MAIN
ORG
0 x04
; V e c t o r de i n t e r r u p c i o n
GOTO
Interrupcion
; Va a r u t i n a de i n t e r r u p c i o n
;DURANTE LA INTERRUPCION SE CUENTAN 100 INTERRUPCIONES
;PARA COMPLETAR 10 x100 =1000ms .
Interrupcion
movf
s e l ,w
; Se mueve a s i mismo para a f e c t a r bandera
btfss
STATUS, 2
; s e l =0 r e f r e s c a d i g 1 ; s e l =1 r e f r e s c a d i g 2
goto
dig2
dig1
movf
unidades ,w
call
tabla
movwf
uni_cod
movf
uni_cod , w
bsf
PORTA, 0
bsf
PORTA, 1
movwf
PORTB
bcf
PORTA, 0
comf
sel , f
goto
dec

203

Programa 11 Contador de dos dgitos con display multiplexado. (Continuacin)


dig2
movf
call
movwf
movf
bsf
bsf
movwf
bcf
comf

decenas ,w
tabla
dec_cod
dec_cod , w
PORTA, 0
PORTA, 1
PORTB
PORTA, 1
sel , f

decfsz
goto
INCF
movlw
subwf
btfss
goto
clrf
incf
movlw
subwf
btfss
goto
clrf

contador , f
Seguir
unidades , f
.10
unidades ,w
STATUS, 2
cont
unidades
decenas
.10
decenas ,w
STATUS, 2
cont
decenas

movlw
movwf

.100
contador

bcf
movlw
movwf
retfie

INTCON, T0IF
~.39
TMR0

dec
; c u e n t a e s p a c i o s de 10ms
; Aun , no son 100 i n t e r r u p c i o n e s
; Ahora s i 10 x100 =1000ms=1s e g

cont
; Carga c o n t a d o r con 100

Seguir
; Repone f l a g d e l TMR0
; Repone e l TMR0 con ~ . 3 9
; Retorno de i n t e r r u p c i o n

MAIN
;SETEO DE PUERTOS
BANKSEL ANSEL
CLRF
CLRF
BANKSEL
CLRF
CLRF

ANSEL
ANSELH
TRISA
TRISA
TRISB

; INICIALIZACION
BANKSEL
CLRF
CLRF
clrf
clrf
clrf

PORTA
PORTA
PORTB
unidades
decenas
sel

; S e l e c c i o n a e l Bank0
; Borra l a t c h de s a l i d a de PORTB
; Borra l a t c h de s a l i d a de PORTC

OPTION_REG
b00000111
OPTION_REG

; S e l e c c i o n a e l Bank1
;TMR0 como t e m p o r i z a d o r
; con p r e e s c a l e r de 256
; S e l e c c i o n a e l Bank0
; V a l o r d e c i m a l 217
; Carga e l TMR0 con 217

;PROGRAMACION DEL TMR0


banksel
movlw
movwf
BANKSEL TMR0
movlw
movwf

; S e l e c c i o n a e l Bank3

; S e l e c c i o n a e l Bank1
;PORTA c o n f i g u r a d o como s a l i d a
;PORTB c o n f i g u r a d o como s a l i d a

.217
TMR0

204

Programa 11 Contador de dos dgitos con display multiplexado. (Continuacin)


;PROGRAMACION DE INTERRUPCION
movlw
b10100000
movwf
INTCON
movlw
.100
movwf
contador
Loop
nop
goto
Loop

; A c t i v a l a i n t e r r u p c i o n d e l TMR0
; Cantidad de i n t e r r u p c i o n e s a c o n t a r
;N de v e c e s a r e p e t i r l a i n t e r r u p c i o n

; TABLA DE CONVERSION
tabla

END

11.5.9.

ADDWF

PCL, F

RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW

0x3F
0 x06
0x5B
0x4F
0 x66
0x6D
0x7D
0 x07
0x7F
0 x67

;
;
;
;
;
;
;
;
;
;
;
;
;
;
; Fin d e l

PCL + W > PCL


El PCL s e i n c r e m e n t a con e l
v a l o r de W p r o p o r c i o n a n d o un
salto
Retorna con e l c o d i g o d e l 0
Retorna con e l c o d i g o d e l 1
Retorna con e l c o d i g o d e l 2
Retorna con e l c o d i g o d e l 3
Retorna con e l c o d i g o d e l 4
Retorna con e l c o d i g o d e l 5
Retorna con e l c o d i g o d e l 6
Retorna con e l c o d i g o d e l 7
Retorna con e l c o d i g o d e l 8
Retorna con e l c o d i g o d e l 9
programa f u e n t e

Preguntas Prctica 5

INTEGRANTE 1: ______________________
INTEGRANTE 2: ______________________
PARALELO: _______
GRUPO: ____
RESPONDER 1) Se trata de mostrar valores de segundos minutos utilizando como DISPLAY para los segundos 6 LEDS del puerto A, para los
minutos 6 LEDS del puerto B. Deber simularlo a velocidad normal y a velocidad rpida para poder observar el correcto funcionamiento. Use un reloj
de 4MHz.

205

11.6.

Interrupciones y Temporizadores en Lenguaje C

11.6.1.

Objetivos

Familiarizarse con el entorno de programacin en Lenguaje C


Comprender el manejo de interrupciones en C
Trabajar con temporizadores y el Perro Guardin (WDT)

11.6.2.

Contenido

Creacin de un proyecto nuevo en lenguaje C


Ejercicios sobre interrupciones y temporizadores. Primera parte.
Ejercicios sobre interrupciones y temporizadores. Segunda parte.
Ejercicios sobre interrupciones y temporizadores. Tercera parte.
Ejercicios sobre interrupciones y temporizadores. Parte final.

11.6.3.

Creacin de un proyecto nuevo en lenguaje C

En esta prctica se har uso del compilador mikroC de Mikroelectronica


(www.mikroe.com). Para lo cual se debern seguir las siguientes instrucciones:
1. Abra el programa mikroC PRO for PIC
2. Cierre los proyectos abiertos
3. Abra un nuevo proyecto (Project New Project) y aparece el Project
Wizard que se muestra en la figura 11.38.
4. Se presiona Next y aparece una nueva pantalla donde se debe seleccionar el nombre para el proyecto, la carpeta o ubicacin donde se guardar el proyecto, el tipo de microcontrolador (En este caso el 16F887)
y por ltimo el reloj de operacin. Ver figura 11.39.
5. Con Next aparece una nueva pantalla. Ver figura 11.40.
6. Se presiona Next y aparece la figura 11.41.
7. Apriete Next nuevamente y se observa la figura 11.42.
8. Presione Finish para finalizar la creacin del nuevo proyecto

206

Figura 11.38: Nuevo proyecto en mikroC. Paso 3

Figura 11.39: Detalles del proyecto. Paso 4

207

Figura 11.40: Archivos dentro del proyecto. Paso 5

Figura 11.41: Library manager. Paso 6

208

Figura 11.42: Fin de creacin del proyecto. Paso 7

11.6.4.

Ejercicio sobre interrupciones y temporizadores. Parte 1

Utilizando el mtodo para la creacin de proyectos indicado proceda a la


creacin de los proyectos indicados. El hardware a utilizar en las diferentes
secciones de esta prctica se encuentra en la figura 11.43.

Figura 11.43: Hardware

209

11.6.5.

Cdigo a ser utilizado en la primera parte de la prctica

El cdigo se encuentra listado dentro del programa 12.


Programa 12 Interrupciones y temporizacin en lenguaje C. Parte 1
/
Nombre d e l P r o y e c t o :
P6a_t0 . c
Nombre d e l Autor :
( c ) Mikroelektronika , 2009.
Description :
( Explicacion del e j e r c i c i o )
Test c o n f i g u r a t i o n :
MCU:
PIC16F887
Oscillator :
HS , 0 8 . 0 0 0 0 MHz
SW:
mikroC PRO f o r PIC
NOTES:
Cada v e z que e l TMR0 s e d e s b o r d a o c u r r e una i n t e r r u p c i o n
/
/ Header /
unsigned cnt ;
// D e f i n e v a r i a b l e c n t
void i n t e r r u p t ( ) {
c n t ++;
// I n t e r r u p t c a u s e s c n t t o be i n c r e m e n t e d by 1
TMR0 = 9 6 ;
// Timer TMR0 i s r e t u r n e d i t s i n i t i a l v a l u e
INTCON = 0 x20 ;
// B i t T0IE i s s e t , b i t T0IF i s c l e a r e d
}
v o i d main ( ) {
OPTION_REG = 0 x84 ;
// P r e s c a l e r i s a s s i g n e d t o t i m e r TMR0
ANSEL = 0 ;
// A l l I /O p i n s a r e c o n f i g u r e d a s d i g i t a l
ANSELH = 0 ;
TRISB = 0 ;
// A l l p o r t B p i n s a r e c o n f i g u r e d a s o u t p u t s
PORTB = 0 x0 ;
// R e s e t p o r t B
TMR0 = 9 6 ;
// Timer T0 c o u n t s from 96 t o 255
INTCON = 0xA0 ;
// Enable i n t e r r u p t TMR0
cnt = 0 ;
// V a r i a b l e c n t i s a s s i g n e d a 0
do {
i f ( c n t == 4 0 0 ) {
PORTB = PORTB++;
cnt = 0 ;
}
} while ( 1 ) ;

//
//
//
//

Endless loop
I n c r e m e n t p o r t B a f t e r 400 i n t e r r u p t s
I n c r e m e n t number on p o r t B by 1
Reset v a r i a b l e cnt

11.6.6.

Responder las siguientes preguntas

1. Verifique el tiempo que demora en ocurrir una interrupcin.


2. Cunto demoran las 400 interrupciones?

210

11.6.7.

Ejercicio sobre interrupciones y temporizadores. Parte 2

El cdigo se encuentra listado dentro del programa 13.


Programa 13 Interrupciones y temporizacin en lenguaje C. Parte 2
/
Nombre d e l P r o y e c t o :
P6b_t1 . c
Nombre d e l Autor :
( c ) Mikroelektronika , 2009.
Description :
( Explicacion del e j e r c i c i o )
Test c o n f i g u r a t i o n :
MCU:
PIC16F887
Oscillator :
HS , 0 8 . 0 0 0 0 MHz
SW:
mikroC PRO f o r PIC
NOTES:
Cada v e z que e l TMR1 (TMR1H, TMR1L) s e d e s b o r d a o c u r r e una i n t e r r u p c i o n
/
/ Header /
u n s i g n e d s h o r t c n t ; // D e f i n e v a r i a b l e c n t
void i n t e r r u p t ( ) {
c n t++ ;
// I n t e r r u p t c a u s e s c n t t o be i n c r e m e n t e d by 1
PIR1 . TMR1IF = 0 ;
// R e s e t b i t TMR1IF
TMR1H = 0 x80 ;
// TMR1H and TMR1L t i m e r r e g i s t e r s a r e r e t u r n e d
TMR1L = 0 x00 ;
// t h e i r i n i t i a l v a l u e s
}
v o i d main ( ) {
ANSEL = 0 ;
// A l l I /O p i n s a r e c o n f i g u r e d a s d i g i t a l
ANSELH = 0 ;
PORTB = 0xF0 ;
// I n i t i a l v a l u e o f p o r t B b i t s
TRISB = 0 ;
// Port B p i n s a r e c o n f i g u r e d a s o u t p u t s
T1CON = 1 ;
// S e t t i m e r TMR1
PIR1 . TMR1IF = 0 ;
// R e s e t b i t TMR1IF
TMR1H = 0 x80 ;
// S e t i n i t i a l v a l u e f o r t i m e r TMR1
TMR1L = 0 x00 ;
PIE1 . TMR1IE = 1 ;
// Enable i n t e r r u p t on o v e r f l o w
cnt = 0 ;
// R e s e t v a r i a b l e c n t
INTCON = 0xC0 ;
// Enable i n t e r r u p t ( b i t s GIE and PEIE )
do {
// E n d l e s s l o o p
i f ( c n t == 7 6 ) {
// Change p o r t B s t a t e a f t e r 76 i n t e r r u p t s
PORTB = ~PORTB;
// Number i n p o r t B i s i n v e r t e d
cnt = 0 ;
// R e s e t v a r i a b l e c n t
}
} while ( 1 ) ;
}

11.6.8.

Responder las siguientes preguntas

1. Cada qu tiempo se interrumpe con el Timer 1?


2. Cunto demoran las 76 interrupciones?

211

11.6.9.

Ejercicio interrupciones y temporizadores. Parte 3

El cdigo se encuentra listado dentro del programa 14.


Programa 14 Interrupciones y temporizacin en lenguaje C. Parte 3
/

Nombre d e l P r o y e c t o :
P6c_t2 . c
Nombre d e l Autor :
( c ) Mikroelektronika , 2009.
Description :
( Explicacion del e j e r c i c i o )
Test c o n f i g u r a t i o n :
MCU:
PIC16F887
Oscillator :
HS , 0 8 . 0 0 0 0 MHz
SW:
mikroC PRO f o r PIC

NOTES:
Cada v e z que e l TMR2 s e d e s b o r d a o c u r r e una i n t e r r u p c i o n /
/ Header /
unsigned short cnt ;
// D e f i n e v a r i a b l e c n t
void Replace ( ) {
PORTB = ~PORTB;
// D e f i n e new f u n c t i o n Replace
}
// F u n c t i o n i n v e r t s p o r t s t a t e
void i n t e r r u p t ( ) {
i f ( PIR1 . TMR2IF) { //
c n t++ ;
//
PIR1 . TMR2IF = 0 ; / /
TMR2 = 0 ;
//
}
}
// main
v o i d main ( ) {
cnt = 0 ;
//
ANSEL = 0 ;
//
ANSELH = 0 ;
PORTB = 0 b10101010 ; //
TRISB = 0 ;
//
T2CON = 0xFF ;
//
TMR2 = 0 ;
//
PIE1 . TMR2IE = 1 ;
//
INTCON = 0xC0 ;
//
while (1) {
//
i f ( c n t > 3 0 ) { //
Replace ( ) ;
//
cnt = 0 ;
//
}
}
}

11.6.10.

I f b i t TMR2IF = 1 ,
I n c r e m e n t v a r i a b l e c n t by 1
R e s e t b i t and
r e s e t r e g i s t e r TMR2

Reset v a r i a b l e cnt
A l l I /O p i n s a r e c o n f i g u r e d a s d i g i t a l
L o g i c s t a t e on p o r t B p i n s
All port B pins are c o n f i g u r e d as outputs
S e t t i m e r T2
I n i t i a l v a l u e o f t i m e r r e g i s t e r TMR2
Enable i n t e r r u p t
S e t b i t s GIE and PEIE
Endless loop
Change PORTB a f t e r more than 30 i n t e r r u p t s
Function Replace i n v e r t s the port B s t a t e
Reset v a r i a b l e cnt

Responder las siguientes preguntas

1. Cada qu tiempo se interrumpe con el Timer 2?


2. Cunto demoran las 31 interrupciones?

212

11.6.11.

Ejercicio sobre interrupciones y temporizadores. Parte 4

El cdigo se encuentra listado dentro del programa 15.


Programa 15 Interrupciones y temporizacin en lenguaje C. Parte 4
/
Nombre d e l P r o y e c t o :
P6d_wdt . c
Nombre d e l Autor :
( c ) Mikroelektronika , 2009.
Description :
( Explicacion del e j e r c i c i o )
Test c o n f i g u r a t i o n :
MCU:
PIC16F887
Oscillator :
HS , 0 8 . 0 0 0 0 MHz
SW:
mikroC PRO f o r PIC
NOTES:
Para que e s t e programa f u n c i o n e c o r r e c t a m e n t e e s n e c e s a r i o h a b i l i t a r
e l uso d e l p e r r o g u a r d i a n con P r o j e c t > E d i t P r o j e c t
/
/ Header /
v o i d main ( ) {
OPTION_REG = 0 x08 ; // P r e s c a l e r i s a s s i g n e d t o t i m e r WDT ( 1 : 6 4 )
WDTCON = 1 ;
PORTB = 0x0F ;
TRISB = 0 ;

// I n i t i a l v a l u e o f t h e PORTB r e g i s t e r
// A l l p o r t B p i n s a r e c o n f i g u r e d a s o u t p u t s

Delay_ms ( 3 0 0 ) ;
PORTB = 0xF0 ;

// 30mS d e l a y
// Porta B v a l u e d i f f e r e n t from i n i t i a l

while (1)
{
asm CLRWDT;

// Assembly command t o r e s e t WDT t i m e r

}
}

11.6.12.

Responda la siguiente pregunta

1. Quite la instruccin: asm CLRWDT y explique lo que ocurre.

213

11.7.

EEPROM y contadores de dos dgitos

11.7.1.

Objetivos

Familiarizarse con el manejo de la memoria EEPROM interna y contadores de dos dgitos en Lenguaje C

11.7.2.

Contenido

Uso de la memoria EEPROM


Cdigo correspondiente al uso de la memoria EEPROM
Contador BCD de dos dgitos
Cdigo correspondiente al contador BCD de dos dgitos

11.7.3.

Uso de la memoria EEPROM

El estudiante se familiarizara con el uso de la memoria EEPROM en la


primera parte de la prctica. El hardware a emplear se encuentra esquematizado en la figura 11.44.

Figura 11.44: Esquema de la prctica

214

11.7.4.

Programa relacionado al uso de la memoria EEPROM

El cdigo a ser empleado en al anlisis del uso de la memoria se encuentra


listado en el programa 16.
Programa 16 Uso de la memoria EEPROM
/

Nombre d e l P r o y e c t o :
P7a_eeprom . c
Nombre d e l Autor :
( c ) Mikroelektronika , 2009.
Description :
( Explicacion del e j e r c i c i o )
Test c o n f i g u r a t i o n :
MCU:
PIC16F887
Oscillator :
HS , 0 8 . 0 0 0 0 MHz
SW:
mikroC PRO f o r PIC

/
/ Header /
char i i ;
// l o o p v a r i a b l e
v o i d main ( ) {
ANSEL = 0 ;
// C o n f i g u r e AN p i n s a s d i g i t a l I /O
ANSELH = 0 ;
C1ON_bit = 0 ;
// D i s a b l e c o m p a r a t o r s
C2ON_bit = 0 ;
PORTB = 0 ;
PORTC = 0 ;
PORTD = 0 ;
TRISB = 0 ;
TRISC = 0 ;
TRISD = 0 ;
f o r ( i i = 0 ; i i < 3 2 ; i i ++)
// F i l l data b u f f e r
EEPROM_Write( 0 x80+i i , i i ) ;
// Write data t o a d d r e s s 0 x80+ i i
EEPROM_Write( 0 x02 , 0xAA ) ;
// Write some data a t a d d r e s s 2
EEPROM_Write( 0 x50 , 0 x55 ) ;
// Write some data a t a d d r e s s 0 x50
Delay_ms ( 1 0 0 0 ) ;
// B l i n k PORTB and PORTC LEDs
PORTB = 0xFF ;
// t o i n d i c a t e r e a d i n g s t a r t
PORTC = 0xFF ;
Delay_ms ( 1 0 0 0 ) ;
PORTB = 0 x00 ;
PORTC = 0 x00 ;
Delay_ms ( 1 0 0 0 ) ;
PORTB = EEPROM_Read( 0 x02 ) ;
// Read from a d d r e s s 2 and d i s p l a y on
// PORTB
PORTC = EEPROM_Read( 0 x50 ) ;
// Read from a d d r e s s 0 x50 and d i s p l a y
// on PORTC
Delay_ms ( 1 0 0 0 ) ;
f o r ( i i = 0 ; i i < 3 2 ; i i ++) {
// Read 32 b y t e s b l o c k from a d d r e s s
PORTD = EEPROM_Read( 0 x80+ i i ) ;
//0 x80 and d i s p l a y data on PORTD
Delay_ms ( 2 5 0 ) ;
}
}

215

11.7.5.

Ejercicio adicional

1. Modifique el ejercicio para que se graben todas las posiciones de memoria EEPROM en incrementos de a dos. Empezando con cero en la
direccin cero, dos en la direccin uno, cuatro en la direccin dos y as
sucesivamente.
2. Modifique el programa para que grabe las localidades A0 hasta AF de
la memoria EEPROM con el nmero correspondiente a su direccin.

11.7.6.

Contador BCD de dos dgitos

El estudiante se familiarizara con el contador de dos dgitos en esta segunda


parte de la prctica. El hardware a emplear se encuentra esquematizado en
la figura 11.45.

Figura 11.45: Lenguaje C

11.7.7.

Programa contador BCD de dos dgitos

El cdigo a ser empleado en al anlisis del contador de dos dgitos se encuentra listado en el programa 17.

11.7.8.

Ejercicio adicional

1. Realice el mismo ejercicio para Displays de nodo Comn

216

Programa 17 Uso de la memoria EEPROM


/

Nombre d e l P r o y e c t o :
P7b_2d_cnt . c
Nombre d e l Autor :
( c ) Mikroelektronika , 2009.
Description :
( Explicacion del e j e r c i c i o )
Test c o n f i g u r a t i o n :
MCU:
PIC16F887
Oscillator :
HS , 0 8 . 0 0 0 0 MHz
SW:
mikroC PRO f o r PIC
NOTES:
Para que e l e j e m p l o t r a b a j e c o r r e c t a m e n t e s e d e b e r a i n c l u i r e l a r c h i v o
mask . c en e l programa p r i n c i p a l , de l a s i g u i e n t e manera :
#i n c l u d e mask . c /
/ Header /
u n s i g n e d s h o r t mask ( u n s i g n e d s h o r t num ) ;
unsigned sh o rt digit_no , d i g i t 1 0 , d i g i t 1 , d i g i t , i ;
void i n t e r r u p t ( ) {
i f ( d i g i t _ n o ==0) {
PORTA = 0 ;
// Turn o f f both d i s p l a y s
PORTC = d i g i t 1 ;
// S e t mask f o r d i s p l a y i n g o n e s on PORTD
PORTA = 1 ;
// Turn on d i s p l a y f o r o n e s (LSD)
digit_no = 1;
} else {
PORTA = 0 ;
// Turn o f f both d i s p l a y s
PORTC = d i g i t 1 0 ;
// S e t mask f o r d i s p l a y i n g t e n s on PORTD
PORTA = 2 ;
// Turn on d i s p l a y f o r t e n s (MSD)
digit_no = 0;
}
TMR0 = 0 ;
// R e s e t c o u n t e r TMRO
INTCON = 0 x20 ;
// B i t T0IF=0 , T0IE=1
}
v o i d main ( ) {
OPTION_REG = 0 x80 ;
// S e t t i m e r TMR0
TMR0 = 0 ;
INTCON = 0xA0 ;
// D i s a b l e i n t e r r u p t PEIE , INTE , RBIE , T0IE
PORTA = 0 ;
// Turn o f f both d i s p l a y s
TRISA = 0 ;
// A l l p o r t A p i n s a r e c o n f i g u r e d a s o u t p u t s
PORTC = 0 ;
// Turn o f f a l l d i s p l a y s e g me n ts
TRISC = 0 ;
// A l l p o r t D p i n s a r e c o n f i g u r e d a s o u t p u t s
do {
f o r ( i = 0 ; i <=99; i ++) { // Count from 0 t o 99
d i g i t = i % 10u ;
d i g i t 1 = mask ( d i g i t ) ;
// P r e p a r e mask f o r d i s p l a y i n g o n e s
d i g i t = ( c h a r ) ( i / 10u ) % 10u ;
d i g i t 1 0 = mask ( d i g i t ) ; // P r e p a r e mask f o r d i s p l a y i n g t e n s
Delay_ms ( 1 0 0 0 ) ;
}
} while ( 1 ) ;
// E n d l e s s l o o p
}
mask . c f i l e :
/ Header /
u n s i g n e d s h o r t mask ( u n s i g n e d s h o r t num) {
s w i t c h (num) {
c a s e 0 : r e t u r n 0x3F ;
c a s e 1 : r e t u r n 0 x06 ;
c a s e 2 : r e t u r n 0x5B ;
c a s e 3 : r e t u r n 0x4F ;
c a s e 4 : r e t u r n 0 x66 ;
c a s e 5 : r e t u r n 0x6D ;
c a s e 6 : r e t u r n 0x7D ;
c a s e 7 : r e t u r n 0 x07 ;
c a s e 8 : r e t u r n 0x7F ;
c a s e 9 : r e t u r n 0x6F ;
}
}

217

11.8.

Manejo del display LCD y teclado matricial

11.8.1.

Objetivos

Familiarizarse con el manejo del LCD y del teclado matricial 4x4

11.8.2.

Contenido

Manejo del LCD


Cdigo correspondiente al manejo del LCD
Manejo del teclado 4X4
Cdigo correspondiente al manejo del LCD

11.8.3.

Manejo del LCD

El estudiante se familiarizara con el manejo de un display LCD en la primera


parte de la prctica. El hardware a emplear se encuentra esquematizado en
la figura 11.46.

Figura 11.46: Manejo del LCD: Hardware

11.8.4.

Programa relacionado al manejo del LCD

El cdigo a ser empleado en el anlisis del manejo del LCD se encuentra


listado en el programa 18.
218

Programa 18 Manejo del LCD


/

Nombre d e l P r o y e c t o :
P8a_lcd . c
Nombre d e l Autor :
( c ) Mikroelektronika , 2009.
Description :
( Explicacion del e j e r c i c i o )
Test c o n f i g u r a t i o n :
MCU:
PIC16F887
Oscillator :
HS , 0 8 . 0 0 0 0 MHz
SW:
mikroC PRO f o r PIC
NOTES: /
// LCD module c o n n e c t i o n s
s b i t LCD_RS a t RB4_bit ;
s b i t LCD_EN a t RB5_bit ;
s b i t LCD_D4 a t RB0_bit ;
s b i t LCD_D5 a t RB1_bit ;
s b i t LCD_D6 a t RB2_bit ;
s b i t LCD_D7 a t RB3_bit ;
s b i t LCD_RS_Direction a t TRISB4_bit ;
s b i t LCD_EN_Direction a t TRISB5_bit ;
s b i t LCD_D4_Direction a t TRISB0_bit ;
s b i t LCD_D5_Direction a t TRISB1_bit ;
s b i t LCD_D6_Direction a t TRISB2_bit ;
s b i t LCD_D7_Direction a t TRISB3_bit ;
// End LCD module c o n n e c t i o n s
char txt1 [ ] = " mikroElektronika " ;
c h a r t x t 2 [ ] = " EasyPIC5 " ;
char txt3 [ ] = " Lcd4bit " ;
c h a r t x t 4 [ ] = " example " ;
unsigned short i ;
// Loop v a r i a b l e
v o i d Move_Delay ( ) {
// F u n c t i o n used f o r t e x t moving
Delay_ms ( 5 0 0 ) ;
// You can change t h e moving s p e e d h e r e
}
v o i d main ( ) {
ANSEL = 0 ;
// C o n f i g u r e AN p i n s a s d i g i t a l I /O
ANSELH = 0 ;
L cd _ In i t ( ) ;
// I n i t i a l i z e LCD
Lcd_Cmd(_LCD_CLEAR) ;
// C l e a r d i s p l a y
Lcd_Cmd(_LCD_CURSOR_OFF) ;
// Cursor o f f
Lcd_Out ( 1 , 6 , t x t 3 ) ;
// Write t e x t i n f i r s t row
Lcd_Out ( 2 , 6 , t x t 4 ) ;
// Write t e x t i n s e c o n d row
Delay_ms ( 2 0 0 0 ) ;
Lcd_Cmd(_LCD_CLEAR) ;
// C l e a r d i s p l a y
Lcd_Out ( 1 , 1 , t x t 1 ) ;
// Write t e x t i n f i r s t row
Lcd_Out ( 2 , 5 , t x t 2 ) ;
// Write t e x t i n s e c o n d row
Delay_ms ( 2 0 0 0 ) ;
while (1) {
// E n d l e s s l o o p
// Moving t e x t
f o r ( i =0; i <16; i ++) {
// Move t e x t t o t h e r i g h t 4 t i m e s
Lcd_Cmd(_LCD_SHIFT_RIGHT ) ;
Move_Delay ( ) ;
}
f o r ( i =0; i <16; i ++) {
// Move t e x t t o t h e l e f t 7 t i m e s
Lcd_Cmd(_LCD_SHIFT_LEFT ) ;
Move_Delay ( ) ;
}
}
}

219

11.8.5.

Ejercicio adicional

1. Al ejercicio anterior agregue un botn en RD0 y cada vez que se presione el botn se mostrar en la pantalla LCD cuantas veces ha sido
presionado el botn, es decir que se cuente cuantos pulsos van ingresando por RD0.

11.8.6.

Manejo del teclado 4X4

El estudiante se familiarizara con el manejo de un teclado matricial en la


segunda parte de la prctica. El hardware a emplear se encuentra esquematizado en la figura 11.47.

Figura 11.47: Hardware correspondiente al manejo del teclado

11.8.7.

Programa relacionado al manejo del teclado

El cdigo a ser empleado en al anlisis del manejo del teclado se encuentra


listado en el programa 19.

220

Programa 19 Manejo del teclado 4X4


/
Nombre d e l P r o y e c t o :
P8b_keyboard . c
Nombre d e l Autor :
( c ) Mikroelektronika , 2009.
Description :
( Explicacion del e j e r c i c i o )
Test c o n f i g u r a t i o n :
MCU:
PIC16F887
Oscillator :
HS , 0 8 . 0 0 0 0 MHz
SW:
mikroC PRO f o r PIC
NOTES:
/
u n s i g n e d s h o r t kp , cnt , o l d s t a t e = 0 ;
char txt [ 4 ] ;
// Keypad module c o n n e c t i o n s
c h a r keypadPort a t PORTD;
// End Keypad module c o n n e c t i o n s
// LCD module c o n n e c t i o n s
s b i t LCD_RS a t RB4_bit ;
s b i t LCD_EN a t RB5_bit ;
s b i t LCD_D4 a t RB0_bit ;
s b i t LCD_D5 a t RB1_bit ;
s b i t LCD_D6 a t RB2_bit ;
s b i t LCD_D7 a t RB3_bit ;
s b i t LCD_RS_Direction a t TRISB4_bit ;
s b i t LCD_EN_Direction a t TRISB5_bit ;
s b i t LCD_D4_Direction a t TRISB0_bit ;
s b i t LCD_D5_Direction a t TRISB1_bit ;
s b i t LCD_D6_Direction a t TRISB2_bit ;
s b i t LCD_D7_Direction a t TRISB3_bit ;
// End LCD module c o n n e c t i o n s
v o i d main ( ) {
ANSEL = 0 ;
ANSELH = 0 ;
cnt = 0 ;
// R e s e t c o u n t e r
Keypad_Init ( ) ;
// I n i t i a l i z e Keypad
L cd _ In i t ( ) ;
// I n i t i a l i z e Lcd
Lcd_Cmd(_LCD_CLEAR) ;
// C l e a r d i s p l a y
Lcd_Cmd(_LCD_CURSOR_OFF) ;
// Cursor o f f
Lcd_Out ( 1 , 1 , " Key
:");
// Write message t e x t on Lcd
Lcd_Out ( 2 , 1 , " Times : " ) ;
do {
kp = 0 ;
// R e s e t key code v a r i a b l e
// Wait f o r key t o be p r e s s e d and r e l e a s e d
do
// kp = Keypad_Key_Press ( ) ;
// S t o r e key code i n kp v a r i a b l e
kp = Keypad_Key_Click ( ) ;
// S t o r e key code i n kp v a r i a b l e
w h i l e ( ! kp ) ;
// P r e p a r e v a l u e f o r output , t r a n s f o r m key t o i t s ASCII v a l u e
s w i t c h ( kp ) {
// c a s e 1 0 : kp = 4 2 ; b r e a k ;
//
// Uncomment t h i s b l o c k f o r keypad4x3
// c a s e 1 1 : kp = 4 8 ; b r e a k ;
// 0
// c a s e 1 2 : kp = 3 5 ; b r e a k ;
// #
// d e f a u l t : kp += 4 8 ;

221

Programa 19 Manejo del teclado 4X4 (Continuacin)


case
1 : kp = 4 9 ; b r e a k ; // 1
// Uncomment t h i s b l o c k f o r keypad4x4
case
2 : kp = 5 0 ; b r e a k ; // 2
case
3 : kp = 5 1 ; b r e a k ; // 3
case
4 : kp = 6 5 ; b r e a k ; // A
case
5 : kp = 5 2 ; b r e a k ; // 4
case
6 : kp = 5 3 ; b r e a k ; // 5
case
7 : kp = 5 4 ; b r e a k ; // 6
case
8 : kp = 6 6 ; b r e a k ; // B
case
9 : kp = 5 5 ; b r e a k ; // 7
c a s e 1 0 : kp = 5 6 ; b r e a k ; // 8
c a s e 1 1 : kp = 5 7 ; b r e a k ; // 9
c a s e 1 2 : kp = 6 7 ; b r e a k ; // C
c a s e 1 3 : kp = 4 2 ; b r e a k ; //
c a s e 1 4 : kp = 4 8 ; b r e a k ; // 0
c a s e 1 5 : kp = 3 5 ; b r e a k ; // #
c a s e 1 6 : kp = 6 8 ; b r e a k ; // D
}
i f ( kp != o l d s t a t e ) {
// P r e s s e d key d i f f e r s from p r e v i o u s
cnt = 1 ;
o l d s t a t e = kp ;
}
else {
// P r e s s e d key i s same a s p r e v i o u s
c n t ++;
}
Lcd_Chr ( 1 , 1 0 , kp ) ;
// P r i n t key ASCII v a l u e on Lcd
i f ( c n t == 2 5 5 ) {
// I f c o u n t e r v a r i a l b l e o v e r f l o w
cnt = 0 ;
Lcd_Out ( 2 , 1 0 , "
");
}
ByteToStr ( cnt , t x t ) ;
// Transform c o u n t e r v a l u e t o s t r i n g
Lcd_Out ( 2 , 1 0 , t x t ) ;
// D i s p l a y c o u n t e r v a l u e on Lcd
} while ( 1 ) ;
}

222

11.8.8.

Ejercicio adicional

1. Modifique el programa anterior para que se ingrese 4 caracteres desde


el teclado 4x4 y se graben estos datos en la memoria EEPROM. En
la primera lnea de la pantalla LCD se muestra los caracteres en el
mismo orden que ingres el usuario y en la segunda lnea se muestran
los caracteres al revs. Por ejemplo:
a) 1234 Primera lnea en el LCD
b) 4321 Segunda lnea en el LCD

223

11.9.

Manejo de la unidad PWM y del convertidor


ADC

11.9.1.

Objetivos

Familiarizarse con el manejo del modulador por ancho de pulso PWM


y del convertidor digital analgico ADC

11.9.2.

Contenido

Manejo del PWM


Cdigo correspondiente al manejo del PWM
Manejo del ADC
Cdigo correspondiente al manejo del ADC

11.9.3.

Manejo del PWM

El estudiante se familiarizar con el manejo de la modulacin por ancho de


pulso. El hardware a emplear se encuentra esquematizado en la figura 11.48.

Figura 11.48: Manejo del PWM: hardware

11.9.4.

Programa relacionado al manejo del PWM

El cdigo a ser empleado en el anlisis del manejo del PWM se encuentra


listado en el programa 20.
224

Programa 20 Manejo del PWM


/

Nombre d e l P r o y e c t o :
P9a_pwm . c
Nombre d e l Autor :
( c ) Mikroelektronika , 2009.
Description :
( Explicacion del e j e r c i c i o )
Test c o n f i g u r a t i o n :
MCU:
PIC16F887
Oscillator :
HS , 0 8 . 0 0 0 0 MHz
SW:
mikroC PRO f o r PIC
NOTES: /
u n s i g n e d s h o r t current_duty , old_duty , current_duty1 , old_duty1 ;
void InitMain ( ) {
ANSEL = 0 ;
// C o n f i g u r e AN p i n s a s d i g i t a l
ANSELH = 0 ;
C1ON_bit = 0 ;
// D i s a b l e c o m p a r a t o r s
C2ON_bit = 0 ;
PORTA = 2 5 5 ;
TRISA = 2 5 5 ;
PORTB = 0 ;
TRISB = 0 ;
PORTC = 0 ;
TRISC = 0 ;
PWM1_Init ( 5 0 0 0 ) ;
PWM2_Init ( 5 0 0 0 ) ;

}
v o i d main ( ) {
InitMain ( ) ;
current_duty = 1 6 ;
current_duty1 = 1 6 ;
PWM1_Start ( ) ;
PWM2_Start ( ) ;
PWM1_Set_Duty( c u r r e n t _ d u t y ) ;
PWM2_Set_Duty( c u r r e n t _ d u t y 1 ) ;
while (1) {
i f ( RA0_bit ) {
Delay_ms ( 4 0 ) ;
c u r r e n t _ d u t y++;
PWM1_Set_Duty( c u r r e n t _ d u t y ) ;
}
i f ( RA1_bit ) {
Delay_ms ( 4 0 ) ;
current_duty ;
PWM1_Set_Duty( c u r r e n t _ d u t y ) ;
}
i f ( RA2_bit ) {
Delay_ms ( 4 0 ) ;
c u r r e n t _ d u t y 1++;
PWM2_Set_Duty( c u r r e n t _ d u t y 1 ) ;
}
i f ( RA3_bit ) {
Delay_ms ( 4 0 ) ;
current_duty1 ;
PWM2_Set_Duty( c u r r e n t _ d u t y 1 ) ;
}
Delay_ms ( 5 ) ;
}
}

225

//
//
//
//
//
//
//

c o n f i g u r e PORTA
s e t PORTB t o 0
d e s i g n a t e PORTB
s e t PORTC t o 0
d e s i g n a t e PORTC
I n i t i a l i z e PWM1
I n i t i a l i z e PWM2

pins as input

//
//
//
//
//
//
//
//

i n i t i a l value f o r current_duty
i n i t i a l value f o r current_duty1
s t a r t PWM1
s t a r t PWM2
S e t c u r r e n t duty f o r PWM1
S e t c u r r e n t duty f o r PWM2
endless loop
b ut to n on RA0 p r e s s e d

p i n s a s o ut pu t
p i n s a s o ut put
module a t 5KHz
module a t 5KHz

// i n c r e m e n t c u r r e n t _ d u t y

// b ut to n on RA1 p r e s s e d
// decrement c u r r e n t _ d u t y

// b ut to n on RA2 p r e s s e d
// i n c r e m e n t c u r r e n t _ d u t y 1

// b ut to n on RA3 p r e s s e d
// decrement c u r r e n t _ d u t y 1

// s l o w down change pace a l i t t l e

11.9.5.

Ejercicio adicional

1. Genere un solo PWM inicializando a 1KHz, con current_duty = 128;


y cambie todos los retardos a Delay_ms(5);. Utilice el siguiente cuadro
para conectar un motor DC de 12V a travs de un opto-acoplador y
mida las seales como se indica en la figura 11.49. Observe el aislamiento elctrico del motor con respecto al control, para poder realizar
la medicin con el osciloscopio deber colocar el canal A en A+B y
el canal B en -B, tal como se indica en la figura 11.50.

Figura 11.49: Control de velocidad de un motor DC

226

Figura 11.50: Grfica de la seal de voltaje

11.9.6.

Manejo del convertidor ADC

El estudiante se familiarizara con el manejo del convertidor analgico digital.


El hardware a emplear se encuentra esquematizado en la figura 11.51.

Figura 11.51: Manejo del ADC: hardware

227

11.9.7.

Programa relacionado al manejo del ADC

El cdigo a ser empleado en el anlisis del manejo del ADC se encuentra


listado en el programa 21.
Programa 21 Manejo del ADC
Nombre d e l P r o y e c t o :
P9b_adc . c
Nombre d e l Autor :
( c ) Mikroelektronika , 2009.
Description :
( Explicacion del e j e r c i c i o )
Test c o n f i g u r a t i o n :
MCU:
PIC16F887
Oscillator :
HS , 0 8 . 0 0 0 0 MHz
SW:
mikroC PRO f o r PIC
NOTES:
/
u n s i g n e d i n t temp_res ;
v o i d main ( ) {
ANSEL = 0 x04 ;
// C o n f i g u r e AN2 p i n a s a n a l o g
ANSELH = 0 ;
// C o n f i g u r e o t h e r AN p i n s a s d i g i t a l I /O
C1ON_bit = 0 ;
// D i s a b l e c o m p a r a t o r s
C2ON_bit = 0 ;
TRISA = 0xFF ;
// PORTA i s i n p u t
TRISC = 0 ;
// PORTC i s o ut pu t
TRISD = 0 ;
// PORTD i s o ut pu t
do {
temp_res = ADC_Read ( 2 ) ;
// Get 10 b i t r e s u l t s o f AD c o n v e r s i o n
PORTD = temp_res ;
// Send l o w e r 8 b i t s t o PORTD
PORTC = temp_res >> 8 ;
// Send 2 most s i g n i f i c a n t b i t s t o RC1 , RC0
} while ( 1 ) ;
}

11.9.8.

Ejercicio adicional

1. Muestre el resultado de la conversin en dos displays de 7 segmentos


multiplexados presentando 00 para el mnimo valor del potencimetro
y 80 para el mximo.

228

11.10.

Comunicacin RS232 va USART y comunicacin I2C

11.10.1.

Objetivos

Familiarizarse con el uso de las comunicaciones seriales USART e I2C

11.10.2.

Contenido

Comunicacin USART
Cdigo correspondiente a la comunicacin USART
Comunicacin I2C
Cdigo correspondiente a la comunicacin I2C

11.10.3.

Comunicacin USART

El estudiante se familiarizar con el manejo de la comunicacin va USART


en la primera parte de la prctica. El hardware a emplear se encuentra
esquematizado en la figura 11.52.

Figura 11.52: Comunicacin USART: hardware

229

11.10.4.

Programa relacionado al manejo de la comunicacin


USART

El cdigo a ser empleado en el anlisis del manejo de la comunicacin


USART se encuentra listado en el programa 22.
Programa 22 Comunicacin USART
/
Nombre d e l P r o y e c t o :
P10a_usart . c
Nombre d e l Autor :
( c ) Mikroelektronika , 2009.
Description :
( Explicacion del e j e r c i c i o )
Test c o n f i g u r a t i o n :
MCU:
PIC16F887
Oscillator :
HS , 0 8 . 0 0 0 0 MHz
SW:
mikroC PRO f o r PIC
NOTES:
/
/ Header /
unsigned short i ;
v o i d main ( ) {
UART1_Init ( 1 9 2 0 0 ) ;
// I n i t i a l i z e USART module
// ( 8 b i t , 19200 baud r a t e , no p a r i t y b i t . . . )
while (1) {
i f (UART1_Data_Ready ( ) ) { // I f data has been r e c e i v e d
i = UART1_Read ( ) ;
// r e a d i t
UART1_Write ( i ) ;
// and send i t back
}
}
}

NOTA: Para trabajar en este ejercicio deber utilizar el programa Virtual


Serial Port con el que puede crear puertos virtuales: Ej. Cree los puertos
virtuales COM1 y COM2. Utilice el puerto virtual COM1 para configurar
el COMPIM de PROTEUS y utilice el COM2 para el TERMINAL.

230

11.10.5.

Ejercicio adicional

1. Realice una comunicacin SERIAL VIA USART con otro microcontrolador en el mismo circuito. En este ejercicio cuando apriete un pulsador
har que el otro microcontrolador parpadee los bits del puerto B. Para
conectar los dos microcontroladores en este ejercicio conecte en forma
cruzada Rx1 Tx2 y Tx1 Rx2.

11.10.6.

Comunicacin I2C

El estudiante se familiarizar con el manejo de la comunicacin va I2C


en la segunda parte de la prctica. El hardware a emplear se encuentra
esquematizado en la figura 11.53.

Figura 11.53: Comunicacin I2C: hardware

231

11.10.7.

Programa relacionado al manejo de la comunicacin


I2C

El cdigo a ser empleado en el anlisis del manejo de la comunicacin I2C


se encuentra listado en el programa 23.
Programa 23 Comunicacin I2C
/
Nombre d e l P r o y e c t o :
P10b_i2c . c
Nombre d e l Autor :
( c ) Mikroelektronika , 2009.
Description :
( Explicacion del e j e r c i c i o )
Test c o n f i g u r a t i o n :
MCU:
PIC16F887
Oscillator :
HS , 0 8 . 0 0 0 0 MHz
SW:
mikroC PRO f o r PIC
NOTES:
/
v o i d main ( ) {
ANSEL = 0 ;
// C o n f i g u r e AN p i n s a s d i g i t a l I /O
ANSELH = 0 ;
PORTB = 0 ;
TRISB = 0 ;
// C o n f i g u r e PORTB a s ou tp ut
I2C1_Init ( 1 0 0 0 0 0 ) ;
// i n i t i a l i z e I2C communication
I2C1_Start ( ) ;
// i s s u e I2C s t a r t s i g n a l
I2C1_Wr ( 0 xA0 ) ;
// send b y t e v i a I2C ( d e v i c e a d d r e s s + W)
I2C1_Wr ( 2 ) ;
// send b y t e ( a d d r e s s o f EEPROM l o c a t i o n )
I2C1_Wr ( 0 xF0 ) ;
// send data ( data t o be w r i t t e n )
I2C1_Stop ( ) ;
// i s s u e I2C s t o p s i g n a l
Delay_100ms ( ) ;
I2C1_Start ( ) ;
// i s s u e I2C s t a r t s i g n a l
I2C1_Wr ( 0 xA0 ) ;
// send b y t e v i a I2C ( d e v i c e a d d r e s s + W)
I2C1_Wr ( 2 ) ;
// send b y t e ( data a d d r e s s )
I2C1_Repeated_Start ( ) ;
// i s s u e I2C s i g n a l r e p e a t e d s t a r t
I2C1_Wr ( 0 xA1 ) ;
// send b y t e ( d e v i c e a d d r e s s + R)
PORTB = I2C1_Rd ( 0 u ) ;
// Read t h e data (NO a ck n o w l e dg e )
I2C1_Stop ( ) ;
// i s s u e I2C s t o p s i g n a l
}

11.10.8.

Ejercicio adicional

1. Luego de analizar el programa coloque en la cabecera la descripcin


correspondiente indicando de qu se trata el ejercicio.

232

Captulo 12

Libros de referencia
[1] John Morton. (2007). The PIC Microcontroller: Your Personal Introductory Course, Third Edition. UK: Elsevier.
[2] Tim Wilmshurst . (2010). Designing Embedded Systems with PIC Microcontrollers, Second Edition: Principles and Applications 2nd Edition. UK:
Elsevier.
[3] Warwick A. Smith . (2008). C Programming for Embedded Microcontrollers. UK: Elektor International Media.
[4] Frederick M Cady. (1997). Microcontrollers and Microcomputers Principles of Software and Hardware Engineering 2nd Edition. UK: Oxford University Press.
[5] Dogan Ibrahim. (2014). PIC Microcontroller Projects in C, Second Edition: Basic to Advanced. UK: Elsevier.
[6] Myke Predko. (2005). 123 PIC Microcontroller Experiments for the Evil
Genius 1st Edition. USA: Mc Graw-Hill.
[7] M. Rafiquzzaman . (2014). Fundamentals of Digital Logic and Microcontrollers 6th Edition. USA: Wiley.
[8] Martin P. Bates . (2011). PIC Microcontrollers, Third Edition: An Introduction to Microelectronics 3rd Edition. Uk: Elsevier.
[9] Raj Kamal . (2009). Microcontrollers: Architecture, Programming, Interfacing and System Design. India: Pearson.
[10] Han-Way Huang, Leo Chartrand. (2005). PIC Microcontroller: An Introduction to Software and Hardware Interfacing 1st Edition. USA: Minnesota
State University, Mankota.
[11] Martin P. Bates . (2008). Programming 8-bit PIC Microcontrollers in
C: with Interactive Hardware Simulation 1st Edition. Uk: Elsevier.
[12] Myke Predko. (2008). Programming and Customizing the PIC Microcontroller (Tab Electronics) 3rd Edition. USA: Mc Graw-Hill.
[13] Ted Van Sickle . (2001). Programming Microcontrollers in C. US: LLH
Technology Publishing.
[14] Charly Bechara. (2014). Demystifying The Microchip PIC Microcon-

233

troller For Engineering Students: Following The KISS Principle. US: Lulu
Press.
[15] Harprit Sandhu . (2009). Making PIC Microcontroller Instruments and
Controllers. USA: Mc Graw-Hill.
[16] Julio Sanchez, Maria P. Canton . (2007). Microcontroller Programming:
The Microchip PIC. USA: CRC Press.
[17] Martin P. Bates . (2014). Interfacing PIC Microcontrollers, Second Edition: Embedded Design by Interactive Simulation 2nd Edition. UK: Elsevier.
[18] Milan Verle. (2009). Microcontrolador PIC16F887. En PIC microcontroladores - Programacin en C(336): mikroElektronika.
[19] Microchip. (2000). PIC16F882/883/884/886/887 Data Sheet. 2015, de
microchip Sitio web: http://ww1.microchip.com/downloads/en/DeviceDoc/41291D.pdf

234

Das könnte Ihnen auch gefallen