www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik "PORTD" uebergeben


Autor: Poseidonius (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

wie zum Fuchs kann ich einer Funktion, Klasse oder sonstwas den Port
uebergeben ... sprich welchen Datentyp muss ich bei einer Konstruktion
wie

main{
LedOn(PORTD, 4);
}

void Led::LedOn(... Port, char Pin){
Port &=~ (1<<Pin);
}

angeben.

Danke Euch

Autor: Poseidonius (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, noch mal mit korregiertem Beipiel.
Ich moechte eigentlich nur die Information wo die Led angeschlossen ist
aus der Funktion heraushalten, um flexibler auf verschiedene Hardware
reagieren koennen.

main{
    LedOn(PORTD, 4);
}

LedOn(... Port, char Pin){
    Port &=~ (1<<Pin);
}

Falls man das ganz anders macht ... alle Ratschlaege sind willkommen
...

Autor: Ernst Bauer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
verstehe nicht ganz was du suchst?

Autor: BennyS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder über Defines (quasi sbi, cbi Ersatz), steht auch im Tutorial

#define LED_ON(PORT, BITNUM) ((PORT) |= (1<<(BITNUM)))
#define LED_OFF(PORT, BITNUM) ((PORT) &= ~(1<<(BITNUM)))
#define LED_TOGGLE(PORT, BITNUM) ((PORT) ^= (1<<(BITNUM)))

Autor: BennyS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ansonsten um deine Frage zu beantworten.
Als "volatile uint8_t *port" also als Pointer übergeben und dann mit
*port drauf Zugreifen, war doch richtig oder?

Autor: Poseidonius (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich koennte ja in der Funktion auch so schreiben

LedOn(){
    PORTD &=~ (1<<PIND4);
}

Dann ist das ganze ja ziemlich unflexibel, wenn ich eine weitere Led
anschliesse oder mit einem neuen Prozessor arbeite. Wenn ich, was
eigentlich mein Ziel ist, objektorientiert draufschaue, moechte ich
eben eine Klasse haben, die unabhaengig von der Hardware ist und quasi
mit der Instanzierung konfiguriert wird.

Ok ich hoffe das war jetzt besser

Autor: Poseidonius (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da war ich jetzt mit meiner weiteren Erklaerung ein wenig spaet dran ...

Autor: inoffizieller WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vor einiger Zeit gab es mal ein ähnliches Problem: Da wollte jemand mit
einer struct den Port behandeln (PIN,PORT, DDR). Es schon etwas viel
länger her...

Autor: Poseidonius (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, jetzt tuts ...

main{
    Led(&PORTB,PORTB4);
}

Led(volatile uint8_t * Port, char Bit)
{
     *Port &=~ (1<<Bit);
}

Autor: BennyS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Trotzdem würde ich für LEDs an/aus líeber defines nehmen.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
http://www.mikrocontroller.net/forum/read-2-418759...

Einfacher und übersichtlicher und effizienter gehts nicht.


Peter

Autor: Thomas O. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bestimmt gibt auch nen Ersatz für sbr oder cbr damit kann man gleich
mehrere Bits in einem Register sezten oder löschen. Wenn man mal mehr
LEDs gleichzeitig an oder auschalten will.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Led(volatile uint8_t * Port, char Bit)
> {
>      *Port &=~ (1<<Bit);
> }

Solange 'Bit' eine Compilezeit-Konstante ist, die Funktion inline
expandiert werden kann (also im Header implementiert ist) und die
entsprechenden Optimierungen an sind, ist das ok. Wenn nicht, wird's
allerdings recht ineffizient, da die ALU des AVRs Bits immer nur um
eine Stelle verschieben kann. Deshalb muß hier eine Schleife eingefügt
werden, die 'Bit' mal schiebt.

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.