SPI mit NRF24L01 auf Breadboard unauffällig. Auf PCB nur Probleme

OP #6317689
Lesenswert?

Hallo,

ich möchte eine 2.4 Ghz Fernbedienung mit 8 Taster bauen. Hierzu wollte 
ich einen Atmega 328P und einen NRF24L01+ verwenden. Das Ganze habe ich 
in der Arduino IDE programmiert.
Um das ganze möglichst energiesparsam zu realisieren, läuft der Atmega 
auf 8Mhz, deswegen auch kein externer Taktgeber.
Es läuft zukünftig mit zwei 1,5V Batterien. Aktuelle betreibe ich es mit 
einem Labornetzteil auf 3,3V.

Der Prototyp auf dem Breadboard läuft ohne Auffälligkeiten. Also habe 
ich ein PCB erstellt.
Aber auf dem PCB habe ich sehr viele Übertragungsfehler, fast 
ausschließlich Übertragungsfehler.

Ich habe beide Varianten mit den gleichen Programmen und den gleichen 
Abständen zum Kommunikationspartner getestet.

Zur Fehleranalyse habe ich ein einfaches Programm erstellt:
1
#include <SPI.h>
2
#include <nRF24L01.h>
3
#include <RF24.h>
4

5
RF24 radio(7, 8); // CE, CSN
6
const byte address[6] = "abcde";
7
unsigned long Uebertragungsfehler = 0;
8

9
void setup()
10
{
11
  Serial.begin(115200);
12

13
  //SPI.beginTransaction(SPI_CLOCK_DIV128);
14
  SPI.setClockDivider(SPI_CLOCK_DIV64);
15
  radio.begin();
16
  radio.openWritingPipe(address);
17
  radio.stopListening();
18
  delay(10);
19
}
20

21
void loop()
22
{
23
  unsigned long zuUebertrageneVariable = 1;
24
  
25
  if (!radio.write(&zuUebertrageneVariable, sizeof(unsigned long))) Uebertragungsfehler ++;
26
  Serial.print(millis());
27
  Serial.print(": ");
28
  Serial.println(Uebertragungsfehler);
29
  delay(100);
30
}
Dieses Lief auf dem Breadboard 17 Minuten ohne Fehler. Dann habe ich den 
Test beendet. Auf dem PCB kam bei so gut wie jedem Sendeversuch ein 
Fehler, sodass ich den Test nach einer Minute beendet habe.
Um fehlerhafte Komponenten ausschließen zu können, habe ich das 
NRF24L01+ Modul und den Atmega vor dem Verlöten ausgiebig auf dem 
Breadboard getestet.

Ich vermute den Fehler im SPI. Ich habe beim Routen nicht so sehr auf 
möglichst gleiche Längen geachtet und auch nicht so sehr auf die 
Führung, weil ich dachte, dass dies bei den paar Megahertz schon nicht 
stören wird. Wie seht Ihr das?

Das Brennen des Bootloaders und aufspielen von Programmen, mit einem ISP 
Programmer läuft auf dem PCB übrigens problemlos.

PCB Layout und Schaltplan sind im Anhang. Auf meinem einfachen 
Oszilloskop konnte ich keine Auffälligkeiten am SPI sehen.
Auch das spielen mit dem SPI Takt (SPI_CLOCK_DIV64) brachte keine 
Abhilfe.

Auf dem PCB ist ein kleiner Fehler, R1 ist mir 3,3V verbunden. R1 müsste 
mit GND verbunden sein. Dies habe ich auf dem PCB mit einer Brücke 
gelöst.

Als Stützkondensatoren verwende ich vor dem NRF24L01+ einen Elko 22µF 
und einen Keramik 100nF. Ich habe es auf dem PCB auch ohne Kondensatoren 
ausprobiert. Auf dem Breadboard habe ich keine Kondensatoren.

Was meint Ihr, sind es die ungünstig verlegten Leiterbahnen?

Es ist übrigend mein erstes Projekt mit Eagle, also seid bitte 
nachsichtig ;)

Schonmal Danke und viele Grüße
Angehängte Dateien:
Gast #6317701
Lesenswert?

Jonny H. schrieb:
> Was meint Ihr, sind es die ungünstig verlegten Leiterbahnen?

Wer Mikrokontroller-Schaltungen ohne Abblock-Kondensatoren aufbaut,
nachmacht oder verfälscht, insbesondere bei existierenden
Schaltungen die Abblock-Kondensatoren weglässt oder falsch
verschaltet oder selbst solche Schaltungen entwirft, in Verkehr
bringt und/oder aufbaut ohne Abblock-Kondensatoren nach Hersteller-
Empfehlungen zu verwenden, wird mit Zugangs-Ausschluss vom
Mikrokontroller-Forum nicht unter zwei Jahren bestraft.
OP #6317777
Lesenswert?

Guest schrieb:
> Sehe ich das richtig, dass du eine GND Plane unter deinem Funkmodul
> hast?
>
> Dann hast du vermutlich deinen Fehler gefunden.

