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

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

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

#1

Сообщение tolikaka » 25.02.2017{, 23:30}

Здравствуйте, уважаемые пользователи FLProg!
Прошу вашей помощи в создании пользовательского блока по теме вот этой статьи
http://arduino.ru/forum/programmirovani ... bom-vyvode  пост№30.
Пытаюсь запустить семисегментный 6ти разрядный ЖКИ. Всего нужно 17 ШИМ выходов. Самому не хватает знаний. (автодиагност, программирование - хобби на досуге)
В течении недели пытался разобраться с заковыками приложенного там кода и ждал ответа автора на просьбу выложить код в виде готовой библиотеки. К сожалению безрезультатно.
Думал, что для большой самостоятельности и универсальности создаваемого блока, define двух макросов с асмовыми вставками нужно переделать на объявление inline функций и все загнать в один класс и создать свою библиотеку, которую и можно будет указать в  пользовательском блоке с минимальным вводом данных и прочего кода. Помогите пожалуйста разобраться или подтолкните в нужное направление.
С уважением, Анатолий.

P.S. На приложенный кривой блок, просьба сильно не ругаться)) Неделю разбирался с управлением ЖКИ, а потом еще неделю с деталями этого кода. Голова вот-вот лопнет.
Вложения
PWMtoanyPort-CO.ubi
(30.5 КБ) 41 скачивание
Последний раз редактировалось tolikaka 27.02.2017{, 00:39}, всего редактировалось 1 раз.
век живи -век учись

Nikito$
Рядовой
Сообщения: 74
Зарегистрирован: 15.12.2016{, 22:04}
Репутация: 0
Откуда: Екатеринбург

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

#2

Сообщение Nikito$ » 26.02.2017{, 09:46}

tolikaka писал(а):Пытаюсь запустить семисегментный 6ти разрядный ЖКИ. Всего нужно 17 ШИМ выходов. Самому не хватает знаний. (автодиагност, программирование - хобби на досуге)
Так есть же библиотека под это дело https://github.com/bhagman/SoftPWM там можно на любой выход ШИМ вешать, также есть специальные микросхемы расширения ШИМ выходов, тапа tlc5940  А, что за  6ти разрядный ЖКИ??? Как называется???
Последний раз редактировалось Nikito$ 26.02.2017{, 09:49}, всего редактировалось 1 раз.

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

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

#3

Сообщение tolikaka » 26.02.2017{, 19:03}

Nikito$ писал(а):А, что за  6ти разрядный ЖКИ??? Как называется???
Индикатор одометра Noname  управляемый в родной схеме pic16f914
схема включения 1/4multiplex 1/3 bias
Добавляется дополнительный функционал по отображению доп данных кроме одометра с задачей минимальных аппаратных переделок для встраивания в родной корпус
   Спасибо за наводку.Сейчас погляжу, подойдет ли это мне.

Добавлено (26.02.2017, 19:03)
---------------------------------------------
Nikito$ писал(а):Так есть же библиотека под это дело https://github.com/bhagman/SoftPWM там можно на любой выход ШИМ
  Насколько понял то с этой библиотекой 
"More math and sensor reading will increase the "off time" of PWM....."

Так что этот вариант мне наверное не подойдет. Мне еще двумя шаговыми моторчиками от стрелок управлять, данные сохранять/вызывать по пробегу, обрабатывать сигналы оборотов, скорости, температуры, длительности импульса впрыска. 
А в том варианте кода, что пытался разобрать я, уменьшается частота в зависимости от увеличения количества задействованных выводов. И для моего случая это приемлемо. 
  Так что продолжается прием советов и подсказок.
век живи -век учись

Nikito$
Рядовой
Сообщения: 74
Зарегистрирован: 15.12.2016{, 22:04}
Репутация: 0
Откуда: Екатеринбург

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

#4

Сообщение Nikito$ » 26.02.2017{, 19:45}

