Vous êtes sur la page 1sur 11

UNIDAD IZTAPALAPA

Prctica 2
CRONMETRO CON CONTROL DE AVANCE Y PARO.

ALUMNO
Chvez Miguel Juan Carlos
204324424

Sistemas Digitales II

PROFESOR

MIGUEL NGEL RUIZ SNCHEZ







I. OBJETIVO

El objetivo principal para esta prctica es el poner en uso las interrupciones y el TIMER que se ven durante
clase, del procesador ATmega8515.

II. INTRODUCCIN

En la siguiente prctica se usaran las interrupciones, de estas se echar mano para la implementacin de un
cronometro, este cronometro desplegar los segundos (0-59) y los milisegundos (0-9) con la ayuda de tres
displays, los cuales se pondrn en marcha a partir de que un usuario as lo decida, se podr detener el
cronometro en el momento que se desee, reiniciar o continuar su cuenta. Se har uso de una subrutina
showtime, que consiste en un ciclo infinito para mostrar el tiempo transcurrido en los displays.
En la tercera seccin (Desarrollo) se describen las caractersticas con las que debe de contar el TIMER, las
subrutinas y la forma en que se detiene y se pone en marcha el cronmetro, y se describen los pasos
necesarios para el desarrollo del cronmetro, en la cuarta seccin se observa el diagrama del circuito, este
diagrama tiene la finalidad de que cualquier persona que lea esta prctica pueda llevar a cabo una
reconstruccin de la misma obteniendo resultados muy parecidos a los que nosotros (mi equipo) mostramos.
En la quinta seccin se proporciona el listado del programa ensamblador, el cual tiene los comentarios
necesarios para su mejor comprensin y desarrollo. Por ltimo se presentan las conclusiones personales y la
bibliografa utilizada para el desarrollo de esta prctica.

III. DESARROLLO

En esta prctica realizaremos un cronmetro que desplegar los segundos as como los milisegundos
transcurridos desde el momento que este se pone en marcha, este arranque del cronmetro depender de una
tecla para iniciarlo y esa misma servir para detener el cronmetro; y una segunda tecla servir para
reinicializar a ceros el cronmetro. El sistema desplegar en tres displays de 7 segmentos, de los cuales dos
representan los segundos y un tercer display los milisegundos.
Dicho de otra forma, el programa principal consiste en un ciclo infinito que ejecutar la subrutina que
desplegar en los displays de 7 segmentos el tiempo del cronmetro. Este tiempo se configura en los registros
TCCR0, TIMSK y TCNT0, dentro de la interrupcin del TIMER de 100 [ms.], la subrutina usa el contenido de
estos registros para mostrar el tiempo transcurrido.
La interrupcin externa del microprocesador se encuentra en las entradas del puerto D como son INT0 e INT1,
el usuario del cronmetro podr hacer uso de estas interrupciones apretando la tecla de la interrupcin que
desee
Por otro lado el procesador ejecutar una subrutina de atencin de interrupcin. Esta subrutina de atencin de
interrupcin para cada una de las teclas es:
La subrutina de la tecla arranque/paro arrancar o parar el TIMER del cronmetro con ayuda de la
bandera T.
La subrutina de la tecla de re-inicializacin a ceros pondr a ceros los registros que llevan el tiempo del
cronmetro con la ayuda de la bandera T.

