Professional Documents
Culture Documents
Login|Cart(0)
ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacin FeaturedDevelopmentTools
enCconejemplos EasyPICv7DevelopmentSystem
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.
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.
unsignedint 16 de0a65535
shortint 8 de0a255
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:
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.
++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...
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:
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).
!~+++(unitario)(unitario)*Puntero&Puntero dederechaaizquierda
*/% deizquierdaaderecha
+ deizquierdaaderecha
<> deizquierdaaderecha
<<=>>= deizquierdaaderecha
==!= deizquierdaaderecha
& deizquierdaaderecha
^ deizquierdaaderecha
| deizquierdaaderecha
&& deizquierdaaderecha
|| dederechaaizquierda
?: dederechaaizquierda
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.
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:
#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
Copyright19982015.MikroElektronika.Allrightsreserved.Alltradeand/orservicesmarksmentionedarethepropertyoftheirrespectiveowners.
http://www.mikroe.com/chapters/view/80/capitulo2programaciondelosmicrocontroladores/ 37/37