Forum: Mikrocontroller und Digitale Elektronik Arduino Uno & ADG714 via SPI funktioniert nur sporadisch


von Kord F. (korduner)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich habe einen ADG714 via SPI mit dem Arduino Uno verbunden und in 
Betrieb genommen. Momentan hängen an dem Analog Switch nur 8 LEDs. die 
SPI Übertragung funktioniert, zumindest habe ich auf dem Oszi ein Clock 
und SS Signal. Die LEDs leuchten auch, jedoch nur wenn ich mit meinem 
Finger das ADG714 berühre oder mich mit dem Oberkörper über die 
Schaltung beuge, das selbe gilt auch für den Arduino, sobald ich mit dem 
Finger etwas auf dem Board berühre leuchten die LEDs ansonsten tut sich 
nichts, trotz korrektem CLK und SS Signal auf dem Oszi. Woran kann das 
liegen ?
Mein Code:
1
#include <SPI.h>
2
3
void setup() 
4
  {
5
  digitalWrite(SS, HIGH);  
6
  SPI.begin (); 
7
  }
8
void loop() 
9
{
10
sw1();
11
sw2();
12
sw3();
13
sw4();
14
sw5();
15
sw6();
16
sw7();
17
sw8();
18
alloff();
19
}
20
21
void alloff()
22
{
23
  digitalWrite(SS, LOW);    
24
  byte test = B00000000;
25
  SPI.transfer (test);
26
  digitalWrite(SS, HIGH);
27
  delay(500);
28
  SPI.endTransaction ();
29
}
30
void sw1()
31
{
32
  digitalWrite(SS, LOW);    
33
  byte test1 = B10000000;
34
  SPI.transfer (test1);
35
  digitalWrite(SS, HIGH);
36
  delay(500);
37
  SPI.endTransaction ();
38
}
39
void sw2()
40
{
41
  digitalWrite(SS, LOW);    
42
  byte test2 = B01000000;
43
  SPI.transfer (test2);
44
  digitalWrite(SS, HIGH);
45
  delay(500); 
46
  SPI.endTransaction ();
47
}
48
void sw3()
49
{
50
  digitalWrite(SS, LOW);    
51
  byte test3 = B00100000;
52
  SPI.transfer (test3);
53
  digitalWrite(SS, HIGH);
54
  delay(500);
55
  SPI.endTransaction ();
56
}
57
void sw4()
58
{
59
  digitalWrite(SS, LOW);
60
  byte test4 = B00010000;
61
  SPI.transfer (test4);
62
  digitalWrite(SS, HIGH);
63
  delay(500);  
64
  SPI.endTransaction ();
65
}
66
void sw5()
67
{
68
  digitalWrite(SS, LOW);
69
  byte test5 = B00001000;
70
  SPI.transfer (test5);
71
  digitalWrite(SS, HIGH);
72
  delay(500);
73
  SPI.endTransaction ();
74
}
75
void sw6()
76
{
77
  digitalWrite(SS, LOW);
78
  byte test6 = B00000100;
79
  SPI.transfer (test6);
80
  digitalWrite(SS, HIGH);
81
  delay(500);
82
  SPI.endTransaction ();
83
}
84
void sw7()
85
{
86
  digitalWrite(SS, LOW);
87
  byte test7 = B00000010;
88
  SPI.transfer (test7);
89
  digitalWrite(SS, HIGH);
90
  delay(500);
91
  SPI.endTransaction ();
92
}
93
void sw8()
94
{
95
  digitalWrite(SS, LOW);
96
  byte test8 = B00000001;
97
  SPI.transfer (test8);
98
  digitalWrite(SS, HIGH);
99
  delay(500);  
100
  SPI.endTransaction ();
101
}

Die Verkabelung ist auch korrekt:

D13(CLK) ----> Pin1   ADG714 SCLK
D12(MISO)---> Pin3   ADG714 DIN
D11(MOSI)---> Pin22 ADG714 DOUT
D10(SS) -----> Pin24 ADG714 /SYNC

An dem Analog Switch habe ich jeweils an Source eine 5v Spannung (Selbe 
Leitung die auch den IC versorgt) angeschlossen und die LEDs hängen mit 
330Ohm Vorwiderständen jeweils an Drain.
Anbei das Datenblatt zum Analog Switch.

