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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Kord F. (korduner)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Kord F. schrieb:
> Die Verkabelung ist auch korrekt:

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

von Kord F. (korduner)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
alle IC mit Abblockkondensatoren bestückt?
Keine Eingänge offen gelassen?

: Bearbeitet durch User
von Helmut H. (helmuth)


Bewertung
0 lesenswert
nicht lesenswert
Falls /Reset offen ist, könnte das das Verhalten erklären.

: Bearbeitet durch User
von Kord F. (korduner)


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

von Kord F. (korduner)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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)


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

Mario

von Arduino Fanboy D. (ufuf)


Bewertung
0 lesenswert
nicht lesenswert
Schon mal daran gedacht, SS zum OUTPUT zu machen?

von Kord Friemel (Gast)


Bewertung
0 lesenswert
nicht 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 Arduino Fanboy D. (ufuf)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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 Arduino Fanboy D. (ufuf)


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

Welche Pins hast du verwendet?

von Kord F. (korduner)


Bewertung
0 lesenswert
nicht 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 Arduino Fanboy D. (ufuf)


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

Hoffentlich ist alles heile geblieben.

: Bearbeitet durch User
von Kord F. (korduner)


Bewertung
0 lesenswert
nicht 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 Arduino Fanboy D. (ufuf)


Bewertung
0 lesenswert
nicht 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.

: Bearbeitet durch User
von Kord F. (korduner)


Bewertung
0 lesenswert
nicht 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 Arduino Fanboy D. (ufuf)


Bewertung
0 lesenswert
nicht lesenswert
Egal...
10K oder höher.
Egal.


Dout brauchst du sowieso nicht.

Kannst auch das Kabel und den Widerstand ganz weg lassen.

: Bearbeitet durch User
von Kord Friemel (Gast)


Bewertung
0 lesenswert
nicht lesenswert
tut sich leider immer noch nichts

von Arduino Fanboy D. (ufuf)


Bewertung
0 lesenswert
nicht lesenswert
Kord Friemel schrieb:
> tut sich leider immer noch nichts

Tja ....

: Bearbeitet durch User
von Kord F. (korduner)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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 Arduino Fanboy D. (ufuf)


Bewertung
0 lesenswert
nicht 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:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.