Forum: Compiler & IDEs Dynamische Portansteuerung


von JeyBee66 (Gast)


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

von Karl H. (kbuchegg)


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.

von Michael R. (dj_motionx)


Lesenswert?

Hallo !

Was spricht gegen eine Funktion muss ja nicht unbedingt ein Makro sein.
Ansonsten ja löse das über mehrre Makros.

L.g

von Karl H. (kbuchegg)


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.

von JeyBee66 (Gast)


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

von Karl H. (kbuchegg)


Lesenswert?

JeyBee66 schrieb:

> gibt es da keine einfachere Möglichkeit?

Was ist da schwierig drann?

Aber wenn schon, dann 1 Funktion, die mit allem klarkommt :-)
1
void LEDan( volatile uint8_t& port, uint8_t pin )
2
{
3
  *port |= (1<<pin);
4
}
5
6
void LEDaus( volatile uint8_t& port, uint8_t pin )
7
{
8
  *port &= ~(1<<pin);
9
}

von JeyBee66 (Gast)


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

von Klaus (Gast)


Lesenswert?

Der kleine JeyBee66 möchte aus dem Kinderparadis abge..., ähm, möchte 
sich unbedingt ein C-Buch kaufen!

von JeyBee66 (Gast)


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 
??

von Klaus (Gast)


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!

von Karl H. (kbuchegg)


Lesenswert?

JeyBee66 schrieb:

> Aber was ist das &port als übergabeparameter? Was genau hat das & zu
> bewirken? Der Compiler gibt mir bei dem &port auch eine Fehlermeldung...

Tschuldigung.
Im anderen Fenster ist gerade C++ zu gange :-)

Muss natürlich

void LEDan( volatile uint8_t* port, uint8_t pin )

lauten

von Karl H. (kbuchegg)


Lesenswert?

JeyBee66 schrieb:

> 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

Das tut jetzt aber schon weh.

von Peter D. (peda)


Lesenswert?


von ... (Gast)


Lesenswert?

und dazu dann am besten auch gleich noch:

http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=37871&start=all

Und nicht zu vergessen:
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial
Insbesondere Kapitel 11.

von JeyBee66 (Gast)


Lesenswert?

Okay, Danke schonmal.

Demfall werde ich mir erst mal ein gutes C Buch kaufen.


Gruss Jey

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.