Jemand eine Idee ?

von Helmut H. (helmuth)


Lesenswert?

Kord F. schrieb:
> Die Verkabelung ist auch korrekt:

GND, /Reset, VDD und VSS sind also nicht verbunden?

von Kord F. (korduner)


Lesenswert?

Doch natürlich,

Arduino           ADG714
5V  ------------- VDD (pin2) und jeweils an jede Source Leitung des ICs
GND ------------- GND & VSS (pin4 & pin21)

Grüße

von Joachim B. (jar)


Lesenswert?

alle IC mit Abblockkondensatoren bestückt?
Keine Eingänge offen gelassen?

: Bearbeitet durch User
von Helmut H. (helmuth)


Lesenswert?

Falls /Reset offen ist, könnte das das Verhalten erklären.

: Bearbeitet durch User
von Kord F. (korduner)


Lesenswert?

Habe ich nun auch angeschlossen und auf High, sprich 5V angelegt, bringt 
leider nichts.

von Kord F. (korduner)


Angehängte Dateien:

Lesenswert?

Anbei ein Schaltplan das ich fix mit fritzing erstellt habe. Ich habe 
die Vorwiderstände nicht eingezeichnet, sind aber vor jeder LED jeweils 
330 Ohm dran.

von mario eduardo (Gast)


Lesenswert?

Wie sieht es mit PullUp Widerständen aus?
Wie ist die Qualität der Versorgungsspannung ?

Mario

von Einer K. (Gast)


Lesenswert?

Schon mal daran gedacht, SS zum OUTPUT zu machen?

von Kord Friemel (Gast)


Lesenswert?

Arduino F. schrieb:
> Schon mal daran gedacht, SS zum OUTPUT zu machen?

SS ist doch Standardmässig ein Output?

Wenn das dass problem wäre, dürfte gar nichts klappen. Ich sehe mein SS 
ja auf dem Oszi es tut auch was es soll. Der fehler muss eigentlich an 
der Schaltung liegen.

von Einer K. (Gast)


Lesenswert?

Kord Friemel schrieb:
> SS ist doch Standardmässig ein Output?
Das hast du dir doch nur ausgedacht.

Hättest du dich über AVR SPI informiert, wüsstest du, dass SPI in den 
SlaveMode schaltet, wenn SS ein Input und LOW ist.

Also:
Fachbuch auf den Tisch und 5 Stunden nachsitzen.

von holger (Gast)


Lesenswert?

>SS ist doch Standardmässig ein Output?

Nein.

>Wenn das dass problem wäre, dürfte gar nichts klappen. Ich sehe mein SS
>ja auf dem Oszi es tut auch was es soll.

Du siehst wie der interne Pullup ein/ausgeschaltet wird.

von Kord F. (korduner)


Lesenswert?

Ich habe mir die Schaltung an meinem Arduino Mega aufgebaut. Mein Code 
sieht nun so aus:
1
#define SS 53
2
3
#include <SPI.h>
4
5
void setup() 
6
  {
7
  pinMode(48, OUTPUT); //Reset
8
  pinMode(SS, OUTPUT); 
9
  digitalWrite(SS, HIGH); 
10
  digitalWrite(48, HIGH);
11
  SPI.begin (); 
12
  }
13
14
void loop() 
15
{
16
alloff();
17
sw1();
18
}
19
20
void alloff()
21
{
22
  digitalWrite(SS, LOW);   
23
  byte test = B00000000;
24
  SPI.transfer (test);
25
  digitalWrite(SS, HIGH);
26
  delay(500);
27
}
28
void sw1()
29
{
30
  digitalWrite(SS, LOW);    
31
  byte test1 = B11111111;
32
  SPI.transfer (test1);
33
  digitalWrite(SS, HIGH);
34
  delay(500);
35
}

doch jetzt tut sich gar nichts mehr...

: Bearbeitet durch User
von Einer K. (Gast)


Lesenswert?

Kord F. schrieb:
> Ich habe mir die Schaltung an meinem Arduino Mega aufgebaut.

