Logo Studenta

Arquitectura y programacion de microcontroladores PIC

¡Este material tiene más páginas!

Vista previa del material en texto

1 
 
 
 
 
ARQUITECTURA Y 
PROGRAMACION DE 
MICROCONTROLADORES PIC 
 
 
 
 
 
 
 
Andrés R. Bruno Saravia 
Ariel Coria 
 
 
 
 
 
 
2 
 
 
 Arquitectura y Programación de Microcontroladores PIC. 
 Andres R. Bruno Saravia y Ariel Coria. - 2a ed. - Buenos Aires. El autor, 2010. 
 400 p.: 22x15 cm. 
 
 ISBN: 000-000-00-0000-0 
 
 1. Electrónica. 2. Microchips. 
 CDD 621.381 5 
 
 
Fecha de catalogación: Junio 2010 
 
© mcelectronics 
 
Hecho el depósito que marca la ley 11.723 
Todos los derechos reservados. 
 
Ninguna parte de este libro, incluido el diseño de la portada, puede reproducirse, almacenarse o 
transmitirse de ninguna forma ni por ningún medio, sea este eléctrico, químico, mecánico, óptico, 
de grabación o de fotocopia, sin la previa autorización escrita por parte de mcelectronics. La 
infracción de los derechos mencionados puede ser constitutiva de delito contra la propiedad 
intelectual. 
 
La editorial no se pronuncia ni expresa implícitamente respecto a la exactitud de la información 
contenida en este libro, razón por la cual no puede asumir ningún tipo de responsabilidad en caso 
de error u omisión. 
 
Las marcas mencionadas son propiedad exclusiva de sus registradores legales. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3 
 
 
LOS AUTORES 
 
 
Andrés Raúl Bruno Saravia 
andres.saravia@mcelectronics.com.ar 
 
Tiene una amplia experiencia docente, se ha desempeñado como Profesor de 
Microcomputadoras desde 1992 hasta 1997, Profesor de Automatizaciones y 
Electrónica Industrial desde 2002 hasta 2006, y como Profesor con dedicación 
exclusiva de Microcontroladores PIC desde el año 2006 al presente. Es Training Partner 
de Microchip y dirige el Centro Regional de Entrenamiento Argentina desde el año 
2008. Ha escrito diferentes trabajos: Manual de Microcontroladores PIC16F87X, 
Manual de Microcontroladores PIC Línea BASE, Programación de Microcontroladores 
PIC en Assembler y Manual de PICBASIC para MCU PIC. 
 
 
Ariel Coria 
ariel.coria@mcelectronics.com.ar 
 
Es estudiante avanzado de la carrera de Ingeniería Electrónica en la Universidad de 
Buenos Aires con especialidad en sistemas de control. Posee sólidos conocimientos de 
programación en C orientado a microcontroladores PIC y sistemas embebidos. 
Actualmente está encargado del departamento de soporte de la empresa 
mcelectronics, donde ha participado en el desarrollo de herramientas de 
entrenamiento. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4 
 
 
5 
 
 
 
 
INTRODUCCIÓN 
 
 
 
Luego de 8 meses de redacción, edición, diseño y corrección estamos orgullosos de 
poder presentar nuestro primer libro. 
 
Para realizar esta obra hemos repartido el trabajo entre 2 autores, un docente 
certificado por Microchip, el cual posee un reconocido historial en el dictado de 
seminarios de entrenamiento, y que esta avocado exclusivamente a los 
microcontroladores PIC, y la experiencia de un desarrollador, ampliamente 
experimentado en el diseño de aplicaciones embebidas para MCU PIC18F en lenguaje 
C18 y que esta certificado también por Microchip. 
 
 
El texto ha sido dividido en 3 grandes partes. En la primera, hacemos una descripción 
profunda del hardware que forma al microcontrolador PIC18, detallando las 
características técnicas y funcionamiento de su nuevo núcleo, los nuevos tipos de 
osciladores, la utilización de interrupciones y el manejo de la memoria de programa y 
de datos. Luego realizamos un detalle pormenorizado de cada uno de sus periféricos 
desde los puertos, hasta las unidades de comunicación seriales. Para todo esto hemos 
utilizado como modelo el PIC18F4620, el cual, por sus características engloba la mayor 
cantidad de periféricos y a un muy bajo costo. De esta forma el lector podrá adquirir el 
mismo o aplicar el conocimiento de esta unidad para entender el de otras, ya que la 
gran característica de los microcontroladores PIC es que sus periféricos son iguales, lo 
mismo que la operación de sus núcleos, solo cambian la cantidad de periféricos que 
integran, o memoria de programa y datos, entre los diversos modelos que existen. 
 
 
En la segunda parte, y luego del gran detalle del hardware, introduciremos al lector en 
el conocimiento del lenguaje de programación C, aplicado al campo de los 
microcontroladores PIC. Este capítulo es esencial para aprender las reglas 
fundamentales que rigen a este lenguaje de programación. De forma clara y sintética 
le explicamos lo que usted necesita saber para poder entender y programar en 
lenguaje C. 
 
 
En la tercera parte aplicamos los conocimientos adquiridos durante todo el libro de 
forma práctica y amena. Iniciamos con una descripción rápida de las características del 
compilador C18 y de las librerías que Microchip ha desarrollado para facilitarle al 
programador el desarrollo de aplicaciones. Luego describimos una serie de ejemplos 
que han sido desarrollados sobre placas de entrenamiento, haciendo una 
6 
 
 
 
