ШИМ на любой порт, создать пользовательский блок
ШИМ на любой порт, создать пользовательский блок
Вот в таком варианте компилится с одной оговоркой, при открытии в 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байт.
Неизвестно еще, что со скоростью работы.Буду еще осцилом тестить на правдоподобность. А так, диодик нормально по яркости реагирует на изменение скважности
#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 раз.
век живи -век учись
-
- Капитан
- Сообщения: 908
- Зарегистрирован: 04 окт 2015, 19:10
- Откуда: Новосибирск
- Имя: Павел
- Благодарил (а): 20 раз
- Поблагодарили: 22 раза
ШИМ на любой порт, создать пользовательский блок
tolikaka, если интерес сохранился то проверьте мой вариант. Заменил связки #ifdef #endif на if() {}.
Активность/неактивность нужного пина выбирается в параметрах пользователя, значение подается на требуемый вход.
У себя на Uno, на выходе D13, проверял, все компилируется и работает.
Активность/неактивность нужного пина выбирается в параметрах пользователя, значение подается на требуемый вход.
У себя на Uno, на выходе D13, проверял, все компилируется и работает.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось Naladchik 12 мар 2017, 17:53, всего редактировалось 1 раз.
ШИМ на любой порт, создать пользовательский блок
Naladchik, какая частота ШИМ ? Менять можно?
Если вы не можете объяснить это просто – значит, вы сами не понимаете этого до конца.
☆Альберт Эйнштейн
☆Альберт Эйнштейн
-
- Капитан
- Сообщения: 908
- Зарегистрирован: 04 окт 2015, 19:10
- Откуда: Новосибирск
- Имя: Павел
- Благодарил (а): 20 раз
- Поблагодарили: 22 раза
ШИМ на любой порт, создать пользовательский блок
В "Параметры пользователя" параметр - prescaler. А вот в каких пределах частота ШИМ меняется не знаю.AVGN писал(а):Naladchik, какая частота ШИМ ? Менять можно?
Сам блок особо не тестировал, просто слегка переиначил исходный код и загнал его в блок.
Обсуждение исходного кода по ссылке первого поста.
Последний раз редактировалось Naladchik 12 мар 2017, 18:20, всего редактировалось 1 раз.
ШИМ на любой порт, создать пользовательский блок
Спасибо.Naladchik писал(а):В "Параметры пользователя" параметр - prescaler. А вот в каких пределах частота ШИМ меняется не знаю.Сам блок особо не тестировал, просто слегка переиначил исходный код и загнал его в блок.
Обсуждение исходного кода по ссылке первого поста.
Обсуждение языка Ардуино для меня тёмный лес.
Как выеду с заимки доберусь до осциллографа по тестирую Ваш блок на досуге.
Если вы не можете объяснить это просто – значит, вы сами не понимаете этого до конца.
☆Альберт Эйнштейн
☆Альберт Эйнштейн
ШИМ на любой порт, создать пользовательский блок
Сохранился) Спасибо за внимание к проблеме и за свое видение решения.Naladchik писал(а):если интерес сохранился
К сожалению не все так просто.. Мы не ищем легких путей ) Вся соль в асмовых вставках (пост№10). Идет борьба за производительность. Пока со всем этим разбирался, все больше и больше возросла уверенность в том, что без defaine из-за asm вставки не обойтись. И дефайнить задействуемые пины придется каждый раз ручками под конкретный проект, чтобы всем задействованным пинам попасть внутрь одного вектора прерывания и с одной частотой. Это все становится важным при задействовании более одного пина.
И спасибо большое за define CHECK в одну строчку. Сам пытался, и каждый раз упускал из виду / в предпоследней строчке.
Добавлено (13.03.2017, 00:02)
---------------------------------------------
Скачайте и посмотрите скетч из поста№7. Я постарался все там расписать поподробнееAVGN писал(а):какая частота ШИМ ? Менять можно?
Последний раз редактировалось tolikaka 12 мар 2017, 23:56, всего редактировалось 1 раз.
век живи -век учись
-
- Капитан
- Сообщения: 908
- Зарегистрирован: 04 окт 2015, 19:10
- Откуда: Новосибирск
- Имя: Павел
- Благодарил (а): 20 раз
- Поблагодарили: 22 раза
ШИМ на любой порт, создать пользовательский блок
какая связь между define и asm? или без каких define не обойтись?tolikaka писал(а):...без defaine из-за asm вставки не обойтись
можно и так, а зачем?tolikaka писал(а):дефайнить задействуемые пины ... ручками под конкретный проект
ну так они и так все там, все обрабатываются одновременно, по вызову функции ISR, т.е. по прерыванию TIMER2.tolikaka писал(а):всем задействованным пинам попасть внутрь одного вектора прерывания
Вся разница между исходным и моим вариантом в том, что при конечном компилировании исходного варианта не компилируются те участки кода (ifdef endif), для которых через define не объявлены используемые пины. В моем варианте компилируется весь код целиком, но в работе участвуют только те участки, для которых выполняется проверка на активность выбранных пинов.
Не исключено что такой вариант будет работать медленнее, надо тестировать.
ШИМ на любой порт, создать пользовательский блок
По ссылке в 10ом посту как раз все человек и просчитал по тактам, миллисекундам в различных вариантахNaladchik писал(а):Не исключено что такой вариант будет работать медленнее, надо тестировать.
не получается обойтись без define в asm вставке когда идет речь подставить заданное пользователем значение в операнд "I" (port) директивы sbi.или без каких define не обойтись?
Чтобы записать вместо : "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)\
);
век живи -век учись
ШИМ на любой порт, создать пользовательский блок
Давайте попробуем представить, как будет выглядеть Плата в Проекте который должен будет управлять семисегментным шестиразрядным ЖКИ с использованием Вашего варианта блока. При условии, что управление ЖКИ должно происходить по прилагаемой схеме.Naladchik писал(а):В моем варианте компилируется весь код целиком, но в работе участвуют только те участки, для которых выполняется проверка на активность выбранных пинов.
Сигналы COM остаются неизменными относительно друг-друга и относительно всех SEG а вот SEG0 и SeG1 для каждого из шести разрядов постоянно изменяются в зависимости от отображаемого символа.Частота смены изображения одного символа в диапазоне 30-10Гц, при этом, в этом же проекте есть обработка сигнала датчика скорости, частоты вращения двигателя, парочки аналогвых сигналов, обращение к памяти и отслеживание нажатий 2х кнопок.
Тут же прилагаю свое текущее видение решения такой задачи.Было сделано на основе штатных ШИМ пинов, после чего проект забуксовал, так как 3 ий пин не захотел ШИМ выдавать для управления SEG. COMы заработали прекрасно и с управлением и назначением пинов noname индикатора с помощью кода из моего проекта вроде правильно разобрался.Не хватает пока только правильных уровней в нужное время на нужных пинах.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось tolikaka 13 мар 2017, 21:33, всего редактировалось 1 раз.
век живи -век учись
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя