Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ШИМ
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Страницы: 1, 2
SasaVitebsk
Кстати сам СИ скомпилит не очень плохо. У меня сейчас правда несколько отличная задача. В смысле ШИМ то построен также но список состояний строго ограничен. В связи с этим я всё делаю прямо в прерываниях. То есть управление двигателями размазываю по всем прерываниям. Включая разгон/торможение/управление скоростью/ подход к заданному значению. Поэтому п/п у меня несколько раздуты. Ну и конкест соответственно великоват. Но сам вывод портов - вполне адекватен.

Код
     69           // Вывод предварительно расчитанных значений портов
     70           PORTE = bOport[1].E;
   \   0000002C   ....               LDI     R26, LOW(bOport)
   \   0000002E   ....               LDI     R27, (bOport) >> 8
   \   00000030   01FD               MOVW    R31:R30, R27:R26
   \   00000032   8103               LDD     R16, Z+3
   \   00000034   B90E               OUT     0x0E, R16
     71           PORTA = bOport[1].A;
   \   00000036   8104               LDD     R16, Z+4
   \   00000038   B902               OUT     0x02, R16
     72           PORTC = bOport[1].C;
   \   0000003A   8105               LDD     R16, Z+5
   \   0000003C   B908               OUT     0x08, R16
=GM=
Цитата(singlskv @ Oct 15 2007, 20:13) *
3(джиттер при попадании прерывания на 4 тактовую команду) + 4(вход в прерывание) +4*2(LD) + 4*1(OUT) + 4(RETI) + 4(максимальное количество тактов до начала следующего прерывания) = 27 тактов однако...

Ну, во-первых, у меня одно и двухтактные команды в фоне, четырёхтактных нет вообще, во-вторых, джиттер считать не надо, поскольку на следующем прерывании будет такой же случайный джиттер. Матожидание там равно нуло, стало быть вклад джиттера будет нулевым.

В первом приближении вы правы, общее количество тактов = 4(сохранение программного счётчика в стеке) + 2(прыжок из вектора прерывания, это вы забыли, но можно опустить) + 12(тело программы) + 4(reti) + 1/2(выполнение одной команды) = 24 такта максимум. Я эту программу привёл просто как иллюстрацию Саше Витебскому, я такую не использую. С ходу могу её улучшить тактов на 5, поставив sei перед последней командой out, а вот почему так, подумайте на досуге, неплохая шарада перед сном(:-).

В принципе, Rst7 (мой респект!) привёл фрагмент, практически один в один совпадающий с одной из моих ранних штатных программ, там допускается 13 тактов между двумя последовательными обновлениями портов. Раз разговор зашёл о количестве тактов и о максимальных частотах, сообщаю вам, на сегодняшний день я довёл частоту шим до 11 кГц, и пока на этом успокоился(:-).
SasaVitebsk
Я думаю некоторым это пригодится. Когда-то на заре появления МК тоже любил побаловаться "вылизыванием до такта". Теперь считаю это не перспективным.

Это я безусловно, не в пику вам говорю. Это так размышления у парадного подъезда электроники. Всё это уже многократно обсуждалось, но если подытожить то выглядит так:

1) Производительность процов продолжает расти семимильными шагами. Появились доступные DSP процы и многоядерные процы.
2) Стоимость кремния и процов снизились до стоимости мусора. Так где-то в 90 году стоимость однокристалки 8751 доходила до 350 рублей (читай $). Сейчас как известно стоимость опустилась до 1$ при более чем 20 кратном росте производительности.
3) Реальная стоимость $ в 90 году была несопоставима с его нынешней стоимостью.
4) Стоимость памяти упала ещё более значительно. В 93 году стоимость 1мб ОЗУ ~ 30$
==============
Подытоживая - Вы можете использовать очень мощные камни и при этом очень длинные проги писать и массу озу использовать и при этом конечная стоимость изделия вполне будет по карману рядовому покупателю.

С другой стороны запросы растут. Требуются всё более умные вещи. Потребность в программах и программистах - растёт (В том числе и за счёт перекладывания большого числа ф-ий которые раньше делались аппаратно). Время написания проекта и его изготовления - катастрофически уменьшается. Всё меньше людей хотят купить проект - всё большее готовое рабочее изделие.

Поэтому, на мой взгляд роль языков высокого уровня будет расти. Колличество программных инструментов - тоже. Применение ОС будет если не повсеместным, то распространённым явлением. Программы будут писаться наотмашь. То есть примерно такой подход, который развивается на компах. Где даже я сейчас конфигурационные файлы в текстовом виде делаю. А реестр винды будет занимать не один десяток мегов.
smile.gif sad.gif

Ну а из приятных моментов - применение красивых и интересных алгоритмов приветствуется на любом языке. То есть полученные знания всегда с вами и никуда не денутся. smile.gif
add
SasaVitebsk, Вы так все хорошо подытожили.. прям даже не хотелось больше вопросов задавать :-)
Цитата(=GM= @ Oct 15 2007, 17:49) *
Ну, если по-честному, то я здесь свой алгоритм и не выставлял, немудрено его не понять. ..

Значит мое предположение посте №48 оказалось верным. :-) Еще один мАААлюсенький вопросик, ну для полного блаженства :-).. Вот например если мы работаем с массивом постоянно меняющихся значений шима (.db 23,45,255,10 ....и т.п.) , то в озу необходимо подготавливать данные, а как? Ролами(rol)?, рорами(ror)? Как лучше перелопатить массив необходимую форму?
=GM=
Цитата(add @ Oct 16 2007, 03:01) *
Значит мое предположение посте №48 оказалось верным. :-) Еще один мАААлюсенький вопросик, ну для полного блаженства :-).. Вот например если мы работаем с массивом постоянно меняющихся значений шима (.db 23,45,255,10 ....и т.п.) , то в озу необходимо подготавливать данные, а как? Ролами(rol)?, рорами(ror)? Как лучше перелопатить массив в необходимую форму?

Ну я рад, что оно оказалось верным, только какое?(:-). Для подготовки данных я беру раттерны для каждого канала, они лежат в пзу, вид у них такой
Код
pattern:    .db           0x01,0x00,0x00,0xFF  ;образец для канала 1
            .db           0x02,0x00,0x00,0xFF  ;образец для канала 2
            .db           0x04,0x00,0x00,0xFF  ;образец для канала 3

и обычное OR три раза. Как-то так. Вообще, табличные методы сильно убыстряют процесс. Надо только найти подходящее табличное представление.
Rst7
Цитата(=GM= @ Oct 16 2007, 01:19) *
Раз разговор зашёл о количестве тактов и о максимальных частотах, сообщаю вам, на сегодняшний день я довёл частоту шим до 11 кГц, и пока на этом успокоился(:-).


Давайте, покажите код, удивите нас wink.gif
add
Цитата(=GM= @ Oct 16 2007, 14:15) *
Код
pattern:    .db           0x01,0x00,0x00,0xFF ;образец для канала 1
            .db           0x02,0x00,0x00,0xFF ;образец для канала 2
            .db           0x04,0x00,0x00,0xFF ;образец для канала 3

и обычное OR три раза. Как-то так. Вообще, табличные методы сильно убыстряют процесс. Надо только найти подходящее табличное представление.

crying.gif все, Вы меня добили! twak.gif окончательно запутался. (видимо надо снова в школу идти)
Попробую задать вопрос: Вот к примеру у нас массив (значения шима n-го канала):
.db 11,255,20,188 и т. п. (это один канал!) ; каждое значение мы должны устанавливать через определенное время(ну например через секунду). для этого мы подготавливаем таблицу следующим образом:
Код

           уставка    образ п.А  образ п.B  образ п.C  
                                1-канал..............................24канал
  .db         0x10,     0b0000000, 0b0000000, 0b00000011 7бит  n-го канала
   .db         0x20,     0b0000000, 0b0000000, 0b00000111 6бит n-го канала
   .db         0x21,     0b0000000, 0b0000000, 0b00001111 5бит n-го канала
   .db         0x50,     0b0000000, 0b0000000, 0b00011111 4бит n-го канала

...

так или нет? а если значения изменяется(приходит) из вне, нам надо преобразовать таблицу налету?
=GM=
Цитата(add @ Oct 16 2007, 10:27) *
Вот к примеру у нас массив (значения шима n-го канала):
.db 11,255,20,188 и т. п. (это один канал!) ;
каждое значение мы должны устанавливать через определенное время(ну например через секунду)

Нет, это не один канал, а все каналы. В этой строчке находятся образы всех портов на эн-ном прерывании. Например 255 равно 11111111 в двоичке, значит портА весь будет в единицах. Буфер, вид которого показан в посте #49, используется программой, показанной в посте #18, что ж тут непонятного. Таких буферов два, на каждом периоде шима один буфер используется этой программой, второй буфер готовится фоновой программой. Потенциально можно подготовить один буфер за период шима, да больше и не надо. Но можете готовить его и секунду (в фоне), если того допускают условия вашей задачи. Под готовить я понимаю не только формирование буфера, но и расчёт (или получение извне) уставок для него.
Цитата(add @ Oct 16 2007, 10:27) *
а если значения изменяется(приходит) извне, нам надо преобразовать таблицу налету?

Ну сказал уже, таблица готовится за один период шима. На лету это или нет? Зависит от угла зрения. Но быстрее просто не надо, незачем.

Теперь стоит вопрос, как подготовить данную таблицу. Вот вы имеете все уставки, таблица из 24 записей (48 байт), первый байт - уставка, второй байт - номер канала. Таблица может быть неотсортирована, если отсортирована, то жизнь сильно упрощается. Предположим, вы её отсортировали, т.е. все времена идут строго в возрастающем, точнее, неубывающем порядке. Вопрос вам, как получить рабочую таблицу, вид которой показан в посте #49? Мой алгоритм таков. Берете первую запись, ставите туда первое время из таблицы уставок, теперь надо вставить 3 байта образа порта, по номеру канала находите в таблице паттернов нужные 3 байта и вставляете их в первую запись. Переходите ко второй записи. Перво-наперво сравниваете время второй уставки с временем из первой записи. Если они совпадают, то новую запись не создаете, а опять по номеру канала находите в таблице паттернов нужные 3 байта и делаете ИЛИ этих байтов с байтами из первой записи, и оставляете их в первой записи. Если они НЕ совпадают, делаете то же самое, но сохраняете в новой записи. И так делаете 24 раза. Долго было рассказывать, но МК тратит всего 644 МЦ. На сортировку уходит гораздо больше.
=GM=
Цитата(Rst7 @ Oct 16 2007, 10:12) *
Давайте, покажите код, удивите нас wink.gif

Навеяло
Больной: - Доктор, я буду жить?
Доктор: - А смысл?

Ну а если серьёзно, то я не готов ещё...Да и код сырой, не опробован в железе...
Могу поделиться идеей, как выйти на 19 кГц программный шим, поскольку у меня не хватает времени на всё, вокруг столько интересного...Достаточно дикая идея кстати, но может стрельнуть!
singlskv
Цитата(=GM= @ Oct 16 2007, 02:19) *
Ну, во-первых, у меня одно и двухтактные команды в фоне, четырёхтактных нет вообще, во-вторых, джиттер считать не надо, поскольку на следующем прерывании будет такой же случайный джиттер.
Матожидание там равно нуло, стало быть вклад джиттера будет нулевым.

В среднем Вы правы, почти, в частностях нужно разбираться отдельно...
джиттер нужно считать обязательно, потому что в данном случае он всегда будет в +,
нуль Вы никогда не получите.
Тока максимум двухтактовые команды в фоне ? О С в фоне уже речь не идет, да и на асм
сильно себя ограничиваем ?
Цитата
В первом приближении вы правы, общее количество тактов = 4(сохранение программного счётчика в стеке) + 2(прыжок из вектора прерывания, это вы забыли, но можно опустить) + 12(тело программы) + 4(reti) + 1/2(выполнение одной команды) = 24 такта максимум.

+ 2(прыжок ....) конечно не забыл, просто изначально посчитал что с этим прыжком
будет все совсем плохо и решил что прерывание прописано в области векторов.
Цитата
Я эту программу привёл просто как иллюстрацию Саше Витебскому, я такую не использую. С ходу могу её улучшить тактов на 5, поставив sei перед последней командой out, а вот почему так, подумайте на досуге, неплохая шарада перед сном(:-).

Спасибо конечно за шараду, тока для меня все изначально понятно, и очень неочевидно
что такой вариант даст правильный/предсказуемый вариант в ситуации возможности смены всех
значений ШИМ за период ШИМ. Нарисуйте код и я покажу где будут проблемы.
Цитата
В принципе, Rst7 (мой респект!) привёл фрагмент, практически один в один совпадающий с одной из моих ранних штатных программ, там допускается 13 тактов между двумя последовательными обновлениями портов.

Допускается, но может быть и на ~80% хуже ? (то есть дребезг будет порядка 9 тактов)
Цитата
Раз разговор зашёл о количестве тактов и о максимальных частотах, сообщаю вам, на сегодняшний день я довёл частоту шим до 11 кГц, и пока на этом успокоился(:-).
Ну дык тогда приведите готовый код хотя бы на 6 КГц, как уже утративший
свою актуальность smile.gif , и мы его обсудим...
Цитата
Могу поделиться идеей, как выйти на 19 кГц программный шим, поскольку у меня не хватает времени на всё, вокруг столько интересного...Достаточно дикая идея кстати, но может стрельнуть!
У меня тоже есть масса идей, но как показала практика общения с Вами,
Вы ну это... слегка любите преувеличить... (надеюсь примеры не нужно приводить ?)

Ваш вариант ШИМ очень неплох, тока если Вы заявляете о том что Вы достигли частоты XX,
давайте разговаривать предметно..., без кода это бессмысленно.
add
Цитата(=GM= @ Oct 16 2007, 16:29) *
Нет, это не один канал, ...
Теперь стоит вопрос, как подготовить данную таблицу. Вот вы имеете все уставки, таблица из 24 записей (48 байт),

ну это я в примере просто привел массив, изменения значения на одном канале. Поясню вопрос: Вот,к ПРИМЕРУ значения для 1-го канала=245, для 2-го канала=36,для 3-го канала=48...и т.д. (цифры от балды).

