www.jb-electronics.de » Elektronik » Digitaltechnik » Ports einsparen
Bei Microcontrollern ist es fast immer das Problem, dass der entsprechende Controller eigentlich zu wenig Ausgänge oder Eingänge (Ports) für die gewünschte Applikation besitzt. Ein konkretes Beispiel: Man möchte eine Uhr basteln, die Stunden, Minuten und Sekunden anzeigen können soll. Zudem sollen alle Daten über einen seperaten Taster einstellbar sein. Das ergibt eine Gesamtahl - wenn man pro Ziffer 4 Kanäle rechnet, da wir uns ja im BCD-System bewegen - 27 Ports (24 Ausgänge für die sechs Ziffern + drei Eingänge für die Taster). So viele Ports haben die allerwenigsten Microcontroller, und dies wäre, dies sei schon einmal gesagt - für diesen Zweck auch sicherlich vollkommen überdimensioniert.
Doch was tun? Das Zauberwort heißt Latch. Ein Latch hat die Eigenschaft, einen Dateneingang und mehrere Ausgänge zu besitzen. Zudem besitzt es noch einen zusätzlichen Eingang, mit dem man die Daten, die am Eingang vorliegen, an den Ausgang durchschalten kann. Wenn man sich also nun vorstellt, dass man acht Datenleitungen besitzt (wie wir bei unserem Beispiel mit der Uhr; dort waren es acht Datenleitungen prog Sekunden/Minuten/Stunden) kann man diese parallel verschalten, sodass sie einen sogenannten BUS bilden. Das bedeutet also einfach, dass Eingang 1 des Latches 1, Eingang 1 des Latches 2 und Eingang 1 des Latches 3 zusammen verbunden werden. Und so weiter und so fort mit den restlichen sieben Eingängen (wenn wir von einem 8-Bit weitem Latch sprechen, wie sie in der Regel vorkommen).
Aber nur, weil an den Latcheingängen nun die Daten anliegen, werden sie glücklicherweise ja noch nicht ins Latch übernommen. Es gibt ja noch den Enable-Eingang. Diese werden allerdings seperat verschaltet. So können also nach und nach - um bei unserem Beispiel mit der Uhr zu bleiben - erst die Sekunden-Daten an den Datenbus gelegt werden, und dann wird der Enable Eingang des Latches für die Sekunden aktiviert, dann werden die Minutendaten an den Bus gelegt und der Eingang des Latches für die Minuten wird aktiviert, und dann werden die Stundendaten an den Bus gelegt und der Enable-Eingang des Latches für die Stunden wird aktiviert. Das grobe Prinzip ist ziemlich einfach. Bei diesem Falle eines parallelen Datenbus benötigt man bei unserem Uhrenbeispiel also nur noch 14 Leitungen - acht für den Datenbus, drei für die Enable-Eingänge und drei für die Taster: man hat die Anzahl der Leitungen durch ein wenig Nachdenken also glatt halbiert!
Nach so viel trockener Theorie einmal ein Schaubild, das das System erklären soll:
Doch dieses Verfahren wird hier nicht verwendet. Denn ein paralleler Bus benötigt immer noch viele Leitungen - die bei einem Microcontroller des Typs 16F627A auch nicht allzu zahlreich vorhanden sind. Daher existieren auch serielle Latches, nur dass diese meistens als Schieberegister bezeichnet werden.
In einem Schieberegister wird geschoben - aber was? Nun, wie immer in der Digitaltechnik: Bits werden geschoben. Aber nicht die alkoholischen Getränke, sondern die kleinsten digitalen Einheiten: Strom an oder Strom aus. Ein Schieberegister hat im Regelfall drei Eingänge: Einen Dateneingang, an dem entweder eine logische 1 oder 0 anliegen kann, einen Takteingang und einen Enable-Eingang. Die meisten Schieberegister sind 8Bit weit. Wenn man nun also das Signal, das an der Datenleitung anliegt, ins Register schieben will, setzt mal den Takteingang kurz auf HIGH und dann wieder auf LOW. Bei diesem Vorgang - einer sogenannten positiven Flanke - rückt das Signal, das am Dateneingang angelegen hat, an die erste von acht Stellen im Speicher. Dies kann man nun beliebig oft wiederholen bis alle Daten (in diesem Falle acht Bits) im Register abgespeichert sind. Dabei rücken alle Bits, die schon im Register gespeichert sind, um eine Stelle weiter.
Die Daten folgen dabei übrigens dem FIFO-Prinzip (dem First In First Out-Prinzip). Das hat man sich so vorzustellen: Ein Mensch setzt sich auf eine Bank, auf der nur eine bestimmte Anzahl von Personen Platz findet (sagen wir acht Personen). Nun möchte sich ein nächster Mensch auf die Bank setzen, und weil er unhöflich ist (Bits haben ja auch keine Manieren), schubst er den armen Menschen, der schon auf der Bank sitzt, einfach einen Platz weiter. Das machen nun mehrere Menschen, bis die Bank voll ist, und der Mensch, der am Anfang ganz links ganz alleine auf der Bank saß, auf einmal ganz rechts sitzt. Beim nächsten Menschen, der sich auf die Bank setzen will, fällt er also von der Bank herunter: er war als erster auf der Bank (first in) und fällt als erster auch wieder herunter (first out). Das ist mit dem Begriff FIFO gemeint.
Um diesen Datenverlust zu vermeiden, haben viele Schieberegister noch einen Datenausgang, an dem das Bit, das ja eigentlich verloren gehen würde, anliegt. So kann es von einem zweiten Schieberegister aufgefangen werden. Eine Kaskadierung mehrerer Schieberegister wird somit möglich.
Jetzt sind die ganzen Bits im Schieberegister, nun müssen sie nur noch durch Aktivieren des Enable-Eingangs angezeigt werden, und fertig ist das neue Prinzip, das bei unserem Uhrenbeispiel nur fünf Ports belegen würde (oder acht, wenn man die vier Taster mitzählen will): eine Datenleitung, an die alle Dateneingänge der Schieberegister angeschlossen werden; eine Taktleitung, an die alle Takteingänge der Schieberegister angeschlossen werden; und letztenendes drei Enable-Leitungen wie schon im obigen Modell. So kann jedes Register mittels der Enable-Leitungen addressiert werden. Schematisch sieht das ganze wiefolgt aus:
Durch dieses Prinzip sind noch drastischere Port-Einsparungen möglich: hier wurde die Anzahl der benötigten Ports mehr als gefünftelt!
Und - man sollte es kaum für möglich halten - es existiert noch ein weiteres Verfahren:
Denn wenn man besagten Ausgang, an dem immer das Bit anliegt, das sonst herausfallen würde, mit in die Überlegungen einbezieht, kann man die Schieberegister - wie oben schon angesprochen - kaskadieren, da immer das Bit, das sonst verloren gehen würde, in das nächste Schieberegister geschoben wird:
Die Schieberegister sind hier sozusagen in Reihe geschaltet, daher müssen alle Schieberegister auch gleichzeitig aktiviert werden (ENABLE ist jetzt ein BUS, im Gegensatz zum Datenausgang, der vom Controller jetzt nur noch zum ersten Schieberegister geht).
Mit diesem Verfahren lassen sich also - zumindest theoretisch - unendlich viele Ausgänge ansteuern; wie viele, das ist nur von den Kapazitäten des Controllers abhängig, da es natürlich sehr lange dauert, bis alle Bits gesetzt sind, was hier auch nur gleichzeitig geht. Entweder alle Register zeigen etwas an, oder keiner. Denn ein Bit, das in das letzte Register muss (hier Gerät 3) muss ja vorher durch alle anderen Register hindurchwandern. Zu beachten ist auch hier das FIFO-Prinzip, da das letzte Bit, das geschoben wird, später das erste Bit des ersten Registers ist; die gesendeten Daten werden quasi gespiegelt.
Dennoch ist dies eine sehr interessante Porterweiterungs-Methode, da bei den heutigen Geschwindigkeiten der Prozessoren (alle im MHz-Bereich) diese Übertragungszeit fast schon vernachlässigbar ist.
Sollte man diese Verfahren im Kopf behalten, sollte man in den allermeisten Fällen mit den einem zur Verfügung stehenden Ports von Microcontrollern auskommen. Gerade bei Microcontrollern ist immer wieder erstaunlich, wie unheimlich viel man aus wenigen Ports an Funktion herausholen kann.
Ein konkretes Beispiel für diese Theorie in der Praxis ist zum Beispiel die Binär-Uhr.
www.jb-electronics.de » Electronics » Digital Technology » Save on Ports
There is no English translation of this page available yet. It will take some more time for me to translate the whole website.
If you have a particular interest in this page getting translated as fast as possible, please contact me; I will see what I can do. Please click here for the German version.