Forum: Mikrocontroller und Digitale Elektronik #define "variabel" benutzen?


von Jürgen (Gast)


Lesenswert?

Nabend, ich bräuchte mal eine Idee.

Ich verwende folgende defines, die für einen Sensor an PortB gelten:

#define Bus_Port PORTB
#define Bus_DDR  DDRB
#define Bus_Pin  PINB
#define Pin_Nr   PB2

Jetzt habe ich an PortD einen zweiten Sensor und möchte gerne, sobald 
ein Taster gedrückt wird, diese defines wie folgt ändern:

#define Bus_Port PORTD
#define Bus_DDR  DDRD
#define Bus_Pin  PIND
#define Pin_Nr   PD4

Durch den Tastendruck, wird eine globale Variable entweder auf 0 oder 1 
gesetzt, was ich mir gerne zu Nutzen machen würde

Wie schaffe ich es, durch den Wert der Variablen entsprechend die 
defines zu ändern?

Gruß
Jürgen

von Marc S. (marc_s86)


Lesenswert?

define ist präprozessor, die sieht schon der compiler nicht mehr, 
geschweigedenn der µC

von Jemand (Gast)


Lesenswert?

Geht nicht. Defines werden noch vor dem Kompilieren vom Präprozessor 
ausgewertet.

von Stefan S. (sschultewolter)


Lesenswert?

Ganz falscher Ansatz!!

Defines sind konstanten, die beim Kompilieren vom Präprozessor im Code 
als Textersetzung funktionieren.

von Besucher (Gast)


Lesenswert?

Du könntest aus den Defines Makros machen, die eine Fallunterscheidung 
vornehmen.

von B. S. (bestucki)


Lesenswert?

Warum nicht sowas?
1
typedef struct{
2
  volatile uint8_t * Port;
3
  /* usw. */
4
}sensor;
5
6
type sensor_Read(sensor * Sensor){
7
  /* tu was */
8
}
9
10
bool KeyPressed;
11
12
int main(){
13
  sensor SensorA = {&PORTB, /* usw. */};
14
  sensor SensorB = {&PORTD, /* usw. */};
15
  
16
  type Value = read_Sensor(KeyPressed ? &SensorB : &SensorA);
17
}

von Karl M. (Gast)


Lesenswert?

Hi

das ist witzig:

Jürgen schrieb:
> Jetzt habe ich an PortD einen zweiten Sensor und möchte gerne, sobald
> ein Taster gedrückt wird, diese defines wie folgt ändern:

Besucher schrieb:
> Du könntest aus den Defines Makros machen, die eine Fallunterscheidung
> vornehmen.

Ja beim fertigen Programm im Atmel AVR µC noch etwas ändern. Oder wie ?

von (prx) A. K. (prx)


Lesenswert?

Jürgen schrieb:
> Wie schaffe ich es, durch den Wert der Variablen entsprechend die
> defines zu ändern?

Die Präproz-Definitionen sind nicht änderbar. Ports dynamisch verwenden 
geht aber schon, ungefähr so:
1
volatile uint8_t *bus_port;
2
uint8_t           bus_mask;
3
4
bus_port = &PORTD;
5
bus_mask = 1<<2;
6
... *bus_port |= bus_mask; ... 
7
8
bus_port = &PORTB;
9
bus_mask = 1<<4;
10
... *bus_port &= ~bus_mask; ...
Ist aber etwas umständlich. if/else könnte eleganter sein.

von Andreas (Gast)


Lesenswert?

Das schaffst du garnicht.

Die defines werden bereits während des Compilierens ausgewertet bzw. 
eingesetzt. Da ist noch keine Rede von deinem Button. Du must entweder 
deine Parameter in Variablen speichern und die Variablen verwendet wenn 
das geht oder du must überall mit einer if-Abfrage die beiden Fälle 
unterscheiden. in diesem Fall eben einmal
#define Bus_Port_1 PORTB ...
und
#define Bus_Port_2 PORTD ...

dann im Code

if (button) {
  Bus_Port_1 |= (1 << Pin_Nr_1);
}
else {
  Bus_Port_2 |= (1 << Pin_Nr_2);
}


Andreas

von B. S. (bestucki)


Lesenswert?

Karl M. schrieb:
> Besucher schrieb:
>> Du könntest aus den Defines Makros machen, die eine Fallunterscheidung
>> vornehmen.
>
> Ja beim fertigen Programm im Atmel AVR µC noch etwas ändern. Oder wie ?

Er meint wohl:
1
#define Bus_Port (*(KeyPressed ? &PORTD : &PORTB))

Der Umweg über Zeiger ist notwendig, da ansonsten nicht schreibend auf 
den Port zugegriffen werden kann. Solche Konstrukte sollte man jedoch 
vermeiden, da diese den Programmablauf zu sehr verschleiern.

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.