Vous êtes sur la page 1sur 38

1

ARQUITECTURA Y
PROGRAMACION DE
MICROCONTROLADORES PIC







Andrs R. Bruno Saravia
Ariel Coria






libros de quimica sobre placas
de bateria
2


Arquitectura y Programacin 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. Electrnica. 2. Microchips.
CDD 621.381 5


Fecha de catalogacin: J unio 2010

mcelectronics

Hecho el depsito que marca la ley 11.723
Todos los derechos reservados.

Ninguna parte de este libro, incluido el diseo de la portada, puede reproducirse, almacenarse o
transmitirse de ninguna forma ni por ningn medio, sea este elctrico, qumico, mecnico, ptico,
de grabacin o de fotocopia, sin la previa autorizacin escrita por parte de mcelectronics. La
infraccin de los derechos mencionados puede ser constitutiva de delito contra la propiedad
intelectual.

La editorial no se pronuncia ni expresa implcitamente respecto a la exactitud de la informacin
contenida en este libro, razn por la cual no puede asumir ningn tipo de responsabilidad en caso
de error u omisin.

Las marcas mencionadas son propiedad exclusiva de sus registradores legales.

















3


LOS AUTORES


Andrs Ral Bruno Saravia
andres.saravia@mcelectronics.com.ar

Tiene una amplia experiencia docente, se ha desempeado como Profesor de
Microcomputadoras desde 1992 hasta 1997, Profesor de Automatizaciones y
Electrnica Industrial desde 2002 hasta 2006, y como Profesor con dedicacin
exclusiva de Microcontroladores PIC desde el ao 2006 al presente. Es Training Partner
de Microchip y dirige el Centro Regional de Entrenamiento Argentina desde el ao
2008. Ha escrito diferentes trabajos: Manual de Microcontroladores PIC16F87X,
Manual de Microcontroladores PIC Lnea BASE, Programacin 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 Ingeniera Electrnica en la Universidad de
Buenos Aires con especialidad en sistemas de control. Posee slidos conocimientos de
programacin 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.















libros de quimica sobre placas de bateria
4


5




INTRODUCCIN



Luego de 8 meses de redaccin, edicin, diseo y correccin 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 diseo de aplicaciones embebidas para MCU PIC18F en lenguaje
C18 y que esta certificado tambin por Microchip.


El texto ha sido dividido en 3 grandes partes. En la primera, hacemos una descripcin
profunda del hardware que forma al microcontrolador PIC18, detallando las
caractersticas tcnicas y funcionamiento de su nuevo ncleo, los nuevos tipos de
osciladores, la utilizacin de interrupciones y el manejo de la memoria de programa y
de datos. Luego realizamos un detalle pormenorizado de cada uno de sus perifricos
desde los puertos, hasta las unidades de comunicacin seriales. Para todo esto hemos
utilizado como modelo el PIC18F4620, el cual, por sus caractersticas engloba la mayor
cantidad de perifricos 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 caracterstica de los microcontroladores PIC es que sus perifricos son iguales, lo
mismo que la operacin de sus ncleos, solo cambian la cantidad de perifricos 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 programacin C, aplicado al campo de los
microcontroladores PIC. Este captulo es esencial para aprender las reglas
fundamentales que rigen a este lenguaje de programacin. De forma clara y sinttica
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 prctica y amena. Iniciamos con una descripcin rpida de las caractersticas del
compilador C18 y de las libreras 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



descripcin detallada del algoritmo y la especificacin del hardware, incluyendo los
circuitos y el listado de programas con descripciones lnea a lnea de cada instruccin.

Hemos elegido ejemplos que parten desde lo ms sencillo como encender un LED
hasta lo ms complejo como realizar un sistema de adquisicin de datos con control
por LCD y USB. Los ejemplos crecen gradualmente en su nivel de complejidad,
manteniendo en todos los casos una profunda descripcin de los mismos.

Esperamos que este libro cumpla con los principios a partir de los cuales se gest:
ensear 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 aos 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
ORGANIZACIN 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 TENSIN DE REFERENCIA 259
PROGRAMACION EN LENGUAJE C 265
EL COMPILADOR C18 293
GUIA VISUAL MPLAB 313
PRACTICAS EN C 329



Incluye prcticas bsicas y avanzadas para realizar con la placa MCE Starter KIT Student
Advanced. Puede encontrar el cdigo fuente completo y programas adiconales en:


www.mcelectronics.com.ar/techtrain

usuario: su direccin de email*
clave: 20062010


* Para registrarse, por favor remita su direccin de email junto con nombre y apellido a:
info@mcelectronics.com.ar
10


11


1. EL MICROCONTROLADOR
PIC18F4620

HISTORIA Y EVOLUCIN 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 evolucin de los sistemas de
control embebido. Pero el gran salto final lo produce la compaa al responder a una
necesidad de mercado, los PIC18. Esta familia, resultado de la convergencia de las
tecnologas usadas en las familias PIC16 y PIC17, provoc la segunda revolucin
tecnolgica iniciada con el PIC16F84.

Dentro de la familia PIC18 contamos con microcontroladores especficos para
conectividad USB y Ethernet, as como con micros de propsito general como el
PIC18F4620 en el cual centraremos nuestro estudio.

El PIC18F4620 se encuentra dentro de una serie de PICs con caractersticas 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 bsicos:

PIC18C242
PIC18C252
PIC18C442
PIC18C452

Los cuales rpidamente fueron transformados a versiones FLASH en 2002 pasando a
llamase PIC18FXX2 (PIC18F242/252/442/452).
En Septiembre del ao 2004 Microchip presenta al mercado su nueva renovacin de la
familia originaria, los PIC18F2420/2520/4420/4520, y en Junio de ese ao se anuncia
tambin la insercin al mercado de los PIC18F2525/2620/4525/4620.

12


1.0 CARACTERSTICAS GENERALES:

La primera familia PIC18 introdujo grandes reformas al ncleo 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 pgina de 2048 [2K] posiciones cada
una. Esta familia solo poda 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 ms de 2K
a lo cual Microchip tomo nota y por ello al disear PIC18 lo modific.

En algunos dispositivos podemos trabajar no solo con memoria de programa interna
sino tambin 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 ms de un milln de instrucciones. Adems
la arquitectura se diseo 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 travs de los registros internos FSR). Las reformas le dan capacidad al
usuario para controlar el STACK del Contador de Programa en las subrutinas.


Adems se ampli el set de instrucciones de 35 que haba en la familia PIC16 a las 74
que podemos encontrar ahora en PIC18. Estas nuevas instrucciones facilitan las
operaciones lgicas al incorporar muchos ms saltos condicionales y la posibilidad de
realizar multiplicaciones por hardware.


A nivel perifricos la potencia fue mxima, 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 perifricos de comunicaciones como puerto USB, CAN y hasta
Ethernet en los dispositivos ms grandes que llegan a tener hasta 100 terminales. La
revolucin de la familia PIC18, iniciada hace ya 10 aos continua empujando la
aparicin de nuevos dispositivos, y provoca la generacin de nuevas remakes en la
familia PIC16 como los PIC16F88X que incorporan muchas de las caractersticas a nivel
perifrico de PIC18 y la aparicin de los nuevos PIC Lnea Media Mejorada como los
PIC161XXX que son una adaptacin de PIC18 en los PIC16.

Para programar PIC18, Microchip diseo un compilador en Lenguaje C basado en las
caractersticas del Hardware y que fue concebido conjuntamente con la arquitectura
de PIC18. De esta forma se logra una integracin entre hardware y software que
permite optimizar los tiempos de procesamiento haciendo posible la utilizacin del
lenguaje C, incluso en aplicaciones de control automtico.

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 electrnica evoluciona hacia una nueva era en la tecnologa del
control embebido.