descripción detallada del algoritmo y la especificación del hardware, incluyendo los 
circuitos y el listado de programas con descripciones línea a línea de cada instrucción. 
 
Hemos elegido ejemplos que parten desde lo más sencillo como encender un LED 
hasta lo más complejo como realizar un sistema de adquisición de datos con control 
por LCD y USB. Los ejemplos crecen gradualmente en su nivel de complejidad, 
manteniendo en todos los casos una profunda descripción de los mismos. 
 
Esperamos que este libro cumpla con los principios a partir de los cuales se gestó: 
enseñar a programar PIC18F en lenguaje C de forma clara y sencilla. 
 
Por favor no dude en hacernos llegar sus comentarios a info@mcelectronics.com.ar 
 
 
 
El equipo de mcelectronics 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
PROGRAMAS NECESARIOS A LO LARGO DE LA OBRA 
 
Para poder compilar los programas propuestos necesita el entorno de desarrollo MPLAB y el compilador C18 
de Microchip. Ambos se pueden obtener en forma gratuita desde la web del libro: 
 
www.mcelectronics.com.ar/techtrain 
7 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
A John Magrane, James Baldwin y Stu Chandler de Microchip Technology. 
A los alumnos que a lo largo de estos años contribuyeron con sus invaluables aportes. 
A nuestras familias y amigos por el apoyo incondicional. 
8 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9 
 
 
SUMARIO 
 
EL MICROCONTROLADOR PIC18F4620 11 
FUNCIONES DEL OSCILADOR 15 
CONTROL DE ENERGIA 29 
CIRCUITO DE RESET 43 
ORGANIZACIÓN DEL LA MEMORIA 51 
MEMORIA DE DATOS EEPROM 73 
MEMORIA FLASH DE PROGRAMA 79 
MULTIPLICADOR POR HARDWARE 90 
PUERTOS DE ENTRADA-SALIDA 91 
INTERRUPCIONES 105 
MODULO TIMER0 119 
MODULO TIMER1 125 
MODULO TIMER2 135 
MODULO TIMER3 141 
MODULOS CAPTURA/COMPARACION/PWM (CCP) 147 
MODULO MEJORADO (ECCP) 159 
MODULO PUERTO SERIE SINCRONICO MAESTRO 177 
EUSART 211 
CONVERSOR ANALOGICO DIGITAL 235 
MODULO COMPARADOR 249 
MODULO COMPARADOR DE LA TENSIÓN DE REFERENCIA 259 
PROGRAMACION EN LENGUAJE C 265 
EL COMPILADOR C18 293 
GUIA VISUAL MPLAB 313 
PRACTICAS EN C 329 
 
 
 
Incluye prácticas básicas y avanzadas para realizar con la placa MCE Starter KIT Student 
Advanced. Puede encontrar el código fuente completoy programas adiconales en: 
 
 
www.mcelectronics.com.ar/techtrain 
 
usuario: su dirección de email* 
clave: 20062010 
 
 
* Para registrarse, por favor remita su dirección de email junto con nombre y apellido a: 
 info@mcelectronics.com.ar
10 
 
 
11 
 
 
1. EL MICROCONTROLADOR 
PIC18F4620 
 
HISTORIA Y EVOLUCIÓN DE LOS PIC18 
 
Hacia finales del siglo XX (1999) Microchip se encamina a transformarse en el Lider 
indiscutible de los microcontroladores de 8 Bits. El PIC16F84 revolucionó el campo de 
los microcontroladores y la familia PIC16F87X potenció la evolución de los sistemas de 
control embebido. Pero el gran salto final lo produce la compañía al responder a una 
necesidad de mercado, los PIC18. Esta familia, resultado de la convergencia de las 
tecnologías usadas en las familias PIC16 y PIC17, provocó la segunda revolución 
tecnológica iniciada con el PIC16F84. 
 
Dentro de la familia PIC18 contamos con microcontroladores específicos para 
conectividad USB y Ethernet, así como con micros de propósito general como el 
PIC18F4620 en el cual centraremos nuestro estudio. 
 
El PIC18F4620 se encuentra dentro de una serie de PICs con características similares 
conformada por estos 4 dispositivos: 
 
PIC18F2525 
PIC18F2620 
PIC18F4525 
PIC18F4620 
 
Esta serie es una remake del camino evolutivo de la primera familia de PIC18C 
fabricada y presentada al mercado por Microchip en Junio de 1999. La serie original 
estuvo formada por 4 dispositivos básicos: 
 
PIC18C242 
PIC18C252 
PIC18C442 
PIC18C452 
 
Los cuales rápidamente fueron transformados a versiones FLASH en 2002 pasando a 
llamase PIC18FXX2 (PIC18F242/252/442/452). 
En Septiembre del año 2004 Microchip presenta al mercado su nueva renovación de la 
familia originaria, los PIC18F2420/2520/4420/4520, y en Junio de ese año se anuncia 
también la inserción al mercado de los PIC18F2525/2620/4525/4620. 
 
12 
 
 
1.0 CARACTERÍSTICAS GENERALES: 
 
La primera familia PIC18 introdujo grandes reformas al núcleo PIC para satisfacer las 
demandas de mercado. La primera fue la memoria de programa la cual en PIC16 se 
encontraba segmentada en una estructura de página de 2048 [2K] posiciones cada 
una. Esta familia solo podía llegar a direccionar hasta 8096 [8K] posiciones de memoria 
de programa pero de forma indirecta auxiliada por un registro denominado PCLATH. La 
estructura provocaba una cierta complejidad en el manejo de programas de más de 2K 
a lo cual Microchip tomo nota y por ello al diseñar PIC18 lo modificó. 
 
