Guten Tag, wie kann man ein Empfänger wie im nRF24L01-Tutorial auf Interrupt über IRQ-Pin beim Empfang der Daten um stellen? Muß hierzu das Config-Register wie folgt beschrieben werden? wl_module_config_register(CONFIG, wl_module_CONFIG | ((1<<MASK_TX_DS))|( (1<<PWR_UP) | (1<<PRIM_RX) ) ) Mit freundlichen Grüßen
Timmo H. schrieb: > MASK_MAX_RT Sehe ich anders:
1 | #define CONFIG_RESERVED 0x80
|
2 | #define CONFIG_MASK_RX_DR 0x40
|
3 | #define CONFIG_MASK_TX_DS 0x20
|
4 | #define CONFIG_MASK_MAX_RT 0x10
|
5 | #define CONFIG_EN_CRC 0x08
|
6 | #define CONFIG_CRCO 0x04
|
7 | #define CONFIG_PWR_UP 0x02
|
8 | #define CONFIG_PRIM_RX 0x01
|
Aus diesem Bitsatz würde ich annehmen dass das Bit <CONFIG_MASK_RX_DR> (Receive Data Ready) uns sagt dass Daten eingetroffen sind die abgeholt werden können.
Hallo Leute, danke für die Antworten. Im Tutorial wird MASK_RT_DS beim Sender gesetzt. #define wl_module_CONFIG( (1<<MASK_RX_DR) | (1<<EN_CRC) | (0<<CRCO) ) "In der Zeile wird einiges für das CONFIG Register eingestellt. Im CONFIG Register können etwa die drei Interrupts maskiert werden, es wird eingestellt ob CRC verwendet wird und ob CRC aus einem oder zwei Bytes besteht." Mir geht es aber um den Empfänger. Wenn Daten beim Empfänger vorrätig sind, werden diese im Tutorial mit polling abgefragt. Der Tutor schreibt selbst, dass das auch per Interrupt möglich wäre. "Wie schon angekündigt können empfangene Daten mittels Polling abgefragt werden oder über IRQ. In dem Beispiel wird mittels Polling kontrolliert ob neue Daten angekommen sind." while (!wl_module_data_ready());//waits for RX_DR Flag in STATUS nRF_status = wl_module_get_data(payload); //reads the incoming Data to Array payload Ich will nur wissen wie das Config-Register im Empfänger richtig konfiguriert wird damit ein Interrupt dort ausgelöst wird wenn Daten angekommen sind. Drei Interrupts können im Config-Register eingestellt werden. MASK_RX_DR, MASK_TX_DS, MASK_MAX_RT Mit freundlichen Grüßen
Arduinoquäler schrieb: > Aus diesem Bitsatz würde ich annehmen dass das Bit > > <CONFIG_MASK_RX_DR> (Receive Data Ready) > > uns sagt dass Daten eingetroffen sind die abgeholt werden können. Du kannst ja annehmen was du möchtest, aber bei mir steht im Datenblatt:
1 | MASK_MAX_RT |
2 | Mask interrupt caused bei MAX_RT |
3 | 1: Interrupt not reflected on the IRQ pin |
4 | 0: Reflext MAX_RT as active low interrupt on the IRQ pin |
:
Bearbeitet durch User
Timmo H. schrieb: > MASK_MAX_RT .... und das MAX_RT steht für maximum retries reached. Hat also nichts mit dem Empfangen zu tun. Denn beim Empfangen gibt es keiner Retries, aber beim Senden mit Acknowledge.
Rumburak schrieb: > Ich will nur wissen wie das Config-Register im Empfänger richtig > konfiguriert wird damit ein Interrupt dort ausgelöst wird wenn Daten > angekommen sind. Ich habe dir das relevante Bit ja schon genannt. Kommst du damit nicht weiter?
Hallo Arduinoquäler, Hallo Leute, ich bin noch nicht zum Testen gekommen, werde ich heute noch machen. Ich werde euch dann in Kenntnis setzten. Wie wird eigentlich das Config-Register beim nRF24L01 über Arduino eingestellt? Gruß
Arduinoquäler schrieb: > Timmo H. schrieb: >> MASK_MAX_RT > > .... und das MAX_RT steht für maximum retries reached. Ich meinte natürlich MASK_RX_DR
:
Bearbeitet durch User
Timmo H. schrieb: > Ich meinte natürlich MASK_RX_DR ... und jetz schön rausreden, gell? Wenn man zweimal das gleiche (falsche) behauptet dann kannst du hinterher viel sagen dass du was anderes gemeint hast.
Rumburak schrieb: > Wie wird eigentlich das Config-Register beim nRF24L01 über Arduino > eingestellt? Du brauchst dir nur die Arduino-Online Dokumentation anschauen. Auch ein Blick in die offenen Sourcen helfen womöglich....
Arduinoquäler schrieb: > Du brauchst dir nur die Arduino-Online Dokumentation anschauen. aus meiner eigenen "Nachforschung" (http://tmrh20.github.io/RF24/classRF24.html) -----------------------------------------------------
1 | void RF24::maskIRQ (bool tx_ok, |
2 | bool tx_fail, |
3 | bool rx_ready) |
The radio will generate interrupt signals when a transmission is complete, a transmission fails, or a payload is received. This allows users to mask those interrupts to prevent them from generating a signal on the interrupt pin. Interrupts are enabled on the radio chip by default. Mask all interrupts except the receive interrupt: radio.maskIRQ(1,1,0); Parameters tx_ok Mask transmission complete interrupts tx_fail Mask transmit failure interrupts rx_ready Mask payload received interrupts Definition at line 1024 of file RF24.cpp. ----------------------------------------------------- Natürlich muss man noch mit attachInterrupt() eine IRQ- Serviceroutine bereitstellen ....
Hallo Arduinoquäler,Hallo Leute, verstehe ich das richtig der Rx_ready-Interrupt ist dann aktiv, wenn das Bit im Register 0 ist. So entnehme ich das auch aus den Datenblatt. Mask interrupt caused by RX_DR 1: Interrupt not reflected on the IRQ pin 0: Reflect RX_DR as active low interrupt on theIRQ pin Ich habe folgende Definition bei mir eingetragen. #define wl_module_CONFIG_TXDS_MAXRT ( (1<<MASK_TX_DS) | (1<<MASK_MAX_RT)) in wl_module_config() ist dann bei mir folgende Codezeile jetzt zusätzlich enthalten wl_module_config_register(CONFIG, wl_module_CONFIG_TXDS_MAXRT); Das RX_DR Flag wird bei mir auch gesetzt wenn ich das Statusregister auslese aber löst nach wie vor keine Reaktion auf den IRQ-Pin aus! Gruß
Rumburak schrieb: > Das RX_DR Flag wird bei mir auch gesetzt wenn ich das Statusregister > auslese aber löst nach wie vor keine Reaktion auf den IRQ-Pin aus! Weil du den Receive Interrupt nicht freigegeben hast. Irgendwie kapierst du die einfachsten Sachen nicht oder ignorierst meine Beiträge. Warscheinlich glaubst du den Falschmeldungen mehr als mir. Arduinoquäler schrieb: > Aus diesem Bitsatz würde ich annehmen dass das Bit > > <CONFIG_MASK_RX_DR> (Receive Data Ready) > > uns sagt dass Daten eingetroffen sind die abgeholt werden können.
Rumburak schrieb:
[c]
#define wl_module_CONFIG_TXDS_MAXRT ( (1<<MASK_TX_DS) |
(1<<MASK_MAX_RT))
[c]
Muss um Verzeihung bitten. Habe nicht genau genug hingeschaut.
Eine Lösung hab ich jetzt gerade auch nicht ....
Ich denke ich habe den Fehler gefunden. Du benutzt die Bitmasken #define CONFIG_RESERVED 0x80 #define CONFIG_MASK_RX_DR 0x40 #define CONFIG_MASK_TX_DS 0x20 #define CONFIG_MASK_MAX_RT 0x10 #define CONFIG_EN_CRC 0x08 #define CONFIG_CRCO 0x04 #define CONFIG_PWR_UP 0x02 #define CONFIG_PRIM_RX 0x01 solltest in deiner Schreibweise aber die Bit Mnemonics verwenden: #define MASK_RX_DR 6 #define MASK_TX_DS 5 #define MASK_MAX_RT 4 #define EN_CRC 3 #define CRCO 2 #define PWR_UP 1 #define PRIM_RX 0 oder entsprechend der Bitmasken deine Schreibweise anpassen.
Hallo Arduinoquäler, die Mnemonics benutze ich hier #define wl_module_CONFIG_TXDS_MAXRT ( (1<<MASK_TX_DS) | (1<<MASK_MAX_RT)) durch den Aufruf der Funktion wl_module_config_register(CONFIG, wl_module_CONFIG_TXDS_MAXRT); wird das entsprechende Bitmuster an das Config-Register übergeben. das entspricht dann radio.maskIRQ(1,1,0); mit void RF24::maskIRQ (bool tx_ok,bool tx_fail,bool rx_ready) bool tx_ok ->MASK_TX_DS, bool tx_fail -> MASK_MAX_RT, bool rx_ready ->MASK_RX_DR Kann es vielleicht sein das der Sender das Auslösen des RX_DR interrupt auf den IRQ-Pin am Empfänger verhindert? Gruß
Rumburak schrieb: > die Mnemonics benutze ich hier Nein. Nochmal, du benutzt Bitmasken. Verstehst du den Unterschied nicht?
Rumburak schrieb: > bool tx_ok ->MASK_TX_DS, > > bool tx_fail -> MASK_MAX_RT, > > bool rx_ready ->MASK_RX_DR Du kannst auch einer Bool-Variable nicht einfach eine Bitmaske zuweisen. Nur TRUE oder FALSE, bzw 1 und 0.
Arduinoquäler schrieb: > Rumburak schrieb: >> bool tx_ok ->MASK_TX_DS, >> >> bool tx_fail -> MASK_MAX_RT, >> >> bool rx_ready ->MASK_RX_DR > > Du kannst auch einer Bool-Variable nicht einfach eine > Bitmaske zuweisen. Nur TRUE oder FALSE, bzw 1 und 0. Das ist richtig! Das mache ich auch nicht! Es sollte bedeuten das bool tx_ok entspricht MASK_TX_DS. Keine Zuweisungen!
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.