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

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

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

Сообщение 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байт.
Неизвестно еще, что со скоростью работы.Буду еще осцилом тестить на правдоподобность. А так, диодик нормально по яркости реагирует на изменение скважности
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось tolikaka 06 мар 2017, 22:35, всего редактировалось 1 раз.
век живи -век учись
Naladchik
Капитан
Сообщения: 908
Зарегистрирован: 04 окт 2015, 19:10
Откуда: Новосибирск
Имя: Павел
Благодарил (а): 20 раз
Поблагодарили: 22 раза

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

Сообщение Naladchik »

tolikaka, если интерес сохранился то проверьте мой вариант. Заменил связки #ifdef  #endif  на if() {}.
Активность/неактивность нужного пина выбирается в параметрах пользователя, значение подается на требуемый вход.
У себя на Uno, на выходе D13, проверял, все компилируется и работает.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось Naladchik 12 мар 2017, 17:53, всего редактировалось 1 раз.
Win10-64. FLProg Portable.
Изображение
Аватара пользователя
AVGN
Капитан
Сообщения: 727
Зарегистрирован: 03 фев 2017, 12:23

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

Сообщение AVGN »

Naladchik, какая частота ШИМ ? Менять можно?
Если вы не можете объяснить это просто – значит, вы сами не понимаете этого до конца.
☆Альберт Эйнштейн
Naladchik
Капитан
Сообщения: 908
Зарегистрирован: 04 окт 2015, 19:10
Откуда: Новосибирск
Имя: Павел
Благодарил (а): 20 раз
Поблагодарили: 22 раза

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

Сообщение Naladchik »

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

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

Сообщение AVGN »

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

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

Сообщение tolikaka »

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

Добавлено (13.03.2017, 00:02)
---------------------------------------------
AVGN писал(а):какая частота ШИМ ? Менять можно?
Скачайте и посмотрите скетч из поста№7. Я постарался все там расписать поподробнее
Последний раз редактировалось tolikaka 12 мар 2017, 23:56, всего редактировалось 1 раз.
век живи -век учись
Naladchik
Капитан
Сообщения: 908
Зарегистрирован: 04 окт 2015, 19:10
Откуда: Новосибирск
Имя: Павел
Благодарил (а): 20 раз
Поблагодарили: 22 раза

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

Сообщение Naladchik »

tolikaka писал(а):...без defaine из-за asm вставки не обойтись
какая связь между define и asm? или без каких define не обойтись?
tolikaka писал(а):дефайнить задействуемые пины ... ручками под конкретный проект
можно и так, а зачем?
tolikaka писал(а):всем задействованным пинам попасть внутрь одного вектора прерывания
ну так они и так все там, все обрабатываются одновременно, по вызову функции ISR, т.е. по прерыванию TIMER2.
Вся разница между исходным и моим вариантом в том, что при конечном компилировании исходного варианта не компилируются те участки кода (ifdef endif), для которых через define не объявлены используемые пины. В моем варианте компилируется весь код целиком, но в работе участвуют только те участки, для которых выполняется проверка на активность выбранных пинов.
Не исключено что такой вариант будет работать медленнее, надо тестировать.
Win10-64. FLProg Portable.
Изображение
tolikaka
Рядовой
Сообщения: 23
Зарегистрирован: 18 окт 2016, 20:53
Откуда: Ташкент
Имя: Анатолий

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

Сообщение 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)\
   );
век живи -век учись
tolikaka
Рядовой
Сообщения: 23
Зарегистрирован: 18 окт 2016, 20:53
Откуда: Ташкент
Имя: Анатолий

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

Сообщение tolikaka »

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

    
   Тут же прилагаю свое текущее видение решения такой задачи.Было сделано на основе штатных ШИМ пинов, после чего проект забуксовал, так как 3 ий пин не захотел ШИМ выдавать  для управления SEG. COMы заработали прекрасно и с управлением и назначением пинов noname индикатора с помощью кода из моего проекта вроде правильно разобрался.Не хватает пока только правильных уровней в нужное время на нужных пинах.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось tolikaka 13 мар 2017, 21:33, всего редактировалось 1 раз.
век живи -век учись
Ответить

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

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя