Hallo Willi,
ich verwende keinen Interrupt für die NRF24 Kommunikation in meiner Anwendung.
Ausgangspunkt für meine aktuell laufende Anwendung war das Beispiel "pingpair" und nicht "pingpair_irq".
Der von dir gepostete "Codefetzen" schaltet im Falle eines Interrupts den Receiver auf Empfang.
Der Code, macht so wie ich das sehe, keine Initialisierung der NRF24 Module.
Bei mir sieht der Setup-Teil auf der Empfängerseite derzeit so aus:
// Role
// Receiver - role = role_ping_out;
role = role_ping_out;
// Transmitter - role = role_pong_back;
//role = role_pong_back;
printf_begin();
printf("\n\rRF24/examples/pingpair/\n\r");
printf("ROLE: %s\n\r",role_friendly_name[role]);
// Setup and configure rf radio
radio_1.begin();
radio_1.enableAckPayload();
radio_1.setAutoAck(true);
radio_1.setCRCLength(RF24_CRC_16); // RF24_CRC_DISABLED = 0, RF24_CRC_8, RF24_CRC_16
radio_1.setPALevel(RF24_PA_MAX); // RF24_PA_MIN = 0,RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX, RF24_PA_ERROR
radio_1.setDataRate(RF24_250KBPS); // RF24_250KBPS , RF24_1MBPS , RF24_2MBPS
radio_1.setRetries(15,0); // optionally, increase the delay between retries & # of retries
radio_1.setChannel(96); // 0...127
radio_1.setPayloadSize(32); // 1...32
// Open pipes to other nodes for communication
// This simple sketch opens two pipes for these two nodes to communicate
// back and forth.
// Open 'our' pipe for writing
// Open the 'other' pipe for reading, in position #1 (we can have up to 5 pipes open for reading)
// Master ATmega 2560
radio_1.openWritingPipe (pipes[0]); // Receiver MEGA 2560
radio_1.openReadingPipe(1,pipes[1]); // Transmitter Garten
radio_1.openReadingPipe(2,pipes[2]); // Transmitter Reserve
radio_1.openReadingPipe(3,pipes[3]); // Transmitter Reserve
radio_1.openReadingPipe(4,pipes[4]); // Transmitter Reserve
radio_1.openReadingPipe(5,pipes[5]); // Transmitter Teststation
// Slave Garten
//radio.openWritingPipe(pipes[1]);
//radio.openReadingPipe(1,pipes[0]);
// Dump the configuration of the rf unit for debugging
radio_1.printDetails();
// Start listening
radio_1.startListening();
Wenn die Initialisierung erfolgreich war erhalte ich aus "radio_1.printDetails();" u.A. eine Ausgabe der Empfangsadressen:
RX_ADDR_P0-1 = 0xf0f0f0f0e1 0xf0f0f0f0d2
Wenn die Initialisierung nicht funktioniert hat sieht die Ausgabe so, oder so ähnlich aus:
RX_ADDR_P0-1 = 0x0000000000 0x0000000000
Derzeit Frage ich im Loop über "if (radio_1.available()) "ständig ab ob Daten empfangen wurden.
Wenn Daten vorhanden sind werden diese dann verarbeitet.
Um diese ständige Abfrage ob Daten vorhanden sind zu umgehen hatte ich auch mal versucht auf die Interrupt-Variante zu wechseln.
Das scheiterte aber an meiner Unfähigkeit den Code dazu zu schreiben.
Mein Problem war, dass das NRF24 Modul wohl zu drei verschiedenen Situationen einen Interrupt auslöst.
Ich habe in der NRF24-Librarie, oder bei der Initialisierung der Module, keine Möglichkeit gefunden das so umzustellen, das das Modul nur dann einen Interrupt auslöst wenn Daten empfangen wurden.
Weil ich aber deshalb bei jedem Interrupt erst nachschauen was der Auslöser war, habe ich die Interruptgeschichte wieder verworfen.
Der Software-Reset sieht so aus:
void softReset (void)
{
asm volatile ("jmp 0");
}
Wird aufgerufen wenn nach einer einstellbaren Überwachungszeit die Funkkommunikation nicht antwortet.
Der Software-Reset ist aber mit Vorsicht zu verwenden weil der Hardware Reset Pin hierauf nicht reagiert.
Angeschlossene Geräte mit Hardware Reset Pin bekommen das also nicht mit.
Gruß Peter