Welche Pins hast du verwendet?

von Kord F. (korduner)


Lesenswert?

VDD, GND und VSS sind klar,

48 für /reset
50(MISO) auf Pin3(DIN)
51(MOSI) auf Pin22(DOUT)
52(SCK) auf Pin1(SCLK)
53(SS) auf Pin 24(/SYNC)

von Einer K. (Gast)


Lesenswert?

(MOSI) auf (DOUT) ?
Und das gibt keinen Rauch?
Müsste aber!

Hoffentlich ist alles heile geblieben.

von Kord F. (korduner)


Lesenswert?

Wieso ?
Output auf IC Input und umgekehrt...
Die Verkabelung war auf dem Arduino Uno ja auch nicht anders.
Ich habe nichts verändert ausser den µC

: Bearbeitet durch User
von Einer K. (Gast)


Lesenswert?

(MOSI) ist der Master Output
(DOUT) ist der Slave Output

Output arbeitet gegen Output.
Rauch droht!

Kord F. schrieb:
> Die Verkabelung war auf dem Arduino Uno ja auch nicht anders.
Dann ist sie da auch schon falsch gewesen.

Haben nur alle übersehen, incl. meiner Wenigkeit.

von Kord F. (korduner)


Lesenswert?

Oh, Danke !

Ein erneuter blick ins Datenblatt:

Serial Data Output. This allows a number a parts to be daisy chained.
Data is clocked out of the input shift register on the rising edge of 
SCLK. DOUT is an open-drain output that should be pulled to the supply 
with an external pull-up resistor.

Wie groß sollte der Pull Up sein ?

von Einer K. (Gast)


Lesenswert?

Egal...
10K oder höher.
Egal.


Dout brauchst du sowieso nicht.

Kannst auch das Kabel und den Widerstand ganz weg lassen.

von Kord Friemel (Gast)


Lesenswert?

tut sich leider immer noch nichts

von Einer K. (Gast)


Lesenswert?

Kord Friemel schrieb:
> tut sich leider immer noch nichts

Tja ....

von Kord F. (korduner)


Angehängte Dateien:

Lesenswert?

Ich habe nochmals die Verkabelung überprüft alles iO. Mein CLK und SS 
Signal sehen auf dem Oszi auch gut aus, was mich jedoch stutzig macht 
ist das MISO Signal. Das müssten doch 5V sein ?
Bzw. der Bitfolge entsprechen die gesendet wird.
Mein Code:
1
#include <SPI.h>
2
int reset = 9;
3
void setup() 
4
  {
5
  pinMode(SS, OUTPUT);
6
  pinMode(MISO, OUTPUT);
7
  pinMode(reset, OUTPUT);
8
  SPI.begin();
9
  SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE0));
10
  digitalWrite(SS, HIGH); 
11
  digitalWrite(reset, HIGH);
12
  }
13
14
void loop() 
15
{
16
  SPI.begin();
17
  digitalWrite(SS, LOW);   
18
  SPI.transfer(B10101010);
19
  digitalWrite(SS, HIGH);
20
}

Anbei ein Bild vom Oszi:

Gelb: CLK
Grün: SS
Blau: MOSI

von Einer K. (Gast)


Lesenswert?

Kord F. schrieb:
> was mich jedoch stutzig macht
> ist das MISO Signal.
...
> Blau: MOSI

?


---

Wofür ist das beginTransaction, wenn du doch gar keine Transactions 
brauchst?

Auch hätte ich erwartet, dass CS sofort wieder hoch geht, aber das fehlt 
auf deinem Bild.

von Kord F. (korduner)


Angehängte Dateien:

Lesenswert?

Sorry, das sollte natürlich beides mal MOSI heißen.
Das MOSI Problem ist mittlerweile auch behoben, nur tut sich leider am 
Analog Switch IC immer noch nichts.
Anbei das aktuelle Oszi Signal.

Gelb= CLK
Blau= MOSI
Grün= SS

Das beginTransaction habe ich benutzt um die SPI Modi zu variieren, weil 
ich die Vermutung hatte das vielleicht nicht der korrekte SPI Mode 
eingestellt war.

: Bearbeitet durch User
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.