tolikaka писал(а):Так что этот вариант мне наверное не подойдет.
Ну... тогда микросхема расширений шим нужна tlc5940 или её подобные..... Или лучше adruino mega или due

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

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

#5

Сообщение tolikaka » 26.02.2017{, 23:38}

Если честно, то больше хочется разобраться с самим кодом до конца. И разобраться с созданием блока пользователя.
    Может подскажите, если в Declare  я напишу
#define PIN_PINnumber то будет ли это приравнено при сборке скетча к #define PIN_6
если учесть что PINnumber это параметр пользователя (установленный в 6 для примера)
и если да, то какой правильный синтаксис такого объявления?
Ведь насколько я понял, для Си #define PIN_PINnumber является директивой объявления макроса
PIN_PINnumber с пустым token-string, а если записать #define PIN_(PINnumber) то это будет просто набором идентификаторов.
  Получается, что у меня нет возможности через параметры пользователя задать нужный мне порт в секции Declare. Может есть какая то возможность обхода этого момента?
К примеру через inline функцию объявления во вкладке Setup? Я просто реально новичок в Си и каждые, для меня не понятные, запятые и скобки в каждой строке, это часы проходов по форумам Си,Си++,Ардуинщиков.
Для начала хотя бы с этим кто подсказал. В принципе остальное как бы понятно более или менее. Единственное под вопросом, так это куда вставить ISR(TIMER2_COMPA_vect)?
Напрямую в loop со всеми внутренностями или в loop только объявить, предварительно записав функцию на соответствующей вкладке редактора блока пользователя?
Эх, минутку бы внимания от создателя FLProg. В справке и уроках не нашел ответов на свои вопросы.
Последний раз редактировалось tolikaka 26.02.2017{, 23:43}, всего редактировалось 1 раз.
век живи -век учись

Anydy

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

#6

Сообщение Anydy » 27.02.2017{, 20:29}

tolikaka писал(а):Может подскажите, если в Declare я напишу#define PIN_PINnumber то будет ли это приравнено при сборке скетча к #define PIN_6
Так а проверить не судьба? Я проверил за вас.
#define in
void setup()
{
}
void loop()
{
}
Упс сорри такая конструкция тут не работает

Вот так пробуйте

#include <SoftwareSerial.h>

bool En;
SoftwareSerial mySerial(2, 3);
void setup()
{
}
void loop()
{
En = 1;
if (En == 1) {
mySerial.println (6);
mySerial.println (6);
mySerial.println ("Vse OK");
}
}
Вложения
tst-CODE-.ubi
(14.15 КБ) 42 скачивания
Последний раз редактировалось Anydy 27.02.2017{, 21:37}, всего редактировалось 1 раз.

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

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

#7

Сообщение tolikaka » 05.03.2017{, 19:35}

Anydy писал(а):Вот так пробуйте#include <SoftwareSerial.h>

bool En;
SoftwareSerial mySerial(2, 3);
void setup()
{
}
void loop()
{
En = 1;
if (En == 1) {
mySerial.println (6);
mySerial.println (6);
mySerial.println ("Vse OK");
}
}
 Не понял Вас, как это может мне помочь? Немного поподробнее ход Ваших мыслей, если не затруднит.
Что именно не понял:
- #include ить мне нечего ( об этом и тема, прошу помочь из кода по ссылке в первом посту собрать библиотеку)
- в Вашем примере нет define переменной, определение ее значения перенесено в loop, а в моем коде Пин дэфайниться в секции Declare, и там же уже происходит подстановка этого значения в другой макрос, который подставляется  в функции которые тоже объявлены до setup и loop (да еще и не простые а с асмовыми вставками и их наличие для меня принципиально, из-за распределения процессорного времени).
- попробовал перевести два макроса с асмовыми вставками на inline, чтобы для начала хотя бы создать не библиотеку а свой class, но не тут то было. Внутри вставки как бы все замечательно по типам раскладывается "I", в совокупности с операторами и самими defaine, которому плевать на типы, а при попытке вывести в inline начинается конфликт типов. Может быть есть какие-то приемы обхода определения типов, это просто не мой уровень владения языком.

