Está en la página 1de 8

SUCRE INSTITUTO SUPERIOR TECNOLÓGICO

LABORATORIO DE MICROCONTROLADORES

ÁREA: ELECTRÓNICA DOCENTE: ING.FABRICIO TIPANTOCTA

NOMBRE: MARCO ZHUNIO ESPECIALIDAD: ELECTRONICA

PARALELO: FECHA: -----/-----/2023. NOTA----/ 10

INTERRUPCIONES, ADC y PWM

1 OBJETIVOS
Familiarizar al estudiante al uso de interrupciones, adc y pwm en un microcontrolador, programando
utilidades importantes en el uso de programación.
2 INFORMACIÓN
Una interrupción se define como un pedido de alta prioridad que un dispositivo exterior o un evento de
programación solicita a la CPU para ejecutar otro programa.
INTERRUPCION EXTERNA
Las interrupciones externas en el ATmega2560 son activadas con los pines INT0, INT1, INT2, INT3, INT4 e
INT5 en caso de que se habiliten las interrupciones los pines INT siempre activaran alguna interrupción sin
importar como se haya configurado el puerto en el que estos pines se encuentren. Las interrupciones
externas se habilitan cuando la entrada del pin, cambia de estado, se puede configurar si se requiere que se
active cuando cambia de un estado bajo a uno alto o viceversa.
3. TRABAJO PREPARATORIO
3.1 En el datasheet del microcontrolador ATmega 2560, consultar el diagrama del hardware de
interrupciones.
TX - Este pin se usa para enviar o recibir una
señal digital. Dentro de nuestros programas
configuraremos si es de salida o de entrada y en
este último caso disponemos de una resistencia
"pull-up" de 20Kohm (por defecto esta
desconectada). Especialmente en este pin lo
tenemos conectado al AtMega 16U2 para la
transmisión de datos al puerto USB. Lo podemos
usar también para transmitir de placa Arduino
señales serie TTL-UART (serial 0) hacia el exterior.

www.tecnologicosucre.edu.ec
A0 a A15 - Estos pines se usa para recibir una tensión entre 0 y 5V. Esta tensión será
convertida mediante un conversor A/D de 10 bits incorporado en el MCU a un valor
digital utilizable en nuestros programas. Tener en cuenta que solo hay un
conversor A/D en el MCU, por lo que si vamos a leer mas de un pin de entrada
analógico los leerá uno y luego el otro (funcionalmente para nosotros funciona
como si tuviera un conversor en cada entrada).
También podemos usar este pin como entrada y salida digital. Si lo declaramos asi
en nuestro programa la entrada A0 tomara el número 54 y será un puerto digital
igual que los demás. La A1 tomara el número 55, así sucesivamente hasta la A15
que tomara el número 69.

www.tecnologicosucre.edu.ec
AREF - Este pin se usa para entregar al MCU una referencia superior del rango
del conversor A/D del MCU. Normalmente tenemos esta referencia a 5V, lo que
hace que al tener 1024 pasos (10 bits) de resolución la precisión del conversor
es de: 5V/1024pasos=0,00488V, aprox. 5mV. Pero si estuviéramos seguros de
no tener en la entrada analógica nunca mas de, por ejemplo 1V, estaríamos
desperdiciando resolución y precisión. Aquí entra en juego el pin AREF: si
proporcionamos a este pin un voltaje de 1V conseguiremos que el conversor
solo acepte la ventana desde 0V a 1V y la precisión de la conversión seria
ahora de: 1V/1024pasos=0,000976V o lo que es lo mismo 0,97mV.
Efectivamente hemos aumentado muchísimo la precisión de la conversión y
será mas exacta.

Mega2560 pin 2 pin3 pin 21 pin 20 pin 19 pin 18


a) El modelo Arduino Due tiene mayor capacidad de interrupciones, permite añadir funciones de
interrupción en todos los pins, especificando el numero de pin en la función attachInterrupt().
b) Dentro de las funciones de servicio de interrupción (añadidas a través de attachInterrupt()), la
función delay() no trabaja.
c) De igual forma para la función millis(), el valor que retorna no se incrementara.

