ШИМ на любой порт, создать пользовательский блок

На этом форуме Вы можете задать вопросы знатокам программы и автору.
tolikaka
Рядовой
Сообщения: 23
Зарегистрирован: 18.10.2016{, 20:53}
Репутация: 0
Откуда: Ташкент
Имя: Анатолий

ШИМ на любой порт, создать пользовательский блок

#21

Сообщение tolikaka » 06.03.2017{, 22:17}

Вот в таком варианте компилится с одной оговоркой, при открытии в 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байт.
Неизвестно еще, что со скоростью работы.Буду еще осцилом тестить на правдоподобность. А так, диодик нормально по яркости реагирует на изменение скважности
Вложения
PWManyPort-CODE.ubi
(41.81 КБ) 42 скачивания
Последний раз редактировалось tolikaka 06.03.2017{, 22:35}, всего редактировалось 1 раз.
век живи -век учись

Naladchik
Капитан
Сообщения: 823
Зарегистрирован: 04.10.2015{, 19:10}
Репутация: 153
Откуда: Новосибирск
Имя: Павел

ШИМ на любой порт, создать пользовательский блок

#22

Сообщение Naladchik » 12.03.2017{, 16:42}

tolikaka, если интерес сохранился то проверьте мой вариант. Заменил связки #ifdef  #endif  на if() {}.
Активность/неактивность нужного пина выбирается в параметрах пользователя, значение подается на требуемый вход.
У себя на Uno, на выходе D13, проверял, все компилируется и работает.
Вложения
PWM-CODE-.ubi
(123.29 КБ) 58 скачиваний
Последний раз редактировалось Naladchik 12.03.2017{, 17:53}, всего редактировалось 1 раз.
Win10-64. FLProg Portable.
Изображение

Аватара пользователя
AVGN
Капитан
Сообщения: 727
Зарегистрирован: 03.02.2017{, 12:23}
Репутация: 56

ШИМ на любой порт, создать пользовательский блок

#23

Сообщение AVGN » 12.03.2017{, 17:58}

Naladchik, какая частота ШИМ ? Менять можно?
Если вы не можете объяснить это просто – значит, вы сами не понимаете этого до конца.
☆Альберт Эйнштейн

Naladchik
Капитан
Сообщения: 823
Зарегистрирован: 04.10.2015{, 19:10}
Репутация: 153
Откуда: Новосибирск
Имя: Павел

ШИМ на любой порт, создать пользовательский блок

#24

Сообщение Naladchik » 12.03.2017{, 18:13}

AVGN писал(а):Naladchik, какая частота ШИМ ? Менять можно?
В "Параметры пользователя" параметр - prescaler. А вот в каких пределах частота ШИМ меняется не знаю.
Сам блок особо не тестировал, просто слегка переиначил исходный код и загнал его в блок.
Обсуждение исходного кода по ссылке первого поста.
Последний раз редактировалось Naladchik 12.03.2017{, 18:20}, всего редактировалось 1 раз.
Win10-64. FLProg Portable.
Изображение

Аватара пользователя
AVGN
Капитан
Сообщения: 727
Зарегистрирован: 03.02.2017{, 12:23}
Репутация: 56

ШИМ на любой порт, создать пользовательский блок

#25

Сообщение AVGN » 12.03.2017{, 18:52}

Naladchik писал(а):В "Параметры пользователя" параметр - prescaler. А вот в каких пределах частота ШИМ меняется не знаю.Сам блок особо не тестировал, просто слегка переиначил исходный код и загнал его в блок.
Обсуждение исходного кода по ссылке первого поста.
Спасибо.
Обсуждение языка Ардуино для меня тёмный лес.
Как выеду с заимки доберусь до осциллографа по тестирую Ваш блок на досуге.
Если вы не можете объяснить это просто – значит, вы сами не понимаете этого до конца.
☆Альберт Эйнштейн

tolikaka
Рядовой
Сообщения: 23
Зарегистрирован: 18.10.2016{, 20:53}
Репутация: 0
Откуда: Ташкент
Имя: Анатолий

ШИМ на любой порт, создать пользовательский блок

#26

Сообщение tolikaka » 13.03.2017{, 00:02}

Naladchik писал(а):если интерес сохранился
  Сохранился) Спасибо за внимание к проблеме и за свое видение решения.
К сожалению не все так просто.. Мы не ищем легких путей ) Вся соль в асмовых вставках (пост№10). Идет борьба за производительность. Пока со всем этим разбирался, все больше и больше возросла уверенность в том, что без defaine из-за asm вставки не обойтись. И дефайнить задействуемые пины придется каждый раз ручками под конкретный проект, чтобы всем задействованным пинам попасть внутрь одного вектора прерывания и с одной частотой. Это все становится важным при задействовании более одного пина.
И спасибо большое за define CHECK в одну строчку. Сам пытался, и каждый раз упускал из виду / в предпоследней строчке.

Добавлено (13.03.2017, 00:02)
---------------------------------------------
AVGN писал(а):какая частота ШИМ ? Менять можно?
Скачайте и посмотрите скетч из поста№7. Я постарался все там расписать поподробнее
Последний раз редактировалось tolikaka 12.03.2017{, 23:56}, всего редактировалось 1 раз.
век живи -век учись

Naladchik
Капитан
Сообщения: 823
Зарегистрирован: 04.10.2015{, 19:10}
Репутация: 153
Откуда: Новосибирск
Имя: Павел

ШИМ на любой порт, создать пользовательский блок

#27

Сообщение Naladchik » 13.03.2017{, 20:11}

tolikaka писал(а):...без defaine из-за asm вставки не обойтись
какая связь между define и asm? или без каких define не обойтись?
tolikaka писал(а):дефайнить задействуемые пины ... ручками под конкретный проект
можно и так, а зачем?
tolikaka писал(а):всем задействованным пинам попасть внутрь одного вектора прерывания
ну так они и так все там, все обрабатываются одновременно, по вызову функции ISR, т.е. по прерыванию TIMER2.
Вся разница между исходным и моим вариантом в том, что при конечном компилировании исходного варианта не компилируются те участки кода (ifdef endif), для которых через define не объявлены используемые пины. В моем варианте компилируется весь код целиком, но в работе участвуют только те участки, для которых выполняется проверка на активность выбранных пинов.
Не исключено что такой вариант будет работать медленнее, надо тестировать.
Win10-64. FLProg Portable.
Изображение

tolikaka
Рядовой
Сообщения: 23
Зарегистрирован: 18.10.2016{, 20:53}
Репутация: 0
Откуда: Ташкент
Имя: Анатолий

ШИМ на любой порт, создать пользовательский блок

#28

Сообщение tolikaka » 13.03.2017{, 20:58}

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)\
   );
век живи -век учись

tolikaka
Рядовой
Сообщения: 23
Зарегистрирован: 18.10.2016{, 20:53}
Репутация: 0
Откуда: Ташкент
Имя: Анатолий

ШИМ на любой порт, создать пользовательский блок

#29

Сообщение tolikaka » 13.03.2017{, 21:20}

Naladchik писал(а):В моем варианте компилируется весь код целиком, но в работе участвуют только те участки, для которых выполняется проверка на активность выбранных пинов.
Давайте попробуем  представить, как будет выглядеть Плата в Проекте который должен будет управлять семисегментным шестиразрядным ЖКИ с использованием Вашего варианта блока. При условии, что управление ЖКИ должно происходить по прилагаемой схеме.
Сигналы COM остаются неизменными относительно друг-друга и относительно всех SEG а вот SEG0 и SeG1 для каждого из шести разрядов постоянно изменяются в зависимости от отображаемого символа.Частота смены изображения одного символа в диапазоне 30-10Гц, при этом, в этом же проекте есть обработка сигнала датчика скорости, частоты вращения двигателя, парочки аналогвых сигналов, обращение к памяти и отслеживание нажатий 2х кнопок.

    
   Тут же прилагаю свое текущее видение решения такой задачи.Было сделано на основе штатных ШИМ пинов, после чего проект забуксовал, так как 3 ий пин не захотел ШИМ выдавать  для управления SEG. COMы заработали прекрасно и с управлением и назначением пинов noname индикатора с помощью кода из моего проекта вроде правильно разобрался.Не хватает пока только правильных уровней в нужное время на нужных пинах.
Вложения
6922348.png
9988242.png
Последний раз редактировалось tolikaka 13.03.2017{, 21:33}, всего редактировалось 1 раз.
век живи -век учись

Ответить

Вернуться в «Спросить у знатоков»