Sei sulla pagina 1di 33

22/7/2015

ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacinenCconejemplos
Products

Solutions

Store

Distributors

Libstock

ContactUs

searchhere

Login|Cart(0)

ProgramacindelosmicrocontroladoresMicrocontroladoresPICProgramacin
enCconejemplos

FeaturedDevelopmentTools
EasyPICv7DevelopmentSystem

TOC Capitulo1 Capitulo2 Capitulo3 Capitulo4 ApndiceA

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

RANG O DEVAL O RES

*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)

RANG O DEVAL O RES

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

ASO CIAT IVIDAD

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

MikroElektronika Embedded Solutions


PICSolution

dsPICSolution

STM32Solution

8051Solution

AdditionalSoftware

Storage

PICDev.Boards

dsPICDev.Boards

STM32Dev.Boards

8051Dev.Boards

VisualTFT

RealTimeClock

PICCompilers

dsPICCompilers

STM32Compilers

8051Compilers

VisualGLCD

Display

PICProgrammers

dsPICProgrammers

STM32Programmers

8051Programmers

PackageManager

Measurement

PICKits

dsPICKits

STM32Kits

8051Books

GLCDFontCreator

Audio&Voice

PICBooks

dsPICBooks

8051Kits

TimerCalculator

PowerSupply

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

Potrebbero piacerti anche