Elegante Pinabstraktion

Gast #2577235
Lesenswert?

Hallo,

ich möchte meinen code etwas übersichtlicher und wartbarer machen.
Ich habe ein LCD Display an meinen XMega angeschlossen und möchte nun 
die einzelnen Leitungen benennen.

Beispiel: Für die LEDOff Leitung des LCDs welche die Beleuchtung steuert 
möchte ich
#define LCD_LED PA0

um anschließend im Code wie folgt die Beleuchtung steuern zu können

LCD_LED = 1;

Ist das überhaupt möglich?

Gruß Franz
Gast #2577326
Lesenswert?

nichtmal

#define LCD_cmd  PORTA
#define LCD_nRST 0

LCD_data |= (1 << LCD_nRST);

funktioniert obwohl man es über die suche oft so findet.

invalid operands to binary & (have 'PORT_t' and 'int')

Kann mir niemand helfen?

Gruß Franz
Gast #2577434
Lesenswert?

Franz schrieb:
> ... hast mich nicht richtig verstanden.
im ersten Teil hattest Du nichts anderes gefragt

> nicht nur für
> LCD_LED = 1
> sondern auch für
> if(LCD_LED == 1)

Codevision kann das. Macht den Code leider nicht besonders portierbar 
aber schön übersichtlich.

Rudi
Gast #2577532
Lesenswert?

Franz schrieb:
> nichtmal
>
> #define LCD_cmd  PORTA
> #define LCD_nRST 0
>
> LCD_data |= (1 << LCD_nRST);
>
> funktioniert obwohl man es über die suche oft so findet.
>
> invalid operands to binary & (have 'PORT_t' and 'int')
>
> Kann mir niemand helfen?
>
> Gruß Franz

Das versteh ich nicht ganz, LCD_data ist nirgendwo definiert.
1
#define LCD_DATA PORTA
2
#define LCD_NRST PA0
3

4
LCD_DATA |= (1 << LCD_NRST);

sollte aber funktionieren.
#2577533
Lesenswert?

Verwirrter Anfänger schrieb:
> #define LCD_DATA PORTA
> #define LCD_NRST PA0

es gäbe da auch noch:
1
#define LCD_NRST_SET() LCD_DATA|=LCD_NRST
2
#define LCD_NRST_CLR() LCD_DATA&=~LCD_NRST
3

4
//und schon heißt es im Code
5
LCD_NRST_CLR();
6
//und spaeter
7
LCD_NRST_SET();
Sollte auch jeder anständige C-Compiler mit klarkommen. Nicht sowas wie 
"sieht schön aus aber geht nur bei IAR"...
mfg mf
Gast #2577599
Lesenswert?

Mit noch mehr Präprozessor kann man es portabel eindampfen:
1
#ifndef IO_H
2
#define IO_H
3

4
#include <avr/io.h>
5

6
/* IO ports */
7
#define IO_STRAIGHT    0
8
#define IO_INVERT      1
9

10
#define BUZZER    B, B1, IO_STRAIGHT
11
#define RELAIS    B, B5, IO_STRAIGHT
12

13
#define __IO_SET(port, bit, invert, state)      \
14
  if ( (invert) ^ ((state) ? 1 : 0) ) {         \
15
    PORT##port |= _BV(PORT##bit);               \
16
  }                                             \
17
  else {                                        \
18
    PORT##port &= ~_BV(PORT##bit);              \
19
  }
20

21
#define __IO_GET(port, bit, invert)             \
22
  ( (PORT##port & _BV(PORT##bit)) ? (1 ^ (invert)) : (0 ^ (invert)) )
23

24

25
#define IO_SET(port, state)    __IO_SET(port, state)
26
#define IO_GET(port)           __IO_GET(port)
27

28
#endif

Verwendung:
1
IO_SET(BUZZER, 1);
2
IO_SET(RELAIS, 0);

Und bitte, keine weiteren Kommentare dazu :-}
#2577606
Lesenswert?

Sven P. schrieb:

> Mit noch mehr Präprozessor kann man es portabel eindampfen:

Inwiefern ist io.h eigentlich essentiell abhängig von GCC? Das 
Inline-Verbot ist für die Frage hier irrelevant und die structs müssten 
eigentlich auch ohne "packed" schon frei von Löchern sein. Der Rest ist 
normales C.

Dass Bitfields allgemein als schwach portabel gelten ist klar, aber ganz 
so schlimm ist es dann doch nicht, wenn man damit Portpins anspricht und 
damit die Architektur sowieso festnagelt.
#2577611
Lesenswert?

Franz schrieb:
> nichtmal
>
> #define LCD_cmd  PORTA
> #define LCD_nRST 0
>
> LCD_data |= (1 << LCD_nRST);
>
> funktioniert obwohl man es über die suche oft so findet.

Dann versuch's doch mal mit:
1
 LCD_cmd |= (1 << LCD_nRST);

> invalid operands to binary & (have 'PORT_t' and 'int')

Da in dem Code gar kein & vorkommt, muß da wohl ein falsches Makro 
irgendwas seltsames tun.
Gast #2578327
Lesenswert?

A. K. schrieb:
> Inwiefern ist io.h eigentlich essentiell abhängig von GCC? Das
> Inline-Verbot ist für die Frage hier irrelevant und die structs müssten
> eigentlich auch ohne "packed" schon frei von Löchern sein. Der Rest ist
> normales C.
Naja, das ist eigentlich der einzige Knackpunkt.

> Dass Bitfields allgemein als schwach portabel gelten ist klar, aber ganz
> so schlimm ist es dann doch nicht, wenn man damit Portpins anspricht und
> damit die Architektur sowieso festnagelt.
Darauf zielte ich nämlich weiter oben schon ab. Einen Abstraktionslayer 
zu abstrahieren, ist ziemlich sinnfrei. Irgendwo muss man ja an die 
Hardware anbauen.

Reine Lehre wäre dann wohl nur die vollständige Kapselung in Methoden, 
sodass man schlimmstenfalls noch mit etwas Programmlogik nachhelfen 
kann, wenn die Zuordnung der Ports nicht mehr direkt gegeben ist.

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