2017-08-02 5 views
-2

Ich versuche, einen Arduino zu programmieren. Durch PWM eine LED-Matrix durch schnelles Ein- und Ausschalten der LEDs. Um die Helligkeit zu steuern, möchte ich zusätzliche Anweisungen zwischen den Ein- und Aus-Zuständen der LEDs hinzufügen. Die Helligkeit sollte durch eine Präprozessorvariable eingestellt werden. Der Arduino verfügt über einen 84MHz Cortex-M3 ARM-Prozessor.Wie Einfügen einer Anweisung zwischen Zeilen mit Hilfe von Präprozessordirektiven in C++?

Dies ist eine Vereinfachung, wie mein Code erhöht sich zur Zeit die Helligkeit:

uint8_t volatile dummy = 0; 
uint8_t i; 

for (i=0;i<1<<current_layer;i++) { // every next layer has double the amount of pulses 
    LED_STATE = ON; // several pulses in one go speeds up the for loop 
    dummy = 0; // increases ON-time 
    LED_STATE = OFF; 
    LED_STATE = ON; 
    dummy = 0; 
    LED_STATE = OFF; 
    LED_STATE = ON; 
    dummy = 0; 
    LED_STATE = OFF; 
    LED_STATE = ON; 
    dummy = 0; 
    LED_STATE = OFF; 
} 

Jetzt möchte ich in der Lage sein, um die Helligkeit zu erhöhen, basierend auf einer Präprozessor Variable wie so:

#define BRIGHTNESS 2 
// inside loop 
     LED_STATE = ON; // several pulses in one go speeds up the for loop 
     #if BRIGHTNESS > 0 
     dummy = 0; // increases ON-time 
     #if BRIGHTNESS == 2 
     dummy = 0; // increases ON-time even more 
     #endif 
     #endif 
     LED_STATE = OFF; 
     LED_STATE = ON; 
     #if BRIGHTNESS > 0 
     dummy = 0; 
     #if BRIGHTNESS == 2 
     dummy = 0; 
     #endif 
     #endif 
     LED_STATE = OFF; 
     LED_STATE = ON; 
     #if BRIGHTNESS > 0 
     dummy = 0; 
     #if BRIGHTNESS == 2 
     dummy = 0; 
     #endif 
     #endif 
     LED_STATE = OFF; 
     LED_STATE = ON; 
     #if BRIGHTNESS > 0 
     dummy = 0; 
     #if BRIGHTNESS == 2 
     dummy = 0; 
     #endif 
     #endif 
     LED_STATE = OFF; 

Wie Sie sehen, das macht den Code sehr unlesbar. Ich möchte ein Präprozessor-Makro definieren, das diese Dummy-Anweisungen basierend auf dem Wert BRIGHTNESS hinzufügt.

Dies ist, wie der Code sollte wie folgt aussehen:

#define BRIGHTNESS 2 
#define B1 ... // adds dummy=0; when BRIGHTNESS > 0 or else nothing at all 
#define B2 ... 
#define B3 ... 
#define B4 ... 
// inside loop 
     LED_STATE = ON; 
     B1 B2 B3 B4 // adds a number of dummy statements based on the value of BRIGHTNESS 
     LED_STATE = OFF; 
     LED_STATE = ON; 
     B1 B2 B3 B4 
     LED_STATE = OFF; 
     LED_STATE = ON; 
     B1 B2 B3 B4 
     LED_STATE = OFF; 
     LED_STATE = ON; 
     B1 B2 B3 B4 
     LED_STATE = OFF; 

Noch besser wäre eine Funktion sein, die diese Aussagen fügt auf einer variablen Basis:

#define ADD_DUMMIES ... 
// inside loop 
     LED_STATE = ON; 
     ADD_DUMMIES(BRIGHNESS) 
     LED_STATE = OFF; 

Wie würde ich Präprozessormakros definieren, so dass sie fügen Dummy-Anweisungen basierend auf dem Wert BRIGHTNESS ein?

+0

Warum verwenden Sie keine regulären 'if' Anweisungen? – DimChtz

+0

@DimChtz Wie können Aussagen die Lesbarkeit verbessern? – uzumaki

+0

Wenn Sie eine wechselnde Helligkeit der LED wünschen, warum ist sie eine Konstante? Habe ich etwas verpasst? –

Antwort

0

Dies ist, wie die dummy = 0; Aussagen können mit Hilfe des Vorprozessors hinzugefügt:

#define BRIGHTNESS 2 
#define _GETFOO(n) _FOO ## n 
#define ADD_DUMMIES(n) _GETFOO(n)() 

#define _FOO0() 
#define _FOO1() dummy = 0; 
#define _FOO2() dummy = 0; dummy = 0; 
#define _FOO3() dummy = 0; dummy = 0; dummy = 0; 
#define _FOO4() dummy = 0; dummy = 0; dummy = 0; dummy = 0; 

uint8_t volatile dummy = 0; 
// inside loop 
     LED_STATE = ON; 
     ADD_DUMMIES(BRIGHTNESS) 
     LED_STATE = OFF; 
     LED_STATE = ON; 
     ADD_DUMMIES(BRIGHTNESS) 
     LED_STATE = OFF; 
     LED_STATE = ON; 
     ADD_DUMMIES(BRIGHTNESS) 
     LED_STATE = OFF; 
     LED_STATE = ON; 
     ADD_DUMMIES(BRIGHTNESS) 
     LED_STATE = OFF; 

Der Compiler fügt den gleichen Speicherbefehl so oft zwischen den Linien als der Wert von BRIGHTNESS diktiert, so lange es ist innerhalb der Grenzen.

Verwandte Themen