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

ESCUELA SUPERIOR POLITCNICA DEL LITORAL

FACULTAD DE INGENIERIA EN
EN ELECTRICIDAD Y COMPUTACIN

Laboratorio de Microcontroladores
Practica 5
Contadores
Estudiantes
Andy Mera Sarco
Arnaldo Abad Gomez
Paralelo 7
Grupo 2
Fecha de Entrega
05/12/20014
2014-2015
Termino II

1) Enunciado del Proyecto.


En esta prctica se buscara mejorar los retardos ya que usar
lazos anidados no es recomendable. Para esto vamos a hacer
uso del TMR0 e interrupciones.
Al momento de hacer el circuito este no va a diferir, pero en el
PORTB se usara el pre escalador del TMR0 (1:128) para poder
notar los retardos. De esta manera cada vez que el TMR0 se
desborda (con la interrupcin por TMR0 habilitada) ocurrir
una interrupcin y asi en segundo plano la interrupcin
incrementara en uno el valor en PORTB y permitirle al
microcontrolador hacer otras acciones.
2) Diagrama de Bloques.
Parte 1
Microcontrolador

Display 7 segmentos

Parte 2
Microcontrolador

Dos display de 7
segmentos

Parte 3
Microcontrolador

Display de 7
segmentos doble

3) Diagrama de flujo funcional del programa principal y


diagrama de flujo de cada una de las subrutinas empleadas.
Parte 1

Parte 2

Parte 3

4) Descripcin del algoritmo o estrategia utilizada.


Parte 1:
Se escriben los parmetros de configuracin luego se
seleccionan los puertos a ser utilizados. Se coloca en 0 el TOCS
del registro OPTION_REG para seleccionar el contador TMR0.
Luego activamos los 3 ltimos bits del OPTION_REG para
escoger un preescalador de 1:256. Inicializamos el TMR0 con
el valor de 217 y el contador con 100 y habilitamos interrupcin
por el TMR0 no olvidar encerar el Puerto B. Esperamos el
desbordamiento del TMR0 y si ocurre una interrupcion
decrementamos el contador, si este llega a 0 muestra en el
display de 7 segmentos el valor de unidades hasta llegar a 10,
en este caso se restablece el valor de 100 al contador y por
ultimo regresamos a la interrupcin.
Parte 2:
Primero se escriben los parmetros de configuracin para asi
seleccionar los puertos a ser utilizados luego se coloca en 0 el
TOCS del registro OPTION_REG para seleccionar el contador
TMR0. Inicializamos el TMR0 con el valor de 217 y el
contador con 100 y habilitamos interrupcin por el TMR0 no
olvidar Encerar el Puerto B. Esperamos el desbordamiento del
TMR0 si ocurre ejecutamos la interrupcin caso contrario
seguimos esperando el desbordamiento. En la interrupcin
decrementamos el contador, si este llega a 0 muestra en el
display de 7 segmentos el valor de unidades hasta llegar a 10,
en este caso restablece el valor de 100 al contador, luego realiza
el mismo procedimiento con el valor de las decenas. Se retorna
de la interrupcin.

Parte 3:
Igual que en los casos anteriores se escriben los parmetros de
configuracin para luego Se seleccionar los puertos a ser
utilizados y colocar en 0 el TOCS del registro OPTION_REG
para seleccionar el contador TMR0. Activamos los 3 ltimos
bits del OPTION_REG para escoger un preescalador de 1:256
luego inicializamos el TMR0 con el valor de 217 y el contador
con 100 habilitando interrupcin por el TMR0 y enceramos el
Puerto B. Esperamos el desbordamiento del TMR0 si ocurre
ejecutamos la interrupcin caso contrario seguimos esperando
el desbordamiento. En la interrupcin decrementamos el
contador, luego preguntamos si Sel es igual a uno, llamamos a
tabla con el valor de Decenas, Seleccionamos las salidas
RA0=0, RA1=1, Complementamos a Sel, caso contrario
llamamos a tabla con el valor de unidades yluego se retorna de
la interrupcin.

5) Listado del programa fuente en lenguaje ensamblador con


comentarios en las lneas de cdigo que considere
fundamentales.
Parte 1
;**********************************************************
;
CONTADOR CON DISPLAY DE SIETE SEGMENTOS
;
USANDO EL TMR0 COMO BASE DE TIEMPO DE 10ms
;
PARA CONTAR CADA SEGUNDO
;**********************************************************
;
NOMBRE:
p5a_1d.asm
;
FECHA:
21/06/2010
;
VERSION:
1.00
;
PROGRAMADOR:
Carlos Valdivieso

;**********************************************************
;
DESCRIPCION:
;Se trata de incrementar un contador cada segundo y mostrar
;su valor en el display. Se programa el tmr0 para que genere
;una interrupcin cada 0.01 seg. (10 mS) que se repetir 50
;veces con el objeto de activar el conteo cada 500 mS. Use reloj de 4MHz.
;**********************************************************
;DIRECTIVAS
LIST
INCLUDE

p=16F887
P16F887.INC

;Tipo de microcontrolador
;Define los SFRs y bits del
;P16F887

__CONFIG _CONFIG1, _CP_OFF&_WDT_OFF&_XT_OSC


;Setea parmetros de
;configuracin
errorlevel

-302

;Deshabilita mensajes de
;advertencia por cambio
bancos

;La directiva "cblock 0X20...endc" reserva espacios de memoria a partir


de 0x20
CBLOCK
0X020
contador
;Cuenta 100 interrupciones
unidades
;registro de unidades
uni_cod
;Cdigo de 7 segmentos de unidades
ENDC
;INICIO DE PROGRAMA
ORG
0x00
;Vector de RESET
GOTO
MAIN
ORG
0x04
;Vector de interrupcin
GOTO
INTERRUPCION
INTERRUPCION
decfsz
goto
movf
call
movwf
movf
movwf
INCF
movlw
subwf
btfss
goto
clrf

contador,f
Seguir
unidades,w
tabla
uni_cod
uni_cod,w
PORTB
unidades,f
.10
unidades,w
STATUS,2
cont
unidades

cont
movlw
movwf

.100
contador

Seguir
movlw

.217

movwf
bcf
RETFIE

;Decrementa el contador 100 veces


;No, todava
;Ya ocurrieron 100 int de 10ms(1000ms)

;Repone el contador con 100

;"~.39" es el complemento a 256


;equivale a ".217"
TMR0
;Repone el TMR0 con 217
INTCON,T0IF ;Repone flag del TMR0
;Retorno de interrupcin

MAIN
;SETEO DE PUERTOS

BANKSEL
CLRF
CLRF
BANKSEL
CLRF

ANSEL
ANSEL
ANSELH
TRISB
TRISB

;Selecciona el Bank1
;PORTB configurado como salida

;PROGRAMACION DEL TMR0


banksel
OPTION_REG
movlw
b'00000111'
movwf
OPTION_REG

;Programa TMR0 como temporizador


;con preescaler de 256

;INICIALIZACION
BANKSEL
PORTB
CLRF
PORTB
clrf
unidades

;Selecciona el Bank 0

;El valor calculado para cargar en TMR0 es de 217 con un preescaler


;de 256 y a una frecuencia de 4MHz, para obtener una interrupcin
;cada 10mS.
movlw
movwf
movlw
movwf

.217
TMR0
.100
contador

;Valor decimal 217


;Carga el TMR0 con 217
;Cantidad de interrupciones a contar
;N de veces a repetir la interrupcin

;PROGRAMACION DE INTERUPCION
movlw b'10100000'
movwf INTCON
;Activa la interrupcin del TMR0
;MOSTRAR
clrw
call
movwf
movf
movwf
INCF
Loop
nop
goto

CERO INICIAL
tabla
uni_cod
uni_cod,w
PORTB
unidades,f

Loop

; TABLA DE CONVERSION
tabla
ADDWF

PCL,F

;
;
;
;

PCL + W -> PCL


El PCL se incrementa con el
valor de W proporcionando un
salto

Parte 2
;**********************************************************
;
CONTADOR DE DOS DIGITOS CON DISPLAY DE SIETE SEGMENTOS
;
USANDO EL TMR0 COMO BASE DE TIEMPO DE 10ms(10x100)
;
PARA INCREMENTAR SU VALOR CADA SEGUNDO DE 00-99
;**********************************************************
;
NOMBRE:
p5b_2d.asm
;
FECHA:
21/06/2010
;
VERSION:
1.00
;
PROGRAMADOR:
Carlos Valdivieso
;**********************************************************
;
DESCRIPCION:
;Se trata de incrementar un contador cada segundo y mostrar
;su valor en dos displays. Uno para unidades y otro para

;decenas. El tmr0 se programa para que genere una


;interrupcin cada 0.01 seg. (10 mS) que se repetir 100
;veces con el objeto de activar el conteo cada 1000 mS.
;Use un reloj de 4MHz.
;**********************************************************
;DIRECTIVAS
LIST
INCLUDE

p=16F887
P16F887.INC

;Tipo de microcontrolador
;Define los SFRs y bits del
;P16F887

__CONFIG _CONFIG1, _CP_OFF&_WDT_OFF&_XT_OSC


;Setea parmetros de
;configuracin
errorlevel

-302

;Deshabilita mensajes de
;advertencia por cambio

;bancos
CBLOCK
0X020
contador
;Cuenta 100 interrupciones
unidades
uni_cod
decenas
dec_cod
ENDC
;**********************************************************
;PROGRAMA
ORG
0x00
;Vector de RESET
GOTO
MAIN
ORG
0x04
;Vector de interrupcin
GOTO
Interrupcion ;Va a rutina de interrupcin
;DURANTE LA INTERRUPCION SE CUENTAN 100 INTERRUPCIONES
;PARA COMPLETAR 10x100=1000ms.
Interrupcion
movf
unidades,w
call
tabla
movwf uni_cod
movf
uni_cod,w
movwf PORTB
movf
decenas,w
call
tabla
movwf dec_cod
movf
dec_cod,w
movwf PORTC
decfsz
contador,f
;Cuenta espacios de 10ms
goto
Seguir
;An, no son 100 interrupciones
INCF
unidades,f
;Ahora s 10x100=1000ms=1seg
movlw .10
subwf unidades,w
btfss STATUS,2
goto
cont
clrf
unidades
incf
decenas
movlw .10
subwf decenas,w
btfss STATUS,2
goto
cont
clrf
decenas
cont
movlw .100
movwf contador

;Precarga contador con 100

Seguir
bcf
INTCON,T0IF
movlw .217
movwf TMR0
retfie

;Repone flag del TMR0


;Repone el TMR0 con ~.39
;Retorno de interrupcin

MAIN
;SETEO DE PUERTOS
BANKSEL
ANSEL
CLRF
ANSEL
CLRF
ANSELH
BANKSEL
TRISB
CLRF
TRISB
CLRF
TRISC
;INICIALIZACION
BANKSEL
CLRF
CLRF
CLRF
CLRF

PORTB
PORTB
PORTC
unidades
decenas

;Selecciona el Bank1
;PORTB configurado como salida
;PORTC configurado como salida
;Selecciona el Bank0
;Borra latch de salida de PORTB
;Borra latch de salida de PORTC

;El valor calculado para cargar en TMR0 es de 217 con un


;preescaler de 256 y a una frecuencia de 4MHz, para obtener
;una interrupcin cada 10mS. Clculo al final del ejercicio.
;PROGRAMACION DEL TMR0
banksel
OPTION_REG
movlw
b'00000111'
movwf
OPTION_REG
BANKSEL
TMR0
movlw
.217
movwf
TMR0

;TMR0 como temporizador


;con preescaler de 256
;Valor decimal 217
;Carga el TMR0 con 217

;PROGRAMACION DE INTERRUPCION
movlw
b'10100000'
movwf
INTCON
;Activa la interrupcin del TMR0
movlw .100
;Cantidad de interrupciones a contar
movwf contador
;N de veces a repetir la interrupcin
Loop
nop
goto

Loop

; TABLA DE CONVERSION
tabla
ADDWF

RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
END

PCL,F