3.2 Diseñe un programa para simular un Invernadero que tiene una puerta para entrada y una para salida.
1. Usar un motor para emular la apertura y cierre de la puerta automáticamente tanto a la entrada como
a la salida. Inicialmente debe empezar el programa con la apertura y cierre de la puerta y según
condiciones debe abrirla o cerrarla.
2. Un sensor de presencia (pulsador), cuando se acerca una persona abre la puerta y la mantiene abierta
por 5 segundos (Timer) y luego la cierra. Colocar un led de aviso de ingreso de persona y el mismo
sistema para la salida.
3. En dos displays de 7 segmentos se debe presentar el número de personas que hay en el aforo, con
dos sensores de presencia (dos pulsadores) conectados en la puerta de entrada simular el acceso de
personas (usar interrupciones), y de la misma forma para la salida.

www.tecnologicosucre.edu.ec
4. El invernadero tiene un sensor de temperatura(lm35), y se presenta la temperatura en tres display de
7 segmentos.
5. En el invernadero se debe controlar la temperatura entre 30°C y 80°C y para ello se colocará un
ventilador(motor pwm) que cuando la temperatura ascienda hasta los 50° el ventilador funcionará
hasta el 100%, y cuando baja hasta 30 o menos el ventilador funcionará al 0%. El incremento y ascenso
de la temperatura se lo puede simular con un cautín, el pwm debe variar entre 0 y 100%.
4 Materiales
Protoboard.
Microcontrolador atmega2560
Cables de proto
Led, Dipsw
Multímetro
5.Procedimiento
}
unsigned long tiempo2 = 0; // variables par ael
temporizador
void cerrar(){ //funcion que resta al contador si
int ta=700;//tiempo que se demora en abrir la se activa el sensor de salida
puerta if(cont==0){ // verifica qeu el ciclo de la
int te=1000;// tiempo que se demora abierta la puerte este listo para iniciar
puerta (5s) j=j-1;
int tc=700;// tiempo que demora en cerrar la if(j<0){
puerta i=i-1;
if(j<=0){
int cont=1;// variable para controlar el proceso j=0;
de la puerta, apertura =1,espera=2 ,cierre=3 }
int a=5; if(i>0){
int b=7; j=9;
int c=4; }
int d=11; }
int e=10; is=1;
int f=3; prender();
int g=6; }
int datos[5]; // almacena los datos del contador y }
de la temperatura
int s1=0,s2=0;
int i=0; // registra las unidades //FUNCION LIMPIAR DIGITO, TODOS LOS LEDS APAGADOS
int j=0; // registra las decenas void limpiar(){
int motor=0; // variable qeu almacena el pwm para digitalWrite( 5, LOW); // A
el motor digitalWrite( 7, LOW); // B
int is=0; // variable para controlar si salen o digitalWrite( 4, LOW); // C
entran digitalWrite(11, LOW); // D
int val; // varible qeu registra el valor del LM35 digitalWrite(10, LOW); // E
digitalWrite( 3, LOW); // F
void setup(){ digitalWrite( 6, LOW); // G
Serial.begin(9600);
pinMode(13, OUTPUT); }
pinMode(12, OUTPUT);
pinMode(11, OUTPUT); //FUNCIONES DE NUMEROS PARA DISPLAY
pinMode(10, OUTPUT);

