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
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; }
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
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 ? :-)
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 ! :-)
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.