NRF24L01+ mit PIC18F46K80

In dieses Forum gehören all deine Fragen rund um die Elektrotechnik und im Speziellen zum Bereich der Mikrocontrollertechnik.

NRF24L01+ mit PIC18F46K80

#1

Ungelesener Beitrag Thomas81 » 16. Nov 2019, 20:44

Hallo zusammen,

Ich bin neu hier, mein Name ist Thomas. Ich versuche gerade das Modul NRF24L01+ mit einem PIC18F46K80 zum Leben zu erwecken.

Leider klappt es nicht so recht. Ich verwende die TX und RX Routinen, die auf dieser Seite veröffentlicht wurden.

Es scheint sich langsam herauszustellen, dass die ISR das Problem darstellt. Ich kann das Projekt nicht kompilieren, wenn ich bei der Original ISR bleibe (in der Datei isr.c):

void interrupt highPrio(void)

INFO:

Code: Alles auswählen

isr.c:19:6: error: variable has incomplete type 'void'
void interrupt highPrio(void)
     ^
isr.c:19:15: error: expected ';' after top level declarator
void interrupt highPrio(void)
              ^
              ;
1 warning and 2 errors generated.
Der Compiler meckert nicht, wenn ich das draus mache:

Code: Alles auswählen

void __interrupt() isr_HIGH_Prio(void)
Nur wird dann leider die ISR nicht mehr aufgerufen.

Meine Fragen:

Wie sehen die Einstellungen für den Compiler aus, damit keine Fehlermeldungen generiert werden? Ist das Beispiel Projekt mit C90 oder C99 kompiliert worden?
Was habe ich übersehen?

Ich verwende den XC8, v2.05

Vielen Dank schonmal.

Viele Grüße,
Thomas
von Nico » 18. Nov 2019, 18:57
Hi Thomas,

zwei Dinge, die, mir beim ersten kurzen Überfliegen aufgefallen sind:

In der main.c des Tranceiver schreibst du wl_module_send(payload[0],wl_module_PAYLOAD);. Das sollte wohl eher wl_module_send(payload,wl_module_PAYLOAD); oder wl_module_send(&payload[0],wl_module_PAYLOAD); heißen.

Und (aber das ist nur eine Randbemerkung) Funktionsdefinitionen haben nichts in Header-Files zu suchen (siehe CAN_PIC18F46K80_XC8.h), siehe auch Projektstruktur.

Gruß Nico
Gehe zur vollständigen Antwort

Re: NRF24L01+ mit PIC18F46K80

#2

Ungelesener Beitrag vloki » 16. Nov 2019, 21:20

Laut GitHub muss das Projekt von 2015 sein.
Da gab es noch keine Implementierung von c99 beim XC8. (XC8 v1.34)

Am besten du schaust ins Handbuch für den Compiler, wie die Keywords für die aktuelle Compilerversion lauten....

Ich tippe auf

Code: Alles auswählen

void __interrupt(high_priority) dein_bezeichner(void)

Re: NRF24L01+ mit PIC18F46K80

#3

Ungelesener Beitrag Thomas81 » 17. Nov 2019, 10:03

Hallo,

der Tip mit dem Compiler war super, danke. Ich habe jetzt den XC8 v1.35 installiert, damit kann ich das Projekt kompilieren.
Da bin ich noch garnicht drauf gekommen.

Es werden allerdings keine korrekten Werte übertragen. Ich habe auf der Transmitterseite einen festen Wert eingestellt, aktuell ist die payload=5.
Der Receiver zeigt mir allerdings als payload 98 an. Woran kann sowas liegen?

Vielen Dank.

Gruß,
Thomas

Re: NRF24L01+ mit PIC18F46K80

#4

Ungelesener Beitrag Nico » 17. Nov 2019, 19:57

Hallo Thomas,

am besten stellst du mal deinen Hardware-Aufbau vor und lädst die vollständigen Programme hoch, damit man besser Hilfestellung geben kann.
  • Wie sendest du aktuell?
  • Getriggert von außen oder z.B. zeitlich gesteuert?
  • Bekommst du immer je Sendung ein empfangenes Paket?
  • Arbeitet deine SPI korrekt? Gemessen? Überprüft?
  • Sender und Empfänger identisch abgeschossen am PIC?
Grüße Nico

Re: NRF24L01+ mit PIC18F46K80

#5

Ungelesener Beitrag Thomas81 » 17. Nov 2019, 22:32

Hallo Nico,

Ich habe das zip File angehängt, es beinhaltet beide Projekte, für TX und RX.

Zum Hardwareaufbau:

Ich betreibe Sender und Empfänger mittels PIC18F46K80, beide sind auch per CAN Bus Schnittstelle mit meinem PC verbunden.
Über den CAN Bus lese ich die Register aus (z.B. TXB0D0=payload[0]; im Receiver, Zeile 212), Ich verwende keine Displays.
Die CAN Kommunikation läuft normal, die Register werden angzeigt.