En algunos dispositivos podemos trabajar no solo con memoria de programa interna 
sino también con memoria de programa externa. PIC18 incorpora por tanto un 
Contador de Programa en la cual se pueden direccionar hasta 1024K [1M] en forma 
lineal, sin una estructura paginada, es decir más de un millón de instrucciones. Además 
la arquitectura se diseño pensando en programar los dispositivos con lenguajes de 
alto nivel como C, por lo cual expandió la memoria de datos hasta 4Kbytes y la diseñó 
de forma tal de poderla trabajar tanto en modo banqueado como en modo lineal 
(esto último a través de los registros internos FSR). Las reformas le dan capacidad al 
usuario para controlar el STACK del Contador de Programa en las subrutinas. 
 
 
Además se amplió el set de instrucciones de 35 que había en la familia PIC16 a las 74 
que podemos encontrar ahora en PIC18. Estas nuevas instrucciones facilitan las 
operaciones lógicas al incorporar muchos más saltos condicionales y la posibilidad de 
realizar multiplicaciones por hardware. 
 
 
A nivel periféricos la potencia fue máxima, se introdujeron hasta 5 Timers, 2 UARTS, 2 
SPI, 2 I2C, la memoria EEPROM de datos tiene una capacidad de 1024 bytes, la 
memoria de programa puede almacenar tanto datos como instrucciones, se 
introdujeron nuevos periféricos de comunicaciones como puerto USB, CAN y hasta 
Ethernet en los dispositivos más grandes que llegan a tener hasta 100 terminales. La 
revolución de la familia PIC18, iniciada hace ya 10 años continua empujando la 
aparición de nuevos dispositivos, y provoca la generación de nuevas remakes en la 
familia PIC16 como los PIC16F88X que incorporan muchas de las características a nivel 
periférico de PIC18 y la aparición de los nuevos PIC Línea Media Mejorada como los 
PIC161XXX que son una adaptación de PIC18 en los PIC16. 
 
Para programar PIC18, Microchip diseño un compilador en Lenguaje C basado en las 
características del Hardware y que fue concebido conjuntamente con la arquitectura 
de PIC18. De esta forma se logra una integración entre hardware y software que 
permite optimizar los tiempos de procesamiento haciendo posible la utilización del 
lenguaje C, incluso en aplicaciones de control automático. 
 
El compilador de C desarrollado por Microchip se llama MCC18 o simplemente C18. El 
mismo se caracteriza por ser un compilador ANSI C estricto a tal punto que el 
13 
 
desarrollador de computadoras que trabaja en C puede realizar un programa sobre 
C18 sin mayores conocimientos sobre el hardware de los PIC. 
A partir de PIC18 la electrónica evoluciona hacia una nueva era en la tecnología del 
control embebido. 
 
 
1.1 DESCRIPCIÓN DEL PIC18F4620 
 
A continuación comenzaremos a describir las características del PIC18F4620, iremos de 
lo general a lo particular. Comenzaremos por hacer una descripción de sus capacidades 
en el núcleo del procesador y luego de sus periféricos: 
 
Características generales del Procesador: 
 
• Memoria de Programa: 32K Word para almacenar Instrucciones. 
• Memoria de Datos: 3968 bytes 
• Puertos I/O: 36 
• Canales ADC: 13 
• Módulos CCP/ECCP: 1/1 
• Módulos de comunicaciones: SPI, I2C, EUSART 
• Timers: 1 de 8 bits, 3 de 16 bits 
• Comparadores integrados: 2 
 
PIN OUT: 
 
 
 
Nota: si bien el PIC18F4620 tiene 36 Puertos I/O, el PORT RE3, multiplexado con el 
terminal de MCLR, puede operar solo como puerto de entrada. 
14 
 
 
15 
 
 
 
 
 
 
22. 
PROGRAMACIÓN EN 
LENGUAJE C 
 
 
EN ESTE CAPITULO 
 
22.0 INTRODUCCIÓN A LA PROGRAMACION EN LENGUAJE C 
22.1 ESTRUCTURA BÁSICA DE UN PROGRAMA EN LENGUAJE C 
22.2 COMENTARIOS 
22.3 REPRESENTACIÓN NUMÉRICA Y ALFANUMÉRICA 
22.4 TIPOS DE DATOS 
22.5 MODIFICADORES DE TIPOS DE DATOS 
22.6 DECLARACIÓN DE VARIABLES 
22.7 DECLARACIÓN DE TABLAS (MATRICES) 
22.8 MATRICES 
22.9 MODIFICADORES DE TIPO DE ACCESO 
22.10 FUNCIONES 
22.11 VARIABLES 
22.12 OPERADORES 
22.13 PRECEDENCIA DE DOS OPERADORES 
22.14 MODELADOR CAST 
22.15 COMANDOS CONDICIONALES 
22.16 COMANDO FOR 
22.17 COMANDO BREAK O CONTINUE 
22.18 GOTO 
22.19 ESTRUCTURAS Y UNIONES 
22.20 UNIONES 
22.21 TYPEDEF 
22.22 CREACIÓN DE LIBRERÍAS 
16 
 
 
17 
 
22 INTRODUCCIÓN A LA PROGRAMACION EN LENGUAJE C 
 
22.1 ESTRUCTURA BÁSICA DE UN PROGRAMA EN LENGUAJE C 
 
