Defines und PORTS (so noch nicht gesehen)

Gast #2375002
Lesenswert?

Hi,

ich krame gerade in einer fleury Lib rum und frage mich wie das 
funktioniert:

#define LCD_PORT         PORTA        /**< port for the LCD lines   */
#define LCD_DATA0_PORT   LCD_PORT     /**< port for 4bit data bit 0 */
#define LCD_DATA1_PORT   LCD_PORT     /**< port for 4bit data bit 1 */
#define LCD_DATA2_PORT   LCD_PORT     /**< port for 4bit data bit 2 */
#define LCD_DATA3_PORT   LCD_PORT     /**< port for 4bit data bit 3 */
#define LCD_DATA0_PIN    0            /**< pin for 4bit data bit 0  */
#define LCD_DATA1_PIN    1            /**< pin for 4bit data bit 1  */
#define LCD_DATA2_PIN    2            /**< pin for 4bit data bit 2  */
#define LCD_DATA3_PIN    3            /**< pin for 4bit data bit 3  */






        DDR(LCD_DATA0_PORT) |= _BV(LCD_DATA0_PIN);
        DDR(LCD_DATA1_PORT) |= _BV(LCD_DATA1_PIN);
        DDR(LCD_DATA2_PORT) |= _BV(LCD_DATA2_PIN);
        DDR(LCD_DATA3_PORT) |= _BV(LCD_DATA3_PIN);


Konkret geht es mir um diesen Ausdruck:

DDR(LCD_DATA0_PORT)

Wird daraus nicht:

DDR(PORTA)?

und müsste es dann nicht DDRA heißen?

Man, ich sehe es gerade:

#define DDR(x) (*(&x - 1))      /* address of data direction register of 
port x */

So eine Sau, man defines lassen aber auch jede Sauerei zu...

Schön ist das nicht, warum macht man soetwas???

Maddin
Gast #2375042
Lesenswert?

Na da wollte sich wohl jemand Schreibarbeit ersparen... Um quasi 
indirekt über den Port out auf den dazugehörigen Port in mithilfe 
Adressenmanipulation zuzugreifen sieht... ungewöhnlich aus. Würde ich 
nicht machen. Der Assembler-Code bzgl. der Performance wäre 
interessant...
Gast #2375050
Lesenswert?

Hallo Jannis,

danke für deine Antwort, aber hier ging es mir um etwas Spezielles mit 
den Defines.

Das Makro DDR(x) zieht von der Adresse des PORTA (in diesem Fall - PORTA 
wird ja später durch die entsprechende Adresskonstante ersetzt) eine 
Konstante (-1) ab. Damit greift man über die Angabe PORTA mehr oder 
minder indirekt auf die Adresse des entsprechenden DDRs zu.

Ich habe das jetzt nochmal durchgesehen, das geht sogar soweit dass die 
unterscheidlichen Porzessortypen bei diesem Umgang mit den Defines 
nochmal berücksiochtigt werden müssen, denn allem Anschein nach liegt 
das DDR nicht bei jedem Typen eine Adresse vor dem PORT Register...

Mir erschließt sich absolut nicht warum man eine solche "Krücke" nutzt 
an der Stelle.

Ich als Nutzer der Lib suche nun das DDR und finde es nicht direkt...

Naja, ich jedenfalls mache immer defines für:

INPUT REG        PIN
OUTPUT REG       PORT
DIREKTION REG    DDR
PINNUMMER        X

für jeden Pin der in einer LIB genutzt wird. Das erzeugt bei einem 8 Bit 
Datenbus ggf. Overhead, aber so sieht man gleich was Sache ist.

M.
Gast #2375052
Lesenswert?

@ Coder,

auf die Performance dürfte das keinen Enfluss haben, denn es kommt ja am 
ende der selbe code raus, oder etwa nicht? Höchstens auf die Performance 
des "Code-Verstehers"... :-)

Die Defines PORTA usw... stehen doch nur stellvertretend für Adressen, 
das ganze Zeug wird doch eh vorher ausgerechnet und fließt nur als 
Konstante in den ASM ein, und ob ich die nun direkt hinschreibe oder 
umständlich vorher ausrechnen lasse...

M.
Gast #2375129
Lesenswert?

Zumindest wird da derefenziert, was man bei dem direkten und einfachen 
Registerzugriff nicht Quellcode mäßig nicht schreibt. Ob der Code 
identisch ist, hängt wohl von der Gnade des Compilers ab. War auch nur 
so ein Gedanke... was auch immer am Ende rauskommt.
#2375320
Lesenswert?

Maddin schrieb:

>
> Mir erschließt sich absolut nicht warum man eine solche "Krücke" nutzt
> an der Stelle.

Weil die Alternative zur 'Konfiguration' von

#define LCD_PORT         PORTA        /**< port for the LCD lines   */


so aussieht

#define LCD_PORT         PORTA        /**< port for the LCD lines   */
#define LCD_PIN          PINA
#define LCD_DDR          DDRA

Um den Port umzustellen musst du 3 #define ändern, was eine potentielle 
Fehlerquelle ergibt. Im Original gibt es diese Fehlerquelle nicht, wenn 
die entsprechenden DDR Makros erst einmal korrekt sind.

> Ich als Nutzer der Lib suche nun das DDR und finde es nicht direkt...

Du als Nutzer der 'Lib' stellst einfach beim LCD_PORT Makro deinen 
verwendeten Port ein und um alles andere kümmert sich der Compiler.

> Das erzeugt bei einem 8 Bit Datenbus ggf. Overhead

Das erzeugt überhaupt keinen Overhead. Makros sind einfach nur 
Textersetzungen, die gemacht werden, ehe der Compiler den Quelltext 
überhaupt zu Gesicht bekommt.

Peter hat sich einfach nur Komfortfunktionalität eingebaut.

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