Czas pracy
Według mojej wiedzy nie można wykryć typu płytki, ale można odczytać identyfikator urządzenia ATmega. Sprawdź to pytanie, w jaki sposób można to zrobić: czy podpis urządzenia ATmega lub ATtiny można odczytać podczas działania? Zauważ, że podczas korzystania z tej metody zmieni się kilka przypisań rejestrów, a nie tylko pinout. Dlatego twój kod może stać się znacznie bardziej złożony. Zaletą jest to, że jeśli uda ci się obejść wszystkie zmieniające się przypisania rejestrów i inne zależności sprzętowe, możesz użyć jednego pliku .hex do bezpośredniego zaprogramowania urządzeń avrdude
.
Czas kompilacji
Innym sposobem ustalenia typu karty / kontrolera jest czas kompilacji. Zasadniczo kompilujesz części kodu lub ustawiasz makra w zależności od typu urządzenia skonfigurowanego w Arduino IDE. Sprawdź ten fragment kodu na przykład:
#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
Fragment kodu został bezwstydnie skopiowany z https://github.com/gillham/logic_analyzer/wiki Sprawdź ten kod, aby uzyskać nieco więcej sztuczek związanych z konkretnym urządzeniem.
W zależności od systemu operacyjnego hosta obsługiwane typy kontrolerów można znaleźć w następującym pliku:
- Linux:
/usr/lib/avr/include/avr/io.h
- Windows:
...\Arduino\hardware\tools\avr\avr\include\avr\io.h
Korzystanie z preprocesora C (przez który obsługiwany jest powyższy kod) prawdopodobnie nie wchodzi w zakres tej witryny. http://stackoverflow.com byłoby lepszym miejscem na szczegółowe pytania.
Jeśli korzystasz z systemu Linux, możesz łatwo znaleźć wszystkie obsługiwane typy kontrolerów, wpisując:
grep 'defined (__AVR' /usr/lib/avr/include/avr/io.h | sed 's/^[^(]*(\([^)]*\))/\1/'
Tools > Get Board Info
) Miałem nadzieję sprawdzić ciąg znaków z połączenia szeregowego, aby właściwy port COM mógł zostać automatycznie wybrany po uruchomieniu mojej aplikacji. Ponieważ oczywiście IDE może to zrobić, masz jakiś pomysł, jeśli użyją powyższych metod?Jak podano w specyfikacji sprzętowej Arduino , Arduino IDE definiuje teraz makro dla każdej płytki, zgodnie z definicją we
build.board
właściwości boards.txt . Ta wartość jest dołączana do,ARDUINO_
więc na przykład makra dla tablic, którymi jesteś zainteresowany, to:ARDUINO_AVR_UNO
ARDUINO_AVR_MEGA2560
ARDUINO_SAM_DUE
Przykład wykorzystania makr w kodzie:
źródło
Łatwym sposobem na wąchanie tablicy jest użycie biblioteki takiej jak ArduinoManager. Dzięki temu możesz bardzo łatwo uzyskać nazwę płyty i funkcje https://github.com/backupbrain/ArduinoBoardManager
Wykorzystuje opisaną powyżej technikę, aby ujawnić wiele informacji o prawie każdej płycie Arduino, więc świetnie nadaje się do tworzenia projektów, które mogą zostać wdrożone w wielu różnych środowiskach.
Wystarczy pobrać i dołączyć do swojego projektu Arduino.
Wynikowy wynik w Arduino Uno to:
Proces tworzenia tej biblioteki (w tym przykładowego kodu) w celu ustalenia modelu i wersji płyty Arduino jest szczegółowo opisany na moim blogu.
źródło
Do wszystkich płyt kompatybilnych z Arduio Due
(Aby uzyskać więcej informacji, zobacz plik sam3.h. )
Jeśli chcesz po prostu wycelować w Arduino Due (pomijając kompatybilne płyty), możesz użyć
(Jest to zdefiniowane w pliku variant.h Arduino Due .)
Podziękowania dla Adama F. /programming//a/21058963/354144
źródło
Ponieważ Arduino Due to inna rodzina procesorów (ARM) niż AVR, nie będziesz mógł używać tego samego pliku wykonywalnego dla wszystkich trzech. Ale możesz mieć ten sam kod źródłowy (zakładając, że składnia odczytu portu jest taka sama dla obu części AVR i ARM) i tylko dwa pliki wykonywalne (ponieważ ten sam będzie działał zarówno na Uno, jak i Mega bez ponownej kompilacji).
Możesz określić typ płytki w czasie wykonywania bez konieczności ponownej kompilacji, wybierając dwa cyfrowe piny, które nie są jeszcze używane przez program na żadnej z kart, i przypisz je jako wysokie lub niskie jako identyfikator karty. Na przykład jeśli wybrane piny to PC1 i PC3:
Następnie po prostu przeczytaj port po włączeniu zasilania i ustaw zmienną w swoim programie.
Innym schematem, który można zastosować, który wiąże tylko jeden pin, jest użycie analogowego pinu wejściowego i użycie dzielnika rezystora, wybierając rezystory tak, aby uzyskać różne napięcia, powiedzmy, co 0,25 V. Użyłem tej techniki, aby określić nie tylko typ planszy, ale także wersję planszy dla tej samej planszy (która w pewnym sensie jest nowym typem planszy).
źródło