Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Прерывания от компаратора
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Страницы: 1, 2
smk
Стоит задача сначала подсчитать количество перепадов состояния компаратора, затем подсчитать длительность периода между перепадами из 0 в 1. Напрашивается использовать два разных обработчика прерываний от компаратора, конфигурируя компаратор непосредственно перед каждой задачей. Существует ли возможность использовать два разных обработчика от одного источника прерывания?
prottoss
Фактически, будет один обработчик. НО, в нем можно, к примеру, организовать статическую переменную, по которой можно будет определять текущее состояние, и переходить на соответствующую подпрограмму обработки состояния
AndryG
А зачем статическая переменная?
В прерывании смотрите конфигурационные биты компаратора и выбирайте, какой "обработчик" задействовать.
prottoss
Цитата(AndryG @ Jul 6 2007, 19:12) *
А зачем статическая переменная?
В прерывании смотрите конфигурационные биты компаратора и выбирайте, какой "обработчик" задействовать.
Можно и биты анализировать. Но, если, к примеру, вариантов обработки больше, чем битовых состояний?
Сергей Борщ
Цитата(smk @ Jul 6 2007, 13:50) *
Существует ли возможность использовать два разных обработчика от одного источника прерывания?
Да, можно создать вторую таблицу векторов в области загрузчика и переключать их битом IVSEL
prottoss
Цитата(Сергей Борщ @ Jul 6 2007, 19:22) *
Да, можно создать вторую таблицу векторов в области загрузчика и переключать их битом IVSEL
нуну, тока переключаться будут все вектора, а не тока компаратора 07.gif

ИМХО, это кЫтайское решение
smk
Цитата
организовать статическую переменную, по которой можно будет определять текущее состояние, и переходить на соответствующую подпрограмму обработки состояния


отличный совет!!!

Цитата
В прерывании смотрите конфигурационные биты компаратора и выбирайте, какой "обработчик" задействовать.


Да, это лучшее решение, уже пишу.

Обработчиков всего два. А статические переменные использую, но в "технологических" целях. Например, узнать прерывание первое или второе (запустить/остановить таймер).
smk
Теперь программа в Тиню26 не лезет. Получилось 1214 слов, а надо 1024. 20% проги выкинуть? Как сэкономить на выводе на LCD, выводить нужно всего два числа. Имеем Результат преобразования АЦП и Период TCNT0, посчитанный таймером. Ну и подписать: "U=" и "F="...
jorikdima
оптимизация по коду то включена?
smk
Вот с этим бы что-то сделать...

//вывод на LCD
void LCDDispFloat(float n, unsigned char decimals)
{
char nummer[16];
ftoa( (float)n, (unsigned char)decimals, nummer);
lcd_puts(nummer);
}


lcd_gotoxy(1,3);
lcd_putsf ("U=");
LCDDispFloat(U,0);
};

if (ACDC==1)
{
lcd_gotoxy(2,2);
lcd_putsf ("F=");
LCDDispFloat(F,2);
}
else
{
lcd_gotoxy(2,1);
#pragma rl+
lcd_putsf ("ÏÎÑÒÎßÍÍÎÅ");
#pragma rl-
};

Цитата
оптимизация по коду то включена?


да.
prottoss
Цитата(smk @ Jul 6 2007, 22:15) *
Теперь программа в Тиню26 не лезет. Получилось 1214 слов, а надо 1024. 20% проги выкинуть? Как сэкономить на выводе на LCD, выводить нужно всего два числа. Имеем Результат преобразования АЦП и Период TCNT0, посчитанный таймером. Ну и подписать: "U=" и "F="...
Советую поменять тини26 на МК с бОльшим объемом памяти программ. Возможно...возможны вы все так и втисните свой код в тини26, однако, через некоторое времея Вам захочется бОльшего, и будет мучительно больно сами понимаете за что smile.gif
smk
Цитата
Советую поменять тини26 на МК с бОльшим объемом памяти программ


Мега48. Хотя хотелось бы Тини461. Остальное по току и по И/О не пролазят.
SpyBot
Странно, почему нет printf? wink.gif

ИМХО экономия возможна на lcd_gotoxy - считать адрес вручную.
ftoa зачем вобще тут нужно??? 07.gif какие здесь могут быть числа с плавающей точкой?
smk
Цитата
ftoa зачем вобще тут нужно???


А как в десятичный формат преобразовать?
SpyBot
Цитата(smk @ Jul 6 2007, 19:10) *
А как в десятичный формат преобразовать?

использовать фиксированную точку
prottoss
Цитата(SpyBot @ Jul 6 2007, 23:06) *
Странно, почему нет printf? wink.gif

ИМХО экономия возможна на lcd_gotoxy - считать адрес вручную.
ftoa зачем вобще тут нужно??? 07.gif какие здесь могут быть числа с плавающей точкой?
с printf тоже проблемы не уйдут, больно жручая до памяти, ибо входным параметром идет *char, а это значит, что компилятору для начала нада поместить строку во флэш, потом, при вызове printf, создать в памяти данных массив и в него загрузить строку, а потом уже, адрес массива отдать printf smile.gif

А зачем вообще плавающая точка? Что измеряем? Может лучше фиксированная подойдетьsmile.gif С ней проще...

Маненько не то сказал по поводу printf smile.gif . Вы же строки не выводите... Но все равно printf для Вашего варианта "плохая" функция
smk
Меряем напряжение до 1000 В (меряем делитель АЦП) и частоту 50 +/- 5 Гц (1/TCNT0).

Цитата
Но все равно printf для Вашего варианта "плохая" функция

А какие есть варианты?
SpyBot
Цитата(prottoss @ Jul 6 2007, 19:34) *
с printf тоже проблемы не уйдут, больно жручая до памяти, ибо входным параметром идет *char, а это значит, что компилятору для начала нада поместить строку во флэш, потом, при вызове printf, создать в памяти данных массив и в него загрузить строку, а потом уже, адрес массива отдать printf smile.gif

А зачем вообще плавающая точка? Что измеряем? Может лучше фиксированная подойдетьsmile.gif С ней проще...

Маненько не то сказал по поводу printf smile.gif . Вы же строки не выводите... Но все равно printf для Вашего варианта "плохая" функция

Это был риторический вопрос, сорри smile.gif
prottoss
Цитата(smk @ Jul 7 2007, 00:04) *
Меряем напряжение до 1000 В (меряем делитель АЦП) и частоту 50 +/- 5 Гц (1/TCNT0).
А какие есть варианты?
Опа... И зачем здеся флоат???
smk
Цитата
Опа... И зачем здеся флоат???


Критикуеш - предлагай!

Что раньше работало, то и писал...
AndryG
перечитал дважды, но не нашел Вашего ответа на
"отказаться от float"
Напряжение до 1000 измеряете, а какая "дельта"? С какой точностью?

На экран вы выводите, насколько я понял, в целых (d=1)
Частоту в сотых (в = 0.01)
Для чего тогда float?
Может сразу держать напряжение в вольтах, а частоту "в сотых герца"?
Типа F=5003 -- это 50.03Гц

Цитата
Обработчиков всего два. А статические переменные использую, но в "технологических" целях. Например, узнать прерывание первое или второе (запустить/остановить таймер).

А может тогда сразу смотреть на биты таймера? "Если не работает - запустить" ... или ... "если таймер стоит - прерывание первое/второе" ...
prottoss
Цитата(smk @ Jul 7 2007, 00:21) *
Критикуеш - предлагай!
Что раньше работало, то и писал...
Уже несколько раз говорилось про фиксированную запятую. ТО бишь все числа получаются целые, но разряды с 0 по N (младшие) отделены от разрядов N+1....M воображаемой точкой. smile.gif
smk
Цитата
Уже несколько раз говорилось про фиксированную запятую


согласен. Как реализовать? printf "полегче", но не выход. Имеем теперь 1109 слов, а надо 1024.

Цитата
Напряжение до 1000 измеряете, а какая "дельта"? С какой точностью?


1 В, а проше говоря насколько АЦП позволит.

Цитата
На экран вы выводите, насколько я понял, в целых (d=1)
Частоту в сотых (в = 0.01)


Да, верно.

про флоат забыл, делать дальше что?


Цитата
Может сразу держать напряжение в вольтах, а частоту "в сотых герца"?
Типа F=5003 -- это 50.03Гц


Так и хочу.
U= 1000 V
F= 50.05 Hz
prottoss
Цитата(smk @ Jul 7 2007, 00:46) *
согласен. Как реализовать? printf "полегче", но не выход. Имеем теперь 1109 слов, а надо 1024.


Уже было на форуме про это...

Код
/*****************************************************************************
Преобразовывает переменную ULONG в неупакованное

десятичное и далее в строку
******************************************************************************/
void ulong2str(UINT32 val)
{
   UINT32 d = 1000000000;
   for(UCHAR i = 0; i < 10; i++) /* цикл по пяти знакам */
    {
       dbg_msg[i] = 0; /* формируем сумму искомого числа */
       while(val >= d) /* пока порядок не отрицательный */
        { val-= d; /* вычитаем из знака порядок */
         dbg_msg[i]++; /* и увеличиваем искомое число */
        }

        dbg_msg[i] += 0x30; /* преобразуем в ASCII символ */
        d /= 10; /* получаем следующий (младший) порядок */
    }
    dbg_msg[10] = 0;
}


Можно довести до любых мыслимых для АВР разрядов, сдесь 32, точку ставим, где хотим
AndryG
Цитата
Имеем теперь 1109 слов, а надо 1024.

:-) Ну! сжать сишную прогу на пару десятков слов всегда можно ... теперь по каждой строке пробежаться, да мелочевку поправить. :-)

Плюс выше приведенный пост ... поздравляю Вас с решением задачки.

Ну а если не получится ужать - если можно, то код в студию ... ужмем коллективно :-)
smk
Цитата
Ну а если не получится ужать - если можно, то код в студию ... ужмем коллективно :-)


Заинтриговали. Даю. Бить ногами по голове можно, каску надел! Только бы помоголо.





вот
prottoss
Цитата(AndryG @ Jul 7 2007, 01:11) *
:-) Ну! сжать сишную прогу на пару десятков слов всегда можно ... теперь по каждой строке пробежаться, да мелочевку поправить. :-)
Плюс выше приведенный пост ... поздравляю Вас с решением задачки.Ну а если не получится ужать - если можно, то код в студию ... ужмем коллективно :-)
Повторюсь - вместо того, чтобы сжимать до немыслимых пределов Сишную прогу, лучше заложить МК с бОльшими ресурсами - себе дешевле выйдеть smile.gif
smk
Цитата
лучше заложить МК с бОльшими ресурсами


А вот бы сжать, подождать так пока Тини461 или Тини861 не выпустят, а потом наворачивать. Хороший контроллер Тиня эта. И ног под девайс в самый раз.
AndryG
Ну раз всего проекта нет, то давай по кускам .... расскажу, что я надумал .. а Вы уж проверяйте - Вы проект пишете, а я только на код смотрю.
Повторюсь ... я не вникаю в алгоритм ... так-что смотрите внимательно.

Код
if (ACSR==0x4C)
  m++;
if (ACSR==0x4F)
{
if (a==0)
    {
    TCCR0 = 0x02; //start timer, делитель на 8, 1 тик = 1 мкС
    a=1;//признак включенного таймера
    }
else
    {    
    TCCR0 = 0x00; //stop timer
    a=0;//признак выключенного таймера
    b=1;//признак завершения измерения периода
    };

};

Судя по коду ACSR принимает только два значения ... значит можно проверять только один бит байта, который принимает разные значения. if (ACSR & 0x01){}else{} вместо двух if. Выигрыш в проверки одного бита вместо двух сравнений чисел.
Изм. периода. Идея ... насколько понял ...
нач. условие: таймер выключен, счетчик сброшен, b==0.
первое прерывание - запускаем таймер
второе прерывание - останавливаем таймер и поднимаем флаг b
Вопрос: "для чего вы в А дублируете состояние таймера? Проверяйте if(TCCR0 & 0x02 )"
Второй вопрос: "зачем вам знать, включен он или нет" ... может вместо "если включен, то выключить, иначе включить" .. просто написать "изменить состояние" => TCCR0 ^ 0x02; ... если правильно поставить нач. условия, то всё отработает красиво.
Код
interrupt [ANA_COMP] void ana_comp_isr(void)
{
//а если ACSR=0x4C то считаем к-во прерываний
//Если ACSR=0x4F то считаем период,  
if (ACSR & 0x01) // (ACSR==0x4F)
  {
    TCCR0 = TCCR0 ^ 0x02; // переключили таймер
    if (!(TCCR0 & 0x02))  //если таймер выключен - значит подсчет закончен
      b=1;//признак завершения измерения периода
  }
  else // (ACSR==0x4C)
    m++;
}

ЗАПОМНИЛИ .... в осн. цикле нужно инициализировать B, TCCR0, ACSR, TCNT0

Код
// *** БЛОК ПРОВЕРКИ ПОСТОЯННОЕ-ПЕРЕМЕННОЕ ***
    // Interrupt on Output Toggle (прерываемся при любом изменении состояния компаратора)
      ACSR=0x4C;
      // Global enable interrupts
      #asm("sei")
      delay_ms(45);  //время проведения измерения
      #asm("cli")    //выключаем прерывания чтоб не отвлекать АЛУ
      if (m>=3)      //если зарегистрировано 3 и больше перепадов за 45 мс, то считаем что
                     //меряем переменку
        {
        ACDC=1;      //устанавливаем признак переменки
        m=0;         //обнуляем счетчик
        }
      else
        {
        ACDC=0;      //устанавливаем признак постоянки
        m=0;         //обнуляем счетчик
        };

Тут всё просто.
Код

// *** БЛОК ПРОВЕРКИ ПОСТОЯННОЕ-ПЕРЕМЕННОЕ ***
  ACSR=0x4C; //(прерываемся при любом изменении состояния компаратора)
  m = 0;         //это дело обнулим одо его подсчета .. кстати .. зачем ДВА раза это писать.
  #asm("sei")
  delay_ms(45);  //время проведения измерения
  #asm("cli")    //выключаем прерывания чтоб не отвлекать АЛУ
  ACDC = 0;    // такой вариант вместо if-else дает выигрыш в слово :)
  if (m>4)
    ACDC = 1;



дальше ...

___
P.S.
Цитата
Повторюсь - вместо того, чтобы сжимать до немыслимых пределов Сишную прогу, лучше заложить МК с бОльшими ресурсами - себе дешевле выйдеть

А как же ТВОРЧЕСТВО ?! :-)

Код
// *** БЛОК ИЗМЕРЕНИЯ ПЕРИОДА ***
  ACSR=0x4F;
  b = 0;
  TCNT0 = 0;
  #asm("sei")  
  while (!b);  //точно не помню, но CVAVR при ( ==0) умудряется ставить сравнение с константой
  #asm("cli")
  F=1/TCNT0*1000000; //вычисляем значение частоты ВОТ ЗДЕСЬ БОЛЬШАЯ ПОТЕРЯ!!! но это уже нужно алгоритм крутить. а не код оптимизировать
  ACSR.7=0;


По блоку измерения напруги ... опишите словами .. зачем два измерения ... Вы так интересно закрутили флагами и переменными, не хочу въежать ... и потом ... зачем Вам здесь вообще прерывание?
Всё равно Вы сидите delay_ms(50) -- ждете, пока отработают прерывания
Можно в главном цикле просто мониторить флаг окончания преобразования ... какой выигрыш: нет процедуры прерывания, нет delay_ms(50)
И еще ... в CVAVR по умолчанию сохраняет все регистры при переходе на прерывание ... уже не помню, посмотрите в справке. помойму он сохраняет регистры, которые и так не использует никогда - это тоже слов 20 даст размера.
ну и с индикацией тоже не ясно, что используется и т.д. .. посему посоветовать ничего не могу.

Пробуйте - поведаете насколько получилось сжать и сколько еще нужно :-)
____
P.S.
Вариант с измерением напряжения без прерывания ADC
Код
  ADMUX=ADC_VREF_TYPE;
  ADCSR=0xCE;//включить АЦП, начать преобразование

  while (пока не закончилось преобразование - флаг не помню)

  adc_data =ADCW;

ADCSR.6=1; //запустить преобразование

  while (пока не закончилось преобразование - флаг не помню)

  U=ADCW;  

  while (пока не закончилось преобразование - флаг не помню)

if (adc_data > U)
  U = adc_data;

if (ACDC==1)
    U = U/1.414; //!!!!!!!!!!!!!!!!!!!!!  U -> целое!!! И что мы получим?

// прерывание ADС, c, adc_data_max убрать за ненадобностью.


______
P.P.S

U => точно надо с знаком INT ... может UNSIGNED CHAR подойдет?

Проверьте типы переменных ... если не нужен знак - перейдите на беззнаковые переменные
smk
Цитата
По блоку измерения напруги ... опишите словами .. зачем два измерения ... Вы так интересно закрутили флагами и переменными, не хочу въежать ... и потом ... зачем Вам здесь вообще прерывание?


Первое измерение происходит после инициализации АЦП, его результат не учитываем. Прерывания нужны чтоб мониторить синусоиду и измерить максимум. Потом вычисляем эффективное значение.

Цитата
Можно в главном цикле просто мониторить флаг окончания преобразования ... какой выигрыш: нет процедуры прерывания, нет delay_ms(50)


Да. можно просто провести 195 преобразований, выбрав из них максимальный результат. Это даст экономию?
AndryG
первое не учитывать ... тогда ДО ОСНОВНОГО ЦИКЛА инициализируйте АЦП, запустите преобразование и забудьте о его результате ... а потом только запускайте на преобразование без инициализации.

Мониторить синусоиду ... не вижу по коду как это происходит ...
А!!! дошло! Проморгал идею постоянного преобразования в течении нескольких периодов.

Ну .... тогда мой код нужно немного поправить, думаю справитесь, основная идея ... не используйте adc_data и adc_data_max ... считывайте значение в adc_data ... и сравнивайте с U , если adc_data больше U, то запишите в него adc_data .... и уже потом (при выводе) если нужно, то U умножайте.
так избавитесь от лишних телодвижений с adc_data_max


ЖДУ РЕЗУЛЬТАТ .... интересно smile.gif
smk
Цитата
Пробуйте - поведаете насколько получилось сжать и сколько еще нужно :-)

Конечно попробую!!! Результат ближе к обеду...
archi2000
такая история в интернете есть про оптимизацию
http://www.caxapa.ru/lib/1byte.html
Dopler
Цитата(smk @ Jul 6 2007, 22:12) *
А вот бы сжать, подождать так пока Тини461 или Тини861 не выпустят, а потом наворачивать. Хороший контроллер Тиня эта. И ног под девайс в самый раз.


а Тини461 я уже пол года использую
smk
В Москве, да? Или сэмплы добыть удалось?
Dopler
Цитата(smk @ Jul 7 2007, 20:05) *
В Москве, да? Или сэмплы добыть удалось?


Я живу в Таганроге, а 5 шт tiny461 купил в эфо в декабре (с доставкой по почте).
smk
н-да... Киев получается не Таганрог... интересно, на этот форум ходят поставщики из Киева?
defunct
smk
можете популярно объяснить, что в этой тине26 есть такого, что вместо нее нельзя взять m168?

По поводу ваших манипуляций - нельзя засунуть задачу измерения переменки и частоты + вывод на LCD в 2kb еще и не имея аппаратного умножителя, не написав все это на asm.
smk
Цитата
можете популярно объяснить, что в этой тине26 есть такого, что вместо нее нельзя взять m168?

легко. дизайн у нее подходящий и цена. ног в самый раз. Вот будь на ее месте Тиня461 - свои задачи я бы решил. Да и посмотрите на даташит. Безошибочный кристалл. Значит предсказуемый. А с Вашей логикой можно привозить только М128 или М256. На все случаи жизни. Да?
defunct
Цитата(smk @ Jul 9 2007, 00:41) *
А с Вашей логикой можно привозить только М128 или М256. На все случаи жизни. Да?

Вы логику-то не поняли или недопоняли..
Я предлагаю брать не 128 и не 256, а 168 - это чип из линейки 48/88/168.

Свою точку зрения я давно на этом форуме уже высказывал.
На C - писать можно только под кристалы с 16 и более K памяти.

Сделать супер-пупер функциональную программу для чипа с 2k памяти можно только на asm.

Цитата
дизайн у нее подходящий и цена. ног в самый раз.

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

Цитата
Да и посмотрите на даташит. Безошибочный кристалл. Значит предсказуемый.

Можете показать непредсказуемый чип из линейки mega/tiny?
haker_fox
Цитата(smk @ Jul 9 2007, 05:41) *
Безошибочный кристалл. Значит предсказуемый. А с Вашей логикой можно привозить только М128 или М256. На все случаи жизни. Да?

Мое мнение: ошибки есть везде, просто нужно суметь их активировать)
Речь говорилась и обо всех случаях жизни, а о дальнейше модернизации устройства...
smk
Цитата
Я предлагаю брать не 128 и не 256, а 168 - это чип из линейки 48/88/168.

Не хочу я их. Понятно, что думал об этом, но корпус не устраивает. Можно взять конечно 7х7 (9х9??, не помню), но это крайний вариант. SOIC-20 предпочтительнее.

Цитата
могу поспорить что и дизайн и цена у 168-й тоже подходящие для вашей задачи

как ни странно, но если с дизайном смириться вариант есть, то с ценой ну никак. зачем платить больше? да и в целом удорожание не оправдано. М48 в части цены предпочтительней. Интересно, а Т461 будет дороже М48?

Цитата
Можете показать непредсказуемый чип из линейки mega/tiny?

М48.
defunct
Цитата(smk @ Jul 9 2007, 09:58) *
как ни странно, но если с дизайном смириться вариант есть, то с ценой ну никак. зачем платить больше? да и в целом удорожание не оправдано. М48 в части цены предпочтительней.
М48.

Дык, сделав на m168 вы потом сможете ужать до работы на m88/48.
Но начинать разработку и выполнять отладку imho надо на m168 как на самом толстом чипе из линейки.
smk
На М48 я однозначно сделаю то что задумал. 4К флеш мне за глаза хватит и на навороты останется.

Так всеже, что будет дороже М48 или Т461?

Цитата
На C - писать можно только под кристалы с 16 и более K памяти.


Тут кто-то высказывал мнение, что на АСМ писать хорошо только то, что до 2К. Все что больше - слишком трудоемко и не окупает затраченного времени.
SasaVitebsk
Цитата(smk @ Jul 9 2007, 09:58) *
Не хочу я их. Понятно, что думал об этом, но корпус не устраивает. Можно взять конечно 7х7 (9х9??, не помню), но это крайний вариант. SOIC-20 предпочтительнее.
как ни странно, но если с дизайном смириться вариант есть, то с ценой ну никак. зачем платить больше? да и в целом удорожание не оправдано. М48 в части цены предпочтительней. Интересно, а Т461 будет дороже М48?
М48.


Корпус у м48-м168 в "a" варианте будет меньше чем SOIC-20. В разводке - очень практичный. И вообще очень удобен для работы.

Мысль defunct считаю очень дельной. По простой причине. Вы можете взять м168 написать и отладить прогу. Потом оптимизировать её. Посмотреть сколько занимает место готовая программа и уже под это дело купить чип на серию.

Стоимость кристалла во многом определяется его серийностью. Поэтому даже стоимость м48 может оказаться выше чем м88, не говоря уже про какие-то т461. Здесь можете не сомневаться м48-м168 кристалл который используется в огромных количествах.
singlskv
Цитата(smk @ Jul 9 2007, 12:43) *
Цитата

На C - писать можно только под кристалы с 16 и более K памяти.

Тут кто-то высказывал мнение, что на АСМ писать хорошо только то, что до 2К. Все что больше - слишком трудоемко и не окупает затраченного времени.

Просматривая код который генерят WinAVR и IAR ( а я всегда просматриваю что они
мне там нагенерили(хобби у меня такое smile.gif)) могу сказать что ИМХО, больше чем
20-30% по длинне кода при написании на асм выиграть сложно (и то должно повезти, сильно
зависит от алгоритма).
Если говорить по скорости, то на асм можно получить и до 50-100% выигрыша( опять же
если повезет), особенно на алгоритмах которые в силу некоторых особенностей просто
плохо ложатся на С.
Так что мое ИМХО, 2кб это тоже вполне размер для С если уметь ими
грамотно распоряжаться
smk
Цитата
Вы можете взять м168 написать и отладить прогу.

Идея хорошая. Есть в распоряжении и М16, и М8, и М48. Может я и не прав, но отладку предпочитаю делать сразу на том чипе, что в серию пойдет. Так сказать в условия, максимально приближенных к боевым. А размер кода, ну если уж надежно не влезу, то ясно что прийдется другой чип брать.
defunct
Цитата(smk @ Jul 9 2007, 12:45) *
Есть в распоряжении и М16, и М8, и М48. Может я и не прав, но отладку предпочитаю делать сразу на том чипе, что в серию пойдет. Так сказать в условия, максимально приближенных к боевым. А размер кода, ну если уж надежно не влезу, то ясно что прийдется другой чип брать.

Не совсем так.
Чипы 48/88/168 - взаимозаменяемые, отличаются лишь только объемом памяти, причем m88 и m168 оличаются вообще только объемом флеша. По периферии все три чипа - идентичны.

Взяв m168, вы можете нормально отлаживать программу с выключенной оптимизацией. После того как программа готова - вы включаете максимальную оптимизацию по объему и смотрите в какой чип прога влазит. Если влазит в m48 - хорошо, ставите m48, не влазит - берете m88 или оставляете m168. Прелесть как раз в том, что нормально отладив программу на самом толстом чипе линейки, программу без изменений можно будет заливать в более дешевые чипы.

Цитата(singlskv @ Jul 9 2007, 12:44) *
могу сказать что ИМХО, больше чем
20-30% по длинне кода при написании на асм выиграть сложно (и то должно повезти, сильно
зависит от алгоритма).

Вы не правы. Т.к. на асм никто не обязывает вас делать пролог и эпилог к каждой функции одинаковым, ключевые переменные можно держать в регистрах, распределять память страницами - экономить на загрузке XH/YH/ZH, также по-человечески работать с битами (bst/bld) + полноценное использование флага C.
У меня программа на асм в среднем получается в 3-5 раз меньше по объему чем аналог на C. (алгоритмы одинаковые). Как пример - драйвер RTL8019 + UDP/IP стек + небольшой командный протокол over UDP и все это в в 1.7k (бутлоадер по сети). То же самое на Си компилится минимум в 8k.
smk
Цитата
Чипы 48/88/168 - взаимозаменяемые, отличаются лишь только объемом памяти, причем m88 и m168 оличаются вообще только объемом флеша. По периферии все три чипа - идентичны.

Взяв m168, вы можете нормально отлаживать программу с выключенной оптимизацией. После того как программа готова - вы включаете максимальную оптимизацию по объему и смотрите в какой чип прога влазит. Если влазит в m48 - хорошо, ставите m48, не влазит - берете m88 или оставляете m168. Прелесть как раз в том, что нормально отладив программу на самом толстом чипе линейки, программу без изменений можно будет заливать в более дешевые чипы.

Ну тогда хочу Тини861. Уж 8 кило мне на все хватит! я понял о чем Вы, все это верно, так что хорошо бы иметь Т461 и Т861 в распоряжении. А М48 и более - это для моей задачи перебор, хотя я подумаю...

Хм. Ради такого стоит выучить АСМ. И как часто удается сравнить С и АСМ по объему кода?
defunct
Цитата(smk @ Jul 9 2007, 14:50) *
А М48 и более - это для моей задачи перебор, хотя я подумаю...

У m48/88/168 есть аппаратный умножитель, а у вас полно математики с плавающей точкой. Код на меге будет быстрее и эффективнее чем на тиньке...


Цитата
И как часто удается сравнить С и АСМ по объему кода?

Это уж кому как повезет. Мне довелось переносить с Cи на асм 4 относительно большие программы (исходников >100k). Соотношение получилось примерно такое:

Asm C (с максимальной оптимизацией)
1.7k 8k
3.6k 12k
4.6k ~16k
4.1k ~14k
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.