Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Продукция MICROCHIP

Продукция MICROCHIP Технические вопросы по всей продукции Microchip

Ответ
 
Опции темы Опции просмотра
Старый 25.09.2008, 12:21   #1
maagalex
Senior Member
 
Аватар для maagalex
 
Регистрация: 25.02.2007
Адрес: &Alex==Israel.BatYam
Возраст: 44
Сообщений: 4,681
Вес репутации: 2476/120
maagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond repute
Отправить сообщение для maagalex с помощью ICQ Отправить сообщение для maagalex с помощью MSN Отправить сообщение для maagalex с помощью Skype™
По умолчанию как-бы мне преобразовать число в шестнадцатеричное для отображения как десятеричное?..

то есть от 1 до 9 оставлять как есть, а вместо 10 уже должно быть 16 ("10HEX") и тд..Зачем-просто в моём модуле LCD есть команды вывода только шестнадцатеричных чисел, а переписывать модуль нехочется
maagalex вне форума   Ответить с цитированием
Старый 25.09.2008, 12:35   #2
masterzx
Senior Member
 
Аватар для masterzx
 
Регистрация: 21.09.2007
Адрес: Барнаул
Возраст: 34
Сообщений: 1,507
Вес репутации: 826/71
masterzx is a splendid one to beholdmasterzx is a splendid one to beholdmasterzx is a splendid one to beholdmasterzx is a splendid one to beholdmasterzx is a splendid one to beholdmasterzx is a splendid one to beholdmasterzx is a splendid one to behold
Отправить сообщение для masterzx с помощью ICQ
По умолчанию Ответ: как-бы мне преобразовать число в шестнадцатеричное для отображения как десятеричное?..

до какого числа?
до 99 или больше
masterzx вне форума   Ответить с цитированием
Старый 25.09.2008, 12:42   #3
maagalex
Senior Member
 
Аватар для maagalex
 
Регистрация: 25.02.2007
Адрес: &Alex==Israel.BatYam
Возраст: 44
Сообщений: 4,681
Вес репутации: 2476/120
maagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond repute
Отправить сообщение для maagalex с помощью ICQ Отправить сообщение для maagalex с помощью MSN Отправить сообщение для maagalex с помощью Skype™
По умолчанию Ответ: как-бы мне преобразовать число в шестнадцатеричное для отображения как десятеричное?..

намного больше..до 3000 хотя-бы..
..до 99 у меня получилось что-то вроде ((Х/10)*6)+Х

наверное нет лёгких путей..мне проще поделить число на 10 много раз и выводить каждый разряд символом

попробую так
Код:
 
clock++;
clockh++;
if (clockh==10)
{
clock+=5;
clockh=0;
}

Последний раз редактировалось maagalex; 25.09.2008 в 13:03.
maagalex вне форума   Ответить с цитированием
Старый 25.09.2008, 13:05   #4
masterzx
Senior Member
 
Аватар для masterzx
 
Регистрация: 21.09.2007
Адрес: Барнаул
Возраст: 34
Сообщений: 1,507
Вес репутации: 826/71
masterzx is a splendid one to beholdmasterzx is a splendid one to beholdmasterzx is a splendid one to beholdmasterzx is a splendid one to beholdmasterzx is a splendid one to beholdmasterzx is a splendid one to beholdmasterzx is a splendid one to behold
Отправить сообщение для masterzx с помощью ICQ
По умолчанию Ответ: как-бы мне преобразовать число в шестнадцатеричное для отображения как десятеричное?..

