Interrupt - RISING und FALLING an 1 Pin

Hallo.

Ist es möglich, an 1 Pin bei RISING eine Funktion auszuführen, bei FALLING eine andere?
Also so z. B.:

attachInterrupt(digitalPinToInterrupt(motorHall1), hall1ris, RISING);
attachInterrupt(digitalPinToInterrupt(motorHall1), hall1fal, FALLING);

Oder kann man einem Pin nur eine Interrupt-Funktion zuweisen und demzufolge auch entweder RISING oder FALLING?

Eher nicht.
Vermutlich wirst du das Datenblatt deines geheimen µC zu Rate ziehen dürfen.

Ach ja, das gute alte Datenblatt. Es ist ein ATmega2560 auf dem Arduino Mega 2560.

Mein Verständnis nach kann man nicht 2 verschidenen Trigger Events am gleichen Pin machen. Man kann umschalten. Nach HL eine LH Event programmieren. (was aber einer genauen Betrachtung des Code, wahrscheinlich auf Maschinenspracheebene bedarf)

Wieso brauchst Du das denn?
Du kannst die Triggerfunktion bei CHANGE aufrufen und dort kontrollieren ob das entsprechende Pin H oder L ist und dementsprechend abzweigen bzw eine Teil der Funktion ausführen.

Wie bereits oft gepredigt: Interruptfunktionen müssen kurz sein damit sie sicher beim nächsten interrupt beendet worden sind.

Grüße Uwe

Was zum Nachlesen:

Ja, das: Das sagt dir wichtige Sachen:

  1. Pin 1 ist kein Hardware Interrupt Pin
  2. Er ist schon vergeben für die Serielle
  3. Nein: Keine 2 ISR pro Pin.

Positionsbestimmung des Motors mit 3 Hall-Sensoren:

Danke! Habe es so gemacht:

void setup()
{
  pinMode(motorHall1, INPUT_PULLUP);
  pinMode(motorHall2, INPUT_PULLUP);
  pinMode(motorHall3, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(motorHall1), hall1isr, CHANGE);
  attachInterrupt(digitalPinToInterrupt(motorHall2), hall2isr, CHANGE);
  attachInterrupt(digitalPinToInterrupt(motorHall3), hall3isr, CHANGE);
}
void hall1isr()
{
  commutationStepNext = digitalRead(motorHall1) ? 4 : 1;
}
void hall2isr()
{
  commutationStepNext = digitalRead(motorHall2) ? 2 : 5;
}
void hall3isr()
{
  commutationStepNext = digitalRead(motorHall3) ? 6 : 3;
}

Ich habe geschrieben "Ist es möglich, an 1 Pin ..." Dieses eine Pin ist nicht Pin Nr. 1. Habe mich bei der Wahl der Interrupt-Pins ans Datenblatt gehalten. Funktioniert.

Danke!

Hättest Du geschrieben „Ist es möglich an einem Pin…“, wäre das weniger missverständlich gewesen. Ich glaube, dafür ist das Wort auch mal erfunden worden.

Hab ich auch lange genagt bis ich entschieden habe, daß das nicht um das Pin D1 handelt sondern ein (unbestimmtes) Pin
Beim verwendeten MEGA2560 sind die Pin 2, 3, 18, 19, 20, 21 interruptfähig. (vollfunktionsfähige Interrupteingänge, die mit attachInterrupt() verwendet werden können).
Grüße Uwe

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.