Forum: Mikrocontroller und Digitale Elektronik nRF24L01+ Funkübertragung mit AVR


von Lampe (Gast)


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

von Angabe einer E-Mail-Adresse (Gast)


Lesenswert?

>char* string;
>sprintf(string, "%c",data_array[1]);

Beschäftige Dich mit C Grundlagen. Dringend.

von Lampe (Gast)


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

von Angabe einer E-Mail-Adresse (Gast)


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?

von Lampe (Gast)


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

von Lampe (Gast)


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

von Angabe einer E-Mail-Adresse (Gast)


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

von Mike (Gast)


Lesenswert?

Lampe schrieb:
> Ein SPI Problem ? Arbeite ich leider das erste mal mit :(

Dann inverstier doch mal in passendes Werkzeug, um solche Fragen direkt 
beantworten zu können. Ein kleiner LA für unter 8€ sollte doch in jedem 
Budget drin sein. (ebay-Suche "24MHz 8CH")

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.