tutorial c18 2

60
2 Prefacio Este es  un tutorial b´asico de  MPLAB  C18 Microchip,  donde se  ir´a adquiriendo conceptos a medida qu e los  utiliaremos en  el  desarrollo de  los  e!emplos, de  esta manera lo qu e se presenta te´oricamente lo asociamos inmediatamente con la pr´actica" Aunque claro est´a que el len#ua!e es mu$ amplio $ no se puede hacer e!emplos de cada concepto" % & L'CE(C'A Casano)a Ale!andro *+"infopic"comlu"com-+inf"pic"su.$/li)e"com"ar-0 Al#unos derechos reser)ados

Upload: eliazar-lg

Post on 08-Mar-2016

6 views

Category:

Documents


0 download

DESCRIPTION

tutorial de manejo de microcontrolador c18 en mplab

TRANSCRIPT

Page 1: Tutorial C18 2

7/21/2019 Tutorial C18 2

http://slidepdf.com/reader/full/tutorial-c18-2 1/60

Prefacio

Este es un tutorial b´asico de MPLAB C18 Microchip, donde se ir´a adquiriendo conceptos amedida que los utiliaremos en el desarrollo de los e!emplos, de esta manera lo que se presentate´oricamente lo asociamos inmediatamente con la pr´actica" Aunque claro est´a que el len#ua!e esmu$ amplio $ no se puede hacer e!emplos de cada concepto"

%

CE(C'A

ano)a Ale!andro *+"infopic"comlu"com-+inf"pic"su.$/li)e"com"ar-0

nos derechos reser)ados

Page 2: Tutorial C18 2

7/21/2019 Tutorial C18 2

http://slidepdf.com/reader/full/tutorial-c18-2 2/60

bra liberada ba!o licencia Creati)e Commons b$ncsa"

onocimiento  (oComercial  Compartir'#ual *b$ncsa04ualquier e5plotaci´on de la obra autoriada por la licencia har´a falta reconocer la autor´6a" Laotaci´on de la obra queda limitada a usos no comerciales" La e5plotaci´on autoriada inclu$ereaci´on de obras deri)adas siempre que manten#an la misma licencia al ser di)ul#adas"

s informaci´on4

477es"creati)ecommons"or#7licencia7

´'ndice #eneral

1" 'ntroducci´on 11"1" Entorno de pro#ramaci on " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " 11"2" Compilador " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " 11"%" 'nstalaci´on " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " 2

1"&" Creaci´on de un nue)o pro$ecto 

" " " " " " " " " " " " " " " " " " " " " " " " " " " " "

2" Comenando con C18 112"1" Creando el c´odi#o " " " " " " " " " " " " " " " " " " "  " " " " " " " " " " " " " " " " " " 112"2" El proceso de compilaci on "

 

"  " " " " " " " " " " " " " " " " " " 122"2"1"

 

9lu!o de la #eneraci on del he5 " " " " " " " "  " " " " " " " " " " " " " " " " " " 122"%" peradores " " " " " " " " " " " " " " " " " " " " " "  " " " " " " " " " " " " " " " " " " 1&

2"%"1" peradores aritm´eticos " " " " " " " " " " " " " " " " " " " " " " " " " " " " " 1&2"%"2" peradores de Comparaci´on " " " " " " " " "  " " " " " " " " " " " " " " " " " " 1&2"%"%"

 

peradores  l o#icos " 

"  " " " " " " " " " " " " " " " " " " 12"%"&" peradores bitise " " " " " " " " " " " " " "  " " " " " " " " " " " " " " " " " " 1

2"&" Estructuras de Control " " " " " " " " " " " " " " " "  " " " " " " " " " " " " " " " " " " 12"&"1"

 

Estructura if  " " " " " " " " " " " " " " " " "  " " " " " " " " " " " " " " " " " " 12"&"2" Estructura ifelse " " " " " " " " " " " " " " "  " " " " " " " " " " " " " " " " " " 1:2"&"%" Estructura hile " " " " " " " " " " " " " " "  " " " " " " " " " " " " " " " " " " 1:2"&"&"

 

Estructura dohile 

" " " " " " " " " " " " "  " " " " " " " " " " " " " " " " " " 1;

2"&"" 

Estructura for " 

" " " " " " " " " " " " " " " " " " " 1;2"&":" 

Estructura sitch " 

" " " " " " " " " " " " " " " " " " " " 1;2"" Accediendo a los bits de un re#istro " " " " " " " " " " " " " " " " " " " " " " " " " " 182":" Primer e!emplo, control de leds con un pulsador "

 

" " " " " " " " " " " " " " " " " " " 182":"1" b!eti)o " " " " " " " " " " " " " " " " " " " "  " " " " " " " " " " " " " " " " " " 182":"2" <ardare

 

" " " " " " " " " " " " " " " " " " "  " " " " " " " " " " " " " " " " " " 182":"%"

 

C´odi#o " " " " " " " " " " " " " " " " " " " " "  " " " " " " " " " " " " " " " " " " 1=2";" >ariables " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " 1=

2";"1" Almacenamiento de los datos ?endianness?  " " " " " " " " " " " " " " " " " " 2@2";"2"

 

Modicadores de las )ariables " " " " " " " "  " " " " " " " " " " " " " " " " " " 2@2";"%"

 

peraciones con )ariables de distintos tipos " " " " " " " " " " " " " " " " " " 222"8" ecciones " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " 222"=" emoras " " " " " " " " " " " " " " " " " " " " " " " "  " " " " " " " " " " " " " " " " " " 2:

2"1@" e#undo e!emplo, Leds titilando " 

" " 

"  " " " " " " " " " " " " " " " " " " 2:

´'('CE DE(E3AL

Page 3: Tutorial C18 2

7/21/2019 Tutorial C18 2

http://slidepdf.com/reader/full/tutorial-c18-2 3/60

Page 4: Tutorial C18 2

7/21/2019 Tutorial C18 2

http://slidepdf.com/reader/full/tutorial-c18-2 4/60

:"&" Punteros  " 

" " " 

"  " " " " " " " " " " " " " " " " " " " 8;

´'('CE DE(E3AL

Cap´6tulo 1

'ntroducci´on

1"1" Entorno de pro#ramaci´on

MPLAB 'E

Ensamblador, enlaador, #esti´on de pro$ectos, depurador $ simulador" La interfa #r´aca delusuario MPLAB 'E sir)e como un unico entorno para escribir, compilar $ depurar c´odi#opara aplicaciones embebidas" Permite mane!ar la ma$or 6a de los detalles del compilador,ensamblador $ enlaador, quedando la tarea de escribir $ depurar la aplicaci´on como focoprincipal del pro#ramador *usuario0

Dratuito, se puede descar#ar de "microchip"com

1"2" Compilador

MPLAB C18

MPLAB C18 es un compilador cruado que se corre en un PC $ produce c odi#o que puedeser e!ecutado por la familia de microcontroladores de Microchip P'C18HHHH" Al i#ual queun ensamblador, el compilador traduce las declaraciones humanas en unos $ ceros para sere!ecutados por el microcontrolador"

i#ue la norma A(' C, sal)o en particularidades de los microcontroladores

Librer´6as para comunicaciones P', '2C, FA3, FA3, #eneraci on PIM, cadena decaracteres $ funciones matem´aticas de coma Jotante

Mane!a n´umeros reales de %2 bits *Joat $ double0

>ersi´on demo de :@ d 6as, descar#able de "microchip"com

1

´

%" 'nstalaci´on

e debe ba!ar directamente desde Microchip, ha$ disponible una )ersi´on #ratuita para estu

tes que es un demo de :@ d´6as" ambi´en para poder descar#arlo es necesario re#istrarse" Fnadescar#ado e!ecutar el instalador MPLABC18E)aluation)%%@ )ersi on actualmente

onible" Para la instalaci´on se#uimos los si#uientes pasos4

1"%" '(ALAC'( %

´

  2 CAP´'FL 1" '(3FCC'(´

Page 5: Tutorial C18 2

7/21/2019 Tutorial C18 2

http://slidepdf.com/reader/full/tutorial-c18-2 5/60

´

1"&" C3EAC'( E F( (FE> P3KEC

1"&" Creaci´on de un nue)o pro$ecto

Pro!ect  (e(os aparecer´a una pantalla donde le indicamos el nombre de nuestro pro$ecto $ la carpeta dondeser´a #uardado"

´

  & CAP´'FL 1" '(3FCC'(´:  CAP´'FL 1" '(3FCC'(

Page 6: Tutorial C18 2

7/21/2019 Tutorial C18 2

http://slidepdf.com/reader/full/tutorial-c18-2 6/60

asamos a con#urar el dispositi)o con el cual traba!aremos4 Con#ure  elect e)ice

eleccionamos el compilador4Pro!ect  elect Len#ua!e  oolsuite $ nos ase#uramos ques las direcciones son correctas"

1"&" C3EAC'( E F( (FE> P3KEC ;

Con#uramos los subdirectorios de traba!o4 Pro!ect  Build options  Pro!ecteleccionamos ubicaci´on de cheros de declaraciones, bibliotecas $ script de enlaado"

ho directories for4

'nclude earch Path

Librar$ earch Path

Lin.ercript earch Path

´

ambi6e podemos crear carpetas como utput $ b!ects para or#aniar en ellos los archi)os

alida e intermedios #enerados en el proceso de compilaci´on"

´8  CAP´'FL 1" '(3FCC'(

Page 7: Tutorial C18 2

7/21/2019 Tutorial C18 2

http://slidepdf.com/reader/full/tutorial-c18-2 7/60

ota4 e#´un la )ersi´on tambi´en se debe a#re#ar al pro$ecto el archi)o *P'C189 utiliado0"l.rado en MCC187l.r, sino produce error de compilaci´on"

ue#o )amos a (e 9ile $ lo #uardamos en nuestra carpeta eli#iendo e5tensi´on "c a#re#´andoloestro pro$ecto"

1"&" C3EAC'( E F( (FE> P3KEC =

Con todo esto con#urado $a podemos empear a desarrollar nuestro c´odi#o"

´

Page 8: Tutorial C18 2

7/21/2019 Tutorial C18 2

http://slidepdf.com/reader/full/tutorial-c18-2 8/60

´

Cap´6tulo 2

Comenando con C18

La idea es ir adquiriendo conceptos a medida que los utiliaremos en el desarrollo de lose!emplos, de esta manera lo que se presenta te´oricamente lo asociamos inmediatamente con lapr´actica" Aunque claro esta que el len#ua!e es mu$ amplio $ no se puede hacer e!emplos de cadaconcepto"

En el desarrollo de este tutorial se utiliar´a el microcontrolador P'C1892@, $ como en todopro$ecto siempre se debe tener a mano el datasheet de los dispositi)os utiliados, para la correctainterpretaci´on $ aplicaci´on de las con#uraciones realiadas"

2"1" Creando el c´odi#o

Lo que se presenta aqu 6 es la estructura #eneral de un archi)o fuente de C, en donde comoprimera medida se inclu$en las librer´6as, colecci´on de rutinas, que se )an a utiliar en el pro$ecto"

 enemos las librer´6as est andar de Ansi C que inclu$e rutinas para mane!o de cadenas de te5to $operaciones con datos comunes como funciones matem´aticas, librer 6as especicas del microcontrolador a utiliar *p1895555"h0 la cual contiene estructuras de los re#istros del microcontroladorpara control de sus bits, librer´6as para control de perif´ericos del microcontrolador *FA3, '2C,

P', ect0 $ las librer 6as propias creadas por el usuario dedicadas al control de un dispositi)oe5terno o una tarea en com´un" La librer´6a que siempre incluiremos en el archi)o principal ser´a ladel P'C a usar4MN include O p1892@ "hP

Lue#o )iene la con#uraci on de los fuses del microcontrolador"  sea con#uraci on de oscilador, atchQdo#, BronQout reset, poerQon reset, protecci on del c´odi#o, etc" Esto dependedel microcontrolador que se utilice4La sinta5is seria4MN pra#ma con#

 

(ombre Rdel R fuse S estado

Para esto es mu$ util la a$uda que trae C18, recomiendo mirarla4C47MCC187doc7hlpP'C18Con#et"

11

CAP´'FL 2" CME(TA( C( C18

Ahora )iene el c´odi#o de nuestro pro#rama4

nU

emplo completo4

  1@ CAP´'FL 1" '(3FCC'(

  W X

  W X

´

  W X

  W X

Page 9: Tutorial C18 2

7/21/2019 Tutorial C18 2

http://slidepdf.com/reader/full/tutorial-c18-2 9/60

YY Archi)o con denicion de re#istros $ bits del microcontrolador ele#ido Y7nclude O p18f2@ "hP

YY Con#uracion de los 9uses del microcontrolador   YY Y7ra#ma con# 9C S HRH , 9CME( S99 , 'E S99 , CPF'> S C1RPLL2ra#ma con# PI3 S1( , B3 S99 , B3> S@ , ICE S99 , IP S%2;:8ra#ma con# MCL3E S1( , LP1C S99 , PBAE( S99 , CCP2MH S 99ra#ma con# >3E( S99 , L>P S99 , H'( S99 , EBFD S 99ra#ma con# CP@ S99 , CP1 S99 , CP2 S99 , CPB S99 , CP S 99ra#ma con# I3@ S99 , I31 S99 , I32 S 99ra#ma con# I3B S99 , I3C S99 , I3 S 99ra#ma con# EB3@ S99 , EB31 S99 , EB32 S99 , EB3B S 99

d main * )oid 0U

77 entencias "

2"   El proceso de compilaci´on

El te5to fuente es compilado en bloques de c´odi#o de pro#rama $ datos que lue#o son enados *lin.ed0 con otros bloques de c´odi#o $ datos, $ colocados en las re#iones de memoria delcrocontrolador P'C18HHHH seleccionado" Este proceso se llama #eneraci´on *build0 $ se suele

)ar a cabo muchas )eces en el desarrollo de pro#ramas en el proceso de probado $ depurado"mbi en tenemos la posibilidad de utiliar ma.e que solo compila los archi)os fuentes que hano modicados desde la ultima )e a#iliando el proceso"

2"1" 9lu!o de la #eneraci´on del he5

En la si#uiente ima#en se tiene un e!emplo de los pasos que lle)a un determinado pro$ecdonde tenemos 2 archi)os fuentes en c *Y"c0, 1 archi)o en assembler *Y"asm0 $ un archi)o

ecompilado *Y"o0"

2"2" EL P3CE E CMP'LAC'( 1%

´

´

Page 10: Tutorial C18 2

7/21/2019 Tutorial C18 2

http://slidepdf.com/reader/full/tutorial-c18-2 10/60

Los archi )os fuentes Y"c son compilados por MPLAB C $ el archi)o Y"asm es ensamblado porMPAM #en erando los archi)os intermedios llamados archi)os ob!etos" Estos archi)os  !unto alY"l.r del mic rocontrolador son tomados por el enlaador para #enerar el Y"he5 que ser´a utiliadopara la #rabaci´on en la memoria de pro#rama del microcontrolador"

Cabe  la posibilidad de a#rupar archi)os ob!etos para crear bibliotecas *Y"lib0 como no s loentre#a Microchip" Est´as las encontramos en MCC187lib en donde e5isten librer´6as pre compiladaspara cont rol de perif´ericos de cada microcontrolador $ la librer´6a est´andar de C"

El arc hi)o Yl.r contiene informaci´on de l a estructura $ capacidades del microcontrolador conel cual s e est´a traba!ando, sir)e como plantilla para el enlaador para or#aniar el c´odi#o depro#rama $ datos #enerados en el proceso de compilaci´on"

CAP´'FL 2" CME(TA( C( C18

Ahora $a tenemos una idea #eneral de como es la estructura de un pro#rama desarrolladoC $ cual es el proceso que si#ue en la #eneraci´on del Y"he5 necesario para embeber a nuestro

crocontrolador" e#uiremos con el estudio de las directi)as utiliadas en C para el desarrollo de#ramas simples $ m´as adelante encararemos el tema de las librerias, su modicaci´on, creaci´on,"

%" peradores

Aqu´6 deniremos todos los operadores utiliados por C18"

%"1" peradores aritm´eticos

e utilian para realiar c´alculos matem´aticos4

isponemos de dos operandos poco comunes para decrementar o incrementar una )ariable" Fnpecto poco com´un es que podemos utiliarlos como pre!os *ZZ., i0 o como post!os *.ZZ,0, con la diferencia que utiliando ZZ. primero se incrementa el )alor $ lue#o es utiliada lariable, $ .ZZ utilia la )ariable $ lue#o la incrementa4emplos4

