Час виконання
Наскільки мені відомо, ви не можете визначити тип плати, але ви можете прочитати ідентифікатор пристрою 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
- Windows:
...\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/'