Beruflich Dokumente
Kultur Dokumente
Carlos Valdivieso A.
Douglas Plaza G.
Ronald Sols M.
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
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
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
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
97
97
98
98
98
99
99
100
100
101
101
102
102
103
104
104
107
108
109
110
111
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
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
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
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
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.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
72
73
74
75
76
77
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
84
85
86
86
87
87
88
90
90
91
11
6.1.
6.2.
6.3.
6.4.
6.5.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
93
94
95
95
96
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
99
101
101
102
102
103
104
107
108
109
110
110
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
113
114
115
116
117
118
119
119
119
120
121
121
122
123
124
124
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
130
130
131
131
132
132
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
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
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
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.
15
1.0.1.
Caractersticas Generales
16
1.0.2.
Patitas multifuncionales
17
1.0.3.
1.0.4.
Memorias
1.0.5.
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
1.0.6.
Memoria EEPROM
1.0.7.
19
1.0.8.
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.
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
21
Captulo 2
Conjunto de Instrucciones
2.1.
2.1.1.
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.
23
2.1.2.
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.
24
2.1.3.
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
26
2.2.
Ciclo de Instruccin
27
2.3.
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
29
30
31
33
2.4.
2.4.1.
Direccionamiento
Direccionamiento inmediato
2.4.2.
Direccionamiento directo
2.4.3.
Direccionamiento indirecto
34
35
2.4.4.
36
2.5.
2.5.1.
Registros de trabajo
STATUS
2.5.2.
OPTION REG
38
2.5.3.
PCON
39
2.5.4.
PC=PCLATH y PCL
40
2.6.
Registros de Configuracin
2.6.1.
Directiva: CONFIG
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.
42
2.6.2.
43
2.7.
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.
45
2.8.2.
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.
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
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.
47
2.11.
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
2.11.1.
Conexin de leds
49
2.12.
Sistema de Reloj
50
2.12.1.
El Oscilador Externo
2.12.2.
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.
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).
52
2.12.4.
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).
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).
2.12.5.
54
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
57
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
2.13.2.
TMR1
60
64
Este diagrama engloba el funcionamiento del TMR1 y se lo usar como referencia en el estudio del TMR1 (Figura 2.46):
65
2.13.3.
TMR2
66
67
2.13.4.
68
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
3.1.
3.2.
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
3.3.
Registro INTCON
72
3.4.
Registro PIE1
73
3.5.
Registro PIE2
74
3.6.
Registro PIR1
75
3.7.
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.
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
4.5.
80
4.6.
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.
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+.
83
84
5.1.
5.2.
85
5.3.
86
5.4.
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):
87
5.5.
+
(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
Vref
2n
88
5.6.
5.7.
89
5.8.
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.
92
6.1.
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.
La tabla (Figura 6.3) muestra el rango de valores, que estos datos tienen en
su forma bsica.
94
95
Captulo 7
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
97
7.3.2.
7.3.3.
98
7.3.4.
Constantes Enumeradas
7.4.
99
7.4.1.
Operadores Aritmticos
7.4.2.
Operadores de Asignacin
100
7.4.3.
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.
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.
102
7.4.6.
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
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.
Los tipos de datos principales se ponen en orden jerrquico como sigue (Figura 7.8):
106
7.6.
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.
108
7.8.
109
7.9.
Funciones
110
111
Captulo 8
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
113
8.2.1.
Cada
Cada
Cada
Cada
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.
114
8.2.2.
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.
115
8.2.3.
116
117
119
8.2.4.
Registro CCP1_CON
120
CCP1M3 - CCP1M0
Estos pines seleccionan el modo de trabajo del mdulo CCP1 (Figura 8.13):
8.2.5.
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
122
8.3.1.
Registro CCP2_CON
123
8.4.
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.
125
9.2.
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.
126
9.3.
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.
10.1.1.
Margen de Ruido
128
129
MAX 232
El convertidor de niveles MAX 232 tiene el siguiente diagrama de pines
(Figura 10.4 y Figura 10.5)
130
Protocolo RS232
La trama desde PC del protocolo RS232 se representa de la siguiente forma(Figura 10.6).
131
La trama desde PIC del protocolo RS232 se representa de la siguiente forma(Figura 10.7).
10.1.2.
132
133
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
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):
136
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
139
10.1.7.
Registro TXSTA
140
10.1.8.
Registro RCSTA
141
10.1.9.
Generador de Baudios
142
143
144
10.1.10.
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.
10.2.1.
147
10.2.2.
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.
148
10.3.1.
149
150
151
10.3.2.
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.
11.1.1.
Objetivo
154
11.1.2.
Contenido
11.1.3.
155
156
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
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
158
159
160
161
162
163
11.1.4.
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.
11.1.5.
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.
165
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
168
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
11.2.
11.2.1.
Objetivo
11.2.2.
Contenido
Instrucciones
Especificaciones
Cdigo P2_RET.ASM
Especificaciones parte 2
Cdigo P2_RET2.ASM
170
11.2.3.
Instrucciones
11.2.4.
Especificaciones
171
11.2.5.
Cdigo P2-RET.ASM
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
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
172
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
;
;
;
;
end
; Fin d e l programa
;
173
11.2.6.
Especificaciones Parte 2
11.2.7.
Cdigo P2-RET2.ASM
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
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
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
;
;
;
;
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
11.3.2.
Contenido
Especificaciones parte 1
Cdigo P3A_RET.ASM
Especificaciones parte 2
Cdigo P3B_RET.ASM
11.3.3.
Especificaciones Parte 1
177
11.3.4.
Cdigo P3A_RA.ASM
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
loop
loop3
178
11.3.5.
; End o f program
Especificaciones Parte 2
11.3.6.
Cdigo P3B_RA.ASM
179
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
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
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
.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
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
183
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.
185
11.4.5.
Descripcin Parte 1
11.4.6.
Cdigo P4A.ASM
186
187
11.4.7.
Descripcin Parte 2
11.4.8.
Cdigo P4B.ASM
188
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
11.4.10.
Cdigo P4C.ASM
190
; 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
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
11.5.2.
Contenido
194
11.5.3.
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.
11.5.4.
Cdigo P5A.ASM
195
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
197
11.5.5.
11.5.6.
Cdigo P5B.ASM
198
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
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
.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
;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
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
201
11.5.7.
11.5.8.
Cdigo P5C.ASM
202
203
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
; 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
; 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
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.
11.6.1.
Objetivos
11.6.2.
Contenido
11.6.3.
206
207
208
11.6.4.
209
11.6.5.
//
//
//
//
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.
210
11.6.7.
11.6.8.
211
11.6.9.
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
212
11.6.11.
// 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;
}
}
11.6.12.
213
11.7.
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
11.7.3.
214
11.7.4.
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.
11.7.7.
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
216
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.
11.8.1.
Objetivos
11.8.2.
Contenido
11.8.3.
11.8.4.
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.
11.8.7.
220
221
222
11.8.8.
Ejercicio adicional
223
11.9.
11.9.1.
Objetivos
11.9.2.
Contenido
11.9.3.
11.9.4.
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
11.9.5.
Ejercicio adicional
226
11.9.6.
227
11.9.7.
11.9.8.
Ejercicio adicional
228
11.10.
11.10.1.
Objetivos
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
229
11.10.4.
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
231
11.10.7.
11.10.8.
Ejercicio adicional
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