Eu uso um Arduino Uno e já o configurei para funcionar com interrupções nos pinos digitais 2, 3, 4 e 5 de acordo com uma explicação 1 que encontrei.
void setup()
contém o seguinte código para configurar as interrupções.
//Endable Interrupts for PCIE2 Arduino Pins (D0-7)
PCICR |= (1<<PCIE2);
//Setup pins 2,3,4,5
PCMSK2 |= (1<<PCINT18);
PCMSK2 |= (1<<PCINT19);
PCMSK2 |= (1<<PCINT20);
PCMSK2 |= (1<<PCINT21);
//Trigger Interrupt on rising edge
MCUCR = (1<<ISC01) | (1<<ISC01);
E agora, a função ISR (PCINT2_vect) é acionada a cada interrupção. Isso funciona como um encanto. Minha pergunta é: qual é a melhor / mais rápida maneira de descobrir qual pino foi acionado?
Encontrei algo em Re: É melhor usar o ISR (PCINT2_vect) ou attachInterrupt nos pinos 2, 3? , mas não entendo o código e ele não funciona imediatamente. Mas parece impressionante ...
Qual é a solução?
[2] http://arduino.cc/forum/index.php/topic,72496.15.html#lastPost
Editar:
No momento, estou lendo o estado do pino a partir do registro do pino de entrada:
if (PIND & 0b00000100)
Serial.println( "PIN 2" );
if (PIND & 0b00001000)
Serial.println( "PIN 3" );
if (PIND & 0b00010000)
Serial.println( "PIN 4" );
if (PIND & 0b00100000)
Serial.println( "PIN 5" );
No final, quero contar as interrupções nos pinos. Mas como posso garantir que não são contadas duas vezes?
fonte
Respostas:
Eu mesmo tenho uma primeira solução, mas não pude testar a confiabilidade, pois o hardware não está finalizado.
Primeiro, adicionei oldPins e tickCount como variáveis globais:
E foi assim que resolvi o ISR no momento. Melhores soluções são mais que bem-vindas.
fonte