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
define ist präprozessor, die sieht schon der compiler nicht mehr, geschweigedenn der µC
Geht nicht. Defines werden noch vor dem Kompilieren vom Präprozessor ausgewertet.
Ganz falscher Ansatz!! Defines sind konstanten, die beim Kompilieren vom Präprozessor im Code als Textersetzung funktionieren.
Du könntest aus den Defines Makros machen, die eine Fallunterscheidung vornehmen.
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 | }
|
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 ?
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.