Forum: Mikrocontroller und Digitale Elektronik defines im array


von Bernd (Gast)


Lesenswert?

Hallo,
ich habe für verschiedene pins defines angelegt
1
#define column1_active  (PINB & (1<<PINB0))
2
#define column2_active  (PINB & (1<<PINB1))
3
#define column3_active  (PIND & (1<<PIND1))
4
#define column4_active  (PIND & (1<<PIND2))
5
#define column5_active  (PIND & (1<<PIND3))

dies möchte ich gerne in einem array packen, sodass ich diese später in 
einer for-schleife abfragen kann.
im prinzip:
1
unsigned int column[5] = {column1_active, column2_active, column3_active, column4_active, column5_active}
2
3
4
for(unsigned int i=0; i<=4; i++){
5
sig = column[i];
6
...
7
}

doch leider bekomme ich die error-meldung
initializer element is not constant
(near initialization for 'column[0]'

Diese meldung bekomme ich für alle. Das macht ja auch sinn, da die 
#defines keine integer geschweige denn überhaupt ein zahlentyp sind. Ist 
es dennoch irgendwie möglich, Alle spalten mit einer for-schleife 
abzufragen? ich wollte das so machen, damit der Code kürzer und 
übersichtlicher wird, vor allem da wahrscheinlich noch mehr hinzukommen.

von Karl M. (Gast)


Lesenswert?

Hallo,

ein #define ist ein Textersatz mehr nicht, dann frage Dich mal was da 
nun drin steht.

Und von Datentyp integer ist das Ergebnis auch nicht.

Für Dein Wissen kommt also nur eine Select Case Struktur in Frage.
Der Index selektiert dann deinen Portpin und dessen Auswertung etc.

von Falk B. (falk)


Lesenswert?

@ Bernd (Gast)

>#define column1_active  (PINB & (1<<PINB0))
>#define column2_active  (PINB & (1<<PINB1))
>#define column3_active  (PIND & (1<<PIND1))
>#define column4_active  (PIND & (1<<PIND2))
>#define column5_active  (PIND & (1<<PIND3))

>unsigned int column[5] = {column1_active, column2_active, column3_active, 
>column4_active, column5_active}

Geht nicht, denn PINB ist auch ein Macro, das auf eine konstante 
IO-Adresse verweist.

 >es dennoch irgendwie möglich, Alle spalten mit einer for-schleife
>abzufragen?

Mit einem switch()

von Frickelfritze (Gast)


Lesenswert?

Falk B. schrieb:
> Mit einem switch()

Eleganter wäre es mit einem Array von Funktionspointern.

von Falk B. (falk)


Lesenswert?

@ Frickelfritze (Gast)

>> Mit einem switch()

>Eleganter wäre es mit einem Array von Funktionspointern.

Naja, für Leute die es können. Die meisten Fragesteller hier im Forum 
sind mit einem switch() besser bedient.

von guest (Gast)


Lesenswert?

Frickelfritze schrieb:
> Eleganter wäre es mit einem Array von Funktionspointern.

Kommt drauf an, wenn man die Pins auch noch setzen will, braucht man im 
obigen Fall min. 10 einzelne Funktionen :(
Das ist dann alles andere als elegant.

Die Idee mit einem Array ist schon gar nicht soo verkehrt. Nur muß man 
dann halt struct (Registeraddresse+Bitmaske) da rein packen. Und sich am 
besten noch Makros/Funktionen zum Zugriff darauf schreiben.

Noch einfacher wär es gewesen, wenn der TO die Pins alle auf den selben 
Port gepackt hätte (falls möglich).

von Bernd (Gast)


Lesenswert?

guest schrieb:
> Noch einfacher wär es gewesen, wenn der TO die Pins alle auf den selben
> Port gepackt hätte (falls möglich).

Das hätte ich auch gemacht, ist aber aufgrund der belegung der anderen 
pins nicht möglich.

werde mir die vorschläge mal genauer angucken.

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.