You are on page 1of 53

PROGRAMACIN EN C18DEL PIC18F4550 CON BOOTLOADER

Por Francisco Javier Garca Olmos Instituto Politcnico Nacional Mxico 2012

NOTA: Para utilizar este manual terico- r!ctico es necesario tener conocimientos "!sicos #e electrnica $ circuitos% l&ica #i&ital $ nociones "!sicas #e ro&ramacin #e com uta#oras en cual'uier len&ua(e) *s necesario tam"in tener en cuenta la lectura #el manual +#ata s,eet- ara mane(ar los re&istros necesarios ara la con.i&uracin #e este microcontrola#or)

Dedicado a mis amigos programadores: Francisco y Eduardo.

Hay ms personas pero el mencionar a todas ellas requerira un documento extra para mencionarlas, ya que son muchas. Gracias Por u !poyo "!#.

INTRODUCCIN A MPLAB X
Para iniciar con la programacin en C18 primero necesitamos saber acerca del IDE gratuito del cual Microchip nos provee; Microchip es la empresa que abrica los microcontroladores PIC! Este IDE es el que usaremos para reali"ar nuestros pro#ectos$ probarlos # compilarlos$ #a que es multiplata orma # podemos utili"arlo tanto en %indo&s como en 'inu(!

Ambiente de de !""#$$# MPLAB X


El ambiente de desarrollo tiene la siguiente imagen; tome en cuenta que est) mos* trado dentro del +istema operativo 'inu(!

Del lado i"quierdo aparece una lista con los pro#ectos reali"ados$ archivos #,o clases que se utili"an en MP'-.! +iempre se abrir) con la p)gina de inicio! /iene su barra de men0$ barra de herramientas # en la parte de aba1o$ oculta ventanas que son necesarias a la hora de compilar$ probar # anali"ar la memoria! Para ma#or in ormacin$ veri icar un curso com* pleto de MP'-.$ #a que aqu2 solo hablaremos de las partes m)s importantes!

C"e!" %n &"#'e(t# &!"! C18


Para crear un pro#ecto$ es necesario dar clic en el segundo icono de la barra de he* rramientas o seleccionar New Proyect del men0 File # se abrir) una ventana donde pregunta el tipo de pro#ecto que deseamos crear; seleccionamos Standaalone Proyect # presionamos Siguiente; nos aparecer) una lista donde tenemos que seleccionar la amilia # el dispositivo a usar$ en nuestro caso colocamos Advanced 8-bit MCUs (PIC18 en amilia # en dispositivo PIC1845667$ posteriormente seleccionamos siguiente! 8os aparecer) una lista de programa* dores a usar; nosotros colocaremos Si!ulator por que usaremos .ootloader # no es nece* sario un programador mas que solo una ve" para ingresarle el .ootloader al PIC! 9na ve" presionado el botn siguiente :8e(t; aparecer) una lista con lengua1es de programacin$ de los cuales vamos a seleccionar C18$ #a que usaremos el lengua1e C para PIC18!

Por 0ltimo$ le damos un nombre al pro#ecto # lo guardamos en el directorio que nos agrade!

-l reali"ar los pasos anteriores$ se mostrar) nuestro pro#ecto en la parte i"quierda del IDE! -hora es necesario crear un archivo nuevo vaci para comen"ar a programar!

Para agregar el nuevo archivo hacemos clic derecho en Source Files del pro#ecto que estamos creando$ # le hacemos clic en New # posteriormente en "!#ty File # se abrir) una ventana donde le colocaremos un nombre! En nuestro caso le llamaremos &$!nti$$!)( por que ser) nuestra plantilla para cualquier pro#ecto que realicemos con bootloader! Debemos de agregar tambi<n un archivo lin$er para poder compilar correctamente el programa! Este archivo est) dentro de la carpeta bin=l>r en la carpeta donde est) instalado C18 :MCC18; el cual es llamado 18*4550+,)$-"! +in este archivo no se compilar) correc* tamente el programa # podemos borrar accidentalmente el bootloader del microcontrolador!

C#m&i$!" %n &"#,"!m!
Para compilar un programa hecho previamente$ solo le damos clic al botn que tiene un martillo$ se compilar) el pro#ecto # se crear) el archivo e1ecutable !?E@ que es el que se 6

grabar) en el PIC con el ?ID .AA/'A-DEB! En %indo&s este programa es gr) ico # se habilitan los botones una ve" que se ac* tiva el bootloader de la placa de prueba del PIC! +eleccionamos el archivo !?E@ que deseamos grabar # pulsamos sobre el botn Progra! % &eri'y # se programar) el PIC! En 'inu($ ha# un programa en l2nea de comandos que graba de orma satis actoria el PIC con bootloader # se e1ecuta ane(ando la direccin del archivo !?E@ desde la /erminal! /iene el nombre de hidCbootloader # solo se tiene que ingresar el nombre del archivo !?E@ que se desea grabar! El bootloader del PIC se activa pulsando el +%I/C? 3 de la placa de prueba del PIC1845667 1unto con el botn BE+E/$ posteriormente soltar BE+E/ quedando solo el s&ithc 3 # parpadear)n los 'ED+ BC7 # BC1 de la placa de prueba$ en ese momento soltar el +%I/C? 3! 9na ve" reali"ado esto$ la computadora reconocer) al dispositivo como un ?uman Inter ace Device 9+.! En este momento se puede grabar el programa que hemos reali"ado con el bootloader!

E$ PIC18F4550
En este cap2tulo vamos a ver algunas caracter2sticas del PIC1845667$ que son esen * ciales para entender la programacin en C18! 1! Es un dispositivo CMA+ de ba1o consumo de energ2a$ uso de volta1e E6F # uso m)(imo de corriente de 26m-$ no consumir m)s de esta corriente #a que si no$ podr2amos daGar el pin del microcontrolador! /ambi<n tener en cuenta que los disposi* tivos CMA+ son delicados a la corriente est)tica! 2! Es un mi("#(#nt"#$!d#" que trae en su interior un mi("#&"#(e !d#" :MP9 o -'9;$ memoria B-M # memoria de programa lash :regrabable; # memoria EEPBAM de datos # sus propios bus de datos$ control # direcciones internamente! 3! Integrado de 57 pines en su presentacin DIP o 55 pines en su presentacin para monta1e super icial! 5! Es un microcontrolador de 8 bits en su bus de datos$ osea que solo puede mane1ar 8 bits por c)lculo! 6! /iene 6 puertos de entrada # salidaH -$ .$ C$ D # E! /res de ellos son de 8 bits$ uno de I bits # uno de ellos es de 5 bits$ mas sin embargo$ estas caracter2sticas no son posibles por el uso de pines por oscilador e(terno :B-6 # B-D;$ uso de 9+. :BC5 # BC6; # por 0ltimo uso de MC'B :Master Clear Beset; en el pin BE5! Esto nos de1a con 1 puertos de D bits$ dos puertos de 8 bits$ uno de cinco # uno de 3 bits! D! Ascilador interno de 8M?"! 8osotros usaremos el e(terno de 27M?" por el uso del mdulo 9+. para el .AA/'A-DEB! I! /iene 13 canales analgicos :-DC; de 17 bits! 8! Mdulo 9+. # posibilidad de usar .AA/'A-DEB! J! Modulo 9+-B/ para comunicacin serial! +i se requiere comunicacin PC*PIC se necesitar) un integrado M-@232 para la conversin de volta1es! 17! /res interrupciones e(ternas! 11! Cuatro tempori"adores :/imers; o contadores! 12! Dos modulos capturador,comparador,P%M :CCP;! 13! 9n mdulo embebido capturador,comparador,P%M :ECCP;! 15! 9n mdulo Master +#nchronous +erial Port :M++P;!

'as cone(iones b)sicas del PIC1845667$ les de estado # 2 botones de cambio de lanco :+%2 # +%3; para el inicio del bootloader son las siguientesH

Cone(iones b)sicasH Cone(in a FDD # F++ no mostradas en el diagrama! FDD es de E6F # F++ es tierra K8D! 1 push button para MC'B con sus respectivas resistencias de P9''*9P e(ternas! Ascilador de 27M?" con dos capacitores de 22p4 conectados a tierra! Cone(iones e(tras de la placa de pruebas del PIC1845667H 2 'eds en B-5 # B-6! 2 'eds en BC7 # BC1 para el estado del .ootloader! 2 push button para las interrupciones de cambio de lanco con sus respectivas resistencias de P9''*9P e(ternas :+%2 # +%3;!

LO B./ICO EN C18
En este cap2tulo dar< lo b)sico que tiene el lengua1e C18! 8o pienso dar un curso de C$ #a que el lector deber) de comprender dicho lengua1e de programacin$ en caso contario$ leer una re erencia del lengua1e C$ como son sus estructuras condicionales :i $ else$ &hile$ s&itch$ etc;$ sus palabras reservadas :main$ void$ brea>$ case$ etc; # sus tipos de datos :int$ char$ unsigned char$ etc;! 9na ve" teniendo en cuenta esto comen"ar< de iniendo la palabra bootloader que es la que se re iere a este manual de programacin! El bootloader es un programa dentro del microcontrolador PIC que graba otro programa a partir de la direccin 7(1777 de la memoria de programa! Es como un sistema operativo :mas sin embargo no lo es; que se e1ecuta cada que presionamos el botn +%I/C? 3 despu<s del BE+E/! 'as direcciones de inicio del PIC sonH 7(7777 7(7778 7(7718 MC'B :Master Clear Beset; ?igh Fector +ector 'o& Fector +ector

