Sie sind auf Seite 1von 6

APLICACIONES DE LOS TIMERS DEL

MICROCONTROLADOR ATMEGA 164P


Carlos Montalvo
Laboratorio de Sistemas Microprocesadores.
Facultad de Ingeniería Eléctrica y Electrónica
Escuela Politécnica Nacional (EPN), Quito – Ecuador,
carlos.montalvo@epn.edu.ec

I. OBJETIVOS  El display de 4 dígitos de las


1.1. Implementar un circuito que simule el prácticas anteriores.
control de un horno de micro ondas
utilizando los temporizadores/contadores FUNCIONAMIENTO
(TIMERS) del microcontrolador Atmega Al encender el circuito el LED estará
164P apagado y el indicador mostrará 0000.
Con cada pulsación ST, en el display, en los
II. PREPARATORIO dos últimos dígitos, debe ir subiendo la
cuenta del tiempo de 10 en 10 de la siguiente
2.1. DesSe desea utilizar un Atmega 164p
manera: 0000, 0010, 0020,……, hasta 0099.
para simular el funcionamiento de un
El 100 se representa como 99.
horno de micro ondas. Dispone de los
Con cada pulsación de BT la cuenta debe
siguientes controles:
bajar de 10 en 10 de manera similar.
 Un pulsante conectado a INT0 que
Con cada pulsación SP, en el display debe ir
será ENCENDER
subiendo la cuenta de la potencia en los dos
 Un pulsante conectado al INT1 que
dígitos más significativos de 10 en 10 de la
será DETENER
siguiente manera: 0000, 1000, 2000,……,
 Un pulsante conectado al INT2 que
hasta 9900. El 100 se representa como 99.
será BORRAR
Con cada pulsación de BP la cuenta debe
 Un pulsante ST manejado por bajar de 10 en 10 de manera similar.
interrupción por cambio de estado Una vez que se ha seleccionado el tiempo y la
que sube el tiempo de 10 unidades en potencia y se presiona ENCENDER el
10 unidades entre 0 y 100 (mostrar microcontrolador debe entregar usa señal
99 en lugar de 100). sin pasarse de PWM al LED con una relación de trabajo
esos límites. igual al valor seleccionado de potencia (si se
 Un pulsante BT manejado por puso 50XX la relación de trabajo será 0,5, si
interrupción por cambio de estado se selecciona 70XX la relación de trabajo será
que baja el tiempo de manera similar 0,7) con una frecuencia lo más baja posible
al pulsante anterior. (de unos pocos Hz), mientras que en los dos
 Un pulsante SP manejado por dígitos menos significativos desde el tiempo
interrupción por cambio de estado seleccionado debe ir decrementando hasta
que sube la potencia de 10 unidades llegar a 00 en pasos de 1 segundo. Cuando la
en 10 unidades, entre 0 y cuenta de tiempo llegue a 00 el LED debe
100(mostrar 99) sin pasarse de esos apagarse.
límites.cribir los cambios realizados Si se presiona DETENER el LED se apaga
durante la práctica y la justificación pero las cuentas de potencia y tiempo en ese
que condujo a realizarse instante quedan en los valores que se
 Un pulsante BP manejado por encuentren. Al presionar ENCENDER se
interrupción por cambio de estado debe encender el LED y continúa la cuenta
que baja la potencia de tiempo desde donde quedó.
 de manera similar al pulsante Si en cualquier instante se presiona
anterior. BORRAR tiempo y potencia van a 00 y el
 Un LED que simula el horno cuando LED se apaga.
está encendido/apagado.
Preparar esta aplicación y simularla para out MCUCR,temp
probar su correcto funcionamiento.
sbi ddrb,7//salida del LED
.def temp = r17
.def ante = r18 nop
.def cont = r19

.def digito_1 = r21 //configrar interrupcion de pcint 8


.def digito_2 = r22 y 9 para l puerto B
.def digito_3 = r23
.def digito_4 = r24 LDI aux,0b0000_0010 //habilitando
.def control = r25 el puerto A y B
STS PCICR,aux

.org 0x00 LDI aux,0b0111_1000//habilitando


rjmp config pcint 8 y 9
.org 0x02 sts pcmsk1,aux
rjmp reset //int0 Mov r1,aux //guardamos el estado
.org 0x04 para despues usar el EOR para la pausa
rjmp pausa //int1
.org 0x06 in ante,pinB
rjmp alerta //int2
.org 0x08 //siempre se debe p
rjmp inta //interrupciones externas
.org 0x0A //direccion de de interrupcion cbi ddrd,2
puerto B cbi ddrd,3
rjmp intb sbi portd,2
config: sbi portd,3
//interuppcions por cambio de cbi ddrb,2
estado sbi portb,2
LDI temp,0b1000_0111 LDI aux,0b00_11_11_11//flanco de
OUT ddrB,temp bajada _ flacon de bajada _ flacon de
/*cbi ddrb,3 bajada para int2_int1_int0
cbi ddrb,4 STS EICRA,aux
cbi ddrb,5 LDI aux,0b00000_1_1_1
cbi ddrb,6 //Habilitando int 1 y 0
*/ OUT EIMSK,aux
LDI temp,0b0111_1000 nop
OUT portB,temp
/* SEI //para habilitar interrupciones
sbi portb,3 globales
sbi portb,4
sbi portb,5 //salidas de diplay
sbi portb,6 ser temp
*/ OUT ddrA,temp
in temp,MCUCR ser temp
andi temp, 0b11101111 OUT portA,temp
//Salidas de control sbrc temp,3
LDI temp,0b0000_1111 call player1
OUT ddrC,temp sbrc temp,4
LDI temp,0b1111_0000 call player2
OUT portC,temp sbrc temp,5
call player3
clr digito_1 sbrc temp,6
clr digito_2 call player4
clr digito_3 pop temp;recupero estado
clr digito_4 out SREG,temp
pop temp

