Académique Documents
Professionnel Documents
Culture Documents
1. Introduccin 5
1.1. Estructura de la memoria . . . . . . . . . . . . . . . . . . . . . . . . . 7
2. Los microcontroladores PIC 9
2.1. Qu es un microcontrolador? . . . . . . . . . . . . . . . . . . . . . . . 9
2.2. Aplicaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.3. Historia de los microcontroladores PIC . . . . . . . . . . . . . . . . . . 10
2.4. Las gamas de PIC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.5. Los PIC de gama alta . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.6. El PIC18F4550 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3. Arquitectura PIC 13
3.1. Diseo del PIC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.2. CPU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3.3. ALU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3.4. Organizacin de la memoria . . . . . . . . . . . . . . . . . . . . . . . . 15
3.4.1. Memoria de programa . . . . . . . . . . . . . . . . . . . . . . . 15
3.4.2. Memoria de datos . . . . . . . . . . . . . . . . . . . . . . . . . 17
3.5. Juego de instrucciones . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.6. Perifricos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
3.6.1. Puertos de Entrada/Salida . . . . . . . . . . . . . . . . . . . . 30
3.6.2. Universal Serial Bus . . . . . . . . . . . . . . . . . . . . . . . . 32
3.6.3. SPP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
3.6.4. MSSP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.6.5. EUSART . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.6.6. Memoria EEPROM . . . . . . . . . . . . . . . . . . . . . . . . . 35
3.6.7. Memoria Flash . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
3.6.8. Timers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
3.6.9. Capturador, comparador y modulador de ancho pulso . . . . 46
3.6.10. Conversor A/D . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
1
Compilador de C para el microcontrolador Microchip PIC18F4550 2
3.6.11. Comparador Analgico . . . . . . . . . . . . . . . . . . . . . . 49
3.6.12. Mdulo de Tensin de Referencia . . . . . . . . . . . . . . . . 50
3.6.13. Otros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
3.7. Caractersticas especiales de la CPU . . . . . . . . . . . . . . . . . . . 51
3.7.1. Interrupciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
3.7.2. Perro Guardin . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
3.7.3. Modo de reposo . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
3.7.4. ICSP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
3.8. Caractersticas elctricas . . . . . . . . . . . . . . . . . . . . . . . . . . 53
4. GNU Compiler Collection 56
4.1. Historia de GCC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
4.2. Caractersticas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
4.3. Estructura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
4.3.1. Front-end . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
4.3.2. Middle-end . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
4.3.3. Back-end . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
5. Diseo de la solucin 60
5.1. Registros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
5.2. Memoria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
5.3. Paso de argumentos a funciones . . . . . . . . . . . . . . . . . . . . . 62
5.4. Retorno de valores de funciones . . . . . . . . . . . . . . . . . . . . . . 63
5.5. Variables globales y estticas . . . . . . . . . . . . . . . . . . . . . . . 64
5.6. Flujo de ejecucin (memoria de cdigo) . . . . . . . . . . . . . . . . . 64
5.7. Pila . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
5.8. Biblioteca de funciones matemticas . . . . . . . . . . . . . . . . . . . 67
6. Implementacin 69
6.1. Creacin de patrones . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
6.1.1. dene_insn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
6.1.2. Ejemplo de dene_insn . . . . . . . . . . . . . . . . . . . . . . 76
6.1.3. Dene_expand . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
6.2. Asignacin - los patrones mnimos. . . . . . . . . . . . . . . . . . . . . 80
6.3. Los patrones del back-end . . . . . . . . . . . . . . . . . . . . . . . . . 88
6.4. Especicacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
7. Anlisis del cdigo generado 105
7.1. Asignacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
Compilador de C para el microcontrolador Microchip PIC18F4550 3
7.2. Operaciones matemticas simples . . . . . . . . . . . . . . . . . . . . 108
7.2.1. Suma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
7.2.2. Resta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
7.2.3. Negacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
7.2.4. Valor absoluto . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
7.3. Operaciones lgicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
7.3.1. AND, OR y XOR . . . . . . . . . . . . . . . . . . . . . . . . . . 113
7.3.2. Negacin Lgica o Complemento a 1 . . . . . . . . . . . . . . 113
7.3.3. Desplazamientos . . . . . . . . . . . . . . . . . . . . . . . . . . 114
7.4. Conversin de tipos o casting . . . . . . . . . . . . . . . . . . . . . . . 115
7.4.1. Extensin de signo . . . . . . . . . . . . . . . . . . . . . . . . . 115
7.4.2. Extensin de ceros . . . . . . . . . . . . . . . . . . . . . . . . . 116
7.5. Operaciones matemticas complejas . . . . . . . . . . . . . . . . . . . 117
7.5.1. Multiplicacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
7.5.2. Divisin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
7.6. Estructuras condicionales o de seleccin . . . . . . . . . . . . . . . . . 119
7.6.1. if . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
7.6.2. switch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
7.7. Estructuras iterativas o bucles . . . . . . . . . . . . . . . . . . . . . . . 127
7.7.1. while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
7.7.2. do-while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
7.7.3. for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
7.8. Funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
7.8.1. Genricas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
7.8.2. main . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
7.9. Archivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
7.9.1. Genricos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
7.9.2. Principal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
8. Optimizando cdigo con GCC 141
8.1. Tipos de optimizacin . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
9. Conclusiones 147
Bibliografa 149
A. PIC18-GCC 150
A.1. Compilando GCC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
A.2. Utilidades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
Compilador de C para el microcontrolador Microchip PIC18F4550 4
A.3. Argumentos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
A.4. Parmetros de GCC especcos para el PIC18 . . . . . . . . . . . . . . 153
A.5. Compilando con pic18-gcc . . . . . . . . . . . . . . . . . . . . . . . . . 153
B. GNU PIC Utilities 155
B.1. Introduccin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
B.2. Herramientas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
B.2.1. gpasm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
B.2.2. Cdigo fuente admitido por gpasm . . . . . . . . . . . . . . . 157
B.2.3. gplink . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
B.2.4. gplib . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
B.3. Compilando ensamblador . . . . . . . . . . . . . . . . . . . . . . . . . 162
C. Programas de ejemplo 165
D. Manual de usuario 170
D.1. GCC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
D.1.1. Ensamblador en lnea . . . . . . . . . . . . . . . . . . . . . . . 171
D.2. GNU Pic Utilities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172
D.2.1. gpasm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
D.2.2. gplink . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
D.2.3. gplib . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
D.2.4. Programador . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
D.2.5. Archivos auxiliares . . . . . . . . . . . . . . . . . . . . . . . . . 175
Captulo 1
Introduccin
La mayora de los programadores de microcontroladores preeren usar lenguaje
ensamblador en lugar de un lenguaje de alto nivel. Sus argumentos son el desper-
dicio de memoria que introduce un compilador y la mayor optimizacin que llegan
a conseguir escribiendo su propio cdigo ensamblador personalizado, as como la
elevada predecibilidad del tiempo de ejecucin de los programas escritos en ensam-
blador. Pese a que puede demostrarse que es cierto en la mayora de los casos, hay
otros muchos factores que inclinan la balanza hacia un lenguaje ms alejado de la
arquitectura de la mquina, como es el lenguaje C.
Para propsitos de experimentacin o aprendizaje, la eleccin de un lenguaje u
otro puede apoyarse nicamente en las preferencias personales del desarrollador.
Sin embargo, en entornos de desarrollo de productos comerciales hay que conside-
rar dos factores muy importantes: tiempo de desarrollo y coste del mismo. Reducir
el coste es un objetivo comn en todas las empresas y, en un principio, no tiene
relacin directa con el lenguaje de programacin elegido. En cambio, el tiempo in-
vertido en el desarrollo s est ligado al lenguaje por el que se opte, especialmente
cuando las opciones son lenguaje ensamblador o uno de alto nivel, en nuestro caso
C.
El desarrollo en lenguaje ensamblador siempre depende del dispositivo elegido
para realizar el proyecto. En el caso de dispositivos integrados como los micro-
controladores, cambiar de modelo puede implicar un comienzo desde cero, con la
enorme prdida de tiempo y dinero que esto supondra. En cambio, un cdigo en
lenguaje C es independiente de la arquitectura del procesador, por lo que slo ha-
bra que preocuparse del control de los dispositivos perifricos. Desarrollando en
un lenguaje de alto nivel, un cambio de modelo de microcontrolador a otro (de
la misma familia y compatible en dispositivos) resultara totalmente transparente,
siempre suponiendo que el nuevo dispositivo disponga de suciente memoria para
el programa. Incluso sera posible cambiar de familia de dispositivos, por ejemplo
5
Compilador de C para el microcontrolador Microchip PIC18F4550 6
de PIC18 a PIC16, sin ms cambios que adaptar el cdigo especco que gestiona
los dispositivos perifricos.
Relacionado con el punto anterior est el hecho de que el cdigo escrito en un
lenguaje de alto nivel como C es fcilmente reutilizable. Por consiguiente, si dis-
ponemos de un algoritmo ya implementado, probado, depurado y, por supuesto,
comentado, podremos utilizarlo en otros proyectos sin necesidad de invertir gran-
des cantidades de tiempo en reescribirlo. Si el mismo algoritmo estuviese escrito en
cdigo ensamblador para un dispositivo concreto, su reutilizacin sera mucho ms
cara, ya que portarlo a otra arquitectura supone, prcticamente, reescribirlo desde
cero.
Adems de las ventajas de portabilidad y reutilizacin de cdigo, los lenguajes
de alto nivel facilitan la depuracin de errores. Debido a la dicultad de analizar y
vericar un programa en ensamblador, la fase depuracin resulta larga y tediosa, lo
que lleva a un tiempo de desarrollo en ocasiones excesivo y a que los clientes con
menos paciencia opten por cancelar el proyecto. En cambio, los lenguajes de alto
nivel permiten tcnicas de desarrollo y depuracin ms ecientes, e incluso es posi-
ble emplear tcnicas formales de vericacin. Por ello el tiempo necesario para esta
fase del desarrollo es menor que para el mismo proyecto escrito en ensamblador.
Todos estos son motivos de peso que justican el esfuerzo invertido en este pro-
yecto, cuyo objetivo es disponer de un compilador de lenguaje C completo que per-
mita mejorar la calidad de los programas escritos para el dispositivo escogido, el
microcontrolador PIC18F4550 de Microchip, as como reducir el tiempo necesario
para desarrollar proyectos de diversa ndole que empleen este microcontrolador.
Los motivos de escoger el compilador de GNU, GCC, como punto de partida
han sido su buen diseo, que despus de 25 aos de historia sigue siendo una pie-
za de ingeniera del software digna de admiracin; su desarrollo activo por parte
de una gran comunidad de desarrolladores experimentados; su amplia difusin y
aceptacin por usuarios, profesionales y empresas de todo el mundo; su naturaleza
de cdigo abierto y, por supuesto, la licencia libre bajo la cual se distribuye, la General
Public License (Licencia Pblica General) de GNU, que permite en ltima instancia que
este proyecto nal de carrera sea posible.
El objetivo del proyecto ha sido desarrollar el backend de GCC para el microcon-
trolador PIC18F4550. Aunque, por tratarse de un proyecto de la Ingeniera Tcnica
acotamos la dicultad del proyecto en un principio, excluyendo funciones, punteros
y matrices de este proyecto, nalmente hemos implementado tambin funciones,
punteros y matrices, dando soporte completo al frontend de C para el PIC18F4550.
Para ello, y aunque en principio el plan era ampliar el backend para microcontro-
ladores PIC16 desarrollado en [8], hemos terminado reescribiendo desde cero un
Compilador de C para el microcontrolador Microchip PIC18F4550 7
backend propio; ya que, aunque las diferencias en el cdigo en ensamblador son pe-
queas, las diferencias en el manejo de la memoria lo han justicado, y adems nos
ha permitido utilizar las instrucciones especcas del 18F4550, que suponen una
mejora de rendimiento del cdigo resultante muy importante.
Hemos realizado el proyecto para la plataforma Linux, aunque por su naturaleza
y por el grado de integracin con la GCC toolchain alcanzado puede ser recompilado
para cualquier plataforma que queramos emplear y que permita ejecutar la GCC
toolchain.
Finalmente, hemos hecho un sobreesfuerzo para cumplir las lneas de desarrollo
de cdigo de GCC, y no afectar cdigo de GCC fuera del que se espera que sea
modicado en el desarrollo de un porting limpio, con objeto de su futura integracin
en la lnea principal de desarrollo de GCC.
1.1. Estructura de la memoria
La estructura de la memoria es la siguiente:
En el primer captulo presentamos el trabajo desarrollado y sus partes.
En el segundo captulo introducimos los microcontroladores y la arquitectura
PIC.
En el tercer captulo analizamos la arquitectura del compilador GCC.
En el cuarto captulo planteamos el diseo de nuestra solucin, as como las
opciones que hemos tomado y justicamos dichas opciones.
En el quinto captulo estudiamos con ms detalle aspectos destacables de las
decisiones que hemos tomado al implementar el backend, incluyendo anlisis
de las optimizaciones de cdigo soportadas.
En el sexto captulo comentamos las conclusiones a las que hemos llegado en
nuestro trabajo.
Despus planteamos cuatro apndices, que incluyen:
En el primer apndice, la mecnica (que no es trivial) para incorporar nuestro
cdigo en GCC y compilarlo.
En el segundo apndice describimos las utilidades de GNU para microcontro-
ladores PIC, imprescindibles para utilizar nuestro proyecto: GPUTILS.
Compilador de C para el microcontrolador Microchip PIC18F4550 8
En el tercer apndice incluimos algunos programas de ejemplo.
Finalmente, en el cuarto y ltimo apndice, incluimos el manual de usuario
del programa desarrollado.
Captulo 2
Los microcontroladores PIC
2.1. Qu es un microcontrolador?
Un microcontrolador es un dispositivo integrado que proporciona las funciona-
lidades de un pequeo ordenador. Los microcontroladores estn compuestos por
un procesador, memoria y varios perifricos. Las grandes ventajas de los microcon-
troladores son su reducido tamao, bajo coste y gran variedad.
Los dispositivos que proporcionan datos de entrada al microcontrolador o reci-
ben informacin de salida desde el mismo pueden ser muy diversos, desde lneas
digitales sencillas que slo trabajan con dos valores (cero o uno) hasta puertos com-
plejos, como los que se emplean en ordenadores, que permiten la comunicacin del
microcontrolador con otros dispositivos externos, tales como otros microcontrola-
dores o un ordenador personal.
Existen numerosos fabricantes que ofrecen una gran variedad de modelos dife-
rentes. Cada modelo tiene unas caractersticas: tamao, cantidad de memoria, po-
tencia de clculo, perifricos, consumo de energa, resistencia al calor y resistencia
a la humedad. El objetivo de esta diversidad es la reduccin de costes, ya que no es
razonable exigir un dispositivo potente y completo que se adece a cualquier pro-
yecto y que adems sea barato. Cuantas ms caractersticas tenga un dispositivo,
mayor ser su coste de produccin; y, por consiguiente, mayor precio de adquisi-
cin. Por ello, la clave reside en hacer diseos sencillos y con unas caractersticas
limitadas.
Dada la variedad de microcontroladores existente, no nos resultar difcil encon-
trar un modelo que se ajuste a los requisitos de nuestro proyecto y al mismo tiempo
resulte econmico.
9
Compilador de C para el microcontrolador Microchip PIC18F4550 10
2.2. Aplicaciones
La gran diversidad de modelos disponibles en el mercado nos permite afrontar
innidad de diseos diferentes, por simples o complejos que estos sean. Algunos
ejemplos de uso real de microcontroladores son telfonos mviles, controles de ac-
ceso a edicios, mandos a distancia, sistemas de freno ABS, micro-robtica, redes
de sensores o sistemas de control de riego.
Ala hora de realizar un proyecto hardware la dicultad no reside en el uso de un
microcontrolador concreto, sino en la eleccin del fabricante y el modelo adecuado
para nuestro proyecto. Aunque el uso de microcontroladores nos facilitar la tarea
en muchos aspectos, debemos tener siempre presente el objetivo de minimizar los
costes. En ocasiones encontraremos aplicaciones en las que no ser factible emplear
un nico microcontrolador o en las que un diseo distribudo con varios microcon-
troladores resultar ms eciente y econmico. Por este motivo, resulta conveniente
realizar un anlisis de costes antes de comenzar el desarrollo.
2.3. Historia de los microcontroladores PIC
En el mercado de microcontroladores, tres empresas son las ms conocidas: At-
mel, Motorola y Microchip. Existen muchas otras, como Intel, Texas Instruments o Re-
nesas Technology.
Microchip es el fabricante de los microcontroladores PIC. Todos ellos son hereda-
dos del PIC1650, que fue desarrollado originalmente por General Instruments.
El nombre PIC es la abreviatura de PICmicro, aunque por lo general se considera
acrnimo de Peripheral Interface Controller (Controlador de Interfaz Perifrico).
En un principio, el PIC se dise para combinarse con el procesador de 16 bits
CP16000 -de ah que el nombre original fuese Programmable Interface Controller (Con-
trolador de Interface Programable)-. El CP16000, a pesar de ser un buen microproce-
sador, careca de una buena E/S y por ello, en 1975, surgi el PIC de 8 bits, pensado
para mejorar el rendimiento del sistema conjunto mediante la descarga de operacio-
nes de E/S del CP16000. El PIC original empleaba un microcdigo simple almacena-
do en ROM para ejecutar su tarea y, a pesar de que el trmino no exista en aquella
poca, posea caractersticas tpicas de los diseos RISC.
Cuando la divisin de microelectrnica de General Instruments se separ del res-
to de la empresa, en 1985, el nuevo propietario cancel casi todos los desarrollos,
que para esa poca estaban obsoletos. Sin embargo, el PIC se mejor con EPROM,
convirtindose en un controlador programable de E/S.
A da de hoy existen multitud de modelos de PIC que incorporan varios puertos
Compilador de C para el microcontrolador Microchip PIC18F4550 11
de comunicacin con el exterior (puertos serie, controladores de motores o conver-
sores analgico-a-digital) y con memorias de programa de hasta 32.000 palabras.
2.4. Las gamas de PIC
Los modelos de PIC constituyen gamas distintas, en funcin del tamao de ins-
truccin que emplean. Actualmente, Microchip comercializa sus microcontroladores
clasicados en cuatro gamas:
La gama baja la componen la serie PIC10 y una parte de las series PIC12 y
PIC16. Utilizan palabras de instruccin de 12 bits, su tamao es reducido, as
como sus caractersticas, y su coste es muy bajo.
La gama media est compuesta por casi toda la serie PIC16 y una porcin de los
PIC12. Utilizan un ancho de palabra de instruccin de 14 bits. sta es la gama
ms popular por su buena relacin calidad/precio. Adems, programarlos en
lenguaje ensamblador resulta bastante sencillo, dentro de la complejidad del
lenguaje, y es por ello que son una buena opcin de cara al aprendizaje.
La gama alta o de alto rendimiento la forma la serie de microcontroladores
PIC18. Emplean palabras de instruccin de 16 bits y estn basados en los PIC
de gama media pero con mejoras sustanciales: ms puertos de E/S, ms con-
versores A/D o interfaces USB.
La gama de 24 bits la componen de las series dsPIC30 y PIC24. Utilizan 24 bits
como palabra de instruccin, usan palabras de memoria de datos de 16 bits (y
no 8 bits), y son los que ofrecen ms memoria y mayor rendimiento.
2.5. Los PIC de gama alta
La gama alta ofrece microcontroladores adecuados para proyectos relativamente
complejos, tales como adquisicin de datos, redes de sensores distribuidos e incluso
algunas aplicaciones de tiempo real. Adems, incorpora varias caractersticas que,
combinadas con un buen compilador, hacen de esta gama una opcin muy intere-
sante para ejecutar programas estructurados y modulares, escritos en lenguajes de
alto nivel y haciendo uso de tcnicas ms avanzadas de ingeniera del software, con
el ahorro de tiempo y dinero que esto supone.
En el captulo 3 estudiaremos la arquitectura de los PIC de gama alta.
Compilador de C para el microcontrolador Microchip PIC18F4550 12
2.6. El PIC18F4550
De entre todos los modelos que componen la gama alta de PIC, el elegido para
realizar el port de GCC es el 18F4550. Implementa ocho bancos de memoria de datos,
2Kbytes en total, y 32Kbytes de memoria de programa. Adems incorpora 256 bytes
de EEPROM para uso general. Cuenta con cuatro temporizadores, dos unidades de
comparacin, captura y modulacin de ancho de pulso, un conversor A/D de 10
bits con trece entradas. Adems, cuenta con puertos SPI, I
2
C, USART, SPP, USB.
Junto con estos dispositivos, tiene -multiplexados- un total de 5 puertos de E/S.
Todas estas caractersticas hacen del PIC18F4550 un gran microcontrolador con el
que se pueden llevar a cabo innidad de proyectos de diversa ndole.
Captulo 3
Arquitectura PIC
3.1. Diseo del PIC
Los microcontroladores PICemplean la arquitectura Harvard, en la que la memo-
ria de programa y la memoria de datos se encuentran separadas, con sus propios
buses de direcciones y datos.
Una ventaja de esta arquitectura frente a la Von Neumann es que permite el acce-
so simultneo a ambas memorias, con lo que es posible solapar las etapas de bs-
queda de la siguiente instruccin mientras la instruccin actual accede al espacio
de memoria de datos. El principal inconveniente de esta arquitctura surge con el
uso de memoria cach, dado que cada espacio de memoria necesitar su propia ca-
ch independiente, y el rendimiento mximo slo se alcanzar con programas que
hagan un nmero similar de accesos a memorias de programa y datos. En caso con-
trario, el espacio menos usado tendr parte de su cach sin utilizar, mientras que
la cach del otro se encontrar siempre llena, con las posibles penalizaciones oca-
sionadas por los fallos de cach que esto conlleva. En cualquier caso, los PIC no
incorporan memoria cach, as que este problema no les afecta y slo obtienen los
benecios de la arquitectura Harvard.
Otra mejora de la arquitectura Harvard es que el tamao de palabra de cada
banco de memoria puede ser diferente. En los microcontroladores PIC el banco de
memoria de datos emplea un tamao de palabra tpico, 8 bits, mientras que las pa-
labras de la memoria de programa son de distinto tamao en funcin de la gama: la
gama alta emplea palabras de 16 bits para este espacio de memoria. De este modo,
es posible incluir en una sola palabra todos los datos para la ejecucin de la instruc-
cin, mejorando la eciencia ya que se necesita un nico acceso a la memoria de
programa para cada instruccin.
Entre las decisiones de diseo que han permitido a los PIC lograr su alto rendi-
13
Compilador de C para el microcontrolador Microchip PIC18F4550 14
miento sin que esto penalice en su precio se encuentra el pipeline segmentado en dos
etapas: bsqueda de instruccin y ejecucin. Ambas etapas se ejecutan en un nico
ciclo de reloj. Gracias a la divisin de memoria, estas dos etapas se superponen en
el tiempo sin ninguna restriccin, con lo que se consigue completar la ejecucin de
una instruccin con cada ciclo de reloj en la mayora de los casos. Las nicas instruc-
ciones donde no es posible este solape son las que modican el contador de programa
(en ingls, program counter o PC), ya que la bsqueda de la prxima instruccin se
efecta en paralelo a la ejecucin de la actual y, hasta que no termine la ejecucin de
sta y se cargue el PC, no ser posible hacer la bsqueda de la siguiente instruccin.
As, todas las instrucciones de salto emplearn dos ciclos de reloj para ejecutarse.
El conjunto de instrucciones es reducido gracias a la ortogonalidad de las mis-
mas, que permiten mover contenidos desde y hacia cualquier registro. La curva de
aprendizaje del ensamblador del PIC es, por consiguiente, reducida. Esto, unido a
que todos los registros con funciones especiales se encuentran mapeados en me-
moria (includo el PC) nos proporciona la potencia y exibilidad necesarias para
manejar, de manera sencilla y elegante, todas las funciones del microcontrolador.
3.2. CPU
La Unidad Central de Proceso -en adelante, CPU- es el cerebro del microcon-
trolador. Su cometido es ejecutar la instruccin apuntada por el PC en la memoria
de programa mediante la generacin de la seales de control apropiadas sobre los
buses, registros internos y unidad aritmtico-lgica (ALU).
3.3. ALU
Los microcontroladores PIC incorporan una ALUde 8 bits. Adems tienen un re-
gistro de trabajo, tambin de 8 bits, llamado WREG (Working Register). La ALU efec-
ta operaciones aritmticas y lgicas de propsito general entre el registro WREG y
cualquier otro registro de la memoria de datos, o entre WREG y un valor inmediato,
tomado de la palabra de la instruccin en curso.
La salida de la ALU puede almacenarse en el registro WREG o en el registro
de la memoria de datos empleado como parmetro. En funcin de la instruccin
ejecutada, la ALU actualizar los bits apropiados del registro de estado (STATUS),
indicando acarreo, acarreo de dgito, desbordamiento, resultado negativo o cero.
Con las operaciones que soporta la ALU y la informacin que devuelve es posible
implementar cualquier operacin matemtica, como se ver ms adelante en este
Compilador de C para el microcontrolador Microchip PIC18F4550 15
documento.
La gama alta de PIC incorpora, adems de la ALU estndar, un multiplicador
hardware de valores de 8 bits que permite efectuar multiplicaciones en un slo ciclo
de reloj y facilita el desarrollo de rutinas de multiplicacin para datos ms grandes,
as como de otras operaciones matemticas avanzadas.
3.4. Organizacin de la memoria
Como ya hemos visto, la memoria est dividida en dos espacios, uno para datos
y otro para programa. La memoria de datos, a su vez, se encuentra organizada en re-
gistros que podemos clasicar en registros de propsito general (GPR) y registros de
funcin especial (SFR), que controlan las funciones del ncleo del microcontrolador.
Ms adelante estudiaremos los registros especiales para controlar los perifricos.
3.4.1. Memoria de programa
La memoria de programa emplea palabras de 16 bits con una alineacin a ni-
vel de byte. Est conectada a un bus tambin de 16 bits. Dado que una instruccin
ocupa una palabra de la memoria de programa, podemos almacenar tantas instruc-
ciones como palabras de memoria tenga nuestro microcontrolador. Para direccionar
este banco de memoria se usa el contador de programa (PC), que direcciona bytes,
no palabras. Este registro tiene un ancho de 21 bits, lo que permite direccionar hasta
2Mbytes de memoria. Ante la posibilidad de que el PC quede desalineado respecto
a las palabras, su bit menos signicativo es siempre 0 y las instrucciones de eje-
cucin secuencial incrementan el contador de programa en dos unidades. De este
modo, el PC siempre apuntar a una palabra de 16 bits alineada a nivel de palabra.
Pese a que siempre podemos direccionar el mximo de memoria, los microcon-
troladores incorporan una cantidad de memoria inferior a la mxima que soportan.
Todos los accesos de lectura a posiciones de memoria por encima del lmite de me-
moria incorporada devolvern el valor cero.
PC
El contador de programa apunta a la direccin de la memoria de programa que
ser accedida en el prximo acceso. Como todos los registros de funcin especial,
est mapeado en la memoria de datos y sta emplea palabras de 8 bits. Dado que
el PC tiene un tamao de 21 bits, est dividido en tres registros mapeados en la
memoria de datos: PCL, PCH y PCU. PCL corresponde al byte bajo del PC (PC[7:0]),
Compilador de C para el microcontrolador Microchip PIC18F4550 16
PCH al byte alto (PC[15:8]) y PCU al byte superior, que almacena los 5 bits ms
signicativos del PC (PC[20:16]).
El registro PCL permite lectura y escritura de manera directa. En cambio los
otros dos registros, PCH y PCU, no son directamente accesibles por el programa-
dor. Para modicar estos registros hacemos uso de otros dos registros especiales,
que s permiten lectura y escritura: PCLATH y PCLATU. Estos registros se compor-
tan como registros temporales que almacenan los valores que cargarn PCH y PCU
cuando se realice una escritura en PCL. Por tanto, una modicacin del PC requie-
re tres operaciones, no necesariamente unidas, que tendrn efecto tras la carga de
PCL. De manera anloga, una lectura de PCL produce que se carguen en PCLATH y
PCLATU los valores de PCH y PCU respectivamente.
Instrucciones que modican el PC
Adems del procedimiento anterior, el ensamblador de PIC proporciona varias
instrucciones que modican el PC: GOTO, CALL, RCALL y RETURN. Todas ellas
modican el PC directamente, sin tocar los registros PCLATH y PCLATU.
La instruccin GOTO efecta un salto incondicional en el ujo de ejecucin del
programa a cualquier direccin del rango de 2Mbytes que permite el PIC18. Es fcil
deducir que se trata de una instruccin codicada mediante dos palabras de me-
moria, ya que, de lo contrario, el rango de salto sera menor.
El comportamiento de la instruccin CALL es similar al de GOTO. La diferencia
entre ellas es que CALL almacena en la pila interna la direccin de la instruccin
que se encuentra a continuacin de ella (PC+4).
Podemos considerar la instruccin RCALL como una versin recortada de la an-
terior. Produce saltos en el programa de hasta 1Khacia delante o hacia atrs, respec-
to al valor, incrementado en dos, que almacena el PC en el momento de ejecutarse.
La cuarta instruccin en realidad es un conjunto de tres instrucciones (RETURN,
RETLW y RETFIE) que, grosso modo, cumplen el mismo cometido. Cuando el mi-
crocontrolador ejecuta una de estas instrucciones, el PC carga el valor que se en-
cuentra almacenado en la cima de la pila.
Pila
Los PIC18 implementan una pila de direcciones de 31 niveles en una memoria
aparte de los espacios de programa y datos. Es posible leer y modicar el puntero a
la cima de la pila (STKPTR), as como la direccin almacenada en la cima, median-
te los registros de funcin especial de cima de pila. Hay que tener en cuenta que
tiene un comportamiento circular, de modo que tras efectuar 31 acciones seguidas
Compilador de C para el microcontrolador Microchip PIC18F4550 17
de apilamiento el puntero a la cima habr dado la vuelta y quedar apuntando a la
primera posicin, lo que podra no ser el comportamiento deseado por el progra-
mado. Por ello es necesario tener mucha precaucin de no sobrepasar los 31 niveles
de anidamiento de subrutinas.
Vectores
Para terminar con la descripcin de la memoria de cdigo, veremos dos po-
siciones importantes para la programacin de los dispositivos. En el momento de
inicializarse el microcontrolador, la ejecucin del programa comienza en la posicin
de memoria de programa 0x000000h, llamada vector de reset. Es desde esta posicin
donde debemos insertar un salto al inicio real de nuestro cdigo (el inicio deseado),
a travs de un salto con GOTO u otro de los mtodos alternativos.
Existen otros dos vectores ubicados en 0x000008h y 0x000018h, correspondientes
a las interrupciones de alta y baja prioridad, respectivamente. Cada vez que se acti-
ve una seal de interrupcin, el microcontrolador deshabilitar las interrupciones,
guardar el valor del PC en pila, cargar el nuevo valor de PC a partir del almace-
nado en uno de estos dos vectores, en funcin de la seal de interrupcin que se
haya activado, y continuar ejecutando instrucciones. Esta rutina de tratamiento de
interrupcin (ISR) deber terminar con una instruccin RETFIE, con la que el PC
recupera su valor a partir de la pila, el registro GIE vuelve a estar habilitado y con
l, las interrupciones. Hay que tener en cuenta que disponemos de dos niveles de
interrupciones: alta y baja prioridad. La distincin de prioridades permite que los
acontecimientos de alta prioridad reciban atencin inmediata an cuando el micro
est tratando otra interrupcin -siempre que sta sea de prioridad baja- y que su
rutina de servicio no se vea interrumpida por otros eventos de menor prioridad.
3.4.2. Memoria de datos
La memoria de datos est compuesta por registros de propsito general (GPR) y
registros de funcin especial (SFR). Los primeros sirven para almacenar cualquier
valor sin un propsito establecido de antemano. Los segundos tienen tareas de-
nidas y jadas en el diseo del hardware: comunicar y controlar los diversos dis-
positivos integrados en el microcontrolador y controlar el funcionamiento de ste.
Debido a la diversidad de microcontroladores, el mapa de registros diere para ca-
da modelo. A pesar de que existe una tendencia a igualar la ubicacin en memoria
de los SFR para microcontroladores de una misma familia y gama, es convenien-
te consultar la hoja de caractersticas del modelo, incluso de nuevas revisiones del
mismo, para tener la certeza de que el dispositivo funcionar de la manera espe-
Compilador de C para el microcontrolador Microchip PIC18F4550 18
Banco Bits 3:0
accesible de BSR
0 0 0 0 0
1 0 0 0 1
2 0 0 1 0
3 0 0 1 1
4 0 1 0 0
5 0 1 0 1
6 0 1 1 0
7 0 1 1 1
Cuadro 3.1: Valores del BSR para acceso a los bancos del microcontrolador
PIC18F4550.
rada. Los registros de los perifricos los describiremos ms adelante, en la seccin
correspondiente a cada perifrico.
Los PIC18 pueden direccionar hasta 4Kbytes de memoria de datos que, como
ocurre con el espacio de memoria de programa, pueden estar implementados en su
totalidad o disponer de menos memoria. Esta memoria est dividida en varias par-
tes, llamadas bancos, de 256 bytes cada una. El PIC18F4550 implementa 8 bancos
completos, lo que resulta en un total de 2Kbytes de memoria de datos. Igual que
ocurre con la memoria de programa, todo acceso de lectura a una posicin de me-
moria fuera del rango implementado devuelve un valor 0. Los accesos de escritura
a direcciones de memoria no implementadas no tienen ningn efecto ms all de
actualizar el registro de estado STATUS como si la operacin hubiese tenido xito.
La mayora de instrucciones de los PIC18 que efectan accesos a memoria cons-
truyen la direccin absoluta a partir de una direccin base (el nmero de banco) y
un desplazamiento relativo. El nmero de banco al que acceder la prxima ins-
truccin lo indica el registro de seleccin de banco (BSR), el cual habr que cambiar
antes de hacer un acceso a una posicin de memoria ubicada en un banco diferente
al que se encuentre seleccionado en el momento actual. El desplazamiento dentro
del banco, en cambio, es una direccin de 8 bits includa en la palabra de instruc-
cin.
Banco de acceso
Aunque el uso del BSR junto a un desplazamiento de 8 bits permite direccionar
todo el rango de memoria de datos, tambin obliga a tener especial cuidado con
qu banco se encuentra seleccionado antes de cada acceso. Podra resultar desastro-
so que por error escribisemos en un SFR en lugar de un GPR. Adems, la tarea de
Compilador de C para el microcontrolador Microchip PIC18F4550 19
vericar y cambiar el BSR para cada acceso a memoria llega a resultar muy ine-
ciente.
Para agilizar los accesos a las posiciones de memoria que se usan con mayor fre-
cuencia, la memoria de datos est congurada con un banco de acceso, que permite
acceder a un bloque de memoria sin hacer uso del BSR. Este banco est compuesto
por los primeros 96 bytes del banco 0 y los ltimos 160 bytes del banco 15. La pri-
mera mitad recibe el nombre de RAM de acceso y est compuesta de registros GPR.
La mitad superior, en cambio, est compuesta por los SFR del microcontrolador.
Ambas reas se encuentran mapeadas de manera contigua en el banco de acceso y
permiten accesos de modo lineal empleando una direccin de 8 bits.
Las instrucciones que hacen uso del banco de acceso son aquellas que incluyen
un parmetro a. Cuando este parmetro vale 1, la instruccin accede a memoria de
la manera habitual, empleando el BSR y un desplazamiento de 8 bits. Cuando vale
0, el acceso a memoria lo efecta mediante el banco de acceso, con lo que el valor
que tenga el BSR no tiene efecto alguno.
El uso de este direccionamiento forzado permite a la instruccin operar sobre una
direccin de memoria en un nico ciclo de instruccin sin tocar primero el BSR. Para
direcciones a partir de la 0x0060h, esto signica un acceso ms eciente a los SFR.
La RAM de acceso por debajo de la posicin 0x0060h es un buen lugar para valores
de datos que necesitemos acceder rpidamente, como resultados de operaciones
recientes o variables globales del programa.
Registros de propsito general
Los registros de propsito general (GPR), como su nombre indica, no tienen un pro-
psito prejado de antemano: los podemos usar para lo que consideremos oportuno
(datos temporales, variables y valores constantes, entre otros usos). La modica-
cin de uno u otro no tiene ms relevancia que el cambio de su valor, por lo que
nos proporciona la libertad necesaria para ejecutar las acciones que deseemos en el
microcontrolador.
No todos los dispositivos implementan la totalidad de registros GPR. En estos
modelos es posible acceder a todo el mapa de registros pero los accesos de lectura
devolvern siempre un valor 0 y las escrituras no tendrn ms efecto que actualizar
los bits convenientes del registro STATUS en caso de que sean resultado de una
operacin de la ALU.
Compilador de C para el microcontrolador Microchip PIC18F4550 20
Registro Uso
INDFx
Registros para acceso indirecto
POSTINCx
POSTDECx
PREINCx
PLUSWx
FSRxH
Punteros a memoria para acceso indirecto
FSRxL
TMRxH
Cuenta de los temporizadores
TMRxL
TxCON Conguracin de los temporizadores
STATUS Registro de estado
PRODH Byte alto del resultado de multiplicador
PRODL Byte bajo del resultado de multiplicador
PCLATU Parte superior del PC
PCLATH Parte alta del PC
PCL Parte baja del PC
INTCON
Conguracin de las interrupciones INTCON2
INTCON3
PIR1
Estado de las interrupciones
PIR2
PIE1
Habilitacin de interrupciones
PIE2
IPR1
Asignacin de prioridad de las fuentes de interrupcin
IPR2
RCON Control de Reset y prioridad de interrupciones
Cuadro 3.2: Resumen de registros de funcin especial del ncleo del microcontrola-
dor PIC18F4550.
Registros de funcin especial
Los registros de funcin especial (SFR) son los registros que emplean la CPU y los
mdulos perifricos para controlar el funcionamiento del microcontrolador. Estn
mapeados en las ltimas posiciones del banco 15 de memoria de datos, desde la
posicin 0x0F60h hasta la 0x0FFFh.
Podemos clasicar los SFR en dos conjuntos: los registros correspondientes a
funciones del ncleo (ALU, Reset e interrupciones) y los que corresponden a fun-
ciones de los perifricos. La tabla 3.2 presenta un resumen de los registros de funcin
especial del ncleo. Los registros de funciones de perifricos los veremos ms ade-
lante.
Compilador de C para el microcontrolador Microchip PIC18F4550 21
Direccionamiento indirecto
Existe otro modo de acceso a los registros: el acceso indirecto. Este modo permite
acceder a posiciones de memoria sin indicar una direccin ja como parmetro de
la instruccin. Para ello hacemos uso de los pares de registros de seleccin de ar-
chivo (FSR), los cuales actan como punteros a las direcciones de memoria en las
que deseamos leer o escribir. En total, es posible direccionar 4K posiciones, luego
hacen falta 12 bits para este cometido. Los ocho bits menos signicativos estn al-
macenados en el registro FSRxL, mientras que los ms signicativos son los cuatro
bits ms bajos del registro FSRxH correspondiente. El PIC18F4550 ofrece 3 pares de
FSR, de modo que podemos emplear hasta tres apuntadores independientes para
acceso indirecto a memoria.
Una vez indicada la direccin en un par FSR, podemos acceder al contenido de
esta posicin de memoria a travs del registro INDF asociado al FSR. Los registros
INDFx podemos considerarlos virtuales, ya que no son registros fsicos implemen-
tados en memoria, a pesar de que estn mapeados en sta. Por ejemplo, un acceso
a INDF0 resulta ser un acceso al registro apuntado por FSR0H:FSR0L.
Cabe destacar que tanto los FSR como sus INDF estn mapeados en el banco de
acceso, por lo que no es necesario preocuparse por la seleccin de banco a la hora de
utilizarlos. Adems, la direccin de memoria empleada para direccionamiento indi-
recto se encuentra almacenada completamente en el par FSR, por lo que la gestin
de bancos tampoco es necesaria cuando hagamos accesos indirectos a memoria.
3.5. Juego de instrucciones
El conjunto de instrucciones de los PIC18 est dividido en cuatro categoras b-
sicas:
Orientadas a byte.
Orientadas a bit.
De literales.
De control.
Orientadas a tabla.
La mayora de instrucciones orientadas a byte tienen tres operandos:
1. Registro objetivo. f
Compilador de C para el microcontrolador Microchip PIC18F4550 22
2. Destino del resultado (WREG o un GPR). d
3. Banco de memoria accedido (datos o acceso). a
El registro objetivo f indica sobre qu registro operar la instruccin. El destino
d especica dnde almacenar el resultado de la operacin. Si d es cero, el resultado
se guarda en WREG. Si d es uno, se almacena en el mismo registro objetivo. El bit de
acceso a puesto a cero indica que el registro objetivo pertenece al banco de acceso. Si
a vale uno, entonces el registro objetivo corresponde al banco de memoria indicado
en BSR.
Todas las intrucciones orientadas a bit tiene tres operandos:
1. Registro objetivo. f
2. Bit del registro. b
3. Banco de memoria accedido (datos o acceso). a
El operando b indica el bit afectado por la instruccin. Los otros dos parmetros
tienen el mismo signicado que en las instrucciones orientadas a byte.
Las instrucciones de literales pueden tener uno de los siguientes operandos o
los dos:
Valor literal para cargar en un registro. k
Registro FSR donde cargar el valor literal. f
Las instrucciones de control pueden tener uno o varios de los siguientes operan-
dos:
Direccin de memoria de programa. n
Modo de las instrucciones CALL o RETURN. s
Las instrucciones orientadas a tabla tan slo tienen un operando de modo, que
indica si se trata de un acceso con pre-incremento, post-incremento, post-decremento
o un acceso simple que no modica el apuntador de tabla.
Las instrucciones ensamblador las veremos con una simple tabla-resumen. La
mejor fuente para ampliar informacin, una vez ms, es el datasheet del PIC18F4550,
que proporciona ejemplos para cada instruccin de las distintas posibilidades de
ejecucin. La tabla 3.5 muestra todas las instrucciones separadas por formato de
instruccin mostrando una pequea descripcin. La tabla 3.5 complementa a s-
ta, mostrando los ciclos que necesita cada instruccin, los bits del registro STATUS
afectados y la palabra genrica de cdigo mquina correspondiente a cada nemo-
tcnico.
Compilador de C para el microcontrolador Microchip PIC18F4550 23
Nemotcnico Descripcin
Orientadas a byte
ADDWF f,d,a Suma de WREG y f
ADDWFC f,d,a Suma con acarreo de WREG y f
ANDWF f,d,a And lgico de WREG y f
CLRF f,a Puesta a 0 de f
COMF f,d,a Complemento a 1 de f
CPFSEQ f,a Compara f y WREG, salta si igual
CPFSGT f,a Compara f y WREG, salta si mayor
CPFSLT f,a Compara f y WREG, salta si menor
DECF f,d,a Decrementa f
DECFSZ f,d,a Decrementa f, salta si cero
DCFSNZ f,d,a Decrementa f, salta si no cero
INCF f,d,a Incrementa f
INCFSZ f,d,a Incrementa f, salta si cero
INFSNZ f,d,a Incrementa f, salta si no cero
IORWF f,d,a Or lgico de WREG y f
MOVF f,d,a Carga f en WREG
MOVFF fs,fd Mueve de fs a fd
MOVWF f,a Almacena WREG en f
MULWF f,a Multiplica WREG con f
NEGF f,a Complemento a 2 de f
RLCF f,d,a Rotacin a la izquierda con acarreo
RLNCF f,d,a Rotacin a la izquierda sin acarreo
RRCF f,d,a Rotacin a la derecha con acarreo
RRNCF f,d,a Rotacin a la derecha sin acarreo
SETF f,a Puesta a 0xFFh de f
SUBFWB f,d,a Resta con acarreo WREG menos f
SUBWF f,d,a Resta sin acarreo f menos WREG
SUBWFB f,d,a Resta con acarreo f menos WREG
SWAPF f,d,a Intercambia los nibbles de f
TSTFSZ f,a Comprueba f, salta si cero
XORWF f,d,a Xor lgico de WREG y f
Cuadro 3.3: Resumen del conjunto de instrucciones del
microcontrolador PIC18F4550.
Compilador de C para el microcontrolador Microchip PIC18F4550 24
Orientadas a bit
BCF f,b,a Limpia un bit de f
BSF f,b,a Activa un bit de f
BTFSC f,b,a Comprueba un bit de f, salta si es 0
BTFSS f,b,a Comprueba un bit de f, salta si es 1
BTG f,d,a Conmuta un bit de f
De literales
ADDLW k Suma k a WREG
ANDLW k And lgico de k y WREG
IORLW k Or lgico de k y WREG
LFSR f,k Carga k en el FSR indicado por F
MOVLB k Carga k en el BSR
MOVLW k Carga k en el WREG
MULLW k Multiplica k con WREG
SUBLW k Resta k menos WREG
XORLW k Xor lgico de WREG y k
Cuadro 3.3: Resumen del conjunto de instrucciones del
microcontrolador PIC18F4550.
Compilador de C para el microcontrolador Microchip PIC18F4550 25
De control
BRA n Salto relativo incondicional
BC n Salto relativo si acarreo
BZ n Salto relativo si cero
BOV n Salto relativo si desbordamiento
BN n Salto relativo si negativo
BNC n Salto relativo si no acarreo
BNN n Salto relativo si no negativo
BNOV n Salto relativo si no desbordamiento
BNZ n Salto relativo si no cero
CALL n,s Llamada a subrutina
CLRWDT Puesta a 0 del temporizador del WDT
DAW Ajuste decimal de WREG
GOTO n Salto absoluto
NOP No operation
POP Extrae de la pila y carga en PC
PUSH Introduce en la pila el valor de PC
RCALL n Llamada a subrutina, relativa a PC
RESET Reset por software del dispositivo
RETFIE s Fin de ISR
RETLW k Fin de subrutina y carga k en WREG
RETURN s Fin de subrutina
SLEEP Pasa el dispositivo al modo de reposo
Cuadro 3.3: Resumen del conjunto de instrucciones del
microcontrolador PIC18F4550.
Compilador de C para el microcontrolador Microchip PIC18F4550 26
Orientadas a tabla
TBLRD* Lectura de tabla
TBLRD*+ Lectura con post-incremento
TBLRD*- Lectura con post-decremento
TBLRD+* Lectura pre-incremento
TBLWT* Escritura de tabla
TBLWT*+ Escritura con post-incremento
TBLWT*- Escritura con post-decremento
TBLWT+* Escritura con pre-incremento
Cuadro 3.3: Resumen del conjunto de instrucciones del
microcontrolador PIC18F4550.
Compilador de C para el microcontrolador Microchip PIC18F4550 27
Nemotcnico Ciclos Bis de STATUS afectados Palabra de instruccin
Orientadas a byte
ADDWF f,d,a 1 C,DC,Z,OV,N 0010 01da ffff ffff
ADDWFC f,d,a 1 C,DC,Z,OV,N 0010 00da ffff ffff
ANDWF f,d,a 1 Z,N 0001 01da ffff ffff
CLRF f,a 1 Z 0110 101a ffff ffff
COMF f,d,a 1 Z,N 0001 11da ffff ffff
CPFSEQ f,a 1-3 0110 001a ffff ffff
CPFSGT f,a 1-3 0110 010a ffff ffff
CPFSLT f,a 1-3 0110 000a ffff ffff
DECF f,d,a 1 C,DC,Z,OV,N 0000 01da ffff ffff
DECFSZ f,d,a 1-3 0010 11da ffff ffff
DCFSNZ f,d,a 1-3 0100 11da ffff ffff
INCF f,d,a 1 C,DC,Z,OV,N 0010 10da ffff ffff
INCFSZ f,d,a 1-3 0011 11da ffff ffff
INFSNZ f,d,a 1-3 0100 10da ffff ffff
IORWF f,d,a 1 Z,N 0001 00da ffff ffff
MOVF f,d,a 1 Z,N 0101 00da ffff ffff
MOVFF fs,fd 2
1100 ffff ffff ffff
1111 ffff ffff ffff
MOVWF f,a 1 0110 111a ffff ffff
MULWF f,a 1 0000 001a ffff ffff
NEGF f,a 1 C,DC,Z,OV,N 0110 110a ffff ffff
RLCF f,d,a 1 C,Z,N 0011 01da ffff ffff
RLNCF f,d,a 1 Z,N 0100 01da ffff ffff
RRCF f,d,a 1 C,Z,N 0011 00da ffff ffff
RRNCF f,d,a 1 Z,N 0100 00da ffff ffff
SETF f,a 1 0110 100a ffff ffff
SUBFWB f,d,a 1 C,DC,Z,OV,N 0101 01da ffff ffff
SUBWF f,d,a 1 C,DC,Z,OV,N 0101 11da ffff ffff
SUBWFB f,d,a 1 C,DC,Z,OV,N 0101 10da ffff ffff
SWAPF f,d,a 1 0011 10da ffff ffff
TSTFSZ f,a 1-3 0110 011a ffff ffff
XORWF f,d,a 1 Z,N 0001 10da ffff ffff
Cuadro 3.4: Instrucciones del microcontrolador
PIC18F4550: ciclos, bits de STATUS afectados y palabra
de instruccin.
Compilador de C para el microcontrolador Microchip PIC18F4550 28
Orientadas a bit
BCF f,b,a 1 1001 bbba ffff ffff
BSF f,b,a 1 1000 bbba ffff ffff
BTFSC f,b,a 1-3 1011 bbba ffff ffff
BTFSS f,b,a 1-3 1010 bbba ffff ffff
BTG f,d,a 1 0111 bbba ffff ffff
De literales
ADDLW k 1 C,DC,Z,OV,N 0000 1111 kkkk kkkk
ANDLW k 1 Z,N 0000 1011 kkkk kkkk
IORLW k 1 Z,N 0000 1001 kkkk kkkk
LFSR f,k 2
1110 1110 00ff kkkk
1111 0000 kkkk kkkk
MOVLB k 1 0000 0001 0000 kkkk
MOVLW k 1 0000 1110 kkkk kkkk
MULLW k 1 0000 1101 kkkk kkkk
SUBLW k 1 C,DC,Z,OV,N 0000 1000 kkkk kkkk
XORLW k 1 Z,N 0000 1010 kkkk kkkk
Cuadro 3.4: Instrucciones del microcontrolador
PIC18F4550: ciclos, bits de STATUS afectados y palabra
de instruccin.
Compilador de C para el microcontrolador Microchip PIC18F4550 29
De control
BRA n 2 1101 0nnn nnnn nnnn
BC n 1-2 1110 0010 nnnn nnnn
BZ n 1-2 1110 0000 nnnn nnnn
BOV n 1-2 1110 0100 nnnn nnnn
BN n 1-2 1110 0110 nnnn nnnn
BNC n 1-2 1110 0011 nnnn nnnn
BNN n 1-2 1110 0111 nnnn nnnn
BNOV n 1-2 1110 0101 nnnn nnnn
BNZ n 1-2 1110 0001 nnnn nnnn
CALL n,s 2
1110 110s kkkk kkkk
1111 kkkk kkkk kkkk
CLRWDT 1 TO,PD 0000 0000 0000 0100
DAW 1 C 0000 0000 0000 0111
GOTO n 2
1110 1111 kkkk kkkk
1111 kkkk kkkk kkkk
NOP 1 0000 0000 0000 0000
NOP 1 1111 xxxx xxxx xxxx
POP 1 0000 0000 0000 0110
PUSH 1 0000 0000 0000 0101
RCALL n 2 1101 1nnn nnnn nnnn
RESET 1 Todos 0000 0000 1111 1111
RETFIE s 2 GIE/GIEH, PEIE/GIEL 0000 0000 0001 000s
RETLW k 2 0000 1100 kkkk kkkk
RETURN s 2 0000 0000 0001 001s
SLEEP 1 TO,PD 0000 0000 0000 0011
Cuadro 3.4: Instrucciones del microcontrolador
PIC18F4550: ciclos, bits de STATUS afectados y palabra
de instruccin.
Compilador de C para el microcontrolador Microchip PIC18F4550 30
Orientadas a tabla
TBLRD* 2 0000 0000 0000 1000
TBLRD*+ 2 0000 0000 0000 1001
TBLRD*- 2 0000 0000 0000 1010
TBLRD+* 2 0000 0000 0000 1011
TBLWT* 2 0000 0000 0000 1100
TBLWT*+ 2 0000 0000 0000 1101
TBLWT*- 2 0000 0000 0000 1110
TBLWT+* 2 0000 0000 0000 1111
Cuadro 3.4: Instrucciones del microcontrolador
PIC18F4550: ciclos, bits de STATUS afectados y palabra
de instruccin.
3.6. Perifricos
A continuacin estudiaremos de forma resumida los distintos perifricos que
podemos encontrar en un PIC. Debido a la gran variedad de dispositivos integrados
que llegan a formar parte de un microcontrolador PIC y las diferencias existentes
en un dispositivo entre los distintos modelos, nos centramos en los dispositivos
contenidos en el microcontrolador 18F4550.
3.6.1. Puertos de Entrada/Salida
El puerto de E/S es el dispositivo ms sencillo de los existentes en un microcon-
trolador y tambin es el ms utilizado. Los PIC ofrecen puertos de E/S de hasta 8
bits de tamao. El 18F4550 dispone de 5 puertos de E/S, etiquetados con las letras
de la A hasta la E, de los cuales B y D son puertos de 8 bits, A y C son de 7 bits,
mientras que el puerto E tiene un ancho de 4 bits.
Cada puerto dispone de tres registros que permiten su manejo. El registro TRISx
(donde x es la letra que identica a cada puerto) indica el sentido (entrada o salida)
de cada pin, de modo que un bit puesto a 1 indica que el pin correspondiente es
de entrada, mientras que un 0 indica que dicho pin es de salida. Por tanto, para
emplear como pines de entrada los dos menos signicativos del puerto B y como
salida el resto de pines del mismo puerto basta con cargar en TRISB el valor binario
Compilador de C para el microcontrolador Microchip PIC18F4550 31
00000011. Una vez congurada la direccin, la lectura y escritura de un puerto de
E/S resulta tan sencilla como leer o escribir en el registro PORTx correspondiente.
El tercer registro asociado a un puerto, LATx, hace las funciones de latch de sa-
lida. Cuando efectuamos una operacin de escritura sobre PORTx, en realidad el
registro escrito es LATx. Sin embargo, una operacin de lectura sobre PORTx no
efecta una lectura del registro LATx, sino que produce la carga del dato de en-
trada en otro latch (destinado nicamente a datos entrantes). Acto seguido, el mi-
crocontrolador almacena el valor de este latch de entrada en el registro destino de
la instruccin. Gracias a esta combinacin de latches para entrada y salida es posi-
ble obtener el valor que sale del puerto sin necesidad de circuitera extra ni de un
puerto de entrada adicional. Un ejemplo que aprovecha esta conguracin es el par
de instrucciones BSF/BCF. Estas instrucciones cambian el valor de un bit almacena-
do en un registro cualquiera del microcontrolador. En el caso de un puerto de E/S,
primero leen el valor del registro (LATx en este caso), activan o desactivan el bit
indicado y, por ltimo, almacenan el nuevo valor en el latch de salida del puerto en
cuestin (LATx). Un detalle muy a tener en cuenta es que si un puerto de entrada,
que haya ledo un valor en algn momento, cambia de modo y pasa a funcionar en
modo de salida, el valor que tendr ser el almacenado en LATx (latch de salida de
PORTx), no el que haba en latch de entrada de PORTx.
Otro punto a tener en cuenta es que debido al coste que suponen las patillas
de comunicacin en los PIC y, en general, en cualquier dispositivo integrado, los
puertos de E/S estn multiplexados con otros dispositivos. Cuando uno de estos
dispositivos est activado, los pines compartidos con el puerto de E/S no podrn
usarse con tal propsito, con lo que el puerto tendr un tamao efectivo menor.
Un ejemplo de esto es el puerto A, cuyo pin 0 est multiplexado con el canal 0
del conversor analgico-digital. Cuando est activo el mdulo de conversin A/D,
habr que tener cuidado de no modicar los registros TRISA, TRISB y TRISE, ya
que afectan a los pines que emplea el conversor y podra resultar en errores de
conversin.
Por ltimo, hay que recordar que la escritura en los registros ocurre al nal del
ciclo de instruccin, mientras que la lectura se produce al principio. Debido a esto,
puede darse el caso de que el valor a la salida de un puerto no est estabilizado an-
tes del prximo acceso. Por este motivo, Microchip recomienda intercalar entre dos
operaciones consecutivas sobre un puerto concreto una instruccin que no haga uso
del mismo, para tener la seguridad de que los valores del puerto se han estabilizado
antes de un acceso de lectura.
Compilador de C para el microcontrolador Microchip PIC18F4550 32
3.6.2. Universal Serial Bus
En la actualidad, uno de los interfaces de comunicacin con perifricos ms uti-
lizados es el USB. El PIC18F4550 incorpora un motor de interface serie (SIE) que
soporta el estndar USB 2.0 en modos de baja y alta velocidad. El SIE puede cana-
lizarse directamente a dispositivos USB haciendo uso de su transceptor interno o
conectarse a un transceptor externo, proporcionando una notable exibilidad a la
hora de disear del hardware. El subsistema USB del 18F4550 tambin incorpora un
regulador de tensin de 3.3V con las resistencias de polarizacin exigidas por la es-
pecicacin USB 2.0. Adems, ofrece la posibilidad de usar polarizacin, e incluso
alimentacin externa, con el transceptor interno.
El control del subsistema USB recae sobre un total de 22 registros:
UCON; registro de control.
UCFG; registro de conguracin.
USTAT; registro de estado de transferencia.
UADDR; registro de direccin del dispositivo.
UFRMH y UFRML; registros de nmero de marco.
UEP0 a UEP15; registros de control de los terminadores.
El medio de intercambio de datos entre el controlador y el SIE es una memoria
de 1Kb de tamao, denominada USB RAM. Se trata de una memoria de 1Kb de
puerto doble, es decir, una memoria que permite accesos simultneos desde dos
dispositivos independientes, cada uno con sus propios buses de direcciones, datos
y seales de control. El puerto correspondiente al controlador est mapeado en los
bancos 4 a 7 de la memoria de datos.
3.6.3. SPP
Este modelo de PIC incorpora un puerto paralelo orientado a ujos de datos, en
ingls Streaming Parallel Port (SPP), pensado para utilizarse como interface de alta
velocidad para intercambiar grandes cantidades de datos con un sistema externo.
El SPP opera como puerto paralelo maestro completo, con seales de control y de
reloj para controlar el dispositivo esclavo conectado a l. Es posible congurarlo de
modo que el control del SPP recaiga sobre la CPU del PIC o sobre el controlador
USB descrito en la seccin anterior.
Compilador de C para el microcontrolador Microchip PIC18F4550 33
Los registros empleados para congurar el SPP son SPPCON, el cual controla el
modo de operacin y determina si el control recae sobre la CPU o sobre el SIE, y
el SPPCFG, que se encarga de la conguracin de temporizacin y de habilitar las
seales de control hacia el exterior. A estos se le suman los registros TRISD, TRISE
y TRISB, que indican en qu modo operarn los pines correspondientes a seales
de datos del SPP.
Cuando el SPP est congurado para que sea la CPU quien lo maneje, el regis-
tro SPPEPS es el que proporciona informacin de estado y control sobre el puerto,
mientras que SPPDATAes el registro objetivo de la lectura/escritura de datos trans-
mitidos a travs del puerto paralelo.
3.6.4. MSSP
El puerto serie sncrono maestro (MSSP) es un interface serie que resulta til para
comunicar el PIC con perifricos externos o con otros microcontroladores. Tiene dos
modos de funcionamiento diferentes: SPI (interface de perifrico serie) o como I
2
C. Los
registros empleados para controlar el MSSP son SSPSTAT, SSPCON y SSPCON2, el
primero de los tres proporciona informacin sobre el estado del mdulo y los dos
restantes cumplen las funciones de control. Los registros encargados de albergar los
datos a enviar o recibir son SSPSR y SSPBUF, mientras que el registro SSPADD es
el responsable de operaciones de direccionamiento cuando el mdulo est congu-
rado en modo I
2
C. Para conocer los detalles de su uso es conveniente acudir a la
seccin correspondiente del datasheet del microcontrolador. Adems, la web de Mi-
crochip contiene diversos ejemplos de aplicacin con cada uno de los modos de este
mdulo.
3.6.5. EUSART
Adems del MSSP, este PIC ofrece un segundo mdulo para comunicaciones se-
rie: el transmisor/receptor sncrono/asncrono universal mejorado (EUSART). Puede fun-
cionar en modos half-duplex y full-duplex, y adems incorpora caractersticas extra
sobre los USART convencionales, como deteccin y ajuste automticos de la tasa de
transferencia.
El control del mdulo EUSART recae sobre tres registros: TXSTA (control y es-
tado de la transmisin), RCSTA (control y estado de la recepcin) y BAUDCON
(control de la tasa de transferencia). El par de registros SPBRGH y SPBRG contro-
lan el perodo empleado por temporizador del generador de smbolos del EUSART.
Una vez que el mdulo est congurado para un modo de funcionamiento, el envo
Compilador de C para el microcontrolador Microchip PIC18F4550 34
comienza con la escritura del dato a enviar en el registro TXREG, mientras que una
recepcin con xito termina con el dato recibido en RCREG.
El proceso para transmitir un dato consta de los siguientes pasos:
1. Inicializar SPBRGH:SPBRG con el valor correspondiente a los baudios desea-
dos para la frecuencia actual del oscilador.
2. Congurar el mdulo EUSART como sncrono o asncrono segn la comuni-
cacin.
3. Habilitar la transmisin activando el bit TXEN de TXSTA.
4. Cargar TXREG con el valor que se desea transmitir. Esto hace que comience la
transmisin.
5. Comprobar el bit TRMT de TXSTA. Cuando est puesto a uno, la transmisin
habr nalizado.
De manera anloga, los pasos a seguir para recepcin son:
1. Inicializar SPBRGH:SPBRG con el valor correspondiente a los baudios desea-
dos para la frecuencia actual del oscilador.
2. Congurar el mdulo EUSART como sncrono o asncrono segn la comuni-
cacin.
3. Habilitar la recepcin activando el bit SREN de RCSTA.
4. Comprobar el bit RCIF de PIR1. Cuando est puesto a uno, la recepcin habr
nalizado y el registro RCREG contendr el dato recibido.
El valor que deber contener el par de registros SPBRGH:SPBRG establece el pe-
rodo del generador de smbolos, produciendo una velocidad en baudios diferente
segn la frecuencia de oscilador empleada. Cada extremo de la lnea de comuni-
caciones serie debe emplear la misma conguracin, de forma que transmisor y
receptor funcionen a la misma velocidad y en el mismo modo para que sea posi-
ble establecer con xito la comunicacin entre ambos. Para determinar el valor de
SPBRGH:SPBRG hace falta conocer la velocidad en baudios a la que debe funcionar
el EUSART. Una vez conocido este detalle, el valor de los registros SPBFGH:SPBRG
se calcula a partir de una de las frmulas siguientes, segn el modo de funciona-
miento en que vaya a trabajar el mdulo EUSART:
Como se deduce de la tabla anterior, el valor de SPBRGH:SPBRG depende tam-
bin del modo empleado para la comunicacin. Cabe destacar que la conguracin
de la comunicacin serie debe ser la misma en ambos extremos de la lnea.
Compilador de C para el microcontrolador Microchip PIC18F4550 35
Bits de conguracin
Modo SPBRGH:SPBRG Baudios
Sync BRG16 BRGH
0 0 0 8-bit asncrono (Fosc/(64*Baud))-1 Fosc/(64*(n+1))
0 0 1 8-bit asncrono
(Fosc/(16*Baud))-1 Fosc/(16*(n+1))
0 1 0 16-bit asncrono
0 1 1 16-bit asncrono
(Fosc/(4*Baud))-1 Fosc/(4*(n+1)) 1 0 x 8-bit sncrono
1 1 x 16-bit sncrono
Cuadro 3.5: Tabla de conguracin del EUSART del microcontrolador PIC18F4550.
Debido al redondeo al entero ms prximo, aparece un porcentaje de error res-
pecto a la tasa de transferencia terica deseada. Una prctica muy recomendable
es realizar la operacin contraria, tomando el valor de SPBRGH:SPBRG como dato
de partida y la tasa de baudios como incgnita, para calcular el error introducido
por el redondeo. Un error demasiado grande producir una desincronizacin entre
emisor y receptor, e imposibilitar la comunicacin entre ellos.
El registro TXSTA es el encargado del control del modo de transmisin. El bit
CSRC indica qu fuente de reloj emplear el EUSART para comunicacin sncrona.
TX9 permite seleccionar entre palabras de 8 o 9 bits. TXEN es el bit que habilita
la transmisin. SYNC, como indica su nombre, es el bit de seleccin entre modo
sncrono o asncrono; este bit tambin afecta al modo de recepcin. SENDB permi-
te forzar el envo, en comunicaciones asncronas, de un caracter de sincronizacin
(Sync Break). El control de la tasa de baudios (alta o baja velocidad) recae en el bit
BRGH. TRMT es un bit de estado, no de control; indica cundo est vaco el buf-
fer de salida. Por ltimo, el bit TX9D del registro TXSTA alberga el noveno bit de la
palabra a enviar cuando el EUSART est congurado para enviar palabras de 9 bits.
Por otro lado, el registro RCSTA controla la recepcin y da informacin sobre la
misma. RX9 indica el tamao de palabra, 8 o 9 bits. El bit SRENhabilita la recepcin
simple en modo sncrono, mientras que CREN habilita la recepcin mltiple, tam-
bin llamada continua. El bit de FERR indica si hubo un error de marco (frame) en la
recepcin, mientras que OERR avisa de que ha habido un error de desbordamiento.
RX9D es el bit anlogo a TX9D: almacena el noveno bit de la palabra recibida, si el
EUSART est trabajando con palabras de 9 bits.
3.6.6. Memoria EEPROM
El 18F4550 dispone de una pequea memoria EEPROM a la que es posible acce-
der, tanto para lectura como escritura, desde el programa en ejecucin. Su tamao
Compilador de C para el microcontrolador Microchip PIC18F4550 36
es reducido, slo 256 bytes. Esta memoria no est mapeada directamente sobre la
memoria de datos; la nica manera de acceder a ella es mediante direccionamiento
indirecto, a travs de varios SFR. EEADR es el registro de direccionamiento para
accesos a la EEPROM. Complementando a ste se encuentra el registro EEDATA;
en l aparecer el dato ledo de la EEPROM tras una operacin de lectura y es el
registro que aloja el dato a cargar en EEPROM con la prxima operacin de escri-
tura. Aparte de estos dos registros, de direccionamiento y datos, respectivamente,
hay dos registros ms, que cumplen las funciones de control de acceso: EECON1 y
EECON2.
EECON1 es un registro de control convencional, con varios bits que cumplen
distintos cometidos; es responsable del control de acceso a las memorias EEPROM,
ash de programa y a los bits de conguracin del PIC. El bit EEPGD selecciona a
memoria accedern las operaciones de lectura/escritura: ash de programa (uno) o
EEPROM de datos (cero). EECFGS determina si los accesos sern a los registros de
conguracin o a alguna de las dos memorias antes mencionadas. WRERR indica
si la ltima operacin de escritura termin con error. WREN es el bit que habilita
la operacin de escritura. La operacin de lectura comienza con la carga de un uno
en el bit RD del registro EECON1; una vez completada la operacin, el hardware del
microcontrolador carga de manera automtica un cero en este bit. La operacin de
escritura tiene un comportamiento anlogo con el bit WR.
El registro EECON2 no es un registro fsico. Su funcin se reduce a hacer de
seguro antes de una operacin de escritura o borrado. La nica manera de efectuar
una escritura es escribir el valor 0x55h en EECON2, acto seguido escribir 0xAAh en
este mismo registro, y, una vez hecho esto, poner a cero el bit WR de EECON1. En
caso de no seguir exactamente esta secuencia, el PIC no ejecutar la operacin de
escritura. Por supuesto, el bit WREN debe estar puesto a uno antes de efectuar estos
pasos. Como precaucin adicional, es muy recomendable tener deshabilitadas las
interrupciones durante la ejecucin de este fragmento de cdigo.
A continuacin, un ejemplo de cmo efectuar una lectura de la EEPROM:
; Cargar EEADR con la direccin deseada.
MOVLW direccin
MOVWF EEADR
; Seleccionar memoria EEPROM de datos.
BCF EECON1, EEPGD
; Activar acceso a memoria especial.
Compilador de C para el microcontrolador Microchip PIC18F4550 37
BCF EECON1, CFGS
; Leer de la EEPROM.
BSF EECON1, RD
; Cargar en W el dato ledo.
MOVF EEDATA, W
El cdigo anterior resulta sumamente sencillo. Comienza con la carga en el regis-
tro EEADR de la direccin de memoria EEPROM a la que acceder en esta operacin
de lectura. Acto seguido, pone a cero el bit EECFGS del registro de control EECON1,
con lo que indica al PIC que el prximo acceso a memoria especial ser a EEPROM
o ash. Lo siguiente es seleccionar la memoria EERPOM, que se consigue poniendo
a cero el bit EEPGD. Por ltimo, inicia la operacin de lectura mediante la puesta a
uno del bit RD. Este fragmento de cdigo concluye con la carga en WREG del dato
ledo de la EEPROM, el cual aparece alojado en EEDATA tras una lectura exitosa.
Un ejemplo prctico de cdigo que efecta una operacin de escritura:
; Mientras no haya terminado la posible
; escritura en proceso, hacer espera activa.
noWR BTFSC EECON1, WR
GOTO noWR
; Cargar EEADR con la direccin deseada.
MOVLW direccin
MOVWF EEADR
; Cargar EEDATA con el dato a almacenar.
MOVLW valor
MOVWF EEDATA
; Seleccionar EEPROM de datos.
BCF EECON1, EEPGD
; Activar acceso a memoria especial.
BCF EECON1, CFGS
; Habilitar las operaciones de escritura.
Compilador de C para el microcontrolador Microchip PIC18F4550 38
BSF EECON1, WREN
; Deshabilitar las interrupciones.
BCF INTCON, GIE
; Paso 1: EECON2 <- 0x55h
MOVLW 0x55
MOVWF EECON2
; Paso 2: EECON2 <- 0xAAh
MOVLW 0xAA
MOVWF EECON2
; Escribir en la EEPROM.
BSF EECON1, WR
; Volver a habilitar las interrupciones.
BSF INTCON, GIE
; Volver a deshabilitar la escritura.
BCF EECON1, WREN
Un primer vistazo de este otro fragmento de cdigo permite ver que las opera-
ciones de escritura resultan algo ms complicadas de efectuar que las de lectura,
sobre todo por las diversas precauciones que hay que tomar, tanto para poder ini-
ciar la escritura en s, como para asegurar que sta se efecta con xito y sin afectar
a una posible escritura en curso.
En primer lugar, hay que comprobar que no haya una operacin de escritura en
proceso, ya que la lectura es inmediata, pero la escritura requiere un tiempo para
completarse. Es el propsito del bucle que comienza en la etiqueta noWR, compro-
bando una y otra vez el bit WR de EECON1 hasta que ste vale cero. Una vez ga-
rantizado que no hay ninguna escritura en proceso, el programa carga en el registro
EEADR la direccin de EEPROM en la que escribir. El siguiente paso es cargar en
EEDATA el valor a almacenar en la EEPROM. Tras estos dos pasos viene la activa-
cin de acceso a memoria especial y la seleccin de memoria EEPROM, instruccio-
nes que tambin aparecen en el cdigo para hacer una lectura de EEPROM. Slo
queda habilitar la escritura antes de proceder a la misma. A continuacin viene la
secuencia de cuatro instrucciones obligatorias para quitar el seguro de la operacin
de lectura, y la puesta a uno del bit WR de EECON1, que es el que da comienzo la
Compilador de C para el microcontrolador Microchip PIC18F4550 39
escritura en memoria EEPROM del dato cargado en EEDATA. Antes de terminar,
este cdigo vuelve a poner a cero el bit WREN, evitando con esto posibles escrituras
accidentales.
3.6.7. Memoria Flash
El manejo de la memoria ash de programa comparte algunos registros con el de
la EEPROM, as como los mecanismos de proteccin contra escritura y borrado.
Los registros de control comunes con la EEPROM son EECON1 y EECON2. Aparte
de estos dos, los registros de acceso a tablas TABLAT y TBLPTR tambin son un
componente esencial del mecanismo de acceso a la ash.
Los bits de EECON1 tienen exactamente el mismo propsito que en el caso de
accesos a EEPROM, salvo el bit 4, que slo sirve para habilitar la operacin borra-
do de una la de memoria ash, y los bits 0 y 1, que no cumplen ninguna funcin
cuando se trata de accesos a la memoria ash de programa. De nuevo, el cometido
de EECON2 se reduce a hacer de seguro antes de una operacin de escritura o bo-
rrado, con la misma secuencia de escrituras (0x55h, 0xAAh) inmediatamente antes
de activar el bit WR de EECON1.
A pesar de que el espacio de memoria ash de programa tiene un ancho de pala-
bra de 16 bits, los accesos a ste desde el programa del PIC slo permiten palabras
de 8 bits (ancho de palabra de la memoria datos). El latch que almacena el dato a
intercambiar con la ash es TABLAT. Por otro lado, la funcin de direccionamiento
recae sobre el registro TBLPTR, de 22 bits. Este registro est compuesto por tres SFR:
TBLPTRU (byte superior), TBLPTRH (byte alto) y TBLPTRL (byte bajo).
Un ejemplo de cdigo para leer una palabra (16 bits) de la memoria ash es el
siguiente:
; TBLPTRU[5:0] <- dir[21:16]
MOVLW dirU
MOVWF TBLPTRU
; TBLPTRH[7:0] <- dir[15:8]
MOVLW dirH
MOVWF TBLPTRH
; TBLPTRL[7:0] <- dir[7:0]
MOVLW dirL
MOVWF TBLPTRL
; Cargar en TABLAT el byte bajo
Compilador de C para el microcontrolador Microchip PIC18F4550 40
; e incrementar TBLPTR.
TBLRD
*
+
; Almacenar en memoria de datos.
MOVFF TABLAT, varL
; Cargar en TABLAT el byte alto.
TBLRD
*
; Almacenar en memoria de datos.
MOVFF TABLAT, varH
El procedimiento para escribir en ash es mucho ms complicado que el de lec-
tura debido a algunas caractersticas de la memoria ash, como el tamao de bloque
para escritura (16 palabras, 32 bytes), el tamao de la para borrado (32 palabras,
64 bytes) o la particularidad de que una escritura realmente slo escriba ceros y que
el borrado de un bloque suponga escribir todos sus bytes con 0xFFh. Por este moti-
vo no es extrao combinar una operacin de escritura con un borrado previo y una
copia en memoria de datos del bloque de 64 bytes de ash que resultar sobreescrito.
La mejor manera de comprender esto es con un ejemplo completo, que inclu-
ya copia en memoria de datos de la la a sobreescribir, modicacin de los bytes
deseados, borrado de la la de ash y escritura, en dos iteraciones, de la misma
con los nuevos valores. El siguiente cdigo reemplaza una palabra de dos bytes en
memoria ash, reemplazando toda una la de 64 bytes:
; Bloque de borrado de 64 bytes.
MOVLW D64
MOVWF Contador
; Cargar puntero a buffer auxiliar.
MOVLW BufferDirH
MOVWF FSR0H
MOVLW BufferDirL
MOVWF FSR0L
; Cargar puntero a bloque de
; memoria Flash.
MOVLW FlashDirU
MOVWF TBLPTRU
MOVLW FlashDirH
MOVWF TBLPTRH
Compilador de C para el microcontrolador Microchip PIC18F4550 41
MOVLW FlashDirL
MOVWF TBLPTRL
LEER_BLOQUE:
; Cargar byte en TABLAT e incrementar TBLPTR.
TBLRD
*
+
; Almacenar en buffer y apuntar a la
; siguiente posicin.
MOVFF TABLAT, POSTINC0
; Si terminado (contador == 0), salir del bucle.
; Si no, siguiente iteracin.
DECFSZ Contador
BRA LEER_BLOQUE
MODIFICAR_PALABRA
; Reemplazar byte bajo del dato en el buffer.
MOVLW NuevoDatoL
MOVWF BuffDatoDirH
; Reemplazar byte alto.
MOVLW NuevoDatoH
MOVWF BuffDatoDirL
BORRAR_BLOQUE
; Cargar de nuevo puntero a bloque de
; memoria Flash.
MOVLW FlashDirU
MOVWF TBLPTRU
MOVLW FlashDirH
MOVWF TBLPTRH
MOVLW FlashDirL
MOVWF TBLPTRL
; Seleccionar Flash de programa.
BSF EECON1, EEPGD
; Activar acceso a memoria especial.
BCF EECON1, CFGS
Compilador de C para el microcontrolador Microchip PIC18F4550 42
; Habilitar las operaciones de escritura.
BSF EECON1, WREN
; Habilitar operacin de borrado de fila.
BSF EECON1, FREE
; Deshabilitar las interrupciones.
BCF INTCON, GIE
; Paso 1: EECON2 <- 0x55h
MOVLW 0x55
MOVWF EECON2
; Paso 2: EECON2 <- 0xAAh
MOVLW 0xAA
MOVWF EECON2
; Comenzar borrado (CPU en espera).
BSF EECON1, WR
; Volver a habilitar las interrupciones.
BSF INTCON, GIE
; Cargar de nuevo el puntero a buffer
; auxiliar.
MOVLW BufferDirH
MOVWF FSR0H
MOVLW BufferDirL
MOVWF FSR0L
; Nmero de bloques de escritura: 2
MOVLW D2
MOVWF Bloque
ESCRIBIR_BUFFER
; Bloque de escritura de 32 bytes.
MOVLW D32
MOVWF Contador
ESCRIBIR_BYTE
Compilador de C para el microcontrolador Microchip PIC18F4550 43
; Copiar byte bajo en latch de tabla.
MOVFF POSTINC0, TABLAT
; Escritura "corta" en flash
; (registros de "hold")
TBLWT
*
+
; Si terminado, salir del bucle;
; Si no, siguiente iteracin.
DECFSZ Contador
BRA ESCRIBIR_BYTE
ESCRITURA_LARGA
; Seleccionar Flash de programa.
BSF EECON1, EEPGD
; Activar acceso a memoria especial.
BCF EECON1, CFGS
; Habilitar las operaciones de escritura.
BSF EECON1, WREN
; Deshabilitar las interrupciones.
BCF INTCON, GIE
; Paso 1: EECON2 <- 0x55h
MOVLW 0x55
MOVWF EECON2
; Paso 2: EECON2 <- 0xAAh
MOVLW 0xAA
MOVWF EECON2
; Comenzar escritura (CPU en espera).
BSF EECON1, WR
; Volver a habilitar las interrupciones.
BSF INTCON, GIE
; Si ltimo bloque, salir del bucle;
; Si no, siguiente bloque.
DECFSZ Bloque
BRA ESCRIBIR_BUFFER
Compilador de C para el microcontrolador Microchip PIC18F4550 44
; Volver a deshabilitar la escritura.
BCF EECON1, WREN
La operacin de escritura en ash tiene otra diferencia ms respecto a la misma
sobre EEPROM: el microcontrolador suspende la ejecucin de instrucciones hasta
que naliza la operacin de escritura en memoria ash. Una vez terminada sta,
reanuda la ejecucin de instrucciones y atiende las interrupciones en caso de que
hubiese alguna activa.
La posibilidad de escribir en la memoria ash, ms all de almacenar datos en el
espacio de memoria de programa, permite modicar parte del programa durante la
ejecucin del mismo para poder ejecutar cdigo nuevo no includo en el momento
de programar del microcontrolador.
3.6.8. Timers
Los timers (temporizadores) son dispositivos cuya funcin se limita a contar. De
forma general, tienen dos modos de funcionamiento: reloj (incrementa un valor con
cada ciclo de instruccin) y contador (el incremento se produce con un anco de
subida o bajada de un cierto pin del microcontrolador).
El 18F4550 incorpora cuatro timers, cada uno con caractersiticas propias. Todos
ellos ofrecen la posibilidad de generar interrupciones cuando llegan al desborda-
miento, es decir, cuando incrementan el valor mximo y pasan al mnimo.
De manera resumida, stas son las caractersticas propias de cada temporizador:
El Timer0 puede funcionar en dos modos: reloj o contador. Ambos modos de
funcionamiento pueden emplear palabras de cuenta de 8 y 16 bits. Como reloj,
incrementa el contenido del par de registros TMR0H:TMR0L (slo TMR0L si
est trabajando en modo de 8 bits) con cada ciclo de instruccin (4 ciclos de
reloj). En modo contador, incrementa TMR0 con cada anco de subida (o ba-
jada, segn est congurado) del pin RA4/T0CKI. En ambos casos es posible
usar un preescalado que divida la frecuencia de incremento.
Como hace mencin el prrafo anterior, son los registros TMR0H y TMR0L
los que almacenan la palabra de cuenta. Estos registros permiten lectura y
escritura, con la particularidad de que una operacin de escritura no tiene
efecto hasta dos ciclos de instruccin despus, por motivos de sincronizacin
de cuenta.
La conguracin de este timer recae sobre el registro T0CON. El bit TMR0ON
activa o detiene la cuenta. T08BIT selecciona entre los modos de cuenta de
Compilador de C para el microcontrolador Microchip PIC18F4550 45
8 y 16 bits. T0CS selecciona qu fuente de reloj emplear, cambiando de esta
forma entre reloj interno (reloj de ciclos de instruccin) y contador (fuente de
reloj externa, pin RA4/T0CKI). El pin PSA activa el preescalado cuando est
puesto a 0. El valor de la divisin de frecuencia viene establecido por los bits
T0PS[2:0].
El Timer1 ofrece las mismas posibilidades que el anterior, salvo que slo ad-
mite palabras de cuenta de 16 bits, permite utilizar como seal de reloj un
oscilador de cristal (comn a Timer3, soporta modo asncrono cuando est se-
leccionada la fuente de reloj externa y, adems, es posible congurarlo para
que reinicie la cuenta cuando alguno de los mdulos comparadores (CCP, tra-
tados en la seccin siguiente) active un disparador de evento especial. Asimis-
mo, este temporizador permite emplear como seal de reloj su propio oscila-
dor interno, compuesto por un cristal de cuarzo externo conectado a los pines
RC0/T1OSO/T13CKI y RC1/T1OSI.
T1CON es el registro de conguracin del Timer1. TMR1ON activa el funcio-
namiento del temporizador. TMR1CS selecciona entre el reloj de ciclos de ins-
truccin y una fuente externa. T1SYNC puesto a 0 indica que la cuenta debe
ser sncrona con la entrada de reloj externa. T1OSCEN es el bit de activacin
del oscilador de cristal del Timer1. Los bits T1CKPS[1:0] seleccionan la prees-
cala de reloj a emplear; si estn puestos a 00, no efecta preescalado.
El Timer2 es un temporizador de 8 bits con preescala y postescala. Slo per-
mite utilizar el reloj de ciclos de instruccin como seal de reloj. Incrementa el
valor de TMR2, con cada anco de subida del reloj. Cuando el valor de TMR2
coincide con el del registro PR2, genera la seal de salida del temporizador e
incrementa en uno el valor del contador de postescalado.
El control de este tercer temporizador recae sobre el registro T2CON. TMR2ON
pone en marcha el contador. Los bits T2CKPS[1:0] son los que controlan la
preescala de la cuenta, mientras que T2OUTPS[3:0] hacen lo propio con el va-
lor de postescalado.
El Timer3 es idntico al Timer1. Ambos son temporizadores/contadores de 16
bits que pueden emplear la seal del reloj de ciclos de instruccin, los ancos
de subida de una seal externa o del oscilador de cristal comn, y efectuar
la cuenta de manera sncrona o asncrona a la seal de reloj seleccionada. El
registro de cuenta de este temporizador es TMR3 y, al igual que con los otros
tres temporizadores, permite lectura y escritura.
Compilador de C para el microcontrolador Microchip PIC18F4550 46
El registro de control de Timer3 es T3CON. TMR3ON pone en marcha el con-
tador. TMR3CS selecciona entre el reloj de ciclos de instruccin y una fuen-
te externa. T3SYNC puesto a 0 indica que la cuenta debe ser sncrona con la
entrada de reloj externa. Los bits T1CKPS[1:0] seleccionan la preescala de re-
loj a emplear; si estn puestos a 00, no efecta preescalado. Adems, el bit
T1OSCEN del registro de control del Timer1 tambin forma parte del control
del Timer3, dado que es el que activa el oscilador de cristal, compartido entre
ambos temporizadores.
3.6.9. Capturador, comparador y modulador de ancho pulso
Los microcontroladores PIC18F4550 incorporan dos mdulos CCP, los cuales tie-
nen tres modos de funcionamiento, como su nombre indica: captura, comparacin
y modulacin de ancho de pulso (PWM). Los tres modos trabajan con valores de
16 bits. Los CCP trabajan asociados a un temporizador segn el modo de funcio-
namiento congurado; los modos de captura y comparacin pueden depender del
Timer1 o del Timer3, mientras que el modo PWM slo permite usar el Timer2.
El registro de control de los CCP es CCPxCON. Los bits CCPxM[3:0] seleccionan
qu modo de funcionamiento tendr el CCP. Adems de estos cuatro, los bits 5 y 4
de CCPxCON, denominados DCxB[1:0], son los bits de menor peso que indican la
duracin del pulso activo cuando este CCP est congurado como modulador de
ancho de pulso.
En modo capturador, el CCP captura el valor del temporizador asociado en el
momento que en detecta un evento en su pin CCPx de entrada. Este evento puede
ser un anco de bajada, de subida, o el cuarto o dcimosexto anco de subida de
la seal de este pin. Hay que tener en cuenta que el temporizador asignado a un
CCP en modo captura debe estar congurado como temporizador o como contador
sncrono; de lo contrario el CCP no har su trabajo.
Como comparador, el CCP compara continuamente el valor del temporizador
asignado con el del par de registros CCPRxH:CCPRxL. Cuando los valores coinci-
den, produce un evento programado previamente, que puede ser poner a uno o a
cero el pin de salida CCPx, conmutar el valor de este mismo pin, generar una in-
terrupcin software o disparar un evento especial que acte sobre otros mdulos,
como por ejemplo el temporizador o el conversor A/D.
Como modulador de ancho de pulso, el CCP produce una onda cuadrada cuyo
periodo viene indicado por el registro PR2 y cuya duracin del pulso activo (alto)
es escrita en el registro CCPRxL y los bits CCPxCON[5:4], siendo estos ltimos los
bits menos signicativos de este valor. Como se ve, es un valor de 10 bits, por lo que
Compilador de C para el microcontrolador Microchip PIC18F4550 47
la palabra total es CCPRxL:CCPxCON[5:4]. Las frmulas para calcular el periodo y
ancho activo son las siguientes:
Periodo = (PR2 + 1) 4 T
OSC
(Preescala)
Pulso = CCPRxL : CCPxCON[5 : 4] T
OSC
(Preescala)
3.6.10. Conversor A/D
El mdulo de conversin analgico-a-digital permite la conversin de un valor anal-
gico a uno digital de 10 bits, tomando un valor analgico de referencia como m-
ximo y otro como mnimo. Tiene trece canales de entrada en los pines AN[12:0],
los cuales estn multiplexados sobre la entrada del conversor A/D. El valor de re-
ferencia mximo puede ser la tensin de alimentacin positiva V
DD
o la tensin
aplicada al pin RA3/AN3/V
REF+
. De manera anloga, el valor de referencia m-
nimo puede ser la tensin de alimentacin negativa V
REF
o la aplicada al pin
RA2/AN2/V
REF
. Este mdulo permite, asimismo, la posibilidad de operar mien-
tras el 18F4550 se encuentra en modo de reposo, con la limitacin de que, para
hacerlo, el reloj de conversin A/D debe derivar del oscilador RC interno del con-
versor.
La conguracin del conversor A/D recae sobre tres registros: ADCON0, AD-
CON1 y ADCON2. El registro de control ADCON0 contiene los bits de seleccin de
canal, CHS[3:0]. Adems es estos, incorpora el bit de estado de la conversin, GO,
que inicia el proceso de conversin y permanecer puesto a uno mientras sta no
haya terminado; una vez completada la conversin, este bit pasa automticamente
a valer cero. El bit ADON es el que habilita o deshabilita el mdulo conversor. El
registro ADCON1 contiene los bits para conguracin de la tensin de referencia,
VCFG1 para la referencia negativa y VCFG0 para la positiva, as como los bits de
conguracin de puertos A/D, PCFG[3:0]. Por ltimo, ADCON2 contiene los bits
de seleccin de reloj para la conversin A/D, ADCS[2:0]; los bits de seleccin de
tiempo de adquisicin, ACQT[2:0]; y el bit de formato para el resultado, ADFM,
que indica si el resultado estar justicado a izquierda o derecha.
Los registros donde el conversor almacena el resultado de la conversin son
ADRESH y ADRESL. El resultado puede estar en ADRESH[1:0]:ADRESL[7:0] o, por
el contrario, ADRESH[7:0]:ADRESL[7:6], segn indique el bit ADFM. El resto de bits
valdrn cero.
Los pasos necesarios para leer un valor analgico utilizando el mdulo A/D
Compilador de C para el microcontrolador Microchip PIC18F4550 48
pueden resumirse en los siguientes:
1. Congurar pines A/D para la entrada deseada.
2. Seleccionar tensiones de referencia.
3. Seleccionar fuente de reloj.
4. Seleccionar canal de entrada.
5. Habilitar mdulo A/D.
6. Iniciar conversin (GO <- 1).
7. Espera activa mientras GO=1.
8. Resultado almacenado en ADRESH:ADRESL.
Hay que aadir una precaucin muy importante a la hora de efectuar el procedi-
miento descrito. La conversin A/D no puede activarse justo despus de habilitar
el mdulo conversor. Es necesario esperar un tiempo para dejar que el condensa-
dor de mantenimiento, C
HOLD
, alcance la tensin que hay aplicada en el canal de
entrada analgica. Este tiempo recibe el nombre de tiempo de adquisicin, T
ACQ
, y
es la suma del tiempo de establecimiento del amplicador de entrada, el tiempo de
carga de C
HOLD
y un coeciente que depende de la temperatura. En el caso de em-
plear una impedancia de la fuente R
S
de 2.5K, valor mximo recomendado para
fuentes analgicas, un C
HOLD
de 25pF, y que la temperatura mxima de funciona-
miento sea de 85
C y 85