Forum: Mikrocontroller und Digitale Elektronik SPI mit NRF24L01 auf Breadboard unauffällig. Auf PCB nur Probleme


von Jonny H. (jonny123) Flattr this


Angehängte Dateien:

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

: Bearbeitet durch User
von Das Übliche (Gast)


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.

von Das Übliche (Gast)


Lesenswert?

Jonny H. schrieb:
> Ich habe es auf dem PCB auch ohne Kondensatoren ausprobiert.

... weil es ja keine braucht, wie du soeben bewiesen hast ....

von Guest (Gast)


Lesenswert?

Sehe ich das richtig, dass du eine GND Plane unter deinem Funkmodul 
hast?

Dann hast du vermutlich deinen Fehler gefunden.

von Einer K. (Gast)


Lesenswert?

Wozu ist der 10M Widerstand an PC5?
Ist das eine gute Idee, Aref mit Vcc zu verbinden?
/CS des nRF darf ruhig einen Pullup bekommen, damit der dir beim ICSP 
Vorgang nicht dazwischen quatscht

von Martin (Gast)


Lesenswert?

"... ungünstig verlegten Leiterbahnen ..."

Das ist noch euphemistisch. Z. B. GND == Das Grauen.

von Jonny H. (jonny123) Flattr this


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?

von Jo (Gast)


Lesenswert?

Interne Referenz vom Mikrocontroller vielleicht, falls er eine hat?

von Jo (Gast)


Lesenswert?

Korrektur: Habe nicht gesehen, dass du angegeben hast, dass es ein 328p 
ist, der hat eine.

von Einer K. (Gast)


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.

von Manfred (Gast)


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.

von Einer K. (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:
> Dein ATMega benötigt eine externe Beschaltung um die Versorgungsspannung
> zu messen.

Das soll natürlich heißen:
Dein ATMega benötigt keine externe Beschaltung um die 
Versorgungsspannung
> zu messen.

von Jonny H. (jonny123) Flattr this


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!

von Einer K. (Gast)


Lesenswert?

Jonny H. schrieb:
> Jedoch funktioniert es mit den 10M gut
Uneinsichtig?
OK, von mir aus.
Aber wie schon gesagt, der ist völlig überflüssig.

Jonny H. schrieb:
> und drei Potenzen wirken sich ja doch leicht auf die
> haltbarkeit der Batterien aus.
Ja?
Das wirst du mir nicht begründen können.

von Jonny H. (jonny123) Flattr this


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

: Bearbeitet durch User
von Einer K. (Gast)


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.

von Jonny H. (jonny123) Flattr this


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 vom Autor gelöscht.
von spess53 (Gast)


Lesenswert?

Hi

Ja, stimmt. Auch da habe ich wohl nicht zu Ende gedacht.

Geht aber. AREF=VCC + Bandgap messen + etwas Rechnerei.

MfG Spess

von Einer K. (Gast)


Lesenswert?

spess53 schrieb:
>  AREF=VCC + Bandgap messen + etwas Rechnerei.
Ja.

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.