Un programa en C consiste en una o varias “Funciones”. Basado en está afirmaciones 
debe existir un mecanismo que garantiza que todos los programas inicialicen de una 
misma forma, por lo tanto hay una función que debemos llamar main (). 
 
 Sintaxis: 
 main() //primera función a ser ejecutada 
 { // inicío del cuerpo de la función 
 
 <comandos>; // otras funciones pueden ser adicionadas 
 } // fin del cuerpo de la función 
 
Vale nombrar también que existen algunas reglas básicas que deben ser seguidas en 
relación a los conceptos de lenguaje. 
Toda función de C debe ser iniciada por una llave ( { ) y cerrada por otra llave( } ). 
Los paréntesis y las llaves son elementos obligatorios de una función. 
Todas las instrucciones deben estar dentro de dos llaves. 
Las instrucciones en C siempre encerradas por un punto y coma (;). 
Vale nombrar también que las llaves sirven para separar un bloque de instrucciones. 
 
22.2 COMENTARIOS 
 
Existen dos maneras de comentar en C. Podemos usar “ // ” que sirve para comentar 
una linea o usar “ /* ” y “ */” para comentar un bloque de comentarios. 
 Ejemplo: 
 
/* MCElectronics-Fabricante de Herramientas para PIC 
 Este es un ejemplo de comentario. */ 
 
Char contador ; // contador de uso general 
 
En el ejemplo insertamos un comentario usando /* y */ para las lineas.En el segundo 
ejemplo usamos para comentar // para comentar la declaración de una variable 
contador. 
 
IDENTIFICADORES 
 
Un identificador es una palabra usada para declarar una constante o una variable. 
Algunas reglas para los identificadores: 
Un identificador no puede tener símbolos gráficos, con excepción de un (_). 
No puede tener acentuación gráfica( acento grave, acento agudo, tilde etc). 
Un identificador no puede iniciar nunca con un número. 
No puede ser una palabra reservada pues ella son sólo uso estricto del compilador. 
 
18 
 
PALABRAS RESERVADAS DEL LENGUAJE C 
 
Auto break case char const continue 
Default do double else enum extern 
Flota for goto if int long 
Register return short signed sizeof static 
Struct swich typedef union unsigned void 
Volatile while 
 
Otras palabras pueden ser reservadas, como nombres de directivas especificas de cada 
compilador. 
 
 
22.3 REPRESENTACIÓN NUMÉRICA Y ALFANUMÉRICA 
Las constantes pueden ser representadas conforme a los siguientes ejemplos: 
 
TABLA 22.1 – REPRESENTACIÓN NUMÉRICA EN LENGUAJE C 
 
Representación numérica Ejemplo 
Decimal 250 
Hexadecimal 0x55 
Binario 0b10100011 
Octal 073 
Caracteres “&” 
String “teste” 
 
22.4 TIPOS DE DATOS 
 
La siguiente tabla nos muestra los tipos de datos soportado por el compilador C18. 
 
TABLA 22.2 TIPOS DE DATOS EN EL COMPILADOR C18 
 
Tipo Tamaño Mínimo Máximo 
char 8 -128 127 
int 16 -32768 32767 
short 16 -32768 32767 
long 32 -2^31 -2^31-1 
float 32 -3,4 x 10^38 3,4 x 10^38 
double 64 -1,8 x 10^308 1,8 x 10^308 
void 0 Sin valor Sin valor 
 
 
 
 
 
19 
 
 
 
 
23. 
COMPILADOR C18 
 
 
EN ESTE CAPITULO 
 
23.0 MPLAB C18 
23.1 CARACTERÍSTICAS DEL COMPILADOR C18 
23.2 ESTRUCTURA DEL DIRECTORIO DEL MPLAB C18 
23.3 FUNCIONES ESTÁNDAR DEL LENGUAJE C EN MPLAB C18
20 
 
 
21 
 
23.0 MPLAB C18 
 
23.1 CARACTERÍSTICAS DEL COMPILADOR C18 
 
El MPLAB C18 es el compilador de Microchip para sus PIC18 y tiene un lenguaje 
bastante similar al lenguaje C convencional, excepto que se le han agregado diversas 
adaptaciones para volverlo mas apropiado para el ambiente de programación de los 
PIC. 
 
Este compilador se maneja perfectamente dentro del entorno visual del MPLAB y sus 
características son: 
 
- Solo se utiliza para los PIC18 
- Posee las funciones estándar del lenguaje C 
- Permite la inclusión de lenguaje ensamblador 
- Soporta interrupciones. 
- Esta optimizado para la arquitectura de los PIC18 
- Contiene librerías para comunicaciones SPI, I2C, USART y periféricos externos como 
 LCD inteligentes 
- Como utiliza el MPLAB, el entorno de programación es similar al que estuvimos 
 trabajando en assembler. 
- Versión estudiantil gratuita 
 
Todas estas características hacen del compilador MPLAB C18 una herramienta ideal 
para los desarrollos que podamos realizar con los PIC18. 
 
23.2 ESTRUCTURA DEL DIRECTORIO DEL MPLAB C18 
 
Al instalar el MPLAB C18 en la PC, este se instala por defecto en el directorio 
C:\MCC18. 
Luego se crean las siguientes carpetas que contienen los archivos necesarios para 
utilizar el compilador. 
 
h: Este directorio contiene los archivos de cabecera (header files) de la librería 
estándar de C y los archivos con las especificaciones del procesadores PIC de 
 