1.1 DESCRIPCIN DEL PIC18F4620

A continuacin comenzaremos a describir las caractersticas del PIC18F4620, iremos de
lo general a lo particular. Comenzaremos por hacer una descripcin de sus capacidades
en el ncleo del procesador y luego de sus perifricos:

Caractersticas generales del Procesador:

Memoria de Programa: 32K Word para almacenar Instrucciones.
Memoria de Datos: 3968 bytes
Puertos I/O: 36
Canales ADC: 13
Mdulos CCP/ECCP: 1/1
Mdulos 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.
PROGRAMACIN EN
LENGUAJE C


EN ESTE CAPITULO

22.0 INTRODUCCIN A LA PROGRAMACION EN LENGUAJE C
22.1 ESTRUCTURA BSICA DE UN PROGRAMA EN LENGUAJE C
22.2 COMENTARIOS
22.3 REPRESENTACIN NUMRICA Y ALFANUMRICA
22.4 TIPOS DE DATOS
22.5 MODIFICADORES DE TIPOS DE DATOS
22.6 DECLARACIN DE VARIABLES
22.7 DECLARACIN 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 CREACIN DE LIBRERAS
16


17

22 INTRODUCCIN A LA PROGRAMACION EN LENGUAJE C

22.1 ESTRUCTURA BSICA 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 funcin que debemos llamar main ().

Sintaxis:
main() //primera funcin a ser ejecutada
{ // inico del cuerpo de la funcin

<comandos>; // otras funciones pueden ser adicionadas
} // fin del cuerpo de la funcin

Vale nombrar tambin que existen algunas reglas bsicas que deben ser seguidas en
relacin a los conceptos de lenguaje.
Toda funcin de C debe ser iniciada por una llave ( { ) y cerrada por otra llave ( } ).
Los parntesis y las llaves son elementos obligatorios de una funcin.
Todas las instrucciones deben estar dentro de dos llaves.
Las instrucciones en C siempre encerradas por un punto y coma (;).
Vale nombrar tambin 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 declaracin 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 smbolos grficos, con excepcin de un (_).
No puede tener acentuacin grfica( acento grave, acento agudo, tilde etc).
Un identificador no puede iniciar nunca con un nmero.
No puede ser una palabra reservada pues ella son slo 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 REPRESENTACIN NUMRICA Y ALFANUMRICA
Las constantes pueden ser representadas conforme a los siguientes ejemplos:

TABLA 22.1 REPRESENTACIN NUMRICA EN LENGUAJE C

Representacin numrica 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 Tamao Mnimo Mximo
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 CARACTERSTICAS DEL COMPILADOR C18
23.2 ESTRUCTURA DEL DIRECTORIO DEL MPLAB C18
23.3 FUNCIONES ESTNDAR DEL LENGUAJE C EN MPLAB C18
20


21

23.0 MPLAB C18

23.1 CARACTERSTICAS 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 programacin de los
PIC.

Este compilador se maneja perfectamente dentro del entorno visual del MPLAB y sus
caractersticas son:

- Solo se utiliza para los PIC18
- Posee las funciones estndar del lenguaje C
- Permite la inclusin de lenguaje ensamblador
- Soporta interrupciones.
- Esta optimizado para la arquitectura de los PIC18
- Contiene libreras para comunicaciones SPI, I2C, USART y perifricos externos como
LCD inteligentes
- Como utiliza el MPLAB, el entorno de programacin es similar al que estuvimos
trabajando en assembler.
- Versin estudiantil gratuita

Todas estas caractersticas 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 librera
estndar de C y los archivos con las especificaciones del procesadores PIC de

lib: Contiene las libreras estndar 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 mdulos 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 ESTNDAR DEL LENGUAJE C EN MPLAB C18

