Documentos de Académico
Documentos de Profesional
Documentos de Cultura
DADOELECTRNICO
JaimePrezCrespo
RubnSeijasValverde
Introduccin:
Conestaprcticasepretendefamiliarizarseconlaprogramacinenensamblador
demicrocontroladorescomoelPICutilizado.Setratadelaconstruccindeunsencillo
dadoelectrnicomedianteunPIC,undisplayyunpulsador,entreotroscomponentes.
El display, al conectarse el circuito, comenzar una cuenta desde el nmero 1
hastaelnmero6de formaprogresiva,cambiandocadasegundo. Cuandoeljugador
accioneelpulsador,eneldisplaysemostrarntodoslosledsencendidos(salvoelpunto
decimal) para indicar que se est procediendo a una tirada. Al liberar el pulsador se
mostrarduranteunsegundoelnmeroaleatorioobtenidoporeljugador.Transcurrido
esesegundo,eldadovolveraretomarlacuentaexactamenteenelnmerosiguienteal
ltimonmeromostradopreviamenteaejecutarlatirada.
Listado:
Acontinuacinsemuestraellistadoenensambladordelprogramaconstrudopara
eldadoelectrnico.
;Practicadeldadoelectronicodelaasignatura
;Microprocesadores20032004
;Autores:
;JaimePerezCrespo
;RubenSeijasValverde
;Ultimamodificacion:3/11/2003
LISTP=16F84
INCLUDE"a:\P16F84.INC";LibreriaderegistrosdelPIC
RADIXHEX
SEG EQU 0x0C
NUMEQU0x0D
ORG0x00
GOTO
INICIO
ORG
0x04
GOTO
INTERR
;Direcciondecomienzodelprograma
;Capturadeinterrupciones
;Saltoalarutinadetratamientode
;interrupciones
INICIO:
CLRFSEG;Iniciamoslacuentadefraccionesde
;segundo
CLRFNUM;IniciamoselNumeroamostrar
BSFSTATUS,RP0;Cambiamosalbancodememoria1
MOVLW0xff
MOVWFTRISA;configuramospuertaAdeentrada
MOVLW0x00
MOVWFTRISB;configuramospuertaBdesalida
MOVLWb'00000111'
;cargamoslosflagsenOPTION
MOVWFOPTION_REG
MOVLWb'10100000';PermitimosinterrupcionesenTMR0yGIE
MOVWFINTCON
BCFSTATUS,RP0;Cambiamosalbancodememoria0
MOVLWb'00100110';Cargamos38enelTMR0(255217)
MOVFWTMR0
MOVLWb'11111111';Apagamostodoslosledsdeldisplay
MOVWF
PORTB
BUCLE:
BCF
STATUS,RP0
;Seleccionamosbancodememoria0
BTFSSPORTA,0;Comprobamossielpulsadoresta
;accionado(RA0=0)
CALL
GEN_NUM
;Pulsadoraccionado,generamosnumero
;aleatorio
GOTO
BUCLE
;Nohaypulsacion,seguimos
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Generaciondelnumeroaleatorio;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
GEN_NUM:
BSF
STATUS,RP0
;Seleccionamosbancodememoria1
MOVLW
b'00000000'
;Deshabilitamosinterrupciones
MOVWF
INTCON
BCF
STATUS,RP0
;Seleccionamosbancodememoria0
MOVLWb'10000000';Encendemostodoslosledsdeldisplay
;salvoelpunto
MOVWF
PORTB
PULS:
INCF
NUM,F
;Incrementamoselnumerodetirada
MOVFNUM,W;Comprobamossilatiradaessuperiora6
SUBLW7;Restamos7alatirada
BTFSSSTATUS,Z;Comprobamossilarestaes0
;Silarestaanteriores0,debemosponer
;a1latirada,Zsera1
GOTO
COMP_PULS
;Tiradacorrecta,comprobamosel
;pulsador
MOVLW
0x01
;Iniciamosa1latirada
MOVWF
NUM
COMP_PULS:
BCFSTATUS,RP0;Seleccionamosbancodememoria0
BTFSC
PORTA,0
;ComprobamosRA0paraverelestadodel
;pulsador
GOTO
NO_PULS
;Nohaypulsacion,mostramoselnumero
GOTOPULS;Pulsadoraccionado,seguimosgenerando
;elnumero
NO_PULS:
CALL
MOSTRAR_NUM
;Mostramoselnumeroeneldisplay
;Numeromostrado,volvemosalbucleinicial
BCFSTATUS,RP0;Cambiamosalbancodememoria0
MOVLWb'00100110';Cargamos38enelTMR0
MOVFWTMR0
MOVLW
0x00
;Empezamosacontarunsegundodenuevo
MOVWF
SEG
MOVLW
0x00
;Reiniciamoslacuentadesde0
MOVWF
NUM
MOVLW
b'10100000'
;PermitimosinterrupciondeTMR0yla
;globalGIE
MOVWF
INTCON
;Habilitamosdenuevolasinterrupciones
RETURN
;Retornamosdelarutina
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Rutinaparamostrarunnumeroeneldisplay;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MOSTRAR_NUM:
BCFSTATUS,RP0;Seleccionamoselbanco0
UNO:MOVFNUM,W;ComprobamossiNUMes1
SUBLW1
BTFSSSTATUS,Z
GOTODOS;Sinoesuno
MOVLWb'11111001';GuardamosenWlassecuenciadeleds
;necesariaparamostrarelnumero
GOTOFIN
DOS:MOVFNUM,W;ComprobamossiNUMes2
SUBLW2
BTFSSSTATUS,Z
GOTOTRES;Sinoesdos
MOVLWb'10100100';GuardamosenWlassecuenciadeleds
;necesariaparamostrarelnumero
GOTOFIN
TRES:MOVFNUM,W;ComprobamossiNUMes3
SUBLW3
BTFSSSTATUS,Z
GOTOCUATRO;Sinoestres
MOVLWb'10110000';GuardamosenWlassecuenciadeleds
;necesariaparamostrarelnumero
GOTOFIN
CUATRO:MOVFNUM,W;ComprobamossiNUMes4
SUBLW4
BTFSSSTATUS,Z
GOTOCINCO;Sinoescuatro
MOVLWb'10011001';GuardamosenWlassecuenciadeleds
;necesariaparamostrarelnumero
GOTOFIN
CINCO:MOVFNUM,W;ComprobamossiNUMes5
SUBLW5
BTFSSSTATUS,Z
GOTOSEIS;Sinoescinco
MOVLWb'10010010';GuardamosenWlassecuenciadeleds
;necesariaparamostrarelnumero
GOTOFIN
SEIS:MOVLWb'10000010';Sinoesningunodelosanterioreses6
FIN:MOVWFPORTB;ActivamoslaspatillasdelpuertoB
;necesariasparamostraselNUMenel
;display
RETURN
;Retornamosdelarutina
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Rutinasdetratamientodeinterrupciones;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INTERR:
BCFSTATUS,RP0;Seleccionamoselbanco0
BTFSSINTCON,T0IF;ComprobamoseldesbordamientodelTMR0
RETFIE;Sinoretornamosdelainterrupcion
INCFSEG,F;Incrementamoselnumerode
;desbordamientos
MOVFSEG,W;Comprobamoslafracciondesegundo
SUBLWd'18';Lerestamos18(elnumerode
;desbordamientosporsegundo)
BTFSSSTATUS,Z
GOTOCONT;Nohatranscurridounsegundo
;Hatranscurridounsegundo,actualizamoseldisplay
UN_SEG:CLRFSEG;InicializamosSEG
INCFNUM,F;Incrementamoselnumeroamostrar
MOVFNUM,W;ComprobamossiNUMessuperiora6
SUBLW7;Restamos7
BTFSSSTATUS,Z;SilarestaNOes0:
GOTOOK;Mostramoselnumero
MOVLW0x01;Encasocontrario:
MOVWFNUM;InicializamosNUMa1
OK:CALLMOSTRAR_NUM;Lomostramos
;Reseteamoselcontadordetiempoparaquevuelvaacontar1segundo
CONT:BCFSTATUS,Z;Seleccionamoselbanco0
MOVLWb'00100110';Introducimos38enelTMR0
MOVWFTMR0
MOVLWb'10100000';Activamosdenuevolasinterrupciones
MOVWFINTCON
RETFIE
;Retornamosdelarutina
END
Rutinasutilizadas:
El funcionamiento del programa es bien sencillo. Tras realizar las tareas de
inicializacin pertinentes, nos introducimos en un bucle que en cada iteraccin
compruebasisehaaccionadoelpulsador.Entalcaso,nosconduceaunarutinaque
calculaelnmeroaleatorio.
Dicha rutina es GEN_NUM, durante la cual sencillamente deshabilitamos las
interrupcionesyesperamosenunbucleaqueeljugadorlibereelpulsador.Mientrasel
pulsadorestaccionadogeneraremosunnmeroaleatorioalincrementarelnmerode
tiradaencadaiteraccin.Cuandoelpulsadorselibere,mostraremoselnmerodetirada
que hemos obtenido durante un segundo, transcurrido el cual, restauraremos las
interrupcionesyvolveremosalbucleprincipal.
Ntese que el nmero de tirada no se inicializa durante la rutina GEN_NUM, de
formaque laaleatoriedad dedicho nmerodependenoyadeltiempoque eljugador
mantengaaccionadoelpulsador,sinotambindeculfulaltimatirada.
Problemasencontrados:
Estossonalgunosdelosproblemasencontradosdurante larealizacindeesta
prctica:
Lentitud del simulador: quizsunodelosinconvenientesquemshandificultado
eldesarrollohasidoeltenerquelidiarconunsimuladorcomosimupic,quenotrabaja
entiemporeal.Estoretardabalaspruebasrealizadasconelprograma.
Dudas sobre montaje: unagranpartedeltiempoconelmontajeseperditratando
deaveriguarelporqudelmalfuncionamientodelPIC.Dichomalfuncionamientoera
debidoanohaberincluidoalimentacinpositivaconectadaalapatilla RESETdelPIC.
Clculos del timer:unapartecomplicadafuobtenerunnmeroconcretoparainiciar
losregistros TMR0, prescaler,etc,pararealizarlacuentadeunsegundo.Alfinal,
trasmltiplesclculosyvariaspruebassobreelmontaje,optamosporprovocarqueel
TMR0sedesbordasecada38pulsosdereloj,ycontaruntotalde18desbordamientos
paraconseguirunsegundocasiexacto.