lib: Contiene las librerías estándar del lenguaje C (clib.lib o clib_e.lib), las propias del 
los microcontroladores PIC (p18xxxx.lib o p18xxxx_e.lib donde xxxx especifica el 
dispositivo) y los módulos start-up (c018.lib, c018_e.lib, c018i.lib, c018i_e.lib, 
c018is.lib, c018iz_e.lib) 
 
lkr: Contiene los archivos que utilizara el enlazador del lenguaje (Linker Script files) 
 
mpasm: contiene los archivos de cabecera que utiliza el ensamblador MPASM para los 
dispositivos soportados por el compilador MPLAB C18. 
 
22 
 
23.3 FUNCIONES ESTÁNDAR DEL LENGUAJE C EN MPLAB C18 
 
El compilador MPLAB C18 soporta muchas de las funciones que posee la biblioteca 
estándar de ANSI C y podemos incluirlos en nuestro código fuente con la simple 
inclusión del archivo de cabecera asociado a esa función. En este capitulo haremos un 
repaso de las funciones que mas nos interesa. 
 
23.3.1 FUNCIONES DE LA BIBLIOTECA <ctype.h> 
 
Esta biblioteca contiene funciones útiles para realizar operaciones lógicas con 
caracteres. 
 
Isalnum 
 
Function: Isalnum 
 
Prototipo: unsigned char isalnum( unsigned char ch ); 
 
Descripción: retorna un valor distinto de cero si "ch" es una letra minúscula "a-z" o 
mayúscula "A-Z", uno de los dígitos decimales "0-9" o cualquier otro carácter 
alfabético local. 
 
Archivo: isalnum.c 
 
Ejemplo: control = isalnum(65); // en este caso control sera // distinto de 
cero 
 
Isdigit 
 
Función: Isdigit 
 
Prototipo: unsigned char isdigit( unsigned char ch ); 
 
Descripción: Retorna un valor distinto de cero si "ch" es cualquiera de los dígitos 
decimales (0-9). 
 
Archivo: isdigit.c 
 
Ejemplo: unsigned char Decimal,c = ‘5’; 
 
 Decimal = isdigit(c); 
 
 
 
 
 
 
23 
 
23.3.2 FUNCIONES DE LA BIBLIOTECA <math.h> 
 
Esta biblioteca contiene funciones para las operaciones matemáticas básicas y muchas 
de ellas hacen uso de números en coma flotante. 
 
acos 
 
Función: acos 
 
Prototipo: float acos (float x); 
 
Descripción: Retorna el arcocoseno en radianes de la variable x, que debe tener un 
valor entre -1 y 1. El valor de retorno esta comprendido entre 0 y π. 
 
Archivo: acos.c 
 
Ejemplo: float radianes,resultado; 
 
 resultado = acos(radianes); /*Retorna el arcocoseno de la variable 
radianes*/ 
 
 
cos 
 
Función: cos 
 
Prototipo: float cos (float x); 
 
Descripción: Esta función calcula el coseno de la variable x (en radianes), el valor de 
retorno estará comprendido entre -1 y 1. 
 
Archivo: cos.c 
 
Ejemplo: float coseno; 
 Coseno = cos(1); 
 
 
asin 
 
Función: asin 
 
Prototipo: float asin( float x ); 
 
Descripción: Esta función calcula la inversa del seno (arcoseno) del argumento x, 
que debe estar entre -1 y +1. El valor devuelto es el arcoseno en radianes, y está entre 
-π/2 y π/2.Argumentos fuera del rango puede producir errores de dominio y el 
resultado devuelto es NaN 
24 
 
 
 
25 
 
 
 
25. 
PRÁCTICAS Y ESQUEMÁTICOS 
 
 
EN ESTE CAPITULO 
 
PRÁCTICA 1 LED 
PRÁCTICA 2 PARPADEO 
PRÁCTICA 3 ROTACIÓN 
PRÁCTICA 4 DEBOUNCE 
PRÁCTICA5 CONTADOR DECIMAL 
PRÁCTICA 6 CONTADOR DECIMAL DE 2 DIGITOS 
PRÁCTICA 7 MENSAJES AL LCD 
PRÁCTICA 8 CONTADOR DE 5 DÍGITOS 
PRÁCTICA 9 RELÉ TEMPORIZADO 
PRÁCTICA 10 PWM 
PRÁCTICA 11 LED RGB 
PRÁCTICA 12 RELOJ DE TIEMPO REAL 
PRÁCTICAS 13 Y 14 SENSOR DIGITAL DE TEMPERATURA CON USB 
PRÁCTICA 15 MULTIPLEXADO DE CANALES ANALÓGICOS 
PRÁCTICA 16 ESCRITURA EN MEMORIA EEPROM INTERNA 
 
 
 
 
 
 
 
 
 
Recuerde que puede descargar el código fuente de estas prácticas registrándose en 
www.mcelectronics.com.ar/techtrain
26 
 
 
27 
 
25.0 PRACTICAS 
 
En esta segunda parte del libro pretendemos que aplique los conocimientos teóricos 
obtenidos hasta ahora en ejercicios prácticos que puedan ser simulados en la placa de 
enseñanza MCE Starter KIT Student y MCE Starter KIT Student Advanced. Estos 
ejercicios afianzaran sus conocimientos sobre la programación en C18 y aprenderá de 
manera simple y efectiva el manejo de periféricos externos como el Display LCD. 
 
 
PRACTICAS BÁSICAS 
 
PRACTICA 1 - LED 
 
Comenzamos con la serie de ejercicios y en esta primera práctica realizaremos el 
ejercicio simple de encender un led. Lo que buscamos con este ejercicio es mostrar 
cual será la estructura básica de un programa en C18. 
 
Ejercicio 1: Encender el led 7 de la matriz de Led’s de la placa MCE Starter KIT Student y 
Student Advanced con el PIC18LF4620. 
 
Figura 1: Circuito esquemático de la practica 1. 
 
 
28 
 
 
Solución 
 
/* Bits de Configuracion */ 
 
#pragma config OSC = XT 
#pragma config WDT = OFF, LVP = OFF, MCLRE = ON 
 
/* Includes */ 
#include "p18f4620.h" // Archivo de cabecera 
// Este archivo contiene los registros que utilizaremos del micro 
 
/*Programa Principal*/ 
 
void main (void) 
{ 
 
 TRISB = 0b01111111; // Configuro bit 7 del Port B como 
 // salida, los demas son entradas. 
 LATBbits.LATB7 = 1; // Enciendo Led a traves del bit 7 
 // del registro LATB. 
 while (1) 
 ; // Loop infinito 
 
} 
 
 
Análisis 
 
Antes de comenzar un programa o un proyecto con PIC, debemos tener en claro cuales 
van a ser los recursos o periféricos que vamos a utilizar del microcontrolador. Estos 
recursos los configuramos a través de los “Bits de Configuración” y podemos definirlos 
en el código fuente. Es una buena práctica configurar los recursos de esta manera ya 
que nos elimina el tedioso proceso de realizar las configuraciones en el momento de la 
grabación. 
 
La directiva que nos permite modificar estos bits que se encuentran en posiciones 
especificas de la memoria de programa es #pragma config. Esta directiva posee una 
serie de sentencias que nos permite definir, por ejemplo, cual será el oscilador a 
utilizar o si queremos deshabilitar el “Perro Guardián” como lo hicimos en el ejemplo. 
 
Observe que con la expresión OSC=XT definimos un oscilador de cristal de baja 
frecuencia como el que posee la placa Student Advanced, de 4MHz, con LVP=OFF 
deshabilitamos la programación de bajo voltaje, con WDT=OFF apagamos el perro 
guardián y con MCLRE=ON habilitamos al pin 1 del microcontrolador como pin de 
reset. 
 
29 
 
El programa comienza definiendo ademas los registros del procesador con la directiva 
#include, esta directiva incorpora el archivo de cabecera o Header p18f4620.h a 
nuestro proyecto. Este archivo posee las definiciones de los registros que utiliza el 
procesador del PIC. Todos los programas en C deben comenzar con la función main, el 
cual lo definimos de la forma 
 
 void main (void) 
 { 
 //Sentencias del programa principal 
 } 
 
Dentro de la función main se declaran las sentencias principales, las cuales van a 
conformar el cuerpo del programa. 
 
Los prefijos void indican que la función no retornara ningún valor y tampoco tomara 
ningún argumento. De esta manera indicamos al compilador que la función principal 
(main) realizara un “proceso” que no devolverá ningún valor. 
 
Una vez que definimos la función principal, comenzamos el bloque de instrucciones en 
donde inicializamos el registro TRISB indicándole que la única salida del Port B será el 
pin 7. La directiva 0b indica al compilador que la constante que se escribirá debe 
tomarlo como un dato binario, esta es una manera de cargar un registro directamente 
con su valor en binario. 
 
Encendemos el led asignando un 1 a la variable LATBbits.LATB7 que controla los latch 
de salida de los puertos y nos quedamos en un loop infinito con la sentencia while (1); 
 
La sintaxis de la sentencia while es 
 
 while (expresión) Sentencias 
 
Mientras la expresión sea verdadera, se ejecutara el bloque de sentencias que 
conforman el While, pero si la expresión es falsa salimos del ciclo continuando con 
nuestro programa. 
 
Para el Compilador C18, si el resultado de la expresión es igual a cero, lo tomara como 
false (falso), pero cualquier resultado distinto de cero lo tomara como True 
(Verdadero), en nuestro caso la expresión de nuestro código es 1, que siempre será 
verdadero, esta es una manera elegante de generar un loop infinito en C. 
 
Con esta práctica pretendemos que aprenda de manera simple cual será la estructura 
básica de un programa en C18, en la cual pudimos identificar donde colocar el bloque 
de instrucciones principales, los bits de configuración y como incluir el archivo de 
cabecera que posee la definición de los registros del microcontrolador. 
 
 
30 
 
 
PRACTICAS 13 y 14 - SENSOR DIGITAL DE TEMPERATURA 
 
Con lo aprendido hasta ahora en estas prácticas podemos realizar diversos proyectos. 
El que mostramos ahora tiene muchas aplicaciones y se trata del sensor digital de 
temperatura. 
 
Ejercicio: Crear un programa para sensar la temperatura entregada por el dispositivo 
TC1047. Este dispositivo analógico entregara una determinada tensión como la que se 
muestra en la grafica. El programa debe mostrar la temperatura en pantalla con un 
digito decimal y a la vez enviarla por el puerto serie. En la práctica 14 se debe agregar 
conectividad USB. 
 
 
 
Figura 13: Grafica de la tensión de salida (Vout) del sensor en función de la 
temperatura. 
 
 
Solución 
 
/* Includes */ 
#include "p18f4620.h" 
#include "delays.h" 
#include "xlcd.h" 
#include "stdlib.h" //Libreria que contiene la funcion itoa 
 
 
/* Definiciones */ 
31 
 
