You are on page 1of 37

11/10/2015 ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacinenCconejemplos

Products Solutions Store Distributors Libstock ContactUs searchhere

Login|Cart(0)

ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacin FeaturedDevelopmentTools

enCconejemplos EasyPICv7DevelopmentSystem

TOC Capitulo1 Capitulo2 Capitulo3 Capitulo4 ApndiceA

Capitulo2Programacindelosmicrocontroladores

Ustedseguramentesabequenoessuficientesloconectarelmicrocontroladoralosotroscomponentesyencenderunafuentede
alimentacinparahacerlofuncionar,verdad?Hayquehaceralgoms.Senecesitaprogramarelmicrocontrolador.Sicreequeestoes
complicado,estequivocado.Todoelprocedimientoesmuysimple.Bastaconleereltextoparaentenderdeloqueestamoshablando.

2.1LENGUAJESDEPROGRAMACIN
2.2CARACTERSTICASPRINCIPALESDELMIKROC EasyPICv7istopsellingPIC
2.3TIPOSDEDATOSENMIKROC DevelopmentBoardfor250Microchip
2.4VARIABLESYCONSTANTES PICMCUsinDIPpackaging.Itfeatures
USB2.0programmer/debuggerandover
2.5OPERADORES
17essentialmodulesnecessaryin
2.6ESTRUCTURASDECONTROL development.Boardcomeswith
2.7TIPOSDEDATOSAVANZADOS PIC18F45K22.[moreinfo]
2.8FUNCIONES
2.9CARACTERSTICASPRINCIPALESDELPREPROCESADOR FeaturedCompilers
2.10MIKROCPROFORPIC
mikroCPROforPIC
2.11PROGRAMARLOSPICUTILIZANDOMIKROCPROFORPIC

2.1LENGUAJESDEPROGRAMACIN

ElmicrocontroladorejecutaelprogramacargadoenlamemoriaFlash.
Estosedenominaelcdigoejecutableyestcompuestoporunaserie
decerosyunos,aparentementesinsignificado.Dependiendodela
arquitecturadelmicrocontrolador,elcdigobinarioestcompuestopor
palabrasde12,14o16bitsdeanchura.Cadapalabraseinterpretapor
laCPUcomounainstruccinaserejecutadaduranteelfuncionamiento
delmicrocontrolador.Todaslasinstruccionesqueelmicrocontrolador PopularPICmicocontrollersareloved
puedereconoceryejecutarselesdenominancolectivamenteConjunto byhobbyistsand8bitgeeks.mikroC
deinstrucciones.Comoesmsfciltrabajarconelsistemade helpsyoubringyourideastolifeeasyas
numeracinhexadecimal,elcdigoejecutableserepresentacon neverbefore.[moreinfo]
frecuenciacomounaseriedelosnmeroshexadecimalesdenominada
cdigoHex.EnlosmicrocontroladoresPICconlaspalabrasde
programade14bitsdeanchura,elconjuntodeinstruccionestiene35
instruccionesdiferentes.

LENGUAJEENSAMBLADOR

Comoelprocesodeescribiruncdigoejecutableera
considerablementearduo,enconsecuenciafue
creadoelprimerlenguajedeprogramacin
denominadoensamblador(ASM).Siguiendola
sintaxisbsicadelensamblador,eramsfcil
escribirycomprenderelcdigo.Lasinstruccionesen
ensambladorconsistenenlasabreviaturascon
significadoyacadainstruccincorrespondeuna
localidaddememoria.Unprogramadenominado
ensambladorcompila(traduce)lasinstruccionesdel
lenguajeensambladoracdigomquina(cdigo
binario).

HEsteprogramacompilainstruccinainstruccinsinoptimizacin.Comopermitecontrolarendetalletodoslosprocesospuestosen
marchadentrodelchip,estelenguajedeprogramacintodavasiguesiendopopular.

Ventajasdelenguajesdeprogramacindealtonivel

Apesardetodoslosladosbuenos,ellenguajeensambladortienealgunasdesventajas:

Inclusounasolaoperacinenelprogramaescritoenensambladorconsisteenmuchasinstrucciones,hacindolomuy
largoydifcildemanejar.
Cadatipodemicrocontroladortienesupropioconjuntodeinstruccionesqueunprogramadortienequeconocerpara
escribirunprograma
Unprogramadortienequeconocerelhardwaredelmicrocontroladorparaescribirunprograma
ProgramaescritoenC(Elmismoprogramacompiladoalcdigoensamblador):

http://www.mikroe.com/chapters/view/80/capitulo2programaciondelosmicrocontroladores/ 1/37
11/10/2015 ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacinenCconejemplos

Loslenguajesdeprogramacindealtonivel(Basic,Pascal,Cetc.)fueroncreadosconelpropsitodesuperarlasdesventajasdel
ensamblador.Enlenguajesdeprogramacindealtonivelvariasinstruccionesenensambladorsesustituyenporunasentencia.El
programadoryanotienequeconocerelconjuntodeinstruccionesocaractersticasdelhardwaredelmicrocontroladorutilizado.Yanoes
posibleconocerexactamentecmoseejecutacadasentencia,detodasformasyanoimporta.Aunquesiempresepuedeinsertarenel
programaunasecuenciaescritaenensamblador.

SialgunavezhaescritounprogramaparaunmicrocontroladorPICenlenguajeensamblador,probablementesepaquelaarquitectura
RISCcarecedealgunasinstrucciones.Porejemplo,nohayinstruccinapropiadaparamultiplicardosnmeros.Porsupuesto,paracada
problemahayunasolucinystenoesunaexcepcingraciasalaaritmticaquepermiterealizarlasoperacionescomplejasal
descomponerlasenungrannmerooperacionesmssimples.Enestecaso,lamultiplicacinsepuedesustituirconfacilidadporadicin
sucesiva(axb=a+a+a+...+a).Yaestamosenelcomienzodeunahistoriamuylarga...Nohayquepreocuparsealutilizarunode
estoslenguajesdeprogramacindealtonivelcomoesC,porqueelcompiladorencontrarautomticamentelasolucinasteproblemay
otrossimilares.Paramultiplicarlosnmerosayb,bastaconescribira*b.

LenguajeC

EllenguajeCdisponedetodaslasventajasdeunlenguajedeprogramacindealtonivel(anteriormentedescritas)ylepermiterealizar
algunasoperacionestantosobrelosbytescomosobrelosbits(operacioneslgicas,desplazamientoetc.).LascaractersticasdeCpueden
sermuytilesalprogramarlosmicrocontroladores.Adems,Cestestandarizado(elestndarANSI),esmuyportable,asqueelmismo
cdigosepuedeutilizarmuchasvecesendiferentesproyectos.Loquelohaceaccesibleparacualquieraqueconozcaestelenguajesin
repararenelpropsitodeusodelmicrocontrolador.Cesunlenguajecompilado,loquesignificaquelosarchivosfuentesquecontienenel
cdigoCsetraducenalenguajemquinaporelcompilador.TodasestascaractersticashicieronalCunodeloslenguajesde
programacinmspopulares.

Lafiguraanterioresunejemplogeneraldeloquesucededurantelacompilacindeprogramadeunlenguajedeprogramacindealto
nivelabajonivel.

http://www.mikroe.com/chapters/view/80/capitulo2programaciondelosmicrocontroladores/ 2/37
11/10/2015 ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacinenCconejemplos

2.2CARACTERSTICASPRINCIPALESDELMIKROC

AcontinuacinvamosapresentaraloselementosprincipalesdellenguajemikroCdesarrolladoporMikroelektronika.Estelenguajees
muysimilaralCestndar,noobstanteendeterminadosaspectosdifieredelANSIestndarenalgunascaractersticas.Algunasdeestas
diferenciasserefierenalasmejoras,destinadasafacilitarlaprogramacindelosmicrocontroladoresPIC,mientrasquelasdemssonla
consecuenciadelalimitacindelaarquitecturadelhardwaredelosPIC.Aquvamosapresentarcaractersticasespecficasdellenguaje
mikroCenlaprogramacindelosmicrocontroladoresPIC.EltrminoCseutilizarparareferirsealascaractersticascomunesdelos
lenguajesCymikroC.

EstelibrodescribeunaaplicacinmuyconcretadellenguajedeprogramacinCutilizadoenelcompiladormikroCPROforPIC.Eneste
caso,elcompiladorseutilizaparalaprogramacindelosmicrocontroladoresPIC.

FASESDECOMPILACIN

Elprocesodecompilacinconsisteenvariospasosyseejecutaautomticamenteporelcompilador.Porcon,unconocimientobsicodel
funcionamientopuedesertilparaentenderelconceptodellenguajemikroC.

