Tiempo de ejecución
Que yo sepa, no puede detectar el tipo de placa, pero puede leer la identificación del dispositivo ATmega. Compruebe esta pregunta cómo se puede hacer: ¿Se puede leer la firma de un dispositivo ATmega o ATtiny mientras se ejecuta? Sin embargo, tenga en cuenta que al usar este método, varias asignaciones de registro cambiarán, no solo el pinout. Por lo tanto, su código puede ser significativamente más complejo. La ventaja es que si logra evitar todas las asignaciones de registros cambiantes y otras dependencias de hardware, puede usar un solo archivo .hex para programar sus dispositivos directamente 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 establece macros dependiendo del tipo de dispositivo configurado en el IDE de Arduino. Consulte este fragmento 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ó descaradamente de https://github.com/gillham/logic_analyzer/wiki. Consulte ese código para ver algunos trucos más específicos del dispositivo.
Dependiendo del sistema operativo de su host, los tipos de controladores compatibles se pueden encontrar en el siguiente archivo:
- Linux:
/usr/lib/avr/include/avr/io.h
- Ventanas:
...\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. http://stackoverflow.com 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/^[^(]*(\([^)]*\))/\1/'