Forum: Mikrocontroller und Digitale Elektronik Frage Schieberegister 74hc165


von Reinhard S. (schopfi)


Lesenswert?

Hi @ll!

Ich habe da mal ne Frage bezüglich Bitmanipulation, wo ich erhlich 
gesagt nicht ganz fit bin.
Ich habe eine Schieberegister 74hc165 und will aus einem Tiny2313 mit 2 
Pins
(Clk und Data) das Register füllen.
Der Ablauf ist mir auch bekannt, das bei jedem CLK wechsel ein Bit 
weiter geschoben wird. Ich programmiere in C und schiebe mit einer 
Zählerschleife 8 mal.
Jetzt zur meiner Frage : Ich habe z.B den Wert test=0x15 den ich ins 
Register takten will was ja binär 0b00010101 ist.
Kann ich das mit der Funktion test |=(<<1) machen wenn ich das 8 mal 
schiebe, oder bekomme ich dann 8 mal eine 1, also 0xFF ?
Oder wie schiebt man von einem Wert jedes Bit einzeln nacheinander ins 
Register?
Leider habe ich kein 595er Register mit Latches denn da könnt ich ja den 
USI verwenden und müsste mir keinen Kopf machen ! :-)

Vielen Dank
lg
Schopfi

von Karl H. (kbuchegg)


Lesenswert?

Reinhard Schopf schrieb:

> Jetzt zur meiner Frage : Ich habe z.B den Wert test=0x15 den ich ins
> Register takten will was ja binär 0b00010101 ist.
> Kann ich das mit der Funktion test |=(<<1) machen wenn ich das 8 mal
> schiebe, oder bekomme ich dann 8 mal eine 1, also 0xFF ?
> Oder wie schiebt man von einem Wert jedes Bit einzeln nacheinander ins
> Register?
> Leider habe ich kein 595er Register mit Latches denn da könnt ich ja den
> USI verwenden und müsste mir keinen Kopf machen ! :-)

Dann wirds Zeit

Das ist deine Zahl, diesmal dargestellt als Binärzahl. 8 Bit in ihrer 
vollen Pracht.

  +---+---+---+---+---+---+---+---+
  | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 1 |
  +---+---+---+---+---+---+---+---+

Du greifst jetzt zb das Bit ganz rechts ab, und je nachdem ob es 0 oder 
1 ist, setzt du die Dtaenleitung ebenfalls auf 0 oder 1.

Wie teste man ob ein Bit 0 oder 1 ist?
Einfach: man legt einfach eine geeignete Maske über das Byte, welches 
alle anderen Bits gezielt auf 0 setzt, so dass nur noch das eine 
interessierende Bit im Ergebnis eine 1 einbringen kann.

   if( wert & 0x01 )
     das rechteste Bit ist 1, also auch die Ausgangsleitung auf 1 setzen
   else
     nö, das Bit ist 0, also: Datenleitung auf 0


damit hast du das am weitesten rechts liegende Bit ausgegeben. Was ist 
mit den anderen Bits?
Ganz einfach: wenn du das ganze Byte einfach um 1 Stelle nach rechts 
schiebst, dann hast du ein neues rechtestes Bit (welches im Originalbyte 
das vorletzte rechte Bit war).

  +---+---+---+---+---+---+---+---+
  | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 1 |
  +---+---+---+---+---+---+---+---+
    |   |   |   |   |   |   |   |
    |   |   |   |   |   |   |   +------> und tschüß mit ü
    .   .   .   |   |   |   +--+
    .   .   .   |   |   +--+   |
                |   +--+   |   |
                +--+   |   |   |
                   |   |   |   |
                   v   v   v   v
  +---+---+---+---+---+---+---+---+
  | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 |
  +---+---+---+---+---+---+---+---+

In C schreibt sich das als

   wert = wert >> 1;

Tja. Und damit sind wir aber wieder bei der ersten Frage: wie gebe ich 
den Zustand des rechtesten Bits aus. Logischerweise genau gleich. Und 
wenn ich dann das Byte nochmal um 1 Stelle nach rechts schiebe, dann 
wird daraus

  +---+---+---+---+---+---+---+---+
  | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 |
  +---+---+---+---+---+---+---+---+

und ich hab an der ganz rechten Stelle das Bit, welches im Original an 
der vor-vorletzten rechten Stelle war. Usw. Usw. Mit jedem mal um 1 
Stelle nach rechts schieben, wandert ein Bit nach dem anderen durch das 
rechteste Bit durch. Mit der Maskierung stellt man fest, ob es 0 oder 1 
ist und setzt entsprechend die Datenleitung.

Und da der Vorgang immer gleich ist, und wir wissen, dass da 8 Bit 
vorhanden sind, kann man das alles wunderbar in eine Schleife packen

    for( i = 0; i < 8; ++i )
    {
      if( wert & 0x01 )
        Datenleitung auf 1
      else
        Datenleitung auf 0

      Clockleitung auf 1
      Clockleitung auf 0

      wert = wert >> 1;
    }

von Peter D. (peda)


Lesenswert?

Reinhard Schopf schrieb:
> Ich habe eine Schieberegister 74hc165 und will aus einem Tiny2313 mit 2
> Pins
> (Clk und Data) das Register füllen.

Was weitgehend sinnfrei ist, da nur QH herausgeführt ist.
Der 74HC165 wird daher zum Einlesen von Eingängen verwendet.


Peter

von Reinhard S. (schopfi)


Lesenswert?

Wow Karl Heinz !
Danke dir ! Du solltest echt ein Buch schreiben !
So klar und verständlich hab ichs noch in keiner Lektüre gefunden.
Jetzt weiß ich bescheid.
Bist du Prof. auf ner Uni ? :-)

von Reinhard S. (schopfi)


Lesenswert?

Peter Dannegger schrieb:
> Reinhard Schopf schrieb:
>> Ich habe eine Schieberegister 74hc165 und will aus einem Tiny2313 mit 2
>> Pins
>> (Clk und Data) das Register füllen.
>
> Was weitgehend sinnfrei ist, da nur QH herausgeführt ist.
> Der 74HC165 wird daher zum Einlesen von Eingängen verwendet.
>
>
> Peter

@Peter - Sorry - ich meinte ein 74hc164 !! Ja Ja, in der Elektronik muss 
man da Vorsichtig sein mit den Zahlen :-)
Wenn man sich um 1 vertut sieht die Welt gleich ganz anders aus ! :-)

von Paul Baumann (Gast)


Lesenswert?

@Reinhard
Hast Du vielleicht noch 74164? Die sind besser zur Ausgabe geeignet.

Ja, das Erklärungsvermögen von Karl-Heinz habe ich auch schon oft 
bewundert.
Das würde ich auch gerne so können.

MfG Paul

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.