; PCL + W -> PCL


; El PCL se incrementa con el
; valor de W proporcionando un
; salto
0x3F
; Retorna con el cdigo del 0
0x06
; Retorna con el cdigo del 1
0x5B
; Retorna con el cdigo del 2
0x4F
; Retorna con el cdigo del 3
0x66
; Retorna con el cdigo del 4
0x6D
; Retorna con el cdigo del 5
0x7D
; Retorna con el cdigo del 6
0x07
; Retorna con el cdigo del 7
0x7F
; Retorna con el cdigo del 8
0x67
; Retorna con el cdigo del 9
; Fin del programa fuente

;CALCULO DEL VALOR A CARGAR EN TMR0 A 4MHz

;PARA OBTENER TEMPORIZACION DE 10 MILISEGUNDOS


;CON PREESCALADOR DE 1:256
;Temporizacin=(4Tosc)(256-ValorTMR0)(preescalador)
;0.010=(4Tosc)(256-ValorTMR0)(256)
;ValorTMR0=217

Parte 3
;**********************************************************
;
CONTADOR DE DOS DIGITOS MULTIPLEXADO CON DISPLAY DE
;
SIETE SEGMENTOS USANDO EL TMR0 COMO BASE DE TIEMPO
;
DE 10ms (10x100) PARA INCREMENTAR SU VALOR CADA
;
SEGUNDO DE 00-99
;**********************************************************
;
NOMBRE:
p5c_2dm.asm
;
FECHA:
21/06/2010
;
VERSION:
1.00
;
PROGRAMADOR:
Carlos Valdivieso
;**********************************************************
;
DESCRIPCION:
;Se trata de incrementar un contador cada segundo y mostrar
;su valor en dos displays colocados en el puerto B usando la
;tcnica de multiplexacin. Uno para unidades y otro para
;decenas. Los displays se refrescan cada 20ms. El tmr0 se
;programa para que genere una interrupcin cada 0.01 seg.
; (10 mS) que se repetir 100 veces con el objeto de activar
;el conteo cada 1000 mS. Use un reloj de 4MHz.
;**********************************************************
;DIRECTIVAS
LIST
INCLUDE

p=16F887
P16F887.INC

;Tipo de microcontrolador
;Define los SFRs y bits del
;P16F887

__CONFIG _CONFIG1, _CP_OFF&_WDT_OFF&_XT_OSC


;Setea parmetros de
;configuracin
errorlevel

-302
;Deshabilita mensajes de
;advertencia por cambio bancos

CBLOCK 0X020
contador
;Cuenta 100 interrupciones
unidades
uni_cod
decenas
dec_cod
sel
ENDC
;**********************************************************
;PROGRAMA
ORG
0x00
;Vector de RESET
GOTO
MAIN
ORG
0x04
;Vector de interrupcin
GOTO
Interrupcion ;Va a rutina de interrupcin
;DURANTE LA INTERRUPCION SE CUENTAN 100 INTERRUPCIONES
;PARA COMPLETAR 10x100=1000ms.
Interrupcion
movf
sel,w
;Se mueve a si mismo para afectar bandera
btfss STATUS,2
;sel=0 refresca dig1; sel=1 refresca dig2
goto
dig2

dig1
movf
call
movwf
movf
bsf
bsf
movwf
bcf
comf
goto
dig2
movf
call
movwf
movf
bsf
bsf
movwf
bcf
comf
dec
decfsz
goto
INCF
movlw
subwf
btfss
goto
clrf
incf
movlw
subwf
btfss
goto
clrf

unidades,w
tabla
uni_cod
uni_cod,w
PORTA,0
PORTA,1
PORTB
PORTA,0
sel,f
dec
decenas,w
tabla
dec_cod
dec_cod,w
PORTA,0
PORTA,1
PORTB
PORTA,1
sel,f

contador,f
Seguir
unidades,f
.10
unidades,w
STATUS,2
cont
unidades
decenas
.10
decenas,w
STATUS,2
cont
decenas

cont
movlw .100
movwf contador

