Está en la página 1de 6

Instituto Politcnico Nacional

Unidad Profesional Interdisciplinaria


de Ingeniera y Tecnologas Avanzadas

Prctica 2

Interrupciones
Materia:

Microcontroladores avanzados
Profesor:

Mndez Martnez Mauricio


Alumnos:
Rosas Daz Antonio
Sarabia Santoyo Lizbeth

Grupo: 4MM5

Fecha de entrega: 04 - marzo - 2015


Introduccin
Interrupciones
!!!!!!!!!!!RESUMIRRRRRRRRRRRRRRRR

Lista de interrupciones en ATmega ordenado por prioridad:

Encoder
!!!!!!!!!!!!!!!!Definir encoder
En un encoder de resolucin 4x, en cada flanco de subida y bajada hace la
comparacin entre canales.

En el primer sentido en los flancos del Canal A, las entradas son iguales. En
los flancos del Canal B, las entradas no son iguales.
En el segundo sentido en los flancos del canal A, las entradas no son
iguales. En los flancos del canal B, las entradas son iguales.

4 conteos

->

1vuelta

Desarrollo
Como se ve en la figura se comparan todos los flancos de subida y de bajada. En el flanco
en A si ambos canales son iguales y en los flancos del canal B son diferentes, gira en
sentido horario.
Para manejar una interrupcin de debe:
Habilitar el registro de interrupciones global (bit I de SREG) usando las funciones
sei().
Habilitar la interrupcin a manejar en el registro correspondiente.
Agregar una funcin con la ISR(nombre de vector) que contenga el cdigo de la
interrupcin.
Primero definimos libreras e inicializamos variables.

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h> //Librera interrupciones
int quad=0; //Cuenta sentido1
int quad2=0; //Cuenta sentido contrario

Funcin de interrupcin 0.
//en cada flanco de subida y bajada hay una interrupcin
ISR (INT0_vect) //Canal A - Interrupcin 0
{
_delay_ms(100);
if (
((PIND & 0b00001000)>>3)
== ((PIND & 0b00000100)>>2)
) //
Si CanalA (INT0)
=
CanalB (INT1)
{
//Aumenta sentido1
quad++;
}
else
{

//Disminuye sentido
quad--;

}
}

Funcin de interrupcin 1.
ISR (INT1_vect) //Canal B
{
//if ((PINB & (1<<0)) == (PINB & (1<<1))) Si ambos son iguales
if (
((PIND & 0b00001000)>>3)
== ((PIND & 0b00000100)>>2)
)
{
//Aumenta sentido 2
quad--;
return 0;
}
else
{
}

//Aumenta sentido 1
quad++;

int main(void)
{
cli(); //deshabilitamos interrupciones globales
//PIN D2 -> INT0 entrada sensor1
//PIN D3 -> INT1 entrada sensor2

//PUERTO A y B -> salidas


DDRA = (1<<DDA7) | (1<<DDA6) | (1<<DDA5) | (1<<DDA4) | (1<<DDA3) |
(1<<DDA2) | (1<<DDA1) | (1<<DDA0);
DDRB = 0xFF;
PORTA = 0x00;
PORTB = 0x00;
//CONFIGURACION DE INT0 CON CUALQUIER CAMBIO (flanco de subida y bajada)
MCUCR |= (1<<ISC00) | (0<<ISC01)| (1<<ISC10)| (0<<ISC11); //Cualquier flanco,
INT0, INT1
//MCUCR |= (1<<ISC00) | (0<<ISC01);
//GIFR - banderas
//General Interrupt Control Register
GICR |= (1<<INT0)| (1<<INT1);
//HABILITAMOS INT0, INT1
//GICR |= (1<<INT0);
sei();

//habilitamos interrupciones globales

while(1)
{
PORTA = quad;
//PORTB = quad2;
}

Conclusiones
La funcin de la interrupcin es darle prioridad a una tarea. Si se esta ejecutando un
programa dentro de un void main, al llegar una interrupcin se deja de hacer lo que se esta
ejecutando para ejecutar lo de la interrupcin. Se puede generar por un lfanco de subida o
dos. Despus de la interrupcin se sigue con la tarea en la que se haba quedado.
Sarabia Santoyo Lizbeth

Bibliografa
Datasheet ATMega 8535
http://picfernalia.blogspot.mx/2013/02/codificadores-en-cuadratura.html