Forum: Mikrocontroller und Digitale Elektronik nRF24L01+ IRQ Empfänger


von Rumburak (Gast)


Lesenswert?

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

von Timmo H. (masterfx)


Lesenswert?

MASK_MAX_RT

von Arduinoquäler (Gast)


Lesenswert?

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.

von Rumburak (Gast)


Lesenswert?

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

von Timmo H. (masterfx)


Lesenswert?

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
von Arduinoquäler (Gast)


Lesenswert?

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.

von Arduinoquäler (Gast)


Lesenswert?

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?

von Rumburak (Gast)


Lesenswert?

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ß

von Timmo H. (masterfx)


Lesenswert?

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
von Arduinoquäler (Gast)


Lesenswert?

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.

von Arduinoquäler (Gast)


Lesenswert?

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

von Arduinoquäler (Gast)


Lesenswert?

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

von Rumburak (Gast)


Lesenswert?

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ß

von Arduinoquäler (Gast)


Lesenswert?

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.

von Arduinoquäler (Gast)


Lesenswert?

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

von Arduinoquäler (Gast)


Lesenswert?

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.

von Rumburak (Gast)


Lesenswert?

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ß

von Arduinoquäler (Gast)


Lesenswert?

Rumburak schrieb:
> die Mnemonics benutze ich hier

Nein. Nochmal, du benutzt Bitmasken.

Verstehst du den Unterschied nicht?

von Arduinoquäler (Gast)


Lesenswert?

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.

von Rumburak (Gast)


Lesenswert?

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