Documentos de Académico
Documentos de Profesional
Documentos de Cultura
IntroduccinalPIC16F84A
MiPrimerPrograma,controldeunLED
CreacindeDemoras,LEDtitilando
CreacindeTablas,Controldisplay7Segmentos
12
DireccionamientoIndirecto,Controldisplay7Segmentos
16
Controldevariosdisplays7Segmentospormultiplexado
18
Controldevariosdisplays7SegmentoscondecodificadoresBCD
22
Interrupciones,RegistrosyguardadotemporariodeSTATUSyW
23
InterrupcinTMR0,modoTemporizador
25
InterrupcinTMR0,modoContador
28
InterrupcinRB0,ControldeLED
31
InterrupcinRB4aRB7,ControlTecladoMatricial
33
ControldelLCD,PantalladeCristalLquido
36
ComunicacinRS232
41
Introduccin
45
Timer1+Ejemplo
51
Timer2+Ejemplo
54
Mdulodecomunicacinserie(Usart)+Ejemplo
56
Comparadoresanalgicos+Ejemplo
60
IntroduccinMduloCCP
65
ModoCaptura
69
ModoPWM
71
Registrodedesplazamiento74LS164N
76
ComohacerCarteldeLEDs732
79
Herramientas:
Softwareparaescribirnuestrocdigoycompilar:MPLAB
Softwareparasimular:Proteus
Unaplaquitaprogramadora.
SoftwareparagrabarnuestroPIC:WinPic800oelIcprog
ConfigPIC:SoftwareutilitarioparacrearautomticamenteelcdigodeconfiguracindeestosPICs,ademsdetenerotras
herramientasquenospermitecalculartemporizaciones,BaudRate,PWM,etc.
Protoboard
PIC16F84A
PIC16F628A
Cristalde4MHz
Resistencias,capacitores,leds,Display,LCD,tecladomatricial,etctera.
Hojasdedatos(datasheets):
DatasheetdelPIC16F84A
DatasheetdelPIC16F628A
IntroduccinalPIC16F84A
EnestaentregaveremosendetallelaestructurainternadelmicrocontroladorPIC16F84A.Setratadeunmodeloantiguo,peroquese
utilizaconfrecuenciacomoherramientadeaprendizajeporqueesmuchomssencilloquelosmodelosmsmodernos.Resultaideal
paraconocerlaspartesdeunmicrocontrolador,lafuncinquerealizanycmopodemoshacerquefuncionendelaformaquenos
resulteconvenienteparanuestrosproyectos.
Introduccin
ElPIC16F84AestfabricadoentecnologaCMOS,poseememoriaFLASH,yconsumobajodepotencia.Estcompuestobsicamentede
unamemoriaROM(1024palabrasdememoriadeprograma),unamemoriaRAM(deaccesoaleatorio,68bytes),lneasdeentraday
salida(2Puertos)yunalgicadecontrolquecoordinalainteraccindelosdemsbloques.
Estosmicrospertenecenalagamamediaydisponesdeunsetde35instrucciones,tipoRISC(ComputadorconSetdeInstrucciones
Reducido)pocasperomuypoderosas.
AlgunasfuncionesespecialesquedisponeestePIC:
Temporizadorprogramable(Timer).Sisequieremedirperiodosdetiempoentreeventos,generartemporizacionesosalidascon
frecuenciaespecfica,etc.
PerroGuardinoWatchdog.Consisteenuntemporizadorque,cuandosedesbordayapasapor0,provocaunresetautomtico,
utilizadoparasistemasquenotienencontroldeunsupervisor,yalbloquearseelmicroseresetea.Siseutilizaelcdigodebe
resetearloantesdequesedesborde.
MemoriaEEPROMde64bytes,paraguardardatosquenosealteranapesardequitarlaalimentacin.
Interrupciones,cuandounasealexterna,ounacondicininternaactivaunalneadeinterrupcin,dejandodeladolatareaque
estejecutando,atiendedichainterrupcinyluegocontinaconloqueestabahaciendo.
Proteccinantefallodealimentacin.SetratadeuncircuitoquereseteaalmicrocuandoelvoltajeVddesinferioralmnimo.
Estadodebajoconsumo(Sleep).Sielmicrodebeesperarmuchotiemposinhacernada,poseeunainstruccinespecial,Sleep,que
lopasaalestadodereposo.Alactivarseunainterrupcinsedespiertayreanudasutrabajo.(Resetexterno,desbordamientode
Watchdog,interrupcinporRB0,interrupcinporcambiodenivelenRB4aRB7,interrupcinporescrituracompletadaen
EEPROM)
Veamoseldiagramadepines,paravercmoestndistribuidossuspines.Estemicrocontroladorcuentacondospuertosconfigurables
comoestradasysalidas,yconstade18pinesloscualesseencuentranasignadosdelasiguientemanera:
ElpuertoAtienesolocincopinesyelpin3,osea,elpinRA4/TOCKIpuedeserconfiguradoasuvezcomoentrada/salidaocomo
temporizador/contador.Cuandoessalidasecomportacomocolectoabierto,porlotantodebemosponerunaresistenciaPullupaVdd
de1Kohm.Cuandoseconfiguracomoentrada,funcionacomodisparadorSchmittTriggerporloquepuedereconocersealesconun
pocodedistorsin.
ElpuertoBtiene8pinesquepuedenserconfiguradoscomoentrada/salida.RB0puedeprogramarseademscomoentradade
interrupcinexterna.LospinesRB4aRB7puedenprogramarsepararesponderainterrupcionesporcambiodeestadoylospinesRB6y
RB7secorrespondenconlneasdeentradaderelojyentradadedatoscuandoestaenmodoprogramacin.
MCLR/Vppeslaentradaderesetsiestanivelbajo,tambineshabilitadordetensindeprogramacin.CuandosutensinesVddelPIC
funcionanormalmente.
VssyVddsonlospinesdemasayalimentacin.Latensindealimentacinestcomprendidaentrelos2y5.5Volt.
OSC1/CLKINyOSC2/CLKOUT,pinesdeentradaexternaderelojysalidadeosciladoracristalrespectivamente.
Capacidaddecorrientedelospuertos:
Lamximacapacidaddecorrientedecadaunodelospinesdelospuertosenmodosumideroesde25mAymodofuentede20mA.La
mximacapacidaddecorrientetotaldelospuestoses,
PuertoA:Modosumidero80mA;Modofuente50mA.
PuertoB:Modosumidero150mA;Modofuente100mA.
ElOsciladorexterno:
Esuncircuitoexternoqueleindicaalmicrocontroladorlavelocidadalaquedebetrabajar.Puedeutilizarcuatrotiposdistintos:
RC,Osciladorconresistenciaycondensador(Pocopreciso)
XT,Cristaldecuarzo.
HS,Cristaldealtavelocidad
LP,Cristaldebajafrecuenciaybajoconsumodepotencia.
Almomentodeprogramarunmicrosedebeespecificarqutipodeosciladorseusa.
Internamentelafrecuenciadelosciladoresdivididapor4,asquesitemeosunosciladorde4MHz,lafrecuenciadetrabajoesde1MHz,
porloquecadainstruccinseejecutacada1us.
AquutilizaremosuncristalXTde4MHzquedebeiracompaadodedoscondensadores:
Reset:
ElPIC16F84Aposeeuntemporizadorinternoconectadoalpindereset,quefuncionacuandosedaalimentacinalmicrocontrolador.
Estohacequealencenderelsistemaelmicrocontroladorquedeenresetporuntiempomientrasseestabilizantodaslassealesdel
circuito.Paratenercontrolsobreelresetseutilizaelsiguientecircuito:
EstructurainternadelMicrocontrolador
ArquitecturadelPIC,existendosarquitecturas,laclsicadeVonNeumannylaarquitecturaHarvard,estaltimaeslaqueusanlosPICs.
Disponededosmemoriasindependientes,unaquecontienesoloinstruccionesylaotrasolocontienedatos.Ambasdisponendesus
respectivosbusesdeaccesoyesposiblerealizaroperacionesdeaccesosimultneamenteenambas.
Memoriadelprograma:Aqualmacenamosnuestroprogramaocdigoquedebeejecutar,enelPIC16F84AesFLASH,esrpida,debajo
consumoyaltacapacidaddealmacenamiento.Sedivideen2048posiciones,peroestePICsolotieneimplementadas1024posiciones,de
000hasta0x3FF.
Cuandoocurreunreset,elcontadordeprograma(PC)apuntaaladireccin000,yelmicroinicianuevamente.Aqusedebeescribir
todolorelacionadoconlainiciacindelmismo,porejemploconfiguracindepuertos,etc.
SiocurreunainterrupcinPCapuntaaladireccin004,yaqudebemosescribirelcdigonecesarioparaatenderadichainterrupcin.
MemoriaRAMesttica:Dondeseencuentranlos24registrosespecficos(SFR)y68registrosdepropsitogeneral(GPR).Sehalla
divididaen2Bancosde128bytescadauno.
AlgoquesedebetenerencuentaeslapilaoStack,queconstade8posiciones,cadaposicincontieneladireccinydatosdela
instruccinqueseestejecutando,ascuandoseejecutaunallamadacallounainterrupcin,elPCsabednderegresar.
MiPrimerPrograma,controldeunLED
Enestaentregaescribiremosunprogramaquees,enelmundodelosPICs,elequivalentealclsicoHelloWorldqueseutilizacomo
primerprogramaduranteelaprendizajedecualquierlenguajedeprogramacin.Dadoquetodavanosabemoscmoutilizaruna
pantallaLCDparaescribirunmensaje,nuestroHelloWorldserencenderyapagarunLEDconectadoaunpindelmicrocontrolador.A
pesardesuaparentesencillez,esteejemplonospermitirconocerlosprimeroselementosdelaprogramacindeestaplataforma.
Acontinuacinvamosadesarrollarnuestroprimerprograma.Consideramosdemuchautilidadrepasaratentamenteelcursodelenguaje
assembler(MPLAB)queelusuarioLeonPichadesarrolladoenelforouControl.
EsteprogramaactivarunledconectadoaRB0siemprequeelinterruptorconectadoaRA0estcerrado.Paraellovamosanecesitarel
siguientecircuito:
EnRA0tenemosconectadounpulsadordeformaquecuandolopulsemosseintroduzcauncerolgicoenelpinycuandonolopulsemos
seintroduzcaununolgico.TenemosunLedconsucorrespondienteresistencialimitadoradecorrienteenelpinRB0.
DiagramadeFlujo:
Primeroquenadadebemosespecificarconquemicrocontroladorestamostrabajando,estolorealizamoseslasdosprimeraslneas:
EnelarchivoP16F84A.incseencuentranlasdefinicionesdelasdireccionesdelosregistrosespecficos,losbitsutilizadosencadaregistro
ylosfusiblesdelmicro.
Configuracindefusibles:HayciertosaspectosdelPICquehandeseractivadosodesactivadosmediantehardwarealahorade
programarlo.Estoquieredecirquenosepuedenvolveracambiarhastaqueelchipnosereprogramedenuevo.ElPIC16F84Adisponede
4fusesofusibles(losmodelossuperiorestienenms).Cadafuseactivaodesactivaunaopcindefuncionamiento:
1.
OSC:EstefusecontrolaelmododeoscilacinqueusarelPICparafuncionar.Comoyasabemos,elosciladorsepuede
configurarde4manerasdistintas,dependiendodelavelocidadydeltipodecircuitoosciladorempleado.
2.
WDT:ElfamosoperroguardindelPICseconfiguraaqu.Estaesunacapacidaddelmicrocontroladordeautorresetearse.
3.
PWRT:Siactivamosestefuse,loqueconseguimosesquesegenereunretardoenlainicializacindelmicrocontrolador.
4.
CP:ActivandoestefusetendremoslagarantadequeelcdigoqueescribamosenelPICnopuedaserledoporotrapersona,
paraquenonoslocopien,modifiquen,etc.(CodeProtection).EstonoimpidequeelPICfuncionecomosiempre,niquenose
puedasobrescribirsucontenido
Definicindevariablesqueutilizaremosennuestroproyecto:Enestecasosolodefiniremosbits,porejemploLedyPulsador.
Paraorganizarnuestroprogramaloestructuraremosdelasiguientemanera:
NivelDirectivaOperandos;Comentarios
Configuracindepuertos:Paralaconfiguracinnecesitamoslossiguientesregistros:
STATUS>003
PORTA>005
PORTB>006
TRISA>086
TRISB>086
Pordefectolospuertosquedanconfiguradoscomoentradasdedatosysisequierecambiarhayqueconfigurarlos.Estoserealizaconlos
registrosTRISAyTRISB,teniendoencuentaquesiseasignauncero(0)aunpin,quedaracomosalidaysiseasignaununo(1),quedara
comoentrada.
EnnuestrocasosenecesitacolocarTRISAiguala11111(osepuededejarpordefault)yTRISB11111110.Ahorabien,cuandoelPIC
arrancaseencuentraenelBanco0,TRISAyTRISBseencuentranenelBanco1,entoncesdebemoscambiardeBanco.Estoserealizacon
elbitRP0delregistroSTATUS.SiesteseponeunceroaRP0,estaremosenelBanco0.Sisecolocaununo,estaremosenelBanco1.
RegistrodetrabajoW:eselregistromsimportantequetieneelmicrocontroladoryesdenominadoACUMULADOR.Esteregistro
almacenatemporalmenteunodelosdatosqueintervienenenlaoperacindelaUnidadlgicayAritmtica(ALU).ALUcomoindicasu
nombre,realizalasoperacionesaritmticasylgicasprevistasenlacoleccindeinstruccionesdelmicrocontrolador.
YaconfiguradonuestroPIC,vamosarealizarlarutinaqueejecutar:
Aqusolamenteenunbucleinfinitotesteamoscontinuamenteelestadodelpulsador,ysegnsuestadoseencenderoapagarelLed.
Programacompleto:
Buenoaquyatenemosnuestroprogramitaterminado,solofaltacompilarloysimularloparadetectarerrores,estoestamnimamente
explicadoeneltutorialdelUtilitarioMPLABadjuntadoalprincipio.
CreacindeDemoras,LEDtitilando
UnodelostemasmsimportantesalahoradeprogramarunaaplicacinenunPICeslacorrectaimplementacindelasrutinasde
demoras.Apesardequeaprimeravistapuedeparecerquenuestrocdigodeberaserlomsrpidoposibleycarecerporcompletode
demoras,lociertoesquecontinuamentenecesitamosdeestasrutinas,yaseaparaesperarqueunperifricoestlistooquehaya
trascurridoeltiemponecesarioparaqueundatohayasidotransmitidoorecibido.Enestaentregaaprenderemosaprogramardemoras
conunagranprecisin.
DenominamosCiclodemaquinaalaunidadbsicadetiempoqueutilizaelmicrocontrolador,yequivalea4ciclosdereloj.sea,si
tenemosunosciladorde4MHz,elcicloderelojseriade250nsyelciclomquinade1us.
Lasinstruccionesdelmicrocontroladornecesitan1ciclomquina,exceptoalgunasexcepcionescomosonloscomandosqueincluyen
saltos(goto,call,btfss,btfsc,return,etc)quenecesitandosciclosmquina.
Demorasmediantelazosimple:
Entreparntesissemuestraelnmerodeciclosquedemoracadainstruccin.
DemaneraqueelnmerodeciclosdeinstruccinTsubconsumidosporlarutina,incluyendolos2ciclosdelallamada(CALL)sern
Tsub=[2+1+1+(0xXX1)*(1+2)+2+2]ciclos=(3*0xXX+5)*Tcy
DondeTcyesladuracinensegundosdeunciclodeinstruccin.Utilizandounosciladorde4MHzlamayorduracinposibleesde770
us,con0xXX=0xFF.
DemorasmedianteLazosanidados:Paralogrardemorasdemayorduracindebenutilizarselazosanidados,poniendounlazode
demoradentrodeotro.
Laduracindeestarutinaenciclosderelojser
Tsub=2+1+1+(0xXX)*[1+1+(0xYY1)*(1+2)+2+1+2]+[1+1+(0xYY1)*(1+2)+2+2+2]ciclos
Locualsepuedesimplificarcomosigue
Tsub=[0xXX*((0xYY1)*3+7)+5]Tcy
Enestecasoeltiempomximodedemoraquesepuedeconseguiresdeaproximadamente196milisegundos.
Buenoahoraqueseentiendecomoserealizanlasdemoras,lesadjuntounprogramitaqueobtieneelcdigonecesarioparaunapausa,
ingresandoelvalordelamismaylafrecuenciadelosciladorutilizado.
Ejemplo:Veamoscomocalculardemoras.SehartitilarunledconectadoaRB0siemprequeelinterruptorconectadoaRA0est
cerrado.
10
DiagramadeFlujo:
Programa:
11
CreacindeTablas,Controldisplay7Segmentos
Unodeloscomponentesmsutilizadosparamostrarinformacinenlosproyectoscontroladosporunmicrocontroladorsonlosdisplays
de7segmentos.Constande7(uocho)diodosLEDconectadosenformade8,avecesconunpuntodecimal,ysoncapacesde
representardgitosdel0al9.Enestaentregaveremoscmoutilizarlosennuestrosproyectos,alavezqueevitamoslosrebotesdeun
pulsador.Comosiempre,unaentregamuyimportantedeestetutorial.
CreacindeTablas:ControldeunDisplayde7Segmentos.
UndisplayesunacoleccindeLEDsubicadosdeformaestratgica.SiselosagrupauniendosusctodosserdeCTODOCOMN,o
bienagrupandosusnodos,undisplaydeNODOCOMN.
PorotroladoestosLEDspuedenserfabricadosenformadepuntososegmentos,talesasqueseencuentrandisplayde7segmentos,
comolosdelaimagen:
Elprogramaquerealizaremosleerlacantidaddevecesqueseactivaunpulsadorymostraremoselresultado.Conectaremoseldisplay
enformadirecta,esdecirconectandoelpuertoBdelmicroalospinesdeldisplay,yluegoencendercadaunodelossegmentosdelpara
visualizarelvalorcorrespondiente.Paraellocrearemosunatablaquecontengalosdistintoscdigosparaelnumeroquenecesitemos
visualizar.
12
Esobvioqueconunsolodisplaysolamentepodremoscontarde0a9.
DiagramadeFlujo:
13
Antesdecontinuartrataredeexplicaralgunosregistrosimportantes:
ElPC(ProgramCounteroContadordePrograma).Direccionamientodelprograma:Especificaladireccindelainstruccinquese
ejecutar.Constade13bits,conloqueesposibledireccionarhasta8Kpalabras,peroenel16F84Asoloseimplementa1k.
Lapartealtadelcontadordeprograma(PCH)nosepuedeaccederdirectamente,elladebecargarsedesdelos5bitsmsbajosdel
registrollamadoPCLATCH(direccin008).
Enlacreacindetablas,laposicinaleerdelamismaserealizaconelcontroldelregistroPCL.Esteregistroesde8bits,porloque
direccionasolo256posiciones,porellosedebetenerencuenta:
Laposicindelatablaenlamemoriadeprograma.
Eltamaodelatabla,sinuestratablatienemsde255posiciones,siosidebemosmanejarlosbitsmssignificativosdePC
[PCLATCH]).
Paradevolverelvalordireccionadoseutilizaretlw,estainstruccindevuelveunvalorenelacumuladoralretornardeunasubrutina.La
creacindelatablasehardelasiguienteforma:
DondeValor0,Valor1,Valor2etc.sonlosvaloresquequeremosalmacenarenlatabla.
Laestrategiaaseguirparaconsultaralgnvalordelatablaescargarenelacumulador(W)ladireccindelatabladondeseencuentrael
valorquequieresleerydespusllamaralasubrutinaTABLA(conunCALL).
Advertencia:lacargadeWnopuedesuperarelnmerodevaloresdelatabla,sinoseestarejecutandounainstruccinerrnea
provocandounmalfuncionamientodelprograma.
14
Explicadolonecesariopasamosalcdigodelejemplo:
15
UnamaneramscmodadeescribirlatabladeinstruccionesRETLWpuedelograrseusandoladirectivaDT(DefineTable)del
ensamblador,lacualnospermitedefinirunatabladedatosquesersustituidaporunalistadeinstruccionesRETLW;as,latablaanterior
puedequedarcomosigue:
Controlantirebote:
Enelmomentodepresionarunbotnpulsadorocualquierconmutadorelectromecnicoesinevitablequeseproduzcaunpequeoarco
elctricoduranteelbreveinstanteenquelasplacasdelcontactoseaproximanosealejandesuspuntosdeconexin.
Laduracindeestedependedelacalidaddelosswitchesylavelocidaddeaccionamiento,peronoduramsde20milisegundos.
Seadjunta
DireccionamientoIndirecto,Controldisplay7Segmentos
Enlaentregaanterioraprendimosautilizartablasparaguardardatos,yaplicamoseseconocimientoparaelaborarunprogramacapaz
demostrardgitosenundisplayde7segmentos.Enlapresenteentradaveremosotrasformasdeimplementarunatabla,
concretamentelaqueseconocecomodireccionamientoindirecto,medianteelusodelosregistrosFSRyINDF.Estonosbrindaruna
nuevamaneradeaccederatablasoarreglosdedatos.
Otraformadecrearunatabla:DireccionamientoIndirecto.
EnlaprogramacindelosmicrocontroladoresPIClamayoradelasinstruccionesempleandireccionamientodirecto,perotambines
posiblequeoperenenunmododedireccionamientoindirecto.Paraeldireccionamientoindirectoseempleandosregistrosespeciales:
elFSRyelINDF(esteltimonoesunregistrofsico).ElregistroFSRseempleaparasealaroapuntaraunadireccindelamemoria
RAMcuyocontenidopuedeserledooescritodeformaindirectaempleandocualquierinstruccinqueusecomooperandoalregistro
INDF.
Estaformadedireccionamientoesparticularmentetilcuandosemanejantablasoarreglosdedatos.
DirectovsIndirecto:
16
UtilizaremoseldireccionamientoIndirectoparacrearlatabladecontroldeldisplay.Aqunoutilizaremoselpulsador,soloseharel
contadorautomticode0a9.Aliniciarelmicrocontroladorcargaremoselcdigode7SegmentosparacontrolarelDisplayenla
memoriadeDatoscondireccionamientoindirecto.Luego,alrealizarelconteoleeremoselcdigocorrespondientealmacenadoylo
enviaremosalPORTB.
AquutilizamoselregistroSTATUSnuevamente,peroparacontroldelasoperacionesaritmticas.Nosotrosguardaremoselcdigode7
Segmentosdel0al9,enlosregistros010a019.Sinuestrocontadornosdireccionaelregistroubicadoen0x1A,queserael10,lo
reseteamosydireccionamosel0,searegistro010.Estolohacemosrealizandolarestadelregistroseleccionadoy0x1A,FSR0x1A,
ysielresultadoescero,reseteamos.
ElbitZ(Zero)delregistroSTATUS,esteindicasiunaoperacinlgicaoaritmticarealizadadacomoresultadocero.Tambintenemosel
bitC(Carry)(0),queeninstruccionesaritmticasseactivacuandosepresentaunacarreodesdeelbitmassignificativodelresultado,el
bitDC(DigitCarry),queenoperacionesaritmticasseactivasiocurreacarreoentreelbit3ybit4.
Cdigocompleto:
17
Controldevariosdisplays7Segmentospormultiplexado
Hemosvistocmoaccederadatosguardadosentablas,yaseademododirectocomodemodoindirecto.Enesasentregasutilizamos
estemecanismopararepresentardgitossobreundisplayde7segmentos.Peroengeneralestosdisplaysseutilizanengrupos,aveces
muynumerosos.Cuandoestoocurreseimplementaloquesedenominamultiplexado,queeslatcnicaqueaprenderemosautilizar
enlapresenteentregadeestetutorial.
Paraelcontroldevariosdisplaylaideaesmultiplexarlasealenviadaporelmicrocontrolador,conladministraremoselencendidode
cadadisplayysussegmentos(locualsehaceporprograma).Paraejemplificarharemosuncontadorautomticode0a999.Elhardware
necesarioeselsiguiente:
18
DiagramasdeFlujo:
19
SeobservaqueelPuertoBseutilizaparaenviarlosdatosamostrarencadadisplay,mientrasqueporelPuertoAseleccionaseldisplay
quemostraresedato.Supongamosquequieromostrar231,puesmuyfcil,pongoelpuertoBen0000110(cdigoparael1),yactivo
ahorael3transistorporunperiododetiempocorto,desactivamosestetransistor,cargamoselpuertoBcon1001111yactivamosel2
transistorporuninstante,ylomismohacemosparamostrar1.Repetimosestamismasecuenciamientrassequieramostrarestevalor.
Lasecuenciaestanrpidaqueelobservadornonotaelmomentoenquecambiasdedisplay.
Controldeconteo:
PararealizarelconteoincrementamoscontinuamenteUnidad,cuandoestllegaa10,lasreseteamosa0,eincrementamosen1Decena.
LamismaoperacinserealizaconDecena,alllegara10sellevaa0yseincrementaCentena.
20
21
Enesteejemplosemantienelavisualizacindelmismovalorduranteaprox.300ms,sepuededeterminaryaqueutilizamos3demoras
de5msdespreciandolosciclosutilizadosenloscomandos,quesonaprox.30(30us).Entoncesporciclotenemos15ms,ypor20
repeticiones,300ms.
Controldevariosdisplays7SegmentoscondecodificadoresBCD
Siemprehaymsdeunaformaderealizarunatarea,ylaprogramacindePICsnoesunaexcepcinaestaregla.Hemosvistocomo
controlarvariosdisplaysde7segmentosmedianteelmultiplexadodelassealesquegeneraelPIC,peroesanoeslanicaformade
hacerlo.Hoyveremoscmoutilizarlospopularescircuitos74LS47,74LS249oelCD4511,quesonloquesedenominandecodificadores
BCD.
DecodificadorBCD:
LaotraposibilidadesutilizarundecodificadorBCDcomoel74LS47oel74LS249,oelCD4511.Estosintegradosdisponende4entradas
correspondientesauncdigobinarioBCD,y7salidasqueseconectanaundirectamenteaundisplay.
Loimportantedeesteintegrado,esqueposee4pinesdeentraday7desalida,msunoscuantosdeconfiguracin.Elhechoesquelos4
pinesdeentrada(A,B,CyD)sernlosquerecibanelcdigoenbinarioenviadoporelmicro.Unavezrecibidoeldato,elintegradose
harcargodedecodificarloyenviarloporlospinesdesalida(a,b,c,d,e,fyg)paramostrarloeneldisplay.Loquenecesitamossaber
esquedatodeberenviaraldecodificador.Yesolopodemoshacerimplementandounatablacomolasiguiente:
DCBAValorquemuestraelDisplay
00000
00011
00102
00113
01004
01015
01106
01117
10008
10019
Unavezquehemosconstruidolatabla,podemosimplementarelprogramacomohemoshechoantes,utilizandoelmodode
direccionamientodirectooeldireccionamientoindirecto.
22
Interrupciones,RegistrosyguardadotemporariodeSTATUSyW
Unadelascaractersticasmsinteresantesdelosmicrocontroladoreseselmanejodeinterrupciones.Enpocaspalabras,esun
mecanismoqueinterrumpe(deahsunombre)laejecucinnormaldeunprogramacuandoocurreuneventodeterminado.Sepueden
provocarinterrupcionesportiempo,porlamodificacindelestadodeunpin,etctera.Elconocimientodelastcnicasnecesariaspara
programarinterrupcionesesfundamentalparaaprovecharafondounmicrocontrolador.
INTERRUPCIONES
Unadelascaractersticasmsimportantedelosmicrocontroladoresyquemencionamosaliniciodeltutorial,esquetienenla
posibilidaddemanejarinterrupciones.Setratadeunacontecimientoquehacequeelmicrodejedeladoloqueseencuentra
realizando,atiendaesesucesoyluegoregreseycontineconlosuyo.
Haydostiposdeinterrupcionesposibles,unaesmedianteunaaccinexterna(esdecirporlaactivacindeunodesuspines),laotraes
interna(porejemplocuandoocurreeldesbordamientodeunodesusregistros)
EnelPIC16F84Ahay4fuentesdeinterrupcin:
PorelpinRB0/INT,queregresaalPICdelmodoSLEEP(interrupcinexterna).
PorlospinesRB4aRB7,configuradoscomoentradayencasodequealgunodeelloscambiedeestado(interrupcinexterna).
PordesbordamientodelregistroTMR0,cuandoesteregistropasade255a0endecimal(interrupcininterna).
AlcompletarlaescrituradelaEEPROMdedatos(interrupcininterna).
Cadafuentedeinterrupcinestcontroladapor2bits.Unbitlocaldeinterrupciones(TerminadoenE)depermisooprohibicinde
ejecucin.Siesten0bloquearlasolicituddeinterrupcin,ysiestaen1permitirlaejecucin.Unbitqueactacomosealizador
(TerminadoenF)elcualesactivado(puestoa1)sisehaproducidolainterrupcin.Ademsexiste1bitdecontrolglobal,elbitGIE
(INTCON<7>)elcualsiestadesactivadobloqueatodaslassolicitudesdeinterrupcin.
Loanteriordescritopuedeentenderseobservandoeldiagramalgicodelasiguientefigura:
ElbitGIEseborraautomticamentecuandosereconoceunainterrupcinparaevitarqueseproduzcaotramientrasseestatendiendo
alaprimerayalretornardelainterrupcinconlainstruccinRETFIE,elbitGIEsevuelveaactivarponindosea1.Encambiolosbits
sealizadoresobanderasdeinterrupcindebenserpuestosaceroporeltratamientodelainterrupcinrealizadaporelusuario(el
programador)
Cuandounainterrupcinesthabilitada(subitlocaldehabilitacinestactivado,elbitGIEestactivado)yocurreeleventoquela
23
activa,elvalordePCseguardaenlaPILAyenstesecargael004(nicovectordeinterrupcin).Esapartirdeestadireccinquese
debecolocareltratamientodelainterrupcin,detectandopormediodelosbitsbanderasculdeloseventoshaocurridoyactuarsegn
seaelcaso.
Nota:ElnicoregistroquesesalvaenlaPILAesPC,parapreservaralgnotroregistrodebeserelpropioprogramadeatencinala
interrupcinelqueseencarguedesalvarsuestadoaliniciodelarutinaydedevolverlosalfinaldelmismo.
Resumiendo,lasaccionesqueserealizanautomticamenteelmicrocontroladorylasqueelprogramadordebetenerencuentaensus
programassonlassiguientes:
Cuandoseactivaunaposiblecausadeinterrupcin,elflagcorrespondienteseactiva.Sielbitdepermisocorrespondienteesta1y
elbitdehabilitacindetodaslasinterrupciones(GIE)esta1,seproducelainterrupcin.
Paraevitarqueseproduzcaotrainterrupcinmientrasseestatendiendoaotraanterior,elbitGIEseponea0.
ElvalordelPCseguardaenlaPILA
ElPCsecargaconelvalor004,queeselvectordeinterrupciones
Elprogramador,debecomenzarlarutinadeatencinalainterrupcinconunsaltoalaposicindememoriadondeseencuentrael
programa,seguidamenteseguardantodoslosregistrosquepuedansermodificadosporesta,seguidamentesiestnhabilitadas
variasvasdeinterrupcin,sedebeexplorarelvalordelasbanderasparadeterminarlacausadelainterrupcin.
Dependiendodelacausadelainterrupcin,larutinadeinterrupcinsebifurcaalasubrutinacorrespondiente.
Sedebendevolverlosvaloresquetenanlosregistrosantesdeproducirselainterrupcinysedebenborrarporsoftwarelas
banderasqueindicanlasfuentesdelasinterrupciones,antesdelretornoalprogramaprincipal.
Cuandosellegaalaltimainstruccindelarutinadeinterrupcin,RETURN,secargaelPCconelvalorqueseguardinicialmente
enlaPILAyelbitGIEseponeautomticamentea1.
Bitsutilizados:
INTFparaRB0/INT,bit1deINTCON,sies1ocurriinterrupcinexterna
RBIFparalospinesB4aRB7,bit0deINTCON,sies1porlomenosunpincambiodeestado
T0IFparaTMR0,bit2deINTCON,sies1TMR0desbordado
EEIFparalaEEPROM,bit4deEECON1,sies1sehacompletadoescritura
GIE,bit7deINTCON,sies1habilitatodaslasinterrupciones
EEIE,bit6deINTCON,sies1seactivainterrupcionesdeperifricos
T0IE,bit5deINTCON,sies1int.TMR0activada
INTE,bit4deINTCON,sies1int.Externaactivada
RBIE,bit3,sies1int.PorRB4aRB7activada
Todosestosbitsalresetearseoiniciarseelmicroseencuentranen0.
RutinadeServiciodeInterrupciones:
PrimerodebesguardarelcontenidodelregistroW,elproblemademoverWaotroregistro(haciendousodemovf)esqueesta
instruccincorrompelabanderaZ,modificandoelregistrodeSTATUS.SegnlahojadedatosotorgadaporMicrochip,enunodesus
apartadosrecomiendaunasecuenciadecdigoquepermiteguardaryrestaurarlosregistrossinmodificarlos.
24
LosregistrosW_TempySTATUS_Tempsonregistrosalternativosparaguardartemporariamentesusvalorescorrespondientes.
InterrupcinTMR0,modoTemporizador
Enestaoportunidadveremoscmotratarlasinterrupcionesquesedisparanmedianteelcontador/temporizadorde8bitsTMR0.Se
tratadeunregistroqueseincrementacontinuamente,aunritmoqueleimponeunpreescaleryelrelojinternodelmicrocontrolador.
Puedefuncionarenmodotemporizador,yseguramenteencontrarsdecenasdeaplicacionesparatodoloqueaprendasenestaentrega.
INTERRUPCIONPORTMR0
ElTimer0esuncontador/temporizadorde8bits.ElregistroprincipaldeestemduloesTMR0(001).Esteregistroseincrementa
continuamenteaunafrecuenciaseleccionablemanejadaporunpreescaladoryelrelojinternoFosc/4(modotemporizador)obien,por
unpreescaladoryunasealexterna(modocontador).
Enlasiguientefigurasemuestraundiagramadebloquesdeestemdulo,endondeseindicanlosbitsqueafectansuoperacinyla
maneraenquelohacen.
25
ElmodoTemporizador
EnelmodotemporizadorlasealderelojquecontrolaelincrementodelregistroTMR0eslafrecuenciaFcy=Fosc/4,lacualpuedeser
divididaopcionalmenteporelpreescalador.EstemodoesseleccionadoallimpiarelbitT0CS(OPTION_REG<5>).Enestemodosise
realizaunaescrituraalregistroTMR0,suincrementoesinhibidoporlossiguientesdosciclosdeinstruccin(Tcy)ysielpreescaladorest
asignadosepierdelacuentaperonosuasignacin.
ElmodoContador
Enelmodocontador,lasealquecontrolalosincrementosdelregistroTMR0esunasealexternaqueprovienedelapatitaT0CKI
poniendoelbitT0CSenalto.SepuedeseleccionarlatransicinqueprovocalosincrementosmedianteelbitTimer0SourceEdgeSelect
T0SE(OPTION_REG<4>),limpiandoestebitseseleccionalatransicindesubida,mientrasquealponerloenaltoseseleccionalade
bajada.
Observacin:Enestemodo,lasealconectadaaTOCKIesmuestreadadurantelosciclosQ2yQ4delrelojinterno,porelloesnecesario
quepermanezcaenaltoalmenospor2Toscmsunpequeoretardode20nsegylomismoenbajo.(Esdecir,sealesdemasiado
rpidasnopodrnserdetectadas).
Elpreescalador:
Elpreescaladoresundivisordefrecuenciademduloseleccionable.Comosepuedeverenlafiguraanterior,elpreescaladorest
compartidoentreeltimer0yelmduloWatchdog,sinembargoslopuedeconectarseaunodelosdosyestoseestablecemedianteel
bitPSA(OPTION_REG<3>),as,conestebitenaltoelpreescaladoresasignadoalrelojdelWatchdog,mientrasqueconunnivelbajoen
PSAelpreescaladordividirlafrecuenciaquemanejaalTimer0.
Laseleccindelmdulo(valordedivisindefrecuencia)delpreescaladorsepuederealizarmediantelosbitsPS2,PS1,PS0
(OPTION_REG<2:0>)deacuerdoalasiguientetabla:
Ejemplomodotemporizador:
Paracalcularunatemporizacinsenecesitaeltiempodeunciclodeinstruccin(esdecir1microsegundo,sieststrabajandoconunXT
de4Mhz),elvalordelDivisordeFrecuencia(elqueseleccionabasconlosbitsPS2,PS1yPS0),yfinalmenteelcomplementodelvalor
cargadoenTMR0(esdecir255TMR0).Entoncestenemos:Temporizacin=Ciclodeinstruccin.(256TMR0).DivisordeFrecuencia
Deestemodosiqueremostemporizar4msconundivisordefrecuenciade32,tendramos:
TMR0=256^[4000us/(1usx32)]
TMR0=131
VemosquelamximatemporizacinposibleesconTMR0=0,yDivisordeFrecuenciaen256,logrndoseunos65.5msaprox.
ParaejemplificarelusodeestainterrupcinharemostitilarunledconectadoalPINRB0cada200ms,paraelloharemosuna
temporizacinconTMR0de50msycontaremos4desbordesdelmismoparalograrlos200msnecesarios.Lointeresantedeusar
interrupcinesqueconelmicrosepuedeestarejecutandocualquiertareaynoocuparestetiempoenunbuclededemora.Elhardware
necesarioesequivalentealprimerejemplorealizado.
26
Diagramadeflujo:
27
Unaayudaadicional:
ElprogramitapresentadoenelprimerposttieneunautilidadquenosayudarenelclculodelpreescaleryvalorinicialdelTimerpara
obtenerunatemporizacindeseada,apartedegenerarelcdigo.
InterrupcinTMR0,modoContador
Enlaentregaanteriorcomenzamosavercmoaprovecharlasinterrupciones,yexplicamosquepodamosutilizarlasinterrupcionesen
modotemporizadoryenmodocontador.Cadaunodeestosmodostienesusventajas,yresultaadecuadoendiferentesaplicaciones.En
estaoportunidadveremosunejemplodelasinterrupcionesenmodocontador,contando(valgalaredundancia)elnmerodevecesque
seproduceuncambiodeestadoenunpindelPIC.
Ejemplomodocontador:
28
ElsiguienteprogramarealizaelconteodelnmerodevecesqueproduceunatransicindebajoaaltoenlapatitaT0CKI.Elvalordel
contadorseincrementarunavezporcadadostransiciones,yaldetectarse10cambiamoselestadodelLEDconectadoaRB0.
DiagramadeFlujo:
29
Cdigo:
30
InterrupcinRB0,ControldeLED
Seguimosaprendiendocomoutilizarlasinterrupciones.Yahemosvistoconanterioridadalgunasdesusparticularidades,yenesta
oportunidadaprenderemoscomoutilizarinterrupcionesexternas,esdecir,lasquesedisparancomorespuestaauneventoquetiene
lugarfueradelmicrocontolador.ComenzaremosconlasqueprovienendemodificacionesenelestadodelpinRBO/INT.
INTERRUPCIONEXTERNA,RB0/INT
Paraelcontroldelainterrupcinexternasenecesitandosbitsms,ellossonRPBU(OPTION_REG<7>,queactivaodesactivalas
resistenciasPullUpinternasdelPORTB,encasodequeeldispositivoconectadoalpuertoseadecolectorabiertoyelmsimportante
INTEDG(OPTION_REG<6>),siestaen1,lainterrupcinsegeneraporflancoascendente,yen0,lainterrupcinsegeneraporflanco
descendente.
Paramostrarsuusoharemosunejemplosencilloquemuestrecomoseconfigura,elcualalpresionarunpulsadorconectadoaRB0
cambiarelestadodeunledconectadoaRB1,paraelloconfiguramosquelainterrupcindegenereporflancoascendente.
DiagramadeFlujo:
31
Cdigo:
32
InterrupcinRB4aRB7,ControlTecladoMatricial
Continuamosaprendiendoasacarprovechodelasinterrupcionesexternas.Habamosvistocomoutilizarloscambiosenelestadodelpin
RB0/INT,yhoyaprenderemosautilizarlasqueprovienendelospinesRBAaRB7paradetectarqueteclasehapresionadoenunteclado
matricial.Estaentregaesmuyimportante,yaquenospermiteaprenderautilizarteclados,algomuycomnenlosproyectosqueutilizan
microcontroladores.
INTERRUPCIONEXTERNA,RB4aRB7
AprovecharemosestainterrupcinparadetectarcuandosehapresionadounatecladeunTecladoMatricial.Untecladomatricialesun
simplearreglodebotonesconectadosenfilasycolumnas,demodoquesepuedenleervariosbotonesconelmnimonmerodepines
requeridos.Untecladomatricial43solamenteocupa4lneasdeunpuertoparalasfilasyotras3lneasparalascolumnas,deeste
modosepuedenleer12teclasutilizandosolamente7lneasdeunmicrocontrolador.
Paradetectarlateclapresionadaseutilizaraelsiguientehardware:
ConfiguraremosRB0aRB3comosalidasylascolocaremosanivelbajo.RB4aRB7configuradascomoentradas,yenestadonormal(sin
presindeteclas)estarnanivelalto.Alpresionarunateclaseconectaunafilaconunacolumna,seproduceuncambiodenivelen
algunadelascolumnas(denivelaltoabajo),ysegeneralainterrupcin.Paradetectarqueteclasehapresionado,secolocanRB0aRB3
anivelalto,ysepasananivelbajodeaunaporvez,detectandosiseproducealgncambioenlascolumnas.
33
Seutilizaunavariablequeseincrementaconlacuentadelasteclasrevisadas,deestemodoaldetectarunapulsacinelvalordela
cuentaserelvalordelateclapresionada.Sialfinalnosepresionningunateclalavariableseponeaceroylacuentavuelvea
comenzar.EnnuestroejemplorepresentaremoslateclapresionadaenformabinariaconledsconectadosalpuertoA.
DiagramadeFlujo:
34
Cdigo:
35
TambinconlavariableNTecla(NumerodeTeclapresionada)sepuedeutilizarcomoentradaaunatablaparacodificarenASCKIIlatecla
presionada:
Cdigo:
ControldelLCD,PantalladeCristalLquido
CuandoexplicamoscomomostrarinformacinenunoomsdisplaysdeLEDsseguramentepensastequeenalgunoscasosseramejor
utilizarunapequeapantallaLCDalfanumrica.Enestaentrega,luegodehabervistocmoutilizaruntecladomatricial,vamosa
analizarlasrutinasnecesariasparaquenuestrosproyectospuedanincorporarestasverstilespantallas.Conestoselementosnuestros
proyectosestarnalaalturadelosprofesionales.
ControldelLCD
LapantalladecristallquidooLCD(LiquidCrystalDisplay)esundispositivoControladodevisualizacingraficoparalapresentacinde
caracteres,smbolosoinclusodibujos(enalgunosmodelos).Enestecasodisponede2filasde16caracterescadaunaycadacarcter
disponedeunamatrizde57puntos(pixels),aunqueloshaydeotronmerodefilasycaracteres.Estedispositivoestgobernado
internamenteporunmicrocontroladorHitachi44780yregulatodoslosparmetrosdepresentacin,estemodeloeselms
comnmenteusadoylainformacinqueseadjuntasebasarenelmanejodeesteuotroLCDcompatible.
36
ConexindelmduloLCDalPIC16F84Amediantebusde4bits.
Enesteejemploharemosusodedosdirectivasmsdeensamblador.Estasson#DEFINEymacro.
#DEFINEesempleadoparacrearsustitucionesdentrodeltextodelprogramaquelosimplifiquen.Laformacorrectaes#DEFINENOMBRE
TEXTO,conloque,cadavezqueelcompiladorencuentrelaordenNOMBRE,lasustituirporeltexto.Elproblemaquesenosplanteaes
que,sibienesmsflexiblequeladirectivaEQU,puestoqueestaslonospermitaasignarunvalor,slosenospermitecon#DEFINEuna
lneadetexto,yestadebeserfija.
Esteproblemasesolucionamediantemacro.Estadirectivatienelasiguienteforma:
DeestemodoNOMBREsersustituidocomocomandoporlasecuenciacompletadefinidatrasmacrohastaendm,ylossucesivos
argumentossern,asuvez,sustituidosdentrodeltexto.
EnnuestroejemploloutilizaremosparaenviaruncarcterouncomandoalLCD,delasiguientemanera:
Cdigo:
37
RutinasdeControl:
LCD_Config_puertos:ConfiguralospuertosdelPICparaelusodelmduloLCD,soloafectaalospinesutilizados.
LCD_Init:InicializaelmduloLCDparasucorrectofuncionamiento.Esnecesarioejecutarestasubrutinaalprincipiodelos
programasquevayanautilizarlavisualizacinmedianteLCD.
LCD_Bandera:ExploraelestadodelabanderaBusy(ocupado)delmduloLCDyesperaqueterminecualquiercomandoprevio
antesdevolveralarutinaquelellamo.
LCD_Enable:HabilitaelmduloLCDdurante2uspararecepcindedatosoenvo.
LCD_Comando:ConfiguramduloLCDpararecibiruncomandomedianterutinaLCD_Envio_Data.
LCD_Caracter:ConfiguramduloLCDpararecibiruncarctermedianterutinaLCD_Envio_Data.
LCD_Envio_Data:EnvadatoalLCD,Cargandoelnibblealtoyluegoelnibblebajo.
Nota:ObservarquelaslneasdecontrolybusdedatosesfcilmentemodificableenDeclaracindebitsparacontrolLCDyDeclaracin
deBytesdelLCD.
Comoejemplodeaplicacinsemuestraunejemplodondesevisualizaunmensaje(Ucontrol):
Cdigo:
38
39
40
ComunicacinRS232
Enestaentregallegaasufinlaprimerapartedeestecurso.Enefecto,conlaexplicacindecmoutilizarelpuertoserieRS232para
enviaryrecibirdatosconunmicrocontroladorterminamoslaseccindeestetutorialdedicadaalmicrocontroladorPIC16F84A.Enla
entregasiguienteaprovecharemostodoloaprendidoparacomenzaradesarrollartemasrelativosalmicrocontroladorPIC16F628A,ms
potente,modernoyeconmicoelclsicoPIC16F84Aquehemosutilizadohastaestemomento.
ElRS232esunestndardecomunicacionespropuestoporlaAsociacindeIndustriasElectrnicas(EIA)lacualdefinelainterfase
mecnica,lospines,lassealesylosprotocolosquedebecumplirlacomunicacinserial.Lavelocidadsemideenbaudios(bits/segundo)y
estnormalizadaa2400,4800,9600,19200,38400,etc.Yslosonnecesariosdoscables,unodetransmisinyotroderecepcin.
TodaslasnormasRS232cumplenconlossiguientesnivelesdevoltaje:
Un1lgicoesunvoltajecomprendidoentre5vy15v
Un0lgicoesunvoltajecomprendidoentre+5vy+15v
Lospuertosseriessonaccesiblesmedianteconectores.LanormaRS232establecedostiposdeconectoresllamadosDB25yDB9,
machosyhembras.LanormaRS232seestableciparaconectarunordenadorconunmodem,porloqueaparecenmuchaspatillasenlos
conectoresDB25queenotrotipodeaplicacionesnoseutilizanyenlasqueesmscomnutilizarelconectorDB9.
CadaunadelaspatillasdelconectorRS232tieneunafuncinespecfica.PatillasdelDB9:
41
LospinesqueportanlosdatossonRxDyTxDlosdemsseencargandeotrostrabajos,elDTRindicaqueelordenadorestaencendido,
DSRqueeldispositivoconectadoalpuertoestaencendido,RTSqueelordenadoralnoestarocupadopuederecibirdatos,alrevs
deCTSqueloqueinformaesqueeseldispositivoelquepuederecibirdatos,DCDdetectaqueexistenpresenciadedatos,etc.
Formatodeunbyte:
ElprotocoloestablecidoporlanormaRS232envalainformacinestructuradaen4partes:
Bitdeiniciooarranque(START).Esunpasode12Va+12V,esdecirdeun1aun0lgicoenlalgicanegativadelanorma
RS232.
Bitsdedatos(Datas)LosbitsdedatossonenviadosalreceptordespusdelbitStart.ElbitdemenospesoLSBestrasmitido
primero.Uncarcterdedatossueleconsistiren7u8bits.
BitdeParidad(Parity)Dependiendodelaconfiguracindelatransmisinunbitdeparidadpuedeserenviadodespusdelosbitsde
datos.Conestebitsesueledescubrirerroresenlatransmisin,puededarparidadparoimpar.
BitdeParada(STOP)lalneaquea12Vdespusdelltimobitenviado,esdecirquedaa1enlgicanegativadelanorma.El
protocolopermite1,1.5o2bitsdeparada.
MAX232:
EnelmercadohaymuchoscircuitosintegradosquepermitenlaconversinentrenivelesTTLynivelesRS232.Elmsdestacadoesel
transceptorMAX232:
EsteconviertelosnivelesRS232<+12y12>avoltajesTTL<0y+5>yviceversasinrequerirmsqueunafuentede+5Vyunparde
capacitores.ParaejemplificarelusodeesteprotocoloparaestablecercomunicacinconlaPC,haremosunprogramitaquerecibaladata
delaPCyselareenviaremosinmediatamente.
42
ParalarecepcindedatosaprovecharemoslainterrupcinexternaporRB0,configuradaenflancodescendente(detectarcuandolaPC
enviunbitdeStart).DejapasaruntiempounaymediavecesmayorqueelperiododetransmisinparasaltarseelbitdeStartyleeel
primerbitensumitad.Leeelrestodelosbitsdedatos,esperandountiempoigualaladuracindelperiodoentrelecturaylecturapara
testearlosenmitaddelbit.KbhitindicasihallegadoonoundatodesdePC.<<rs232_leerdato>>
Paraelenvodedatosseenvaun0duranteuntiempoigualalperiododelavelocidaddetransmisin.EsteeselbitdeStart.Luego
seenvaelbitcorrespondientealdatoaenviar:Sivaaenviarun0permaneceenbajoduranteelperiodocorrespondienteysisevaa
escribirun1permaneceenaltoduranteelperiodocorrespondiente.Alenviarlos8bitsdedatosseenvaunbitdeStop,nivelalto
duranteunperiodo.<<rs232_enviadato>>
Losparmetrosadoptadosparalacomunicacinsonlossiguientes:
Velocidad9600baudios
Datode8bits
SinParidad
1bitdeStop
ParaestablecercomunicacinconelmicrocontroladorutilizaremoselsoftwareSiow,esunmonitordelpuertoseriemuysencillodeusar,
solohayqueconfigurarlosparmetrosdecomunicacin.(TambinsepuedeusarelHyperterminaldeWindows)
43
Cdigo:
44
ConlaexplicacindecmoutilizarelpuertoserieRS232paraenviaryrecibirdatosconunmicrocontroladorterminamoslaseccinde
estetutorialdedicadaalmicrocontroladorPIC16F84A.Enlaentregasiguienteaprovecharemostodoloaprendidoparacomenzara
desarrollartemasrelativosalmicrocontroladorPIC16F628A,mspotente,modernoyeconmicoelclsicoPIC16F84Aquehemos
utilizadohastaestemomento
IntroduccinalPIC16F628A
CuandocomenzamosatrabajarconmicrocontroladoresenASMnecesitamosdetodalaayudaconlaquepodamoscontar.Yahemos
vistoenprofundidadelmicrocontroladorPIC16F84A,yahoraeselturnodesuhermanomayorPIC16F628A.Aligualquelaprimera
partedeltutorial,estaconstadevarioscaptulosqueestamossegurosdequeteresultarnmuytiles.Estaentregaesalgomslargade
lonormal,peroteaseguramosquevalelapena.
PIC16F628A
45
HarunaintroduccinalosmicrosyrealizareejemplosparalosmdulosquenotraeelPIC16F84A.Empezarporsuscaractersticas
principales
Conjuntoreducidodeinstrucciones(RISC).Solamente35instruccionesqueaprenderautilizar
Osciladorinternode4MHz
Operaconunafrecuenciaderelojexternadehasta20MHz(ciclodemquinade200ns)
Memoriadeprograma:2048locacionesde14bits
Memoriadedatos:MemoriaRAMde224bytes(8bitsporregistro)
MemoriaEEPROM:128bytes(8bitsporregistro)
Stackde8niveles
16TerminalesdeI/Oquesoportancorrientesdehasta25mA
3Temporizadores
Mdulodecomunicacinserie(Usart
MduloCCP(captura/comparacin/PWM)
2Comparadoresanalgicos,unareferenciadevoltajeprogramable
Nota:LosmdulosdescriptosparaelPIC16F628AsonidnticosalosdelPIC16F648A,lonicoquevaraentreellossonlassiguientes
caractersticas:
Memoriadeprograma:PIC16F648A4096locacionesde14bits
Memoriadedatos:PIC16F648AMemoriaRAMde256bytes(8bitsporregistro)
MemoriaEEPROM:PIC16F648A256bytes(8bitsporregistro)
DeaquenadelantemerefieroalPIC16F628AperolosejemplossonaplicablesalPIC16F648Ahaciendoelcambiodeencabezado:
Puertos:
LosPIC16F628/648Acuentancondospuertos(PORTAyPORTB),algunospinesdeestospuertosdeentrada/salidasonmultiplexadoscon
unafuncinalternativadelosperifricosdeldispositivo.Cuandounperifricoesactivadoelpinnopuedeserusadoparapropsitos
generalesdee/s.
ElPUERTOAesunpuertodeentradade8bits.Todoslospines,exceptoRA5,puedenserconfiguradoscomoentradaosalidaconla
respectivaconfiguracindelregistroTRISA.ElpinRA4estamultiplexadoconlaentradaderelojT0CKIycomosalidasecomportacomo
colectoabierto,porlotantodebemosponerunaresistenciaPullupaVdd.ElpinRA5esundisparadorSchmittsolodeentradayno
cuentaconcontroladoresdesalida,segnlaconfiguracin,puedeserusadocomoMclr(Resetexterno),yademssirvetambinpara
entrarenelmododeprogramacincuandoseaplicaunatensinigualaVpp(13,4Vmnimo).Losdemspinesdelpuertotrabajande
entradacomodisparadordeSchmittTriggerycomosalidalgicaCMOS.LospinesRA0RA3sirvendeentradaparaelcomparador
analgico.
Importante:SiseutilizaenpuertoAcomoI/ODigital,sedebedeshabilitarlosComparadoresAnalgicos,cargandoun007enCMCON.
46
ElPUERTOBesunpuertobidireccionalde8bits,delcualporsoftwaresepuedenhabilitarresistenciasdepullupinternas.ElPORTBes
multiplexadoconinterrupcionesexternas,talescomodeteccindeflancoporRB0,cambiodenivelporRB4aRB7,USART,elmduloCCP
yelrelojdeentrada/salidaTMR1.
Otrospines:
VDD:Pindealimentacinpositiva.De2a5,5Vcc
VSS:Pindealimentacinnegativa.Seconectaatierraoa0Vcc
MCLR:MasterClear(Reset).Sielnivellgicodeesteterminalesbajo(0Vcc),elmicrocontroladorpermaneceinactivo.EsteResetse
controlamediantelapalabradeconfiguracindelPIC
OSC1/CLKIN:Entradadeosciladorexterno
OSC2/CLKOUT:Salidadeloscilador.Dependiendodecmoseconfigurepuedeproporcionarunasalidaderelojpormediodeeste
pin
Organizacindelamemoria:
Organizacindelamemoria
47
ElPIC16F628Aposeeuncontadordeprogramade13bits,capazdedireccionarunespaciodememoriade8Kx14.Sinembargo,
nicamentelosprimeros2Kx14,desde0000hhasta07FFh,estnimplementados.Losvectoresdereseteinterrupcinestnenlas
direcciones0000hy0004h,respectivamente.Lapila(stack)esde8niveles,locualsignificaquepuedesoportarhasta8direccionesde
retornodesubrutina.
ElPIC16F628AposeeunespaciodememoriaRAMdedatosde5128,divididoen4bancosde128bytescadauno.Sinembargo,slo
estnimplementados330bytes,correspondiendo224alreadelosregistrosdepropsitogeneral(GPR)y36alreadelosregistrosde
funcinespecial(SFR).Losrestantes70bytesimplementadossonespejosdealgunosSFRdeusofrecuente,ascomodelosltimos16
GPRdelbanco0.Porejemplo,lasposiciones0Bh,8Bh,10Bhy18BhcorrespondenalregistroINTCON,demodoqueunaoperacinhecha
encualquieradeellos,sereflejaautomticamenteenlosotros.Sedice,entonces,quelasposiciones8Bh,10Bhy18Bhestnmapeadas
enlaposicin0Bh.Estacaractersticaagilizaelaccesoaestosregistros,puestoquenosiempreesnecesarioespecificarelbancodonde
seencuentran.LaseleccindelbancodeubicacindeunSFRounGPRparticularsehacemediantelosbits6(RP1)y5(RP0)delregistro
STATUS.
Registros
48
Interrupciones:
Registrosutilizados:
INTCON:RegistrodelecturayescrituraquecontienevariosbitsdesealizacinyhabilitacinparaeldesbordamientodelTMR0,cambio
sobreelpuertoRBeinterrupcinexternaenlapatillaRB0/INT.
0.RBIF:IndicadordeinterrupcinporcambiodeestadoRB4RB7
1.INTF:Indicadordeinterrupcinexterna
2.T0IF:IndicadordeinterrupcinpordesbordamientodeTimer0
3.RBIE:HabilitacindeinterrupcinporcambiodeestadoRB4RB7
4.INTE:Habilitacindeinterrupcinexterna
5.T0IE:HabilitacindeinterrupcinpordesbordamientodeTimer0
6.PEIE:Habilitacindeinterrupcindeperifricos
7.GIE:Habilitacingeneraldeinterrupciones
PIR1:ElregistroPIR1contienelosbitsdesealizacinindividualdelasinterrupcionesdeperifricos
0.TMR1IF:IndicadordeinterrupcinpordesbordamientodeTimer1
1.TMR2IF:IndicadordeinterrupcinpordesbordamientodeTimer2
2.CCP1IF:IndicadordeinterrupcindelmdulodeCaptura/Comparacin.
a)ModoComparador:CoincidenciaentreTMR1yCCP1
b)ModoCaptura:HaocurridounacapturadeTMR1
3.NoImplementado.
4.TXIF:IndicadordeinterrupcindefindetransmisinUSART
5.RCIF:IndicadordeinterrupcindellegadadedatosUSART
6.CMIF:Indicadordeinterrupcinporcambiodeestadodealgunadelassalidasdeloscomparadores.
7.EEIF:Indicadordeinterrupcindefindeescrituraeeprominterna.
PIE1:Registroqueposeelosbitsdehabilitacinindividualparalasinterrupcionesdeperifricos.ElbitPEIEdelregistroINTCONdebeser
1parapermitirlahabilitacindecualquierinterrupcindeperifrico.
0.TMR1IE:HabilitacindeinterrupcinpordesbordamientodeTimer1
1.TMR2IE:HabilitacindeinterrupcinpordesbordamientodeTimer2
2.CCP1IE:HabilitacindeinterrupcindelmdulodeCaptura/Comparacin/PWM.
3.NoImplementado.
4.TXIE:HabilitacindeinterrupcindefindetransmisinUSART
5.RCIE:HabilitacindeinterrupcindellegadadedatosUSART
6.CMIE:Habilitacindeinterrupcinporcambiodeestadodealgunadelassalidasdeloscomparadores.
7.EEIE:Habilitacindeinterrupcindefindeescrituraeeprominterna.
LgicadeInterrupciones:
49
PalabradeConfiguracin:
ElPIC16F628hasidoconstruidoconcaractersticastalesquesepuedeconfigurarparafuncionarenmodosdeoperacinqueno
necesitancomponentesexternostalescomoelcircuitoderelojodereset.Estoimplicaqueesnecesarioconfigurarsumodode
operacinatravsdeunapalabradeconfiguracin.Lapalabradeconfiguracinseencuentramapeadaenladireccin2007hdela
memoriadeprogramaysolopuedeseraccedidadurantelaprogramacindedispositivo.
PalabradeConfiguracin
CP1:CP0:Bitsdeproteccindecdigo
Losbits1310encargadosdeprotegerlamemoriadeprograma.
CPD:Bitdeproteccinparacdigodedatos
1=Proteccindeshabilitadadelamemoriadedatos.
0=Proteccinhabilitadaenlamemoriadedatos.
LVP:Habilitacindelaprogramacinporvoltajebajo
1=LVPhabilitado,laterminalRB4/PGMtienetalfuncin.
0=LCP:deshabilitado,RB4/PGMesunaterminalI/O.
BODEN:Bitderesetporvoltajedealimentacinbajo
1=ResetporBODhabilitado
0=ResetporBODdeshabilitado
MCLRE:Habilitaciondelterminaldereset
1=TerminalderesetenRA5.
0=MCLRconectadointernamenteaVdd,RA5esunpinI/O.
PWRTEN:Bitdehabilitacindetemporizadoralenergizar
1=PWRThabilitado.
0=PWRTdeshabilitado.
WDTEN:BitsdehabilitacindeWatchDog
1=WDThabilitado
0=WDTdeshabilitado.
FOSC2:FOSC1:FOSC0:Bitsdeseleccindeltipodeoscilador
50
Timer1+Ejemplo
ComenzaremosaanalizarlosmdulosTImer0,Timer1yTimer2delmicrocontroladorPIC16F628A.Enrealidad,elprimerodelostresno
tienediferenciasconelqueseincluyeenelmicrocontroladorPIC16F84A,porloquesimplementepodemosleerloescritoenlaprimera
partedeestaseriedeentradas.Enelresto,porsupuesto,haydiferenciasqueyamismovamosaanalizar.
ElMdulodelTimer0,comodecamos,esidnticoaldelPIC16F84A.
ElMdulodelTimer1:
ElTimer1adiferenciadelTimer0esuntemporizador/contadorde16bits.Elconteoesrealizadopordosregistrosde8bits:
(TMR1H(0Fh)yTMR1L(0Eh))quesontantoleblescomoescribibles.
As,elregistroTMR1seincrementade0000haFFFFhyenlasiguientecuentasereiniciaen0000hyassucesivamente,alreciclarsese
activa(enalto)labanderaTMR1IF(PIR1<0>),lacualpuedeserutilizadaparagenerarunainterrupcin,obien,paraserconsultadapor
poleo.
Enlasiguientefigurasemuestraundiagramadebloquesdeestemdulo,endondeseindicanlosbitsqueafectansuoperacinyla
maneraenquelohacen:
51
Modotemporizador
EnestemodoelTimerseincrementa(sinoseconsiderapreescalador)encadaciclodeinstruccin(alafrecuenciaFosc/4).Estemodose
seleccionalimpiandoelbitTMR1CS(T1CON<1>).
ElpreescaladorquesepuedeintercalarentreelrelojFosc/4yelregistroTMR1puedetenerslounode4valores:1/1,1/2,1/4y1/8.
Enestecasolatemporizacindecalcula:
Temporizacin=Ciclodeinstruccin.(65536TMR1).DivisordeFrecuencia
VemosquelamximatemporizacinposibleesconTMR1=0,yDivisordeFrecuenciaen8,logrndoseunos524.3msaprox.
Modocontador:
ElTimer1tambinpuedeoperarcomocontadorasncronoosncronocontandolosflancosascendentesqueocurrenenpin
RB6/T1OSO/T1CKIponiendoa1elbitTMR1CS.DespusdequeelTimer1seprogrameenmodocontador,elmduloesperarunflanco
debajadaantesdecomenzarlosincrementosconlosflancosdesubida.
Contadorsincronizado:SiSYNCT1seborra,laentradaexternaderelojsesincronizaconlafaseinternadereloj.Lasincronizacinse
producedespusdelaetapadelPredivisor.Estebloqueesuncontadorcclicoasncrono.
Contadorasincrnico:SielbitdecontrolSYNCT1seactiva,laentradaderelojexternanoquedasincronizadaconelrelojinterno.El
temporizadorcontinuarfuncionandoduranteelestadodeSLEEP,ypuedeprovocarunainterrupcinensudesbordamientoquesaque
desusiestaalaCPU.
OsciladordelTimer1:
SedebeconectaruncristaldecuarzoentrelaspatillasT1OSI(entrada)yT1OSO(salidadelamplificadoroscilador).Elosciladorsehabilita
conelbitT1OSCEN(T1CON<3>),yfuncionarenbajoconsumoapartirde200KHz.EsteosciladorcontinafuncionandoaunquelaCPU
entreenmodoSLEEP,yestdiseadoespecialmenteparatrabajara32.768Hz.
Configuraciones:
ElTimer1poseeunbitparahabilitacin/deshabilitacin,esteeselbitTMR1ON(T1CON<0>)yhabilitaenalto.
Adems,elTimer1poseeunaentradainternadeRESET,elcualpuedeseractivadoporunocualquieradelosmdulosCCP.
AcontinuacinsedescribeelprincipalregistrorelacionadoconelTimer1ytodossusbits,exceptolosquetienenqueverconelmodo
contador:
RegistroT1CON(10h)
PrincipalregistrorelacionadoconelTimer1ytodossusbits.
Bits5:4T1CKPS1:T1CKPS0.Bitsdeseleccindelvalordeldivisordefrecuenciadelpreescalador:
11=divisor1/8
10=divisor1/4
01=divisor1/2
00=divisor1/1
bit3T1OSCEN:BitdecontroldehabilitacindeosciladorparaTMR1.
1=Osciladorhabilitado.
0=Osciladoranulado.
Bit2T1SYNC:BitdecontroldesincronizacindelaentradaderelojexternodeTimer1.
TMR1CS=1
1=Entradaderelojexternonosincronizada.
0=Entradaderelojexternosincronizada
52
TMR1CS=0
Enestacircunstancia,Timer1usaelrelojinterno.
Bit1TMR1CS.Bitdeseleccindelafuentedereloj
1=Modocontador(fuentedereloj:patitaRB6/T1OSO/T1CKI)
0=ModoTemporizador(fuentederelojFosc/4)
Bit0TMR1ON.Bitdehabilitacin/deshabilitacindelTimer1:
1=habilitaTimer1
0=DeshabilitaTimer1
ConfigPICtraeunaherramientaadicionalquenosayudaaseleccionarelpreescaleryvalorinicialdelTimerparaobteneruna
temporizacindeseada:
Paraejemplificarharemosunsimpleejemplodondeloutilizamoscomotemporizador.SehartitilarunledconectadoalPINRB0cada
300ms.ComosepuedeveresidnticoalejemplorealizadoparaTimer0delPIC16F84A,soloqueenestecasononecesitaremosun
registroadicionalparalograrlademoradeseada.
Hardware:
53
Cdigo:
Timer2+Ejemplo
SeguimosanalizandolosmdulosTImer0,Timer1yTimer2delmicrocontroladorPIC16F628A.Enlaentregaanteriornosocupamosde
losdosprimeros,ehicimosnotarqueelprimerodeellosnotienediferenciasconelqueseincluyeenelmicrocontroladorPIC16F84A,
porloquesimplementepodamosaplicarloaprendidoenlaprimerapartedeestaseriedeentradas.Hoynosocupamosdelosdetalles
deltercerodeellos,parasacartodoeljugoalasposibilidadesdelTimer2.
ElMdulodelTimer2:
ElTimer2esuntemporizador(sinopcindetrabajarcomocontador)de8bits.SuregistroprincipaldenominadoTMR2(11h)esun
registrode8bitsqueseincrementacontinuamentealafrecuenciaseleccionadadeFosc/4divididaporunpreescalador.Enlasiguiente
figurasemuestraundiagramadebloquesdelmdulodelTimer2.
Elpreescalador:
LafrecuenciaqueincrementaalregistroTMR2puedeserdivididaporunpreescaladorporunfactorde1/1,1/4o1/16,seleccionablepor
losbitsT2CKPS1:T2CKPS0(T2CON<1:0>)
ElRegistrodecomparacinodePeriodo:
Enoperacin,elcontenidodelregistroTMR2secomparacontinuamenteconunregistrodeperiododenominadoPR2(92h)cuyovalor
podemosestablecerporsoftware.
CadavezquelacuentadeTMR2esigualaPR2,sereiniciaelconteoenTMR2desdecero,yademssegeneraunasealdesalida,lacual
estratadaporunpostescalador,parapodergenerarunasealTMR2IF(PIR1<1>)quepuedeserusadaparasolicitarunainterrupcin,o
paraserledaporpoleo.
54
ElPostescalador:
ElpostescaladordividelafrecuenciaconqueocurreunaactivacindelabanderaTMR2IF,esdecir,sielvalordelpostescaladores1/1,
estabanderaseactivarcadavezqueTMR2sereinicie,encambio,sies1/16(porejemplo),TMR2IFseactivarcada16reinicios
deTMR2.EnformasimilaralosotrosdosTimers,estabanderadebeserlimpiadapreviamente,sisequieredetectarsuactivacin,esto
puedeserhechoenlarutinadeatencinalainterrupcin,obienenlarutinaqueladetectaporpoleo.
ElvalordedivisindelpostescaladorpuedeestablecerseporsoftwaremediantelosbitsT2OUPS3:T2OUPS0(T2CON<6:3>).
Enestecasolatemporizacindecalculaas:
Temporizacin=Ciclodeinstruccin.(PR2TMR2).DivisordeFrecuenciaPre.DivisordefrecuenciaPost
VemosquelamximatemporizacinposibleesconTMR2=0,yDivisordeFrecuenciaPreen16,DivisordefrecuenciaPosten16,
logrndoseunos65.5msaprox.
AcontinuacinsedescribeelprincipalregistrorelacionadoconelTimer2ytodossusbits.
RegistroT2CON(12h)
Bits6:3
T2OUPS3:T2OUPS0Bitsdeseleccindelvalordeldivisordefrecuenciadelpostescalador,deacuerdoalasiguientetabla:
0000=divisor1/1
0001=divisor1/2
0010=divisor1/3
1111=divisor1/16
Bit2
TMR2ONBitdeencendidodelTimer2
1=Enciende(energiza)elTimer2
0=Apaga(desconecta)elTimer2
Bits1:0
T2CKPS1:T2CKPS0Bitsdeconfiguracindelvalordelpreescaladordeacuerdoalasiguientetabla:
00=divisor1/1
01=divisor1/4
1x=divisor1/16
Ejemplodeconfiguracinparalograrunatemporizacinde20ms:
Cdigo:
55
Mdulodecomunicacinserie(Usart)+Ejemplo
LuegodeanalizarlosmdulosTImer0,Timer1yTimer2delmicrocontroladorPIC16F628AEnvamosaverlosdetallesdesuUSART.Al
igualqueantes,estaentradatienesuequivalenteenlaprimerapartedeestecurso,cuandoestudiamoselmicrocontroladorPIC16F84A,
porloserademuchaayudavolveraleerloescritoenlaprimerapartedeestaseriedeentradas.Enelresto,porsupuesto,hay
diferenciasqueyamismovamosaanalizar.
LaUSARTdelPIC16F628:
LaUSARTdelPIC16F628Apuedeserconfiguradaparaoperarentresmodos:
1.
ModoAsncrono(fullduplex(transmisinyrecepcinsimultneas)),
2.
ModoSncronoMaestro(halfduplex)
3.
ModoSncronoEsclavo(halfduplex)
Aqusolotrataremoselmodoasncrono.
ModoAsncrono:
EnestemodolaUSARTusaunformatoestndarNRZasncrono,elcualparalasincronizacinusa:1bitdeinicio(I),8o9bitsdedatosy
1bitdeparo(P).MientrasnoseestntransmitiendodatoslaUSARTenvacontinuamenteunbitdemarca.Elmodoasncronose
seleccionalimpiandoelbitSYNCdelregistroTXSTA(98H).ElmodoasncronoesdeshabilitadoduranteelmodoSLEEP.
CadadatoestransmitidoyrecibidocomenzandoporelLSB.ElhardwarenomanejabitdeParidad,peroelnovenobitpuedeserusado
paraestefinymanejadoporsoftware.
ElmduloAsncronodelaUSARTconstadelossiguientesmdulosfundamentales:
Elcircuitodemuestreo
Elgeneradordefrecuenciadetransmisin(BaudRate)
Eltransmisorasncrono
Elreceptorasncrono.
Elcircuitodemuestreo:
Eldatoenlapatitaderecepcin(RB1/RX/DT)esmuestreadotresvecesparapoderdecidirmedianteuncircuitodemayora,sisetrata
deunnivelaltoounnivelbajo.
ElGeneradordeBaudRate(BRG):
Estegeneradorconsistedeuncontador/divisordefrecuenciade8bitscontroladoporelregistroSPBRG(99H).Detalmaneraquela
frecuenciadetransmisinsecalculadeacuerdoalasiguientetabla:
EnestatablaX=valorde8bitsenelregistrodeldivisor,SPBRG.ElbitBRGHcorrespondeaTXSTA<2>.
EneldatasheetdelPIC16F628haytablasdondesemuestranalgunosvaloresbaudestndares,eldivisornecesario(X=SPBRG)bajo
diferentesfrecuenciasFoscyelerrorproducidoenporcentaje.
56
Eltransmisorasncrono:
EnlasiguientefigurasemuestraeldiagramadebloquesdeltransmisordelaUSART:
Elcorazndeestemduloeselregistrodecorrimiento(transmitshiftregister,TSR).LanicamaneradeaccederalregistroTSResa
travsdelregistroTXREG(19H).
Paratransmitirundato,elprogramadeberponerloprimeroenelregistroTXREG.EncuantoelTSRterminadeenviareldatoquetena
(encuantotransmiteelbitdeparo)leeeldatocontenidoenTXREG(sihayalguno)estoocurreenuncicloTCY.Encuantoeldato
deTXREGestransferidoalTSRelTXREGquedavacoestacondicinesindicadamedianteelbitbanderaTXIF(queeselbit4del
registroPIR1(0Ch)),elcualseponeenalto.EstebitNOpuedeserlimpiadoporsoftware,slodurauninstanteenbajocuandoseescribe
unnuevodatoaTXREG.Siseescribeundatoseguidodeotro(backtoback)aTXREGelprimerosetransfiereinmediatamenteaTSRyel
otrotienequeesperarhastaqueelTSRterminedeenviarelbitdeStopdelprimero.DuranteestaesperaTXIFpermaneceenbajo.
Existeotrobit,llamadoTRMT(TXSTA<1>),elcualmuestraelestadodelTSR.TRMTseponeenaltocuandoTSRestvaco,yenbajo
cuandoTSResttransmitiendoundato.MientrasqueTXIFpuedegenerarunainterrupcinTRMTnolopuedehacer,TRMTestpensado
paraserconsultadoporpoleo(sinusarinterrupciones).
ParahabilitarelmdulodetransmisinesnecesarioponerenaltoelbitTXEN(TXSTA<5>),mientrasnosehabiliteelmdulo,lapatitade
transmisin(RB2/TX/CK)semantieneenaltaimpedancia.SiTXENesdeshabilitadaalamitaddeunatransmisin,estserabortadayel
transmisorserreseteado.
SiseestusandounnovenobitTX9(TXSTA<6>),stedeberserescritoantesdeescribirlos8bitsrestantesaTXREG,yaqueencuanto
seescribeundatoaesteregistroinmediatamenteestransferidoaTSR(sisteestvaco).
Deacuerdoaloanterior,lainicializacindelmdulodetransmisinconsisteenlossiguientespasos:
1.
InicializarbaudrateescribiendoalregistroSPBRGeldivisoradecuadoyopcionalmentealbitBRGH.
2.
HabilitarcomunicacinasncronalimpiandoelbitSYNCyponiendoelbitSPEN.
3.
Sisevanausarinterrupciones,ponerelbitTXIE(PIE<4>).
4.
PonerelbitTX9sisedeseatransmitirdatosde9bits
5.
HabilitartransmisinponiendoelbitTXEN,locualpondrelbitTXIF.
6.
ColocarelnovenobitdeldatoenTX9Dsiseestnusandodatosde9bits.
7.
CargareldatoalregistroTXREG(inicialatransmisin).
Elreceptorasncrono:
Elmduloderecepcinessimilaraldetransmisin,enlasiguientefigurasemuestranlosbloquesqueloconstituyen:
57
Unavezquesehaseleccionadoelmodoasncrono,larecepcinsehabilitaponiendoenaltoelbitCREN(RCSTA<4>)
EldatoesrecibidomediantelalneaRB1/RX/DT,lacualmanejaunregistrodecorrimientodealtavelocidad(16veceselBaudrate).
ElcorazndelreceptoreselregistrodecorrimientoRSR.Esteregistronoesaccesibleporsoftware,pero,cuandoeldatorecibidoseha
completado(seharecibidoelbitdeStop)eldatodeRSRestransferidoautomticamentealregistroRCREG(1Ah)sisteestvacoyal
mismotiempoespuestoenaltolabanderaderecepcinRCIF(PIR1<5>).LanicamaneradelimpiarlabanderaRCIFesleyendoel/los
datosdelregistroRCREG.ElregistroRCREGpuedecontenerhastadosdatos,yaqueesunbufferdoblequefuncionacomounacolade
dosposiciones.
SilasdosposicionesdelregistroRCREGestnllenas(nohansidoledas)ysedetectaelbitdeStopdeuntercerdatoderecepcin,locual
ocasionauntransferenciaautomticadeldatorecibidoaRCREG,estodestruirelprimerdatorecibidoyactivarelindicadorde
sobreescrituraOERR(RCSTA<1>).Paraevitaresto,sedebernleerlosdosdatosenRSREGhaciendodoslecturasconsecutivas.
LanicamaneradelimpiarelbitOERRunavezquehasidoactivadoesreseteandoelmduloderecepcin(limpiandoCRENy
volvindoloaponer),sinoselimpiaOERRsebloquealatransferenciadedatosdeRSRaRCREGynopuedehabermsrecepcinde
datos.
Sisedetectaunbitnivelbajoenlaposicindelbitdestopseponeelindicadordeerrordeencuadre(frame
error)FERRRCSTA<2>.TantoesteindicadorcomoelnovenobitRX9Ddelosdatosestnenunacoladedosposicionesaligualquelos
datosrecibidos,demaneraquealleerRCREGseactualizanFERRyRX9Dconnuevosvalores,porlocualestosbitsdebernserledos
antesdeleerRCREGparanoperdersuinformacin.
Deacuerdoaloanterior,lainicializacindelmduloderecepcinescomosigue:
1.
InicializarelbaudrateescribiendoalregistroSPBRGeldivisoradecuadoyopcionalmentealbitBRGH.
2.
HabilitarelpuertoserieasncronolimpiandoelbitSYNCyponiendoelbitSPEN.
3.
Sisevanausarinterrupciones,ponerelbitRCIE(PIE<5>).
4.
Sisedesearecepcindedatosde9bitssedeberponerelbitRX9(RCSTA<0>).
5.
HabilitarlarecepcinponiendoelbitCREN(RCSTA<4>)
6.
ElbitRCIFsepondrcuandolarecepcindeundatosecompleteysegenerarunainterrupcinsiRCIEestpuesto.
7.
LeerelregistroRCSTAparaobtenerelnovenobit(siseestnrecibiendodatosde9bits)oparadeterminarsihaocurridoun
errorderecepcin.
8.
Leerlos8bitsdeldatorecibidoleyendoelregistroRCREG.
9.
SiocurrialgnerroresteselimpiaallimpiarelbitCREN,elcualdebervolveraponersesisedeseacontinuarlarecepcin.
ConfigPICpermiteseleccionaralgunosparmetrosparaconfigurarelmduloUSARTdelpic,ygenerarelcdigodeayuda
Veamosunejemplo.EnestecasousandoelmduloUsartdelPIC16F628Aylainterrupcinquegeneraelmismoalrecibirundato
haremosunejemplodondeesperamosdatodesdePC,lorecibimosyloreenviamosinmediatamente:
Hardwarenecesario:
58
Cdigo:
59
Comparadoresanalgicos+Ejemplo
Enestaentregaanalizaremoslosmdulosdecomparacinanalgicaytensindereferencia.Estosmdulosestnpresentesen
elPIC16F628AperonoenelmicrocontroladorPIC16F84A,porloquesetratadeuntemacompletamentenuevoenestaserie.Como
versacontinuacin,esuntemamuyimportanteyextenso,porloqueseguramentedeberemosdividirloen3o4entradas.
ElMduloComparador:
DisponededoscomparadoresanalgicosC1yC2cuyasentradaspuedenserseleccionadasentrelospinesRA0aRA3ycuyassalidas
puedenutilizarseparalecturadigitalinternaobienconectarseadospinesdesalida:RA4yRA5.Tambinpodraserposibleemplearun
niveldetensinconfigurableygeneradoporotrobloque,eldenominadoMdulodeReferenciadeTensin.
Elmultiplexadoparalaseleccindelasentradasacompararylassalidasagenerardependedelregistrodecontroldecomparacin
CMCON(0x1F).
Existen8configuracionesposiblesdeentradasysalidasdecomparacinqueseseleccionanconlos3bitsmenossignificativos(CM2
CM1CM0).EnesemismoregistrosepuedenleerlosestadosenlasalidadecadaunodeloscomparadoresC1yC2ysisedeseainvertir
onolalgicadelresultadodelacomparacinqueaparecealasalida.
RegistroCMCOM
Bit7.
C2OUT:BitdesalidadelComparador2.
CuandoC2INV=0:
SiC2Vin+>C2Vin=1
SiC2Vin+C2Vin=0
SiC2Vin+C1Vin=1
SiC1Vin+C1Vin=0
SiC1Vin+
Bit5.
C2INV:BitdeinversindelasalidadelComparador2.
1=C2Salidainvertida.
0=C2Salidanoinvertida.
Bit4.
C1INV:BitdeinversindelasalidadelComparador1.
1=C1Salidainvertida.
0=C1Salidanoinvertida.
Bit3.
CIS:SelectordepindeentradaalComparador.
CuandoCM<2:0>=001:
1=C1VinconectadoaRA3.
0=C1VinconectadoaRA0.
60
CuandoCM<2:0>=010:
1=C1VinconectadoaRA3.C2VinconectadoaRA2.
0=C1VinconectadoaRA0.C2VinconectadoaRA1.
Bit20.
CM<2:0>:bitsdeseleccindeconfiguracindelosComparadores.
61
MododeTrabajodelosComparadores:
SilaentradaanalgicaVIN+esmayorquelaentradaanalgicaVIN,entonceslasalidadelcomparadorserunestadodigitalalto
SilaentradaanalgicaVIN+esmenorquelaentradaanalgicaVIN,entonceslasalidadelcomparadorserunestadodigitalbajo
Lasreassombreadasdelasalidadelcomparadorenlafigurarepresentanlaincertidumbredebidoatensionesdedesviacinytiempo
derespuesta.
ReferenciasdeComparacin:
Lareferenciadetensinparalacomparacinpuedeser:
Externa:seconectaracualquieradelospinesdeentradaexternosdelcomparadoryesatensindeberestarcomprendidaentreVDDy
VSS
Interna:sepuedeemplearunareferenciadetensingeneradaanivelinternoporpartedeunmdulointernoespecficopresentedentro
delmicrocontroladorcuandoseconfiguranlosbitsCM<2:0>conlacombinacin110
MdulodeReferenciadeTensinparaComparacin:
Setratadeundivisorresistivoapartirdelatensindealimentacindelmicrocontrolador.
RegistroVRCON(9Fh):
VR<3:0>Seleccindelatensindereferencia:
SiVRR=1:Vref=(VR<3:0>.Vdd)/24
SiVRR=0:Vref=(Vdd.1/4)+(VR<3:0>.Vdd)/24
InterrupcionesdelMdulodeComparacin:
ElmdulodecomparacinpuedegenerarunainterrupcinporactivacindelflagCMIF(FlagdeInterrupcindelComparador)presente
enelregistroPIR1.ElflagCMIFsepondra1siseproduceuncambioenlasalidadecualquieradelosdoscomparadores
(C1OUToC2OUT)desdelaltimalecturaqueserealizdelregistroCMCON.
Elflagdebeponerseaceroporsoftwareperoademsdeberealizarsepreviamenteunaoperacindelectura(oescritura)delregistro
CMCONparaquedejededarseladiscrepanciaentreelvaloractualyelvalorledo.Paraqueseproduzcalainterrupcindeben
encontrarseactivadaslamscaraparticular(CMIEenPIE2),ladeperifricos(PEIE)ylaglobal(GIE).
CaractersticaespecialdelMduloComparador:
Siuncomparadorseencuentraactivoysesitaalmicrocontroladorenmododebajoconsumo(SLEEP),elcomparadorpermanecer
activoylasinterrupcionessiestnactivadasmediantesusmscarassernfuncionalesypodrnsacaralmicrodesumododebajo
consumosicambialasalidadealgunodeloscomparadoresdesdelaltimalectura.
62
ConfigPICpermiteseleccionarlaconfiguracindelmdulocomparadoranalgicoytensindereferencia,generandoelcdigode
configuracin.
Amododeejemploconectaremosunpotencimetroalcomparador1,fijandounatensindereferenciainternaa3.59Volteinvirtiendo
lasalidadelcomparador.CuandolatensinsobreelpinRA0(C1Vin)seamayora3.59Voltharemostitilarunled10vecesamodode
alarma.
Hardwarenecesario:
DiagramadeFlujo:
63
Cdigo:
64
IntroduccinMduloCCP
ElprimermduloqueveremosendetalleeselMduloCCP.LosmicrocontroladoresPIC16F628A/648Adisponendeunmdulode
Captura/Comparacin/PWMqueenconjuntoconlostemporizadores,permiterealizarenformasencillalastareasdemedicinde
tiempoyfrecuencia,ygeneracindesealesdigitales.Contresmodosdefuncionamientoqueveremosenprofundidadapartirdeesta
entrega.
MduloCCP
LosmicrocontroladoresPIC16F628A/648AdisponendeunmdulodeCaptura/Comparacin/PWMqueenconjuntoconlos
temporizadores,permiterealizarenformasencillalastareasdemedicindetiempoyfrecuencia,ygeneracindesealesdigitales.
ElmduloCCPtiene3modosdefuncionamiento,quesedescribenacontinuacin:
Modocaptura:PermitecapturarelvalorquetieneenregistroTMR1cuandoocurreuneventoespecialenlaterminalRB3/CCP1.
Modocomparacin:Permitecompararelvalorde16bitsdelTMR1conunvalorpreviamentedefinidoenlosregistrosCCPRL1Hy
CCPR1L
ModoPWM:Permitegenerarsealesdigitalesmoduladasenanchodepulso
Acontinuacinsedaunbreveresumendelosregistrosrelacionadosconcadamdulo:
Elregistroprincipaldeestemdulosecomponededosregistrosde8bits,denominadosCCPR1H(16h)(partemssignificativa)yCCPR1L
(15h)(partemenossignificativa).LaoperacindelmdulosecontrolamedianteelregistroCCP1CON(17h)yeldisparodeevento
especial,elcualesgeneradoalalcanzarselaigualdadenunregistrodecomparacinresetearelTimer1.
Seleccindelmododeoperacin:
LaseleccindelmodoenquetrabajaraelmduloCCPserealizamedianteloscuatrobitsmenossignificativosdelregistroCCP1CON,es
decir,mediantelosbitsCCP1M3:CCP1M0(CCP1CON<3:0>)deacuerdoalosiguiente:
0000Captura/Comparacin/PWMdeshabilitados
0100Capturacadatransicindebajada
0101Capturacadatransicindesubida
0110Capturacadacuartatransicindesubida
0111Capturacada16transicionesdesubida
1000Comparacin,ponesalidacadacoincidencia
1001Comparacin,limpiasalidacadacoincidencia
1010Comparacin,generainterrupcincadacoincidencia(SeseteabitCCP1IF,salidainalterada)
1011Comparacin,disparaeventoespecial(SeseteabitCCP1IF,reseteaTMR1(TMR1IFinalterado))
11xxModoPWM
ElMododeCaptura:
EnelmododecapturaelregistroCCPR1(CCPR1H:CCPR1L)capturaelvalorde16bitsregistroTMR1cuandoocurreuneventoenla
patitaRB3/CCP1.Eleventoencuestinpuedeespecificarsepreviamentecomoalgunodelossiguientes:
65
Cadatransicindebajada
Cadatransicindesubida
Cadacuartatransicindesubida
Cadadieciseisavatransicindesubida
AdemsdequeelvalordeTMR1escapturado,labanderadesolicituddeinterrupcinCCP1IFesactivada,lacualdeberserlimpiadapor
softwareparapoderdetectarlasiseestconsultandoporpoleo.
EltipodeaccinquesedeseadetectarenestapatitaseconfiguramediantelosbitsdecontrolCCP1M3:CCP1M0(CCP1CON<3:0>).Si
ocurreotroeventodecapturaantesdequehayasidoledoelregistroCCPR1,elvalorcapturadoanteriorseperder,yaqueconlanueva
capturaesteregistroesreescrito.
EnlafigurasiguientesemuestraundiagramadebloquesendondeseilustralamaneraenquetrabajaelmduloCCPenmodode
captura:
ElpreescaladordelCCP:
ElvalordelpreescaladorseconfiguramediantelosbitsCCP1M3:CCP1M0.Sinembargo,alrealizaruncambioenlaconfiguracindel
preescaladorsepuedegenerarunainterrupcinfalsa,paraevitarloanteriorsedeberapagarelmduloCCP(limpiandoel
registroCCP1CON)previamentealcambiodevalordelpreescalador.
EstepreescaladoresindependientealpreescaladordelTimer1(elcualpuedeusarsecomoyaseexplicconsusposiblesdivisoresde
1/1,1/2,1/4,18).
Configuraciones:
SedebeconfigurarelCCP1comoentradaatravsdelregistroTRISB.
ElTimer1debeestarenmodotemporizadoromodocontadorsincronizado
Alcambiarelmododecapturahayquetenerinhabilitadaslasinterrupcionesyborrarelflagparaevitarinterrupcionesespreas.
SielpinRB3/CCP1esconfiguradocomosalida,sedebertenerencuentaqueunaescrituraalpuertoBpuedecausarunacondicinde
captura.
Ejemplo:
ParaejemplificarelusodelmduloCCPenmodocapturavamosarealizarlamedidadelperiododeunaondacuadradaparaas
determinarsufrecuencia.Laformadetrabajarvaaserlasiguiente:
ConfiguramosCCPmodocapturaconcadatransicindesubidadelpinRB3/CCP1conTimer1modotemporizador1/1.
Alllegarunflancoascendente,reseteamosTimer1yesperamosalsiguienteflancoascendente,enelcualseguardaelvalorcapturadoy
loenviamosalaPCparapoderdeterminarlafrecuenciadelaseal.Loquehemoscapturadoeslacantidaddeciclosdereloj
transcurridosenunciclodelasealamedir.ConestevaloryelToscalcualtrabajaelmicrocontroladorpodemosdeterminarelperiodo
delaseal.
Periodo(s)=(4/20MHz).CCPR1
Frecuencia(Hz)=1/Periodo
66
Conuncristalde20MHzpodemosmedirdesdeaprox.77Hzhastalos500kHz,claroqueamsfrecuenciamserrorenlasmediciones.
Porejemplo,conalgunosensayosqueherealizadoa1kHzsetieneunerrorde+1Hz,10kHz+5Hz,100kHz+0.5kHz,200kHz+2kHz,
etc.
ParadeterminarlafrecuenciaadjuntounprogramitahechoenVisualBasicquetoma10valoresenviadosdesdeelmicrocontrolador,
calculaunpromediodelperiodoydeterminalafrecuencia.Sehacedeestemodoparareducirelerrorcometidoaaltasfrecuencias
(descargalodeac)
Hardwarenecesario:
67
Cdigo:
68
ModoCaptura
Enlaentregadehoyveremoscmoutilizarelmodocomparador.Enestemodo,elmicrocontroladorPIC16F628Aaprovechaelregistrode
16bitsCCPR1(CCPR1H:CCPR1L)yelregistrode16bitsTMR1.Cuandoestosvalorescoincidensedisparaunainterrupcinquepodemos
aprovecharpararealizaralgunaaccinennuestroproyecto.Setratadeotraentregamuyimportanteenestaseriedeentradas.
ElModoComparador:
Enelmododecomparacinelregistrode16bitsCCPR1(CCPR1H:CCPR1L)secomparaconstantementeconelvalordelregistrode16
bitsTMR1.DemaneraquecuandosusvalorescoincidenademsdeactivarselabanderaparasolicitarinterrupcinCCP1IF
(PIR1<2>),puedeocurrirenlapatitaRB3/CCP1(previaconfiguracin)algunadelassiguientesacciones:
RB3/CCP1Seponeenalto
RB3/CCP1SeponeenBajo
RB3/CCP1nocambia
LaaccinqueocurraenestapatitaseconfiguramediantelosbitsdecontrolCCP1M3:CCP1M0(CCP1CON<3:0>).Enlafigurasiguientese
muestraundiagramadebloquesendondeseilustralamaneraenquetrabajaelmduloCCPenmodocomparador,
Configuraciones:
ElpinRB3/CCP1debeconfigurarsecomosalidalimpiandoelbitTRISB<3>
ElTimer1debeestarcorriendoenmodotemporizador(oenmodocontadorsincronizado)
AllimpiarelregistroCCP1CONellatchdesalidadelapatitaRB3/CCP1seforzaasuvalordefaultdecero.
EnelmodointerrupcinsoftwarenoserealizaningunaaccinenelpinRB3/CCP1.
ElmodoSpecialEventTriggerocurreinmediatamentealigualarseelparderegistrosTMR1H,TMR1Lalparde
registrosCCPR1H,CCPR1L.ElparderegistrosTMR1H,TMR1LnosereseteanhastaelprximoflancoascendentedelclockdeTimer1.
EstopermitequeelregistroCCPR1seaunregistrodeperiodoprogramableparaelTimer1
Ejemplo:
Enesteprogramasehaceusodelmododecomparacinpararealizarlaconmutacindeunasealcadavezquetranscurreuntiempo,el
cualseajustaaloprimirunpulsadordeincrementoounodedecremento.
69
Hardwarenecesario:
Cdigo:
70
ModoPWM
HoyveremoselModoPWM(ModulacindeAnchodePulso).Esteimportantemodoeselquenospermite,porejemplo,modificarla
intensidadconlaquebrillaundiodoLEDogenerarunaondadesalidaconfrecuenciavariable,permitiendoalgunasaplicacionesque
aprioriparecenimposibles,comohacerhablaraunPIC.Porlopronto,antesdellegarasemejanteniveldesofisticacinveremoslos
principiosbsicosdelPWMyalgunosejemplos.
ModoPWM(ModulacindeAnchodePulso)
Conestemododetrabajoseconsiguenimpulsoslgicoscuyaanchuradelnivelaltoesdeduracinvariable,quesondeenorme
aplicacinenelcontroldedispositivostanpopularescomolosmotoresytriacs.
ElpinRB3/CCP1estaconfiguradocomosalidaycambiaentrelosniveles0y1aintervalosdetiemposvariables,lograndounpulsocuyo
nivelaltotieneunanchovariabledentrodelintervalodelperiododetrabajo:
ModoPWM
LabasedetiemposeselTimer2msdosbitsadicionalesparatenerlos10.
ElperiodosedeterminaconelregistroPR2,yaquecuandoTMR2=PR2:
SeborraelTMR2
Seponea1elpinCCP1
SepasaelvalordelCCPR1LalCCPR1H(paraevitarglitch)
71
Deestamanera,deacuerdoalafiguraanterior,elsiguientevalordecomparacinparaTMR2enelcomparadorde10bitseselCiclode
Trabajo,elcualalalcanzarselimpiarlapatitaCCP1.
ElciclodetrabajosedeterminaconelcontenidodelCCPR1LylosdosbitsdeCCP1CON(CCP1XyCCP1Y).
PeriododelPWM:
PeriodoPWM=(PR2+1).4.Tosc.TMR2Preescaler
FrecuenciaPWM=1/PeriodoPWM
CiclodeTrabajodelPWM:
ElciclodeTrabajoseespecificaescribiendounvalorde10bitsalregistroCCPR1L(los8bitsmssignificativos(msb))ylosdosbitsmenos
significativos(lsb)aCCP1CON<5:4>:
CTPWM=(CCPR1L:CCP1CON<5:4>).Tosc.TMR2Preescaler
Comosepuedeverenlafiguraanterior,elvalorquedeterminaladuracindeC.T.delPWMnoeselcargadoenCCPR1L,sino
enCCPR1H,elcualsloseactualizaenelmomentoenqueTMR2alcanzaelvalordePR2(esdecir,cadavezquesecompletaunperiodo).
Porello,aunqueCCPR1Lpuedeserescritoencualquiermomento,elCiclodeTrabajosoloseactualizahastaqueterminaelperiodoque
estentranscurso.
NohayotramaneradeescribiralregistroCCPR1H,yaqueesteesunregistrodeslolectura.
ElnmerodedivisionesquesepuedentenerenunCiclodeTrabajoser2^n,dondeneselnmerodebitsusados,porlotantosu
duracinmximaser:
CTPWM=2^n.Tosc.TMR2Preescaler
Sinembargo,dependiendodelvalordeCiclodetrabajomximo(CT_PWM)deseado,noserposiblerealizarlas2^ndivisionesyporlo
tantonosepodrnusarlosnbitsderesolucin.Oalrevs,siseeligeunaresolucindeseadannoserposibletenercualquierCiclode
Trabajomximo(CT_PWM)Deseado.
Delaecuacinanteriorsepuededespejarcualeslaresolucinmxima:
72
ResolucionPWM=log(CTPWM/Tosc.TMR2Preescaler)/log(2)
Veamosconunejemplo,sifijamosPR2en100yusamospreescaler1/4conunosciladorde20MHz,tendremosunPWMdeperiodo
80.8us.Elciclodetrabajonopuedesuperarestevalorporloquedespejandodelasecuacionesanteriores,CCPR1L:CCP1CON<5:4>no
puedesermayora404.Aquseveclaramentequenosepuedenusarlos10bitsderesolucin,sino8.66bits.Casocontarioel
pinRB3/CCP1nuncaserreseteado.
EnlasiguientetablaseresumendiversaseleccionesderesolucinnylacorrespondientefrecuenciaF_PWMmxima,ascomoelvalor
dePR2conelqueselogra(paraunfrecuenciadelcristalde20Mhz):
SecuenciadeconfiguracindelPWM:
AcontinuacinseresumenlospasospararealizarlaconfiguracininicialdelPWM:
EstablecerelperiododelPWMescribiendoalregistroPR2.
EstablecerelCiclodeTrabajodelPWMescribiendoalregistroCCPR1LyalosbitsCCP1CON<5:4>.
ConfigurarcomosalidaelpinCCP1,limpiandoelbitTRISB<3>.
ConfigurarelpreescaladordelTimer2yhabilitarelTimer2,escribiendoalregistroT2CON.
ConfigurarelmduloCCP1paraoperacinPWM.PoniendoenaltolosbitsCCP1CON<2:3>.
ComoejemplogeneraremosdosfrecuenciasdistintasseleccionablesmediantelaaccindeunpulsadorconectadoraRB0.Unadelas
sealesserde500Hzylaotrade2kHz,conciclodetrabajode50%.
Conosciladorde4MHzypreescaler1/16tendremos:
Sealde500HzPR2=124(0x7C)CCPR1L&2bits=250(0xFA)CCPR1L=0x3E&2bits=10
Sealde2kHzPR2=30(0x1E)CCPR1L&2bits=62(0x3E)CCPR1L=0x0F&2bits=10
Hardwarenecesario:
73
Cdigo:
Veamosotroejemplo:
EnestesefijalafrecuenciadePWMen2kHzysevaraelciclodetrabajocon2pulsadoresdecontrolconectadosaRB0yRB1.Solose
modificaenbytealtodelCT,seaelregistroCCPR1LconloqueCTsevarade4en4.
74
Hardwarenecesario:
Cdigo:
75
Registrodedesplazamiento74LS164N
Enalgunaoportunidadhemoshabladodelaimportanciadelosregistrosdedesplazamientoalahoradecontrolardisplays.Esque
graciasaestosintegradossepuedeevitaralmicrocontroladorlatareadeactualizarconstantementeelestadodelosmismos,yaqueel
registrodedesplazamientoseencargademantenerencendidoslossegmentosqueseannecesarios.Enestaentregaveremoscmo
realizaresecontrolconelpopularchip74LS164.
ControldeDisplayscon74LS164
Aqurealizounnuevoejemplodemanejodevariosdisplaysde7segmentos.Enestecasorealizaremoselcontrolde3displaysconla
ayudadelregistrodedesplazamiento74LS164.LasventajasqueconllevaelusodeesteCIesquenonecesitaremosmultiplexarlaseal
enviadaalosdisplays,algoquelimitamuchoalmicrocontrolador,yaquedeberefrescarloscontinuamente.Y,obviamente,ladesventaja
esquenecesitaremosun74LS164porcadadisplay.
Hardware:(lospines7y14del74LS164vanaGNDy5V,ysedebeagregarunaresistenciaacadalneaqueuneel74LS164coneldisplay)
76
Conestecircuitosepuedenmanejar3displays+los3puntos.Elprimerbitqueingresaserempujadoporlosdems.Ejemplopara
enviar12.7:
Cdigo:
77
78
ComohacerCarteldeLEDs732.
Conestaentregafinalizamoslasegundapartedeestetutorial.Alolargode25entradashemosvistotodolonecesarioparapoder
programarprcticamentecualquieraplicacinutilizandolospopularesmicrocontroladoresPIC16F84AyPIC16F628A.Nosdespedimos
conlaexplicacindeloqueparamuchosesunproyectomuyinteresante:lacreacindeuncarteldeLEDsquepasamensajes.
CarteldeLedsenASM
Paramostrarunejemplosencillovamosausarunatablaparaguardarelmensajeamostraryunasolavariable(8bits)paraindicarel
largoycontroldelaposicinaenviar.Porelloellargodelmensajeestarrestringidoa255bytesquesereducenen6porlaposicinde
latablaenlamemoriadeprograma.
Laformadeguardarcadaletradelmensajeserlasiguiente:
Cadabyteindicaunacolumnadelaletra,dondeun0esledapagadoy1ledencendido.
Nota:Esunaformadehacerlo,lacuallaaprenddelamigoBrunoFenunodesustantosaportes
Luegoelmensajepuedesermayoralcartelutilizadoparamostrarloasqueesnecesarioefectuarundesplazamientodelmensajesobre
elcarteloloqueeslomismodesplazarelcartelsobreelmensaje.
Paraelloseutilizarunavariablequeindicalaposicininicialdentrodelmensaje,enlacualcomienzaamostrarseenelcartel.Como
deseamosqueelmensajesearotativoelproblemasepresentaenlasltimasposicionesdondesedebemostrarlapartefinaldel
mensajeyempezaramostrarelinicio.Loquehacemosesdividiren2laformademostrarelmensaje,cuandoPosicinInicial+Largodel
CartelseamenoraLargodelmensajeycuandoseamayor:
79
Bueno,msomenossehaexplicadocomovamosatrabajarconelmensaje,ahorasedebeentendercomovaafuncionarel
multiplexadodelosleds.Vamosarealizarlamultiplexacinporfilas,seaquevamosaseleccionarunafilayvamosaactualizarsus
valorespormedioderegistrosdedesplazamientos.Eltiempodeactualizacinnodebesuperarlos20ms!
Paraactualizarusaremosunavariablequeindiquequefilahadeactualizarse,porejemploparaactualizarlafilaunolavariableFilaActual
ser00000001.Ahoraparasaberquevalorestenemosquemandaralosregistrosdedesplazamientoiremostomandocadaunadelas
columnas(PosicionEnviar)aactualizar,aremosunANDconFilaActualydeterminaremossienviarun1oun0.
(PosicionEnviar(AND)FilaActual)=FilaActual?
Si>Enviamosun1
No>Enviamosun0
Hardwareparasimulacin:
80
Cdigo:
81
82
83
Consideracionesparaconstruccinreal:
ParalaconstruccinrealsedebeagregarlapartedepotenciadadoqueelPICysegnelregistrodedesplazamientoqueseutiliceno
soncapacesdemanejarlascorrientesnecesarias,paraellosecolocantransistoresparaelcontroldelasfilasyseagrega
elULN2803/2003enseriealosregistrosdedesplazamiento,unaformadehacerloseralasiguiente:
Ycambiarrutinadeefectivizara:
84
Otraforma:
Otraforma
Perodebentenerencuentaqueparaencenderunledsedebeenviaralregistrodedesplazamientouncero.
85
El CP, har esas tareas sin negarse y lo har fielmente a lo que est escrito. Por lo que, si hace una
tarea mal, es porque le pusimos una o ms instrucciones mal.
Si bien, el CP har lo que nosotros le pidamos, el CP nos pide que respetemos algunas cosas. Estas
cosas, dependern de cada microcontrolador y que debemos saber para poder programar en forma
correcta al PIC.
Y la cuarta columna, se llama OBSERVACIONES y sirve solo para el programador, o sea, el usuario
que est programando el PIC. En otras palabras, a nosotros. Siempre comienza con ; (punto y
coma)
Si no sirve para el PIC, Para qu complicarla ms? Todo lo contrario, es para ayudar al programador
de que no se olvide que intent hacer.
Todos los lenguajes, desde los ms bsicos hasta los ms avanzados, tienen esta caractersticas ya
que en el pondremos que es lo que queremos hacer o explicar el programa. Si bien, estas
observaciones se utilizan en la cuarta columna, no es obligacin colocarla en esta columna, si no que
puede ir al margen de la planilla en dnde estamos programando. Y es aqu dnde explicaremos la
porcin de una rutina para entenderlo ms adelante.
Bien, veremos a continuacin, como se escriben las columnas:
ETIQUETAS
INSTRUCCIN
OPERANDO
;OBSERVACIONES
INSTRUCCIN
OPERANDO
;OBSERVACIONES
Como notarn, en las cuatro columnas, hay nombres. Estos nombres son todos los registros que
posee este PIC. Vern que hay registros que se repiten. No quiere decir que estn duplicados,
triplicados o cuadriplicados, si no que se puede acceder a ellos no importa en qu banco estemos
trabajando. (Ya lo entendern, no se preocupen).
Cada vez que se programe el PIC y se necesite trabajar con uno de estos registros, se debe acceder al
banco que est dicho nombre. Es por eso, que esta tabla es muy importante a la hora de trabajar.
Aprovechando que sub esta tabla del pic, cuando de ejemplos de programacin, ser sobre este pic.
Microchip provee en forma gratuita estos Datasheet. Y hay uno por cada PIC. Por lo que si no tienen
este Datasheet, descrguenlo de la pgina de Microchip. Cuando empecemos a programar, lo
necesitarn.
Uno de los registros muy utilizado, es el registro de trabajo W, el cual, se utiliza para mover un
dato/valor de un registro a otro, cargar valores en un registro, y con la ayuda de la ALU puede hacer
operaciones matemticas.
Observen con atencin el diagrama de bloque dnde se encuentra W
encuentro?
El registro W no est implementado en la memoria RAM, ni en la posicin 0x00 ni en otra posicin.
W es un registro independiente que tiene un bus directo con la ALU (un camino privado). La ALU es la
nica entidad que puede leer o escribir este registro de trabajo.
El direccionamiento indirecto hace uso de los registros FSR e INDF. INDF es completamente ajeno a
W. Un direccionamiento indirecto usa el registro FSR como apuntador al contenido de otros
registros. Cualquier instruccin que hace uso de INDF (0x00) como direccin invoca un
direccionamiento indirecto.
Los microcontroladores PIC, poseen tres tipos de memorias.
Memoria de Programa: Es la ubicacin fsica dnde se guarda el firmware que hemos creado, o
sea, nuestro programa. Y tiene un ciclo de 100.000 de lectura y/o escrituras antes de estropearse
y es del tipo FLASH.
Memoria de datos de uso general: Es la memoria RAM del PIC. Recordemos, que los registros
estn sobre la memoria RAM y la memoria de uso general, comienza despus de los registros.
Memoria de datos EEPROM: Puede almacenar datos ms de 40 aos sin energa y 1.000.000 de
ciclos de escritura y lectura
El PIC 16F877, tiene una memoria de programa de 8Kb por un ancho de 14 Byte, o sea que cada
posicin de memoria tiene 14 bytes (B'11111111111111', o H'3FFF') Cada lnea de instruccin ocupa
una posicin en la memoria de programa, as que, podemos poner hasta 8.192 instrucciones.
La RAM de uso general (ms los registros) trae 368 bytes con un ancho de 8 bytes (B'11111111', o
H'FF'). Esto quiere decir, que tenemos 368 posiciones para nuestro uso.
La EEPROM trae 256 bytes con un ancho de 8 bytes. Tenemos 256 posiciones para nuestro uso.
Ahora, vamos a estudiar el registro STATUS y luego continuaremos con las instrucciones.
Registro STATUS
Si entendieron hasta ac, se acordar que los registros poseen un ancho de 8 bytes. Cada byte,
puede contener un 1 o 0.
Vemos ahora en detalle el registro STATUS:
Este registro, tiene 3 Bytes dedicado para las operaciones matemticas, 3 bytes dedicado al cambio
de banco de memoria y 2 bytes dedicado para saber qu o quin produjo un Power Up (despertar del
micro). Y se puede leer y escribir en l (cambiar datos).
Los analizamos desde el ms significativo (MSB) hasta el menos significativo (LSB).
BIT 7:
Se llama IRP y sirve para el direccionamiento indirecto para cambiar el banco de memoria.
1 = Banco 2 y 3
0 = Banco 0 y 1
BIT 6 y BIT 5
Se llaman RP1 y RP0 respectivamente. Sirve para el direccionamiento directo para cambiar de banco
de memoria.
00 = Banco 0
01 = Banco 1
10 = Banco 2
11 = banco 3
BIT 4
Se llama TO (neg). Este bit se utiliza para saber quin despert al PIC.
1 = Despus que despierta (Power up) o por las instrucciones CLRWDT o SLEEP, se pone a 1 este bit.
0 = Se pone a 0 cuando el Watchdog o en castellano perro guardin (WDT) despierta al PIC.
BIT 3
Se llama PD (neg). Este bit se utiliza para saber si el pic estaba durmiendo.
1 = Despus de que despierta (Power up) o por la instruccin CLRWDT, se pone a 1
0 = Se pone a 0 cuando se ejecuta la instruccin SLEEP
BIT 2
Se llama Z y al igual que los dos bytes anteriores, es una bandera. Nos indica el resultado de una
operacin aritmtica y lgica.
1 = La operacin aritmtica o lgica dio como resultado 0
0 = La operacin aritmtica o lgica no dio como resultado 0
BIT 1
Se llama DC. Digit carry/borrow (dgito llevar/prestar). Es afectado por las instrucciones ADDWF;
ADDLW; SUBLW; SUBWF (Para la resta, la polaridad es inversa).
1 = Hubo un acarreo del 4to bit menos significativo al 5to bit.
0 = No hubo un acarreo del 4to bit menos significativo al 5to bit.
BIT 0
Se llama C carry/borrow. Es afectado por las mismas instrucciones que afectan al bit DC.
1 = Hubo un acarreo del bit ms significativo (Bit 7) o sea cuando se excede de H'FF'
0 = No hubo acarreo del bit ms significativo
Si alcanzan a ver en la imagen, vern que algunas instrucciones afectan al registro STATUS y otras no.
Las instrucciones
Les voy a arruinar el momento de alegra. Las instrucciones hay que estudiarlas de memoria. Si,
leyeron bien, de memoria. Lo que tienen que saber sobre las instrucciones, es como se escriben, que
hace cada instruccin y lo ms importante que bit del REGISTRO afecta. Vamos a ir vindolo por
orden alfabtico. Y otra cosita ms, como es de esperarse, estn en INGLES o son abreviaturas pero
en INGLES. Recordemos que: .123 o D'123' es en decimal; 0x7B o 7Bh o H'7B' es en Hexadecimal;
B'01111011' es en binario.
ADDLW
Suma un valor designado por el programador al registro W
Cdigo:
ADDLW
.128
Si W tena cargado un valor = .5, despus de la instruccin W tiene cargado el valor .133
Para recordar, ADD es sumar, L es Literal y W es el registro W
Afecta a:
Z Se pone a 1 si la operacin es 0
DC Se pone a 1 si hubo un acarreo del bit 3 al 4
C Se pone a 1 si hubo desbordamiento, o sea, cuando se supera H'FF'
ADDWF
Suma el valor del registro W con el valor de un registro cualquiera. El destino de esta suma, lo elige el
programador.
Cdigo:
ADDWF
TEMP,W
Si W tena guardado .133 y la posicin de la RAM llamada TEMP tena el valor cargado con .2, W vale
.135 y TEMP contina valiendo .2
Ahora si hubiera puesto as:
Cdigo:
ADDWF
TEMP, F
ANDWF
Realiza la operacin AND entre W y un registro designado por el programador. El destino de esta
operacin lo elige el programador.
Cdigo:
ANDWF
TEMP, F
BCF
Pone a 0 el bit de un registro. El bit debe ser indicado por el programador.
Ejemplo:
Cdigo:
BCF
TEMP, 2
Antes de la instruccin TEMP vale B'11111111'. Despus de la instruccin TEMP vale B'11111011'
Para recordar, Bit Clear es borrar File es archivo o registro
No afecta ningn bit del registro Status.
BSF
Pone a 1 el bit de un registro. El bit debe ser indicado por el programador:
Cdigo:
BSF
TEMP, 0
Antes de la instruccin TEMP vale B'01110110'. Despus de la instruccin TEMP vale B'01110111'
Para recordar, Bit Set es poner a 1 File Archivo o registro
No afecta a ningn Bit del registro Status.
BTFSC
Salta un lnea si el bit de un registro es cero. El bit debe ser indicado por el programador.
Ejemplo:
Cdigo:
BTFSC TEMP, 5
BCF
PORTA, 0
BSF
PORTB, 0
Caso 1:
TEMP vale B'00011110'. El CP analizar solo el Bit 5 del registro TEMP, como es 0, salta la instruccin
BCF PORTA, 0 y ejecuta la siguiente lnea que es BSF PORTB, 0 y continua haciendo la instruccin.
Caso 2:
TEMP vale B'00111000'. El CP analizar solo el Bit 5 del registro TEMP, como es 1 no salta la
instruccin y har la instruccin BCF PORTA,0 y luego continua con la instruccin BSF PORTB,0
Para recordar Bit Test es chequear File Skip es salto Clear
No afecta a ningn Bit del registro Status.
BTFSS
Salta una lnea si el bit de un registro es 1. EL bit debe ser indicado por el programador.
Cdigo:
BTFSS TEMP, 3
ADDWF PORTC
ANDWF NODO
Caso 1:
TEMP vale B'01101100'. El CP analizar solo el Bit 3 del registro TEMP, como es 1, salta la instruccin
ADD PORTC y ejecuta la siguiente lnea que es ANDWF NODO y contina haciendo la instruccin.
Caso 2:
TEMP vale B'11110000'. El CP analizar solo el Bit 3 del registro TEMP, como es 0 no salta la
instruccin y har la instruccin ADD PORTC y luego contina con la instruccin AND NODO.
Para recordar Bit Test es chequear File Skip es salto Set
No afecta a ningn Bit del registro Status.
Normalmente, continuando las instrucciones BTFSS y/o BTFSC va un GOTO o CALL pero no la he
puesto porque an no se explicaron estas instrucciones.
CALL
Se dirige a una direccin de la memoria de programa designado por el programador. En otras
palabras, se utiliza para dirigirse a una rutina o tarea. Su principal ventaja es que una vez que finaliz
la tarea, vuelve al punto siguiente desde dnde se llam.
Cdigo:
CALL
ESC_PORTB
GOTO
Se dirige a una direccin de la memoria de programa designado por el programador. En otras
palabras, se utiliza para saltar instrucciones que no queremos que se ejecuten. A diferencia de la
instruccin CALL, no hay forma de volver cuando se ejecuta la instruccin.
Cdigo:
GOTO
INICIO
Para recordar GO TO es ir a.
No afecta a ningn bit del registro Status.
Extendiendo la explicacin
En la siguiente imagen, vemos el diagrama de bloques del PC o CP.
El PC es de 13 bits en este caso(8kwords). 14 son los bits de cada "word" o instruccin que se graban
en cada posicin de la FLASH (memoria de programa).
El PC se reparte en: sus 8 bits de menor peso en el registro PCL, y los 5 restantes en el registro
PCLATH.
Los PICs al tener un set de instrucciones reducido no puede en una sola instruccin meter todos los
bits necesarios para direccionar toda su memoria.
EL program counter son 2 registros, el PChigh y PCLow. Cuando haces un CALL o un GOTO, solo se
rellenan 11 bits (los 8 del PClow y 3 del PChigh) y los dos restantes los rellenas con el PCLATH (para
completar los 13bits).
El STACK (pila) tiene toda la direccin, no solo parcial. Si haces un call desde la pgina 0 a la pgina
3 y luego un return el cdigo SI volver a la pgina 0, pero el PCLATH sigue apuntando a la pgina 3,
entonces si usas otro goto o call, debes tener en cuenta de modificar el PCLATH.
Entonces, dijimos que:
El PC = ProgramCounter o CP = Contador de Programa, tiene 13 bits; del 0 al 12.
Al ejecutar un call o un goto, se copian del 0 al 10, y los otros 2 bits se copian del registro PCLATH.
El pclath solo estar all para esa situacin.
En un return o retfie la microelectrnica del PIC, pega la direccin del PC que estaba guardada.
Lo vemos con un ejemplo
1.
STACK = vaco
PC = 0x00A0
PCLATH = 0b000011000
Ejecutas un CALL 0x230
2. El STACK tiene en su posicin 0 la direccin 0x00A0.
PC = 111000110000
Mal:
org 0x000
movlw 0x01
call tabla
org 0x300
tabla
addwf PCL,F
retlw 0x03
retlw 0x01
retlw 0x0F
Bien:
org 0x000
movlw 0x03
movwf PCLATH
movlw 0x01
call tabla
org 0x300
tabla
addwf PCL,F
retlw 0x03
retlw 0x01
retlw 0x0F
Mejor:
org 0x000
pageselw tabla
movlw 0x01
call tabla
org 0x300
tabla
addwf PCL,F
retlw 0x03
retlw 0x01
retlw 0x0F
Pageselw es una instruccin del MPASM que genera dos instrucciones: un movlw literal y un movwf
PCLATH. El valor del literal es automticamente seleccionado por el ensamblador segn la etiqueta(o
posicin de memoria) que se le especifique. En el caso anterior pageselw tabla generara estas dos
instrucciones:
movlw 0x03
movwf PCLATH
Si no aseguramos que los 5 bits del PCLATH estn correctamente seteados al momento de afectar al
PCL mediante alguna instruccin (generalmente es la addwf, pero puede usarse subwf y muchas
otras) entonces el programa saltar a una posicin indeseada.
Mal:
Bien:
Mejor:
org 0x000
;Esto es pgina 0
pagesel cruzo
;automticamente seleccionar
banco
call cruzo
Pagesel es una instruccin del MPASM que genera dos instrucciones: un bcf/bsf PCLATH,3 y un
bcf/bsf PCLATH,4. El software ensamblador selecciona automticamente la instruccin bcf o bsf
segn el banco en el cual se encuentra la etiqueta(o posicin de memoria) que se le especifique. En
el caso anterior pagesel cruzo generara estas dos instrucciones:
bsf PCLATH, 3
bcf PCLATH, 4
Ya que la subrutina cruzo se encuentra en la pgina1.
Finalmente, cuando se ejecuta una instruccin CALL, se carga en el STACK el valor de la posicin
actual ms 1(es decir, se guarda en el STACK el valor PC+1). Se guardan los 13 bits, por lo que durante
las instrucciones RETURN, RETLW y RETFIE no es necesario precargar al PCLATH.
Para ms informacin, ver el esquema seccin 2.3 del Datasheet de los PIC16F87XA que habla de
cmo cargar al PC segn cada situacin.
CLRF
Borra el contenido de un registro seleccionado por el programador. La forma en que lo hace, pone en
0 los 8 bit del registro. Este registro, puede ser cualquiera de la posicin de la RAM.
Ejemplo:
Cdigo:
CLRF
PORTB
Antes de la instruccin PORTB vale B'11000111'. Despus de la instruccin PORTB vale B'00000000'
Para recordar CLeaR es limpio File es archivo o registro.
Afecta a:Z Se pone a 1
CLRW
Borra al registro W. La forma en que lo hace, pone en 0 los 8 bit del registro.
Ejemplo:
Cdigo:
CLRW
CLRWDT
Borra al WDT. La forma en que lo hace, pone en 0 al mismo.
Ejemplo:
Cdigo:
CLRWDT
NOTA: El WDT o el contador perro guardin, sirve para destrabar al PIC. Cada vez que se desborda, o
sea, cada vez que pasa de H'FF' a H'00', produce un reset, y como es un reset, se dirige a la posicin
0h de la memoria de programa.
La forma de trabajar con l, es ir poniendo en lugares estratgicos la instruccin ya explicada, de esta
manera evitamos el desborde del contador. Si el CP se traba en algn bucle o algo similar, al no
limpiar el contador, el WDT desbordar y llevar al CP a la posicin 0h de la memoria de programa.
Muchas veces se evita de usar esta herramienta por no tener que calcular por todo el programa
dnde y cundo limpiar al WDT. Es recomendable su uso.
COMF
Realiza el complemento de un registro.
Cdigo:
COMF
TEMP, F
Si TEMP tena guardado B'00111101' luego de ejecutar la instruccin TEMP vale B'11000010'. Ntese,
que aqu tambin podemos elegir el destino y esto nos deja guardarlo en el registro W si as lo
requerimos.
Para recordar COMplement es complemento File es registro.
Afecta a:Z Se pone a 1 si la operacin da 0
DECF
Decrementa en una unidad, o lo que es lo mismo, resta 1 el contenido de un registro
Cdigo:
DECF
DECENA, W
Si antes de la instruccin DECENA vale .255, despus de la instruccin W vale .254 y DECENA vale
.255 Si por el contrario, hubiramos elegido el destino F, despus de la instruccin DECENA vale .254
Para recordar DECrement es decremento File es registro.
Afecta a:Z se pone a 1 si la operacin es 0
DECFSZ
Decrementa en uno, o lo que es lo mismo, resta en 1 el contenido de un registro y cuando este vale
0, el CP salta una instruccin
Cdigo:
LOOP DECFSZ
GOTO
BCF
TEMP
LOOP
PORTB, 0
El CP descontar en 1 el registro TEMP y evala el valor, si no es cero, ejecuta lnea siguiente que es
GOTO LOOP, el cual se dirige de nuevo a la lnea LOOP DECFSZ TEMP el cual volver a descontar en
1 y evala el valor, si es cero salta la lnea GOTO LOOP y ejecuta la instruccin BCF PORTB. Esta
ltima lnea, el programador pondr la instruccin que necesite ejecutar.
Este pequeo programa que acabamos de ver, es un temporizador o un retardo que tardar en salir
del bucle dependiendo de la frecuencia de reloj y el valor cargado en TEMP.
NOTA: Esta instruccin, tambin hay que elegirle el destino. En el caso que no se exprese, como en
este caso, el MPLAB dar por sentado que el resultado se guardar en el registro F y no en W.
Para recordar DECrement es decremento File es registro Skip es salto Zero que es cero.
No afecta ningn bit del registro STATUS.
INCF
Incrementa en 1, o suma 1, el contenido de un registro elegido por el programador.
Cdigo:
INCF
INDF, F
Si antes de la instruccin INDF vale H'29', despus de la instruccin INDF vale H'2A'. Ntese que
tambin podemos elegir el destino. Si hubiramos elegido W, despus de la instruccin W vale H'2A'
y INDF vale H'29'.
Para recordar INCrement es incremento File es registro.
Afecta a:Z se pone a 1 si el resultado es 0
INCFSZ
Incrementa en 1, o suma en 1, el contenido de un registro elegido por el programador y cuando este
es 0, el CP salta una instruccin.
Cdigo:
VOLVER
INCFSZ
CONTADOR
GOTO
VOLVER
INCF
PORTA
IORLW
Realiza la operacin OR entre W y un literal elegido por el programador. El resultado se guarda en W.
La operacin es W OR L.
Si antes de la instruccin W vale B'01110100' y el literal elegido es B'00011111', despus de la
instruccin W vale B'01111111'.
Para recordar Inclusive es inclusivo OR es la operacin binaria OR Literal es literal W es el registro
trabajo.
Afecta a:Z se pone a 1 si la operacin da 0
IORWF
Realiza la operacin lgica OR entre el registro W y un registro elegido por el programador. La
operacin es W OR F.
Cdigo:
IORWF
PORTC, F
MOVLW
Carga al registro W con un literal elegido por el programador para luego hacer una operacin
matemtica o moverlo a otro registro como veremos ms adelante. Sin duda alguna, una de las
instrucciones ms usadas en la programacin ASM.
Cdigo:
MOVLW
.255
MOVF
Mueve el contenido de un registro a otro registro elegido por el usuario.
Cdigo:
MOVF
RETARDO, W
Si antes de la instruccin W vale H'2A' y RETARDO vale H'FF', despus de la instruccin W vale H'FF'.
Ntese que aqu podemos elegir el destino, y tenemos la posibilidad de elegir el destino al propio
registro RETARDO. Al principio parece innecesario, pero se puede tomar como una verificacin, ya
que se ve afectado el registro STATUS bit Z.
Para recordar MOVe es mover y File es registro.
Afecta a:Z Se pone a 1 si la operacin es 0
Anteriormente, habamos dicho que esta instruccin se la puede tomar como verificacin, para saber
si se guard con el mismo valor que tena, el bit Z se pone a 1 si el valor es igual al que tena cargado.
MOVWF
Mueve el contenido del registro W a un registro cualquiera elegido por el programador. Sin duda
alguna, esta instruccin, es otra muy usada en la programacin ASM
Cdigo:
MOVWF
ADCON0
Si antes de la instruccin W vale B'10000001' y ADCON0 vale 0x0, despus de la instruccin ADCON0
vale 0x81.
Para recordar MOVe es mover W es el registro W y File es registro.
No afecta ningn bit del registro STATUS.
NOP
No realiza ninguna operacin. Solo consume un ciclo de instruccin.
Cdigo:
NOP
RETFIE
Carga al CP con el valor de la parte alta de la pila para volver al lugar dnde se encontraba el CP antes
de atender la interrupcin. Al mismo tiempo, pone a 1 el bit GIE para activar de nuevo las
interrupciones.
Cdigo:
RETFIE
RETLW
Carga al CP con el valor de la parte alta de la pila para volver al lugar dnde se encontraba el CP
desde dnde se llam a la subrutina y al retornar, lo hace con un literal cargado en W especificado
por el programador. Esta instruccin, se utilizan en las tablas (para ms detalle, ver la explicacin del
GOTO y CALL).
Ejemplo:
Cdigo:
RETLW
'L'
TABLA
contador
CALL
TABLA
CALL
LCD_DATO
NOP
;
;
TABLA ADDWF
PCL,F
RETLW
'1'
RETLW
'2'
RETLW
'3'
RETLW
'T'
Este es un ejemplo sencillo de cmo utilizar RETLW. Para interpretar este cdigo empezamos desde
PAGESELW, supongamos que el CP est en esta instruccin (que est explicado que hace) luego pasa
a la instruccin MOVFW contadory suponemos que tiene cargado 3 en decimal, por lo que W pasar
a tener 3 en decimal. El CP continua con CALL TABLA, el CP saltar por encima a todas las dems
instrucciones y se dirige a la etiqueta TABLA y ejecuta la instruccin ADDWF PCL,F En el cdigo
hablamos que le suma 3 al PCL, por lo que saltar al RETLW '3' cargando a W con el cdigo ASCII 3.
Retorna justo debajo del CALL TABLA, o sea retorna a CALL LCD_DATO y ejecuta la rutina
correspondiente, cuando termina, regresa al NOP (que puede ser cualquier instruccin que necesite
el programador.
Si en cambio, contador hubiera tenido cargado 4 en decimal cuando llegue a la tabla y le sume al PCL
este apuntar a RETLW 'T' cargando en W el cdigo correspondiente ASCII.
Para recordar RETurn es retornar Literal es literal W es el registro de trabajo W
No afecta ningn bit del registro STATUS.
RETURN
Carga al CP con el valor de la parte alta de la pila para volver al lugar dnde se encontraba el CP
cuando se llam a la rutina o subrutina.
La diferencia con RETLW es que RETURN regresa sin cambiar a W. Este se utiliza para terminar una
rutina y no se necesite ningn dato. Por ejemplo en la rutina CALL LCD_DATO no nos sirve que
vuelva con ningn valor ya que es una rutina para enviar datos a un LCD, as que esta rutina tendr
implementada RETURN
Por ejemplo:
Cdigo:
RETURN
RLF
Rota hacia la izquierda los bit de un registro seleccionado por el programador. El destino de la
operacin se puede elegir. Cada rotacin equivale a multiplicar por 2 si el bit C del registro STATUS es
0.
Cdigo:
RLF
PORTC, F
RRF
Rota hacia la derecha los bits de un registro seleccionado por el programador. El destino de la
operacin se puede elegir. Cada rotacin equivale a dividir por 2 si el bit C del registro STATUS es 0.
Cdigo:
RRF
PORTB, F
Si antes de la instruccin PORTB vale B'10000000' despus de la instruccin PORTB vale B'0100000'.
Si se hubiera elegido como destino W, PORTB despus de la instruccin continua valiendo
; PONEMOS A 0 AL BIT C
; ROTAMOS A LA IZQUIERDA
; PONEMOS A 0 AL BIT C
; ROTAMOS A LA IZQUIERDA
Algo que me haba olvidado de mencionar pero que MIGSANTIAGO del foro de TODOPIC estuvo
atento es que ests dos instrucciones, nos sirve para enviar datos en forma serial utilizando el bit C
que lo veremos ms adelante.
Recordemos que, para utilizar estas instrucciones para multiplicar o dividir, debemos asegurarnos de
que el bit C, est en 0.
SLEEP
Pone al microcontrolador en bajo consumo.
Cdigo:
SLEEP
SUBLW
Resta el contenido de W con un literal de hasta 8 bit (.255). El resultado se guarda en W.
Cdigo:
SUBLW
.20
Si antes de la instruccin W vale .23 despus de la instruccin W vale .3 Para saber si el resultado es
negativo o positivo, hay que chequear el bit C del registro Status. Si hay acarreo, el resultado es
negativo, y por el contrario, si no hay acarreo es positivo.
Para recordar SUBtraction es restar Literal es literal y W es el registro W.
Afecta a:
Z se pone a 1 si el resultado es 0
DC se pone a 0 si hay acarreo del bit del 4 al 5 bit del registro (recordemos que en la resta, es
a 0 si hubo acarreo).
SUBWF
Resta el contenido de un registro seleccionado por el programador con el contenido del registro W.
La frmula es F - W = d. d es la direccin elegida por el programador en dnde se guardar el
resultado que puede ser el registro W o el registro elegido por el programador.
Cdigo:
SUBWF
MINUENDO, W
Si antes de la instruccin W vale .55 y MINUENDO vale .56, despus de la instruccin, MINUENDO
vale .56 y W vale .1
Para recordar SUBtraction es resta W es el registro W y File es el registro elegido.
Afecta a:
Z se pone a 1 si el resultado es 0
DC se pone a 0 si hubo un acarreo del 4 bit al 5 bit (recordemos que en la resta, es distinto a la
SWAPF
Intercambia los bits de un mismo registro elegido por el programador. Los 4 bit de menor peso,
pasan a ser lo 4 bits de mayor peso, y los 4 bits de mayor peso, pasan a ser los 4 bits de menor peso.
El destino puede ser seleccionado.
Cabe pensar que puede ser una instruccin de muy poco uso, pero todo lo contrario si se utilizan con
las interrupciones. Microchips recomienda su utilizacin a la hora de salvar el contexto y restaurarlo
en una interrupcin ya que no modifica el registro STATUS. Cuando trabajemos con las
interrupciones, se ver que es muy recomendable salvar el registro STATUS y W en la RAM para
luego restaurarlos. Si utilizamos la instruccin MOVF, es afectado el bit Z, perdiendo su estado
original en el momento de la interrupcin. Esto se soluciona, utilizando la instruccin SWAPF. No se
preocupen si no lo entiende por ahora. Lo entendern cuando veamos ejemplo de interrupciones.
Cdigo
SWAPF
STATUS, W
B'11000101'
XORWF
Realiza la operacin XOR entre un registro elegido por el programador y el registro W. La operacin
es F XOR W = d. El resultado se puede elegir dnde ser guardado.
Cdigo:
XORWF
PORTB, F
prestaciones del programa a escribir. Muchas de las personas crean plantillas nuevas para ahorrarse
el trabajo. Yo soy una de ellas y aqu les doy una plantilla que pueden utilizar sin problemas y
modificarlas segn su necesidad.
He aqu la plantilla que tambin est adjuntado.
LIST P=16F877A
INCLUDE <P16F877A.INC>
__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC
;
;--------------------------------------------------------------;VARIABLES.
;--------------------------------------------------------------;
CBLOCK H'20'
ENDC
;
RESET ORG
H'00'
GOTO INICIO
ORG
H'04'
;VECTOR INTERRUPCIN
INTERRUP
;
INICIO
;
END
Primera lnea:
LIST P=16F877A
Esta lnea, sirve solo para el MPLAB y le indica que el PIC a utilizar es el 16F877A. Se debe actualizar
segn sea necesario.
Segunda lnea:
INCLUDE <P16F877A.INC>
Esta lnea sirve a la hora de compilar ya que dentro de este archivo que viene incluido dentro del
MPLAB, le indica al ensamblador dnde estn ubicados cada registro y el nombre de cada bits del PIC
a utilizar as, nos ahorra de hacerlo nosotros mismos. Si desean abrir el archivo, lo pueden hacer con
el notepad o cualquier editor de texto. Se debe actualizar segn sea necesario.
Tercera lnea:
__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC
Lnea muy importante pero se puede omitir. Aqu se configura la palabra de configuracin del PIC y
que est en el Datasheet del pic correspondiente.
En mi caso, yo la omito y luego lo configuro desde el ICPROG a la hora de pasar el archivo .hex al pic.
Es por eso que esta lnea est incompleta para el pic a utilizar pero completa para el PIC 16F84.
Vemos en ms detalle esta lnea: __CONFIG Directiva para el ensamblador de que debe generar la
palabra de configuracin correspondiente de acuerdo a:
Cuarta lnea:
;
;--------------------------------------------------------------;VARIABLES.
;--------------------------------------------------------------;
Este no es ms que un pequeo encabezado. El ensamblador omitir estas lneas y solo porque
empieza con ";". Recuerden que, toda lnea que empiece con ";" es comentario y el ensamblador la
omitir.
Justo por debajo de este encabezado, ponemos las variables. Aqu le llamo variables? Aposiciones
de memorias o nombre de bit que yo quiera darle personalmente.
Por ejemplo, dentro del archivo P16F877A.INC a la posicin de memoria 0x05 le llama PORTA pero si
yo quiero llamarlo PUERTO_A, es aqu dnde le indico al ensamblador.
Cmo se hace?
Es muy fcil y con la instruccin "EQU"
PUERTO_A EQU H05
Si al Bit RA6 lo quiero llamar LED6 lo hacemos as:
LED6 EQU 6
Supongamos que quiero encender el LED 6 que est en el Puerto a bit 6, y este se activa con un 1
lgico, ponemos esta instruccin:
BSF PUERTO_A, LED6
Y el ensamblador lo traducir as: BSF 0X05, 0X06
Quinta lnea:
CBLOCK
H'20'
ENDC
A estas dos lneas las unifique porque van juntas. Entre ellas van los nombres de cada posicin de la
RAM que nosotros queramos nombrar, o cada Registro que queramos renombrar.
Recuerden que los registros estn implementados en la RAM y que la posicin de la RAM que puede
utilizar el usuario para guardar cosas, empieza desde una posicin que est indicada en el Datasheet.
Para el caso de 16F877 empieza desde la posicin 0x20 como lo ven en la figura siguiente.
La directiva CBLOCK H'20' indica que empezamos a nombrar posiciones de memoria desde la
ubicacin 0x20. Por ejemplo
CBLOCK H20
temperatura
demora1
demora2
ENDC
La posicin 0x20 se llama temperatura, la posicin 0x21 se llama demora1 y as sucesivamente.
Tambin existe otra forma de nombrar o renombrar posiciones de memoria o registro, y ya lo vimos
que es con la directiva EQU. Por ejemplo:
temperatura EQU H'20'
demora1
EQU H'21'
demora2
EQU H'22'
Sexta lnea:
RESET ORG
H'00'
GOTO INICIO
ORG
H'04'
;VECTOR INTERRUPCIN
INTERRUP
He unificado estas lneas porque por lo general as se escribe en la mayora de nuestros programas.
Vemos con ms detalles estas lneas.
RESET ORG H00
Aqu es en dnde empieza el CP cuando se enciende al PIC. Y estos se debe, porque cuando hay un
reset por el pin MCLR o un reset interno producido por, encendido del PIC o, por ejemplo, del perro
guardin, el vector reset se ubica en la posicin 0x00 de la memoria de programa.
Como pueden apreciar, hemos llamado a la posicin 0x00 con el nombre de RESET, ya que la primer
columna es una etiqueta. Las etiquetas sirven para nombrar posiciones de memoria de programa.
ORG H00 indica que se empieza a escribir desde la posicin 0x00 por lo que la siguiente instruccin,
quedar alojada en la posicin 0x00. ORG es una directiva, y solo sirve para el ensamblador. Esta
lnea, SIEMPRE debe estar y no se puede modificar, salvo la etiqueta.
Siguiente lnea es GOTO INICIO, esta instruccin queda alojada en la posicin 0x00 y es un salto a la
etiqueta INICIO. Este salto tiene que estar, porque en las siguientes posiciones de memoria de
programa, est la interrupcin, externa e interna del PIC. Por eso es necesario hacer el salto.
Siguiente lnea nos encontramos con ORG H04, como se dieron cuenta, es una directiva. Esta
posicin de memoria, indica el vector de interrupcin. Cuando estn habilitadas las interrupciones y
una de ella se activa, el CP apuntar aqu, a la posicin 0x04.
Siguiente lnea nos encontramos con la etiqueta INTERRUP. Si trabajamos con las interrupciones,
aqu es donde escribiremos lo que necesitamos hacer con ellas.
Sptima lnea:
;
INICIO
;
Vemos la etiqueta INICIO. Aqu vendr el CP cuando haya un reset gracias al GOTO INICIO ubicado en
la posicin 0x00 de la memoria de programa. De esta manera, saltamos un montn de instrucciones
que no debemos ejecutar antes. Como por ejemplo las interrupciones si hubiese.
Por ende, a partir de esta etiqueta, estar nuestro programa principal. Configuraremos los puertos,
las interrupciones y empezaremos a darle trabajo al CP.
Octava lnea:
END
Esta es una directiva y solo sirve para el ensamblador indicando que despus de esta directiva, se
termin el programa. Instrucciones que estn por debajo de esta lnea, no sern tenido encuentra. Y
esta directiva es obligatoria colocarla.