Para resolver el problema de esta prctica se tomo en cuenta el manejo de las interrupciones as como la
configuracin de los registros involucrados.
Se resolvi lo del paro y reinicio del cronometro solo con modificar los valores del registro tccr0 en el cual
podemos desactivar el reloj as como volverlo activar, una vez que se cambiaba los valores del tccr0 se proceda
a cambiar la bandera T para que posteriormente realizara el proceso contrario.
La practica original solo contemplaba el uso de una interrupcin el cual tena la funcin de parar o continuar
con la cuenta del cronometro. Debido a que en la practica 1 ya habamos manejado las interrupciones se
decidi por agregar una interrupcin adicional el cual reiniciara el cronometro a cero, no importando si este
estuviera detenido o andando.
Bsicamente esta prctica es una continuacin de la practica 1, la cual mostraba los minutos (0-9), los segundos
(0-59) y los milisegundos (0-9), debido a que en la prctica se utilizaban los cuatro puertos, en esta se quitaron
los minutos para poder tener acceso al puerto D que es donde se encuentran las interrupciones externas del
microprocesador.
Se asignaron los siguientes valores a los registros TCCR0, TIMSK y TCNT0
TCCR00x05 para usar un preescalador de 1024
TIMSK0X02 que sirve para activar la interrupcin por desbordamiento, en nuestro caso DEL TIMER0
TCNT0216 este valor fue obtenido de la siguiente formula
Tiempo=Preescaler*(255-Precarga)*Interrupciones*

(
1
).. 1
donde:
Tiempo=100ms (Este fue el tiempo base que elegimos por simplicidad para realizar el cronometro)

=0.25X10
-6
ya que usamos un oscilador de 4MHz
Preescaler=1024
Interrupciones=10 este valor lo decide el programador y puede valer de 1 a 255, por el tamao del registro.
Valor=255-Precarga=

=39.0625 lo aproximamos a 39
Precarga=255-valor=216
Sustituyendo estos valores en nuestra formula 1
Tiempo = 1024*(255-216)*10*0.25X10
-6
=99.84X10
-3
que se aproxima a los 100ms que requerimos, por lo tanto
trabajaremos con estos valores.
El cdigo empleado para los displays se hizo en base a un display de siete segmentos de nodo comn, y por la
tanto para encender algn segmento del display el valor necesario es un cero lgico. Como se ver ms
adelante en la parte donde se encuentra el listado del programa implementado (seccin V), los cdigos fueron
guardados uno a uno y tienen la convencin que se muestra en la tabla 1:

Puerto A A7 A6 A5 A4 A3 A2 A1 A0
Puerto B B7 B6 B5 B4 B3 B2 B1 B0
Puerto C C7 C6 C5 C4 C3 C2 C1 C0
Segmento h g f e d c b A
Tabla 1. Salidas dirigidas a cada display.

Antes de mostrar el diagrama del circuito debemos saber que los materiales y equipo necesario para la
realizacin de esta prctica son:

Tablilla de experimentacin con el procesador ATmega8515 y sus circuitos asociados (reloj, reset, etc).
Fuente de alimentacin de + 5V.
PC para editar, ensamblar y cargar el programa al procesador.
Grabador del procesador ATmega8515.
3 displays de 7 segmentos.
Componentes adicionales requeridos por su propio diseo.

IV. DIAGRAMA DEL CIRCUITO

A continuacin se presenta el diagrama del circuito (Figura 1) que se implemento para desplegar los dgitos
hexadecimales que representan el conteo del cronmetro. El circuito tiene el detalle de que se utilizaron
resistencias limitadoras de corriente (220, segn fabricante displays) a la salida del procesador para proteger
los display. El diagrama de las conexiones es el siguiente.

Fig. 1 Conexin del circuito cronmetro con paro, inicio y reinicio a ceros.
Nota: Todas las resistencias utilizadas en los displays son de 330, la resistencia del reset es de 1K, estos son
valores comunes para este tipo de circuitos.
A continuacin se muestran los diagramas de flujos.

Fig. 2 Diagrama de flujo de la rutina principal
Codif_ms
Codif_sa
Codif_sb
Codif_m
portadisp_sa
portddisp_sb
portcdisp_ml
portbdisp_m



Fig. 3 Diagrama de interrupcin INT0, start-stop











Fig.4 Diagrama de interrupcin INT1, reinicio a ceros.




ISR_INT0
T=0
tccr00x00
tccr10x05
FIN_ISR_INT0
ISR_INT1
sega0x00
segb0x00
segc 0x00
tcnt00x00
FIN_ISR_INT1
V. LISTADO DEL PROGRAMA EN ENSAMBLADOR

El listado del programa que se implemento para que hiciera las funciones descritas en la parte del desarrollo, a
continuacin se muestra. A dems el listado contiene los comentarios necesarios para hacer la estructura del
programa lo ms explcita posible.
.include "m8515def.inc"
.org $0000 ;direccionamiento de posicion de inicio de programa
rjmp inicio
.org int0addr ;direccionamiento de rutina de interrupcin externa 0
rjmp start_stop
.org int1addr ;direccionamiento de rutina de interrupcin externa 1
rjmp ceros
.org ovf0addr ;direccionamiento de rutina de interrupcin de timer0
rjmp isr_100ms

;++++++++ definicin de registros a utilizar ++++++++++++
.def aux =r16
.def disp_sa =r17
.def disp_sb =r18
.def disp_ml =r19

.def cont =r21
.def mlseg =r22
.def sega =r23
.def segb =r24


;+++++++++++++++ configuracion e iniciacin del AVR ++++++
inicio:
ldi aux,low(ramend) ; configuracin de la pila
out spl,aux ;Establecer puntero de pila para parte inferior de RAM
ldi aux,high(ramend)
out sph,aux ;Establecer puntero de pila para parte superior de RAM

ldi aux,0x40 ;configuracin de las interrupciones
out gicr,aux
ldi aux,0x03
out mcucr,aux


ldi aux,0x05 ;configuracin del timer 0
out tccr0,aux ;Registro de control temporizador/contador
ldi aux,0x02
out timsk,aux ;Registro de mscara de interrupcin (TIMSK)
ldi aux, 216
out tcnt0,aux ;El temporizador / contador (TCNT0)

sei ;Habilitacion global de interrupcin

ser aux ;configuracin de puertos de salida
out ddra,aux
out ddrb,aux
out ddrc,aux
clr aux
out porta,aux
out portb,aux
out portc,aux

out ddrd,aux ;Configuracin de Puerto de entrada




ldi r27,0x00 ;direccionamiento de la memoria ram
ldi r26,0x60 ;por medio del apuntador X
;===========================================
; Almacenamiento de datos en la memoria ram
; Estos datos son los que se desplegaran en los
; Displays de 7 segmentos
;===========================================
ldi aux,0xc0 ;CODIGO (7 SEGMENTOS) PARA 0
st x+,aux
ldi aux,0xf9 ;CODIGO (7 SEGMENTOS) PARA 1
st x+,aux
ldi aux,0xa4 ;CODIGO (7 SEGMENTOS) PARA 2
st x+,aux
ldi aux,0xb0 ;CODIGO (7 SEGMENTOS) PARA 3
st x+,aux
ldi aux,0x99 ;CODIGO (7 SEGMENTOS) PARA 4
st x+,aux
ldi aux,0x92 ;CODIGO (7 SEGMENTOS) PARA 5
st x+,aux
ldi aux,0x82 ;CODIGO (7 SEGMENTOS) PARA 6
st x+,aux
ldi aux,0xf8 ;CODIGO (7 SEGMENTOS) PARA 7
st x+,aux
ldi aux,0x80 ;CODIGO (7 SEGMENTOS) PARA 8
st x+,aux
ldi aux,0x98 ;CODIGO (7 SEGMENTOS) PARA 9
st x+,aux

ldi mlseg,0x00
ldi sega, 0x00
ldi segb, 0x00

clt ;limpieza de la bandera T, para iniciar el cronometro se debe oprimir el boton
;de inicio INT0

;+++++++++++++++++++++++++++++++++++++++
main:
rcall codif_ml ;rutina principal
rcall codif_sa
rcall codif_sb
out porta,disp_sa
out portb,disp_sb
out portc,disp_ml
rjmp main
;---------------------------------------

;+++++++++++++++++++++++++++++++++++++++
codif_ml: ;rutina que manda los datos a desplegar
ldi r26,0x60 ;en el display A
add r26,mlseg
ld disp_ml,x
ret

codif_sa: ;rutina que manda los datos a desplegar
ldi r26,0x60 ;en el display B
add r26,sega
ld disp_sa,x
ret

codif_sb: ;rutina que manda los datos del display C
ldi r26,0x60
add r26,segb
ld disp_sb,x
ret ; e2

;---------------------------------------
;+++++++++++++++++++++++++++++++++++++++
start_stop: ;rutina de interrupcion externa INT0
brts bri ;salta a bri
ldi aux,0x05 ;habilita de nuevo el reloj para continuar con el conteo
out tccr0,aux
set
reti ;retorno de interrupcion
bri: ;deshabilita el reloj
ldi aux,0x00
out tccr0,aux ;con el valor de 0x00 no funciona el reloj y por lo tanto se
;detiene la cuenta
clt ;pone a cero T
reti ;retorno de interrupcion
;---------------------------------------

ceros: ;rutina de interrupcion externa INT1
clr sega ;limpia los display
clr segb ;limpia los display
clr segm ;limpia los display
ldi aux,216 ;asigna de nuevo el valor para que inicie correctamente la
cuenta
out tcnt0,aux
reti ;retorno de interrupcion



;+++++++++++++++++++++++++++++++++++++++
isr_100ms: ;rutina de interrupcion del timer0
ldi aux, 216
out tcnt0,aux ;carga el valor de aux al registro tcnt0
dec cont
breq actu_mlseg
reti ;retorno de interrupcion
;---------------------------------------
;+++++++++++++++++++++++++++++++++++++++
actu_mlseg: ;rutina de actualizacion de milisegundos
ldi cont,10
cpi mlseg,0x09
breq actu_sega
inc mlseg
reti ;retorno de interrupcion
;---------------------------------------
;+++++++++++++++++++++++++++++++++++++++
actu_sega: ;rutina de actualizacion de segundos
clr mlseg ;unidades
cpi sega,0x09
breq actu_segb
inc sega
reti ;retorno de interrupcion
;---------------------------------------

;+++++++++++++++++++++++++++++++++++++++
actu_segb: ;rutina de actualizacion de segundos
clr sega ;decenas
cpi segb,0x05
breq ini_cue
inc segb
reti ;retorno de interrupcion
;---------------------------------------

;+++++++++++++++++++++++++++++++++++++++
ini_cue: ;rutina de reinicio de cuenta
clr segb
reti ;retorno de interrupcion
;---------------------------------------

VI. CONCLUSIONES
En esta prctica, el objetivo buscado era el de trabajar con las interrupciones externas y acoplarlas junto con el
timer del micro Atmega8515 a un contador de tiempo, por medio de la interrupcin INT0 se arranca el
contador y tambin se detiene; por la interrupcin INT1 el contador se resetea a ceros independientemente de
si el contador est parado o trabajando; el timer es el encargado de controlar los ciclos y llevar el tiempo de
operacin para lograr la cuenta correcta del tiempo.
Podramos decir que se cumpli con el objetivo pero cabe sealar que hubo un pequeo detalle que no se
corrigi, esto fue el efecto de los rebotes, aunque era muy raro cuando el programa no obedeca la
interrupcin ya sea la de INT0 o INT1, es un efecto que se intento corregir con software al comparar la bandera
2 veces en un intervalo de tiempo de 20 ms, este despus de la primera interrupcin ya no obedeca las
consiguientes, el programa fue simulado y ah si se obtenan los resultados esperados, al no ver avances con
dicha correccin se opto por no tomarlo en cuenta, aunque tambin se pudo corregir con hadware con un
circuito sencillo que usa un flip flop y algunos capacitores.
BIBLIOGRAFA:

DataSheetAtmega8515
(1). http://www.todopic.com.ar/foros/index.php?topic=27420.100

Vous aimerez peut-être aussi