rjmp main reti

main: reset://int0
rcall mostrar //borrar cuentas
clr digito_1
//Si uno llega a diez entonces se clr digito_2
acaba clr digito_3
CPI digito_1,10 clr digito_4
BREQ comp clr cont
CPI digito_2,10 //re habilitar interrupciones
BREQ comp LDI aux,0b0000_0010 //habilitando
CPI digito_3,10 el puerto A y B
BREQ comp STS PCICR,aux
CPI digito_4,10 LDI aux,0b0111_1000
BREQ comp STS pcmsk1,aux
rjmp main cbi portb,7
comp:
rcall comparar reti
rcall parar pausa://int1
SBI portB,7 push temp ; obligatorio se debe
salvar el estado
rjmp main in temp,SREG
push temp
inta: push aux
nop
reti LDI aux,0b0111_1000
EOR r1,aux
intb: Mov temp,r1
push temp ; obligatorio se debe STS pcmsk1,temp
salvar el estado
in temp,SREG
push temp pop aux
in temp,pinb pop temp;recupero estado
eor temp,ante out SREG,temp
in ante,pinB pop temp
reti
alerta://int2 //LDI control,0b1111_0010
cbi portb,7 LDI control,0b1111_1101
reti OUT portC,control
LDI zh,high(tabla<<1)
///////////////////////////////////////////// LDI zl,low(tabla<<1)
/////// //add zl,aux
add zl,digito_2
//Subrutinas lpm aux,z
out portA,aux
parar: call esperar
LDI aux,0b0000_0000 //habilitando clr aux
el puerto A y B OUT portA,aux
STS PCICR,aux
ret //LDI control,0b1111_0100
LDI control,0b1111_1011
player1: OUT portC,control
sbrc ante,3 LDI zh,high(tabla<<1)
INC digito_1 LDI zl,low(tabla<<1)
ret //add zl,aux
player2: add zl,digito_3
sbrc ante,4 lpm aux,z
INC digito_2 out portA,aux
ret call esperar
player3: clr aux
sbrc ante,5 OUT portA,aux
INC digito_3
ret //LDI control,0b1111_1000
player4: LDI control,0b1111_0111
sbrc ante,6 OUT portC,control
INC digito_4 LDI zh,high(tabla<<1)
ret LDI zl,low(tabla<<1)
//add zl,aux
add zl,digito_4
mostrar: lpm aux,z
out portA,aux
//LDI control,0b1111_0001 call esperar
LDI control,0b1111_1110 clr aux
OUT portC,control OUT portA,aux
LDI zh,high(tabla<<1)
LDI zl,low(tabla<<1) //LDI control,0b1111_0000
//add zl,aux LDI control,0b1111_1111
add zl,digito_1 OUT portC,control
lpm aux,z call esperar
out portA,aux //OUT portD,cont
call esperar
clr aux ret
OUT portA,aux esperar:
PUSH temp LDI digito_3,18
PUSH aux skip7:
IN temp,SREG
PUSH temp CPI digito_4,10
BRNE skip4
LDI temp,255 LDI digito_4,16
LDI aux,20 INC cont
rjmp skip8
lazo: skip4:
DEC temp LDI digito_4,18
BRNE lazo skip8:
MOV temp,aux
DEC aux //pasar empates
brne lazo CPI cont,2
BRSH ganadores
rjmp fin_1
POP temp ganadores:
POP aux CPI digito_1,16
OUT SREG,temp BRNE skip9
POP temp LDI digito_1,14
RET skip9:

comparar: CPI digito_2,16


//pasar ganadores BRNE skip10
CPI digito_1,10 LDI digito_2,14
BRNE skip1 skip10:
LDI digito_1,16
INC cont CPI digito_3,16
rjmp skip5 BRNE skip11
skip1: LDI digito_3,14
LDI digito_1,18 skip11:
skip5:
CPI digito_4,16
CPI digito_2,10 BRNE skip12
BRNE skip2 LDI digito_4,14
LDI digito_2,16 skip12:
INC cont
rjmp skip6
skip2: fin_1:
LDI digito_2,18
skip6:
ret
CPI digito_3,10
BRNE skip3
LDI digito_3,16
INC cont tabla:
rjmp skip7 .db 0b1011_1111,0b1000_0110
skip3: .db 0b1101_1011,0b1100_1111
.db 0b1110_0110,0b1110_1101
.db 0b1111_1101,0b1000_0111
.db 0b1111_1111,0b1110_0111
.db 0b1111_0111,0b1111_1100
.db 0b1011_1001,0b1101_1110
.db 0b1111_1001,0b1011_0001

Das könnte Ihnen auch gefallen