Вопрос по #ifdef ARDUINO

Densl
Offline
Зарегистрирован: 28.11.2018

Здарвстуйте. Мне нужно поправить библиотеку, и в ней я наткнулся на незнакомую директиву #ifdef ARDUINO. По контексту можно догадаться, что эта библиотека может использоваться не только в Arduino IDE, но так ли это? Для этого там используется такая запись? Т.е в ардуино.h первых строкой прописано #define ARDUINO?

sadman41
Offline
Зарегистрирован: 19.10.2016

Не помню такого в ардуино.хэ
Сделайте поиск по файлам фразы "define ARDUINO"

Densl
Offline
Зарегистрирован: 28.11.2018
#ifdef ARDUINO
  SPI.setBitOrder(MSBFIRST);
  SPI.setDataMode(SPI_MODE0);
  SPI.setClockDivider(SPI_CLOCK_DIV4);
#endif

такой код

Densl
Offline
Зарегистрирован: 28.11.2018

sadman41 пишет:
Не помню такого в ардуино.хэ Сделайте поиск по файлам фразы "define ARDUINO"

В какой папке искать?

sadman41
Offline
Зарегистрирован: 19.10.2016

Сложно сказать. Может в файлах проекта.... Ну, можно и в C:\Programm Files\Arduino ещё...

Densl
Offline
Зарегистрирован: 28.11.2018

В общем поискал в папке с ардуино, в билиотеках, в папке Arduino15, нигде нет.

Еще в библиотеках такую запись видел

#if ARDUINO < 100
#include <WProgram.h>
#else
#include <Arduino.h>
#endif

Тоже непонятно что оно делает.

Feofan
Offline
Зарегистрирован: 28.05.2017

Это директивы препроцессора

sadman41
Offline
Зарегистрирован: 19.10.2016

А, ну эта хреновина задаёт версию IDE. В ветке 1.0.x версия обозначалась в этом макросе, получается.

b707
Offline
Зарегистрирован: 26.05.2017

sadman41 пишет:
А, ну эта хреновина задаёт версию IDE. В ветке 1.0.x версия обозначалась в этом макросе, получается.

судя по контексту - она и сейчас так обозначается. только ARDUINO теперь примерно 190

Densl
Offline
Зарегистрирован: 28.11.2018

Feofan пишет:

Это директивы препроцессора

#define, #ifdef - это директивы препроцессора.

b707
Offline
Зарегистрирован: 26.05.2017

Densl пишет:

#define, #ifdef - это директивы препроцессора.

их еще много - #ifndef #else #endif #include и тд

Densl
Offline
Зарегистрирован: 28.11.2018

b707 пишет:

Densl пишет:

#define, #ifdef - это директивы препроцессора.

их еще много - #ifndef #else #endif #include и тд

Ну да, все что с решетки начинается...

Получается ARDUINO хранит версию IDE, не более. Надеюсь нулевой версии не было.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

<Папка-с-ArduinoIDE>/hardware/arduino/avr/platform.txt

Обсуждаемый дефайн жирным выделен. Ключ компилятора -D - не нужно объяснять? Очень надеюсь...

## Preprocessor
preproc.includes.flags=-w -x c++ -M -MG -MP
recipe.preproc.includes="{compiler.path}{compiler.cpp.cmd}" {compiler.cpp.flags} {preproc.includes.flags} -mmcu={build.mcu} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.cpp.extra_flags} {build.extra_flags} {includes} "{source_file}"

preproc.macros.flags=-w -x c++ -E -CC
recipe.preproc.macros="{compiler.path}{compiler.cpp.cmd}" {compiler.cpp.flags} {preproc.macros.flags} -mmcu={build.mcu} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.cpp.extra_flags} {build.extra_flags} {includes} "{source_file}" -o "{preprocessed_file_path}"

----------------------------

И да - я хотел вставить как "код", но внутри кода не выделяется жирным.... :((

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Densl пишет:

Мне нужно поправить библиотеку, и в ней я наткнулся на незнакомую директиву #ifdef ARDUINO.

Если эта директива Вам незнакома - не лезьте править библиотеку - ничего хорошего из этого не вырастет.

Densl
Offline
Зарегистрирован: 28.11.2018

Прости, брат. Я правлю для личных целей, тут нет какой-то ответственности если это все вдруг не выполнит возлагаемую на него функцию. Просто без правки это работать не будет. Мне нужно чтобы эта библиотека корректно работала и на STM32 и на других ардуинах. Сама библиотека очень грубо адаптирована под STM народными "умельцами", и она сделала мне подвох, по тому что у меня перестал в один прекрасный момент работать обмен по NRF24. Оказалось там товарищи, которые ее адаптировали, почему-то не учли, что делитель частоты SPI должен быть другим, нежели для 16МГц процессора. И еще я хочу без ущерба использовать эту же библиотеку и для ATMEG.

Поэтому все навсего заменю

#ifdef ARDUINO
  SPI.setBitOrder(MSBFIRST);
  SPI.setDataMode(SPI_MODE0);
  SPI.setClockDivider(SPI_CLOCK_DIV4);
#endif

на

#ifdef ARDUINO
  SPI.setBitOrder(MSBFIRST);
  SPI.setDataMode(SPI_MODE0);
  #if defined (__STM32F1__)
  SPI.setClockDivider(SPI_CLOCK_DIV16);
  #else
  SPI.setClockDivider(SPI_CLOCK_DIV4);
  #endif
#endif

Все должно работать.

b707
Offline
Зарегистрирован: 26.05.2017

Densl пишет:

Все должно работать.

Должно работать или действительно работает? :)

Я брал стандартную библиотеку NRF и она у меня нормально запускалась на СТМ, без всяких манипуляций. А у вас источник проблемы может быть в том, что вы посадили на одну шину SPI два девайса, требующих разных скоростей шины. В этом случае полезно вспомнить, что например на STM32F103 два канала SPI и конфликтующие клиенты можно разнести по разным каналам

Densl
Offline
Зарегистрирован: 28.11.2018

b707 пишет:

Densl пишет:

Все должно работать.

Должно работать или действительно работает? :)

Изначально она у меня тоже работала. Потом я стал менять прошивки, перепаивать провода и все, капут короче, чего я только не делал. Даже если возвращал старую прошивку, или прошивал самую простую ничего не помогало. Потом я с помощью printDetails увидел как что-то каверкает адреса, что я шлю NRFу. Т.е. я шлю F0F1F2F3F4LL  а контроллер мне возвращает что-то типа этого: 1111 1000 1111 1001 1111 1011 1111 1011 1111 1111‬ в двоичном виде. И я понял что что-то не успевает обрабатывать или сменять приходящие биты. Я проверил эту теорию, уменьшив частоту STM до 48 МГц, и о чудо, все заработало. И потом я нашел этот параметр обмена по SPI. Там даже в комментах пишут что:

" // Minimum ideal SPI bus speed is 2x data rate
  // If we assume 2Mbs data rate and 16Mhz clock, a
  // divider of 4 is the minimum we want.
  // CLK:BUS 8Mhz:2Mhz, 16Mhz:4Mhz, or 20Mhz:5Mhz"

А если 72 делить на 4, то получится 18МГц, что не есть хорошо.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

b707 пишет:

...А у вас источник проблемы может быть в том, что вы посадили на одну шину SPI два девайса, требующих разных скоростей шины.

Не знаю, может, мне повезло, но у меня на одной шине прекрасно работают несколько дивайсов (точно не помню, сколько) на трех разных частотах (4, 2 и 1 МГц). Естественно, перед началом работы с каждым из них частота аппаратного SPI принудительно изменяется.