www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AVR EEPROM write Frunktion verstehen


Autor: JoeFox (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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);

Autor: JoeFox (Gast)
Datum:

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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: JoeFox (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.