Очень быстро дёрнуть ножкой

Sep 07, 2004 41 Replies

Как связь, _All_ ? ;-)



Уже с похожим сабжем тут флейм был, а вот жизнь заставляет... Задачка скорее на смекалку, чем на знания. У PICа есть 4 пина (РА3-РА0), через них нужно одновременно выводить 4 канала ШИМ с 4-х битным разрешением. Причем по-хитрому: старшия тетрада байта - значение DutiCycle для РА1, младшая - для РА0, второй байт аналогично для РА2 и РА3. Hа каждый шаг ШИМа можно использовать только 5 (максимум 6) циклов ядра. Четыре канала стартуют синхронно. Должно получиться что-то в этом духе:



РА0 1111100000000000 0xA5h - первый байт РА1 1111111111000000 _______ РА2 1100000000000000 РА3 1110000000000000 0x32h - второй байт



Как можно уложиться? Сдвижка между группами каналов может достигать 3 тактов.


До связи, All! /Edward/ LocalDate 07 Sep 04 - LocalTime 11:36 ...

formatting link
мыло на: nеdеliаеv(ухо)мэйл.ру


Hello, Edward! You wrote to All on Tue, 07 Sep 2004 09:36:00 +0400:

EN> Уже с похожим сабжем тут флейм был, а вот жизнь заставляет...

В каждой шутке есть доля правды.

EN> Задачка скорее на смекалку, чем на знания. У PICа есть 4 пина EN> (РА3-РА0), через них нужно одновременно выводить 4 канала ШИМ с 4-х EN> битным разрешением. EN> Причем по-хитрому: старшия тетрада байта - значение DutiCycle для EN> РА1, младшая - для РА0, второй байт аналогично для РА2 и РА3. Hа EN> каждый шаг EN> ШИМа можно использовать только 5 (максимум 6) циклов ядра. Четыре EN> канала стартуют синхронно. Должно получиться что-то в этом духе:

EN> РА0 1111100000000000 0xA5h - первый байт EN> РА1 1111111111000000 _______ EN> РА2 1100000000000000 EN> РА3 1110000000000000 0x32h - второй байт

EN> Как можно уложиться? Сдвижка между группами каналов может EN> достигать 3 тактов.

Насчёт пика и дрыгоножества не скажу, ибо не компетентен, а вот подготовить массив из 16 ниблов и бегать по нему - напрашивается.

Alexander,Derazhne@adic,kiev,ua (replace commas with dots) Alexander Derazhne

Привет!

EN> Задачка скорее на смекалку, чем на знания. У PICа есть 4 пина EN> (РА3-РА0),через них нужно одновременно выводить 4 канала ШИМ с 4-х EN> битным разрешением.Причем по-хитрому: старшия тетрада байта - EN> значение DutiCycle для РА1,младшая - для РА0, второй байт

[skip ...]

Затолкать все это в ОЗУ (8 байт) и выводить в цикле.

Leha Bishletov. E-mail: snipped-for-privacy@rol.ru

Как связь, _Alexander_ ? ;-)

EN>> РА0 1111100000000000 0xA5h - первый байт EN>> РА1 1111111111000000 _______ EN>> РА2 1100000000000000 EN>> РА3 1110000000000000 0x32h - второй байт

AD> Hасчёт пика и дрыгоножества не скажу, ибо не компетентен, а вот AD> подготовить массив из 16 ниблов и бегать по нему - напрашивается.

Оно меняется 8-/ Если 0x2Ah отличается от 0x2Bh всего на единичку, что терпимо, то при переходе от 0x20h -> 0x1Fh надо в табличке РА1 уменьшить на 1, а в табличке РА0 дописать аж 16 единиц, что долго (перед каждым "прогоном" есть 8, ну максимум 10 циклов. Первый и второй байт постоянно меняются на +/- 1. Таблица у меня по этой причине сразу отпала.

До связи, Alexander! /Edward/ LocalDate 07 Sep 04 - LocalTime 23:36 ...

formatting link
мыло на: nеdеliаеv(ухо)мэйл.ру

Как связь, _Leha_ ? ;-)

LB> Затолкать все это в ОЗУ (8 байт) и выводить в цикле. Уже написал, почему не катит. Даже 16 байт не жалко, но заполнять некогда таблицу.

До связи, Leha! /Edward/ LocalDate 07 Sep 04 - LocalTime 23:42 ...

formatting link
мыло на: nеdеliаеv(ухо)мэйл.ру

Эдуард, приветствую!

Конечный автомат? У тебя 4*16 = 64 возможных вариантов. По таблице прыжок на нужную ветку, а там movlw 0x?? movwf PORTA ....и так 16 раз

С уважением, Сергей Борщ

Как связь, _Sergey_ ? ;-)

SB> Конечный автомат? У тебя 4*16 = 64 возможных вариантов. По таблице прыжок SB> на нужную ветку, а там SB> movlw 0x?? SB> movwf PORTA SB> ....и так 16 раз

Что-то либо у тебя, либо у меня с математикой. Имеется 2 байта, которые выводятся потетрадно в четыре канала. Итого 256х256=65536 значений. Причем каждому значению соответствует своя табличка из 16 отсчетов. Итого 1048576 байт. Многова-то. Или я мысль не понял.

До связи, Sergey! /Edward/ LocalDate 08 Sep 04 - LocalTime 16:15 ...

formatting link
мыло на: nеdеliаеv(ухо)мэйл.ру

Эдуард, приветствую!

Спасибо, регулярно и с удовольствием :-)

Счас найду исходную задачу... Вот:

Итого каждый из пинов имеет 2^4 = 16 возможных вариантов дерганья... Да, точно. На всех не 16*4, а 16^4 = 65536 вариантов. Ошибся, каюсь.

Да! Уж... Ну, в качестве компенсации могу предложить безумную идею: привесить на эти ноги сдвиговый регистр, регистр подключить к старшим битам адреса ПЗУ, а младшие 4 бита разворачивать 4-битным счетчиком. Силами одного ПИКа за 5 тактов между тиками ШИМа подготовить 4 бита мне кажется невозможным.

С уважением, Сергей Борщ

Как связь, _Sergey_ ? ;-)

SB> Hу, в качестве компенсации могу предложить безумную идею: привесить на эти SB> ноги сдвиговый регистр, регистр подключить к старшим битам адреса ПЗУ, а SB> младшие 4 бита разворачивать 4-битным счетчиком. Hекуда. Схема уже давно функционирует. SB> Силами одного ПИКа за 5 тактов между тиками ШИМа подготовить 4 бита SB> мне кажется невозможным.

Любовь есть! - я ею занимался 8-) (с) /Русск.радио/ Девайсу уже лет 5. Стоит 16с622 с кварцем на 20 МГц. И четырьмя ногами выдаёт четыре ШИМа. 1,2 мкС на шаг. Потребовалось функции подправить, а тот, кто это делал исчез в пространстве и времени.. Я уже неск. дней пытаюсь повторить подвиг, пока лучший вариант около 32 мкс. А надо 19-20. Так что "..каучуковая бомба продолжает прыгать". 8-\

До связи, Sergey! /Edward/ LocalDate 10 Sep 04 - LocalTime 18:31 ...

formatting link
мыло на: nеdеliаеv(ухо)мэйл.ру

7-Sep-04 09:36 Edward Nedeliaev wrote to All:

EN> стартуют синхронно. Должно получиться что-то в этом духе:

EN> РА0 1111100000000000 0xA5h - первый байт EN> РА1 1111111111000000 _______ EN> РА2 1100000000000000 EN> РА3 1110000000000000 0x32h - второй байт

EN> Как можно уложиться? EN> Сдвижка между группами каналов может достигать 3 тактов.

Что имеется ввиду под "сдвижкой" ?

wbr,

Hello, Edward! You wrote to Sergey A. Borshch on Fri, 10 Sep 2004 16:31:28 +0400:

EN> Любовь есть! - я ею занимался 8-) (с) /Русск.радио/ EN> Девайсу уже лет 5. Стоит 16с622 с кварцем на 20 МГц. И четырьмя EN> ногами выдаёт четыре ШИМа. 1,2 мкС на шаг. Потребовалось функции EN> подправить, а тот, кто это делал исчез в пространстве и времени.. Я EN> уже неск. дней пытаюсь повторить подвиг, пока лучший вариант около EN> 32 мкс. А надо 19-20. EN> Так что "..каучуковая бомба продолжает прыгать". 8-\

Есть идея. Нужно хитро подготовить данные. Что вроде

byte tmp = ValueR3-1; ValueR3 -= ValueR2; ValueR2 -= ValueR1; ValueR1 -= ValueR0;

byte i = 0;

while(true) { i -= ValueR0; if (i >=0) { } i -= ValueR1; if (i >=0) { } i -= ValueR2; if (i >=0) { } i -= ValueR3; if (i >=0) { } i += tmp; if (i <0) i = 15; }

Сколько это в тактах на пике - увы мне...

With best regards, Alexander Derazhne

Как связь, _Oleksandr_ ? ;-)

EN>> Как можно уложиться? EN>> Сдвижка между группами каналов может достигать 3 тактов. OR> Что имеется ввиду под "сдвижкой" ?

|<----16uS---->| 1)1110000000000000 \ 83h - байт значения ШИМа 1-го канала 2)1111111100000000 / 3) 1111000000000000\ A4h - байт значения ШИМа 2-го канала 4) 1111111111000000/ /\ +---- сдвижка на 1 шаг ШИМа (уже скопом поглядел) Т.е. фактически два 8-ми битных канала, выводимых для скорости паралельными потоками по 4-бита. 8-ми битный ШИМ с периодом в 16-20 микросекунд ни на PICе, ни на AVRе реализовать невозможно. А эта железка уже лет 5 работает на 16с622 с тактовой 20 МГц, т.е на 5 МИПСах делается ШИМ. Сейчас понадобился "такой-же, но с перломутровыми пуговицами", т.е. малость подправить другие функции устройства. "Другие функции" написал сразу, а вот с этим ШИМом никак не удаётся совладать. Если бы он не менялся, или менялся редко, "проигрывал" бы его из таблицы и не заморачивался, но фишка в том, что оба байта _каждый_ период ШИМа уменьшаются/увеличиваются. Таблицу заполнять некогда. Железку переделывать не дадут. Т.е. апгрейд на уровне "старый из панельки вытащили, новый туда воткнули".

До связи, Oleksandr! /Edward/ LocalDate 11 Sep 04 - LocalTime 10:30 ...

formatting link
мыло на: nеdеliаеv(ухо)мэйл.ру

Как связь, _Alexander_ ? ;-)

AD> Есть идея. Hужно хитро подготовить данные. Что вроде AD> byte tmp = ValueR3-1; ... AD> Сколько это в тактах на пике - увы мне...

Может я чего-то не понял, но столько времени только на подготовку данных я тратить не могу. 8-(

До связи, Alexander! /Edward/ LocalDate 11 Sep 04 - LocalTime 13:05 ...

formatting link
мыло на: nеdеliаеv(ухо)мэйл.ру

Hello, Edward! You wrote to Alexander Derazhne on Sat, 11 Sep 2004 11:05:20 +0400:

EN> Как связь, _Alexander_ ? ;-)

