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

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


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

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

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

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

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

temp &= 0x03FF;

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

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


Ссылка на сообщение
Поделиться на других сайтах
IMXO    1 229
В 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 229

 

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

  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 ");

 

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


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

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

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

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

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

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

Войти

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

Войти сейчас


  • Сообщения

    • По себе не суди. Человек приобрел некоторый опыт. И некоторые знания. Иногда это дороже намного, чем старый сгоревший хлам. И про врачей сравнение некорректное. Если у меня голова вдруг заболела, я не бегу к врачу, а просто выпью анальгинчика таблетку. И палец если порежу, то не вызываю скорую, а  йодом бинтиком сам справлюсь. Операцию по коронарному шунтированию конечно делать себе не буду. А по теме - правильно поставленный вопрос - это половина ответа. В данном случае вопрошающий накидал кучу текста и в конце меленько - я ничего не понимаю. Народ отвлекается на понимание текста и концовку не видит. Потому и ответы не соответствуют его квалификации. Ему нужно было сначала написать большими буквами  - Я НИЧЕГО НЕ ПОНИМАЮ, а потом писать все остальное. Тогда советы были бы более полезные.
    • Меня твоя плата очень заинтересовала СПАСИБО!  Бо любая даже самая отличная от твоей или моей разработки ведёт (приводит) к чему-то и пусть это будет ещё один вариант, но он будет твой-мой, но он БУДЕТ. Я разработал собрал и разобрал (из-за глупости) около десятка вариантов разводки плат и могу сказать,что модуль не склонен к нелюбви к разводке и нахождению рядом с ним других узлов скажем микроконтроллер, индикатора или других плат управления и если посмотрите мою последнюю плату, то там очень большая длина двух проводников от РДА до входного разъёма и УНЧ, но никаких наводок нет. Разводка на двухсоторонке то-же будет имет иметь ещё одну сторону о которой говорить, что она тебе поможет, как спасательный круг не стоит. Это очень опасная сторона которую надо рассматривать, как сторона НА КОТОРОЙ ВСЕ ТВОИ ОШИБКИ УМНОЖАТЬСЯ. Не буду больше... ВОТ http://forum.cxem.net/index.php?/topic/59716-как-правильно-соединить-земли-в-усилителе/
    • Разберите клавиатуру, выведите на разъём (разъёмы) контакты контроллера отвечающего за нужные Вам клавиши, распаяйте кнопки на штекер (штекера). Подключайте штекера к разъёмам, и по возможности получайте удовольствие, если конечно  Вы всё сделали верно и аккуратно.  Удачи! P.S. Если Вы не поняли о чём я написал, то лучше не беритесь за этот проект.
    • А что осциллограф показывает?
    • Как минимум попробуйте повторно пропаять. Если не поможет - надо смотреть глубже будет.
    • Ну и какая клавиатура тебе понадобится? 25 лет назад,когда было время ZX-spectrum,над такой проблемой долго не задумывались.