Програмирование pic на СИ.

Поклонники продукции Microchip Technology Inc тусуются тут.
igorg1
Прорезались зубы
Сообщения: 206
Зарегистрирован: Сб дек 24, 2011 10:17:24

Re: Програмирование pic на СИ.

Сообщение igorg1 »

Ой, на маты потянуло :)
Сначала вспомним - что такое запись в одну строчку и что такое многострочная запись выражения.
Для многострочной - используют скобки :)
Ты, КРАМ, при проверке индекса в массиве сначала смотришь - соответствует н максимальному, а затем - минимальному значению - и делаешь что-то:)
т. е. ты проверяешь ДВА условия - что избыточно - если нет максимального, значит условием else if проверится на минимальное.
Условие if .... else if - или-или :)
А у тебя И и И
Разницу понимаешь????
Дальше не хочу ничего говорить.
Не меняй тапки на ходу.
По поводу почему у меня в массиве нет 0 - :)
Ты серьёзно????
Ты предлагаешь мне грузить ШИМ с НУЛЕВЫМ значением????
Зачем?
У нас нагрузка загрузится через инвертор другим полюсом - вот тебе и переход через НОЛЬ :)
Что непонятного?
А затем в дело вступит повтороитель - и всё повторится.
Ты вроде бы не дурак - но такую ахинею иногда несешь, чтобы доказать что ты прав:)
И не забывай - массив сделан для четверти полуволны:)

Добавлено after 9 minutes 17 seconds:
Ещё раз - что в своей писанине сделал Крам - он говорит - если значение, на которое ссылается ИНДЕКС больше какого-то значения - делаем то-то. И ЕСЛИ то же самое значение, на который ссылается индекс МЕНЬше чего-то - делает то-то :)
Правильно???
Так вот - один и тот же индекс в рамках ОДНОГО сравнения не может быть больше и ОДНОВРЕМЕННО меньше - я очень утрировано написал :)
т. е. если у нас индекс больше чего-то - сделали - и все.
Зачем второе условие???
Ты там что-то про машинные циклы писал и всмерть боролся на асме :) за циклы :)
А здесь разбрасываешься :)
у тебя значение в массиве bufferSMT[] по индексу iBufferSMT не может быть одновременно больше значения maxSMT и меньше значения minSMT - поэтому 2 раза проверять - ИЗБЫТОЧНО.
Это понятно?
Реклама
Rapra
Мучитель микросхем
Сообщения: 431
Зарегистрирован: Пн фев 16, 2026 17:30:02

Re: Програмирование pic на СИ.

Сообщение Rapra »

igorg1, КРАМ написал верный вариант. Чтобы понять, как это работает, надо пройти по шагам в простом примере (значения min и max заданы условно для простоты) :

Код: Выделить всё

int array[] = {50, 30, 20, 30, 50, 70, 80, 70, 50};
int max = 0, min = 100;

for(int i = 0; i < 9; i++)
{
    if(array[i] > max)
          max = array[i];

    if(array[i] < min)
          min = array[i];
}
В этом варианте значение min обновляется уже после первой итерации.
В варианте else if значение min после первой итерации обновлено НЕ будет.

PS. Еще более правильным будет сразу присвоить min и max значение первого элемента массива: min = array[0]; max = array[0].
Последний раз редактировалось Rapra Сб мар 14, 2026 15:59:56, всего редактировалось 1 раз.
Реклама
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25359
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Програмирование pic на СИ.

Сообщение КРАМ »

[uquote="igorg1",url="/forum/viewtopic.php?p=4797746#p4797746"]Ты, КРАМ, при проверке индекса в массиве сначала смотришь - соответствует н максимальному, а затем - минимальному значению - и делаешь что-то[/uquote]
Я привел цитату из своего кода. Покажи где проверяется условие по значению индекса.
Индекс везде в квадратных скобках.
[uquote="igorg1",url="/forum/viewtopic.php?p=4797746#p4797746"]Ты предлагаешь мне грузить ШИМ с НУЛЕВЫМ значением????[/uquote]
Я предлагаю его грузить текущим значением. Ноль - такое же значение, как и все остальные.
[uquote="igorg1",url="/forum/viewtopic.php?p=4797746#p4797746"]Зачем?
У нас нагрузка загрузится через инвертор другим полюсом - вот тебе и переход через НОЛЬ[/uquote]
Синус имеет ЗНАЧЕНИЕ нуля при определенном отсчете. У тебя это значение пропущено. То есть пропущен отсчет.
Соответственно синуса в требуемом виде уже не будет.
[uquote="igorg1",url="/forum/viewtopic.php?p=4797746#p4797746"]А затем в дело вступит повтороитель - и всё повторится.[/uquote]
Ты формируешь single-ended синус. То есть еще нет никаких инверторов и повторителей. А те которые есть потом, имеют однополярное питание и работают просто в противофазе, удваивая амплитуду синуса, который у входного сигнала составляет только половину питания.
Синус должен быть сформирован по формуле F(t)=A/2+(A/2)*SIN(t).
Ты приплетаешь сюда историю с мостом переключающим верхнее питание у плеч. А это тут не работает. Оба плеча должны генерировать одинаковый полный синус, но в противофазе.
igorg1
Прорезались зубы
Сообщения: 206
Зарегистрирован: Сб дек 24, 2011 10:17:24

Re: Програмирование pic на СИ.

Сообщение igorg1 »

ТО: Крам - условие не проверяется п значению индекса - я же написал - ты проверяешь условие по значению в массиве, на которое ссылается индекс.

То: Rapra - Давайте не будем додумывать что делал КРАМ - я просто знаю одно - что одно и тоже значение в массиве нельзя проверять на минимальное и максимальное значение. :)
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25359
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Програмирование pic на СИ.

Сообщение КРАМ »

[uquote="igorg1",url="/forum/viewtopic.php?p=4797746#p4797746"]поэтому 2 раза проверять - ИЗБЫТОЧНО.[/uquote]
Ты просто не в курсе как это реализуется на АСМе.
Не существует инструкций ядра, которые одновременно проверяют диапазон по двум точкам. Это принципиально невозможно на машине с одноадресной шиной ОЗУ.
Поэтому пропустить проверку при обнаружении максимума, чтобы не проверять минимум так, чтобы сократить исполняемый код, невозможно. Это будет goto или bra с теми же временными потерями.
Все переходы - это два машинных цикла.

Добавлено after 1 minute 10 seconds:
[uquote="igorg1",url="/forum/viewtopic.php?p=4797753#p4797753"]я просто знаю одно - что одно и тоже значение в массиве нельзя проверять на минимальное и максимальное значение.[/uquote]
Можно и нужно, если командная архитектура не делает различий.
Реклама
igorg1
Прорезались зубы
Сообщения: 206
Зарегистрирован: Сб дек 24, 2011 10:17:24

Re: Програмирование pic на СИ.

Сообщение igorg1 »

т. е. - если значение в массиве не является максимальным - мы проверяем на минимальное (условие if.... else if....)
А сразу (последовательно) проверять на максимальное, а затем на минимальное - это ГЛУПОСТЬ.
Реклама
Rapra
Мучитель микросхем
Сообщения: 431
Зарегистрирован: Пн фев 16, 2026 17:30:02

Re: Програмирование pic на СИ.

Сообщение Rapra »

Если min и max сразу инициализовать первым элементом массива, то можно писать и else if

Код: Выделить всё

int array[] = {50, 30, 20, 30, 50, 70, 80, 70, 50};
int max = array[0], min = array[0];

for(int i = 1; i < 9; i++)
{
     if(array[i] > max)
          max = array[i];
     else if(array[i] < min)
          min = array[i];
}
В этом случае гарантируется, что первоначально min и max равны первому элементу массива, а все последующие элементы будут либо больше, либо меньше первого элемента (либо равны ему).
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25359
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Програмирование pic на СИ.

Сообщение КРАМ »

