Arduino dan Interupsi: Cara cepat untuk mendapatkan nilai pin

11

Saya menggunakan Arduino Uno dan sudah mengaturnya untuk bekerja dengan interupsi pada pin digital 2, 3, 4 dan 5 menurut penjelasan 1 saya menemukan.

void setup() berisi kode berikut untuk mengatur interupsi.

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

Dan sekarang, fungsi ISR ​​(PCINT2_vect) dipicu pada setiap interupsi. Itu bekerja seperti pesona. Pertanyaan saya adalah, apa cara terbaik / tercepat untuk mengetahuinya, pin mana yang dipicu?

Saya menemukan sesuatu di Re: Apakah lebih baik menggunakan ISR (PCINT2_vect) atau attachInterrupt pada pin 2, 3? , tapi saya tidak mengerti kode dan tidak bekerja di luar kotak. Tapi itu terlihat mengesankan ...

Apa solusinya?

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

Edit:

Saat ini, saya membaca status pin dari dari pin input register:

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

Pada akhirnya, saya ingin menghitung interupsi pada pin. Tapi bagaimana saya bisa meyakinkan, bahwa tidak ada yang dihitung dua kali?

madc
sumber
Di bidang elektronik, lebih banyak orang mungkin mengacau dengan Arduino dan barang elektronik lainnya.
Earlz
Jika Anda berpikir, pertanyaannya seharusnya ada di sana, tandai. Saya memecahkan masalah login saya.
madc
3
@ Elarlz: Ini adalah pertanyaan pemrograman, jadi ini sesuai topik . Fakta bahwa itu untuk platform hobi tidak relevan; lihat ratusan pertanyaan Arduino lainnya di stackoverflow untuk referensi.
BlueRaja - Danny Pflughoeft

Jawaban:

4

Saya punya solusi pertama sendiri, tetapi saya tidak bisa menguji keandalannya karena perangkat kerasnya belum selesai.

Pertama saya menambahkan oldPins dan tickCount sebagai variabel global:

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

Dan itulah cara saya memecahkan ISR saat ini. Solusi yang lebih baik lebih dari diterima.

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;
}
madc
sumber
1
Jika Anda memperbarui tickCount [] di ISR, Anda harus mendeklarasikannya dengan kualifikasi jenis 'volatile'.
icarus74
Saya memperbarui kode di dalam jawabannya. Untuk informasi lebih lanjut, lihat dokumentasi arduino
madc