Arduino. Как написать один скетч для разных контроллеров.#if defined

Как же написать , который бы работал для разных контроллерах и зачем это вообще нужно?

За пример возьмем скетч сигнала, написанный для контроллера 328p и 85.

Из описания выводов ATtiny85 и ATmega328p видно, что PWM для этих контроллеров разные.
Для ATmega328p
[Номер выхода контроллера — номер выхода на ардуино]

5 — 3 — PWM
11 — 5 — PWM
12 — 6 — PWM
15 — 9 — PWM
16 — 10 — PWM
17 — 11 — PWM

Для ATtiny85
[Номер выхода контроллера — номер выхода на ардуино]

3 — D4 — PWM на всех кроме ATTiny13
2 — D3 — PWM на всех кроме ATTiny13
5 — D0 — PWM
6 — D1 — PWM

Номера выхода на Ардуино для ATtiny85 и ATmega328p не совпадают, следовательно скетч написанный для одного из этих контроллеров на втором работать не будет и придется писать новый скетч.

Скетч для контроллера ATmega328p

1
2
3
4
5
6
7
8
int led = 11;
 
void setup() {
pinMode(led, OUTPUT);
}
void loop() {
digitalWrite(led, 200);
}
int led = 11;

void setup() {
pinMode(led, OUTPUT);
}
void loop() {
digitalWrite(led, 200);
}

Скетч для контроллера ATtiny85

1
2
3
4
5
6
7
8
int led = 3;
 
void setup() {
pinMode(led, OUTPUT);
}
void loop() {
digitalWrite(led, 200);
}
int led = 3;

void setup() {
pinMode(led, OUTPUT);
}
void loop() {
digitalWrite(led, 200);
}

Для объединения этих скетчей воспользуемся директивой

1
2
#if defined(#)
#endif
#if defined(#)
#endif

Она позволяет указать условие, при котором будет скомпилирован данный кусок программы.

Скетч для контроллера ATtiny85 и ATmega328p

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#if defined(__AVR_ATmega328P__)
int led = 11;
#endif
 
#if defined(__AVR_ATtiny85__)
int led = 3;
#endif
 
void setup() {
pinMode(led, OUTPUT);
}
void loop() {
digitalWrite(led, 200);
}
#if defined(__AVR_ATmega328P__)
int led = 11;
#endif

#if defined(__AVR_ATtiny85__)
int led = 3;
#endif

void setup() {
pinMode(led, OUTPUT);
}
void loop() {
digitalWrite(led, 200);
}

Как мы видим, это гораздо проще и удобнее, нежели создавать несколько файлов для разных контроллеров. При этом размер программы не увеличивается.

Перечень всех поддерживаемых контроллеров и этих директив можно посмотреть в файле

«\hardware\tools\avr\avr\include\avr\io.h»

Добавить комментарий