Dynamische Portansteuerung

Gast #1672262
Lesenswert?

Guten Tag,

Ich habe Hier eine Reihe LEDs (zur Zeit sind es nur acht, alle am 
gleichen Port). DIese LEDs möchte ich nun "Dynamisch" ansteuern können.
Was ich damit meine ist, dass ich nicht jedes mal
1
PORTD |= (1<<PD0);
schreiben muss, sondern auch mehr sowas:
1
LED1an
machen kann.

Hierzu kann man ja über #define das ganze lösen. Jedoch habe ich dass 
Problemm, dass ich ja sowohl nachher LEDxy habe, all dann auch hinten 
PORTD |= (1<<PDx) machen muss, und so noch immer nicht über y definiert 
habe, ob die LED an und aus ist.
ALso müsste das ganze so sein:
1
#define LEDxy PORTD y (1<<PDx)

Jedoch funktioniert das nicht so ganz...
Wie muss ich da genau vorgehen?


Mfg Jey
#1672274
Lesenswert?

JeyBee66 schrieb:

>
1
> #define LEDxy PORTD y (1<<PDx)
2
>
>
> Jedoch funktioniert das nicht so ganz...
> Wie muss ich da genau vorgehen?

Mit einem Rundumschlagmakro geht das auch nicht.
Du wirst mehrere Makros benötigen

Fang damit an, dir Basismakros zu definieren
1
#define LED_PORT   PORTD
2
#define LED1       PD1
3
#define PED2       PD2
4
....
5

6

7
#define SET_BIT( port, pin )      port |= ( 1 << pin )
8
#define CLR_BIT( port, pin )      port &= ~( 1 << pin )
9

10
#define LIGHT_LED( led )        CLR_BIT( LED_PORT, led )
11
#define DARK_LED( led )         SET_BIT( LED_PORT, led )
12

13
#define LED1an           LIGTH_LED( LED1 )
14
#define LED2an           LIGTH_LED( LED2 )
15
#define LED3an           LIGTH_LED( LED3 )
16
#define LED4an           LIGTH_LED( LED4 )
17
#define LED5an           LIGTH_LED( LED5 )
18
#define LED6an           LIGTH_LED( LED6 )
19
#define LED7an           LIGTH_LED( LED7 )
20
#define LED8an           LIGTH_LED( LED8 )
21

22
#define LED1aus           DARK_LED( LED1 )
23
#define LED2aus           DARK_LED( LED2 )
24
#define LED3aus           DARK_LED( LED3 )
25
#define LED4aus           DARK_LED( LED4 )
26
#define LED5aus           DARK_LED( LED5 )
27
#define LED6aus           DARK_LED( LED6 )
28
#define LED7aus           DARK_LED( LED7 )
29
#define LED8aus           DARK_LED( LED8 )

Allerdings sind die letzten 16 #define nicht unbedingt ideal. Ihr 
Konfortgewinn ist nur Minimal. Sobald man die Makros LIGHT_LED bzw. 
DARK_LED hat, würde ich aufhören, da Dinge in Makros zu verstecken. 
Zumal der Dokumentationswert von
1
  ...
2

3
  if( irgendwas ) {
4
    ...
5
    LIGHT_LED( ALARM_LED );
6
  }
7
  else
8
    DARK_LED( ALARM_LED );

hoch genug ist, dass ich es dabei belassen würde. Das ist gut zu lesen 
und auch beim Drüberlesen leicht zu verstehen, was da passiert.

Ob du das dann LIGHT_LED oder LED_ON (DARK_LED/LED_OFF) nennst, spielt 
dann eher die untergeordnete Rolle.
#1672310
Lesenswert?

Seh ich auch so.
Ob Makro oder Funktion ist in dem Fall Jacke wie Hose. Mit Makros machst 
du es dem Compiler das Optimiererleben etwas einfacher, dafür handelt 
man sich potentielle Makroprobleme ein.

Viel wichtiger ist es, dass du deinen LED einen sprechenden Namen 
verpasst, der ihrer Funktion gerecht wird. Also nicht LED1, sondern 
ALARM_LED oder RELAIS_ON_LED oder TEMPERATURE_TOO_HIGH_LED oder 
POWER_ON_LED oder dergleichen.
Gast #1672312
Lesenswert?

Hi,

Also eine Funktion dazu würde dann etwa so aussehen?
1
char LED1an()
2
{
3
  PORTD |= (1<<PD0);
4
}
5

6
char LED1aus()
7
{
8
  PORTD &=~ (1<<PD0);
9
}


gibt es da keine einfachere Möglichkeit?


Mfg Jey
Gast #1672595
Lesenswert?

Hi,

Okay, die Funktionen sehen schonmal besser aus ^^
Aber was ist das &port als übergabeparameter? Was genau hat das & zu 
bewirken? Der Compiler gibt mir bei dem &port auch eine Fehlermeldung...

Danke

Greez Jey
Gast #1672630
Lesenswert?

Nun, ich verstehe sowieso nicht, wie ich das mit integer variablen lösen 
soll.
In der funktion steht ja für
1
PORTD |= (1<<pin);
Also muss ja die variable "pin" nur eine Zahl sein, wie oben mit uint8_t 
pin deklariert. Jedcoh muss ich ja eigentlich einen String nehmen: PD5 
??
Gast #1672644
Lesenswert?

Dein letztes Posting zeit mir, dass ich noch deutlicher werden muss:  DU 
brauchst ein vernünftiges Grundlagenwissen, sind wird das nix!!! Kauf 
die ein C-Buch oder ergoogle dir ein schönes Tutorial. Und dann fang am 
Anfang an, und nicht mitten drin!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren