Frage zu kaskadiertem seriellen Input

Gast #5142613
Lesenswert?

Hallo,

um die Anzahl der IOs zu vergrössern verwende ich drei kaskadierte 
74ls165, die dann seriell bei einer Rate von ca. 1MHz abgefragt werden. 
Soweit alles OK. Nun kommt jedoch die Anforderung hinzu, Daten aus einem 
Atmega8/16 "hinten anzuhängen". Mir ist im Moment nicht klar, ob man den 
AVR unter Verwendung des Schiebregister Clock Signals auslesen kann. 
Geht es überhaupt bei dieser Geschwindigkeit? Welche Technik des AVR 
könnte man verwenden: SPI, USART, Polling?
Hat da jemand Erfahrung?

Vielen Dank
Moderator (Firma: Titel) Persönliche Seite #5142621
Lesenswert?

Friemel schrieb:
> Nun kommt jedoch die Anforderung hinzu, Daten aus einem Atmega8/16
> "hinten anzuhängen". Mir ist im Moment nicht klar, ob man den AVR unter
> Verwendung des Schiebregister Clock Signals auslesen kann.
Das geht nur, wenn du einen Modus findest, in dem sich der AVR gleich 
verhält wie die 165er. Ich kenne keinen solchen Modus. Und wenn, dann 
kommt SPI am ehesten in die Richtung, denn SPI sind eigentlich nur 
gekoppelte Schieberegister...

> Hat da jemand Erfahrung?
Das mit dem "hintendranhängen" wird sehr wahrscheinlich ziemlich 
kompliziert. Vermutlich sind die Schieberegister sowieso an den SPI 
angeschlossen, warum schließt du den zweiten µC nicht einfach mit 
eigenem SlaveSelect parallel an den SPI?

> Nun kommt jedoch die Anforderung hinzu, Daten aus einem Atmega8/16
> "hinten anzuhängen".
Wie viele "Daten"?
Gast #5142632
Lesenswert?

Die Schieberegister hängen an den GPIOs eines Raspberry PIs und werden 
mit "Software/Bitbanging IO Toggelei" abgefragt.

Ich hatte auch schon die Idee, einfach ein (oder mehrere) 165er zu 
kaskadieren und die dann parallel mit dem AVR zu füttern. Das wäre eine 
gute Lösung, wenn die Datenwortbreite klein wäre . Vermutlich möchte ich 
jedoch 16bit, oder evtl. zukünftig mehr dort anhängen.
Es wäre schon pfiffig, nur mit einer SPI Lösung hinzukommen.
Angenommen SPI würde verwendet: Wie ist die Abhängigkeit der SPI Clock 
vom AVR Takt? Ich kann nicht unmittelbar erkennen, wie synchron der 
slave Betrieb wirklich ist ...
#5142656
Lesenswert?

Friemel schrieb:
> Mir ist im Moment nicht klar, ob man den
> AVR unter Verwendung des Schiebregister Clock Signals auslesen kann.

Ja, als SPI-Slave. Allerdings muß der Master nach jedem Byte eine Pause 
einlegen, damit der AVR das nächste Byte in das SPI laden kann. Der AVR 
sollte dabei auch tunlichst sämtliche Interrupts disablen oder die Pause 
muß mindestens die Dauer des längsten Interrupthandlers haben.

Neuere ATtiny haben einen Sendepuffer und man kann dem SPI-Interrupt den 
Level 1 zuweisen, d.h. er kann alle anderen Interrupts unterbrechen. 
Dann kann der Master auf Pausen verzichten.
Gast #5156039
Lesenswert?

Zum Abschluss: Es geht. Atmega328p ist als SPI slave konfiguriert. Die 
SS Leitung kann nicht von der restlichen Schaltung bedient werden.
Das hat leider zur Folge, daß das SPI Senderegister nicht synchronisert 
werden kann. Abhilfe: Der Ladepuls der 165er löst im AVR einen externen 
IRQ aus. Dieser zieht den SS Eingang kurz auf HI und initialisiert so 
die SPI Logik. Dann wird gesendet. Das scheint erst einmal so zu 
funktionieren ...
#5156241
Lesenswert?

Friemel schrieb:
> Nein, LD geht sofort wieder HI und damit wird ein SPI Reset erzwungen.

Ich dachte, genau das machst du auch über deine Interrupt-Routine:

Friemel schrieb:
> Dieser zieht den SS Eingang kurz auf HI und initialisiert so
> die SPI Logik. Dann wird gesendet.

Wenn SS für die Übertragung low sein muss (das ist eigentlich auch der 
Standard für ein SPI CS# Signal), dann benötigst du einen Inverter (kann 
ein einfacher Transistor mit Pullup sein), um das Load-Signal in ein CS# 
zu verwandeln.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren