Documente Academic
Documente Profesional
Documente Cultură
Prctica 2
Interrupciones
Materia:
Microcontroladores avanzados
Profesor:
Grupo: 4MM5
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
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