ElarchivofuentecontieneelcdigoenmikroCqueustedescribeparaprogramarelmicrocontrolador.Elpreprocesadorseutiliza
automticamenteporelcompiladoraliniciarseelprocesodelacompilacin.Elcompiladorbuscalasdirectivasdelpreprocesador(que
siempreempiezanpor#)dentrodelcdigoymodificaelcdigofuentedeacuerdoconlasdirectivas.Enestafasesellevanacabo
inclusindearchivos,definicindeconstantesymacrosetc,loquefacilitaelproceso.Mstardevamosadescribirestasdirectivasen
detalle.Elanalizadorsintctico(parser)eliminatodalainformacinintildelcdigo(comentarios,espaciosenblanco).Luego,el
compiladortraduceelcdigoaunarchivobinariodenominadoarchivo.mcl.Elenlazador(linker)recuperatodalainformacinrequerida
paraejecutarelprogramadelosarchivosexternosylaagrupaenunsoloarchivo(.dbg).Adems,unproyectopuedecontenermsdeun
archivofuenteyelprogramadorpuedeutilizarfuncionespredefinidasyagrupadasdentrodelosarchivosdenominadoslibreras.Por
ltimo,elgenerador.hexproduceunarchivo.hex.Eselarchivoquesevaacargarenelmicrocontrolador.

Elprocesoenterodelacompilacinqueincluyetodoslospasosanteriormentedescritosseledenominabuilding.

ESTRUCTURADEPROGRAMA

LaideaprincipaldeescribirunprogramaenCesderomperunproblemamayorenvariostrozosmspequeos.Supongamosquees
necesarioescribirunprogramaparaelmicrocontroladorparamedirlatemperaturayvisualizarlosresultadosenunLCD.Elprocesode
medicinserealizaporunsensorqueconviertetemperaturaenvoltaje.ElmicrocontroladorutilizaelconvertidorA/Dparaconvertireste
voltaje(valoranalgico)enunnmero(valordigital)queluegoseenvaalLCDpormediodevariosconductores.Enconsecuencia,el
programasedivideencuatropartes,delasquecadaunacorrespondeaunaaccinespecfica:

1. ActivaryconfigurarelconvertidorA/Dincorporado
2. Medirelvaloranalgico
3. Calculartemperaturay
4. EnviarlosdatosenelformatoapropiadoalLCD

LoslenguajesdeprogramacindealtonivelcomoesClepermitensolucionar
esteproblemaconfacilidadalescribircuatrofuncionesqueseejecutarn
cclicamentesinparar.

Laideageneralesdedividirelproblemaenvariostrozos,delosquecadauno
sepuedeescribircomounasolafuncin.Todoslosprogramasescritosen
mikroCcontienenporlomenosunafuncinllamadamain()queencierraentre
llaves{}lassentenciasaserejecutadas.Estoeslaprimerafuncinaser

http://www.mikroe.com/chapters/view/80/capitulo2programaciondelosmicrocontroladores/ 3/37
11/10/2015 ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacinenCconejemplos
ejecutadaaliniciarselaejecucindeprograma.Lasotrasfuncionessepueden
llamardentrodelafuncinmain.Enotraspalabras,podemosdecirquela
funcinmain()esobligatoria,mientrasquelasdemssonopcionales.Sitodava
nohaescritounprogramaenC,esprobablequetodoleresulteconfuso.Nose
preocupe,acptelotalcomoesporelmomentoymstardeentenderla
sintaxis.

Yahora,suprimerprogramareal!Lafiguramuestralaestructuradeprograma,sealandolaspartesenlasqueconsiste.

LamaneradeescribirelcdigoenCesmuyimportante.Porejemplo,Cdifiereentreminsculasymaysculas,asquelafuncinmain()
nosepuedeescribirMAIN()oMain().Adems,notequedoslneasdelcdigodentrodelafuncinterminanconunpuntoycoma.EnC
todaslassentenciasdebenterminarconunpuntoycoma,aselcompiladorpuedeaislarlasytraducirlasacdigomquina.

http://www.mikroe.com/chapters/view/80/capitulo2programaciondelosmicrocontroladores/ 4/37
11/10/2015 ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacinenCconejemplos

COMENTARIOS

Loscomentariossonlaspartesdelprogramautilizadosparaaclararlasinstruccionesdeprogramaoparaproporcionarmsinformacinal
respecto.Elcompiladornohacecasoaloscomentariosynoloscompilaalcdigoejecutable.Dichodemanerasencilla,elcompiladores
capazdereconocerloscaracteresespecialesutilizadosparadesignardndeloscomentarioscomienzanyterminanynohacenadade
casoaltextoentreellosdurantelacompilacin.Haydostiposdetalescaracteres.Unosdesignanloscomentarioslargosqueocupan
variaslneasdeprogramamarcadosporlasecuenciaespecial/*...*/,mientrasqueotrosdesignanloscomentarioscortosquecabenen
unasolalnea//.Aunqueloscomentariosnopuedenafectaralaejecucindeprograma,sontanimportantescomocualquierotrapartede
programa.Aquestelporqu...Confrecuenciaesnecesariomejorar,modificar,actualizar,simplificarunprograma...Noesposible
interpretarinclusolosprogramassimplessinutilizarloscomentarios.

2.3TIPOSDEDATOSENMIKROC

EnellenguajeC,losdatostienenuntipo,osea,cadadatoutilizadoenelprogramadebetenersutipoespecificado.Estopermiteal
compiladorconocereltamaodedato(nmerodebytesrequeridoenlamemoria)ysurepresentacin.Hayvariostiposdedatosquese
puedenutilizarenellenguajedeprogramacinmikroCdependiendodeltamaodedatoydelrangodevalores.Latablamuestraelrango
devaloresquelosdatospuedentenercuandoseutilizanensuformabsica.

T IPO DE T AMAO ( NMERO DE


DESCRIPCI N RANG O DEVAL O RES
DATO BIT S)

char Texto(caracteres) 8 de0a255

int Valoresenteros 16 de32768a32767

de1.175494350821038a
float Valoresenpuntoflotante 32
6.805647744071038

Valoresenpuntoflotantededoble de1.175494350821038a
double 32
precisin 6.805647744071038

*Debidoalaslimitacionesimpuestasporelhardwaredelmicrocontrolador,esimposiblealcanzarunamayorprecisindedatosqueladel
tipofloat.Poreso,eltipodoubleenmikroCequivalealtipofloat.

Alaadirunprefijo(calificador)acualquiertipodedatoenteroocarcter,elrangodesusposiblesvalorescambiaascomoelnmerode
losbytesdememorianecesarios.Pordefecto,losdatosdetipointsonconsigno,mientrasquelosdetipocharsonsinsigno.Elcalificador

http://www.mikroe.com/chapters/view/80/capitulo2programaciondelosmicrocontroladores/ 5/37
11/10/2015 ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacinenCconejemplos
signed(consigno)indicaqueeldatopuedeserpositivoonegativo.Elprefijounsignedindicaqueeldatopuedeserslopositivo.Note
queelprefijoesopcional.

T IPO DE T IPO DEDAT O CO N T AMAO ( NMERO DE


RANG O DEVAL O RES
DATO PREF IJO BIT S)

char signedchar 8 de128a128

unsignedint 16 de0a65535

shortint 8 de0a255

int signedshortint 8 de128a127

longint 32 de0a4294967295

signedlongint 32 de2147483648a2147483647

Tipoentero(int)

Unenteroesunnmerosinpartefraccionariaquepuedeestarexpresadoenlossiguientesformatos:

Hexadecimal(base16):elnmeroempiezacon0x(o0X).Losenteroshexadecimalesconsistenenlosdgitos(de0a
9)y/olasletras(A,B,C,D,E,F).Porejemplo:0x1A.
Decimal(base10):elnmeroconsisteenlosdgitos(de0a9).Elprimerdgitonopuedeser0.Enesteformato,se
puedeintroducirelsignodenmero(+o).Porejemplo:569,25,+1500.
Octal(base8):losnmerosserepresentanabase8utilizandoslo8dgitos(de0a7).Losenterosoctalesempiezan
con0.Porejemplo:056.
Binario:cuandounenteroempiezacon0b(o0B)serepresentancomounaseriedebits(0y1).Porejemplo:
0B10011111

0x11//formatohexadecimalequivaleadecimal17
11//formatodecimal
152//formatodecimal
011//formatooctalequivaleadecimal9
0b11//formatobinarioequivaleadecimal3

Tipopuntoflotante(float)

Eltipopuntoflotante(float)seutilizaparalosnmerosrealesconelpuntodecimal.Losdatosdetipofloatsepuedenrepresentardevarias
maneras.Undatofloatessiempreconsigno(signed).

0.//=0.0
1.23//=1.23
23.45e6//=23.45*10^6
2e5//=2.0*10^5
3E+10//=3.0*10^10
.09E34//=0.09*10^34

Tipocarcter(char)

Eltipocharesconsideradocomounenteroporelcompilador.Noobstante,seutilizanormalmenteparalosdatosdetipocarcter.Undato
detipocarcterestencerradoentrecomillasycodificadoenuncarcterASCII.

59//entero
'p'//carcterASCII'p'

Unasecuenciadecaracteresesdenominadacadena(string).Lascadenasestnencerradasentrecomillasdobles,porejemplo:

"PresioneelbotnRA0"

2.4VARIABLESYCONSTANTES

Definiciones

Unavariableesunobjetonombradocapazdecontenerundatoquepuedesermodificadodurantelaejecucindeprograma.EnC,las
variablestienentipo,quesignificaqueesnecesarioespecificareltipodedatoqueseleasignaaunavariable(int,floatetc.).Lasvariables
sealmacenanenlamemoriaRAMyelespaciodememoriaqueocupan(enbytes)dependedesutipo.

/*doslneasdeprogramaconsecutivas.Enlaprimeralneadelprograma
sedefineeltipodevariable*/

http://www.mikroe.com/chapters/view/80/capitulo2programaciondelosmicrocontroladores/ 6/37
11/10/2015 ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacinenCconejemplos
inta=1000//Variableaesdetipointyequivalea1000
a=15//aequivalea15

Unaconstantetienelasmismascaractersticasqueunavariableexceptoelhechodequesuvalorasignadonopuedesercambiado
durantelaejecucindeprograma.Adiferenciadelasvariables,lasconstantessealmacenanenlamemoriaFlashdelmicrocontrolador
paraguardarelmayorespacioposibledememoriaRAM.Elcompiladorlasreconoceporelnombreyelprefijoconst.EnmikroC,el
compiladorreconoceautomticamenteeltipodedatodeunaconstante,asquenoesnecesarioespecificareltipoadicionalmente.

/*doslneasdeprogramaconsecutivas*/

constA=1000//elvalordelaconstanteAestdefinido
A=15//ERROR!nosepuedemodificarelvalordelaconstante

Cadavariableoconstantedebetenerunidentificadorquelodistinguedeotrasvariablesyconstantes.Refirasealosejemplosanteriores,
ayAsonidentificadores.

Reglasparanombrar

EnmikroC,losidentificadorespuedensertanlargoscomoquiera.Sinembargo,hayvariasrestricciones:

LosidentificadorespuedenincluircualquieradeloscaracteresalfabticosAZ(az),losdgitos09yelcarcter
subrayado'_'.Elcompiladoressensiblealadiferenciaentreminsculasymaysculas.Losnombresdefuncionesy
variablesseescribenconfrecuenciaconminsculas,mientrasquelosnombresdeconstantesseescribencon
maysculas.
Losidentificadoresnopuedenempezarconundgito.
LosidentificadoresnopuedencoincidirconlaspalabrasclavedellenguajemikroC,porquesonlaspalabras
reservadasdelcompilador.
ElcompiladormikroCreconoce33palabrasclave:

MIKRO C PAL ABRASCL AVE

absolute data if return typedef

asm default inline rx typeid

at delete int sfr typename

auto do io short union

bit double long signed unsigned

bool else mutable sizeof using

break enum namespace static virtual

case explicit operator struct void

catch extern org switch volatile

char false pascal template while

class float private this

code for protected throw

const friend public true

continue goto register try

Ejemplosdelosidentificadoresvlidoseinvlidos:

temperatura_V1//OK
Presin//OK
no_corresponder//OK
dat2string//OK
SuM3//OK
_vtexto//OK
7temp//NOnopuedeempezarconunnmero
%ms_alto//NOnopuedencontenercaracteresespeciales
if//NOnopuedecoincidirconunapalabrareservada
j23.07.04//NOnopuedecontenercaracteresespeciales(punto)
nombredevariable//NOnopuedecontenerespacioenblanco

Declaracindevariables

Cadavariabledebeserdeclaradaantesdeserutilizadaenelprograma.ComolasvariablessealmacenanenlamemoriaRAM,es
necesarioreservarelespacioparaellas(uno,dosomsbytes).Alescribirunprograma,ustedsabequtipodedatosquiereutilizaryqu
tipodedatosesperacomoresultadodeunaoperacin,mientrasqueelcompiladornolosabe.Noseolvidedequeelprogramamaneja
lasvariablesconlosnombresasignados.ElcompiladorlasreconocecomonmerosenlamemoriaRAMsinconocersutamaoyformato.
Paramejorarlalegibilidaddecdigo,lasvariablessedeclaranconfrecuenciaalprincipiodelasfunciones:

http://www.mikroe.com/chapters/view/80/capitulo2programaciondelosmicrocontroladores/ 7/37
11/10/2015 ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacinenCconejemplos

<tipo>variable

Esposibledeclararmsdeunavariabledeunavezsitienenelmismotipo.

<tipo>variable1,variable2,variable3

Apartedelnombreydeltipo,alasvariablesselesasignanconfrecuencialosvaloresinicialesjustamenteenseguidadesudeclaracin.
Estonoesunpasoobligatorio,sinounacuestindebuenascostumbres.Separecealosiguiente:

unsignedintpeso//Declararunavariablellamadapeso
peso=20//Asignarelvalor20alavariablepeso

Unmtodomsrpidoseledenominadeclaracinconinicializacin(asignacindelosvaloresiniciales):

unsignedintpeso=20//pesoestdeclaradoysuvalores20

Sihayvariasvariablesconelmismovalorinicialasignado,elprocesosepuedesimplificar:

unsignedintpeso1=peso2=peso3=20
intvalor_inicial=un_mnimo_de_petrleo=0

Tengacuidadodenodeclararlamismavariableotravezdentrodelamismafuncin.
Puedemodificarelcontenidodeunavariablealasignarleunnuevovalortantasvecesquequiera
Aldeclararunavariable,siemprepienseenlosvaloresquelavariabletendrquecontenerdurantelaejecucinde
programa.Enelejemploanterior,peso1nosepuederepresentarconunnmeroconpuntodecimalounnmerocon
valornegativo.

Declaracindeconstantes

Similaralasvariables,lasconstantesdebenserdeclaradasantesdeserutilizadasenelprograma.EnmikroC,noesobligatorio
especificareltipodeconstantealdeclararla.Porotraparte,lasconstantesdebenserinicializadasalavezquesedeclaran.Elcompilador
reconocelasconstantesporsuprefijoconstutilizadoenladeclaracin.Dossiguientesdeclaracionessonequivalentes:

constintMINIMUM=100//DeclararconstanteMINIMUM
constMINIMUM=100//DeclararconstanteMINIMUM

Lasconstantespuedenserdecualquiertipo,incluyendocadenas:

constT_MAX=3.260E1//constantedepuntoflotanteT_MAX
constI_CLASS='A'//constantecarcterI_CLASS
constMensaje="PresioneelbotnIZQUIERDA"//constantedecadenaMensaje

Lasconstantesdeenumeracinsonuntipoespecialdeconstantesenterasquehaceunprogramamscomprensiblealasignarlos
nmerosordinalesalasconstantes.Pordefecto,elvalor0seasignaautomticamentealaprimeraconstanteentrellaves,elvalor1ala
segunda,elvalor2alaterceraetc.

enumsurtidores{AGUA,GASLEO,CLORO}//AGUA=0GASLEO=1CLORO=2

Esposibleintroducirdirectamenteelvalordeunaconstantedentrodelalistadeenumeraciones.Elincrementosedetienealasignarun
valoraunelementodematriz,despussereiniciaapartirdelvalorasignado.Veaelsiguienteejemplo:

enumsurtidores{AGUA,GASLEO=0,CLORO}//AGUA=0GSOLEO=0CLORO=1

Lasconstantesdeenumeracinseutilizandelasiguientemanera:

intVelocidad_de_ascensor
enummotor_de_ascensor{PARADA,INICIO,NORMAL,MXIMO}
Velocidad_de_ascensor=NORMAL//Velocidad_de_ascensor=2

Definirlosnuevostiposdedatos

http://www.mikroe.com/chapters/view/80/capitulo2programaciondelosmicrocontroladores/ 8/37
11/10/2015 ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacinenCconejemplos
Lapalabraclavetypedeflepermitecrearconfacilidadlosnuevostiposdedatos.

typedefunsignedintpositivo//positivoesunsinnimoparaeltiposinsignoint
positivoa,b//Variablesaybsondetipopositivo
a=10//Variableaequivalea10
b=5//Variablebequivalea5

mbitodevariablesyconstantes

Unavariableounaconstanteesreconocidaporelcompiladorenbasedesuidentificador.Unidentificadortienesignificadosiel
compiladorlopuedereconocer.Elmbitodeunavariableounaconstanteeselrangodeprogramaenelquesuidentificadortiene
significado.Elmbitoesdeterminadoporellugarenelquesedeclaraunavariableounaconstante.Intentaraccederaunavariableouna
constantefueradesumbitoresultaenunerror.Unavariableounaconstanteesinvisiblefueradesumbito.Todaslasvariablesy
constantesquepensamosutilizarenunprogramadebenserdeclaradasanteriormenteenelcdigo.Lasvariablesyconstantespueden
serglobalesolocales.Unavariableglobalsedeclaraenelcdigofuente,fueradetodaslasfunciones,mientrasqueunavariablelocalse
declaradentrodelcuerpodelafuncinodentrodeunbloqueanidadoenunafuncin.

Alasvariablesglobalesselespuedeaccederdecualquieraparteenelcdigo,andentrodelasfuncionescontaldequesean
declaradas.Elmbitodeunavariableglobalestlimitadoporelfindelarchivofuenteenelquehasidodeclarado.

Elmbitodevariableslocalesestlimitadoporelbloqueencerradoentrellaves{}enelquehansidodeclaradas.Porejemplo,siestn
declaradasenelprincipiodelcuerpodefuncin(igualqueenlafuncinmain)sumbitoestentreelpuntodedeclaracinyelfindeesa
funcin.Refirasealejemploanterior.Alasvariableslocalesdeclaradasenmain()noselespuedeaccederdesdelaFuncin_1yal
revs.

Unbloquecompuestoesungrupodedeclaracionesysentencias(quepuedenserbloquestambin)encerradasentrellaves.Unbloque
puedeserunafuncin,unaestructuradecontroletc.Unavariabledeclaradadentrodeunbloqueseconsideralocal,osea,existeslo
dentrodelbloque.Sinembargo,lasvariablesdeclaradasfueradelmbitotodavasonvisibles.

Aunquelasconstantesnopuedensermodificadasenelprograma,siguenlasmismasreglasquelasvariables.Estosignificaqueson
visiblesdentrodesubloqueaexcepcindelasconstantesglobales(declaradasfueradecualquierfuncin).Lasconstantessedeclaran
normalmenteeneliniciodelcdigofueradecualquierfuncin(comovariablesglobales).

Clasesdealmacenamiento

Lasclasesdealmacenamientoseutilizanparadefinirelmbitoylavidadevariables,constantesyfuncionesdentrodeunprograma.En
mikroCsepuedenutilizardiferentesclasesdealmacenamiento:

autoesunaclasedealmacenamientopordefectoparalasvariableslocales,asqueseutilizararamente.Seutiliza
paradefinirqueunavariablelocaltieneduracinlocal.Laclasedealmacenamientoautonosepuedeutilizarcon
variablesglobales.

staticesunaclasedealmacenamientopordefectoparalasvariablesglobales.Especificaqueunavariableesvisible
dentrodelarchivo.Alasvariableslocalesdeclaradasconelprefijostaticselespuedeaccederdentrodelarchivo
fuente(oseasecomportancomovariablesglobales).
extern:lapalabraclaveexternseutilizacuandoelprogramaestcompuestopordiferentesarchivosfuente.Estole
permiteutilizarunavariable,unaconstanteounafuncindeclaradaenotroarchivo.Porsupuesto,paracompilary
enlazarestearchivocorrectamente,elmismodebeserincluidoensuproyecto.Enlossiguientesejemplos,el
programaconsisteendosarchivos:File_1yFile_2.ElFile_1utilizaunavariableyunafuncindeclaradasenFile_2.
File1:

http://www.mikroe.com/chapters/view/80/capitulo2programaciondelosmicrocontroladores/ 9/37
11/10/2015 ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacinenCconejemplos

externintcnt//VariablecntesvisibleenFile_1
externvoidhello()//Funcinhello()sepuedeutilizarenFile_1

voidmain(){
PORTA=cnt++//CualquiermodificacindecntenFile_1servisibleenFile_2
hello()//Funcinhello()sepuedellamardesdeaqu
}

File2:

intcnt=0
voidhello()

voidhello(){//Modificacionesqueafectanala
.//cntenFile_1sonvisiblesaqu
.
.
}

2.5OPERADORES

Unoperadoresunsmboloquedenotaunaoperacinaritmtica,lgicauotraoperacinparticular.Dichodemanerasencilla,varias
operacionesaritmticasylgicasserealizanpormediodelosoperadores.Haymsde40operacionesdisponiblesenellenguajeC,pero
seutilizaunmximode1015deellasenprctica.Cadaoperacinserealizasobreunoomsoperandosquepuedenservariableso
constantes.Adems,cadaoperacinsecaracterizaporlaprioridaddeejecucinyporlaasociatividad.

OPERADORESARITMTICOS

Losoperadoresaritmticosseutilizanenlasoperacionesaritmticasysiempredevuelvenresultadosnumricos.Haydostiposde
operadores,losunitariosylosbinarios.Adiferenciadelasoperacionesunitariasqueserealizansobreunoperando,lasoperaciones
binariasserealizansobredosoperandos.Enotraspalabras,serequierendosnmerosparaejecutarunaoperacinbinaria.Porejemplo:
a+boa/b.

O PERADO R O PERACI N

+ Adicin

Resta

* Multiplicacin

/ Divisin

% Restodeladivisin

inta,b,c//Declarar3enterosa,b,c
a=5//Inicializara
b=4//Inicializarb
c=a+b//c=9
c=c%2//c=1.Estaoperacinseutilizaconfrecuencia
//paracomprobarlaparidad.Enestecaso,el
//resultadoes1loquesignificaquelavariable
//esunnmeroimparo

OPERADORESDEASIGNACIN

HaydostiposdeasignacinenellenguajeC:

Losoperadoressimplesasignanlosvaloresalasvariablesutilizandoelcarctercomn'='.Porejemplo:a=8
LasasignacionescompuestassonespecficasparaellenguajeC.Consistenendoscaracterescomosemuestraen
latablaaladerecha.Seutilizanparasimplificarlasintaxisyhabilitarlaejecucinmsrpida.

EJEMPL O
O PERADO R
Expresin Equivalente

+= a+=8 a=a+8

= a=8 a=a8

*= a*=8 a=a*8

/= a/=8 a=a/8

%= a%=8 a=a%8

http://www.mikroe.com/chapters/view/80/capitulo2programaciondelosmicrocontroladores/ 10/37
11/10/2015 ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacinenCconejemplos

inta=5//Declarareinicializarlavariablea
a+=10//a=a+10=15

OPERADORESDEINCREMENTOYDECREMENTO

Lasoperacionesdeincrementoydecrementopor1sedenotancon"++"y"".Estoscaracterespuedenprecederoseguiraunavariable.
Enprimercaso(++x),lavariablexserincrementadapor1antesdeserutilizadaenlaexpresin.Delocontrario,lavariableseutilizaren
laexpresinantesdeseraumentadapor1.Lomismoseaplicaalaoperacindedecremento.

O PERADO R EJEMPL O DESCRIPCI N

++a
++ Variable"a"esincrementadapor1
a++

b
Variable"a"esdecrementadapor1
b

inta,b,c
a=b=5
c=1+a++//c=6
b=++c+a//b=7+6=13

OPERADORESRELACIONALES

Losoperadoresrelacionalesseutilizanencomparacionesconelpropsitodecomparardosvalores.EnmikroC,siunaexpresines
evaluadacomofalsa(false),eloperadordevuelve0,mientrasquesiunaoracinesevaluadacomoverdadera(true),devuelve1.Estose
utilizaenexpresionestalescomosilaexpresinesevaluadacomoverdadera,entonces...

O PERADO R DESCRIPCI N EJEMPL O CO NDICI NDEVERACIDAD

> mayorque b>a sibesmayorquea

>= mayoroigualque a>=5 siaesmayoroigualque5

< menorque a<b siaesmenorqueb

<= menoroigualque a<=b siaesmenoroigualqueb

== igualque a==6 siaesigualque6

!= desigualque a!=b siaesdesigualqueb

intprop
intvar=5
prop=var<10//Expresinesevaluadacomoverdadera,prop=1

OPERADORESLGICOS

HaytrestiposdeoperacioneslgicasenellenguajeC:Y(AND)lgico,O(OR)lgicoynegacinNO(NOT)lgico.Losoperadores
lgicosdevuelvenverdadero(1lgico)silaexpresinevaluadaesdistintadecero.Encasocontrario,devuelvefalso(0lgico)sila
expresinevaluadaequivaleacero.Estoesmuyimportanteporquelasoperacioneslgicasserealizangeneralmentesobrelas
expresiones,ynosobrelasvariables(nmeros)particularesenelprograma.Porlotanto,lasoperacioneslgicasserefierenala
veracidaddetodalaexpresin.

Porejemplo:1&&0esiguala(expresinverdadera)&&(expresinfalsa)

Elresultado0,oseaFalsoenamboscasos.

O PERADO R FUNCIN

&& Y

|| O

! NO

OPERADORESDEMANEJODEBITS

Adiferenciadelasoperacioneslgicasqueserealizansobrelosvaloresoexpresiones,lasoperacionesdemanejodebitsserealizan
sobrelosbitsdeunoperando.Seenumeranenlasiguientetabla:

O PERADO R DESCRIPCI N EJEMPL O RESUL T ADO

~ Complementoauno a=~b b=5 a=5

<< Desplazamientoalaizquierda a=b<<2 b=11110011 a=11001100

>> Desplazamientoaladerecha a=b>>2 b=11110011 a=00011110

http://www.mikroe.com/chapters/view/80/capitulo2programaciondelosmicrocontroladores/ 11/37
11/10/2015 ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacinenCconejemplos
& Ylgicoparamanejodebits c=a&b a=11100011 c=11000000
b=11001100

a=11100011
| Olgicoparamanejodebits c=a|b c=11101111
b=11001100

a=11100011
^ EXORlgicoparamanejodebits c=a^b c=00101111
b=11001100

Notequeelresultadodelaoperacindedesplazamientoaladerechadependedelsignodelavariable.Encasodequeeloperandose
apliqueaunavariablesinsignoopositiva,seintroducirnloscerosenelespaciovacocreadopordesplazamiento.Siseaplicaaun
enteroconsignonegativo,seintroducirun1paramantenerelsignocorrectodelavariable.

CMOUTILIZARLOSOPERADORES?

Apartedelosoperadoresdeasignacin,dosoperadoresnodebenestarescritosunojuntoalotro.

x*%12//estaexpresingenerarunerror

Cadaoperadortienesuprioridadyasociatividadcomosemuestraenlatabla:
Similaralasexpresionesaritmticas,losoperadoresseagrupanjuntospormediodeparntesis.Primerosecalculan
lasexpresionesencerradasentreparntesis.Siesnecesario,sepuedenutilizarlosparntesismltiples(anidados).

PRIO RIDAD O PERADO RES ASO CIAT IVIDAD

Alta ()[]>. deizquierdaaderecha

!~+++(unitario)(unitario)*Puntero&Puntero dederechaaizquierda

*/% deizquierdaaderecha

+ deizquierdaaderecha

<> deizquierdaaderecha

<<=>>= deizquierdaaderecha

==!= deizquierdaaderecha

& deizquierdaaderecha

^ deizquierdaaderecha

| deizquierdaaderecha

&& deizquierdaaderecha

|| dederechaaizquierda

?: dederechaaizquierda

Baja =+==*=/=/=&=^=|=<=>= deizquierdaaderecha

inta,b,res
a=10
b=100
res=a*(a+b)//resultado=1100
res=a*a+b//resultado=200

CONVERSINDETIPOSDEDATOS

Algunasoperacionesimplicanconversindedatos.Porejemplo,sidividedosvaloresenteros,hayunaaltaposibilidaddequeelresultado
noseaunentero.ElmikroCrealizaunaconversinautomticacuandoserequiera.

Sidosoperandosdetipodiferenteseutilizanenunaoperacinaritmtica,eltipodeoperandodelaprioridadmsbajaseconvierte
automticamenteeneltipodeoperandodelaprioridadmsalta.Lostiposdedatosprincipalessecolocansegnelsiguienteorden
jerrquico:

Laautoconversinserealizaasimismoenlasoperacionesdeasignacin.Elresultadodelaexpresindeladerechadeloperadordela
asignacinsiempreseconvierteeneltipodelavariabledelaizquierdadeloperador.Sielresultadoesdetipodelaprioridadmsalta,se
descartaoseredondeaparacoincidirconeltipodelavariable.Alconvertirundatorealenunentero,siempresedescartanlosnmeros
quesiguenalpuntodecimal.

intx//Alavariablexseleasignaeltipointeger(unentero)
x=3//Alavariablexseleasignaelvalor3

http://www.mikroe.com/chapters/view/80/capitulo2programaciondelosmicrocontroladores/ 12/37
11/10/2015 ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacinenCconejemplos
x+=3.14//Elvalor3.14seagregaalavariablexal
//realizarlaoperacindeasignacin

/*Elresultadodelaadicines6envezde6.14,comoeradeesperar.
Paraobtenerelresultadoesperadosindescartarlosnmerosquesiguenal
puntodecimal,sedebedeclararxcomounpuntoflotante.*/

Pararealizarunaconversinexplcita,antesdeescribirunaexpresinounavariablehayqueespecificareltipoderesultadodeoperacin
entreparntesis.

doubledistancia,tiempo,velocidad
distancia=0.89
tiempo=0.1
velocidad=(int)(a/b)//c=(int)8.9=8.0
velocidad=((int)a)/b//c=0/0.1=0.0

2.6ESTRUCTURASDECONTROL

ESTRUCTURASCONDICIONALES

Lascondicionessoningredientescomunesdeunprograma.Lascondicionespermitenejecutarunaovariassentenciasdependiendode
validezdeunaexpresin.Enotraspalabras,Sisecumplelacondicin(...),sedebehacer(...).Delocontrario,silacondicinnose
cumple,sedebehacer(...).Losoperandoscondicionalesifelseyswitchseutilizanenlasoperacionescondicionales.Unasentencia
condicionalpuedeserseguidaporunasolasentenciaoporunbloquedesentenciasaserejecutadas.

OPERADORCONDICIONALifelse

Eloperadorifsepuedeutilizarsolooasociadoaloperadorelse(ifelse).

Ejemplodeloperadorif:

if(expresin)operacin

Sielresultadodelaexpresinencerradaentreparntesisesverdadero(distintode0)laoperacinserealizayelprogramacontinacon
laejecucin.Sielresultadodelaexpresinesfalso(0),laoperacinnoserealizayelprogramacontinainmediatamenteconla
ejecucin.

Comohemosmencionado,laotraformacombinatantoeloperadorifcomoelelse:

if(expresin)operacin1elseoperacin2

Sielresultadodelaexpresinesverdadero(distintode0),serealizaoperacin1,delocontrarioserealizalaoperacin2.Despusde
realizarunadelasoperaciones,elprogramacontinaconlaejecucin.

Lasentenciaifelseseparecealosiguiente:

if(expresin)
operacin1
else
operacin2

Sioperacin1uoperacin2estcompuesta,escribaunalistadesentenciasencerradasentrellaves.Porejemplo:

if(expresin){
...//
...//operacin1
...}//
else
operacin2

Eloperadorifelsesepuedesustituirporeloperadorcondicional'?:':

(expresin1)?expresin2:expresin3

Sielvalordelaexpresin1esdistintode0(verdadero),elresultadodelaexpresinenteraserequivalentealresultadoobtenidodela
expresin2.Delocontrario,silaexpresin1es0(falso),elresultadodelaexpresinenteraserequivalentealresultadoobtenidodela

http://www.mikroe.com/chapters/view/80/capitulo2programaciondelosmicrocontroladores/ 13/37
11/10/2015 ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacinenCconejemplos
expresin3.Porejemplo:

maximum=(a>b)?a:b//Alavariablemaximumseleasignael
//valordelavariablemayor(aob)

OperadorSwitch

Adiferenciadelasentenciaifelsequeseleccionaentredosopcionesenelprograma,eloperadorswitchpermiteelegirentrevarias
opciones.Lasintaxisdelasentenciaswitches:

switch(selector)//Selectoresdetipocharoint
{
caseconstante1:
operacin1//Elgrupodeoperadoresqueseejecutansi
...//elselectorylaconstante1sonequivalentes

break

caseconstante2:

operacin2//Elgrupodeoperadoresseejecutasi
...//elselectorylaconstante2sonequivalentes

break
...
default:

operacin_esperada//Elgrupodeoperadoresqueseejecutasi
...//ningunaconstanteequivalealselector
break
}

Laoperacinswitchseejecutadelasiguientemanera:primeroseejecutaelselectorysecomparaconlaconstante1.Sicoinciden,las
sentenciasquepertenecenaesebloqueseejecutanhastallegaralapalabraclavebreakohastaelfinaldelaoperacinswitch.Sino
coinciden,elselectorsecomparaconlaconstante2.Sicoinciden,lassentenciasquepertenecenaesebloqueseejecutanhastallegara
lapalabraclavebreaketc.Sielselectornocoincideconningunaconstante,seejecutarnlasoperacionesquesiguenaloperadordefault.

Tambinesposiblecompararunaexpresinconungrupodeconstantes.Sicoincideconalgunadeellas,seejecutarnlasoperaciones
apropiadas:

switch(das)//Lavariabledasrepresentaundadelasemana.
{//Esnecesariodeterminarsiesundalaborableonoloes
case1:case2:case3:case4:case5:LCD_message='Dalaborable'break
case6:case7:LCD_message='Findesemana'break
default:LCD_message_1='Elijaundadelasemana'break
}

LapalabraclavedeCbreaksepuedeutilizarencualquiertipodebloques.Alutilizarbreak,esposiblesalirdeunbloqueaunquela
condicinparasufinalnosehayacumplido.Sepuedeutilizarparaterminarunbucleinfinito,oparaforzarunbucleaterminarantesdelo
normal.

BUCLES

Amenudoesnecesariorepetirunaciertaoperacinunpardevecesenelprograma.Unconjuntodecomandosqueserepitenes
denominadounbucledeprograma.Cuntasvecesseejecutar,esdecircuntotiempoelprogramasequedarenelbucle,dependede
lascondicionesdesalirdelbucle.

BucleWhile

Elbuclewhileseparecealosiguiente:

while(expresin){
comandos
...
}

Loscomandosseejecutanrepetidamente(elprogramasequedaenelbucle)hastaquelaexpresinllegueaserfalsa.Silaexpresines
falsaenlaentradadelbucle,entonceselbuclenoseejecutaryelprogramacontinuardesdeelfindelbuclewhile.

http://www.mikroe.com/chapters/view/80/capitulo2programaciondelosmicrocontroladores/ 14/37
11/10/2015 ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacinenCconejemplos
Untipoespecialdelbucledeprogramaesunbucleinfinito.Seformasilacondicinsiguesincambiosdentrodelbucle.Laejecucines
simpleenestecasoyaqueelresultadoentrellavesessiempreverdadero(1=verdadero),loquesignificaqueelprogramasequedaenel
mismobucle:

while(1){//Envezde"while(1)",sepuedeescribir"while(true)"
...//Expresionesencerradasentrellavesseejecutarn
...//repetidamente(bucleinfinito)
}

BucleFor

Elbucleforseparecealosiguiente:

for(expresin_inicialexpresin_de_condicincambiar_expresin){
operaciones
...
}

Laejecucindeestasecuenciadeprogramaessimilaralbuclewhile,salvoqueenestecasoelprocesodeespecificarelvalorinicial
(inicializacin)serealiceenladeclaracin.Laexpresin_inicialespecificalavariableinicialdelbucle,quemstardesecomparaconla
expresin_de_condicinantesdeentraralbucle.Lasoperacionesdentrodelbucleseejecutanrepetidamenteydespusdecada
iteracinelvalordelaexpresin_inicialseincrementadeacuerdoconlareglacambiar_expresin.Laiteracincontinahastaquela
expresin_de_condicinllegueaserfalsa.

for(k=0k<5k++)//Lavariablekseincrementa5veces(de1a4)y
operacin//cadavezserepitelaexpresinoperacin
...

Laoperacinseejecutarcincoveces.Luego,alcomprobarsevalidaquelaexpresink<5seafalsa(despusde5iteracionesk=5)yel
programasaldrdelbuclefor.

BucleDowhile

Elbucledowhileseparecealosiguiente:

do
operacin
while(cambiar_condicin)

Laexpresincambiar_condicinseejecutaalfinaldelbucle,quesignificaqueoperacinseejecutacomomnimounavezsinrepararen
quesilacondicinesverdaderaofalsa.Sielresultadoesdistintode0(verdadero),elprocedimientoserepite.

Todoslossiguientesejemplossonequivalentes.Estapartedelcdigovisualiza"hello"enunLCD10vecesconunretardodeunsegundo.
Notequeenesteejemploseutilizanfuncionespredefinidas,queseencuentranenlaslibrerasdelcompiladormikroCPROforPIC.No
obstanteleaconsejamosquenotratedeentenderlasendetalle.Sucomportamientogeneraldentrodelbucleseexplicapormediodelos
comentarios.

i=0//Inicializacindelcontador

while(i<10){//Condicin
Lcd_Out(1,3,"hello")//VisualizarhelloenelLCD
Delay_ms(1000)//Retardode1000ms
Lcd_Cmd(_LCD_CLEAR)//BorrarelLCD
Delay_ms(500)//Retardode500ms
i++//Contadorseincrementa
}

for(i=0i<10i++){//Inicializacin,condicin,incremento
Lcd_Out(1,3,"hello")//VisualizarhelloenelLCD
Delay_ms(1000)//Retardode1000ms
Lcd_Cmd(_LCD_CLEAR)//BorrarelLCD
Delay_ms(500)//Retardode500ms
}

i=0//Inicializacindelcontador

http://www.mikroe.com/chapters/view/80/capitulo2programaciondelosmicrocontroladores/ 15/37
11/10/2015 ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacinenCconejemplos
do{
Lcd_Out(1,3,"hello")//VisualizarhelloenelLCD
Delay_ms(1000)//Retardode1000ms
Lcd_Cmd(_LCD_CLEAR)//BorrarLCD
Delay_ms(500)//Retardode500ms
i++//Contadorseincrementa
}
while(i<10)//Condicin

SENTENCIASDESALTO

SENTENCIABREAK

Avecesesnecesariodetenerysalirdeunbucledentrodesucuerpo.Lasentenciabreaksepuedeutilizardentrodecualquierbucle
(while,for,dowhile)yenlassentenciasswitchtambin.Enstaslasentenciabreakseutilizaparasalirdelassentenciasswitchsila
condicincaseesverdadera.Enesteejemplo,EsperarestparpadeandoenlapantallaLCDhastaqueelprogramadetecteununo
lgicoenelpin0delpuertoPORTA.

while(1){//Bucleinfinito
if(PORTA.F0==1)//Probarsielestadolgicodelpin0delpuerto
break//PORTAes1siequivale,salirdelbucle
Lcd_Out(1,3,"Esperar")//VisualizarEsperarenelLCD
Delay_ms(1000)//Retardode1000ms
Lcd_Cmd(_LCD_CLEAR)//BorrarLCD
Delay_ms(500)//Retardode500ms
}

SENTENCIACONTINUE

Lasentenciacontinuecolocadadentrodeunbucleseutilizaparasaltarunaiteracin.Adiferenciadelasentenciabreak,elprogramase
quedadentrodelbucleylasiteracionescontinan.

//Six=7,puedeocurrirunadivisinpor0.
//continueseutilizaaquparaevitarestasituacin.
x=1
while(x<=10){
if(x==7){//saltarx=7paraevitardivisinpor0
Lcd_Cmd(_LCD_CLEAR)
Lcd_Out(1,3,"Divisionby0")
Delay_ms(1000)
x++
continue//Despusdeestalnea,saltaralasentenciawhileconx=8
}

a=1/(x7)//Estadivisingenerarunerrorsix=7

/*Muchasoperacionespuedenocurriraqu*/

Lcd_Out(1,3,"DivisionisOK")//PonerestemensajeenelLCD
Delay_ms(1000)
x++
}

SENTENCIAGOTO

Lasentenciagotolepermitehacerunsaltoabsolutoalotropuntoenelprograma.Estacaractersticasedebeutilizarconprecaucinya
quesuejecucinpuedecausarunsaltoincondicionalsinhacercasoatodoslostiposdelimitacionesdeanidacin.Elpuntodestinoes
identificadoporunaetiqueta,utilizadacomounargumentoparalasentenciagoto.Unaetiquetaconsisteenunidentificadorvlidoseguido
poruncolon(:).

...
if(CO2_sensor)gotoaireacondicionado//Siseconstaqueelvalor
...//delavariableCO2_sensor=1
//hacersaltoalalneadeprograma
//Aireacondicionado
...
Aireacondicionado://Desdeaqusiguelapartedelcdigoqueseejecutar
//encasodeunaconcentracindeCO2demasiadoalta

http://www.mikroe.com/chapters/view/80/capitulo2programaciondelosmicrocontroladores/ 16/37
11/10/2015 ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacinenCconejemplos
...//enelambiente

2.7TIPOSDEDATOSAVANZADOS

MATRICES

Unamatrizesunalistadeelementosdelmismotipocolocadosenlocalidadesdememoriacontiguas.Cadaelementoesreferenciadopor
unndice.Paradeclararunamatriz,esnecesarioespecificareltipodesuselementos(denominadotipodematriz),sunombreyelnmero
desuselementosencerradosentrecorchetes.Todosloselementosdeunamatriztienenelmismotipo.

tipo_de_matriznombre_de_matriz[n_de_elementos]

Loselementosdeunamatrizseidentificanporsuposicin.EnC,elndicevadesde0(elprimerelementodeunamatriz)aN1(Nesel
nmerodeelementoscontenidosenunamatriz).Elcompiladortienequesabercuntaslocalidadesdememoriadebealojaraldeclarar
unamatriz.Eltamaodeunamatiznopuedeserunavariable.Poreso,sepuedenutilizardosmtodos:

//mtodo1
intdisplay[3]//Declaracindelamatrizdisplaycapazdecontener3enteros
//mtodo2
constDGITOS=5
charMatriz_nueva[DGITOS]//DeclaracindelamatrizMatriz_nueva
//capazdecontener5enteros

Unamatrizsepuedeinicializaralavezquesedeclara,omstardeenelprograma.Enamboscasos,estepasoserealizaalutilizarllaves:

intarray_1[3]={10,1,100}

Paraleeromodificarunelementodematrizdelejemploanterior,bastaconintroducirsundiceencerradoentrecorchetes:

/*Sesuponequeahasidodeclaradoanteriormentecomounentero*/

a=array_1[0]//Alavariableaseleasignaelvalordelmiembrodematriz

//conndice0(a=10)
array_1[2]=20//Miembrodematrizarray_1[2]esmodificado(nuevovalores20)

Elsiguienteprogramacambiaelordendeloselementosdeunamatriz.Notequeelndicesepuedeexpresarmediantevariablesy
operacionesbsicas.

voidmain(){
constMUESTRAS_DE_AGUA=4//ValordelaconstanteMUESTRAS_DE_AGUAes4
inti,temp//Variablesiytempsondetipoint
intprofunidad_de_sonda[MUESTRAS_DE_AGUA]={24,25,1,1987}//Todos

//losmiembrosdelamatrizprofundidad
//desondasondetipoint

for(i=0i<(MUESTRAS_DE_AGUA/2)i++){//Bucleseejecuta2veces
temp=profundiad_de_sonda[i]//tempseutilizaparaguardarunvalor
//temporalmente
profundiad_de_sonda[i]=profundiad_de_sonda[MUESTRAS_DE_AGUA1i]
profundiad_de_sonda[MUESTRAS_DE_AGUA1i]=temp
}

//Aqutenemos:profundidad_de_sonda[MUESTRAS_DE_AGUA]={1987,1,25,24}
}

MATRICESBIDIMENSIONALES

http://www.mikroe.com/chapters/view/80/capitulo2programaciondelosmicrocontroladores/ 17/37
11/10/2015 ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacinenCconejemplos
Apartedelasmatricesunidimensionalesquesepuedeninterpretarcomounalistadevalores,ellenguajeClepermitedeclararmatrices
multidimensionales.Enestapartevamosadescribirslolasmatricesbidimensionales,tambindenominadastablasomatrices.Una
matrizbidimensionalsedeclaraalespecificareltipodedatodematriz,elnombredematrizyeltamaodecadadimensin.

tipo_de_matriznombre_de_matriz[nmero_de_filas][nmero_de_columnas]

Enladeclaracindeestamatriznmero_de_filasynmero_de_columnasrepresentanelnmerodefilasycolumnasenlasqueconsiste
unatabla,respectivamente.Vealasiguientematrizbidimensional:

intTabla[3][4]//Tablasedefinedemodoquetenga3filasy4columnas

Estamatrizsepuederepresentarenlaformadeunatabla.

tabla[0][0] tabla[0][1] tabla[0][2] tabla[0][3]

tabla[1][0] tabla[1][1] tabla[1][2] tabla[1][3]

tabla[2][0] tabla[2][1] tabla[2][2] tabla[2][3]

Similaralasmatricesunidimesionales,esposibleasignarlosvaloresaloselementosdeunatablaenlalneadedeclaracin.La
asignacindebeserrealizadalneaalneacomoenelsiguienteejemplo.Comohemosvistoanteriormente,estamatriztienedosfilasy
trescolumnas:

intTabla[2][3]={{3,42,1},{7,7,19}}

Lamatrizanteriorsepuederepresentartambinenlaformadeunatabladevalores:

3 42 1

7 7 19

PUNTEROS

Unpunteroesunavariabledestinadaarecibirunadireccin.Unpunteroapuntaaunalocalidaddememoria,referenciadaporuna
direccin.EnC,ladireccindeunobjetosepuedeobtenerpormediounoperadorunitario&.Paraaccederalcontenidodelamemoriaen
unadireccinespecfica(tambinllamadoobjetoapuntado),seutilizaunoperadordeindireccin(*).

'&n'esladireccindelalocalidaddememoria'n'.

'*(&n)'eselcontenidodeladireccin'(&n)',oseade'n'.

Paradeclararunpuntero,sedebequeespecificareltipodelavariableapuntada:

tipo_de_variable*puntero

Enestaetapa,elpunteromi_punteroapuntaalvaloralmacenadoenestalocalidaddememoria,osea,aunvalordesconocido.Asque,
unainicializacinesmuyrecomendable:

puntero=&variable

Ahora,punterocontieneladireccindevariable.

Paraaccederalcontenidodelavariableapuntada,debeutilizar*.Elsiguienteejemplomuestraelcontenidodememoriadependiendo
delaaccinrealizadapormediodelpuntero.

http://www.mikroe.com/chapters/view/80/capitulo2programaciondelosmicrocontroladores/ 18/37
11/10/2015 ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacinenCconejemplos

Lospunterossonmuytilesparamanejarlasmatrices.Enestecaso,unpunteroseutilizarparaapuntaralprimerelementodeuna
matriz.Debidoalhechodequeesposiblerealizaroperacionesbsicassobrelospunteros(aritmticadepunteros),esfcilmanejarlos
elementosdeunamatriz.

Fjeseenladiferenciaentre*v+1y*(v+1)enelsiguienteejemplo:

shortintvoltio[3]={0,5,10}
shortint*v
v=&(voltio[0])//vcontieneladireccindevoltio[0]
*(v+1)=2//voltio[1]=2
voltio[2]=*v+1//tab[2]=1(tab[0]+1)
*(v+2)=*(v+1)//voltio[2]=2
v++//vcontieneladireccindevoltio[1]
*v=1//voltio[1]=1

Lospunterostambinpuedenserdeclaradosconelprefijoconst.Enestecaso,suvalornopuedesermodificado
despusdelainicializacin,similaraunaconstante.
AdiferenciadeC,elmikroCnoadmitealojamientodinmico.

ESTRUCTURAS

Yahemosvistocmoagruparloselementosdentrodematrices.Noobstante,alutilizarestemtodotodosloselementosdebenserdel
mismotipo.Alutilizarestructuras,esposibleagrupardiferentestiposdevariablesbajoelmismonombre.Lasvariablesdentrodeuna
estructuraseledenominanlosmiembrosdelaestructura.Lasestructurasdedatossedeclaranalutilizarlasiguientesintaxis:

structnombre_de_estructura{
tipo1_de_miembro1miembro1
tipo2_de_miembro2miembro2
tipo3_de_miembro3miembro3
..
}

Noesposibleinicializarvariablesdentrodeladeclaracindelaestructuradedatos:

structgenerador{
intvoltaje
charcorriente
}

Entonces,podrdefinirlosobjetosdenominadosturbinaenelcdigo.Acadaunodeestostresobjetos(turbinas)seleasignanlas
variablescorrienteyvoltaje.

structgeneradoresturbina_1,turbina_2,turbina_3

Paraaccederalasvariables,esprecisoutilizareloperador'.'

turbina_3.voltaje=150
turbina_3.corriente=12

Porsupuesto,igualquealutilizarlospunteros,todavaselepermiterealizaroperacionespormediodeoperadoresysentenciasdefinidos
enlaspartesanteriores.

http://www.mikroe.com/chapters/view/80/capitulo2programaciondelosmicrocontroladores/ 19/37
11/10/2015 ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacinenCconejemplos
SiestfamiliarizadoconellenguajeC,recuerdequemikroCnoadmitelainicializacindelosmiembrosdeestructurapormediodelas
llaves.Porejemplo,conjunto_1={15,m}devuelveunerrorenmikroC.

2.8FUNCIONES
Unafuncinesunasubrutinaquecontieneunalistadesentenciasarealizar.Laideaprincipalesdividirunprogramaenvariaspartes
utilizandoestasfuncionespararesolverelproblemainicialconmsfacilidad.Adems,lasfuncionesnospermitenutilizarlasdestrezasy
elconocimientodeotrosprogramadores.Unafuncinseejecutacadavezquesellamedentrodeotrafuncin.EnC,unprograma
contienecomomnimounafuncin,lafuncinmain(),aunqueelnmerodefuncionesesnormalmentemayor.Alutilizarfuncionesel
cdigosehacemscortoyaqueesposiblellamarunafuncintantasvecescomosenecesite.EnC,elcdigonormalmenteconsisteen
muchasfunciones.Noobstante,encasodequesuprogramaseamuycortoysimple,puedeescribirtodaslassentenciasdentrodela
funcinprincipal.

FUNCINPRINCIPAL

Lafuncinprincipalmain()esunafuncinparticularpuestoqueeslaqueseejecutaaliniciarelprograma.Adems,elprogramatermina
unavezcompletadalaejecucindeestafuncin.Elcompiladorreconoceautomticamenteestafuncinynoesposiblellamarlaporotra
funcin.Lasintaxisdeestafuncineslasiguiente:

voidmain(void){

/*elprimer'void'significaquemainnodevuelveningnvalor.Elsegundo
'void'significaquenorecibeningnvalor.Notequeelcompilador
tambinadmitelasiguientesintaxis:'main()'o'voidmain()'o
'main(void)'*/

..

/*Introduzcasuprogramaaqu*/

.
}

Estosignificaquefesunafuncinquerecibeunnmerorealxcomoparmetroydevuelve2*xy.

LamismafuncinenCseparecealosiguiente:

floatf(floatx,floaty)//variablesflotantesxyysepuedenutilizarenf
{
floatr//declararrparaalmacenarelresultado
r=2*xy//almacenarelresultadodelclculoenr
returnr//devolverelvalorder
}

Cadafuncindebeserdeclaradaapropiadamenteparapoderinterpretarlacorrectamenteduranteelprocesodecompilacin.La
declaracincontienelossiguienteselementos:

Tipoderesultado(valordevuelto):tipodedatodelvalordevuelto
Nombredefuncin:esunidentificadorquehaceposiblellamaraunafuncin.
Declaracindeparmetrosseparecealadeclaracindevariableregular(porejemplo:floatx).Cadaparmetro
consisteenunavariable,constante,punteroomatriz,precedidosporlaetiquetadetipodedato.Seutilizanpara
pasarlainformacinalafuncinalllamarla.Losparmetrosdiferentesestndelimitadosporcomas.
Cuerpodefuncin:bloquedesentenciasdentrodellaves
Unafuncinseparecealosiguiente:

tipo_de_resultadonombre_de_funcin(tipoargumento1,tipoargumento2,...)
{
Sentencia
Sentencia
...
return...
}

Notequeunafuncinnonecesitaparmetros(funcinmain()porejemplo),perodebeestarentreparntesis.Encasocontrario,el
compiladormalinterpretaralafuncin.Parahacerlomsclaro,puedesustituirelespacioenblancoencerradoentreparntesisporla
palabraclavevoid:main(void).

VALORDEVUELTO

Unafuncinpuededevolverunvalor(estonoesobligatorio)pormediodelapalabraclavereturn.Alllegarareturn,lafuncinevalaun

http://www.mikroe.com/chapters/view/80/capitulo2programaciondelosmicrocontroladores/ 20/37
11/10/2015 ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacinenCconejemplos
valor(puedeserunaexpresin)ylodevuelvealalneadeprogramadesdelaquefuellamada.

returnr//Devolverelvalorcontenidoenr
return(2*xy)//Devolverelvalordelaexpresin2*xy

Unafuncinnopuededevolvermsdeunvalor,peropuededevolverunpunteroounaestructura.Tengacuidadoalutilizarmatricesy
punteros.Elsiguienteejemploesunerrortpico:

int*reverse(int*tab)//Estafuncindebedevolverunamatrizr
{//cuyocontenidoestenordeninversocon
//respectoalamatriztab
intr[DIM]//Declaracindeunanuevamatrizdenominadar
inti
for(i=0i<DIMi++)//Buclequecopiaelcontenidodetabenr
r[i]=tab[DIM1i]//alinvertirelorden

returnr//Devolverelvalorr
}

Enrealidad,elcompiladorreservamemoriaparaelalmacenamientodevariablesdelafuncinreverseslodurantesuejecucin.Unavez
completadalaejecucindereverse,lalocalidaddememoriaparalavariableioparalamatrizryanoestreservada.Estosignificaquela
direccinquecontienelosvaloresdeior[]estlibreparaintroducirdatosnuevos.Concretamente,lafuncindevuelvesloelvalor&r[0],
asquesloelprimerelementodelamatriztabseralmacenadoenlamemoria.Lasdemslocalidadesdememoria,talescomo&tab[1],
&tab[2],etc.sernconsideradasporelcompiladorcomoespaciosenblanco,osea,estarnlistaspararecibirlosnuevosvalores.

Paraescribirestafuncinesnecesariopasarlamatrizr[]comoparmetro(vealasubseccinPasarlosparmetros).

Lafuncinpuedecontenermsdeunasentenciareturn.Enestecaso,alejecutarlaprimerasentenciareturn,lafuncindevuelveelvalor
correspondienteysedetienelaejecucindelafuncin.

floatabs(floatx,floaty)//Devolverelvalorabsolutode2*xy
{
if((2*xy)>=0)
return(2*xy)
else
return(2*x+y)
}

Silafuncinnodevuelveningnvalor,lapalabravoiddebeserutilizadacomountipoderesultadoenladeclaracin.Enestecaso,la
sentenciareturnnodebeserseguidaporningunaexpresin.Puedeseromitidacomoenelsiguienteejemplo:

voidwait_1(unsignedinta)
{
cnt++//Incrementodeunavariableglobalcnt
Delay_ms(a)//EjecucindelafuncinDelay_ms
}//NotequeDelay_msnodevuelvenada

DECLARARPROTOTIPOSDEFUNCIONES

Parautilizarunafuncin,elcompiladordebeserconscientedesupresenciaenelprograma.EnlaprogramacinenC,losprogramadores
normalmenteprimeroescribenlafuncinmain()yluegolasfuncionesadicionales.Paraavisaralcompiladordelapresenciadelas
funcionesadicionales,serequieredeclararlosprototiposdefuncionesenelprincipiodeprogramaantesdelafuncinmain().Unprototipo
defuncinestcompuestopor:

tipoderesultado
nombredefuncin
tiposdeparmetros
unpuntoycoma()
Elprototipodelafuncinmainnonecesitaserdeclarado.

floatf(float,float)

/*noesobligatorioescribirlosnombresdelosparmetros.Esteprototipo
informaalcompilador:enelprogramaseutilizarlafuncinf,
queutilizadosparmetrosdetipofloatydevuelveelresultadodeltipo
float.*/

http://www.mikroe.com/chapters/view/80/capitulo2programaciondelosmicrocontroladores/ 21/37
11/10/2015 ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacinenCconejemplos
LLAMARUNAFUNCIN

Mientrasunafuncinesdefinidaysuprototipodeclarado,sepuedeutilizarenculquierpartedeprograma.Sinembargo,comolafuncin
maines'raiz'delprograma,nopuedeserllamadadeningunapartedeprograma.Paraejecutarunafuncin,esnecesarioescribirsu
nombreylosparmetrosasociados.Vealossiguientesejemplos:

floatresultado,a,b//resultado,a,b,timedebencoincidirconlostipos
//definidos
inttime=100//enladeclaracindelasfuncionesfywait_1
a=10.54
b=5.2
resultado=f(a,b)//Ejecutarlafuncinfpormediodelosparmetrosayb

//Elvalordevueltoseleasignaalavariableresultado
pausa_1(tiempo)//Ejecutarlafuncinpausa_1pormediodelavariabletiempo
funcinX()//EjecutarlafuncinfuncinX(sinparmetros)

Cuandosellamaunafuncin,elprogramasaltaalafuncinllamada,laejecuta,despusvuelvealalneadesdelaquefuellamada.

PASARLOSPARMETROS

Alllamarunafuncin,selepasanlosparmetros.EnCexistendosformasdiferentesparapasarparmetrosaunafuncin.

Elprimermtodo,denominadopasoporvalor,eselmsfcil.Enestecaso,losparmetrossepuedenconsiderarcomovariableslocales
delafuncin.Cuandosellamaunafuncin,elvalordecadaparmetrosecopiaaunnuevoespaciodememoriareservadodurantela
ejecucindelafuncin.Comolosparmetrosseconsiderancomovariableslocalesporelcompilador,susvalorespuedenser
modificadosdentrodelafuncin,perosusmodificacionesnosequedanenlamemoriaunavezcompletadalaejecucindelafuncin.

Tengaencuentadequelafuncindevuelveunvalor,ynounavariable.Adems,secreancopiasdelosvaloresdelosparmetros,porlo
quesusnombresenlafuncinfpuedenserdiferentesdelosparmetrosutilizadosenlamain().Lamayordesventajadelpasoporel
valoresquelanicainteraccinqueunafuncintieneconelrestodelprogramaeselvalordevueltodeunsoloresultado(ola
modificacindelasvariablesglobales).

Elotromtodo,denominado'pasopordireccin'lepermitesobrepasaresteproblema.Envezdeenviarelvalordeunavariablealllamara
funcin,sedebeenviarladireccindememoriadelvalor.Entonces,lafuncinllamadasercapazdemodificarelcontenidodeesta
localidaddememoria.

//Funcin'sort'ordenalosmiembrosdelamatrizporvalorascendente
//ydevuelveelmiembroconmximovalor

intsort(int*)//Prototipodefuncin
constSIZE=5//Nmerodemiembrosaordenar

voidmain(){
intmaximum,input[SIZE]={5,10,3,12,0}//Declaracindevariablesenlamatriz
maximum=sort(input)//Llamarafuncinyasignarleelmximo
//valoralavariablemaximum
}

intsort(int*sequence){
inti,temp,permut//Declaracindevariables
permut=1//Banderadebitindicaquesehahechounapermutacin

while(permut!=0){//Quedarseenelbuclehastareinicarlabandera
permut=0//Banderareiniciada
for(i=0i<SIZE1i++){//Compararyoredenarlosmiembrosdela
//matriz(dosados)
if(sequence[i]>sequence[i+1]){
temp=sequence[i]
sequence[i]=sequence[i+1]
sequence[i+1]=temp
permut=1//Sehahechounapermutacin,banderadebit
//seponeauno
}
}
}

returnsequence[SIZE1]//Devolverelvalordelltimomiembro

}//queesalmismotiempoelmiembroconelmximovalor

http://www.mikroe.com/chapters/view/80/capitulo2programaciondelosmicrocontroladores/ 22/37
11/10/2015 ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacinenCconejemplos
Enesteejemplo,pormediodeunafuncinserealizandosoperaciones:ordenalosmiembrosdelamatrizporvalorasdendentey
devuelveelmximovalor.

Parautilizarunamatrizenunafuncinesnecesarioasignarladireccinalamatriz(oasuprimermiembro).Veaelsiguienteejemplo:

floatmtodo_1(int[])//DeclaracindeprototipodelafuncinMtodo_1
floatmtodo_2(int*)//DeclaracindeprototipodelafuncinMtodo_2

constNMERO_DE_MEDICIONES=7//Nmerodelosmiembrosdelamatriz

voidmain()
{
doublepromedio1,promedio2//Declaracindelasvariablespromedio1
//ypromedio2
intvoltaje[NMERO_DE_MEDICIONES]={7,8,3,5,6,1,9}//Declaracindela
//matrizvoltaje
promedio1=mtodo_1(&voltaje[0])//Parmetrodelafuncinesladireccin
//delprimermiembro
promedio2=mtodo_2(voltaje)//Parmetrodelafuncinesladireccinde
//lamatriz
}

//
floatmtodo_1(intvoltaje[])//Iniciodelafuncinmtodo_1
{
inti,suma//Declaracindelasvariableslocalesiysuma

for(i=0i<NMERO_DE_MEDICIONESi++)//Clculodelvalorpromediodevoltaje
suma+=voltaje[i]//Esposibleutilizar*(voltaje+i)envezdevoltaje[i]

return(suma/NMERO_DE_MEDICIONES)
}

//
floatmtodo_2(int*voltaje)//Iniciodelafuncinmtodo_2
{
inti,suma//Declaracindelasvariableslocalesiysuma

for(i=0i<NMERO_DE_MEDICIONESi++)//Clculodelvalorpromediodevoltaje
suma+=*(voltaje+i)//Esposibleutilizarvoltaje[i]envezde*(voltaje+i)

return(suma/NMERO_DE_MEDICIONES)
}

Lasfunciones'mtodo_1'y'mtodo_2'soncompletamenteequivalentes.Lasdosdevuelvenelvalorpromediodelamatriz'voltaje[]'.
Despusdedeclararla,ladireccindelprimermiembrosepuedeescribircomo'voltaje'o'&voltaje[0]'.

2.9CARACTERSTICASPRINCIPALESDELPREPROCESADOR

Elpreprocesadoresunprogramaqueprocesaelcdigoantesdequepaseporelcompilador.Funcionabajoelcontroldelaslneasde
comandodelpreprocesadordenominadasdirectivas.Lasdirectivasdelpreprocesadorsecolocanenelcdigofuente,normalmenteenel
principiodelarchivo.Antesdepasarporelcompilador,elcdigofuenteseexaminaporelpreprocesadorquedetectayejecutatodaslas
directivasdelpreprocesador.Lasdirectivasdelpreprocesadorsiguenaunaregladelasintaxisespecial,empiezanporunsmbolo#yno
requierenningnpuntoycomaalfinal().

DIRECTIVASDELPREPROCESADOR

Lasiguientetablacontieneunconjuntodedirectivasdelpreprocesadorfrecuentementeutilizadas:

Lasdirectivasdelpreprocesadorsepuedendividirentrescategoras:

DIRECT IVAS F UNCIO NES

#include Defineunasustitucindemacro

#undef Quitaunadefinicindenombredemacro

#define Especificaunarchivoaserincluido

#ifdef Pruebaparadefinicindemacro

#endif Especificarelfinalde#if

#ifndef Pruebasiunamacronoestdefinida

#if Pruebalascondicionesdecompilar

http://www.mikroe.com/chapters/view/80/capitulo2programaciondelosmicrocontroladores/ 23/37
11/10/2015 ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacinenCconejemplos
#else Especificaalternativascuandolapruebade#iffalla

#elif Especificaalternativascuandomsdedoscondicionessenecesitan

Definicionesdemacro
Inclusionesdearchivos
Controldecompilacin
Ahora,vamosapresentarslolasdirectivasdelpreprocesadorutilizadasconmsfrecuencia.Sinembargo,noesnecesariosabertodas
ellasparaprogramarmicrocontroladores.Slotengaencuentaqueelpreprocesadoresunaherramientamuypoderosaparalos
programadoresavanzadosenC,especialmenteparaelcontroldecompilacin.

DIRECTIVASDELPREPROCESADORPARADEFINIRMACROS

Pormediodelosmacrosesposibledefinirlasconstantesyejecutarfuncionesbsicas.Unasustitucindemacroesunprocesoenelque
unidentificadordelprogramasesustituyeporunacadenapredefinida.Elpreprocesadorsustituyecadaocurrenciadelidentificadorenel
cdigofuenteporunacadena.Despusdelasustitucin,elcdigosercompiladonormalmente.

EstosignificaqueelcdigosustituidodeberespetarlasintaxisdelmikroC.Laaccinserealizapormediodeladirectiva'#define'.

#definePI3.14159//Sustitucinsimple,PIsersustituidopor
//elvalor3.14159entodaslaspartesdelprograma

Tambinpuedeutilizarlosparmetrospararealizarsubstitucionesmscomplejas:

#defineVOLUMEN(D,H)(((D/2)*(D/2)*PI))*H//Macroconparmetros

Entonces,enelcdigo,lasiguientesentencia:

Tanque_1=VOLUMEN(Dimetro,altura)

sersustituidapor:

Tanque_1=(((Dimetro/2)*(Dimetro/2)*PI)*altura

Pormediodeladirectiva#undefesposiblequitarunadefinicindenombredemacro.Asseespecificaquelasubstitucinqueseha
definidoanteriormenteyanovaocurrirenelsiguientecdigo.Estoestilcuandoustedquiererestringirladefinicinsloaunaparte
particulardelprograma.

#undefTANQUE//QuitarladefinicindelmacroVOLUMEN

INCLUSINDEARCHIVOS

Ladirectivadepreprocesador#includecopiaunarchivoespecficoenelcdigofuente.ElcdigoincluidodebeobservarlasintaxisdeC
parasercompiladocorrectamente.

Haydosformasdeescribirestasdirectivas.Enelprimerejemplo,sloelnombredearchivoseespecifica,asqueelpreprocesadorlo
buscardentrodelarchivoinclude.Enelsegundoejemplo,seespecificalarutaentera,asqueelarchivoestardirectamenteincluido
(estemtodoesmsrpido).

#include<nombre_de_archivo>//Seespecificasloelnombredelarchivo
#include"C:\Ruta\nombre_de_archivo.h"//Seespecificalalocalidad
//exactadelarchivo

2.10MIKROCPROFORPIC

Comoyahemosvisto,hayvariasdivergenciasentreloslenguajesmikroCyANSIC.Enestecaptulovamosapresentarlascaractersticas
especficasdelmikroCconelpropsitodefacilitarlaprogramacindelosmicrocontroladoresPIC.

ACCESOALOSREGISTROSDEFUNCIONESESPECIALES(SFR)

Comotodoslosmicrocontroladores,losdefamiliaPICtienenlosregistrosdefuncionesespeciales(SFR).ParaprogramarunPIC,es
necesarioaccederaestosregistros(paraleerlosoescribirenellos).AlutilizarelcompiladormikroCPROforPICesposibledeaccedera
cualquierSFRdelmicrocontroladordecualquierpartedelcdigo(losSFRseconsiderancomovariablesglobales)sinnecesidadde
declararloanteriormente.Losregistrosdefuncionesespecialessedefinenenunarchivoexternoeincluidodentrodelcompilador(archivo
.def).EstearchivocontienetodoslosSFRdelmicrocontroladorPICaprogramar.

TRISB=0//todoslospinesdelpuertoPORTBseconfigurancomosalidas
PORTB=0//todoslospinesdelPORTBseponena0

http://www.mikroe.com/chapters/view/80/capitulo2programaciondelosmicrocontroladores/ 24/37
11/10/2015 ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacinenCconejemplos

ACCESOALOSBITSINDIVIDUALES

ElcompiladormikroCPROforPIClepermiteaccederalosbitsindividualesdevariablesde8bitsporsunombreosuposicinenbyte:

INTCON.B0=0//Ponera0elbit0delregistroINTCON
ADCON0.F5=1//Ponera1elbit5delregistoADCON0
INTCON.GIE=0//Ponera0elbitdeinterrupcinglobal(GIE)

Paraaccederaunbitindividual,sepuedeutilizar'.FX'ascomo'.BX'(Xesunenteroentre0y7querepresentalaposicindebit).

TIPOSBIT

SiquieredeclararunavariablequecorrespondeaunbitdeunSFR,hayqueutilizareltiposbit.Unavariabledetiposbitsecomporta
comounpunteroysedebedeclararcomounavariableglobal:

sbitBotn_PARADAatPORTA.B7//Botn_PARADAestdefinido
...
voidmain(){//CualquiermodificacindeBotn_PARADAafectaraPORTA.B7
...//CualquiermodificacindePORTA.B7afectaraBotn_PARADA
}

Enesteejemplo,ElBotn_PARADAesunavariabledeclaradaporelusuario,mientrasquePORTA.B7(bit7delpuertoPORTA)ser
automticamentereconocidoporelcompilador.

TIPOBIT

ElcompiladormikroCPROforPICproporcionauntipodedatosbitquesepuedeutilizarparadeclararvariables.Nosepuedeutilizaren
laslistasdeargumentos,punterosylosvaloresdevueltosdefunciones.Adems,noesposibledeclarareinicializarunavariabledetipo
bitenlamismalnea.Elcompiladordeterminaelbitenunodelosregistrosdisponiblesparaalmacenarlasvariables.

bitbf//Variabledetipobitvlida
bit*ptr//Varibaledetipobitinvlida.
//Nohaypunterosaunavariabledetipobit
bitbg=0//ERRORdeclaracinconinicializacinnoestpermitida
bitbg
bg=0//Declaracineinicializacinvlidas

INSERTARCDIGOASMENC

AveceselprocesodeescribirunprogramaenCrequierelaspartesdelcdigoescritasenensamblador.Estopermiteejecutarlaspartes
complicadasdelprogramadeunaformadefinidaconprecisinenunperododetiempoexacto.Porejemplo,cuandosenecesitaquelos
pulsosmuycortos(deunosmicrosegundos)aparezcanperidicamenteenunpindelmicrocontrolador.Entalescasoslasolucinms
simpleserautilizarelcdigoensambladorenlapartedelprogramaquecontrolaladuracindepulsos.

UnaomsinstruccionesenensambladorestninsertadasenelprogramaescritoenC,utilizandoelcomandoasm:

asm
{
instruccionesenensamblador

http://www.mikroe.com/chapters/view/80/capitulo2programaciondelosmicrocontroladores/ 25/37
11/10/2015 ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacinenCconejemplos
...
}

LoscdigosescritosenensambladorpuedenutilizarconstantesyvariablesanteriormentedefinidosenC.Porsupuesto,comoelprograma
enteroestescritoenC,susreglasseaplicanaldeclararestasconstantesyvariables.

unsignedcharmaximum=100//Declararvariables:maximum=100
asm
{//Iniciodelcdigoensamblador
MOVFmaximum,W//W=maximum=100
...
}//Finaldelcdigoensamblador

FUNCINDEINTERRUPCIN

Unainterrupcindetienelaejecucinnormaldeunprogramaparaejecutarlasoperacionesespecficas.Unalistadesentenciasaejecutar
debeestarescritadentrodeunafuncinparticulardenominadainterrupt().LasintaxisdeunainterrupcinenmikroCseparecealo
siguiente:

voidinterrupt(){
cnt++//Alproducirseunainterrupcin
//lacntseincrementaen1
PIR1.TMR1IF=0//Ponera0elbitTMR1IF
}

Adiferenciadelasfuncionesestndar,noesnecesariodeclararelprototipodelafuncininterrupt().Adems,comolaejecucindeesta
funcinnoformapartedelaejecucindeprogramaregular,nosedebellamardeningunapartedeprograma(seejecutar
automticamentedependiendodelascondicionesqueelusuariohadefinidoenelprograma).Enelsiguientecaptulovamosadaruna
claraexplicacindelaejecucinydefinicindesubrutinasdeinterrupcin.

LIBRERAS

Ustedprobablementehanotadoqueenlosejemplosanterioreshemosutilizadoalgunasfuncionescomoson'Delay_ms','LCD_out',
'LCD_cmd'etc.EstasfuncionesestndefinidasenlaslibrerascontenidasenelcompiladormikroC.

Unalibrerarepresentauncdigocompilado,anteriormenteescritoenmikroC,quecontieneunconjuntodevariablesyfunciones.Cada
libreratieneunpropsitoespecfico.Porejemplo,lalibreraLCDcontienefuncionesdevisualizacindelapantallaLCD,mientrasque
C_mathproporcionaalgunasfuncionesmatemticas.

Antesdeutilizaralgunadeellasenelprograma,esnecesariocomunicrseloalcompiladoralmarcarlasenlalistadelaslibrerasdel
compiladorexistentes.Sielcompiladorencuentraunafuncindesconocidadurantelaejecucindeprograma,primerovaabuscarsu
declaracinenlaslibrerasmarcadas.

Apartedelaslibrerasexistentes,esposiblecrearlaslibrerasyluegoutilizarlasenelprograma.Elprocedimientodecmocrearlibreras
sedescribeendetallesenHelp(Ayuda)delcompilador.

ElcompiladormikroCincluyetrestiposdelibreras:

librerasANSICestndar:

LIBRARA DESCRIPCI N

ANSICCtypeLibrary Utilizadaprincipalmenteparaprobaroparaconvertirlosdatos

ANSICMathLibrary Utilizadaparalasoperacionesmatemticasdepuntoflotante

ANSICStdlibLibrary Contienelasfuncionesdelibrerasestndar

ANSICStringLibrary Utilizadapararealizarlasoperacionesdecadenasydemanipulacindememoria

librerasmiscelneas:

http://www.mikroe.com/chapters/view/80/capitulo2programaciondelosmicrocontroladores/ 26/37
11/10/2015 ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacinenCconejemplos

LIBRARA DESCRIPCI N

ButtonLibrary Utilizadaparadesarrollarlosproyectos

ConversionLibrary Utilizadaparalaconversindetiposdedatos

SprintLibrary Utilizadaparaformatearlosdatosconfacilidad

PrintOutLibrary Utilizadaparaformatearlosdatoseimprimirlos

TimeLibrary Utilizadaparaclculosdetiempo(formatoUNIXtime)

TrigonometryLibrary Utilizadaparalaimplementacindefuncionestrigonomtricasfundamentales

SetjmpLibrary Utilizadaparalossaltosdeprograma

librerasparaelhardware:

LIBRARA DESCRIPCI N

ADCLibrary UtilizadaparaelfuncionamientodelconvertidorA/D

CANLibrary UtilizadaparalasoperacionesconelmduloCAN

CANSPILibrary UtilizadaparalasoperacionesconelmduloCANexterno(MCP2515oMCP2510)

CompactFlashLibrary UtilizadaparalasoperacionesconlastarjetasdememoriaCompactFlash

EEPROMLibrary UtilizadaparalasoperacionesconlamemoriaEEPROMincorporada

EthernetPIC18FxxJ60Library UtilizadaparalasoperacionesconelmduloEthernetincorporado

FlashMemoryLibrary UtilizadaparalasoperacionesconlamemoriaFlashincorporada

GraphicLcdLibrary UtilizadaparalasoperacionesconelmduloLCDgrficoconresolucin128x64

I2CLibrary UtilizadaparalasoperacionesconelmdulodecomunicacinserialI2Cincorporado

KeypadLibrary Utilizadaparalasoperacionesconelteclado(botonesdepresin4x4)

LcdLibrary UtilizadaparalasoperacionesconelLCD(de2x16caracteres)

ManchesterCodeLibrary UtilizadaparalacomunicacinutilizandoelcdigoManchester

MultiMediaCardLibrary UtilizadaparalasoperacionesconlastarjetasmultimediaMMCflash

OneWireLibrary UtilizadaparalasoperacionesconloscircuitosutilizandolacomunicacinserialOneWire

PortExpanderLibrary UtilizadaparalasoperacionesconelextensordepuertosMCP23S17

PS/2Library UtilizadaparalasoperacionesconeltecladoestndarPS/2

PWMLibrary UtilizadaparalasoperacionesconelmduloPWMincorporado

RS485Library UtilizadaparalasoperacionesconlosmdulosutilizandolacomunicacinserialRS485

SoftwareI2CLibrary UtilizadaparasimularlacomunicacinI2Cconsoftware

SoftwareSPILibrary UtilizadaparasimularlacomunicacinSPIconsoftware

SoftwareUARTLibrary UtilizadaparasimularlacomunicacinUARTconsoftware

SoundLibrary Utilizadaparagenerarlassealesdeaudio

SPILibrary UtilizadaparalasoperacionesconelmduloSPIincorporado

SPIEthernetLibrary UtilizadaparalacomunicacinSPIconelmduloETHERNET(ENC28J60)

SPIGraphicLcdLibrary UtilizadaparalacomunicacinSPIde4bitsconelLCDgrfico

SPILCDLibrary UtilizadaparalacomunicacinSPIde4bitsconelLCD(de2x16caracteres)

SPILcd8Library UtilizadaparalacomunicacinSPIde8bitsconelLCD

SPIT6963CGraphicLcdLibrary UtilizadaparalacomunicacinSPIconelLCDgrfico

UARTLibrary UtilizadaparalasoperacionesconelmduloUARTincorporado

USBHidLibrary UtilizadaparalasoperacionesconelmduloUSBincorporado

2.11PROGRAMARLOSPICUTILIZANDOMIKROCPROFORPIC

EnlasseccionesanterioreshemospresentadoellenguajemikroC,especialmentediseadoparaprogramarlosPIC.Ahora,loquehemos
revisadoessuficienteparaempezaraprogramar,eshoradepresentarelsoftwarequeutilizarparadesarrollaryeditarlosproyectos.
EstesoftwareseledenominaEntornodedesarrollointegrado(IntegratedDevelopementEnvironmentIDE)eincluyetodaslas
herramientasnecesariasparadesarrollarlosproyectos(editor,depuradoretc.).Porextensin,IDEesavecesllamadocompilador.Enesta
seccinleensearemoslobsicoquedebesaberparaempezaradesarrollarsuprimerproyectoenmikroCutilizandoelIDEdel
compiladormikroCPROforPIC.

ApartedetodaslascaractersticascomunesdecualquierIDE,mikroCPROforPICcontienelasinformacionesdearquitecturadelos
microcontroladoresPIC(registros,mdulosdememoria,funcionamientodecircuitosparticularesetc.)paracompilarygenerarunarchivo
legibleporunmicrocontroladorPIC.Adems,incluyelasherramientasespecficasparaprogramarlosmicrocontroladoresPIC.

Elprocesodecrearyejecutarunproyectocontienelossiguientespasos:

1. Crearunproyecto(nombredeproyecto,configuracindeproyecto,dependenciasentrearchivos)
2. Editarunprograma
3. Compilarelprogramaycorreccindeerrores
4. Depurar(ejecutarelprogramapasoapasoparaasegurarsedequeseejecutanlasoperacionesdeseadas).

http://www.mikroe.com/chapters/view/80/capitulo2programaciondelosmicrocontroladores/ 27/37
11/10/2015 ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacinenCconejemplos
5. Programarunmicrocontrolador(cargarelarchivo.hexgeneradoporelcompiladorenelmicrocontrolador
utilizandoelprogramadorPICflash).

INSTALARMIKROCPROFORPIC

Antesquenada,usteddebeinstalarelcompilador(consuIDE)enlaPC.LainstalacindelmikroCPROforPICessimilaralainstalacin
decualquierprogramaenWindows.Todoelprocedimientosellevaacabopormediodeloswizards(asistentesdeinstalacin):

BastaconseguirlasinstruccionesypulsarsobreNext,OK,Next,Next...Engeneral,eselmismoprocedimientomenoslaltimaopcin:'Do
youwanttoinstallPICFLASHv7.11programmer?'.Paraqusirveestesoftware?Deesovamosahablarmstarde.Porahora,bastacon
saberqueesunsoftwareautnomoutilizadoparacargarelprogramaenelmicrocontrolador.

Unavezms:Next,OK,Next,Next...

UnavezcompletadalainstalacindelPICflash,elsistemaoperativolepreguntarainstalarotroprogramasimilar,unsoftwarepara
programarungrupoespecialdelosmicrocontroladoresPICquefuncionanenmododebajoconsumo(3.3V).Salteestepaso...

Elltimopasolainstalacindelcontrolador(driver)!

PulsesobreYes.

Uncontroladoresunprogramaquepermitealsistemaoperativocomunicarconunperifrico.Enestecaso,estedispositivoesel
programador(hardware)delsistemadedesarrollo.

http://www.mikroe.com/chapters/view/80/capitulo2programaciondelosmicrocontroladores/ 28/37
11/10/2015 ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacinenCconejemplos

Elcontroladorainstalardependedelsistemaoperativoutilizado.SeleccioneelcontroladorcorrespondientealSO(sistemaoperativo)
utilizado(pormediodeabrirlacarpetacorrespondiente)einicielainstalacin.Otravez,Next,OK,Next,Next...Bueno,todoestinstalado
parainiciaraprogramar!

CARACTERSTICASPRINCIPALESDELMIKROCPROFORPIC

AliniciarelIDEdelcompiladormikroCPROforPICporprimeravez,aparecerunaventanacomosemuestraacontinuacin:

http://www.mikroe.com/chapters/view/80/capitulo2programaciondelosmicrocontroladores/ 29/37
11/10/2015 ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacinenCconejemplos

Desgraciadamente,unadescripcindetalladadetodaslasopcionesdisponiblesdeesteIDEnostomaramuchotiempo.Poresovamosa
describirslolomsimportantedelcompiladormikroCPROforPIC.Detodosmodos,paraobtenermsinformacionpresioneelbotnde
Ayuda(Help)[F1].

MANEJARLOSPROYECTOS

Antesdeempezaraescribirelcdigo,usteddebecrearunproyecto.UnprogramaescritoenelcompiladormikroCPROforPICnoesun
archivofuenteautnomo,sinoqueformapartedeunproyectoqueincluyeuncdigohex,uncdigoensamblador,cabecerayotros
archivos.Algunosdeellosserequierenparacompilarelprograma,mientrasqueotrossecreanduranteelprocesodecompilacin.Un
archivoconextensin.mcppilepermiteabrircualquieradeestosproyectos.

Paracrearunproyecto,bastaconseleccionarlaopcinProject/NewProject,yunwizardaparecerautomticamente.Quhacer
entonces?Sigalasinstrucciones...

PROJECTMANAGER(ADMINISTRADORDELPROYECTO)

Unavezcreadoelproyecto,esposiblemanejartodoslosarchivosquecontienealutilizarlaventanaProjectManager.Bastaconpulsar
conelbotnderechodelratnsobreunacarpetayseleccionarlaopcinquenecesitaparasuproyecto.

PROJECTSETTINGS(CONFIGURACINDEPROYECTOS)

Alcompilarunproyecto,elcompiladorgeneraelarchivo.hexquesecargarenelmicrocontrolador.Estosarchivosserndiferentesloque
dependedeltipodelmicrocontroladorascomodelpropsitodelacompilacin.Porestaraznesnecesarioajustaralgunosparmetros
deproyectosutilizandolaventanaProjectSettings.

http://www.mikroe.com/chapters/view/80/capitulo2programaciondelosmicrocontroladores/ 30/37
11/10/2015 ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacinenCconejemplos

Device (dispositivo):
Alseleccionareltipodemicrocontroladorautilizarpermitealcompiladorextraerelarchivodedefinicin(archivo.def)asociado.Elarchivo
dedefinicindeunmicrocontroladorcontienelasinformacionesespecficasdesusregistrosSFR,desusdireccionesdememoriay
algunasvariablesdeprogramacinespecficasaesetipodelmicrocontrolador.Esobligatoriocrearunarchivo.hexcompatible.

Oscillator (oscilador):
Sedebeespecificarlavelocidaddeoperacindelmicrocontrolador.Porsupuesto,estevalordependedelosciladorutilizado.El
compiladorlanecesitaparacompilarrutinas,loquerequiereinformacindeltiempo(porejemplo,lafuncinDelay_ms).Mstarde,el
programadornecesitarestainformacintambin.Lavelocidaddeoperacinseconfigurademodoquepermitaalosciladorinternodel
microcontroladorfuncionaraunafrecuenciaseleccionada.

Build/Debugger Type:
Todoelprocesodecompilar(building)estcompuestoporanlisissintctico(parsing),compilar,enlazar(linking)ygenerarlosarchivos
.hex.Eltipodecompilacinlepermiteajustarelmododecompilacin.Dependiendodelmodoseleccionado,difierenlosarchivos
generadosacargarenelmicrocontrolador.

Release:Alelegirestaopcin,elcompiladornopuedeafectarmsalaejecucindeprogramadespusdelacompilacin.Elprogramaa
cargarenelmicrocontroladornosermodificadodeningunamanera.

ICDdebug:Alelegirestaopcin,unavezcompletadoelprocesodelacompilacinycargadoelprogramaenlamemoriadel
microcontrolador,elcompiladorsequedaconectadoalmicrocontroladorpormediodelcableUSByelprogramador,ytodavapuede
afectarasufuncionamiento.Elarchivo.hexgeneradocontienelosdatosadicionalesquepermitenelfuncionamientodeldepurador.Una
herramientadenominadamikroICD(DepuradorencircuitoInCircuitDebugger)permiteejecutarelprogramapasoapasoyproporcionar
unaccesoalcontenidoactualdetodoslosregistrosdeunmicrocontroladorreal.

Elsimuladornoutilizalosdispositivosrealesparasimularelfuncionamientodelmicrocontrolador,asquealgunasoperacionesnopueden
serreproducidas(porejemplo,interrupcin).Detodosmodos,resultamsrpidodepurarunprogramapormediodeunsimulador.
Adems,noserequiereningndispositivodestino.

Notequeesposiblemodificarcualquierconfiguracinencualquiermomentomientrasseeditaelprograma.Noseolvidederecompilary
reprogramarsudispositivodespusdemodificarunaconfiguracin.

LIBRARYMANAGING(EDITORDELIBRERAS)

ElcompiladortienequeconocertodaslasdependenciasdesuarchivofuenteenmikroCparacompilarloapropiadamente.Porejemplo,si
laslibrerasformanpartedesuproyecto,debeespecificarculesdeellasseutilizan.

Laslibrerascontienenungrannmerodefuncioneslistasparaserutilizadas.LaslibrerasenmikroCproporcionanmuchasfacilidades
paraescribirprogramasparalosmicrocontroladoresPIC.AbralaventanaLibraryManager,ymarquelasquequiereutilizarenel
programa.Almarcarunalibrera,seaadeautomticamentealproyectoyseenlazaduranteelprocesodelacompilacin.As,nonecesita
incluirlaslibrerasmanualmenteensusarchivosdelcdigofuentepormediodeladirectivadelpreprocesador#include.

http://www.mikroe.com/chapters/view/80/capitulo2programaciondelosmicrocontroladores/ 31/37
11/10/2015 ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacinenCconejemplos
Porejemplo,sisuprogramautilizaunLCDnohacefaltaescribirnuevasfuncionesyaquealseleccionarlalibreraLcd,ustedpodrutilizar
funcioneslistasparaserutilizadasdelalibreraLCD(Lcd_Cmd,LCD_Init...)ensuprograma.Siestalibreranoestseleccionadaenla
ventanaLibraryManager,cadavezqueintenteutilizarunafuncindelalibreraLCD,elcompiladorleinformardeunerror.Una
descripcindecadalibreraestdisponiblealpulsarconelbotnderechodelratnsobresunombreyseleccionarlaopcinHelp.

EDITARYCOMPILARPROGRAMAS

CODEEDITOR(EDITORDECDIGO)

ElprocesodeeditarprogramassedeberealizardentrodelaventanaprincipaldelIDEdenominadaCodeEditor.Alescribirelprograma
noseolvidedeloscomentarios.Loscomentariossonmuyimportantesparadepurarymejorarelprograma.Adems,aunqueel
compiladornotengalasrestriccionesdeformateo,siempredebeseguiralasmismasreglasdeeditar(comoenlosejemplos
proporcionadosenestelibro).Comonohaylimitacionesdetamao,novacileenutilizarlosespaciosenblancoparahacersucdigoms
legible.

Alescribirunprograma,noesperequeterminelaredaccindelprogramaparacompilarlo.Compilesucdigodeformaregularconel
propsitodecorregircuntomserroresdesintaxis.Asimismoustedpuedecompilarsuprogramacadavezquesecompletelaredaccin
deunanuevafuncinascomoprobarsucomportamientoalutilizarmododedepuracin(verlaprximaseccin).Deestemodo,resulta
msfcilsolucionarloserroresdeprogramaparanotomaruncaminoerrneoenredactarsuprograma.Delocontrario,ustedtendr
queeditarelprogramaentero.

CODEEXPLORER(EXPLORADORDELCDIGO)

LaventanaCodeExplorerlepermitelocalizarfuncionesyprocedimientosdentrodelosprogramaslargos.Porejemplo,siustedbuscauna
funcinutilizadaenelprograma,bastaconpulsardosvecessobresunombreenestaventana,yelcursorestarautomticamente
posicionadoenlalneaapropiadaenelprograma.

COMPILARYSOLUCIONARLOSERRORES

Paracompilarsucdigo,pulsesobrelaopcinBuildenelmenProject.Enrealidad,elproyectoenterosehacompilado,ysila
compilacinseharealizadoconxito,segenerarnlosarchivosdesalida(asm,.hexetc.).Unacompilacinseharealizadoconxitosi
nosehaencontradoningnerror.Duranteelprocesodecompilacinsegeneranmuchosmensajesquesevisualizanenlaventana
Messages.Estosmensajesconsisteneninformacin,advertenciayerrores.Cadaerrorencontradoseasociaconsulneadeprogramay
sudescripcin.

Comounerrorensucdigopuedegenerarmuchomserrores,simplementedebeintentarsolucionarelprimererrorenlalistaydespus
recompilesuprograma.Enotraspalabras,esrecomendablesolucionarloserroresunoauno.

Enelejemploanteriorhaydoserroresyunaadvertencia:faltanunpuntoycomayunadeclaracindevariableLaadvertencialeinforma
quefaltaeltipodelvalordevueltodelafuncinmain.

LacompilacinlepermitecorregirsuprogramapormediodesolucionartodosloserroresenmikroC.Cuandotodosloserroresse
solucionen,suprogramaestlistoparasercargadoenelmicrocontrolador.Detodasformas,sutareatodavanoestterminada,porque
annosabesisuprogramasecomportacomoseesperabaono.

DEPURARELPROGRAMA

Ladepuracinesunpasomuyimportanteyaquepermiteprobarelprogramadespusdeunacompilacinrealizadaconxito,o
solucionarloserroresdescubiertosmientrasseejecutaelprograma.Comoyahemosvisto,haydosmodosdedepurar:undepurador
softwarequesimulaelfuncionamientodelmicrocontrolador(modopordefecto)ydepuradorhardware(mikroICD)queleedirectamenteel

http://www.mikroe.com/chapters/view/80/capitulo2programaciondelosmicrocontroladores/ 32/37
11/10/2015 ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacinenCconejemplos
contenidodelamemoriadelmicrocontrolador.Elprocedimientodedepuracineselmismosinrepararenelmodoelegido.Encasode
elegirlaopcinICDdebug,hayquecargarelprogramaenelmicrocontroladorantesdedepurarlo.

Parainiciarladepuracin,pulsesobrelaopcinStartdebuggerdelmenRun.Eleditordelcdigoserligeramentemodificado
automticamenteyaparecerunaventanadenominadaWatchValues.Elprincipiodedepuracinsebasaenejecutarelprogramapasoa
pasoymonitorearelcontenidodelosregistrosylosvaloresdelasvariables.Deestemodo,esposiblecomprobarelresultadodeun
clculoyversialgoinesperadohaocurrido.Alejecutarelprogramapasoapaso,podrlocalizarlosproblemasconfacilidad.

Duranteunadepuracinelprogramasermodificado,porloqueustedsiempredeberecompilarelprogramadespusdecadacorreccin,
yreiniciareldepuradorparacomprobarquhasidomodificado.

COMANDOSDELDEPURADOR

Hayvarioscomandosdisponiblesparadepurarelcdigo:

StepIntoEjecutaunasolainstruccin.Cuandolainstruccinesunallamadaaunarutina,eldepuradorharun
saltoalarutinaysedetendrdespusdeejecutarlaprimerainstruccindentrodelarutina.
StepOverSeejecutaunasolainstruccin.Cuandolainstruccinesunallamadaaunarutina,eldepuradornohar
unsaltoalarutina,sinoqueseejecutartodalarutina.Eldepuradorsedetienealaprimerainstruccindespusdela
llamadaalarutina.
RunToCursorElprogramaseejecutahastalalneaenlaqueseencuentreelcursor.
StepoutSeejecutanlasdemsinstruccionesdentrodelarutina.Eldepuradorsedetieneinmediatamentealsalirde
larutina.

PUNTOSDERUPTURA(BREAKPOINTS)

Lospuntosderupturahacenelprocesodedepurarlosprogramasdeunamaneramseficiente,puestoquepermitenejecutarelprograma
atodavelocidadydetenerloautomticamenteenunalneaespecfica(puntoderuptura).Esoresultamuytil,permitindolecomprobar
slolaspartescrticasdelprogramaynoperdereltiempoprobandotodoelprogramalneaalnea.Paraaadiroquitarunpuntode
rupturabastaconpulsarsobrelalneaapropiadaenelladoizquierdodeleditordelcdigo,opresionar[F5].Unapequeaventana
denominadaBreakpointsmuestradndeestnlospuntosderuptura.Notequelaslneasdesignadascomopuntosderupturaestn
marcadasenrojo.

Lalneaqueseestejecutandoactualmenteestmarcadaenazul.Esposibleleerelcontenidoderegistrosyvariablesseleccionadosen
laventanaWatchValuesencualquiermomento.Paraejecutarlapartedeprogramadesdelalneaenlaqueestelcursorhastaelpunto
deruptura,utiliceelcomandoRun/PauseDebugger.

VENTANAWATCHVALUES

Eldepuradorsoftwareyhardwaretienenlamismafuncindemonitorearelestadodelosregistrosdurantelaejecucindelprograma.La
diferenciaesqueeldepuradorsoftwaresimulaejecucindeprogramaenunaPC,mientrasqueeldepuradorICD(depuradorhardware)
utilizaunmicrocontroladorreal.Cualquiercambiodeestadolgicodelospinesseindicaenelregistro(puerto)apropiado.Comola
ventanaWatchValuespermitemonitorearelestadodetodoslosregistros,resultafcilcomprobarsiunpinestacerooauno.Laltima
modificacinestmarcadaenrojoenlaventanaWatchValues.Estolepermitelocalizarlamodificacinenlalistadevariablesyregistros
duranteelprocesodeladepuracin.

http://www.mikroe.com/chapters/view/80/capitulo2programaciondelosmicrocontroladores/ 33/37
11/10/2015 ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacinenCconejemplos

ParavisualizarestaventanaesnecesarioseleccionarlaopcinView/DebugWindows/WatchValues.Entoncesustedpuedehaceruna
listaderegistros/variablesquequieremonitorearylamaneradevisualizarlos.

STOPWATCH(CRONMETRO)

Siquieresabercuntotiempotardaunmicrocontroladorenejecutarunapartedelprograma,seleccionelaopcinRun/ViewStopwatch.
Aparecerunaventanacomosemuestraenlafiguraaladerecha.Cmofuncionauncronmetro?Esoespancomido...Eltiempoque
tardauncomando(stepinto,stepover,run/pauseetc.)enejecutarseporeldepuradorsemideautomticamenteysevisualizaenla
ventanaStopwatch.Porejemplo,semidetiempoparaejecutarunprograma,tiempoparaejecutarelltimopasoetc.

PROGRAMARELMICROCONTROLADOR

Sihasolucionadotodosloserroresensucdigoycreequesuprogramaestlistoparaserutilizado,elsiguientepasoescargarloenel
microcontrolador.ElprogramadorPICflashseutilizaparaestepropsito.Esunaherramientadiseadaparaprogramartodoslostiposde
microcontroladoresPIC.Estcompuestopordospartes:

Lapartehardwareseutilizaparaintroduciruncdigohexadecimal(elprogramaasercargadoenelmicrocontrolador)
yparaprogramarelmicrocontroladorpormediodenivelesdevoltajeespecficos.Duranteelprocesodela
programacin,unnuevoprogramaseescribeenlamemoriaflashdelmicrocontrolador,mientrasqueelprograma
anteriorseborraautomticamente.
Lapartedesoftwareseencargadeenviarelprograma(archivo.hex)alapartehardwaredelprogramadorpormedio
deuncableUSB.AlainterfazdeusuariodeestesoftwareselepuedeaccederdesdeIDEalpulsarsobrelaopcin
mE_ProgrammerdelmenToolsoalpulsar[F11].Porconsiguiente,esposiblemodificaralgunasconfiguracionesdel
programadorycontrolarelfuncionamientodelapartehardware(Cargar,Escribir,Verificar...).

Sepuedereprogramarelmicrocontroladortantasvecescomosenecesite.

OTRASHERRAMIENTASDELCOMPILADOR

ElcompiladormikroCPROforPICproporcionaherramientasqueengranmedidasimplificanelprocesodeescribirelprograma.Todas

http://www.mikroe.com/chapters/view/80/capitulo2programaciondelosmicrocontroladores/ 34/37
11/10/2015 ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacinenCconejemplos
estasherramientasseencuentranenelmenTools.Enlasiguienteseccinvamosadarleunabrevedescripcindetodasellas.

TERMINALUSART

ElterminalUSARTrepresentaunasustitucinparalaestndarWindowsHyperTerminal.Sepuedeutilizarparacontrolarel
funcionamientodelmicrocontroladorqueutilizalacomunicacinUSART.Talesmicrocontroladoresestnincorporadosenundispositivo
destinoyconectadosalconectorRS232delaPCpormediodeuncableserial.

LaventanaUSARTterminaldisponedeopcionesparaconfigurarlacomunicacinserialyvisualizarlosdatosenviados/recibidos.

EDITOREEPROM

AlseleccionarlaopcinEEPROMEditordelmenTools,aparecerunaventanacomosemuestraenlasiguientefigura.Asescmo
funcionalamemoriaEEPROMdelmicrocontrolador.Siquierecambiardesucontenidodespusdecargarelprogramaenel
microcontrolador,staeslaformacorrectadehacerlo.Elnuevocontenidoesundatodeuntipoespecfico(char,intodouble),primero
debeseleccionarlo,introducirelvalorenelcampoEditValueypulsarsobreEdit.Luego,pulsesobreelbotnSaveparaguardarlocomo
undocumentoconextensin.hex.SilaopcinUseEEPROMinProjectestactiva,losdatossecargarnautomticamenteenel
microcontroladorduranteelprocesodelaprogramacin.

VENTANAASCIICHART

SinecesitarepresentarnumricamenteuncarcterASCII,seleccionelaopcinASCIIchartdelmenTools.Aparecerunatabla,comose
muestraenlafiguraqueestacontinuacin.Ustedprobablementesabequecadatecladetecladoestasociadaconuncdigo(cdigo
ASCII).Comosepuedever,loscaracteresquerepresentanlosnmerostienenvaloresdiferentes.Porestarazn,lainstruccinde
programaparavisualizarelnmero7enunLCDnovisualizarestenmero,sinoelequivalentealainstruccinBEL.Sienvaelmismo
nmeroenformadeuncarcteraunLCD,obtendrelresultadoesperadonmero7.Porconsiguiente,siquierevisualizarunnmerosin
convertirloenuncarcterapropiado,esnecesarioaadirelnmero48acadadgitoenelqueconsisteelnmeroavisualizar.

http://www.mikroe.com/chapters/view/80/capitulo2programaciondelosmicrocontroladores/ 35/37
11/10/2015 ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacinenCconejemplos

EDITORDESIETESEGMENTOS

Uneditordesietesegmentoslepermitedeterminarconfacilidadelnmeroaponerenunpuertodesalidaconelpropsitodevisualizar
unsmbolodeseado.Porsupuesto,sedaporentendidoquelospinesdelpuertodebenestarconectadosalossegmentosdelvisualizador
demaneraapropiada.Bastaconcolocarelcursorencualquiersegmentodelvisualizadorypulsarsobrel.Sevisualizarinmediatamente
elnmeroaintroducirenelprograma.

LCDCUSTOMCHARACTER(CARACTERESLCDDEFINIDOSPORELUSUARIO)

Ademsdeloscaracteresestndar,elmicrocontroladortambinpuedevisualizarloscaracterescreadosporelprogramador.Al
seleccionarlaherramientaLCDcustomcharacter,seevitarunpesadotrabajodecrearfuncionesparaenviaruncdigoapropiadoaun
visualizador.Paracrearunsmbolo,pulsesobreloscuadrospequeosenlaventanaLCDcustomcharacter,luegoseleccionelaposicin
ylafilaypulsesobreelbotnGENERATE.Elcdigoapropiadoapareceenotraventana.Noesnecesitapulsarms.CopytoClipboard
(copiaralportapapeles)Paste(pegar)...

GENERADORDEMAPADEBITSPARAUNLCDGRFICO

ElgeneradordemapadebitsparaunLCDgrficoesunaherramientainsustituibleencasodequeelprogramaqueescribeutiliceel
visualizadorLCD(GLCD).Estaherramientalepermitevisualizarunmapadebitsconfacilidad.SeleccionelaopcinTools/GlcdBitmap
Editoraparecerlaventanaapropiada.Parautilizarlo,seleccioneeltipodevisualizadorautilizarycargueunmapadebits.Elmapade

http://www.mikroe.com/chapters/view/80/capitulo2programaciondelosmicrocontroladores/ 36/37
11/10/2015 ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacinenCconejemplos
bitsdebesermonocromticoytenerlaresolucinapropiadadelvisualizador(128x64pxelesenesteejemplo).Elprocedimientoaseguir
esigualqueenelejemploanterior:CopytoClipboard...

UncdigogeneradoqueutilizaherramientasparacontrolarlosvisualizadoresLCDyGLCDcontienefuncionesdelalibreraLcd.Silas
utilizaenelprograma,noseolvidedemarcarlacajadechequeojuntoaestalibreraenlaventanaLibraryManager.Aselcompilador
sercapazdereconocerestasfuncionescorrectamente.

previouschapter|tableofcontents|nextchapter

MikroElektronika Embedded Solutions


PICSolution dsPICSolution STM32Solution 8051Solution AdditionalSoftware Storage
PICDev.Boards dsPICDev.Boards STM32Dev.Boards 8051Dev.Boards VisualTFT RealTimeClock
PICCompilers dsPICCompilers STM32Compilers 8051Compilers VisualGLCD Display
PICProgrammers dsPICProgrammers STM32Programmers 8051Programmers PackageManager Measurement
PICKits dsPICKits STM32Kits 8051Books GLCDFontCreator Audio&Voice
PICBooks dsPICBooks 8051Kits TimerCalculator PowerSupply
TivaCSeriesSolution
GPS
PIC32Solution AVRSolution TivaCDev.Boards FT90xSolution Addonboards
GSM/GPRS
PIC32Dev.Boards AVRDev.Boards TivaCCompilers FT90xDev.Boards ClickBoards
PIC32Compilers AVRCompilers TivaCProgrammers FT90xCompilers ClickPacks
PIC32Programmers AVRProgrammers TivaCKits FT90xProgrammers mikromediashields
PIC32Kits AVRKits FT90xKits Communication

Support Forum mikroBUS Letsmake Press Legal Archive AboutUs Customization

Copyright19982015.MikroElektronika.Allrightsreserved.Alltradeand/orservicesmarksmentionedarethepropertyoftheirrespectiveowners.

http://www.mikroe.com/chapters/view/80/capitulo2programaciondelosmicrocontroladores/ 37/37

You might also like