INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Interrupts mit Arduino Due
30.09.2015, 07:32 (Dieser Beitrag wurde zuletzt bearbeitet: 30.09.2015 07:52 von chhec.)
Beitrag #25
RE: Interrupts mit Arduino Due
Ich habe es so verstanden das der Handler durch seine Bezeichnung direkt durch den entprechenden Port Interrupr aufgerufen wird.
Was muss man denn stattdesen machen das er aufgerufen wird?

Die sache mit den Timern mag eine übersichtliche Lösung sein, aber für meine Zwecke eher ungeeignet, da ich die Flanken an den Ports erkennen will. Aber trotzdem danke für diesen Lösungsvorschlaf.

Die Namen ISRs sind doch von der Entwicklungsumgebung festgelegt. Sodass man einfach die Funktion mit dem richtigen Namen definieren muss
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
30.09.2015, 13:33 (Dieser Beitrag wurde zuletzt bearbeitet: 30.09.2015 13:35 von HaWe.)
Beitrag #26
RE: Interrupts mit Arduino Due
die Flanken erkennt man ganz einfach, indem man den momentanen mit dem vorherigen Zustand vergleicht.

wenn alt=low und jetzt neu=high => FlankeHoch
wenn alt=high und jetzt neu=low => Flanke Ab

sonst: keine Flanke.

Ganz einfache Vergleichsoperatoren also, die wohldefiniert sind.
Für Perfektionisten: Sie lassen sich zum Entprellen sogar ganz einfach mit einem Lowpassfilter oder einem Medianfilter glätten, beides ebenfalls kein Hexenwerk.

Man kann das auch mit arrays NANDen oder XORen, wie ich es mit dem Rotations-Encoder mache, muss aber absolut nicht sein!

Aber jedem Tierchen sein Plaisierchen, natürlich, oder: jeder ist seines eigenen Glückes Schmied, wie man so sagt ... 8-)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
30.09.2015, 13:39 (Dieser Beitrag wurde zuletzt bearbeitet: 30.09.2015 13:43 von chhec.)
Beitrag #27
RE: Interrupts mit Arduino Due
So ist zwar die Erkennung eines Pegelwechsels möglich und daraus lässt sich natürlich auch eine Flanke erkennen, aber ich möchte es später für zeitkritische Signale nutzen und kann so nicht sicherstellen, ein Signal zu verpassen

und es muss da ja eine Möglichkeit geben das umzusetzen
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
30.09.2015, 14:01 (Dieser Beitrag wurde zuletzt bearbeitet: 30.09.2015 14:16 von HaWe.)
Beitrag #28
RE: Interrupts mit Arduino Due
was heißt denn "zeitkritisch" bei dir?
Bitte definiere doch mal ein zeitkritisches Zeitintervall.
Alleine Entprellen braucht ja schon seine Zeit, die das Zeitkritische ziemlich einschränkt, und auch das, was du nach dem zeitkritischen Event zu seiner Auswertung machst, braucht ja seine Zeit, in der dann nichts weiter an weiteren zeitkritischen Events gleichzeitig gemacht werden kann. Spätestens der Prozessortakt gibt das letzte kleinste Zeitintervall an.
(Alles immer jederzeit unbegrenzt und ohne Verluste gibt es nicht im wirklichen Arduiino-Leben, und letzendlich ist ja sogar die Zeit an sich gequantelt.)

Bedenke auch, dass Pinchange-Events kurz nacheinander eintreten können, und dass du zu ihrer Bearbeitung u.U. soviel Zeit brauchst, dass du gar nicht bis zum letzten der Serie hinterherhecheln kannst, bevor schon wieder am Anfang oder in der Mitte wieder ein neuer Event dazwischenfunkt.
Pinchange ist um so viel zeitkritischer (d.h.: um so schwieriger zu händeln, und um so leichter ist was zu verpassen) als Timer-IRQ, je mehr asynchrone Eingänge überwacht werden müssen.

Also alle...wieviele... Milli- oder Microsekunden musst du was zeitkritisches feststellen können? Wie kurz ist der denkbar kürzeste Impuls/Event an einem Pin und sein minimaler Abstand zum nächsten Impuls/Event am selben Pin? (Stell dir dazu das Bild an einem Oszi vor!)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
30.09.2015, 19:41
Beitrag #29
RE: Interrupts mit Arduino Due
(30.09.2015 07:32)chhec schrieb:  Ich habe es so verstanden das der Handler durch seine Bezeichnung direkt durch den entprechenden Port Interrupr aufgerufen wird.
Was muss man denn stattdesen machen das er aufgerufen wird?
Also das mit der Bezeichnung halte ich für nicht wirklich wahrscheinlich, aber möglich. Ich frage mich nur, warum der Compiler nicht motzt. Die Funktionen sind dann ja zweimal definiert.
Versuch es doch erst einmal, die Funktionen attachInterrupt an einen Pin zu hängen. Wenn sie dann auch nicht ausgelöst werden, hast Du eh ein anderes Problem.

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.10.2015, 07:23 (Dieser Beitrag wurde zuletzt bearbeitet: 01.10.2015 09:46 von chhec.)
Beitrag #30
RE: Interrupts mit Arduino Due
Zitat:Versuch es doch erst einmal, die Funktionen attachInterrupt an einen Pin zu hängen. Wenn sie dann auch nicht ausgelöst werden, hast Du eh ein anderes Problem.

