Время выполнения
Насколько мне известно, вы не можете определить тип платы, но вы можете прочитать идентификатор устройства ATmega. Проверьте этот вопрос, как это можно сделать: можно ли прочитать подпись устройства ATmega или ATtiny во время работы? Обратите внимание, что при использовании этого метода несколько назначений регистров будут меняться, а не только распиновка. Поэтому ваш код может стать значительно более сложным. Преимущество состоит в том, что если вам удастся обойти все меняющиеся назначения регистров и другие аппаратные зависимости, вы можете использовать один файл .hex для прямого программирования устройств avrdude
.
Время компиляции
Другой способ выяснить тип платы / контроллера во время компиляции. В основном вы компилируете части кода или устанавливаете макросы в зависимости от типа устройства, настроенного в Arduino IDE. Проверьте этот фрагмент кода для примера:
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
#define DEBUG_CAPTURE_SIZE 7168
#define CAPTURE_SIZE 7168
#elif defined(__AVR_ATmega328P__)
#define DEBUG_CAPTURE_SIZE 1024
#define CAPTURE_SIZE 1024
#else
#define DEBUG_CAPTURE_SIZE 532
#define CAPTURE_SIZE 532
#endif
Фрагмент кода был бесстыдно скопирован с https://github.com/gillham/logic_analyzer/wiki. Проверьте этот код на предмет некоторых хитростей, специфичных для конкретного устройства.
В зависимости от операционной системы вашего хоста поддерживаемые типы контроллеров можно найти в следующем файле:
- Linux:
/usr/lib/avr/include/avr/io.h
- Окна:
...\Arduino\hardware\tools\avr\avr\include\avr\io.h
Использование C-препроцессора (с помощью которого обрабатывается вышеуказанный код), вероятно, выходит за рамки этого сайта. http://stackoverflow.com будет лучшим местом для подробных вопросов.
Если вы работаете в Linux, вы можете легко найти все поддерживаемые типы контроллеров, набрав:
grep 'defined (__AVR' /usr/lib/avr/include/avr/io.h | sed 's/^[^(]*(\([^)]*\))/\1/'