Как вставлять библиотеки внутрь скетча?
- Войдите на сайт для отправки комментариев
Хало all, в общем у меня задача сохранить максимум скорости передачи по SPI, потому что от этого зависит актуальность информации на удалённом приёмнике, приёмник критичный (всякие DMX светильники для театра), короче считайте это реализацией MIDI по воздуху. Но это только конкретно этот проект. Думаю, такая необходимость возникнет и для других.
Как мы знаем, функции digitalWrite(), digitalRead() не особенно шевелятся по сравнению с прямой записью в порт, и есть замечательная библиотека cyberlib, она же nanopins, содержащая функции типа d5i(), пишущие в регистр то что надо, по маске.
Но. Чтобы всё это дело применять, надо по меньшей мере знать, какие будут использоваться номера выводов. На этапе сборки девайса они еще выбираются, но на момент написания скетча известны точно, объявлены в начале, дело только за тем чтобы подставить. Для помигать лампочками замечательно. Я для разговорчиков с GPS приёмником, например - а вот хер там, юзайте библиотеку, а в ней опять digitalWrite(), digitalRead(). Переписать библиотеку? Можно, но чото... а, кажется эти б███ские номера выводов в другом проекте будут отличатся! И сх██ли мне писать вторую версию, пятую версию, стопицотую версию? Не проще ли взять окончательный, готовый CPP, открыть в редакторе, зажать Ctrl+F7 (ну или Ctrl+G, кто как любит) и позаменять нах все RxPin на 2, TxPin на 3, RelayPin на 6, а потом все digitalWrite(5) на d5hi(); или как его там. Работы на 5 минут, и нахер не нужно держать все эти версии.
Способа создать такой CPP, видимо, нету. Файл из каталога Temp отличается от исходника только строкой #include "Arduino.h", видимо нужно брать целиком тело библиотеки и вставлять в файл. Объясните пожалуйста, как это делать? Достаточно ли просто найти строку #include и вместо неё воткнуть нужный файл, рекурсивно (чтобы внутри инклудов тоже попавшиеся инклуды проставить, с запоминанием списка чтобы не вставлять дважды). Мне не лень, я и парсер напишу на паскале каком-нибудь, лижбы работало. Схавает ли компилятор ino файл, в котором ваще-ваще-преваще всё-превсё? Или опять на что-нибудь пожалуется?
Сумбурно как-то - я мало понял. Самое непонятное - мотивация.
Что мешает править библиотеку?
Допустим, среда Arduino у меня на SSD, а скетчи на рабочем диске. До тех пор, пока скетчи правятся и система лезет в каталог среды только ради чтения, всё работает как надо, а с того момента как под каждый новый проект в библитеку(и) будут вноситься новые правки, начнётся износ SSD. хотя-бы так.
А вообще, это чтобы не ломать родную библиотеку. Можно конечно делать копию, но когда в каждой библиотеке будут такие копии, каталог среды основательно засрётся т. к. библиотек там уже хорошо если 60. А может и больше, хз.
Суть вопроса:
Допустим у меня есть скетч, использующий LiquidCrystal. Можно ли удалить из него строку
и вставить вместо неё всё что находится в файлах %arduino%\libraries\LiquidCrystal.h, LiquidCrystal.cpp?
здесь #4 говорится, что если, вместо <> надо ставить "", тогда файл будет искаться в папке проекта.
попробуй
Хало all, в общем у меня задача сохранить максимум скорости передачи по SPI, потому что от этого зависит актуальность информации на удалённом приёмнике, приёмник критичный (всякие DMX светильники для театра), короче считайте это реализацией MIDI по воздуху. Но это только конкретно этот проект. Думаю, такая необходимость возникнет и для других.
Реальный проект (не завершен) использует STM32F050F4P6 (можно заменить на STM32F030F4P6, TSSOP20, 55р. (в России)), без кварца, тактовая 48МГц. Загружает SPI через DMA из буфера в цикле и не на максимальной скорости (по моему 3,2МГц, сейчас точно не помню). На выход подключены 100 штук WS2812b. Никаких перерывов и т.п. никакого гемора с задержками. При этом сам камень свободен для формирования эффектов, потому что прерывания и выполнение кода не нужно для вывода буфера на SPI, трудится DMA. Можно не делать циклический вывод, а старт по запросу, выплевывая один раз весь буфер. Keil, v5+, программатор от платы Nucleo (ST-Link). Памяти (ОЗУ) 4К, флеш, насколько помню 16М. Минимальный обвес - несколько кондеров по питанию, резистор или два.
Разумееется это как вариант, не настаиваю.
Sorry, здесь плата еще не отмыта и паяю я как курица лапой.
К НГ готовлюсь :)
открыть в редакторе, зажать Ctrl+F7 (ну или Ctrl+G, кто как любит) и позаменять нах все RxPin на 2, TxPin на 3, RelayPin на 6, а потом все digitalWrite(5) на d5hi();
Чем не подходит деректива #define ?
Ахринеть, в самом деле. Надо где-нибудь записать на видном месте.
Реальный проект (не завершен) использует STM32F050F4P6 (можно заменить на STM32F030F4P6, TSSOP20, 55р. (в России)), без кварца, тактовая 48МГц. Загружает SPI через DMA из буфера в цикле и не на максимальной скорости (по моему 3,2МГц, сейчас точно не помню). На выход подключены 100 штук WS2812b. Никаких перерывов и т.п. никакого гемора с задержками. При этом сам камень свободен для формирования эффектов, потому что прерывания и выполнение кода не нужно для вывода буфера на SPI, трудится DMA. Можно не делать циклический вывод, а старт по запросу, выплевывая один раз весь буфер. Keil, v5+, программатор от платы Nucleo (ST-Link). Памяти (ОЗУ) 4К, флеш, насколько помню 16М. Минимальный обвес - несколько кондеров по питанию, резистор или два.
Круть!
А сколько чипов максимально потянет?
Реальный проект (не завершен) использует STM32F050F4P6 (можно заменить на STM32F030F4P6, TSSOP20, 55р. (в России)), без кварца, тактовая 48МГц. Загружает SPI через DMA из буфера в цикле и не на максимальной скорости (по моему 3,2МГц, сейчас точно не помню). На выход подключены 100 штук WS2812b. Никаких перерывов и т.п. никакого гемора с задержками. При этом сам камень свободен для формирования эффектов, потому что прерывания и выполнение кода не нужно для вывода буфера на SPI, трудится DMA. Можно не делать циклический вывод, а старт по запросу, выплевывая один раз весь буфер. Keil, v5+, программатор от платы Nucleo (ST-Link). Памяти (ОЗУ) 4К, флеш, насколько помню 16М. Минимальный обвес - несколько кондеров по питанию, резистор или два.
Круть!
А сколько чипов максимально потянет?
Если про WS2812b, то ограничивает только объем памяти (ОЗУ) [да я типа Капитан Очевидность], сейчас на два буфера (один выходной, другой для формирования эффектов) уходит почти вся память, т.е. сейчас максимум - это 100 светодиодов WS2812b. К сожалению не успел доделать аппаратную реализацию протокола WS2812b, тогда памяти будет хватать точно на бОльшее кол-во светиков. Схему уже продумал, в Протеусе покрутил, там 3-4 корпуса логики, зато экономия памяти в несколько раз, т.е. 3 байта на светодиод, а не в 4 раза больше. Мне не хватило отсутствующего в закромах банального триггера TM2, заказал уже :) В принципе можно еще подумать и оставить всего один выходной буфер, тогда еще больше можно будет подключить. Мне хватает одной ленты (больше здесь не подключить, ног маловато, потому SPI всего один). Короче проект закончу, тогда и посчитаю. К сожалению к Ардуино вряд ли это всё можно будет прикрутить. Сейчас на большом компе, на Шарпе отлаживаю эффекты, зачем контроллер маять перепрошивкой, там всё уже работает, потом алгоритмы залью и останется окончательное тестирование, вроде к НГ успеваю :)
ТС, извини, я смотрю тема несколько о другом (я только начало выхватил), а я тут со своим железом :)
kisoft, создайте тему и расскажите, если не жалко подробнее.
kisoft, создайте тему и расскажите, если не жалко подробнее.
Закончу, статья будет, здесь или на EE (тогда ссылку выложу в отдельной теме). Видео, схема и т.п. Рассказать не жалко. Печатку не делал, хотя сделаю, если аппаратную реализацию протокола добью.