1@[

ZZ .[ 77 a S 11 , . S 11"ZZ[ 77 a S 1@ , . S 11"

%"2" peradores de Comparaci´on

Estos operadores se encar#an de comparar dos condiciones de una e5presi´on4

2"&" E3FCF3A E C(3L 1

2"%"%" peradores l´o#icos

perador escripci´onZ suma restaY multiplicaci´on7 di)isi´on

ZZ incremento decremento

perador escripci´on

SS i#ual\S distintoO menor que ma$or que

OS menor o i#ual queS ma$or o i#ual que

M

 

W  X

perador escripci´on]] A(^^ 3\ (

perador escripci´on] And^ r_ Hor` complemento

OO rotar iquierda rotar derechaM

 

W  X

Page 11: Tutorial C18 2

7/21/2019 Tutorial C18 2

http://slidepdf.com/reader/full/tutorial-c18-2 11/60

on los encar#ados de producir resultados l´o#icos del tipo  3FE o 9ALE

Al#o a tener en cuenta en el uso de los operandos l o#icos es su precedencia, $a que las

e5presiones )inculadas por ]] o ^^ son e)aluadas de iquierda a derecha, $ la e)aluaci on sedetiene tan pronto como se conoce el resultado )erdadero o falso" Por e!emplo al realiar4

if  **. O1@0 ]] *ZZ i SS1@@00U

V

Lo primero que se e)al ua es que . sea menor a 1@, si no se cumple sin importar el resto saltaa la si#uiente l 6nea" i en el diseno del pro#rama se necesitaba el incremento de la )ariable i elresultado ser´a incorrecto, por lo que debe estudiarse su correcta dia#ramaci´on"

2"%"&" peradores bitise

on para modicar los bits de una )ariable4

El operador ] es utiliado #eneralmente para lle)ar a cero ciertos bits" Por e!emplo4

.S@ 5A [

aS @ 59@ ] .[ 77 a S @5A@ , . S @ 5A "

El operador ^ es utiliado para setear ciertos bits" Por e!emplo4

.S@ 5@% [

aS@ 5&@ ^ .[ 77 a S @5&% , . S @ 5@% "

2"&" Estructuras de Control

2"&"1" Estructura if 

Esta estructura se utilia para e!ecutar instrucciones en forma condicional, de acuerdo con la

e)aluaci´on de la e5presi´on" eria si una condici´on es dada entonces acci´on"

CAP´'FL 2" CME(TA( C( C18

 condicion 0U

Accion

emplo4

 P3A SS@ 5@@ 0U   77 Es P3A i#ual a cero *@0LAB S@ 599 [   77 i , entonces car#amos en puerto B el )alor @ 59 9

&"2" Estructura ifelse

En este caso se a#re#a la instrucci´on else" Ahora se e)al ua una condici on ori#inal, si es )er

dera, se e!ecuta $ sino no lo es, se e!ecuta el bloque deba!o de else"

 condicion 0UAccionelse U

77 Accion

G

M

 

W  X

M

 

W  X

  W X

  W X

  W X

 W X

  W X

  W X

Page 12: Tutorial C18 2

7/21/2019 Tutorial C18 2

http://slidepdf.com/reader/full/tutorial-c18-2 12/60

emplo4

** P3A ]@ 5@9 0\S@ 5@@ 0U   77 Es 3A@ 4 3A% distinto a cero *@0 * 3A& 4 3A; no irtan 0LAB S@ 599 [   77 i , entonces car#amos en puerto B el )alor @ 59 9

else ULAB S@ 5@@ [   77 (o , entonces car#amos en puerto B el )alor @ 5@@

&"%" Estructura hile

E!ecuta un con!unto de instrucciones mientras una condici on sea )erdadera" La principalacter´6stica de esta estructura es que, antes de comenar el bucle, )erica la condici´on, por loe es posible que el bucle no lle#ue a e!ecutarse"

ile * condicion 0Uentencias

emplo4

mientras P3B sea i#ual a @ 59 9 $ P3C sea i#ual a @ 5AAile * P3B SS@ 599 ]] P3C SS@ 5AA 0Ua ZZ[ 77 'ncrementamos en 1 a la )ariable a"

2"&" E3FCF3A E C(3L 1;

2"&"&" Estructura dohile

Es parecida a un hile solo que la condici´on se e)al´ua al nal, por lo que el bucle se e!ecutara

por lo menos una )e"Mdo U77 entenciasV hile * condicion 0[

E!emplo4

Mdo U

LAB S* P3B O O10[ 77 3otamos a la iquierda 

)alor car#ado en P3B "V hile * P3C SS@ 5@@ ^^ P3 \S@ 599 0[77 mientras P3C sea i#ual a @ 5@@ o P3 sea distinto a @ 59 9

2"&"" Estructura for

Esta estructura se usa para e!ecutar un bloque de c´odi#o cierto n´umero de )eces" Posee un

)alor de inicio, un )alor nal $ un )alor de incremento"M

for * )alor inicial [ )alor Anal [ )alor de incremento 0U77 entenciasV

E!emplo4M

77 . comiena en 1 , re decrementa en 2 por cada ciclo mientras ""77 "". sea ma$or a %" for *. S1[. %[. S20U

LAC S.[V

2"&":" Estructura sitch

Esta estructura permite e!ecutar un bloque de c´odi#o de acuerdo con el )alor de una )ariable

o e5presi´on4M

sitch * >ariable 0Ucase @ 5@1 4

77 entencias "brea. [case @ 5@2 4

77 entencias "

  W X

  W X

  W X

  W X

  W X

Page 13: Tutorial C18 2

7/21/2019 Tutorial C18 2

http://slidepdf.com/reader/full/tutorial-c18-2 13/60

brea. [default 4

77 entencias "brea. [

V

CAP´'FL 2" CME(TA( C( C18

fault4 e!ecuta esa sentencia si no es nin#una de las anteriores"emplo4

itch * P3C 0Ucase @ 5@1 4LAB S@ 5AA [

brea. [case @ 5@2 4

LAB S@ 5 [brea. [default 4

LAB S@ 599 [brea. [

"

Accediendo a los bits de un re#iso

En l a librer 6a p18f5555"h encontramos la denici de l os bits de cada re#istro mediante una

estructura7uni co n el nombre 3ED'3bits" Para acceder indi)idu

ent e a cada uno de bit s utiliandomos el operando punto de la si#uiente ma

a4

3Bbits " 3B@

P1C(2bits " ACBbits " LAB@

:" Primer e!emplo, control de leds con un pulsador

:"1" b!eti)o

Encender & leds del puerto B mientras se manten#a accionado el pulsador"

:"2" <ardare

2";" >A3'ABLE 1=

2":"%" C´odi#o

M7Y YY Archi)o con denicion de re#istros $ bits del microcontrolador ele#ido Y7N include O p18f2@ "hP

7Y YY Con#uracion de los 9uses del microcontrolador   YY Y7N pra#ma con# 9C S HRH , 9CME( S99 , 'E S99 , CPF'> S C1RPLL2N pra#ma con# PI3 S1( , B3 S99 , B3> S@ , ICE S99 , IP S%2;:8N pra#ma con# MCL3E S1( , LP1C S99 , PBAE( S99 , CCP2MH S 99N pra#ma con# >3E( S99 , L>P S99 , H'( S99 , EBFD S 99N pra#ma con# CP@ S99 , CP1 S99 , CP2 S99 , CPB S99 , CP S 99

N pra#ma 

con# 

I3@S99 , I31

S99 , I32

S 99N pra#ma

 

con# 

I3B S99 , I3C S99 , I3 S 99N pra#ma

 

con# 

EB3@ S99 , EB31 S99 , EB32 S99 , EB3B S 99

)oid main * )oid 0U

AC(1 S@ 5@9 [   7Y  odos entradas 7 salidas di#itales Y7 3'A S@ 59 9 [   7Y  odos como entradas Y7 3 ' B S@ 59@ [   7Y (ible ba!o como salida Y7

  W X

  W X  W X

 i po amanoG M´6nimo M´a5imo

char 8bits 128 12;unsi#ned char 8bits @ 2

int 1:bits %2;:8 %2;:;

unsi#ned int 1:bits @ :%short 1:bits %2;:8 %2;:;

unsi#ned short 1:bits @ :%

short lon# 2&bits 8%88:@8 8%88:@;unsi#ned short lon# 2&bits @ 1:;;21

lon# %2bits 21&;&8%:&8 21&;&8%:&;unsi#ned lon# %2bits @ &2=&=:;2=

Joat %2bits e5p*12:0 e5p*1280double %2bits e5p*12:0 e5p*1280

Page 14: Tutorial C18 2

7/21/2019 Tutorial C18 2

http://slidepdf.com/reader/full/tutorial-c18-2 14/60

LAB S@ 5@@ [   7Y  odos los leds 

apa#ados Y7hile *10U   7Y Bucle inAnito Y7

if * P3Abits " 3A@ SS10U   7Y e testea estado del pulsador Y7LAB S@ 5@@ [   7Y i esta en 1 lo#ico

 apa#amos leds Y7V else U

LAB S@ 5@9 [   7Y ino encedemos todos los leds Y7V

VV

2";" >ariables

Fna )ariable es la asi#naci´on de un nombre a un espacio determinado en la memoria, el espaciodepender´a del tipo de )ariable" C18 dene los si#uientes tipos4

CAP´'FL 2" CME(TA( C( C18

e#´un d´onde est´en declaradas, las )ariables pueden ser #lobales *declaradas fuera de todo prodimiento o funci´on0 o locales *declaradas dentro de un procedimiento o funci´on0" Las primeras´an accesibles desde todo el c´odi#o fuente $ las se#undas s´olo en la funci´on donde est´en denidas"

;"1" Almacenamiento de los datos ?endianness?

El ordenamiento de los datos en una )ariable multib$te se realia en littleendian" El b$tenos si#nicati)o ocupa la posici´on m´as ba!a"

# .S@ 5=%=;12 [

E!emplo4

YY Archi)o con denicion de re#istros $ bits del microcontrolador ele#ido Y7nclude O p18f2@ "hP

YY Con#uracion de los 9uses del microcontrolador   YY Y7ra#ma con# 9C S HRH , 9CME( S99 , 'E S99 , CPF'> S C1RPLL2ra#ma

 

con#

 

PI3 S1( , B3 S99 , B3> S@ , ICE S99 , IP S%2;:8ra#ma

 

con# 

MCL3E S1( , LP1C S99 , PBAE( S99 , CCP2MH S 99ra#ma con# >3E( S99 , L>P S99 , H'( S99 , EBFD S 99>ariables

 

#lobales "si#ned char .[# p[at  emp[

d main * )oid  0U77 >ariables locales 4unsi#ned int r,s[

77 entencias "

;"2" Modicadores de las )ariables

Mplab C18 utilia los modicadores establecidos por A('4

to4 las )ariables declaradas fuera de las funciones son #lobales $ las declaradas en la funci´on

son locales" i no se inicialian toman un )alor indenido"

atic4 )ariables locales a una funci´on, $ sir)en para retener el )alor de la )ariable en llamadas

sucesi)as a dicha funci´on"

tern4 La )ariable declarada pertenece a otro m´odulo, por lo que no es necesario reser)ar

memoria para ella"

nst4 El contenido de la )ariable es !o"

latile4 

el contenido de la )ariable puede cambiar"

2";" >A3'ABLE 21

irecci´on @5@1@@ @5@1@1 @5@1@2 @5@1@%

Contenido @512 @5=; @5% @5=

M

 

W  X

a como resultado4

 

W  X

Page 15: Tutorial C18 2

7/21/2019 Tutorial C18 2

http://slidepdf.com/reader/full/tutorial-c18-2 15/60

3e#ister4 

La )ariable declarada debe #uardarse en un re#istro del microcontrolador"

)erla$4 e aplica a )ariables locales, hace un almacenamiento est´atico $ las inicialia en cada

llamada"

3am4 La )ariable se sit´ua en la memoria de datos"

3om4 la )ariable se sit´ua en la memoria del pro#rama" Por lo #eneral se usa para cadena de

caracteres contantes"

Especicaci´on de banco de memoria de datos4

9ar4 La )ariable puede ir en cualquier banco"

(ear4 

La )ariable tiene que estar en el banco de acceso" Cuando la )ariable se ubica en lamemoria de pro#rama se ubicar´a en los primero :&., $ cuando la )ariable se ubica en la3AM se ubica en las primeras @59 posiciones de la memoria, #enerando menos c odi#o $acceso m´as r´apido"

En la si#uiente ima#en se puede )er el assembler #enerado para los distintos tipos de )ariables4

Para las )ariables #uardadas en la memoria de pro#rama el acceso no es tan inmediato, sinoque se realia mediante las operaciones able 3eads o able Irites, los cuales mue)en los datosentre el espacio de memoria 3AM $ de Pro#rama" Cuando se traba!a una )ariable (EA3 solose necesita 1:bits para su direccionamiento, en cambio para una )ariable 9A3 *ue puede estaren cualquier banco0 se necesitan 2&bits para su direcionamiento" Esto ultimo se podr´a obser)arm´as claro cuando se trate punteros"

CAP´'FL 2" CME(TA( C( C18

;"%" peraciones con )ariables de distintos tiposCuando se e)al ua una e5presi on donde las )ariables implicadas son de distinto tipos ocurre

a con)ersi on, $a sea impl´6cita o e5plicita, para lle)ar ambos operandos a un tipo com´un detos con el que se pueda operar"la asi#naci´on de una e5presi´on de un tipo dado a una )ariable de un tipo menor, la con)ersi´onhace en forma autom´atica" Por e!emplo4

si#ned char .,

at p S%@":[p[   77 .S %@ , p S %@":" 

u´6 tenemos miembros de diferentes tamanos, por lo que habr´a un truncamiento del )alor enteroa cantidad de bit que lo permita ." i la parte entera e5cede el ran#o establecido por la )ariable

el resultado no tendr´a l´o#ica aparente"

#las de promoci´on autom´atica de e5presiones

Estas re#las dicen que el compilador har´a estrictamente las con)ersiones necesarias para lle)ar

os los operandos al tipo del ma$or" El resultado de e)aluar una operaci´on aritm´etica ser´a delo del ma$or de sus operandos, en el sentido del tamano en bits de cada ob!eto de datos" Por

´

M

M

M

M

  W X

  W X

  W X

  W X

G

G

Page 16: Tutorial C18 2

7/21/2019 Tutorial C18 2

http://slidepdf.com/reader/full/tutorial-c18-2 16/60

mplo4

si#ned char .[

at p[

[72[ 77 p S 2

r m´as que indiquemos que el resultado es Joat el truncamiento se produce en la e)aluaci´on delembro derecho de la asi#naci´on"

Para resol)er este problema e5isten dos formas, una es escribir cualquiera de las contantes ennto Jotante o utiliar el operador cast"

. 72"@[ 77 p S 2"

S** Joat 0. 720[ 77 p S 2"

es util implementar el cast de la si#uiente forma4

* Joat 0*. 720[ 77 p S 2

do que primero se realia la operaci´on, $ al resultado se aplica el cast, lo que no soluciona elblema"

8" ecciones

Las secciones son las di)ersas ´areas en la memoria del P'C18HHH, inclu$endo la memoriapro#rama, memoria de datos *3AM0, memoria EEP3M $ la memoria de la P'LA, entre

2"8" ECC'(E 2%

otros" i obser)amos el archi)o Y"l.r del microcontrolador utiliado, por e!emplo para el 18f2@tenemos"

M77 9ile 4 18 f2@R# " l.r77 Deneric lin.er script for the P'C1892@ processor

N E9'(E  RCEE(  REBFDC1CEA3  1N E9'(E  RCE(  RCEE( Z  REBFDCELE(N E9'(E  RAAE(

 

 REBFDAAA3  

1N E9'(E  RE(

 

 RAAE( Z  REBFDAALE(

L'BPA< "

N '9E9  RC3F('MEN '9E 9  REHE(EME

9'LE c@18iRe "o9'LE clibRe " lib9'LE

 p18f2@Re " lib

N ELE9'LE

 

c@18i "o9'LE clib " lib9'LE p18f2@ " lib

N9'

N9'

N '9E9  REBFDCEA3CEPADE (AME S pa#e A3 S@ 5@ E( S RCEE(CEPADE (AME S debu# A3 S REBFDC1EA3 E( S RCE( P3ECE

N ELECEPADE (AME S pa#e A3 S@ 5@ E( S@ 5;999

N9'

CEPADE (AME S idlocs A3 S@ 52@@@@@ E( S@ 52@@@@; P3ECECEPADE (AME S con# A3 S@ 5%@@@@@ E( S@ 5%@@@@ P3ECECEPADE (AME S de)id A3 S@ 5%9999E E( S@ 5%99999 P3ECECEPADE (AME S eedata A3 S@ 59@@@@@ E( S@ 59@@@99 P3ECE

N '9E9  REHE(EME

AABA( (AME S #pr@ A3 S@ 5@ E( S@ 599N ELE

ACCEBA(  (AME S accessram A3 S@ 5@ E( S@ 59AABA( (AME S #pr@ A3 S@ 5:@ E( S@ 599

N9'

AABA( (AME S #pr1 A3 S@ 51@@ E( S@ 5199AABA( (AME S #pr2 A3 S@ 52@@ E( S@ 5299

´

Page 17: Tutorial C18 2

7/21/2019 Tutorial C18 2

http://slidepdf.com/reader/full/tutorial-c18-2 17/60

N '9E9 

 REBFDAAA3AABA( (AME S #pr% A3 S@ 5%@@ E( S RAAE(AABA( (AME S db#spr A3 S REBFDAAA3 E( S RE( P3ECE

N ELE 77 no debu#AABA( (AME S #pr% A3 S@ 5%@@ E( S@ 5%99

N9'

AABA( (AME S usb& A3 S@ 5&@@ E( S@ 5&99 P3ECE

CAP´'FL 2" CME(TA( C( C18

ABA( (AME S usb A3 S@ 5@@ E( S@ 599 P3ECE

ABA( (AME S usb: A3 S@ 5:@@ E( S@ 5:99 P3ECEABA( (AME S usb; A3 S@ 5;@@ E( S@ 5;99 P3ECECEBA(  (AME S accesssfr A3 S@ 59:@ E( S@ 5999P3ECE

9E 9  RC3F('MEEC'( (AME S C(9'D   31M S con#

N '9E 9  REBFDAAA3AC  'TE S@ 51@@ 3AM S #pr2

N ELEAC  'TE S@ 51@@ 3AM S #pr%

N9''

Este dene memoria de pro#rama como pa#e que se e5tiende desde @5@@@@ a @5;999" entroeste espacio se pueden denir secciones code $ romdata" Cuando se encuentra la directi)a

ra#ma code, el compilador #enera instrucciones de c´odi#o maquina ubicadas en este sector" Enmbio Npra#ma romdata almacena datos en la memoria de pro#rama"memoria de datos es denida por )arios bancos de re#istros que contienen 2: b$tes *#pr S

#istros de prop´osito #eneral, usb S 3e#istros para utiliaci´on de m odulo FB *solo en ciertoscrocontroladores00" entro de estos bancos de datos podemos denir dos tipos de secciones,ata e idata, donde udata indica datos sin inicialiaci´on e idata datos inicialiados"te que al#unas ´areas est an marcadas con P3ECE, esto impide al enlaador ubicartrucciones o datos en estos espacios a menos que se lo indique espec´6camente"nuestro c´odi#o podemos denir subsecciones utiliando la directi)a Npra#ma4

pra#ma udata + attribute - + section  name +S address --

pra#ma idata + attribute - + section  name +S address --pra#ma romdata + o)erla$ - + section  name +S address --pra#ma code + o)erla$ - + section  name +S address --

ribute4

cess4 le indica al compilador que debe incluir la secci´on al espacio denido por el modo deceso a datos access ban. sin necesidad de modicar el banco actual de la ram"

erla$4 permite que otras secciones se sit´uen en las mismas posiciones f´6sicas" Esto permitenser)ar memoria situando )ariables en las mismas posiciones, siempre que no se acti)en

mult´aneamente" Pero ha$ restricciones, las dos secciones deben pertenecer a cheros distintoseben tener el mismo nombre"

emplos4

ra#ma

 

code

 

m$Rcode S@ 51@@d 

)9uncion * char .0U

ra#ma codeYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY  Y7ra#ma romdata constRtable S@ 5%@@@

nst rom char m$RconstRarra$ +- S UaL,bL,cL,dL,eLV[

2"8" ECC'(E 2

N pra#ma romdata

7Y YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY  Y7

N pra#ma

 

udata

 

access

 

m$Raccessnear

 

unsi#ned 

char a)1 , a)2 [N pra#ma udata7Y YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY  Y7archi)o1 "c4N pra#ma udata o)erla$

 m$Ro)erla$Rdata S@ 52@@int )ar1 , )ar2 [N pra#ma udata

M

  W X

  W X

M

M

M

M

  W X

  W X

  W X

  W X

Page 18: Tutorial C18 2

7/21/2019 Tutorial C18 2

http://slidepdf.com/reader/full/tutorial-c18-2 18/60

archi)o2 "c4N pra#ma udata o)erla$

 

m$Ro)erla$Rdata S@ 52@@lon# )ar [N pra#ma udata7Y YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY  Y7N pra#ma idata m$Ri data S@ 5@@char te5t +-S  <ola Mundo [N pra#ma idata

 ambi en podemos crear secciones modicado el archi)o Y"l.r del microcontrolador utiliado,subdi)idiendo un determinado banco4

AABA( (AME S #pr1 A3 S@ 51@@ E( S@ 51E9

AABA( (AME S # pr1R A3 S@ 519@ E( S@ 5199 P3ECE

N '9E 9

 

 RC3F('MEEC'( (AME S C(9'D   31M S con#EC'( (AME S M'ECC'(   3AM S #pr1R """

#pr1 

es un banco de 1: b$tes que posteriormente se le denomina como secci´on M'ECC'("Como di!imos anteriormente con P3ECE impedimos que el enlaador asi#ne autom´aticamente otras )ariables no indicadas por el pro#ramador *usuario0 en la secci on creada"  K paraasi#nar )ariables a tal espacio hacemos4

N pra#ma udata M'ECC'(

char .[N pra#ma udata

En el caso de necesitar crear un arre#lo de )ariables *)´ease m´as adelante0 de un tamano ma$ora 2: b$tes si o si debemos unir 2 o m as de estos bancos para permitirle al enlaador *lin.er0ubicarlo en el espacio de memoria"

AABA( (AME S #pr1R A3 S@ 51@@ E( S@ 5299

77 AABA( (AME S #pr2 A3 S@ 52@@ E( S@ 5299

N '9E 9  RC3F('MEEC'( (AME S C(9'D   31M S con#EC'( (AME S M'ECC'(   3AM S #pr1R """

e unen los bancos #pr1 $ #pr2 para formar #pr1 que contiene 12 b$tes"

N pra#ma udata M'ECC'(

char . +12-[

CAP´'FL 2" CME(TA( C( C18

ra#ma udata

AE(C'(4 e debe tener precauci on al traba!ar de esta manera, $a que, una )ariableltib$te no puede pertenecer a 2 bancos consecuti)os"

=" emoras

Para utiliar demoras en nuestro c´odi#o debemos incluir la librer´6a dela$s"h" En ella tenemos

unciones con las cuales podemos hacer cualquier tipo de demoras, pero son tediosas dado quempre necesitamos realiar c´alculos4

a$1@CK5 *i0  1@" c$ "i

a$1@@CK5 *i0  1@@" c$ "ia$1CK5 *i0  1@@@ " c$ "ia$1@CK5 *i0  1@@@@" c$ "i

nde c$ es &79osc, e i es un escalar que puede tomar )alores entre @ $ 2"

1@" e#undo e!emplo, Leds titilando

1@"1" b!eti)o

<acer titilar 1@ )eces los leds del puerto B al accionar el pulsador"

1@"2" <ardare

G

 

W  X

M

 

W  X

Page 19: Tutorial C18 2

7/21/2019 Tutorial C18 2

http://slidepdf.com/reader/full/tutorial-c18-2 19/60

1@"%" Codi#o

YY Archi)o con denicion de re#istros $ bits del microcontrolador 

ele#ido Y7

nclude O p18f2@ "hP

YY Con#uracion de los 9uses del 

microcontrolador   YY Y7ra#ma con# 9C S HRH , 9CME( S99 , 'E S99 , CPF'> S C1RPLL2ra#ma con# PI3 S1( , B3 S99 , B3> S@ , ICE S99 , IP S%2;:8ra#ma con# MCL3E S1( , LP1C S99 , PBAE( S99 , CCP2MH S 99ra#ma con# >3E( S99 , L>P S99 , H'( S99 , EBFD S 99ra#ma con# CP@ S99 , CP1 S99 , CP2 S99 , CPB S99 , CP S 99

2"11"  E3CE3 E EMPL, LE ECFE(C'ALE 2;

N pra#ma con# I3@ S99 , I31 S99 , I32 S 99

N pra#ma con# I3B S99 , I3C S99 , I3 S 99N pra#ma con# EB3@ S99 , EB31 S99 , EB32 S99 , EB3B S 99

unsi#ned 

char .[   7Y >ariable 

utiliada 

para 

realiar 

efecto Y7

)oid main * )oid 0U

AC(1 S@ 5@9 [   7Y  odos entradas 7 salidas di#itales Y7 3'A S@ 59 9 [   7Y  odos como entradas Y7 3 'B S@ 59@ [   7Y (ible ba!o como salida Y7

LAB S@ 5@@ [   7Y  odos los leds apa#ados Y7

hile *10U   7Y Bucle inAnito Y7if * P3Abits " 3A@ SS10U   7Y e testea estado del pulsador Y7

LAB S@ 5@@ [   7Y i esta en 1 lo#ico apa#amos leds Y7

V else Ufor *. S1[. OS1@[ . ZZ0U 7Y  Eitila 1@ )eces Y7

LAB S@ 5@9 [   7Y Enciende leds Y7

ela$1@CK5 *%@0[   7Y emora %@@ ms Y7LAB S@ 5@@ [   7Y Apa#a Leds Y7ela$1@CK5 *%@0[   7Y emora %@@ ms Y7

VV

VV

2"11" ercer E!emplo, Leds secuenciales

2"11"1" b!eti)o

Al accionar el pulsador se realia una secuencia de leds como se muestra en la #ura4

CAP´'FL 2" CME(TA( C( C18

11"2" <ardare

 

W  X

Page 20: Tutorial C18 2

7/21/2019 Tutorial C18 2

http://slidepdf.com/reader/full/tutorial-c18-2 20/60

11"%" C´odi#o

YY Archi)o con denicion de re#istros $ bits del microcontrolador ele#ido Y7nclude O p18f2@ "hP

YY Con#uracion de los 9uses del

 

microcontrolador   YY Y7ra#ma

 

con# 

9C S HRH , 9CME( S99 , 'E S99 , CPF'> S C1RPLL2ra#ma con# PI3 S1( , B3 S99 , B3> S@ , ICE S99 , IP S%2;:8ra#ma con# MCL3E S1( , LP1C S99 , PBAE( S99 , CCP2MH S 99ra#ma con# >3E( S99 , L>P S99 , H'( S99 , EBFD S 99ra#ma con# CP@ S99 , CP1 S99 , CP2 S99 , CPB S99 , CP S 99ra#ma con# I3@ S99 , I31 S99 , I32 S 99ra#ma con# I3B S99 , I3C S99 , I3 S 99ra#ma con# EB3@ S99 , EB31 S99 , EB32 S99 , EB3B S 99

si#ned char .[   7Y >ariable utiliada para realiar efecto Y7

d main * )oid 0U

AC(1 S@ 5@9 [   7Y  odos entradas 7 salidas di#itales Y7 3'A S@ 599 [   7Y  odos como entradas Y7

 3 ' B S@ 59@ [   7Y (ible ba!o como

 

salida Y7

LAB S@ 5@@ [   7Y  odos los leds apa#ados Y7hile *10U   7Y Bucle inAnito Y7

if * P3Abits " 3A@ SS10U   7Y e testea estado del pulsador Y7LAB S@ 5@@ [   7Y i esta en 1 lo#ico

 apa#amos leds Y7V else U

LAB S@ 5@1 [   7Y Encedemos primer Led Y7for *. S1[. OS&[ . ZZ0U   7Y 3ota & )eces Y7

ela$1@CK5 *%@0[   7Y emora %@@ ms Y7LAB S* P3B O O10[   7Y 3otamos Led encendido Y7

VV

V

2"12" A33EDL E >A3'ABLE 2=

2"12" Arre#los de >ariables

(os permite traba!ar con un con!unto de )ariables $ acceder a cada una mediante un ´6ndiceunico que lo identica" odos los )alores que contienen deben ser del mismo tipo"

Munsi#ned char >ector +-[unsi#ned char Matri +%-+%-["""

77 Car#amos 

)ector $ matri 4>ector +@-S1:[Matri +1-+1-S8[

77 Leemos )ector $ matri 4P3B S >ector +&-[P3B S Matri +@-+@-[

En la declaracion se pueden pre car#ar los )alores de la si#uiente forma4

Munsi#ned char >ector +%-SU1 ,@ 51@ ,@ b@@@1@1 Vunsi#ned char Matri +%-+%-SU1 ,2 ,% ,& , ,: ,; ,8 ,=V[

 

W  X

 

W  X

 

W  X

´

Page 21: Tutorial C18 2

7/21/2019 Tutorial C18 2

http://slidepdf.com/reader/full/tutorial-c18-2 21/60

2"1%" Cuarto E!emplo, Control de displa$ ; se#mentos

2"1%"1" b!eti)o

Ftiliaremos dos pulsadores para incrementar, decrementar o resetear un conteo de @ a = quemostraremos en un displa$ de ; se#mentos de c atodo com´un" El reseteo ser a el caso en el que sepresiona los dos pulsadores a la )e"

CAP´'FL 2" CME(TA( C( C18

1%"2" <ardare

1%"%" C´odi#o

YY Archi)o con denicion de re#istros $ bits del microcontrolador ele#ido Y7nclude O p18f2@ "hP

YY 'nclude para realiacion de demoras YY Y7

nclude O dela$s "hP

YY Con#uracion de los 9uses del microcontrolador   YY Y7ra#ma con# 9C S HRH , 9CME( S99 , 'E S99 , CPF'> S C1RPLL2ra#ma con# PI3 S1( , B3 S99 , B3> S@ , ICE S99 , IP S%2;:8ra#ma con# MCL3E S1( , LP1C S99 , PBAE( S99 , CCP2MH S 99ra#ma con# >3E( S99 , L>P S99 , H'( S99 , EBFD S 99ra#ma con# CP@ S99 , CP1 S99 , CP2 S99 , CPB S99 , CP S 99ra#ma con# I3@ S99 , I31 S99 , I32 S 99ra#ma con# I3B S99 , I3C S99 , I3 S 99ra#ma con# EB3@ S99 , EB31 S99 , EB32 S99 , EB3B S 99

i#ned 

char i[   77 Para 

controlar

 

)iualiacion 

del ispla$ "olo a modo de e!emplo

 

ubicamos 

)ariables 

constantes en @ 5&@@ra#ma romdata ispla$ S@ 5&@@st rom unsi#ned char ispla$;e# +1@-SU@ 5%9 , @5@: , @5B , @5&9 , @5:: ,

@5: , @5; , @5@; , @599 , @ 5:9 V[ra#ma romdata

d main * )oid 0UAC(1 S@ 5@9 [77  odos entrada  7 salida di#itales " 3'A S@ 59 9 [ 77  odos como entrada " 3 'B S@ H@@ [ 77  odos como salida "

LAB S@ 5%9 [ 77 Comiena en cero "i S@ [hile *10U

77 i se presionan los 2 a la )e se resetea "if * P3Abits " 3A@ SS@ ] P3Abits " 3A1 SS@0U

i S@ [77 Car#amos en puerto )alor de la tabla indicado por i"LAB S ispla$;e# +@-[ela$1@CK5 *%@0[

Page 22: Tutorial C18 2

7/21/2019 Tutorial C18 2

http://slidepdf.com/reader/full/tutorial-c18-2 22/60

2"1%" CFA3 EEMPL, C(3L E 'PLAK ; EDME( %1

V else if * P3Abits " 3A@ SS@ 0U 77 e incrementa cuenta "

ZZi[77 >ol)emos a @" irectamente se puede hacer if  *ZZ i SS1@0if *i SS1@0U i S@[V77 Car#amos en puerto )alor de la tabla indicado por i"LAB S ispla$;e# +i-[ela$1@CK5 *%@0[

V else if * P3Abits " 3A1 SS@ 0U 77 e decrementa cuenta "i[if *i SS20U i S=[V 77 >ol)emos a ="77 Car#amos en puerto )alor de la tabla indicado por i"LAB S ispla$;e# +i-[

ela$1@CK5 *%@0[VV

V

 Kendo a >ie7Iach $ a#re#ando la )ariable ispla$ podemos )isualiar que sea a asi#nadoal espacio de memoria de pro#rama ubicado entre @5&@@ $ @5&@="

CAP´'FL 2" CME(TA( C( C18

Cap´6tulo %

9unciones

La manera m´as ele#ante de construir nuestro pro#rama es di)idir la tarea a e!ecutar en )ariastareas m as simples, de modo de facilitar el desarrollo $ el entendimiento de la estructura delmismo" tra )enta!a que conlle)a este proceder es la reutiliaci´on de estos m´odulos creados conanterioridad, adem´as de facilitar el traba!o en equipo"

%"1" eclaraci´on $ denici´on de funciones

La declaraci´on da a conocer la funci´on al compilador, a partir de su declaraci´on $a se puedenrealiar in)ocaciones a las mismas" La declaraci´on de una funci on se conoce tambi en como prototipo de la funci´on" En el prototipo de una funci´on se tienen que especicar los par´ametros dela funci´on, as´6 como el tipo de dato que de)uel)e"

La denici on estar´a en al#´un otro punto del pro#rama, aqu 6 se especican las instruccionesque forman parte de la misma $ que se utilian para lle)ar a cabo la tarea espec´6ca de la funci´on"

 ipo de retorno (ombre*Lista de par´ametros0

ipo de retorno 4 3epresenta el tipo del )alor que de)uel)e la funci´on" i no de)uel)e nin#unode debe colocar )oid"

(ombre4 indica el nombre que se le da a la funci´on, se recomienda que este relacionado con la

tarea que lle)ar´a a cabo"

Lista de par´ametros 4 se enlista el tipo de dato $ el nombre de cada par´ametro" En caso de

utiliar par´ametros se de!a el par´entesis )acio o se inclu$e la palabra )oid"M

unsi#ned int uma * unsi#ned char A, unsi#ned char B0Uunsi#ned int C[CSAZB[return *C0[

V

  W X

Page 23: Tutorial C18 2

7/21/2019 Tutorial C18 2

http://slidepdf.com/reader/full/tutorial-c18-2 23/60

)oid

 

En)ioRata * unsi#ned

 

char A0U77 entencia "

%%

CAP´'FL %" 9F(C'(E

V

)oid Muestras * )oid 0U77 entencias "

V

os formas de incluir una funci´on en nuestro c´odi#o4aliando la declaraci´on en el encabeado $ despu´es la denici on en cualquier sector del proma"

77 eclaracion de la funcion

)oid 9uncion * )oid 0[char tra9uncion *char , int 0""")oid main * )oid 0U

""

"77 Llamo a la funcion "9uncion *0[mS tra9uncion * ,&%@0[V

77 enicion de la funcion ""77 ""* Puede estar en cualquier lu#ar del pro#rama 0)oid 9uncion * )oid 0U

77 entenciasVchar tra9uncion * char ., int p0U

77 entenciasV

tra forma es no realiar la declaraci´on de la funci on $ realiar directamente la denici´on,ro esta tiene que estar si o si antes de su in)ocaci´on"

"""77 enicion de la funcion)oid 9uncion * )oid 0U

77 entenciasVchar tra9uncion * char ., int p0U

77 entenciasV

)oid main * )oid 0U""

"

77 Llamo a la funcion "9uncion *0[mS tra9uncion * ,&%@0[V

%"2" EEMPL, C(3L E >A3' 'PLAK, MFL'PLEH'( E L A E(AL %

%"2" E!emplo, Control de )arios displa$, multiple5i´on de lasenal

%"2"1" b!eti)o

Controlar % displa$ de ; se#mentos )isualiando el conteo autom´atico de @ a ==="

%"2"2" <ardare

M

M

  W X

  W X

  W X

´ G

G

Page 24: Tutorial C18 2

7/21/2019 Tutorial C18 2

http://slidepdf.com/reader/full/tutorial-c18-2 24/60

%"2"%" C´odi#oM

7Y YY Archi)o con

 

denicion de re#istros $ bits del

 

microcontrolador

 

ele#ido Y7N include O p18f2@ "hP

7Y YY 'nclude para realiacion de demoras YY Y7

N include O dela$s "hP

7Y YY Con#uracion de los 9uses del microcontrolador   YY Y7N pra#ma con# 9C S HRH , 9CME( S99 , 'E S99 , CPF'> S C1RPLL2N pra#ma con# PI3 S1( , B3 S99 , B3> S@ , ICE S99 , IP S%2;:8N pra#ma con# MCL3E S1( , LP1C S99 , PBAE( S99 , CCP2MH S 99N pra#ma con# >3E( S99 , L>P S99 , H'( S99 , EBFD S 99N pra#ma con# CP@ S99 , CP1 S99 , CP2 S99 , CPB S99 , CP S 99N pra#ma con# I3@ S99 , I31 S99 , I32 S 99N pra#ma con# I3B S99 , I3C S99 , I3 S 99N pra#ma con# EB3@ S99 , EB31 S99 , EB32 S99 , EB3B S 99

77 Para controlar )iualiacion del ispla$ "

unsi#ned char i, Fnidad , ecena , Centena [

const rom unsi#ned 

char 

ispla$;e# +1@-SU@ 5%9 , @5@: , @5B , @5&9 , @5:: ,@5: , @5; , @5@; , @599 , @ 5:9 V[

7Y YY eclaracion de funcion a utiliar Y7)oid >isualiacion * )oid 0[

)oid main * )oid 0UAC(1 S@ 5@9 [77  odos entrada 7 salida di#itales "

 3'A S@ 59@ [ 3 ' B S@ 5@@ [ 77  odos como salida "

CAP´'FL %" 9F(C'(E

LAA S@ 5@@ [   77 Comiena en @

Fnidad S @[ecena S@[Centena S@[

hile *10U77 Llamamos funcion que actualia displa$s ">isualiacion *0[77 Actualiamos cuenta "ZZ Fnidad [if * Fnidad SS1@0U

Fnidad S@[ZZ ecena [if * ecena SS1@0U

ecena S@[ZZ Centena [

V

VV

olo a modo e!emplo colocamos funcion en la direccion @ 51@@@ """" de la memoria de pro#rama [ra#ma code 9unc ion S@ 51@@@d >isualiacion * )oid 0U

for *i S1 [i OS2@[ZZ i0U77 Car#amos en puerto )alor de la tabla indicado por Fnidad "LAB S ispla$;e# + Fnidad -[LAAbits " LAA@ S1 [   77 Enciendo ispla$

 Fnidad "ela$1CK5 *0[ 77 emora de  ms *H S& M< 0LAAbits " LAA@ S@ [LAB S ispla$;e# + ecena -[LAAbits " LAA1 S1 [

ela$1CK5 *0[LAAbits " LAA1 S@ [LAB S ispla$;e# + Centena -[LAAbits " LAA2 S1 [ela$1CK5 *0[LAAbits " LAA2 S@ [   77 Apa#o ispla$ Centena "

V

  W X

Page 25: Tutorial C18 2

7/21/2019 Tutorial C18 2

http://slidepdf.com/reader/full/tutorial-c18-2 25/60

ra#ma

 

code

i abrimos la )entana isassembl$ Listin# *>ie7"""0 $ buscamos la funci´on, podemos notarla primer columna que la misma se inicia en la direcci´on indicada"

%" Preprocesador $ irecti)as del preprocesador

El preprocesador es el primer pro#rama que se llama en la etapa de compilaci on de un proma" El preprocesador tiene su propio len#ua!e $ sus directi)as inician con un N"

Las )enta!as que tiene usar el preprocesador son4

los pro#ramas son m´as f´aciles de desarrollar,

%"%" P3EP3CEA3  K '3EC'>A EL P3EP3CEA3 %;

son m´as f´aciles de leer,

son m´as f´aciles de modicar

se pueden #eneraliar para )arias arquitecturas o compiladores"

%"%"1" irecti)as

NincludeEsta directi)a $a la hemos utiliado, se emplea para incluir archi)os $ suele darse al principio

de los pro#ramas, porque en #eneral se desea que su efecto alcance a todo el archi)o fuente" Poresta ra´on los archi)os preparados para ser incluidos se denominan headers o archi)os de cabecera"En ellos se declaran las funciones que se implementan $ deniciones para su implementaci´on"

Ndene

La directi)a dene tiene dos tipos de uso, como si fuera un ob!ecto o como si fuera una

funci´on" Las que se aseme!an a funciones toman par´ametros mientras que las que se aseme!an aob!etos no"u formato es el si#uiente4

N dene O identicador P Olista de to.ens a reemplaar P

N dene O identicador * O lista de parametros 0 Olista de to.ens a reemplaar P

E!emplos4

N dene e 2 "; 18 2 8

N dene LE   LABbits " LAB

N dene umaR1@ *50 U5 ZS1@[V

N dene uma Ri)ideR 1@ *50 U*5 ZS1@0[* 5 7S1@0[V

(ota4 e debe tener cuidado en la implementaci´on de esta directi)a" Las que se aseme!an afunciones, pueden tomar par´ametros pero no se comportan como una funci´on, $a que el preproce

sador reemplaa un te5to por otro, lo cual conlle)a al ma$or uso de la memoria de pro#rama"

Nifdef, Nifndef, Nelse, Nelif  $ Nendif 

Estas directi)as son utiliadas para realiar compliaciones condicionadas, por e!emplo para

hacer una librer 6a #eneraliada para )arias arquitecturas, para ser utiliada por )arios compiladores o simplemente para seleccionar el ni)el de uso de cierto pro$ecto"E!emplos4

Nif  dened * RR18CHH 0

N include O p18c555 "hP

N elif  dened *  RRdsP'C%@9RR  0

CAP´'FL %" 9F(C'(E

N include O p%@f5555 "hP

elif  dened *  RRdsP'C%%9RR  0

M

M

M

  W X

  W X

M

M

  W X

  W X

  W X

Page 26: Tutorial C18 2

7/21/2019 Tutorial C18 2

http://slidepdf.com/reader/full/tutorial-c18-2 26/60

N include O p%%95555 "hP

elif  

dened * RRP'C2&<RR 0N include O p2&<5555 "hP

elif  dened *  RRP'C2&9RR  0

N include O p2&95555 "hP

endif 

Para no utiliar pin 3I sacar comentario a la si#uiente

 linea "

dene 

 RRLCR C1(RIA'

ene LCRP'(RE LACbits " LAC&ene LCRP'(R3 LACbits " LAC2

fndef   RR LCR C1( R IA' 

N dene LCRP'(R3I LACbits " LAC%endif 

CC

f  dened * RRPC<RR 0char Buger +12-[

endif C18fdef   RR18CHH

N pra#ma udata S@ 51@@unsi#ned char Buger +12-[N pra#ma udata

endif C%@ $ C%2f  dened * RRC%@RR 0 ^^ dened * RRP'C%2MHRR 0

unsi#ned

 

char

 

 RRattributeRR  ** ali#ned *&000

 

Buger +12-[endif 

&" E!emplo, Control de )arios displa$, utiliando directi)as de preprocesador

&"1" b!eti)o

e realia el mismo e!emplo anterior pero utiliando directi)as de preprocesador, deniendo

hardare a utiliar" 3ealiandolo de esta manera es mucho m as sencillo realiar cualquierdicaci´on en el c´odi#o del hardare utiliado"

&"2" C´odi#o

YY Archi)o con denicion de re#istros $ bits del microcontrolador ele#ido Y7nclude O p18f2@ "hP

YY 'nclude para realiacion de demoras YY Y7nclude O dela$s "hP

%"&" EEMPL, C(3L E >A3' 'PLAK, F'L'TA( '3EC'>A E P3EP3CEA3%=

7Y YY Con#uracion de los 9uses del microcontrolador   YY Y7

N pra#ma 

con# 

9C S HRH , 9CME( S99 , 'E S99 , CPF'> S C1RPLL2N pra#ma 

con# 

PI3 S1( , B3 S99 , B3> S@ , ICE S99 , IP S%2;:8N pra#ma con# MCL3E S1( , LP1C S99 , PBAE( S99 , CCP2MH S 99N pra#ma con# >3E( S99 , L>P S99 , H'( S99 , EBFD S 99N pra#ma con# CP@ S99 , CP1 S99 , CP2 S99 , CPB S99 , CP S 99N pra#ma con# I3@ S99 , I31 S99 , I32 S 99N pra#ma con# I3B S99 , I3C S99 , I3 S 99N pra#ma con# EB3@ S99 , EB31 S99 , EB32 S99 , EB3B S 997Y YY eniciones para preprocesador YY Y777 Pi n para control

 

displa$ )isualiador de unidades "

N dene 'PLAKRP'(RF LAAbits " LAA@

N dene 'PLAKRP'(R LAAbits " LAA1N dene 'PLAKRP'(RC LAAbits " LAA2

N dene 'PLAKR3'RF   3'Abits " 3'A@ 77N dene

 

'PLAKR3'R   3'Abits " 3'A1

N dene 

'PLAKR3'RC   3'Abits " 3'A2

77 Puerto 

para 

en)iar 

data a displa$s "N dene 'PLAKRAA LABN dene C'PLAKR3'R CAA 3'B7Y YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY Y777 Para controlar

 )iualiacion del ispla$ "unsi#ned char i, Fnidad , ecena , Centena [const rom unsi#ned char ispla$;e# +1@-SU@ 5%9 , @5@: , @5B , @5&9 , @5:: ,

Page 27: Tutorial C18 2

7/21/2019 Tutorial C18 2

http://slidepdf.com/reader/full/tutorial-c18-2 27/60

@5: , @5; , @5@; , @599 , @ 5:9 V[

7Y YY eclaracion de funcion a utiliar Y7)oid >isualiacion * )oid 0[

)oid main * )oid 0UAC(1 S@ 5@9 [77  odos entrada 7 salida di#itales "

C'PLAKR3'R CAA S@ 5@@ 4'PLAKR3'RF S@['PLAKR3'R S@['PLAKR3'RC S@[

'PLAKRP'(RF S@['PLAKRP'(R S@['PLAKRP'(RC S@[Fnidad S@ [ecena S@[Centena S@[

hile *10U77 Llamamos funcion que actualia displa$s ">isualiacion *0[77 Actualiamos cuenta  "ZZ Fnidad [if * Fnidad SS1@0U

Fnidad S@ [ZZ ecena [if * ecena SS1@0U

ecena S@[ZZ Centena [

CAP´'FL %" 9F(C'(E

V

VV

d >isualiacion * )oid 0Ufor *i S1 [i OS2@[ZZ i0U

77 Car#amos en puerto )alor de la tabla indicado por Fnidad "'PLAKRAA S ispla$;e# + Fnidad -['PLAKRP'(RF S1[   77 Enciendo ispla$

 Fnidad "ela$1CK5 *0[   77 emora de  ms *H S& M< 0'PLAKRP'(RF S@[

'PLAKRAA S ispla$;e# + ecena -['PLAKRP'(R S1[ela$1CK5 *0['PLAKRP'(R S@['PLAKRAA S ispla$;e# + Centena -['PLAKRP'(RC S1[ela$1CK5 *0['PLAKRP'(RC S@[   77 Apa#o ispla$

 Centena "V

" Control de LC

Para realiar el control de un LC necesitamos usar la librer´6a 5lcd"h ubicada en C47MCC187h"

a librer´6a es para un LC con controlador <itachi <&&;8@ o compatible, utiliando 8 o & bitsancho de bus para en)io7recepci´on de datos" El usuario debe pro)eer % dela$ para el correctocionamiento, ela$P3HLC*0 de 1ms, ela$HLC*0 de ms $ ela$9or18CK*0 de 18

$"

En este caso no )amos a modicar la librer´6a *>´ease m´as adelante0, pues lo )amos a controlar

n el puerto B, con#uraci on por defecto, pero en el caso de que se modique su#iero siemprepaldarla con una copia de se#uridad"

"1" E!emplo, control de LC

!eti)o

  W X

Page 28: Tutorial C18 2

7/21/2019 Tutorial C18 2

http://slidepdf.com/reader/full/tutorial-c18-2 28/60

>amos a escribir un simple mensa!e en un LC" e crear´an 2 funciones adicionales para un!or el control, la primeria seria el en)´6o de comandos, con una pre)ia espera de disponibilidadLC $ la se#unda es para controlar la posici´on del cursor en el LC"

%"" C(3L E LC &1

<ardare

C´odi#o

M7Y YY Archi)o con denicion de re#istros $ bits del microcontrolador ele#ido Y7N include O p18f2@ "hP

7Y YY 'ncludes YY Y7N include O dela$s "hP

N include O5lcd "hP

7Y YY Con#uracion de los 9uses del microcontrolador   YY Y7N pra#ma con# 9C S HRH , 9CME( S99 , 'E S99 , CPF'> S C1RPLL2N pra#ma con# PI3 S1( , B3 S99 , B3> S@ , ICE S99 , IP S%2;:8N pra#ma con# MCL3E S1( , LP1C S99 , PBAE( S99 , CCP2MH S 99N pra#ma con# >3E( S99 , L>P S99 , H'( S99 , EBFD S 99N pra#ma con# CP@ S99 , CP1 S99 , CP2 S99 , CPB S99 , CP S 99

N pra#ma

 

con#

 

I3@ S99 , I31 S99 , I32 S 99N pra#ma

 

con# 

I3B S99 , I3C S99 , I3 S 99N pra#ma con# EB3@ S99 , EB31 S99 , EB32 S99 , EB3B S 99

)oid ela$9or18CK * )oid 0U

ela$1@CK5 *20[V)oid ela$P3HLC * )oid 0U

ela$1CK5 *10[V)oid ela$HLC * )oid 0U

ela$1CK5 *20[V

77 En)ia comando al LC

)oid

 

comandHLC * unsi#ned

 

char a0UBus$HLC *0[

IriteCmdHLC *a0[V77 Fbica cursor en *5 S Posicion en linea , $ S   (  de linea 0

CAP´'FL %" 9F(C'(E

d #oto5$HLC * unsi#ned char 5, unsi#ned char $0Usi#ned char direccion [

if *$ \S 10direccion S @ 5&@ [

elsedireccion S@ [

direccion ZS 5 1[comandHLC *@ 58@ ^ direccion 0[

d main * )oid  0U

 

W  X

Page 29: Tutorial C18 2

7/21/2019 Tutorial C18 2

http://slidepdf.com/reader/full/tutorial-c18-2 29/60

penHLC * 9F3RB' ] L'(ERH; 0[   77 'niciamos LC "comandHLC *@ 5@: 0[ 77 (os ase#uramos incremento de direccion , displa$

 

A!ocomandHLC *@ 5@C 0[   77 Encendemos LC "putrsHLC * Probando LC 0[#oto5$HLC *1 ,20[   77 Pasamos al oriden del Linea 2" putrsHLC * Por u.$ 0[hile *10U   77 Bucle inAnito "V

:" Con)ersi´on anal´o#ica di#ital

Para utiliar el m´odulo de con)ersi on anal´o#icadi#ital MPLAB C18 nos proporciona la libr6a adc"h la cual contiene funciones necesarias para con#uraci´on e implementaci´on del mismo"e m´odulo posee )arias opciones de con#uraci´on que depender´an de la aplicaci´on $ para m´asormaci´on leer el datasheet del microcontrolador utiliado"La librer´6a al ser utiliable en todos los microcontroladores 189 a#rupa las funciones depenndo de sus caracteristicas, $ para saber en cual entra el que estamos usando recurrimos al

hi)o pcon#"h, $ por e!emplo para el P'C1892@ le corresponde AC >"

:"1" 9unciones *para AC >0

penAC*PA3AM CLA unsi#ned char,PA3AM CLA unsi#ned char,PA3AM CLA

unsi#ned char 0[

Con ella se con#ure el relo!, el formato, tensi on de referencia, puerto $ canal de lacon)ersi on" Para saber que colocar en cada par´ametro abrir A Con)erter ubicado enC47MCC187doc7periphlib"E!emplos4

%":" C(>E3'( A(ALD'CA 'D'AL &%

MpenAC * ACR9CR%2 ] ACR8RA ] ACR3'D<RF ,

ACR3E9R>R> ] ACR'(R99 , ACRA(A0[

MN dene FER3RMApenAC * ACR9CR3C ^ ACR2@RA ^ ACRLE9RF ,

ACCR3E9R>3E9PLFR>3E9M'(F ^ ACR'(R99 , ACR1A(A 0[

CloseAC*0[ esacti)a el con)ersor $ la interrupci´on"

etChanAC*Fnsi#ned char0[ elecciona el canal que se )a a utiliar"

Con)ertAC*0[ Comiena la con)ersi´on"

elChanCon)AC*Fnsi#ned char0[ elecciona canal $ comiena con)ersi´on"

Bus$AC*0[ Comprueba si la con)ersi´on a naliado"

3eadAC*0[ de)uel)e la lectura del canal anal´o#ico seleccionado"

%":"2" E!emplo

Fso del m´odulo de con)ersi´on anal´o#ico7di#ital"

b!eti)o

 omar lectura de 2 )alores anal o#icos $ mostrarlo en un LC" Al accionar un pulsador,

leeremos los 2 canales anal´o#icos $ los mostraremos en el LC durante 1 se#undo"

´ ´

  W X

  W X

Page 30: Tutorial C18 2

7/21/2019 Tutorial C18 2

http://slidepdf.com/reader/full/tutorial-c18-2 30/60

<ardare

CAP´'FL %" 9F(C'(E

di#o

YY Archi)o con denicion de re#istros $ bits del microcontrolador ele#ido Y7nclude O p18f2@ "hP

YY 'ncludes YY Y7nclude O dela$s "hP

nclude O5lcd "hP

nclude O stdlib "hP 77 Libreria

 

para

 

con)ersiones a strin#nclude Oadc "hP

YY Con#uracion de los 9uses del microcontrolador   YY Y7ra#ma con# 9C S HRH , 9CME( S99 , 'E S99 , CPF'> S C1RPLL2ra#ma con# PI3 S1( , B3 S99 , B3> S@ , ICE S99 , IP S%2;:8ra#ma con# MCL3E S1( , LP1C S99 , PBAE( S99 , CCP2MH S 99ra#ma con# >3E( S99 , L>P S99 , H'( S99 , EBFD S 99ra#ma con# CP@ S99 , CP1 S99 , CP2 S99 , CPB S99 , CP S 99ra#ma con# I3@ S99 , I31 S99 , I32 S 99ra#ma con# I3B S99 , I3C S99 , I3 S 99ra#ma con# EB3@ S99 , EB31 S99 , EB32 S99 , EB3B S 99

d ela$9or18CK * )oid 0U

ela$1@CK5 *20[

ela$P3HLC * )oid 0Uela$1CK5 *10[

d ela$HLC * )oid 0Uela$1CK5 *20[

En)ia comando al LCd comandHLC * unsi#ned char a0U

Bus$HLC *0[IriteCmdHLC *a0[

Fbica cursor en *5 S Posicion en linea , $ S   (  de linea 0d #oto5$HLC * unsi#ned char 5, unsi#ned char $0Ui#ned char direccion [

if *$ \S 10direccion S @ 5&@ [

elsedireccion S@ [

direccion ZS 5 1[comandHLC *@ 58@ ^ direccion 0[

d main * )oid 0Uunsi#ned int Canal@ , Canal1 [char trin# +&-[

penHLC * 9F3RB' ] L'(ERH; 0[   77 'niciamos LC "comandHLC *@ 5@: 0[ 77 (os ase#uramos incremento de direccion , displa$

 

A!openAC * ACR9CR3C ] ACR2RA ] ACR3'D<RF ,

ACR3E9R>R> ] ACR'(R99 , ACR2A(A0[

%":" C(>E3'( A(ALD'CA 'D'AL &

comandHLC *@ 5@C 0[   77 Encendemos LC "

hile *10UcomandHLC *@ 5@1 0[   77 Borra pantalla $ )uel)e al ori#en "putrsHLC * Presionar

 boton 0[hile * P3Abits " 3A2 SS10UV 77 Espero a que se accione el pulsador  "etChanAC *@0[   77 elecciono canal a con)ertir "77 ela$1@CK5  *10[77 1@ us para que se car#ue el   capacitor sample ] hold

77 ""* olo cuando se selecciona ACR@RA 0" 

Con)ertAC *0[   77 Comiena

 

con)ersion "hile * Bus$AC *0SS10UV 77 <asta que se Analice

 

con)ersion "Canal@ S 3eadAC *0[   77 3ealio lectura "

etChanAC *10[   77 elecciono 

canal a con)ertir "77 ela$1@CK5  *10[77 1@ us para que se car#ue el   capacitor sample ] hold

77 ""* olo cuando se selecciona 

ACR@RA 0" Con)ertAC *0[   77 Comiena con)ersion "

´ ´

  W X

Page 31: Tutorial C18 2

7/21/2019 Tutorial C18 2

http://slidepdf.com/reader/full/tutorial-c18-2 31/60

hile * Bus$AC *0SS10UV 77 <asta que se Analice

 

con)ersion "Canal1 S 3eadAC *0[   77 3ealio

 

lectura "

comandHLC *@ 5@1 0[   77 Borra pantalla $ )uel)e al ori#en "putrsHLC * Canal @ S 0[itoa * Canal@ , trin# 0[   77 Con)ertimos entero a strin# "putsHLC * trin# 0[#oto5$HLC *1 ,20[putrsHLC * Canal 1 S 0[itoa * Canal1 , trin# 0[   77 Con)ertimos entero a strin# "putsHLC * trin# 0[ela$1@CK5 *1@@0[

VV

CAP´'FL %" 9F(C'(E

Cap´6tulo &

'nterrupciones

&"1" 'ntroducci´on

Los dispositi)os P'C18 tienen m´ultiples fuentes de interrupci´on $ la caracter´6stica de prioridad de interrupci´on, que permite a cada fuente de interrupci´on asi#narle un ni)el de prioridad,

ba!o o alto" Cuando ocurre un e)ento de alta prioridad interrumpir´a cualquier interrupci´on deba!a prioridad que pueda estar en pro#reso" El )ector de alta prioridad esta en @5@8 $ el )ectorde ba!a prioridad en @518"

Cada fuente de interrupci´on tiene tres bits para controlar su operaci´on" Las funciones de estosbits son4

Bit bandera, que indica si un e)ento de interrupci´on ha ocurrido"

Bit Enable, que admiten la e!ecuci on de la interrupci´on, permitiendo la bifurcaci´on del

pro#rama a la direcci´on del )ector de interrupci´on"

Bit de prioridad, para seleccionar prioridad ba!a o alta"

La caracter´6stica de prioridad de interrupciones se acti)a seteando el bit 'PE(" i este noesta seteado, no e5isten prioridades $ las interrupciones se comportan como en los dispositi)os

de #ama media *P'C1:0 $ todas las interrupciones se bifurcan al )ector @5@8"

&"2" 3utinas de atenci´on a interrupciones

La directi)a Npra#ma interruplo nombre dene rutina de ser)icio de interrupci´on *'30de ba!a prioridad $ Npra#ma interrup nombre de alta prioridad"Las '3 son funciones como cualquier otra, pero con las restricciones de que4

(o de)uel)en ni aceptan par´ametros"

(o se puede in)ocar desde otros puntos del pro#rama"

Las )ariables #lobales que utilice se deben declarar como )olatile"

El Compilador C18 no sit´ua autom´aticamente las '3 en las posiciones de los )ectores de

interrupci´on, por lo que el usuario debe ubicarlas"

&;

CAP´'FL &" '(E33FPC'(E

  W X

  W X

  W X

  W X

Page 32: Tutorial C18 2

7/21/2019 Tutorial C18 2

http://slidepdf.com/reader/full/tutorial-c18-2 32/60

2"1" E!emplos

ra#ma interruplo '3Ba !aPrioridadd '3Ba !aPrioridad * )oid 0U

77  ratamiento de interrupcion "

Creamos una nue)a seccion de codi#o a partir de la direccion @ 518 "ra#ma code PrioridadBa!a S @ 518d >ectorBa !aPrioridad * )oid 0U

77 'nstruccion insertada en la direccion @ 518 " Rasm #oto '3Ba !aPrioridad  Rendasm

ra#ma 

code 77 Cerramos 

seccion "

ra#ma interruplo '3AltaPrioridadd '3AltaPrioridad * )oid 0U

77  ratamiento de interrupcion "

Creamos una nue)a seccion de codi#o a partir de la direccion @ 5@8 "ra#ma code PrioridadAlta S @ 5@8d >ectorAltaPrioridad * )oid 0U

77 'nstruccion insertada en la direccion @ 5@8 " Rasm #oto '3AltaPrioridad  Rendasm

ra#ma code 77 Cerramos seccion "

Las rutinas de ser)icio de interrupci´on solo #uardan el m´6nimo del conte5to por defecto, $ paraardar otras )ariables o onas de memoria *declaradas en Y"l.r0 ha$ que indicarlos mediante laci´on sa)eSr e!emplo para #uardar el contenido de una )ariable #lobal4

ra#ma interrupt '3Rlo sa)e S >ar iableDlobal

mbi en se pueden #uardar re#istros internos o secciones completas de datos" Para sal)ar todaa secci´on de datos, por e!emplo secci´on M'EC'( hacemos4

YY Archi)o Y" l.rYY Y7

ABA( (AME S #pr1R A3 S@ 519@ E( S@ 5199 P3ECEC'( (AME S M'EC'(   3AM S #pr1R 

3utina de 'nterrupcion "ra#ma interrupt '33ecepcion sa)e S section * M'EC'( 0d '33ecepcion * )oid 0Uif * P'31bits " 3C'9 SS10U

&"2" 3F'(A E AE(C'( A '(E33FPC'(E &=

CAP´'FL &" '(E33FPC'(E

"2" Precauciones al traba!ar con interrupciones

i una '3 llama a otra subrutina se debe #uardar la secci´on de datos temporales utiliadas

por las funciones ?"tmpdata?" sa)eSsection*?"tmpdata?0

i una '3 llama a otra subrutina que de)uel)e un par´ametro de 1: bits, el re#istro internodel microcontrolador P3 debe de #uardarse" sa)eSP3

i utilia la librer´6a matem´atica o llama a funciones que de)uel)en )alores de 2& o %2 bits,se debe #uardar la secci´on de datos ?MA< AA?" sa)eSsection*?MA< AA?0

%" M´odulo FA3

ara la comunicaci´on serial es necesario a#re#ar la librer´6a usart"h" Con esta librer´6a se conra el modo de transmisi´on $ recepci´on serie de nuestro microcontrolador"

´

Page 33: Tutorial C18 2

7/21/2019 Tutorial C18 2

http://slidepdf.com/reader/full/tutorial-c18-2 33/60

"1" 9unciones

penFA3* unsi#ned char con#, unsi#ned int spbr#0[ Esta funci on corresponde a la

con#uraci on del m´odulo FA3, asincr´onica o sincr´onica, 8 bits o = bits, )elocidad decomunicaci´on, etc" Para saber que colocar en cada par´ametro abrir FA3 ubicado enC47MCC187doc7periphlib"

CloseFA3*0[ eshabilita m´odulo FA3"

putcFA3*char data0[ En)´6a un b$te"

putsFA3*char Ybuger0[ En)ia un strin# desde la memoria de datos"

putrsFA3*const rom char Ydata0[ En)ia un strin# desde la memoria de pro#rama"

Bus$FA3*0[ etermina si se ha transmitido el dato"

ata3d$FA3*0[ 'ndica si ha lle#ado un dato para ser le´6do"

#etcFA3*0[ Lee un b$te"

#etsFA3*char Ybuger, Fnsi#ned char len0[ Lee un strin#"

"2" E!emplo

eti)oa PC en)iar´a comando de lectura de los canales anal´o#icos" i se recibe un @5:1 *a0, en)iar

al @, si se recibe un @5:2 *b0 en)iar canal 1 $ si se recibe un @5:% *c0 en)iar los 2 canales´o#icos"

&"%" MFL FA3 1

<ardare

(ota4 La adaptaci´on de tensiones se puede hacer con el MAH2%2 o con transistores, como sedesee"

C´odi#o

M7Y YY Archi)o con denicion de re#istros $ bits del microcontrolador ele#ido Y7N include O p18f2@ "hP

7Y YY 'ncludes YY Y7N include O dela$s "hP

N include O stdlib "hP 77 Libreria para con)ersiones a strin#N include Oadc "hP

N include Ousart "hP

7Y YY Con#uracion de los 9uses del microcontrolador   YY Y7N pra#ma con# 9C S HRH , 9CME( S99 , 'E S99 , CPF'> S C1RPLL2N pra#ma con# PI3 S1( , B3 S99 , B3> S@ , ICE S99 , IP S%2;:8N pra#ma con# MCL3E S1( , LP1C S99 , PBAE( S99 , CCP2MH S 99

N pra#ma 

con# 

>3E(S99 , L>P

S99 , H'(

S99 , EBFD

S 99N pra#ma

 

con# CP@ S99 , CP1 S99 , CP2 S99 , CPB S99 , CP S 99N pra#ma

 

con# 

I3@ S99 , I31 S99 , I32 S 99N pra#ma con# I3B S99 , I3C S99 , I3 S 99N pra#ma con# EB3@ S99 , EB31 S99 , EB32 S99 , EB3B S 99

)oid '33ecepcion * )oid 0[)olatile

 char ata , bhit [

´

Page 34: Tutorial C18 2

7/21/2019 Tutorial C18 2

http://slidepdf.com/reader/full/tutorial-c18-2 34/60

77 Creamos una nue)a 

seccion de codi#o a partir de la direccion @ 5@8 "N pra#ma code 'nterrupcion S @ H@@@8)oid >ector'nterrupcion * )oid 0U

 Rasm #oto '33ecepcion  RendasmVN pra#ma code 77 Cerramos seccion "

77 3utina de 'nterrupcion "N pra#ma interrupt '33ecepcion)oid '33ecepcion * )oid 0U

if * P'31bits " 3C'9 SS10Uata S #etcFA3 *0[   77 Leemos ato recibido

CAP´'FL &" '(E33FPC'(E

bhit S1 [   77 'ndicamos que se ha recibido un dato "

P'31bits " 3C'9 S@[   77 Borramos bandera "V

main * )oid  0U

unsi#ned int Canal@ , Canal1 [char trin# +&-[

penFA3 * FA3RHR '( R 199 ] FA3R3HR '(R( ]

FA3RAK(C< R M1CE ] FA3R E'D< R B' ]

FA3RC(R3H ] FA3RB3D<R<'D< ,20[ 77 =:@@ ,8 ,n ,1

penAC * ACR9CR3C ] ACR2RA ] ACR3'D<RF ,ACR3E9R>R> ] ACR'(R99 , ACR2A(A0[

bhit S@ [3C(bits " 'PE( S@[   77 eshabilitamos Prioridades'(C(bits " PE'E S1 [   77 <abilitamos interrupcion de perif 

os "'(C(bits " D'E S1[   77 <abilitamos

 

interrupcion Dlobal  "

putrsFA3 * Prueba Comunicacion Berial r0[hile *10U

hile * bhit SS@0UV[ 77 esperamos a recibir dato "bhit S@ [sitch * ata 0U

case @ 5:1 4   77 letra aetChanAC *@0[ 77 elecciono

 

canal a con)ertir "77 ela$1@CK5  *10[771@ us para que se car#ue el   capacitor sample ] hold

Con)ertAC *0[   77 Comiena

 

con)ersion "hile * Bus$AC *0SS10UV   77 <asta que se Analice 

con)ersion "Canal@ S 3eadAC *0[   77 3ealio lectura "putrsFA3 * Canal @ S 0[itoa * Canal@ , trin# 0[   77 Con)ertimos entero a strin# "putsFA3 * trin# 0[putrsFA3 *r0[

brea. [case @ 5:2 4   77 letra b

etChanAC *10[ 77 elecciono 

canal a con)ertir "77 ela$1@CK5  *10[771@ us para que se car#ue el   capacitor sample ] holdCon)ertAC *0[   77 Comiena con)ersion "

hile * Bus$AC *0SS10UV   77 <asta que se Analice con)ersion "Canal1 S 3eadAC *0[   77 3ealio lectura "putrsFA3 * Canal 1 S 0[itoa * Canal1 , trin# 0[   77 Con)ertimos entero a strin# "

putsFA3 * trin# 0[putrsFA3 *r0[brea. [case @ 5:% 4   77 letra c

etChanAC *@0[ 77 elecciono canal a con)ertir "77 ela$1@CK5  *10[771@ us para que se car#ue el   capacitor sample ] holdCon)ertAC *0[   77 Comiena con)ersion "hile * Bus$AC *0SS10UV   77 <asta que se Analice

 

con)ersion "Canal@ S 3eadAC *0[   77 3ealio lectura "

etChanAC *10[ 77 elecciono canal a con)ertir "77 ela$1@CK5  *10[771@ us para que se car#ue el   capacitor

 sample ] holdCon)ertAC *0[   77 Comiena con)ersion "

&"%" MFL FA3 %

hile * Bus$AC *0SS10UV   77 <asta que se Analice 

con)ersion "

Canal1 S 3eadAC *0[   77 3ealio lectura "

putrsFA3 * Canal @ S 0[itoa * Canal@ , trin# 0[   77 Con)ertimos entero a strin# "putsFA3 * trin# 0[

E!emplo de formatos4

Especicaci on >alorS@512 >alorS@59E@%u @18 2&u 18 2&2u 18 Yd 18 25 12 feH 12   9E

´

 

W  X

Page 35: Tutorial C18 2

7/21/2019 Tutorial C18 2

http://slidepdf.com/reader/full/tutorial-c18-2 35/60

putrsFA3 *r0[putrsFA3 * Canal 1 S 0[itoa * Canal1 , trin# 0[   77 Con)ertimos entero a strin# "putsFA3 * trin# 0[putrsFA3 *r0[

brea. [V

VV

Ftiliando Printf 

tra manera de en)iar los datos es utiliando la funci on printf, la cual crea una cadena de

te5to con formato que puede ser en)iada por e!emplo por el puerto serial" M´as adelante )eremoscomo seleccionar por que perif´erico en)iar la cadena *erial *por defecto0, LC, P', ect0

MPara utiliar esta funci´on debemos a#re#ar la librer´6a stdio"h"

printf  * const rom char Yfmt , """0[

(os permite especicar el formato en que queremos mostrar datos por pantalla"

Par´ametros4 Cadena de formato *c´omo se )isualian los datos0 $ Lista de )alores *datos que

se )isualian09ormatos4d Entero con si#no"u Entero sin si#no"5 <e5adecimal min´uscula"H <e5adecimal ma$´uscula"

E!emplo4

Mprintf  * <ola 0[ata S1@[printf  *El )alor es 4 iu,ata 0[ 77 e muestra El )alor es 4 1@

CAP´'FL &" '(E33FPC'(E

tonces se puede reemplaar4

Canal@ S 3eadAC *0[putrsFA3 * Canal @ S 0[itoa * Canal@ , trin# 0[putsFA3 * trin# 0[putrsFA3 *r0[

r4

 

W  X

 

W  X

 

W  X

 

W  X

Page 36: Tutorial C18 2

7/21/2019 Tutorial C18 2

http://slidepdf.com/reader/full/tutorial-c18-2 36/60

N include Ostdio "hP

"""Canal@ S 3eadAC *0[printf  * Canal @ S

 iu r, Canal@ 0[

En el manual se usuario del compilador C18 indica que cuando se utilia esta librer 6a sebe modicar las opciones del po$ecto, seleccionando lar#e code model" Para ello )amos a Prot7Build ptions7Pro!ect, seleccionamos MPLAB C18, cate#or 6a Memor$ Model $ che.eamos

r#e code model *j:& b$tes0"

&"%" MFL FA3

CAP´'FL &" '(E33FPC'(E

Cap´6tulo 

Librer´6as

"1" 'ntroducci´on

En el cap´6tulo Comenando con C18 mostramos como era el Ju!o para la #eneraci´on del Y"he5"All´6 )imos que podemos disponer de archi)os fuentes en Y"c, archi)os en Y"asm, archi)os ob!etosprecompilados Y"o, $ librer´6as Y"lib" En todos los e!emplos anteriormente mostrados solo hemostraba!ado con un archi)o principal Y"c $ las librer´6as precompiladas a#rupadas en archi)os Y"lib,los cuales est´an ubicados en el subdirectorio MCC187lib"La librer 6a est´andar es clib"lib *para modo noe5tendido0 o clib e"lib *para modo e5tendido0"Esta librer´6a es independiente de microcontrolador $ el c´odi#o fuente se encuentra en los directorios4

src7traditional7math

src7e5tended7math

src7traditional7dela$s

src7e5tended7dela$s

src7traditional7stdclib

src7e5tended7stdclib

La librer 6a espec 6ca que contiene funciones escritas para un miembro indi)idual de la familia18" El nombre de estas librer 6as depende del microcontrolador pprocessor"lib *(oe5tendido0$ pprocessor e"lib *E5tendido0" E!emplo p18f2@"lib" El c odi#o fuente se encuentra en losdirectorios4

src7pmc commonsrc7traditional7proc

src7e5tended7proc

En este nue)o capitulo )amos a mostrar los pasos a se#uir para poder modicar una librer´6a del

Compilador C18 $ como desarrollar una librer´6a"

´

Page 37: Tutorial C18 2

7/21/2019 Tutorial C18 2

http://slidepdf.com/reader/full/tutorial-c18-2 37/60

;

CAP´'FL " L'B3E3´'A

2" Modicar las librer´6as

e e5plicar´a como realiar cambios en las librer´6as de C18, para que estas se ha#an efecti)asa hora de compilar" En este caso cambiaremos el Puerto para el control del LC"mero que nada se debe realiar una copia de se#uridad, en este caso de 5lcd"h" Lue#o enstro pro#rama debemos incluir a 5lcd"h *MCC187h0 en <eader 9iles, $ los archi)os fuentes

esta librer´6a *MCC187src7pmc common7HLC0, quedando de la si#uiente manera4

e esa forma se recompilan los archi)os, creando sus respecti)os archi)os ob!etos *Y"o0 actuados necesarios para el lin.eo *MPLin.0 $ as´6 efecti)iar los cambios realiados en las rutinas"

En los pr´o5imos dos e!emplos utiliaremos el hermano ma$or, el P'C189&@, dado queesitamos un puerto completo para control del LC*En el puerto C, 3C% no e5iste, 3C&C solo pueden ser entradas di#itales0" >amos a modicar 5lcd"h para que utiliar el Puertoara controlar el LC $ los & bits m´as si#nicati)os del mismo *FPPE30 para en)iar los datos

LC quedando de las si#uiente manera4

ene

 

FPPE3AARP3

 

denes the port to hich the LC data lines are 

connected Y7

"2" M'9'CA3 LA L'B3E3´'A =

N dene AARP3 P3

N dene  3' RAARP3  3'7Y C3LRP3 denes the port here the control lines ar e connected "Y  hese are  !ust samples , chan#e to match $our application "Y7N dene 3IRP'( LAbits " LA1   7Y P3 for 3I Y7N dene  3'R3I   3'bits " 3'1   7Y  3 ' for 3I Y7N dene 3RP'( LAbits " LA@   7Y P3 for 3 Y7

N dene 

 3 'R 3   3'bits " 3'@   7Y  3 ' for 3 Y7N dene 

ERP '( L A b it s " LA2   7Y P3 for C   Y7N dene  3'RE 3'bits " 3'2   7Y  3 ' for E   Y7

M

 

W  X

Page 38: Tutorial C18 2

7/21/2019 Tutorial C18 2

http://slidepdf.com/reader/full/tutorial-c18-2 38/60

El c odi#o del pro#rama queda4

M7Y YY Archi)o con

 

denicion de re#istros $ bits del 

microcontrolador 

ele#ido Y7N include O p18f&@ "hP

N include O dela$s "hP

N include O5lcd "hP

7Y YY Con#uracion de los 9uses del microcontrolador   YY Y7N pra#ma con# 9C S HRH , 9CME( S99 , 'E S99 , CPF'> S C1RPLL2N pra#ma con# PI3 S1( , B3 S99 , B3> S@ , ICE S99 , IP S%2;:8N pra#ma con#

 MCL3E S1( , LP1C S99 , PBAE( S99 , CCP2MH S 99N pra#ma con# >3E( S99 , L>P S99 , H'( S99 , EBFD S 99N pra#ma con# CP@ S99 , CP1 S99 , CP2 S99 , CPB S99 , CP S 99N pra#ma con# I3@ S99 , I31 S99 , I32 S 99N pra#ma con# I3B S99 , I3C S99 , I3 S 99N pra#ma con# EB3@ S99 , EB31 S99 , EB32 S99 , EB3B S 99

)oid

 

ela$9or18CK * )oid 0Uela$1@CK5 *20[

V)oid ela$P3HLC * )oid 0U

ela$1CK5 *10[V)oid ela$HLC * )oid 0U

ela$1CK5 *20[V

CAP´'FL " L'B3E3´'A

En)ia comando al LC

comandHLC*

 unsi#ned 

char 

a0UBus$HLC *0[

IriteCmdHLC *a0[

Fbica cursor en *5 S Posicion en linea , $ S n ]N18:[ de linea 0d #oto5$HLC * unsi#ned char 5, unsi#ned char $0U

si#ned char direccion [

if *$ \S 10direccion S @ 5&@ [

elsedireccion S@ [

direccion ZS 5 1[comandHLC *@ 58@ ^ direccion 0[

d main * )oid  0U

penHLC * 9F3RB' ] L'(ERH; 0[   77 'niciamos LC "comandHLC *@ 5@: 0[ 77 (os ase#uramos incremento de direccion , displa$

 A!ocomandHLC *@ 5@C 0[   77 Encendemos LC "putrsHLC * LC en Puerto C0[#oto5$HLC *1 ,20[   77 Pasamos al oriden del Linea 2" putrsHLC * Por u.$ 0[hile *10U   77 Bucle inAnito "V

 

W  X

Page 39: Tutorial C18 2

7/21/2019 Tutorial C18 2

http://slidepdf.com/reader/full/tutorial-c18-2 39/60

%" 'nterrupc on por cam o e esta o 3B&3B;" Controde  eclado Matricial

%"1" b!eti)o

Al accionar una tecla del eclado Matricial, esta se mostrar´a en la pantalla LC" Apro)echare

s la interrupci´on por cambio de estado 3B&3B; para detectar que se ha presionado una tecla"ntro de la interrupci´on se realia el rastreo no para determinar cual ha sido"

´

"%"2" <ardare

(ota4 e usa el puerto C para el control del LC, $ para que la compilaci´on sea correcta sedeben se#uir los pasos de la secci´on anterior"

"%"%" C´odi#oM

7Y YY Archi)o con denicion de re#istros $ bits del microcontrolador 

ele#ido Y7N include O p18f&@ "hP

N include O dela$s "hPN include O5lcd "hP

7Y YY Con#uracion de los 9uses del microcontrolador   YY Y7N pra#ma con# 9C S HRH , 9CME( S99 , 'E S99 , CPF'> S C1RPLL2N pra#ma con# PI3 S1( , B3 S99 , B3> S@ , ICE S99 , IP S%2;:8N pra#ma con# MCL3E S1( , LP1C S99 , PBAE( S99 , CCP2MH S 99N pra#ma con# >3E( S99 , L>P S99 , H'( S99 , EBFD S 99N pra#ma con# CP@ S99 , CP1 S99 , CP2 S99 , CPB S99 , CP S 99N pra#ma con# I3@ S99 , I31 S99 , I32 S 99N pra#ma con# I3B S99 , I3C S99 , I3 S 99N pra#ma con# EB3@ S99 , EB31 S99 , EB32 S99 , EB3B S 99

unsi#ned char  ecla [

const rom unsi#ned char  eclas +1;-SU ;L,8L,=L,L7L,

CAP´'FL " L'B3E3´'A

&L,L,:L,5L,

1L,2L,%L,LL,L"L,@L,SL,ZL,LLV[

"%" '(E33FPC'( P3 CAMB' E EA 3B&3B;" C(3L E E CLA

Page 40: Tutorial C18 2

7/21/2019 Tutorial C18 2

http://slidepdf.com/reader/full/tutorial-c18-2 40/60

 R )o   [ela$9or18CK * )oid 0[ela$P3HLC * )oid 0[ela$HLC * )oid  0[comandHLC * unsi#ned char a0[#oto5$HLC * unsi#ned char 5, unsi#ned char $0[  esteclado * )oid 0[

Creamos una nue)a seccion de codi#o a partir de la direccion @ 5@8 "a#ma code 'nterrupcion S @ H@@@8

>ector'nterrupcion * )oid 0URasm #oto '33B&R3B;  Rendasm

a#ma code 77 Cerramos seccion "

YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY

main * )oid  0UpenHLC * 9F3RB' ] L'(ERH; 0[  77 'niciamos LC "comandHLC *@ 5@: 0[ 77 (os ase#uramos incremento de direccion , displa$

 A!o

3' B S@ 59@ [ 77 eeeessss "P3B S@ 5@@ ['(C(2 S @ H8@ [ 77 <abilitamos resistencias pull up"'(C( S @ H88 [77 Con#uracion de interrupcion

 por cambio de estado 3B&   3B;

comandHLC *@ 5@C 0[   77 Encendemos LC "putrsHLC *  eclaPulsada  0[#oto5$HLC *2 ,20[   77 Pasamos al oriden del Linea 2" putrsHLC * OO Autor u.$ PP0[hile *10U   77 Bucle inAnito "V

YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYela$9or18CK * )oid 0U

ela$1@CK5 *20[

ela$P3HLC * )oid 0Uela$1CK5 *10[

ela$HLC * )oid  0Uela$1CK5 *20[

En)ia comando al LCcomandHLC * unsi#ned char a0U

Bus$HLC *0[IriteCmdHLC *a0[

Fbica 

cursor en *5 S Posicion en linea , $ S n  de linea 0#oto5$HLC * unsi#ned char 5, unsi#ned char $0U

unsi#ned char direccion [

"&" F'L'TAC'( E P3'(9 PA3A EC3'B'3 E( LC :%

if *$ \S 10

direccion S @ 5&@ [else

direccion S@ [

direccion ZS 5 1[comandHLC *@ 58@ ^ direccion 0[

V

7Y 3astrea  ecla presionada , para ello , se )a colocando a @ lo#ico las Alas

de a una por )e , $ se testea si al#una columna tambien lo esta " e utiliala )ariable i para indicar que tecla esta siendo testeada , $ de esta maneraal detectar la pulsacion usar esta )ariable para seleccionar el caracter enel Buger  eclas "

Y7char  esteclado * )oid 0U

unsi#ned char i, ![P3B S@ 5@E [ 77 5555111@ "i S@ [for * ! S@ [ ! O&[ ! ZZ0U

if * P3Bbits " 3B& SS@0U brea. [Vi ZZ[

if * P3Bbits " 3B SS@0U brea. [Vi ZZ[if * P3Bbits " 3B: SS@0U brea. [Vi ZZ[if * P3Bbits " 3B; SS@0U brea. [Vi ZZ[LAB S P3B O O1 [   77  rasla da mo s el @ a si#uiente Pi n "

V

´

  W X

Page 41: Tutorial C18 2

7/21/2019 Tutorial C18 2

http://slidepdf.com/reader/full/tutorial-c18-2 41/60

return *  eclas +i -0[V

77 YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY77 3utina de 'nterrupcion "N pra#ma interrupt '33B&R3B;)oid '33B&R3B; * )oid 0U

if * '(C(bits " 3B'9 SS10U77 3eal iamos test del  ec la do  , $ nos de)uel)e tecla pulsada ecla S  esteclado *0[#oto5$HLC *1 ,10[putcHLC *  ecla 0[   77 >isualiamos

 tecla pulsada "77 Esperamos a que se suelte "hile * P3Bbits " 3B& SS@ ^^ P3Bbits " 3B SS@ ^^

P3Bbits " 3B: SS@ ^^ P3Bbits " 3B; SS@0UVP3B S@ 5@@ ['(C(bits " 3B'9 S @[ 77 Borramos

 

banderaV

V

"&" Ftiliaci´on de Printf  para escribir en LC

Para poder utiliar printf para formatear )ariables #enerando un strin# $ en)iarlo por e!emploal LC ha$ que realiar un par de modicaciones sencillas" Compiler C18 para seleccionar la

CAP´'FL " L'B3E3´'A

ci on que utiliar´a para en)iar datos a tra)´es de printf  dene una )ariable llamada Ystdoutel archi)o stdout"c" ependiendo del )alor que posea seleccionar´a entre en)iar datos por el

erto ser 6al *)alor default0 o utiliar la funci on que el usuario decida modicando el archi)oer putc"c"tonces debemos a#re#ar al pro$ecto el archi)o

 

user putc"c ubicado enMCC187src7e5tended7stdclib  $ a ´el hacerle las si#uientes modicaciones4

tern putcHLC * unsi#ned char c0[

dserRputc * unsi#ned char c0

putcHLC *c0[

Con esto $a podemos, modicando el )alor de stdout, seleccionar entre escribir en el LC o)iar por el puerto serial al utiliar la funci´on printf"amos un e!emplo4

YY Archi)o con denicion de re#istros $ bits del microcontrolador ele#ido Y7

nclude O p18f2@ "hP

nclude O dela$s "hP

nclude Ousart "hP

nclude O5lcd "hP

nclude Ostdio "hP

YY Con#uracion de los 9uses del microcontrolador   YY Y7ra#ma con# 9C S HRH , 9CME( S99 , 'E S99 , CPF'> S C1RPLL2ra#ma con# PI3 S1( , B3 S99 , B3> S@ , ICE S99 , IP S%2;:8ra#ma con# MCL3E S1( , LP1C S99 , PBAE( S99 , CCP2MH S 99ra#ma con# >3E( S99 , L>P S99 , H'( S99 , EBFD S 99ra#ma

 

con# CP@ S99 , CP1 S99 , CP2 S99 , CPB S99 , CP S 99ra#ma

 

con# 

I3@ S99 , I31 S99 , I32 S 99ra#ma con# I3B S99 , I3C S99 , I3 S 99ra#ma con# EB3@ S99 , EB31 S99 , EB32 S99 , EB3B S 99

d ela$9or18CK * )oid 0Uela$1@CK5 *20[

d ela$P3HLC * )oid 0Uela$1CK5 *10[

d ela$HLC * )oid  0Uela$1CK5 *20[

En)ia comando al LCd comandHLC * unsi#ned char a0U

Bus$HLC *0[IriteCmdHLC *a0[

Fbica cursor en *5 S Posicion en linea , $ S   (  de linea 0d #oto5$HLC * unsi#ned char 5, unsi#ned char $0U

si#ned char direccion [

if *$ \S 10

M

M

  W X

Page 42: Tutorial C18 2

7/21/2019 Tutorial C18 2

http://slidepdf.com/reader/full/tutorial-c18-2 42/60

direccion S @ 5&@ [else

"" CM C3EA3 F(A L'B3E3´'A :

direccion S@ [

direccion ZS 5 1[comandHLC *@ 58@ ^ direccion 0[

V

)oid main * )oid 0Uchar Buger +12-SU 2 linea """  V[

unsi#ned

 

char

 

>ariable S12[

penHLC * 9F3RB' ] L'(ERH; 0[   77 'niciamos LC "comandHLC *@ 5@: 0[ 77 (os ase#uramos incremento de direccion , displa$ A!ocomandHLC *@ 5@C 0[penFA3 * FA3RHR '( R 199 ] FA3R3HR'(R( ] FA3RAK(C< R M1CE ]

FA3RE'D< R B'  ] FA3RC(R3H ] FA3RB3D<R<'D< ,20[ 77 =:@@ ,8 ,n ,1

77 Modicamos para utiliar funci Lon del usuario , o sea escribir en LC "stdout S R<RFE3 [77 Con)ertimos a strin# )ariable "printf  * >ar  S iu, >ariable 0[#oto5$HLC *1 ,20[77 En)iamos strin# ccntenido en buger "printf  * s, Buger 0[

77 Modicamos

 

para

 

utiliar

 

nue)amente

 

puerto

 

serial "stdout S R<RFA3 [printf  * >ar  S iu, >ariable 0[

hile *10UVV

"" Como crear una librer´6a

>amos a crear una librer´6a para el control del circuito inte#rado ds1%@2, el cual es un relo! detiempo real con interface de comunicaci´on serial que nos permite leer o escribir re#istros internosque contienen los se#undos, minutos, horas, d´6a de la semana, fecha, mes $ ano"Para tener amplio conocimiento de c´omo funciona $ como poder realiar la comunicaci´on con ´el,

como se ha )enido recomendado, es necesario leer el datasheet" A #roso modo se puede dar la ideade que necesitamos realiar funciones para leer $ escribir los re#istros internos del dispositi)o, $habr´a que leer si se necesita inicialiarlo $ de que modo se reciben los datos" Fna )e entendidoel funcionamiento se pasa al proceso de realiar la librer´6a"

Fn proceso adecuado en el armado de una librer´6a es realiar dos archi)os, un archi)o cabecera*Y"h0 que contendr´a deniciones para el funcionamiento *Pines para controlar el dispositi)o $otros para me!or entendimiento del c´odi#o0 $ la declaraci´on de las funciones, $ un archi)o fuentecon la denici´on de las funciones $ )ariables"Para a#iliar el proceso de compilaci´on se realia lo si#uiente4

N ifndef   RR ds 1%@2R <

N dene  RRds1%@2 R<77 entencias

N endif 

CAP´'FL " L'B3E3´'A

X

esta manera solo se compila una sola )e la librer´6a en el caso de ser in)ocada )arias )eces enproceso de compilaci´on"

archi)o cabecera queda de la si#uiente manera4

 Ale ds1%@2 "h

 brief  Este

 

chero

 

contiene las

 

declaraciones de los pines $unciones

 

utiliadas 

para el control del 1%@2 "

fndef   RR ds 1% @2 R<ene  RR ds 1% @2 R<

nclude O p18c555 "hP

M

  W X

G

M

W

Page 43: Tutorial C18 2

7/21/2019 Tutorial C18 2

http://slidepdf.com/reader/full/tutorial-c18-2 43/60

Page 44: Tutorial C18 2

7/21/2019 Tutorial C18 2

http://slidepdf.com/reader/full/tutorial-c18-2 44/60

N include  ds1%@2 "h

)oid riteRb$te * unsi#ned char B$te 0Uunsi#ned char i[

 ris' S@ [for *i S@ [i OS;[ZZ i0U

'S B$ te ]@ 5@1 [B$te P S1[CL S1[CL S@[

VV

)oid ,riteRds1%@2 * unsi#ned char B$te , unsi#ned char ata 0U

3 S1[

CAP´'FL " L'B3E3´'A

riteRb$te * B$te 0[

riteRb$te * ata 0[ S@[

#ned char readRds1%@2 * unsi#ned char B$te 0Unsi#ned char i, ata [

risCL  S@ [ris3 S@ [

S1[riteRb$te * B$te 0[ris' S1 [

op*0[ata S@[

or *i S@ [i OS:[ i ZZ0Uif *' SS10 U ata ZS@ 58@ [Vata P S1[CL S1[ela$R2us *0[ 772usCL S@[ela$R2us *0[ 772us

V S@[

eturn * ata 0[

ds1%@2Rinit * )oid 0Unsi#ned char  ![

risCL  S@ [ris' S@ [ris3 S@ [

S@[ela$R2us *0[ 772us

CL S@[,riteRds1%@2 *@ 58E ,@0[,riteRds1%@2 *@ 5=@ ,@ 5A& 0[S readRds1%@2 *@ 581 0[f  ** ! ] @ 58@ 0\S@0U

,riteRds1%@2 *@ 58@ ,@0[V

#ned char #etRbcd * unsi#ned char ata 0Unsi#ned char (ible< , (ibleL [ible< S ata 71@[

(ibleL Sata * (ible< Y1@0[ible< O OS&[

eturn * (ible< ^ (ibleL 0[

#ned char rmRbcd * unsi#ned char ata 0Unsi#ned char i[S ata [

ata S*i P &0Y1@[

":" EEMPL, F EL 'ME3@ :=

ata S ata Z*i O O& P &0[

return * ata 0[V

  W X

Page 45: Tutorial C18 2

7/21/2019 Tutorial C18 2

http://slidepdf.com/reader/full/tutorial-c18-2 45/60

)o

 

se R a e me  uns #ne

 

c ar  a$ , uns #ne

 

c ar m ,unsi#ned

 

char $ear , unsi#ned 

char do ,unsi#ned char hr , unsi#ned min 0U

 risCL  S@ [ ris3 S@ [

,riteRds1%@2 *@ 58: , #etRbcd * da$ 00[,riteRds1%@2 *@ 588 , #etRbcd * mth 00[,riteRds1%@2 *@ 58C , #etRbcd * $ear 00[,riteRds1%@2 *@ 58A , #etRbcd * do 00[

,riteRds1%@2 *@ 58& , #etRbcd *hr 00[,riteRds1%@2 *@ 582 , #etRbcd * min 00[,riteRds1%@2 *@ 58@ , #etRbcd *@00[

V

unsi#ned char #etRda$ *0 U

return * rmRbcd * readRds1%@2 *@ 58; 000[Vunsi#ned char #etRmth *0U

return * rmRbcd * readRds1%@2 *@ 58= 000[Vunsi#ned char #etR$ear *0U

return * rmRbcd * readRds1%@2 *@ 58 000[Vunsi#ned char #etRdo *0U

return * rmRbcd * readRds1%@2 *@ 58B 000[Vunsi#ned char #etRhr *0U

return * rmRbcd * readRds1%@2 *@ 58 000[Vunsi#ned char #etRmin *0U

return * rmRbcd * readRds1%@2 *@ 58% 000[

Vunsi#ned

 

char 

#etRsec *0Ureturn * rmRbcd * readRds1%@2 *@ 581 000[

V

Estos 2 archi)os los podemos colocar en el directorio de nuestro pro$ecto, o crear una carpetaespecial para ir almacenando nuestras librer´6as, lo unico que se debe hacer es en Pro!ect7Buildptions7Pro!ect, en la solapa irectories7'nclude earch Path indicar la direcci on dedonde esta ubicada, $ a#re#ar ambos *Y"h $ Y"c0 a nuestro pro$ecto para que realice la compilaci´oncorrespondiente"

":" E!emplo, uso del timer@

":"1" b!eti)oApro)echado la creaci´on de librer´6a para el control del 1%@2 se crear´a un 3elo!7Calendario

)isualiandolo en un LC" Ftiliaremos el timer@ para #enerar una interrupci´on cada 1 se#undopara leer el 1%@2 $ actualiar sus )alores en el LC"

CAP´'FL " L'B3E3´'A

:"2" <ardare

:"%" Con#uraci´on del  imer

Para determinar las funciones $ par´ametros que necesitamos para con#urar el imer selec

nado )amos a C47MCC187doc7periphlib $ abrimos imer"htm´6 debemos !arnos, como )enimos haciendo, en que #rupo de funciones entra nuestro P'C en

´

M

 

W  X

M

 

W  X

Page 46: Tutorial C18 2

7/21/2019 Tutorial C18 2

http://slidepdf.com/reader/full/tutorial-c18-2 46/60

primer tabla del documento, para el P'C1892@ es M3 >2"

Las funciones que disponemos son4

pen  imerH4 Con#ura $ habilita el imer"

Close  imerH4 eshabilita el imer"

Irite  imerH4 Escribe un )alor en el imerH"

3ead  imerH4 3ealia una lectura del imerH"

etmrCCPrc4 Con#ura el imer para ser utiliado por al#´un M´odulo CCP"

emplo4

en  imer@*unsi#ned char con#0

n#uraci´on de 'nterrupci´on4

 'ME3R'(R(   'nterrupcion habilitada

 'ME3R '(R99   'nterrupcion deshabilitada

ecci´on entre modo de 8 o 1: bits4

 @R8B' Modo 8 bits

 @R1 :B' Modo 1: bits

":" EEMPL, F EL 'ME3@ ;1

9uente del Cloc.4

 @RF3CEREH Cl oc . e5terno *'71 pin 0

 @RF3CER'( Cl oc . interno * osc 0

Para Cloc. e5terno, elecci´on de Janco4

 @REDER9ALL 9lanco descendente

 @ REDER3 'E 9lanco ascendente

>alor de Preescaler4

 @ RP R 1R1   141 prescale

 @ RP R 1R2   142 prescale @ RP R 1R&   14& prescale @ RP R 1R8   148 prescale @RP R1 R1:   141:

 prescale @RP R1 R%2   14%2 prescale @RP R1 R:&   14:& prescale @RP R1 R12 8 14128 prescale @RP R1 R2 : 142: prescale

En nuestro caso necesitamos realiar una interrupci´on cada 1 se#undo para el refresco de losdatos en el LC, para ello con#uramos el  imer@ en Modo 1: bits, Cloc. interno, Preescaler141: $ habilitaci´on de la interrupci´on4

Mpenimer@ * 'ME3R'(R( ]  @R1:B'  ]  @RF3CER'( ]  @ RP R1 R1 : 0[

 K para lo#rar una interrupci´on cada 1 se#undo se debe setear el timer en %@%:, calculado paraoscilador de &M<4

Iriteimer@ *%@%:0[

(ota4 e puede )er claramente que el c´odi#o de actualiaci´on de datos en pantalla puede hacersemucho mas eciente, actualiando solo parte se# un sean los datos recibidos, pero solo es une!emplo de forma de uso"

":"&" C´odi#oM

7Y YY Archi)o con denicion de re#istros $ bits del microcontrolador 

ele#ido Y7

N include O p18f2@ "hPN include O dela$s "hP

N include O5lcd "hP

N include O ds1%@2 "hP

N include O stdlib "hP

N include O timers "hP

7Y YY Con#uracion de los 9uses del microcontrolador   YY Y7N pra#ma con# 9C S HRH , 9CME( S99 , 'E S99 , CPF'> S C1RPLL2N pra#ma con# PI3 S1( , B3 S99 , B3> S@ , ICE S99 , IP S%2;:8

M

M

M

M

  W X

  W X

  W X

  W X

  W X

Page 47: Tutorial C18 2

7/21/2019 Tutorial C18 2

http://slidepdf.com/reader/full/tutorial-c18-2 47/60

N pra#ma

 

con#

 

MCL3E S1( , LP1C S99 , PBAE( S99 , CCP2MH S 99N pra#ma

 

con# 

>3E( S99 , L>P S99 , H'( S99 , EBFD S 99N pra#ma con# CP@ S99 , CP1 S99 , CP2 S99 , CPB S99 , CP S 99

CAP´'FL " L'B3E3´'A

a#ma con# I3@ S99 , I31 S99 , I32 S 99

a#ma con# I3B S99 , I3C S99 , I3 S 99a#ma con# EB3@ S99 , EB31 S99 , EB32 S99 , EB3B S 99

#ned char da$ ,mth ,$ear ,do ,hour ,min , sec [   77 )ariabes para ds1%@2atile unsi#ned char .bhitRupdate [ 77 Para determinar cuando ha$ que actualiar "

ela$9or18CK * )oid 0[ela$P3HLC * )oid 0[ela$HLC * )oid  0[comandHLC * unsi#ned char a0[#oto5$HLC * unsi#ned char 5, unsi#ned char $0[printate * unsi#ned char da$ , unsi#ned char mth , unsi#ned char $ear 0[printime * unsi#ned char hour , unsi#ned char min , unsi#ned char sec 0[#etRdate * )oid 0[#etRtime * )oid 0[ela$R2us * )oid 0['3imer@ * )oid 0[

Creamos una nue)a seccion de codi#o a partir de la direccion @ 5@8 "

a#ma code 'nterrupcion S @ H@@@8>ector'nterrupcion * )oid 0U

Rasm #oto

 

'3imer@

 

 Rendasm

a#ma code 77 Cerramos seccion "

3utina de 'nterrupcion "Esta interrupcion se e!ecuta

 cada 1s"a#ma interrupt '3imer@

'3imer@ * )oid 0Uif * '(C(bits " M3@'9 SS10 U

77 Car#amos nue)amente  imer@ para interrupcion cada 1 se# "

Iriteimer@ *%@%:0[.bhitRupdate S1 ['(C(bits " M3@'9 S@[   77 Borramos bandera "

V

YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY

main * )oid  0U

ds1%@2Rinit *0[   77 inicialia ds1%@2 "77 Con#uracion

 del  ime r1penimer@ * 'ME3R'(R( ]  @R1:B'  ]  @RF3CER'( ]  @ RP R1 R1 : 0[penHLC * 9F3RB' ] L'(ERH; 0[  77 'niciamos LC "comandHLC *@ 5@: 0[ 77 (os ase#uramos incremento de direccion , displa$

 A!o

comandHLC *@ 5@C 0[   77 Encendemos LC "putrsHLC * Fsando el ds1%@2 0[#oto5$HLC *1 ,20[putrsHLC *b$ u.$ 0[da$ S;[ mth S8[ $ear S=[ do S18[hour S22[ min S=[

setRdatetime *da$ ,mth ,$ear ,do ,hour , min 0[ela$1@CK5 *1@@0[

":" EEMPL, F EL 'ME3@ ;%

comandHLC *10[ 77 Borramos displa$

.bhitRupdate S@ [77 'niciando el  ime r en %@%: lo#ramos un interrupcion cada 1s con & M< "Iriteimer@ *%@%:0[3C(bits " 'PE( S@[   77 eshabilitamos Prioridades'(C(bits " PE'E S1 [   77 <abilitamos

 interrupcion de perifericos "'(C(bits " D'E S1[   77 <abilitamos interrupcion Dlobal  "

hile *10Uif * .bhitRupdate SS10U

.bhitRupdate S@ [#etRdate *0[   77 Lee dia ,mes ,ak no#etRtime *0[   77 lee hora , minuto , se#undo#oto5$HLC *1 ,10[printate *do ,mth , $ear 0[77 lcd#oto5$HLC *1 ,20[

Page 48: Tutorial C18 2

7/21/2019 Tutorial C18 2

http://slidepdf.com/reader/full/tutorial-c18-2 48/60

printime *hour ,min , sec 0[V

VV

77 YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY)oid ela$9or18CK * )oid 0U

ela$1@CK5 *20[V)oid ela$P3HLC * )oid 0U

ela$1CK5 *10[V)oid ela$HLC * )oid 0U

ela$1CK5 *20[V

77 En)ia

 

comando al LC)oid

 

comandHLC * unsi#ned 

char a0UBus$HLC *0[

IriteCmdHLC *a0[V77 Fbica cursor en *5 S Posicion en linea , $ S n  de linea 0)oid #oto5$HLC * unsi#ned char 5, unsi#ned char $0U

unsi#ned char direccion [

if *$ \S 10direccion S @ 5&@ [

elsedireccion S@ [

direccion ZS 5 1[comandHLC *@ 58@ ^ direccion 0[

V77 emora de 2us para

 

1%@2 ")oid ela$R2us * )oid 0U

(op *0[(op *0[

V77 9uncion que imprime la 9echa en el LC "  oma los )alores in#resados  ,""77 "" los con)ierte a strin# $ los imprime " En el caso que sea menor a 1@ ,""

CAP´'FL " L'B3E3´'A

"" se imprime un @ antes del )alor "

d printate * unsi#ned char do , unsi#ned char mth , unsi#ned char $ear 0U

char

 

trin# +&-[

putrsHLC * 9echa 40[itoa *do , trin# 0[   77 Con)ertimos entero a strin# "if *do O1@0 U pu trsHLC *@ 0[VputsHLC * trin# 0[ putrsHLC *70[itoa *mth , trin# 0[   77 Con)ertimos entero a strin# "if *mth O1@ 0U pu trsHLC *@ 0[VputsHLC * trin# 0[ putrsHLC *70[itoa *$ear , trin# 0[   77 Con)ertimos entero a strin# "if *$ear O1@0 U putrsHLC *@ 0[VputsHLC * trin# 0[

9uncion que imprime la <ora en el LC "  oma los )alores in#resados ,"""" los con)ierte a strin# $ los imprime " En el caso que sea menor a 1@ ,"""" se imprime un @ antes del )alor "

printime * unsi#ned 

char hour , unsi#ned 

char min , unsi#ned 

char sec 0Uchar 

trin# +&-[

putrsHLC * <ora 40[itoa *hour , trin# 0[   77 Con)ertimos entero a strin# "if *hour O1@ 0U putrsHLC *@ 0[VputsHLC * trin# 0[ putrsHLC *40[itoa *min , trin# 0[   77 Con)ertimos entero a strin# "if *min O1@0U putrsHLC *@ 0[VputsHLC * trin# 0[ putrsHLC *40[itoa *sec , trin# 0[   77 Con)ertimos entero a strin# "if *sec O1@0U putrsHLC *@ 0[VputsHLC * trin# 0[

9uncion que realia la lectura del todos los datos de la 9echa "d #etRdate * )oid 0U   77 Lee dia ,mes ,ak no

do S #etRdo *0[

mth S #etRmth *0[$ear S #etR$ear *0[do S #etRdo *0[

9uncion que realia la lectura del todos los datos de la <ora "d #etRtime * )oid 0U   77 lee hora , minuto , se#undo

hour S #etRhr *0[min S #etRmin *0[

  W X

Page 49: Tutorial C18 2

7/21/2019 Tutorial C18 2

http://slidepdf.com/reader/full/tutorial-c18-2 49/60

sec S #etRsec *0[

;" Comunicaci´on '2C

Muchos de los dispositi)os *memorias, 3C, sensores )arios, con)ersor A $ A, ect0 queiamos diariamente en el desarrollo de pro$ectos utilian el bus '2C" Este solo requiere dos

neas de senal *3elo! $ datos0 $ una de referencia *D(0" Permite el intercambio de informaci´ontre muchos dispositi)os a una )elocidad aceptable, de unos 1@@ bits por se#undo, aunque ha$sos especiales en los que el relo! lle#a hasta los 1 M<"crochip nos pro)ee las librer´6as necesarias para poder controlar el m´odulo MP del micro

´

controlador $ de esa manera establecer comunicaci´on utiliando el protocolo '2C" Para saber en

que #rupo de funciones cae nuestro P'C se debe )er la tabla en el documento '2C"htm que seencuentra en 7MCC187doc7periphlib, en nuestro caso el P'C1892@ se encuentra dentro del#rupo '2C >1" abiendo esto, podemos )er los par´ametros de cada una de las funciones queutiliaremos4Mpen'2C * unsi#ned char s$ncRmode , unsi#ned char sle 0[

s$nc mode

LA>E ; 

'2C Modo Escla)o, ;bit de direcci´on

LA>E 1@ '2C Modo Escla)o, 1@bit de direcci´on

MAE3 '2C Modo Maestro

sle

LEI 99 le rate deshabilitado para modo 1@@ .<

LEI ( le rate habilitado para modo &@@ .<

Para con#urar la )elocidad, adem´as debemos car#ar el re#istro PA , que depender´a dela )elocidad del oscilador" Cloc.S9osc7*&"*PA Z 100

";"1" Primer e!emplo, estableciendo comunicaci´on con memoria 2&LC

b!eti)os

Lo#rar comunicarnos con una memoria serial 2&LC12 mediante el protocolo '2C" En este

primer e!emplo )amos a recibir un dato desde PC, lo #uardaremos en la memoria $ lue#o de untiempito realiaremos la lectura de la memoria reen)i´andolo a la PC"

Escritura de b$te

Lue#o de la condici on de inicio del Master, el c´odi#o de control *cuatro bits0, los bits deselecci on de chip *tres bits0 $ el bit de 3 7 I *que es un ?@?0 son re#istrados en el bus por eltransmisor" Esto indica al escla)o direccionado que el b$te de direcci´on superior se#uir´a despu´esde que se ha$a #enerado un bit de reconocimiento durante el no)eno ciclo de relo!" Por lo tanto, elpr´o5imo b$te transmitido por el Master es el b$te alto de la direcci´on de la palabra" El pr´o5imoes el b$te de direcci on menos si#nicati)o" espu´es de recibir otra senal de reconocimiento del2&HH12, el Master transmitir´a el dato a ser escrito en la ubicaci on de memoria direccionada"El 2&HH12 reconoce otra )e $ el Master #enera un condici on de alto" Esto inicia el ciclo deescritura interno $ durante esta )e, el 2&HH12 no #enerar´a senales de reconocimiento *9i#ura0"espu´es de un b$te de comando de escritura, el contador de direcci on interno apuntar´a a laubicaci´on de direcci´on si#uiente"

CAP´'FL " L'B3E3´'A

G

  ";" CMF('CAC'( '2C ;

  W X

G

G

Page 50: Tutorial C18 2

7/21/2019 Tutorial C18 2

http://slidepdf.com/reader/full/tutorial-c18-2 50/60

raci´on de lectura

as operaciones de lectura son iniciadas del mismo modo como las operaciones de escritura,la e5cepci on de que la parte de 3 7 I del b$te de control es puesta a ?1?" <a$ tres tiposicos de las operaciones de lectura4 la lectura de direcci´on en curso, lectura aleatoria $ lectura

uencial"

tura aleatoria

as operaciones de lectura aleatorias permiten que el Master acceda a cualquier ubicaci on

a memoria en una manera aleatoria" Para lle)ar a cabo este tipo de operaci´on de lectura, lacci on del dato a leer debe ser en)iada primero" Esto se hace en)iando la direcci on del datoo una operaci on de escritura *37 I a ?@?0" En cuanto la direcci on del dato es en)iada, elter #enera una de condici´on de inicio se#uida al reconocimiento" El Master en)´6a el b$te derol otra )e, pero con el bit de 3 7 I en 1"

´

";"2" <ardare

";"%" C´odi#oM

7Y YY Archi)o con denicion de re#istros $ bits del microcontrolador ele#ido Y7N include O p18f2@ "hP

N include O dela$s "hP

N include Ousart "hP

N include Oi2c "hP

7Y YY Con#uracion de los 9uses del microcontrolador   YY Y7N pra#ma con# 9C S HRH , 9CME( S99 , 'E S99 , CPF'> S C1RPLL2N pra#ma con# PI3 S1( , B3 S99 , B3> S@ , ICE S99 , IP S%2;:8N pra#ma con#

 MCL3E S1( , LP1C S99 , PBAE( S99 , CCP2MH S 99N pra#ma con# >3E( S99 , L>P S99 , H'( S99 , EBFD S 99N pra#ma con# CP@ S99 , CP1 S99 , CP2 S99 , CPB S99 , CP S 99N pra#ma con# I3@ S99 , I31 S99 , I32 S 99N pra#ma con# I3B S99 , I3C S99 , I3 S 99N pra#ma

 

con#

 

EB3@ S99 , EB31 S99 , EB32 S99 , EB3B S 99

77 YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY)olatile

 char ata , bhit [

)oid '33ecepcion * )oid 0[)oid B$teIrite'2C * unsi#ned char B$teControl , unsi#ned char <i#hireccion ,unsi#ned char Loireccion , unsi#ned char ata'2C 0[

";" CMF('CAC'( '2C  ;;

Page 51: Tutorial C18 2

7/21/2019 Tutorial C18 2

http://slidepdf.com/reader/full/tutorial-c18-2 51/60

unsi#ned

 

char B$te3ead'2C * unsi#ned

 

char B$teControl , unsi#ned

 

char

 

<i#hireccion ,unsi#ned

 

char 

Loireccion 0[77 Creamos una nue)a seccion de codi#o a partir de la direccion @ 5@8 "N pra#ma code 'nterrupcion S @ H@@@8)oid >ector'nterrupcion * )oid 0U

 Rasm #oto '33ecepcion  RendasmVN pra#ma code 77 Cerramos seccion "

77 3utina de 'nterrupcion "N pra#ma interrupt '33ecepcion)oid '33ecepcion * )oid 0U

if * P'31bits " 3C'9 SS10U

CAP´'FL " L'B3E3´'A

ata S #etcFA3 *0[   77 Leemos ato recibido

bhit S1 [   77 'ndicamos que se ha recibido un dato "P'31bits " 3C'9 S@[   77 Borramos bandera "

V

main * )oid  0U

penFA3 * FA3RHR '( R 199 ] FA3R3HR '(R( ] FA3RAK(C< R M1CE ]

FA3 RE'D< R B'  ] FA3RC(R3H ] FA3RB3D<R<'D< ,20[ 77 =:@@ ,8 ,n ,1pen'2C * MAE3 , LEIR99 0[   77 Master , 1@@ <PA S =[ 77 1@@ < para & M<

bhit S@ [3C(bits " 'PE( S@[   77 eshabilitamos

 

Prioridades'(C(bits " PE'E S1 [   77 <abilitamos

 interrupcion de perifericos "'(C(bits " D'E S1[   77 <abilitamos

 interrupcion Dlobal  "

putrsFA3 * Prueba Comunicacion '2C con memoria 2& LC12 rr0[hile *10U

hile * bhit SS@0UV[ 77 esperamos a recibir dato "bhit S@ [B$teIrite'2C *@ 5A@ ,@ 5@@ ,@ 5@@ , ata 0[ela$1CK5 *0[putrsFA3 * Lectura de Eeprom 4 r0[putcFA3 * B$te3ead'2C *@ 5A@ ,@ 5@@ ,@ 5@@ 00[putrsFA3 *r0[

V

YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYB$teIrite'2C * unsi#ned 

char B$teControl , unsi#ned 

char 

<i#hireccion ,unsi#ned char Loireccion , unsi#ned char ata'2C 0U

'dle'2C *0[ 77 El modulo esta acti)o tart'2C *0[ 77 Condicion de A3hile * PC(2bits " E( 0[Irite'2C * B$teControl 0[ 77 En)ia B$te de controlIrite'2C * <i#hireccion 0[Irite'2C * Loireccion 0[Irite'2C * ata'2C 0[ 77 Duarda ata en Eeprom en la direccion establecida "top'2C *0[ 77 Condicion de Phile * PC(2bits " PE( 0[hile * EEAc.Pollin# * B$teControl 00[ 77 Espera que se complete escritura "

#ned 

char 

B$te3ead'2C * unsi#ned 

char 

B$teControl , unsi#ned 

char 

<i#hireccion ,unsi#ned 

char 

Loireccion 0U

unsi#ned char >alor [

'dle'2C *0[ 77 El modulo esta acti)o tart'2C *0[ 77 Condicion de A3hile * PC(2bits " E( 0[Irite'2C * B$teControl 0[Irite'2C * <i#hireccion 0[Irite'2C * Loireccion 0[3estart'2C *0[ 77 En)ia 3etart

´

hile * PC(2bits " 3E( 0[

77 Cambia bit@ de B$teControl a 1 para realiar lectura "Irite'2C * B$teControl ^ @ 5@1 0[>alor S 3ead'2C *0[ 77 3ealia lectura "(otAc.'2C *0[ 77 En)ia (AC hile * PC(2bits " ACE( 0[top'2C *0[ 77 Condicion de P

";" CMF('CAC'( '2C  ;=

 

W  X

Page 52: Tutorial C18 2

7/21/2019 Tutorial C18 2

http://slidepdf.com/reader/full/tutorial-c18-2 52/60

hile * PC(2bits " PE( 0[return * >alor 0[ 77 3etorna

 

LecturaV

 raba!ando con proteus podemos realiar una prueba del c odi#o, por e!emplo, escribiendo $le$endo la letra ) en la direcci´on @5@@@@"

";"&" e#undo e!emplo de comunicaci´on con memoria 2&LC12 mediante '2C

En este caso )amos a recibir desde la PC un strin#, que #uardaremos en la memoria $ lue#o

leeremos para reen)iar a la PC" Ftiliaremos escritura secuencial $ lectura secuencial4

Proceso de escritura

En este caso )amos a en)iar un buger directamente a la memoria, para ello en)iaremos la

direcci on del primer B$te a en)iar como se ha realiado en el caso anterior, $ lue#o el bugercompleto apro)echando que al realiar una escritura, el contador de direcci´on interno apuntar´a ala ubicaci on de direcci on si#uiente" La cantidad m´a5ima de datos que podemos en)iar de esta

manera depender´a de la memoria utiliada, en nuestro caso la 2&LC12 tiene p´a#inas de 128b$tes"

Lectura secuencial

Las lecturas secu´enciales son iniciadas del mismo modo como una lectura aleatoria e5cepto quedespu´es de que la 2&LC12 transmite el primer b$te de datos, el Master en)´6a un reconocimiento"

CAP´'FL " L'B3E3´'A

e ac. ordena a la memoria transmitir la pr´o5ima palabra de 8 bits secuencialmente direcciona*9i#ura0" Cuando se recibe el ultimo dato, el Master no #enerar´a un ac., pero #enerar´a unadici on de alto" Para pro)eer las lecturas secu´enciales, la memoria contiene un puntero de

ecci´on interno que es incrementado en uno en la terminaci´on de cada operaci´on"

;"" C´odi#o

YY Archi)o con denicion de re#istros $ bits del microcontrolador ele#ido Y7nclude O p18f2@ "hP

nclude O dela$s "hP

nclude Ousart "hP

nclude Oi2c "hP

YY Con#uracion de los 9uses del microcontrolador   YY Y7ra#ma con# 9C S HRH , 9CME( S99 , 'E S99 , CPF'> S C1RPLL2ra#ma con# PI3 S1( , B3 S99 , B3> S@ , ICE S99 , IP S%2;:8ra#ma con# MCL3E S1( , LP1C S99 , PBAE( S99 , CCP2MH S 99ra#ma con# >3E( S99 , L>P S99 , H'( S99 , EBFD S 99

´

Page 53: Tutorial C18 2

7/21/2019 Tutorial C18 2

http://slidepdf.com/reader/full/tutorial-c18-2 53/60

ra#ma

 

con# CP@ S99 , CP1 S99 , CP2 S99 , CPB S99 , CP S 99ra#ma

 

con# 

I3@ S99 , I31 S99 , I32 S 99ra#ma con# I3B S99 , I3C S99 , I3 S 99ra#ma con# EB3@ S99 , EB31 S99 , EB32 S99 , EB3B S 99

YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYlatile

 unsi#ned char bhit [latile

 unsi#ned char BugerE +1=-[i#ned char BugerL +1=-[

d '33ecepcion * )oid 0[d BugerIrite'2C * unsi#ned char B$teControl , unsi#ned char <i#hireccion ,

unsi#ned char Loireccion , unsi#ned char Y ata'2C 0[d Buger3ead'2C  * unsi#ned char B$teControl , unsi#ned char <i#hireccion ,

unsi#ned char Loireccion , unsi#ned char Y >alor , unsi#ned char Len#h 0[

Creamos una nue)a

 

seccion de codi#o a partir de la direccion @ 5@8 "ra#ma

 

code 

'nterrupcion S @ H@@@8d >ector'nterrupcion * )oid 0U Rasm #oto '33ecepcion  Rendasm

ra#ma code 77 Cerramos seccion "

3utina de 'nterrupcion "ra#ma interrupt '33ecepciond '33ecepcion * )oid 0U

´

if * P'31bits " 3C'9 SS10U#etsFA3 * BugerE ,1=0[ 77 recibimos 1= caracteres  "bhit S1[ 77 'ndicamos que se ha recibido un dato "P'31bits " 3C'9 S@[   77 Borramos bandera "

VV

)oid main * )oid 0Uunsi#ned char i[

penFA3 * FA3RHR '( R 199 ] FA3R3HR'(R( ] FA3RAK(C< R M1CE ]

FA3RE'D< R B' ] FA3RC(R3H ] FA3RB3D<R<'D< ,20[ 77 =:@@ ,8 ,n ,1pen'2C * MAE3 , LEIR99 0[   77 MasterPA S =[ 77 1@@ < para & M<

bhit S@ [3C(bits " 'PE( S@[ 77 eshabilitamos 

Prioridades'(C(bits " PE'E S1[ 77 <abilitamos

 

interrupcion de perifericos "'(C(bits " D'E S1[ 77 <abilitamos

 interrupcion Dlobal  "

putrsFA3 * Prueba Comunicacion '2 C con memoria 2& LC12 rr0[hile *10Uhile * bhit SS@0UV[ 77 esperamos a recibir dato "

bhit S@ [77 e #uarda en memoria los datos recibidos "Bug erIrite'2C *@ 5A@ ,@ 5@@ ,@ 5@@ ,] BugerE +@-0[ela$1CK5 *0[77 Leemos de la memoria los datos #uardados "Buger3ead'2C *@ 5A@ ,@ 5@@ ,@ 5@@ ,] BugerL +@- ,1=0[putrsFA3 * Lectura de Eeprom 4 r0[putsFA3 * BugerL 0[ putrsFA3 *r0[

VV77 YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY)oid BugerIr ite'2C * unsi#ned char B$teControl , unsi#ned char <i#hireccion ,

unsi#ned char Loireccion , unsi#ned char Y Bugerata 0U

'dle'2C *0[ 77 El modulo esta acti)o tart'2C *0[ 77 Condicion de A3hile * PC(2bits " E( 0[Irite'2C * B$teControl 0[ 77 En)ia B$te de controlIrite'2C * <i#hireccion 0[Irite'2C * Loireccion 0[puts'2C * Bugerata 0[ 77 En)iamos

 

buger a memoria "top'2C *0[ 77 Condicion de Phile * PC(2bits " PE( 0[hile * EEAc.Pollin# * B$teControl 00[ 77 Espera que se complete escritura "

V

)oid 

Buger3ead'2C * unsi#ned 

char B$teControl , unsi#ned 

char 

<i#hireccion ,unsi#ned char Loireccion , unsi#ned char Y >alor , unsi#ned char Len#h 0U

'dle'2C *0[ 77 El modulo esta acti)o tart'2C *0[ 77 Condicion de A3hile * PC(2bits " E( 0[Irite'2C * B$teControl 0[

  ";" CMF('CAC'( '2C 81

Page 54: Tutorial C18 2

7/21/2019 Tutorial C18 2

http://slidepdf.com/reader/full/tutorial-c18-2 54/60

CAP´'FL " L'B3E3´'A

Irite'2C * <i#hireccion 0[

Irite'2C * Loireccion 0[3estart'2C *0[ 77 En)ia 3etarthile * PC(2bits " 3E( 0[77 Cambia bit@ de B$teControl a 1 para realiar lectura "Irite'2C * B$teControl ^ @ 5@1 0[#ets'2C * >alor , Len#h 0[ 77 3ealia

 

lectura de cantidad S Len#h atos "(otAc.'2C *0[ 77 En)ia (AC hile * PC(2bits " ACE( 0[top'2C *0[ 77 Condicion de P

hile * PC(2bits " PE( 0[

E!emplo de #rabaci´on4

Cap´6tulo :

'ntroducci´on a estructuras,uniones $ punteros

En este capitulo se pretende dar una pequena introducci´on al uso de estructuras, uniones $punteros sin profundiar mucho en los conceptos" e dan a conocer para tener una idea b´asica desu implementaci´on $ para despertar curiosidad de su utiliaci´on, $a que son herramientas utilesen el desarrollo de pro#ramas de ma$or comple!idad"

:"1" Estructuras

Fna Estructura es una colecci´on de )ariables, que pueden contener diferentes tipos de datos"A$udan a or#aniar $ mane!ar datos debido a que a#rupan diferentes tipos de datos a las que seles trata como una sola unidad en lu#ar de ser )istas como unidades separadas" Por e!emplo enla realiaci´on de con relo! necesitamos denir las si#uientes )ariables4

Munsi#ned char <ora , Minutos , e#undos , Actualiar , Alarma1 , Alarma2 , Alarma% [

 odas ellas son tratadas indi)idualmente, pero podemos a#ruparlas en una estructura de las

si#uiente forma4

Mstruct U

unsi#ned char <ora [unsi#ned char Minutos [unsi#ned char e#undos [unsi#ned Actualiar 41[unsi#ned Alarma1 41[unsi#ned Alarma2 41[unsi#ned

 Alarma% 41[

V 3elo! [

8%

  W X

  W X

  W X

G

´

Page 55: Tutorial C18 2

7/21/2019 Tutorial C18 2

http://slidepdf.com/reader/full/tutorial-c18-2 55/60

Actualiar, Alarma1, Alarma2 $ Alarma% son banderas boolenas que utiliamos para deternar si ha ocurrido un e)ento $ por lo tanto solo necesitan 1bit" Esto se lo indicamos colocandose#uido de la denici´on"ora para acceder a cada miembro de la estructura utiliamos el operador punto por e!emplola si#uiente manera4

lo! " Minutos S1[ 3elo! " Actualiar SS10U

2" Fniones

Las uniones son similares a las estructuras, con la diferencia de que en las uniones se almacenancampos solap´andose unos con otros en la misma disposici´on" e implementa para llamar de dos

mas distintas a un mismo sector de memoria" Fn e!emplo sencillo es la si#uiente declaraci´on4

on Uunsi#ned int >alor [struct U

unsi#ned LB 48[unsi#ned MB 48[

V[>ariable [

amos reser)ando 1:bits en 3AM para almacenar una )ariable del tipo int *>alor0 pero quedemos acceder a sus b$tes *Alto $ ba!o0 de forma independiente" Para acceder a sus miembrosmbi´en se utilia el operador punto"

riable " LB S@ 5@@ [riable " MB S@ 51B [

:"%"  KPEE9 8

Al leer >ariable">alor obtenemos @51B@@"

:"%" $pedef 

Al#o tambi´en interesante del len#ua!e de pro#ramaci´on C es la re denici´on de tipos de datospara crear nombres m as cortos o si#nicati)os del tipo de datos" <a$ que recalcar que no creanin#´un nue)o tipo, solo dene un nue)o identicador para un tipo que $a tiene su propio identicador"

8&  CAP´'FL :" '(3FCC'( A E3FCF3A, F('(E  K 

W  X

 

W  X

 

W  X

 

W  X

M

Page 56: Tutorial C18 2

7/21/2019 Tutorial C18 2

http://slidepdf.com/reader/full/tutorial-c18-2 56/60

E!emplos4

Mt$pedef  unsi#ned char F'(8 [t$pedef  si#ned char '(8 [t$pedef  unsi#ned int CF(E3[t$pedef  unsi#ned char E333 [

 ambi en es posible utiliar t$pedef  al mismo tiempo que se declara una estructura o unauni´on" E!emplo4

t$pedef  union

UF'(1: >al [

structUF'(8 LB[F'(8 <B[

V[structU

F'(8 b@ 41[F'(8 b1 41[F'(8 b2 41[F'(8 b% 41[F'(8 b& 41[F'(8 b 41[F'(8 b: 41[F'(8 b; 41[F'(8 b8 41[

F'(8 b= 41[F'(8 b1@ 41[F'(8 b11 41[

´

F'(8 b12 41[

F'(8 b1% 41[F'(8 b1& 41[F'(8 b1 41[

V[F'(1:R>AL [

Lo anterior corresponde a la denici on de una uni on an´onima que puede ser utiliada paraar )arias )ariables que implementen tal estructura"

1:R>AL .,  !,  est [1:R>AL Buger1:Bits +-[

das las )ariables creadas se corresponden con la estructura denida4

:"&" PF(E3 8;

:"&" Punteros

Fn apuntador o puntero es una )ariable de 1:bits o 2&bits *>ariables en rom 9A30 quecontiene una direcci´on" As´6 si ata en un char $ ptr es un puntero que apunta a ´el tendremoslo si#uiente4

enici´on

  8: CAP´'FL :" '(3FCC'( A E3FCF3A, F('(E  K 

W X

  W X

 

W  X

Page 57: Tutorial C18 2

7/21/2019 Tutorial C18 2

http://slidepdf.com/reader/full/tutorial-c18-2 57/60

M77 eclaracion de una )ariable

 puntero a una )ariable char "char Y ptr [77 eclaracion de una )ariable puntero a una )ariable int "int Y ptr [77 eclaracion de una )ariable

 puntero a una )ariable unsi#ned char "unsi#ned char Y ptr [

peradores unitarios

]4 perador de direcci´on4 a la direcci on de una )ariable, por lo que la e5presi onptrS]ata asi#na la direcci´on de ata a ptr, dici´endose entonces que ptr apunta a ata"

Y4 perador de indirecci´on4 a acceso a la )ariable que apunta el apuntador" Pore!emplo la e5presi´on YptrS@5AA asi#na a la )ariable que apunta prt el )alor @5AA, o seaataS@5AA"

Por e!emplo4eclaramos tres )ariables, una ubicada en 3AM, otra en 3M pero ubicada en los primeros

bancos *near0, $ una tercera en 3M pero sin restricci´on de banco*far0"  ambi en creamos lospunteros para direccionarlas $ en el bucle principal hacemos ese paso"

´

mo pueden )er en el e!emplo, como una )ariable far puede estar ubicada en cualquier banco

lu$endo aquellos sobre la direcci on :&. se le asi#na 2&bits para contener la direcci on de lariable"

as e!emplos4

A lo que apunta ptr se le suma 1@ $ se le asi#na a ata1 "ta1 S Y ptr Z 1@[

e incrementa en 1 lo que apunta ptr "ptr 0ZZ[

e incrementa el puntero a la si#uiente 

direccion de )ariable* ependera de que tipo de )ariable se apunta 0

tr ZZ[

e incrementa en 1 lo que apunta ptr "Y ptr [

se asi#na al se#undo puntero lo que apunta ptr "1 sea los 2 punteros apuntan a la misma )ariable "

r2 S ptr [

88  CAP´'FL :" '(3FCC'( A E3FCF3A, F('(E  K 

W  X

 

W  X

Page 58: Tutorial C18 2

7/21/2019 Tutorial C18 2

http://slidepdf.com/reader/full/tutorial-c18-2 58/60

Podemos acceder a los b$tes de una )ariable de ma$or de 8bits utiliado punteros $ elerando cast4

si#ned int >ariable [si#ned char LB , MB[B SY** unsi#ned char Y0] >ariable 0[B SY** unsi#ned char Y0] >ariable Z10[

:"&" PF(E3 8=

Con *unsi#ned char Y0 hacemos que la direcci´on obtenida de ]>ariable sea tomada como a una

)ariable del tipo char, lue#o con Y**""0]>ariable0 transferimos el b$te apuntado a la )ariableLB"

Punteros $ arre#los

Mi declaramos un arre#lo como4

char atos +1@-[

eclaramos un ptr4

char Y ptr [

Podemos asi#nar al puntero la primer posici´on del arre#lo4

ptr S] atos +@-[

 K podemos car#ar a atos+@- $ atos+- de la si#uiente manera4

Y ptr S@ 5AA [

Y* ptr Z0S@ 5&8 [

Car#ar un buger dentro de otro4

unsi#ned int Yptr ,Y ptr2 [

unsi#ned int atos@1 +2@- , atos@2 +-SU@ 599AA ,@ 5CC& ,@ 5;8= ,@ 5%:8 ,@ 5CC21 V[

ptr S] atos@1 +8-[ 77 >amos a car#ar en el arre#lo 1 a partir de la posici Lon 8" for * ptr2 S atos@2 [ptr2 O atos@2 Z[ ptr2 ZZ , ptr ZZ0UY ptr SY ptr2 [

V

Punteros $ funciones

En C los ar#umentos de las funciones se pasan por )alor, as´6 que no deber´6a de ser posible en

una funci´on modicar )ariables de la funci´on que la llama" i#o deber´6a porque pruebas hechas enC18 si lo permite Drin pero )amos a tratar C con)encional para que sir)a para otras compiladores"

Fsemos el e!emplo con)encional para mostrar esto, por e!emplo si queremos reor#aniar )ariables4

M9orma incorrecta4

)oid 

funcion * )oid 0Uchar a,b[a S1@[b S1[sap *a,b0[

V)oid sap * char q, char p0U

´

char temp [

temp Sq[

qSp[pS temp [

mo )emos estamos modicando )ariables de la funci on que llama a sap" La forma correctahacerlo por pasa!e de referencia, o sea le entre#amos a la funci on sap la direcci on de las

riables4

 

W  X

M

 

W  X

M

 

W  X

M

 

W  X

M

 

W

 X

M

M

  =@ CAP´'FL :" '(3FCC'( A E3FCF3A, F('(E  K 

W X

  W X

  W X

Page 59: Tutorial C18 2

7/21/2019 Tutorial C18 2

http://slidepdf.com/reader/full/tutorial-c18-2 59/60

funcion * )oid 0U

char a,b[a S1@[b S1[sap *]a ,]b0[

d sap * char Yq, char Yp0Uchar temp [temp SYq[YqSYp[YpS temp [

mbi en el uso de punteros en ar#umentos de funciones nos es sumamente util para que una

ci´on pueda retornar m´as de una )ariable entre#ando por referencia un arre#lo"

Por e!emplo en un arre#lo colocamos el nombre de un archi)o m´as su e5tensi´on, $ queremosa funci´on que separe en dos arre#los distintos el nombre $ la e5tensi´on4

d funcion * )oid 0U

char (ombreMasE5t +1% -S   utorial  " pdf  [char (ombre +=- , E5t +&-[

separamos *] (ombreMasE5t +@- ,] (ombre +@- ,] E5t +@-0[

d separamos * char Yptr , char Ynptr , char Y eptr 0U

doUY nptr ZZSY ptr ZZ[

V hile *Y ptr \S L"L0[ 77 <asta que se direccione el

 

L"L77 iempre que se traba!e con strin# se debe

 

indicar 

Analiacion 

con 

@LY nptr SL@ L[Y ptr ZZ[   77 Pasamos a direccionar la si#uiente letra , despues de L"LdoU

Y eptr ZZSY ptr ZZ[V hile *Y ptr \S L@ L0[Y eptr SL@ L[

(ota4 Cuando se traba!a con strin# se debe tener en cuenta una posici´on que indica nal delin# @"

´

Page 60: Tutorial C18 2

7/21/2019 Tutorial C18 2

http://slidepdf.com/reader/full/tutorial-c18-2 60/60