Forum: Mikrocontroller und Digitale Elektronik Frage zu kaskadiertem seriellen Input


von Friemel (Gast)


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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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"?

von Friemel (Gast)


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 ...

von Peter D. (peda)


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.

von Friemel (Gast)


Lesenswert?

OK, vielen Dank für die Antworten.

Dann muss ich das ganze mal aufbauen und ausprobieren.
Es wäre ja sicher auch für andere nett, für diese Aufgabe eine Art 
"building block" zu haben.

von W.S. (Gast)


Lesenswert?

Wie soll das eigentlich beim Senden gehen? Wird da die Leitung auch 
gemuxed?

von Friemel (Gast)


Lesenswert?

Die neuen Daten werden in das letzte der 165 synchron eingespeist.

von Friemel (Gast)


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 ...

von Joe F. (easylife)


Lesenswert?

Friemel schrieb:
> Die
> SS Leitung kann nicht von der restlichen Schaltung bedient werden.

Warum nicht?

von Friemel (Gast)


Lesenswert?

Die Schaltung hat eben kein SS und kann nicht verändert werden.

von Joe F. (easylife)


Lesenswert?

Friemel schrieb:
> 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 ...

Es müsste eigentlich auch funktionieren das Ladesignal (LD#) direkt als 
SS für den AVR zu benutzen.

von Friemel (Gast)


Lesenswert?

Nein, LD geht sofort wieder HI und damit wird ein SPI Reset erzwungen.

von Joe F. (easylife)


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.

von Friemel (Gast)


Lesenswert?

Mit dem Inverter könntest du recht haben ... muss ich ausprobieren ...

von Peter D. (peda)


Lesenswert?

Joe F. schrieb:
> dann benötigst du einen Inverter (kann
> ein einfacher Transistor mit Pullup sein), um das Load-Signal in ein CS#
> zu verwandeln.

Ja das hat mich auch schon geärgert, daß PL des 74HC165 die falsche 
Polarität hat.
Nur der 74HC299 ist geeignet, aber auch mit 20 Pins deutlich größer.

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.