Hallo Leute, ich möchte mit zwei Shift-Registern mehr Eingänge zur Verfügung haben. Gekauft habe ich mir 2x2 Verschiedene: zwei mal 74HCT957 und alternativ zwei mal MOS 4021 Jetzt dachte ich den 74HCT957 zu verwenden, weil die Eingangspins schön nebeneinander liegen. Zum Verkabeln und Anssteuern habe ich folgendes gefunden: http://y-aji.com/?p=242 in dem Beispielcode sind jede Menge delay() verbaut... mein Programm muss noch anderes machen und kann wirklich keine delays gebrauchen. Außerdem sind die LOW-Impulse, welche ich an den Shift-Eingängen sicher erkennen möchte nur etwa 1ms lang. gibt es eine Möglichkeit das alles schneller ablaufen zu lassen? und wie kaskadiere ich den 957? oder sollte ich doch besser 2 mal den MOS4021 verwenden? Danke!
Es sind 597er. Die Geschwindigkeit des codes laesst sich mit dem simulator herausfinden.
Maus schrieb: > in dem Beispielcode sind jede Menge delay() verbaut Und hast Du mal die Größe der Delays angeschaut? delayMicroseconds(0.2); Das sind ja nur 200ns! Vermutlich hat der Autor einen GHz-MC benutzt.
Maus schrieb: > und wie kaskadiere ich den 957? Den 957 gar nicht, aber den 597 so: Ausgang Qh' (Pin 9) auf Eingang SER (Pin 14) des nächsten. Die Steuersignale werden alle parallel geschaltet. Gruß Dietrich
Danke für die Antworten schneller als der Code! achso ja ḱlar, Zahlendreher, meine natürluch 597 > Und hast Du mal die Größe der Delays angeschaut? > > delayMicroseconds(0.2); > > Das sind ja nur 200ns! > Vermutlich hat der Autor einen GHz-MC benutzt. Nein, er benutzt den 16 MHz atMega328p auf dem Arduino. Für alle delays zusammen hab ich mir 20+0.2+7*0.2= 21.6 Microsekunden = 0.0216 Millisekunden. Für zwei schieberegister Kaskadiert wären es wohl das doppelte. also 0.04 Millisekunden. Also fast nix! Also die Trigger erkennen müsste er. Aber der Rest, der da läuft ist eine Echtzweitanwendung ... ich mag keine delays in dem Code. Warum überhaupt die delays? also per SPI ist's anscheinend schneller. Dazu noch ein paar Fragen: Da gibts hier von Peter Dannenberger einen Code, den ich nicht verstehe: Beitrag "Re: 74HC597" Brauche ich dafür eine Library? Wie modifiziere ich das für zwei Schieberegister? Überall wo 8 steht schreibe ich 16 rein? Wie lese ich damit aus ob ein Port High oder Low ist??
Maus schrieb: > Also die Trigger erkennen müsste er. Aber der Rest, der da läuft ist > eine Echtzweitanwendung ... :-) Echtzeit hat in der EDV eine etwas andere Bedeutung. Echtzeit bedeutet, dass für alles Maximalzeiten garantiert werden können. Echtzeit bedeutet nicht, dass alles in 0-Zeit (oder nahezu 0-Zeit) passiert. Also vorsicht mit dem Ausdrck. > ich mag keine delays in dem Code. > Warum überhaupt die delays? Schau ins Datenblatt, welche Zeiten minimal gefordert werden. Aber wahrscheinlich sind es nur Angst-Delays, weil sich der Originalprogrammierer gefürchtet hat. Ich kenns nur in der umgekehrten Richtung (also Ausgabe) mit einem 595: So schnell kann man einen Mega32 gar nicht takten, dass man damit einen 74-er Baustein in Bedrängnis bringen könnte. > Da gibts hier von Peter Dannenberger einen Code, den ich nicht verstehe: > Beitrag "Re: 74HC597" > > Brauche ich dafür eine Library? Erst mal sollten wir klären, ob wir immer noch vom Arduino reden oder nicht. Denn wir hier programmieren im Regelfall ohne den ganzen Arduino UNterbau. > Wie modifiziere ich das für zwei Schieberegister? Überall wo 8 steht > schreibe ich 16 rein? AUs sicht des µC, ist der IC-Verhau an den Portpins dann ganz einfach ein Schieberegister mit 16 Bit. Und wenn du 3 kaskadierst, dann ist das ein 24 Bit Schieberegister. etc. etc. > Wie lese ich damit aus ob ein Port High oder Low ist?? Du holst dir alle 16 Bit und fragst dann das eine dich interessierende Bit ab. Also nicht Einzelzugriff an die 597 Bits sondern: alle 16 Bits im Gänsemarsch in entsprechende Variablen rein. Und dann auf diesen Variablen die Bits auswerten.
Danke nochmal für die Antwort!!! > :-) Echtzeit hat in der EDV eine etwas andere Bedeutung > Also vorsicht mit dem Ausdrck. Ja ich weiß, der Begriff Echtzeit ist auch außerhalb des Computers schon absurd und rührt ja auch schon von einer physikalischen Denke her ... > delayMicroseconds(0.2); > > Das sind ja nur 200ns! > Vermutlich hat der Autor einen GHz-MC benutzt habs grade nochmal nachgerechnet: in 200ns macht der 16MHz Prozessor 3,2 Takte Habe gelesen, dass schon das digitalWrite() vom Arduino 56 Takte lang ist ( BTW da nehm ich dann doch noch die direkten Portzugriffe, die sind zwi Takte lang!?) > Erst mal sollten wir klären, ob wir immer noch vom Arduino reden oder > nicht. > Denn wir hier programmieren im Regelfall ohne den ganzen Arduino > UNterbau. Ja ich mache das jetzt hier in Arduino. Habe auch schon größere Projekte direkt mit AVRs realisiert aber hier wollte ich den Kompfort des debuggens mit Seriellem blabla nutzen. Ich frage nach Library weil in dem Code von Peter Namen wie SPI_CLK_DDR und SPI_MOSI_DDR und SPI_MOSI usw stehen. muss man die noch #definen oder kennt AVR-Studio diese Namen schon? Oder eine Library #includen?? ist das die AVR/io.h ??? > Du holst dir alle 16 Bit und fragst dann das eine dich interessierende > Bit ab. d.h. die Variable b im Code von Peter sind die 8 Bits aneinander gereiht? also gibt die Funktion eine Zahl aus, die alle 8 Portzustände enthält? > Siehe Dir das mal an. > http://www.mikrocontroller.net/articles/Porterweit... da steht geschrieben: "Alternativ kann z. B. auch ein 74xx597 verwendet werden. Durch dessen zusätzlichen Eingangspuffer (Latch) ist der Schaltungsaufwand allerdings höher. " Was heißt das? Wie schließe ich den LatchPin im bei SPI an? Doch besser MOS4021? welchen Vorteil hat SPI?? Warum ist das schneller?
> Außerdem sind die LOW-Impulse, welche ich an den Shift-Eingängen sicher > erkennen möchte nur etwa 1ms lang. Das heisst, daß mna alle 500us alle 16 Eingänge gelesne haben muss. Da ein Bit durch CLOCK, DATENBIT IN, CLOCK, DATENBIT SCHIEBEN besteht, sind 16 davon 64 Befehle, hinzu kommt ein LATCH Signal, also 66 Befehle. Bei 16MHz hat ein AVR dann noch gut 6400 Befehle Zeit was anderes zu tun, er wird gerade mal zu 1 % beansprucht.
Maus schrieb: > Wie lese ich damit aus ob ein Port High oder Low ist?? Du bekommst ein 16bit-Wort, in dem das dich interessierende halt drinsteckt. Wenn du sofort und direkt einen bestimmten Eingang abfragen willst, dann brauchst du als Input-Extender keine Schieberegister, sondern Multiplexer. Das hat den Vorteil, dass du nur die Eingänge häufig abfragen musst, bei denen eine schnelle Erfassung nötig ist, und nicht alle 16 - aber das ist eine ganz andere Schaltung und eine ganz andere Software. Gruss Reinhard
Maus schrieb: > da nehm ich dann doch noch die direkten Portzugriffe, die sind > zwei Takte lang!? Wenn du sie in Assembler machst. Und keine Ausmaskiererei und Schieberei oder gar eine Schleife dazurechnest... Kurz: man kann sich viel herfabulieren (im Extremfall sogar ein Delay um 0.2us), aber ob das die Hardware dann tatsächlich kann, das sagt dir am einfachsten der Simulator, der den ganzen Code ja zyklusgenau durchrechnen muss.
Maus schrieb: > Da gibts hier von Peter Dannenberger einen Code, den ich nicht verstehe: > Beitrag "Re: 74HC597" > > Brauche ich dafür eine Library? Die Macros für die Pins mußt Du entsprechend Deiner Schaltung definieren. Suche mal nach meiner sbit.h, damit geht das ganz leicht. Maus schrieb: > Wie modifiziere ich das für zwei Schieberegister? Überall wo 8 steht > schreibe ich 16 rein? Nein, Du rufst die Funktion so oft auf, wie Du Bytes lesen willst und legst den Returnwert in ein entsprechend großes Array ab. Und vor dem ersten Aufruf den Latchimpuls nicht vergessen.
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.