Arduino và Interrupts: Cách nhanh chóng để có được giá trị pin


11

Tôi sử dụng Arduino Uno và đã thiết lập nó để hoạt động với các ngắt trên các chân kỹ thuật số 2, 3, 4 và 5 theo giải thích 1 tôi tìm thấy.

void setup() chứa mã sau đây để thiết lập các ngắt.

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

Và bây giờ, chức năng ISR (PCINT2_vect) được kích hoạt trên mỗi ngắt. Điều đó làm việc như một nét duyên dáng. Câu hỏi của tôi là, cách tốt nhất / nhanh nhất để tìm ra, pin nào đã được kích hoạt?

Tôi đã tìm thấy một cái gì đó trong Re: Tốt hơn là sử dụng ISR (PCINT2_vect) hoặc Đính kèm trên các chân 2, 3? , nhưng tôi không hiểu mã và nó không hoạt động. Nhưng nó có vẻ ấn tượng ...

Giải pháp là gì?

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

Biên tập:

Hiện tại, tôi đang đọc trạng thái pin từ thanh ghi pin đầu vào:

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

Cuối cùng, tôi muốn đếm các ngắt trên các chân. Nhưng làm thế nào tôi có thể đảm bảo, rằng không có hai lần được tính?


Tại các thiết bị điện tử, nhiều người có lẽ đã loay hoay với Arduinos và những thứ điện tử khác.
Earlz

Nếu bạn nghĩ, câu hỏi nên ở đằng kia, đánh dấu nó. Tôi đã giải quyết vấn đề đăng nhập của tôi.
madc

3
@Earlz: Đây là một câu hỏi lập trình, vì vậy nó thuộc chủ đề . Thực tế là nó dành cho một nền tảng sở thích là không liên quan; xem hàng trăm câu hỏi arduino khác trên stackoverflow để tham khảo.
BlueRaja - Danny Pflughoeft

Câu trả lời:


4

Tôi có một giải pháp đầu tiên cho mình, nhưng tôi không thể kiểm tra độ tin cậy vì phần cứng chưa hoàn thành.

Đầu tiên tôi đã thêm oldPins và tickCount dưới dạng các biến toàn cục:

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

Và đó là cách tôi giải quyết ISR vào lúc này. Giải pháp tốt hơn được chào đón.

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
Nếu bạn đang cập nhật tickCount [] trong ISR, bạn nên khai báo nó với vòng loại loại 'dễ bay hơi'.
icarus74

Tôi đã cập nhật mã bên trong câu trả lời. Để biết thêm thông tin, xem tài liệu về arduino: arduino.cc/en/Reference/Voliverse
madc
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.