Академический Документы
Профессиональный Документы
Культура Документы
Login|Cart(0)
MicrocontroladorPIC16F887MicrocontroladoresPICProgramacinenCcon FeaturedDevelopmentTools
ejemplos EasyPICv7DevelopmentSystem
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).
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).
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.
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:
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.
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.
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:
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:
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).
PreescaladordelTMR2 16 4 1 1 1 1
Notasadicionales:
Elpindesalidasevaaponera1constantemente,siporerrorelanchodepulsogeneradoesmslargoqueel
perododePWM.
Enestaaplicacin,nosepuedeutilizarelpostescaladordeltemporizadorTimer2paragenerarperodosdePWM
largos.
RESOLUCINDEPWM
UnasealPWMnoesnadamsqueunasecuenciadepulsosquevaransuciclodetrabajo.Paraunafrecuenciaespecfica(nmerode
pulsosporsegundo),hayunnmerolimitadodecombinacionesdeciclosdetrabajo.Estenmerorepresentaunaresolucinmedidaen
bits.Porejemplo,siunaresolucinesde10bitsestarndisponibles1024ciclosdetrabajodiscretossiunaresolucinesde8bitsestarn
disponibles256ciclosdetrabajodisretosetc.EnestemicrocontroladorlaresolucinesdeterminadaporelregistroPR2.Elmximovalor
seobtienealusarelnmeroFFh.
FrecuenciasyresolucionesdePWM(Fosc=20MHz):
Preescaladeltemporizador 16 4 1 1 1 1
Resolucinmxima 10 10 10 8 7 6
FrecuenciasyresolucionesdePWM(Fosc=8MHz):
Preescaladeltemporizador 16 4 1 1 1 1
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.
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.
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.
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.
0 0 0
0 1 1
1 X Altaimpedancia(Triestado)
PSSBD1,PSSBD0PinsP1B,P1DShutdownStateControlbits(BitsdeconfiguracindelospinesP1ByP1Denmododeapagado)
defineelestadolgicodelospinesP1ByP1DcuandoelmduloCCPestenelestadodeapagado.
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:
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.
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.
0 0 Fosc/2
0 1 Fosc/8
1 0 Fosc/32
1 1 RC*
*SealderelojsegeneraporelosciladorinternoRCqueestintegradoenelconvertidor.
CHS3CHS0AnalogChannelSelectbits(bitsdeseleccindecanalanalgico)seleccionaunpinouncanalanalgicoparala
conversinA/D,oseaparamedirelvoltaje:
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)
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)
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.
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.
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
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