Forum: Mikrocontroller und Digitale Elektronik Arduino Shiftregister 8bit


von Mario (Gast)


Lesenswert?

hallo,

Ist es möglich ein shiftregister statt mit 0 - 255.
Auch mit Binärcode   Sprich 11001100 anzusteuern.

von Mario (Gast)


Lesenswert?

ich meine Natürlich ob das in arduino geht.

von troll (Gast)


Lesenswert?

Binär oder Dezimal sind nur zwei verschiedene Darstellungen für die 
selbe Zahl...

von Mario (Gast)


Lesenswert?

ok wie müsste die zeile aussehen wenn ich statt einer zahl 0 - 255.
00110011 einfügen will.


shiftOut(dataPin, clockPin, LSBFIRST, j);

im moment ist j die Variable mit dem wert 0-255

von Eumel (Gast)


Lesenswert?

Dann setzt du j einfach auf den entsprechenden Wert. Problem?

von Karl H. (kbuchegg)


Lesenswert?

Mario schrieb:
> ok wie müsste die zeile aussehen wenn ich statt einer zahl 0 - 255.
> 00110011 einfügen will.
>
>
> shiftOut(dataPin, clockPin, LSBFIRST, j);
>
> im moment ist j die Variable mit dem wert 0-255

Macht keinen Unterschied.
Ob du

   j = 51;

oder

   j = 0xb00110011;

oder

   j = 0x33;

oder

   j = 'Q';

oder

   j = 50 + 1;

oder

   ...

schreibst, kommt alles aufs selbe raus.
In j (ich nehme mal an, das wäre eine 8 Bit Variable) werden die 8 Bits 
auf das Muster

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

gesetzt. Die verschiedenen Schreibweisen für Zahlen sind genau das: 
verschiedene Schreibweisen. Aber sie stehen alle für ein und dasselbe 
Bitmuster. Nämlich das Bitmuster, welches als Dezimalzahl interpretiert 
51 ergibt.

Die Schreibweisen haben ihre Berechtigung. Je nachdem was man macht, je 
nachdem was man tut, kann die eine Schreibweise besser ausdrücken, was 
eigentlich die Absicht an einer bestimmten Codestelle ist.

von Mario (Gast)


Lesenswert?

Ja massive probleme leider.
hab das eben mal versucht und das hat geklappt.
wenn ich jetzt anstatt einem festen code einen zustand von einem 
digitalen eingang setzten will. sprich das anfangs byte vom 
schieberegister ist
00000000 und ich will jetzt die variable y in das vorhandene byte 
einfliesen lassen von links nach rechts dann müsste eine zeile doch wie 
folgt aussehen.

shiftOut(dataPin, clockPin, LSBFIRST, 00000000 << y);

von troll (Gast)


Lesenswert?

Mario schrieb:
> 00000000 << y
Da kommt exakt 0 raus. Sag mal was du vorhast.

von Mario (Gast)


Lesenswert?

Ohje ganz schwer zu erklären.

ich möchte einen Digitalen eingang auslesen. Ergebniss 0 - 1.

diese dann von links nach rechts in einen binärcode einfliesen lassen.
das heist immer das aktuelle bit wird links reingeschoben und das letzte 
rechte bit entfällt.
Und der aktuelle binärcode soll dann das shiftregister ansteuern.

Sprich wenn der eingang 1 ist sieht der BIN nach 8 durchgängen so aus
11111111 und das ist dann gleichzeitig auch der zustand meines 
Schieberegisters.

Hilfe

von Karl H. (kbuchegg)


Lesenswert?

Mario schrieb:
> Ohje ganz schwer zu erklären.
>
> ich möchte einen Digitalen eingang auslesen. Ergebniss 0 - 1.
>
> diese dann von links nach rechts in einen binärcode einfliesen lassen.
> das heist immer das aktuelle bit wird links reingeschoben und das letzte
> rechte bit entfällt.
> Und der aktuelle binärcode soll dann das shiftregister ansteuern.

Stell diese Aufgabe noch zurück. Ohne saubere Tastenentprellung wird das 
nichts und sowas ist erstaunlich schwer zu realisieren.

von Mario (Gast)


Lesenswert?

Ok waron liegt das problem genau den da ich einen Digitalen eingang habe 
kann das ergebniss eh nur 0 oder 1 sein. in meiner Schaltung habe Pullup
Widerstände die den eingang gegen masse ziehen.

von Karl H. (kbuchegg)


Lesenswert?

Mario schrieb:
> Ok waron liegt das problem genau den da ich einen Digitalen eingang habe
> kann das ergebniss eh nur 0 oder 1 sein.

Schon.
Aber dein Programm fragt den Eingang ungefähr 10-tausend mal in der 
Sekunde ab. Und ich glaube nicht, dass du den Taster schnell genug 
drücken und wieder loslassen kannst, dass dein Programm da nur ein 
einziges mal eine 1 sieht.

von Mario (Gast)


Lesenswert?

Wie funktioniert das eigentlich wenn ich zum Beispiel.

x deklariere mit 0b00001000;

 x = 0b00001000;

und ich will in das byte von links nach rechts daten einfliesen lassen.

über die Variable y

von troll (Gast)


Lesenswert?

x|=y;
x<<=1;

von Mario (Gast)


Lesenswert?

OK das habe ich nicht bedacht.

und wenn ich über die pause delay(100);
dann sollte es doch klappen das alle 100ms ein bit reinkommt.
oder sehe ich das schon wieder falsch.

von Mario (Gast)


Lesenswert?

Hallo Troll,
Habe das eben probiert allerdings verändert das nur das letzte bit.
Ich bräuchte das aber so das es sich bei jeden eingang um eine bit 
verschiebt.
Sprich:


kommt                       entfällt


  1          00110011           1
  0          10011001           1
  0          01001100           0
  1          10100110           0

von troll (Gast)


Lesenswert?

Mario schrieb:
> Ich bräuchte das aber so das es sich bei jeden eingang um eine bit
> verschiebt.
???

> Sprich:
> kommt                       entfällt
>
>
>   1          00110011           1
>   0          10011001           1
>   0          01001100           0
>   1          10100110           0

OK, du willst offensichtlich von Links Daten in deine Variable 
reinschieben.

x enthält (1<<7) bzw. (0<<7)

y|=x;
y>>=1;

Oder wenn x irgendwas enthält und nur das schwächste Bit beachtet werden 
soll.

y|=(x<<7);
y>>=1;

Guck dir mal Bitmanipulation an.

von Mario (Gast)


Lesenswert?

Vielen danke werde ich morgen gleich mal machen
Wünsche noch einen schönen Abend.

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.