Laufzeit
Meines Wissens können Sie den Kartentyp nicht erkennen, aber Sie können die ATmega-Geräte-ID lesen. Überprüfen Sie diese Frage, wie es getan werden kann: Kann eine ATmega- oder ATtiny-Gerätesignatur während des Betriebs gelesen werden? Beachten Sie jedoch, dass sich bei Verwendung dieser Methode mehrere Registerzuweisungen ändern, nicht nur die Pinbelegung. Daher kann Ihr Code erheblich komplexer werden. Der Vorteil ist, dass Sie , wenn Sie es schaffen, alle sich ändernden Registerzuordnungen und andere Hardware-Abhängigkeiten zu umgehen, eine einzige .hex-Datei verwenden können, um Ihre Geräte direkt zu programmieren avrdude
.
Kompilierzeit
Eine andere Möglichkeit, den Typ der Karte / Steuerung herauszufinden, ist die Kompilierungszeit. Grundsätzlich kompilieren Sie Teile des Codes oder stellen Makros ein, abhängig vom in der Arduino IDE konfigurierten Gerätetyp. Überprüfen Sie dieses Code-Sniplet für ein Beispiel:
#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
Das Code-Sniplet wurde schamlos kopiert https://github.com/gillham/logic_analyzer/wiki Überprüfen Sie den Code auf weitere gerätespezifische Tricks.
Abhängig vom Betriebssystem Ihres Hosts finden Sie die unterstützten Controllertypen in der folgenden Datei:
- Linux:
/usr/lib/avr/include/avr/io.h
- Windows:
...\Arduino\hardware\tools\avr\avr\include\avr\io.h
Die Verwendung des C-Präprozessors (mit dem der obige Code verarbeitet wird) ist für diese Site möglicherweise nicht zulässig. http://stackoverflow.com wäre der bessere Ort für detaillierte Fragen.
Wenn Sie unter Linux arbeiten, können Sie leicht alle unterstützten Controllertypen finden, indem Sie Folgendes eingeben:
grep 'defined (__AVR' /usr/lib/avr/include/avr/io.h | sed 's/^[^(]*(\([^)]*\))/\1/'
Tools > Get Board Info
) Ich hatte gehofft, eine String-Prüfung über eine serielle Verbindung durchzuführen, damit der richtige COM-Port automatisch ausgewählt werden kann, wenn meine Anwendung gestartet wird. Weil natürlich die IDE dies kann, eine Idee, wenn sie die oben genannten Methoden verwenden?Wie in der Arduino-Hardwarespezifikation angegeben , definiert die Arduino-IDE jetzt ein Makro für jede Karte, wie in der
build.board
Eigenschaft boards.txt definiert . Dieser Wert wird angehängt,ARDUINO_
damit beispielsweise folgende Makros für die Boards angezeigt werden, an denen Sie interessiert sind:ARDUINO_AVR_UNO
ARDUINO_AVR_MEGA2560
ARDUINO_SAM_DUE
Beispiel, wie Sie diese Makros in Ihrem Code verwenden können:
quelle
Eine einfache Möglichkeit zum Board-Sniffing ist die Verwendung einer Bibliothek wie ArduinoManager. Hiermit können Sie sehr einfach den Namen und die Funktionen des Boards ermitteln https://github.com/backupbrain/ArduinoBoardManager abrufen
Es verwendet die oben beschriebene Technik, um viele Informationen zu fast jedem Arduino-Board anzuzeigen. Daher eignet es sich hervorragend, um Projekte zu erstellen, die in vielen verschiedenen Umgebungen bereitgestellt werden können.
Einfach herunterladen und in Ihr Arduino-Projekt einbinden.
Die resultierende Ausgabe auf Arduino Uno ist:
Der Vorgang zum Erstellen dieser Bibliothek (einschließlich Beispielcode) zum Ermitteln eines Arduino-Platinenmodells und einer Arduino-Platinenversion wird in meinem Blog ausführlich beschrieben.
quelle
Für alle mit Arduio Due kompatiblen Boards
(Siehe die Datei Weitere Informationen finden sam3.h. )
Wenn Sie nur das Arduino Due anvisieren möchten (ohne kompatible Boards), können Sie verwenden
(Dies ist in den Arduino Due's definiert variant.h- Datei von .)
Gutschrift an Adam F /programming//a/21058963/354144
quelle
Da der Arduino Due eine andere Prozessorfamilie (ARM) als die AVRs ist, können Sie nicht für alle drei dieselbe ausführbare Datei verwenden . Sie können aber den gleichen Quellcode haben (vorausgesetzt, die Syntax für das Lesen eines Ports ist für den AVR- und den ARM-Teil gleich) und nur zwei ausführbare Dateien (da dieselbe auf Uno und Mega ohne Neukompilierung ausgeführt wird).
Sie können den Kartentyp zur Laufzeit bestimmen, ohne ihn neu kompilieren zu müssen, indem Sie zwei digitale Pins auswählen, die noch nicht von Ihrem Programm auf einer der Karten verwendet werden, und sie als Karten-ID hoch oder niedrig binden. Wenn Sie beispielsweise die Pins PC1 und PC3 auswählen:
Dann lesen Sie einfach den Port beim Einschalten und stellen Sie eine Variable in Ihrem Programm ein.
Ein anderes Schema, das verwendet werden kann und nur einen Pin bindet, besteht darin, einen analogen Eingangspin und einen Widerstandsteiler zu verwenden und Widerstände so zu wählen, dass Sie unterschiedliche Spannungen in Schritten von beispielsweise 0,25 V erhalten. Ich habe diese Technik verwendet, um nicht nur einen Board-Typ anzugeben, sondern auch eine Board-Revision für dasselbe Board (was in gewissem Sinne ein neuer Board-Typ ist).
quelle