Tiempo de ejecución
Que yo sepa no se puede detectar el tipo de placa, pero sí se puede leer el ID del dispositivo ATmega. Comprueba en esta pregunta cómo se puede hacer: ¿Se puede leer la firma de un dispositivo ATmega o ATtiny mientras se ejecuta? Sin embargo, ten en cuenta que al usar este método, varias asignaciones de registros cambiarán, no sólo el pinout. Por lo tanto, su código puede volverse significativamente más complejo. La ventaja es que si Si consigues evitar todos los cambios en la asignación de registros y otras dependencias del hardware, puedes utilizar un único archivo .hex para programar tus 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 se compilan partes del código o se establecen macros dependiendo del tipo de dispositivo configurado en el IDE de Arduino. Mira 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 fue copiado descaradamente de https://github.com/gillham/logic_analyzer/wiki Revisa ese código para ver algún truco más específico del dispositivo.
Dependiendo del sistema operativo de su host, los tipos de controladores soportados 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 (mediante el cual se maneja el código anterior) está probablemente fuera del alcance de este sitio. http://stackoverflow.com sería el mejor lugar para las preguntas detalladas.
Si estás en Linux puedes encontrar fácilmente todos los tipos de controladores soportados escribiendo:
grep 'defined (__AVR' /usr/lib/avr/include/avr/io.h | sed 's/^[^(]*(\([^)]*\))/\1/'