Contador de interrupciones

5
Universidad Autónoma de Chihuahua Facultad de ingeniería Microprocesadores Practica 3 Integrantes del equipo: Marcos Samuel Gómez García 199441 Luís Gerardo Arreola Vivanco 199470 Hugo Cesar Ortiz Palma 199729

description

Contador de interrupciones utilizando un microcontrolador ATMEL 8052 programado en lenguaje ensamblador.

Transcript of Contador de interrupciones

Page 1: Contador de interrupciones

Universidad Autónoma de Chihuahua

Facultad de ingeniería

Microprocesadores

Practica 3

Integrantes del equipo:

Marcos Samuel Gómez García 199441

Luís Gerardo Arreola Vivanco 199470

Hugo Cesar Ortiz Palma 199729

Page 2: Contador de interrupciones

Reporte Práctica #3

Objetivo:

Implementar un contador de interrupciones externas

Material:

- Un microcontrolador del tipo 8051

- 2 displays de 7 segmentos

- 2 transistores 2n2222

- Un circuito inversor

- 1 capacitor

- 2 push buttons

- Un cristal de 12Mhz

- Protoboard

- Cable

Desarrollo:

Se manejará el pin 12 del microcontrolador que es el tercer pin de puerto 3 (P3.2)

asignado para las interrupciones externas al dispositivo.

Las interrupciones serán mandadas por un push button que estará conectado a dicho pin

del dispositivo. Cada vez que se presione el push button se deberá de generar una

interrupción, la cual será acumulada en memoria de programa para su procesamiento y

su posterior despliegue en los displays.

Se utilizarán 2 displays de 7 segmentos los cuales deberán de estar conectados en forma

multiplexada y generaran una numeración del 0 al 9 cada display para que de ese modo

se pueda lograr un conteo hasta el 99 y rebasando ese numero debe de regresar a 00

Los displays se encenderán alternadamente pero a una gran velocidad para que de esa

manera se puedan visualizar el contenido de cada display casi al mismo tiempo. Para

esto se utilizará un circuito inversor, el cual dependiendo del dato que provenga del pin

P2.0 mandará una bandera hacia los displays previamente pasando por los transistores

para que de esa manera puedan encender alternadamente según sea requerido.

Los displays deben de mostrar un 00 al encendido asi como al momento de resetear el

programa.

La configuración del reset y del cristal es la típica configuración que se debe seguir al

utilizar este tipo de microcontrolador.

Las conversiones de los números a 7 segmentos se deben realizar por medio de software

así como el switcheo de los displays y el conteo de las interrupciones al presionar el

botón correspondiente.

Observaciones:

Antes que nada se debe hacer un salto hacia el programa principal para respetar el

espacio en donde el vector de interrupciones trabaja.

Se deben de activar las interrupciones, definir el tipo de disparo de la interrupción así

como el tipo de interrupción a utilizar.

Page 3: Contador de interrupciones

La subrutina de interrupción debe de regresar con la instrucción RETI.

Los datos que irán a ambos displays saldrán por el mismo puerto.

Se debe declarar una tabla para la conversión a 7 segmentos.

Comentarios:

Esta práctica también se pudo haber realizado utilizando circuitos decodificadores para

no tener que realizar la conversión a 7 segmentos por medio de software ni los

transistores y el circuito inversor, ya que si se realiza un ajuste a decimal se nos

mostraban los números de 0 a 99 en formato BCD lo cual facilitaba la tarea ya que ya

nos daban las decenas en 4 pines y las unidades en los otros 4 pines restantes.

También se podía mostrar las unidades por un puerto y las decenas por otro y cada uno

conectarse a displays distintos. Pero esto ya es cuestión de diseño.

Al presionar el botón de la interrupciones en veces se contaban más de las instrucciones

pedidas, al parecer el botón era demasiado sensible al toque y mientras mas se

presionaba mas interrupciones contaba. También se dio el caso de que al llegar a 99 y

volver a empezar no quería avanzar de nuevo hasta que se presionará el reset, pero solo

al probarlo físicamente ya que en la simulación funcionaba perfectamente.

Conclusiones:

Se utilizó la interrupción por transición ya que de esa manera automáticamente al

presionar el botón se genera la interrupción y sale de la rutina de interrupción casi al

instante.

Se utilizaron displays de ánodo común para conectarlos directamente a Vcc para su

mejor visualización.

Código:

JMP INICIO;Salta a la etiqueta INICIO

ORG 3;Direccion del vector de interrupcion

CLR A;Pone en ceros el registro acumulador

MOV A,R0;Mueve lo que traiga R0 al acumulador

ADD A,#01;Incrementa la cuenta en 1

MOV R0,A;Mueve lo del acumulador a R0

CJNE R0,#0Ah,FINAL;Compara si lo que tiene R0 es un 10

avanza sino salta a la etiqueta FINAL

MOV R0,#0;Pone en ceros el contenido de R0

CLR A;Pone en ceros el registro acumulador

MOV A,R1;Mueve lo que traiga R1 al acumulador

ADD A,#01;Incrementa la cuenta en 1

MOV R1,A;Mueve lo del acumulador a R0

CJNE R1,#0Ah,FINAL;Compara si lo que tiene R1 es un 10

avanza sino salta a la etiqueta FINAL

MOV R1,#0;Pone en ceros el contenido de R1

Page 4: Contador de interrupciones

FINAL: RETI;Termina subrutina de interrupcion

INICIO: MOV DPTR,#TABLA;Mueve los datos de la direccion de la

tabla al registro DPTR

MOV R0,#0;Manda un cero al registro R0

MOV R1,#0;Manda un cero al registro R1

MOV R2,#81H;Manda un 81h al registro R2

MOV P0,R2;Muestra 00 en displays por el puerto cero

PRINCIPAL: SETB IT0;Activa la interrupcion por transicion

SETB EA;Habilita todas las interrupciones del puerto

SETB EX0;Habilita la interrupcion externa cero

MOV A,R0;Mueve lo que traiga R0 al acumulador

MOVC A,@A+DPTR;Agrega al acumulador los datos que

traiga el puntero

CLR C;Mueve un cero al registro de acarreo

MOV P2.0,C;Mueve lo que traiga el acarreo al pin cero del

puerto dos

MOV P0,A;Muestra por el puerto cero los datos que traiga el

registro A

CLR A;Pone en ceros el registro acumulador

MOV A,R1;Mueve lo que traiga R1 al acumulador

MOVC A,@A+DPTR;Agrega al acumulador los datos que

traiga el puntero

SETB C;Mueve un uno al registro de acarreo

MOV P2.0,C;Mueve lo que traiga el acarreo al pin cero del

puerto dos

MOV P0,A;Muestra por el puerto cero los datos que traiga el

registro A

CJNE R0,#0AH,PRINCIPAL;Compara si lo que tiene R0 es un

10 avanza sino salta a la etiqueta PRINCIPAL

CJNE R1,#0AH,PRINCIPAL;Compara si lo que tiene R1 es un

10 avanza sino salta a la etiqueta PRINCIPAL

JMP INICIO;Salta a la etiqueta INICIO

Page 5: Contador de interrupciones

;xabc defg

TABLA: DB 0081h;0 1000 0001

DB 00CFh;1 1100 1111

DB 0092h;2 1001 0010

DB 0086h;3 1000 0110

DB 00CCh;4 1100 1100

DB 00A4h;5 1010 0100

DB 00A0h;6 1010 0000

DB 008Fh;7 1000 1111

DB 0080h;8 1000 0000

DB 0084h;9 1000 0100

END;Fin del programa