Добавлено (05.03.2017, 19:31)
---------------------------------------------
Расписал код из ссылки в первом сообщении.
Думаю многим начинающим будут полезны коменты
Смог избавиться от одного define, от второго пока не получается.

Буду пытаться сделать из того что есть Class и библиотеку. Все еще требуется помощь и подсказки знатоков.


Добавлено (05.03.2017, 19:35)
---------------------------------------------

Вложения
MYshim5.ino
(13.31 КБ) 45 скачиваний
Последний раз редактировалось tolikaka 05.03.2017{, 19:45}, всего редактировалось 1 раз.
век живи -век учись

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

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

#8

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

Пытаюсь вставить код из скетча по разделам в пользовательский блок.
Вроде делаю все как в уроке по созданию блока, но все равно внизу Блок некорректен и при
вставке и задании значений в блоке, при попытке проверить проект , так же пишет что блок не корректен.
  Сам скетч в Arduino IDE компилится без проблем.
Вложения
6851749.ubi
(30.5 КБ) 44 скачивания
Последний раз редактировалось tolikaka 05.03.2017{, 20:23}, всего редактировалось 1 раз.
век живи -век учись

Аватара пользователя
Boroda
Капитан
Сообщения: 836
Зарегистрирован: 01.05.2016{, 01:04}
Репутация: 38
Откуда: Коломна
Имя: Станислав
Контактная информация:

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

#9

Сообщение Boroda » 05.03.2017{, 20:36}

tolikaka, думаю тут вставки Ассемблера мешают, программа их не понимает и дает ошибку. Спросите Сергея (автора FLProg) в личке, может подскажет что.

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

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

#10

Сообщение tolikaka » 05.03.2017{, 20:49}

---------------------------------------------
думаю тут вставки Ассемблера мешают,
Честно говоря, мне тоже так кажется. Писал обоим Сергеям и ЛС и на почту, с просьбой обратить внимание.Пока (1 неделя) ответа не получил.
А это ответ на вопрос "Зачем asm вставки использовать?"
https://habrahabr.ru/post/308662/
http://tronixstuff.com/2011/10/22/tutor ... ipulation/
Последний раз редактировалось tolikaka 05.03.2017{, 20:51}, всего редактировалось 1 раз.
век живи -век учись

Аватара пользователя
Boroda
Капитан
Сообщения: 836
Зарегистрирован: 01.05.2016{, 01:04}
Репутация: 38
Откуда: Коломна
Имя: Станислав
Контактная информация:

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

#11

Сообщение Boroda » 05.03.2017{, 20:55}

tolikaka, читать долго, но предполагаю, что для работы напрямую с портами ввода/вывода, потому как стандартными командами IDE очень долго все происходит. DigtalWrite на один выход примерно 4мкс, а напрямую (при 16МГц тактовой) примерно 0,06мкс и в добавок можно весь порт записать или прочитать.

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

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

#12

Сообщение tolikaka » 05.03.2017{, 21:03}

Все верно.Именно скорость мне и была нужна в моем проекте.
По ссылкам там все расписано с просчетом в сравнении по количеству тактов на выполнение.
Так хочется блок сделать, а потом на основе этого блока еще и отдельный блок управления семисегментными ЖКИ. 
Это ж, с таким блоком, в доступность для творчества попадают все варианты дисплеев от старых калькуляторов, часов, тестеров и т.д., которые, зачастую, просто выкидываются на мусорку, если корпус или кнопки сломались в устройстве
век живи -век учись

Аватара пользователя
Boroda
Капитан
Сообщения: 836
Зарегистрирован: 01.05.2016{, 01:04}
Репутация: 38
Откуда: Коломна
Имя: Станислав
Контактная информация:

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

#13

Сообщение Boroda » 05.03.2017{, 21:12}

