|
Прерывания от компаратора, нужно два разных обработчика |
|
|
|
 |
Ответов
(1 - 50)
|
Jul 6 2007, 11:52
|
Гуру
     
Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446

|
Цитата организовать статическую переменную, по которой можно будет определять текущее состояние, и переходить на соответствующую подпрограмму обработки состояния отличный совет!!! Цитата В прерывании смотрите конфигурационные биты компаратора и выбирайте, какой "обработчик" задействовать. Да, это лучшее решение, уже пишу. Обработчиков всего два. А статические переменные использую, но в "технологических" целях. Например, узнать прерывание первое или второе (запустить/остановить таймер).
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
|
Jul 6 2007, 14:19
|
Гуру
     
Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446

|
Вот с этим бы что-то сделать... //вывод на 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- }; Цитата оптимизация по коду то включена? да.
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
|
Jul 6 2007, 15:06
|
Местный
  
Группа: Свой
Сообщений: 285
Регистрация: 5-11-05
Пользователь №: 10 491

|
Странно, почему нет printf?  ИМХО экономия возможна на lcd_gotoxy - считать адрес вручную. ftoa зачем вобще тут нужно???  какие здесь могут быть числа с плавающей точкой?
|
|
|
|
|
Jul 6 2007, 15:17
|
Местный
  
Группа: Свой
Сообщений: 285
Регистрация: 5-11-05
Пользователь №: 10 491

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

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Цитата(SpyBot @ Jul 6 2007, 23:06)  Странно, почему нет printf? ИМХО экономия возможна на lcd_gotoxy - считать адрес вручную. ftoa зачем вобще тут нужно???  какие здесь могут быть числа с плавающей точкой? с printf тоже проблемы не уйдут, больно жручая до памяти, ибо входным параметром идет *char, а это значит, что компилятору для начала нада поместить строку во флэш, потом, при вызове printf, создать в памяти данных массив и в него загрузить строку, а потом уже, адрес массива отдать printf  А зачем вообще плавающая точка? Что измеряем? Может лучше фиксированная подойдеть  С ней проще... Маненько не то сказал по поводу printf  . Вы же строки не выводите... Но все равно printf для Вашего варианта "плохая" функция
--------------------
|
|
|
|
|
Jul 6 2007, 16:04
|
Гуру
     
Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446

|
Меряем напряжение до 1000 В (меряем делитель АЦП) и частоту 50 +/- 5 Гц (1/TCNT0). Цитата Но все равно printf для Вашего варианта "плохая" функция А какие есть варианты?
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
|
Jul 6 2007, 16:10
|
Местный
  
Группа: Свой
Сообщений: 285
Регистрация: 5-11-05
Пользователь №: 10 491

|
Цитата(prottoss @ Jul 6 2007, 19:34)  с printf тоже проблемы не уйдут, больно жручая до памяти, ибо входным параметром идет *char, а это значит, что компилятору для начала нада поместить строку во флэш, потом, при вызове printf, создать в памяти данных массив и в него загрузить строку, а потом уже, адрес массива отдать printf  А зачем вообще плавающая точка? Что измеряем? Может лучше фиксированная подойдеть  С ней проще... Маненько не то сказал по поводу printf  . Вы же строки не выводите... Но все равно printf для Вашего варианта "плохая" функция Это был риторический вопрос, сорри
|
|
|
|
|
Jul 6 2007, 16:21
|
Гуру
     
Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446

|
Цитата Опа... И зачем здеся флоат??? Критикуеш - предлагай! Что раньше работало, то и писал...
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
|
Jul 6 2007, 16:21
|
Частый гость
 
Группа: Свой
Сообщений: 139
Регистрация: 23-05-05
Из: UA
Пользователь №: 5 317

|
перечитал дважды, но не нашел Вашего ответа на "отказаться от float" Напряжение до 1000 измеряете, а какая "дельта"? С какой точностью? На экран вы выводите, насколько я понял, в целых (d=1) Частоту в сотых (в = 0.01) Для чего тогда float? Может сразу держать напряжение в вольтах, а частоту "в сотых герца"? Типа F=5003 -- это 50.03Гц Цитата Обработчиков всего два. А статические переменные использую, но в "технологических" целях. Например, узнать прерывание первое или второе (запустить/остановить таймер). А может тогда сразу смотреть на биты таймера? "Если не работает - запустить" ... или ... "если таймер стоит - прерывание первое/второе" ...
|
|
|
|
|
Jul 6 2007, 16:46
|
Гуру
     
Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446

|
Цитата Уже несколько раз говорилось про фиксированную запятую согласен. Как реализовать? printf "полегче", но не выход. Имеем теперь 1109 слов, а надо 1024. Цитата Напряжение до 1000 измеряете, а какая "дельта"? С какой точностью? 1 В, а проше говоря насколько АЦП позволит. Цитата На экран вы выводите, насколько я понял, в целых (d=1) Частоту в сотых (в = 0.01) Да, верно. про флоат забыл, делать дальше что? Цитата Может сразу держать напряжение в вольтах, а частоту "в сотых герца"? Типа F=5003 -- это 50.03Гц Так и хочу. U= 1000 V F= 50.05 Hz
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
|
Jul 6 2007, 16:51
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Цитата(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, точку ставим, где хотим
--------------------
|
|
|
|
|
Jul 6 2007, 17:11
|
Частый гость
 
Группа: Свой
Сообщений: 139
Регистрация: 23-05-05
Из: UA
Пользователь №: 5 317

|
Цитата Имеем теперь 1109 слов, а надо 1024. :-) Ну! сжать сишную прогу на пару десятков слов всегда можно ... теперь по каждой строке пробежаться, да мелочевку поправить. :-) Плюс выше приведенный пост ... поздравляю Вас с решением задачки. Ну а если не получится ужать - если можно, то код в студию ... ужмем коллективно :-)
|
|
|
|
|
Jul 6 2007, 17:26
|
Гуру
     
Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446

|
Цитата Ну а если не получится ужать - если можно, то код в студию ... ужмем коллективно :-) Заинтриговали. Даю. Бить ногами по голове можно, каску надел! Только бы помоголо. вот
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
|
Jul 7 2007, 07:24
|
Частый гость
 
Группа: Свой
Сообщений: 139
Регистрация: 23-05-05
Из: UA
Пользователь №: 5 317

|
Ну раз всего проекта нет, то давай по кускам .... расскажу, что я надумал .. а Вы уж проверяйте - Вы проект пишете, а я только на код смотрю. Повторюсь ... я не вникаю в алгоритм ... так-что смотрите внимательно. Код 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 подойдет? Проверьте типы переменных ... если не нужен знак - перейдите на беззнаковые переменные
|
|
|
|
|
Jul 7 2007, 07:29
|
Гуру
     
Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446

|
Цитата По блоку измерения напруги ... опишите словами .. зачем два измерения ... Вы так интересно закрутили флагами и переменными, не хочу въежать ... и потом ... зачем Вам здесь вообще прерывание? Первое измерение происходит после инициализации АЦП, его результат не учитываем. Прерывания нужны чтоб мониторить синусоиду и измерить максимум. Потом вычисляем эффективное значение. Цитата Можно в главном цикле просто мониторить флаг окончания преобразования ... какой выигрыш: нет процедуры прерывания, нет delay_ms(50) Да. можно просто провести 195 преобразований, выбрав из них максимальный результат. Это даст экономию?
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
|
Jul 7 2007, 07:35
|
Частый гость
 
Группа: Свой
Сообщений: 139
Регистрация: 23-05-05
Из: UA
Пользователь №: 5 317

|
первое не учитывать ... тогда ДО ОСНОВНОГО ЦИКЛА инициализируйте АЦП, запустите преобразование и забудьте о его результате ... а потом только запускайте на преобразование без инициализации. Мониторить синусоиду ... не вижу по коду как это происходит ... А!!! дошло! Проморгал идею постоянного преобразования в течении нескольких периодов. Ну .... тогда мой код нужно немного поправить, думаю справитесь, основная идея ... не используйте adc_data и adc_data_max ... считывайте значение в adc_data ... и сравнивайте с U , если adc_data больше U, то запишите в него adc_data .... и уже потом (при выводе) если нужно, то U умножайте. так избавитесь от лишних телодвижений с adc_data_max ЖДУ РЕЗУЛЬТАТ .... интересно
|
|
|
|
|
Jul 7 2007, 08:41
|
Участник

Группа: Новичок
Сообщений: 38
Регистрация: 30-09-05
Пользователь №: 9 098

|
такая история в интернете есть про оптимизацию http://www.caxapa.ru/lib/1byte.html
|
|
|
|
|
Jul 7 2007, 15:16
|
Местный
  
Группа: Свой
Сообщений: 437
Регистрация: 23-04-05
Из: Таганрог
Пользователь №: 4 425

|
Цитата(smk @ Jul 6 2007, 22:12)  А вот бы сжать, подождать так пока Тини461 или Тини861 не выпустят, а потом наворачивать. Хороший контроллер Тиня эта. И ног под девайс в самый раз. а Тини461 я уже пол года использую
|
|
|
|
|
Jul 8 2007, 10:03
|
Местный
  
Группа: Свой
Сообщений: 437
Регистрация: 23-04-05
Из: Таганрог
Пользователь №: 4 425

|
Цитата(smk @ Jul 7 2007, 20:05)  В Москве, да? Или сэмплы добыть удалось? Я живу в Таганроге, а 5 шт tiny461 купил в эфо в декабре (с доставкой по почте).
|
|
|
|
|
Jul 8 2007, 21:54
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(smk @ Jul 9 2007, 00:41)  А с Вашей логикой можно привозить только М128 или М256. На все случаи жизни. Да? Вы логику-то не поняли или недопоняли.. Я предлагаю брать не 128 и не 256, а 168 - это чип из линейки 48/88/168. Свою точку зрения я давно на этом форуме уже высказывал. На C - писать можно только под кристалы с 16 и более K памяти. Сделать супер-пупер функциональную программу для чипа с 2k памяти можно только на asm. Цитата дизайн у нее подходящий и цена. ног в самый раз. могу поспорить что и дизайн и цена у 168-й тоже подходящие для вашей задачи. А самое главное, что программа была б уже давно готова, без оптимизаций. И время которое вы тратите на ужимание непонятно чего (не факт что ваша программа рабочая вообще), вы бы могли потратить на отладку. Цитата Да и посмотрите на даташит. Безошибочный кристалл. Значит предсказуемый. Можете показать непредсказуемый чип из линейки mega/tiny?
|
|
|
|
|
Jul 9 2007, 06:58
|
Гуру
     
Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446

|
Цитата Я предлагаю брать не 128 и не 256, а 168 - это чип из линейки 48/88/168. Не хочу я их. Понятно, что думал об этом, но корпус не устраивает. Можно взять конечно 7х7 (9х9??, не помню), но это крайний вариант. SOIC-20 предпочтительнее. Цитата могу поспорить что и дизайн и цена у 168-й тоже подходящие для вашей задачи как ни странно, но если с дизайном смириться вариант есть, то с ценой ну никак. зачем платить больше? да и в целом удорожание не оправдано. М48 в части цены предпочтительней. Интересно, а Т461 будет дороже М48? Цитата Можете показать непредсказуемый чип из линейки mega/tiny? М48.
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
|
Jul 9 2007, 08:43
|
Гуру
     
Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446

|
На М48 я однозначно сделаю то что задумал. 4К флеш мне за глаза хватит и на навороты останется. Так всеже, что будет дороже М48 или Т461? Цитата На C - писать можно только под кристалы с 16 и более K памяти. Тут кто-то высказывал мнение, что на АСМ писать хорошо только то, что до 2К. Все что больше - слишком трудоемко и не окупает затраченного времени.
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
|
Jul 9 2007, 09:36
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(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 кристалл который используется в огромных количествах.
|
|
|
|
|
Jul 9 2007, 09:44
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(smk @ Jul 9 2007, 12:43)  Цитата На C - писать можно только под кристалы с 16 и более K памяти.
Тут кто-то высказывал мнение, что на АСМ писать хорошо только то, что до 2К. Все что больше - слишком трудоемко и не окупает затраченного времени. Просматривая код который генерят WinAVR и IAR ( а я всегда просматриваю что они мне там нагенерили(хобби у меня такое  )) могу сказать что ИМХО, больше чем 20-30% по длинне кода при написании на асм выиграть сложно (и то должно повезти, сильно зависит от алгоритма). Если говорить по скорости, то на асм можно получить и до 50-100% выигрыша( опять же если повезет), особенно на алгоритмах которые в силу некоторых особенностей просто плохо ложатся на С. Так что мое ИМХО, 2кб это тоже вполне размер для С если уметь ими грамотно распоряжаться
|
|
|
|
|
Jul 9 2007, 09:45
|
Гуру
     
Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446

|
Цитата Вы можете взять м168 написать и отладить прогу. Идея хорошая. Есть в распоряжении и М16, и М8, и М48. Может я и не прав, но отладку предпочитаю делать сразу на том чипе, что в серию пойдет. Так сказать в условия, максимально приближенных к боевым. А размер кода, ну если уж надежно не влезу, то ясно что прийдется другой чип брать.
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
|
Jul 9 2007, 10:53
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(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.
|
|
|
|
|
Jul 9 2007, 11:50
|
Гуру
     
Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446

|
Цитата Чипы 48/88/168 - взаимозаменяемые, отличаются лишь только объемом памяти, причем m88 и m168 оличаются вообще только объемом флеша. По периферии все три чипа - идентичны.
Взяв m168, вы можете нормально отлаживать программу с выключенной оптимизацией. После того как программа готова - вы включаете максимальную оптимизацию по объему и смотрите в какой чип прога влазит. Если влазит в m48 - хорошо, ставите m48, не влазит - берете m88 или оставляете m168. Прелесть как раз в том, что нормально отладив программу на самом толстом чипе линейки, программу без изменений можно будет заливать в более дешевые чипы. Ну тогда хочу Тини861. Уж 8 кило мне на все хватит! я понял о чем Вы, все это верно, так что хорошо бы иметь Т461 и Т861 в распоряжении. А М48 и более - это для моей задачи перебор, хотя я подумаю... Хм. Ради такого стоит выучить АСМ. И как часто удается сравнить С и АСМ по объему кода?
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
|
Jul 9 2007, 12:37
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(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
|
|
|
|
|
Jul 9 2007, 13:35
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(defunct @ Jul 9 2007, 14:53)  Вы не правы. Ну зачем же так категорично  Цитата Т.к. на асм никто не обязывает вас делать пролог и эпилог к каждой функции одинаковым, Странно, но у меня прологи и эпилоги у функций очень разные, а чаще всего их нету вобще Цитата ключевые переменные можно держать в регистрах, В С тоже можно. в IAR кажется 4 регистра гарантированны, в WinAVR 6 (r2-r7)+ можно использовать и дальше (r8-r15), но правда уже с осторожностью Цитата распределять память страницами - экономить на загрузке XH/YH/ZH, Согласен, но большой выигрыш это может дать только на очень узком круге задач Цитата также по-человечески работать с битами (bst/bld) + полноценное использование флага C. Вот здесь соглашусь полностью и безоговорочно, работа с отдельными битами в С это тяжелый случай, НО, как показывает моя практика, этот эфект можно очень сильно уменьшить если при написании проги на С пользоваться известными особенностями конкретного компилятора, при этом никто не мешает писать переносимый(возможно не всегда оптимальный для разных платформ код) Цитата У меня программа на асм в среднем получается в 3-5 раз меньше по объему чем аналог на C. (алгоритмы одинаковые). Как пример - драйвер RTL8019 + UDP/IP стек + небольшой командный протокол over UDP и все это в в 1.7k (бутлоадер по сети). То же самое на Си компилится минимум в 8k. Такой результат получить очень просто, не пользоваться компиляторозависимой оптимизацией, но как-то странно ей не пользоваться когда мы сравниваем полученную производительность/размер кода между С и ASM А с Вашим подходом с использованием Mega168 на стадии отладки и использованием mega48/88/168 соответственно на стадии производства, очень даже согласен. Сам использовал даже такую комбинацию ATmega16 - отладка ATtiny2313 - готовое изделие  Единственно дефайнить много пришлось  но правда всего лишь один раз
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|