Страница 2 из 2
ШИМ на любой порт, создать пользовательский блок
Добавлено: 06 мар 2017, 22:17
tolikaka
Вот в таком варианте компилится с одной оговоркой, при открытии в Arduino IDE приходится ручками убирать пробел в сгенерированном коде
#define CHECK(pwms, port, pin) asm volatile( "cpc %0, %1 \n\t" \
*****вот этот пробел*****
"brlo 0f \n\t" \
"cbi %2, %3 \n\t" \
"rjmp 1f \n\t" \
"0: sbi %2, %3 \n\t" \
"1: nop \n\t" \
: "+r"(pwm), "+r" (pwms) \
: "I" (_SFR_IO_ADDR(port)), "I" (pin)\
)\
Блок пока работает на один раз вставить в проект.Для множественной вставки нужно библиотеку мудрить с классом, а для этого нужно от defaine избавляться.
Насчет убрать пробел, надо еще синтаксис ассемблера поштудировать.
Уход от define PIN привел к утяжелению кода с 360 байт до 1300байт.
Неизвестно еще, что со скоростью работы.Буду еще осцилом тестить на правдоподобность. А так, диодик нормально по яркости реагирует на изменение скважности
ШИМ на любой порт, создать пользовательский блок
Добавлено: 12 мар 2017, 16:42
Naladchik
tolikaka, если интерес сохранился то проверьте мой вариант. Заменил связки #ifdef #endif на if() {}.
Активность/неактивность нужного пина выбирается в параметрах пользователя, значение подается на требуемый вход.
У себя на Uno, на выходе D13, проверял, все компилируется и работает.
ШИМ на любой порт, создать пользовательский блок
Добавлено: 12 мар 2017, 17:58
AVGN
Naladchik, какая частота ШИМ ? Менять можно?
ШИМ на любой порт, создать пользовательский блок
Добавлено: 12 мар 2017, 18:13
Naladchik
AVGN писал(а):Naladchik, какая частота ШИМ ? Менять можно?
В "Параметры пользователя" параметр - prescaler. А вот в каких пределах частота ШИМ меняется не знаю.
Сам блок особо не тестировал, просто слегка переиначил исходный код и загнал его в блок.
Обсуждение исходного кода по ссылке первого поста.
ШИМ на любой порт, создать пользовательский блок
Добавлено: 12 мар 2017, 18:52
AVGN
Naladchik писал(а):В "Параметры пользователя" параметр - prescaler. А вот в каких пределах частота ШИМ меняется не знаю.Сам блок особо не тестировал, просто слегка переиначил исходный код и загнал его в блок.
Обсуждение исходного кода по ссылке первого поста.
Спасибо.
Обсуждение языка Ардуино для меня тёмный лес.
Как выеду с заимки доберусь до осциллографа по тестирую Ваш блок на досуге.
ШИМ на любой порт, создать пользовательский блок
Добавлено: 13 мар 2017, 00:02
tolikaka
Naladchik писал(а):если интерес сохранился
Сохранился) Спасибо за внимание к проблеме и за свое видение решения.
К сожалению не все так просто.. Мы не ищем легких путей ) Вся соль в асмовых вставках (пост№10). Идет борьба за производительность. Пока со всем этим разбирался, все больше и больше возросла уверенность в том, что без defaine из-за asm вставки не обойтись. И дефайнить задействуемые пины придется каждый раз ручками под конкретный проект, чтобы всем задействованным пинам попасть внутрь одного вектора прерывания и с одной частотой. Это все становится важным при задействовании более одного пина.
И спасибо большое за define CHECK в одну строчку. Сам пытался, и каждый раз упускал из виду / в предпоследней строчке.
Добавлено (13.03.2017, 00:02)
---------------------------------------------
AVGN писал(а):какая частота ШИМ ? Менять можно?
Скачайте и посмотрите скетч из поста№7. Я постарался все там расписать поподробнее
ШИМ на любой порт, создать пользовательский блок
Добавлено: 13 мар 2017, 20:11
Naladchik
tolikaka писал(а):...без defaine из-за asm вставки не обойтись
какая связь между define и asm? или без каких define не обойтись?
tolikaka писал(а):дефайнить задействуемые пины ... ручками под конкретный проект
можно и так, а зачем?
tolikaka писал(а):всем задействованным пинам попасть внутрь одного вектора прерывания
ну так они и так все там, все обрабатываются одновременно, по вызову функции ISR, т.е. по прерыванию TIMER2.
Вся разница между исходным и моим вариантом в том, что при конечном компилировании исходного варианта не компилируются те участки кода (ifdef endif), для которых через define не объявлены используемые пины. В моем варианте компилируется весь код целиком, но в работе участвуют только те участки, для которых выполняется проверка на активность выбранных пинов.
Не исключено что такой вариант будет работать медленнее, надо тестировать.
ШИМ на любой порт, создать пользовательский блок
Добавлено: 13 мар 2017, 20:58
tolikaka
Naladchik писал(а):Не исключено что такой вариант будет работать медленнее, надо тестировать.
По ссылке в 10ом посту как раз все человек и просчитал по тактам, миллисекундам в различных вариантах
или без каких define не обойтись?
не получается обойтись без define в asm вставке когда идет речь подставить заданное пользователем значение в операнд "I" (port) директивы sbi.
Чтобы записать вместо : "I" (_SFR_IO_ADDR(PORTD)), : "I" (_SFR_IO_ADDR(значение выбранное пользователем), чтобы из кода сделать в конечном счете библиотеку или хотя бы класс
Пока получилось вот так
inline void SBI()
{
asm volatile ("sbi %0, %1" :: "I" (port), "I" (pin));
}
а вот с этим куском пока не компилится
asm volatile( \
"cpc %0, %1 \n\t" \
"brlo 0f \n\t" \
"cbi %2, %3 \n\t" \
"rjmp 1f \n\t" \
"0: sbi %2, %3 \n\t" \
"1: nop \n\t" \
: "+r" (pwm), "+r" (pwms[5]) \
: "I" (_SFR_IO_ADDR(PORTD)), "I" (5)\
);
ШИМ на любой порт, создать пользовательский блок
Добавлено: 13 мар 2017, 21:20
tolikaka
Naladchik писал(а):В моем варианте компилируется весь код целиком, но в работе участвуют только те участки, для которых выполняется проверка на активность выбранных пинов.
Давайте попробуем представить, как будет выглядеть Плата в Проекте который должен будет управлять семисегментным шестиразрядным ЖКИ с использованием Вашего варианта блока. При условии, что управление ЖКИ должно происходить по прилагаемой схеме.
Сигналы COM остаются неизменными относительно друг-друга и относительно всех SEG а вот SEG0 и SeG1 для каждого из шести разрядов постоянно изменяются в зависимости от отображаемого символа.Частота смены изображения одного символа в диапазоне 30-10Гц, при этом, в этом же проекте есть обработка сигнала датчика скорости, частоты вращения двигателя, парочки аналогвых сигналов, обращение к памяти и отслеживание нажатий 2х кнопок.
Тут же прилагаю свое текущее видение решения такой задачи.Было сделано на основе штатных ШИМ пинов, после чего проект забуксовал, так как 3 ий пин не захотел ШИМ выдавать для управления SEG. COMы заработали прекрасно и с управлением и назначением пинов noname индикатора с помощью кода из моего проекта вроде правильно разобрался.Не хватает пока только правильных уровней в нужное время на нужных пинах.