void EEPROM_write(unsigned int ucAddress, unsigned char ucData) { /* Wait for completion of previous write */ while(EECR & (1<<EEPE)); /* Set Programming mode */ EECR = (0<<EEPM1)|(0<<EEPM0); /* Set up address and data registers */ EEAR = ucAddress; EEDR = ucData; /* Write logical one to EEMPE */ EECR |= (1<<EEMPE); /* Start eeprom write by setting EEPE */ EECR |= (1<<EEPE); } Das hier ist der Code aus der ATTiny24 Dokumentation von www.atmel.com. Der Code oben stammt von Seite 18 des genannten Dokuments. Meine Frage nun, wozu immer diese Bitshifts wie hier "EECR = (0<<EEPM1)|(0<<EEPM0);"? Würde das nicht das selbe sein wie "EECR = EEPM1 | EEPM0;" ? Oder gibt es da einen Unterschied? Die zweite Frage ist hier steht ja: /* Write logical one to EEMPE */ EECR |= (1<<EEMPE); Aber ist das nicht ein Bitshift des Inhalts von EEMPE um eine Stelle (ein Bit? oder ist es ein Byte?) nach links. Und anschließend ein bitweise OR mit EECR? Im Kommentar steht "Write logical one to EEMPE", aber das tut die Zeile doch gar nicht? Die shiftet doch EEMPE um eins nach links und odert das ganze dann mit EECR? confused Ich komme vom normalen Computer C. Also ich bin eigentlich ganz gut in C normalerweise, aber ich verstehe den Grund für das Bitshift nicht. Wäre für eine Antwort echt dankbar. Grüße, Joe
JoeFox schrieb: > Meine Frage nun, wozu immer diese Bitshifts wie hier > "EECR = (0<<EEPM1)|(0<<EEPM0);" Das wäre das selbe wie EECR = 0; > Würde das nicht das selbe sein wie "EECR = EEPM1 | EEPM0;" ? Oder gibt > es da einen Unterschied? Das wäre das selbe wie EECR = 1; Dieser Quellcode ist vermutlich einfach nur dafür vorbereitet, dass einer mal einen anderen Mode einstellen will: EECR = (0<<EEPM1)|(1<<EEPM0); oder EECR = (1<<EEPM1)|(0<<EEPM0); oder EECR = (1<<EEPM1)|(1<<EEPM0);
Verstehe ich das richtig, dass ein (0<<xxx) in xxx "0" hinein schreibt?
Lothar Miller schrieb: Korrektur: > Würde das nicht das selbe sein wie "EECR = EEPM1 | EEPM0;" ? Oder gibt > es da einen Unterschied? Mit #define EEPM1 5 #define EEPM0 4 wäre das das selbe wie EECR = 5; > Verstehe ich das richtig, dass ein (0<<xxx) in xxx "0" hinein schreibt? Ja. Siehe Bitmanipulation
JoeFox schrieb: > Verstehe ich das richtig, dass ein (0<<xxx) in xxx "0" hinein schreibt? Nein, das verstehst du falsch a << b bedeutet: die Binärdarstellung von a um b Bits nach links verschieben 1 << 4 ist also die Binärdarstellung von 1 00000001 und das 4 mal nach links geschoben 00000010 1 mal 00000100 2 mal 00001000 3 mal 00010000 4 mal Im Endeffekt hat man damit einen Wert erzeugt, bei dem genau das Bit mit der Nummer 4 auf 1 gesetzt ist. Im Falle einer 0 (a==0) ist das natürlich sinnlos. Eine 0 kann man nach links verschieben so oft man will, das Ergebnis bleibt immer 0. Es kann allerdings zu Dokumentationszwecken manchmal Sinn machen, das trotzdem drinn zu haben um anzuzeigen: Ich weiß, dass es dieses Bit auch gibt aber ich lasse es absichtlich auf 0
Ok, danke für die Antworten. Habe mir die Doku im wiki durchgelesen. Also ist Bit-Shift doch Bit-Shift. Hatte nur nicht verstanden, dass die Position des Bits im Port oder im Byte eben so tricky genutzt wird. Aber echt nice. Danke
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.