#define Vref 1.75 
#define Decimales_precision 10 
 
/* Variables */ 
#pragma udata 
unsigned char Conversion; 
float Temp; 
char Temperatura[3]; // Cadena de String 
float Vout; 
int Entero; 
int Decimas; 
 
/* Prototipos */ 
void ADC_Init(void); 
unsigned char ADC_Convert(void); 
void USART_Init(void); 
void USART_Trans(char Dato); 
 
/* Programa Princicpal ***/ 
 
void main(void) 
{ 
 Temp = 0; // Inicializo 
 
 Delay1KTCYx(5); //Retardo para iniciar el LCD 
 
 OpenXLCD( FOUR_BIT & LINES_5X7); //Inicializamos LCD 
 putrsXLCD(" Temperatura"); // Enviamos mensaje al LCD 
 
 // Inicializmos la USART 
 USART_Init(); 
 // Inicializamos conversor ADC 
 ADC_Init(); 
 
 while(1) 
 { 
 // comenzamos conviertendo el valor leido en el conversor 
 // en grados dentro de una variable del tipo float 
 Conversion = ADC_Convert(); 
 Vout = (float)(Conversion*Vref)/255; 
 
 Temp=(float)(Vout - 0.5)/ 0.01; 
 
 // Para poder mostrarlo en el LCD se debe pasarlo a ASCII 
 // Lo que realizamos es una conversion de float a int para 
 // quedarnos primero con la parte entera 
 Entero = (int)Temp; 
32 
 
 // Enviamos ese valor al LCD y a la USART 
 USART_Trans('\r'); // Comando de retorno para la USART 
 WriteCmdXLCD(NEXT_LINE + 4); // Nos posicionamosen el LCD 
 
 itoa(Entero,Temperatura); // Realizo conversion en ASCII 
 
 putsXLCD(Temperatura); // y lo enviamos al LCD 
 USART_Trans(Temperatura[0]); // y a la USART 
 USART_Trans(Temperatura[1]); 
 
 // Luego escribimos el punto que separa el entero de las 
 // decimas 
 WriteDataXLCD('.'); 
 USART_Trans('.'); 
 // y convertimos las decimas en ASCII 
 Temp = (Temp - (int)Temp) * Decimales_precision; 
 Decimas=(int)Temp; 
 
 itoa(Decimas,Temperatura); 
 // Y lo mandamos al LCD y a la USART 
 putsXLCD(Temperatura); 
 putrsXLCD(" grados"); 
 USART_Trans(Temperatura[0]); 
 USART_Trans(Temperatura[1]); 
 WriteCmdXLCD(CURSOR_OFF & BLINK_OFF); // Apagamos cursor 
 
 } 
} 
 
void DelayFor18TCY( void ) 
{ 
 Delay100TCYx(1); // Retardo de 100uSeg 
} 
 
void DelayPORXLCD(void) 
{ 
 Delay1KTCYx(15); // Delay de 15mS 
 // ciclos = (TimeDelay * Fosc)/4 
 // ciclos = (15mS * 4Mhz)/4 
 // ciclos = 15000 
} 
 
void DelayXLCD(void) 
{ 
 Delay1KTCYx(5); // Delay de 5mS 
 // ciclos = (TimeDelay * Fosc)/4 
 // ciclos = (5mS * 4Mhz)/4 
33 
 
 // ciclos = 5000 
} 
 
 
void ADC_Init(void) 
{ // Inicialimos el conversor Analogico-Digital 
 // Comenzamos configurando cuales van a ser los pines 
 // analogicos y digitales. 
 
 //La siguiente configuracion coloca la referencia en VREF+ (AN3) 
 //para poder colocar la referencia con el pote a 1,75V 
 //y configura los 4 primeros canales como analogicos 
 ADCON1 = 0b00011010; 
 
 // Justificmaos a izquierda, elegimos un tiempo de adquisicion 
 // de 20TAD y FOSC/2 
 ADCON2 = 0b00111000; 
 // Seleccionamos canal 4(RA5), alli encontramos el sensor 
 ADCON0 = 0b00010001; 
} 
 
unsigned char ADC_Convert(void) 
{ // funcion que comienza la conversion y devuelve el resultado 
 ADCON0bits.GO_DONE = 1; // Comienzo la conversion 
 while (ADCON0bits.GO_DONE == 1); // Espero a que se complete 
 return ADRESH; // retorno la parte alta 
 // del resultado 
} 
 
void USART_Init(void) 
{ // Procedimiento que inicializa la comunicacion serie 
 // Inicializamos la comunicacion con una velocidad de 9600 bps 
 // para ello asignamos un Baud rate de alta velocidad 
 // y cargamos el registro SPBRG con 25 en decimal 
 
 SPBRG = 25; 
 // Configuramos los pines de salida 
 TRISCbits.TRISC6 = 1; 
 TRISCbits.TRISC7 = 1; 
 
 // Comenzamos con la configuracion de la transmicion 
 // modificando el registro de estado de la transmicion TXSTA 
 
 TXSTA = 0b00100100; 
 // Configuramos una comunicacion asincronica de 8 bits 
 // en alta velocidad 
 
34 
 
 // Configuramos un generador de baudios de 8 bits 
 BAUDCONbits.BRG16 = 0; 
 
 RCSTAbits.SPEN = 1; // Habilitamos el Port Serial 
} 
 
