Hallo, ich betreibe einen RC522 von JoyIt an einem ESP32-S3 und kann auch über Micropython die Karten lesen (im Polling). Auf dem ESP laufen auch noch andere Sachen und es wäre gut, wenn ich den Interrupt-Pin am RC522 aktivieren könnte (also bei erkannter Karte). Ich habe nun schon unzählige Beiträge durchstöbert und mir auch die Doku vom MFRC522 durchgelesen. Alle von mir gelesenen Beiträge enden entweder mit Pöbeleien oder ohne Ergebnis. Auch die KI hat nichts Brauchbares geliefert. Ich dachte schon, dass der IRQ-Pin vielleicht gar nicht am Chip angeschlossen ist. Wenn ich aber den IRQ-Pin durch das DivIEnReg -Register als CMOS-Output definiere, leuchtet eine angeschlossene LED. Ich habe oft gelesen, man muss nur in das ComIEnReg 0xA0 (manchmal auch 0x20) schreiben und schon geht's. Im Anhang das PDF vom MFRC522. Nein, ich möchte nicht, dass sich jemand das ganze durchliest, aber sich vielleicht mal auf Seite 38 und 39 die Registerbeschreibung anguckt. Oder hat jemand den Interrupt-Pin sogar schon zum Leben erweckt?
:
Bearbeitet durch User
Suchmaschine kaputt? Es gibt unzählige Beiträge die das erklären, u.a. der hier: https://github.com/miguelbalboa/rfid/blob/master/examples/MinimalInterrupt/MinimalInterrupt.ino
Witzig, als wenn ich das noch nicht gelesen hätte... Es wird 0xA0 in ComIEnReg geschrieben, aber genau dann macht der IRQ-Pin nichts. Die "Suchmaschine" findet auch unzählige Beispiele, wo sich Leute die Zähne ausgebissen haben.
Der Interrupt-Pin hat einen Pullup bzw. er ist als "CMOS Output" konfiguriert? Nur so bekommt man auch mit dass sich dort etwas tut. Der Rest ist relativ eindeutig, Bit 7 in ComIEnReg legt die Polarität fest und die anderen Bits legen fest welche Interrupt-Quellen am Interrupt-Pin signalisiert werden, weitere Quellen gibt es in DivIEnReg. Und mit ComIrqReg bzw. DivIrqReg löscht man die Bits der Interrupt-Quellen nach Bearbeitung des Interrupt. Mit ComIrqReg/DivIrqReg kann man Interrupt-Quellen aber auch manuell setzen und damit relativ einfach testen ob alles passt.
:
Bearbeitet durch User
Vor einiger Zeit habe ich eine Masterarbeit betreut, bei der so ein MFRC522 im Arduino-Umfeld zum Einsatz kam, daher hatte ich mir den mal angesehen. Auch da tauchte kurz die Frage auf, ob wir den IRQ-Pin benutzen können, um nicht ständig pollen zu müssen, um neu im Empfangsbereich auftauchende Karten zeitnah zu entdecken. Letztlich hat sich der Bearbeiter dann entschieden, das Problem mit einem Kartenschlitz mit mechanischem Mikroschalter zu lösen. Daher habe ich nicht zu ausführlich recherchiert. Allerdings gehe ich davon aus, dass ein Interrupt bei neu entdeckter Karte mit dem MFRC522 so ohne weiteres nicht möglich ist. Schau z.B. mal in die Implementierung der PICC_IsNewCardPresent() Funktion (die Du ja vermutlich ersetzen willst) in der MFRC522v2-Library https://github.com/OSSLibraries/Arduino_MFRC522v2/blob/master/src/MFRC522v2.cpp ...oder in die ISO/IEC 14443-3 zur Initialisierung der Karte (6.5.1 Select sequence flowchart) https://wg8.de/wg8n1496_17n3613_Ballot_FCD14443-3.pdf Das ist ein komplizierterer Prozess mit Kollisionserkennung und ggf. Wiederholungen, und der wird im wesentlichen von der Library durchgeführt. Das kann der Chip so nicht alleine. Wie gesagt habe ich nicht zuende recherchiert. Möglicherweise kann man einen Interrupt generieren, wenn da "irgendwas" im Empfangsbereich passiert. Aber dann müsste man nach wie vor die Initialisierung durchführen, und man muss auch immer damit rechnen, dass es dann doch bloß falscher Alarm war. Daher ist's eigentlich auch nicht so viel schlechter, wenn man es ohne Interrupt timergesteuert sowieso alle paar Sekunden mal macht.
Hallo und danke für eure Antworten. Ich versuche mich schon wieder seit zwei Stunden an den Interrupts, aber der Pin reagiert nicht. Habe mehrere Kombinationen ausprobiert, PullUp oder CMOS, invertiert, Register 02 und 03 mit verschiedenen Werten beschrieben - aber nix. Ich werde es mal mit einem Timer versuchen. Mal sehen, ob es klappt.
Wie schon geschrieben kann man in ComIrqReg/DivIrqReg die Interrupt-Quelle auch manuell setzen, damit sollte man eine Änderung am Interrupt-Pin bewirken können (für die Interrupt-Quellen, die in ComIEnReg/DivIEnReg freigegeben wurden).
:
Bearbeitet durch User
Ich habe im ComIrqReg das Bit RxIRq jetzt mal manuell gesetzt. Der Interrupt-Pin reagiert, aber nur, wenn ich auch die Lese-Funktion (request) aufrufe, aber genau diese Funktion wollte ich ja über den Interrupt auslösen. Chris V. schrieb: > Allerdings gehe ich davon aus, dass ein Interrupt bei neu entdeckter > Karte mit dem MFRC522 so ohne weiteres nicht möglich ist. Da hat er wohl recht. Um das nicht unnötig kompliziert zu machen, hier mal eine kurze Erklärung: Ich möchte einen RFID-Leser bauen, in dem die Lese-Zeiten erfasst werden. Dieser soll über das Netzwerk erreichbar sein, um die IP-Adressen einzustellen. Das Lesen der RFID Karten funktioniert und das Einstellen der IP-Adressen über eine kleine Konfigurations-Seite auch. Allerdings nicht beides zusammen. Entweder blockiert der Socket-Befehl *conn, addr = s.accept()* den Programmlauf oder der timergesteuerte Interrupt zum Lesen der RFID Karten verhindert das Aufrufen der Konfigurations-Seite. Nun versuche ich beim Aufruf der Konfigurations-Seite den Timer zu stoppen - mal sehen...
Ach, alles Unfug... Ich werde einen Standard-Modus definieren, in dem die Karten gelesen werden und einen Konfigurations-Modus, in dem die Webseite zum Ändern der IP-Adressen aufgerufen werden kann. Die IP-Adressen werden wahrscheinlich nur sehr selten bis gar nicht geändert. Umschaltung dann per Taster oder Schalter.
Nur kurz zur Info, bei einem MFRC522 Klon (VersionReg liefert 0xB2) verhält sich der Interrupt Pin wie in der Doku beschrieben. Sowohl als "CMOS output" oder "Open-Drain output" werden die entsprechenden Bits aus ComIrqReg/DivIrqReg signalisiert wenn sie in ComIEnReg/DivIEnReg freigegeben wurden, auch die Polarität entsprechend "IRqInv" passt. Der verwendete Mikrocontroller ist ein STM32, wenn der Interrupt Pin als "Open-Drain output" konfiguriert ist reicht es den Pullup des entsprechenden STM32 Input-Pin zu aktivieren. Ich gehe davon aus dass sich auch die originalen MFRC522 so verhalten, sollte mir noch ein Original unterkommen werde ich das prüfen.
Hallo, wenn ich die ursprüngliche Frage des TO (Thread Opener) richtig verstanden habe, dann will er einen Interrupt haben wenn sich eine Karte in den Lesebereich des Lesers (MFRC522) bewegt? Dazu: einen solchen Interrupt gibt es nicht - das Erkennen einer Karte funktioniert nur durch ständiges abfragen (Request or Wakeup command), nur so melden sich die Karten Ich kenne auch keinen Kartentyp (in ISO/IEC 14443) der sich von selbst zu erkennen gibt (etwas sendet) wenn er in das HF-Feld gelangt, sondern immer erst nach Aufforderung (Request or Wakeup command) und sonstigen commands. Karten in ISO/IEC 14443 antworten immer synchron zum Bit-Fluss der Anfrage - nur so sind Kollisionen erkennbar und auflösbar. Gruß
Kurzer Nachtrag: Auf dem MFRC522 Modul von Joy-IT ist ein Original verbaut (VersionReg liefert 0x92), auch hier verhält sich der Interrupt Pin wie in der Doku beschrieben. Die Verwendung des Interrupt macht je nach Anwendung durchaus Sinn, wenn man schaut ob eine Karte in der Nähe ist dauert es um die 15 ms bis zum Resultat wenn keine Karte da ist, mit Karte dauert es etwa 0.5 ms. Und wenn man die Karte rechenintensive Dinge (z.B. Kryptographie) machen lässt dauert es u.U. noch länger bis zum Ergebnis. Außerdem ist der SPI Bus frei wenn man den Interrupt anstelle Polling verwendet.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.