AVR EEPROM write Frunktion verstehen

Gast #1907632
Lesenswert?

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
Moderator (Firma: Titel) Persönliche Seite #1907637
Lesenswert?

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);
#1907649
Lesenswert?

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
Gast #1907687
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren