Forum: Mikrocontroller und Digitale Elektronik IRQ am RFID RC522


von Dirk M. (dmd)


Angehängte Dateien:

Lesenswert?

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
von Dieter S. (ds1)


Lesenswert?

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

von Dirk M. (dmd)


Lesenswert?

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.

von Dieter S. (ds1)


Lesenswert?

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
von Chris V. (nagut)


Lesenswert?

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.

von Dirk M. (dmd)


Lesenswert?

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.

von Dieter S. (ds1)


Lesenswert?

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
von Dirk M. (dmd)


Lesenswert?

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...

von Dirk M. (dmd)


Lesenswert?

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.

von Dieter S. (ds1)


Lesenswert?

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.

von Rolf (rolf-m)


Lesenswert?

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ß

von Dieter S. (ds1)


Lesenswert?

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
Noch kein Account? Hier anmelden.