Forum: Mikrocontroller und Digitale Elektronik Port/Pin-deklaration


von Johannes (menschenskind)


Lesenswert?

Hallo

Im GCC-Tutorial ist die Deklaration ja so gelöst:
1
    DDRB = (1 << DDB0) | (1 << DDB1) | (1 << DDB2) | (1 << DDB3) | (1 << DDB4);

Nun meine Frage, ob man es auch in etwa so schreiben könnte:
1
  DDRB.1=0;
2
  DDRB.2=1;
3
    .
4
    .
5
  DDRB.7=0;
Einfach nur der Übersicht halber, damit ich das für mich schön 
auskommentieren kann, was an welchem Pin hängt.

Danke Euch!

von Johannes M. (johnny-m)


Lesenswert?

Johannes Hofmann wrote:
>
1
>   DDRB.1=0;
2
>   DDRB.2=1;
3
>     .
4
>     .
5
>   DDRB.7=0;
6
>
Das ist nicht standardkonform und wird vom GCC so nicht unterstützt. Man 
kann sich das über ein Bitfeld zwar selber "bauen", aber die im Tutorial 
benutzte Methode ist die ANSI-C-konforme und sollte auch benutzt werden.

Siehe auch Bitmanipulation

von Karl H. (kbuchegg)


Lesenswert?

Johannes Hofmann wrote:
> Hallo
>
> Im GCC-Tutorial ist die Deklaration ja so gelöst:
>
>
1
    DDRB = (1 << DDB0) | (1 << DDB1) | (1 << DDB2) | (1 << DDB3) |
2
> (1 << DDB4);
>
> Nun meine Frage, ob man es auch in etwa so schreiben könnte:
>
>
1
>   DDRB.1=0;
2
>   DDRB.2=1;
3
>     .
4
>     .
5
>   DDRB.7=0;
6
>

könnte man, wenn dein Compiler (IAR?) die .-Snytax für Ports 
unterstützt. Der gcc machts nicht.

Aber selbst dann: Was hindert dich, das so zu formatieren:
1
      DDRB = (1 << DDB0) |      // Led an Pin 0
2
             (1 << DDB1) |      // noch ne Led an Pin 1
3
             (1 << DDB2) |
4
             (1 << DDB3) |
5
             (1 << DDB4);

> Einfach nur der Übersicht halber, damit ich das für mich schön
> auskommentieren kann, was an welchem Pin hängt.

Wenn du das kommentieren willst, dann gib den Pins zb per #define schöne 
Namen
1
#define PERIPHERY_DDR        DDRB
2
#define PERIPHRY_PORT        PORTB
3
#define ALARM_LED_PIN        PB0
4
#define READY_LED_PIN        PB1
5
#define BUZZER_PIN           PB2
6
7
8
int main()
9
{
10
  PERIPHERY_DDR =   ( 1 << ALARM_LED_PIN )
11
                  | ( 1 << READY_LED_PIN )
12
                  | ( 1 << BUZZER_PIN );
13
14
  PERIPHERY_PORT = ( 1 << READY_LED_PIN );
15
16
  ...
17
18
}


Das Ziel ist es immer, den Code so zu gestalten, dass du nach 
Möglichkeit keinen zusätzlichen Kommentar brauchst. Dann kann auch der 
Kommentar nie falsch sein und bei Änderungen nicht mehr zum Code passen.

Ganz abgesehen davon, dass du bei Hardwareänderungen (der Buzzer wandert 
vom Pin PB2 zum Pin PB5) nur mehr an einer Stelle ändern musst und der 
Rest des Programms passt sich bei einem Neukompilieren ganz von alleine 
an.

von Johannes (menschenskind)


Lesenswert?

Cool!
Danke für die Tipps.

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.