реклама на сайте
подробности

 
 
> Прерывания от компаратора, нужно два разных обработчика
smk
сообщение Jul 6 2007, 10:50
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Стоит задача сначала подсчитать количество перепадов состояния компаратора, затем подсчитать длительность периода между перепадами из 0 в 1. Напрашивается использовать два разных обработчика прерываний от компаратора, конфигурируя компаратор непосредственно перед каждой задачей. Существует ли возможность использовать два разных обработчика от одного источника прерывания?


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
4 страниц V   1 2 3 > »   
Start new topic
Ответов (1 - 50)
prottoss
сообщение Jul 6 2007, 11:00
Сообщение #2


Гуру
******

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



Фактически, будет один обработчик. НО, в нем можно, к примеру, организовать статическую переменную, по которой можно будет определять текущее состояние, и переходить на соответствующую подпрограмму обработки состояния


--------------------
Go to the top of the page
 
+Quote Post
AndryG
сообщение Jul 6 2007, 11:12
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 139
Регистрация: 23-05-05
Из: UA
Пользователь №: 5 317



А зачем статическая переменная?
В прерывании смотрите конфигурационные биты компаратора и выбирайте, какой "обработчик" задействовать.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jul 6 2007, 11:17
Сообщение #4


Гуру
******

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



Цитата(AndryG @ Jul 6 2007, 19:12) *
А зачем статическая переменная?
В прерывании смотрите конфигурационные биты компаратора и выбирайте, какой "обработчик" задействовать.
Можно и биты анализировать. Но, если, к примеру, вариантов обработки больше, чем битовых состояний?


--------------------
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 6 2007, 11:22
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(smk @ Jul 6 2007, 13:50) *
Существует ли возможность использовать два разных обработчика от одного источника прерывания?
Да, можно создать вторую таблицу векторов в области загрузчика и переключать их битом IVSEL


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jul 6 2007, 11:37
Сообщение #6


Гуру
******

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



Цитата(Сергей Борщ @ Jul 6 2007, 19:22) *
Да, можно создать вторую таблицу векторов в области загрузчика и переключать их битом IVSEL
нуну, тока переключаться будут все вектора, а не тока компаратора 07.gif

ИМХО, это кЫтайское решение


--------------------
Go to the top of the page
 
+Quote Post
smk
сообщение Jul 6 2007, 11:52
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Цитата
организовать статическую переменную, по которой можно будет определять текущее состояние, и переходить на соответствующую подпрограмму обработки состояния


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

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


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

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


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
smk
сообщение Jul 6 2007, 14:15
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



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


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
jorikdima
сообщение Jul 6 2007, 14:17
Сообщение #9


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280



оптимизация по коду то включена?
Go to the top of the page
 
+Quote Post
smk
сообщение Jul 6 2007, 14:19
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 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-
};

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


да.


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jul 6 2007, 14:44
Сообщение #11


Гуру
******

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



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


--------------------
Go to the top of the page
 
+Quote Post
smk
сообщение Jul 6 2007, 14:50
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Цитата
Советую поменять тини26 на МК с бОльшим объемом памяти программ


Мега48. Хотя хотелось бы Тини461. Остальное по току и по И/О не пролазят.


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
SpyBot
сообщение Jul 6 2007, 15:06
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 285
Регистрация: 5-11-05
Пользователь №: 10 491



Странно, почему нет printf? wink.gif

ИМХО экономия возможна на lcd_gotoxy - считать адрес вручную.
ftoa зачем вобще тут нужно??? 07.gif какие здесь могут быть числа с плавающей точкой?
Go to the top of the page
 
+Quote Post
smk
сообщение Jul 6 2007, 15:10
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Цитата
ftoa зачем вобще тут нужно???


А как в десятичный формат преобразовать?


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
SpyBot
сообщение Jul 6 2007, 15:17
Сообщение #15


Местный
***

Группа: Свой
Сообщений: 285
Регистрация: 5-11-05
Пользователь №: 10 491



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

использовать фиксированную точку
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jul 6 2007, 15:34
Сообщение #16


Гуру
******

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