void USART_Trans(char Dato) 
{ // esta funcion envia caracteres por el puerto serie 
 PIR1bits.TXIF = 0; // Borramos flag de transmision 
 
 TXREG = Dato; // Enviamos dato 
 while(TXSTAbits.TRMT = 0); // esperamos a que se termine 
 // la transmicion 
} 
 
35 
 
 
Fi
gu
ra
 1
4:
 C
irc
ui
to
 e
sq
ue
m
át
ic
o 
de
l S
en
so
r d
e 
Te
m
pe
ra
tu
ra
. 
 
 
 
36 
 
 
Análisis 
 
El sensor de temperatura utilizado para esta práctica nos entrega la temperatura en 
grados Celsius y por la grafica, sabemos que cuando el sensor entrega 500mV, la 
temperatura será de 0º C. Como el sensor se comporta de manera lineal en el rango de 
temperatura que va de -40ºC a 125ºC, podemos utilizar una formula lineal para realizar 
la conversión de la tensión entregada por el sensor a temperatura en grados Celsius. La 
formula que utilizamos es: 
 
Vout(Volts) = 10mV/ºC * Temperatura(ºC) + 500mV 
 
Así que podemos despejar la temperatura medida por el sensor sabiendo cual es su 
tensión de salida. 
 
Temperatura(ºC) = (Vout(Volts) – 500mV) / 10mV/ºC 
 
Donde los 10mV/ºC indica la sensibilidad del sensor de temperatura (10mV por cada 
grado centígrado que varia la temperatura). 
 
Todas estas cuentas requieren de manejo de variables del tipo punto flotante, que por 
suerte al trabajarlo en C se hace muy simple. 
 
La estructura del programa principal se compone de la inicialización de los puertos y 
periféricos utilizados, luego entramos en un bucle infinito donde continuamente 
estamos leyendo el conversor analógico-digital. Esto permite tomar la tensión de salida 
del sensor de temperatura, convertir ese valor binario en temperatura y luego 
mostrarlo en el LCD. Además agregamos conectividad por el puerto USB a través del 
nuevo MCP2200 de Microchip. 
 
 
Figura 15: Circuito del MCP2200 que realiza la interfaz entre los mensajes de la 
USART del PIC y el puerto USB. 
 
 
37 
 
Una vez que se recibe el dato del conversor, el programa lo convierte a tension 
guardándolo en la variable Vout, que la convertimos en float y a partir de esta en 
temperatura con la ecuación anterior. De este modo tenemos la temperatura 
almacenada en una variable tipo float que es un punto flotante, pero para enviarla al 
LCD o al puerto serie debemos convertirlo en ASCII. La conversión de un número 
decimal en ASCII es simple si utilizamos la funcion itoa, la cual solo convierte variables 
enteras en ASCII, entonces el procdimiento es el siguiente: 
 
1) Se copia el float en una variable int para quedarnos con la parte entera. 
 
2) Convertir el entero en ASCII usando la función itoa y mandarlo al LCD. 
 
3) Añadir un ‘.’ en la pantalla LCD para separar la parte decimal de la entera. 
 
4) Restar al float la parte entera y multiplicar por 10 (o por 100 según la resolución que 
se busque) para después convertir la parte fraccionaria y enviarla al LCD. 
 
Esto es un buen truco matematico para mostrar numeros decimales en la pantalla LCD. 
Luego tambien cada carácter es enviado al puerto serie. 
 
Las funciones ADC_Init(); y USART_Init(); inicializan los módulos del conversor A/D y la 
transmisión serie asincrónica. 
 
El conversor se configura para tener la tensión de referencia de manera externa en 
VREF + el cual posee un potenciómetro externo en la placa Student para poder 
modificar la tension de referencia. 
 
En nuestro programa colocamos una referencia externa de 1,75 V, así que antes de 
programar el micro debemos calibrar la referencia externa con un multímetro sobre el 
pin RA3 (VREF +) y asegurarnos que mide 1,75 V. Claro que es posible utilizar como 
referencia la tensión Vdd que en la placa Student Advanced es de 3,3 V pero perdemos 
resolución. 
 
El modulo USART se configura para tener una transmisión serie asincrónica a una 
velocidad de 9600 baudios. El generador de baudios se le asigna un baud rate de alta 
velocidad y de 8 bits, el registro SPBRG se carga con 25, para tener la velocidad en 
baudios deseada. 
 
Luego la función ADC_Convert(); nos entrega el resultado de la conversión y la función 
USART_Trans(); transmite un dato de 8 bits por el puerto serie. 
38 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
© mcelectronics 
 
Hecho el depósito que marca la ley 11.723 
Todos los derechos reservados. 
 
	SUMARIO
	EL MICROCONTROLADOR PIC18F4620 11 FUNCIONES DEL OSCILADOR 15 CONTROL DE ENERGIA 29 CIRCUITO DE RESET 43 ORGANIZACIÓN DEL LA MEMORIA 51 MEMORIA DE DATOS EEPROM 73 MEMORIA FLASH DE PROGRAMA 79 MULTIPLICADOR POR HARDWA...
	Incluye prácticas básicas y avanzadas para realizar con la placa MCE Starter KIT Student Advanced. Puede encontrar el código fuente completo y programas adiconales en: www.mcelectronics.com.ar/techtrain usuario: su dirección de email* clave:2006...
	1. EL MICROCONTROLADOR PIC18F4620
	HISTORIA Y EVOLUCIÓN DE LOS PIC18
	DESCRIPCIÓN DEL PIC18F4620

Otros materiales