POlSS0N

Оптимизация кода

4 сообщения в этой теме

POlSS0N    2

Есть вот такой участок:

temp += value;
curval = (temp >> 14);
temp <<= 10;
temp >>= 10;
CCPR1L=(curval >> 2);
pwmt=(curval << 14) >> 10;
CCP1CON=12+pwmt;
TMR2IF=0;

Это кусок процедуры прерывания по срабатыванию таймера TMR2 который управляет ШИМом.

Собственно задача этого куска - сделать из 10-битного ШИМа псевдо 24-битный.

Для этого существует 24-битное (short long) число-значение value и 24-битный текущий счетчик temp.

По задумке каждый вызов таймера temp увеличивается на величину значения value и его старшие 10 бит загружаются в ШИМ и очищаются, а младшие разряды тем самым служат для возможности плавного псевдо24-битного регулирования, периодически увеличивая загружаемое значение.

Однако несмотря на то, что тут использованы только сдвиги и сложения, по осциллографу видно, что за один прогон таймера эта процедура выполниться не успевает. Фактически она занимает три прогона, то есть порядка 3000 циклов. На мой взгляд тут максимум всё это дело тянет на 300-400 циклов.

Можно ли как нибудь данную процедуру оптимизировать?

Контроллер 16HV616@8MHZ

компилятор hi-tech-picc v9.80

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Быстрый заказ печатных плат

Полный цикл производства PCB по низким ценам!

  • x
    мм
Заказать Получить купон на $5.00
ARV    214

Я так понимаю, вот это

59 минут назад, POlSS0N сказал:

temp <<= 10; temp >>= 10;

есть ничто иное, как гениальная очистка старших битов?! не знаю, как там в PICах, но вообще говоря сдвиги делаются циклом, что никак не повышает быстродействие! неужели нельзя оставить младшие 10 битов простым арифметическим И?!

temp &= 0x03FF;

И касательно странных сдвигов при вычислении pwmt тоже надо разобраться...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
IMXO    1 056
В 21.01.2017 в 17:22, POlSS0N сказал:

По задумке каждый вызов таймера temp увеличивается на величину значения value и его старшие 10 бит загружаются в ШИМ и очищаются, а младшие разряды тем самым служат для возможности плавного псевдо24-битного регулирования, периодически увеличивая загружаемое значение.

 

В 21.01.2017 в 17:22, POlSS0N сказал:

Можно ли как нибудь данную процедуру оптимизировать?

глупость канешна, но можно...

;*** в описании

#define Lo(param) (*((char *)&param))
#define Hi(param) (*((char *)&param +1))
#define Hihger(param) (*((char *)&param+2))

short long temp,value;

; *** в прерывании

temp+=value;
CCPR1L=Hi(temp);
CCPR1L=(CCPR1L>>2)&0b00110000;
CCP1CON=(CCP1CON&0b11001111) | CCPR1L;
CCPR1L=Hihger(temp);
temp&=0x3FFF;

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
IMXO    1 056

 

если время критично , то через ассемблерную вставку
 

  asm(" BANKSEL _temp");
  asm(" movfw (_temp+1) ");
  asm(" BANKSEL CCPR1L");
  asm(" movwf CCPR1L ");
  asm(" rrf CCPR1L,f");
  asm(" rrf CCPR1L,f");
  asm("movlw b'00110000' ");
  asm(" andwf CCPR1L ,f");
  asm(" movlw b'11001111' ");
  asm(" andwf CCP1CON,w");
  asm(" iorwf CCPR1L,w");
  asm(" movwf CCP1CON ");
  asm(" BANKSEL _temp");
  asm(" movfw (_temp+1) ");
  asm(" BANKSEL CCPR1L");
  asm(" movwf CCPR1L ");

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сообщения

    • Всем привет. Помогите определить это чудо )))
    • "Не ищи дурее себя" (с) Это так мой тесть любил говорить... Товарищи понимают Вами изрекаемое гораздо лучше, чем Вы можете себе представить. Могу сказать, что время на поиск проблем связанных с "нюансами реализации" компиляторов становится пренебрежимо малым, если  УГЛУБЛЯТЬСЯ в эти самые нюансы. ЗЫ. Эмбеддед системы отличаются тем, что по самый небалуй напичканы принципиальными противоречиями со стандартным Си. Именно поэтому в реальных проектах перенести код на иную платформу без его  переписывания заново практически невозможно.
    • Ну тогда можно попробовать иначе, наоборот, фиксировать отсутствие каких либо сигналов.
    • Тема таки снова стала актуальной.   Сварочник был вынут из закромов для починки. Может кто все ж подскажет что-то по теме? Заранее весьма благодарен!  Сделал насколько фот в полуразобранном виде. Ничего особо сильно не видно, все как-то запутанно...  Причем из корпуса без выпаивания не все и вынешь! На пример на втором фото видно, что присоединенные к мощным конденсаторам провода выходят из под них и продеты через перемычку в корпусе. Начал их вытаскивать, а провода не дают. Вероятно отпаивать/отсоединять где-то под ними надо, чтобы вытащить... 
    • @Ahneus , переделка ЗУ - не решает проблему.
      А если зарядить надо будет в гостях?
      С собой ЗУ таскать?
    • Темброблок  наладил, все хорошо работает. Пробовал Снижать  напряжение со 165 В до 110 на анодах. Генерация  так и осталась.Попробовал зашунтировать выход предусилителя конденсатором  0,05  мкФ генерация появляется значительно позже ближе к концу. Но заметил , что если предусилитель полностью на минимуме(звука нет ) и если прибавлять громкость на входе основного усилителя без конденсатора генерация сразу появляется, с шунтирующим конденсатором нет,  до максимума.