www.tecnologicosucre.edu.ec
pinMode(9, OUTPUT); void cero(){
pinMode(8, OUTPUT); /* digitalWrite(a,HIGH);
pinMode(7, OUTPUT); digitalWrite(b,HIGH);
pinMode(6, OUTPUT); digitalWrite(c,HIGH);
pinMode(5, OUTPUT); digitalWrite(d,HIGH);
pinMode(4, OUTPUT); digitalWrite(e,HIGH);
pinMode(3, OUTPUT); digitalWrite(f,HIGH);
pinMode(27, OUTPUT);// para el punto decimal de digitalWrite(g,LOW);
la temperatura */
digitalWrite(a,LOW);
pinMode(21, OUTPUT); digitalWrite(b,LOW);
pinMode(A1, INPUT); digitalWrite(c,LOW);
digitalWrite(d,LOW);
pinMode(22, OUTPUT); digitalWrite(e,LOW);
pinMode(23, OUTPUT); digitalWrite(f,LOW);
pinMode(14, OUTPUT); digitalWrite(g,HIGH);
pinMode(15, OUTPUT); }
pinMode(44, OUTPUT); void uno(){
/*digitalWrite(a,LOW);
digitalWrite(13, LOW); digitalWrite(b,HIGH);
digitalWrite(12, LOW); digitalWrite(c,HIGH);
digitalWrite(9, LOW); digitalWrite(d,LOW);
digitalWrite(8, LOW); digitalWrite(e,LOW);
numero(0); digitalWrite(f,LOW);
digitalWrite(g,LOW);
attachInterrupt(digitalPinToInterrupt(19), abrir, */ digitalWrite(a,HIGH);
RISING); // se asigna la interrupciones para el digitalWrite(b,LOW);
ingreso digitalWrite(c,LOW);
attachInterrupt(digitalPinToInterrupt(20), digitalWrite(d,HIGH);
cerrar, RISING);// se asigna las interrupciones digitalWrite(e,HIGH);
para la salida digitalWrite(f,HIGH);
prender(); //inicia el ciclo de la puerta digitalWrite(g,HIGH);
} }
void dos(){
void loop(){ /* digitalWrite(a,HIGH);
digitalWrite(b,HIGH);
val= analogRead(A1); // lectura del LM35 digitalWrite(c,LOW);
float mv = (val/1024.0)*5000; // conversión del digitalWrite(d,HIGH);
valor del LM35 digitalWrite(e,HIGH);
float temp =mv/10; digitalWrite(f,LOW);
motor=map(temp,30,80,0,255); // mapeo de la digitalWrite(g,HIGH); */
temperatura para limitar el pwm al rango de 30 a
80 grados digitalWrite(a,LOW);
if(temp<=30){ // nos aseguramos que el pwm sea digitalWrite(b,LOW);
cero cuando la temperatura es menor a 30 digitalWrite(c,HIGH);
motor=0; digitalWrite(d,LOW);
} digitalWrite(e,LOW);
if(temp>=80){ // nos aseguramos que el pwm sea el digitalWrite(f,HIGH);
maximo cuando la temperatura mayor a 80 digitalWrite(g,LOW);
motor=255; }
} void tres(){
analogWrite(44,motor); // enviamos el valor del /*/ digitalWrite(a,HIGH);
pmw digitalWrite(b,HIGH);
digitalWrite(c,HIGH);
Serial.print("\n "); digitalWrite(d,HIGH);
digitalWrite(e,LOW);
Serial.print(temp,1); digitalWrite(f,LOW);

www.tecnologicosucre.edu.ec
digitalWrite(g,HIGH);
//refresca los datos del display */
for(int z=1; z<=5; z++){ digitalWrite(a,LOW );
datos[0]=i; digitalWrite(b,LOW);
datos[1]=j; digitalWrite(c,LOW);
datos[2]=temp/10; digitalWrite(d,LOW);
datos[3]=int(temp)-10*(int(temp)/10); digitalWrite(e,HIGH);
datos[4]=int((temp-int(temp))*10); digitalWrite(f,HIGH);
digito(z); digitalWrite(g,LOW);
numero(datos[z-1]); }
delay(1); void cuatro(){
} /* digitalWrite(a,LOW);
s1=digitalRead(19); // lectura de los sensores digitalWrite(b,HIGH);
de la puerta digitalWrite(c,HIGH);
s2=digitalRead(20); digitalWrite(d,LOW);
digitalWrite(e,LOW);
// ciclo de apertura y cierre de la puerta digitalWrite(f,HIGH);
if( cont==1 ){ digitalWrite(g,HIGH);*/
if (millis() - tiempo2 >= ta) { // digitalWrite(a,HIGH);
temporizador para mantener la puerta abierta digitalWrite(b,LOW);
tiempo2 = millis(); digitalWrite(c,LOW);
digitalWrite(14, LOW); digitalWrite(d,HIGH);
digitalWrite(15, LOW); digitalWrite(e,HIGH);
cont=2; digitalWrite(f,LOW);
} digitalWrite(g,LOW);
} }
if(cont==2){ void cinco(){
if (millis() - tiempo2 >= te) {// /*digitalWrite(a,HIGH);
temporizador para cerrar la puerta digitalWrite(b,LOW);
tiempo2 = millis(); digitalWrite(c,HIGH);
if(is==0){ digitalWrite(d,HIGH);
digitalWrite(22, LOW); digitalWrite(e,LOW);
} digitalWrite(f,HIGH);
if(is==1){ digitalWrite(g,HIGH);*/
digitalWrite(23, LOW); digitalWrite(a,LOW);
} digitalWrite(b,HIGH);
digitalWrite(14, LOW); digitalWrite(c,LOW);
digitalWrite(15, HIGH); digitalWrite(d,LOW);
cont=3; digitalWrite(e,HIGH);
} digitalWrite(f,LOW);
} digitalWrite(g,LOW);
if(cont==3){ }
if (millis() - tiempo2 >= tc) {// void seis(){
temporizador para apagar el motor de la puerta /*digitalWrite(a,HIGH);
tiempo2 = millis(); digitalWrite(b,LOW);
digitalWrite(14, LOW); digitalWrite(c,HIGH);
digitalWrite(15, LOW); digitalWrite(d,HIGH);
cont=0; // verifica qeu la puerta este digitalWrite(e,HIGH);
cerrada y qeu el ciclo haya terminado digitalWrite(f,HIGH);
} digitalWrite(g,HIGH);*/
} digitalWrite(a,LOW);
digitalWrite(b,HIGH);
} digitalWrite(c,LOW);
digitalWrite(d,LOW);
// FUNCION PARA HABILITAR DIGITO A IMPRIMIR digitalWrite(e,LOW);
void digito(int x){ digitalWrite(f,LOW);
digitalWrite(13, LOW); // dig 1 digitalWrite(g,LOW);

www.tecnologicosucre.edu.ec
digitalWrite(12, LOW); // dig 2 }
digitalWrite( 9, LOW); // dig 3 void siete(){
digitalWrite( 8, LOW); // dig 4 /* digitalWrite(a,HIGH);
digitalWrite( 21, LOW); // dig 5 digitalWrite(b,HIGH);
//DE ACUERDO AL VALOR SE HABILITA DIGITO digitalWrite(c,HIGH);
switch(x){ digitalWrite(d,LOW);
case 1: digitalWrite(13, HIGH); break; digitalWrite(e,LOW);
case 2: digitalWrite(12, HIGH); break; digitalWrite(f,LOW);
case 3: digitalWrite(9, HIGH); break; digitalWrite(g,HIGH);*/
case 4: digitalWrite(8, HIGH); break; digitalWrite(a,LOW);
case 5: digitalWrite(21, HIGH); break; digitalWrite(b,LOW);
} digitalWrite(c,LOW);
} digitalWrite(d,HIGH);
//DE ACUERDO AL VALOR SE IMPRIME DIGITO EN DISPLAY digitalWrite(e,HIGH);
void numero(int x){ digitalWrite(f,HIGH);
switch(x){ digitalWrite(g,LOW);
case 1: uno(); break; }
case 2: dos(); break; void ocho(){
case 3: tres(); break; /*digitalWrite(a,HIGH);
case 4: cuatro(); break; digitalWrite(b,HIGH);
case 5: cinco(); break; digitalWrite(c,HIGH);
case 6: seis(); break; digitalWrite(d,HIGH);
case 7: siete(); break; digitalWrite(e,HIGH);
case 8: ocho(); break; digitalWrite(f,HIGH);
case 9: nueve(); break; digitalWrite(g,HIGH);*/
default: cero(); break; digitalWrite(a,LOW);
} digitalWrite(b,LOW);
} digitalWrite(c,LOW);
void abrir(){ //función que suma al contador si se digitalWrite(d,LOW);
activa el sensor de entrada digitalWrite(e,LOW);
if(cont==0){ // verifica qeu el ciclo de la digitalWrite(f,LOW);
puerte este listo para iniciar digitalWrite(g,LOW);
j=j+1; }
void nueve(){
if(j>=9){ /*digitalWrite(a,HIGH);
i=i+1; digitalWrite(b,HIGH);
j=0; digitalWrite(c,HIGH);
} digitalWrite(d,HIGH);
is=0; // controla si la persona sale o entra 0 digitalWrite(e,LOW);
para detectar qeu entra digitalWrite(f,HIGH);
prender();// inica el ciclo de la puerta digitalWrite(g,HIGH);*/
} digitalWrite(a,LOW);
} digitalWrite(b,LOW);
digitalWrite(c,LOW);
void prender(){ // funcion que inicia el ciclo digitalWrite(d,LOW);
de la puerta digitalWrite(e,HIGH);
if(is==0){ // activa el led de entrada digitalWrite(f,LOW);
digitalWrite(22, HIGH); digitalWrite(g,LOW);
}
if(is==1){// activa el led de salida
digitalWrite(23, HIGH);
}
digitalWrite(14, HIGH);// prende el motor
abre la puerta
digitalWrite(15, LOW);
cont=1; // da paso al siguiente paso del
ciclo de la puerta }

www.tecnologicosucre.edu.ec
www.tecnologicosucre.edu.ec

También podría gustarte