09.04.2016, 20:53 | #81 | |
Junior Member
Регистрация: 04.12.2015
Сообщений: 14
Вес репутации: 0 |
Re: Ускоряем и улучшаем скетчи. Ещё одна библиотека.
Arhat109, возникла у меня тут такая идея: почему бы не использовать таймер0
в режиме самозагрузки при совпадении с OCR0A, т.е. в OCR0A записываем 250, прерывание переназначаем на COMPA и получаем чистую миллисекунду и возможность делать другой квант времени (мне понадобилось 500 мксек). Для эксперимента я поменял в arhat.h TIME_ISR на COMPA, а в setup(): Цитата:
Не могли бы Вы сделать версию библиотеки с таким режимом таймера, а то я совсем запутался в макросах и дефейнах. Еще одна идея - в ISR сохранение контекста сделать через дефейн, например нужно только выдать в порт импульс, используется только R24, его и сохранять/восстанавливать в HookProc. Спасибо за TWI, библиотекой SPI я уже давно не пользуюсь, но там все просто. |
|
10.04.2016, 15:49 | #82 |
Senior Member
Регистрация: 14.06.2015
Адрес: СССР
Сообщений: 122
Вес репутации: 0 |
Re: Ускоряем и улучшаем скетчи. Ещё одна библиотека.
Посмотрю, макросы там есть смысл пользовать только те, которые в "public" разделе. Остальные - просто плата за возможность управлять номером контакта платы, а не "порт-бит". Вроде как прорисовываются идеи как сделать возможность хранения пина в переменной и снять ограничение на "только #define".. хотя - не знаю зачем оно .. мне так и не понадобилось ещё ни разу.
2. По таймерам: смотря какая плата у вас в использовании .. как понимаю, 0 таймер - "исторически сложилось и я подхватил" .. можно перетащить на любой, и даже перетаскивать от компиляции к компиляции .. и даже менять его "частоту", а не только получать время по 4мксек. Для Мега2560 .. сейчас, я бы предпочел 1-й таймер. У него нет входа ICP, и регистр ничем не занят и занят быть в общем-то и не может.. но, это для Меги2560.. у вас, как понимаю 168-я и там несколько иные ограничения .. уже думалось перевести время на watchdog таймер .. но пока руки не доходили. Ограничивать 0 таймер через OCRA не есть "комильфо" .. Вы сразу зарубаете ШИМ на одной из ножек .. вот ICP режим таймера 1 .. |
13.04.2016, 07:33 | #83 |
Senior Member
Регистрация: 14.06.2015
Адрес: СССР
Сообщений: 122
Вес репутации: 0 |
Re: Ускоряем и улучшаем скетчи. Ещё одна библиотека.
Обновил гитхаб, убрал хук по дефолту. Теперь, чтобы его включить - надо изменить режим компиляции файла arhat.c на 3.
Пооптимизировал I2C мастера - наверное это всё, что можно из него выжать силами С, не прибегая к ассемблеру. В целом, ассемблерная оптимизация существенно ничего не улучшит, макс 10-15% по размеру кода, что уже несущественно. Интересно, режим Master-Receiver -- рабочий или нет? Для его запуска функцию twiRead() надо дополнить установкой хука twiMasterReader на функцию без параметров, которая будет реагировать на окончание сеанса приема данных. Она - предполагается персональной для конкретного скетча и может проверять twiState -- последний статус TWI, по которому завершен прием. Тут можно реагировать на разные состояния типа "Мастера затнули, надо подождать и продолжить". В ней же можно определять весь ли буфер заполнен приемом и делать его переустановку. Данные принимаются в буфер twiRX_Ptr и остаток, сколько ещё не принято в twiRX_Count. Этот счетчик при нормальном завершении приема будет установлен в 0. При вызове twiRead() указатель на буфер устанавливается в его начало и количество ожидаемых байт передается в счетчик приема данных .. вот в процедуре хука twiMasterReader() и можно отслеживать что принято, как принято и что делать дальше. |
18.04.2016, 21:21 | #84 |
Junior Member
Регистрация: 04.12.2015
Сообщений: 14
Вес репутации: 0 |
Re: Ускоряем и улучшаем скетчи. Ещё одна библиотека.
Спасибо. У меня в данном случае задача довольно специфичная: формировать довольно сожную временную диаграмму по прерываниям с частотой 2 КГц.
ШИМ на таймере 0 не используется, то что миллисекунды в 2 раза короче я знаю, зато все синхронною По дефолту OCR0A = 249, а в скетче ставлю 124. |
19.04.2016, 06:57 | #85 |
Senior Member
Регистрация: 14.06.2015
Адрес: СССР
Сообщений: 122
Вес репутации: 0 |
Re: Ускоряем и улучшаем скетчи. Ещё одна библиотека.
Можно поступить так, как Вы поступили, а именно в setup() прописать переопределение работы счетчика. Но, правильнее переопределить константы таймера согласованно для этого прескалера. Сейчас не помню, вечером посмотрю чтои куда надо переназначить .. там есть комменты со всеми значениями для того или иного прескалера. Тогда функция time_micros() скомпилируется верно и будет отдавать время в микросекундах.
|
19.04.2016, 08:51 | #86 |
Senior Member
Регистрация: 14.06.2015
Адрес: СССР
Сообщений: 122
Вес репутации: 0 |
Re: Ускоряем и улучшаем скетчи. Ещё одна библиотека.
Появилось маленько времени.. вот смотрите, блок в arhat.h определяющий настройки системного времени:
Код:
#ifndef TIME_DEFAULT /* all defaults for F_CPU=16Mhz ONLY! */ #define TIME_DEFAULT 0 #define TIME_MAX_COUNTER 256 /* max conter+1 */ #define TIME_PRESCALLER 64 #define TIME_MODE 3 /* WGM10 = 1, WGM00 = 1 fast-PWM mode for timer0 */ #define TIME_TICK_MCS 4 /* 1 tick by prescaler:[0.25, 0.5, 4, 16, 64] in microseconds */ #define TIME_SHIFT 2 /* From prescaller: 1=>4, 8=>1, 64=>2, 256=>4, 1024=>6 */ #define TIME_MCS2MS 1024/1000 /* ==[16,128,1024,4096,16384]/1000 by prescaler */ #define TIME_ISR OVF /* what interrupt name using for this timer */ #endif Выставляем "свой" прескалер, скажем 8 (частота счета 2Мгц), сооьтветственно теперь 1 тик TIME_TICK_MCS равен 0.5 и размер сдвига для пересчета в микросекунды TIME_SHIFT будет равен 1 ну и константа пересчета TIME_MCS2MS будет равна 128/1000. Собственно и все. Поскольку там стоит проверка определен ли TIME_DEFAULT, то вполне можно весь блок переопределения поставить ПЕРЕД инклудом этого файла в файле arhat.c и системное время должно считаться верно и опять же в микросекундах. Единственное, что надо просмотреть и перепроверить по коду arhat.h и arhat.c - это корректное использование константы TIME_MCS2MS - оно не должно заключаться в отдельные скобки и слева иметь какой-то множитель. Иначе деление таких целых чисел приведет к округлению ещё на стадии препроцессора и получите .. нуль вместо вычислений. Вот этот момент - непомню, надо смотреть. |
19.04.2016, 08:56 | #87 |
Senior Member
Регистрация: 14.06.2015
Адрес: СССР
Сообщений: 122
Вес репутации: 0 |
Re: Ускоряем и улучшаем скетчи. Ещё одна библиотека.
Да, посмотрел .. нет там никаких "граблей", акромя того что величина сдвига запихивается в регистр константой в строке 107 файла arhat.c .. поправлю на препроцессор. Пока менять ручками.
|
21.04.2016, 07:38 | #88 |
Senior Member
Регистрация: 14.06.2015
Адрес: СССР
Сообщений: 122
Вес репутации: 0 |
Re: Ускоряем и улучшаем скетчи. Ещё одна библиотека.
Внимание!
Посмотрел версию ИДЕ 1.6.8. В целом компилируется, но генерит много предупреждений по переименованию макрокоманд и пр. Обнаружил, что в ИДЕ произошли изменения по подготовке скетчей к компиляции. Теперь строка #include "Arduino.h" вставляется в скетч первой строкой ПРИНУДИТЕЛЬНО, что и приводит к многочисленным Warning компилятора. Можно выключить в опциях настройки ИДЕ, но не приятный момент. В связи с этим интересно мнение тех, кто использует эту библиотеку: Насколько будет полезным приложить к библиотеке небольшой bat-файл по запуску компилятора и сборке готового скетча и заливки его в микроконтроллер БЕЗ использования оболочки? Надо? Просьба отписаться здесь. |
21.04.2016, 10:04 | #89 |
Senior Member
Регистрация: 14.06.2015
Адрес: СССР
Сообщений: 122
Вес репутации: 0 |
Re: Ускоряем и улучшаем скетчи. Ещё одна библиотека.
Внимание! проект на гитнаб переехал на адрес: https://github.com/dimanus/ARHAT_H
первый пост темы - изменен тоже. |
27.04.2016, 15:26 | #90 |
Senior Member
Регистрация: 14.06.2015
Адрес: СССР
Сообщений: 122
Вес репутации: 0 |
Re: Ускоряем и улучшаем скетчи. Ещё одна библиотека.
На гитхабе начал выкладывать краткое описание функций, макросов и структур данных по группам устройств и работы с ними.
Замечания пожелания можно сюда или в личку или там же на гитхабе. |
Метки |
arduino mega 2560, скетч, ардуино |
Здесь присутствуют: 6 (пользователей: 0 , гостей: 6) | |
|
|