Отговори на тема  [ 24 мнения ]  Отиди на страница Предишна  1, 2
FloatToString в MikroC 
Автор Съобщение
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Вто Сеп 20, 2005 10:01 pm
Мнения: 128
Местоположение: София
Мнение 
аз че си падам малко екстремист... 8) .... верно е, ама що не си я напишеш сам функцията флоут2стринг
http://en.wikipedia.org/wiki/IEEE_floating-point_standard - няма да е много сложно...

_________________
късото съединение прави силата
-------------------------------
http://www.zahranvane.com/


Пон Май 15, 2006 8:56 pm
Профил ICQ WWW
Ранг: Ориентиран
Ранг: Ориентиран
Аватар

Регистриран на: Нед Мар 27, 2005 12:40 am
Мнения: 206
Местоположение: София
Мнение 
Пиша я в момента :D. А това CCS ми се вижда голяма мъка. :?


Пон Май 15, 2006 9:13 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Пет Фев 17, 2006 9:17 am
Мнения: 765
Местоположение: Стара Загора
Мнение 
daniel_stefanov написа:
setoy, съгласен съм че тази операция е доста сложна като сметки, ама чак пак изнасилване :D . Сметнах времето за което ми се изпълнява функцията флоат то стринг и то е 8,46мс. Това не е чак такъв проблем за този контролер имаики в предвид, че работи на 20МХц. Проблемът е, че още в инициализацията на променливата присвоява такова число, а за това не се иска бързина.
unsigned char oldstate;
int br = 0;
int n = 10; // Number of mesurment
int ctr;
char i_text[13];
float freq = 3.14;
float res;
Осакатих програмата и още тук (в червено) на freq се присвоява -217xxxxxx (шантавата стойност). Освен грешка в програмата или лош крак :D , не виждам каква може да е причината.
Цитат:
Как точно за конкретния случай ти го казахме вече няколко пъти в другата тема.

Наистина имаше много мнения по въпроса, но да си призная честно почти нищо не разбрах. Затова избрах да го направя така както си мисля че ще стане. Мисля, че идейно това което си мисля е вярно макар и доста по сложно за контролера, а и вероятно е най-глупавия начин. Искаше ми се първо така да тръгне, а после ще опитам и други варианти. Абе няма да се откажа докато не тръгне :D, но май ще сменям този компилатор с CCS. Въпреки че ми се вижда на пръв поглед малко неразбираем.
Другото за което се замислям е същия код да го компилирам на 18F452 и да видя тогава какво ще се случи. Възможно е проблемът да е от контролера както казва setoy.


Ами не, това май не съм го казвал 8) Не съм казвал че ще се запали, или че няма да стане, просто не е направен за такива сметки -колкото и добре да изглежда на С. Това 8 мсек процесорно време си една малка вечност. Това че работи на 20 МХц все пак не означава че трябва да му пилееш ресурсите, когато спокойно можеш да минеш и без float. Няма смисъл да си изграждаш толкова лоши навици от самото начало още :) Надявам се че ме разбираш правилно. Само че за да знаеш кое е оптимално и кое не трябва да познаваш хардуера.

А това че тмр0 се препълва за 1 сек и малко вместо точно за 1, не е никакъв проблем , това което те обърква, е че не ползваш и текущата стойност на таймера. Със съсем малко прехвъляне на регистри получаваш да речем 32 битово цяло число, което после можеш да го изобразиш както си искаш.


Вто Май 16, 2006 4:20 pm
Профил ICQ
Ранг: Ориентиран
Ранг: Ориентиран
Аватар

Регистриран на: Нед Мар 27, 2005 12:40 am
Мнения: 206
Местоположение: София
Мнение 
Цитат:
А това че тмр0 се препълва за 1 сек и малко вместо точно за 1, не е никакъв проблем , това което те обърква, е че не ползваш и текущата стойност на таймера. Със съсем малко прехвъляне на регистри получаваш да речем 32 битово цяло число, което после можеш да го изобразиш както си искаш.


Е това е абсолютно верно :D. Ето тук губя нишката. Аз го правя по възможно най-хамалския начин, защото незнам тънкостите (и все още не ги разбирам :( ). Аз го правя така: 20000000/4=5000000; 5000000/256(прескалер)/256(брояч)=76.29394531. За да присвоя това число с плаваща запетая ми трябва да дефинирам променлива от тип флоат (ето от тук дойде проблема, че не мога да дефинирам такава променлива. Тук ми дава онова шантаво число -2177663423). След това с Протеус симулирам и виждам, че за 10 измервания таймера ми е препълван 762 пъти. Деля препълванията (ctr) на броя измервания (br) и получавам 76,2. Като разделя горното на това число за честотата получавам 1.00123Hz. Точноста в диапазона на ниските честоти е долу горе добра. Обаче всичко е флоат. Как да избегна тези числа с плаваша запетая? Всички пишат че не ми трябват, може и с целочислени, ама как....? Е в това е проблема. Абе нещо зациклих яко ми се струва :cry: . И това, което ми написа горе също не го разбрах. Ами така е като учиш нещо и 10години не си го ползвал.... Иначе благодаря на всички,. Ще продължа да го боря тоя PIC :) .


Вто Май 16, 2006 5:33 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30686
Местоположение: София
Мнение 
Малко не вдявам каква ти е целта, какво броиш и какво получаваш, но винаги има начин да не ползваш флоат, особенно при мерене на честота.


Вто Май 16, 2006 7:40 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Сеп 26, 2004 4:11 pm
Мнения: 3750
Местоположение: София
Мнение 
Oпитвам се да си изясня нещата.
1. Значи ти имаш честота на прекъсване по таймер_0 F_int = 20Е6 / 4 / 256 / 2^8 Hz = 5E6 / 2^16 Hz;
2. За 10 периода на мерената честота имаш N прекъсвания.
3. Тогава честотата, която търсиш е F_sig = F_int * N / 10, или

F_sig = 5E5 * N / 2^16

Това се смята така:
1. Умножаваш целочислено N * 500000. Ако N e < 2^13 ( 8192 ) ще се вместиш в 32-битов unsigned int;
2. Прибавяш 32768;
3. Вземаш само 2-та най-старши байта - това ти е резултатът.

Не става ли?


Вто Май 16, 2006 7:44 pm
Профил ICQ
Ранг: Ориентиран
Ранг: Ориентиран
Аватар

Регистриран на: Нед Мар 27, 2005 12:40 am
Мнения: 206
Местоположение: София
Мнение 
bateAz, прости на невежия, ама честотата няма ли да е: F_sig = F_int * 10 / N или F_sig = 5E7 / 2^16*N


Вто Май 16, 2006 10:24 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Сеп 26, 2004 4:11 pm
Мнения: 3750
Местоположение: София
Мнение 
А бе май няма да е както ти си го написал. Нали съм си дебела глава, държа си на моето. :lol:
Помисли, ако изчакаш NN импулса, ще получиш NN пъти по-голямо N. Затова се дели на 10, не се умножава.


Вто Май 16, 2006 10:27 pm
Профил ICQ
Ранг: Ориентиран
Ранг: Ориентиран
Аватар

Регистриран на: Нед Мар 27, 2005 12:40 am
Мнения: 206
Местоположение: София
Мнение 
Логиката ми е такава, че колкото по-голяма е честотата (по-малък период), толкова по малко е това препълване N на брояча, и обратно колкото честотата е по-малка - периода е много голям и тогава таймера се пълни за това голямо време повече. Например ако имаме 1Hz, препълването ще е 762 пъти за 10 измервания, ако имаме 10Hz, тогава препълването, ще е 76 пъти. т.е колкото N е по-голямо, то честотата е по-малка (затова е в знаменател). Дано да си съгласен. :) Поздрави и благодаря за помощта. Без Вас съм за никъде.


Вто Май 16, 2006 10:54 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 24 мнения ]  Отиди на страница Предишна  1, 2

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 1 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни