Arhat.h, Замена типовых функций "одной командой".
- Войдите на сайт для отправки комментариев
Ссылки на библиотеку:
Начало разработки и обсуждения тут
Версия на гитхабе
Дальнейшая развитие этой версии пока ЗАМОРОЖЕНО! Библиотека для ATmega2560, ATmega328p и их клонов!!!
Для 328p сделана минимальная адаптация в виде файла распиновки и небольшого тестирования.
Ставится как обычная библиотека, но требует переименования файла wiring.c в какой-нибудь *.old
Позволяет значительно сократить код на простых дерганьях лапками, цифровое чтение с пинов, работе со счетчиками, аппаратным ШИМ, аппаратным ШИМ для серводвигателей (50гц) и аналоговом чтении. Есть возможность чтения длительностей импульсов по прерываниям PCINT2 (пока отлажено только для одной ноги - Analog8, запланированы все [8..15]), есть непроверенный код по потоковому (непрерывному) чтению аналоговых ног через прерывания (некогда и надобности пока нет), есть макросы позволяющие читать аналог в разных режимах ADC (простой, дифференциальный, с усилением - проверено частично). Макросы для задержек, в том числе и микросекундных (взяты из стандартных _delay_loop1..), макрос консистентного чтения счетчика переполнений таймера0.
По возможности названия макросов совпадают с типовыми названиями функций (pinMode, digitalWrite, analogRead, etc.), но есть и свои (pwmSet, pinModeOut, timerControl, etc.). Есть небольшая совместимость со скетчами на Cyberlib - часть макросов определена и тут точно также.
Ограничение: поскольку контроля на корректность использования нет никакого (задача уменьшения размера скетчей), и большая часть функций реализована через макропроцессор, то в качестве номера пина допускается использование в большинстве случаев только числовые константы или их явные макроопределения через #define! Если это не так, то с большой долей вероятности получите ошибку компиляции при попытках развернуть макрос.
Настройка на плату вынесена в отдельный файл и в общем-то ничего не мешает переопределить его для любых других категорий Ардуино. А поскольку Мега2560 обладает наиболее развитым набором, то скорее всего надо "убрать лишнее" и переопределить то, что назначено на иные пины или имеет 8битную организацию вместо 16-и.
Конечные автоматы: Дополнительно, в фале tsc.h определены типы данных и функции для упрощения программирования скетчей в автоматном стиле (то, что "доктор прописывал"). Есть три варианта построения конечных автоматов:
а) на базе "блинк без делай";
б) на базе SimpleTimer -- самоуправляемые конечные автоматы;
в) на базе таблицы переходов и состояний -- таблично-управлемые конечные автоматы. Таблица состояний и переходов - в программной памяти flash.
Как пример автоматной библиотеки датчика, сделан а-ля template файл для ультразвукового датчика HCSR-04, производящий замер дальности по прерыванию PCINT2. В примере показан способ подключения двух датчиков (пока работает только первый - см. выше).
Есть примеры практически на всё. Есть keywords.txt. есть небольшое описание макросов.
Тема создана на предмет если будут появляться вопросы и/или обнаруживаться ошибки в коде.
Основное назначение: сокращение размера скетчей, переход на программирование в автоматном стиле без использования delay() в любом виде. В основном для управления чем-либо, в частности построения разного рода "самокатных тележек" - роботов.
Найденные ошибки:
1. Строка 563, arhat.h (кажется) неверно переопределена функция аналогого чтения. Должно быть так:
#define analogRead(p) (adcRead(p))
Ещё:
В большинстве функций времени и задержек есть дубликаты, укорачивающие параметры до 16 битных значений. Сделано с целью уменьшения размера вызовов и ускорения передач параметров в скетчах.
Каждый файл документирован, насколько смог. Читать исходники тут думаю будет полезно.
Большая работа.
К сожалению Меги нет, потому проверить не могу, но что-то подсказывает, что следующий код с Вашей библиотекой работать никак не будет:
Или будет?
Впрямую - нет, не будет и это прямо сказано во многих местах: Библиотека заточена под явное указание номеров пинов.
Можно вот так (разворачивая inline digitalRead()):
P.S.
Следует заметить, что программирование микроконтроллеров и не предполагает динамического определения номера пина. Как правило, каждый пин имеет своё уникальное применение в устройствах управления. Вот поэтому библиотека так построена.
Ну тогда не интересно, весь смысл Wiring в возможности таких вот извращений, иначе с тем же успехом можно просто readBit\writeBit делать и то гибкости побольше будет
<sensored>
Да, можно использовать Wiring для динамического изменения номера пина как в вашем примере, но такое как правило невостребовано в конечном применении: ноги контроллера имеют однозначный аппаратный функционал, а "программная эмуляция" - это все-таки костыль.
Да, можно напрямую обращаться типа: POTB |= _BV(PB2); а ещё лучше делать это в ассемблере. Но:
а) Не все ТАК умеют; и б) Эта библиотека и является переходным звеном от wiring к такому типу записи.
Доделано измерение длительностей импульсов по прерываниям PCINT2, хоть все 8 сразу .. :)
Архив - обновлен там же (первый пост этой темы).
Видите ли, Arduino - это не конкретный процессор, а платформа, на которой любой код должен компилиироваться для любого из используемых процессоров. Иначе основная идея теряет всякий смысл.
<sensored>
Подключайтесь. Достаточно написать файлик, аналогичный arhat_pins2560.h и включить его в условную компиляцию под заданной константой процессора... ничего сложного. Просто у меня есть только эта Мега и Уно на 328, которую ещё не распаковывал за ненадобностью..
<sensored>
Исправлено 2016-04-21:
Проект на гитхаб переехал на адрес:
Arhat.h - Wiring++
Весомая заявка на Ардуино++. Замысел верный но проблема в мелочах, в смысле в библиотеках. Открываем например либку для LCD и видим на нижнем уровне чтото типа
И что толку если я очень быстро и компактно поработаю, например, с сервоприводом через Вашу реализацию, если при выводе на экран будут такие затыки? Пока так сделаны либы все Ваши попытки обречены. Там на один пин раскрутятся сотни машинных команд. Даже переписав digitalWrite получите пару десятков команд. А достаточно одной. Получается надо переписывать существующие либки, что долго. И при этом для короткого кода надо чтоб номера пинов были константы, что вобщем логично в рамках одного проекта, тогда их можна препроцессором развернуть в пару порт-номер пина. Тока использовать константы в номерах пинов - это строго поперек концепции ардуино, вызывает сложности при наличии нескольких обектов (5 сервоприводов к одной ардуинке например) и проблемы при сборке. Хотя деватся некуда, приходится либки перерабатывать. А digitalWrite в loop иногда и простить себе можна.
По поводу поддержки конечного автомата, целиком за, вобще думаю стоит передавать в loop параметром текущие милисикунды и убрать нафиг все функции доступа к системному времени, дабы не вводить в соблазн ))). Да жестоко и радикально, зато эффективно. Можна определить не блокирующий delay с двумя-тремя параметрами: через скока микросекунд вызвать callback, указатель на callback и опционально его контекст. Еще можна подумать о массиве структур типа: состояние, время нахождения в этом состоянии, команда завершения состояния, следующее состояние по умолчанию. И функцию которая будит "крутить" этот массив. Тогда loop выглядит как один большой switch по командам, что явно гуд.
Глянте это - http://arduino.ru/forum/proekty/pokhvalimsya-khudozhestvennoi-samodeyatelnostyu-na-ws2812#comment-138359. Там ассемблерная реализация, если на Ваш взгляд соответствует требованиям - доцепите к себе, пусть правильный код кучкуется вместе.
Да, спасибо.
Замысел в том, чтобы не пользовать то, что вам в данный момент не требуется и убрать из типовых функций всё, что не относится к полезному действию. <sensored>
Отсюда, там конкретно написано зачем и для каких случаев эта библиотека применима и создавалась. Да, согласен что 2-х недельная работа в процессе освоения и поиска ответа на вопрос "Что же такое Ардуино?" привел к созданию этой либы .. это вообще-то моя тренировочная работа в процессе ознакомления с МК и способом его программирования.
Да, согласен, что концепция этой либы идет вразрез с Wiring .. <sensored>.. Есть то, что сделано, и его буду развивать далее по мере необходимости. Есть гитхаб и каждый может подключиться и допилить либу под свои нужды и свой МК.
Главное помнить: концепция - в корне отлична от Wiring: библиотека для компактного писания скетчей программистами НЕ начинающего уровня.
некомпилится ide 1. 6 .4 Сообщение компилятора ниже пробовал на мигалке
Как-то странно у вас не собралась стандартная библиотека core.a если судить по логу. Ошибок компиляции тут нет.
Upd: Выкачал библиотеку, добавил переименовав каталог со своей в ./libraries/Arhat-2, достал из папки стандартных примеров Blink.ino и добавил первой строкой #include "arhat.h", получилось это:
Вот лог компиляции:
Используем библиотеку Arhat в папке: /home/arhat109/Рабочий стол/Arduino/libraries/Arhat (legacy)
/home/arhat109/Рабочий стол/progs/arduino-1.6.4/hardware/tools/avr/bin/avr-g++ -c -g -Os -w -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -mmcu=atmega2560 -DF_CPU=16000000L -DARDUINO=10604 -DARDUINO_AVR_MEGA2560 -DARDUINO_ARCH_AVR -I/home/arhat109/Рабочий стол/progs/arduino-1.6.4/hardware/arduino/avr/cores/arduino -I/home/arhat109/Рабочий стол/progs/arduino-1.6.4/hardware/arduino/avr/variants/mega -I/home/arhat109/Рабочий стол/Arduino/libraries/Arhat /tmp/build4543656264111637842.tmp/Blink.cpp -o /tmp/build4543656264111637842.tmp/Blink.cpp.o
Используем предварительно скомпилированный файл: /tmp/build4543656264111637842.tmp/Arhat/tsc.c.o
Используем предварительно скомпилированный файл: /tmp/build4543656264111637842.tmp/Arhat/arhat.c.o
Используем предварительно скомпилированный файл: /tmp/build4543656264111637842.tmp/wiring.c.o
Используем предварительно скомпилированный файл: /tmp/build4543656264111637842.tmp/hooks.c.o
Используем предварительно скомпилированный файл: /tmp/build4543656264111637842.tmp/wiring_analog.c.o
Используем предварительно скомпилированный файл: /tmp/build4543656264111637842.tmp/wiring_shift.c.o
Используем предварительно скомпилированный файл: /tmp/build4543656264111637842.tmp/WInterrupts.c.o
Используем предварительно скомпилированный файл: /tmp/build4543656264111637842.tmp/wiring_pulse.c.o
Используем предварительно скомпилированный файл: /tmp/build4543656264111637842.tmp/wiring_digital.c.o
Используем предварительно скомпилированный файл: /tmp/build4543656264111637842.tmp/Print.cpp.o
Используем предварительно скомпилированный файл: /tmp/build4543656264111637842.tmp/HardwareSerial1.cpp.o
Используем предварительно скомпилированный файл: /tmp/build4543656264111637842.tmp/HardwareSerial0.cpp.o
Используем предварительно скомпилированный файл: /tmp/build4543656264111637842.tmp/HardwareSerial2.cpp.o
Используем предварительно скомпилированный файл: /tmp/build4543656264111637842.tmp/IPAddress.cpp.o
Используем предварительно скомпилированный файл: /tmp/build4543656264111637842.tmp/WMath.cpp.o
Используем предварительно скомпилированный файл: /tmp/build4543656264111637842.tmp/WString.cpp.o
Используем предварительно скомпилированный файл: /tmp/build4543656264111637842.tmp/USBCore.cpp.o
Используем предварительно скомпилированный файл: /tmp/build4543656264111637842.tmp/abi.cpp.o
/home/arhat109/Рабочий стол/progs/arduino-1.6.4/hardware/tools/avr/bin/avr-g++ -c -g -Os -w -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -mmcu=atmega2560 -DF_CPU=16000000L -DARDUINO=10604 -DARDUINO_AVR_MEGA2560 -DARDUINO_ARCH_AVR -I/home/arhat109/Рабочий стол/progs/arduino-1.6.4/hardware/arduino/avr/cores/arduino -I/home/arhat109/Рабочий стол/progs/arduino-1.6.4/hardware/arduino/avr/variants/mega /home/arhat109/Рабочий стол/progs/arduino-1.6.4/hardware/arduino/avr/cores/arduino/main.cpp -o /tmp/build4543656264111637842.tmp/main.cpp.o
/home/arhat109/Рабочий стол/progs/arduino-1.6.4/hardware/tools/avr/bin/avr-g++ -c -g -Os -w -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -mmcu=atmega2560 -DF_CPU=16000000L -DARDUINO=10604 -DARDUINO_AVR_MEGA2560 -DARDUINO_ARCH_AVR -I/home/arhat109/Рабочий стол/progs/arduino-1.6.4/hardware/arduino/avr/cores/arduino -I/home/arhat109/Рабочий стол/progs/arduino-1.6.4/hardware/arduino/avr/variants/mega /home/arhat109/Рабочий стол/progs/arduino-1.6.4/hardware/arduino/avr/cores/arduino/HardwareSerial3.cpp -o /tmp/build4543656264111637842.tmp/HardwareSerial3.cpp.o
/home/arhat109/Рабочий стол/progs/arduino-1.6.4/hardware/tools/avr/bin/avr-g++ -c -g -Os -w -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -mmcu=atmega2560 -DF_CPU=16000000L -DARDUINO=10604 -DARDUINO_AVR_MEGA2560 -DARDUINO_ARCH_AVR -I/home/arhat109/Рабочий стол/progs/arduino-1.6.4/hardware/arduino/avr/cores/arduino -I/home/arhat109/Рабочий стол/progs/arduino-1.6.4/hardware/arduino/avr/variants/mega /home/arhat109/Рабочий стол/progs/arduino-1.6.4/hardware/arduino/avr/cores/arduino/Stream.cpp -o /tmp/build4543656264111637842.tmp/Stream.cpp.o
/home/arhat109/Рабочий стол/progs/arduino-1.6.4/hardware/tools/avr/bin/avr-g++ -c -g -Os -w -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -mmcu=atmega2560 -DF_CPU=16000000L -DARDUINO=10604 -DARDUINO_AVR_MEGA2560 -DARDUINO_ARCH_AVR -I/home/arhat109/Рабочий стол/progs/arduino-1.6.4/hardware/arduino/avr/cores/arduino -I/home/arhat109/Рабочий стол/progs/arduino-1.6.4/hardware/arduino/avr/variants/mega /home/arhat109/Рабочий стол/progs/arduino-1.6.4/hardware/arduino/avr/cores/arduino/CDC.cpp -o /tmp/build4543656264111637842.tmp/CDC.cpp.o
/home/arhat109/Рабочий стол/progs/arduino-1.6.4/hardware/tools/avr/bin/avr-g++ -c -g -Os -w -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -mmcu=atmega2560 -DF_CPU=16000000L -DARDUINO=10604 -DARDUINO_AVR_MEGA2560 -DARDUINO_ARCH_AVR -I/home/arhat109/Рабочий стол/progs/arduino-1.6.4/hardware/arduino/avr/cores/arduino -I/home/arhat109/Рабочий стол/progs/arduino-1.6.4/hardware/arduino/avr/variants/mega /home/arhat109/Рабочий стол/progs/arduino-1.6.4/hardware/arduino/avr/cores/arduino/HID.cpp -o /tmp/build4543656264111637842.tmp/HID.cpp.o
/home/arhat109/Рабочий стол/progs/arduino-1.6.4/hardware/tools/avr/bin/avr-g++ -c -g -Os -w -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -mmcu=atmega2560 -DF_CPU=16000000L -DARDUINO=10604 -DARDUINO_AVR_MEGA2560 -DARDUINO_ARCH_AVR -I/home/arhat109/Рабочий стол/progs/arduino-1.6.4/hardware/arduino/avr/cores/arduino -I/home/arhat109/Рабочий стол/progs/arduino-1.6.4/hardware/arduino/avr/variants/mega /home/arhat109/Рабочий стол/progs/arduino-1.6.4/hardware/arduino/avr/cores/arduino/HardwareSerial.cpp -o /tmp/build4543656264111637842.tmp/HardwareSerial.cpp.o
/home/arhat109/Рабочий стол/progs/arduino-1.6.4/hardware/tools/avr/bin/avr-g++ -c -g -Os -w -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -mmcu=atmega2560 -DF_CPU=16000000L -DARDUINO=10604 -DARDUINO_AVR_MEGA2560 -DARDUINO_ARCH_AVR -I/home/arhat109/Рабочий стол/progs/arduino-1.6.4/hardware/arduino/avr/cores/arduino -I/home/arhat109/Рабочий стол/progs/arduino-1.6.4/hardware/arduino/avr/variants/mega /home/arhat109/Рабочий стол/progs/arduino-1.6.4/hardware/arduino/avr/cores/arduino/new.cpp -o /tmp/build4543656264111637842.tmp/new.cpp.o
/home/arhat109/Рабочий стол/progs/arduino-1.6.4/hardware/tools/avr/bin/avr-g++ -c -g -Os -w -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -mmcu=atmega2560 -DF_CPU=16000000L -DARDUINO=10604 -DARDUINO_AVR_MEGA2560 -DARDUINO_ARCH_AVR -I/home/arhat109/Рабочий стол/progs/arduino-1.6.4/hardware/arduino/avr/cores/arduino -I/home/arhat109/Рабочий стол/progs/arduino-1.6.4/hardware/arduino/avr/variants/mega /home/arhat109/Рабочий стол/progs/arduino-1.6.4/hardware/arduino/avr/cores/arduino/Tone.cpp -o /tmp/build4543656264111637842.tmp/Tone.cpp.o
/home/arhat109/Рабочий стол/progs/arduino-1.6.4/hardware/tools/avr/bin/avr-ar rcs /tmp/build4543656264111637842.tmp/core.a /tmp/build4543656264111637842.tmp/wiring.c.o
/home/arhat109/Рабочий стол/progs/arduino-1.6.4/hardware/tools/avr/bin/avr-ar rcs /tmp/build4543656264111637842.tmp/core.a /tmp/build4543656264111637842.tmp/hooks.c.o
/home/arhat109/Рабочий стол/progs/arduino-1.6.4/hardware/tools/avr/bin/avr-ar rcs /tmp/build4543656264111637842.tmp/core.a /tmp/build4543656264111637842.tmp/wiring_analog.c.o
/home/arhat109/Рабочий стол/progs/arduino-1.6.4/hardware/tools/avr/bin/avr-ar rcs /tmp/build4543656264111637842.tmp/core.a /tmp/build4543656264111637842.tmp/wiring_shift.c.o
/home/arhat109/Рабочий стол/progs/arduino-1.6.4/hardware/tools/avr/bin/avr-ar rcs /tmp/build4543656264111637842.tmp/core.a /tmp/build4543656264111637842.tmp/WInterrupts.c.o
/home/arhat109/Рабочий стол/progs/arduino-1.6.4/hardware/tools/avr/bin/avr-ar rcs /tmp/build4543656264111637842.tmp/core.a /tmp/build4543656264111637842.tmp/wiring_pulse.c.o
/home/arhat109/Рабочий стол/progs/arduino-1.6.4/hardware/tools/avr/bin/avr-ar rcs /tmp/build4543656264111637842.tmp/core.a /tmp/build4543656264111637842.tmp/wiring_digital.c.o
/home/arhat109/Рабочий стол/progs/arduino-1.6.4/hardware/tools/avr/bin/avr-ar rcs /tmp/build4543656264111637842.tmp/core.a /tmp/build4543656264111637842.tmp/Print.cpp.o
/home/arhat109/Рабочий стол/progs/arduino-1.6.4/hardware/tools/avr/bin/avr-ar rcs /tmp/build4543656264111637842.tmp/core.a /tmp/build4543656264111637842.tmp/HardwareSerial1.cpp.o
/home/arhat109/Рабочий стол/progs/arduino-1.6.4/hardware/tools/avr/bin/avr-ar rcs /tmp/build4543656264111637842.tmp/core.a /tmp/build4543656264111637842.tmp/HardwareSerial0.cpp.o
/home/arhat109/Рабочий стол/progs/arduino-1.6.4/hardware/tools/avr/bin/avr-ar rcs /tmp/build4543656264111637842.tmp/core.a /tmp/build4543656264111637842.tmp/HardwareSerial2.cpp.o
/home/arhat109/Рабочий стол/progs/arduino-1.6.4/hardware/tools/avr/bin/avr-ar rcs /tmp/build4543656264111637842.tmp/core.a /tmp/build4543656264111637842.tmp/IPAddress.cpp.o
/home/arhat109/Рабочий стол/progs/arduino-1.6.4/hardware/tools/avr/bin/avr-ar rcs /tmp/build4543656264111637842.tmp/core.a /tmp/build4543656264111637842.tmp/WMath.cpp.o
/home/arhat109/Рабочий стол/progs/arduino-1.6.4/hardware/tools/avr/bin/avr-ar rcs /tmp/build4543656264111637842.tmp/core.a /tmp/build4543656264111637842.tmp/WString.cpp.o
/home/arhat109/Рабочий стол/progs/arduino-1.6.4/hardware/tools/avr/bin/avr-ar rcs /tmp/build4543656264111637842.tmp/core.a /tmp/build4543656264111637842.tmp/USBCore.cpp.o
/home/arhat109/Рабочий стол/progs/arduino-1.6.4/hardware/tools/avr/bin/avr-ar rcs /tmp/build4543656264111637842.tmp/core.a /tmp/build4543656264111637842.tmp/abi.cpp.o
/home/arhat109/Рабочий стол/progs/arduino-1.6.4/hardware/tools/avr/bin/avr-ar rcs /tmp/build4543656264111637842.tmp/core.a /tmp/build4543656264111637842.tmp/main.cpp.o
/home/arhat109/Рабочий стол/progs/arduino-1.6.4/hardware/tools/avr/bin/avr-ar rcs /tmp/build4543656264111637842.tmp/core.a /tmp/build4543656264111637842.tmp/HardwareSerial3.cpp.o
/home/arhat109/Рабочий стол/progs/arduino-1.6.4/hardware/tools/avr/bin/avr-ar rcs /tmp/build4543656264111637842.tmp/core.a /tmp/build4543656264111637842.tmp/Stream.cpp.o
/home/arhat109/Рабочий стол/progs/arduino-1.6.4/hardware/tools/avr/bin/avr-ar rcs /tmp/build4543656264111637842.tmp/core.a /tmp/build4543656264111637842.tmp/CDC.cpp.o
/home/arhat109/Рабочий стол/progs/arduino-1.6.4/hardware/tools/avr/bin/avr-ar rcs /tmp/build4543656264111637842.tmp/core.a /tmp/build4543656264111637842.tmp/HID.cpp.o
/home/arhat109/Рабочий стол/progs/arduino-1.6.4/hardware/tools/avr/bin/avr-ar rcs /tmp/build4543656264111637842.tmp/core.a /tmp/build4543656264111637842.tmp/HardwareSerial.cpp.o
/home/arhat109/Рабочий стол/progs/arduino-1.6.4/hardware/tools/avr/bin/avr-ar rcs /tmp/build4543656264111637842.tmp/core.a /tmp/build4543656264111637842.tmp/new.cpp.o
/home/arhat109/Рабочий стол/progs/arduino-1.6.4/hardware/tools/avr/bin/avr-ar rcs /tmp/build4543656264111637842.tmp/core.a /tmp/build4543656264111637842.tmp/Tone.cpp.o
/home/arhat109/Рабочий стол/progs/arduino-1.6.4/hardware/tools/avr/bin/avr-gcc -w -Os -Wl,--gc-sections,--relax -mmcu=atmega2560 -o /tmp/build4543656264111637842.tmp/Blink.cpp.elf /tmp/build4543656264111637842.tmp/Blink.cpp.o /tmp/build4543656264111637842.tmp/Arhat/tsc.c.o /tmp/build4543656264111637842.tmp/Arhat/arhat.c.o /tmp/build4543656264111637842.tmp/core.a -L/tmp/build4543656264111637842.tmp -lm
/home/arhat109/Рабочий стол/progs/arduino-1.6.4/hardware/tools/avr/bin/avr-objcopy -O ihex -j .eeprom --set-section-flags=.eeprom=alloc,load --no-change-warnings --change-section-lma .eeprom=0 /tmp/build4543656264111637842.tmp/Blink.cpp.elf /tmp/build4543656264111637842.tmp/Blink.cpp.eep
/home/arhat109/Рабочий стол/progs/arduino-1.6.4/hardware/tools/avr/bin/avr-objcopy -O ihex -R .eeprom /tmp/build4543656264111637842.tmp/Blink.cpp.elf /tmp/build4543656264111637842.tmp/Blink.cpp.hex
Multiple libraries were found for "arhat.h"
Used: /home/arhat109/Рабочий стол/Arduino/libraries/Arhat
Not used: /home/arhat109/Рабочий стол/Arduino/libraries/Arhat-my
Sketch uses 502 bytes (0%) of program storage space. Maximum is 253 952 bytes.
Global variables use 4 bytes (0%) of dynamic memory, leaving 8 188 bytes for local variables. Maximum is 8 192 bytes.
в версии 1,5,2 вот такое выдает
Это вообще не могу понять что такое .. в либе нет подпапки utility, которая у вас подключается тут каким-то боком .. это точно моя библиотека? Рассказывайте что как и откуда брали. :)
Судя по выводу компилятор почему-то 4 раза скомпилял один и тот же кусок кода .. показывайте что компиляете где и что у вас лежит ..
Побочный эффект от последней проверки: версия под Линукс ИДЕ 1.6.4 НЕ требует переименования wiring.c Компиляется и с родным без криков о том что прерывание таймера переопределено дважды: один раз __vector_23_ определен в файле wiring.c, а второй раз в файле arhat.c у меня.
ну вот IDE 1.6.4 wiring.c непереименовывал надо? библиотека в папке с остальными библиотеками среды ардуино ссылка на либу http://cyber-place.ru/attachment.php?attachmentid=3137&d=1444764175
Судя по выводу лога, строка 46 - wiring.c у вас скомпилялся вполне нормально без отключений, точно также как и уменя. Тоже версия 1.6.4, но под Линукс. До 67-й строки включительно - все идет как надо. Все файлы и мои и wiring скомпилялись без ошибок и проблем. А вот дальше у Вас идет работа сборщика библиотеки avr-ar и вот тут у нас есть серъезное расхождение, у меня он собирает библиотеку core.a вот такой примерно строкой:
/home/arhat109/Рабочий стол/progs/arduino-1.6.4/hardware/tools/avr/bin/avr-ar rcs /tmp/build6111881327712571984.tmp/core.a /tmp/build6111881327712571984.tmp/Stream.cpp.o
Обратите внимание, что после параметра rcs идет полный путь до файла с будущей библиотекой тра-ля-ля/core.a , а у Вас стоит некая подстановка в фигурных скобках .. такое ощущение, что у Вас на винде что-то не настроено в ИДЕ.
Какой лог выдается у вас в 1.6.4. при компиляции обычного Blink.ino из примеров ИДЕ?
блин дома снес и поставил заново тоже самое и теперь еще и стандартный блин неработает попробовал на работе 1,6,4. Получилось правда тоже несразу писал что невидит библиотеку потом пошло. Наверно надо дома винду сносить гдето что в винде нето.
на работе 1,5,2 тоже незаработала
На 1,6,5 пошло но несразу сначала писало что нет либы в деректории поменял на другую плату настройки компельнул и обратна на мегу тогда скомпилилось
.. 2 недели. Неужели ни у кого не нашлось этих 2-х недель с 2006-го года?!? .. это так и осталось непонятным.
Не понимаю, что Вам непонятно. Это не было сделано потому, что никому не нужно. Не было спроса - не было предложения.
Те ктов состоянии переписать код с асемблерными вставками для ускорения тому проще сразу использовать серьезную среду разработки авр студию или IAR AVR ну или тотже codevision avr. А с интузиастами готовыми работать для когото просто так у нас туго.
По поводу версии 1.5.2 ничего не могу сказать, у меня её нет. Впрочем как и винды.
Обратите внимание что повторно определенные метки .skip1 и .shift1 в файле arhat.c встречаются ровно 1 раз. Первая только на строке 170. А у вас компилятор определяет повторно объявление меток аж 4 раза и в ДРУГИХ строках кода .. каким способом у вас клонируется код при компиляции?
каким способом у вас клонируется код при компиляции?
Я ненастолько разбираюсь в настройках компилятора можно подробней об этом
Смотрите ваш вывод для версии 1.5.2 в #21:
Строка 02: указывает что для компиляции файла arhat.c используется (автоподключаются) файлы из каталога
-ID:\Program Files\arduino-1.5.2\libraries\Arhat\utility
Но у меня в библиотеке НЕТ такого каталога! Что у вас в нем лежит и есть ли он вообще? Откуда берется эта опция компилятору - мне не понятно совсем. Если такого каталога у вас нет, то в целом ни к чему и не приведет.
Ну и соответственно сам вывод об ошибках: ассемблер утверждает, что в коде, полученном из arhat.c произошло дублирование определения меток переходов .skip1 и .shift1 .. в исходном файле первая определена 1 раз в строке 170, а вторая тоже 1 раз в строке 174. Можете открыть файл и поиском их найти там. Но, ассемблер утверждает, что он обнаружил ЕЩЁ определения этих символов в строках 258,306,385,433 и 261,309,388,436 .. то есть этот кол у него оказался повторен ещё 4 раза .. вот мне и интересно КАК этого удалось добиться?
К сожалению, я тоже не понимаю что происходит у вас в этой версии ИДЕ и посмотреть у себя не имею возможности. Судя по логам, у вас нарушена структура папок, есть какие-то дополнительные действия над файлами до компиляции и возможно происходит "что-то ещё", судя по ненастроенным переменным окружения и среды из вчерашних логов.
Может у кого есть винда и он видит подобные сообщения сможет объяснить что происходит на вашей машине, я вот - не могу, ибо проверять нечем. Но у меня сильно большое подозрение на винду и установку на ней .. сообщений об ошибках в библиотеке у вас нет ни в одном логе. Это - факт.
P.S. Там, в либе, есть файлики с описанием как устанавливать и какая структура каталогов и какие файлы в них должны оказаться .. сравните что у вас установилось с описанием.
такой папки у меня нет на работе в 1,6,4 скомпилилось как писал ранее наверно придется винду переставлять дома на ноуте
Ну .. по моим экспериментам с разными версиями ИДЕ, мне больше всех приглянулась именно 1.6.4. :)
Выложил на гитхаб файл "распальцовки" для процессора 328P. Это скорее всего для разного рода Arduino UNO r3.
Судя по даташиту, должно также работать на процах 48P, 88P 168P. На всякий случай разрешил подключение этого файла для всего набора процов из этого даташита.
Но не проверял, ибо мне "без надобности" пока.
Дополнительно:
1. Добавлена функция delayMicroseconds(), а также варианты макросов "стыренные" из avr-glibc и переименованные удобства для: delayMicro8() и delayMicro16().
2. В блок автоматного программирования добавлена функция tsc_microStep() способная обрабатывать табличные конечные автоматы с микросекундными задержками (в разумных пределах).
3. Возвращены "режимы" компиляции либы. Если написать так:
То переименования типовых функций в мои макроподстановки не произойдет и будут вызываться типовые функции из wiring. В т.ч. появится функция pulseIn() отсутсвующая у меня "за ненадобностью" - есть замер длительностей по прерываниям PCINT2 по любой из 8 ног Меги: Analog8 .. 15.
Всё что закоммичено потихоньку проверяется. :)
На гитхаб выложил частично проверенный trunk для Ардуино на базе процессоров ATmega328P, ATmega168P, ATmega88P, ATmega48P. Тестировал на своей Arduino UNO примеры: Blink.ino, TestTimer0.ino, TSC_Blink.ino - работают.
Для ATmega1280,2560 (должно работать и для ATmega328P):
1. доделана обработка прерываний PCINT0 и PCINT2 на всех доступных ножках. Уровень прерывания PCINT1 реализован только для 328P. Переработка в части расширения функций измерения. Они выделены в отдельные методы и теперь можно измерять как длительность импульса по прерываниям (аналог pulseIn() ), так и вести подсчет импульсов по фронту/спаду или фронт и спад одновременно.
2. Расширена автоматная часть на предмет создания таблично-управляемых автоматов с микросекундными задержками. Понадобилось для программного управления скоростью моторов через программный ШИМ.
3. По настоятельным просьбам, добавлен режим совместимости с Wiring. Теперь можно писать так:
В этом режиме подключается стандартный Arduino.h и его обработчик прерываний __vector_23(), также НЕ производится замена типовых функций на макросы - разные digitalWrite() будут вызываться из Wiring, что конечно же увеличивает скетчи до оригинального размера. Макросы библиотеки и все её функции остаются по-прежнему доступны по своим оригинальным названиям.
Если ARHAT_MODE не указан или равен 2, то компилируется в "автономном" режиме без подключения Wiring. К сожалению, wiring.c в этом случае переименовывать надо по-прежнему.
Не требуется переименование, только в случае когда Адруино ИДЕ установлена БЕЗ инсталяции на компьютер и на нем нет инсталлированной ИДЕ никакой версии: распаковка дистрибутива и прямой запуск arduino.sh без каких-либо apt-get install под Линукс. В этом случае, ИДЕ похоже использует другие настройки линковщика. Под Убунту в болтливом режиме ИДЕ видно, что исходные файлы wiring вытаскиваются из дистрибутива (куда поставлено), а не из /usr/share/arduino.. вот если из шары - то придется переименовывать.
Все "особенности" применения относятся к версии 1.6.4. На остальных - не проверял.
Спасибо всем, кто <sensored> поддержал разработку (таковые есть :)).
Добавил в примеры код для датчика температуры и влажности DHT22. Код переработан из вот этого обсуждения:
http://arduino.ru/forum/programmirovanie/attiny13a-101-primenenie?page=1..., пост #726.
По результатам обсуждения тут http://arduino.ru/forum/programmirovanie/etyudy-dlya-nachinayushchikh-metronom-ne-zagruzhaya-taimer
Добавил в обработчик прерывания таймера хук для вызова из под него дополнительных методов.
Особенно сти применения:
1. Теперь можно указать в скетче так:
2. Функция вызывается при очередном срабатывания таймера и крайне желательно её делать как можно короче;
3. Вызов производится при ОТКРЫТЫХ прерываниях, что позволяет отрабатывать таймеру правильно, даже если функция долгая;
4. Если Функция долгая, то ее дальнейшие повторные вызовы БЛОКИРУЮТСЯ до возврата из предыдущего. То есть пока не завершится вызов - последующих вызовов (рекурсии) не будет;
5. Размер стандартного Blink.ino в автономном режиме теперь 568 байт (добавилось 66 байт в обработчик прерывания).
По указанном ссылке есть класс, который можно приспособить для работы и тут тоже.
Пасибки, всем кто пишет про баги, хоть и не тут, все одно, спасибо. Красяво попало... :)
Поправил ошибку препроцессорных инклудов при определении типа процессоров. На гитхабе - исправлено.
Теперь одинаково компиляются:
1. ATmega640, ATmega1280 и Atmega2560 - как один набор макросов и определений; Тут удален проц ATmega2561 в силу меньшего числа PWM, ADC, USART.
2. ATmega48P, ATmega88P, ATmega168P, ATmega328P - тоже теперь компиляются как "стандартный" набор UNO, ProMini и др. с частотой проца 16Мгц.
На выделенных жирным имею возможность тестировать проблемы.
скачал обновление попробовал на меге2560 компилится на раз в 1,6,4 а вот на 328 и 168 проблемы зависает
Да, и будет зависать. У вас ЦПУ указано как mmcu=Atmega168 . Надо чтобы процессор был версии "P", если из этой серии: Atmega328p, Atmega168p, Atmega88p, Atmega48p
Как раз последнее сообщение на киберлибе. По этому поводу и подправлял все. Зависает - посмотрю почто. Должно было сразу сказать что "не тот процессор".
Я понял так что те, которые с буквой "р" - на 5 вольт и 16Мгц. А те которые без буквы - только на 8 Мгц . Библиотека позволяет конечно перенастройку на произвольную частоту .. но я ещё этим не занимался из-за отсутствия железок для проверки.
В планах есть мысли по включению в либу интерфейсов SPI, I2C, U(S)ART и замена типового Serial на что-то покомпактнее. Надо кому?
В планах есть мысли по включению в либу интерфейсов SPI, I2C, U(S)ART и замена типового Serial на что-то покомпактнее. Надо кому?
надо, надо :)
Ок. поставил на очередь: сначала I2C (аппаратно-программный), потом USART, потом Serial с прицелом под I2C тоже (на LCD писать) и под занавес SPI с Sd-картами .. :)
Пофиксил баг, влезший по факту добавления таймерного хука. Заодно расширил тест таймера проверкой работы хука в случае "длинной функции": последний этап теста - моргание 13 пином с периодом 2сек и инвертированием двумя "вспышками" из процедуры хука. Процедура хука вызывается из под прерывания таймера и спокойно себе висит в delay() примерно по 0.2сек, что нисколько не мешает отрабатывать прерыванию таймера и считать время.
Моя "особая благодарность" участнику форума "ЕвгенийП", который с неделю назад заметил эту ошибку, но умолчал про неё.
P.S. практически можно делать RTOS..
"ЕвгенийП", который с неделю назад заметил эту ошибку, но умолчал про неё.
Вы меня с кем-то спутали. Отродясь я этой ошибки не замечал :)
Я не злопамятный, просто память с контролем на четность. Потерли похоже .. ну да ладно, в общем-то "пофиг".
В любом случае, теперь можно делать полноценную многозадачность и RTOS, а не кооперативку гонять автоматным программированием. Ушел вспоминать адские примитивы по межзадачному взаимодействию.. :)
Я не злопамятный, просто память с контролем на четность.
Хреновый у Вас контроль.
Никто ничего не тёр. Единственное сообщение в котором я говорил об ошибках в Вашей библиотеке вполне живо, только там не говорится какая именно ошибка. Я имел в виду совсем другую. Вы сами почему-то придумали, что речь шла об этой - это Ваши тараканы. а не мои.
<sensored>. В любом случае - спасибо.
<sensored: не актуально в связи с вышележащей правкой>
Обновил репозиторий. Изменения:
1. Убрана неправильная константа согласно ЕвгенийП пересчета миллисекунд в тики таймера. Она и не была в целом нужна, вот чтобы не вводить в соблазн заюзать вещественную арифметику без надобности и убрал;
2. Добавлен файлик работы с датчиками цвета TCS3200, пример выложу чуть попозже .. там ничего сложного нет:
смотрим на состояние КА датчика и если tcsColor == TCS_NOCOLOR то замер действителен и можно пользоваться значениями из массива tcsColors[].
Функция tcsSetup() теперь втыкает обработчик датчика tcsRun() непосредственно в таймерный обработчик и замеры проводятся кратно 1024мксек, независимо от занятости проца.
Работу обработчика можно настраивать "на лету" устанавливая битовые маски режимов в глобале tcsModes;
Добавлен ускоренный режим "только черно-белое" для замера только яркостного канала (мне нужен был аналог датчика линии).
3. Допилен хук в обработчике таймера и он теперь позволяет выполнять процедуры по таймеру произвольной сложности, не останавливая подсчет времени таймером и вообще не запрещая прерываний. Применять с осторожностью, поскольку все "отложенное барахло" копится на общем стеке. В целом, на этой базе можно продолжить развитие RTOS.
4. Исправлена ошибка настройки регистров счетчиков из макросов PWM, для Arduino UNO и всех остальных на базе распальцовок arhat_pins328p.h
На очереди интерфейс I2C, поскольку у нас теперь активно подключен дисплей LCD1602 и надо как-то компактно и шустро выводить на него диагностику.. таки дошли ручки. :)
Пока из него есть режим master до частот 1Мгц.. допилю - выложу.
Подчистил ещё чуть-чуть, выделил датчик DHT22 из примера, но ещё даже не компилял и добавил команды чтения/записи EEPROM от DeGlucker.
Внимание! Проект переехал на новый адрес в гитхаб: https://github.com/dimanus/ARHAT_H
В связи с чем обновил тему и исправил тут пост №10.
Описание проекта постепенно пополняется.
Внимание! Проект подвергается документированию, вывод справки снизу проекта (README.md) и глобальному рефакторингу и тестированию для создания "версии". Пока привожу эту ветку на гитхаб в порядок, в дальнейшем это будет "ПРОДАКШН", а все текущие изменения делаться в отдельных ветках.
Возможны различные глюки .. поскольку работу веду с 3-х разных мест урывками и промежуточные коммиты делаются на Гитхаб.
<sernsored>