#define "variabel" benutzen?

Gast #4361716
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
#4361738
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
}
#4361742
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.
Gast #4361759
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
#4361761
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.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.