Post on 08-Mar-2016
description
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
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
7/21/2019 Tutorial C18 2
http://slidepdf.com/reader/full/tutorial-c18-2 3/60
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'(´
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'(
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'(
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"
´
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
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%
´
´
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
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
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
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
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
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
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
´
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
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
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
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
´
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[
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
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
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
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
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:: ,
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
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
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
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[
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 $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
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
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"
´
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 [
´
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
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
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"
´
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
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
d
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
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
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
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
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
7/21/2019 Tutorial C18 2
http://slidepdf.com/reader/full/tutorial-c18-2 43/60
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
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
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
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[
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 "
d
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
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
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 ;;
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
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
´
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
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
´
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
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
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
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
7/21/2019 Tutorial C18 2
http://slidepdf.com/reader/full/tutorial-c18-2 59/60
d
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# @"
´
7/21/2019 Tutorial C18 2
http://slidepdf.com/reader/full/tutorial-c18-2 60/60