Хреновая :-((

AD>> Есть идея. Hужно хитро подготовить данные. Что вроде byte AD>> tmp = ValueR3-1; EN> ... AD>> Сколько это в тактах на пике - увы мне...

EN> Может я чего-то не понял, но столько времени только на EN> подготовку данных я тратить не могу. 8-(

Дык, а откуда они берутся? Может там прооптимизировать? Я глянул систему команд, получается, что неразрушающее сравнение очень дорогая операция. Вот и попытался свести каждый шаг к вчитанию и анализу флага. Процитированная тобой инструкция устраняет декремент в цикле. Можно ещё попытаться работать сразу с байтами, но тогда придётся играть битом промежуточного переноса и ещё не известно что из этого выйдет...

With best regards, Alexander Derazhne

11-Sep-04 08:30 Edward Nedeliaev wrote to Oleksandr Redchuk:

EN> |<----16uS---->| EN> 1)1110000000000000 \ 83h - байт значения ШИМа 1-го канала EN> 2)1111111100000000 / EN> 3) 1111000000000000\ A4h - байт значения ШИМа 2-го канала EN> 4) 1111111111000000/ EN> /\ EN> +---- сдвижка на 1 шаг ШИМа (уже скопом поглядел) [...] EN> Т.е. фактически два 8-ми битных канала, выводимых для скорости EN> паралельными потоками по 4-бита. Т.е. дальше они ("подканалы") взвешенно суммируются?

EN> таблицы и не заморачивался, но фишка в том, что оба байта _каждый_ EN> период ШИМа уменьшаются/увеличиваются. Таблицу заполнять некогда. А вот тут не понял. Раньше ещё было "перед каждым прогоном есть 8, максимум 10 циклов". Сейчас речь о том, что они каждый период уменьшаются/увеличиваются. КОГДА и ГДЕ? Это что, выходит

|<----16uS---->|<- XX ->|<-2us->|<----16uS---->|

1)1110000000000000 1111000000000000 2)1111111100000000 1111111100000000 0x83 +1 подг. 0x84

XX - это некое время на получение новых двух байтов

2us подготовки - это "максимум 10 циклов" и дальше пошёл новый "прогон" ? Что-то я ничего не понимаю, как с паузой между "прогонами" можно делить 8 бит на два подканала по 4.

wbr, p.s. Может, в исходном варианте сами эти два байта готовятся "с предискажениями", как-то так, чтобы удобнее было...

Как связь, _Alexander_ ? ;-)

AD> Процитированная тобой инструкция устраняет декремент в цикле. Можно ещё AD> попытаться работать сразу с байтами, но тогда придётся играть битом AD> промежуточного переноса и ещё не известно что из этого выйдет...

Это один из самых быстрых вариантов (анализ сразу двух флагов), но в 6 тактов не укладывается. (по-моему 9 на выводимый бит получилось)

До связи, Alexander! /Edward/ LocalDate 12 Sep 04 - LocalTime 09:58 ...

formatting link
мыло на: nеdеliаеv(ухо)мэйл.ру

Как связь, _Oleksandr_ ? ;-)

EN>> паралельными потоками по 4-бита. OR> Т.е. дальше они ("подканалы") взвешенно суммируются? Да. Через резисторы 1:16. EN>> таблицы и не заморачивался, но фишка в том, что оба байта _каждый_ EN>> период ШИМа уменьшаются/увеличиваются. Таблицу заполнять некогда. OR> А вот тут не понял. Раньше ещё было "перед каждым прогоном есть 8, OR> максимум 10 циклов". Так и есть. ( я имел ввиду 10 маш.циклов, т.е. 1ц=Fxtal/4) OR> Сейчас речь о том, что они каждый период уменьшаются/увеличиваются. Правильно. OR> КОГДА и ГДЕ? Это что, выходит

OR> |<----16uS---->|<- XX ->|<-2us->|<----16uS---->| OR> 1)1110000000000000 1111000000000000 OR> 2)1111111100000000 1111111100000000 OR> 0x83 +1 подг. 0x84 -/+2,4,8..

OR> XX - это некое время на получение новых двух байтов Это "другие операции устройства" OR> 2us подготовки - это "максимум 10 циклов" Вот тут вычисляются новые значения 2-х байтов (больше/меньше и насколько) OR> и дальше пошёл новый "прогон" ? Да. OR> Что-то я ничего не понимаю, как с паузой между "прогонами" можно OR> делить 8 бит на два подканала по 4. Hе 8, а 16 и не на 2, а на 4 канала по 4. Всё правильно. OR> p.s. Может, в исходном варианте сами эти два байта готовятся OR> "с предискажениями", как-то так, чтобы удобнее было... Может. Hо времени _очень_ мало, первый раз на такое нарвался, когда 20 МГц мало.. И изменить нельзя. И сказать, что "это невозможно" тоже нельзя - устройство 5 лет в эксплуатации уже.

До связи, Oleksandr! /Edward/ LocalDate 12 Sep 04 - LocalTime 10:01 ...

formatting link
мыло на: nеdеliаеv(ухо)мэйл.ру

Edward, ты ещё здесь сидишь?

Суббота Сентябрь 11 2004 09:30, Edward Nedeliaev wrote to Oleksandr Redchuk:

EN> Сейчас понадобился "такой-же, но с перломутровыми пуговицами", т.е. EN> малость подправить другие функции устройства. "Другие функции" EN> написал сразу, а вот с этим ШИМом никак не удаётся совладать. Если бы EN> он не менялся, или менялся редко, "проигрывал" бы его из таблицы и не EN> заморачивался, но фишка в том, что оба байта _каждый_ период ШИМа EN> уменьшаются/увеличиваются. Таблицу заполнять некогда. Железку EN> переделывать не дадут. Т.е. апгрейд на уровне "старый из панельки EN> вытащили, новый туда воткнули".

Hаглядная иллюстрация того, что при профессиональном подходе работа считается сделанной, только если кроме работающего устройства предъявляется полный комплект документации (схемы, прошивки, иногда и полный комплект исходников и средств разработки). Кустарщина в долговременной перспективе всегда приводит к проблемам, скупые традиционно будут платить дважды...

Георгий

Edward, ты ещё здесь сидишь?

Суббота Сентябрь 11 2004 12:05, Edward Nedeliaev wrote to Alexander Derazhne:

AD>> Есть идея. Hужно хитро подготовить данные. Что вроде AD>> byte tmp = ValueR3-1; EN> ... AD>> Сколько это в тактах на пике - увы мне... EN> Может я чего-то не понял, но столько времени только на подготовку EN> данных я тратить не могу. 8-(

Данные можно менять "в фоне", между выдачей очередных выборок. Программка всё равно получится далеко не тривиальной...

Георгий

12-Sep-04 08:09 Edward Nedeliaev wrote to Oleksandr Redchuk:

OR>> КОГДА и ГДЕ? Это что, выходит

OR>> |<----16uS---->|<- XX ->|<-2us->|<----16uS---->| OR>> 1)1110000000000000 1111000000000000 OR>> 2)1111111100000000 1111111100000000 OR>> 0x83 +1 подг. 0x84 EN> -/+2,4,8..

OR>> XX - это некое время на получение новых двух байтов EN> Это "другие операции устройства"

OR>> 2us подготовки - это "максимум 10 циклов" EN> Вот тут вычисляются новые значения 2-х байтов (больше/меньше и EN> насколько) Т.е. времени на преобразование этих двух байтов к более удобному виду для генерации ШИМ нет вообще?

OR>> Что-то я ничего не понимаю, как с паузой между "прогонами" можно OR>> делить 8 бит на два подканала по 4. EN> Hе 8, а 16 и не на 2, а на 4 канала по 4. Всё правильно. Ну где-то проскочило "фактически 2 8-ми битных канала" Не столь важно (с точки зрения вывода ШИМ-а).

Ещё раз - цикл работы:

1) "другие операции устройства" 2) подготовка двух байтов для ШИМ (возможно, в "предискажённом" виде) 3) выдача одного "периода ШИМ" из 16 "тактов" по максимум 6 машциклов. 4) goto 1

Если в 3 - таки выдача ОДНОГО периода, то "что-то я не понимаю", как можно при этом расщеплять/взвешивать, если среднее напряжение зависит от длительности в том числе 1) и 2). Или там время фиксированное?

wbr, p.s. Пока у меня вышло 10Tcyc на квант ШИМ-а, все каналы вместе без сдвижки. Только на вход надо подавать 4 ниббла в раздельных ячейках. Раз "там" таки есть сдвиг на 1 квант ШИМ-а, значит это таки что-то даёт :-)

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required