Seguir
bcf
INTCON,T0IF
movlw ~.39
movwf TMR0
retfie
MAIN
;SETEO DE PUERTOS
BANKSEL
ANSEL
CLRF
ANSEL
CLRF
ANSELH
BANKSEL
TRISA
CLRF
TRISA
CLRF
TRISB
;INICIALIZACION
BANKSEL
PORTA
CLRF
PORTA
CLRF
PORTB

;cuenta espacios de 10ms


;An, no son 100 interrupciones
;Ahora s 10x100=1000ms=1seg

;Carga contador con 100

;Repone flag del TMR0


;Repone el TMR0 con ~.39
;Retorno de interrupcin

;Selecciona el Bank3
;Selecciona el Bank1
;PORTA configurado como salida
;PORTB configurado como salida
;Selecciona el Bank0
;Borra latch de salida de PORTB
;Borra latch de salida de PORTC

clrf
clrf
clrf

unidades
decenas
sel

;PROGRAMACION DEL TMR0


banksel
OPTION_REG
;Selecciona el Bank1
movlw
b'00000111' ;TMR0 como temporizador
movwf
OPTION_REG
;con preescaler de 256
BANKSEL
TMR0
;Selecciona el Bank0
movlw
.217
;Valor decimal 217
movwf
TMR0
;Carga el TMR0 con 217
;PROGRAMACION DE INTERRUPCION
movlw b'10100000'
movwf INTCON
;Activa la interrupcin del TMR0
movlw .100
;Cantidad de interrupciones a contar
movwf contador
;N de veces a repetir la interrupcin
Loop
nop
goto

Loop

;
TABLA
CONVERSION--------------------------------------------------------tabla
ADDWF

RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
END

PCL,F

; PCL + W -> PCL


; El PCL se incrementa con el
; valor de W proporcionando un
; salto
0x3F
; Retorna con el cdigo del 0
0x06
; Retorna con el cdigo del 1
0x5B
; Retorna con el cdigo del 2
0x4F
; Retorna con el cdigo del 3
0x66
; Retorna con el cdigo del 4
0x6D
; Retorna con el cdigo del 5
0x7D
; Retorna con el cdigo del 6
0x07
; Retorna con el cdigo del 7
0x7F
; Retorna con el cdigo del 8
0x67
; Retorna con el cdigo del 9
; Fin del programa fuente

6) Circuitos en Proteus.
Parte 1

DE

Parte 2

Parte 3

7) Conclusiones.
Es ms eficiente usar el preescalador de la temporizacin del
TMR0 para obtener retardos ya que de esta manera podemos
hacer ms acciones al mismo tiempo en cambio en la prctica
anterior con los lazos anidados tenamos que esperar a que estos
terminen para poder continuar.
Se concluy tambin que el TMR0 puede ser usado como un
contador como en la parte 3 de la prctica, en este caso contaba
los pulsos externos. Podemos aprovechar esto al poner un
nmero de veces que queramos que se active un sistema de
alarma, un indicador de temperatura, sensores.
Se pudo notar que al desbordarse el TMR0 en el loop del
programa al haber activado previamente las interrupciones en el

programa se activa la interrupcin por desborde haciendo que el


programa se valla a la sentecia de interrupcin que se hizo
aprovechando este retardo.

8) Recomendaciones.
Recordar volver a poner el valor de dicha bandera y del bit GIE
ya que al hacerse una interrupcin en este caso la bandera se
hace 1 y GIE se hace 0 por lo cual debemos volver a poner 0 y
1 respectivamente para poder dar paso a nuevas interrupciones
en el programa.
Es recomendable tener a los registros W, STATUS, PCLATH al
inicio de cada rutina, aunque en esta prctica no fue necesario
ya que no se hizo uso de ellos. Deben ser ubicados al inicio de
cada rutina de interrupcin.
Recordar que tenemos que conectar resistencia para el buen uso
de los switches y los Leds, asi evitar cortocircuitos o
sobrecargas.
Tener mucho cuidado de cmo se guarda el cdigo que luego se
va a compilar y a correr, recordar que debe guardarse con
extensin .asm se debe tener cuidado tambin al realizar el
Project Wizard.

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