Arduino ve Interrupts: Pin değerlerini almanın hızlı yolu


11

Bir Arduino Uno kullanıyorum ve zaten bulduğum 1 açıklamaya göre dijital pim 2, 3, 4 ve 5'deki kesintilerle çalışacak şekilde ayarladım .

void setup() kesmeleri ayarlamak için aşağıdaki kodu içerir.

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

Ve şimdi, ISR (PCINT2_vect) işlevi her kesmede tetiklenir. Bu bir cazibe gibi çalışır. Sorum şu, hangi pimin tetiklendiğini bulmanın en iyi / en hızlı yolu nedir?

Ben bir şey buldum pimleri 2, 3 kullanım ISR (PCINT2_vect) ya da attachInterrupt mı iyidir: Re? , ama kodu anlamıyorum ve kutunun dışında çalışmıyor. Ama etkileyici görünüyor ...

Çözüm nedir?

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

Düzenle:

Şu anda, giriş pimi kaydından pim durumunu okuyorum:

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

Sonunda, pimlerdeki kesintileri saymak istiyorum. Ancak, iki kez sayılmadığından nasıl emin olabilirim?


Elektronikte, daha fazla insan muhtemelen Arduinos ve diğer elektronik şeylerle uğraştı.
Earlz

Düşünüyorsanız, soru orada olmalı, işaretleyin. Giriş problemlerimi çözdüm.
madc

3
@Earlz: Bu bir programlama sorusu, bu yüzden konuyla ilgili . Bir hobici platform için olması önemsizdir; referans için stackoverflow ile ilgili diğer yüzlerce arduino sorusuna bakın .
BlueRaja - Danny Pflughoeft

Yanıtlar:


4

Kendime ilk çözümüm var, ancak donanım jet bitmediğinden güvenilirliği test edemedim.

Önce global değişken olarak oldPins ve tickCount ekledim:

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

Şu anda ISR'yi bu şekilde çözdüm. Daha iyi çözümler memnuniyetle karşılanır.

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;
}

1
Bir ISR'de tickCount [] 'u güncellüyorsanız, onu' uçucu 'tip niteleyici ile bildiriyor olmalısınız.
icarus74

Cevabın içindeki kodu güncelledim. Daha fazla bilgi için arduino belgelerine bakın: arduino.cc/tr/Reference/Volatile
madc
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.