нет, в начале мы имеем 24байта, по байту на значение для каждого канала шима(24 канала). Как перевести эти значения в нужную таблицу? По сути наверное необходимо взять все первые биты в каждом байте поместить их в первую строчку, потом вторые биты и помечтить во вторую строчку и т.д. (ну добавить байт уставок ето понятно) . У нас получились образы для прерываний интервалы которых мы задаем уставками. так? Дык ведь подготовка этой таблицы займет тучу времени?! вот в этом и есть вопрос: как Вы ее подготавливаете? Прошу прощения, что то сразу недоходит и лыжи не едут:-(
И еще вопрос: если у нас добавляем байт уставок в каждой строчке, это же трата памяти, причем заполнения по сути одинаковыми значениями с равным периодом?
=GM=
Цитата(add @ Oct 17 2007, 03:07) *
нет, в начале мы имеем 24байта, по байту на значение для каждого канала шима(24 канала). Как перевести эти значения в нужную таблицу? По сути наверное необходимо взять все первые биты в каждом байте поместить их в первую строчку, потом вторые биты и поместить во вторую строчку и т.д. (ну добавить байт уставок ето понятно) . У нас получились образы для прерываний интервалы которых мы задаем уставками. так? Дык ведь подготовка этой таблицы займет тучу времени?! вот в этом и есть вопрос: как Вы ее подготавливаете? Прошу прощения, что то сразу недоходит и лыжи не едут:-(
И еще вопрос: если добавляем байт уставок в каждой строчке, это же трата памяти, причем заполнения по сути одинаковыми значениями с равным периодом?

Внимательно прочтите посты #49 и #58. Во втором посте на словах описан мой алгоритм создания таблицы. Вы его поняли?

Похоже, где-то у вас недопонимание. Вот скажите, вы саму идею уловили, как это всё работает? Если уловили, напишите сюда своими словами. И вам станет понятнее, и я пойму, почему у вас смазка с лыж испаряется(:-).
=GM=
Цитата(singlskv @ Oct 16 2007, 16:22) *
В среднем Вы правы, почти, в частностях нужно разбираться отдельно... джиттер нужно считать обязательно, потому что в данном случае он всегда будет в +, нуль Вы никогда не получите. Тока максимум двухтактовые команды в фоне? О С в фоне уже речь не идет, да и на асм сильно себя ограничиваем ?

Ага, давайте туда джаву и вижуал бейсик ещё присобачим, почему нет(:-)? Там бедная аврка еле-еле с трудом справляется на ассемблере на такой скорости, каждый такт на счету...
Цитата(singlskv @ Oct 16 2007, 16:22) *
+ 2(прыжок ....) конечно не забыл, просто изначально посчитал что с этим прыжком будет все совсем плохо и решил что прерывание прописано в области векторов. Спасибо конечно за шараду, тока для меня все изначально понятно, и очень неочевидно что такой вариант даст правильный/предсказуемый вариант в ситуации возможности смены всех значений ШИМ за период ШИМ. Нарисуйте код и я покажу где будут проблемы

Вы покажите, где проблемы с приведенным кодом будут, а дальше будем посмотреть. Кстати, время 18МЦ, которое указано в заголовке и есть время выполнения именно данной подпрограммы, с учётом скрытого прыжка из области векторов. Вот скажите, как по-вашему, с каким минимальным периодом можно вызывать данную подпрограмму?
Цитата(singlskv @ Oct 16 2007, 16:22) *
Допускается, но может быть и на ~80% хуже ? (то есть дребезг будет порядка 9 тактов)

Ну-ка, ну-ка, интересно, расскажите по-подробнее.
Цитата(singlskv @ Oct 16 2007, 16:22) *
У меня тоже есть масса идей, но как показала практика общения с Вами, Вы ну это... слегка любите преувеличить... (надеюсь примеры не нужно приводить?)

Ну почему, приведите. Заодно и вашу хоть какую-нибудь стоящую идею по 24-канальной шим, чтоб по теме ветки. Кстати уж, своими идеями я собирался поделиться не с вами, а с Rst7, приглашал его к сотрудничеству так сказать, надеюсь это не ваш коллега?
Цитата(singlskv @ Oct 16 2007, 16:22) *
Ну дык тогда приведите готовый код хотя бы на 6 КГц, как уже утративший свою актуальность smile.gif , и мы его обсудим...Ваш вариант ШИМ очень неплох, тока если Вы заявляете о том что Вы достигли частоты XX, давайте разговаривать предметно..., без кода это бессмысленно.

И не заявлял я, просто сказал: к вашему сведению. Код пока актуален, но ваше желание получить код чувствуется, непонятно правда зачем, если всё так плохо в этом коде...
muravei
Все это здорово, но я никак не пойму - какой здесь практический смысл. Понятно, что это "затачивается" под светодиоды, но 8 полноцветных это "маловато будет". Вот если бы 72 канала на АВР smile.gif
=GM=
Цитата(muravei @ Oct 17 2007, 18:09) *
Все это здорово, но я никак не пойму - какой здесь практический смысл. Понятно, что это "затачивается" под светодиоды, но 8 полноцветных это "маловато будет". Вот если бы 72 канала на АВР smile.gif

Легко! Ставим 3 аврки и у вас 72 канала по 6 кГц каждый(:-). Вот и смысл появился, не было бы оптимизации, пришлось бы ставить 10 авр для тех же 6 кГц. Кстати, а токи какие нужны?

[Алексей, чисто информация: моно1 на форуме замутил тему по осциллам, подключайтесь]
SasaVitebsk
Цитата(muravei @ Oct 17 2007, 21:09) *
Все это здорово, но я никак не пойму - какой здесь практический смысл. Понятно, что это "затачивается" под светодиоды, но 8 полноцветных это "маловато будет". Вот если бы 72 канала на АВР smile.gif


07.gif

Под светодиоды такое затачивать полный бред. Зачем? Разве что побаловаться.

Нет, это затачивается под различные преобразователи. Что-то типа DAC, где точность не очень важна, где джиттер не имеет существенного значения, так как, как правило, значение меняется в среднем меньше чем раз за период. Типовое применение я уже описал. Управление ШД. Например фирмы switec который управляется непосредственно с ног AVR. Или управление скоростью двигателя постоянного тока, управление подсветкой LCD дисплея и т.п.

В моём случае период ШИМ имеет принципиальное значение. Так как от частоты ШИМ, учитывая дробление, зависит максимальная частота вращения двигателя, а это в свою очередь сказывается на времени свала стрелок.

Таким же способом, к примеру формируется синус, если надо. Ну и т.д. Зачем притягивать за уши. Такое применяется если Вам нужно. То что сам ШИМ применяется широко, видно хотябы из того, что практически все контроллеры сейчас его имеют на борту (аппаратный). Но аппаратный очень хорошо, но одна засада - их мало. Так я, к примеру управляю 6 двигателями по 2 канала ШИМ на каждый. С такими однокристалками - напряг. Кроме всего мне надо CAN на борту. И вот их нет вообще. Таким образом совтовый ШИМ - отличный выход из положения. Ошибки - не принципиальны, так как ошибка существует только в пределах микрошага.
singlskv
Цитата(=GM= @ Oct 17 2007, 20:44) *
Ага, давайте туда джаву и вижуал бейсик ещё присобачим, почему нет(:-)? Там бедная аврка еле-еле с трудом справляется на ассемблере на такой скорости, каждый такт на счету...
Давайте не будем перегибать палку !
Речь шла например о командах типа SBRx, SBIx которые потенциально 3 тактовые.
Конечно в асемблере можно гарантировать что они будут максимум 2 тактовыми, но
просто в обсуждении все время мелькал вариант при котором прерывание на асм
а все остальное на С, так что вопрос был только об этом...
Кстати Вы сами признавались что сортировка это не Ваш конек, так что могу предположить что
этот кусок у некоторых на С будет лучше чем у Вас на асм.
Если речь чисто о асм то нивапрос.
Цитата
Вы покажите, где проблемы с приведенным кодом будут, а дальше будем посмотреть. Кстати, время 18МЦ, которое указано в заголовке и есть время выполнения именно данной подпрограммы, с учётом скрытого прыжка из области векторов. Вот скажите, как по-вашему, с каким минимальным периодом можно вызывать данную подпрограмму?
Я кода пока не увидел...
То что Вы обозвали 18 тактов занимает больше и Вы с этим согласились в посте №52, как я могу указать Вам на проблемы если другого(правильного) кода нету ?
Цитата
Ну-ка, ну-ка, интересно, расскажите по-подробнее.
За отсутсвием хотя бы какого-то законченного варианта кода я Вам врядли смогу
точно ответить, я могу только предполагать.
Отвечу вопросом на вопрос, Вы считали какие промежутки времени проходят при выводе
в одноименные порты(джиттер) например при таких раскладах:
- полочки PWM через одну
- две полочки PWM подряд, пропуск 1 полочки, 2 полочки подряд
- два вышеупомянутых варианта, по при этом половина полочек около 0 а вторая около 255
итд ???
Цитата
Ну почему, приведите.
Вам нужен Освежитель Памяти ?
да пожалуйста, например ловля временных интервалов на мега128 с точностью 0,5 такта,
ссылку искать нужно ? или уже сами вспомнили ?
Цитата
Заодно и вашу хоть какую-нибудь стоящую идею по 24-канальной шим, чтоб по теме ветки. Кстати уж, своими идеями я собирался поделиться не с вами, а с Rst7, приглашал его к сотрудничеству так сказать, надеюсь это не ваш коллега?

И не заявлял я, просто сказал: к вашему сведению. Код пока актуален, но ваше желание получить код чувствуется, непонятно правда зачем, если всё так плохо в этом коде...
Нету у меня желания заполучить Ваш код,
я могу и свой написать, асм чуть-чуть знаю smile.gif
Считайте что это просто спортивный интерес.
=GM=
Цитата(singlskv @ Oct 17 2007, 19:46) *
Кстати Вы сами признавались что сортировка это не Ваш конек, так что могу предположить что этот кусок у некоторых на С будет лучше чем у Вас на асм

Ну покажите ваше исскусство на си, сравним(:-). Исходные данные такие: 24 записи по 2 байта каждая, первый байт - уставка, второй байт - канал, ассоциированный с данной уставкой. Надо упорядочить таблицу на месте, так чтобы уставки в записях были размещены в неубывающем порядке вместе с номерами каналов.
Цитата(singlskv @ Oct 17 2007, 19:46) *
То что Вы обозвали 18 тактов занимает больше и Вы с этим согласились в посте №52, как я могу указать Вам на проблемы, если другого(правильного) кода нету? За отсутствием хотя бы какого-то законченного варианта кода я Вам врядли смогу точно ответить, я могу только предполагать

Приведен законченный вариант, не самый скоростной впрочем, средненький. Приведенная программа выполняется именно за 18 циклов, включая rjmp из векторной области. Какой, по вашему мнению, минимальный период вызова данной функции?
Цитата(singlskv @ Oct 17 2007, 19:46) *
Отвечу вопросом на вопрос, Вы считали какие промежутки времени проходят при выводе
в одноименные порты(джиттер) например при таких раскладах:
- полочки PWM через одну
- две полочки PWM подряд, пропуск 1 полочки, 2 полочки подряд
- два вышеупомянутых варианта, по при этом половина полочек около 0 а вторая около 255
итд ???

Если уставки не менялись, то джиттера вроде нет вообще. До конца не исследовал впрочем. Алгоритму по барабану положение "полочек". Они могут быть в любой позиции 1-255, кроме нулевой.
Цитата(singlskv @ Oct 17 2007, 19:46) *
Вам нужен Освежитель Памяти?
да пожалуйста, например ловля временных интервалов на мега128 с точностью 0,5 такта,
ссылку искать нужно? или уже сами вспомнили?

Будете смеяться, но я решил-таки ту задачу, именно с точностью 0.5 такта. Что ещё?
singlskv
Цитата(=GM= @ Oct 18 2007, 01:05) *
Ну покажите ваше исскусство на си, сравним(:-). Исходные данные такие: 24 записи по 2 байта каждая, первый байт - уставка, второй байт - канал, ассоциированный с данной уставкой. Надо упорядочить таблицу на месте, так чтобы уставки в записях были размещены в неубывающем порядке вместе с номерами каналов.
Сравнивать начнем с момента показа Вашего кода
Цитата
Приведен законченный вариант, не самый скоростной впрочем, средненький. Приведенная программа выполняется именно за 18 циклов, включая rjmp из векторной области. Какой, по вашему мнению, минимальный период вызова данной функции?
Где законченый вариант ? Где код который я могу загнать в AVRStudio и его там проверить ?
Цитата
Если уставки не менялись, то джиттера вроде нет вообще. До конца не исследовал впрочем. Алгоритму по барабану положение "полочек". Они могут быть в любой позиции 1-255, кроме нулевой.
А Вы на всякий случай поиследуйте, может чего интересное и увидите,
а почему 0 в опозициии, тактов не хватает ? дык тогда у Вас уже неполноценный шим.
Цитата
Будете смеяться, но я решил-таки ту задачу, именно с точностью 0.5 такта. Что ещё?
Смеятся буду когда Вы приведете свое решение...

P.S. И Вобще, у меня есть алгоритм шима на 100КГц при 256 полочках и никакого джиттера,
тока я Вам его не покажу, потому как комерческая тайна, но зато мой алгоритм в 10 раз
лучше Вашего... smile.gif


Кстати, вот тут еще один интересный вопросик образовался:
Цитата(=GM= @ Oct 15 2007, 17:49) *
1) Будем использовать МК с ОЗУ не менее 1 Кбайта и тактовой частотой 20 МГц, ну и ног должно хватить по крайней мере для 24 выходных шимов. Пусть это будет атмега88.

Как Вы планировали запустить мегу88 на 20Мгц так чтобы 3 порта(24пина) остались
свободными ? smile.gif
=GM=
Цитата(singlskv @ Oct 17 2007, 20:35) *
Сравнивать начнем с момента показа Вашего кода

Цитата(singlskv @ Oct 17 2007, 20:35) *
Где законченый вариант? Где код, который я могу загнать в AVRStudio и его там проверить ?

Зачем вам мой код, вы ж говорили, что он вам не нужен, да и идей у вас много, напишите свой, под 100 кГц(:-)
Цитата(singlskv @ Oct 17 2007, 20:35) *
а почему 0 в опозициии, тактов не хватает ? дык тогда у Вас уже неполноценный шим

Реализовать легко во всех позициях 0-255, но не уверен, можно ли назвать это шимом: период становится бесконечным(:-)
Цитата(singlskv @ Oct 17 2007, 20:35) *
Кстати, вот тут еще один интересный вопросик образовался. Как Вы планировали запустить мегу88 на 20 Мгц так чтобы 3 порта(24пина) остались свободными ? smile.gif

Не берите в голову, учебный пример, чисто в образовательных целях.
muravei
Цитата(SasaVitebsk @ Oct 17 2007, 23:40) *
07.gif
Под светодиоды такое затачивать полный бред. Зачем? Разве что побаловаться.

Ну почему же ? Для всякого рода "пропеллерных поделок" пойдет!
А так "Вся наша жизнь.." - баловство. smile.gif
Кстати, зачем шаговым двигателям ШИМ?
SasaVitebsk
Цитата(muravei @ Oct 18 2007, 13:19) *
Ну почему же ? Для всякого рода "пропеллерных поделок" пойдет!

smile.gif Согласен
Цитата
Кстати, зачем шаговым двигателям ШИМ?

Дробление шага. Что обеспечивает более высокую плавность движения при более высокой максимальной скорости.
add
Цитата(=GM= @ Oct 17 2007, 17:34) *
Внимательно прочтите посты #49 и #58. Во втором посте на словах описан мой алгоритм создания таблицы. Вы его поняли?

Похоже, где-то у вас недопонимание. Вот скажите, вы саму идею уловили, как это всё работает? Если уловили, напишите сюда своими словами. И вам станет понятнее, и я пойму, почему у вас смазка с лыж испаряется(:-).

посты читал уже не раз, лыжи не едут..:-)
хм.. постараюсь объяснить как я понимаю Ваш метод: 1. период шима делится на прерывания (предустановками). причем с неравными интервалами! т.е. к примеру с шагом 1,2,4,8,16,32,64,128,255 (8шт. за период.) 2. В каждое прерывание в порты устанавливается их образ(портов)(выводим значение из таблицы). 3. таким образом если мы на одном прерывании (третем по счету) (к примеру!) на первый ПИН(!) портаА установим 1(един.), и к примеру на 5-ом по счету прерывании на тоже пин поставим (1)единицу, а в остальные прерывания там будет 0(ноль), то сложив интервал 3-го и 5го прерывания(4+16=20) получим значение заполнение 20/255. так можно установить любой уровень от 0 до 255. вот, что не так?
=GM=
Цитата(add @ Oct 19 2007, 07:41) *
посты читал уже не раз, лыжи не едут...вот, что не так?

Всё не так.

1. Период шима не делится на прерывания c неравными интервалами. Давайте для простоты рассмотрим пример, состоящий из трёх шим. Сигналы шим выглядят так.
Код
   0         9                                   255 0         9
__             _____________________________________             _
  |___________|                                     |___________|     шим 1

  0      7                                          0       7
__         _________________________________________           _
  |_______|                                         |_________|       шим 2

  0               15                                0           15
__                   _______________________________                _
  |_________________|                               |______________|  шим 3

Сколько будет прерываний? Три – на временных позициях 7, 9 и 15. И еще одно общее прерывание - на позиции 0 (общее обнуление для всех каналов).

Если у вас таймер считает с 0, а в регистр сравнения вы запишете 7, то при совпадении времени таймера (Т) с 7 у вас возникнет прерывание по сравнению. В прерывании вы должны будете установить шим2 в единицу и не трогать остальные. Кроме того вы должны будете записать новое число в регистр сравнения, а именно 9. При совпадении (Т=9) опять возникнет прерывание, надо будет выставить шим1 в единицу, не трогая остальные каналы, и не забыть записать в регистр сравнения новое число 15. На третьем прерывании выполняются те же действия, только с шим3.

Больше прерываний не будет вплоть до 0 позиции, где программа обработки прерывания по переполнению обнулит все каналы и запишет число 9 в регистр сравнения. Далее начинается новый период шим, всё повторяется. (Абсолютно те же рассуждения приложимы к другому числу каналов. Само собой разумеется, что для 24 каналов, будет 24 прерывания.)

2. Таблица образа портов

Таблица для случая с тремя шимами примет следующий вид.
Код
уставка         321 <-номер шим
    7     0000 0010 <-образ порта при Т=7
    9     0000 0011 <-образ порта при Т=9
   15     0000 0111 <-образ порта при Т=15

3. Алгоритм подготовки таблицы образа портов был описан ранее.

4. Исходные данные представляются в виде таблицы. Для случая трёх шим она выглядит следующим образом.
Код
уставка канал
   9      1
   7      2
  15      3

Её надо отсортировать в порядке неубывания уставок
Код
уставка канал
   7      2
   9      1
  15      3

И в соответствии с упорядоченной таблицей построить таблицу образов портов.

5. В первом приближении размер кванта времени, или длительность ступеньки, определяется временем выполнения прерывания. Минимальное время ступеньки составит 25 МЦ (18МЦ (обработка прерывания) + 4МЦ(вход в прерывание) + 3МЦ (завершение команд на входе и выходе) ). Время ступеньки 25 МЦ * 0.05 мкс/МЦ = 1.25 мкс. Период шима 1.25 мкс*256 ступеней=320 мкс, т.е. частота шим = 3125 Гц. Полное время можно сократить примерно в два раза и получить 13 МЦ.
add
Цитата(=GM= @ Oct 19 2007, 14:16) *
Всё не так.
1. Период шима ...

