/*************************************************************
Este código simula la lectura de un enconder incremental de dos canales.
Como son 2 señales desfasadas 90º:
- Cuando van en un sentido (+):
- Cuando llega una interrupción al canal A, las señales son distintas
- Cuando llega una interrupción al canal B, las señales son iguales
- Cuando van en un sentido (-):
- Cuando llega una interrupción al canal A, las señales son iguales
- Cuando llega una interrupción al canal B, las señales son distintas
**************************************************************/
//#include <M5Core2.h>
#define channelA 13
#define channelB 14
volatile int pulsos;
void IRAM_ATTR ISR_ChannelA()
{
if (digitalRead(channelA) != digitalRead(channelB))
{
pulsos++;
}
else
{
pulsos--;
}
}
void IRAM_ATTR ISR_ChannelB()
{
if (digitalRead(channelA) == digitalRead(channelB))
{
pulsos++;
}
else
{
pulsos--;
}
}
void setup() {
//M5.begin();
Serial.begin(9600); // Inicio la comunicacion con el puerto serie
Serial.println("Conectado!");
// Selecciono los pines como entrada
pinMode(channelA, INPUT);
pinMode(channelB, INPUT);
//Inicializo la variable pulsos
pulsos = 0;
// Activo las interrupciones
attachInterrupt(digitalPinToInterrupt(channelA), ISR_ChannelA, CHANGE);
attachInterrupt(digitalPinToInterrupt(channelB), ISR_ChannelB, CHANGE);
}
void loop() {
Serial.println(pulsos);
delay(100);
}