Está en la página 1de 6

MICROPROCESADORES2003/2004

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.

En nuestro programa el nico tratamiento de interrupciones que haremos ser


aquel que provenga de desbordamientos producidos en el reloj. Dicho tratamiento se
realiza con la rutina INTERR. En la rutina mencionada, comprobaremos que la
interrupcinrecibidaseacausadaporundesbordamientoenelrelojyencasocontrario
descartaremoslainterrupcin,retornandodelarutina.
Silainterrupcinocurridaindicaqueelrelojsehadesbordado,incrementaremos
nuestra cuenta de desbordamientos. En caso de que dicha cuenta alcance los 18
desbordamientos,habremosalcanzadounsegundodetiemporeal.Incrementaremosel
nmerodetiradaquesemuestraprogresivamenteeneldisplay,oloinicializaremosen
casodehaberllegadoa6.Resetearemostodosloscontadoresparainiciardenuevouna
cuentadeunsegundo.
Tanto en larutina GEN_NUM comoenlarutinadetratamiento de interrupciones
INTERR,hacemosusodeotrarutinamuysimplequeseencargademostrarunnmero
de1a6eneldisplay.DicharutinaesMOSTRAR_NUM..Elfuncionamientodeestarutina
esmuysencillo.Comprobaremosdeformasecuencial,empezandopor1yacabandopor
5,sielnmeroquenosindicanquedebemosdibujaresunodedichosnmeros.Ental
caso, configuraremos de forma adecuada la salida a mostrar en el puerto B e
interrumpiremos la comprobacin, mostrando directamente dicha salida en el puerto y
retornando de la rutina. En caso de que el nmero indicado no se corresponda con
ningunodeloscomprobadosde1a5,asumiremosqueelnmeroes6ylomostraremos
delmismomodo.

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.

También podría gustarte