Мне вроде удалось избавиться от ошибки:
1. поставил пин "значение по умолчанию"
2. перенес прерывание от таймера в раздел функций

Дальше при компиляции IDE не может определить параметры для этого макроса:
#define CHECK(pwms,_265498000_1 port, pin)

Думаю, разберетесь.
Вложения
8739261.ubi
(39.56 КБ) 42 скачивания

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

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

#14

Сообщение tolikaka » 05.03.2017{, 21:14}

Спасибо Вам большое за помощь!!
Сейчас попробую.Только вот новую версию проги скачаю и установлю, а то с этими разборками по асму упустил из виду обновление.
Последний раз редактировалось tolikaka 05.03.2017{, 21:16}, всего редактировалось 1 раз.
век живи -век учись

Аватара пользователя
Boroda
Капитан
Сообщения: 836
Зарегистрирован: 01.05.2016{, 01:04}
Репутация: 38
Откуда: Коломна
Имя: Станислав
Контактная информация:

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

#15

Сообщение Boroda » 05.03.2017{, 21:21}

Поставил галочку "использовать блок один раз". В этом случае FLprog все переменные оставляет как есть, не добавляя индивидуальные идентификаторы.

Понеслись ошибки дальше в АСМ вставке: "+r"(pwm), "+r" (pwms).\

Главное, что код в IDE попадает, а там уже додумаете.
Последний раз редактировалось Boroda 05.03.2017{, 21:24}, всего редактировалось 1 раз.

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

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

#16

Сообщение tolikaka » 05.03.2017{, 21:25}

Boroda писал(а):Дальше при компиляции IDE не может определить параметры для этого макроса:#define CHECK(pwms,_265498000_1 port, pin)
Я это наверное предвидел.) Пытался избавится от define.
Вижу пока только один выход - в тело вектора прерывания вписать 20 раз асм вставку через if для проверки условия, но там еще одна проблема может нарисовываться, как уже мной проверенно.При подстановке в формальную переменную port значения PORTC или C или B ругается что я пользуюсь инструкцией компилятора в качестве значения переменной.

Добавлено (05.03.2017, 21:25)
---------------------------------------------
Boroda писал(а):Поставил галочку "использовать блок один раз". В этом случае IDE FLprog все переменные оставляет как есть.
Поэтому я и хотел сначала хотя бы Класс создать, а еще лучше библиотеку, чтобы потом в проекте можно было плодить экземпляры без ошибки. Но, юн я и соплив еще в программировании :), но стараюсь, по мере возможностей.
век живи -век учись

Аватара пользователя
Boroda
Капитан
Сообщения: 836
Зарегистрирован: 01.05.2016{, 01:04}
Репутация: 38
Откуда: Коломна
Имя: Станислав
Контактная информация:

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

#17

Сообщение Boroda » 05.03.2017{, 21:29}

Ну я в СИ и Atmel не силен, в основном PIC-контроллеры програмлю, так что тут я не помощник, дерзайте!

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

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

#18

Сообщение tolikaka » 05.03.2017{, 21:48}

Boroda, а Вы с блоком из 8го поста попробовали или из 1го?
век живи -век учись

Аватара пользователя
Boroda
Капитан
Сообщения: 836
Зарегистрирован: 01.05.2016{, 01:04}
Репутация: 38
Откуда: Коломна
Имя: Станислав
Контактная информация:

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

#19

Сообщение Boroda » 05.03.2017{, 21:55}

Из восьмого.

Добавлено (05.03.2017, 21:55)
---------------------------------------------
Они вроде одинаковые.

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

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

#20

Сообщение tolikaka » 05.03.2017{, 22:02}

Вот этот посмотрите пожалуйста. Только старый удалите пожалуйста.
Но я так понял, что немного не привел его в нужный вид.Просто раскидал код из скетча по секциям
Вложения
toanyPort-CODE-.ubi
(39.58 КБ) 49 скачиваний
век живи -век учись

Ответить

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