-         

Ergebnis 1 bis 7 von 7

Thema: Frage zu #define-Direktive in asuro.h

  1. #1
    Neuer Benutzer Öfters hier Avatar von Swordfish6
    Registriert seit
    01.11.2012
    Ort
    Nürnberg
    Alter
    38
    Beiträge
    10

    Frage zu #define-Direktive in asuro.h

    Anzeige

    Hallo Forum,

    ich habe ein kleines Verständnisproblem mit dem Quellcode, bei welchem mir auch die Suchfunktion, Googeln etc. nicht weiterhelfen konnte. Wahrscheinlich ist es einfach, jedoch programmiere ich zu selten und bin deshalb recht ahnungslos

    asuro.c verwendet ja als Header-File asuro.h. Dort gibt es einen Block INTERNAL. Exemplarisch eine Codezeile

    #define SWITCHES (1 << PD3)

    Der Präprozessor befehl #define ist mir soweit klar, SWITCHES wird bei der Kompilierung durch die Zeichenfolge (1 << PD3) ersetzt. Nur erschließt sich mir die Bedeutung dieser Zeichenfolge nicht so wirklich. Hinter dem String PD3 steckt wohl die Hardware-Adresse von PD3 des ATMEGA, die in einer weiteren Header Datei genauer spezifiziert wird (?).
    Weiter: was ist denn "<<" für eine Anweisung? Ich habe da partout keine Idee (sehe ich mir andere Anweisungen an, z. B #define FRONT_LED (1 << PD6) kann ich VERMUTUNGEN anstellen, mehr nicht).

    Würde mich freuen wenn ihr mir ein paar Tipps geben könntet

    Danke und Gruß, Swordfish
    Geändert von Swordfish6 (01.11.2012 um 14:01 Uhr)

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Kandel
    Alter
    29
    Beiträge
    1.220
    Das ist eine Bitmaske. PD3 ist ein Makro das für die Position des Bits von Pin D3 im entsprechenden DDR/PIN/PORT-Register D steht. Dieser Wert sollte bei PD3 eigentlich immer 3 sein. Damit reduziert sich die Zeile zu (1 << 3), und "<<" ist nichts anderes als der Bitshift-Operator. Er schiebt also die binäre Repräsentation um drei Bits nach links, aus 0b0001 wird 0b1000. Das ist alles

    mfG
    Markus
    Tiny ASURO Library: Thread und sf.net Seite

  3. #3
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.782
    Blog-Einträge
    8
    Ergänzung:

    https://www.google.de/search?q=gcc-avr+bit+schieben

    (PD3 wird über io.h definiert.)

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  4. #4
    Neuer Benutzer Öfters hier Avatar von Swordfish6
    Registriert seit
    01.11.2012
    Ort
    Nürnberg
    Alter
    38
    Beiträge
    10
    Hallo!

    Okay danke euch genau die Stichwörter haben mir für eine vernünftige Suche gefehlt!

    Grüße

  5. #5
    Neuer Benutzer Öfters hier Avatar von Swordfish6
    Registriert seit
    01.11.2012
    Ort
    Nürnberg
    Alter
    38
    Beiträge
    10
    Also das mit dem Bitshift-Operator habe ich nun denke ich mal verstanden. Aus einem SWITCH_ON entsteht letztendlich ein

    PORTD = PORTD | (1<<PD3)

    Letztlich entsteht durch das bitweise ODER ein 8h für PORTD (vorher 0h), also High Pegel an Pin 5. Richtig?

    Nun noch eine Verständnisfrage Ich habe ein paar Probleme mit dem Begriff Makro im Zusammenhang mit der #define Direktive. Nach

    http://www2.informatik.uni-halle.de/.../c_define.html

    gibt es ja zwei Möglichkeiten für die Verwendung von #define (einmal als Makro und einmal als symbolische Konstante). Einfache Makro-Beispiele wie auf

    http://roseindia.net/c-tutorials/c-define-macro.shtml

    kann ich nachvollziehen.
    Ich kann allerdings den schon genannten Ausdruck #define SWITCHES (1 << PD3) nicht zuordnen. Wäre das ein Makro fehlt ja noch die "ersatzliste". Allerdings irritiert mich die Klammerung, so es denn kein Makro ist. Oder ist das ein "verschachteltes" Makro?
    Übrigens gibt es in meiner io.h den String PD3 nicht, ist wohl in einer der unzähligen weiteren Header-Dateien die dort aufgeführt sind verborgen.

    Bin wiederum für Tipps dankbar
    Geändert von Swordfish6 (03.11.2012 um 20:09 Uhr)

  6. #6
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.782
    Blog-Einträge
    8
    Hallo

    Zu #define SWITCHES (1 << PD3)

    Hier handelt es sich nur um eine Ersetzung. Die Klammern dienen der besseren Lesbarkeit und könnten hier auch weggelassen werden, denn << hat eine höhere Bindung als das |

    https://www.google.de/search?q=bindung+der+operatoren
    (Bindung entspricht in etwa dem bekannten "Punkt vor Strich")

    Klammern belegen keinen Speicherplatz im kompilierten Programm und erhöhen die Lesbarkeit des Codes beträchtlich.



    In io.h wird nach dem entsprechenden Kontroller verzweigt (-mmcu=xxx im Makefile/gcc-Kommandozeile):

    #elif defined (__AVR_ATmega8__) // anderenfalls, wenn es sich um einen Mega8 handelt....
    # include <avr/iom8.h> // ... dann binde die IO-Definitionen für den Mega8 ein

    und in iom8.h findet man dann (unter anderem):
    Code:
    /* PORTD */
    #define PD7	 7
    #define PD6	 6
    #define PD5	 5
    #define PD4	 4
    #define PD3	 3
    #define PD2	 2
    #define PD1	 1
    #define PD0	 0
    Gruß

    mic

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  7. #7
    Neuer Benutzer Öfters hier Avatar von Swordfish6
    Registriert seit
    01.11.2012
    Ort
    Nürnberg
    Alter
    38
    Beiträge
    10
    Hallo radbruch,

    Vielen Dank für die schnelle und ausführliche Antwort!

    Grüße

Ähnliche Themen

  1. AVR/gcc: Symbol od. Define mit Controllernamen
    Von Jaecko im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 14.05.2012, 00:32
  2. Verständnisproblem #define
    Von Arkon im Forum C - Programmierung (GCC u.a.)
    Antworten: 9
    Letzter Beitrag: 24.01.2012, 13:39
  3. Baudraten - #define xxx und einige Auswirkungen
    Von oberallgeier im Forum Software, Algorithmen und KI
    Antworten: 14
    Letzter Beitrag: 15.11.2011, 10:04
  4. kann man die $crystal direktive irgendwie auslesen
    Von kolisson im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 15.09.2009, 21:49
  5. #define send, #define reveice
    Von pebisoft im Forum C - Programmierung (GCC u.a.)
    Antworten: 4
    Letzter Beitrag: 09.03.2005, 08:37

Berechtigungen

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