[uquote="igorg1",url="/forum/viewtopic.php?p=4797756#p4797756"]сразу (последовательно) проверять на максимальное, а затем на минимальное - это ГЛУПОСТЬ.[/uquote]
А если значение не является ни максимальным, ни минимальным?
Таким образом, после первой проверки нужно перейти ко второй. Последовательно.
В системе команд нет ни if, ни else. И нет их вложенных комбинаций.
Поэтому никакой глупостью это не является. Более того, код в том виде, в котором он у меня будет выполнен быстрее. В аккумуляторе останется значение массива и последовательно будут выполнены два сравнения с разными константами и двумя выходами по условию. Компилятор при оптимизации свернет твой исходник в АСМе на идентичный моему. А не наоборот.
igorg1
Прорезались зубы
Сообщения: 206
Зарегистрирован: Сб дек 24, 2011 10:17:24

Re: Програмирование pic на СИ.

Сообщение igorg1 »

Ладно, распаиваю и разбираю неудавшуюся конструкцию с ОУ :( и ПИК10
Мысль вроде у Крама была - но сразу оговорки - синус не тот - да не важно, я работаю не на максимальном фронте и пр.
Как думаешь Крам - если взять дешевые ЦАП типа MCP4822 (12 бит), или прецизионную резисторную сборку советскую типа К304ИД, заточенную именно под R2R ЦАП - удача с синусоидой будет???
Спрашиваю как у старшего товарища :) - без иронии.
в случае R2R ЦАП там вообще можно сразу всё выплёвать в порт за раз - 8-ми битный камень, 8 бит ЦАП :)
Только вот грабли в пользовательском интерфейсе - кнопки ставить не охота, хочу WiFi - т. е. по определению 32 бит камень.
Индикатор будет ИВ-18
Почему опять часы?
Хочу руку набить на ТСР стеке.
на чем делать - пока думаю, склоняюсь к нордику, их 2-х ядерному nRF5340 и nRF7002. Правда у них SDK под Зефир заточена (это RTOS такая) - на голимом Си СДК не работает.

Добавлено after 1 minute 48 seconds:
[uquote="КРАМ",url="/forum/viewtopic.php?p=4797762#p4797762"][uquote="igorg1",url="/forum/viewtopic.php?p=4797756#p4797756"]сразу (последовательно) проверять на максимальное, а затем на минимальное - это ГЛУПОСТЬ.[/uquote]
А если значение не является ни максимальным, ни минимальным?
Таким образом, после первой проверки нужно перейти ко второй. Последовательно.
В системе команд нет ни if, ни else. И нет их вложенных комбинаций.
Поэтому никакой глупостью это не является. Более того, код в том виде, в котором он у меня будет выполнен быстрее. В аккумуляторе останется значение массива и последовательно будут выполнены два сравнения с разными константами и двумя выходами по условию. Компилятор при оптимизации свернет твой исходник в АСМе на идентичный моему. А не наоборот.[/uquote]

А это как?
Ты ты не инициализируешь переменные????
Возможно, но не нужно.
И я так думаю - ты брешешь - покажи весь код, как ты работаешь с минимальным и максимальным значением.
Про максимальное я уже видел :)
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25359
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Програмирование pic на СИ.

Сообщение КРАМ »

[uquote="igorg1",url="/forum/viewtopic.php?p=4797767#p4797767"]если взять дешевые ЦАП типа MCP4822 (12 бит), или прецизионную резисторную сборку советскую типа К304ИД, заточенную именно под R2R ЦАП - удача с синусоидой будет???[/uquote]
Не будет. Потому что ты так синус и не сгенерировал.
Прежде всего дело ведь не в ШИМ или ЦАП, а в математике.
Можешь взять PIC18F27Q43 и проверить это без внешних микросхем. У него есть ЦАП.
Вообще ничего не требуется. Просто измерять на ноге осциллографом. Когда отсчетов много, баг типа отсутствия нулевого отсчета маскируется и его не сразу заметишь. А когда отсчетов всего 32 на период, это сразу видно.
Ты даже не удосужился посмотреть в DMCI МПЛАБа получаемую форму синуса простой его загрузкой в массив... :facepalm:
[uquote="igorg1",url="/forum/viewtopic.php?p=4797767#p4797767"]А это как?
Ты ты не инициализируешь переменные????
Возможно, но не нужно.
И я так думаю - ты брешешь - покажи весь код, как ты работаешь с минимальным и максимальным значением.
Про максимальное я уже видел[/uquote]

Код: Выделить всё

switch (statCalc) {
            case 0:
                if (!flag.statCalcProgress) {
                    flag.statCalcProgress=1;
                    bufferSMT[0]=bufferSMT[1];
                    avgSMT=0;
                    maxSMT=0;
                    minSMT=0xFFFF;
                    iBufferSMT=0; 
                    countErrSync=0;}
                if (bufferSMT[iBufferSMT]<1600) {iTableFreq=0;} else {
                    if (bufferSMT[iBufferSMT]>2623) {iTableFreq=1023;} else {
                        iTableFreq=bufferSMT[iBufferSMT]-1600;
                    } 
                }
                bufferSMT[iBufferSMT]=tabFrequence[iTableFreq];
                if (bufferSMT[iBufferSMT]>maxSMT) {maxSMT=bufferSMT[iBufferSMT];}
                if (bufferSMT[iBufferSMT]<minSMT) {minSMT=bufferSMT[iBufferSMT];}
                iBufferSMT++;
                if (iBufferSMT>=sizeof(bufferSMT)/sizeof(bufferSMT[0])) {
                    iBufferSMT=0;
                    statCalc++;
                    flag.statCalcProgress=0;
                }
                break;
igorg1
Прорезались зубы
Сообщения: 206
Зарегистрирован: Сб дек 24, 2011 10:17:24

Re: Програмирование pic на СИ.

Сообщение igorg1 »

Слушай, что ты мне пытаешься доказать???
Ты только что проорал что для твоего камня " В системе команд нет ни if, ни else. И нет их вложенных комбинаций." Возможно. Только я знаю одно - код на языке Си не зависит от аппаратных возможностей камня, и теоретически может быть перенесён на любую платформу. Поэтому - будь любезен - пиши по СТАНДАРТУ языка Си. Что непонятного? Ты не переобувайся на ходу - шнурки могут не завязаться, споткнёшься.
И не ори что я не сделаю синус - уже на мосту сделал синус - ты видел.
Вот ради прикола - сейчас закончу начатый проект с часами на 2812 - их у меня там 256 штук в матрице - тоже BLE будет - и затем приступлю.
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25359
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Програмирование pic на СИ.

Сообщение КРАМ »

И в догон по поводу вложенных if-else.
Архитектура PIC18 имеет инструкцию доступа к ОЗУ через один из трех пар регистров FSR/INDF.
Индекс-указатель пишется в FSR, а доступ к данным получаем через окно INDF.
Вся математика сравнения делается путем записи константы в аккумулятор W и одной из инструкций сравнения с условным пропуском следующей команды. Пропускаемая команда содержит переход на код обработчик условия пропуска.
Никаких вложенных if-else - просто подряд две проверки. Если отказываться от второй, будет снова проверка и переход. Других вариантов нет.
Загрузка из массива по любому только одна. Это CISC машина с единственным РОН.

Добавлено after 9 minutes 19 seconds:
[uquote="igorg1",url="/forum/viewtopic.php?p=4797779#p4797779"]код на языке Си не зависит от аппаратных возможностей камня, и теоретически может быть перенесён на любую платформу. Поэтому - будь любезен - пиши по СТАНДАРТУ языка Си. Что непонятного? .[/uquote]
Не может. Не может он быть перенесен.
Это не ПК. Тем более, что речь идет о PIC.
Здесь все аппаратно зависимо.
Участок кода о котором идет речь, прибит гвоздями к модулю SMT.
Это 24 разрядный автоматический таймер захвата.
При переходе на ARM, где этого таймера нет, показанный код пришлось править.
Простое изменение драйверов не прокатило.
Да и твои смешные намеки на подсчет циклов, в отличии от твоего синуса в прерывании, не имеют смысла.
Обсуждаемая функция самая медленная в коде. Ее задача - не тормозить остальной код.
Она считает параметры сигнала для вывода в форму на ПК. Скорость вывода 4...5 fps. Быстрее нельзя. Будут нечитаемые величины.
igorg1
Прорезались зубы
Сообщения: 206
Зарегистрирован: Сб дек 24, 2011 10:17:24

Re: Програмирование pic на СИ.

Сообщение igorg1 »

То: КРАМ - не об этом разговор - может быть код перенесён или нет :) - писать надо по СТАНДАРТУ :)
Усёк?
Rapra
Мучитель микросхем
Сообщения: 431
Зарегистрирован: Пн фев 16, 2026 17:30:02

