mikrocontroller.net

Forum: Compiler & IDEs Dynamische Portansteuerung


Autor: JeyBee66 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
PORTD |= (1<<PD0);
schreiben muss, sondern auch mehr sowas:
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:
#define LEDxy PORTD y (1<<PDx)

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


Mfg Jey

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
JeyBee66 schrieb:

>
> #define LEDxy PORTD y (1<<PDx)
> 
>
> 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
#define LED_PORT   PORTD
#define LED1       PD1
#define PED2       PD2
....


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

#define LIGHT_LED( led )        CLR_BIT( LED_PORT, led )
#define DARK_LED( led )         SET_BIT( LED_PORT, led )

#define LED1an           LIGTH_LED( LED1 )
#define LED2an           LIGTH_LED( LED2 )
#define LED3an           LIGTH_LED( LED3 )
#define LED4an           LIGTH_LED( LED4 )
#define LED5an           LIGTH_LED( LED5 )
#define LED6an           LIGTH_LED( LED6 )
#define LED7an           LIGTH_LED( LED7 )
#define LED8an           LIGTH_LED( LED8 )

#define LED1aus           DARK_LED( LED1 )
#define LED2aus           DARK_LED( LED2 )
#define LED3aus           DARK_LED( LED3 )
#define LED4aus           DARK_LED( LED4 )
#define LED5aus           DARK_LED( LED5 )
#define LED6aus           DARK_LED( LED6 )
#define LED7aus           DARK_LED( LED7 )
#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

  ...

  if( irgendwas ) {
    ...
    LIGHT_LED( ALARM_LED );
  }
  else
    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.

Autor: Michael Rathmair (dj_motionx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo !

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

L.g

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: JeyBee66 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

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

char LED1aus()
{
  PORTD &=~ (1<<PD0);
}


gibt es da keine einfachere Möglichkeit?


Mfg Jey

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)
void LEDan( volatile uint8_t& port, uint8_t pin )
{
  *port |= (1<<pin);
}

void LEDaus( volatile uint8_t& port, uint8_t pin )
{
  *port &= ~(1<<pin);
}

Autor: JeyBee66 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus (Gast)
Datum:

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

Autor: JeyBee66 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nun, ich verstehe sowieso nicht, wie ich das mit integer variablen lösen 
soll.
In der funktion steht ja für
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 
??

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: ... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und dazu dann am besten auch gleich noch:

http://www.avrfreaks.net/index.php?name=PNphpBB2&f...

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

Autor: JeyBee66 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Okay, Danke schonmal.

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


Gruss Jey

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.