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.