Mit der attachInterrupt() Funktion läuft es. Allerdings muss es ja auch irgendwie anders funktionieren.
Die Funktion PIOD_Handler() ist in WInterrupts. c definiert.

Muss ich die Funktion da ändern?

So es gibt einen neuen Stand.
Ich habe in dem Interrupt Handler mal einen PIOC auf HIGH bzw. LOW gesetzt. Dadurch konnte ich feststellen, das der Ineterrupt sehr wohl ausgelöst wird.

Das Problem ist, das die ISR immer wieder aktiv wird und so die loop()
mit dem Serial.print() gar nicht aktiv wird. Das ist der Grund warum
keine Daten gesendet werden und ich davon ausgegangen bin das er nicht ausgelöst hat..

Das näcshte Rätsel ist jetzt jedoch, warum der Interrupt immer wieder
auslöst, obwohl ich den Pin zur Generierung auf Masse gelegt habe. Evtl.
wird das ISR Register nicht richtig gelöscht?! Im Datenblatt steht, das beim auslesen des Registers dieses resetet wird. Von daher habe ich keinen Anhaltspunkt woran es liegen könnte.

Ich füge mal den neuen Quellcode hinzu. Vielleicht hilft das:

Code:
void PIOD_Handler()
{
/*Read Interrupt Status Register*/
  state=REG_PIOC_ISR;
  
  a=!a;
/* Set PC1 to HIGH or LOW*/
  if(a==1)
  {
    REG_PIOC_SODR=0x00000002;
  }
  else{
    REG_PIOC_CODR=0x00000002;
  }
}

void setup()
{
Serial.begin(115200);

/* Configure PIOC, PC1 as OUTPUT */
REG_PIOC_PER=0x00000002;
REG_PIOC_OER=0x00000002;

REG_PMC_PCER0 = REG_PMC_PCER0 | 0x00004000;

/*Enables the PIO to control the corresponding pin*/
REG_PIOD_PER = REG_PIOD_PER | 0x00000001;

/*Enables the Input Change Interrupt on the I/O line*/
REG_PIOD_IER = REG_PIOD_IER | 0x00000001;
REG_PIOD_IDR = REG_PIOD_IDR | 0xFFFFFFFE;

/*Enables Interrupts on PIOD*/
NVIC_EnableIRQ(PIOD_IRQn);
}

void loop()
{
  Serial.println(a);
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.11.2015, 15:48 (Dieser Beitrag wurde zuletzt bearbeitet: 11.11.2015 16:35 von Laura.)
Beitrag #31
RE: Interrupts mit Arduino Due
Hallo zusammen. Ich habe ein ähnliches Problem mit den Interrupts beim Due. Ich möchte gerne 18 digitale I/O mit 1,6 MHz auslesen. Auf der 19ten Leitung liegt dieser Takt an, auf dessen steigender Flanke die Daten verfügbar sind. Hierzu möchte ich also eine Rising Edge erkennen, einen Interrupt auslösen und in dessen ISR das Register PIO_PDSR auslesen. Das Ergebnis soll dann bestenfalls auf einer SD karte gespeichert, oder an einen geeigneten Speicher übertragen werden.

Anders als beim Mega2560 finde ich nun im Datenblatt leider keine Interrupt-Handler, in denen ich entsprechenden Code ausführen kann. Über Hinweise hierzu wäre ich dankbar. Mein Code bisher sieht folgendermaßen aus:

Code:
void setup() {
  NVIC_EnableIRQ(PIOC_IRQn);
  PMC->PMC_PCER0  |= 0b00000000000000000010000000000000; // Enable Clock for PID13 -> PIOC
  PIOC->PIO_WPMR = 0x50494F00; //Disable Write Protect
  PIOC->PIO_PER |= 0b00000001111011111111001111111110; // Disable peripheral functions and enable PIO on PC1-PC9, PC12-PC19, PC21-PC24
  PIOC->PIO_ODR |= 0b00000001111011111111001111111110; // Make all Pins Inputs
  PIOC->PIO_OER |= 0b00000001000000000000000000000000; // Make PC24 an Output
  
  PIOC->PIO_AIMER |= 0b00000000100000000000000000000000; // Interrupt source is described in ELSR and FRLHSR
  PIOC->PIO_ESR |= 0b00000000100000000000000000000000; // Interrupt source is an Edge detection event on PC23
  PIOC->PIO_REHLSR |= 0b00000000100000000000000000000000; // Interrupt on Rising Edge (ELSR = 0)(ESR = 1)/High Level (ELSR = 1) on PC23
  
}

void PIOC_Handler(){
  
}

Soweit komme ich aus dem Datenblatt und mit Hilfe des ASF. Stimmt das soweit?

Danke und Gruß

Laura
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
13.11.2015, 14:39
Beitrag #32
RE: Interrupts mit Arduino Due
(01.10.2015 07:23)chhec schrieb:  
Zitat:Versuch es doch erst einmal, die Funktionen attachInterrupt an einen Pin zu hängen. Wenn sie dann auch nicht ausgelöst werden, hast Du eh ein anderes Problem.

Mit der attachInterrupt() Funktion läuft es. Allerdings muss es ja auch irgendwie anders funktionieren.
Die Funktion PIOD_Handler() ist in WInterrupts. c definiert.

Muss ich die Funktion da ändern?

So es gibt einen neuen Stand.
Ich habe in dem Interrupt Handler mal einen PIOC auf HIGH bzw. LOW gesetzt. Dadurch konnte ich feststellen, das der Ineterrupt sehr wohl ausgelöst wird.

Das Problem ist, das die ISR immer wieder aktiv wird und so die loop()
mit dem Serial.print() gar nicht aktiv wird. Das ist der Grund warum
keine Daten gesendet werden und ich davon ausgegangen bin das er nicht ausgelöst hat..

Das näcshte Rätsel ist jetzt jedoch, warum der Interrupt immer wieder
auslöst, obwohl ich den Pin zur Generierung auf Masse gelegt habe. Evtl.
wird das ISR Register nicht richtig gelöscht?! Im Datenblatt steht, das beim auslesen des Registers dieses resetet wird. Von daher habe ich keinen Anhaltspunkt woran es liegen könnte.

Ich füge mal den neuen Quellcode hinzu. Vielleicht hilft das:

Code:
void PIOD_Handler()
{
/*Read Interrupt Status Register*/
  state=REG_PIOC_ISR;
  
  a=!a;
/* Set PC1 to HIGH or LOW*/
  if(a==1)
  {
    REG_PIOC_SODR=0x00000002;
  }
  else{
    REG_PIOC_CODR=0x00000002;
  }
}

void setup()
{
Serial.begin(115200);

/* Configure PIOC, PC1 as OUTPUT */
REG_PIOC_PER=0x00000002;
REG_PIOC_OER=0x00000002;

REG_PMC_PCER0 = REG_PMC_PCER0 | 0x00004000;

/*Enables the PIO to control the corresponding pin*/
REG_PIOD_PER = REG_PIOD_PER | 0x00000001;

/*Enables the Input Change Interrupt on the I/O line*/
REG_PIOD_IER = REG_PIOD_IER | 0x00000001;
REG_PIOD_IDR = REG_PIOD_IDR | 0xFFFFFFFE;

/*Enables Interrupts on PIOD*/
NVIC_EnableIRQ(PIOD_IRQn);
}

void loop()
{
  Serial.println(a);
}

Konntest du das Problem mit dem ständig auslösenden Interrupt lösen? Falls ja, wie? Ich habe nun das gleiche Problem.

Danke und Gruß
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Arduino Ethernet mit USB 2 Serial Converter/Welche Einstellungen im Arduino-Sketch lociluke 1 1.106 05.05.2015 13:40
Letzter Beitrag: Bitklopfer
  Arduino Mega-Projekt mit EEPROM auf Arduino Due portieren Foto-Ralf 17 3.130 16.03.2015 12:06
Letzter Beitrag: Foto-Ralf
  Interrupts für eine bestimmte Zeit unterbrechen?? kai.l 5 1.322 13.10.2014 14:34
Letzter Beitrag: kai.l
  [gelöst:] Hardware-Timer-Interrupts beim Mega HaWe 1 915 26.09.2014 22:11
Letzter Beitrag: HaWe
  Frage zu Interrupts schnutzkurt 3 1.750 17.02.2014 10:47
Letzter Beitrag: Bitklopfer
  Zwei Zeitkritische Interrupts gleich verarbeiten subseven 12 5.887 09.01.2014 19:17
Letzter Beitrag: rkuehle
  Interrupts oder nicht? AtroCty 4 2.199 21.06.2013 16:16
Letzter Beitrag: Tobii

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste