Forum: Compiler & IDEs Defines für Port / Pins


von x5 (Gast)


Lesenswert?

Guten Morgen zusammen,

ich bin momentan meinen Code am durchwühlen - und da ist mir eine Stelle 
im Code aufgefallen der einfach nicht schön aussieht.

Kurz zum Aufbau ich habe einen Pin am Controller der einen Status 
einliesst, ist der Pin HIGH ist alles OK wenn er LOW ist liegt eine 
störung vor. Da zu gibt es eine DUO LED (grün/rot) an einem Ausgang für 
alles OK/Störung


in meinem Code sieht es dann so aus:
1
if(PIN_IN & (1<<Status_Temperatur))   {PORT_LED   |=   (1<<LED_Status);}
2
        else    {PORT_LED  &=  ~(1<<LED_Status);}


und die Header
1
#define Status_Temperatur      PF0    //
2
#define LED_Status      PE0    //LED /

so kann ich es nun elegant lösen das das PIN_IN und PORT_LED aus dem 
Code rausfliegt?

zb Beispiel das es einfach heisst
if(Status_Temperatur) LED_Status=1;
else LED_Status=0;

schematisch geschrieben.

wisst ihr was ich meine ? ansonsten muss ich es vieleicht noch anders 
erklären

gruß
x5

von Peter D. (peda)


Lesenswert?


von Oliver (Gast)


Lesenswert?

x5 schrieb:
> so kann ich es nun elegant lösen das das PIN_IN und PORT_LED aus dem
> Code rausfliegt?

Man kann Peters Lösung verwenden, oder einfach akzeptieren, daß 
Bitbehandlung in Standard-C diese Befehle braucht. Nach einer Weile sind 
die dann gar nicht mehr unelegant.

Oliver

von Peter D. (peda)


Lesenswert?

Oliver schrieb:
> Nach einer Weile sind
> die dann gar nicht mehr unelegant.

An dieser AND/OR-erei hatte mich vor allem gestört, daß ich für jeden 
Pin 2 Symbole definieren und mitschleppen muß (Byteadresse, Bitnummer).

Die Idee zu dem SBIT-Macro hat mal jemand hier im Forum gepostet, ist 
also nicht von mir.


Peter

von Tom K. (ez81)


Lesenswert?

x5 schrieb:

> so kann ich es nun elegant lösen das das PIN_IN und PORT_LED aus dem
> Code rausfliegt?
>
> zb Beispiel das es einfach heisst
> if(Status_Temperatur) LED_Status=1;
> else LED_Status=0;
>

In C gibt es für soetwas ein höchst lesbares, flexibles und sehr gut 
wartbares Feature, nämlich Funktionen:
1
bool Status_Temperatur(void)
2
{
3
    return ! (PIN_IN & (1<<STATUS_TEMPERATUR));
4
}
5
6
void LED_Status(uint8_t on)
7
{
8
    if (on)
9
        PORT_LED  |=  (1<<LED_STATUS);
10
    else
11
        PORT_LED  &=  ~(1<<LED_STATUS);
12
}
13
14
if(Status_Temperatur())
15
    LED_Status(1);
16
else
17
    LED_Status(0);

Nachtrag: Abstrakte Business-Logik und Implementierungsdetails (wie 
Bitschubsen) gehören IMO nicht zusammen in eine Zeile.

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.