Цитата(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 для Вашего варианта "плохая" функция


--------------------
Go to the top of the page
 
+Quote Post
smk
сообщение Jul 6 2007, 16:04
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Меряем напряжение до 1000 В (меряем делитель АЦП) и частоту 50 +/- 5 Гц (1/TCNT0).

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

А какие есть варианты?


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
SpyBot
сообщение Jul 6 2007, 16:10
Сообщение #18


Местный
***

Группа: Свой
Сообщений: 285
Регистрация: 5-11-05
Пользователь №: 10 491



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

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

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

Это был риторический вопрос, сорри smile.gif
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jul 6 2007, 16:15
Сообщение #19


Гуру
******

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



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


--------------------
Go to the top of the page
 
+Quote Post
smk
сообщение Jul 6 2007, 16:21
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Цитата
Опа... И зачем здеся флоат???


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

Что раньше работало, то и писал...


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
AndryG
сообщение Jul 6 2007, 16:21
Сообщение #21


Частый гость
**

Группа: Свой
Сообщений: 139
Регистрация: 23-05-05
Из: UA
Пользователь №: 5 317



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

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

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

А может тогда сразу смотреть на биты таймера? "Если не работает - запустить" ... или ... "если таймер стоит - прерывание первое/второе" ...
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jul 6 2007, 16:38
Сообщение #22


Гуру
******

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



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


--------------------
Go to the top of the page
 
+Quote Post
smk
сообщение Jul 6 2007, 16:46
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 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


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jul 6 2007, 16:51
Сообщение #24


Гуру
******

Группа: Свой
Сообщений: 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, точку ставим, где хотим


--------------------
Go to the top of the page
 
+Quote Post
AndryG
сообщение Jul 6 2007, 17:11
Сообщение #25


Частый гость
**

Группа: Свой
Сообщений: 139
Регистрация: 23-05-05
Из: UA
Пользователь №: 5 317



Цитата
Имеем теперь 1109 слов, а надо 1024.

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

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

Ну а если не получится ужать - если можно, то код в студию ... ужмем коллективно :-)
Go to the top of the page
 
+Quote Post
smk
сообщение Jul 6 2007, 17:26
Сообщение #26


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



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


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





вот
Прикрепленные файлы
Прикрепленный файл  pelt261.txt ( 7.29 килобайт ) Кол-во скачиваний: 92
 


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jul 6 2007, 18:05
Сообщение #27


Гуру
******

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



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


--------------------
Go to the top of the page
 
+Quote Post
smk
сообщение Jul 6 2007, 18:12
Сообщение #28


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Цитата
лучше заложить МК с бОльшими ресурсами


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


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
AndryG
сообщение Jul 7 2007, 07:24
Сообщение #29


Частый гость
**

Группа: Свой
Сообщений: 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 подойдет?

Проверьте типы переменных ... если не нужен знак - перейдите на беззнаковые переменные
Go to the top of the page
 
+Quote Post
smk
сообщение Jul 7 2007, 07:29
Сообщение #30


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



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


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

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


Да. можно просто провести 195 преобразований, выбрав из них максимальный результат. Это даст экономию?


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
AndryG
сообщение Jul 7 2007, 07:35
Сообщение #31


Частый гость
**

Группа: Свой
Сообщений: 139
Регистрация: 23-05-05
Из: UA
Пользователь №: 5 317



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

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

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


ЖДУ РЕЗУЛЬТАТ .... интересно smile.gif
Go to the top of the page
 
+Quote Post
smk
сообщение Jul 7 2007, 07:35
Сообщение #32


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Цитата
Пробуйте - поведаете насколько получилось сжать и сколько еще нужно :-)

Конечно попробую!!! Результат ближе к обеду...


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
archi2000
сообщение Jul 7 2007, 08:41
Сообщение #33


Участник
*

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



такая история в интернете есть про оптимизацию
http://www.caxapa.ru/lib/1byte.html
Go to the top of the page
 
+Quote Post
Dopler
сообщение Jul 7 2007, 15:16
Сообщение #34


Местный
***

Группа: Свой
Сообщений: 437
Регистрация: 23-04-05
Из: Таганрог
Пользователь №: 4 425



Цитата(smk @ Jul 6 2007, 22:12) *
А вот бы сжать, подождать так пока Тини461 или Тини861 не выпустят, а потом наворачивать. Хороший контроллер Тиня эта. И ног под девайс в самый раз.


а Тини461 я уже пол года использую
Go to the top of the page
 
+Quote Post
smk
сообщение Jul 7 2007, 16:05
Сообщение #35


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



В Москве, да? Или сэмплы добыть удалось?


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
Dopler
сообщение Jul 8 2007, 10:03
Сообщение #36


Местный
***

Группа: Свой
Сообщений: 437
Регистрация: 23-04-05
Из: Таганрог
Пользователь №: 4 425



Цитата(smk @ Jul 7 2007, 20:05) *
В Москве, да? Или сэмплы добыть удалось?


Я живу в Таганроге, а 5 шт tiny461 купил в эфо в декабре (с доставкой по почте).
Go to the top of the page
 
+Quote Post
smk
сообщение Jul 8 2007, 12:07
Сообщение #37


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



н-да... Киев получается не Таганрог... интересно, на этот форум ходят поставщики из Киева?


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
defunct
сообщение Jul 8 2007, 18:58
Сообщение #38


кекс
******

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



smk
можете популярно объяснить, что в этой тине26 есть такого, что вместо нее нельзя взять m168?

По поводу ваших манипуляций - нельзя засунуть задачу измерения переменки и частоты + вывод на LCD в 2kb еще и не имея аппаратного умножителя, не написав все это на asm.
Go to the top of the page
 
+Quote Post
smk
сообщение Jul 8 2007, 21:41
Сообщение #39


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Цитата
можете популярно объяснить, что в этой тине26 есть такого, что вместо нее нельзя взять m168?

легко. дизайн у нее подходящий и цена. ног в самый раз. Вот будь на ее месте Тиня461 - свои задачи я бы решил. Да и посмотрите на даташит. Безошибочный кристалл. Значит предсказуемый. А с Вашей логикой можно привозить только М128 или М256. На все случаи жизни. Да?


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
defunct
сообщение Jul 8 2007, 21:54
Сообщение #40


кекс
******

Группа: Свой
Сообщений: 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?
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Jul 9 2007, 01:59
Сообщение #41


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



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

Мое мнение: ошибки есть везде, просто нужно суметь их активировать)
Речь говорилась и обо всех случаях жизни, а о дальнейше модернизации устройства...


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
smk
сообщение Jul 9 2007, 06:58
Сообщение #42


Гуру
******

Группа: Свой
Сообщений: 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.


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
defunct
сообщение Jul 9 2007, 08:23
Сообщение #43


кекс
******

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



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

Дык, сделав на m168 вы потом сможете ужать до работы на m88/48.
Но начинать разработку и выполнять отладку imho надо на m168 как на самом толстом чипе из линейки.
Go to the top of the page
 
+Quote Post
smk
сообщение Jul 9 2007, 08:43
Сообщение #44


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



На М48 я однозначно сделаю то что задумал. 4К флеш мне за глаза хватит и на навороты останется.

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

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


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


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Jul 9 2007, 09:36
Сообщение #45


Гуру
******

Группа: Свой
Сообщений: 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 кристалл который используется в огромных количествах.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Jul 9 2007, 09:44
Сообщение #46


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(smk @ Jul 9 2007, 12:43) *
Цитата

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

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

Просматривая код который генерят WinAVR и IAR ( а я всегда просматриваю что они
мне там нагенерили(хобби у меня такое smile.gif)) могу сказать что ИМХО, больше чем
20-30% по длинне кода при написании на асм выиграть сложно (и то должно повезти, сильно
зависит от алгоритма).
Если говорить по скорости, то на асм можно получить и до 50-100% выигрыша( опять же
если повезет), особенно на алгоритмах которые в силу некоторых особенностей просто
плохо ложатся на С.
Так что мое ИМХО, 2кб это тоже вполне размер для С если уметь ими
грамотно распоряжаться
Go to the top of the page
 
+Quote Post
smk
сообщение Jul 9 2007, 09:45
Сообщение #47


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Цитата
Вы можете взять м168 написать и отладить прогу.

Идея хорошая. Есть в распоряжении и М16, и М8, и М48. Может я и не прав, но отладку предпочитаю делать сразу на том чипе, что в серию пойдет. Так сказать в условия, максимально приближенных к боевым. А размер кода, ну если уж надежно не влезу, то ясно что прийдется другой чип брать.


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
defunct
сообщение Jul 9 2007, 10:53
Сообщение #48


кекс
******

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post
smk
сообщение Jul 9 2007, 11:50
Сообщение #49


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



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

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

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

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


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
defunct
сообщение Jul 9 2007, 12:37
Сообщение #50


кекс
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
singlskv
сообщение Jul 9 2007, 13:35
Сообщение #51


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(defunct @ Jul 9 2007, 14:53) *
Вы не правы.
Ну зачем же так категорично smile.gif
Цитата
Т.к. на асм никто не обязывает вас делать пролог и эпилог к каждой функции одинаковым,
Странно, но у меня прологи и эпилоги у функций очень разные, а чаще всего их
нету вобще 07.gif
Цитата
ключевые переменные можно держать в регистрах,
В С тоже можно.
в 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 smile.gif

А с Вашим подходом с использованием Mega168 на стадии отладки и использованием
mega48/88/168 соответственно на стадии производства, очень даже согласен.
Сам использовал даже такую комбинацию
ATmega16 - отладка
ATtiny2313 - готовое изделие smile.gif
Единственно дефайнить много пришлось sad.gif
но правда всего лишь один раз smile.gif
Go to the top of the page
 
+Quote Post

4 страниц V   1 2 3 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 1st July 2025 - 12:45
Рейтинг@Mail.ru


Страница сгенерированна за 0.02073 секунд с 7
ELECTRONIX ©2004-2016