Forum: Mikrocontroller und Digitale Elektronik Max5400 digital Poti


von Max (Gast)


Lesenswert?

Hi,

ich möchte mit dem digital Poti Max5400 einen Widerstandswert von 1,2K 
erzeugen.
Kann mir jemand sagen, wie die Ports DIN, SCLK und /CS zu bedienen sind?

Wie soll ich die Pins am Mikrocontroller beschalten, damit ich den 
digital Poti benutzen kann??

D.h. welcher Pin am Mikrocontrolelr muss wie beschaltet sein, damit ich 
den digital Poti richtig einsetzten kann?

Mit so etwas habe ich nie vorher gearbeitet, daher weiß ich einfach 
nicht wie ich das ganze in Betrieb nehmen kann...

Vielen Dank im Voraus

Ps. für Beispiele wäre ich sehr dankbar

von Roland T. (rolandt)


Lesenswert?

@Max

Kannst Du Englisch lesen? Wenn ja, auf Seite 6 stehts haargenau 
beschrieben!

8 Bit seriell in das Register des MAX schreiben, indem Du den CS/ 
Eingang auf low legst und nach dem Einlesen wieder auf high. Für das 
Einlesen benötigst Du natürlich noch ein Data Clock Signal, das die Bits 
nach und nach im Register weiterschiebt bis es voll ist (8 Bit). 8 Bit, 
ergo 256 Zustände.

Dazu nimmst Du 3 Ausgänge an einem gewöhnlichen Port Deines µCs. Die 
Zustände der Ausgänge wechselst Du mit einer Schleife, die 8 mal 
durchlaufen wird, bis die Bits im Register des MAX sind.

Du kannst die Pins direkt an den Port anschließen. Du musst nur auf 
definierte Zustände der Ausgänge achten, bestenfalls mit internen µC 
Pull-Ups und Software.

Das sollte als Erklärung reichen ....

von Max (Gast)


Lesenswert?

DIN ist DataInput
wenn /CS LOW wird, dann werden die Daten in den Register vom Poti 
übertragen

um die Daten zu übergeben, brauche ich den SCLK. Wie kann ich den SCLK 
erzeugen? Muss ich das manuel machen, d.h. einen Port für 8 Zyklen immer 
von LOW auf HIGH und von HIGH auf LOW setzten?

Wie sieht der Bitmuster für 1,2k aus? 1200 wäre 100 1011 0000 aber es 
existerit nur ein 8-bit Register.

von Roland T. (rolandt)


Lesenswert?

Ne, der MAX5400 hat als max. Widerstandswert 50k. D.h. 
256/50k*1,2=6,144.
D.h. du musst also 00000110b ausgeben.

Du machst das mit dem Clock, wie Du es selbst beschrieben hast.

von Max (Gast)


Lesenswert?

@ Roland T.
>Kannst Du Englisch lesen?
ja kann ich :-D

ich habe das Datenbaltt durchgelesen, mir war aber nicht klar woher ich 
den SCLK nehmen muss.

also doch einfach einen Port nehmen und für Bits immer wieder 
inbertieren, bis die Daten in den Register gespeichert sind.

Aber eins habe ich immer noch nicht raus:
Wie kann ich den Widerstandswert einstellen? Ich meine welcher Bit 
entspricht welcher Zahl?

von Max (Gast)


Lesenswert?

Vielen Danke Roland...

Ich danke dir viel Mals :-)

von Max (Gast)


Lesenswert?

wäre das eine "gute" Lösung?:
1
poti_val = 0x06; // 6 x 196.1 Ohm = 1176.6 Ohm
2
3
CS_Clr(); // CS auf LOW
4
5
for(i=0; i<=7; i++) // Byte übertragen
6
{
7
  DIN_PutVal( (bool)(poti_val >> (7-i)) ); //wenn 0 LOW, wenn 1 HIGH
8
  SCLK_Set(); // CLK auf HIGH
9
  SCLK_Clr(); // CLK auf LOW
10
}
11
CS_Set(); // CS auf HIGH

von Max (Gast)


Lesenswert?

korrigiert:
1
poti_val = 0x06; // 6 x 196.1 Ohm = 1176.6 Ohm
2
3
CS_Clr(); // CS auf LOW
4
5
for(i=0; i<=7; i++) // Byte übertragen
6
{
7
  DIN_PutVal( (bool)(0x01 && (poti_val >> (7-i))) ); //wenn 0 LOW, wenn 1 HIGH
8
  SCLK_Set(); // CLK auf HIGH
9
  SCLK_Clr(); // CLK auf LOW
10
}
11
CS_Set(); // CS auf HIGH

von Max (Gast)


Lesenswert?

dann gehe ich davon aus, dass das die "gute" Lösung ist.
Aber eins muss man noch beachten. und zwar die HIGH- und LOW-PegelZeit 
vom CLK.

im Datenblatt steht 40ns für HIGH und 40ns für LOW aber die Zeit für 
eine Periode soll 100ns nicht unterschreiten.

bei 32MHz Prozessor-Taktfrequenz dauert ein HIGH-/LOW-Pegel 31,25ns. 
Wenn ich davon ausgehe (und das weiß nicht, ob das stimmt), dass ein 
Port in einem Takt geschaltet wird, dann wäre folgender Vorgang nicht 
ganz richtig:
1
  SCLK_Set(); // CLK auf HIGH
2
  SCLK_Clr(); // CLK auf LOW

in 2 Takten schalte ich den Ausgangsport auf HIGH und zurück auf LOW. 
bei 2 Takten wären das 62,50ns (also die 100ns Bedingung nicht erfüllt)

Daher füge ich NOP's ein und die Sache wäre geklärt :-)
1
  SCLK_Set(); // CLK auf HIGH
2
  NOP:
3
  SCLK_Clr(); // CLK auf LOW
4
  NOP
2 Takte bleibt der Port auf HIGH (also für 62,50ns) und 2 Takte bleibt 
es auf LOW (hier auch 62,50ns) -> eine Periode: 62,50ns + 62,50ns = 
125ns

von Christian R. (supachris)


Lesenswert?

Man könnte natürlich auch die in nahezu jedem µC vorhandene Hardware-SPI 
Schnittstelle nehmen, aber wieso einfach, wenn´s kompliziert auch 
geht....

von Max (Gast)


Lesenswert?

Du hast ja so recht, genau auf so eine Antwort habe ich die ganze Zeit 
erwartet.

Jetzt mache ich es mir der SPI-Schnittstelle :-)

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.