2012-12-13 13 views
11

Jak określić typ płytki (np. Uno vs Nano) Arduino w czasie kompilacji? Nie należy mylić z określaniem typu procesora. Jak widzę przykłady tego, np. #if defined (__ AVR_ATmega32U4__) ...określa typ płyty Arduino

Chciałbym również, podobnie, określić między smakami Arduino wszystkich przy użyciu tego samego procesora ATmega328.

IDE zna płytkę. Czy jest to możliwe, aby uzyskać do niego dostęp z jakiegoś kompilatora #IF

Nano ma różne przerwań w stosunku do Uno. Stąd znajomość typu płyty podczas kompilacji może automatyzować przypisania pinów dla bibliotek publicznych.

Odpowiedz

4

Jak zauważyłeś, odznaczasz cel płytki w środowisku programistycznym, aby kompilator mógł znać planszę. Niestety, IDE nie informuje bezpośrednio tej kompilacji o tej informacji. Tylko typ procesora i częstotliwość są przekazywane w dół.

Możesz zobaczyć, co robi IDE, aby skompilować programy. W menu preferencji włącz szczegółowe wyjście do kompilacji. Skompiluj szkic, a zobaczysz coś takiego:

C: \ Apps \ arduino-1.0-windows \ arduino-1.0 \ hardware \ tools \ avr \ bin \ avr-g ++ -c -g -Os -Wall -fno-wyjątki -ffunction-sections -fdata-sections -mmcu = atmega328p -DF_CPU = 16000000L -DARDUINO = 100 -IC: \ Apps \ arduino-1.0-windows \ arduino-1.0 \ hardware \ arduino \ cores \ arduino -IC: \ Apps \ arduino-1.0-windows \ arduino-1.0 \ hardware \ arduino \ versions \ standard C: \ Users \ Jim \ AppData \ Local \ Temp \ build4664216036291565363.tmp \ Blink.cpp -oC: \ Users \ Jim \ AppData \ Lokalne \ Temp \ build4664216036291565363.tmp \ Blink.cpp.o

Parametry -D określają, w jaki sposób środowisko Arduino przechodzi do preprocesora. Widać, że tylko szybkość procesora i wersja arduino są przekazywane w ten sposób.

Kołki IO definiuje się inaczej: IDE zawiera jeden folder zawierający plik nagłówkowy specyficzny dla płyty.

Ten -I argumentem zawiera folder na kompilatora ścieżce wyszukiwania:

-IC: \ Apps \ Arduino-1.0-windows \ Arduino-1.0 \ hardware \ Arduino \ \ wariantów standardowych

W tym folderze znajduje się plik pins_arduino.h odpowiedni dla wybranej tablicy. Jeśli wybierzesz inną płytkę, zobaczysz zmianę tego parametru.

Jeśli chcesz zmodyfikować konfigurację IDE, możesz uzyskać to, o co prosisz.

Aby uzyskać to, czego potrzebujesz, wystarczy uzyskać jedną dyrektywę #define. Oto jak wykonać

Krok 1. Stwórz własny typ płyty. Aby utworzyć nowy rodzaj płyty, zobacz plik boards.txt znajdujący się w tym folderze:

... \ Arduino-1.0 \ hardware \ Arduino

Linia takiego zdefiniowania standardu zawierać folder (w tym przypadku):

uno.build.variant=standard 

skopiować cały blok, zmieniając nazwę i folder

myuno.name=My Arduino Uno 
... 
myuno.build.variant=myunoboard 

Dzięki tej zmianie, gdy wybierzesz ten cel deska folder myunoboard zostaną umieszczone na komp ścieżka iler.

Krok 2. Utwórz nagłówek zawierający definicję.

W folderze

... \ Arduino-1.0 \ hardware \ Arduino \ warianty \ myunoboard

stworzyć plik pins_arduino.h. W tym pliku:

Krok 3. Powtórz dla kolejnych kart.

Zapewni to możliwość budowania kodu dla różnych celów zarządu.

Powiedziawszy to, nie polecam takiego podejścia. Jeśli zaczynasz myśleć o tworzeniu kodu, który działa w wielu celach, być może nadszedł czas, aby przejść z Arduino IDE. Jeśli korzystasz z środowiska takiego jak Eclipse, masz jeden projekt z dowolną liczbą konfiguracji kompilacji. Każda konfiguracja kompilacji może określać różne definicje preprocesora dla docelowej tablicy.

+0

Po prostu próbowałem tego. Gdzie działa główny plik INO. Jednak wydaje się pliki biblioteki, nie są w stanie zobaczyć definicji pochodzi z variant/pin_arduino.h. Tak jak potrzebuję, aby różnica wystąpiła w .h niestandardowej biblioteki. – mpflaga

+0

wydaje się, że mogę się mylić. wygląda na to, że nie mogę użyć #define nazwy pliku innej biblioteki. więc teraz wydaje się działać. – mpflaga

+0

Powyższe jest teraz prawdziwe w przypadku IDE 1.5 zobacz https://github.com/arduino/Arduino/wiki/Arduino-IDE-1.5---3rd-party-Hardware-specification i parametr uno.build.board = AVR_UNO, which provide służy do ustawiania zmiennej czasu kompilacji ARDUINO_ {build.board} w celu umożliwienia użycia kodu warunkowego między #ifdefs – mpflaga

3

Nie sądzę, że coś takiego jest wbudowane w IDE Arduino, ale zawsze możesz napisać własną makefile i zdefiniować coś takiego samemu.

http://pragprog.com/magazines/2011-04/advanced-arduino-hacking

Jeśli przewinąć do przykładu Hello World, widać przykładowy makefile, z płytą sprawiają zmienna zdefiniowana i tylko trochę więcej makefile spryt można powołać się zrobić tak:

make BOARD=UNO 

lub

make BOARD=NANO 

zbudować szkic do różnych desek.

0

Łatwym sposobem na sniffowanie tablic jest użycie biblioteki takiej jak ArduinoManager. Dzięki temu można bardzo łatwo uzyskać nazwę płyty głównej i funkcje: https://github.com/backupbrain/ArduinoBoardManager

Używa opisanej powyżej techniki, aby ujawnić wiele informacji na temat prawie każdej płyty 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 projektu Arduino.

#include "ArduinoBoardManager.h" 

ArduinoBoardManager arduino = ArduinoBoardManager(); // required if you want to know the board name and specific features 

void setup() { 
    Serial.begin(9600); 

    Serial.print("Board is compatible with Arduino "); 
    Serial.println(arduino.BOARD_NAME); 

    Serial.println("Speed/SRAM/Flash: "); 
    Serial.print(ArduinoBoardManager::MAX_MHZ); 
    Serial.println(ArduinoBoardManager::SRAM_SIZE); 
    Serial.println(ArduinoBoardManager::FLASH_SIZE); 

    // Board features (multiple serial ports on Mega, for example) 
    if (arduino.featureExists(ArduinoBoardManager::FEATURE_MULTIPLE_SERIAL)) { 
    Serial.println("Your board supports multiple serial connections"); 
    } 

} 

void loop() { 
} 

Wynikiem na Arduino Uno jest:

Board is compatible with Arduino UNO 

Speed/SRAM/Flash: 
16000000 
2048 
33554432 

Proces wytwarzania tej biblioteki (w tym przykładzie kodu) do determine an Arduino board model and version jest opisany szczegółowo na moim blogu.