в mikroc это делается так
Код:
unsigned t = 437; char txt[6]; 
void main(){
WordToStr(t, txt);  // txt is "  437" 
for (i=0;i<7;i++){
if (txt[i]==0){ 
i=7;
}else if{
txt[i]=txt[i]-0x30;
}
}
txt[1]=txt[1]<<4;
txt[0]=txt[0] || txt[1];
txt[3]=txt[3]<<4;
txt[2]=txt[2] || txt[3];
txt[5]=txt[5]<<4;
txt[4]=txt[4] || txt[5];
txt[1]=txt[2];
txt[2]=txt[4];

}
вот еще вариант
Код:
unsigned a;
char m[6];
void main(){
a = 46621;
if (a>=0000){
 m[4]=a/10000;
 a=a-m[4]*10000;
}
if (a>=1000){
 m[3]=(a/1000);
 a=a-m[3]*1000;
}

if (a>=100 ){
m[2]=a/100;
a=a-m[2]*100;
}

if (a>=10){
m[1]=a/10;
}
 m[0]=a-m[1]*10;
}

Последний раз редактировалось masterzx; 25.09.2008 в 14:15.
masterzx вне форума   Ответить с цитированием
Старый 25.09.2008, 20:18   #5
majorPAE
Super Moderator
 
Аватар для majorPAE
 
Регистрация: 26.02.2007
Возраст: 58
Сообщений: 2,221
Вес репутации: 2214/94
majorPAE has a reputation beyond reputemajorPAE has a reputation beyond reputemajorPAE has a reputation beyond reputemajorPAE has a reputation beyond reputemajorPAE has a reputation beyond reputemajorPAE has a reputation beyond reputemajorPAE has a reputation beyond reputemajorPAE has a reputation beyond reputemajorPAE has a reputation beyond reputemajorPAE has a reputation beyond reputemajorPAE has a reputation beyond repute
Отправить сообщение для majorPAE с помощью ICQ Отправить сообщение для majorPAE с помощью Skype™
По умолчанию Ответ: как-бы мне преобразовать число в шестнадцатеричное для отображения как десятеричное?..

Блин, Алекс, еще и тебя учить пользоваться поиском по форуму?
http://www.microchip.su/tags.php?tag=bin2bcd
Сам, не далее как вчера этот вопрос для TIC5234 решил аналогично...
Вот такой вариант для себя использовал:
Код:
unsigned char LCDOut[5]={15,32,19,19,30};    // набор символов по включению

void Int2LCD(unsigned int m)
{
int step[]={10000,1000,100,10,1};
unsigned int temp,val;
char i,atemp;

val=m;

 for (i=0; i<5; i++)
 {
    temp=step[i];
    atemp=0;
    while(val >= temp)
      {
        atemp++;
        val-=temp;
      }
    LCDOut[i]=atemp;
  }
  for(i=0;((i<=3)&&(LCDOut[i]==0));i++) LCDOut[i]=37;    // гасим лидирующие "0"
}    // end Int2LCD
"37" у меня соответствует гашению всех сегментов.
__________________
ЗАКОH ТРУДHОСТЕЙ БИЛЛИHГСА: Большинство тpyдностей пpоисходит оттого, что мы слишком быстpо говоpим ДА и недостаточно быстpо - НЕТ.(с)
"Очередной шаг вперед, как правило, результат хорошего пинка в зад!"(С)

Последний раз редактировалось majorPAE; 25.09.2008 в 21:29.
majorPAE вне форума   Ответить с цитированием
Старый 27.09.2008, 15:53   #6
Weriko
Member
 
Регистрация: 25.09.2008
Сообщений: 37
Вес репутации: 100/45
Weriko will become famous soon enoughWeriko will become famous soon enough
По умолчанию Ответ: как-бы мне преобразовать число в шестнадцатеричное для отображения как десятеричное?..

я делал примерно так:

Код:
void ShowHi(double hi)
 {
  int tmp0 = 0, tmp1 = 0, tmp2 = 0, tmp3 = 0, tmp4 = 0, tmp5 = 0, tmp6 = 0;
  unsigned long temp_hi = (unsigned long)(hi*100);
  long temp = 0;
 
  temp = temp_hi;
  while(1)
  {
      temp -= 1000000;
      if(temp > 0)
      {
          tmp0++;
          continue;
      }
      break;
  }
 
  temp = (temp_hi - 1000000*tmp0);
  while(1)
  {
      temp -= 100000;
      if(temp > 0)
      {
          tmp1++;
          continue;
      }
      break;
  }
 
  temp = (temp_hi - 1000000*tmp0 - 100000*tmp1);
  while(1)
  {
      temp -= 10000;
      if(temp > 0)
      {
          tmp2++;
          continue;
      }
      break;
  }
 
  temp = (temp_hi - 1000000*tmp0 - 100000*tmp1 - 10000*tmp2);
  while(1)
  {
      temp -= 1000;
      if(temp > 0)
      {
          tmp3++;
          continue;
      }
      break;
  }
 
  temp = (temp_hi - 1000000*tmp0 - 100000*tmp1 - 10000*tmp2 - 1000*tmp3);
  while(1)
  {
      temp -= 100;
      if(temp > 0)
      {
          tmp4++;
          continue;
      }
      break;
  }
 
  temp = (temp_hi - 1000000*tmp0 - 100000*tmp1 - 10000*tmp2 - 1000*tmp3 - 100*tmp4);
  while(1)
  {
      temp -= 10;
      if(temp > 0)
      {
          tmp5++;
          continue;
      }
      break;
  }
 
  temp = (temp_hi - 1000000*tmp0 - 100000*tmp1 - 10000*tmp2 - 1000*tmp3 - 100*tmp4 - 10*tmp5);
  while(1)
  {
      temp -= 1;
      if(temp > 0)
      {
          tmp6++;
          continue;
      }
      break;
  }
 
  WriteLCDCmd(SecondLCDLine);
  WriteLCDData(tmp0);
  WriteLCDData(tmp1);
  WriteLCDData(tmp2);
  WriteLCDData(tmp3);
  WriteLCDData(tmp4);
  WriteLCDData(0x2E);  //поставили точку
  WriteLCDData(tmp5);
  WriteLCDData(tmp6);
 }

Последний раз редактировалось Weriko; 30.09.2008 в 16:13. Причина: Пожалей глаза других! Хоть двойку бы поставил ;) + исправил выравнивания
Weriko вне форума   Ответить с цитированием
Старый 27.09.2008, 16:43   #7
vitalka
Super Moderator
 
Аватар для vitalka
 
Регистрация: 19.03.2007
Адрес: Львов
Возраст: 45
Сообщений: 3,334
Вес репутации: 2341/106
vitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond repute
По умолчанию Ответ: как-бы мне преобразовать число в шестнадцатеричное для отображения как десятеричное?..

>> majorPAE; Причина: Пожалей глаза других! Хоть двойку бы поставил
пожалеть нужно наш мозг...

vitalka вне форума   Ответить с цитированием
Старый 29.09.2008, 23:17   #8
urry
Senior Member
 
Аватар для urry
 
Регистрация: 11.10.2007
Возраст: 58
Сообщений: 462
Вес репутации: 228/54
urry has a spectacular aura abouturry has a spectacular aura abouturry has a spectacular aura about
По умолчанию Ответ: как-бы мне преобразовать число в шестнадцатеричное для отображения как десятеричное?..

Ребята, ну так нельзя... Человек искренне уверен, что все сделал правильно, раз работает, а 2 модератора побурчали что-то и все ... Расскажите, что процедура умножения тянет за собой библиотеку, что это все - нерациональное использование ресурсов камня... Для 7 разрядов.. Хм...
Код:
unsigned char LCDOut[7]={15,32,19,19,30,0,0};    // набор символов по включению
const  unsigned long step[7]={1000000,100000,10000,1000,100,10,1};
void long2LCD(  unsigned long m)
{
 unsigned long temp,val;
char i,atemp;

val=m;

 for (i=0; i<7; i++)
 {
    temp=step[i];
    atemp=0;
    while(val >= temp)
      {
        atemp++;
        val-=temp;
      }
    LCDOut[i]=atemp;
  }

}    //
urry вне форума   Ответить с цитированием
Старый 29.09.2008, 23:29   #9
vitalka
Super Moderator
 
Аватар для vitalka
 
Регистрация: 19.03.2007
Адрес: Львов
Возраст: 45
Сообщений: 3,334
Вес репутации: 2341/106
vitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond repute
По умолчанию Ответ: как-бы мне преобразовать число в шестнадцатеричное для отображения как десятеричное?..

Цитата:
Сообщение от urry Посмотреть сообщение
Ребята, ну так нельзя... Человек искренне уверен, что все сделал правильно, раз работает, а 2 модератора побурчали что-то и все ...
ну, бурчал только я
и то, не столько на умножения всякие (если устраивает по скорости и коду, значит так тому и быть), сколько на нечитабельность даже после форматирования (continue, break)
уж лучше тогда как-нибудь sprintf присобачить...
vitalka вне форума   Ответить с цитированием
Старый 30.09.2008, 00:13   #10
Weriko
Member
 
Регистрация: 25.09.2008
Сообщений: 37
Вес репутации: 100/45
Weriko will become famous soon enoughWeriko will become famous soon enough
По умолчанию Ответ: как-бы мне преобразовать число в шестнадцатеричное для отображения как десятеричное?..

Цитата:
Сообщение от urry Посмотреть сообщение
Ребята, ну так нельзя... Человек искренне уверен, что все сделал правильно, раз работает.....
Так действительно компактнее выглядит.
Но умножение надо было всё-равно. + цикл просто развёрнут для увеличения скорости счёта (не люблю for ).

2 VITALKA:
выравнивания было лень исправлять) + подумал, что тем, кому надо - скопируют и увеличат. я не считаю, что написал "нормальный" код. но это работает.
Weriko вне форума   Ответить с цитированием
Старый 30.09.2008, 00:50   #11
fantom
Senior Member
 
Регистрация: 27.02.2007
Адрес: Рязань
Возраст: 45
Сообщений: 2,610
Вес репутации: 2570/101
fantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond repute
По умолчанию Ответ: как-бы мне преобразовать число в шестнадцатеричное для отображения как десятеричное?..

Цитата:
Сообщение от Weriko Посмотреть сообщение
(не люблю for )
Что-то личное?
fantom вне форума   Ответить с цитированием
Старый 30.09.2008, 01:21   #12
=GM=
Member
 
Регистрация: 02.08.2008
Сообщений: 37
Вес репутации: 135/46
=GM= will become famous soon enough=GM= will become famous soon enough
По умолчанию Мои два пенса для хорошего кода:

1) заменить atemp=0; на atemp=0х30; поскольку символы выводятся на экран.
2) исключить последний цикл на проверку на 1, просто поставить LCDOut[6]=val+0х30;
=GM= вне форума   Ответить с цитированием
Старый 30.09.2008, 04:12   #13
masterzx
Senior Member
 
Аватар для masterzx
 
Регистрация: 21.09.2007
Адрес: Барнаул
Возраст: 34
Сообщений: 1,507
Вес репутации: 826/71
masterzx is a splendid one to beholdmasterzx is a splendid one to beholdmasterzx is a splendid one to beholdmasterzx is a splendid one to beholdmasterzx is a splendid one to beholdmasterzx is a splendid one to beholdmasterzx is a splendid one to behold
Отправить сообщение для masterzx с помощью ICQ
По умолчанию Ответ: как-бы мне преобразовать число в шестнадцатеричное для отображения как десятеричное?..

Немного оптимизированный на скорость выполнения
Код:
char m[7];
unsigned long temp,a;
const  unsigned long step[7]={1000000,100000,10000,1000,100,10,1};
char i,atemp,a1;
void main(){
a = 99;
if (a>=1000000){
a1=0;
} else if (a>=100000){
a1=1;
goto htod;
}else if (a>=10000){
 a1=2;
 goto htod;
}else if (a>=1000){
a1=3;
goto htod;
}else if (a>=100 ){
a1=4;
goto htod;
} else if (a>=10){
a1=5;
goto htod;
}else {
m[6]=a;
goto end1;}
htod: ;
for (i=a1; i<7; i++)
 {
    temp=step[i];
    atemp=0;
    while(a >= temp)
      {
        atemp++;
        a-=temp;
      }
    m[i]=atemp;
  }
end1: ;
}
__________________
Если проблему можно решить за деньги, то это не проблема, это расходы. Еврейская мудрость.
masterzx вне форума   Ответить с цитированием
Старый 30.09.2008, 16:15   #14
Weriko
Member
 
Регистрация: 25.09.2008
Сообщений: 37
Вес репутации: 100/45
Weriko will become famous soon enoughWeriko will become famous soon enough
По умолчанию Ответ: как-бы мне преобразовать число в шестнадцатеричное для отображения как десятеричное?..

Цитата:
Сообщение от fantom Посмотреть сообщение
Что-то личное?
Нет. Просто привык разворачивать циклы для ускорения, если память позволяет.
Weriko вне форума   Ответить с цитированием
Старый 01.10.2008, 11:28   #15
Greg
Super Moderator
 
Регистрация: 25.02.2007
Адрес: Moscow, ODBS
Сообщений: 7,048
Вес репутации: 6060/180
Greg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond repute
По умолчанию круто

Цитата:
Сообщение от Weriko Посмотреть сообщение
я делал примерно так:

Код:
void ShowHi(double hi)
 {
  int tmp0 = 0, tmp1 = 0, tmp2 = 0, tmp3 = 0, tmp4 = 0, tmp5 = 0, tmp6 = 0;
  unsigned long temp_hi = (unsigned long)(hi*100);
  long temp = 0;
 
  temp = temp_hi;
  while(1)
  {
      temp -= 1000000;
      if(temp > 0)
      {
          tmp0++;
          continue;
      }
      break;
  }
 
  temp = (temp_hi - 1000000*tmp0);
  while(1)
  {
      temp -= 100000;
      if(temp > 0)
      {
          tmp1++;
          continue;
      }
      break;
  }
 
  temp = (temp_hi - 1000000*tmp0 - 100000*tmp1);
  while(1)
  {
      temp -= 10000;
      if(temp > 0)
      {
          tmp2++;
          continue;
      }
      break;
  }
 
  temp = (temp_hi - 1000000*tmp0 - 100000*tmp1 - 10000*tmp2);
  while(1)
  {
      temp -= 1000;
      if(temp > 0)
      {
          tmp3++;
          continue;
      }
      break;
  }
 
  temp = (temp_hi - 1000000*tmp0 - 100000*tmp1 - 10000*tmp2 - 1000*tmp3);
  while(1)
  {
      temp -= 100;
      if(temp > 0)
      {
          tmp4++;
          continue;
      }
      break;
  }
 
  temp = (temp_hi - 1000000*tmp0 - 100000*tmp1 - 10000*tmp2 - 1000*tmp3 - 100*tmp4);
  while(1)
  {
      temp -= 10;
      if(temp > 0)
      {
          tmp5++;
          continue;
      }
      break;
  }
 
  temp = (temp_hi - 1000000*tmp0 - 100000*tmp1 - 10000*tmp2 - 1000*tmp3 - 100*tmp4 - 10*tmp5);
  while(1)
  {
      temp -= 1;
      if(temp > 0)
      {
          tmp6++;
          continue;
      }
      break;
  }

можно сравнить ваш код с упоминавшейся "классикой" http://www.microchip.su/showthread.php?p=34825#poststop

ваш немного модернизированный (даже укороченный - выкинуты флоаты, вы же всё равно преобразуете unsigned long) фрагмент даёт 5400 циклов при 1560 словах памяти. Сравните с результатами упомянутых фрагментов для 7 девяток - 75 слов и 960 циклов, 260 слов и 2000 циклов и т.д.
Т.е. по размеру и скорости вы проигрываете всем в разы и больше(в том числе даже стандартному sprintf - он берёт 940 слов памяти, правда исполняется 19000 циклов).
Надо было сильно подумать, прежде чем рекомендовать подобное творение.
Greg вне форума   Ответить с цитированием
Старый 01.10.2008, 12:38   #16
qwer
Senior Member
 
Регистрация: 29.04.2008
Возраст: 60
Сообщений: 127
Вес репутации: 114/48
qwer will become famous soon enoughqwer will become famous soon enough
По умолчанию Ответ: круто

Может не много не в тему, я про оптимизацию. Указанные алгоритмы не самые быстрые и не самые короткие. Могу предложить для тех же семи девяток код из 44 инструкций за 830 циклов.

Код:
int_to_decs
        clrf    DECS+0
        clrf    DECS+1
        clrf    DECS+2
        clrf    DECS+3
        clrf    DECS+4
        clrf    DECS+5
        clrf    DECS+6
        movlw   .24
        movwf   COUNTER
        movlw   .246
int_to_decs_1
        rlf     INT+0, F
        rlf     INT+1, F
        rlf     INT+2, F
        rlf     DECS+0, F
        addwf   DECS+0, F
        rlf     DECS+1, F
        addwf   DECS+1, F
        rlf     DECS+2, F
        addwf   DECS+2, F
        rlf     DECS+3, F
        addwf   DECS+3, F
        rlf     DECS+4, F
        addwf   DECS+4, F
        rlf     DECS+5, F
        addwf   DECS+5, F
        rlf     DECS+6, F
        addwf   DECS+6, F
        btfsc   DECS+0, 7
        subwf   DECS+0, F
        btfsc   DECS+1, 7
        subwf   DECS+1, F
        btfsc   DECS+2, 7
        subwf   DECS+2, F
        btfsc   DECS+3, 7
        subwf   DECS+3, F
        btfsc   DECS+4, 7
        subwf	DECS+4, F
        btfsc   DECS+5, 7
        subwf   DECS+5, F
        btfsc   DECS+6, 7
        subwf   DECS+6, F
        decfsz  COUNTER, F
        goto    int_to_decs_1
        return
qwer вне форума   Ответить с цитированием
Старый 01.10.2008, 12:52   #17
Greg
Super Moderator
 
Регистрация: 25.02.2007
Адрес: Moscow, ODBS
Сообщений: 7,048
Вес репутации: 6060/180
Greg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond repute
По умолчанию спасибо

Цитата:
Сообщение от qwer Посмотреть сообщение
Может не много не в тему, я про оптимизацию. Указанные алгоритмы не самые быстрые и не самые короткие. Могу предложить для тех же семи девяток код из 44 инструкций за 830 циклов.

Код:
int_to_decs
        clrf    DECS+0
        clrf    DECS+1
        clrf    DECS+2
        clrf    DECS+3
        clrf    DECS+4
        clrf    DECS+5
        clrf    DECS+6
        movlw   .24
        movwf   COUNTER
        movlw   .246
int_to_decs_1
        rlf     INT+0, F
        rlf     INT+1, F
        rlf     INT+2, F
        rlf     DECS+0, F
        addwf   DECS+0, F
        rlf     DECS+1, F
        addwf   DECS+1, F
        rlf     DECS+2, F
        addwf   DECS+2, F
        rlf     DECS+3, F
        addwf   DECS+3, F
        rlf     DECS+4, F
        addwf   DECS+4, F
        rlf     DECS+5, F
        addwf   DECS+5, F
        rlf     DECS+6, F
        addwf   DECS+6, F
        btfsc   DECS+0, 7
        subwf   DECS+0, F
        btfsc   DECS+1, 7
        subwf   DECS+1, F
        btfsc   DECS+2, 7
        subwf   DECS+2, F
        btfsc   DECS+3, 7
        subwf   DECS+3, F
        btfsc   DECS+4, 7
        subwf	DECS+4, F
        btfsc   DECS+5, 7
        subwf   DECS+5, F
        btfsc   DECS+6, 7
        subwf   DECS+6, F
        decfsz  COUNTER, F
        goto    int_to_decs_1
        return

никто не спорит, что не самые быстрые и не самые короткие.
Там тем более всё на Си, и прибижение очень хорошее (счёт на десятки процентов).
А сколько ваш код даст для 8 разрядов? Без комментариев тяжело.
Greg вне форума   Ответить с цитированием
Старый 01.10.2008, 13:07   #18
qwer
Senior Member
 
Регистрация: 29.04.2008
Возраст: 60
Сообщений: 127
Вес репутации: 114/48
qwer will become famous soon enoughqwer will become famous soon enough
По умолчанию Ответ: спасибо

Цитата:
Сообщение от Greg Посмотреть сообщение
А сколько ваш код даст для 8 разрядов? Без комментариев тяжело.
1198 циклов и 50 инструкций.
Не трудно посчитать, добавляется 6 инструкций из них 4 в цикле.
qwer вне форума   Ответить с цитированием
Старый 01.10.2008, 13:14   #19
Greg
Super Moderator
 
Регистрация: 25.02.2007
Адрес: Moscow, ODBS
Сообщений: 7,048
Вес репутации: 6060/180
Greg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond repute
По умолчанию Ответ: спасибо

Цитата:
Сообщение от qwer Посмотреть сообщение
1198 циклов и 50 инструкций.
Не трудно посчитать, добавляется 6 инструкций из них 4 в цикле.
да, это всё в районе оптимальных значений
http://www.piclist.com/techref/micro...u-24b9d-xx.htm

очень сильно режет глаз, когда разница в разы или десятки раз и это выставляется как некий образец
Greg вне форума   Ответить с цитированием
Старый 01.10.2008, 13:15   #20
DL36
Senior Member
 
Регистрация: 25.02.2007
Адрес: Херсон
Сообщений: 3,642
Вес репутации: 1983/105
DL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant future
По умолчанию Ответ: круто

Цитата:
Сообщение от qwer Посмотреть сообщение
Может не много не в тему, я про оптимизацию. Указанные алгоритмы не самые быстрые и не самые короткие. Могу предложить для тех же семи девяток код из 44 инструкций за 830 циклов.
Спасибо, по свободе оформлю в виде асмовского модуля.
DL36 вне форума   Ответить с цитированием
Старый 01.10.2008, 13:32   #21
qwer
Senior Member
 
Регистрация: 29.04.2008
Возраст: 60
Сообщений: 127
Вес репутации: 114/48
qwer will become famous soon enoughqwer will become famous soon enough
По умолчанию Ответ: спасибо

Цитата:
Сообщение от Greg Посмотреть сообщение
Хороший алгоритм, мне нравится. Только я указал 1198 циклов когда на входе 32 бита. Если сравнивать, то для 24 бит будет 878 циклов и 49 инструкций.
qwer вне форума   Ответить с цитированием
Старый 01.10.2008, 15:34   #22
qwer
Senior Member
 
Регистрация: 29.04.2008
Возраст: 60
Сообщений: 127
Вес репутации: 114/48
qwer will become famous soon enoughqwer will become famous soon enough
По умолчанию Ответ: спасибо

Посмотрел пример по указанной ссылке http://www.piclist.com/techref/micro...u-24b9d-xx.htm, указано 25 инструкций и 1242 цикла.
Посчитал, на самом деле участвуют 43 инструкции.
На 6 инструкций меньше чем я предложил код оптимизированный код по скорости.
Зацепило мое самолюбие, вот решил сделать короче код. Сделал, протестировал на реальном устройстве - работает. Замерил количество циклов - разочарование - мой код использует 2497 инструкций для 24-битного целого и 8 десятичных разрядов.
Вроде причин нет, так сильно отличатся в худшую сторону.
Вот решил проверить код по указанной ссылке, оказывается, использует 3086 циклов вместо 1242. Может и на Cи далеко от заявленных 960 циклов?
Вот только что сотряпанный оптимизированный код по длине для 24 бит и 8 десятичных разрядов - 29 инструкций и 2497 циклов.
Код:
int_to_decs
    movlw   DECS+8
    movwf   FSR
    movlw   .8
    movwf   COUNTER2
int_to_decs_1
    decf    FSR, F
    clrf    INDF
    decfsz  COUNTER2
    goto    int_to_decs_1
    movlw   .24
    movwf   COUNTER
    movlw   .246
int_to_decs_2
    rlf     INT+0, F
    rlf     INT+1, F
    rlf     INT+2, F
    bsf     COUNTER2, 3     ; с ноля 8
int_to_decs_3
    rlf     INDF, F
    addwf   INDF, F
    incf    FSR, F
    decfsz  COUNTER2, F
    goto    int_to_decs_3
    bsf     COUNTER2, 3     ; с ноля 8
int_to_decs_4
    decf    FSR, F
    btfsc   INDF, 7
    subwf   INDF, F
    decfsz  COUNTER2, F
    goto    int_to_decs_4
    decfsz  COUNTER, F
    goto    int_to_decs_2
    return

Последний раз редактировалось qwer; 01.10.2008 в 16:44.
qwer вне форума   Ответить с цитированием
Старый 01.10.2008, 18:16   #23
IgorV
Senior Member
 
Аватар для IgorV
 
Регистрация: 25.02.2007
Адрес: всем пока
Возраст: 50
Сообщений: 4,100
Вес репутации: 1883/109
IgorV has a brilliant futureIgorV has a brilliant futureIgorV has a brilliant futureIgorV has a brilliant futureIgorV has a brilliant futureIgorV has a brilliant futureIgorV has a brilliant futureIgorV has a brilliant futureIgorV has a brilliant futureIgorV has a brilliant futureIgorV has a brilliant future
Отправить сообщение для IgorV с помощью Skype™
По умолчанию Ответ: спасибо

Цитата:
Сообщение от qwer Посмотреть сообщение
Посмотрел пример по указанной ссылке http://www.piclist.com/techref/micro...u-24b9d-xx.htm, указано 25 инструкций и 1242 цикла.
Посчитал, на самом деле участвуют 43 инструкции.....
вот рубились (один из разов, смотрим ещё на даты) за время размер... кому это нафиг надо то?
Затачивать на время спички в качестве зубочисток, оттачивать мастерство затачивания
IgorV вне форума   Ответить с цитированием
Старый 01.10.2008, 18:26   #24
qwer
Senior Member
 
Регистрация: 29.04.2008
Возраст: 60
Сообщений: 127
Вес репутации: 114/48
qwer will become famous soon enoughqwer will become famous soon enough
По умолчанию Ответ: спасибо

Цитата:
Сообщение от IgorV Посмотреть сообщение
вот рубились (один из разов, смотрим ещё на даты) за время размер... кому это нафиг надо то?
Вам это конечно не нужно.
qwer вне форума   Ответить с цитированием
Старый 01.10.2008, 18:54   #25
Greg
Super Moderator
 
Регистрация: 25.02.2007
Адрес: Moscow, ODBS
Сообщений: 7,048
Вес репутации: 6060/180
Greg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond repute
По умолчанию Ответ: спасибо

Цитата:
Сообщение от qwer Посмотреть сообщение
Вам это конечно не нужно.
главное - это конечно размер. Когда дело доходит до индикации (а зачем ещё эти программы нужны) лишняя сотня циклов особо ничего не решает. А вот что код уже может поместиться в 12F508, 12F6xx или MSP430F2101 - это принципиально
Greg вне форума   Ответить с цитированием
Ответ

Метки
int2ascii, tic5234


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +3, время: 16:51.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd. Перевод: zCarot