Re: Програмирование pic на СИ.

Сообщение Rapra »

Стандартом языка не определено, писать if или if/else if.
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25359
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Програмирование pic на СИ.

Сообщение КРАМ »

Нет, Игорек. В радиотехническом эмбедде - нет.
Но такие как ты погромисты меня устраивают.
Мне легко с ними конкурировать.
Их тупой стандартный код требует дополнительных аппаратных ресурсов и денег.
ЗЫ. И еще один очень важный нынче момент.
На неделе за обедом разговорился с коллегой программистом по поводу перспектив AI в написании кода.
Сейчас кодописатели стандартного кода мало кому нужны. А если и нужны, то за еду.
Раньше они обслуживали мидлов и сеньоров. А сейчас даже мидл посредством AI очень быстро генерирует стандартные тексты, оставляя за собой оригинальные решения.
Джун, как востребованная позиция, исчезает.
Аватара пользователя
Transformer-V
Друг Кота
Сообщения: 4252
Зарегистрирован: Пн окт 03, 2016 22:50:22
Контактная информация:

Re: Програмирование pic на СИ.

Сообщение Transformer-V »

[uquote="Rapra",url="/forum/viewtopic.php?p=4797749#p4797749"]

Код: Выделить всё

int array[] = {50, 30, 20, 30, 50, 70, 80, 70, 50};
int max = 0, min = 100;

for(int i = 0; i < 9; i++)
{
    if(array[i] > max)
          max = array[i];

    if(array[i] < min)
          min = array[i];
}
[/uquote]
Зачем так ресурсы расходовать!

Код: Выделить всё

unsigned char array[] = {50, 30, 20, 30, 50, 70, 80, 70, 50};
unsigned char max = 0, min = 100, i=9;
unsigned char *PtrArray;

//Load Addr
PtrArray=array;

while(i)
{
//printf("%d  ",*PtrArray);
if(*PtrArray>max)
{
max=*PtrArray;
}
if(*PtrArray<min)
{
min=*PtrArray;
}
PtrArray++;
i--;
}
Rapra
Мучитель микросхем
Сообщения: 431
Зарегистрирован: Пн фев 16, 2026 17:30:02

Re: Програмирование pic на СИ.

Сообщение Rapra »

Еще один умник нарисовался. Вы, гражданин, хотябы контекст обсуждения читайте. Во-вторых, printf сожрет ресурсов столько, что хватит на сто таких массивов. И в-третьих, указатель и индекс массива - вещи в данном случае взаимозаменяемые, а конкретный профит очень сильно зависит от компилятора и выбранного уровня оптимизации. Аналогично, различия в циклах for и while так же зависят от компилятора и оптимизации.
Ну, в общем, вы поняли да.

И еще.
Показанный вариант c min = 0; max = 0xfff.... - это классический "академический", как по учебнику. Оптимизированный вариант предлагает сразу min = array[0]; max = array[0]; и в этом случае можно использовать связку if - else if.
Опять же, профит от if - if или if - else if зависит от компилятора и уровня оптимизации.
Аватара пользователя
Transformer-V
Друг Кота
Сообщения: 4252
Зарегистрирован: Пн окт 03, 2016 22:50:22
Контактная информация:

Re: Програмирование pic на СИ.

Сообщение Transformer-V »

[uquote="Rapra",url="/forum/viewtopic.php?p=4797867#p4797867"]Еще один умник нарисовался. Вы, гражданин, хотябы контекст обсуждения читайте.[/uquote]
Конечно умник, а кроме твоего пустопорожнего болобольства ничего полезного.
Вот пример еще меньше:

Код: Выделить всё

unsigned char array[] = {50, 30, 20, 30, 50, 70, 80, 70, 50, 0};
unsigned char max = 0, min = 100, outval;
unsigned char *PtrArray;

//Load Addr
PtrArray=array;

while(*PtrArray)
{
outval=*PtrArray;
if(outval>max) max=outval;
if(outval<min) min=outval;
PtrArray++;
}

[uquote="Rapra",url="/forum/viewtopic.php?p=4797867#p4797867"]Во-вторых, printf сожрет ресурсов столько,[/uquote]
printf он отключен(задокументрован) и исключительно для "отладки" на компе. Так что не тебе рассказывать за оптимизацию.

Могу еще меньше код написать...

Добавлено after 2 minutes 46 seconds:
[uquote="Rapra",url="/forum/viewtopic.php?p=4797867#p4797867"]array[0]; array[0];[/uquote]
Обращение к памяти через "[ ]" солидно жрет ресурсы.
Rapra
Мучитель микросхем
Сообщения: 431
Зарегистрирован: Пн фев 16, 2026 17:30:02

Re: Програмирование pic на СИ.

Сообщение Rapra »

При включенной оптимизации -O3 на АРМ,
индекс:

Код: Выделить всё

	array[0] = 50;
	array[1] = 60;
	array[2] = 70;
20010040:	4b03      	ldr	r3, [pc, #12]	; (20010050 <main+0x10>)
20010042:	2032      	movs	r0, #50	; 0x32
20010044:	213c      	movs	r1, #60	; 0x3c
20010046:	2246      	movs	r2, #70	; 0x46
20010048:	e883 0007 	stmia.w	r3, {r0, r1, r2}
указатель:

Код: Выделить всё

	int* ptr = array;
	*ptr++ = 50;
	*ptr++ = 60;
	*ptr = 70;
20010040:	4b03      	ldr	r3, [pc, #12]	; (20010050 <main+0x10>)
20010042:	2032      	movs	r0, #50	; 0x32
20010044:	213c      	movs	r1, #60	; 0x3c
20010046:	2246      	movs	r2, #70	; 0x46
20010048:	e883 0007 	stmia.w	r3, {r0, r1, r2}
Найдите хоть одну разницу. Одинаковое число строк и полностью одинаковые инструкции.

[uquote="Transformer-V",url="/forum/viewtopic.php?p=4797868#p4797868"]while(*PtrArray)[/uquote]
- здесь грубейшая ошибка. Если в середине массива попадется значение 0 (например array[] = {10, 30, 5, 0, 7, 20, 15, 100} ), цикл прервется еще до конца массива. И наоборот, если в массиве НЕТ значения 0 ( например array[] = {70, 50, 34, 60, 10, 25} ), цикл не прервется никогда и указатель выйдет за границы массива.

В общем, прежде чем писать, все-таки используйте отладку с printf, а то ерунда у вас получается. Наберитесь вначале опыта.
igorg1
Прорезались зубы
Сообщения: 206
Зарегистрирован: Сб дек 24, 2011 10:17:24

Re: Програмирование pic на СИ.

Сообщение igorg1 »

[uquote="Rapra",url="/forum/viewtopic.php?p=4797798#p4797798"]Стандартом языка не определено, писать if или if/else if.[/uquote]
Да писать можно как угодно - только конструкция if/else if подразумевает - если первое условие выполняется - второе (и последующие) не будут выполняться. Не выполняется первое - перейдём на второе условие и т.д.
А конструкция if подразумевает, что все конструкции с if будут выполнены.
А КРАМ бъётся за каждый машинный цикл :)
Ответить

Вернуться в «PIC»