Go Down

Topic: Digitales Poti mit SPI, daisy chain (Read 237 times) previous topic - next topic

Blackfield3434

Dec 16, 2018, 01:48 pm Last Edit: Dec 16, 2018, 02:37 pm by Blackfield3434
Hallo zusammen

Ich habe Probleme drei digitale Potentiometer per SPI anzusteuern (Arduino Uno). Es handelt sich dabei um drei Stück des AD5290 von Analog Devices.

https://www.analog.com/media/en/technical-documentation/data-sheets/AD5290.pdf

Ich habe die drei Potis als Daisy Chain hintereinandergeschalten gemäss Datenblatt, inklusiv den Pull-Up Widerständen. Leider tut sich gar nichts bei den Potis. Ich möchte nur z.B. alle in die Endstellung bringen.
Es handelt sich ja um einkanalige Potis, da muss ich ja zuerst keine Adress-Byte senden, sondern kann direkt mit den Daten beginnen, oder?

Die Potis arbeiten mit max. 4MHz, dazu habe ich auch den Clock-Speed des Arduino Unos herabgesetzt. Immernoch ohne Erfolg.

Ist meine Code so richtig? Ich sende drei mal Daten für die jeweiligen Potis, mehr nicht.

Was könnte wohl sonst noch der Fehler sein?

Vielen Dank für eure Hilfe.


Code: [Select]



#include <SPI.h>

const int slaveSelectPin = 10;





void setup() {
  // set the slaveSelectPin as an output:
  pinMode(slaveSelectPin, OUTPUT);
  // initialize SPI:
 
  SPI.begin();
 
  SPI.setClockDivider(SPI_CLOCK_DIV4);



  digitalWrite(slaveSelectPin, LOW);
  //delay(100);

 
  SPI.transfer(256); // Daten für das letzte Poti in der Daisy Chain
  SPI.transfer(256);
  SPI.transfer(256); // Daten für das erste Poti in der Daisy Chain

  delay(100);

 
  digitalWrite(slaveSelectPin, HIGH);
}

void loop() {
  // put your main code here, to run repeatedly:

}


Tommy56

Setze Deinen Code bitte direkt ins Forum. Benutze dazu Codetags (</>-Button oben links im Forumseditor oder [*code] davor und [*/code] dahinter ohne *).
Das kannst Du auch noch nachträglich ändern.

Für 3 SPI-Teilnehmer brauchst Du auch 3 /CS-Pins, die Du entsprechend schalten musst.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

Blackfield3434

@Tommy56

Danke für den Tipp.

Nein, in de Daisy Chain Konfiguration ist nur eine CS Leitung notwendig, siehe Datenblatt.

Tommy56

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

Doc_Arduino

#4
Dec 16, 2018, 02:55 pm Last Edit: Dec 16, 2018, 02:55 pm by Doc_Arduino
Hallo,

ich welche "Stellung" fahren denn die Potis mit dem Sketch?  Etwas auf 1?
Hier drin liegt der Fehler   SPI.transfer(256)


Beide delays kannste ersatzlos streichen.
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Blackfield3434

Sie fahren eben leider in gar keine Position. Sie befinden sich alle immer in der Mitte-Stellung.
Ich habe bei SPI.transfer() einige Werte ausprobiert.
z.B. 0, 1, 256 oder auch in hex. 0x00, 0xFF und auch Werte dazwischen. Leider passiert gar nichts.  :smiley-confuse:

Tommy56

Was ist der Maximalwert für 1 Byte?

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

Blackfield3434

Ja das ist mir nun klar, dass dies 255 ist. Ich habe es aber ja auch wie erwähnt mit anderen Werten versucht und auch 0xFF. Aber leider geschieht nichts. Aber der Code scheint demnach in Ordnung zu sein?

Doc_Arduino

#8
Dec 16, 2018, 04:09 pm Last Edit: Dec 16, 2018, 04:17 pm by Doc_Arduino
Hallo,

ist in der Tat etwas seltsam. Aus der Ferne kann ich dir das zum testen geben.
Verkabelung stimmt? Massen sind alle verbunden?
Code: [Select]

#include <SPI.h>

const byte slaveSelectPin = 10;

void setup() {
  digitalWrite(slaveSelectPin, HIGH);
  pinMode(slaveSelectPin, OUTPUT);

  SPI.setDataMode(SPI_MODE0);   
  SPI.setBitOrder(MSBFIRST);
  SPI.setClockDivider(SPI_CLOCK_DIV4);
  SPI.begin();

  digitalWrite(slaveSelectPin, LOW);
  delay(1);
  SPI.transfer(64);  // Daten für das letzte Poti in der Daisy Chain
  SPI.transfer(192); // Daten für das erste Poti in der Daisy Chain
  delay(1);
  digitalWrite(slaveSelectPin, HIGH);
  SPI.endTransaction();   // eigentlich hier nicht notwendig
}

void loop() {
 
}


Edit 1:
MSBFIRST ergänzt. Jetzt ist das "volle Programm" drin, wenn es jetzt nicht geht, bin erstmal ratlos ...

Edit 2:
Ach Mist, ganz wichtig, vielleicht lag es daran, CS muss ganz zu Beginn auf HIGH, der IC benötigt die high-low Flanke damit er sich angesprochen fühlt. Wenns geht kannste den Code sachte zurückbauen.
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Blackfield3434

#9
Dec 16, 2018, 04:17 pm Last Edit: Dec 16, 2018, 04:20 pm by Blackfield3434
Danke dir!

Macht SPI.begin() nicht genau das? Also den CS zuerst gleich auf HIGH?

Ich werde es morgen damit mal versuchen. Ja Massen sind verbunden, Verkabelung sollte auch stimmen.

Danke für die Hilfe!

Doc_Arduino

Hallo,

morgen ... naja egal, wirst jetzt Advent feiern wollen   :)

spi.begin  konfiguriert nur die SPI Hardwareeinheit. Takt, Bitreihenfolge, Modus. Die weiß nichts von CS Pins. Du kannst ja sonst irgendwelche hunderte SPI ICs verwenden und damit hunderte CS Pins benötigen. Auch den einen CS Pin (/SS) in der Hardwareeinheit muss man separat konfigurieren.
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Blackfield3434

Super danke dir.

Haha, nein nix von Advent feiern. Ich würde das sehr gerne gleich jetzt austesten, habe aber das nötige Equipment nicht zu Hause, sondern in der Schule!

Ich denke, es könnte das mit dem CS sein, dass der am Anfang nicht auf High ist!

Danke nochmals und schönen Abend.

Go Up