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
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"?
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 ...
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.
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.
Wie soll das eigentlich beim Senden gehen? Wird da die Leitung auch gemuxed?
Die neuen Daten werden in das letzte der 165 synchron eingespeist.
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 ...
Friemel schrieb: > Die > SS Leitung kann nicht von der restlichen Schaltung bedient werden. Warum nicht?
Die Schaltung hat eben kein SS und kann nicht verändert werden.
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.
Nein, LD geht sofort wieder HI und damit wird ein SPI Reset erzwungen.
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.
Mit dem Inverter könntest du recht haben ... muss ich ausprobieren ...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.