Go Down

Topic: DIGITAL Poti über SPI (Read 144 times) previous topic - next topic

Florian_beginner

Moin ich möchte ein digital Potentiometer TYP AD8400 über SPI regeln.

Mein Code lautet
Code: [Select]
void digitalPotWrite(int address, int value, int resistor) {
  switch (resistor){
  case 1: {
 // take the SS pin low to select the chip:
    digitalWrite(slaveSelectPinStrom, LOW);
  //  send in the address and value via SPI:
    SPI.transfer(address);
    SPI.transfer(value);
  // take the SS pin high to de-select the chip:
    digitalWrite(slaveSelectPinStrom, HIGH);
    break;
  }
  case 2:
  {
    // take the SS pin low to select the chip:
    digitalWrite(slaveSelectPinSpg, LOW);
    //  send in the address and value via SPI:
    SPI.transfer(address);
    SPI.transfer(value);      // Poti Wert übertragen
    // take the SS pin high to de-select the chip:
    digitalWrite(slaveSelectPinSpg, HIGH); 
    break;
  }
  default: break;
  }
}


zum ausführen schreibe ich: digitalPotWrite(0, level, 2);

leider passiert einfach mal gar nichts. Was mache ich falsch? Wie finde ich die Adresse heraus vom Poti? Wenn ich das Datenblatt richtig verstehe 00 !?!

Link zum Datenblatt:

Ad8400


MfG Florian

combie

Link zum Datenblatt:

Ad8400

Beim überfliegen des Datenblattes bin ich auf folgende Stelle gestoßen:
Seite 11
SERIAL DATA-WORD FORMAT
Table 6

Der Baustein erwartet ein 10 Bit Format, dass kann das, in deinem AVR eingebaute SPI, nicht leisten.
Irren ist menschlich.
Im Irrtum verharren ist Dummheit!

Florian_beginner

Kannst du einem Laien das genauer erklären?

Ich hatte dieses Projekt noch gefunden und gehofft ich muss einfach nur meine Adressierung o.ä ändern?

Link

combie

Kannst du einem Laien das genauer erklären?

Ich hatte dieses Projekt noch gefunden und gehofft ich muss einfach nur meine Adressierung o.ä ändern?

Link
Ein Irrtum:
1. SPI kennt keine Addressierung
2. Ein MCP41010 ist kein AD8400! Das sieht man an der Aufschrift, und auch mehrfach im Datenblatt.

Der AD8400 hat ein 10 Bit Schieberegister und der  MCP41010 16Bit.
Tada!
(und das ist nur 1 Unterschied)


Deine Möglichkeiten:
1. Du könntest deinem AD8400  16Bit schicken, die überflüssigen 6 schiebt er wieder raus.
2. SoftwareSPI
Irren ist menschlich.
Im Irrtum verharren ist Dummheit!

Serenifly

#4
Feb 20, 2017, 04:57 pm Last Edit: Feb 20, 2017, 07:07 pm by Serenifly
Der Baustein erwartet ein 10 Bit Format, dass kann das, in deinem AVR eingebaute SPI, nicht leisten.
Das geht schon. Es ist nur sehr verwirrend. Die Datenbits werden in ein Schieberegister geschoben. Man schickt zwei Bytes hintereinander. Und die 6 Bits die wegfallen werden zu erst geschickt so dass sie am Ende nicht im SR stehen. Man muss dann nur die Bit-Ordnung richtig machen damit es in der richtigen Reihenfolge steht.

Also das als:
D7 D6 D5 D4  D3 D2 D1 D0 | D7 D6 x x  x x x x


EDIT:
Der Chip erwartet das MSB first. Dadurch geht es wenn man einfach beide Bytes direkt hintereinander schickt. Ohne sie irgendwie aufzubereiten :)

Florian_beginner

#5
Feb 20, 2017, 06:47 pm Last Edit: Feb 20, 2017, 06:56 pm by Florian_beginner
Im Prinzip schicke ich ja 16bit. Meine "Adresse" besteht ja nur aus 8bit nullen. Und danach schiebe ich meinen Value ins Register.

Funktioniert in einem vereinfachten Aufbau auch. Ich muss nur noch heraus finden warum in meinem Gesamtaufbau nicht...

Serenifly

Ah ich sehe wieso es geht. Steht auch im Datenblatt:
Quote
The format of this data-word is two address bits, MSB first, followed by eight data bits, also MSB first. 
Also nicht LSB first wie man naiv denkt


Dadurch hat man das:
Code: [Select]

D7 D6 D5 D4  D3 D2 D1 D0 | x x x x  x x A1 A0

Und es passt direkt man einfach beide Bytes MSB first sendet (und das Adress-Byte zuerst). Dadurch kommen die überflüssigen Bits zuerst an

Go Up