Pero como nosotros usamos .ootloader$ las direcciones cambian! 7(1777 7(1778 7(1718 Bemaped Beset +ector Bemaped ?igh Fector +ector Bemaped 'o& Fector +ector

Posteriormente e(plicar< a que se re iere cada una de ellas en el cap2tulo de interrup* ciones$ que abarcaremos m)s adelante! 'os tipos de numeracin en C sonH he(adecimal que se utili"a colocando 7(88 # el n0mero en he(adecimal$ binario que se utili"a colocando 7.88888888 # la numeracin decimal$ que se usa solo colocando el n0mero! Como vemos$ lo que se re iere al bootloader$ son las direcciones de inicio # posteriormente veremos que la recuencia tambi<n cambia$ as2 que esta programacin tam* bi<n se puede utili"a sin bootloader con el inconveniente que necesitamos un programador como el PICLI/2 para grabar nuestros programas! -hora hablemos de un tema importante que son las instrucciones Mpragma! +on instrucciones que se le dan al compilador como parte de cdigo incluido en un programa en C! Especi ican secciones de cdigo$ archivos de librer2a # algunas otras instrucciones espec2* icas de C!

L! (#n*i,%"!(i0n ini(i!$ 1$! &$!nti$$!2


Para iniciar la con iguracin # antes que nada se debe de incluir el archivo p18 5667!h con la palabra reservada Minclude! Este archivo tiene algunas de iniciones de re* gistros del pic # las direcciones de memoria!

Bit de (#n*i,%"!(i0n
Estos controlan el comportamiento del microcontrolador # se colocan con una instruc* cin Mpragma con ig! 'os tres b)sicos sonH Mpragma con ig 4A+C N ?+ ;Con igura el oscilador a usar$ los posibles osciladores son BC :oscilador BC;$ @/ :cristal de ba1a recuencia;$ ?+ :cristal de alta recuencia;! ?a# m)s$ para ma#ores re erencias consultar el manual! Mpragma con ig %D/ N A44 ;con igura el perro guardi)n :este es un timer que rese * tea al pic en caso de que tenga un ciclo in inito; el valor que nosotros mane1amos es A44 :apagado;! Mpragma con ig 'FP N A44 ;con igura el ba1o volta1e de programacin$ nosotros lo apagamos para que programe en alto volta1e! Para el .ootloader :modo que nosotros usaremos; ha# m)s bits$ est)n #a colocados en la plantilla # no deber)n de ser modi icados! Para m)s in ormacin ver la a#uda de C18 sobre los bits de con iguracin!

/e(t#"e de (0di,#
'os sectores de cdigo son aquellos que le dicen al programador :PICLI/2$ PICLI/3$ etc; en que parte de la memoria de programa va a programar el cdigo! +e colocan en una instruccin Mpragma code # se le da un nombre$ se coloca un igual # la direccin de memoria! E1emplo 1H Colocar el vector de reset en la localidad de memoria 7(7777! Mpragma code BE+E/CFEC/ABC+EC/AB N 7(7777 void resetCvector:void; O Casm goto Cstartup Cendasm P En el e1emplo anterior vemos que e(actamente despu<s de la declaracin va la uncin re erente al vector la cual llamaremos resetCvector por comodidad$ mas sin embargo$ puede llevar cualquier nombre! En C18 est) prohibido utili"ar goto$ por lo tanto$ para reali"ar 17

un salto de uncin utili"amos la instruccin Casm # Cendasm para reali"ar una ventana de cdigo en ensamblador! E1emplo 2H Colocar el vector reset en la localidad mil he(adecimal! Mpragma code BE+E/CFEC/ABC+EC/AB N 7(1777 void resetCvector:void; O Casm goto Cstartup Cendasm P Para usar bootloader el vector de reset se encuentra en 7(1777 #a que el dem)s espacio es usado por el propio bootloader previamente cargado! Con lo e(plicado anteriormente # con los conocimientos b)sicos de C$ nuestra plan* tilla queda de la siguiente maneraH
/**************************************************************** * Autor: Garca Olmos Francisco Javier * * Fecha: 24 de Enero de 2012 * * Plantilla ara usar con !ootloader en "1# * ***************************************************************/ $include % 1#&4''0(h) /**************** !its $ ra*ma con&i* P++,-. $ ra*ma con&i* "P0,-. $ ra*ma con&i* 01!,-. $ ra*ma con&i* FO1" $ ra*ma con&i* F"4E5 $ ra*ma con&i* -E1O $ ra*ma con&i* P678 $ ra*ma con&i* !O7 $ ra*ma con&i* !O7. $ ra*ma con&i* .7EGE5 $ ra*ma con&i* 6,8 $ ra*ma con&i* 6,8P1 $ ra*ma con&i* 4"+7E $ ra*ma con&i* +P81O1" $ ra*ma con&i* P!A,E5 $ ra*ma con&i* ""P24< $ ra*ma con&i* 18.7E5 $ ra*ma con&i* +.P $ ra*ma con&i* -"P78 $ ra*ma con&i* <-518 $ ra*ma con&i* "P0 $ ra*ma con&i* "P1 $ ra*ma con&i* "P2 $ ra*ma con&i* "P9 $ ra*ma con&i* "P! de "on&i*uracion *************************************/ / ' / O1"12P++2 / 2 / 31P++231 / OFF / OFF / OFF / O5 / 9 / O5 / OFF / 92:;# / O5 / OFF / OFF / O5 / O5 / OFF / OFF / OFF / OFF / OFF / OFF / OFF / OFF

11

$ $ $ $ $ $ $ $ $ $ $ $ $

ra*ma ra*ma ra*ma ra*ma ra*ma ra*ma ra*ma ra*ma ra*ma ra*ma ra*ma ra*ma ra*ma

con&i* con&i* con&i* con&i* con&i* con&i* con&i* con&i* con&i* con&i* con&i* con&i* con&i*

"P, 6780 6781 6782 6789 678! 678" 678, E!870 E!871 E!872 E!879 E!87!

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

OFF OFF OFF OFF OFF O5 OFF OFF OFF OFF OFF OFF OFF

void -173=>? void -17+=>? e@tern void 2startu =void>? $ ra*ma code 7E4APPE,27E1E82.E"8O7 / 0@1000 void 2reset =void> A 2asm *oto 2startu 2endasm B $ ra*ma code 3-G327E4APE,2.E"8O721E"8O7 / 0@100# void hi*h2rema ed2vector=> A 2asm *oto -173 2endasm B $ ra*ma code +O627E4APE,2.E"8O721E"8O7 / 0@101# void loC2rema ed2vector=> A 2asm *oto -17+ 2endasm B $ ra*ma code $ ra*ma interru t -173 void -173=> A B $ ra*ma interru tloC -17+ void -17+=> A B void main=> A

12

Chile=1> A B B

In t"%((i#ne b3 i(! de$ $en,%!4e C18


El lengua1e C18 es una variante del C -8+I con la posibilidad de programar micro* controladores de la amilia PIC18! 8o se puede programar ninguna otra amilia de PIC!

5ent!n! de en !mb$!d#"
'as ventanas de ensamblador se abren con la instruccin Casm # se cierran con Cendasm! Entre estas l2neas se puede colocar el cdigo en ensamblador deseado!

In t"%((i0n N#&
'a instruccin 8op se utili"a para que el microcontrolador no realice operacin alguna! +e utili"a para hacer retardos de tiempo equivalentes a cuatro ciclos de oscilador principal! +u sinta(is esH 8op:;;

U # de "e,i t"# &#" bit


Para reali"ar el cambio de un solo bit de un registro$ se utili"a la palabra bits despu<s del registro # se coloca un punto # el nombre del bit! 4unciona e(actamente como una estruc* tura de datos! 'os e1emplos los mostrar< m)s adelante! 9n e1emplo de su sinta(is es la siguienteH BEKI+/BAbits!8AM.BE.I/N7; El valor que se puede colocar rente a esta declaracin solo puede ser 7 o 1 :valor binario de 1 bit;!

De($!"!" 5!"i!b$e
Para declarar variables se puede hacer con variables globales dentro del programa o al principio de una uncin! El compilador marcar) error si reali"amos declaracin de varia* bles cuando #a comen"amos alguna accin en la uncin!

13

PROGRAMACIN B./ICA DEL PIC18F4550


En este apartado vamos a ver como se programa el PIC1845667$ pero antes vo# a dar una descripcin de los registros que vamos a utili"ar en los primeros pasos!

Re,i t"# b3 i(# de$ PIC18F4550


'os dos registros b)sicos del PIC1845667 son /BI+ # PAB/! 9n registro es un mapeo en memoria B-M de alg0n dispositivo 2sico del PIC$ como son los puertos de entrada o salida$ tempori"adores$ mdulo usb$ modulo serial$ modulo -DC$ etc!

Re,i t"# TRI/


'os registros /BI+ sirven para con igurar puertos$ lo e(plicar< m)s adelante! ?a# cinco$ que son el n0mero de puertos que tiene el PIC1845667$ los cuales son /BI+-$ /BI+.$ /BI+C$ /BI+D # /BI+E! /odos son de 8 bits$ e(cepto /BI+E que es de 5 bits :nibble ba1o; los dem)s no tienen e ecto!

Re,i t"# PORT


'os registros PAB/ sirven para leer # escribir puertos$ # tambi<n lo e(plicar< m)s a* delante! ?a# cinco$ que son el n0mero de puertos que tiene el PIC1845667$ los cuales son PAB/-$ PAB/.$ PAB/C$ PABD # PAB/E! /odos son de 8 bits e(cepto PAB/E que es de 5 bits # se lee como cero el nibble alto del registro!

C#n*i,%"!" &%e"t#
-ntes de con igurar los puertos es necesario saber que si usamos el oscilador e(ter* no :que es nuestro caso; el puerto - tendr) dos pines menos los cuales son B-D # B-I! /ambi<n est)n desactivados de orma predeterminada los pines BC5 # BC6 #a que utili"an el mdulo 9+. # no est) disponible BC3; esto nos de1a el puerto C de bits$ a menos que desactivemos el mdulo 9+.! El puerto E tiene solo 3 bits #a que BE3 es usado por MC'B! Para con igurar todo el puerto - como salida :D pines que tiene el puerto - por que dos se usan con el oscilador; se reali"a lo siguienteH /BI+-N7(77; Con igurar el puerto . como salidaH

15

/BI+.N7(44; Con igurar la primera mitad del puerto como entrada # la segunda mitad del puerto como salida! /BI+DN7(47; ,,nibble ba1o salida :7; nibble alto entrada :4; Para los dem)s puertos es e(actamente el mismo procedimiento$ considerando las restricciones que tenemos en los pines de los puertos -$ C # E!

Lee" ' e ("ibi" &%e"t#


Debemos tener las mismas consideraciones que en el registro /BI+ sobre los pines desactivados por el uso de oscilador e(terno$ 9+. # MC'B! -hora veamos como se escribe # se leen los puertos! E/CRIBIR6 PAB/DN7(44; ,,+e encienden todos los pines del puerto D LEER6 variableNPAB/.; ,,+e coloca el dato en PAB/. en una variable! /ener en cuenta que la variable debe ser declarada como char o unsigned char!

C#n ide"!(i#ne &!"! e$ *$%4# de$ &"#,"!m!


El PIC cuando es borrado$ solo tiene instrucciones 8AP en su interior las cuales son el cdigo 7(444! Para evitar que al terminar un programa vuelva al inicio de la memoria :FEC/AB BE+E/; debemos de reali"ar un ciclo in inito que evite que se lea la "ona de 8AP que est) al inal del programa! Para esto se utili"a un &hile in inito al inal de la uncin main! Atra consideracin importante es que cuando encendemos el microcontrolador PIC1845667 los puertos son con igurados como analgicos$ para con igurar los puertos como digitales tenemos que colocar 7(74 en el registro -DCA81! -hora no lo e(plico porque lo vamos a ver m)s adelante en Convertidor -nalgico Digital! -hora veamos un pequeGo programa! Colocar< solo el cdigo que va dentro de la uncin principal llamada !ain para evitar colocar toda la plantilla! 16

E4em&$# 16 Encender todo el puerto -! /#$%(i0n6 Colocar 7(44 o 7(34 en el PAB/- al igual que en /BI+-$ considerando los pines que no est)n disponibles por el oscilador! +olucin 1!1
void main=> A A,"O51/0@0F? //"on&i*uramos los uertos como di*itales( 87-1A/0@00? //"on&i*uramos todo el uerto como salida( PO78A/0@FF? Chile=1> A B B

+olucin 1!2
void main=> A A,"O51/0@0F? //"on&i*uramos los re*istros como di*itales( 87-1A/0@? PO78A/0@9F? B

'as dos soluciones nos dan el mismo resultado! -l escribir este cdigo en el pic con el ?ID .ootloader$ veremos que se enciende todo el puerto! En nuestra placa de prueba$ encender)n B-5 # B-6! E4em&$# 76 Encender solo el pin B-5! /#$%(i0n6 Colocamos 7(77 en /BI+- # 7(17 en PAB/- o usar el registro por bits para encender el PI8 B-5! +olucin 2!1
void main=> A A,"O51/0@0F? //8odos los 87-1A/0@00? PO78A/0@10? Chile=1> A B B uertos como di*itales(

1D

+olucin 2!2
void main=> A A,"O51/0@0F? 87-1A/0@00? PO78A/0@00? PO78ADits(7A4/1? //1e enciende el 6hile=1> A B B

in 7A4(

'os dos e1emplos reali"an e(actamente lo mismo! Como podemos ver$ se puede co* locar todo el puerto como salida aunque no utilicemos el resto de los pines! E4em&$# 86 Feri icar que el puerto . contenga el n0mero 66h o --h$ en el primer ca* so$ encender BC7$ en el segundo caso encender BC1$ cualquier otro caso apagar ambos pi* nes; los dos pines no pueden estar encendidos al mismo tiempo! ?acer la comprobacin de orma inde inida! /#$%(i0n6 Colocar la comprobacin dentro del ciclo in inito!
.oid main=> A A,"O51/0@0F? 87-1"/0@00? 87-1!/0@FF? PO78"/0@00? Chile=1> A i&=PO78!//0@''> A PO78"/0@01? B else i&=PO78!//0@AA> A PO78"/0@02? B else A PO78"/0@00? B B B

8otemos que cada ve" que reali"amos un programa m)s avan"ado$ va aumentando su tamaGo! /odo es dependiendo del ob1etivo a alcan"ar! ?a# que tener mucha lgica para reali"ar un programa para microcontrolador!

1I

Ret!"d#
Para reali"ar un retardo dentro de un programa podemos usar instrucciones 8AP$ que equivalen a 5 ciclos del oscilador principal$ mas sin embargo$ esta condicin no se cum* ple cuando usamos .ootloader$ #a que reali"amos un aumento en recuencia para el uso de 9+.! 'a recuencia necesaria para la comunicacin 9+. es de 58M?"! 'a recuencia es una cuarta parte$ por que cada instruccin se e1ecuta en 5 ciclos del oscilador$ por lo tanto$ la recuencia de una instruccin es de 12M?"! +abemos tambi<n que el periodo es inverso de la recuencia$ as2 que$ el tiempo que tarda en reali"arse cada instruccin es de 83!33ns! $= $= 1 %

1 =20)02ns /0M1z $i = /3 $i = /x ( 20)02ns )=02)22ns +in embargo$ C18 cuenta con una serie de unciones de retardo declaradas en la biblioteca dela#s!h # son las siguietesH void Dela#177/CQ(:char n;; void Dela#1L/CQ(:char n;; void Dela#17L/CQ(:char n;; Donde n es el multiplicador de /CQ! /omando en cuenta que cada instruccin toma 83!33ns :1/CQ;$ realicemos un retardo de 17Rs! Para ello tenemos que dividir 17Rs entre 83!33ns; esto nos dar) un n0mero$ al cual le llamaremos n0mero m)gico de retardo$ # lo simboli"aremos con M! 4= 10 s =120 02)22 ns

+i utili"amos la primer uncin 177/CQ entonces debemos de dividir el n0mero m)gi* co en 177 # nos dar) un resultado de 1!2! Como no podemos usar punto decimal en varia * bles del tipo char$ tenemos que colocar uno # completar el ciclo con 27 8op:;! E1emploH
,elaE1008"F@=1>? &or=i/0?i%10?iGG> 5o =>?

SPor que se utili"an solo 17 instruccionesT Por que la comparacin se toma tambi<n como una instruccin$ entonces el 8op se tiene que dividir a la mitad! 18

E$ di &$!' LCD !$*!n%m9"i(#


El displa# 'CD al anum<rico que mostrar< en esta seccin$ ser) de 1D caracteres por dos l2neas de matri" de 6(I! Beali"ar< 5 unciones para hacer el proceso lo m)s )cil posible; no vo# a e(plicar estas unciones a ondo$ solo mencionar< como uncionan # qu< es lo que ha# que hacer en caso de requerir alguna uncionalidad e(tra! E(plicar< el archivo !h # !c que contienen de iniciones de las instrucciones del 'CD # las unciones mencionadas con anterioridad! Para ma#or in ormacin consultar el manual t<cnico :data sheet; del 'CD al anum<rico! Comencemos con el archivo de cabecera 'CD!h
/**************************************** * * "aDecera ara uso de +", en P-" * * Autor: Francisco Javier Garca Olmos * * Fecha: 91 de Enero de 2012 * *****************************************/ ?Acciones del dis laE $de&ine "+EA7 $de&ine "071O723O4E ?"ontrol del dis laE $de&ine $de&ine $de&ine $de&ine ,-1P+AF2"O587O+ ,O5 "071O72O5 !+-5H2O5 / / / / 0@0# 0@04 0@02 0@01 / / 0@01 0@02

?4odo de entrada $de&ine ,-1P+AF24O,E $de&ine -5"7E4E58 $de&ine 13-F8 / / / 0@04 0@02 0@01 / / / / 0@20 0@10 0@09 0@0: 0@0! 0@19 0@1: 0@1! 0@1F

?1hi&t2"ursor ,is laE $de&ine 13-F82"072+EF8 $de&ine 13-F82"0727-G38 $de&ine 13-F82,-1P2+EF8 $de&ine 13-F82,-1P27-G38 ?Function 1et $de&ine F05"8-O521E8 $de&ine E-G382!-8 $de&ine +-5E2'@: $de&ine +-5E2'@10 $de&ine +-5E12'@: $de&ine $de&ine $de&ine $de&ine ,,7A42+1 ,,7A42+2 ,,7A42+9 ,,7A42+4 / / / / / / / / / 0@#0 0@"0 0@I0 0@,0

1J

void "omando2+",=char>? void ,ato2+",=char>? void -nicialiJa2+",=void>?

-hora mostrar< el archivo C con las unciones que se usar)n en el proceso de escri* tura # con iguracin del 'CD al anum<rico!
/**************************************** * * Funciones ara uso de +", en P-" * * Autor: Francisco Javier Garca Olmos * * Fecha: 91 de Enero de 2012 * *****************************************/ $include %+",(h) $include %delaEs(h) $de&ine $de&ine $de&ine $de&ine 71 PO78,Dits(7,4 76 PO78,Dits(7,' E PO78,Dits(7,; Puerto PO78,

void "omando2+",=char dato> A char tem ? tem / dato? // 7es alda dato en tem dato / dato )) 4? // "orrimiento de cuatro lu*ares a la derecha Puerto / dato? // 5iDle alto en Puerto 76 / 0? // EscriDir en +", 71 / 0? // -ndica comando ara +", E / 1? // Activa Pulso de reloK ,elaE1H8"F@=;0>? // 7etardo de 'ms E / 0? // ,esactiva Pulso de reloK Puerto / tem ? // 5iDle DaKo en Puerto 76 / 0? // EscriDir en +", 71 / 0? // -ndica comando ara +", E / 1? // Activa Pulso de reloK ,elaE1H8"F@=;0>? // 7etardo de 'ms E / 0? // ,esactiva Pulso de reloK B void ,ato2+",=char dato> A char tem ? tem / dato? // 7es alda dato en tem dato / dato )) 4? // "orrimiento de cuatro lu*ares a la derecha Puerto / dato? // 5iDle alto en Puerto 76 / 0? // EscriDir en +", 71 / 1? // -ndica dato ara +", E / 1? // Activa Pulso de reloK ,elaE1H8"F@=;0>? // 7etardo de 'ms E / 0? // ,esactiva Pulso de reloK Puerto / tem ? // 5iDle DaKo en Puerto 76 / 0? // EscriDir en +",

27

71 / 1? E / 1? ,elaE1H8"F@=;0>? E / 0? B

// -ndica dato ara +", // Activa Pulso de reloK // 7etardo de 'ms // ,esactiva Pulso de reloK

void -nicialiJa2+",=> A ,elaE10H8"F@=19:>? Puerto/0@02? E/1? ,elaE1H8"F@=;0>? E/0? ,elaE1H8"F@=1'0>? "omando2+",=F05"8-O521E8 L +-5E12'@:>? "omando2+",=,-1P+AF2"O587O+ L ,O5>? "omando2+",="+EA7>? "omando2+",=,-1P+AF24O,E L -5"7E4E58>? B

'as tres unciones son mu# )ciles de entender$ mas sin embargo$ ser) tarea e(tra$ #a que por motivos de tiempo # espacio$ no podr< hacer en este documento$ solo e(plicar< su uncionamiento! 'a uncin ComandoC'CD recibe un par)metro # lo escribe en el 'CD en orma de comando! 'a uncin DatoC'CD tambi<n recibe un par)metro pero este lo escribir) en el 'CD como un D-/A # se mostrar)! 'a uncin Iniciali"aC'CD no recibe par)metros! +irve para con igurar el 'CD como un Displa# 'CD de 1D(2$ de matri" de 6(I # de incremento autom)tico! 8o se mostrar) el cursor # no parpadear) el caracter! +i se necesitan estas unciones$ cambiarlas en esta uncin! Procedimiento para escribir en el 'CDH 1! Iniciali"ar el 'CD! 2! 'impiar pantalla! 3! Moverse a la posicin deseada! 5! Escribir! .ueno$ entonces hagamos un pequeGo programa que muestre ?A'- en la pantalla pero antes mencionar< que se conectar) al puerto D! E4em&$# 16 Mostrar ?A'- en el 'CD de 1D(2! /#$%(i0n6 9tili"ar las unciones e(plicadas anteriormente$ as2 como el procedimiento! +e puede reali"ar una uncin e(tra para mostrar una cadena!

21

+olucin 1H
//5os saltaremos esta arte de la lantilla void main=> A A,"O51/0@0F? 87-1,/0@00? PO78,/0@00? -nicialiJa2+",=>? "omando2+",="+EA7>? "omando2+",=,,7A42+1 G ;>? ,ato2+",=M3M>? ,ato2+",=MOM>? ,ato2+",=M+M>? ,ato2+",=MAM>? PO78,/0? Chile=1> A B B

+olucin 2H
// 5os saltaremos esta char te@toNO/P3O+AP? void "adena2+",=char *cadena> //FunciQn Rue mostrarS una cadena A char *au@/cadena? Chile=au@T/50++> A ,ato2+",=*au@>? au@GG? B B void main=> A A,"O51/0@0F? 87-1,/0@00? PO78,/0@00? -nicialiJa2+",=>? "omando2+",="+EA7>? "omando2+",=,,7A42+1 G ;>? "adena2+",=te@to>? PO78,/0? Chile=1> A B B arte de la lantilla

+e puede observar que lo m)s complicado de entender son los comandos$ los datos se mandan consecutivamente sin ma#or problema! 9n punto importante es que se reali" una suma de D para despla"ar la memoria # centrar el te(to! +i no hubi<ramos hecho esta suma$ el te(to hubiera aparecido desde el primer car)cter en el 'CD! Abservar tambi<n que se reali" la uncin para mostrar te(to contenido en una cadena! 22

-hora veamos las cone(iones del 'CD! El 'CD tiene dos pines de alimentacin$ uno de contraste$ tres de control$ ocho de datos # dos e(tras en caso de que tenga lu" de ondo :bac> light;! F++ # FDD se conectan a E6F # tierra$ # el contraste FEE se conecta a un potencimetro de 17LU$ el pin 5 de control B+ :decide si es dato o comando; a BD5$ el pin 6 de control B% :lectura , escritura; va conectado a BD6 o a tierra$ el pin D de control E :habilitado; a BDD! De los siguientes ocho pines de datos solo se utili"ar)n los 0ltimos 5 :D5$ D6$ DD$ DI; que van conectados a BD7$ BD1$ BD2$ # BD3; los pines D7$ D1$ D2 # D3 no se conectan! En caso de lu" de ondo se conectaran a E6F # tierra los 0ltimos pines! El siguiente diagrama muestra la orma de cone(in del 'CD al anum<rico de 1D(2!

4orma de conectar el 'CD al anum<rico de 1D(2 sin lu" de ondo!

23

PROGRAMACIN CON INTERRUPCIONE/


En este cap2tulo veremos la programacin con interrupciones$ veremos m)s pro un* damente las direcciones de los vectores de interrupcin # las unciones I+B' e I+B?! Fere* mos los registros I8/CA8 # BCA8 que son los relacionados con las interrupciones! Primero e(plicar< que es una interrupcin! .)sicamente es una peticin que se le ha* ce al microprocesador o microcontrolador :no son lo mismo; para que de1e la tarea principal # haga una tarea espec2 ica! 9n e1emplo de una interrupcin es el BE+E/$ que de1a la tarea principal para reiniciar la memoria del microcontrolador!

C$! i*i(!(i0n de $! inte""%&(i#ne


+e pueden clasi icar las interrupciones de tres ormas distintasH Por enmascaramien * to$ por prioridad # por su locacin!

C$! i*i(!(i0n &#" enm! (!"!mient#


?a# dos tipos de interrupcionesH enmascarables # no enmascarables! 1! 'as interrupciones enmascarables son aquellas donde el microcontrolador puede decidir si la puede atender o no :enmascara la interrupcin;! 2! 'as interrupciones no enmascarables son aquellas que or"osamente se tienen que atender$ por e1emplo$ el BE+E/!

C$! i*i(!(i0n &#" &"i#"id!d


?a# dos tipos de interrupcionesH de alta prioridad # de ba1a prioridad! 1! 'as interrupciones de alta prioridad son aquellas que no pueden interrumpirse mien * tras son atendidas! 2! 'as interrupciones de ba1a prioridad si pueden interrumpirse por otras mientras son atendidas$ mas sin embargo su tiempo de respuesta es m)s amplio que el de una de alta prioridad!

C$! i*i(!(i0n &#" $#(!(i0n


?a# tres tipos de interrupcionesH Internas$ cambio de lanco # e(ternas! 1! 'as interrupciones internas son las que se provocan por los dispositivos embebidos en el microcontrolador$ como son tempori"adores$ -DC$ 9+.$ 9+-B/$ Comparadores$ etc! 2! 'a interrupcin por cambio de lanco es aquella que se activa al cambiar el estado del 25

nibble alto del puerto .! 3! 'as interrupciones e(ternas son las que se provocan al activar los tres primeros pines del puerto . :B.7$ B.1 # B.2;; se identi ican como I8/7$ I8/1 e I8/2! I8/7 siempre es de alta prioridad!

5e(t#"e de inte""%&(i0n
-ntes de comen"ar$ e(plicar< que es un vector! En algunos lengua1es de programa* cin como C -8+I$ CEE$ .-+IC$ etc$ se pueden reali"ar vectores de datos # se mane1an los datos a trav<s de un apuntador$ el cual contiene una direccin de memoria! 8osotros nos re eriremos a un vector de interrupcin a la posicin de memoria a la cual el microcontrolador se va a re erir cuando se realice una interrupcin! En los microcontroladores PIC18 ha# 3 vectores de interrupcinH BE+E/$ alta prioridad # ba1a prioridad! -ba1o e(plicare sus direccio* nesH 7(7777 7(7778 7(7718 MC'B I+B? I+B' Fector de interrupcin de BE+E/! Fector de interrupcin de alta prioridad! Fector de interrupcin de ba1a prioridad!

Estas direcciones se cargan autom)ticamente en el stac> de direcciones al reali"arse una interrupcin! Mas sin embargo$ cuando traba1amos con el .AA/'A-DEB$ estas direcciones cambian! 7(1777 7(1778 7(1718 BEM-PED MC'B BEM-PED I+B? BEM-PED I+B' Fector remapeado de BE+E/! Fector remapeado de alta prioridad! Fector remapeado de ba1a prioridad!

Como observamos$ son las que est)n en nuestra plantilla! Podr2amos hacer la rutina de interrupcin en esta direccin pero el espacio es mu# pequeGo$ lo que reali"amos es un salto a las unciones llamadas I+B? e I+B'! En estas rutinas$ #a podemos e(tendernos lo que sea necesario$ siempre # cuando nos alcance la memoria de programa del microcontro * lador PIC! Estos vectores los declararemos con Mpragma code como #a lo hab2amos menciona* do anteriormente! Mpragma code BEM-PEDCBE+E/CFEC/AB N 7(1777 void reset:; O Casm goto Cstartup Cendasm P

26

C#n*i,%"!" $! inte""%&(i#ne
'as interrupciones se con iguran cambiando sus bits espec2 icos en los registros de interrupcin I8/CA8$ I8/CA82$ I8/CA83$ PIB1$ PIB2$ IPB1$ PIB2$ PIE1 # PIE2! Para las interrupciones e(ternas # de cambio de lanco se usan solo los tres primeros registros men * cionados anteriormente! 'a 0nica interrupcin que no se con igura es BE+E/! El m<todo que se utili"a es el siguienteH 1! .orramos la bandera :4'-K; de interrupcin! 2! 'e damos una prioridad #a sea alta o ba1a$ e(cepto I8/7 que es de alta prioridad! 3! ?abilitamos la interrupcin! 5! ?abilitamos las interrupciones globales con BCA8! 6! ?abilitar las prioridades globales de las interrupciones con I8/CA8! 'as interrupciones globales son todas aquellas interrupciones enmascarables que ha# dentro del microcontrolador! +e activan colocando el bit IPE8 del registro BCA8 en uno! 'as prioridades globales se activan colocando en uno el bit KIE? para las interrupciones de alta prioridad # KIE' para las interrupciones de ba1a prioridad o ambas del registro I8/CA8! 'as interrupciones e(ternas tienen que con igurar tambi<n el lanco en el cual estas traba1an; este lanco puede ser de subida o de ba1ada$ esto signi ica que al presionar un botn$ el volta1e cambia de ba1o a alto para subida o de alto a ba1o para ba1ada! 9na con iguracin adicional es el uso de resistencias P9''*9P! Estas resistencias reali"an que el puerto . siempre est< estado alto # evitan que se usen resistencias uera del microcontrolador! +e activan colocando el bit B.P9 en cero del registro I8/CA82! -l utili"ar estas resistencias$ el lanco de las interrupciones e(ternas debe de ser de ba1ada # el botn debe de estar conectado a tierra para hacer un cambio a estado ba1o! Para ma#or re erencia de los registros I8/CA8$ BCA8 # los dem)s mencionados anteriormente$ revisar el manual!

Re:i !" $! inte""%&(i#ne


Cuando una interrupcin se ha reali"ado$ se enciende la bandera :4'-K; respectiva de cada interrupcin! Dependiendo de la con iguracin veri icamos que se ha reali"ado la interrupcin en las unciones I+B? o I+B'! 'a interrupcin e(terna I8/1 tiene su bandera :4'-K; en I8/CA8! El bit se llama I8/7I4 # est) en cero mientras no se ha producido la interrupcin # cambia a uno cuando se ha reali"ado! 9na accin mu# importante es b#""!" $! b!nde"! de *#"m! m!n%!$ para evitar que se realice el proceso de interrupcin cuando no se ha interrumpido el microcontrolador por esta interrupcin!

2D

E4em&$#6 Bevisar si se reali" la interrupcin I8/1 como interrupcin de ba1a prioridad!


$ ra*ma interru tloC -17+ void -17+=> A i&=-58"O59Dits(-581-F> //7evisar si se realiJQ or -581 A -58"O59Dits(-581-F/0? //!orrar la Dandera //1e*uir con el roceso de interru ciQn B B

+e observa que se reali" la palabra bits para veri icar cambios en el bit I8/1I4 del registro I8/CA83! +i hubiera m)s interrupciones habr2a que hacer el mismo procedimiento para cada una de ellas!

Inte""%&(i#ne e;te"n!
En este apartado me en ocar< solamente en las interrupciones e(ternas! Beali"ar< el cdigo de con iguracin de las tres interrupciones # posteriormente reali"ar< su veri icacin en las unciones I+B? e I+B'! E4em&$# 16 Beali"ar la con iguracin de las interrupciones e(ternas con resistencias de pull*up # lanco de ba1ada! I8/1 es de alta prioridad e I8/2 es de ba1a prioridad! Colocar el Puerto C como salida! /#$%(i0n 16 Beali"ar el procedimiento de con iguracin de las interrupciones toman* do en cuenta que I8/7 siempre es de alta prioridad! Colocar el puerto . como entrada # el puerto C como salida colocando /BI+. en uno # /BI+C en cero!
void main=> A A,"O51/0@0F? 87-1!/0@FF? 87-1"/0@00? PO78"/0@00? //"on&i*urar interru ciones //-580 -58"O5Dits(-580-F/0? //+im iamos la Dandera -F( -58"O52Dits(-58E,G0/0? //Flanco de DaKada( -58"O5Dits(-580-E/1? //3aDilitamos la interru ciQn //-581 -58"O59Dits(-581-F/0? //+im iamos la Dandera -F( -58"O52Dits(-58E,G1/0? //Flanco de DaKada( INTCON3bits.INT1IP=1; //-581 de alta rioridad(

2I

-58"O59Dits(-581-E/1? //3aDilitamos la interru ciQn( //-582 -58"O59Dits(-582-F/0? //+im iamos la Dandera -F( -58"O52Dits(-58E,G2/0? //Flanco de DaKada( INTCON3bits.INT2IP=0; //-582 de DaKa rioridad( -58"O59Dits(-582-E/1? //3aDilitamos la interru ciQn( //7esistencias de P0++U0P -58"O52Dits(7!P0/0? //-nterru ciones *loDales 7"O5Dits(-PE5/1? //3aDilitamos interru ciones *loDales( -58"O5Dits(G-E3/1? //3aDilitamos las interru ciones *loDales de alta // rioridad( -58"O5Dits(G-E+/1? //3aDilitamos las interru ciones *loDales de DaKa // rioridad( Chile=1> A B B

Del e1emplo anterior marque las con iguraciones alta # ba1a prioridad! E4em&$# 76 9sar I8/7 para encender BC7$ I8/1 para encender BC1 e I8/2 para apagar ambos bits! /#$%(i0n 76 Feri icar las interrupciones en las unciones de alta # ba1a prioridad!
void -173=> A i&=-58"O5Dits(-580-F> //7evisamos si -580( A -58"O5Dits(-580-F/0? //+im iamos la Dandera PO78"Dits(7"0/1? //Encendemos 7"0 B i&=-58"O59Dits(-581-F> //7evisamos si -581( A -58"O59Dits(-581-F/0? //+im iamos la Dandera PO78"Dits(7"1/1? //Encendemos 7"1 B B void -17+=> A i&=-58"O59Dits(-582-F> //7evisamos si -582 A -58"O52Dits(-582-F/0? //+im iamos la Dandera PO78"/0? //A a*amos el uerto( B B

En este e1emplo vemos el cambio de veri icacin entre unciones de ba1a # alta priori* dad # la orma en la que se reali"an los procedimientos requeridos para sus tareas respec * tivas! 28

Inte""%&(i0n de$ &%e"t# B &#" (!mbi# de *$!n(#


Esta interrupcin se activa cuando cambiamos el estado del nibble alto del puerto . :B.5$ B.6$ B.D # B.I;! +e activa cuando pasamos de estado ba1o a alto # cuando pasamos de estado alto a ba1o$ por eso su nombre de cambio de lanco! 'a interrupcin al igual que las interrupciones e(ternas$ se con igura # se le asigna prioridad sus respectivos bits # seg0n su prioridad$ se veri ica con su bandera :B.I4;! E4em&$# 16 Con igurar la interrupcin de cambio de lanco como interrupcin de alta prioridad! 9tili"ar resistencias de P9''*9P! Con igurar el puerto C como salida! /#$%(i0n 16 Beali"ar el procedimiento para con igurar interrupciones! +e tiene que con igurar el puerto . como entrada!
void main=> A A,"O51/0@0F? 87-1!/0@FF? 87-1"/0@00? PO78"/0@00? //"on&i*urar las interru ciones -58"O5Dits(7!-F/0? //+im iamos la Dandera( -58"O52Dits(7!-P/1? //+e asi*namos alta rioridad( -58"O5Dits(7!-E/1? //3aDilitamos la interru ciQn( //7esistencias de ullUu -58"O52Dits(7!P0/0? //-nterru ciones *loDales 7"O5Dits(-PE5/1? //3aDilitamos interru ciones *loDales( -58"O5Dits(G-E3/1? //3aDilitamos las interru ciones *loDales de alta // rioridad( //5o es necesario haDilitar las interru ciones *loDales de DaKa rioridad // or Rue no las usaremos( Chile=1> A B B

Como observamos en los comentarios$ no activamos las interrupciones de ba1a prioridad #a que no las vamos a usar! E4em&$# 76 Bevisar si se provoc una interrupcin por cambio de lanco! +i sucedi$ veri icar que botn ue apretado! B.5 encender) o apagar) seg0n el estado de BC7$ B.6 encender) o apagar) seg0n el estado de BC1$ B.D cambiar) el estado de cada 'ed # B.I apagar) los 'eds! 2J

/#$%(i0n 76 Feri icar que ha#a sucedido la interrupcin # veri icar que botn est) en cero :estado apretado;! /omar en cuenta que se utili"a lgica negativa por el uso de las resis* tencias de P9''*9P!
void -173=> A i&=-58"O5Dits(7!-F> A -58"O5Dits(7!-F/0? //lim iamos la Dandera( i&=TPO78!Dits(7!4> A PO78"Dits(7"0V/1? //"amDiar el estado B else i&=TPO78!Dits(7!'> A PO78"Dits(7"1V/1? //"amDiar el estado B else i&=TPO78!Dits(7!;> A PO78"Dits(7"0V/1? //"amDiar el estado PO78"Dits(7"1V/1? //"amDiar el estado B else i&=TPO78!Dits(7!:> A PO78"/0? //A a*ar el uerto( B B B

de 7"0(

de 7"1(

de 7"0( de 7"1(

Como podemos observar$ adem)s de preguntar por la interrupcin$ ha# que pregun* tar por el botn que se ha apretado! Como usamos lgica negativa$ cuando se presiona un botn$ el bit queda en estado ba1o # el microcontrolador lo reconoce como cero lgico! SVu< pasa si se aprietan dos botones al mismo tiempoT Pues viendo el algoritmo$ el m)s ba1o ser) el que recono"ca como apretado$ el otro$ ser) desechado! /ambi<n podr2amos usar operaciones -8D para ver si se apretaron dos al mismo tiempo! +in embargo por alta de espacio # de tiempo$ ser) tarea adicional del lector hacerlo! - partir de ahora$ todo lo que veamos ser) programado con interrupciones! /odos los mdulos embebidos en el microcontrolador tienen interrupciones # se veri icar)n # con igura * r)n e(actamente igual que como lo hicimos con estas dos interrupciones!

37

PROGRAMACIN DE <ARD=ARE INTERNO > EXTERNO


En este cap2tulo enseGar< a programar hard&are e(terno e interno! Como hard&are e(terno$ enseGar< el uso de Displa# de I segmentos$ teclado matricial de 5(5 # como conec * tar transistores$ puente ? # compuertas lgicas con el PIC1845667! Como hard&are interno enseGar< a programar los tempori"adores # contadores$ as2 como el mdulo -DC!

E$ di &$!' de ? e,ment#
El displa# de I segmentos unciona con un cdigo llamado .CD! Podemos reali"ar el algoritmo lgico de conversin de binario a .CD o reali"ar un vector en C que contenga di * cho cdigo guardado en memoria! El vector se traba1a e(actamente igual a C -8+I! E4em&$# 16 Beali"ar un vector con el cdigo en .CD ordenado de menor a ma#or para controlar un displa# de I segmentos! /#$%(i0n 16 Declarar el vector de tipo char con 17 espacios de memoria como varia* ble global!
char DcdN10O/A0@9FW 0@0;W 0@'!W 0@4FW 0@;;W 0@;!W 0@:!W 0@#:W 0@EFW 0@;FB?

Como vemos$ es )cil reali"ar este vector! -hora veremos como recuperar el cdigo en una interrupcin! E4em&$# 76 Beali"ar el algoritmo de interrupcin de I8/7! Para que cada ve" se pre* sione$ aumente un contador hasta el J$ llegando a este punto$ reiniciarlo! Mostar el resultado en .CD en el puerto D! /#$%(i0n 76 Beali"ar el algoritmo en I+B? comprobando la interrupcin I8/7$ reali* "ando comparaciones$ incrementos # obtener los datos del vector reali"ado anteriormente!
$ ra*ma interru t -173 void -173=> A i&=-58"O5Dits(-580-F> A -58"O5Dits(-580-F/0? //!orramos la Dandera i&=contador//I> contador/0? //1i el contador es I colocamos cero else contadorGG? //Aumentamos el contador( PO78,/DcdNcontadorO? //"olocamos en el uerto , el cQdi*o en !",(

31

Con este pequeGo algoritmo$ hemos reali"ado un contador con interrupciones # un displa# de I segmentos! N#t! 16 Como estamos usando lgica positiva$ solo podemos usar un displa# de I segmentos de c)todo com0n! 9tili"ar lgica negativa en la tabla para usar un displa# de )no * do com0n o utili"ar un inversor e(terno I5'+75 o I5?+75! 8ota 2H PBEC-9CIW8$ el PIC1845667 solo puede mane1ar corrientes in eriores a los 26m-$ si superamos esta corriente podemos quemar el pin$ puerto o todo el microcontro* lador! Para reali"ar operaciones con m)s corrientes utili"ar .944EB de corriente :I5'+256;$ Inversores :I5'+75; o transistores en orma de interruptor!

Te($!d# M!t"i(i!$
El teclado matricial que demostrar< en este apartado$ es uno de 5(5 :1D teclas;! 9tili"aremos para su decodi icacin la interrupcin de cambio de nivel # la mitad del puerto . como salida! Este teclado tiene 5 ilas # cuatro columnas$ lo cual nos da un n0mero de 8 l2neas de datos :cables de alimentacin;! /odas las lineas de alimentacin del teclado ir)n al puerto .! 'a mitad alimentar) al teclado # la otra mitad reali"ar) la interrupcin de cambio de nivel cuando una tecla se pre * sione$ para ello es necesario activar las resistencias de P9''*9P # colocar el primer nibble en cero! Cuando se realice una interrupcin se tendr) que colocar el puerto en 1 e ir cam * biando el cero de lugar hasta obtener la tecla que se presion! 'a comprobacin se hace en cero por el uso de resistencias de P9''*9P$ entonces se utili"a la lgica negativa! ProcedimientoH 1! El primer paso es colocar en cero el nible ba1o o todo el puerto .! 2! -l presionar una tecla se interrumpe el microcontrolador! 3! Colocar el nible ba1o en uno o todo el puerto .! 5! Colocar un cero en el bit 7 del puerto .! +i est) la tecla$ veri icar el cdigo en el nibble alto para decodi icarla # inali"ar$ en caso contrario$ seguir al paso 6! 6! Colocar un cero en el bit 1 del puerto .! +i est) la tecla$ veri icar el cdigo en el nibble alto para decodi icarla # inali"ar$ en caso contrario$ seguir al paso D! D! Colocar un cero en el bit 2 del puerto .! +i est) la tecla$ veri icar el cdigo en el nibble alto para decodi icarla # inali"ar$ en caso contrario$ seguir al paso I! I! Colocar un cero en el bit 3 del puerto .! Decodi icar la tecla usando el nibble alto! +i no se encuentra$ se ha de1ado de apretar la tecla$ entonces$ salir! Becordemos que al de1ar de presionar la tecla se vuelve a reali"ar la interrupcin por el cambio de lanco$ en este caso$ no decodi icaremos nada # tenemos que salir sin mostrar nada! 32

Para decodi icar las teclas se veri ica que pin se apaga! 9tili"ar el nibble ba1o como multiplicador el nibble alto como sumador! El nible ba1o codi ica ilas # el alto codi ica colum * nas! E1emploH 'a tecla 8 est) en la posicin J tomando como re erencia la posicin inicial co* mo cero :es la d<cima tecla;; est) en la ila 3 columna 2! Encontraremos presionada la tecla cuando el cero est< en B.2 : ila 3; # el pin que se activar) ser) B.6 :columna 2;! Entonces tendr2amos que reali"ar una multiplicacin de ilas X 1 por cuatro :n0mero de ilas; # sumar columnas X 1! /ecla N ::Columnas X 1; Y 5;E :4ilas X 1; N :3 X 1; Y 5 E :2 X 1; N :2 Y 5; E 1 N 8 E 1 N J! +i reali"amos una tabla con valores -+CII :di erentes a los .CD; # recorremos el n0mero de tecla # lo mostramos en el 'CD al anum<rico$ tendremos las teclas decodi icadas! -qu2 de1o una imagen del teclado matricial para que vean cuales son las teclas que tiene # cual es el orden que tienen cada una de ellas!

En el mercado se puede encontrar el teclado matricial con letras en ve" de los s2m* bolos de operaciones aritm<ticas$ en su lugar$ letras -$ .$ C$ D$ Y en ve" de A8,C # M en ve" de igual! +in embargo$ dependiendo de la codi icacin que le demos ser) la e1ecucin que reali"ar)! En nuestro caso$ solo se mostrar) la tecla en el 'CD al anum<rico! Bealicemos un programa completo! En este programa pondremos a prueba todo lo a* prendido en los temas anteriores # algo de imaginacin$ as2 como algunos trucos para su reali"acin! E4em&$# 16 Beali"ar el programa de decodi icacin del teclado matricial en una interrupcin de cambio de lanco de alta prioridad$ el vector con cdigo -+CII de cada tecla # el cdigo para mostrar en el 'CD! 33

/#$%(i0n 16 Beali"ar un programa completo que inclu#a tablas$ 'CD$ variables e in* terrupciones! 'a decodi icacin se deber) reali"ar con el procedimiento mencionado anterior* mente! N#t!6 Para evitar perdernos en el programa$ ordenaremos las instrucciones en un* ciones! De ahora en adelante el lector deber2a tomar este h)bito para hacer el cdigo m)s e* legante!
/*********************************************************************** * Autor: Francisco Javier Garca Olmos * * Fecha: 1 de FeDrero de 2012 * * Archivo: teclado(c * * ,escri ciQn: Pro*rama ara decodi&icar el teclado matricial * ***********************************************************************/ $include % 1#&4''0(h) $include %delaEs(h) $include Xlcd(hP /**************** !its $ ra*ma con&i* P++,-. $ ra*ma con&i* "P0,-. $ ra*ma con&i* 01!,-. $ ra*ma con&i* FO1" $ ra*ma con&i* F"4E5 $ ra*ma con&i* -E1O $ ra*ma con&i* P678 $ ra*ma con&i* !O7 $ ra*ma con&i* !O7. $ ra*ma con&i* .7EGE5 $ ra*ma con&i* 6,8 $ ra*ma con&i* 6,8P1 $ ra*ma con&i* 4"+7E $ ra*ma con&i* +P81O1" $ ra*ma con&i* P!A,E5 $ ra*ma con&i* ""P24< $ ra*ma con&i* 18.7E5 $ ra*ma con&i* +.P $ ra*ma con&i* -"P78 $ ra*ma con&i* <-518 $ ra*ma con&i* "P0 $ ra*ma con&i* "P1 $ ra*ma con&i* "P2 $ ra*ma con&i* "P9 $ ra*ma con&i* "P! $ ra*ma con&i* "P, $ ra*ma con&i* 6780 $ ra*ma con&i* 6781 $ ra*ma con&i* 6782 $ ra*ma con&i* 6789 $ ra*ma con&i* 678! $ ra*ma con&i* 678" $ ra*ma con&i* 678, $ ra*ma con&i* E!870 de "on&i*uracion *************************************/ / ' / O1"12P++2 / 2 / 31P++231 / OFF / OFF / OFF / O5 / 9 / O5 / OFF / 92:;# / O5 / OFF / OFF / O5 / O5 / OFF / OFF / OFF / OFF / OFF / OFF / OFF / OFF / OFF / OFF / OFF / OFF / OFF / O5 / OFF / OFF / OFF

35

$ $ $ $

ra*ma ra*ma ra*ma ra*ma

con&i* con&i* con&i* con&i*

E!871 E!872 E!879 E!87!

/ / / /

OFF OFF OFF OFF

char char char char

teclasNO/P:#I/4';<129U"0/GP? mensaKeNO/P8E"+A P7E1-O5A,AP? estadoN4O/A0!11111110W 0!11111101W 0!11111011W 0!11110111B? &ilasW columnasW teclaW uertoW i?

void -173=>? void -17+=>? e@tern void 2startu =void>? $ ra*ma code 7E4APPE,27E1E82.E"8O7 / 0@1000 void 2reset =void> A 2asm *oto 2startu 2endasm B $ ra*ma code 3-G327E4APE,2.E"8O721E"8O7 / 0@100# void hi*h2rema ed2vector=> A 2asm *oto -173 2endasm B $ ra*ma code +O627E4APE,2.E"8O721E"8O7 / 0@101# void loC2rema ed2vector=> A 2asm *oto -17+ 2endasm B $ ra*ma code $ ra*ma interru t -173 void -173=> A B $ ra*ma interru tloC -17+ void -17+=> A i&=-58"O5Dits(7!-F> A -58"O5Dits(7!-F/0? //!orramos la Dandera tecla/0? &ilas/0? columnas/0? &or=i/0?i%4?iGG> A PO78!/estadoNiO? uerto/PO78!? uerto/ uerto))4? //"amDiamos los niDles(

36

uerto/ uerto L 0@F0? //1olo nos interesa la mitad del uerto // ero como es lQ*ica ne*ativa se usa o eraciQn O7( uerto/Y uerto? //"om lemento ara lo*rar lQ*ica ositiva( i&= uerto> A columnas/i? i&= uerto Z 0!00000001> &ilas/0 else i&= uerto Z 0!00000010> &ilas/1? else i&= uerto Z 0!00000100> &ilas/2? else &ilas/9? tecla/=columnas*4>G&ilas? "omando2+",=,,7A42+2G#>? ,ato2+",=teclasNteclaO>? PO78!/0?

B B B B

void "adena2+",=char *cadena> A char *au@/cadena? Chile=*au@> A ,ato2+",=*au@>? au@GG? B B void "on&i*ura2Puertos=> A A,"O51/0@0F? 87-1!/0@F0? 87-1,/0@00? PO78,/0@00? B void "on&i*ura2-nterru ciones=> A -58"O5Dits(7!-F/0? //+im iamos la Dandera( -58"O52Dits(7!-P/1? //+e asi*namos alta rioridad( -58"O5Dits(7!-E/1? //3aDilitamos la interru ciQn( B void main=> A "on&i*ura2Puertos=>? "on&i*ura2-nterru ciones=>? -niJialiJa2+",=>? "omando2+",=,,7A42+1>? "adena2+",=mensaKe>?

3D

//7esistencias de P0++U0P -58"O52Dits(7!P0/0? //-nterru ciones GloDales 7"O5Dits(-PE5/1? //Prioridades de interru ciones( -58"O5Dits(G-E3/1? //-nterru ciones *loDales de alta Chile=1> A B B

rioridad(

El vector de teclas es para el teclado mostrado en la igura anterior$ ha# teclados co* merciales di erentes con di erentes teclas como #a se mencion anteriormente; ha# que cambiar el orden de las teclas para esos teclados! Posiblemente se te haga di 2cil de entender este programa por su lgica$ pero est) comprobado$ lo arm< 2sicamente # lo simul< en el programa Proteus I :+o t&are de simula * cin;$ con un PIC1845D27 parecido al PIC1845667! Muestro la imagen siguiente de la simu * lacin!

-s2 como est) el programa$ no unciona en el so t&are Proteus I$ necesitas cambiar las direcciones de interrupcin como si no tuviera bootloader! Cambiando eso$ unciona per * ectamente!

3I

Tem&#"i@!d#"e ' (#nt!d#"e


El PIC1845667 tiene 5 tempori"adores :/IMEB; con unciones di erentes pero mu# parecidas entre si! Podemos utili"ar el /imer como contador de eventos e(ternos$ lo e(plicar< m)s adelante$ #a que e(plicar< su registro de con iguracin! En este manual solo e(plicar< dos /imer :/imer 7 # /imer 1;$ e(plicar< su uncionamiento$ # e(plicar< como hacer un se * gundero$ un contador de eventos e(ternos # un generador de recuencias! SVu< se puede hacer con un /imerT Kenerador de recuencia! Modulador de ancho de pulso :P%M;! +egundero! Belo1 con echa a partir del segundero! Medidor de recuencia! Medidor de capacitancia a partir del medidor de recuencia! Medidor de resistencia a partir del medidor de recuencia! Medidor de inductancias a partir del medidor de recuencia! Control de motores de CD a partir de P%M! Control de servomotores a partir de P%M! Muestreadores de datos a partir de -DC :-DC lo e(plicar< mas adelante;! Belo1 de pulsos! Dimmer Digital :Controlador de intensidad de lu" de ocos de C-;! Comunicacin serial a partir del relo1 de pulsos!

Por motivos de espacio # de tiempo no dar< lo que es comunicacin serial en este manual :9+-B/$ 9+. # otros m)s;!

Re,i t"# de (#n*i,%"!(i0n


E(plicar< mu# brevemente el registro de con iguracin del /IMEB 7 llamado /7CA8! Este registro controla el uncionamiento del /imer para usarse como tempori"ador o como contador$ con igura su prescaler # el n0mero de bits a usar! El registro /7CA8 :para el timer 7; tiene los siguientes elementosH bit I /MB7A8H Enciende o apaga el /imer! bit D /78.I/H En 1 con igura el timer a 8 bits$ en cero$ lo con igura a 1D bits! bit 6 /7C+H En uno$ selecciona al pin B-5 como entrada de eventos$ en cero$ 38

selecciona al oscilador principal para el retardo! bit 5 /7+EH +olo se usa para entrada de eventos de B-5$ en uno$ selecciona lanco de ba1ada$ en cero$ selecciona lancos de subida! bit 3 P+-H En 1 no asignamos prescaler$ en cero$ asignamos prescaler! bits 2 a 7 /AP+H +elector de prescaler en caso de que P+- sea cero! 111 N 1H26D 117 N 1H128 Prescale value 171 N 1HD5 Prescale value 177 N 1H32 Prescale value 711 N 1H1D Prescale value 717 N 1H8 Prescale value 771 N 1H5 Prescale value 777 N 1H2 Prescale value

Time"
SVu< es un /imerT Es un contador de ciclos de m)quina o contador de ciclos de un oscilador e(terno$ que al desbordarse produce una interrupcin! /ambi<n puede contar pul * sos e(ternos! SCmo unciona un /imerT Cuenta n0meros del 7 al 266 cuando se con igura en 8 bits :lo e(plico m)s adelante; o al D663D en caso de con igurarlo de 1D bits! Puede contar ciclos de m)quina :en caso de usar el oscilador principal; o contar eventos e(ternos :usando osciladores e(ternos o pulsos de alg0n circuito e(terno como el amosisimo 8E666$ lip* lops$ o simplemente botones P9+?; en un pin espec2 ico del cada timer! Cuando el timer llega a su cuenta m)(ima m)s uno :se desborda; activa una interrupcin! Dicha interrupcin$ se puede utili"ar como interrupcin de alta prioridad o de ba1a prioridad :Fer tema con igurar interrupciones;! SCmo usar un /imerT -ntes de comen"ar$ vamos a de inir un t<rmino que se llama prescaler$ que es una divisin de recuencia! E1emplo$ si tengo una recuencia principal de 27M?" # un prescaler de 1$ tengo la misma recuencia inal de 27M?"$ si tengo el prescaler de 2$ la recuencia es de 17M?"$ si tengo un prescaler de 5 tengo una recuencia de 6M?"! Como se observa$ el prescaler provoca que mis tiempos sean m)s largos # pueda alcan"ar una cierta recuencia m)s )cilmente! Para utili"ar el timer vamos a recurrir nuevamente al n0mero m)gico M usado en retardos$ pero con una pequeGa variante$ que es la multiplicacin por el prescaler # la posibilidad de usar 1D bits!

3J

/ presc( 2n 4 ) t= Fosc t Fosc n 4 = 2 ( ) / presc t /0 &H' 4 = 2n( ) / presc DondeH n es el n0mero de bits$ pueden ser 8 o 1D! t es el tiempo del timer! 4ocs es la recuencia del oscilador$ en caso de bootloader es de 58M?"! Presc es el prescaler utili"ado$ este valor se puede proponer de 1 a 128! E4em&$# 16 Beali"ar el c)lculo del n0mero m)gico para obtener un retardo de apro(i* madamente 1!26ms con 8 bits! Proponer el prescaler! /#$%(i0n 16 Despu<s de varios intentos$ obtuve un prescaler de D5 para un buen n0* mero m)gico no mu# grande$ pero tampoco mu# pequeGo! 1)25ms/0M1z ) /6/ 60000 4 = 256( ) 256 4 = 256 2/2)27 4 = 21)62 4 22 Este n0mero ser) colocado en el registros /MB7' # colocar cero en /MB7?! En ca * so de ser un n0mero de 1D bits$ se debe de convertir en he(adecimal # el nibble alto deber) de colocarse en /MB7? # el nibble ba1o deber) de colocarse en /MB7'! 4 = 20( SCmo con iguro el timerT +eg0n el registro de con iguracin /7CA8 deberemos de colocar los siguientes valoresH Encender el timer! Con igurarlo a 8 bits :para el e1emplo de 1!26ms;! +eleccionar el oscilador principal! 8o importan los lancos! Colocar cero! -signar prescaler! El prescaler es de D5!

El n0mero que se debe de colocar en binario ser2a .Z11777171Z en he(adecimal nos quedar2a 7(C6! 57

E4em&$# 76 Beali"ar el programa de con iguracin del /imer 7 a 8 bits para 1!26ms # reali"ar su interrupcin de alta prioridad para cambiar el estado de BC7 en este tiempo! /#$%(i0n 76 Con igurar el programa con los n0meros obtenidos anteriormente # con igurar la interrupcin del /IMEB7! En la uncin I+B? colocar la operacin (or para cam * biar el estado de BC7!
$ ra*ma interru t -173 void -173=> A i&=-58"O5Dits(8470-F> A -58"O5Dits(8470-F/0? //!orramos la Dandera( PO78"Dits(7"0V/1? //"amDio de estado del in 7"0( 84703/0? B B void "on&i*ura2Puertos=> A A,"O51/0@0F? 87-1"/0? PO78"/0? B void "on&i*ura2-nterru ciones=> A -58"O5Dits(8470-F/0? //+im io la Dandera( -58"O52Dits(8470-P/1? //Alta rioridad( -58"O5Dits(8470-E/1? //3aDilito la interru ciQn( B void "on&i*ura28imer=> A 84703/0? 8470+/22? 80"O5/0@"'? B void main=> A "on&i*ura2Puertos=>? "on&i*ura2-nterru ciones=>? "on&i*ura28imer=>? 7"O5Dits(-PE5/1? -58"O5Dits(G-E3/1? Chile=1> A B B

Como observamos en la uncin de interrupcin$ volvemos a con igurar el /imer #a que$ como mencion< anteriormente la interrupcin se reali"a cuando el contador vuelve a ce* ro # debemos volver a cargar el n0mero para que cuente nuevamente el ciclo de 1!26ms! N#t!6 El /imer 1 tiene una con iguracin mu# parecida al /IMEB 7$ con la di erencia 51

que el /imer 2 puede contener un oscilador e(terno en BC7 # BC1 para un conteo de even* tos! +i colocamos un oscilador de ba1a recuencia$ podemos reali"ar un segundero! Beco * miendo usar el de 32L?" :32ID8 ?"; # cargar en /MB1? 7(87 # /MB7' 7(77! Este programa lo e(plicar< en la seccin segundero!

C#nt!d#"e
'os contadores de eventos son /imers que en ve" de contar ciclos de oscilador$ cuentan pulsos e(ternos! +i contamos el n0mero de pulsos en un segundo$ tenemos un recuenciometro; por el contrario$ si queremos que a cierto n0mero de cuentas se realice una interrupcin$ debemos de colocar un n0mero en /MB7' para alcan"ar dicha cuenta! En este caso$ como no usamos oscilador interno$ no dividimos la recuencia en 5! Para con igurar el contador en el registro /7CA8 debemos de considerar lo si * guienteH Encender el /imer Con igurarlo a 8 o 1D bits! +eleccionar eventos e(ternos! +eleccionar el lanco del pulso! 8o asignar prescaler para tiempo real! El prescaler es irrelevante por que no ha sido asignado!

Por lgica digital todos los valores irrelevantes los consideramos cero! El valor obtenido con lancos de subida es 7(48! E4em&$# 16 Beali"ar un programa con /IMEB7 que interrumpa al microcontrolador cuando sea apretado 6 veces un botn en B-5! 'a interrupcin deber) ser de alta prioridad # el lanco deber) de ser de subida # al reali"arse deber) de cambiar de estado BC7 de orma repetitiva! /omar en cuenta que B-5 no tiene resistencias de P9''*9P ni P9''*DA%8! /#$%(i0n 16 El n0mero m)gico deber) ser 261 para que cuando lleguemos a 266E1 se interrumpa el microcontrolador! El circuito e(terno deber) ser un push conectado a E6F con una resistencia de 1L a tierra! El nodo de la resistencia # botn$ deber) ser llevado a B-5!
$ ra*ma interru t -173 void -173=> A i&=-58"O5Dits(8470-F> A -58"O5Dits(8470-F/0? //+im iamos la Dandera( PO78"Dits(7"0V/1? //"amDiamos el estado( "on&i*ura28imer=>? B B

52

void "on&i*ura2Puertos=> A A,"O51/0@0F? 87-1"/0@00? //Puerto " como salida( PO78"/0@00? 87-1A/0@FF? //Puerto A como entrada( B void "on&i*ura2-nterru ciones=> A -58"O5Dits(8470-F/0? //+im iar la Dandera -58"O52Dits(8470-P/1? //-nterru ciQn de alta rioridad( -58"O5Dits(8470-E/1? //3aDilito la interru ciQn( B void "on&i*ura28imer=> A 84703/0@00? 8470+/0@0'? 80"O5/0@F#? B void main=> A "on&i*ura2Puertos=>? "on&i*ura2-nterru ciones=>? "on&i*ura28imer=>? 7"O5Dits(-PE5/1? -58"O5Dits(G-E3/1? Chile=1> A B B

Como observamos es realmente similar a un tempori"ador$ pero cambiando solo el n0mero de /7CA8! Como e(plique anteriormente podemos desactivar la interrupcin # contar el n0mero de pulsos en 1 seg! 'eemos el registro /MB7' #,o /MB7? # con eso conseguimos reali"ar un recuenciometro!

E$ C#n:e"tid#" An!$0,i(# Di,it!$


El convertidor analgico digital :-nalogic to Digital Converter -DC; es un mdulo em * bebido en el microcontrolador # su uncin es reali"ar la cuanti icacin de niveles de volta1e en periodos de tiempo discretos :muestreo;! Para los que no saben lo que hablo # como no dar< clases de comunicaciones digitales o procesamiento digital de seGales$ lo e(plicar< con las palabras m)s concretas que se puedanH Cambia un valor de volta1e analgico en un valor digital en un pequeGo instante! Para utili"ar el convertidor analgico*digital :-DC; es necesario con igurar tres regis* trosH -DCA87$ -DCA81 :#a usado anteriormente; # -DCA82! El m)s di 2cil de con igurar # de entender es -DCA82$ pues este registro con igura tiempos de retardo para carga del ca * pacitor de medicin$ tiempos de conversin # tiempos de digitali"acin; adem)s de esto$ tam* bi<n con igura la 1usti icacin del resultado! -DCA81 con igura los puertos analgicos o digi* 53

tales a usar como #a lo hab2amos reali"ado anteriormente$ as2 como uentes de re erencia en caso de usarlas! El registro -DCA87 con igura el canal con el que se va a medir # pone en marcha la conversin! El resultado de la conversin puede ser 1usti icado a la i"quierda o derecha para obtener un resultado en 8 o 17 bits respectivamente en los registros -DBE+? # -DBE+'! [usti icacin a la derecha me da un resultado de 17 bits! -DBE+? *\ 7.77777711 -DBE+' *\ 7.11111111 'os bits de ma#or peso digital est)n en -DBE+? # los dem)s est)n en -DBE+'! Para la 1usti icacin a la i"quierda tenemos lo siguienteH -DBE+? *\ 7.11111111 -DBE+' *\ 7.11777777 'os bits de ma#or peso tambi<n est)n en -DBE+?$ # en -DBE+' solo tenemos 3 bits que pueden ser descartados por tener menor peso digital$ equivalentes a milivolts que podemos despreciar! En este caso solo haremos caso de -DBE+?$ que es un registro de 8 bits$ por ende$ tenemos el resultado de 8 bits! -hora e(plicare cada uno de los tres registros$ comen"ando por -DCA82$ que es el m)s di 2cil # terminando con -DCA87! El registro -DCA82 puede solo tener un valor siempre$ # no se cambiar)! Este valor lo calcul< con las rmulas # valores que propone el manual del microcontrolador PIC1845667 # siempre ser) el mismo$ pero a pesar de esto$ e(plicar< el registro con sus bits! bit I -D4MH 1 [usti icado a la derecha$ 7 [ustidicado a la i"quierda! bit D 8o se usa! bit 6*5 -CV/H /iempos de adquisicin del dato! Para obtenerlo se usa la rmula MY/-DN2!5ms donde M es el valor de -CV/ # /-D es n veces /osc :n se ver) en el siguiente apartado;! 111 N 27 /-D 117 N 1D /-D 171 N 12 /-D 177 N 8 /-D 711 N D /-D 717 N 5 /-D 771 N 2 /-D 777 N 7 /-D bit 2*7 -DC+ /iempos de carga del -DC! Para obtenerlo se usa la rmula nY/osc \N I77ns$ donde n es el -DC+ # /osc es el inverso de la recuencia del oscilador :58M?" para bootloader;! 55

111 N 4BC :cloc> derived rom -,D BC oscillator; 117 N 4A+C,D5 171 N 4A+C,1D 177 N 4A+C,5 711 N 4BC :cloc> derived rom -,D BC oscillator; 717 N 4A+C,32 771 N 4A+C,8 777 N 4A+C,2 El valor a colocar en este registro cuando usamos bootloader es de 7(7E! +in bootloader este valor es de 7(16! Becordemos que los valores de la recuencia cambian con el bootloader$ por eso$ el valor de -DCA82 di iere! El registro -DCA81 se utili"a para con igurar las uentes de re erencia$ pines anal * gicos # pines digitales! bit I*D 8o se usan bit 6 FC4K1H Folta1e de re erencia negativo$ cuando es uno se usa FBE4* :-82;$ cuando es cero se usa F++ :K8D;! bit 5 FC4K7H Folta1e de re erencia psotivo$ cuando es uno se usa FBE4E :-83;$ cuando es cero se usa FDD :E6F; bit 3*7 PC4KH +eleccin de canales! :Fer tabla de manual$ donde D es pin digital # es pin analgico;! Por motivos de aprendi"a1e colocar< la tabla que viene en el manual! PC4 -812 -811 -817 -8J 7777 7771 7717 7711 7177 7171 7117 7111 1777 1771 1717 D D D D D D D D D D D D D D D D D D D D D D D D D D -88 D D D D -8I D D D -8D D D -86 D -85 -83 -82 -81 -87 -

56

1711 1177 1171 1117 1111

D D D D D

D D D D D

D D D D D

D D D D D

D D D D D

D D D D D

D D D D D

D D D D D

D D D D D

D D D D

D D D

D D

Como podemos apreciar en la tabla$ si no utili"amos volta1es de re erencia # selec * cionamos todos los pines digitales$ obtenemos el n0mero 7(74$ que es el valor por de ecto que hasta este momento se utili" en el registro -DCA81! -hora$ dependiendo de nuestras necesidades$ colocaremos el valor respectivo en este registro para seleccionar pines analgicos! El registro -DCA87 se usa para seleccionar el canal a medir$ #a que solo podemos medir un canal en un instante de tiempo! /ambi<n se utili"a para encender el mdulo -DC # para iniciar una conversin! bit I*D no se usan! bit 6*2 +eleccin del canal a medir! 7777 N Channel 7 :-87; 7771 N Channel 1 :-81; 7717 N Channel 2 :-82; 7711 N Channel 3 :-83; 7177 N Channel 5 :-85; 7171 N Channel 6 :-86;:1$2; 7117 N Channel D :-8D;:1$2; 7111 N Channel I :-8I;:1$2; 1777 N Channel 8 :-88; 1771 N Channel J :-8J; 1717 N Channel 17 :-817; 1711 N Channel 11 :-811; 1177 N Channel 12 :-812; 1171 N 9nimplemented:2; 1117 N 9nimplemented:2; 1111 N 9nimplemented:2; bit 1 KA,:]DA8E;H Estado de la conversin! bit 7 -DCA8H Encendido o apagado del -DC!

5D

El mdulo -DC al igual que todos los mdulos del PIC1845667 tiene su interrupcin # se con igura como se e(plic en el cap2tulo interrupciones! -hora que e(plique algo acerca de los registros de con iguracin del -DC # sus registros de resultado$ veamos un pequeGo e1emplo! E4em&$# 16 Beali"ar un programa que codi ique el valor obtenido en -87$ sin uentes de re erencia$ 1usti icado a la i"quierda con resultado de 8 bits! +i el valor obtenido es menor a 1!6v conmutar BC7 a 67ms$ si es ma#or a 1!6v # menor a 3v$ conmutar BC7 a 277ms # si es ma#or a 3 volts$ conmutar BC7 a 677ms! 9tili"ar /imer7 para reali"ar el retardo! 'as inte * rrupciones ser)n de alta prioridad! /#$%(i0n 16 Con igurar -DC como se mencion anteriormente$ con igurar las inte* rrupciones como se mencion en su cap2tulo respectivo # conectar adecuadamente un potencimetro en el pin B-7 :-87;! Re(#mend!(i0n 16 Por electrnica lineal$ utili"aremos un ampli icador en modo seguidor para evitar que el volta1e se modi ique por la resistencia de entrada del PIC!

Re(#mend!(i0n 76 9tili"ar el /imer7 a 1D bits! Primero$ calculamos el n0mero m)gico de los tiempos proponiendo el prescaler de D5!

5I

677msH MN 2^1D * :677ms Y 58M?"; , :5 Y D5; MN18DD1 MN7(58E6 277msH MN2^1D * :277ms Y 58M?"; , :5 Y D5; MN2873D MN7(DD85 67msH MN2^1D * :67ms Y 58M?"; , :5 Y D5; MN6D1D1 MN7(D.D1 +egundo$ calculamos los valores de volta1eH para 1!6 vH resolucinN6v,266 :8bits; resN7!1JD nN1!6,res nNID!6 apro( II para 3v nN3,res nN163 -hora con estos valores programamos el cdigo!
char valoradc? //.ariaDle *loDal ara *uardar el resultado de la mediciQn( $ ra*ma interru t -173 void -173=> A i&=-58"O5Dits(8470-F> A -58"O5Dits(8470-F/0? //+im iamos la Dandera( PO78"Dits(7"0V/1? //"onmutamos 7"0( i&=valoradc//::> A //"ar*amos 0@,!;1 al 8imer0 84703/0@,!? 8470+/0@;1? 80"O5/0@#'? B else i&=valoradc//1'9> A

58

//"ar*amos 0@;,#4 al 8imer0 84703/0@;,? 8470+/0@#4? 80"O5/0@#'? B else A

B B i&=P-71Dits(A,-F> A P-71!-81(A,-F/0? //+im iamos la Dandera( valoradc/A,7E13? //"o iamos el valor de A,7E13 a valoradc A,"O50Dits(GO/1? //-niciamos una nueva conversiQn( B

//"ar*amos 0@4#E al 8imer0 84703/0@4#? 8470+/0@E'? 80"O5/0@#'?

void "on&i*ura2Puertos=> A 87-1"/0@00? PO78"/0@00? B void "on&i*ura2-nterru ciones=> A //-nterru ciones del A," P-71Dits(A,-F/0? P-E1Dits(A,-E/1? -P71Dits(A,-P/1? //-nterru ciones del 8imer -58"O5Dits(8470-F/0? -58"O5Dits(8470-E/1? -58"O52Dits(8470-P/1? B void "on&i*ura2A,"=> A A,"O52/0@0E? A,"O51/0@0E? A,"O50/0@01? //A," encendido B void "on&i*ura28imer=> A //.alor inicial '0ms( 84703/0@,!? 8470+/0@;1? 80"O5/0@#'? B

ero sin realiJar conversiQn(

5J

void main=> A "on&i*ura2Puertos=>? "on&i*ura2-nterru ciones=>? "on&i*ura2A,"=>? "on&i*ura28imer=>? 7"O5Dits(-PE5/1? -58"O5Dits(G-E3/1? A,"O50Dits(GO/1? //-niciamos la conversiQn Chile=1> A B B

Con este e1emplo podemos veri icar que se pueden utili"ar varias unciones de los mdulos del PIC1845667 para reali"ar un ob1etivo com0n! Estos e1emplos son cosas b)sicas que se pueden reali"ar con el PIC1845667$ ha# cosas m)s complicadas$ elaboradas # divertidas que se pueden reali"ar con este microcon* trolador que con un poco de lgica digital # algunos conocimientos de electrnica se pueden reali"ar!

67

ALGUNA/ CO/A/ EXTRA/


En este cap2tulo 0ltimo$ mencionar< algunas cosas e(tras que debes saber para rea* li"ar pro#ectos #,o pr)cticas que te puedan servir en el desarrollo personal del lector! Como mencion< anteriormente$ solo es cuestin de tener un poco de imaginacin$ conocimientos b)sicos de lgica digital # algo de electrnica! /ambi<n lo que el lector debe de reali"ar es el estudio de las partes recomendadas del Manual /<cnico del PIC1845667 que se puede obtener de la p)gina de Microchip$ #a que ha# algunas cosas que no se mencionan en este documento que ser2an esenciales que el lector tuviera en cuenta!

C#n:e" i0n de NAme"#


En este apartado enseGar< como obtener los n0meros de 9nidad$ Decena # Centena de un registro de 8 bits! Esto te servir) para poder convertir cada uno en .CD o en -+CII$ para un displa# de I segmentos o para el 'CD al anum<rico! 9na ve" obtenidos estos n0meros deber)s reali"ar un vector con los valores correspondientes de .CD o -+CII! Cdigo para obtener 9nidad$ Decena # Centena!
char udcN9OA0W0W0B? char i? void ODtener20,"=char numero> A &or=i/9?i%/0? iUU> A udcNiO/numero[10? numero//10? B B

En el vector se guardar)n Centena$ Decena # 9nidad en ese orden! -hora$ #a pode * mos reali"ar algunas aplicaciones que tengan que mostrar n0meros en un displa# de I seg * mentos o en el 'CD al anum<rico!

/e,%nde"#
-hora e(plicar< como reali"ar un segundero con el /IMEB1 del PIC1845667! El re* gistro /1CA8 se con igura e(actamente igual que /7CA8 como #a mencion< anteriormente en el cap2tulo /imers$ con la e(cepcin de la entrada de eventos que es en los pines BC7 # BC1! En estos pines colocaremos un oscilador de 32ID8 ?" que normalmente lo conocere* mos como oscilador de 32L?"! SPorqu< usar un oscilador de ba1a recuenciaT Becordemos que tenemos un contador con cuenta m)(ima de D6636 cuentas$ recordemos que la recuencia es el n0mero de cambios que se reali"an en 1 segundo! +i tenemos una recuencia menor a D6636$ pode* mos obtener un n0mero m)gico para que se desborde en e(actamente 1 segundo; nuestro caso es un oscilador de 36ID8 ?" entonces necesitaremos colocar ese n0mero en el conta * dor # su desborde ser) de e(actamente 1 segundo! Este n0mero en he(adecimal es 7(8777! 61

SCmo conectar el osciladorT +e conecta el oscilador a los pines BC7 # BC1 1unto con un capacitor de 16n4 o 22n4 a tierra para evitar ruido en la seGal!

SCmo con igurar el /imer 1 para reali"ar el segunderoT +e con iguran las interrup* ciones como se e(plic en Con igurar Interrupciones # el registro /MB1? se carga 7(87 # /MB1' se carga con 7(77$ por 0ltimo$ se coloca el n0mero 7(84 en el registro /1CA8! 'a interrupcin se reali"ar) cada segundo! 9na ve" reali"ado el cdigo del segundero$ podr2a el lector reali"ar un relo1 digital #a sea con un displa# de I segmentos o con el 'CD al anum<rico!

62

FIN DEL CUR/O


Este curso b)sico ha terminado! Como 0ltimas recomendaciones puedo decir que uses una uente e(terna #a que el lector podr) causar allo en los puertos 9+. de la computadora! -hora solo me queda decirH

Felicidades, has terminado este curso (sico de programaci)n en *+, del P-*+,F.//0 con (ootloader.
-hora no me queda mas que agradecerles el leer este documento! _(ito! Qo se que es un curso b)sico$ pero con un poquito de imaginacin puedes reali"ar cosas grandiosas con este microcontrolador de la amilia PIC18! ?a# muchas cosas por aprender$ por conocer # por programar$ pero si tu no las haces$ nunca ser)n verdaderas # solo se quedar)n en la imaginacin!

63

You might also like