11 votos

Arduino y las Interrupciones: forma Rápida de obtener valores de pin

Yo uso un Arduino Uno y lo ha configurado para trabajar con interrupciones en los pines digitales 2, 3, 4 y 5 de acuerdo a una explicación1 que he encontrado.

void setup() contiene el código siguiente para la instalación de las interrupciones.

  //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);

Y ahora, el ISR( PCINT2_vect ), la función está activa en cada interrupción. Que funciona como un encanto. Mi pregunta es, ¿cuál es la mejor/forma más rápida de averiguar, que el pin se activa?

He encontrado algo en Re: Es mejor usar ISR(PCINT2_vect) o attachInterrupt en los pines 2, 3?, pero no entiendo el código y no funciona fuera de la caja. Pero se ve impresionante...

¿Cuál es la solución?

[2] http://arduino.cc/forum/index.php/topic,72496.15.html#lastPost

Editar:

Por el momento, me estoy leyendo el estado de los pines de la clavija de entrada del registro:

  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" );

En el final, quiero contar las interrupciones en las patas. Pero, ¿cómo puedo asegurar, que no hay contados dos veces?

4voto

jsumners Puntos 290

Tengo una primera solución de mí, pero yo no podría poner a prueba la fiabilidad, ya que el hardware no está terminado jet.

En primer lugar he añadido oldPins y tickCount como variables globales:

static byte oldPins = 0;
volatile unsigned int tickCount[4] = { 0, 0, 0, 0 };

Y eso es lo que he resuelto el ISR en el momento. Las mejores soluciones son más que bienvenidos.

ISR( PCINT2_vect ) {
  //Read values from digital pins 2 to 7
  const byte actPins = PIND;
  //Match this values agaist the oldPins bitmask (XOR and AND for raising edge)
  const byte setPins = (oldPins ^ actPins) & actPins;

  if (setPins & 0b00000100)
    tickCount[0]++;
  if (setPins & 0b00001000)
    tickCount[1]++;
  if (setPins & 0b00010000)
    tickCount[2]++;
  if (setPins & 0b00100000)
    tickCount[3]++;

  oldPins = actPins;
}

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X