El compilador MPLAB C18 soporta muchas de las funciones que posee la biblioteca
estndar de ANSI C y podemos incluirlos en nuestro cdigo fuente con la simple
inclusin del archivo de cabecera asociado a esa funcin. 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 lgicas con
caracteres.

Isalnum

Function: Isalnum

Prototipo: unsigned char isalnum( unsigned char ch );

Descripcin: retorna un valor distinto de cero si "ch" es una letra minscula "a-z" o
mayscula "A-Z", uno de los dgitos decimales "0-9" o cualquier otro carcter
alfabtico local.

Archivo: isalnum.c

Ejemplo: control = isalnum(65); // en este caso control sera // distinto de
cero

Isdigit

Funcin: Isdigit

Prototipo: unsigned char isdigit( unsigned char ch );

Descripcin: Retorna un valor distinto de cero si "ch" es cualquiera de los dgitos
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 matemticas bsicas y muchas
de ellas hacen uso de nmeros en coma flotante.

acos

Funcin: acos

Prototipo: float acos (float x);

Descripcin: 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

Funcin: cos

Prototipo: float cos (float x);

Descripcin: Esta funcin 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

Funcin: asin

Prototipo: float asin( float x );

Descripcin: Esta funcin 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.
PRCTICAS Y ESQUEMTICOS


EN ESTE CAPITULO

PRCTICA 1 LED
PRCTICA 2 PARPADEO
PRCTICA 3 ROTACIN
PRCTICA 4 DEBOUNCE
PRCTICA 5 CONTADOR DECIMAL
PRCTICA 6 CONTADOR DECIMAL DE 2 DIGITOS
PRCTICA 7 MENSAJES AL LCD
PRCTICA 8 CONTADOR DE 5 DGITOS
PRCTICA 9 REL TEMPORIZADO
PRCTICA 10 PWM
PRCTICA 11 LED RGB
PRCTICA 12 RELOJ DE TIEMPO REAL
PRCTICAS 13 Y 14 SENSOR DIGITAL DE TEMPERATURA CON USB
PRCTICA 15 MULTIPLEXADO DE CANALES ANALGICOS
PRCTICA 16 ESCRITURA EN MEMORIA EEPROM INTERNA









Recuerde que puede descargar el cdigo fuente de estas prcticas registrndose en
www.mcelectronics.com.ar/techtrain
26


27

25.0 PRACTICAS

En esta segunda parte del libro pretendemos que aplique los conocimientos tericos
obtenidos hasta ahora en ejercicios prcticos que puedan ser simulados en la placa de
enseanza MCE Starter KIT Student y MCE Starter KIT Student Advanced. Estos
ejercicios afianzaran sus conocimientos sobre la programacin en C18 y aprender de
manera simple y efectiva el manejo de perifricos externos como el Display LCD.


PRACTICAS BSICAS

PRACTICA 1 - LED

Comenzamos con la serie de ejercicios y en esta primera prctica realizaremos el
ejercicio simple de encender un led. Lo que buscamos con este ejercicio es mostrar
cual ser la estructura bsica de un programa en C18.

Ejercicio 1: Encender el led 7 de la matriz de Leds de la placa MCE Starter KIT Student y
Student Advanced con el PIC18LF4620.

Figura 1: Circuito esquemtico de la practica 1.


28


Solucin

