Вы находитесь на странице: 1из 76

11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos

Products Solutions Store Distributors Libstock ContactUs searchhere

Login|Cart(0)

MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCcon FeaturedDevelopmentTools

ejemplos EasyPICv7DevelopmentSystem

TOC Capitulo1 Capitulo2 Capitulo3 Capitulo4 ApndiceA

Capitulo3:MicrocontroladorPIC16F887

ElPIC16F887esunproductoconocidodelacompaaMicrochip.Disponedetodosloscomponentesdisponiblesenlamayoradelos
microcontroladoresmodernos.Porsubajoprecio,unrangoampliodeaplicaciones,altacalidadydisponibilidad,esunasolucinperfecta
aplicarloparacontrolardiferentesprocesosenlaindustria,endispositivosdecontroldemquinas,paramedirvariablesdeprocesosetc.
Algunasdesuscaractersticasprincipalesseenumeranacontinuacin.

3.1CARACTERSTICASBSICASDELPIC16F887 EasyPICv7istopsellingPIC
3.2PRINCIPALESREGISTROSSFR DevelopmentBoardfor250Microchip
3.3PUERTOSDEENTRADA/SALIDA PICMCUsinDIPpackaging.Itfeatures
USB2.0programmer/debuggerandover
3.4TEMPORIZADORTIMER0
17essentialmodulesnecessaryin
3.5TEMPORIZADORTIMER1
development.Boardcomeswith
3.6TEMPORIZADORTIMER2 PIC18F45K22.[moreinfo]
3.7MDULOSCCP
3.8MDULOSDECOMUNICACINSERIE FeaturedCompilers
3.9MDULOSANALGICOS
mikroCPROforPIC
3.10OSCILADORDERELOJ
3.11MEMORIAEEPROM
3.12REINICIO!BLACKOUT,BROWNOUTORUIDOS?

3.1CARACTERSTICASBSICASDELPIC16F887

arquitecturaRISC 256bytesdememoriaEEPROM
Elmicrocontroladorcuentaconsolo35instrucciones Losdatossepuedengrabarmsde1.000.000veces
diferentes
368bytesdememoriaRAM
Todaslasinstruccionessonunicicloexceptoporlasde
ramificacin
ConvertidorA/D:
14canales PopularPICmicocontrollersareloved
Frecuenciadeoperacin020MHz resolucinde10bits byhobbyistsand8bitgeeks.mikroC
Osciladorinternodealtaprecisin helpsyoubringyourideastolifeeasyas
3temporizadores/contadoresindependientes neverbefore.[moreinfo]
Calibradodefbrica
Rangodefrecuenciade8MHza31KHzseleccionadopor
Temporizadorperroguardin
software Mdulocomparadoranalgicocon
Doscomparadoresanalgicos
Voltajedelafuentedealimentacinde2.0Va
Referenciadevoltajefija(0.6V)
5.5V Referenciadevoltajeprogramableenelchip
Consumo:220uA(2.0V,4MHz),11uA(2.0V,32KHz)
50nA(enmododeespera)
MduloPWMincorporado
MduloUSARTmejorado
AhorrodeenergaenelMododesuspensin
SoportalascomunicacionesserialesRS485,RS232y
BrownoutReset(BOR)conopcinpara LIN2.0
controlarporsoftware Autodeteccindebaudios
35pinesdeentrada/salida PuertoSerieSncronoMaestro(MSSP)
altacorrientedefuenteydedrenadorparamanejode SoportalosmodosSPIeI2C
LED
resistenciaspullupprogramablesindividualmentepor
software
interrupcinalcambiarelestadodelpin

memoriaROMde8KcontecnologaFLASH
Elchipsepuedereprogramarhasta100.000veces

Opcindeprogramacinserialenelcircuito
Elchipsepuedeprogramarinclusoincorporadoenel
dispositivodestino.

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 1/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos

DESCRIPCINDEPINES

LamayoradelospinesdelmicrocontroladorPIC16F887sonmultipropsitocomosemuestraenlafiguraanterior.Porejemplo,la
asignacinRA3/AN3/Vref+/C1IN+paraelquintopindelmicrocontroladorindicaquestedisponedelassiguientesfunciones:

RA3Terceraentrada/salidadigitaldelpuertoA

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 2/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos
AN3Terceraentradaanalgica
Vref+Referenciapositivadevoltaje
C1IN+EntradapositivadelcomparadorC1
Lafuncionalidaddelospinespresentadosanteriormenteesmuytilpuestoquepermiteunmejoraprovechamientodelosrecursosdel
microcontroladorsinafectarasufuncionamiento.Estasfuncionesdelospinesnosepuedenutilizarsimultneamente,sinembargose
puedencambiarencualquierinstanteduranteelfuncionamiento.

LassiguientestablasserefierenalmicrocontroladorDIPde40pines.

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 3/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 4/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos

UNIDADCENTRALDEPROCESAMIENTO(CPU)

Conelpropsitodeexplicarenformaclarayconcisa,sindescribirprofundamenteelfuncionamientodelaCPU,vamosahacerconstar
quelaCPUestfabricadaconlatecnologaRISCyaqueestoesunfactorimportantealdecidirqumicrocontroladorutilizar.

RISCesunacrnimoderivadodelinglsReducedInstructionSetComputer,loqueproporcionaalPIC16F887dosgrandesventajas:

LaCPUcuentaconslo35instruccionessimples.Cabedecirqueparapoderprogramarotrosmicrocontroladoresen
lenguajeensambladoresnecesariosabermsde200instrucciones
Eltiempodeejecucinesigualparacasitodaslasinstruccionesytarda4ciclosdereloj.Lafrecuenciadeloscilador
seestabilizaporuncristaldecuarzo.Lasinstruccionesdesaltoyderamificacintardanochociclosderelojen
ejecutarse.Estosignificaquesilavelocidaddeoperacindelmicrocontroladores20MHz,eltiempodeejecucinde
cadainstruccinser200nS,osea,elprogramaejecutar5millonesdeinstruccionesporsegundo!

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 5/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos

MEMORIA

ElPIC16F887tienetrestiposdememoria:ROM,RAMyEEPROM.Comocadaunatienelasfunciones,caractersticasyorganizacin
especficas,vamosapresentarlasporseparado.

MEMORIAROM

LamemoriaROMseutilizaparaguardarpermanenteelprogramaqueseestejecutando.Eslaraznporlaqueesfrecuentemente
llamadamemoriadeprograma.ElPIC16F887tiene8KbdememoriaROM(entotal8192localidades).ComolamemoriaROMest
fabricadacontecnologaFLASH,sucontenidosepuedecambiaralproporcionarleunvoltajedeprogramacinespecial(13V).

Noobstante,noesnecesarioexplicarloendetallespuestoqueserealizaautomticamenteporunprogramaespecialenlaPCyunsimple
dispositivoelectrnicodenominadoprogramador.

MEMORIAEEPROM

Similaralamemoriadeprograma,elcontenidodememoriaEEPROMestpermanentementeguardadoalapagarlafuentede
alimentacin.Sinembargo,adiferenciadelaROM,elcontenidodelaEEPROMsepuedecambiarduranteelfuncionamientodel
microcontrolador.Eslaraznporlaqueestamemoria(256localidades)esperfectaparaguardarpermanentementealgunosresultados
creadosyutilizadosdurantelaejecucindelprograma.

MEMORIARAM

Eslaterceraylamscomplejapartedelamemoriadelmicrocontrolador.Enestecasoconsisteendospartes:enregistrosdepropsito
generalyenlosregistrosdefuncionesespeciales(SFR).Todosestosregistrossedividenencuatrobancosdememoriadelosquevamos
ahablarmstardeenestecaptulo.

Aunquelosdosgruposderegistrosseponenaceroalapagarlafuentedealimentacin,ademsestnfabricadosdelamismaformayse
comportandelamanerasimilar,susfuncionesnotienenmuchascosasencomn.

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 6/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos

REGISTROSDEPROPSITOGENERAL

Losregistrosdepropsitogeneralseutilizanparaalmacenarlosdatostemporalesylosresultadoscreadosduranteelfuncionamiento.Por
ejemplo,sielprogramarealizaelconteo(delosproductosenunacadenademontaje),esnecesariotenerunregistroquerepresentalo
queenlavidacotidianallamamossuma.Comoelmicrocontroladornoesnadacreativo,esnecesarioespecificarladireccindeun
registrodepropsitogeneralyasignarleesafuncin.Sedebecrearunprogramasimpleparaincrementarelvalordeesteregistropor1,
despusdequecadaproductohayapasadoporelsensor.

Ahoraelmicrocontroladorpuedeejecutarelprogramayaquesabequesydndeestlasumaquesevaaincrementar.Demanera
similar,acadavariabledeprogramaseledebepreasignaralgunodelosregistrosdepropsitogeneral.

/*Enestasecuencia,lavariableenelregistrosumseaumentacadavezquese
lleveununo(1)lgicoenelpindeentradaRB0.*/

...
if(PORTB.0=1)//ComprobarsielpinRB0estauno
sum++//Siest,elvalordelavariableseaumentapor1
...//Sinoest,elprogramasaledelasentenciaif
...

REGISTROSDEFUNCIONESESPECIALES(SFR)

LosregistrosdefuncionesespecialessontambinpartedelamemoriaRAM.Adiferenciadelosregistrosdepropsitogeneral,su
propsitoespredeterminadoduranteelprocesodefabricacinynosepuedencambiar.Comolosbitsestnconectadosaloscircuitos
particularesenelchip(convertidorA/D,mdulodecomunicacinserial,etc),cualquiercambiodesucontenidoafectadirectamenteal
funcionamientodelmicrocontroladorodealgunodeloscircuitos.

Porejemplo,elregistroADCON0controlaelfuncionamientodelconvertidorA/D.Alcambiarlosbitssedeterminaqupindelpuertose
configurarcomolaentradadelconvertidor,elmomentodeliniciodelaconversinascomolavelocidaddelaconversin.

Otracaractersticadeestaslocalidadesdememoriaesquetienennombres(tantolosregistroscomosusbits),loquesimplifica
considerablementeelprocesodeescribirunprograma.Comoellenguajedeprogramacindealtonivelpuedeutilizarlalistadetodoslos
registrosconsusdireccionesexactas,bastaconespecificarelnombrederegistroparaleerocambiarsucontenido.

//Enestasecuencia,elcontenidodelosregistrosTRISCyPORTCsermodificado

...

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 7/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos
TRISC=0x00//uncerolgico(0)seescribeenelregistroTRISC(todos
//lospinesdelpuertoPORTCseconfigurancomosalidas)
PORTC=0b01100011//cambiodeestadolgicodetodoslospinesdelpuertoPORTC
...

BANCOSDELAMEMORIARAM

LamemoriaRAMestdivididaencuatrobancos.Antesdeaccederaunregistroalescribirunprograma(paraleerocambiarsu
contenido),esnecesarioseleccionarelbancoquecontieneeseregistro.MstardevamosatratardosbitsdelregistroSTATUSutilizados
paraseleccindelbanco.Parasimplificarelfuncionamiento,losSFRutilizadosconmsfrecuenciatienenlamismadireccinentodoslos
bancos,loquepermiteaccederlosconfacilidad.

Trabajarconbancospuedeserdifcilslosiseescribeunprogramaenlenguajeensamblador.Alutilizarellenguajedeprogramacinde
altonivelcomoesCyelcompiladorcomoesmikroCPROforPIC,bastaconescribirelnombredelregistro.Apartirdeesainformacin,el
compiladorseleccionaelbanconecesario.Lasinstruccionesapropiadasparalaseleccindelbancosernincorporadasenelcdigo
duranteelprocesodelacompilacin.Hastaahoraustedhautilizadosloellenguajeensambladoryestaeslaprimeravezqueutilizael
compiladorC,verdad?Esunanoticiamaravillosa,nolocree?

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 8/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 9/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 10/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos

PILA

UnapartedelaRAMutilizadacomopilaconsistedeochoregistrosde13bits.Antesdequeelmicrocontroladorsepongaaejecutaruna
subrutina(instruccinCALL)oalocurrirunainterrupcin,ladireccindelaprimerasiguienteinstruccinenserejecutadasecolocaenla
pila(seapila),osea,enunodelosregistros.Graciasaeso,despusdeejecutarseunasubrutinaounainterrupcin,elmicrocontrolador
sabedndecontinuarconlaejecucindeprograma.Estadireccinseborra(sedesapila)despusdevolveralprograma,yaquenoes
necesarioguardarla,disponiendoautomticamenteesaslocalidadesdelapilaparaunusofuturo.

Cabetenerenmentequeeldatoseapilacircularmente.Estosignificaquedespusdequeseapileochoveces,lanovenavezse
sobrescribeelvalorquesealmacenalapilareldatoporprimeravez.Ladcimavezqueseapile,sesobrescribeelvalorquese
almacenalapilareldatoporsegundavezetc.Datossobrescritosdeestamaneranosepuedenrecuperar.Adems,elprogramadorno
puedeaccederaestosregistrosparahacerescritura/lectura.Nohayningnbitdeestadoparaindicarelestadodedesbordamientoo
subdesbordamientodepila.Porestaraznhayquetenerunespecialcuidadoalescribirunprograma.

VamosahacerloenmikroC...

/*Alentraroalsalirdelainstruccinenensambladordelprograma,elcompilador
novaaguardarlosdatosenelbancodelaRAMactualmenteactivo.Estosignifica
queenestaseccindeprogramalaseleccindebancodependedelosregistrosSFR
utilizados.AlvolveralaseccindeprogramaescritoenC,losbitsdecontrol
RP0yRP1debendevolverelestadoquetenanantesdelaejecucindelcdigoen
lenguajeensamblador.Enesteejemplo,elproblemasesolucionaalutilizarla
variableauxiliarsaveBankqueguardaelestadodeestosdosbits*/

saveBank=STATUS&0b01100000//GuardarelestadodelosbitsRP0yRP1
//(bits5y6delregistroSTATUS)
asm{//Iniciodelasecuenciaenensamblador
...
...//Cdigoensamblador
...
}//Finaldelasecuenciaenensamblador
STATUS&=0b10011111//BitsRP0yRP1devuelvensuestadooriginal
STATUS|=saveBank
...
...

SISTEMADEINTERRUPCIONES

Alaparecerunapeticindeinterrupcinloprimeroquehaceelmicrocontroladoresejecutarlainstruccinactualdespusdequese
detieneelprocesodeejecucindeprograma.Comoresultado,ladireccindememoriadeprogramaactualseapilaautomticamenteyla
direccinpordefecto(predefinidaporelfabricante)seescribeenelcontadordeprograma.Lalocalidadenlaqueelprogramacontina
conlaejecucinseledenominavectordeinterrupcin.EnelcasodelmicrocontroladorPIC16F887estadireccines0x0004h.Comose
muestraenlasiguientefiguralalocalidadquecontieneelvectordeinterrupcinseomitedurantelaejecucindeprogramaregular.

Unapartedeprogramaqueseejecutaralhacerunapeticindeinterrupcinseledenominarutinadeinterrupcin.Suprimera
instruccinseencuentraenelvectordeinterrupcin.Cuntotiempotardarenejecutarestasubrutinaycmoserdependedela
destrezadelprogramadorascomodelafuentedeinterrupcin.Algunosmicrocontroladorestienenmsdeunvectordeinterrupcin
(cadapeticindeinterrupcintienesuvector),peroenestecasoslohayuno.Enconsecuencia,laprimerapartedalarutinade
interrupcinconsisteendetectarlafuentedeinterrupcin.

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 11/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos
Porfin,alreconocerlafuentedeinterrupcinyalterminardeejecutarlarutinadeinterrupcinelmicrocontroladoralcanzalainstruccin
RETFIE,tomaladireccindelapilaycontinaconlaejecucindeprogramadesdedondeseinterrumpi.

mikroCreconoceunarutinadeinterrupcinqueseejecutarcomolafuncinvoidinterrupt().Elcuerpodelafuncin,osea,rutinade
interrupcin,debeserescritoporelusuario.

voidinterrupt(){//Interruptroutine
cnt++//Interruptcausesvariablecnttobeincrementedby1
}

CmoutilizarlosregistrosSFR

Supongamosqueustedhacompradoyaunmicrocontroladoryquetieneunabuenaideadecmoutilizarlo...LalistadelosregistrosSFR
ascomodesusbitsesmuylarga.Cadaunocontrolaalgnproceso.Engeneral,parececomounagrantabladecontrolconungran
nmerodeinstrumentoseinterruptores.Ahoraestpreocupadodecmoconseguiraprenderacercadetodosellos?Espocoprobable,
peronosepreocupe,Ustednotienequehacerlo!Losmicrocontroladoressontanpotentesqueseparecenalossupermercados:ofrecen
tantascosasabajospreciosyaustedsololetocaelegirlasquenecesita.Poreso,seleccioneelcampoenqueestinteresadoyexamine
sloloquenecesita.Cuandoentiendacompletamenteelfuncionamientodehardware,examinelosregistrosSFRencargadosde
controlarlo(normalmentesonunospocos).

Comotodoslosdispositivostienenuntipodesistemadecontrolelmicrocontroladortienesus"palancas"conlasqueusteddebeestar
familiarizadoparasercapazdeutilizarloscorrectamente.Porsupuesto,estamoshablandodelosregistrosSFRdesdelosqueelproceso
deprogramacinseiniciayenlosqueelmismotermina.

3.2PRINCIPALESREGISTROSSFR

ElsiguientetextodescribelosprincipalesregistrosSFRdelmicrocontroladorPIC16F887.Losbitsdecadaregistrocontrolanloscircuitos
diferentesdentrodelchip,asquenoesposibleclasificarlosengruposespeciales.Porestarazn,sedescribenjuntoconlosprocesos
quecontrolan.

RegistroSTATUS

ElregistroSTATUScontiene:elestadoaritmticodedatosenelregistroW,elestadoRESET,losbitsparaseleccionarelbancoparalos
datosdelamemoria.

IRPRegistrodeseleccindeBanco(usadoparadireccionamientoindirecto)
1Bancos0y1sonactivos(localidadesdememoria00hFFh)
0Bancos2y3sonactivos(localidadesdememoria100h1FFh)

RP1,RP0Registrodeseleccindebanco(usadoparadireccionamientodirecto).

RP1 RP0 BANCO ACT IVO

0 0 Banco0

0 1 Banco1

1 0 Banco2

1 1 Banco3

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 12/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos
TOTimeoutbit(bitdesalidadeltemporizadorperroguardin)
1Despusdeencenderelmicrocontrolador,despusdeejecutarselainstruccinCLRWDTquereiniciaalWDT(temporizadorperro
guardin)odespusdeejecutarselainstruccinSLEEPqueponealmicrocontroladorenelmododebajoconsumo.
0DespusdeacabarseeltiempodelWDT.

PDPowerdownbit(bitdeapagado)
1Despusdeencenderelmicrocontrolador,despusdeejecutarlainstruccinCLRWDTquereiniciaalWDT.
0DespusdeejecutarselainstruccinSLEEPqueponealmicrocontroladorenelmododebajoconsumo.

ZZerobit(bitcero)
1Elresultadodeunaoperacinlgicaoaritmticaes0.
0Elresultadodeunaoperacinlgicaoaritmticaesdistintode0.

DCDigitcarry/borrowbit(bitdeacarreo/prstamodedgito)cambiaalsumaroalrestarsiocurreun
"desbordamiento"oun"prstamo"enelresultado.
1Huboacarreodelcuartobitdeordenbajo(nibblebajo)enelresultado.
0Nohuboacarreodelcuartobitdeordenbajo(nibblebajo)enelresultado.

CCarry/Borrowbit(bitdeacarreo/prstamo)cambiaalsumaroalrestarsiocurreun"desbordamiento"oun
"prstamo"enelresultado,oseasielresultadoesmayorde255omenorde0.
1Ocurriacarreoenelbitmssignificativo(MSB)delresultado.
0Noocurriacarreoenelbitmssignificativo(MSB)delresultado.

RegistroOPTION_REG

ElregistroOPTION_REGcontienevariosbitsdecontrolparaconfigurarelpreescaladordelTemporizador0/WDT,eltemporizador
Timer0,lainterrupcinexternaylasresistenciaspullupenelpuertoPORTB.

RBPUPortBPullupEnablebit(resistenciaPullUpPuertoB)
1Desactivadas.
0Activadas.

INTEDGInterruptEdgeSelectbit(bitselectordeflancoactivodela
interrupcinexterna)
1InterrupcinporflancoascendenteenelRB0/INT.
0InterrupcinporflancodescendenteenelRB0/INT.

T0CSTMR0ClockSourceSelectbit(bitselectordetipoderelojparael
Timer0)
1PulsosintroducidosatravsdelTOCKI(contador).
0PulsosderelojinternosFosc/4(temporizador).

T0SETMR0SourceEdgeSelectbit(bitselectordetipodeflancoenTOCKI)seleccionaelflanco(ascendenteo
descendente)contadoporeltemporizadorTimer0porelpinRA4/T0CKI.
1IncrementaenflancodescendenteenelpinTOCKI.
0IncrementaenflancoascendenteenelpinTOCKI.

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 13/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos

PSAPrescalerAssignmentbitasignaelpreescalador(hayslouno)al
temporizadoroalWDT.
1PreescaladorseleasignaalWDT.
0PreescaladorseleasignaaltemporizadorTimer0.

PS2,PS1,PS0PrescalerRateSelectbits(bitselectordelvalordeldivisordefrecuencia)

Elvalordeldivisordefrecuenciaseseleccionaalcombinarestostresbits.Comosemuestraenlasiguientetabla,elvalordeldivisorde
frecuenciaseleasignaaltemporizador(Timer0)oaltemporizadorperroguardin(WDT).

PS2 PS1 PS0 TMR0 WDT

0 0 0 1:2 1:1

0 0 1 1:4 1:2

0 1 0 1:8 1:4

0 1 1 1:16 1:8

1 0 1 1:64 1:32

1 1 0 1:128 1:64

1 1 1 1:256 1:128

Paraconseguirelvalordeldivisordefrecuencia1:1cuandoeltemporizadorTimer0cuentapulsos,elpreescaladordebeserasignadoal
WDT.Enconsecuencia,eltemporizadorTimer0noutilizaelpreescalador,sinoquecuentadirectamentelospulsosgeneradosporel
oscilador,loqueeraelobjetivo.

VamosahacerloenmikroC...

/*SielcomandoCLRWDTnoseejecuta,
elWDTvaareiniciaralmicrocontroladorcada32.768uS(f=4MHz)*/

voidmain(){
OPTION_REG=0b00001111//PreescaladorestasignadoalWDT(1:128)
asmCLRWDT//ComandoenensambladorparareiniciaralWDT
...
...//EltiempoentreestosdoscomandosCLRWDTnodebeexceder32.768microsegundos(128x256)
...
asmCLRWDT//ComandoenensambladorparareiniciaralWDT
...
...//EltiempoentreestosdoscomandosCLRWDTnodebeexceder32.768microsegundos(128x256)
...
asmCLRWDT//ComandoenensambladorparareiniciaralWDT
}

REGISTROSDELSISTEMADEINTERRUPCIN

Alllegarlapeticindeinterrupcin,nosignificaqueunainterrupcinocurrirautomticamente,puestoquedebeserhabilitadaporel
usuario(porelprograma)tambin.Porestarazn,haybitsespecialesutilizadosparahabilitarodeshabilitarinterrupciones.Esfcilde
reconocerlosporlasletrasIEcontenidasensusnombres(InterruptEnableInterrupcinhabilitada).Adems,cadainterrupcinseasocia
conotrobitdenominadobanderaqueindicaqueunapeticindeinterrupcinhallegadosinverificarsiesthabilitada.Asimismo,se
reconocenconfacilidadporlasdosltimasletrascontenidasensusnombresIF(InterruptFlagBanderadeinterrupcin).

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 14/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos

Comohemosvisto,todalaideaesmuysimpleyeficiente.Alllegarlapeticindeinterrupcin,primeroelbitdebanderaseponeauno.

SielbitIEapropiadoestacero(0),estacondicinserignoradacompletamente.Delocontrario,ocurreunainterrupcin.Sivarias
fuentesdeinterrupcinestnhabilitadas,esnecesariodetectarlaactivaantesdequelarutinadeinterrupcinsepongaaejecutar.La
deteccindelafuenteserealizaalcomprobarlosbitsdelasbanderas.

Cabedestacarquelosbitsdecadabanderanoseponenaceroautomticamente,sinoporelsoftware,mientrasquelaejecucindela
rutinadeinterrupcincontinaejecutndose.Sinohacemoscasoaestedetalle,ocurrirotrainterrupcininmediatamentedespusde
volveralprogramaprincipal,aunquenohaymspeticionesdeejecucin.Simplemente,labandera,ascomoelbitIE,sequedanenuno.

TodaslasfuentesdeinterrupcintpicasparaelmicrocontroladorPIC16F887semuestranenlasiguientepgina.Fjeseenlosiguiente:

ElbitGIEhabilita/deshabilitasimultneamentelasinterrupcionesnoenmascaradas.

ElPEIEbithabilita/deshabilitalasinterrupcionesnoenmascaradasdeperifricos.EstonoserefierealtemporizadorTimer0yalasfuentes
deinterrupcindelpuertoPORTB.

ParahabilitarunainterrupcincausadaporelcambiodelestadolgicoenelpuertoPORTB,esnecesariohabilitarlaparacadabitpor
separado.Enestecaso,losbitsdelregistroIOCBsecomportancomolosbitsIEdecontrol.

RegistroINTCON

ElregistroINTCONcontienevariosbitsdehabilitacinydebanderaparaeldesbordamientoenelregistroTMR0,einterrupcionesporel
cambiodelestadoenelpuertoPORTBylasinterrupcionesexternasenelpinINT.

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 15/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos
GIEGlobalInterruptEnablebit(bitdehabilitacindeinterrupcionesglobales)controlasimultneamentetodaslas
fuentesdeinterrupcionesposibles.
1Habilitalasinterrupcionesnoenmascaradas.
0Deshabilitalasinterrupcionesnoenmascaradas.

PEIEPeripheralInterruptEnablebit(bitdehabilitacindeinterrupcionesperifricas)essimilaralbitGIE,sin
embargocontrolainterrupcioneshabilitadasporlosperifricos.Esosignificaquenoinfluyeeninterrupciones
causadasporeltemporizadorTimer0oporelcambiodelestadoenelpuertoPORTBoporelcambioenelpin
RB0/INT.
1Habilitalasinterrupcionesperifricasnoenmascaradas.
0Deshabilitalasinterrupcionesperifricasnoenmascaradas.

T0IETMR0OverflowInterruptEnablebit(bitdehabilitacindeinterrupcionesporeldesbordamientodel
temporizadorTimer0)controlainterrupcionescausadasporeldesbordamientodelTimer0.
1HabilitainterrupcionesporTimer0.
0DeshabilitainterrupcionesporTimer0.

INTERB0/INTExternalInterruptEnablebit(bitdehabilitacindelainterrupcinexternaenRB0)controla
interrupcionescausadasporelcambiodelestadolgicoenelpindeentradaRB0/INT(interrupcinexterna).
1HabilitainterrupcionesexternasINT.
0DeshabilitainterrupcionesexternasINT.

RBIERBPortChangeInterruptEnablebit(bitdehabilitacindeinterrupcionesporcambiosenelpuerto
PORTB).Cuandoseconfigurancomoentradas,lospinesenelpuertoPORTBpuedencausarunainterrupcinal
cambiarelestadolgico(noimportasiseproducebajadaosubidadetensin,loqueimportaesqueseproduceun
cambio).Estebitdeterminasiunainterrupcinvaaocurrir.
1HabilitainterrupcionesporcambioenelpuertoPORTB.
0DeshabilitainterrupcionesporcambioenelpuertoPORTB.

T0IFTMR0OverflowInterruptFlagbit(bitdebanderadeinterrupcinporeldesbordamientodelTimer0)detectael
desbordamientoenelregistrodeltemporizadorTimer0,oseaelcontadorseponeacero.
1EnelregistrodelTimer0haocurridodesbordamiento(estabanderadebevolversea0porsoftware).
0EnelregistrodelTimer0nohaocurridodesbordamiento.

INTFRB0/INTExternalInterruptFlagbit(bitdebanderadeinterrupcinexternaenINT)detectaelcambioenel
estadolgicoenelpinINT.
1HaocurridounainterrupcinexternaporINT(estabanderadebevolversea0porsoftware)
0NohaocurridounainterrupcinexternaporINT.

RBIFRBPortChangeInterruptFlagbit(bitdebanderadeinterrupcinporcambioenelpuertoRB)detecta
cualquiercambiodelestadolgicodealgunodelospinesdeentradaenelpuertoPORTB.
1AlmenosunodelospinesdeE/SdepropsitogeneralenelpuertoPORTBhacambidodevalor.DespusdeleerelpuertoPORTB,
elbitRBIFdebevolversea0porsoftware).
0NingunodelospinesdeE/SdepropsitogeneralenelpuertoPORTBhacambiadodevalor.

VamosahacerloenmikroC...

//ElpinPORTB.4seconfiguracomounaentradasensiblealcambiodelestadolgico.

voidinitMain(){
ANSEL=ANSELH=0//TodoslospinesdeE/Sseconfigurancomodigitales
PORTB=0//TodoslospinesdelpuertoPORTBseponenacero
TRISB=0b00010000//TodoslospinesdelpuertoPORTBmenosPORTB.4se
//configurancomosalidas

RBIE=1//SehabilitanlasinterrupcionesporelcambioenelpuertoPORTB
IOCB4=1//Sehabilitalainterrupcinporelcambioenelpin4enel
//puertoPORTB
GIE=1//Sehabilitalainterrupcinglobal
...//Desdeestepunto,seproduceunainterrupcinconcualquiercambio
...//delestadolgicoenelpinPORTB.4
...

RegistroPIE1

ElregistroPIE1contienelosbitsdehabilitacindeinterrupcionesperifricas.

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 16/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos

ADIEA/DConverterInterruptEnablebit(bitdehabilitacindeinterrupcionesdelconvertidorA/D).
1HabilitalainterrupcinADC.
0DeshabilitalainterrupcinADC.

RCIEEUSARTReceiveInterruptEnablebit(bitdehabilitacindeinterrupcionesderecepcindelEUSART).
1HabilitalainterrupcinderecepcindelEUSART.
0DeshabilitalainterrupcinderecepcindelEUSART.

TXIEEUSARTTransmitInterruptEnablebit(bitdehabilitacindeinterrupcionesdetransmisindel
EUSART).
1HabilitalainterrupcindetransmisindelEUSART.
0DeshabilitalainterrupcindetransmisindelEUSART.

SSPIEMasterSynchronousSerialPort(MSSP)InterruptEnablebit(bitdehabilitacindelainterrupcindel
puertoseriesncronomaestro(MSSP)habilitagenerarunapeticindeinterrupcindespusdecadatransmisinde
datosporelmdulodecomunicacinseriesncrona(modoSPIoI2C).
1HabilitalainterrupcindelMSSP.
0DeshabilitalainterrupcindelMSSP.

CCP1IECCP1InterruptEnablebit(bitdehabilitacindelainterrupcindelmdulo1de
Comparacin/Captura/PWMCCP1)permitegenerarunapeticindeinterrupcinenelmduloCCP1utilizadopara
procesamientodelasealPWM.
1HabilitalainterrupcinCCP1.
0DeshabilitalainterrupcinCCP1.

TMR2IETMR2toPR2MatchInterruptEnablebit(bitdehabilitacindelainterrupcindeigualdadentre
TMR2yPR2)
1HabilitalainterrupcindeigualdadentreTMR2yPR2.
0DeshabilitalainterrupcindeigualdadentreTMR2yPR2.

TMR1IETMR1OverflowInterruptEnablebit(bitdehabilitacindelainterrupcindedesbordamientodel
temporizadorTimer1)habilitagenerarunapeticindeinterrupcindespusdecadadesbordamientoenelregistrodel
temporizadorTimer1,oseaelcontadorseponeacero.
1HabilitalainterrupcindedesbordamientodeltemporizadorTimer1.
0DeshabilitalainterrupcindedesbordamientodeltemporizadorTimer1.

VamosahecerloenmikroC...

/*Seproduceunainterrupcinconcadadesbordamientoenelregistrodeltemporizador1
queconsisteenTMR1HyTMR1L.Encadarutinadeinterrucpiones,lavariable
cntserincrementadapor1*/

unsignedshortcnt//Definirlavariablecnt
voidinterrupt()//Iniciodelarutinadeinterrupcin
cnt++//Alproducirseunainterrupcin,lacntse
//incrementapor1
PIR1.TMR1IF=0//ElbitTMR1IFsereinicia
TMR1H=0x80//AlosregistrosdeltemporizadorTMR1HyTMR1Lseles
TMR1L=0x00//devuelvensusvaloresiniciales
}//Finaldelarutinadeinterrupcin

voidmain(){
ANSEL=ANSELH=0//TodoslospinesdeE/Sseconfigurancomodigitales
T1CON=1//EncendereltemporizadorTimer
PIR1.TMR1IF=0//ElbitTMR1IFseponeacero
TMR1H=0x80//EstablecerlosvaloresinicialesparaeltemporizadorTimer1
TMR1L=0x00
PIE1.TMR1IE=1//Habilitarlainterrupcinalproducirseun
//desbordamientoenelTimer1
cnt=0//Reiniciarlavariablecnt
INTCON=0xC0//Habilitarlainterrupcin(losbitsGIEyPEIE)
...

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 17/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos
RegistroPIE2

ElregistroPIE2tambincontienevariosbitsdehabilitacindeinterrupciones.

OSFIEOscillatorFailInterruptEnablebit(bitdehabilitacindelainterrupcindefalloeneloscilador)
1Habilitalainterrupcindefalloeneloscilador.
0Deshabilitalainterrupcindefalloeneloscilador.

C2IEComparatorC2InterruptEnablebit(bitdehabilitacindelainterrupcindelcomparadorC2)
1HabilitalainterrupcindelcomparadorC2.
0DeshabilitalainterrupcindelcomparadorC2.

C1IEComparatorC1InterruptEnablebit(bitdehabilitacindelainterupcindelcomparadorC1)
1HabilitalainterrupcindelcomparadorC1
0DeshabilitalainterrupcindelcomparadorC1.

EEIEEEPROMWriteOperationInterruptEnablebit(bitdehabilitacindelainterrupcindeescrituraenla
memoriaEEPROM)
1HabilitalainterrupcindeescrituraenlamemoriaEEPROM.
0DeshabilitalainterrupcindeescrituraenlamemoriaEEPROM.

BCLIEBusCollisionInterruptEnablebit(bitdehabilitacindelainterrupcindecolisindebus)
1Habilitalainterrupcindecolisindebus.
0Deshabilitalainterrupcindecolisindebus.

ULPWUIEUltraLowPowerWakeupInterruptEnablebit(bitdehabilitacindelainterrupcinparasalirdel
mododeultrabajoconsumolareactivacin)
1Habilitalainterrupcinparasalirdelmododeultrabajoconsumo.
0Deshabilitalainterrupcinparasalirdelmododeultrabajoconsumo.

CCP2IECCP2InterruptEnablebit(bitdehabilitacindelainterrupcindelmdulo2de
Comparacin/Captura/PWM(CCP2)
1HabilitalainterrupcindelCCP2.
0DeshabilitalainterrupcindelCCP2.

VamosahacerloenmikroC...

/*ElcomparadorC2seconfiguraparautilizarlospinesRA0yRA2comoentradas.Alproducirse
uncambioenlasalidadelcomparador,elpindesalidaPORTB.1cambiaelestadolgicoenla
rutinadeinterrupcin.*/

voidinterrupt(){//Iniciodelarutinadeinterrupcin
PORTB.F1=~PORTB.F1//Lainterrupcininvertirelestadolgicodel
//pinPORTB.1
PIR2.C2IF=0//BitdebanderadeinterrupcinC2IFseponeacero
}//Finaldelarutinadeinterrupcin

voidmain(){
TRISB=0//TodoslospinesdelpuertoPORTBseconfiguran
//comosalidas
PORTB.F1=1//ElpinPORTB.1seponeauno
ANSEL=0b00000101//LospinesRA0/C12IN0yRA2/C2IN+sonlas
//entradasanalgicas
ANSELH=0//TodoslospinesdeE/Sseconfigurancomodigitales
CM2CON0.C2CH0=CM2CON0.C2CH1=0//ElpinRA0seseleccionaparaseruna
//entradainvertidadelC2
PIE2.C2IE=1//HabilitalainterrupcindelcomparadorC2INT
CON.GIE=1//Interrupcinglobalesthabilitada
CM2CON0.C2ON=1//ComparadorC2esthabilitado
...
...

RegistroPIR1

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 18/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos
ElregistroPIR1contienelosbitsdebanderasdeinterrupcin.

ADIFA/DConverterInterruptFlagbit(bitdebanderadelainterrupcindelconvertidorA/D)
1SehacompletadounaconversinA/D(elbitdebevolversea0porsoftware)
0NosehacompletadounaconversinA/Donohaempezado

RCIFEUSARTReceiveInterruptFlagbit(bitdebanderadelainterrupcinderecepcindelEUSART)
1ElbferderecepcindelEUSARTestlleno.ElbitseponeaceroalleerelregistroRCREG.
0ElbferderecepcindelEUSARTnoestlleno.

TXIFEUSARTTransmitInterruptFlagbit(bitdelainterrupcindetransmisindelEUSART)
1ElbferdetransmisindelEUSARTestvaco.ElbitseponeaceroalesribirundatoenelregistroTXREG.
0ElbferdetransmisindelEUSARTestlleno.

SSPIFMasterSynchronousSerialPort(MSSP)InterruptFlagbit(bitdebanderadelainterrupcindepuerto
seriesncronomaestro)
1SehacumplidolacondicindeocurrirunainterrupcindelMSSPaltransmitir/recibirlosdatos.Difierendependiendodelmodode
operacindelMSSP(SPIoI2C).Elbitdebeponerseaceroporsoftwareantesdevolverdelarutinadeserviciodeinterrupciones)
0NosehacumplidoningunacondicindeocurrirunainterrupcindelMSSP.

CCP1IFCCP1InterruptFlagbit(bitdebanderadelainterrupcindelmdulo1de
Comparacin/Captura/PWM(CCP1).
1SehacumplidolacondicindelainterrupcindelCCP1(CCP1esunaunidadparacaptar,compararygenerarunasealPWM).
Dependiendodelmododeoperacin(modocapturaomodocomparacin),seproduceunacapturaolaigualdadenlacomparacin.En
amboscasos,elbitdebevolverseaceroporsoftware.ElbitnoseutilizaenelmodoPWM.
0NosehacumplidolacondicindelainterrupcindelCCP1.

TMR2IFTimer2toPR2InterruptFlagbit(bitdebanderadelainterrupcindeigualdadentreeltemporizador
Timer2yelregistroPR2)
1SehaproducidoigualdadconelvalordelTMR2(registrode8bitsdeltemporizador)yelvalordelPR2.Elbitdebeponerseacero
porsoftwareantesdevolverdelarutinadeserviciodeinterrupciones).
0NosehaproducidoigualdadconelvalordelTMR2yelvalordelPR2.

TMR1IFTimer1OverflowInterruptFlagbit(bitdebanderadelainterrupcindedesbordamientodel
temporizadorTimer1)
1SehaproducidodesbordamientodelTimer1.Elbitdebeponerseaceroporsoftware.
0NosehaproducidodesbordamientodelTimer1.

RegistroPIR2

ElregistroPIR2contienelosbitsdebanderasdalainterrupcin.

OSFIFOscillatorFailInterruptFlagbit(bitdebanderadelainterrupcindefalloeneloscilador)
1Sehaproducidounfalloenelosciladordelsistema.LaentradaderelojhasidoconmutadaalosciladorinternoINTOSC.Elbitdebe
ponerseaceroporsoftware.
0Elosciladordelsistemafuncionacorrectamente.

C2IFComparatorC2InterruptFlagbit(bitdebanderadelainterrupcindelcomparadorC2)
1LasalidadelcomparadoranalgicoC2hasidocambiada(elbitC2OUT).Elbitdebeponerseaceroporsoftware.
0LasalidadelcomparadoranalgicoC2nohasidocambiada.

C1IFComparatorC1InterruptFlagbit(bitdebanderadelainterrupcindelcomparadorC1)
1LasalidadelcomparadoranalgicoC1hasidocambiada(elbitC1OUT).Elbitdebeponerseaceroporsoftware.
0LasalidadelcomparadoranalgicoC1nohasidocambiada.

EEIFEEWriteOperationInterruptFlagbit(bitdebanderadelainterrupcindelaoperacindeescrituraen
lamemoriaEEPROM)

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 19/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos
1LaoperacindeescrituraenlamemoriaEEPROMsehacompletado.Elbitdebeponerseaceroporsoftware.
0LaoperacindeescrituraenlamemoriaEEPROMnosehacompletadootodavanosehainiciado.

BCLIFBusCollisionInterruptFlagbit(bitdebanderadelainterrupcindecolisindebusenelMSSP)
1SehaproducidounacolisindebusenelMSSPalserconfiguradoparaelmodomaestroI2C.Elbitdebeponerseaceropor
software.
0NosehaproducidocolisindebusenelMSSP.

ULPWUIFUltraLowpowerWakeupInterruptFlagbit(bitdebanderadelainterrupcinparasalirdelmodo
deultrabajoconsumolareactivacin)
1Sehacumplidolacondicindesalirdelmododeultrabajoconsumo.Elbitdebeponerseaceroporsoftware.
0Nosehacumplidolacondicindesalirdelmododeultrabajoconsumo.

CCP2IFCCP2InterruptFlagbit(bitdelainterrupcindelmdulo2deComparacin/Captura/PWMCCP2)
1SehacumplidolacondicindelainterrupcindelCCP2(CCP2esunaunidadparacaptar,compararygenerarunasealPWM).
Dependiendodelmododeoperacin(modocapturaomodocomparacin),seproduceunacapturaolaigualdadenlacomparacin.En
amboscasos,elbitdebevolverseaceroporsoftware.ElbitnoseutilizaenelmodoPWM.
0NosehacumplidolacondicindelainterrupcindelCCP2.

VamosahacerloenmikroC...

//SecuenciadeactivacindelmduloULPWU

voidmain(){
PORTA.F0=1//PinPORTA.0seponeauno
ANSEL=ANSELH=0//TodoslospinesdeE/Sseconfigurancomodigitales
TRISA=0//LospinesdelpuertoPORTAseconfigurancomosalidas
Delay_ms(1)//Cargarelcapacitor
PIR2.ULPWUIF=0//BanderaULPWUIFseponeacero
PCON.ULPWUE=1//HabilitarelfuncionamientodelmduloULPWU
TRISA.F0=1//PORTA.0seconfiguracomoentrada
PIE2.ULPWUIE=1//HabilitarlainterrupcinporelmduloULPWU
INTCON.GIE=INTCON.PEIE=1//Habilitartodaslasinterrupciones
asmSLEEP//Pasaralmododebajoconsumo
...
...

RegistroPCON

ElregistroPCONcontienesolamentedosbitsdebanderasutilizadosparadiferenciarentreunPoweronreset(POR),unBrownoutreset
(BOR),unreinicioporeltemporizadorperroguardin(WDT)yunreinicioexternoporelpinMCLR.

ULPWUEUltraLowPowerWakeupEnablebit(bitdehabilitacinparasalirdelmododeultrabajoconsumo
lareactivacin)
1Sehabilitasalirdelmododeultrabajoconsumo.
0Nosehabilitasalirdelmododeultrabajoconsumo.

SBORENSoftwareBOREnablebit(bitdehabilitacindelBORporsoftware)
1SehabilitaBrownoutreset.
0SedeshabilitaBrownoutreset.

PORPoweronResetStatusbit(bitdeestadoPoweronreset)
1NosehaproducidoPoweronreset.
0SehaproducidoPoweronreset.ElbitdebeponerseaunoporsoftwaredespusdequesehayaproducidounPoweronreset.

BORBrownoutResetStatusbit(bitdeestadoBrownoutreset)
1NosehaproducidoBrownoutreset.
0SehaproducidoBrownoutreset.ElbitdebeponerseaunoporsoftwaredespusdequesehayaproducidoBrownoutreset.

REGISTROSPCLYPCLATH

LamemoriadeprogramadelPIC16F887esde8Kytiene8192localidadesparaelalmacenamientodeprograma.Porestarazn,el
contadordeprogramadebedeserde13bitsdeanchura(213=8192).Parahabilitarelaccesoaunalocalidaddememoriadeprograma
duranteelfuncionamientodelmicrocontrolador,esnecesarioaccederasudireccinpormediodelosregistrosSFR.Comotodoslos

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 20/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos
registrosSFRsonde8bitsdeanchura,esteregistrodedireccionamientoescreadoartificialmentealdividirlos13bitsendosregistros
independientes,PCLATHyPCL.Silaejecucindeprogramanoafectaalcontadordeprograma,elvalordeesteregistrova
incrementndoseautomticayconstantemente:+1,+1,+1,+1...Deestamanera,elprogramaseejecutacomoestescritoinstruccina
instruccin,seguidoporunincrementodedireccinconstante.

Sielcontadordeprogramahasidocambiadoporsoftware,debetomarencuentalosiguienteparaevitarproblemas:

Losochobitsinferiores(elbyteinferior)delregistroPCLsondelectura/escritura,mientrasqueloscincobits
superioresdelregistroPCLATHsondesloescritura.
ElregistroPCLATHseborraconcadareinicio.
Enellenguajeensamblador,elvalordelcontadordeprogramaestmarcadoconPCLyserefieresloalosocho
bits.Usteddebetenercuidadoalutilizarlainstruccin"ADDWFPCL".Estoesunainstruccindesaltoque
especificalalocalidaddestinoalaadirunnmeroaladireccinactual.Seutilizaconfrecuenciaparasaltaralatabla
debsquedaoalatabladeramificacindeprogramayleerlas.Unproblemasurgesiladireccinactualesdetal
tamaoquealsumarseproduceuncambioenunbitquepertenecealbytesuperiordelregistroPCLATH.
LaejecucindeunainstruccinsobreelregistroPCLcausasimultneamentelasustitucindelosbitsdelcontador
deprogramaporloscontenidosenelregistroPCLATH.Detodosmodos,elregistroPCLpuedeaccedersloa8bits
inferioresdelresultadodelainstruccin,pueselsiguientesaltosercompletamenteincorrecto.Lasolucinaeste
problemaesponerestasinstruccionesenlasdireccionesqueterminanenxx00h.Deestamanerasehabilitanlos
saltosdeprogramahasta255localidades.Siseejecutanlossaltosmslargospormediodeestainstruccin,el
registroPCLATHdebeserincrementadopor1cadavezqueseproducedesbordamientoenelregistroPCL.
Alllamarunasubrutinaoalejecutarseunsalto(instruccionesCALLyGOTO),elmicrocontroladorescapazde
proporcionarsolamentedireccionamientode11bits.SimilaralaRAMqueestdivididaenbancos,laROMest
divididaenlascuatropginasde2Kcadauna.Lasinstruccionesdentrodeestaspginasseejecutanregularmente.
Dichodemanerasencilla,comoelprocesadorestproporcionadoconunadireccinde11bitsdelprograma,es
capazdedireccionarcualquierlocalidaddentrode2KB.Lasiguientefiguramuestraelsaltoaladireccindel
subprogramaPP1.

Sinembargo,siunasubrutinaounadireccindesaltonoestenlamismapginaquelalocalidaddesalto,sedebenproporcionardos
bitssuperioresquefaltanalescribirenelregistroPCLATH.LasiguientefiguramuestraelsaltoaladireccindelasubrutinaPP2.

Enamboscasos,cuandolasubrutinallegaalasinstruccionesRETURN,RETLWoRETFIE(vueltaalprogramaprincipal),elmicrocontrolador
continuarconlaejecucindeprogramadesdedondeseinterrumpi,yaqueladireccinderetornoseempujayseguardaenlapilaque
consisteenregistrosde13bits,comohemosmencionado.

REGISTROSDEDIRECCIONAMIENTOINDIRECTO

Ademsdeldireccionamientodirecto,queeslgicoyclaro(bastaconespecificarladireccindeunregistroparaleersucontenido),este
microcontroladorescapazderealizareldireccionamientoindirectoporlosregistrosINDFyFSR.Avecesestofacilitaelprocesodeescribir
unprograma.ElprocedimientoenteroesthabilitadoyaqueelregistroINDFnoesreal(noexistefsicamente),sinoquesolamente

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 21/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos
especificaelregistrocuyadireccinestsituadaenelregistroFSR.Porestarazn,escribiroleerlosdatosdelregistroINDFrealmente
significaescribiroleerdelregistrocuyadireccinestsituadaenelregistroFSR.Enotraspalabras,direccionesderegistrosse
especificanenelregistroFSR,ysucontenidosealmacenaenelregistroINDF.Ladiferenciaentreeldireccionamientodirectoeindirecto
semuestraenlasiguientefigura:

Comohemosvisto,elproblemacon"losbitsdedireccionamientoquefaltan"sesolucionaconun"prstamo"delotroregistro.Estavez,es
elsptimobit,denominadobitIRPdelregistroSTATUS.

Unadelascaractersticasmsimportantesdelmicrocontroladoreselnmerodelospinesdeentrada/salida,quepermiteconectarlocon
losperifricos.ElPIC16F887tieneentotal35pinesdeE/Sdepropsitogeneral,loqueessuficienteparalamayoradelasaplicaciones.

3.3PUERTOSDEENTRADA/SALIDA

ConelpropsitodesincronizarelfuncionamientodelospuertosdeE/Sconlaorganizacininternadelmicrocontroladorde8bits,ellosse
agrupan,demanerasimilaralosregistros,encincopuertosdenotadosconA,B,C,DyE.Todosellostienenlassiguientescaractersticas
encomn:

Porlasrazonesprcticas,muchospinesdeE/Ssonmultifuncionales.Siunpinrealizaunadeestasfunciones,
puedeserutilizadocomopindeE/Sdepropsitogeneral.
Cadapuertotienesupropioregistrodecontroldeflujo,oseaelregistroTRIScorrespondiente:TRISA,TRISB,
TRISCetc.loquedeterminaelcomportamientodebitsdelpuerto,peronodeterminasucontenido.
AlponeracerounbitdelregistroTRIS(pin=0),elpincorrespondientedelpuertoseconfigurarcomounasalida.Demanerasimilar,al
poneraunounbitdelregistroTRIS(bit=1),elpincorrespondientedelpuertoseconfigurarcomounaentrada.Estareglaesfcilde
recordar:0=Entrada1=Salida.

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 22/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos

PuertoPORTAyregistroTRISA

ElpuertoPORTAesunpuertobidireccional,de8bitsdeanchura.LosbitsdelosregistrosTRISAyANSELcontrolanlospinesdelPORTA.
TodoslospinesdelPORTAsecomportancomoentradas/salidasdigitales.Cincodeellospuedenserentradasanalgicas(denotadaspor
AN):

RA0=AN0(determinadoporelbitANS0delregistroANSEL)

RA1=AN1(determinadoporelbitANS1delregistroANSEL)

RA2=AN2(determinadoporelbitANS2delregistroANSEL)

RA3=AN3(determinadoporelbitANS3delregistroANSEL)

RA5=AN4(determinadoporelbitANS4delregistroANSEL)

SimilaraquelosbitsdelregistroTRISAdeterminanculespinessernconfiguradoscomoentradasyculessernconfiguradoscomo
salidas,losbitsapropiadosdelregistroANSELdeterminansilospinessernconfiguradoscomoentradasanalgicasoentradas/salidas
digitales.

Cadabitdeestepuertotieneunafuncinadicionalrelacionadaaalgunasunidadesperifricasintegradas,quevamosadescribirenlos
siguientescaptulos.EstecaptulocubreslolafuncinadicionaldelpinRA0,puestoqueestrelacionadoalpuertoPORTAyalaunidad
ULPWU.

VamosahacerloenmikroC...

//ElpinPORTA.2seconfiguracomounaentradadigital.Todoslosdemspinesdelpuerto
//PORTAsonsalidasdigitales

...

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 23/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos
ANSEL=ANSELH=0//TodoslospinesdeE/Sseconfigurancomodigitales
PORTA=0//TodoslospinesdelpuertoPORTAseponenacero
TRISA=0b00000100//TodoslospinesdelpuertoPORTAexceptoel
//PORTA.2seconfigurancomosalidas

...

UNIDADULPWU

Elmicrocontroladorseutilizageneralmenteenlosdispositivosquefuncionanperidicamenteycompletamenteindependienteutilizando
unafuentedealimentacindebatera.Entalcaso,elconsumodecorrientemnimoesunadelasprioridades.Losejemplostpicosde
talesaplicacionesson:termmetros,sensoresdedeteccindelfuegoysimilar.Esconocidoquealreducirfrecuenciaderelojsereduceel
consumodecorriente,puesunadelassolucionesmsconvenientesaesteproblemaesbajarlafrecuenciadereloj,oseautilizarelcristal
decuarzode32KHzenvezdeelde20MHz.

Alponerelmicrocontroladorenelmododereposoesotropasoenlamismadireccin.Anha
quedadoelproblemadesalirdeestemodoyponerelmicrocontroladorenmodonormalde
funcionamiento.Esobviamentenecesariotenerunasealexternaenalgunodelospines.Estaseal
debesergeneradaporcomponenteselectrnicosadicionales,loqueresultaenunconsumode
energamsaltodeldispositivocompleto...

Lasolucinperfectaseraqueelmicrocontroladorsalieradelmododereposoperidicamenteporsi
mismo,loquenoesimposible.Elcircuitoquelohabilitasemuestraenlafiguraalaizquierda.

Elprincipiodefuncionamientoessimple:

Unpinseconfiguracomosalidayselellevaununolgico(1).Estocausaunacargadelcapacitor.Inmediatamentedespus,elmismopin
seconfiguracomoentrada.Elcambiodeestadolgicohabilitaunainterrupcinyelmicrocontroladorentraenmododereposo.Sloha
quedadoesperarquesedescargueelcapacitorporlacorrientedefugafluyendoporelpindeentrada.Despusdeladescarga,se
produceunainterrupcinyelmicrocontroladorcontinaconlaejecucindeprogramaenmodonormal.Todoelprocedimientoserepite.

Enteora,estoesunasolucinperfecta.Elproblemaesquetodoslospinescapacesde
causarunainterrupcinsondigitalesytienenunacorrientedefugarelativamentealtacuando
elvoltajesobreellosnoestcercadelosvaloreslmitesdeVdd(1)oVSS(0).Enestecaso,
elcondensadorsedescargaenpocotiempoyaquelacorrienteesdevariascentenasde
microamperios.PorestaraznsediseelcircuitoULPWU,capazdeindicarunalentacada
devoltajeconunconsumodecorrientemnimo.

Lasalidageneraunainterrupcin,mientrasquelaentradaestconectadaaunodelospines
delmicrocontrolador.EselpinRA0.RefirindosealaFigura(R=200ohms,C=1nF),eltiempo
dedescargaesaproximadamente30mS,mientrasqueunconsumototaldecorrientedelmicrocontroladores1000vecesmsbajo(de
variascentenasdenanoamperios).

PuertoPORTByregistroTRISB

ElpuertoPORTBesunpuertobidireccional,de8bitsdeanchura.LosbitsdelregistroTRISBdeterminanlafuncindesuspines.

SimilaralpuertoPORTA,ununolgico(1)enelregistroTRISBconfiguraelpinapropiadoenelpuertoPORTByalrevs.Losseispines
deestepuertosepuedencomportarcomolasentradasanalgicas(AN).LosbitsdelregistroANSELHdeterminansiestospinessern
configuradoscomoentradasanalgicasoentradas/salidasdigitales:

RB0=AN12(determinadoporelbitANS12delregistroANSELH)

RB1=AN10(determinadoporelbitANS10delregistroANSELH)

RB2=AN8(determinadoporelbitANS8delregistroANSELH)

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 24/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos
RB3=AN9(determinadoporelbitANS9delregistroANSELH)

RB4=AN11(determinadoporelbitANS11delregistroANSELH)

RB4=AN11(determinadoporelbitANS11delregistroANSELH)

Cadabitdeestepuertotieneunafuncinadicionalrelacionadaaalgunasunidadesperifricasintegradas,quevamosadescribirenlos
siguientescaptulos.

Estepuertodisponedevariascaractersticasporlasquesedistinguedeotrospuertosyporlasquesuspinesseutilizanconfrecuencia:

TodoslospinesdelpuertoPORTBtienenlasresistenciaspullupintegradas,queloshacenperfectosparaquese
conectenconlosbotonesdepresin(conelteclado),interruptoresyoptoacopladores.Conelpropsitodeconectar
lasresisitenciasalospuertosdelmicrocontrolador,elbitapropiadodelregistroWPUBdebeestarauno.*

Altenerunaltonivelderesistencia(variasdecenasdekiloohmios),estasresistencias"virtuales"noafectanalospinesconfiguradoscomo
salidas,sinoquesirvendeuncomplementotilalasentradas.Estasresistenciasestnconectadosalasentradasdeloscircuitoslgicos
CMOS.Delocontrario,secomportarancomosifueranflotantesgraciasasualtaresistenciadeentrada.

AdemsdelosbitsdelregistroWPUB,hayotrobitqueafectaalainstalacindelasresistenciaspullup.EselbitRBPUdelregistro
OPTION_REG.

Alestarhabilitado,cadabitdelpuertoPORTBconfiguradocomounaentradapuedecausarunainterrupcinal
cambiarsuestadolgico.Conelpropsitodehabilitarquelosterminalescausenunainterrupcin,elbitapropiado
delregistroIOCBdebeestarauno.

Graciasaestascaractersticas,lospinesdelpuertoPORTBseutilizanconfrecuenciaparacomprobarlosbotonesdepresinenelteclado
yaquedetectancadaapretndebotninfaliblemente.Poreso,noesnecesarioexaminartodaslasentradasunayotravez.

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 25/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos

CuandolospinesX,YyZseconfigurancomoentradasdepuestaauno(1),slosenecesitaesperarunapeticindeinterrupcinque
aparecealapretarunbotn.Mstarde,secompruebaculbotnfueactivadoalcombinarcerosyunosenlasentradas.

VamosahacerloenmikroC...

/*ElpinPORTB.1seconfiguracomoentradadigital.Seproduceunainterrupcinconcualquier
cambiodesuestadolgico.Tambintieneunaresistenciapullup.Todoslosdemspinesdel
puertoPORTBsonentradasdigitales.*/

...
ANSEL=ANSELH=0//TodoslospinesdeE/Sseconfigurancomodigitales
PORTB=0//TodoslospinesdelpuertoPORTBseponenacero
TRISB=0b00000010//TodoslospinesdelpuertoPORTBexceptoPORTB.1
//seconfigurancomosalidas
RBPU=0//Sehabilitanlasresistenciaspullup
WPUB1=1//LaresistenciapullupseconectaalpinPORTB.1
IOCB1=1//ElpinPORTB.1puedecausarunainterrupcinporel
//cambiodelestadolgico
RBIE=GIE=1//Sehabilitaunainterrupcin
...

PINRB0/INT

ElpinRB0/INTeslanicafuenteverdaderadelainterrupcinexterna.Sepuedeconfigurardemaneraquereaccionealborde
ascendentedeseal(transicindeceroauno)oalbordedescendentedeseal(transicindeunoacero).ElbitINTEDGdelregistro
OPTION_REGseleccionalasealapropriada.

PINESRB6YRB7

ElPIC16F887nodisponedeningnpinespecialparalaprogramacin(elprocesodeescribirunprogramaenlaROM).Lospinesque
generalmenteestndisponiblescomolospinesdeE/Sdepropsitogeneral,seutilizanparaestepropsito.Paradecirconmsprecisin,
sonlospinesdelpuertoPORTButilizadosparalatransmisindesealdereloj(RB6)ydedatos(RB7)alcargarelprograma.Adems,es
necesariosuministrarelvoltajedealimentacinVdd(5V)ascomoelvoltajeapropiadoVpp(1214V)paralaprogramacindememoria
FLASH.Durantelaprogramacin,elvoltajeVppseaplicaalpinMCLR.Nosepreocupedelosdetallesrelacionadosaesteproceso,
tampocosepreocupedeculvoltajeseaplicaprimeropuestoqueloscomponentesdelprogramadorseencargandeeso.Loqueesmuy
importanteesqueelprogramasepuedecargaralmicrocontroladorandespusdehabersidosoldadoeneldispositivodestino.Por
supuesto,elprogramacargadosepuedecambiardelamismamanera.EstafuncinseledenominaICSP(InCircuitSerialProgramming
Programacinserialencircuito)

Parautilizarlocorrectamenteesnecesarioplanificarconantelacin.Espancomido!Sloesnecesarioinstalarunconectorminiaturade5
pineseneldispositivodestinoparasuministraralmicrocontroladorunvoltajedeprogramacinnecesario.Paraevitarlainterferenciaentre
losvoltajesyloscomponentesdeldispositivoconectadosalospinesdelmicrocontrolador,todoslosperifricosadicionalesdebenestar
desconectadosdurantelaprogramacin(utilizandolasresistenciasolospuentes).

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 26/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos

Comohemosvisto,losvoltajesaplicadosalospinesdelzcalodelprogramadorsonlosmismosquelosutilizadosdurantela
programacinICSP.

PuertoPORTCyregistroTRISC

ElpuertoPORTCesunpuertobidireccional,de8bitsdeanchura.LosbitsdelregistroTRISCdeterminanlafuncindesuspines.Similara
otrospuertos,ununolgico(1)enelregistroTRISCconfiguraelpinapropiadodelpuertoPORTCcomoentrada.

TodaslasfuncionesadicionalesdelpuertoPORTCsedescribenenlossiguientescaptulos.

PuertoPORTDyregistroTRISD

ElpuertoPORTDesunpuertobidireccionalde8bitsdeanchura.LosbitsdelregistroTRISDdeterminanlafuncindesuspines.Similara
otrospuertos,ununolgico(1)enelregistroTRISDconfiguraelpinapropiadodelpuertoPORTDcomoentrada.

PuertoPORTEyregistroTRISE

ElpuertoPORTEesunpuertobidireccional,de4bitsdeanchura.LosbitsdelregistroTRISEdeterminanlafuncindesuspines.Similara
otrospuertos,ununolgico(1)enelregistroTRISEconfiguraelpinapropiadodelpuertoPORTEcomoentrada.

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 27/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos

LaexcepcineselpinRE3,quesiempreestconfiguradocomoentrada.

SimilaralospuertosPORTAyPORTB,enestecasolostrespinessepuedenconfigurarcomoentradasanalgicas.Losbitsdelregistro
ANSELdeterminansiestospinessernconfiguradoscomoentradasanalgicas(AN)oentradas/salidasdigitales:

RE0=AN5(determinadoporelbitANS5delregistroANSEL)

RE1=AN6(determinadoporelbitANS6delregistroANSEL)y

RE2=AN7(determinadoporelbitANS7delregistroANSEL).

VamosahacerloenmikroC...

/*ElpinPORTE.0seconfiguracomounaentradaanalgicamientrasquelosdemstres
pinesdelmismopuertoseconfigurancomodigitales*/

...
ANSEL=0b00100000//ElpinPORTE.0seconfiguracomoanalgico
ANSELH=0//TodoslospinesdeE/Sseconfigurancomodigitales
TRISE=0b00000001//TodoslospinesdelpuertoPORTEexceptoel
//PORTE.0seconfigurancomosalidas
PORTE=0//TodoslosbitsdelpuertoPORTEseponenacero
...

RegistrosANSELyANSELH

LosregistrosANSELyANSELHseutilizanparaconfigurarelmododeentradadeunpindeE/Scomoanalgicoocomodigital.

Lareglaeslasiguiente:

Paraconfigurarunpincomounaentradaanalgica,elbitapropiadodelosregistrosANSELoANSELHsedebeponerauno(1).Para
configurarunpincomounaentrada/salidadigital,elbitapropiadosedebeponeracero(0).

ElestadolgicodelosbitsdelregistroANSELnotieneinfluenciaenlasfuncionesdesalidasdigitales.Alintentaraleerunpindepuerto
configuradocomounaentradaanalgica,elresultadoessiempre0.

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 28/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos

Esprobablequeustednuncavayaaescribirunprogramaquenoutilicepuertos,asqueelesfuerzoparaaprendertodosobreellosen
definitivavalelapena.Detodosmodos,lospuertossonprobablementelosmdulosmssimplesdentrodelmicrocontrolador.Seutilizan
delasiguientemanera:

Aldisearundispositivo,seleccioneunpuertoporelqueelmicrocontroladorcomunicaralentornoperifrico.Si
ustedutilizasloentradas/salidasdigitales,seleccionecualquierpuerto.Siutilizaalgunadelasentradasanalgicas,
seleccionelospuertosapropiadosquesoportantalconfiguracindelospines(AN0AN13).
Cadapindelpuertosepuedeconfigurarcomosalidaocomoentrada.LosbitsdelosregistrosTRISA,TRISB,TRISC,
TRISDyTRISEdeterminancmosecomportarnlospinesapropiadosdelospuertosPORTA,PORTB,PORTC,
PORTDyPORTE.Simplemente...
Siutilizaalgunadelasentradasanalgicas,primeroesnecesarioponeraunolosbitsapropiadosdelosregistros
ANSELyANSELHenelprincipiodeprograma.
Siutilizaresistenciasobotonesdepresincomounafuentedesealdeentrada,conctelosalospinesdelpuerto
PORTB,yaquetienenlasresistenciaspullup.ElusodeestosregistrosesthabilitadoporelbitRBPUdelregistro
OPTION_REG,mientrasquelainstalacindelasresistenciasindividualesesthabilitadaporlosbitsdelregistro
WPUB.
Confrecuenciasenecesitarespondertanprontocomolospinesdeentradacambiensuestadolgico.Sinembargo,
noesnecesarioescribirunprogramaparacomprobarelestadolgicodelospines.Esmuchomssimpleconectar
estasentradasalospinesdelpuertoPORTByhabilitarqueocurraunainterrupcinconcadacambiodevoltaje.Los
bitsdelosregistrosIOCBeINTCONseencargandeeso.
ElmicrocontroladorPIC16F887disponedetrestemporizadores/contadoresindependientes,denominadosTimer0,Timer1yTimer2.En
estecaptulosepresentaunadescripcindetalladadelosmismos.

3.4TEMPORIZADORTIMER0

EltemporizadorTimer0tieneunaampliagamadeaplicacionesenlaprctica.Slounospocosprogramasnoloutilizandealgunaforma.
Esmuyconvenienteyfcildeutilizarenprogramasosubrutinasparagenerarpulsosdeduracinarbitraria,enmedirtiempooencontar
lospulsosexternos(eventos)casisinlimitaciones.

ElmdulodeltemporizadorTimer0esuntemporizador/contadorde8bitsconlassiguientescaractersticas:

Temporizador/contadorde8bits
Preescaladorde8bits(locomparteconeltemporizadorperroguardin)
Fuentederelojinternaoexternaprogramable
Generacindeinterrupcinpordesbordamientoy
Seleccindelflancoderelojexternoprogramable.
LasiguientefiguramuestraelesquemadeltemporizadorTimer0contodoslosbitsquedeterminansufuncionamiento.Estosbitsse
almacenanenelregistroOPTION_REG.

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 29/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos

RegistroOPTION_REG

RBPUPORTBPullupenablebit(resistenciaPullUpdelpuertoPORTB)
0ResistenciaspullupdelpuertoPORTBestndeshabilitadas.
1PinesdelpuertoPORTBpuedenestarconectadosalasresistenciaspullup.

INTEDGInterruptEdgeSelectbit(bitselectordeflancoactivodelainterrupcinexterna)
0InterrupcinporflancoascendenteenelpinINT(01).
1InterrupcinporflancodescendenteenelpinINT(10).

T0CSTMR0ClockSelectbit(bitselectordetipoderelojparaelTimer0)
0Lospulsossellevanalaentradadeltemporizador/contadorTimer0porelpinRA4.
1Eltemporizadorutilizalospulsosderelojinternos(Fosc/4).

T0SETMR0SourceEdgeSelectbit(bitselectordetipodeflanco)
0IncrementaenflancodescendenteenelpinTMR0.
1IncrementaenflancoascendenteenelpinTMR0.

PSAPrescalerAssignmentbit(bitdeasignacindelpreescalador)
0PreescaladorseleasignaalWDT.
1Preescaladorseleasignaaltemporizador/contadorTimer0.

PS2,PS1,PS0PrescalerRateSelectbit(bitselectordelvalordeldivisordefrecuencias)
Elvalordeldivisordefrecuenciasseajustaalcombinarestosbits.Comosemuestraenlatablaaladerecha,lamismacombinacinde
bitsproporcionalosdiferentesvaloresdeldivisordefrecuenciasparaeltemporizador/contadoryeltemporizadorperroguardin,
respectivamente.

PS2 PS1 PS0 TMR0 WDT

0 0 0 1:2 1:1

0 0 1 1:4 1:2

0 1 0 1:8 1:4

0 1 1 1:16 1:8

1 0 0 1:32 1:16

1 0 1 1:64 1:32

1 1 0 1:128 1:64

1 1 1 1:256 1:128

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 30/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos
CuandoelbitPSAesta0,elpreescaladorseleasignaaltemporizador/contadorTimer0,comosemuestraenlasiguientefigura.

VamosahacerloenmikroC...

//Enesteejemplo,Timer0seconfiguracomountemporizadoryseleasignaunpreescalador.

unsignedcnt//Declararlavariablecnt

voidinterrupt(){//Rutinadeinterrupcin
cnt++//Interrupcincausaelincrementodecntpor1
TMR0=155//Temporizador(ocontador)Timer0devuelvesuvalorinicial
INTCON=0x20//BitT0IEesta1,bitT0IFesta0
}

voidmain(){
OPTION_REG=0x04//Preescalador(1:32)seleasignaaltemporizadorTimer0
TMR0=155//TemporizadorT0cuentade155a255
INTCON=0xA0//Habilitadalageneracindeinterrupcinparael
//temporizadorTimer0
...
...
//Enelsiguienteejemplo,Timer0seconfiguracomountemporizador
//yseleasignaunpreescalador.
OPTION_REG=0x20//Preescalador(1:2)seleasignaalcontadorTimer0
TMR0=155//ContadorT0cuentade155a255
INTCON=0xA0//Habilitadalageneracindeinterrupcinporel
//temporizadorTimer0
...
...

CuandoelbitPSAesta1,elpreescaladorseleasignaaltemporizadorperroguardincomosemuestraenlasiguientefigura.

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 31/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos

VamosahacerloenmikroC...

//Enesteejemplo,elpreescalador(1:64)seleasignaaltemporizadorperroguardin.

voidmain(){
OPTION_REG=0x0E//PreescaladorseleasignaalWDT(1:64)
asmCLRWDT//ComandoenensambladorparareiniciarelWDT
...
...
asmCLRWDT//ComandoenensambladorparareiniciarelWDT
...

Apartedelodichoanteriormente,cabedestacarlosiguiente:

Alasignarleelpreescaladoraltemporizador/contador,elpreescaladorsepondra0concualquierescrituraenel
registroTMR0.
Alasignarelpreescaladoraltemporizadorperroguardin,tantoelWDTcomoelpreescaladorsepondrna0conla
instruccinCLRWDT.
AlescribirenelregistroTMR0,utilizadocomountemporizador,noseiniciaelconteodelospulsosinmediatamente,
sinoconretrasodedosciclosdeinstrucciones.Porconsiguiente,esnecesarioajustarelvalorescritoenelregistro
TMR0.
Alponerelmicrocontroladorenelmododerepososeapagaelosciladordereloj.Nopuedeocurrireldesbordamiento
yaquenohaypulsosacontar.EslaraznporlaquelainterrupcinporeldesbordamientodelTMR0no
puededespertaralprocesadordelmododereposo.
Siseutilizacomouncontadorderelojexternosinpreescalador,lalongituddepulsomnimaotiempomuertoentre
dospulsosdeberser2Tosc+20nS(Tosceselperododesealderelojdeloscilador).
Siseutilizacomouncontadorderelojexternoconpreescalador,lalongituddepulsomnimaotiempomuertoentre
dospulsosesslo10nS.
Elregistrodelpreescaladorde8bitsnoestdisponiblealusuario,loquesignificaquenoesposibleleerlooescribir
enldirectamente.
AlcambiardeasignacindelpreescaladordelTimer0altemporizadorperroguardin,esnecesarioejecutarla
siguientesecuenciadeinstruccionesescritasenensambladorparaimpedirreiniciarelmicrocontrolador:

BANKSELTMR0
CLRWDTPONERACEROWDT
CLRFTMR0PONERACEROTMR0YPREESCALADOR
BANKSELOPTION_REG
BSFOPTION_REG,PSAASIGNARLEELPREESCALADORALWDT
CLRWDTPONERACEROWDT
MOVLWb'11111000'SELECCIONARLOSBITSPS2,PS1,PS0YPONERLOS
ANDWFOPTION_REG,WACEROPORLAINSTRUCCIN'YLGICO'
IORLWb'00000101'BITSPS2,PS1,YPS0PONENELVALOR
MOVWFOPTION_REGDELDIVISORDEFRECUENCIASA1:32

Demanerasimilar,alcambiardeasignacindelpreescaladordelWDTalTimer0,esnecesarioejecutarlasiguiente
secuenciadeinstrucciones,tambinescritasenensamblador:

BANKSELTMR0
CLRWDTPONERACEROWDTYPREESCALADOR
BANKSELOPTION_REG

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 32/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos
MOVLWb'11110000'SELECCIONARSLOLOSBITSPSA,PS2,PS1,PS0
ANDWFOPTION_REG,WYPONERLOSACEROPORLAINSTRUCCIN'YLGICO'
IORLWb'00000011'VALORDELDIVISORDEFRECUENCIASES1:16
MOVWFOPTION_REG

ParautilizarelTimer0apropiadamente,esnecesario:

Paso1:Seleccionarelmodo:

ElmododetemporizadorseseleccionaporelbitTOSCdelregistroOPTION_REG(TOSC:0=temporizador,
1=contador).
Cuandoseasignaelpreescaladoraltemporizador/contadorsedebeponeraceroelbitPSAdelregistro
OPTION_REG.ElvalordeldivisordefrecuenciasseconfiguraalutilizarlosbitsPS2PS0delmismoregistro.
Alutilizarunainterrupcin,losbitsGIEyTMR0IEdelregistroINTCONdebenestarauno.
Paso2:Medirycontar

Paramedirtiempo:

ReiniciarelregistroTMR0oescribirunvalorconocidoenl.
Eltiempotranscurrido(enmicrosegundosalutilizarelosciladorde4MHz)semidealleerelregistroTMR0.
ElbitdebanderaTMR0IFdelregistroINTCONseponeaunoautomticamentesiemprequeocurrael
desbordamientodelregistroTMR0.Siesthabilitada,ocurreunainterrupcin.
Paracontarpulsos:

LapolaridaddepulsosacontarenelpinRA4seseleccionaporelbitTOSEdelregistroOPTION_REG(T0SE:
0=pulsospositivos,1=pulsosnegativos).
VariospulsossepuedenleerdelregistroTMR0.Elpreescaladorylainterrupcinseutilizandelamismaformaque
enelmododetemporizador.

3.5TEMPORIZADORTIMER1

ElmdulodeltemporizadorTimer1esuntemporizador/contadorde16bits,loquesignificaqueconsisteendosregistros(TMR1Ly
TMR1H).Puedecontarhasta65535pulsosenunsolociclo,osea,antesdequeelconteoseiniciedesdecero.

SimilaraltemporizadorTimer0,estosregistrossepuedenleerosepuedeescribirenellosencualquiermomento.Encasodequeocurra
undesbordamiento,segeneraunainterrupcinsiesthabilitada.

ElmdulodeltemporizadorTimer1puedefuncionarenunoodosmodosbsicos,esoescomountemporizadorocomouncontador.A
diferenciadeltemporizadorTimer0,cadaunodeestosdosmodostienefuncionesadicionales.

EltemporizadorTimer1tienelassiguientescaractersticas:

Temporizador/contadorde16bitscompuestoporunparderegistros
Fuentederelojinternaoexternaprogramable
Preescaladorde3bits
OsciladorLPopcional
Funcionamientosncronooasncrono
CompuertaparacontrolareltemporizadorTimer1(conteohabilitado)pormediodelcomparadoroporelpinT1G
Interrupcinpordesbordamiento
"Despierta"almicrocontrolador(salidadelmododereposo)pordesbordamiento(relojexterno)y
FuentederelojparalafuncindeCaptura/Comparacin.

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 33/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos

SELECCINDELAFUENTEDERELOJDELTEMPORIZADORTIMER1

ElbitTMR1CSdelregistroT1CONseutilizaparaseleccionarlafuentederelojparaestetemporizador:

F UENT EDEREL O J TMR1CS

Fosc/4 0

T1CKIpin 1

Alseleccionarlafuentederelojinterna,elparderegistrosTMR1HTMR1LserincrementadoconvariospulsosFosccomoes
determinadoporelpreescalador.

Alseleccionarlafuentederelojexterna,estetemporizadorpuedefuncionarcomountemporizadorouncontador.Lospulsosenelmodo
temporizadorpuedenestarsincronizadosconelrelojinternodelmicrocontroladorofuncionarasncronamente.Encasodequese
necesiteunosciladordelrelojexternoyelmicrocontroladorPIC16F887utiliceelosciladorinternoINTOSCconelpin
RA6/OSC2/CLIKOUT,eltemporizadorTimer1puedeutilizarelosciladorLPcomounafuentedereloj.

PREESCALADORDELTEMPORIZADORTIMER1

EltemporizadorTimer1tieneunescaladorcompletamenteseparadoquepermitedividirlafrecuenciadeentradaderelojpor1,2,4o8.No
esposibleleerelpreescaladoroescribirenldirectamente.Detodasformas,elcontadordelpreescaladorseponea0automticamente
despusdeescribirenlosregistrosTMR1HoTMR1L.

OSCILADORDELTEMPORIZADORTIMER1

LospinesRC0/T1OSOyRC1/T1OSIseutilizanpararegistrarlospulsosquevienendelosdispositivosperifricos,perotambintienen
unafuncinadicional.Comosepuedeverenlasiguientefigura,seconfiguransimultneamentecomoentrada(pinRC1)ysalida(pin
RC0)delosciladordecuarzoLP(LowPowerdebajoconsumo)adicional.Estecircuitoestprincipalmentediseadoparafuncionara
bajasfrecuencias(hasta200KHz),exactamenteparaelusodecristaldecuarzode32.768KHz.Estecristalseutilizaenlosrelojesde
cristalpuestoqueesfcildeobtenerunpulsodeduracindeunsegundoaldividirestafrecuencia.

Comoelosciladornodependedelrelojinterno,puedefuncionarinclusoenelmododereposo.Sehabilitaalponeraunoelbitdecontrol
T1OSCENdelregistroT1CON.Elusuariodebeproporcionartiempomuertopormediodesoftware(unospocosmilisegundos)para
habilitarqueelosciladorseinicieapropiadamente.

Lasiguientetablamuestralosvaloresrecomendadosdeloscapacitoresconvenientesconeloscilador
decuarzo.Noesnecesarioqueestosvaloresseanexactos.Detodasformas,lareglagenerales:
cuntomsaltasealacapacidad,tantomsaltaserlaestabilidad,loquealavezprolongaeltiempo
necesarioparalaestabilizacindeloscilador.

O SCIL ADO R F RECUENCIA C1 C2

32kHz 33pF 33pF

LP 100kHz 15pF 15pF

200kHz 15pF 15pF

Elconsumodecorrientedelmicrocontroladorsereduceanivelmsbajoenelmododereposoyaqueelconsumidordecorriente
principalelosciladornofunciona.EsfcildeponeralmicrocontroladorenestemodoalejecutarlainstruccinSLEEP.Elproblemaes
cmodespertaralmicrocontroladorporqueslounainterrupcinpuedeproducirlo.Comoelmicrocontroladorduerme,sedebeusaruna
interrupcincausadapordispositivosperifricosparadespertarlo.Seponemuycomplicadosiesnecesariodespertaral
microcontroladoraintervalosdetiemporegulares...

Pararesolverelproblema,unosciladordecuarzoLP(debajoconsumodecorriente)completamenteindependiente,capazdefuncionar
enelmododereposo,estintegradoenelmicrocontroladorPIC16F887.Simplemente,uncircuitoanteriormenteseparadoahoraest

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 34/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos
integradoenelmicrocontroladoryasignadoaltemporizadorTimer1.Elosciladoresthabilitadoalponera1elbitT1OSCENdelregistro
T1CON.ElbitTMR1CSdelmismoregistroseutilizaparahabilitarqueeltemporizadorTimer1utilicesecuenciasdepulsosdeese
oscilador.

Unasealgeneradaporesteosciladordecuarzoestsincronizadaconelrelojdelmicrocontroladoralponera0elbit
T1SYNC.Enestecaso,eltemporizadornopuedefuncionarenmododereposoporqueelcircuitoparasincronizacin
utilizaelrelojdelmicrocontrolador.
LainterrupcinpordesbordamientoenelregistrodeltemporizadorTimer1puedeestarhabilitada.SielbitT1SYNCse
ponea1,talesinterrupcionesseproducirnenelmododereposotambin.

COMPUERTADELTEMPORIZADORTIMER1

ElpinTG1olasalidadelcomparadorC2puedenserunafuentedelospulsosquepasanporlacompuertadeltemporizadorTimer1.Se
configuranporsoftware.Estacompuertapermitequeeltemporizadormidadirectamenteladuracindeloseventosexternosalutilizarel
estadolgicodelpinT1GoloseventosanalgicosalutilizarlasalidadelcomparadorC2.RefirasealaFiguraenlapginaanterior.Para
medirduracindeseal,bastaconhabilitarestacompuertaycontarlospulsosquepasanporella.

TIMER1ENELMODOTEMPORIZADOR

Paraseleccionarestemodo,esnecesarioponera0elbitTMR1CS.Despusdeeso,elregistrode16bitsserincrementadoconcada
pulsogeneradoporelosciladorinterno.Siseutilizaelcristaldecuarzode4MHZ,elregistroserincrementadocadamicrosegundo.

Enestemodo,elbitT1SYNCnoafectaaltemporizadorporquecuentalospulsosderelojinterno.Comotodoslosdispositivosutilizan
estospulsos,nohacefaltasincronizarlos.

Elosciladorderelojdelmicrocontroladornofuncionaduranteelmododereposoasqueeldesbordamientoenelregistrodel
temporizadornopuedecausarinterrupcin.

VamosahacerloenmikroC...

//Enesteejemplo,elTMR1estconfiguradocomountemporizadorconelvalor
//delpreescalador1:8.CadavezqueocurraundesbordamientodelosregistrosTMR1Hy
//TMR1L,sesolicitarunainterrupcin.

voidmain(){
PIR1.TMR1IF=0//Ponera0labanderadebitdelTMR1IF

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 35/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos
TMR1H=0x22//PonerelvalorinicialparaeltemporizadorTimer1
TMR1L=0x00
TMR1CS=0//Temporizador1cuentalospulsosdelosciladorinterno
T1CKPS1=T1CKPS0=1//Elvalordelpreescaladorasignadaes1:8
PIE1.TMR1IE=1//Interrupcinhabilitadapordesbordamiento
INTCON=0xC0//Interrupcinhabilitada(bitsGIEyPEIE)
TMR1ON=1//EncendereltemporizadorTimer1
...

TIMER1ENELMODOCONTADOR

EltemporizadorTimer1seponeafuncionarcomouncontadoralponera1elbitTMR1CS.Estebitcuentalospulsosllevadosalpin
PC0/T1CKIyseincrementaenelflancoascendentedelaentradadelrelojexternoT1CKI.SielbitdecontrolT1SYNCdelregistroT1CON
seponea0,lasentradasdelrelojexternosesincronizarnensucaminoaltemporizadorTimer1.Enotraspalabras,eltemporizador
Timer1sesincronizaconelrelojinternodelmicrocontroladoryseledenominacontadorsncrono.

Alponerenmododereposoelmicrocontroladorquefuncionadeestamanera,losregistrosdeltemporizadorTimer1HyTMR1Lnosern
incrementadosaunquelospulsosderelojaparezcanenlospinesdeentrada.Comoelrelojinternodelmicrocontroladornofuncionaen
estemodo,nohayentradasderelojqueseutilicenparalasincronizacin.Detodasformas,elpreescaladorsiguefuncionandosiempre
quehayapulsosderelojenlospines,porqueesunsimpledivisordefrecuencias.

Estecontadordetectaununolgico(1)enlospinesdeentrada.Cabedestacarquealmenosunflancoascendentedebeserdetectado
antesdeempezaracontarlospulsos.RefirasealaFiguraalaizquierda.Lasflechasenlafiguraindicanlosincrementosdelcontador.

RegistroT1CON

T1GINVTimer1GateInvertbit(Bitinversordelacompuertadeltemporizador1)secomportacomouninversordelestadolgicoenla
compuertaformadaporelpinT1Golasalida(C2OUT)delcomparadorC2.Estebithabilitaaltemporizadorparacontarlospulsoscuando
lacompuertaestaaltooabajo.

1Temporizador1cuentalospulsoscuandoelpinT1GoelbitC2OUTestnaalto(1).
0Temporizador1cuentalospulsoscuandoelpinT1GoelbitC2OUTestnabajo(0).
TMR1GETimer1GateEnablebit(Bitdehabilitacindelacompuertadeltemporizador1)determinasilacompuertaformadaporelpin
T1GosalidadelcomparadorC2(C2OUT)estaractivaono.EstebitesfuncionalsloencasodequeeltemporizadorTimer1est
encendido(elbitTMR1ON=1).Delocontrario,estebitseignora.

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 36/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos
1TemporizadorTimer1estencendidoslosilacompuertanoestactiva.
0CompuertanoafectaaltemporizadorTimer1.
T1CKPS1,T1CKPS0Timer1InputClockPrescaleSelectbits(BitsdeseleccindelpreescaladordesealderelojdelTemporizador1)
determinaelvalordeldivisordefrecuenciasasignadaaltemporizadorTimer1.

T 1CKPS1 T 1CKPS0 VAL O RDEL PRE ESCAL ADO R

0 0 1:1

0 1 1:2

1 0 1:4

1 1 1:8

T1OSCENLPOscillatorEnableControlbit(bitdehabilitacindelosciladorLPdelTimer1)

1OsciladorLPesthabilitadoparaelrelojdelTimer1(osciladordebajoconsumoydefrecuenciade32.768kHz)
0OsciladorLPestapagado.
T1SYNCTimer1ExternalClockInputSynchronizationControlbit(Bitdecontroldesincronizacindelasealdeentrada)habilitala
sincronizacindelaentradadelosciladorLPodelaentradadelpinT1CKIconelrelojinternodelmicrocontrolador.Estebitseignoraal
contarlospulsosdesdeelosciladorprincipal(elbitTMR1CS=0).

1Entradaderelojexternanoestsincronizada.
0Entradaderelojexternaestsincronizada.
TMR1CSTimerTMR1ClockSourceSelectbit(bitdeseleccindelafuentederelojdeltemporizadorTimer1)

1CuentalospulsosporelpinT1CKI(porelflancoascendente01)
0Cuentalospulsosdelrelojinternodelmicrocontrolador
TMR1ONTimer1Onbit(TMRactivo,haceentraronoenfuncionamientoelTimer1).

1HabilitaeltemporizadorTimer1.
0DeshabilitaeltemporizadorTimer1.
ParautilizarelTimer1apropiadamente,esnecesariohacerlosiguiente:

Comonoesposibleapagarelpreescalador,suvalordebeestarajustadoalosbitsT1CKPS1yT1CKPS0del
registroT1CON(Refirasealatabla).
SeleccionarelmodoporelbitTMR1CSdelregistroT1CON.(TMR1CS:0=lafuentederelojesosciladordecuarzo
interno,1=lafuentederelojesosciladordecuarzoexterno).
AlconfigurarelbitT1OSCENdelmismoregistro,elosciladoresthabilitadoylosregistrosTMR1HyTMR1Lse
incrementanconcadapulsodereloj.Alponerestebita0,sedetieneelconteo.
Alreiniciarlosregistrosdelcontadoroalescribirenellos,sereiniciaelpreescalador.
Alllenarambosregistrosdeltemporizador,seconfiguralabanderaTMR1IFyelconteoempiezadesdecero.

3.6TEMPORIZADORTIMER2

ElmdulodeltemporizadorTimer2esuntemporizadorde8bits.

Lospulsosquevienendelosciladordecuarzoprimeropasanporelpreescaladorcuyovalorpuedesermodificadoalcombinarlosbits
T2CKPS1yT2CKPS0.LasalidadelpreescaladorseutilizaparaincrementarelregistroTMR2empezandopor00h.LosvaloresdelTMR2
ydelPR2secomparanconstantementeyelregistroTMR2vaincrementndosehastaalcanzarelvalordelregistroPR2.Cuandose
igualanlosvaloresdelosregistros,loqueserregistradoporelcomparador,elTMR2sereiniciaa00hautomticamente.El
postescaladordeltemporizadorTimer2seincrementaysusalidaseutilizaparagenerarunainterrupcinsiesthabilitada.

LosambosregistrosTMRyPR2sondelecturayescritura.Elconteosepuededeteneralponera0elbitTMR2ON,loqueresultaenun
ahorrodeenerga.

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 37/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos
ElmomentodereiniciodelTMR2sepuedeutilizarparadeterminarlavelocidaddetransmisinenbaudiosdelacomunicacinserie
sncrona.

VariosbitsdelregistroT2CONestnencontroldeltemporizadorTimer2.

RegistroT2CON

TOUTPS3TOUTPS0Timer2OutputPostcalerSelectbits(bitsdeseleccindelrangodeldivisordelpostescaladorparaelTimer2)se
utilizanparadeterminarelvalordelpostescaladorsegnlasiguientetabla:

T O UT PS3 T O UT PS2 T O UT PS1 T O UT PS0 VAL O RDEL PO ST ESCAL ADO R

0 0 0 0 1:1

0 0 0 1 1:2

0 0 1 0 1:3

0 0 1 1 1:4

0 1 0 0 1:5

0 1 0 1 1:6

0 1 1 0 1:7

0 1 1 1 1:8

1 0 0 0 1:9

1 0 0 1 1:10

1 0 1 0 1:11

1 0 1 1 1:12

1 1 0 0 1:13

1 1 0 1 1:14

1 1 1 0 1:15

1 1 1 1 1:16

TMR2ONTimer2Onbit(bitdeactivacindelTIMR2)haceentrarenfuncionamientoeltemporizadorTimer2.

1HabilitaelfuncionamientodelTimer2.
0DeshabilitaelfuncionamientodelTimer2.
T2CKPS1,T2CKPS0Timer2ClockPrescalerbits(seleccindelrangodeldivisordelpreescaladordelTimer2)determinaelvalordel
divisordefrecuencias:

T 2CKPS1 T 2CKPS0 VAL O RDEL PRE ESCAL ADO R

0 0 1:1

0 1 1:4

1 x 1:16

AlutilizareltemporizadorTimer2hayquesabervariosdetallesrelacionadosconsusregistros:

Enelmomentodeencenderunafuentedealimentacin,elregistroPR2contieneelvalorFFh.
TantoelpreescaladorcomoelpostescaladorseborranalescribirenelregistroTMR2.
TantoelpreescaladorcomoelpostescaladorseborranalescribirenelregistroT2CON.
Alproducirsecualquierreinicio,comopuedeanticiparse,tantoelpreescaladorcomoelpostescaladorseborran.
LosmdulosCCPpuedenfuncionarenmuchosmodosdiferentes,porloqueseconsideranlosmscomplicados.Siustedintentaanalizar
sufuncionamientoabasedetablasquedescribenlasfuncionesdebits,comprendermejordeloquleestamoshablando.Siutiliza
algunodelosmdulosCCP,primeroseleccioneelmodoquenecesita,analicelafiguraapropiadayentoncespngaseamodificarlosbits
deregistros.Sino...

3.7MDULOSCCP

ElmduloCCP(Captura/Comparacin/PWM)esunperifricoquelepermitemedirycontrolardiferenteseventos.

Elmododecapturaproporcionaelaccesoalestadoactualdeunregistroquecambiasuvalorconstantemente.Enestecaso,esel
registrodeltemporizadorTimer1.

Elmododecomparacincomparaconstantementevaloresdedosregistros.UnodeelloseselregistrodeltemporizadorTimer1.Este

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 38/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos
circuitotambinlepermitealusuarioactivaruneventoexternodespusdequehayaexpiradounacantidaddetiempopredeterminada.

PWM(PulseWidthModulationmodulacinporanchodepulsos)puedegenerarsealesdefrecuenciaydeciclodetrabajovariadospor
unoomspinesdesalida.

ElmicrocontroladorPIC16F887disponededosmdulosCCPCCP1yCCP2.

Ambossonidnticosenmodonormaldefuncionamiento,mientrasquelascaractersticasdelPWMmejoradoestndisponiblessloenel
modoCCP1.staeslaraznporlaqueenestecaptulosedescribedetalladamenteelfuncionamientodelmduloCCP1.Conrespectoal
CCP2,sepresentarnslolascaractersticasquelodistinguendelCCP1.

MDULOCCP1

UnapartecentraldeestecircuitoesunregistroCCPR1de16bitsqueconsisteenregistrosCCPR1LyCCOR1H.Seutilizaparacapturary
compararsusvaloresconlosnmerosalmacenadosenelregistrodeltemporizadorTimer1(TMR1HyTMR1L).

Siesthabilitadoporsoftware,puedeocurrirelreiniciodeltemporizadorTimer1aligualarselosvaloresenmododeComparacin.
Adems,elmduloCCP1puedegenerarsealesPWMdefrecuenciaydeciclodetrabajovariados.

LosbitsdelregistroCCP1CONestnencontroldelmduloCCP1.

CCP1ENMODODECAPTURA

Enestemodo,elregistrodeltemporizadorTimer1(queconsisteenlosTMR1HyTMR1L)secopiaalregistroCCP1(queconsisteenlos
CCPR1HyCCPR1L)enlassiguientessituaciones:

Cadaflancoascendente(1>0)enelpinRC2/CCP
Cadaflancodescendente(0>1)enelpinRC2/CCP1
Cadacuartoflancoascendente(0>1)enelpinRC2/CCP1y
Cadadecimosextoflancodescendente(0>1)enelpinRC2/CCP1.
Unacombinacindecuatrobits(CCP1M3CCP1M0)delregistrodecontroldeterminaculdeestoseventoscausartransmisindedato
de16bits.Adems,sedebencumplirlossiguientesrequisitos::

ElpinRC2/CCP1debeestarconfiguradocomoentraday
ElTimer1debefuncionarcomotemporizadorocontadorsncrono.

ElbitdebanderaCCP1IFseponeaunodespusdeacabarlacaptura.Siseponea1elbitCCP1IEdelregistroPIE1,seproduciruna
interrupcin.

EncasodequeelmduloCCP1estenmododecaptura,puedeproducirseunainterrupcinnodeseada.Paraevitarlo,antesdeque
ocurrauncambioenelregistrodecontrolsedebenponera0tantoelbitquehabilitalainterrupcinCCP1IE,comoelbitdebandera
CCP1IF.

Lasinterrupcionesnodeseadaspuedenproducirsealcambiarelvalordelpreescalador.Paraevitarlo,elmduloCCP1debeestar
apagadotemporalmenteantesdecambiarelvalordelpreescalador.

Serecomiendalasiguientesecuenciadeprograma,escritaenensamblador:

BANKESELCCP1CON

CLRFCCP1CONREGISTRODECONTROLBORRADO

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 39/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos
MDULOCCP1ESTAPAGADO
MOVLWXXNUEVOMODODELPREESCALADORESTSELECCIONADO
MOVWFCCP1CONENELREGISTRODECONTROLSEINTRODUCEUNNUEVOVALOR
MDULOCCP1SEENCIENDESIMULTNEAMENTE

VamosahacerloenmikroC...

...
ASM{
BANKESELCCP1CON
CLRFCCP1CON//REGISTRODECONTROLBORRADO
//MDULOCCP1ESTAPAGADO
MOVLWXX//NUEVOMODODELPREESCALADORESTSELECCIONADO
MOVWFCCP1CON//ENELREGISTRODECONTROLSEINTRODUCENUEVOVALOR
}//MDULOCCP1SEENCIENDESIMULTNEAMENTE
...

CCP1ENMODODECOMPARACIN

Enestemodo,elvaloralmacenadoenelregistroCCP1secomparaconstantementealvaloralmacenadoenelregistrodeltemporizador
Timer1.Aligualarselosvalores,elestadolgicoenelpindesalidapuedesercambiado,loquedependedelestadodebitsenelregistro
decontrol(CCP1M3CCP1M0).ElbitdebanderaCCP1IFseponeaunosimultneamente.

ParaponerelmduloCCP1enestemododefuncionamiento,sedebencumplirdoscondiciones:

ElpinRC2/CCP1debeestarconfiguradocomosaliday
EltemporizadorTimer1debeestarsincronizadoconelrelojinterno.

CCP1ENMODOPWM

Lassealesdefrecuenciaydeciclodetrabajovariadostienenunaampliagamadeaplicacionesenautomatizacin.Unejemplotpicoes
uncircuitodecontroldepotencia.Refirasealasiguientefigura.Siuncerolgico(0)indicauninterruptorabiertoyununolgico(1)
indicauninterruptorcerrado,lapotenciaelctricaquesetransmitealosconsumidoresserdirectamenteproporcionalaladuracindel
pulso.EstarelacinseledenominaCiclodeTrabajo.

Elotroejemplo,comnenlaprctica,eselusodesealesPWMenuncircuitoparagenerarsealesdeformadeondaarbitrariacomouna
ondasinusoidal.Vealasiguientefigura:

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 40/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos

Losdispositivosquefuncionansegnesteprincipioseutilizanconfrecuenciaenlaprcticacomovariadoresdefrecuenciaajustableque
controlanmotoreselctricos(velocidad,aceleracin,desaceleracinetc.)

LaFiguraanteriormuestraeldiagramadebloquesdelmduloCCP1puestoenelmodoPWM.Paragenerarunpulsodeformaarbitraria
enelpindesalida,esnecesarioajustarelperododepulsos(frecuencia)yladuracindepulsos.

PERODODEPWM

Elperododepulsodesalida(T)sedeterminaporelregistroPR2deltemporizadorTimer2.ElperododePWMsepuedecalcularporla
siguienteecuacin:

PerodoPWM=(PR2+1)*4Tosc*ValordepreescaladelTimer2

SielperododePWM(T)esconocido,esfcildeterminarlafrecuenciadesealF,porqueestosdosvaloresestnrelacionadosporla
ecuacinF=1/T.

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 41/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos
CICLODETRABAJODEPWM

ElciclodetrabajodePWMseespecificaalutilizarentotal10bits:losochobitsmssignificativosdelregistroCCPR1Lylosdosbits
menossignificativosadicionalesdelregistroCCP1CON(DC1B1yDC1B0).Elresultadoesunnmerode10bitsdadoporlasiguiente
frmula:

Anchodepulsos=(CCPR1L,DC1B1,DC1B0)*Tosc*ValordepreescaladelTimer2

LasiguientetablamuestracmogenerarlassealesPWMdediferentesfrecuenciascuandoelmicrocontroladorutilizauncristalde
cuarzode20MHz(Tosc=50nS).

F RECUENCIA[ KHZ ] 1.22 4.88 19.53 78.12 156.3 208.3

PreescaladordelTMR2 16 4 1 1 1 1

RegistroPR2 FFh FFh FFh 3Fh 1Fh 17h

Notasadicionales:

Elpindesalidasevaaponera1constantemente,siporerrorelanchodepulsogeneradoesmslargoqueel
perododePWM.
Enestaaplicacin,nosepuedeutilizarelpostescaladordeltemporizadorTimer2paragenerarperodosdePWM
largos.

RESOLUCINDEPWM

UnasealPWMnoesnadamsqueunasecuenciadepulsosquevaransuciclodetrabajo.Paraunafrecuenciaespecfica(nmerode
pulsosporsegundo),hayunnmerolimitadodecombinacionesdeciclosdetrabajo.Estenmerorepresentaunaresolucinmedidaen
bits.Porejemplo,siunaresolucinesde10bitsestarndisponibles1024ciclosdetrabajodiscretossiunaresolucinesde8bitsestarn
disponibles256ciclosdetrabajodisretosetc.EnestemicrocontroladorlaresolucinesdeterminadaporelregistroPR2.Elmximovalor
seobtienealusarelnmeroFFh.

FrecuenciasyresolucionesdePWM(Fosc=20MHz):

F RECUENCIADEPWM 1.22KHZ 4.88KHZ 19.53KHZ 78.12KHZ 156.3KHZ 208.3KHZ

Preescaladeltemporizador 16 4 1 1 1 1

ValordelPR2 FFh FFh FFh 3Fh 1Fh 17h

Resolucinmxima 10 10 10 8 7 6

FrecuenciasyresolucionesdePWM(Fosc=8MHz):

F RECUENCIADEL PWM 1.22KHZ 4.90KHZ 19.61KHZ 76.92KHZ 153.85KHZ 200.0KHZ

Preescaladeltemporizador 16 4 1 1 1 1

ValordelPR2 65h 65h 65h 19h 0Ch 09h

Resolucinmxima 8 8 8 6 5 5

VamosahacerloenmikroC...

/*Enesteejemplo,elmduloPWMestinicializadoyajustadoparaproducirunasecuencia
depulsosdeciclodetrabajodel50%.Paraestepropsito,seutilizanlasfunciones
PWM1_Init(),PWM1_Start()yPWM1_Set_Duty().Todaslasfuncioneslascontienelalibrera
PWMdelmikroCPROforPIC.Sloesnecesariocopiarlasalprograma*/

unsignedshortduty_c//Definirlavariableduty_c

voidinitMain(){
ANSEL=ANSELH=0//TodoslospinesdeE/Sseconfigurancomodigitales
PORTC=TRISC=0//EstadoinicialdelospinesdesalidadelpuertoPORTC
PWM1_Init(5000)//InicializacindelmduloPWM(5KHz)
}

voidmain(){
initMain()
duty_c=127//Valorinicialdelciclodetrabajo
PWM1_Start()//IniciarelmduloPWM1
PWM1_Set_Duty(duty_c)//AjustarelciclodetrabajodePWMal50%
...
...

RegistroCCP1CON

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 42/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos

P1M1,P1M0PWMOutputConfigurationbits(bitsdeconfiguracindelmodoPWM)ElpinP1Aeslaentradadelmdulode
Captura/Comparacinentodoslosmodos,menosenmodoPWM.LospinesP1B,P1CyP1DactancomolospinesdeE/SdelpuertoD.

EnmodoPWMestosbitsafectanalfuncionamientodelmduloCCP1comosemuestraenlasiguientetabla:

P1M1 P1M0 MO DO

PWMconunaslasalida
0 0
PorelpinP1Asaleunasealmodulada.
PinesP1B,P1CyP1Dsonentradas/salidasdelpuertoD.

ConfiguracinFullBridgeForward
(puentecompletoconsalidadirecta)
0 1
PorelpinP1Dsaleunasealmodulada.
PorelpinP1Dsaleunasealmodulada.
PinesP1ByP1Cestninactivos.

ConfiguracinHalfBridge(mediopuente)
1 0
PorlospinesP1AyP1Bsaleunasealmodulada.
PinesP1CyP1Dsonentradas/salidasdelpuertoD.

ConfiguracinFullBridgeReverse
(puentecompletoconsalidainversa)
1 1
PorelpinP1Bsaleunasealmodulada.
PinP1Cestactivo.
PinesP1AyP1Destninactivos.

DC1B1,DC1B0PWMDutyCycleLeastSignificantbits(bitsmenossignificativosdelciclodetrabajodePWM)Seutilizansloenel
modoPWMyrepresentandosbitsmenossignificativosdeunnmerode10bits.Estenmerodeterminaelciclodetrabajodelaseal
PWM.Losdems8bitssealmacenanenelregistroCCPR1L.

CCP1M3CCP1M0(bitsdeseleccindemododelmduloCCP1)determinaelmododelmduloCCP1.

CCP1M3 CCP1M2 CCP1M1 CCP1M0 MO DO

0 0 0 0 Mduloestdeshabilitado(reinicio).

0 0 0 1 Noutilizado.

Mododecomparacin
0 0 1 0
ElbitCCP1IFbitseponea1alocurrirunacoincidencia.

0 0 1 1 Noutilizado.

Mododecaptura
0 1 0 0
CadaflancodescendenteenelpinCCP1.

Mododecaptura
0 1 0 1
CadaflancoascendenteenelpinCCP1.

Mododecaptura
0 1 1 0
CadacuartoflancoascendenteenelpinCCP1.

Mododecaptura
0 1 1 1
CadadecimosextoflancoascendenteenelpinCCP1.

Mododecomparacin
1 0 0 0
LasalidayelbitCCP1IFseponena1alocurrirunacoincidencia

Mododecomparacin
1 0 0 1
Lasalidaseponea0yelbitCCP1IFseponea1alocurrirunacoincidencia.

Mododecomparacin
1 0 1 0
LlegalasolicituddeinterrupcinyelbitCCP1IFseponea1alocurriruna
coincidencia

Mododecomparacin
1 0 1 1
ElbitCCP1IFseponea1,ylosregistrosdetemporizadores1o2seborran
alocurrirunacoincidencia

ModoPWM
1 1 0 0
PinesP1AyP1Cestnactivosanivelalto.
PinesP1ByP1Destnactivosanivelalto.

ModoPWM

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 43/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos
1 1 0 1
PinesP1AyP1Cestnactivosanivelalto.
PinesP1ByP1Destnactivosanivelbajo.

ModoPWM
1 1 1 0
PinesP1AyP1Cestnactivosanivelbajo.
PinesP1ByP1Destnactivosanivelalto.

ModoPWM
1 1 1 1
PinesP1AyP1Cestnactivosanivelbajo.
PinesP1ByP1Destnactivosanivelbajo.

MDULOCCP2

Conexclusindelosnombresdiferentesdelosregistrosydelosbits,estemduloesunamuybuenacopiadelmduloCCP1puestoen
modonormal.LanicadiferenciasignificativaentreelloseselfuncionamientoenmododecomparacindelmduloCCP2.Ladiferencia
serefierealasealdereiniciodeltemporizadorT1.Concretamente,sielconvertidorA/Desthabilitado,aligualarselosvaloresdelos
registrosTMR1yCCPR2,lasealdereiniciodeltemporizadorT1iniciarautomticamentelaconversinA/D.Similaralmduloanterior,
estecircuitotambinestbajoelcontroldelosbitsdelregistrodecontrol.EstavezeselregistroCCP2CON.

RegistroCCP2CON

DC2B1,DC2B0PWMDutyCycleLeastSignificantbits(bitsmenossignificativosdelciclodetrabajodePWM)Seutilizansloenmodo
PWMyrepresentandosbitsmenossignificativosdeunnmerode10bits.EstenmerodeterminaelciclodetrabajodelasealPWM.Los
dems8bitssealmacenanenelregistroCCPR2L.

CCP2M3CCP2M0CCP2ModeSelectbits(bitsdeseleccindemododelmduloCCP2)determinaelmododelmduloCCP2.

CCP2M3 CCP2M2 CCP2M1 CCP2M0 MO DO

0 0 0 0 Mduloestdeshabilitado(reinicio).

0 0 0 1 Noutilizado.

0 0 1 0 Noutilizado.

0 0 1 1 Noutilizado.

MododeCaptura
0 1 0 0
CadaflancodescendenteenelpinCCP2.

MododeCaptura
0 1 0 1
CadaflancoascendenteenelpinCCP2.

MododeCaptura
0 1 1 0
CadacuartoflancoascendenteenelpinCCP2.

MododeCaptura
0 1 1 1
CadadecimosextoflancoascendenteenelpinCCP2.

Mododecomparacin
1 0 0 0
LasalidayelbitCCP2IFseponena1alocurrirunacoincidencia.

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 44/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos
Mododecomparacin
1 0 0 1
Lasalidaseponea0yelbitCCP2IFseponea1alocurrirunacoincidencia

Mododecomparacin
1 0 1 0
Seproduceunainterrupcin,elbitCCP2IFseponea1ynohaycambioel
pinCCP2pinalocurrirunacoincidencia.

Mododecomparacin

1 0 1 1 Alocurrirunacoincidencia,elbitCCP2IFseponea1,losregistrosdel
temporizador1seborranylaconversinA/DseiniciasielconvertidorA/D
esthabilitado.

1 1 x x ModoPWM

CmoconfigurareiniciarelmduloCCP1parafuncionarenmodoPWM?

ParaconfigurareiniciarelmduloCCP1parafuncionarenmodoPWM,sigalossiguientespasos:

DeshabilitarelpindesalidadelCCP1.Deberestarconfiguradocomoentrada.
SeleccionarelperododesealPWMalintroducirelvalorenelregistroPR2.
ConfigurarelmduloCCP1parafuncionarenmodoPWMalcombinarlosbitsdelregistroCCP1CON.
AjustarelciclodetrabajodesealPWMalintroducirelvalorenelregistroCCPR1LyalutilizarlosbitsDC1B1y
DC1B0delregistroCCP1CON.
ConfigurareiniciareltemporizadorTimer2:
PoneraceroelbitdebanderadeinterrupcinTMR2IFenelregistroPIR1
AjustarelvalordedivisindefrecuenciadeltemporizadorTimer2porlosbits
T2CKPS1yT2CKPS0delregistroT2CON.
IniciareltemporizadorTimer2alponeraunoelbitTMR2ONdelregistroT2CON.

HabilitarlospinesdesalidadePWMdespusdequehayasidoacabadounciclodePWM:
EsperareldesbordamientodeltemporizadorTimer2(elbitTMR2IFdelregistroPIR1seponeauno)
ConfigurarelpinapropiadocomosalidaalponeraceroelbitenelregistroTRIS.

MDULOCCP1ENMODOMEJORADO

ElmduloCCP1eselnicoquesepuedeponerenmodomejorado.EstemodobsicamentenodifieredelmodonormaldelCCP1yla
mejoraserefierealatransmisindelasealPWMalospinesdesalida.Porquesesotanimportante?Porelusocadavezms
frecuentedelosmicrocontroladoresenlossistemasdecontroldemotoreselctricos.Aqunovamosadescribirestosdispositivos,sin
embragositienelaoportunidaddetrabajareneldesarrollodelosdispositivossimilares,reconocerloselementosqueseutilizabanhasta
hacepococomolosperifricos.Decimos&seutilizaban&porquetodosestoselementosahoraestnintegradosenelmicrocontroladory
puedenfuncionarenvariosmodosdiferentes.

MODOPWMCONUNASALIDA

ElmodoPWMconunasalidaesthabilitadosloenelcasodequeseponganacerolosbitsP1M1yP1M0enelregistroCCP1CON.En
talcaso,unasealPWMpuedeestardisponiblesimultneamenteencomomximocuatrodiferentespinesdesalida.Adems,la
secuenciadesealesPWMpuedeaparecerenformadeondabsicaoinvertida.Ladistribucindesealesdependedelosbitsdel
registroPSTRCON,mientrasquesupolaridaddependedelosbitsCCP1M1yCCP1M0delregistroCCP1CON.

Siseutilizaunasalidainvertida,lospinesactivosanivelbajoylospulsosquetienenlamismaformadeondasegeneransiempreen
parejas:enlospinesP1AyP1CascomoenlospinesP1ByP1D,respectivamente.

MODODEMEDIOPUENTE

Encuantoalmododemediopuente,lasealPWMesunasalidaenelpinP1A,mientrasquealavezlasealcomplementariaPWMes
unasalidaenelpinP1B.EstospulsosactivanaloscontroladoresMOSFETenmododeMedioPuentequehabilitan/deshabilitanelflujo
decorrienteporeldispositivo.

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 45/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos

EnestemodoesmuypeligrosoencenderloscontroladoresMOSFETsimultneamente(elcortocircuitoproducidoenaquelmomentosera
fatal).Paraevitarlo,esnecesarioproporcionaruntiempomuertoentreencenderyapagarloscontroladores.Estetiempomuertoest
marcadocon'td'(timedelay)enlasiguientefigura.ElproblemaseresuelvealutilizarlosbitsPDC0PDC6delregistroPWM1CON.

Comosemuestraenlasiguientefigura,elmododemediopuentesepuedeutilizarparaactivarloscontroladoresMOSFETenla
configuracinPuentecompleto:

MODOPUENTECOMPLETO

TodosloscuatropinesseutilizancomosalidasenelmodoPuentecompleto.Enlaprctica,estemodoesutilizaconfrecuenciapara
activarlosmotores,loqueproporcionauncontrolsimpleycompletodevelocidadydireccinderotacin.Haydosconfiguracionesdeeste
modo:FullBridgeForward(puentecompletoconsalidadirecta)yFullBridgeReverse(puentecompletoconsalidainversa).

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 46/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos

CONFIGURACINPUENTECOMPLETODIRECTO

EnmodoDirectoocurrelosiguiente:

Ununolgico(1)apareceenelpinP1A(pinestactivoanivelalto)
SecuenciadepulsosapareceenelpinP1Dy
Uncerolgico(0)enlospinesP1ByP1C(pinesestnactivosanivelbajo).
LasiguientefiguramuestraelestadodelospinesP1AP1DduranteuncicloPWMcompleto:

CONFIGURACINPUENTECOMPLETOINVERSO

LosimilarocurreenmodoInverso,amenosqueestospinesdispongandefuncionesdiferentes:

Ununolgico(1)apareceenelpinP1C(pinestactivoanivelalto)
SecuenciadepulsosapareceenelpinP1By
Uncerolgico(0)apareceenlospinesP1AyP1D(pinesestnactivosanivelbajo).

RegistroPWM1CON

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 47/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos

STRCPWMRestartEnablebit(BitdehabilitacindelreinicioautomticodelPWM)

1Despusdeunapagadoautomtico,elmduloPWMsereiniciaautomticamente,yelbitECCPASEdelregistro
ECCPASseponeacero.
0ParaiciarelmduloPWMdespusdeunapagadoautomtico,elbitECCPASEdebeponerseaceroporsoftware.
PDC6PDC0PWMDelayCountbits(BitsdeconfiguracindeltiempomuertoenelmodoPWM)Elnmerobinariode7dgitos
determinaelnmerodeciclosdeinstrucciones(4Tosc)aadidoscomotiempomuertoalactivarlospinesdeentradaPWM.

RegistroPSTRCON

STRSYNCSteeringSyncbit(bitdesincronizacindedireccin)determinaelmomentodeladireccindelospulsosdePWM:

1LadireccinocurredespusdequeelregistroPSTRCIONhayasidocambiado,slosisehacompletadolaforma
deondadelPWM.
0LadireccinocurredespusdequeelregistroPSTRCIONhayasidocambiado.LasealPWMenlasalidadelpin
sercambiadainmediatamentesinrepararensielcicloanteriorhasidocompletado.Esteprocedimientoestil
cuandoesnecesariodetenerlatransmisindeunasealPWMdelpin.
STRDSteeringEnablebitD(bitDdehabilitacindedireccin)determinalafuncindelpinP1D.

1ElpinP1DtienelaformadeondadelPWMconpolaridaddeterminadaporlosbitsCCP1M0yCCP1M1.
0Pinestconfiguradocomoentrada/salidageneraldelpuertoPORTD.
STRCSteeringEnablebitC(bitCdehabilitacindedireccin)determinalafuncindelpinP1C.

1ElpinP1CtienelaformadeondadelPWMconpolaridaddeterminadaporlosbitsCCP1M0yCCP1M1.
0Pinestconfiguradocomoentrada/salidageneraldelpuertoPORTD.

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 48/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos
STRBSteeringEnablebitB(bitBdehabilitacindedireccin)determinalafuncindelpinP1B.

1ElpinP1BtienelaformadeondadelPWMconpolaridaddeterminadaporlosbitsCCP1M0yCCP1M1.
0Pinestconfiguradocomoentrada/salidageneraldelpuertoPORTD.
STRASteeringEnablebitA(bitAdehabilitacindedireccin)determinalafuncindelpinP1A.

1ElpinP1AtienelaformadeondadelPWMconpolaridaddeterminadaporlosbitsCCP1M0yCCP1M1.
0Pinestconfiguradocomoentrada/salidageneraldelpuertoPORTC.

RegistroECCPAS

ECCPASEECCPAutoShutdownEventStatusbit(bitdeestadodelapagadoautomtico)indicasihaocurridoelapagadoautomtico
delmduloCCP(estadodeApagado):

1MduloCCPestenestadodeApagado.
0MduloCCPfuncionanormalmente.
ECCPAS2ECCPAS0ECCPAutoShutdownSourceSelectbits(Bitsdeseleccindelafuentedeapagadoautomtico)seleccionala
fuentedeapagadoautomtico.

ECCPAS2 ECCPAS1 ECCPAS0 F UENT EDEL EST ADO DEAPAG ADO

0 0 0 Estadodelapagadodeshabilitado

0 0 1 CambiodesalidadelcomparadorC1

0 1 0 CambiodesalidadelcomparadorC2

0 1 1 CambiodesalidasdeloscomparadoresC1yC2

1 0 0 Cerolgico(0)enelpinINT

1 0 1 Cerolgico(0)enelpinINTocambiodesalidadelcomparadorC1

1 1 0 Cerolgico(0)enelpinINTocambiodesalidadelcomparadorC2

1 1 1 Cerolgico(0)enelpinINTocambiodesalidasdeloscomparadoresC1yC2

PSSAC1,PSSAC0PinsP1A,P1CShutdownStateControlbits(BitsdeconfiguracindelospinesP1AyP1Cenmododeapagado)
defineelestadolgicodelospinesP1AyP1CcuandoelmduloCCPestenelestadodeapagado.

PSSAC1 PSSAC0 EST ADO L G ICO DEL O SPINES

0 0 0

0 1 1

1 X Altaimpedancia(Triestado)

PSSBD1,PSSBD0PinsP1B,P1DShutdownStateControlbits(BitsdeconfiguracindelospinesP1ByP1Denmododeapagado)
defineelestadolgicodelospinesP1ByP1DcuandoelmduloCCPestenelestadodeapagado.

PSSBD1 PSSBD0 EST ADO L G ICO DEL O SPINES

0 0 0

0 1 1

1 X Altaimpedancia(Triestado)

ElmicrocontroladorPIC16F887disponedevariosmdulosdecomunicacinserieindependientes,ademscadaunosepuedeconfigurar
afuncionarenmodosdiferentes.Esoesloqueloshaceinsustituiblesenmuchoscasos.Acurdesedeloquehemosdichosobrelos
mdulosCCPyaquelomismoseaplicaaqu.Nosepreocupedelosdetallesdelfuncionamientodetodoslosmdulos,soloseleccione
unoyutiliceloquerealmentenecesita.

3.8MDULOSDECOMUNICACINSERIE

ElUSARTesunodelosprimerossistemasdecomunicacinserie.Lasversionesnuevasdeestesistemaestnactualizadasyseles
denominaunpocodiferenteEUSART.

EUSART

ElmduloTransmisor/ReceptorUniversalSncrono/Asncronomejorado(EnhancedUniversalSynchronousAsynchronousReceiver
TransmitterEUSART)esunperifricodecomunicacinseriedeentrada/salida.AsimismoesconocidocomoInterfazdecomunicacin
serie(SerialCommunicationsInterfaceSCI).Contienetodoslosgeneradoresdesealesdereloj,registrosdedesplazamientoybfers
dedatosnecesariospararealizartransmisindedatosseriedeentrada/salida,independientementedelaejecucindeprogramadel

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 49/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos
dispositivo.Comoindicasunombre,apartede
utilizarelrelojparalasincronizacin,estemdulo
puedeestablecerlaconexinasncrona,loquelo
hacenicoparaalgunasaplicaciones.Por
ejemplo,encasodequeseadifciloimposible
proporcionarcanalesespecialesparatransmisin
yrecepcindedatosysealesdereloj(por
ejemplo,mandoadistanciaderadiooinfrarrojas),
elmduloEUSARTesdefinitivamentelamejor
opcinposible.

ElEUSARTintegradoenelPIC16F887poseelassiguientescaractersticas:

TransmisinyrecepcinasncronaenmodoFullduplex
Caracteresdeanchurade89bitsprogramables
Deteccindedireccinenmodode9bits
Deteccindeerroresporsaturacindelbferdeentraday
ComunicacinHalfDuplexenmodosncrono.
EUSARTENMODOASNCRONO

ElEUSARTtransmiteyrecibelosdatosutilizandolacodificacindenoretornoaceroNRZ(nonreturntozero).Comosemuestraenla
siguientefigura,noseutilizaunasealderelojylosdatossetransmitendeformamuysimple:

Cadadatosetransmitedelasiguienteforma:

Enestadoinactivolalneadedatospermaneceenestadoalto(1)
Cadatransmisindedatoscomienzaconunbitdearranque(START),elcual,siempreescero(0)
Cadadatotieneunanchode8o9bits(primerosetransmiteelbitmenossignificativoLSB)y
Cadatransmisindedatosterminaconunbitdeparada(STOP),elcual,siempreesuno(1)Lasiguientefigura
muestracmoconectardemanerahabitualunmicrocontroladorPICqueutilizaelmduloEUSART.ElcircuitoRS
232seutilizacomounconvertidordeniveldevoltaje.
FigurebelowshowsacommonwayofconnectingPICmicrocontrollerthatusesEUSARTmodule.TheRS232circuitisusedasavoltage
levelconverter.

EUSARTENMODODETRANSMISORASNCRONO

ParahabilitarlatransmisindedatospormediodelmduloEUSART,esnecesarioconfigurarloparaquefuncionecomountransmisor.En
otraspalabras,esnecesariodefinirelestadodelossiguientesbits:

TXEN=1EltransmisorEUSARTsehabilitaalponeraunoelbitTXENdelregistroTXSTA.
SYNC=0ElEUSARTseconfiguraafuncionarenmodoasncronoalponeraceroelbitSYNCdelregistroTXSTA.
SPEN=1AlponeraunoelbitSPENdelregistroRCSTA,elEUSARTesthabilitadoyelpinTX/CKseconfigura
automticamentecomosalida.Sielbitseutilizasimultneamenteparaalgunafuncinanalgica,sedebedeshabilitar
alponeraceroelbitcorrespondientedelregistroANSEL.
LapartecentraldeltransmisorEUSARTocupaelregistrodedesplazamientoTSRquenoestdirectamentedisponiblealusuario.Para
iniciarlatransmisindedatos,elmdulodebeestarhabilitadoalponeraunoelbitTXENdelregistroTXSTA.Losdatosaenviarsedeben
escribirenelregistroTXREG,loqueresultarenlasiguientesecuenciadeeventos:

BytesertransmitidoinmediatamentealregistrodedesplazamientoTSR
ElregistroTXREGpermanecevaco,loqueindicalabanderadebitTXIFdelregistroPIR1.Siseponeaunoelbit
TXIEdelregistroPIE1,segenerarunainterrupcin.Detodosmodos,labanderaseponeaunosinrepararensiuna
interrupcinesthabilitadaonoynosepuedeponeraceroporsoftware,sinoalescribirundatonuevoenelregistro
TXREG.
Dispositivoselectrnicosdecontrol"empujan"eldatohaciaelpinTXensincronizacinconsealderelojinterna:bit
dearranque(START)(1).....datos....bitdeparada(STOP)(1).
CuandoelltimobitabandonaelregistroTSR,elbitTRMTenelregistroTXSTAseponeaceroautomticamente.
SimientrastantoseescribeundatonuevoenelregistroTXREG,todoelprocedimientoserepiteinmediatamente
despusdelatransmisindelbitdeparadadeldatoanterior.
Paratransmitirundatode9bitsesnecesarioponeraunoelbitTX9delregistroTXSTA.ElbitTX9DdelregistroTXSRTAeselnovenobity
elmssignificativo.Altransmitirundatode9bits,elbitdedatosTX9Ddeberestarescritoantesdequedeseescribanlos8bitsmenos
significativosenelregistroTXREG.TodoslosnuevebitsdedatossetransmitenalregistrodedesplazamientoTFRinmediatamente
despusdequeseacabelaescrituraenelregistroTXREG.

EUSARTENMODODERECEPTORASNCRONO

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 50/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos

SimilaralponerenmarchaeltransmisordelEUSART,parahabilitarelreceptoresnecesarioconfigurarlossiguientesbits:

CREN=1ElreceptorEUSARTsehabilitaalponeraunoelbitCRENdelregistroRCSTA
SYNC=0ElEUSARTseconfiguraafuncionarenmodoasncronoalponeraceroelbitSYNCdelregistroTXSTA
y
SPEN=1AlponeraunoelbitSPENdelregistroRCSTA,elEUSARTesthabilitadoyelpinRX/DTseconfigura
automticamentecomosalida.Sielbitseutilizasimultneamenteparaalgunafuncinanalgica,sedebedesha
bilitaralponeraceroelbitcorrespondientedelregistroANSEL.
Despusdequesehayaterminadoelprimerpasonecesarioysehayadetectadoelbitdearranque(START),eldatosetransmiteal
registrodedesplazamientoRSRporelpinRX.Alhaberrecibidoelbitdeparada(STOP),ocurrelosiguiente:

EldatosetransmiteautomticamentealregistroRCREG(siestvaco)
ElbitdebanderaRCIFseponeaunoyocurreunainterrupcinsiesthabilitadaporelbitRCIEenelregistroPIE1.
Similaraltransmisor,elbitdebanderaseponeacerosloporsoftware,osea,alleerelregistroRCREG.Tengaen
cuentaqueestoesundobleregistrodetipoFIFO(primeroenentrar,primeroensalirfirstin,firstout),loquepermite
almacenamientodedoscaracteressimultneamente)
SielregistroRCREGestocupado(contienedosbytes)yelregistrodedesplazamientodetectaelnuevobitde
parada(STOP),elbitdesobrescrituraOERRsepondrauno.Entalcasosepierdeundatonuevoqueviene,yelbit
OERRdebeponerseaceroporsoftwarealponeraceroyluegoalponeraunoelbitCREN
Nota:NoesposiblerecibirundatonuevosinohastaqueelbitOERRestauno.
Sielbitdeparada(STOP)estacero(0),elbitFERRdelregistroRCSTAestarauno,loqueindicaunerroren
recepciny
Parahabilitarlarecepcindeundatode9bits,esnecesarioponeraunoelbitRX9delregistroRCSTA.
DETECCINDEERRORESENRECEPCIN

Elmicrocontroladorpuededetectarautomticamentedostiposdeerrores.Elprimeroesdenominadoerrordeencuadre(Framingerror).
Ocurrecuandoelreceptornodetectaelbitdeparadaenunintervalopredeterminadodetiempo.EsteerrorseindicamedianteelbitFERR
delregistroRCSTA.Sielbitestauno,elltimodatorecibidopuedeserincorrecto.Cabedestacarlosiguiente:

Elerrordeencuadrenogeneraporsimismounainterrupcin
Sielbitestauno,elltimodatorecibidocontieneunerror
Elerrordeencuadre(bitestauno)noimpidelarecepcindeundatonuevo
ElbitFERRseponeaceroalleereldatorecibido,loquesignificaquesedebehacerunaverificacinantesdeleerel
datoy
ElbitFERRnosepuedeponeraceroporsoftware.Siesnecesario,sepuedeborraralponeraceroalbitSPENdel
registroRCSTA,locual,simultneamentecausaunareinicializacindelsistemaEUSART.
Otrotipodeerroresdenominadoerrordesobrescritura(OverrunError).Comohemosmencionadoanteriormente,elregistrodetipoFIFO
puedealmacenarslodoscaracteres.Unerrordesobrescrituraocurrecuandoelregistrorecibeeltercercarcter.Simplementenohay
espacioparaalmacenarunbytems,porloqueunerroresinevitable.Cuandoocurreesteerror,elbitOERRdelregistroRCSTAsepone
auno.Lasconsecuenciassonlassiguientes:

LosdatosalmacenadosenlosregistrosFIFO(2bytes)sepuedenleernormalmente
NoserecibirnmsdatoshastaqueelbitOERRestpuestoaceroy
Aestebitnoselepuedeaccederdirectamente.Paraborrarlo,esnecesarioponeraceroelbitCRENdelregistro
RCSTAoreiniciarelsistemaEUSARTalponeraceroalbitSPENdelregistroRCSTA.
RECEPCINDEDATOSDE9BITS

Apartederecibirlosdatosdeformaestndarde8bits,elsistemaEUSARTsoportalarecepcindedatosde9bits.Enelladodel
transmisor,elnovenobitseadjuntaalbyteoriginaldirectamenteantesdelbitdeparada.Enelladodelreceptor,alponeraunoelbit
RX9delregistroRCSTA,elnovenobitdedatosserautomticamenteescritoenelbitRX9Ddelmismoregistro.Despusdealmacenar

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 51/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos
estebyte,esnecesariotenercuidadoencomoleerestosbitsprimerosedebeleerelbitRX9Dyluegolosocho(8)bitsmenos
significativosdelregistroRCREG.Deotraforma,elnovenobitserpuestoaceroantesdeserledo.

DETECCINDEDIRECCIN

CuandoelbitADDENdelregistroRCSTAestauno,elmoduloEUSARTescapazderecibirslolosdatosde9bits,mientrasquese
ignorantodoslosdatosde8bits.Aunquepareceunarestriccin,estemodohabilitalacomunicacinserialentrevarios
microcontroladores.Elprincipiodefuncionamientoesmuysimple.Eldispositivomaestroenvaundatode9bitsquerepresentala
direccindeunmicrocontroladoresclavo.Noobstante,todosdebentenerelbitADDENpuestoauno,yaquedeestamanerasehabilitala
deteccindedireccin.Todoslosmicrocontroladoresesclavosquecompartenlamismalneadetransmisin,recibenestedato(direccin)
yverificanautomticamentesicoincideconsupropiadireccin.Elsoftware,enelqueocurrelacoincidenciadedireccin,debe
deshabilitarladeteccindedireccin,poniendoaceroelbitADDEN.

Eldispositivomaestrosigueenviandolosdatosde8bitsalmicrocontrolador.Todoslosdatosquepasanporlalneadetransmisinsern
recibidossloporelmduloEUSARTdireccionado.Unavezrecibidoelltimobyte,elmicrocontroladoresclavodebeponeraunoelbit
ADDENparahabilitardenuevoladeteccindedireccin.

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 52/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos

RegistroTXSTA

CSRCClockSourceSelectbit(bitdeseleccindelafuentedereloj)determinalafuentedelreloj.Seutilizasloenmodosincrnico.

1ModoMaestro.Relojgeneradointernamenteporelgeneradordetasadebaudios.
0ModoEsclavo.Relojprovenientedeunafuenteexterna.
TX99bitTransmitEnablebit(bitdehabilitacindelmodode9bitsentransmisin)

1Sehabilitaelmodode9bitsentransmisinporelsistemaEUSART.
0Sehabilitaelmodode8bitsentransmisinporelsistemaEUSART.
TXENTransmitEnablebit(Bitdehabilitacindetransmisin)

1Transmisinhabilitada.
0Transmisindeshabilitada.
SYNCEUSARTModeSelectbit(BitdeseleccindelmodoEUSART)

1ElEUSARTfuncionaenmodosncrono.
0ElEUSARTfuncionaenmodoasncrono.
SENDBSendBreakCharacterbit(BitdeenvodecarcterBreakenmodoasncrono)seutilizasloenmodoasncronoycuandose
requiereobedecerelestndardebusLIN.

1SeenviaruncarcterBreakenlaprximatransmisin(seponea0porhardwarecuandofinalizaelenvo).
0EnvodelcarcterdetransmisinBreakcompletado.
BRGHHighBaudRateSelectbit(bitdeseleccindemododealtavelocidadenmodoasncrono).Determinalavelocidadde
transmisinenmodosncrono.NoafectaalEUSARTenmodosncrono.

1EUSARTfuncionaaaltavelocidad.
0EUSARTfuncionaabajavelocidad.
TRMTTransmitShiftRegisterStatusbit(bitdeestadoderegistrodedesplazamientodetransmisin)

1RegistroTSRestvaco.
0RegistroTSRestlleno.
TX9DNinthbitofTransmitData(Valordelnovenobitentransmisin)Puedeserutilizadocomodireccinobitdeparidadopara
distinguirentredireccinodatoenlosbusesmaestroesclavo).

RegistroRCSTA

SPENSerialPortEnablebit(bitdehabilitacindelpuertoserie)

1Puertoseriehabilitado.LospinesRX/DTyTX/CKseconfiguranautomticamentecomoentradaysalida,
respectivamente.
0Puertoseriedeshabilitado.
RX9(bitdehabilitacindelmodode9bitsenrecepcin):

1Sehabilitalarecepcindedatosde9bitspormediodelsistemaEUSART.
0Sehabilitalarecepcindedatosde8bitspormediodelsistemaEUSART.
SRENSingleReceiveEnablebit(bitdehabilitacindelarecepcinsimple).Esutilizadosloenmodosincrnicoyenfuncionamiento
comoMaestro.

1Recepcinsimplehabilitada.
0Recepcinsimpledeshabilitada.

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 53/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos
CRENContinuousReceiveEnablebit(bitdehabilitacindelarecepcincontinua)actadependiendodelmodoEUSART.

Modoasncrono:

1Recepcinhabilitada.
0Recepcindeshabilitada.
Modosncrono:

1SehabilitalarecepcincontinuahastaqueelbitCRENestacero.
0Nosehabilitalarecepcinenformacontinua.
ADDENAddressDetectEnablebit(bitdehabilitacindeladeteccindedireccin)seutilizasloenmododedetectarladireccin.

1Habilitaladeteccindedireccin(sloseprocesaunbyterecibidoenelregistrodedesplazamientoderecepcin
sielnovenobitestauno)
0Deteccindedireccindeshabilitada(todoslosbytesrecibidosenelregistrodedesplazamientoderecepcinson
procesadosindependientementedelvalordelnovenobitrecibido).Elnovenobitseutilizacomobitdeparidad.
FERRFramingErrorbit(bitdeerrordeencuadre)

1Sehaproducidounerrordeencuadreenrecepcin.
0Nosehaproducidounerrordeencuadre.
OERROverrunErrorbit(bitdeerrordesobrescritura).

1Sehaproducidounerrordesobrescrituraenrecepcin.
0Nosehaproducidounerrordesobrescritura.
RX9DNinthbitofReceivedDataNosehaproducidounerrordesobrescritura.

GENERADORDEBAUDIOSDELEUSART(BRG)

SimiraatentamentealdiagramadelreceptorotransmisorEUSARTasncrono,verquelosambosutilizansealderelojdeltemporizador
localBRGparalasincronizacin.Lamismafuentederelojseutilizatambinenmodosncrono.

EltemporizadorBRGconsisteendosregistrosde8bitshaciendounregistrode16bits.

Elvalordeunnmeroescritoenestosdosregistrosdeterminarlavelocidaddetransmisinenbaudios.Adicionalmente,elbitBRGHdel
registroTXSTAyelbitBRGH16delregistroBAUDCTL,afectanlafrecuenciaderelojutilizadaparaelclculodelosbaudios.

Elvalordeunnmeroescritoenestosdosregistrosdeterminarlavelocidaddetransmisinenbaudios.Adicionalmente,elbitBRGHdel
registroTXSTAyelbitBRGH16delregistroBAUDCTL,afectanlafrecuenciaderelojutilizadaparaelclculodelosbaudios.

BITS
MO DO BRG /EUSART F RMUL ADEVEL O CIDADDET RANSMISI NENBAUDIO S
SYNC BRG1G BRGH

0 0 0 de8bits/asncrono Fosc/[64(n+1)]

0 0 1 de8bits/asncrono Fosc/[16(n+1)]

0 1 0 de16bits/asncrono Fosc/[16(n+1)]

0 1 1 de16bits/asncrono Fosc/[4(n+1)]

1 0 X de8bits/sncrono Fosc/[4(n+1)]

1 1 X de16bits/sncrono Fosc/[4(n+1)]

Lastablasenlassiguientespginascontienenlosvaloresquedebenestarescritosenelregistrode16bitsSPBRGyasignadosalosbits
SYNC,BRGHyBRGH16paraobteneralgunosvaloresdelavelocidaddetransmisinenbaudiosestndar.Lafrmulaparahacerel
clculodelavelocidaddetransmisinenbaudios:

RegistroBAUDCTL

ABDOVFAutoBaudDetectOverflowbit(bitdedesbordamientodeautodeteccindelavelocidaddetransmisin)seutilizasloen
modoasncronoduranteladeteccindelavelocidaddetransmisin.

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 54/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos
1Sehaproducidodesbordamientodurantelaautodeteccin.
0Nosehaproducidodesbordamientodurantelaautodeteccin.
RCIDLReceiveIdleFlagbitNosehaproducidodesbordamientodurantelaautodeteccin.

1Receptorenestadoinactivo.Nohayoperacinderecepcinenmarcha.
0Seharecibidoelbitdearranque(START)yhayunaoperacinderecepcinenmarcha.
SCKPSynchronousClockPolaritySelectbit.(bitdeseleccindepolaridaddelasealderelojenmodosncrono).Elestadolgicode
estebitdifieredependiendodeculmododeEUSARTestactivo

Modoasncrono:

1EldatoinvertidosetransmitealpinRC6/TX/CK.
0EldatonoinvertidosetransmitealpinRC6/TX/CK.
Modosncrono:

1Sincronizacinenelflancoascendentedelasealdereloj.
0Sincronizacinenelflancodescendentedelasealdereloj.
BRG1616bitBaudRateGeneratorbit(bitdehabilitacindelgeneradordevelocidaddetransmisinde16bits)determinasielregistro
SPBRGHseutilizar,oseasieltemporizadorBGRGtendr8o16bits.

1Seutilizaelgeneradordevelocidaddetransmisinde16bits
0Seutilizaelgeneradordevelocidaddetransmisinde8bits
WUEWakeupEnablebit(bitdehabilitacindelmododeautoactivacinenmodoasncrono):

1Mododeautoactivacinhabilitado.ElreceptoresperaaqueelflancodescendenteaparezcaenelpinRC7/RX/DT
paraqueelmicrocontroladorsedespiertedelmododereposo.
0Mododeautoactivacinhabilitado.Elreceptorfuncionanormalmente.
ABDENAutoBaudDetectEnablebit(bitdehabilitacindeautodeteccindevelocidaddetransmisin)seutilizasloenmodo
asncrono.

1Mododeautodeteccinhabilitado.Aldetectarlavelocidaddetransmisin,elbitseponeaunoautomticamente.
0Mododeautodeteccindeshabilitado.
VamosahacerloenmikroC...

/*Enesteejemplo,elmduloEUSARTinternoseinicializayseajustaparaenviarel
mensajeinmediatamentedespusderecibirlo.Lavelocidaddetransmisinenbaudiosse
ajustaa9600bps.ElprogramautilizalassiguientesrutinasdelibreraUART:
UART1_init(),UART1_Write_Text(),UART1_Data_Ready(),UART1_Write()yUART1_Read().*/

charuart_rd

voidmain(){
ANSEL=ANSELH=0//Todoslospinesseconfigurancomodigitales
C1ON_bit=C2ON_bit=0//Deshabilitarloscomparadores
UART1_Init(9600)//InicializarelmduloUARTa9600bps
Delay_ms(100)//EsperaraquesealderelojdelmduloUARTse
//pongaestable
UART1_Write_Text("Start")
while(1){//Bucleinfinito
if(UART1_Data_Ready()){//Sieldatoseharecibido,
uart_rd=UART1_Read()//leaeldatorecibido
UART1_Write(uart_rd)//yenveloatrsporelUART
}
}
}

TransmisinserialasncronaatravsdelosregistrosdelmduloEUSART

1. LavelocidaddetransmisindeseadadeberestarajustadaatravsdelosbitsBRGH(delregistroTXSTA)y
BRG16(delregistroBAUDCTL)ydelosregistrosSPBRGHySPBRG.
2. LavelocidaddetransmisindeseadadeberestarajustadaatravsdelosbitsBRGH(delregistroTXSTA)y
BRG16(delregistroBAUDCTL)ydelosregistrosSPBRGHySPBRG.
3. LavelocidaddetransmisindeseadadeberestarajustadaatravsdelosbitsBRGH(delregistroTXSTA)y
BRG16(delregistroBAUDCTL)ydelosregistrosSPBRGHySPBRG.
4. LatransmisindedatoseshabilitadaponiendoaunoelbitTXENdelregistroTXSTA.ElbitTXIFdelregistro
PIR1estautomticamentepuestoauno.
5. ParaqueelbitTXENcauseunainterrupcin,tantoelbitTXIEdelregistroPIE1comolosbitsGIE,PEIEdel
registroINTCONdebernestarpuestosauno.
6. Enunatransmisindedatosde9bits,elvalordelnovenobitdeberestarescritoenelbitTX9Ddelregistro

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 55/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos
TXSTA.
7. Latransmisincomienzacuandoseescribeeldatode8bitssobreelregistroderecepcinTXREG.

RecepcinserialasncronaatravsdelosregistrosdelmduloEUSART:

1. LavelocidaddetransmisindeseadadeberestarajustadaatravsdelosbitsBRGH(delregistroTXSTA)y
BRG16(delregistroBAUDCTL)ydelosregistrosSPBRGHySPBRG.
2. ElbitSYNC(delregistroTXSTA)deberestarpuestoaceroyelbitSPEN(delregistroRCSTA)deberestar
puestoaunoafindehabilitarelpuertoserie.
3. TantoelbitRCIEdelregistroPIE1comolosbitsGIEyPEIEdelregistroINTCONdebernestarpuestosauno
sisenecesitahabilitarquelarecepcindedatocauseunainterrupcin.
4. Paraunarecepcindedatosde9bits,elbitRX9(delregistroRCSTA)deberestarpuestoauno
5. LarecepcindedatoseshabilitadaponiendoaunoelbitCRENdelregistroRCSTA.
6. ElregistroRCSTAdeberleerseparaobtenerinformacinacercadelaocurrenciadeerroresdurantela
recepcin.Elvalordelnovenobitseralmacenadoenesteregistroenlarecepcindedatosde9bits.
7. Eldatode8bitsrecibidoseralmacenadoenelregistroRCREGydeberleerseparaobtenerdichodato.

Ajustarelmododedeteccindedireccin:

1. LavelocidaddetransmisindeseadadeberestarajustadaatravsdelosbitsBRGH(delregistroTXSTA)y
BRG16(delregistroBAUDCTL)ydelosregistrosSPBRGHySPBRG.
2. ElbitSYNC(delregistroTXSTA)deberestarpuestoaceroyelbitSPEN(delregistroRCSTA)deberestar
puestoauno(1)afindehabilitarelpuertoserie.
3. TantoelbitRCIEdelregistroPIE1comolosbitsGIEyPEIEdelregistroINTCONdebernestarpuestosauno
sisenecesitahabilitarquelarecepcindedatocauseunainterrupcin.
4. ElbitRX9delregistroRCSTAdebeestarauno.
5. ElbitADDENdelregistroRCSTAdebeestarauno,loquehabilitaqueundatoseareconocidocomodireccin.
6. LarecepcindedatoseshabilitadaponiendoaunoelbitCRENdelregistroRCSTA.
7. Tanprontocomoserecibaundatode9bits,elbitRCIFdelregistroPIR1estarautomticamentepuestoauno.
Siesthabilitadaseproduceunainterrupcin.
8. ElregistroRCSTAdeberleerseparaobtenerinformacinacercadelaocurrenciadeerroresdurantela
transmisin.ElnovenobitRX9Dsiempreestarauno.
9. Eldatode8bitsrecibidoseralmacenadoenelregistroRCREGydeberleerse.Sedebercomprobarsila
combinacindeestosbitscoincideconladireccinpredefinida.Sicoincide,esnecesarioponeraceroelbit
ADDENdelregistroRCSTA,loquehabilitalarecepcindedatosde8bits.

MDULOPUERTOSERIESNCRONOMAESTRO(MSSP)

ElMSSP(PuertoseriesncronomaestroMasterSynchronousSerialPort)esunmdulomuytil,yalavezunodeloscircuitosms
complejosdentrodelmicrocontrolador.Estemdulopermitelacomunicacindealtavelocidadentreunmicrocontroladoryotros
perifricosuotrosmicrocontroladoresalutilizarvariaslneasdeE/S(comomximodosotreslneas).Poreso,seutilizaconfrecuencia
paraconectarelmicrocontroladoralosvisualizadoresLCD,losconvertidoresA/D,lasmemoriasEEPROMseriales,losregistrosde
desplazamientoetc.Lacaractersticaprincipaldeestetipodecomunicacinesqueessncronayadecuadaparaserutilizadaensistemas
conunslomaestroyunoomsesclavos.Undispositivomaestrocontieneuncircuitoparageneracindebaudiosyadems,suministra
sealesderelojatodoslosdispositivosdelsistema.Losdispositivosesclavosnodisponendeuncircuitointernoparageneracinde
sealesdereloj.ElmduloMSSPpuedefuncionarenunodedosmodos:

modoSPI(InterfazperifricaserialSerialPeripheralInterface)y
modoI2C(CircuitointerintegradoInterIntegratedCircuit).
Comosemuestraenlasiguientefigura,unmduloMSSPrepresentaslounamitaddeunhardwarenecesarioparaestableceruna
comunicacinserial,mientrasquelaotramitadsealmacenaeneldispositivoconelqueintercambialosdatos.Aunquelosmdulosen
ambaspuntasdelneasonlosmismos,susmodosdefuncionamientodifierenesencialmentedependiendodesielmdulofuncionacomo
MaestroocomoEsclavo:

Sielmicrocontroladoraserprogramadocontrolaotrodispositivoocircuito(perifricos),deberfuncionarcomoundispositivomaestro.
Estemdulogenerarsealderelojcuandoseanecesario,oseaslocuandoserequierarecibirytransmitirlosdatosporsoftware.Por
consiguiente,elestablecimientodeconexindependenicamentedeldispositivomaestro.

Delocontrario,sielmicrocontroladoraserprogramadoestintegradoenundispositivomscomplejo(porejemploenunaPC),deber
funcionarcomoundispositivoesclavo.Comotal,unesclavosiempretienequeesperaraqueundispositivomaestroenvelasolicitudde
transmisindedatos.

MODOSPI

ElmodoSPIpermitelatransmisinyrecepcinsimultneadedatosde8bitsalutilizartreslneasdeentrada/salida

SDOSerialDataOut(salidadedatosserie)lneadetransmisin
SDISerialDataIn(entradadedatosserie)lneaderecepciny
SCKSerialClock(relojdecomunicacin)lneadesincronizacin.

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 56/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos
Adicionalmente,hayunacuartalnea(SS)quesepuedeutilizarsielmicrocontroladorintercambialosdatosconvariosdispositivos
perifricos.Refirasealasiguientefigura.

SSSlaveSelect(Seleccindeesclavo)Esunalneaadicionalutilizadaparalaseleccindeundispositivoespecfico.Estalneaest
activaslosielmicrocontroladorfuncionacomoesclavo,oseacuandoeldispositivoexternomaestrorequiereintercambiarlosdatos.Al
funcionarenmodoSPI,elmduloMSSPutiliza4registrosentotal:

SSPSTATregistrodeestado
SSPCONregistrodecontrol
SSPBUFbferseriedetransmisin/recepcin
SSPSRregistrodedesplazamiento(noesaccesibledirectamente)
Losprimerostresregistrossondelectura/escrituraysepuedenmodificarencualquiermomento,mientrasqueelcuarto,comonoes
accesible,seutilizaparaconvertirdatosenformatoserial.

Comosemuestraenlasiguientefigura,lapartecentraldelmduloSPIconsistededosregistrosconectadosalospinespararecepcin,
transmisinysincronizacin.

Elregistrodedesplazamiento(SSPRS)estdirectamenteconectadoalospinesdelmicrocontroladoryesutilizadoparatransmisinde
datosenformatoserie.ElregistroSSPRSdisponedelaentradaysalidaparadesplazarlosdatoshaciadentroyhaciafueradel
dispositivo.Enotraspalabras,cadabitqueapareceenlaentrada(lneaderecepcin)desplazasimultneamenteotrobithacialasalida
(lneadetransmisin).

ElregistroSSPBUF(Bfer)esunapartedememoriautilizadaparaalmacenartemporalmentelosdatosantesdequeseenven,osea
inmediatamentedespusdequesereciban.Despusdequetodoslos8bitshayansidorecibidos,elbytesemuevedelregistroSSPRSal
registroSSPBUF.Esteprocesodecrearundoblebferpararecibirlosdatospermiteiniciarlarecepcindelprximobyteantesdeleerlos
datosqueseacabanderecibir.Durantelatransmisin/recepcindedatosseignoraunintentodeescribirundatoenelregistroSSBUF.
Desdeelpuntodevistadeunprogramador,esteregistroseconsideraelmsimportanteporhabersidoaccedidoconmsfrecuencia.
Concretamente,sidejamosaparteelajustedelmododefuncionamiento,latransmisindedatosporelmduloSPInoesnadamsque
escrituraylecturadedatosdeesteregistro,mientrasquelasdemsacrobaciascomomoverlosregistros,sellevanacabo
automticamenteporelhardware.

VamosahacerloenmikroC...

/*Enesteejemplo,elmicrocontroladorPIC(maestro)envaunbytededatosaunchip
perifrico(esclavo)porelmduloSPI.Elprogramautilizalasfuncionesdelibrera
SPISPI1_init()ySPI1_Write.*/

sbitChip_SelectatRC0_bit//PinRC0esunpindeseleccionarelchip

//perifricoSeleccin_de_chip
sbitChip_Select_DirectionatTRISC0_bit//BitTRISC0defineelpinRC0comoentradaosalida
unsignedintvalue//Datoaserenviadoesdetipounsignedint

voidmain(){
ANSEL=ANSELH=0//TodoslospinesdeE/Ssondigitales
TRISB0_bit=TRISB1_bit=1//ConfigurarlospinesRB0,RB1comoentradas
Chip_Select=0//Seleccionarelchipperifrico
Chip_Select_Direction=0//ConfigurarelpinCS#comosalida
SPI1_Init()//InicializarelmduloSPI
SPI1_Write(value)//Envarelvaloralchipperifrico
...

ComunicacinserialsncronaSPI

AntesdeinicializarelmduloSPI,esnecesarioespecificarvariasopciones:

ModomaestroTRISC.3=0(pinSCKessalidadesealdereloj)
MododeesclavoTRISC.3=1(pinSCKesentradadesealdereloj)
Fasededatosdeentradalamitadoelfinaldeltiempodesalida(bitSMPdelregistroSSPSTAT)
Flancodereloj(bitCKEdelregistroSSPSTAT)
Velocidaddetransmisinenbaudios,losbitsSSPM3SSPM0delregistroSSPCON(sloenmodoMaestro)
Seleccindemodoesclavo,bitsSSPM3SSPM0delregistroSSPCON(sloenmodoEsclavo)
ElmduloseponeenmarchaalponeraunoelbitSSPEN:

Paso1.
LosdatosasertransmitidosdebernserescritosenelregistrodelbferSSPBUF.SielmduloSPIfuncionaenmodomaestro,el
microcontroladorejecutarautomticamentelasecuenciadelossiguientespasos2,3y4.SielmduloSPIfuncionaenmodoesclavo,el
microcontroladornoejecutarlasecuenciadelossiguientespasoshastaqueelpinSCKdetectesealdereloj.

Paso2.

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 57/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos
EldatosemuevealregistroSSPSRyelcontenidodelregistroSSPBUFnoseborra.

Paso3.
Eldatosedesplazahaciaelpindesalida(primerosedesplazaelbitmssignificativoMSB),mientrasquealavezelregistrosecarga
conlosbitsporelpindeentrada.Enmodomaestroelmicrocontroladorensimismogenerasealdereloj,mientrasqueelmodoesclavo
utilizasealderelojexterna(pinSCK).

Paso4.
ElregistroSSPSRestllenodespusdequehayansidorecibidos8bitsdedatos,loqueseindicaalponeraunoelbitBFdelregistro
SSPSTATyelbitSSPIFdelregistroPIR1.Losdatosrecibidos(unbyte)sonautomticamentemovidosdelregistroSSPSRalregistro
SSPBUF.Comolatransmisindedatosserialserealizaautomticamente,elrestodeprogramaseejecutanormalmentemientrasquela
transmisindedatosestenprogreso.Enestecaso,lafuncindelbitSSPIFesdegenerarunainterrupcinalacabarlatransmisindeun
byte.

Paso5.
Porltimo,eldatoalmacenadoenelregistroSSPBUFestlistoparasuusoydebemoversealregistrodeseado.

ModoI2C

ElmodoI2 C(Busdecircuitointerintegrado)esadecuadoparaserutilizadocuandoelmicrocontroladordebeintercambiarlosdatoscon
uncircuitointegradodentrodeunmismodispositivo.stossonconfrecuenciaotrosmicrocontroladores,oloscircuitosintegrados
especializadosybaratosquepertenecenalanuevageneracindeasllamados"perifricosinteligentes"(memorias,sensoresde
temperatura,relojesdetiemporealetc.)

SimilaralacomunicacinserieenmodoSPI,latransmisindedatosenmodoI2Cessncronaybidireccional.Estavezslodospinesse
utilizanparatransmisindedatos.stossonlospinesdeSDA(Datosseriales)ySCL(Relojserial).Elusuariodebeconfigurarestospines
comoentradasosalidasporlosbitsTRISC.

Alobservarlasreglasparticulares(protocolos),estemodohabilitaconectarsimultneamentedeunamanerasimplehasta112diferentes
componentesalutilizarslodosvaliosospinesdeE/S.Vamosavercmofuncionaelsistema:

Elreloj,necesarioparasincronizarelfuncionamientodeambosdispositivos,siempreesgeneradoporundispositivomaestro(un
microcontrolador)ysufrecuenciadirectamenteafectaalavelocidaddetransmisindedatos.Aunquehayunprotocoloquepermitecomo
mximounafrecuenciaderelojde3,4MHz(asllamadobusI2Cdealtavelocidad),estelibrocubresloelprotocoloutilizadoconms
frecuencia,conunafrecuenciaderelojlimitadaa100KHz.Lafrecuenciamnimanoestlimitada.

Cuandoloscomponentesmaestroyesclavoestnsincronizadosporelreloj,elmaestrosiempreiniciacadaintercambiodedatos.Unavez
queelmduloMSSPsehahabilitado,esperaqueocurraunacondicindearranque(Startcondition).Eldispositivomaestroprimeroenva
elbitdearranque(estacero)porelpinSDA,luegoladireccinde7bitsdeldispositivoesclavoseleccionado,yporltimo,elbitque
requierealdispositivoescribir(0)oleer(1)eldatoenviado.Enotraspalabras,losochobitssedesplazanalregistroSSPSRdespusde
ocurrirunacondicindearranque.Todoslosdispositivosesclavosquecompartenlamismalneadetransmisinrecibirn
simultneamenteelprimerbyte,perosloelquecontieneladireccincoincidenterecibireldatoentero.

Unavezqueelprimerbytesehaenviado(slosetransmitendatosde8bits),elmaestroseponeenmododerecepcinyesperael
reconocimientodeldispositivoreceptoracercadeladireccincoincidente.

Sieldispositivoesclavoenvaunbitdereconocimiento(1)latransmisindedatoscontinuarhastaqueeldispositivomaestro
(microcontrolador)enveelbitdeparada(Stop).

Estoesunaexplicacinsimpledecmosecomunicandoscomponentes.Estemicrocontroladorescapazdecontrolarlassituacionesms
complicadascuandoestnconectados1024diferentescomponentes(direccinde10bits),compartidosporvariosdispositivosmaestros
diferentes.Porsupuesto,estosdispositivosseutilizanpocasvecesenlaprcticaporloquenoesnecesariohablardeellos
detalladamente.

LasiguientefiguramuestraeldiagramadebloquesdelmduloMDSSPenmodoI2 C.

EnunaoperacinI2 CconelmduloMSSPintervienenseisregistros.AlgunosdeellossemuestranenlaFiguraanterior.

SSPCON
SSPCON2
SSPSTAT
SSPBUF
SSPSR
SSPADD

RegistroSSPSTAT

SMPSamplebit(Bitdemuestra)

ModomaestroSPIEstebitdeterminafasededatosdeentrada.

1Estadolgicoseleealfinaldeltiempodesalida.

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 58/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos
0Estadolgicoseleeenlamitaddeltiempodesalida.
ModoesclavoSPIEstebitdebeserborradocuandoSPIseempleaenmodoesclavo.

ModoIC(maestrooesclavo)

1Deshabilitacontroldevariacionesparavelocidadestndar(100kHz).
0Habilitacontroldevariacionesparavelocidadalta(400kHz).
CKEClockEdgeSelectbit(bitdeseleccindelflancodereloj)seleccionaelmododesincronizacin.

CKP=0:

1Datotransmitidoenflancoascendentedepulsodereloj(01).
0Datotransmitidoenflancodescendentedepulsodereloj(10).
CKP=1:

1Datotransmitidoenflancodescendentedepulsodereloj(10).
0Datotransmitidoenflancoascendentedepulsodereloj(01).

D/AData/Addressbit(bitdedirecciones/datos)seutilizasloenmodoI2 C.

1Indicaqueelltimobyterecibidootransmitidoesundato.
0Indicaqueelltimobyterecibidootransmitidoesunadireccin.
PStopbit(bitdeparada)seutilizasloenmodoIC.

1Bitdeparada(STOP)sehadetectado.
0Bitdeparada(STOP)nosehadetectado.
SStartbit(bitdearranque)seutilizasloenmodoI2C.

1Bitdearranque(START)sehadetectado.
0Bitdearranque(START)nosehadetectado.

R/WReadWritebit(bitdeinformacinLectura/Escritura)seutilizasloenmodoI2 C.EstebitcontienelainformacindelbitdeL/E
despusdelaltimadireccincoincidente.Estebitesvlidoslodesdeladireccincoincidentehastaelsiguientebitdearranque,bitde
paradaobitnoACK.

ModoICenmodoesclavo

1Lecturadedato.
0Escrituradedato.
ModoICenmodoesclavo

1Transmisinenprogreso.
0Transmisinnoestenprogreso.

UAUpdateAddressbit(bitdeactivacindedireccin)seutilizasloenmodoI2 Cde10bits.

1IndicaqueesnecesarioactualizarladireccinenelregistroSSPADD.
0Indicaqueladireccinescorrectayquenosenecesitaactualizarla.
BFBufferFullStatusbit(bitdeestadodebferlleno)

Durantelarecepcindedato(enmodosSPIeIC)

1Recepcincompleta.ElregistroSSPBUFestlleno.
0Recepcinnocompleta.ElregistroSSPBUFestvaco.
Durantelatransmisindedato(sloenmodoIC)

1Transmisindedatoenprogreso(noincluyeelbitACKybitsdeparada).
0Transmisindedatocompleta(noincluyeelbitACKybitsdeparada).

RegistroSSPSTAT

WCOLWriteCollisionDetectbit(bitdetectordecolisin)

1Colisindetectada.EnelregistroSSPBUFsehaescritocuandonosehancumplidolascondicionesparainiciar
unatransmisin.
0Nohaycolisin.
SSPOVReceiveOverflowIndicatorbit(bitdetectordedesbordamientoenrecepcin)

1SerecibeunnuevobytecuandoelregistroSSPBUFanmantienelosdatosanteriores.Comonohayespacio
pararecibirdatosnuevos,unodeestosdosbytesdebeserborrado.Enestecaso,losdatosalmacenadosenel
registroSSPSRsepierdenirremediablemente.
0Datoserialesrecibidocorrectamente.
SSPENSynchronousSerialPortEnablebit(bitdehabilitacindelmduloSSPpuertoseriesncrono)determinalafuncindelospines
delmicrocontroladoreinicializaelmduloMSSP:

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 59/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos
EnmodoSPI

1HabilitaelmduloMSSPyconfiguralospinesSCK,SDO,SDIySScomounafuentedepinesdelpuertoserie.
0DeshabilitaelmduloMSSPyconfiguraestospinescomopinesdelpuertodeE/S.
EnmodoIC

1HabilitaelmduloMSSPyconfiguralospinesSDAySCLcomounafuentedepinesdelpuertoserie.
0DeshabilitaelmduloMSSPyconfiguraestospinescomopinesdelpuertodeE/S.
CKPClockPolaritySelectbit(bitdeseleccindepolaridaddereloj)noseutilizaenmodoICmaestro.

EnmodoSPI

1Paraunasealdereloj,elestadoinactivoesunnivelalto.
0Paraunasealdereloj,elestadoinactivoesunnivelbajo.
EnmodoICesclavo

1Sealderelojhabilitada.
0Mantienelasalidadesealderelojenestadobajo.Seutilizaparaproporcionarmstiempoparaestabilizacinde
datos.
SSPM3SSPM0SynchronousSerialPortModeSelectbits.(bitdeseleccindelmododelSSP(puertoseriesncrono).ElmodoSSPse
determinaalcombinarlossiguientesbits:

SSPM3 SSPM2 SSPM1 SSPM0 MO DO

0 0 0 0 ModomaestrodelSPI,reloj=Fosc/4.

0 0 0 1 ModomaestrodelSPI,reloj=Fosc/16.

0 0 1 0 ModomaestrodelSPI,reloj=Fosc/64.

0 0 1 1 ModomaestrodelSPI,reloj=(TMRoutput)/2.

0 1 0 0 ModoesclavodelSPI,habilitadoelpindecontrolSS.

ModoesclavodelSPI,deshabilitadoelpindecontrolSS,SSsepuedeutilizarcomo
0 1 0 1
pindeE/S.

0 1 1 0 ModoesclavoI2C,direccinde7bitsutilizada.

0 1 1 1 ModoesclavoI2C,direccinde10bitsutilizada.

1 0 0 0 ModomaestroI2C,reloj=Fosc/[4(SSPAD+1)].

1 0 0 1 MscarautilizadaenmodoesclavoI2C.

1 0 1 0 Noutilizado.

1 0 1 1 ModomaestroI2Ccontrolado.

1 1 0 0 Noutilizado.

1 1 0 1 Noutilizado.

ModoesclavoI2C,direccinde7bitsutilizada,losbitsdearranque(START)yde
1 1 1 0
parada(STOP)habilitaninterrupcin.

ModoesclavoI2C,direccinde10bitsutilizada,losbitsdearranque(START)yde
1 1 1 1
parada(STOP)habilitaninterrupcin.

RegistroSSPCON2

GCENGeneralCallEnablebit(bitdehabilitacingeneral)

SloenmodoesclavoIC

1HabilitainterrupcincuandounadireccindellamadageneralesrecibidaenelSSPST(0000h).
0Deshabilitadireccindellamadageneral.
ACKSTATAcknowledgeStatusbit(bitdeestadodereconocimiento)

SloenmododetransmisinmaestroIC

1Reconocimientodelesclavonorecibido.
0Reconocimientodelesclavorecibido.
ACKDTAcknowledgedatabit(bitderecepcin)

SloenmododerecepcinmaestroIC

1Noreconocimiento.
0Reconocimiento.
ACKENAcknowledgeSequenceEnablebit(bitdehabilitacindesecuenciadereconocimiento)

EnmododerecepcinmaestroIC

1IndicaunasecuenciadereconocimientoenlospinesSDAySCLytransmiteelbitACKDT.Automticamente
borradoporhardware.

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 60/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos
0Secuenciadereconocimientoenreposo.
RCENReceiveEnablebit(bitdehabilitacinderecepcin)

SloenmodomaestroIC

1HabilitarecepcinenmodoI2C.
0Recepcindeshabilitada.
PENSTOPconditionEnablebit(bitdehabilitacindecondicindeParada)

SloenmodomaestroIC

1IndicaunacondicindeParadaenlospinesSDAySCL.Luego,estebitesautomticamenteborradopor
hardware.
0CondicindeParadaenreposo.
RSENRepeatedSTARTConditionEnabledbit(bitdehabilitacinderepetircondicindeArranque)

SloenmodomaestroIC

1IndicarepeticindecondicindeArranqueenlospinesSDAySCL.Luego,estebitesautomticamenteborrado
porhardware.
0CondicinderepeticindeArranqueenreposo.
SENSTARTConditionEnabled/StretchEnabledbit(bitdehabilitacindecondicindeArranque)

SloenmodomaestroIC

1IndicacondicindeArranqueenlospinesSDAySCL.Luego,estebitesautomticamenteborradoporhardware.
0CondicindeArranqueenreposo.

ICenModoMaestro

Elcasomscomnesqueunmicrocontroladorfuncionacomomaestroyunperifricocomoesclavo.Eslaraznporlaqueestelibroslo
trataestemodo.Sedaporentendidoqueladireccinconsisteen7bitsyeldispositivocontieneunsolomicrocontrolador(dispositivocon
maestronico).

ParahabilitarelmduloMSSPenestemodo,sigalassiguientesinstrucciones:

Ajustelavelocidaddetransmisin(registroSSPADD),desactiveelcontroldevelocidadderotacin(alponeraunoelbitSMPdelregistro
SSPSTAT)yseleccioneelmodomaestro(registroSSPCON).Despusdefinalizartodoslosajustesyhabilitarelmdulo(registro
SSPCON:bitSSPEN),esnecesarioesperaraqueloscircuitosdecontrolinternosindiquenconunasealquetodoestpreparadopara
transmisindedatos:osea,queelbitSSPIFdelregistroPIR1sehayapuestoauno.

Despusdeponerestebitaceroporsoftware,elmicrocontroladorestlistoparaintercambiarlosdatosconlosperifricos.

TransmisindedatosenModoMaestroIC

LatransmisindedatosenelpinSDAseiniciaconuncerolgico(0)queaparecealponeraunoelbitSPENdelregistroSSPCON2.Sin
embargo,aunqueesthabilitado,elmicrocontroladortienequeesperarciertotiempoantesdeiniciarlacomunicacin.Seledenomina
'CondicindeInicio'durantelaqueserealizanlaspreparacionesyverificacionesinternas.Sisecumplencontodaslacondiciones,elbit
SSPIFdelregistroPIR1seponeaunoylatransmisindedatosseiniciaencuantosecargueelregistroSSPBUF.

Comomximo112circuitosintegrados(dispositivosesclavos)puedencompartirsimultneamentelamismalneadetransmisin.Elprimer
bytededatosenviadoporeldispositivomaestrocontieneladireccinquecoincideconunasoladireccindeldispositivoesclavo.Todas
lasdireccionesseenumeranenlashojasdedatosrespectivas.Eloctavobitdelprimerbytededatosespecificaladireccindetransmisin
dedatos,oseasielmicrocontroladorvaaenviarorecibirlosdatos.Enestecaso,comosetratadetransmisindedatos,eloctavobitse
poneacero(0).

Cuandoocurrelacoincidenciadedirecciones,elmicrocontroladortienequeesperaraqueeldispositivoesclavoenveelbitde
reconocimiento,oseaquesepongaaceroelbitASKSTATdelregistroSSPCON2.Unavezquelacoincidenciadedireccioneshaocurrido
apropiadamente,todoslosbytesdedatossetransmitendelamismamanera.

LatransmisindedatosterminaalponeraunoelbitSENdelregistroSSPCON2.Ocurrelacondicindeparada(STOP),loquehabilita
queelpinSDArecibaunasecuenciadepulsos:

InicioDireccinReconocimientoDatoReconocimiento....DatoReconocimientoParada!

RecepcindedatosenModoMaestroIC

Laspreparacionespararecibirlosdatossonsimilaresalasdetransmitirlosdatos,conexcepcindequeelltimobitdelprimerbyte
enviado(elquecontieneladireccin)sepongaaunolgico(1).Esoespecificaqueeldispositivomaestroesperarecibirlosdatosdel
dispositivoesclavodireccionado.Conrespectoalmicrocontrolador,ocurrelosiguiente:

Despusdehacerlaspruebasinternasyponeraunoelbitdearranque(START),eldispositivoesclavoenvabyteporbyte.Estosbytesse

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 61/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos
almacenanenelregistroserialSSPSR.Despusderecibirelltimooctavobit,cadadatosecargaenelregistroSSPBUFdelquese
puedeleer.Alleeresteregistro,seenvaautomticamenteelbitdereconocimiento,loquesignificaqueeldispositivomaestroestlisto
pararecibirlosnuevosdatos.

Aligualqueenelcasodelatransmisin,larecepcindedatosterminaalponeraunoelbitdeparada(STOP):

InicioDireccinReconocimientoDatoReconocimiento....DatoReconocimientoParada!

Enestasecuenciadepulsos,elbitdereconocimientoseenvaaldispositivoesclavo.

Generadordebaudios

Parasincronizarlatransmisindedatos,todosloseventosqueocurrenenelpinSDAdebenestarsincronizadosconlasealdereloj
generadaeneldispositivomaestro.Estasealderelojsegeneraporunsimpleosciladorcuyafrecuenciadependedelafrecuenciadel
osciladorprincipaldelmicrocontrolador,delvalorqueseintroducealregistroSSPADDyascomodelmodoSPIactual.Lafrecuenciade
sealderelojdelmododescritoenestelibrodependedelcristaldecuarzoseleccionadoydelregistroSPADD.Lafrmulautilizadapara
hacerelclculodefrecuenciaderelojes:

VamosahacerloenmikroC...

/*Enesteejemplo,elmicrocontroladorPICestconectadoalamemoriaEEPROM24C02
porlospinesSCLySDA.Elprogramaenvaunbytededatoaladireccin2delaEEPROM.
Entonces,elprogramaleeestedatoporelmodoI2CdelaEEPROMyloenvaal
puertoPORTBparacomprobarsieldatosehaescritoconxito.Elbyteparadireccionar
laEEPROMestcompuestopor7bitsdeladireccin(1010001)yelbitquedetermina
lecturaoescrituradeldato(LSBbitmenossignificativo).*/

voidmain(){
ANSEL=ANSELH=PORTB=TRISB=0//Todoslospinessondigitales.Lospinesdel
//puertoPORTBsonsalidas.
I2C1_Init(100000)//InicializarI2Cconrelojdeseado

//InciodelbloquedesentenciasparaescribirunbyteenlamemoriaEEPROM.

I2C1_Start()//SealdeiniciodeI2C
I2C1_Wr(0xA2)//EnviarbyteporI2C(direccindedispositivo+W)
I2C1_Wr(2)//Enviarbyte(direccindelalocalidadEEPROM)
I2C1_Wr(0xF0)//Enviarlosdatosaescribir
I2C1_Stop()//SealdeparadadeI2C
Delay_100ms()

//Enelsiguientebloquedesentenciassedeterminaladireccin2delaqueseleereldato

I2C1_Start()//SealdeiniciodeI2C
I2C1_Wr(0xA2)//EnviarbyteporI2C(direccindedispositivo+W)
I2C1_Wr(2)//Enviarbyte(direccindedato)

//Ladireccinestdeterminadayeldatoestlistoparaserledo

I2C1_Repeated_Start()//SevuelveagenerareliniciodesealI2C
I2C1_Wr(0xA3)//Enviarbyte(direccindedispositivo+R)
PORTB=I2C1_Rd(0u)//Leereldato(reconocimientoNO)
I2C1_Stop()//SealdeparadadeI2C
}

NOTASTILES...

Cuandoelmicrocontroladorsecomunicaconunperifrico,puedeocurrirunfalloenlatransmisindedatosporalgunarazn.Eneste
caso,esrecomendablecomprobarelestadodealgunosbitsquepuedenaclararelproblema.Enlaprctica,elestadodeestosbitsse
compruebaalejecutarunapequeasubrutinadespusdetransmisinyrecepcindecadabyte(porsiacaso).

WCOL(SPCON,7)SiintentaescribirundatonuevoalregistroSSPBUFmientrasqueotratransmisin/recepcindedatosesten
progreso,elbitWCOLseponeaunoyelcontenidodelregistroSSBUFsequedasincambios.Nohayescritura.Luego,elbitWCOLdebe
serborradoporelsoftware.

BF(SSPSTAT,0)Altransmitirlosdatos,estebitseponeaunodurantelaescrituraenelregistroSSPBUFysequedapuestoaunohasta
queelbyteenformatoserialsedesplacedelregistroSSPRS.Enmododerecepcin,estebitseponeaunoalcargarundatoouna
direccinalregistroSSPBUF.SeponeacerodespusdeleerelregistroSSPBUF.

SSPOV(SSPCON,6)Enmododerecepcin,estebitseponeaunoalrecibirunnuevobyteenelregistroSSPSRpormediodela

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 62/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos
comunicacinserial,todavasinhaberledoeldatoanteriormenterecibidodelregistroSSPBUF.

PinesSDAySCLCuandoelmduloSSPesthabilitado,estospinessevuelvenalassalidasdeDrenajeAbierto.Estosignificaque
debenestarconectadosaresistenciasconectadosalaotrapuntaalpolopositivodelafuentedealimentacin.

ParaestablecerlacomunicacinserialenmodoI2C,sedeberealizarlosiguiente:

Ajustarelmduloyenviarladireccin:

IntroducirenelregistroSSPADDelvalorparadefinirlavelocidaddetransmisinenbaudios.
PoneraunoelbitSMPdelregistroSSPSTATparadesactivarelcontroldelavelocidadderotacin.
Introducirelvalorbinario1000alosbitsSSPM3SSPM0delregistroSSPCON1paraseleccionarelmodoMaestro.
PoneraunoelbitSENdelregistroSSPCON2(secuenciadeInicioSTART).
ElbitSSPIFseponeaunoautomticamenteenfinaldelasecuenciadeIniciocuandoelmduloestlistopara
funcionar.Sedeberponeracero.
IntroducirladireccindeesclavoalregistroSSPBUF.
Cuandoseenvaunbyte,elbitSSPIF(interrupcin)seponeaunoautomticamentedespusdehaberrecibidoelbit
dereconocimientodeldispositivoesclavo.
Transmitirlosdatos:

IntroducirenelregistroSSPBUFlosdatosaenviar.
Cuandoseenvaunbyte,elbitSSPIF(interrupcin)seponeaunoautomticamentedespusdehaberrecibidoelbit
dereconocimientodeldispositivoesclavo.
LacondicindeParada(STOP)sedebeiniciaralponeraunoelbitPENdelregistroSSPCONparainformaral
dispositivoEsclavoquelatransmisindedatosseacab.
Recibirlosdatos:

PoneraunoelbitRSENdelregistroSSPCON2parahabilitarlarecepcin.
ElbitSSPIFindicaconsuestadolgicolarecepcindedatos.DespusdeleerlosdatosdelregistroSSPBUF,elbit
ACKENdelregistroSSPCON2debeponerseaunoparahabilitarelenvodelbitdereconocimiento.
LacondicindeParada(STOP)sedebeiniciaralponeraunoelbitPENdelregistroSSPCONparainformaral
dispositivoEsclavoquelatransmisinseacab.
ApartededisponerdeungrannmerodelneasdigitalesdeE/Sutilizadasparalacomunicacinconlosperifricos,elPIC16F887
contiene14entradasanalgicas.Debidoastas,elmicrocontroladornoslopuedereconocersiunpinesllevadoabajooalto(0o+5V),
sinoquepuedemedirconprecisinelvoltajeyconvertirloenunvalornumrico,osea,enformatodigital.

3.9MDULOSANALGICOS
ElmdulodelconvertidorA/Ddisponedelassiguientescaractersticas:

Elconvertidorgeneraunresultadobinariode10bitsutilizandoelmtododeaproximacionessucesivasyalmacena
losresultadosdeconversinenlosregistrosADC(ADRESLyADRESH)
Disponede14entradasanalgicasseparadas
ElconvertidorA/Dconvierteunasealdeentradaanalgicaenunnmerobinariode10bits
Laresolucinmnimaocalidaddeconversinsepuedeajustaradiferentesnecesidadesalseleccionarvoltajesde
referenciaVrefyVref+.

CONVERTIDORA/D

AunqueaprimeravistaparecemuycomplicadoutilizarunconvertidorA/D,enrealidadesmuysimple.Dehechoresultamssimpleutilizar
unconvertidorA/Dquelostemporizadoresomdulosdecomunicacinserie.

ElfuncionamientodelconvertidorA/Destbajoelcontroldelosbitsdecuatroregistros:

ADRESHRegistroaltodelresultadodelaconversinA/D
ADRESLRegistrobajodelresultadodelaconversinA/D
ADCON0Registrodecontrol0y
ADCON1Registrodecontrol1.

RegistrosADRESHyADRESL

Elresultadoobtenidodespusdeconvertirunvaloranalgicoendigitalesunnmerode10bitsquesealmacenarenlosregistros
ADRESHyADRESL.Haydosmanerasdemanejarlo:justificacinalaizquierdayaladerechaquesimplificaengranmedidasuuso.El
formatodelresultadodelaconversindependedelbitADFMdelregistroADCON1.EncasodequenoseutiliceelconvertidorA/D,estos
registrossepuedenutilizarcomoregistrosdepropsitogeneral.

REQUERIMIENTOSDEADQUISICINA/D

ParaqueelconvertidorA/Dalcancesuexactitudespecificada,esnecesarioproporcionarunciertotiempomuertoentreseleccionaruna
entradaanalgicaespecficaylamedicinmisma.Estetiemposeledenominatiempodeadquisicinygeneralmentedependedela
impedanciadelafuente.Seutilizaunaecuacinparahacerclculodetiempodeadquisicinconprecisin,cuyovalormnimoesde20uS
aproximadamente.Porconsiguiente,pararealizarunaconversinconprecisin,noseolvideestedetalle.

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 63/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos
RELOJPARALACONVERSINA/D

EltiemponecesariopararealizarunaconversinA/Dcuyoresultadoes1bitsedefineenunidadesdeTAD.Serequierequeseacomo
mnimo1,6uS.Pararealizarunaconversincompletade10bitsserequiereunpocomstiempodeloesperado,son11TAD.Comola
frecuenciaderelojascomolafuentedeconversinA/Dsondeterminadasporsoftware,esnecesarioseleccionarunadelas
combinacionesdelosbitsdisponiblesADCS1yADCS0antesdeempezaramedirvoltajeenunadelasentradasanalgicas.Estosbitsse
almacenanenelregistroADCON0.

F RECUENCIADEDISPO SIT IVO ( F O SC)


F UENT EDEREL O JDEADC ADCS1 ADCS0
20Mhz 8Mhz 4Mhz 1Mhz

Fosc/2 0 0 100nS 250nS 500nS 2uS

Fosc/8 0 1 400nS 1uS 2uS 8uS

Fosc/32 1 0 1.6uS 4uS 8uS 32uS

Frc 1 1 26uS 26uS 26uS 26uS

CualquiercambiodelafrecuenciaderelojdelmicrocontroladorafectaralafrecuenciaderelojdelaconversinA/D,loquepuede
perjudicaralresultadodelaconversinA/D.Enlasiguientetablasemuestranlascaractersticasdelafrecuenciadeldispositivo.Los
valoresenlasceldassombreadasestnfueradelrangorecomendado.

CMOUTILIZARELCONVERTIDORA/D?

ParallevaracabounaconversinA/Dsinproblemasascomoparaevitarlosresultadosinesperados,esnecesarioconsiderarlo
siguiente:

ElconvertidorA/Dnohacediferenciaentresealesdigitalesyanalgicas.Paraevitarerroresenmedicinodaarel
chip,lospinessedebenconfigurarcomoentradasanalgicasantesdequeempieceelprocesodeconversin.Los
bitsutilizadosparaestepropsitosealmacenanenlosregistrosTRISyANSEL(ANSELH)
Alleerelestadodepuertoconlasentradasanalgicas,elestadodelosbitscorrespondientesseleercomocero
lgico(0),sinrepararenelvalordelvoltajerealenelpiny
Hablandoentrminosgenerales,lamedicindevoltajeenelconvertidorestbasadoencompararvoltajedeentrada
conunaescalainternaquetiene1023grados(2101=1023).Elgradomsbajodeestaescalarepresentaelvoltaje
Vref,mientrasqueelgradomsaltoserefierealvoltajeVref+.Lasiguientefiguramuestralosvoltajesdereferencia
seleccionablesascomosusvaloresmximosymnimos.

RegistroADCON0

ADCS1,ADCS0A/DConversionClockSelectbits(bitsdeseleccinderelojdeconversinA/D)seleccionalafrecuenciadereloj
utilizadaparasincronizacininternadelconvertidorA/D.Asimismoafectaaladuracindelaconversin.

ADCS1 ADCS2 REL O J

0 0 Fosc/2

0 1 Fosc/8

1 0 Fosc/32

1 1 RC*

*SealderelojsegeneraporelosciladorinternoRCqueestintegradoenelconvertidor.

CHS3CHS0AnalogChannelSelectbits(bitsdeseleccindecanalanalgico)seleccionaunpinouncanalanalgicoparala
conversinA/D,oseaparamedirelvoltaje:

CHS3 CHS2 CHS1 CHS0 CANAL PIN

0 0 0 0 0 RA0/AN0

0 0 0 1 1 RA1/AN1

0 0 1 0 2 RA2/AN2

0 0 1 1 3 RA3/AN3

0 1 0 0 4 RA5/AN4

0 1 0 1 5 RE0/AN5

0 1 1 0 6 RE1/AN6

0 1 1 1 7 RE2/AN7

1 0 0 0 8 RB2/AN8

1 0 0 1 9 RB3/AN9

1 0 1 0 10 RB1/AN10

1 0 1 1 11 RB4/AN11

1 1 0 0 12 RB0/AN12

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 64/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos
1 1 0 1 13 RB5/AN13

1 1 1 0 CVref

1 1 1 1 Vref=0.6V

GO/DONEA/DConversionStatusbit(bitdeestadodelaconversinA/D)determinaelestadoactualdedelaconversin:

1LaconversinA/Destenprogreso.
0LaconversinA/Dhafinalizado.ElbitseponeaceroautomticamenteporhardwarecuandolaconversinA/D
finaliza.
ADONA/DOnbit(bitdeencendidoA/D)habilitaelconvertidorA/D.

1ConvertidorA/Desthabilitado.
0ConvertidorA/Destdeshabilitado.
VamosahacerloenmikroC...

/*Estecdigoesunejemplodeleerelvaloranalgicodelcanal2ydevisualizarlo
enlospuertosPORTByPORTCcomonmerobinariode10bits.*/

#include<built_in.h>
unsignedintadc_rd

voidmain(){
ANSEL=0x04//ConfigurarAN2comopinanalgico
TRISA=0xFF//PORTAseconfiguracomoentrada
ANSELH=0//ConfigurarlosdemspinesANcomoE/Sdigitales
TRISC=0x3F//PinesRC7yRC6seconfigurancomosalidas
TRISB=0//PORTBseconfiguracomosalida

do{
temp_res=ADC_Read(2)//Obtenerelresultadode10bitsdelaconversinAD
PORTB=temp_res//Enviarlos8bitsmsbajosalPORTB
PORTC=temp_res>>2//Enviarlos2bitsmssignificativosalosRC7,RC6
}while(1)//Quedarseenelbucle
}

RegistroADCON1

ADFMA/DResultFormatSelectbit(bitdeseleccindelformatodelresultadodelaconversinA/D)

1Resultadodeconversinestjustificadoaladerecha.Noseutilizanlosseisbitsmssignificativosdelregistro
ADRESH.
0Resultadodeconversinestjustificadoalaizquierda.Noseutilizanlosseisbitsmenossignificativosdel
registroADRESL.
VCFG1VoltageReferencebit(bitdeconfiguracindevoltajedereferencia)seleccionalafuentedevoltajedereferenciabajoquese
necesitaparaelfuncionamientodelconvertidorA/D.

1VoltajedereferenciabajoseaplicaalpinVref
0VoltajedealimentacinVssseutilizacomounafuentedevoltajedereferenciabajo.
VCFG0VoltageReferencebit(bitdeconfiguracindevoltajedereferencia)seleccionalafuentedevoltajedereferenciaaltoquese
necesitaparaelfucionamientodelconvertidorA/D.

1VoltajedereferenciaaltoseaplicaalpinVref+.
0VoltajedealimentacinVddseutilizacomounafuentedevoltajedereferenciaalto.
ParamedirelvoltajeenunpindeentradapormediodelconvertidorA/D,sedeberealizarlosiguiente:

Paso1Configuracindelpuerto:

Escribirununolgico(1)aunbitdelregistroTRIS,loqueresultaenconfigurarelpinapropiadocomounaentrada.
Escribirununolgico(1)aunbitdelregistroANSEL,loqueresultaenconfigurarelpinapropiadocomounaentrada
analgica.
Paso2ConfiguracindelmdulodelaconversinA/D:

ConfigurarvoltajedereferenciaenelregistroADCON1.
SeleccionarunasealderelojdelaconversinA/DenelregistroADCON0.
SeleccionarunodeloscanalesdeentradaCH0CH13delregistroADCON0.
SeleccionarelformatodedatopormediodeADFMdelregistroADCON1.
HabilitarelconvertidorA/DalponeraunoelbitADONdelregistroADCON0.
Paso3Configuracindelainterrupcin(opcionalmente):

PoneraceroelbitADIF.

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 65/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos
PoneraunolosbitsADIE,PEIEyGIE.
Paso4Tiempodeesperaparaquetranscurraeltiempodeadquisicin(aproximadamente20uS).

Paso5IniciodelaconversinponiendoaunoelbitGO/DONEdelregistroADCON0.

Paso6EsperaraquelaconversinA/Dfinalice.

EsnecesariocomprobarenelbucledeprogramasielbitGO/DONEestacerooesperarqueseproduzcauna
interrupcin(deberestaranteriormentehabilitada).
Paso7LecturadelresultadodelaconversinA/D:

LeerlosregistrosADRESHyADRESL.

COMPARADORANALGICO

ApartedelconvertidorA/D,hayotromdulo,quehastahacepocohasidoincorpodosloenloscircuitosintegradosquepertenecenalos
llamadoscomponentesanalgicos.Debidoalhechodequecasinohayningndispositivoautomticocomplejoqueenciertomodono
utiliceestoscircuitos,doscomparadoresdealtacalidad,juntoconloscomponentesadicionalesestnintegradosenelmicrocontroladory
conectadosasuspines.

Cmofuncionauncomparador?Bsicamente,elcomparadoranalgicoesunamplificadorquecomparalamagnituddevoltajesendos
entradas.Disponededosentradasyunasalida.Dependiendodeculvoltajedeentradaesmsalto(valoranalgico),uncerolgico(0)
oununolgico(1)(valoresdigitales)serlasalida.

CuandoelvoltajeanalgicoenVinesmsaltoqueelvoltajeanlogoenVin+,lasalidadelcomparadorestaraun
niveldigitalbajo.
CuandoelvoltajeanalgicoenVin+esmsaltoqueelvoltajeanlogoenVin,lasalidadelcomparadorestaraun
niveldigitalalto.
ElmicrocontroladorPIC16F887disponededosdeestoscomparadoresdevoltajecuyasentradasestnconectadasalospinesdeE/S
RA0RA3,mientrasquelassalidasestnconectadasalospinesRA4yRA5.Adems,hayunafuentedevoltajedereferenciainternaenel
chipmismo,laquevamosadiscutirmstarde.

Estosdoscircuitosestnbajoelcontroldelosbitsalmacenadosenlossiguientesregistros:

CM1CON0estencontroldelcomparadorC1
CM2CON0estencontroldelcomparadorC2
CM2CON1estencontroldelcomparadorC2

FUENTEINTERNADEVOLTAJEDEREFERENCIA

Unodedosvoltajesanalgicosproporcionadosenlasentradasdelcomparadoresporlogeneralestableeinalterable.Esdenominado
voltajedereferencia(Vref).Paragenerarlo,sepuedenutilizartantounafuentedevoltajeexternacomounafuentedevoltajeinterna
especial.ElvoltajedereferenciaVrefsederivadespusdeseleccionarunafuente,pormediodeunaredenescaleraqueconsisteen16
resistencias,formandoundivisordevoltaje.LafuentedevoltajeesseleccionableporelbitVRSSdelregistroVRCON.

Adems,lafraccindevoltajeproporcionadaporlaredderesistenciasesseleccionableporlosbitsVR0VR3yutilizadacomovoltajede
referencia.Vealasiguientefigura:

Elvoltajedereferenciadelcomparadordisponededosgamascon16diferentesnivelesdevoltajecadauna.Laseleccindegamaes
controladaporelbitVRRdelregistroVRCON.ElvoltajedereferenciaseleccionadoCVrefpuedeserlasalidaalpinRA2/AN2sielbit
VROEseponeauno.

Aunquelaideaprincipaleraobtenerelvoltajedereferenciavariableparaelfuncionamientodemdulosanalgicos,deesemodose
obtieneunsimpleconvertidorA/D.Esteconvertidoresmuytilenalgunassituaciones.Sufuncionamientoestbajoelcontroldelregistro
VRCON.

COMPARADORESEINTERRUPCIN

Siemprequehayauncambiodelestadolgicoenlasalidadeuncomparador,elbitdebanderaCMIFdelregistroPIRseponeauno.Ese
cambiotambincausarunainterrupcinsilossiguientesbitsseponenauno:

ElbitCMIEdelregistroPIE=1
ElbitPEIEdelregistroINTCON=1y
ElbitGIEdelregistroINTCON=1.
Siunainterrupcinesthabilitada,uncambioenlasalidadeuncomparadorcuandoelmicrocontroladorestenmododereposo,puede
causarqueelmicrocontroladorsalgadereposoyvuelvaafuncionarenmodonormal.

FUNCIONAMIENTOENMODODEREPOSO(SLEEPMODE)

Siesthabilitadoantesdeentrarenmododereposo,elcomparadorsequedaactivoduranteelmododereposo.Sielcomparadornose
utilizapara"despertar"eldispositivo,elconsumodecorrientesepuedereducirenmododereposoalapagarelcomparador.Estoselleva
acaboalponeraceroelbitCxONdelregistroCMxCON0.

Paraqueelcomparador"despierte"almicrocontroladordelmododereposo,elbitCxIEdelregistroIE2yelbitPEIEdelregistroINTCON
debernponerseauno.LainstruccinquesiguealainstruccinSleepsiempreseejecutaalsalirdelmododereposo.SielbitGIEdel

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 66/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos
registroINTCONseponeauno,eldispositivoejecutarlarutinadeserviciodeinterrupcin.

RegistroCM1CON0

LosbitsdeesteregistroestnencontroldelcomparadorC1.Esoafectaprincipalmentealaconfiguracindelasentradas.Paraexplicarlo
conmsclaridad,vealasiguientefiguraenlaquesemuestransloloscomponentesdirectamenteafectadosporlosbitsdeesteregistro.

C1ONComparatorC1Enablebit(bitdehabilitacindelcomparadorC1)habilitaalcomparadorC1.

1ComparadorC1esthabilitado.
0ComparadorC1estdeshabilitado.
C1OUTComparatorC1Outputbit(bitdesalidadelcomparadorC1)eslasalidadelcomparadorC1.

SiC1POL=1(salidadelcomparadorestinvertida)

1VoltajedeentradaC1Vin+esmsbajoqueelvoltajedeentradaC1Vin.
0VoltajedeentradaC1Vin+esmsaltoqueelvoltajedeentradaC1Vin.
IfC1POL=0(salidadelcomparadornoestinvertida)

1VoltajedeentradaC1Vin+esmsaltoqueelvoltajedeentradaC1Vin.
0VoltajedeentradaC1Vin+esmsbajoqueelvoltajedeentradaC1Vin.
C1OEComparatorC1OutputEnablebit(bitdehabilitacindesalidadelcomparadorC1)

1SalidadelcomparadorC1OUTestconectadaalpinC1OUT*.
0Salidadelcomparadorseutilizainternamente.
*ParahabilitarqueelbitC1OUTaparezcaenelpin,sedebencumplirdoscondiciones:C1ON=1(elcomparadordebeestaractivado)y
elbitcorrespondienteTRIS=0(pinsedebeconfigurarcomosalida).

C1POLComparatorC1OutputPolaritySelectbit(bitdeseleccindepolaridaddesalidadelcomparadorC1)habilitalainversindel
estadodelasalidadelcomparadorC1.

1SalidadelcomparadorC1estinvertida.
0SalidadelcomparadorC1noestinvertida.
C1RComparatorC1ReferenceSelectbit(bitdeseleccindelafuentedevoltajedereferenciadelcomparadorC1)

1EntradanoinvertidaC1Vin+estconectadaalafuentedevoltajedereferenciaC1Vref.
0EntradanoinvertidaC1Vin+estconectadaalpinC1IN+.
C1CH1,C1CH0ComparatorC1ChannelSelectbit(bitdeseleccindecanaldelcomparadorC1)

C1CH1 C1CH0 ENT RADAC1VIN DEL CO MPARADO R

0 0 EntradaC1VinestconectadaalpinC12IN0

0 1 EntradaC1VinestconectadaalpinC12IN1

1 0 EntradaC1VinestconectadaalpinC12IN2

1 1 EntradaC1VinestconectadaalpinC12IN3

RegistroCM2CON0

LosbitsdeesteregistroestnencontroldelcomparadorC2.Similaralcasoanterior,lasiguientefiguramuestraunesquemasimplificado
delcircuitoafectadoporlosbitsdeesteregistro.

C2ONComparatorC2Enablebit(bitdehabilitacindelcomparadorC2)habilitaelcomparadorC2.

1ComparadorC2esthabilitado.
0ComparadorC2estdeshabilitado.
C2OUTComparatorC2Outputbit(bitdesalidadelcomparadorC2)eslasalidadelcomparadorC2.

IfC2POL=1(salidadelcomparadorestinvertida)

1VoltajedeentradaC2Vin+esmsbajoqueelvoltajedeentradaC2Vin.
0VoltajedeentradaC2Vin+esmsaltoqueelvoltajedeentradaC2Vin.
IfC2POL=0(salidadelcomparadornoestinvertida)

1VoltajedeentradaC2Vin+esmsaltoqueelvoltajedeentradaC2Vin.
0VoltajedeentradaC2Vin+esmsbajoqueelvoltajedeentradaC2Vin.
C2OEComparatorC2OutputEnablebit(bitdehabilitacindesalidadelcomparadorC2)

1SalidadelcomparadorC2OUTestconectadaalpinC2OUT*.
0Salidadelcomparadorseutilizainternamente.

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 67/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos
*ParahabilitarqueelbitC2OUTaparezcaenelpin,sedebencumplirdoscondiciones:C2ON=1(elcomparadordebeestaractivado)y
elbitcorrespondienteTRIS=0(pinsedebeconfigurarcomosalida).

C2POLComparatorC2OutputPolaritySelectbit(bitdeseleccindepolaridaddesalidadelcomparadorC2)habilitalainversindel
estadodelasalidadelcomparadorC2.

1SalidadelcomparadorC2estinvertida.
0SalidadelcomparadorC2noestinvertida.
C2RComparatorC2ReferenceSelectbit(bitdeseleccindelafuentedevoltajedereferenciadelcomparadorC2)

1EntradanoinvertidaC2Vin+estconectadaalafuentedevoltajedereferenciaC2Vref.
0EntradanoinvertidaC2Vin+estconectadaalpinC2IN+.
C2CH1,C2CH0ComparatorC2ChannelSelectbit(bitdeseleccindecanaldelcomparadorC2)

C2CH1 C2CH0 ENT RADAC2VIN DEL CO MPARADO R

0 0 EntradaC2VinestconectadaalpinC12IN0

0 1 EntradaC2VinestconectadaalpinC12IN1

1 0 EntradaC2VinestconectadaalpinC12IN2

1 1 EntradaC2VinestconectadaalpinC12IN3

RegistroCM2CON1

MC1OUTMirrorCopyofC1OUTbitesunacopiadelbitC1OUT

MC2OUTMirrorCopyofC2OUTbitesunacopiadelbitC2OUT

C1RSELComparatorC1ReferenceSelectbit(bitdeseleccindelafuentedevoltajedereferenciadelcomparadorC1)

1VoltajeseleccionableCVrefseutilizaenlafuentedevoltajedereferenciaC1Vref.
0Voltajedereferenciafijode0,6VseutilizaenlafuentedevoltajedereferenciaC1Vref.
C2RSELComparatorC2ReferenceSelectbit(bitdeseleccindelafuentedevoltajedereferenciadelcomparadorC2)

1VoltajeseleccionableCVrefseutilizaenlafuentedevoltajedereferenciaC2Vref.
0Voltajedereferenciafijode0,6VseutilizaenlafuentedevoltajedereferenciaC2Vref.
T1GSSTimer1GateSourceSelectbit(bitdeseleccindelafuentedelacompuertadeltemporizadorTimer1)

1CompuertadeltemporizadorTimer1utilizasealdelpinT1G.
0CompuertadeltemporizadorTimer1utilizasealSYNCC2OUT.
C2SYNCComparatorC2OutputSynchronizationbit(bitdesincronizacindesalidadelcomparadorC2)

1SalidadelcomparadorC2estsincronizadaconunflancoascendentedesealderelojdeltemporizadorTimer1
0Salidadelcomparadoresunasealasncrona.
RegistroVRCON

VRENComparatorC1VoltageReferenceEnablebit(bitdehabilitacindelafuentedevoltajedereferenciadelcomparadorC1)

1FuentedevoltajedereferenciaCVrefestencendido.
0FuentedevoltajedereferenciaCVrefestapagado.
VROEComparatorC2VoltageReferenceEnablebit(bitdehabilitacindelafuentedevoltajedereferenciadelcomparadorC2)

1FuentedevoltajedereferenciaCVrefestconectadaalpin.
0FuentedevoltajedereferenciaCVrefnoestconectadaalpin.
VRRCVrefRangeSelectionbit(bitdeseleccindegamadevoltajedereferenciaVref)

1Fuentedevoltajedereferenciaseajustaaproducirbajagamadevoltaje.
0Fuentedevoltajedereferenciaseajustaaproduciraltagamadevoltaje.
VRSSComparatorVrefRangeselectionbit(bitdeseleccindegamadevoltajedereferenciaVrefdelcomparador)

1VoltajedereferenciaestenlagamadeVref+aVref.
0VoltajedereferenciaestenlagamadeVddaVss.(voltajedealimentacin).
VR3VR0CVrefValueSelection(seleccindevalordevoltajedereferencia)

IfVRR=1(gamabaja)

Elvoltajedereferenciasecalculapormediodelafrmula:CVref=([VR3:VR0]/24)Vdd.

IfVRR=0(gamaalta)

ElvoltajedereferenciasecalculapormediodelafrmulaCVref=Vdd/4+([VR3:VR0]/32)Vdd.

Pasosaseguirparautilizarapropiadamenteloscomparadoresintegrados:

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 68/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos
Paso1Configuracindelmdulo:

Paraseleccionarelmodoapropiado,sedebenconfigurarlosestadosdelosbitsdelosregistrosCM1CON0y
CM2CON0.Lainterrupcindebeestardeshabilitadaduranteelcambiodemodo.
Paso2ConfigurarlafuentedevoltajedereferenciaVrefinterna(slosiseutiliza).EnelregistroVRCONesnecesariorealizarlo
siguiente:

SeleccionarunadedosgamasdevoltajepormediodelbitVRR.
ConfigurarelvoltajedereferenciaVrefnecesariopormediodelosbitsVR3VR0.
PoneraunoelbitVROEsiesnecesario.
HabilitarlafuentedevoltajedereferenciaVrefalponeraunoelbitVREN.
Frmulautilizadaparacalcularelvoltajedereferencia

VRR=1(gamabaja)
CVref=([VR3:VR0]/24)VLADDER

VRR=0(gamaalta)
CVref=(VLADDER/4)+([VR3:VR0]VLADDER/32)

Vladder=Vddor([Vref+][Vref])orVref+

Paso3Iniciodelfuncionamiento:

HabilitarunainterrupcinalponeraunolosbitsCMIE(registroPIE),PEIEyGIE(registroINTCON).
LeerlosbitsC1OUTyC2OUTdelregistroCMCON.
LeerlabanderadebitCMIFdelregistroPIR.Despusdehabersidopuestoauno,estebitseponeaceropor
software.
Parasincronizartodoslosprocesosquesellevanacabodentrodelmicrocontrolador,sedebeutilizarunasealdereloj,mientrasque
paragenerarunasealdereloj,sedebeutilizarunoscilador.Asdesimple.Elmicrocontroladordisponedevariososciladorescapacesde
funcionarenmodosdiferentes.Yaquesdondevienelointeresante...

3.10OSCILADORDERELOJ

Comosemuestraenlasiguientefigura,lasealderelojsegeneraporunodelosdososciladoresintegrados.

UnosciladorexternoestinstaladofueradelmicrocontroladoryconectadoalospinesOSC1yOSC2.Esdenominado'externo'porque
utilizacomponentesexternosparagenerarunasealderelojyestabilizarlafrecuencia.Estosson:cristaldecuarzo,resonadorcermicoo
circuitoresistorcapacitor.Elmododefuncionamientodelosciladorseseleccionaporlosbits,queseenvandurantelaprogramacin,
denominadosPalabradeConfiguracin.

Elosciladorinternoconsisteendososciladoresinternosseparados:

ElHFINTOSCesunosciladorinternodealtafrecuenciacalibradoa8MHz.Elmicrocontroladorpuedeutilizarunasealderelojgenerada
aestafrecuenciaodespusdehabersidodivididaenelpreescalador.

ElLFINTOSCesunosciladorinternodebajafrecuenciacalibradoa31kHz.Suspulsosderelojseutilizanparafuncionamientodelos
temporizadoresdeencendidoyperroguardin,asimismopuedeutilizarsecomofuentedesealderelojparaelfuncionamientodetodoel
microcontrolador.

ElbitSystemClockSelect(bitdeseleccindelrelojdelsistemaSCS)delregistroOSCCONdeterminasiunafuentedesealderelojdel
microcontroladorserinternaoexterna.

RegistroOSCCON

ElregistroOSCCONgobiernaelmicrocontroladorylasopcionesdeseleccindefrecuencia.Contienelossiguientesbits:bitsdeseleccin
defrecuencia(IRCF2,IRCF1,IRCF0),bitsdeestadodefrecuencia(HTS,LTS),bitsdecontrolderelojdelsistema(OSTA,SCS).

IRCF20InternalOscillatorFrequencySelectbits.(bitsdeseleccindefrecuenciadelosciladorinterno).Elvalordeldivisorde
frecuenciasdependedelacombinacindeestostresbits.Lafrecuenciaderelojdelosciladorinternosedeterminadelamismamanera.

IRCF2 IRCF1 IRCF0 F RECUENCIA O SC.

1 1 1 8MHz HFINTOSC

1 1 0 4MHz HFINTOSC

1 0 1 2MHz HFINTOSC

1 0 0 1MHz HFINTOSC

0 1 1 500kHz HFINTOSC

0 1 0 250kHz HFINTOSC

0 0 1 125kHz HFINTOSC

0 0 0 31kHz LFINTOSC

OSTSOscillatorStartupTimeoutStatusbit(bitdeestadodeltemporizadordeencendido)indicaculfuentederelojestactualmente
enuso.Esunbitdeslolectura.

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 69/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos
1Seutilizaelosciladorderelojexterno.
0Seutilizaunodelososciladoresderelojinterno(HFINTOSCoLFINTOSC).
HTSHFINTOSCStatusbit(8MHz125kHz)(bitdeestadodelHFINTOSC)indicasielosciladorinternodealtafrecuenciafuncionaen
modoestable.

1HFINTOSCestestable.
0HFINTOSCnoestestable.
LTSLFINTOSCStablebit(31kHz)(bitdeestadodelLFINTOSC)indicasielosciladordebajafrecuenciafuncionaenmodoestable.

1LFINTOSCestestable.
0LFINTOSCnoestestable.
SCSSystemClockSelectbit(bitdeseleccindelrelojdelsistema)determinaculosciladorseutilizarcomounafuentedereloj.

1Osciladorinternoseutilizacomorelojdelsistema.
0Osciladorexternoseutilizacomorelojdelsistema.
Elmododelosciladorseconfigurapormediodelosbits,denominadosPalabradeConfiguracin,queseescribeenla
memoriadelmicrocontroladorduranteelprocesodelaprogramacin.

MODOSDERELOJEXTERNO

Elosciladorexternosepuedeconfigurarparafuncionarenunodevariosmodos,loquehabilitaquefuncioneadiferentesvelocidadesy
utilicediferentescomponentesparaestabilizarlafrecuencia.Elmododefuncionamientoseseleccionaduranteelprocesodeescribirun
programaenelmicrocontrolador.Antesquenada,esnecesarioactivarelprogramaenunaPCqueseutilizarparaprogramarel
microcontrolador.Enestecaso,eselprogramaPICflash.Pulsesobrelacasilladelosciladoryseleccioneunodelalistadesplegable.Los
bitsapropiadossepondrnaunoautomticamente,formandopartedevariosbytes,denominadosPalabradeConfiguracin.

Duranteelprocesodelaprogramacindelmicrocontrolador,losbytesdelaPalabradeConfiguracinseescribenenlamemoriaROMdel
microcontroladorysealmacenanenlosregistrosespecialesnodisponiblesalusuario.Abasedeestosbits,elmicrocontroladorsabe
quhacer,aunqueesonoseindicaexplcitamenteenelprograma.

Mododefuncionamientoseseleccionadespusdeescribirycompilarunprograma

OSCILADOREXTERNOENMODOEC

Elmododerelojexterno(ECexternalclock)utilizaunosciladorexternocomounafuentedesealdereloj.Lamximafrecuenciade
sealderelojestlimitadaa20MHz.

LasventajasdelfuncionamientodelosciladorexternoenmodoECsonlassiguientes:

LafuentederelojexternaindependienteestconectadaalpindeentradaOSC1.ElpinOSC2estdisponiblecomo
pindeE/Sdepropsitogeneral
Esposiblesincronizarelfuncionamientodelmicrocontroladorconlosdemscomponentesincorporadosenel
dispositivo
Enestemodoelmicrocontroladorseponeafuncionarinmediatamentedespusdeencenderlo.Noserequiereesperar
paraestabilizarlafrecuencia.
Aldeshabilitartemporalmentelafuentederelojexterna,sedetieneelfuncionamientodeldispositivo,dejandotodos
losdatosintactos.Despusdereiniciarelrelojexterno,eldispositivosiguefuncionandocomosinohubierapasado
nada.

OSCILADOREXTERNOENMODOLP,XTOHS

LosmodosLP,XTyHSutilizanunosciladorexternocomounafuentederelojcuyafrecuenciaestdeterminadaporuncristaldecuarzoo
porresonadorescermicosconectadosalospinesOSC1yOSC2.Dependiendodelascaractersticasdeloscomponentesutilizados,
seleccioneunodelossiguientesmodos:

ModoLP(Bajapotencia)seutilizasloparacristaldecuarzodebajafrecuencia.Estemodoestdestinadopara
trabajarconcristalesde32.768KHznormalmenteembebidosenlosrelojesdecristal.Esfcildereconocerlospor
susdimensionespequeasyunaformacilndrica.Alutilizarestemodoelconsumodecorrientesermenorqueen
losdemsmodos.
ModoXTseutilizaparacristalesdecuarzodefrecuenciasintermediashasta8MHz.Elconsumodecorrientees
mediaencomparacinconlosdemsmodos.
ModoHS(Altavelocidad)seutilizaparacristalesderelojdefrecuenciamsaltade8MHz.Alutilizarestemodoel
consumodecorrientesermayorqueenlosdemsmodos.

RESONADORESCERMICOSENMODOXTOHS

Losresonadorescermicossonsimilaresaloscristalesdecuarzosegnsuscaractersticas,porloqueseconectandelamismamanera.
Adiferenciadeloscristalesdecuarzo,sonmsbaratosylososciladoresquehacenusodeellossondecalidadmsbaja.Seutilizanpara
lasfrecuenciasderelojentre100kHzy20MHz.

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 70/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos

OSCILADOREXTERNOENMODOSRCYRCIO

Elusodeloselementosparaestabilizarlafrecuenciasindudaalgunatienemuchasventajas,peroavecesrealmentenoesnecesario.En
lamayoradecasoselosciladorpuedefuncionarafrecuenciasquenosonprecisamentedefinidas,asqueseraunaprdidadedinero
embebertaleselementos.Lasolucinmssimpleymsbarataesestassituacionesesutilizarunaresistenciayuncapacitorparael
funcionamientodeloscilador.Haydosmodos:

ModoRC.CuandoelosciladorexternoseconfiguraafuncionarenmodoRC,elpinOSC1debeestarconectadoalcircuitoRCcomose
muestraenlafiguraaladerecha.LasealdefrecuenciadelosciladorRCdivididapor4estdisponibleenelpinOSC2.Estasealse
puedeutilizarparalacalibracin,sincronizacinoparaotrospropsitos.

ModoRCIO.Demanerasimilar,elcircuitoRCestconectadoalpinOSC1.Estavez,elpinOSC2estdisponibleparaserutilizadocomo
pindeE/Sdepropsitogeneral.

Enamboscasosselerecomiendautilizarloscomponentescomosemuestraenlafigura.
Lafrecuenciadeesteosciladorsecalculapormediodelafrmulaf=1/Tsegnlaque:

f=frecuencia[Hz]
T=R*C=constantedetiempo[s]
R=resistenciaelctrica[]y
C=capacitanciadelcondensador[F].

MODOSDERELOJINTERNO

Elcircuitodelosciladorinternoconsisteendososciladoresseparadosquesepuedenseleccionarcomolafuentedelrelojdel
microcontrolador:

ElosciladorHFINTOSCestcalibradodefbricayfuncionaa8Mhz.Lafrecuenciadeesteosciladorsepuedeconfigurarporelusuariopor
mediodesoftwareutilizandolosbitsdelregistroOSCTUNE.

ElosciladorLFINTOSCnoestcalibradodefbricayfuncionaa31kHz.

Similaralosciladorexterno,elinternotambinpuedefuncionarenvariosmodos.Elmododefuncionamientoseseleccionadelamisma
maneraqueenelosciladorexternopormediodelosbitsqueformanPalabradeconfiguracin.Enotraspalabras,todosellevaacabo
dentrodelsoftwaredePCantesdeescribirunprogramaenelmicrocontrolador.

OSCILADORINTERNOENMODOINTOSC
Enestemodo,elpinOSC1estdisponibleparaserutilizadocomopindeE/Sdepropsitogeneral.Lasealdefrecuenciadeloscilador
internodivididapor4estdisponibleenelpinOSC2.

OSCILADORINTERNOENMODOINTOSCIO
Enestemodo,losdospinesestndisponiblescomopinesdeE/Sdepropsitogeneral.

CONFIGURACINDELOSCILADORINTERNO

Elosciladorinternoconsisteendoscircuitosseparados:

1.ElosciladorinternodealtafrecuenciaHFINTOSCestconectadoalpostescalador(divisordefrecuencias).Estcalibradodefbricay
funcionaa8Mhz.Alutilizarelpostescalador,esteosciladorpuedeproducirunasealderelojaunadesietefrecuencias.Laseleccinde
frecuenciaserealizadentrodelsoftwareutilizandolospinesIRCF2,IRCF1yIRCF0delregistroOSCCON.

ElHFINTOSCesthabilitadoalseleccionarunadesietefrecuencias(entre8Mhzy125kHz)yponeraunoelbitdelafuentederelojdel
sistema(SCS)delregistroOSCCON.Comosemuestraenlasiguientefigura,todoelprocedimientoserealizapormediodelosbitsdel
registroOSCCON.

2.ElosciladordebajafrecuenciaLFINTOSCnoestcalibradodefbricayfuncionaa31kHz.Esthabilitadoalseleccionarlafrecuencia
(bitsdelregistroOSCCON)yponeraunoelbitSCSdelmismoregistro.

MODODECAMBIOAUTOMTICODEVELOCIDADDERELOJ(TWOSPEEDCLOCKSTARTUPMODE)

Elmododecambioautomticodevelocidadderelojseutilizaparareducirelconsumodecorrientecuandoelmicrocontroladorfunciona
enmododereposo.Dequsetratatodoesto?

CuandoseconfiguraenmodoLP,XToHS,elosciladorexternosedesactivaalpasaramododereposoparareducirelconsumode
corrientetotaldeldispositivo.Cuandosecumplenlascondicionesde"despertamiento",elmicrocontroladornoseponeafuncionar
inmediatamentepuestoquetienequeesperaraqueseestabilicelafrecuenciadesealdereloj.Estetiempomuertoduraexactamente
1024pulsos,despusdequeelmicrocontroladorcontinaconlaejecucindelprograma.Elcasoesqueseejecutanslounaspocas
instruccionesantesdequeelmicrocontroladorvuelvaalmododereposo.

Esosignificaquelamayoradetiempoascomolamayoradecorrientedebaterassehaperdidoenvano.Elcasosesolucionautilizando
elosciladorinternoparaejecutarelprogramaduranteladuracinde1024pulsos.Tanprontocomoseestabilicelafrecuenciadel
osciladorexterno,lretomaautomticamente"elpapelprincipal".Todoelprocedimientosehabilitaalponeraunoelbitdepalabrade
configuracin.Paraprogramarelmicrocontrolador,esnecesarioseleccionarlaopcinIntExtSwitchover(conmutacininterna/externa)
porsoftware.

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 71/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos
MONITORPARADETECTARUNFALLODELAFUENTEDERELOJ(FAILSAFECLOCKMONITOR)

Comoindicasunombre,elmonitorparadetectarunfallodelafuentedereloj(FailSafeClockMonitorFSCM)monitoreael
funcionamientoexternoypermitealmicrocontroladorcontinuarconlaejecucindeprogramaencasodequeelosciladorfalleporalguna
razn.Entalcaso,elosciladorinternotomasufuncin.

Elmonitordetectaunfalloalcompararlasfuentesderelojinternoyexterno.Silospulsosdelosciladorexternotardanmsde2mSen
llegar,lafuentederelojserautomticamentecambiadaporlainterna.As,elosciladorinternosiguefuncionandocontroladoporlosbits
delregistroOSCCON.SielbitOSFIEdelregistroPIE2estauno,seproducirunainterrupcin.

Elrelojinternosiguesiendolafuentedelrelojdelsistemahastaqueeldispositivoreinicieconxitoelosciladorexternoquevuelveaser
lafuentederelojdelsistema.Demanerasimilaracasosanteriores,estemduloesthabilitadoalcambiarlapalabradeconfiguracin
justamenteantesdequeseinicieelprocesodeprogramarelchip.Estavez,estoserealizaalseleccionarlaopcinFailSafeClock
Monitor.

RegistroOSCTUNE

LoscambiosdelregistroOSCTUNEafectanalafrecuenciadelosciladorHFINTOSC,peronoalafrecuenciadelLFINTOSC.Nohay
ningunaindicacindequehayaocurridodesplazamientodefrecuenciaduranteelfuncionamientodelmicrocontrolador.

TUN4TUN0FrequencyTuningbits.(bitsdecalibrarlafrecuencia).Alcombinarestoscincobits,lafrecuenciadelosciladorde8Mhzse
reduceoseaumenta.Deestemodo,lasfrecuenciasobtenidasporladivisinenelpostescaladorcambiantambin.

TUN4 TUN3 TUN2 TUN1 TUN0 F RECUENCIA

0 1 1 1 1 Mxima

0 1 1 1 0

0 1 1 0 1

0 0 0 0 1

0 0 0 0 0 Calibrada

1 1 1 1 1

1 0 0 1 0

1 0 0 0 1

1 0 0 0 0 Mnima

LaEEPROMesunsegmentodememoriaseparado,quenopertenecealamemoriadeprograma(ROM),tampocoalamemoriadedatos
(RAM).Aunqueaestaslocalidadesdememorianoselespuedeaccederfcilyrpidamente,supropsitoesinsustituible.Losdatos
almacenadosenlaEEMPROMestnpermanentementeguardadosinclusoalapagarlafuentedealimentacin,ypuedensercambiados
encualquiermomento.PorestascaractersticasexcepcionalescadabytedelaEEPROMseconsideravalioso.

3.11MEMORIAEEPROM
ElmicrocontroladorPIC16F887disponede256localidadesdememoriaEEPROMcontroladosporlosbitsdelossiguientesregistros:

EECON1(registrodecontrol)
EECON2(registrodecontrol)
EEDAT(almacenalosdatoslistosparaescrituraylectura)y
EEADR(almacenaladireccindelaEEPROMalaqueseaccede).
Adems,elregistroEECON2noesunregistroverdadero,noexistefsicamenteenelchip.Seutilizaslodurantelaescrituradelosdatos
enlamemoria.

LosregistrosEEDATHyEEADRHseutilizandurantelaescrituraylecturadelaEEPROM.Losdosseutilizantambindurantelaescritura
ylecturadelamemoriadeprograma(FLASH).

Porconsiderarestounazonaderiesgo(porsupuestoustednoquierequeelmicrocontroladorborresupropioprogramaporcasualidad),
novamosadiscutirloaqu,noobstanteleavisamosquetengacuidado.

RegistroEECON1

EEPGDProgram/DataEEPROMSelectbit(bitdeseleccindememorias)

1AccesoalamemoriaFlashdeprograma.
0AccesoalamemoriadedatosEEPROM.
WRERREEPROMErrorFlagbit(bitdeerrordeescritura)

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 72/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos
1Seproduceunerrordeescrituradeformaprematurayhaocurridounerror.
0Sehacompletadolaoperacindeescritura.
WRENEEPROMWriteEnablebit(bitdehabilitacindeescritura)

1EscrituradedatosenlaEEPROMhabilitada.
0EscrituradedatosenlaEEPROMdeshabilitada.
WRWriteControlbit(bitdecontroldeescritura)

1SehainiciadounaoperacindeescrituradedatosenlaEEPROM.
0SehacompletadounaoperacindeescrituradedatosenlaEEPROM.
RDReadControlbit(bitdecontroldelectura)

1IniciaunalecturadelamemoriaEEPROM.
0LecturadelamemoriaEEPROMdeshabilitada.

LECTURADELAMEMORIAEEPROM

ParaleerlosdatosdelamemoriaEEMPROM,sigalossiguientespasos:

Paso1:Escribirladireccin(00hFFh)enelregistroEEADR.
Paso2:SeleccionarelbloquedememoriaEEPROMalponeraceroelbitEEPGDdelregistroEECON1.
Paso3:PoneraunoelbitRDdelmismoregistroparaleerelcontenidodelalocalidad.
Paso4:EldatosealmacenaenelregistroEEDATyestlistoparasuuso.
Elsiguienteejemplomuestraelprocedimientoanteriormentedescritoalescribirunprogramaenlenguajeensamblador:

BSFSTATUS,RP1
BCFSTATUS,RP0Accederalbanco2
MOVFADDRESS,WMoverladireccinalregistroW
MOVWFEEADREscribirladireccin
BSFSTATUS,RP0Accederalbanco3
BCFEECON1,EEPGDSeleccionarlaEEPROM
BSFEECON1,RDLeerlosdatos
BCFSTATUS,RP0Accederalbanco2
MOVFEEDATA,WDatosealmacenaenelregistroW

LamismasecuenciadeprogramaescritaenCseparecealosiguiente:

W=EEPROM_Read(ADDRESS)

LasventajasdelusodellenguajeCsehanhechomsobvias,nolocree?

ESCRITURAENLAMEMORIAEEPROM

AntesdeescribirlosdatosenlamemoriaEEPROMesnecesarioescribirladireccinenelregistroEESADRylosdatosenelregistro
EESAT.Slohaquedadoseguiraunasecuenciaespecialparainiciarlaescrituraparacadabyte.Duranteelprocesodeescrituralas
interrupcionesdebenestardeshabilitadas.

Elejemploquesiguemuestraelprocedimientoanteriormentedescritoalescribirunprogramaenlenguajeensamblador:

BSFSTATUS,RP1
BSFSTATUS,RP0
BTFSCEECON,WR1Esperaraquesecompletelaescrituraanterior
GOTO$1
BCFSTATUS,RP0Banco2
MOVFADDRESS,WMoverladireccinaW
MOVWFEEADREscribirladireccin
MOVFDATA,WMoverlosdatosaW

MOVWFEEDATAEscribirlosdatos
BSFSTATUS,RP0Banco3
BCFEECON1,EEPGDSeleccionarlaEEPROM
BSFEECON1,WRENEscrituraalaEEPROMhabilitada
BCFINCON,GIETodaslasinterrupcionesdeshabilitadas

MOVLW55h
MOVWFEECON2
MOVLWAAh
MOVWFEECON2
BSFEECON1,WR

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 73/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos
BSFINTCON,GIEInterrupcioneshabilitadas
BCFEECON1,WRENEscrituraalaEEPROMdeshabilitada

LamismasecuenciadeprogramaescritaenCseparecealosiguiente:

W=EEPROM_Write(ADDRESS,W)

Nohacefaltacomentarnada.

VamosahacerloenmikroC...

//ElejemplomuestracmoutilizarlalibreraEEPROMenelcompiladormikroCPROforPIC.

charii//Lavariableiiutilizadaenelbucle

voidmain(){
ANSEL=0//ConfiguracindelospinesANcomoE/Sdigitales
ANSELH=0
PORTB=0
PORTC=0
PORTD=0
TRISB=0
TRISC=0
TRISD=0
for(ii=0ii<32ii++)//Llenarelbferconlosdatos
EEPROM_Write(0x80+ii,ii)//Escribirlosdatosenladireccin0x80+ii

EEPROM_Write(0x02,0xAA)//Escribirundatoenladireccin2delaEEMPROM
EEPROM_Write(0x50,0x55)//Escribirundatoenladireccin0x50

//delaEEMPROM
Delay_ms(1000)//DiodosenlospuertosPORTByPORTC
PORTB=0xFF//paraindicarelcomienzodelalectura
PORTC=0xFF
Delay_ms(1000)
PORTB=0x00
PORTC=0x00
Delay_ms(1000)
PORTB=EEPROM_Read(0x02)//Leerlosdatosdeladireccin2delaEEPROMy

//visualizarlaenelpuertoPORB
PORTC=EEPROM_Read(0x50)//Leerlosdatosdeladireccin0x50delaEEPROMy

//visualizarlaenelpuertoPORC
Delay_ms(1000)

for(ii=0ii<32ii++){//Leerelbloquede32bytesdeladireccin
PORTD=EEPROM_Read(0x80+ii)//0x80yvisualizarlaenelpuertoPORTD

Delay_ms(250)
}
}

Aprimeravista,bastaconencenderunafuentedealimentacinparahacerfuncionarunmicrocontrolador.Aprimeravista,bastacon
apagarunafuentedealimentacinparadetenerlo.Sloaprimeravista.Enrealidad,elarranqueyelfinaldelfuncionamientosonlasfases
crticasdelasqueseencargaunasealespecialdenominadaRESET.

3.12REINICIO!BLACKOUT,BROWNOUTORUIDOS?

Alproducirseunreinicioelmicrocontroladordetienesufuncionamientoinmediatamenteyborrasusregistros.Unasealdereiniciose
puedegenerarexternamenteencualquiermomento(nivellgicobajoenelpinMCLR).Sisenecesita,unasealtambinpuedeser
generadaporlalgicadecontrolinterna.Alencenderunafuentedealimentacinsiempreseproduceunreinicio.Pormuchoseventosde
transicinqueocurrenalencenderunafuentedealimentacin(centelleosyfogonazosdecontactoselctricoseninterruptores,subidade
voltajelenta,estabilizacindelafrecuenciadesealderelojgraduadaetc.)esnecesarioproporcionarunciertotiempomuertoantesde
queelmicrocontroladorsepongaafuncionar.DostemporizadoresinternosPWRTyOSTseencargandeeso.ElPWRTpuedeestar
habilitado/deshabilitadoduranteelprocesodeescribirunprograma.Vamosavercmofuncionatodo.

Cuandoelvoltajedelafuentedealimentacinalcanzaentre1.2y1.7V,uncircuitodenominadotemporizadordearranque(Powerup
timer)mantienealmicrocontroladorreiniciadoduranteunos72mS.Tanprontocomotranscurraeltiempo,otrotemporizadordenominado

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 74/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos
temporizadordeencendidodeloscilador(Oscillatorstartuptimer)generaotrasealdereinicioduranteladuracinde1024perodosdel
osciladordecuarzo.Alexpirareltiempomuerto(marcadoconResetTenlaFigura)yalponeraaltoelpinMCLR,todaslascondicionesse
hancumplidoyelmicrocontroladorseponeaejecutarlaprimerainstruccinenelprograma.

Apartedeestereinicio"controlado"queocurrealencenderunafuentedealimentacin,haydostiposdereiniciodenominadosBlackouty
Brownoutquepuedenproducirseduranteelfuncionamientodelmicrocontroladorascomoalapagarunafuentedealimentacin.

REINICIOBLACKOUT

Elreinicioblackoutocurrealapagarunafuentedealimentacincorrectamente.Elmicrocontroladornotienetiempoparahacernada
imprevisiblepuestoqueelvoltajecaemuyrpidamentepordebajodesuvalormnimo.Enotraspalabras,seapagalaluz,lascortinas
bajanyelespectculohaterminado!

REINICIOBROWNOUT

Cuandoelvoltajedelafuentedealimentacincaelentamente(unejemplotpicoesdescargadebateras,aunqueelmicrocontrolador
experimentaraunascadasmuchomsrpidascomounprocesolento)loscomponentesinternosdetienensufuncionamiento
gradualmenteyocurreelasllamadoreinicioBrownout.Entalcaso,antesdequeelmicrocontroladordetengasufuncionamiento
completamente,hayunpeligrorealdequeloscircuitosquefuncionanafrecuenciasaltasseponganafuncionardeformaimprevisible.El
reiniciobrownoutpuedecausarcambiosfatalesenelprogramayaquesealmacenaenlamemoriaflashincorporadaenelchip.

RUIDOELCTRICO

EsuntipoespecialdelreinicioBrownoutqueocurreenunambienteindustrialcuandovoltajedealimentacinparpadeaporunmomento
ycaepordebajodelvalormnimo.Aunqueescorto,esteruidoproducidoenunalneadeconduccinelctricapuedeafectar
desfavorablementealfuncionamientodeldispositivo.

PINMCLR

Uncerolgico(0)alpinMCLRcausaunreinicioinmediatoyregular.Es
recomendableconectarlodelaformamostradaenlaFiguraaladerecha.Lafuncin
deloscomponentesadicionalesesdemantenerununolgico"puro"duranteel
funcionamientonormal.Sisusvaloresseseleccionandemaneraqueproporcionen
unnivellgicoaltoenelpindespusdequehayatranscurridoeltiempomuerto
resetT,elmicrocontroladorsepondrafuncionarinmediatamente.Estopuedeser
muytilcuandosenecesitasincronizarelfuncionamientodelmicrocontroladorcon
loscomponentesadicionalesoconelfuncionamientodevariosmicrocontroladores.

ParaevitarposibleserroresalproducirseelreinicioBrownout,elPIC16F887tieneunmecanismodeproteccinincorporado.Esun
circuitosimple,peroeficazquereaccionacadavezqueelvoltajedealimentacincaepordebajode4V(siseutilizaunvoltajede
alimentacinde5V)ymantieneesteniveldevoltajepormsde100microsegundos.Estecircuitogeneraunasealdespusdequetodo
elmicrocontroladorfuncionarcomosihubierasidoencendidoporprimeravez.

previouschapter|tableofcontents|nextchapter

MikroElektronika Embedded Solutions


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

Support Forum mikroBUS Letsmake Press Legal Archive AboutUs Customization

Copyright19982015.MikroElektronika.Allrightsreserved.Alltradeand/orservicesmarksmentionedarethepropertyoftheirrespectiveowners.

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 75/76
11/10/2015 MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCconejemplos

http://www.mikroe.com/chapters/view/81/capitulo3microcontroladorpic16f887/ 76/76

Вам также может понравиться