Está en la página 1de 4

Trabajo Práctico

Materia: Técnicas Digitales II.

Tema: Timers.

Profesor: Ing. Cristian Conejeros.

Integrantes: Angela siles


Ayelen Diaz
Jennifer Parada
Yanina yapura
Se necesita implementar un temporizador que permita controlar el tiempo de un
proceso químico. Para tal fin se cuenta con un sistema con un Atmega128 y un display
7 segmentos de 4 dígitos, conectados como se indica en el ejercicio 6. El temporizador
debe permitir configurar el tiempo con formato MM:SS en base a 2 pulsadores (INT5 –
INT6) y debe tener un control de inicio/parada en base otro pulsador (INT7). También
debe poder poner a cero el tiempo fijado, siempre cuando el timer está en
reposo,
presionando los dos pulsadores al mismo tiempo (INT5-INT6). Una vez iniciada la
cuenta regresiva se debe activar una salida (PORTD.4) y al llegar al final de la cuenta se
debe desactivar la misma, generando también una señal de alarma (PORTD.7)
intermitente que controlará un buzzer para indicar el final del proceso (debe sonar 3
veces).

Esquema del Circuito:


Codigo :

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <stdio.h>
#include <stdlib.h>
#include "Timer0.h"
#include "MyDefs.h"
///variables///
unsigned char digito1,digito2,digito3,digito4;
unsigned char m[3], s[3];
volatile char cont_1=0 ,cont_2=0;//contadores
volatile char zeta_1=0,zeta_2 = 0;//avanzar o disminuir los contadores
volatile int i = 0;
ISR(INT6_vect){
if(TestBit(PINE,6)==0){ //si está apretado el pulsador 6
zeta_1 = 1; //empieza a avanzar segundo
}else{ zeta_1=0;//no avanza cont
}}
ISR(INT5_vect){
if(TestBit(PINE,5)==0){//si está apretado el pulsador 5
zeta_2 = 1;//empieza a avanzar minutos
}else{ zeta_2 = 0;//no avanza
}}
ISR(INT7_vect){
if(TestBit(PINE,7)==0){//si está apretado el pulsador7
zeta_1 = -1; //empieza a disminuir
LED4_ON; //al empezar enciende el led 4
}else{
LED7_OFF;
zeta_1=0; //ambos se detienen tanto el cont de seg y min
zeta_2 = 0; } }
int main(void){
DDRA=0xFF;
DDRE=0;
DDRD|=(1<<7)|(1<<4);
PORTD|=(1<<7)|(1<<4);
Timer0_init(CTC,Timer0_Prescaler_32,Toggle_On_Comp_Match);
OCR0=250;
TIMER0_COMP_Interrupt_ON;
//habilitó la interrupciones
EICRB|=(1<<ISC50)|(1<<ISC60)|(1<<ISC70);
EIMSK|=(1<<INT5)|(1<<INT6)|(1<<INT7);
sei(); //habilitación global
while(1){
if (cont_1<60){//segundo
snprintf(s, sizeof(s), "%2d", cont_1);
digito3 = s[0];
digito4 = s[1]; //dígito va contener las cifras de cont_1
cont_1 = cont_1 + zeta_1;
_delay_ms(5); }else{
cont_1 = 0; }
if(cont_2<60){//minutos
snprintf(m,sizeof(m),"%2d",cont_2);
digito1 = m[0]; //cada m contiene las cifras de cont_2
digito2 = m[1];
_delay_ms(5);
cont_2 = cont_2 + zeta_2;}
if(cont_1 == 00 && TestBit(PINE,7)==0 && cont_2!=00){
//cada vez que segundos llegue a cero,cont_1 va a iniciar a nuevamente 59
snprintf(s, sizeof(s), "%2d", cont_1);
digito3 = s[0];//s contiene la cifras de cont_1
digito4 = s[1];
_delay_ms(5);
cont_1 = 59;
cont_2--;//disminuyo minutos
zeta_2 = 0; }
if(TestBit(PINE,5)==0 && TestBit(PINE,6)==0){
//si ambos pulsadores están apretados entonces se reinicia el contador
cont_1=0;
cont_2 =0; }

if(cont_1 == 00 && cont_2 == 0 && TestBit(PINE,7)==0 && TestBit(PIND,4)==0){


//y si pine7 está apretado y led4 está activado
LED4_OFF;
i=0;
do { //género una señal de tres pitidos
LED7_CHG;//cambio de estado
_delay_ms(5);
i++;
} while (i<6);
LED7_OFF; //apago el led7
}}
while(1);
return 0; }

También podría gustarte