Tiempo de ejecución
Que yo sepa, no puede detectar el tipo de placa, pero puede leer el ID de dispositivo ATmega. Compruebe esta pregunta cómo se puede hacer: ¿Se puede leer la firma de un dispositivo ATmega o ATtiny durante la ejecución? aunque al usar este método, se pueden cambiar varias asignaciones de registro, no solo el pinout. Por lo tanto, su código puede ser significativamente más complejo. La ventaja es que si puede solucionar todos los cambios en las asignaciones de registro y otras dependencias de hardware, puede usar un solo archivo .hex para programar sus dispositivos directamente desde avrdude
.
Tiempo de compilación
Otra forma de averiguar el tipo de placa / controlador es en tiempo de compilación. Básicamente, compila partes del código o configura macros según el tipo de dispositivo configurado en el IDE de Arduino. Revisa este código de código para ver un ejemplo:
#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
El fragmento de código se copió sin vergüenza desde enlace Comprueba ese código para ver algunos trucos específicos del dispositivo.
Dependiendo del sistema operativo de su host, los tipos de controlador compatibles se pueden encontrar en el siguiente archivo:
- Linux:
/usr/lib/avr/include/avr/io.h
- Windows:
...\Arduino\hardware\tools\avr\avr\include\avr\io.h
El uso del preprocesador C (por el cual se maneja el código anterior) probablemente esté fuera del alcance de este sitio. enlace sería el mejor lugar para preguntas detalladas.
Si está en Linux, puede encontrar fácilmente todos los tipos de controladores compatibles escribiendo:
grep 'defined (__AVR' /usr/lib/avr/include/avr/io.h | sed 's/^[^(]*(\([^)]*\))//'