/* 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

}


Anlisis

Antes de comenzar un programa o un proyecto con PIC, debemos tener en claro cuales
van a ser los recursos o perifricos que vamos a utilizar del microcontrolador. Estos
recursos los configuramos a travs de los Bits de Configuracin y podemos definirlos
en el cdigo fuente. Es una buena prctica configurar los recursos de esta manera ya
que nos elimina el tedioso proceso de realizar las configuraciones en el momento de la
grabacin.

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 Guardin como lo hicimos en el ejemplo.

Observe que con la expresin 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 programacin de bajo voltaje, con WDT=OFF apagamos el perro
guardin 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 funcin main, el
cual lo definimos de la forma

void main (void)
{
//Sentencias del programa principal
}

Dentro de la funcin main se declaran las sentencias principales, las cuales van a
conformar el cuerpo del programa.

Los prefijos void indican que la funcin no retornara ningn valor y tampoco tomara
ningn argumento. De esta manera indicamos al compilador que la funcin principal
(main) realizara un proceso que no devolver ningn valor.

Una vez que definimos la funcin principal, comenzamos el bloque de instrucciones en
donde inicializamos el registro TRISB indicndole 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 (expresin) Sentencias

Mientras la expresin sea verdadera, se ejecutara el bloque de sentencias que
conforman el While, pero si la expresin es falsa salimos del ciclo continuando con
nuestro programa.

Para el Compilador C18, si el resultado de la expresin es igual a cero, lo tomara como
false (falso), pero cualquier resultado distinto de cero lo tomara como True
(Verdadero), en nuestro caso la expresin de nuestro cdigo es 1, que siempre ser
verdadero, esta es una manera elegante de generar un loop infinito en C.

Con esta prctica pretendemos que aprenda de manera simple cual ser la estructura
bsica de un programa en C18, en la cual pudimos identificar donde colocar el bloque
de instrucciones principales, los bits de configuracin y como incluir el archivo de
cabecera que posee la definicin de los registros del microcontrolador.


30


PRACTICAS 13 y 14 - SENSOR DIGITAL DE TEMPERATURA

Con lo aprendido hasta ahora en estas prcticas 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 analgico entregara una determinada tensin 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 prctica 14 se debe agregar
conectividad USB.



Figura 13: Grafica de la tensin de salida (Vout) del sensor en funcin de la
temperatura.


Solucin

/* 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 posicionamos en 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


F
i
g
u
r
a

1
4
:

C
i
r
c
u
i
t
o

e
s
q
u
e
m

t
i
c
o

d
e
l

S
e
n
s
o
r

d
e

T
e
m
p
e
r
a
t
u
r
a
.





36


Anlisis

El sensor de temperatura utilizado para esta prctica 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 -40C a 125C, podemos utilizar una formula lineal para realizar
la conversin de la tensin 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
tensin de salida.

Temperatura(C) = (Vout(Volts) 500mV) / 10mV/C

Donde los 10mV/C indica la sensibilidad del sensor de temperatura (10mV por cada
grado centgrado 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 inicializacin de los puertos y
perifricos utilizados, luego entramos en un bucle infinito donde continuamente
estamos leyendo el conversor analgico-digital. Esto permite tomar la tensin de salida
del sensor de temperatura, convertir ese valor binario en temperatura y luego
mostrarlo en el LCD. Adems agregamos conectividad por el puerto USB a travs 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
guardndolo en la variable Vout, que la convertimos en float y a partir de esta en
temperatura con la ecuacin 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 conversin de un nmero
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 funcin itoa y mandarlo al LCD.

3) Aadir 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 segn la resolucin que
se busque) para despus 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 carcter es enviado al puerto serie.

Las funciones ADC_Init(); y USART_Init(); inicializan los mdulos del conversor A/D y la
transmisin serie asincrnica.

El conversor se configura para tener la tensin de referencia de manera externa en
VREF + el cual posee un potencimetro 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 multmetro sobre el
pin RA3 (VREF +) y asegurarnos que mide 1,75 V. Claro que es posible utilizar como
referencia la tensin Vdd que en la placa Student Advanced es de 3,3 V pero perdemos
resolucin.

El modulo USART se configura para tener una transmisin serie asincrnica 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 funcin ADC_Convert(); nos entrega el resultado de la conversin y la funcin
USART_Trans(); transmite un dato de 8 bits por el puerto serie.
38





















mcelectronics

Hecho el depsito que marca la ley 11.723
Todos los derechos reservados.

libros de quimica sobre placas de bateria