- Akku Tests und Balkonkraftwerk Speicher         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 14

Thema: Verständnisproblem Bitoperator mit µC-PIN

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    27.11.2016
    Beiträge
    15

    Verständnisproblem Bitoperator mit µC-PIN

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo Leute,

    ich habe hier eine Schreibweise mit dem Bitoperator "<<" die mir nicht einleuchtet.

    Der Bitoperator: "<<" macht ja nicht anderes als einen bestimmten Wert um einen Wert nach links zu schieben.

    Bsp: (1 << 5) hier wird einfach der Wert "1" um n-Stellen in diesem Fall: "5" nach links geschoben.

    Soweit ist mir alles klar.

    Nur diese Schreibweise verstehe ich nicht:

    DDRD |= (1<<PD5);

    Erklärung:

    Hier wird die "1" um "PD5" nach links geschoben.
    Danach wird der Wert der sich im "DDRD-Register" befindet mit dem Wert "(1<<PD5)" ODER-Verknüpft und wieder in das DDRD-Register gespeichert.
    Dies ist das "|=".

    Das ganze soll den PD5-Pin vom Port: "D" auf 1 setzen also auf Ausgang schalten.

    HÄ??

    „PD5“ ist ja im Hintergrund nichts anderes als ein Binär-Wert wie z.B.: 01101000 (nur fürs Verständnis).
    Dieser Wert wird dann mit irgendeinen Wert der im DDRD-Register steht ODER-Verknüpft und dann wieder in DDRD abgespeichert.

    Da kommt doch irgendein Wert heraus, wie soll das den PIN: PD5 auf 1 setzen??

    Wenn er schreiben würde: (PD5 == 1) dann ist dieser Pin als Ausgang definiert.

    Ich verstehe das nicht.

    MfG

  2. #2
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    36
    Beiträge
    5.059
    DDRD => Richtungsregister für Port D => In einer Headerdatei definiert
    PD5 => Ausgangspin 5 auf Port D => In einer Headerdatei definiert
    Das "<<" Zeichen bedeutet links schieben
    das "|=" ist eine Oder Verknüpfung und danach wieder zurückschreiben
    das "==" Zeichen ist ein Vergleichsoperator, nicht zu verwechseln mit "="

    PD5 ist ist als "5" definiert

    Die Zeile "DDRD |= (1<<PD5)" kann man auch so schreiben "DDRD = DDRD | (1<<PD5)"
    Du darfst aber nicht "DDRD = (1<<PD5)" schreiben.

    Bei "DDRD |= (1<<PD5)" wird DDRD eingelesen und nur PD5 geändert, wenn z.B. PD1 gesetzt ist, bleibt es gesetzt, da du den Oder Operator genutzt hast
    Bei "DDRD = (1<<PD5)" wird nur PD5 gesetzt, egal was vorher gesetzt wurde.

    "PD5 == 1" wird nur bei einer Prüfung verwendet, z.B. wenn du eine If-Schleife verwendest, also "if (PD5 == 1){ .... }"
    "PD5 = 1" bewirkt aber etwas anderes, in der Headerdatei wird PD5 als 5 definiert, wenn du in deinem Programm "PD5 = 1" schreibst wird 5 mit 1 ersetzt.

    Hoffe es war verständlich.

    MfG Hannes

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    27.11.2016
    Beiträge
    15
    Das heißt:

    Zuerst wird das DDRD-Register eingelesen.
    Da dieses Register 8 Pins beinhaltet und die anderen PIN's bereits gesetzt sein können verwende ich den ODER-Operator.
    Den bei ‚0 ODER 0‘ bleibt alles 0. Bei ‚1 ODER 0‘ bleibt es 1.
    Somit wird bei den alten PIN’s nichts verändert.
    Wenn ich den ODER-Operator anwende, dann bleibt alles bis auf den einen PIN PD5 gleich.
    Bei (1<<PD5) wird der PIN PD5 von 0 auf 1 gesetzt.
    Da es beim PD5-Pin eigentlich nur 0 & 1 gibt, kann mit dem "<<-Operator" eigentlich nur von 1 auf 0 oder von 0 auf 1 verschoben werden, oder?
    Wenn alles Oder-Verknüpft wurde, dann wird das ganze wieder in das DDRD-Register gespeichert.

    Stimmt das jetzt so, wie ich das erklärt habe?

  4. #4
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    36
    Beiträge
    5.059
    Grundsätzlich richtig, einen kleinen Fehler gibt es. Du kannst nur setzten (0 => 1) aber nicht rücksetzen (1 => 0).

    Wenn man etwas rücksetzen will muss man den mit & Verknüpfen und was man rücksetzen will invertieren. Also z.B. "DDRD &= ~(1<<PD5)".

    Zum Testen kann ich dir den Windowstaschenrechner empfehlen (umstellen auf "Programmierer").

    Als Tutorial kann ich dir das AVR-GCC-Tutorial auf mikrocontroller.net empfehlen (https://www.mikrocontroller.net/arti...R-GCC-Tutorial)

    MfG Hannes

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    27.11.2016
    Beiträge
    15
    In Binär sieht das dann so aus:

    PD5 ist ja "5".

    DDRD |= (1<<PD5)

    DDRD ist z.B. 10000011.

    (1<<PD5) ist 00000001 um 5 stellen nach links verschoben ergibt das: 00100000

    Hier wird diese Operation durchgeführt: "|="

    ODER-Verknüpfen:

    10000011
    00100000
    ---------
    10100011 -> Dieser Wert wird nun in das DDRD-Register gespeichert.


    Alter Wert von DDRD-Register = 10000011 (Hier ist der PIN: 0,1,7 als Ausgang definiert).
    Neuer Wert von DDRD-Register = 10100011 (Hier ist der PIN: 0,1,5,7 als Ausgang definiert).

    Hab ich das so richtig aufgeschrieben?


    MfG

  6. #6
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    36
    Beiträge
    5.059
    Ja das stimmt so.

    MfG Hannes

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    66
    Beiträge
    2.435
    Zitat Zitat von AVRprogger91 Beitrag anzeigen
    Hab ich das so richtig aufgeschrieben?
    Soweit ist alles richtig.

    Es gibt noch einen kleinen Haken an der Geschichte:
    Bei manchen µCs ist das DDR-Register nicht lesbar, bzw. liefert immer den Wert 0xFF beim Lesen. Dies ist vor allem bei µCs welche auf der Motorola-Architektur aufbauen verbreitet.

    Das steht aber im Datenblatt des µCs.

    z.B. https://www.renesas.com/en-eu/doc/pr...40fb0fdda5d9dc
    Seite 117: P1DDR kann nur geschrieben werden.


    MfG Peter(TOO)
    Manchmal frage ich mich, wieso meine Generation Geräte ohne Simulation entwickeln konnte?

  8. #8
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    und um die Verwirrung zu komplettieren:

    XMega Prozessoren haben zu den DIR registern auch noch ein DIRSET und DIRCLR
    die ersparen dir das verodern, du schreibst einfach in das SET oder CLR register das bit hinein dass du setzen oder löschen möchtest
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    27.11.2016
    Beiträge
    15
    Das heißt, das was ich im Beitrag: "#5" geschrieben habe kann ich nicht bei einem ATxMega anwenden sondern nur bei einem ATmega?

  10. #10
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    66
    Beiträge
    2.435
    Zitat Zitat von AVRprogger91 Beitrag anzeigen
    Das heißt, das was ich im Beitrag: "#5" geschrieben habe kann ich nicht bei einem ATxMega anwenden sondern nur bei einem ATmega?
    Doch, direkt auf dem DIR-Register funktioniert es so wie in #5 beschrieben.

    Zusätzlich ist aber die ODER-Verknüpfung auch als Hardware vorhanden.

    DIR |= (1<<P5);
    funktionier auch auf dem xMEGA.

    Zusätzlich geht aber auch:
    DIRSET = (1<<P5);

    Zudem kann man über DIRSET auch mehrere Bits gleichzeitig setzen:
    DIR |= ((1<<P5)|(1<<P4)|(1<<P3));
    oder
    DIRSET = ((1<<P5)|(1<<P4)|(1<<P3));

    besonders das Zurücksetzen wird noch etwas vereinfacht
    DIR &= ¨(1<<P5);
    oder
    DIRCLR = (1<<P5);

    MfG Peter(TOO)
    Geändert von Peter(TOO) (20.12.2016 um 13:42 Uhr) Grund: Zwei Klammern vergessen
    Manchmal frage ich mich, wieso meine Generation Geräte ohne Simulation entwickeln konnte?

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. [ERLEDIGT] SPI: Verständnisproblem
    Von schorsch_76 im Forum AVR Hardwarethemen
    Antworten: 0
    Letzter Beitrag: 17.09.2014, 18:18
  2. Verständnisproblem #define
    Von Arkon im Forum C - Programmierung (GCC u.a.)
    Antworten: 9
    Letzter Beitrag: 24.01.2012, 12:39
  3. Syntax Verständnisproblem
    Von Rone im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 6
    Letzter Beitrag: 24.06.2009, 22:56
  4. Ladungspumpe - Verständnisproblem
    Von snipor im Forum Elektronik
    Antworten: 32
    Letzter Beitrag: 19.04.2009, 21:33
  5. ADC - Umrechnung - Verständnisproblem
    Von DIYLAB im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 16.03.2005, 21:06

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen