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

Как связь, _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(ухо)мэйл.ру

Reply to
Edward Nedeliaev
Loading thread data ...

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

Reply to
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

Reply to
Leha Bishletov

Как связь, _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(ухо)мэйл.ру

Reply to
Edward Nedeliaev

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

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

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

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

Reply to
Edward Nedeliaev

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

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

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

Reply to
Sergey A. Borshch

Как связь, _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(ухо)мэйл.ру

Reply to
Edward Nedeliaev

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

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

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

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

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

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

Reply to
Sergey A. Borshch

Как связь, _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(ухо)мэйл.ру

Reply to
Edward Nedeliaev
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,

Reply to
Oleksandr Redchuk

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

Reply to
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(ухо)мэйл.ру

Reply to
Edward Nedeliaev

Как связь, _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(ухо)мэйл.ру

Reply to
Edward Nedeliaev

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

Reply to
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. Может, в исходном варианте сами эти два байта готовятся "с предискажениями", как-то так, чтобы удобнее было...

Reply to
Oleksandr Redchuk

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

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

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

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

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

Reply to
Edward Nedeliaev

Как связь, _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(ухо)мэйл.ру

Reply to
Edward Nedeliaev

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

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

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

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

Георгий

Reply to
George Shepelev

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

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

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

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

Георгий

Reply to
George Shepelev
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 квант ШИМ-а, значит это таки что-то даёт :-)

Reply to
Oleksandr Redchuk

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.