Beide SPI Schnittstellen verhalten sich wie erwartet, der Receiver empfängt auch im Takt des Transmitters das Test Byte.
Per Ozilloskop konnte ich ebenfalls den IRQ Pin des Transmitters prüfen, der Interrupt wird nach jeder Übertragung ausgelöst.

Über eine Test LED lasse ich mir auf beiden Seiten anzeigen, ob die while(1) Schleife regelmäßig durchlaufen wird, was ebenfalls der Fall ist.

Sobald ich das NRF Modul des Receivers abziehe, wird die CAN Übertragung unterbrochen (while(!wl_module_data_ready()); ist im Endlosbetrieb in der main.c des Receivers). Nach erneutem Verbinden und Neustart des Receivers wird der Inhalt von payload[0] wieder im ersten Byte auf dem CAN Bus angezeigt.

Das macht auch soweit Sinn.

Im Wesentlichen sind die Routinen gleich geblieben, ich habe die CAN Schnittstellen ergänzt, und die Config Bits auf den PIC18F46K80 zugeschnitten, ebenfalls die Pin CE und CSN.

Wo kann ich den Inhalt des Arrays auslesen, welches in der wl_module.c, Zeile 534 ausgeführt wird (RX Seite)?

Benötigst du weitere Infos?

Vielen Dank.

Viele Grüße,
Thomas
Dateianhänge
XC8 Test PIC18F46K80 NRF24L01.zip
(1.36 MiB) 5-mal heruntergeladen

Re: NRF24L01+ mit PIC18F46K80

#6

Ungelesener Beitrag Nico » 18. Nov 2019, 06:38

Hallo Thomas,

ich versuche (je nach Zeit) nachher mal drüber zu schauen.
Danke schonmal für die Infos.

Gruß Nico

Re: NRF24L01+ mit PIC18F46K80

#7

Ungelesener Beitrag Nico » 18. Nov 2019, 18:57

Hi Thomas,

zwei Dinge, die, mir beim ersten kurzen Überfliegen aufgefallen sind:

In der main.c des Tranceiver schreibst du wl_module_send(payload[0],wl_module_PAYLOAD);. Das sollte wohl eher wl_module_send(payload,wl_module_PAYLOAD); oder wl_module_send(&payload[0],wl_module_PAYLOAD); heißen.

Und (aber das ist nur eine Randbemerkung) Funktionsdefinitionen haben nichts in Header-Files zu suchen (siehe CAN_PIC18F46K80_XC8.h), siehe auch Projektstruktur.

Gruß Nico

Re: NRF24L01+ mit PIC18F46K80

#8

Ungelesener Beitrag Thomas81 » 18. Nov 2019, 19:12

Hallo Nico,

Vielen Dank für den Tip mit dem & Zeichen im Transceiver, jetzt läuft die Funkstrecke wie es sein soll!
Noch eine kleine Frage, wie sieht die Funktion aus, wenn man nicht 1 Byte, sondern mehrere übertragen möchte?

Das mit der Projektstruktur ist so'ne Sache, die meisten Funktionen sind noch aus Hochschulzeiten (Freestyle), das habe ich nie geändert, nur auf die neuen Controller angepasst... ;-)

Vielen Dank.


Gruß,
Thomas

Re: NRF24L01+ mit PIC18F46K80

#9

Ungelesener Beitrag Nico » 18. Nov 2019, 20:55

Cool direkt ein Volltreffer :-D

Für mehrere Bytes bleibt der Aufruf gleich:

Code: Alles auswählen

wl_module_send(payload,wl_module_PAYLOAD)
Mit payload übergibst du den Pointer auf deinen Vektor und mit wl_module_PAYLOAD (btw für defines keine Klein-/Großbuchstaben mischen) gibst du an, wie viele Bytes übertragen werden sollen.

Also payload ist dein Zeiger auf den Vektor (dieser ist auch durch wl_module_PAYLOAD bereits in seiner Größe korrekt). Und die Funktion sendet dann beginnend von dessen Startadresse (also dem ersten Eintrag) an die Bytes.

Gruß Nico

Re: NRF24L01+ mit PIC18F46K80

#10

Ungelesener Beitrag Thomas81 » 19. Nov 2019, 19:21

Hallo Nico,

Danke für die Erläuterung, jetzt kann ich meine insgesamt 13 Bytes übertragen.
Vielen Dank für die Hilfe ;-)

Gruß,
Thomas

Antworten
  • Vergleichbare Themen
    Antworten
    Zugriffe
    Letzter Beitrag
  • Neuer Beitrag Datenübertragung mit nRF24L01+
    von pic18 » 6. Nov 2019, 23:11 » in Elektrotechnik und Mikrocontroller
    2 Antworten
    100 Zugriffe
    Letzter Beitrag von pic18
    7. Nov 2019, 10:13

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast