Forum: Mikrocontroller und Digitale Elektronik 74HC595 mit anderen am SPI


von Ephraim H. (ephi)


Lesenswert?

Hallo,

ich möchte einen 74HC595 an den SPI Port meines ATMega8 hängen, da ich 
nichtmehr genug ausgangspins zur Verfügung habe. Soweit in Ordnung.

Allerdings habe ich am SPI Bus schon einen 10bit DAC. Von den 
Ausgabetimings her wären beide gleichzeitig dran kein problem, 
allerdings hab der 74HC595 ja keine ChipSelect Leitung. Ich könnte SRCLR 
dazu verwenden, nur würden dann die Registerinhalte gelöscht, was aber 
nicht sein darf. Die Stati sollten bis zum nächsten 'schieben' gehalten 
werden.

Spontan würde ich das mit einem Transistor lösen, der die beiden 
Taktleitungen als CS einfach abtrennt (SRCLK und RCLK wollte ich sowieso 
zusammennehmen an SCK).

Kriege ich das aber evtl. irgendwie ohne zusätzliche Hardware hin?

von Peter D. (peda)


Lesenswert?

Ephraim Hahn schrieb:
> allerdings hab der 74HC595 ja keine ChipSelect Leitung.

Doch, das RCLK arbeitet quasi als Chip select.
Wenn Du es nicht taktest, werden die Daten ignoriert.
Erst die 1-0 Flanke am Ende übernimmt.
Und genauso übernimmt der DAC mit der 1-0 Flanke des /CS am Ende.


Peter

von Falk B. (falk)


Lesenswert?

@  Ephraim Hahn (ephi)

>allerdings hab der 74HC595 ja keine ChipSelect Leitung.

Indirekt doch. Die RCLK LEitung.

> Ich könnte SRCLR
>dazu verwenden,

nein.

>Taktleitungen als CS einfach abtrennt (SRCLK und RCLK wollte ich sowieso
>zusammennehmen an SCK).

Nicht serh sinnvoll. SRCLK wird normal mit SCK verbunden, RCLK ist dein 
CS.

>Kriege ich das aber evtl. irgendwie ohne zusätzliche Hardware hin?

Siehe oben und AVR-Tutorial: Schieberegister

MFG
Falk

von Michael M. (Gast)


Lesenswert?

pin 12 kennst du aber schon?
nachtrag: da war ich ja viel zu langsam...

von Ephraim H. (ephi)


Lesenswert?

nungut, dann hab ich da wohl was falsch verstanden.

Ich mache es nun so:
1
void sw_output(uint8_t data)
2
{
3
  SW_PORT |= (1<<SW_CS);
4
  spi_send(data);
5
  SW_PORT &= ~(1<<SW_CS);
6
}

SW_CS ist die RCLK Leitung. spi_send sendet einfach ein byte mit 2Mhz 
SPI Clock raus. Irgendwie tut sich aber nix an den Ausgängen des '595. 
Ist das noch ein verständnisfehler, oder sonstwas?
So wie ich das datenblatt verstehe, übernimmt der die anliegenden Daten 
ja blos bei steigender RCLK flanke, also kann obiges ja nicht gehen, 
aber wie mach ich das dann?

OE hab ich auf GND und SRCLR auf Vcc gelegt. SER an MOSI und SRCLK an 
SCK. STromversorgung ist ebenfalls korrekt.

von Michael M. (Gast)


Lesenswert?

Ephraim Hahn schrieb:
> So wie ich das datenblatt verstehe, übernimmt der die anliegenden Daten
> ja blos bei steigender RCLK flanke, also kann obiges ja nicht gehen,
die frage ist, welches wohin du meinst. es gibt 2...

von Falk B. (falk)


Lesenswert?

@  Ephraim Hahn (ephi)

>SPI Clock raus. Irgendwie tut sich aber nix an den Ausgängen des '595.

Was logisch ist. CS muss am ANFANG LOW und nach der Übertragung HIGH 
sein.

>OE hab ich auf GND und SRCLR auf Vcc gelegt. SER an MOSI und SRCLK an
>SCK. STromversorgung ist ebenfalls korrekt.

Siehe auch

http://www.mikrocontroller.net/articles/AVR-Tutorial:_Schieberegister#Aufbau

MfG
Falk

von Michael M. (Gast)


Lesenswert?

mein beitrag oben gibt recht wenig sinn...
daher: die frage ist, wohin die daten übernommen werden. und dafür 
gibt es 2 möglichkeiten.
der von falk (erneut) verlinkte artikel beschreibt es echt gut.

von Ephraim H. (ephi)


Lesenswert?

okay, ich habs mir nochmal genauer angeschaut. Jetzt hab ich den 
Baustein endlich vollständig verstanden. Es funktioniert soweit auch 
prima.

Danke Euch!

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.