Forum: Mikrocontroller und Digitale Elektronik AVR EEPROM write Frunktion verstehen


von JoeFox (Gast)


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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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);

von JoeFox (Gast)


Lesenswert?

Verstehe ich das richtig, dass ein (0<<xxx) in xxx "0" hinein schreibt?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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

von Karl H. (kbuchegg)


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

von JoeFox (Gast)


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

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.