nRF24L01+ Funkübertragung mit AVR

Gast #3824932
Lesenswert?

Hallo,

ich versuche gerade eine Funkverbindung zwischen zwei AVRs (Atmega8) mit 
zwei NRF24L01+ Modulen herzustellen.

Ich nutze die folgende Library: 
https://github.com/kehribar/nrf24L01_plus

Problem: Der Empfänger scheint -unabhängig davon ob der Sender-AVR 
überhaupt eingeschaltet ist oder nicht- immer etwas zu empfangen.

Zum Anzeigen des Empfangenen habe ich ein LCD Display angeschlossen 
(funktioniert). Leider scheint das empfangene data_array leer zu sein:

Die Abfrage
1
uint8_t data_array[4];
2
if(nrf24_dataReady()){
3
nrf24_getData(data_array);
4
char* string;
5
sprintf(string, "%c",data_array[1]);
6
lcd_string(string);

gibt ein leeres LCD zurück. Ändere ich %c in %d, erscheint ein @-Zeichen 
auf dem Display. Die Umwandlung ist nötig, da lcd_string() einen 
"String" erwartet.

Auf der Sendeseite sieht es gar nicht so schlecht aus: Eine LED 
signalisiert mir ob die Übertragung erfolgreich war oder nicht. Wenn ich 
den Empfänger einschalte, leuchtet die LED, schalte ich ihn aus, 
erlischt auch die LED des Senders.

Hat schon einmal jemand mit dem Modul / der Library gearbeitet ?

LG Lampe
Gast #3825012
Lesenswert?

Ja stimmt, habe es in
1
char string[30];
2
sprintf(string, "%d %d %d %d",data_array[0], data_array[1], data_array[2], data_array[3]);

geändert, was jedoch leider nicht daran ändert, dass er nichts außer 
Nullen empfängt. nrf24_dataReady() gibt dabei dauerhaft 1 zurück, daher 
LCD Anzeige: 0 0 0 0 :(

1
    while(1)
2
    {
3

4
    if(nrf24_dataReady())
5
    {
6
      nrf24_getData(data_array);
7
      sprintf(string, "%d %d %d %d",data_array[0], data_array[1], data_array[2], data_array[3]);
8
      lcd_clear();
9
      lcd_string(string);
10
      _delay_ms(100);
11
    } else {
12
    lcd_clear();
13
    lcd_string("Kein Empfang");
14
    }
15
    }

Hat jemand eine Idee ?

LG Lampe
Gast #3825135
Lesenswert?

Ich nehme, an, Du benutzt die rx/tx_examples, die bei der
Lib dabei sind?

>nrf24_dataReady() gibt dabei dauerhaft 1 zurück

Das liegt wohl da dran, dass Du in der Empfangsroutine 100ms
wartest, während der Sender nur 10ms Delay drin hat.
Beim Empfänger brauchst Du gar kein Delay.
Lass' ihn einfach auf

nrf24_dataReady()

warten und erhöhe das Delay beim Sender, so dass Du Dein
LCD besser beobachten kannst.

Das sind aber alles keine Gründe, warum Du nur 0en empfängst...

RX, TX Adressen stimmen?
Gast #3825189
Lesenswert?

Ich wollte das LCD benutzen, um zu sehen, was denn ankommt. Die 
Endlosschleife des Empfängers:
1
    while(1)
2
    {
3

4
    if(nrf24_dataReady())
5
    {
6
      nrf24_getData(data_array);
7
      sprintf(string, "%d %d %d %d",data_array[0], data_array[1], data_array[2], data_array[3]);
8
      lcd_clear();
9
      lcd_string(string);
10
    } else {
11
    lcd_clear();
12
    lcd_string("Kein Empfang");
13
    }
14
    }

Der Sender sendet nun auf Tasterdruck. Auch ohne, dass ich irgend etwas 
versuche zu senden, zeigt das LCD 0 0 0 0.

Sender:
1
uint8_t rx_mac[5] = {0xE2,0xE2,0xE2,0xE2,0xE2};
2
uint8_t tx_mac[5] = {0xE1,0xE1,0xE1,0xE1,0xE1};

Empfänger:
1
uint8_t rx_mac[5] = {0xE1,0xE1,0xE1,0xE1,0xE1};
2
uint8_t tx_mac[5] = {0xE2,0xE2,0xE2,0xE2,0xE2};

Beide auf Kanal 2, Payload 4.

LG Lampe
Gast #3825214
Lesenswert?

Nachtrag:

Ich habe gerade einmal mit Hilfe dieser Library hier: 
http://www.tinkerer.eu/AVRLib/nRF24L01/
versucht die Verbindung aufzubauen, leider ebenfalls ohne Erfolg. Dafür 
erkennt der Empfänger nun wenigstens auch keinen Empfang mehr, wo keiner 
sein sollte.

Ich habe einmal per
1
spi_fast_shift(NOP)
versucht das Statusregister auszulesen und festgestellt, dass 255 
zurückkommt, was nicht mit dem Datenblatt 
(https://www.sparkfun.com/datasheets/Components/SMD/nRF24L01Pluss_Preliminary_Product_Specification_v1_0.pdf), 
Seite 56, übereinstimmt.

Woran kann das liegen ? Ein SPI Problem ? Arbeite ich leider das erste 
mal mit :(

LG Lampe
Gast #3825337
Lesenswert?

Von dem Datenblatt gibt's übrigens neuere Versionen,
meine ist von Sept. 2008 (Rev. 1.0).

Lass' dir doch 'mal die gesendeten und empfangenen Werte in der
spi_transfer() ausgeben und schau', ob die plausibel sind.

Bei SPI kommt die Antwort auf ein Kommando üblicherweise NICHT im 
gleichen
Transfer (der Slave muss ja darauf erst reagieren), sondern im nächsten
(SPI read op/write op im Datenblatt).

Glaube aber weniger, dass Dein Prob auf SPI Ebene liegt, Deine RF Module
scheinen ja zu reagieren...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren