Forum: Mikrocontroller und Digitale Elektronik Geschwindigkeit Shiftregister Code


von Maus (Gast)


Lesenswert?

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!

von Lötlackl *. (pappnase) Benutzerseite


Lesenswert?


von i-Troll (c) (Gast)


Lesenswert?

Es sind 597er. Die Geschwindigkeit des codes laesst sich mit dem 
simulator herausfinden.

von Peter D. (peda)


Lesenswert?

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.

von Dietrich L. (dietrichl)


Lesenswert?

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

von Maus (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Maus (Gast)


Lesenswert?

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?

von MaWin (Gast)


Lesenswert?

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

von Reinhard Kern (Gast)


Lesenswert?

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

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


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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
Noch kein Account? Hier anmelden.