Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacinenCconejemplos
Products
Solutions
Store
Distributors
Libstock
ContactUs
searchhere
Login|Cart(0)
ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacin
enCconejemplos
FeaturedDevelopmentTools
EasyPICv7DevelopmentSystem
Capitulo2Programacindelosmicrocontroladores
Ustedseguramentesabequenoessuficientesloconectarelmicrocontroladoralosotroscomponentesyencenderunafuentede
alimentacinparahacerlofuncionar,verdad?Hayquehaceralgoms.Senecesitaprogramarelmicrocontrolador.Sicreequeestoes
complicado,estequivocado.Todoelprocedimientoesmuysimple.Bastaconleereltextoparaentenderdeloqueestamoshablando.
2.1LENGUAJESDEPROGRAMACIN
2.2CARACTERSTICASPRINCIPALESDELMIKROC
2.3TIPOSDEDATOSENMIKROC
2.4VARIABLESYCONSTANTES
2.5OPERADORES
2.6ESTRUCTURASDECONTROL
2.7TIPOSDEDATOSAVANZADOS
2.8FUNCIONES
2.9CARACTERSTICASPRINCIPALESDELPREPROCESADOR
2.10MIKROCPROFORPIC
2.11PROGRAMARLOSPICUTILIZANDOMIKROCPROFORPIC
EasyPICv7istopsellingPIC
DevelopmentBoardfor250Microchip
PICMCUsinDIPpackaging.Itfeatures
USB2.0programmer/debuggerandover
17essentialmodulesnecessaryin
development.Boardcomeswith
PIC18F45K22.[moreinfo]
FeaturedCompilers
mikroCPROforPIC
2.1LENGUAJESDEPROGRAMACIN
ElmicrocontroladorejecutaelprogramacargadoenlamemoriaFlash.
Estosedenominaelcdigoejecutableyestcompuestoporunaserie
decerosyunos,aparentementesinsignificado.Dependiendodela
arquitecturadelmicrocontrolador,elcdigobinarioestcompuestopor
palabrasde12,14o16bitsdeanchura.Cadapalabraseinterpretapor
laCPUcomounainstruccinaserejecutadaduranteelfuncionamiento
delmicrocontrolador.Todaslasinstruccionesqueelmicrocontrolador
puedereconoceryejecutarselesdenominancolectivamenteConjunto
deinstrucciones.Comoesmsfciltrabajarconelsistemade
numeracinhexadecimal,elcdigoejecutableserepresentacon
PopularPICmicocontrollersareloved
byhobbyistsand8bitgeeks.mikroC
helpsyoubringyourideastolifeeasyas
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/#c2v1
1/33
22/7/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.
2.2CARACTERSTICASPRINCIPALESDELMIKROC
AcontinuacinvamosapresentaraloselementosprincipalesdellenguajemikroCdesarrolladoporMikroelektronika.Estelenguajees
muysimilaralCestndar,noobstanteendeterminadosaspectosdifieredelANSIestndarenalgunascaractersticas.Algunasdeestas
diferenciasserefierenalasmejoras,destinadasafacilitarlaprogramacindelosmicrocontroladoresPIC,mientrasquelasdemssonla
consecuenciadelalimitacindelaarquitecturadelhardwaredelosPIC.Aquvamosapresentarcaractersticasespecficasdellenguaje
http://www.mikroe.com/chapters/view/80/capitulo2programaciondelosmicrocontroladores/#c2v1
2/33
22/7/2015
ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacinenCconejemplos
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
ejecutadaaliniciarselaejecucindeprograma.Lasotrasfuncionessepueden
llamardentrodelafuncinmain.Enotraspalabras,podemosdecirquela
funcinmain()esobligatoria,mientrasquelasdemssonopcionales.Sitodava
nohaescritounprogramaenC,esprobablequetodoleresulteconfuso.Nose
preocupe,acptelotalcomoesporelmomentoymstardeentenderla
sintaxis.
Yahora,suprimerprogramareal!Lafiguramuestralaestructuradeprograma,sealandolaspartesenlasqueconsiste.
http://www.mikroe.com/chapters/view/80/capitulo2programaciondelosmicrocontroladores/#c2v1
3/33
22/7/2015
ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacinenCconejemplos
LamaneradeescribirelcdigoenCesmuyimportante.Porejemplo,Cdifiereentreminsculasymaysculas,asquelafuncinmain()
nosepuedeescribirMAIN()oMain().Adems,notequedoslneasdelcdigodentrodelafuncinterminanconunpuntoycoma.EnC
todaslassentenciasdebenterminarconunpuntoycoma,aselcompiladorpuedeaislarlasytraducirlasacdigomquina.
COMENTARIOS
Loscomentariossonlaspartesdelprogramautilizadosparaaclararlasinstruccionesdeprogramaoparaproporcionarmsinformacinal
respecto.Elcompiladornohacecasoaloscomentariosynoloscompilaalcdigoejecutable.Dichodemanerasencilla,elcompiladores
http://www.mikroe.com/chapters/view/80/capitulo2programaciondelosmicrocontroladores/#c2v1
4/33
22/7/2015
ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacinenCconejemplos
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
DATO
DESCRIPCI N
T AMAO ( NMERO DE
BIT S)
char
Texto(caracteres)
de0a255
int
Valoresenteros
16
de32768a32767
float
Valoresenpuntoflotante
32
de1.175494350821038a
6.805647744071038
double
Valoresenpuntoflotantededoble
precisin
32
de1.175494350821038a
6.805647744071038
*Debidoalaslimitacionesimpuestasporelhardwaredelmicrocontrolador,esimposiblealcanzarunamayorprecisindedatosqueladel
tipofloat.Poreso,eltipodoubleenmikroCequivalealtipofloat.
Alaadirunprefijo(calificador)acualquiertipodedatoenteroocarcter,elrangodesusposiblesvalorescambiaascomoelnmerode
losbytesdememorianecesarios.Pordefecto,losdatosdetipointsonconsigno,mientrasquelosdetipocharsonsinsigno.Elcalificador
signed(consigno)indicaqueeldatopuedeserpositivoonegativo.Elprefijounsignedindicaqueeldatopuedeserslopositivo.Note
queelprefijoesopcional.
T IPO DE
DATO
T IPO DEDAT O CO N
PREF IJO
char
int
T AMAO ( NMERO DE
BIT S)
signedchar
de128a128
unsignedint
16
de0a65535
shortint
de0a255
signedshortint
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.
http://www.mikroe.com/chapters/view/80/capitulo2programaciondelosmicrocontroladores/#c2v1
5/33
22/7/2015
ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacinenCconejemplos
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*/
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
typename
at
delete
int
sfr
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
while
char
false
pascal
template
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
http://www.mikroe.com/chapters/view/80/capitulo2programaciondelosmicrocontroladores/#c2v1
6/33
22/7/2015
ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacinenCconejemplos
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:
<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:
http://www.mikroe.com/chapters/view/80/capitulo2programaciondelosmicrocontroladores/#c2v1
7/33
22/7/2015
ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacinenCconejemplos
intVelocidad_de_ascensor
enummotor_de_ascensor{PARADA,INICIO,NORMAL,MXIMO}
Velocidad_de_ascensor=NORMAL//Velocidad_de_ascensor=2
Definirlosnuevostiposdedatos
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/#c2v1
8/33
22/7/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
inta=5//Declarareinicializarlavariablea
a+=10//a=a+10=15
OPERADORESDEINCREMENTOYDECREMENTO
Lasoperacionesdeincrementoydecrementopor1sedenotancon"++"y"".Estoscaracterespuedenprecederoseguiraunavariable.
Enprimercaso(++x),lavariablexserincrementadapor1antesdeserutilizadaenlaexpresin.Delocontrario,lavariableseutilizaren
http://www.mikroe.com/chapters/view/80/capitulo2programaciondelosmicrocontroladores/#c2v1
9/33
22/7/2015
ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacinenCconejemplos
laexpresinantesdeseraumentadapor1.Lomismoseaplicaalaoperacindedecremento.
O PERADO R
EJEMPL O
DESCRIPCI N
++a
++
Variable"a"esincrementadapor1
a++
b
Variable"a"esdecrementadapor1
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
&&
||
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
c=11000000
&
Ylgicoparamanejodebits
c=a&b
a=11100011
b=11001100
Olgicoparamanejodebits
c=a|b
a=11100011
b=11001100
c=11101111
EXORlgicoparamanejodebits
c=a^b
a=11100011
b=11001100
c=00101111
Notequeelresultadodelaoperacindedesplazamientoaladerechadependedelsignodelavariable.Encasodequeeloperandose
apliqueaunavariablesinsignoopositiva,seintroducirnloscerosenelespaciovacocreadopordesplazamiento.Siseaplicaaun
enteroconsignonegativo,seintroducirun1paramantenerelsignocorrectodelavariable.
CMOUTILIZARLOSOPERADORES?
Apartedelosoperadoresdeasignacin,dosoperadoresnodebenestarescritosunojuntoalotro.
x*%12//estaexpresingenerarunerror
http://www.mikroe.com/chapters/view/80/capitulo2programaciondelosmicrocontroladores/#c2v1
10/33
22/7/2015
ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacinenCconejemplos
Cadaoperadortienesuprioridadyasociatividadcomosemuestraenlatabla:
Similaralasexpresionesaritmticas,losoperadoresseagrupanjuntospormediodeparntesis.Primerosecalculan
lasexpresionesencerradasentreparntesis.Siesnecesario,sepuedenutilizarlosparntesismltiples(anidados).
PRIO RIDAD
O PERADO RES
Alta
()[]>.
deizquierdaaderecha
!~+++(unitario)(unitario)*Puntero&Puntero
dederechaaizquierda
*/%
deizquierdaaderecha
deizquierdaaderecha
<>
deizquierdaaderecha
<<=>>=
deizquierdaaderecha
==!=
deizquierdaaderecha
&
deizquierdaaderecha
deizquierdaaderecha
deizquierdaaderecha
&&
deizquierdaaderecha
||
dederechaaizquierda
?:
dederechaaizquierda
=+==*=/=/=&=^=|=<=>=
deizquierdaaderecha
Baja
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
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
http://www.mikroe.com/chapters/view/80/capitulo2programaciondelosmicrocontroladores/#c2v1
11/33
22/7/2015
ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacinenCconejemplos
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
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
http://www.mikroe.com/chapters/view/80/capitulo2programaciondelosmicrocontroladores/#c2v1
12/33
22/7/2015
ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacinenCconejemplos
...//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.
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:
http://www.mikroe.com/chapters/view/80/capitulo2programaciondelosmicrocontroladores/#c2v1
13/33
22/7/2015
ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacinenCconejemplos
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
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
}
http://www.mikroe.com/chapters/view/80/capitulo2programaciondelosmicrocontroladores/#c2v1
14/33
22/7/2015
ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacinenCconejemplos
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
...//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(){
http://www.mikroe.com/chapters/view/80/capitulo2programaciondelosmicrocontroladores/#c2v1
15/33
22/7/2015
ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacinenCconejemplos
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
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
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/#c2v1
16/33
22/7/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.
SiestfamiliarizadoconellenguajeC,recuerdequemikroCnoadmitelainicializacindelosmiembrosdeestructurapormediodelas
llaves.Porejemplo,conjunto_1={15,m}devuelveunerrorenmikroC.
2.8FUNCIONES
Unafuncinesunasubrutinaquecontieneunalistadesentenciasarealizar.Laideaprincipalesdividirunprogramaenvariaspartes
utilizandoestasfuncionespararesolverelproblemainicialconmsfacilidad.Adems,lasfuncionesnospermitenutilizarlasdestrezasy
elconocimientodeotrosprogramadores.Unafuncinseejecutacadavezquesellamedentrodeotrafuncin.EnC,unprograma
http://www.mikroe.com/chapters/view/80/capitulo2programaciondelosmicrocontroladores/#c2v1
17/33
22/7/2015
ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacinenCconejemplos
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
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
http://www.mikroe.com/chapters/view/80/capitulo2programaciondelosmicrocontroladores/#c2v1
18/33
22/7/2015
ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacinenCconejemplos
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.*/
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.
http://www.mikroe.com/chapters/view/80/capitulo2programaciondelosmicrocontroladores/#c2v1
19/33
22/7/2015
ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacinenCconejemplos
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
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
http://www.mikroe.com/chapters/view/80/capitulo2programaciondelosmicrocontroladores/#c2v1
20/33
22/7/2015
ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacinenCconejemplos
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
#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:
http://www.mikroe.com/chapters/view/80/capitulo2programaciondelosmicrocontroladores/#c2v1
21/33
22/7/2015
ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacinenCconejemplos
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
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
http://www.mikroe.com/chapters/view/80/capitulo2programaciondelosmicrocontroladores/#c2v1
22/33
22/7/2015
ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacinenCconejemplos
INSERTARCDIGOASMENC
AveceselprocesodeescribirunprogramaenCrequierelaspartesdelcdigoescritasenensamblador.Estopermiteejecutarlaspartes
complicadasdelprogramadeunaformadefinidaconprecisinenunperododetiempoexacto.Porejemplo,cuandosenecesitaquelos
pulsosmuycortos(deunosmicrosegundos)aparezcanperidicamenteenunpindelmicrocontrolador.Entalescasoslasolucinms
simpleserautilizarelcdigoensambladorenlapartedelprogramaquecontrolaladuracindepulsos.
UnaomsinstruccionesenensambladorestninsertadasenelprogramaescritoenC,utilizandoelcomandoasm:
asm
{
instruccionesenensamblador
...
}
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.
http://www.mikroe.com/chapters/view/80/capitulo2programaciondelosmicrocontroladores/#c2v1
23/33
22/7/2015
ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacinenCconejemplos
Apartedelaslibrerasexistentes,esposiblecrearlaslibrerasyluegoutilizarlasenelprograma.Elprocedimientodecmocrearlibreras
sedescribeendetallesenHelp(Ayuda)delcompilador.
ElcompiladormikroCincluyetrestiposdelibreras:
librerasANSICestndar:
LIBRARA
DESCRIPCI N
ANSICCtypeLibrary
Utilizadaprincipalmenteparaprobaroparaconvertirlosdatos
ANSICMathLibrary
Utilizadaparalasoperacionesmatemticasdepuntoflotante
ANSICStdlibLibrary
Contienelasfuncionesdelibrerasestndar
ANSICStringLibrary
Utilizadapararealizarlasoperacionesdecadenasydemanipulacindememoria
librerasmiscelneas:
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
http://www.mikroe.com/chapters/view/80/capitulo2programaciondelosmicrocontroladores/#c2v1
24/33
22/7/2015
ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacinenCconejemplos
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).
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)!
http://www.mikroe.com/chapters/view/80/capitulo2programaciondelosmicrocontroladores/#c2v1
25/33
22/7/2015
ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacinenCconejemplos
PulsesobreYes.
Uncontroladoresunprogramaquepermitealsistemaoperativocomunicarconunperifrico.Enestecaso,estedispositivoesel
programador(hardware)delsistemadedesarrollo.
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/#c2v1
26/33
22/7/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.
Device (dispositivo):
http://www.mikroe.com/chapters/view/80/capitulo2programaciondelosmicrocontroladores/#c2v1
27/33
22/7/2015
ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacinenCconejemplos
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.
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.
http://www.mikroe.com/chapters/view/80/capitulo2programaciondelosmicrocontroladores/#c2v1
28/33
22/7/2015
ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacinenCconejemplos
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
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
http://www.mikroe.com/chapters/view/80/capitulo2programaciondelosmicrocontroladores/#c2v1
29/33
22/7/2015
ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacinenCconejemplos
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.
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.
http://www.mikroe.com/chapters/view/80/capitulo2programaciondelosmicrocontroladores/#c2v1
30/33
22/7/2015
ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacinenCconejemplos
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
estasherramientasseencuentranenelmenTools.Enlasiguienteseccinvamosadarleunabrevedescripcindetodasellas.
TERMINALUSART
ElterminalUSARTrepresentaunasustitucinparalaestndarWindowsHyperTerminal.Sepuedeutilizarparacontrolarel
funcionamientodelmicrocontroladorqueutilizalacomunicacinUSART.Talesmicrocontroladoresestnincorporadosenundispositivo
destinoyconectadosalconectorRS232delaPCpormediodeuncableserial.
LaventanaUSARTterminaldisponedeopcionesparaconfigurarlacomunicacinserialyvisualizarlosdatosenviados/recibidos.
EDITOREEPROM
AlseleccionarlaopcinEEPROMEditordelmenTools,aparecerunaventanacomosemuestraenlasiguientefigura.Asescmo
funcionalamemoriaEEPROMdelmicrocontrolador.Siquierecambiardesucontenidodespusdecargarelprogramaenel
microcontrolador,staeslaformacorrectadehacerlo.Elnuevocontenidoesundatodeuntipoespecfico(char,intodouble),primero
http://www.mikroe.com/chapters/view/80/capitulo2programaciondelosmicrocontroladores/#c2v1
31/33
22/7/2015
ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacinenCconejemplos
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.
EDITORDESIETESEGMENTOS
Uneditordesietesegmentoslepermitedeterminarconfacilidadelnmeroaponerenunpuertodesalidaconelpropsitodevisualizar
unsmbolodeseado.Porsupuesto,sedaporentendidoquelospinesdelpuertodebenestarconectadosalossegmentosdelvisualizador
demaneraapropiada.Bastaconcolocarelcursorencualquiersegmentodelvisualizadorypulsarsobrel.Sevisualizarinmediatamente
elnmeroaintroducirenelprograma.
http://www.mikroe.com/chapters/view/80/capitulo2programaciondelosmicrocontroladores/#c2v1
32/33
22/7/2015
ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacinenCconejemplos
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
bitsdebesermonocromticoytenerlaresolucinapropiadadelvisualizador(128x64pxelesenesteejemplo).Elprocedimientoaseguir
esigualqueenelejemploanterior:CopytoClipboard...
UncdigogeneradoqueutilizaherramientasparacontrolarlosvisualizadoresLCDyGLCDcontienefuncionesdelalibreraLcd.Silas
utilizaenelprograma,noseolvidedemarcarlacajadechequeojuntoaestalibreraenlaventanaLibraryManager.Aselcompilador
sercapazdereconocerestasfuncionescorrectamente.
previouschapter|tableofcontents|nextchapter
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
PIC32Solution
TivaCSeriesSolution
AVRSolution
TivaCDev.Boards
FT90xSolution
Addonboards
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
GPS
GSM/GPRS
AboutUs
Customization
Copyright19982015.MikroElektronika.Allrightsreserved.Alltradeand/orservicesmarksmentionedarethepropertyoftheirrespectiveowners.
http://www.mikroe.com/chapters/view/80/capitulo2programaciondelosmicrocontroladores/#c2v1
33/33