=GM=, Пасиба что расжевали! Лыжи поехали:-) (Вот токо с подготовкой подразберусь:-))
зы: а способ (.пост №73:неравными интервалами! т.е. к примеру с шагом 1,2,4,8,16,32,64,128,255) шим имеет право на жизнь? Там прерываний всего 8 (от разрядности зависит,можно 16) Какие там могут быть подводные камни?
GetSmart
Цитата(add)
Какие там могут быть подводные камни?
Не дорос ещё =GM= до этого алгоритма smile.gifsmile.gif
А вообще алгоритм идеальный для управления светодиодами напрямую.
=GM=
Цитата(add @ Oct 19 2007, 09:37) *
=GM=, Пасиба что расжевали! Лыжи поехали:-) зы: а способ (.пост №73:неравными интервалами! т.е. к примеру с шагом 1,2,4,8,16,32,64,128,255) шим имеет право на жизнь? Там прерываний всего 8 (от разрядности зависит, можно 16) Какие там могут быть подводные камни?

Там не камни, там под водой целый горный хребет(:-). Вы когда на лыжах будете съезжать, смотрите не наткнитесь(:-).

Теоретически конечно можно перебрать все комбинации с 24 каналами и сделать соответствующее количество вариантов прерываний, чтобы получить заданную комбинацию 24 прерываний, но я не представляю, как это сделать в обозримое время на МК с ограниченными ресурсами.
add
Цитата(=GM= @ Oct 19 2007, 16:04) *
Там не камни, там под водой целый горный хребет(:-). Вы когда на лыжах будете съезжать, смотрите не наткнитесь(:-).

Теоретически конечно можно перебрать все комбинации с 24 каналами и сделать соответствующее количество вариантов прерываний, чтобы получить заданную комбинацию 24 прерываний, но я не представляю, как это сделать в обозримое время на МК с ограниченными ресурсами.

Дык ненада там прерываний больше. Сколько бит , столько прерываний. А байт каждого канала раскидывается по столбцам. Я по этому и спрашивал как подготавливаете таблицу. (про ролы(rol) и роры(ror) говорил.) А всетаки они разные. :-)
=GM=
Цитата(add @ Oct 19 2007, 11:10) *
Сколько бит , столько прерываний. А байт каждого канала раскидывается по столбцам

Ну, разжуйте теперь вы мне ваш алгоритм, видимо, я не так его понимаю, не дорос(:-)

Что такое байт каждого канала, куда он раскидывается, в смысле по каким-таким столбцам?
add
Цитата(=GM= @ Oct 19 2007, 17:03) *
Ну, разжуйте теперь вы мне ваш алгоритм, видимо, я не так его понимаю, не дорос(:-)
Что такое байт каждого канала, куда он раскидывается, в смысле по каким-таким столбцам?

Про "не дорос" я не говорил, прошу заметить.:-/ Как уже писал неоднократно, есть к примеру 8 прерываний (по числу битности). с интервалами кратными 1,2,4,8,16,32,64,128,256( длительность) . Теперь формируем образа портов: перый образ(первое прерывание кратное 1) :1-й бит 1-го байта, 1-й бит 2-го байта,
.....1-й бит 24-го байта.Второй образ(второе прерывание кратное 2) :2-й бит 1-го байта, 2-й бит 2-го байта,
.....2-й бит 24-го байта. И так все байты каждого канала. Далее выводим по прерыванию соответствующую строчку. все. те. значения яркости к примеру 9, для первого канала, остальные нули таблица будет такой:

;----32-ой канал...........................................1-ый канал
.db0b0000000,0b0000000,0b0000000,0b0000001 ;1-е прерыв (вес 1) (образ портов)
.db0b0000000,0b0000000,0b0000000,0b0000000;2-е прерыв (вес 2)(образ портов)
.db0b0000000,0b0000000,0b0000000,0b0000000;3-е прерыв (вес 4)(образ портов)
.db0b0000000,0b0000000,0b0000000,0b0000001;4-е прерыв (вес 8)(образ портов)
.db0b0000000,0b0000000,0b0000000,0b0000000;5-е прерыв (вес 16)(образ портов)
.db0b0000000,0b0000000,0b0000000,0b0000000;6-е прерыв (вес 32)(образ портов)
.db0b0000000,0b0000000,0b0000000,0b0000000;7-е прерыв (вес 64)(образ портов)
.db0b0000000,0b0000000,0b0000000,0b0000000;8-е прерыв (вес 128)(образ портов)

Те. просто поместили байт(значение яркости св.диода) в таблицу, только в столбец..говоря проще..:-)
в итоге получим последовательность на порту:1|t1|0|t2|0|t3|1|t4|0|t5|0|t6|0|t7|0 где t - интервал между прерываниями(кратными 1,2,4,8,16,32,64,128,256 ).. Ну вроде так. :-)
=GM=
Цитата(add @ Oct 19 2007, 13:13) *
Те. просто поместили байт(значение яркости св.диода) в таблицу, только в столбец...в итоге получим последовательность на порту: 1|t1|0|t2|0|t3|1|t4|0|t5|0|t6|0|t7|0 где t - интервал между прерываниями (кратными 1, 2, 4, 8, 16, 32, 64, 128, 256)

Теперь понял(:-).

Ну, во-первых, будет не шим, а "поразрядная кодоимпульсная модуляция" (пКИМ). Будет она работать? Теоретически будет, надо исследовать, как такая последовательность влияет на глаз человека.

Во-вторых, загрузить из памяти в регистр и выдать для трёх портов можно за 9 МЦ минимум миниморум, пусть это будет квант младшего разряда, выдача для второго кванта будет полегче - 18 МЦ, для последующих - нет проблем, поскольку времени на выдачу будет не менее 36 МЦ. Следовательно, при той же разрядности в 8 бит, период пКИМ будет равен 9*256=2304 МЦ, т.е. частота пКИМ будет 8.7 кГц. Что выглядит совсем неплохо.

Можно хлеще сделать, разместить первые, вторые и третьи 3 байта образов порта в 9 регистрах, тогда выдача в три порта займет 3 МЦ, значит, общий период пКИМ будет 3*256=768МЦ, а частота поднимется до 26 кГц. Последующие образы брать из памяти.

Поскольку вам фактически надо транспонировать битную матрицу 8 х 24 в матрицу 24 х 8, то подготовку таблицы, наверное, лучше делать так. Разместить текущие 8 байт в регистры, с помощью 8 пар rol-rol получить текущий байт и сохранить его. Уйдёт где-то 480 МЦ, всего 480*3=1440 МЦ, т.е. период пКИМ будет не более 13 кГц. Вот вам одно фундаментальное ограничение. Может быть, можно придумать некий табличный способ, не знаю, надо думать.

И еще останется выяснить, как будут жить такие короткие импульсы в системе. Стоит попробовать. Желаю удачи.
GetSmart
Цитата(=GM=)
Будет она работать? Теоретически будет, надо исследовать, как такая последовательность влияет на глаз человека.
=GM= по ходу не в теме smile.gif
Глаз человека даже не заметит подмены. А вот симистору это не понравилось бы.
=GM=
Цитата(GetSmart @ Oct 19 2007, 19:05) *
=GM= по ходу не в теме smile.gif
Глаз человека даже не заметит подмены. А вот симистору это не понравилось бы

Симистору будет по барабану, т.к. он включится от третьего-четвёртого-пятого разряда, а потом выключится только через 10000 мкс (полпериода сети 50 Гц), пройдёт более 50 периодов шим. Будет ли он правильно работать, это уже другой вопрос.

Что касается глаза, то известны опыты с чёрно-белым кружком (как волчок), когда он крутится, возникают цветные полосы. Где-то у меня такой волчок валялся, надо поискать...Откуда бы им взяться, если кружок чёрно-белый?

Ешё была статья в журнале Радио, где описывалась схема формирующая цветную заставку из черно-белой...

Все эти эффекты основаны на особенностях человеческого зрения, вот так...а вы не в теме, не в теме...
bzx
Я с другой стороны подойду. Если малость добавить внешних элементов. Например, на вход внешнего логического элемента AND подаётся частота заполнения ШИМ (Fd). На второй вход - частота ШИМ (Fpwm). Таким образом сформирован 1 канал ШИМ. Т.к. частота заполнения ШИМ формируется уже не программно, а именно, не через прерывания таймера, а задаётся внешнем тактовым генератором, то можно снизить частоту прерываний таймера до частоты ШИМ. При таком раскладе значительно освобождаются вычислительные возможности контроллера в ~(Fd/Fpwm) раз.

Можно пойти дальше, наращивать число каналов с помощью внешнего сдвигового регистра. Т.е. так можно формировать десятки и сотни pwm каналов с приличной частотой.

В общем, всегда можно найти компромисс между программно-аппаратным сочетанием для той или иной задачи, а задачей разработчика является сделать этот компромисс оптимальным.
=GM=
Цитата(bzx @ Oct 19 2007, 23:00) *
... на вход внешнего логического элемента AND подаётся частота заполнения ШИМ (Fd). На второй вход - частота ШИМ (Fpwm). Таким образом сформирован 1 канал ШИМ. Т.к. частота заполнения ШИМ формируется уже не программно, а именно, не через прерывания таймера, а задаётся внешнем тактовым генератором, то можно снизить частоту прерываний таймера до частоты ШИМ. При таком раскладе значительно освобождаются вычислительные возможности контроллера в ~(Fd/Fpwm) раз

Поясните, что вы понимаете под частотой заполнения шим и частотой шим? Например, непонятно, что вы подаёте на второй вход, меандр что ли? Или что?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.