- SF800 Solar Speicher Tutorial         
Ergebnis 1 bis 10 von 10

Thema: Verständnisproblem #define

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Karlsruhe
    Alter
    37
    Beiträge
    1.225
    Auskommentiert ist der zweite Teil, weil PD5 gleich PB5 gilt (ist beides Mal die Zahl 5). Damit kann das gleiche Makro sowohl für die Richtung links als auch rechts verwendet werden.

    Was der Code macht ist relativ einfach: Er löscht erst beide Richtungsbits auf einer Seite und setzt dann die von dir übergebenen, im Falle von FWD also Pin 5 am jeweiligen Port.

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

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    12.04.2008
    Alter
    40
    Beiträge
    557
    Also wird unterschieden, ob PORTD oder PORTB beschrieben werden soll und dazu passend aus dem #define das PD5 bzw PB5 ausgewählt?
    Alles ist möglich. Unmögliches dauert nur etwas länger!

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Karlsruhe
    Alter
    37
    Beiträge
    1.225
    Zitat Zitat von Arkon Beitrag anzeigen
    Also wird unterschieden, ob PORTD oder PORTB beschrieben werden soll und dazu passend aus dem #define das PD5 bzw PB5 ausgewählt?
    Nein, sieh dir Mal den Code hier genauer an:

    Code:
    #define     FWD        (1 << PB5) /* (1 << PD5) */
    #define     RWD        (1 << PB4) /* (1 << PD4) */
    #define     BREAK      0x00
    #define     FREE       (1 << PB4) | (1 << PB5) /* (1 << PD4) | (1 << PD5)*/
    
    void MotorDir(unsigned char left_dir, unsigned char right_dir) {
    
    PORTD = (PORTD &~ ((1 << PD4) | (1 << PD5))) | left_dir;
    PORTB = (PORTB &~ ((1 << PB4) | (1 << PB5))) | right_dir;
    } MotorDir(FWD,FWD);
    PB5 wird irgendwo in den Untiefen der avr-libc als 5 definiert, ebenso PD5. Warum? Weil es eben das Bit 5 im entsprechenden Register ist. Der Trick besteht einfach darin, dass die Pinbelegung für Links/Rechts symmetrisch gemacht wurde, damit sind alle Konstanten übertragbar. Aus FWD wird also (1 << 5)

    MotorDir setzt jetzt auf beiden Seiten beide Richtungspins auf 0 und "verodert" da dann dein FWD rein. Die Funktion überschreibt also IMMER den Status beider Seiten, MotorDir(FWD, FWD) tut nichts anderes als in den Register PORTD und PORTB jeweils Bit 5 zu setzen. Der Konstanten ist es vollkommen egal, wo sie eingesetzt wird, niemand wählt da irgendwas aus ...

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

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    12.04.2008
    Alter
    40
    Beiträge
    557
    Ah jetzt ja.....

    Danke an euch. Hab den Code wie sternst gepostet hat geändert. So macht das auch wieder Sinn
    Alles ist möglich. Unmögliches dauert nur etwas länger!

Ähnliche Themen

  1. Baudraten - #define xxx und einige Auswirkungen
    Von oberallgeier im Forum Software, Algorithmen und KI
    Antworten: 14
    Letzter Beitrag: 15.11.2011, 09:04
  2. #define und adressen setzten in asm30 - dspic
    Von Pitt1986 im Forum PIC Controller
    Antworten: 2
    Letzter Beitrag: 10.06.2008, 20:13
  3. Mit #define zugewiesene Konstanten nicht zuweisbar?
    Von EDatabaseError im Forum C - Programmierung (GCC u.a.)
    Antworten: 4
    Letzter Beitrag: 21.05.2008, 17:09
  4. Verständnisproblem declare Sub
    Von meldano im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 1
    Letzter Beitrag: 15.06.2007, 05:56
  5. #define send, #define reveice
    Von pebisoft im Forum C - Programmierung (GCC u.a.)
    Antworten: 4
    Letzter Beitrag: 09.03.2005, 07:37

Berechtigungen

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

Solar Speicher und Akkus Tests