Tempo de execução
Que eu saiba, você não pode detectar o tipo de placa, mas pode ler o ID do dispositivo ATmega. Verifique esta pergunta como isso pode ser feito: Uma assinatura de dispositivo ATmega ou ATtiny pode ser lida durante a execução? Observe que, ao usar esse método, várias atribuições de registro serão alteradas, não apenas a pinagem. Portanto, seu código pode ficar significativamente mais complexo. A vantagem é que, se você conseguir solucionar todas as atribuições de registro alteradas e outras dependências de hardware, poderá usar um único arquivo .hex para programar seus dispositivos diretamente avrdude
.
Tempo de compilação
Outra maneira de descobrir o tipo de placa / controlador é em tempo de compilação. Basicamente, você compila partes do código ou define macros, dependendo do tipo de dispositivo configurado no IDE do Arduino. Verifique este sniplet de código para obter um exemplo:
#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
O sniplet de código foi copiado descaradamente em https://github.com/gillham/logic_analyzer/wiki Verifique esse código para mais alguns truques específicos do dispositivo.
Dependendo do sistema operacional do host, os tipos de controladores suportados podem ser encontrados no seguinte arquivo:
- Linux:
/usr/lib/avr/include/avr/io.h
- Janelas:
...\Arduino\hardware\tools\avr\avr\include\avr\io.h
O uso do pré-processador C (pelo qual o código acima é tratado) provavelmente está fora do escopo deste site. http://stackoverflow.com seria o melhor lugar para perguntas detalhadas.
Se você estiver no Linux, poderá encontrar facilmente todos os tipos de controladores suportados digitando:
grep 'defined (__AVR' /usr/lib/avr/include/avr/io.h | sed 's/^[^(]*(\([^)]*\))/\1/'