Ja, das wars. Habe ich überhaupt nicht drüber nachgedacht...
Vielen Dank!

Arduino Fanboy D. schrieb:
> Wozu ist der 10M Widerstand an PC5?

Den Wiederstand nutze ich zur Spannungsmessung

Arduino Fanboy D. schrieb:
> Ist das eine gute Idee, Aref mit Vcc zu verbinden?

Ich dachte so bekomme ich die Referenzspannung für meine 
Spannungsmessung. Sollte ich dies anders machen?
Gast #6317811
Lesenswert?

Jonny H. schrieb:
> Den Wiederstand nutze ich zur Spannungsmessung

Widerstand!

Erstens:
10M ist viel zu groß.
Laut Datenblatt sollte die Eingangsimpedanz kleiner 10k sein.
Da liegst du 3 Zehnerpotenzen drüber.

Zweitens:
Dein ATMega benötigt eine externe Beschaltung um die Versorgungsspannung 
zu messen. Aber dabei spuckt die überflüssige Aref Verbindung ins Essen.

Jonny H. schrieb:
> Sollte ich dies anders machen?
Ja, so wie im Datenblatt aufgemalt.
Gast #6317816
Lesenswert?

Jonny H. schrieb:
>> Wozu ist der 10M Widerstand an PC5?
>
> Den Wiederstand nutze ich zur Spannungsmessung

1. Lerne, Widerstand richtig zu schreiben.
2. Schaue ins Datenblatt oder andere Threads, 10 MegOhm ergeben einen 
Lottozahlengenerator, aber keine Spannungsmessung.

>> Ist das eine gute Idee, Aref mit Vcc zu verbinden?
> Ich dachte so bekomme ich die Referenzspannung für meine
> Spannungsmessung. Sollte ich dies anders machen?

Schaue ins Datenblatt oder z.B. den Schaltplan vom Arduino_irgendwas, 
Aref gehört nicht an Vcc, sondern mit einen Kondensator nach GND 
beschaltet.

Avcc gibt die Refernzspannung vor, solange man nicht per Register die 
interne Referenz des AT328 einschaltet.
OP #6317826
Lesenswert?

Arduino Fanboy D. schrieb:
> Erstens:
> 10M ist viel zu groß.
> Laut Datenblatt sollte die Eingangsimpedanz kleiner 10k sein.
> Da liegst du 3 Zehnerpotenzen drüber.

Ich verstehe was du meinst. Jedoch funktioniert es mit den 10M gut und 
drei Potenzen wirken sich ja doch leicht auf die haltbarkeit der 
Batterien aus. Und würde ich große Stückzahlen erstellen, würde ich mich 
auch an die Vorgaben halten.

Das mit AREF habe ich irgendwann wohl mal falsch abgekupfert.

Manfred schrieb:
> Lerne, Widerstand richtig zu schreiben.

Oh nein, einmal ein "e" zu viel. Und es muss gleich wieder so eine 
überflüssiger Kommentar kommen.

Vielen Dank für die Hilfe und die Tipps!
OP #6317831
Lesenswert?

Arduino Fanboy D. schrieb:
> Ja?
> Das wirst du mir nicht begründen können.

Die Schaltung zieht momemtan im Sleep 100uA. Bei einem 10k Widerstand 
würde sie 430uA ziehen. Ich habe es allerdings nie mit einem 10k 
aufgebaut, also ich weiß nicht ob da andere Effekte zum tragen kommen. 
Wird die Verbindung vom uC  "gekappt", oder worauf möchtest du hinaus?

Arduino Fanboy D. schrieb:
> Aber wie schon gesagt, der ist völlig überflüssig.

Ich gucke mir an, wie man es ohne externe Beschaltung macht
Gast #6317847
Lesenswert?

Jonny H. schrieb:
> Bei einem 10k Widerstand würde sie 430uA ziehen.
Das glaube ich dir nicht.
Der Widerstand wird ja nur bestromt, wenn der S&H Kondensator geladen 
wird.
Und das tust du im Tiefschlaf nicht.

Ganz wichtig:
Deine Messung kann, wenn du Vcc misst, und Vcc als Referenz verwendest, 
immer nur 1023 liefern.
Die Idee ist also schon im Ansatz broken.
Ein Irrtum im Design.
OP #6317868
Lesenswert?

Arduino Fanboy D. schrieb:
> Das glaube ich dir nicht.

Das meinte ich mit anderen Effekten. Aber dann weiß ich ja nun Bescheid.

Arduino Fanboy D. schrieb:
> Deine Messung kann, wenn du Vcc misst, und Vcc als Referenz verwendest,
> immer nur 1023 liefern.

Ja, stimmt. Auch da habe ich wohl nicht zu Ende gedacht.
Bei einem Versuch auf dem Breadboard hatte ich es noch ohne AREF 
ausprobiert.
Beitrag #6317876 wurde von einem Moderator gelöscht.

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