| Автор |
Съобщение |
|
stoyanoff
Ранг: Форумен бог
Регистриран на: Чет Юни 25, 2009 1:01 pm Мнения: 2251
|
 Re: Въпрос относно ADC на ПИК
Тази функция ми харесва понеже следя няколко процеса едновременно. Пускам си преобразуването и през това време контролера си върши друга работа. Когато е готово, си взимам резултата  Изникна друг проблем обаче. Когато взема 2 резултата от АЦП-то, те са 2 цели числа(колкото битчета е преброил там). Искам да разделя едното число на другото, за да получа някакъв коефициент. За него използвам float променлива. И като умножа по още едно float число и резултата все е 0. Защо? Някакво препълване ли става??? Ето примерен код: float sum,coef; int adc1,adc2; coef=adc1/adc2; sum= 100*coef; И при това положение стойността на sum е все 0. Защо се получава така и какво мога да направя по въпроса???
_________________www.elkran.com
|
| Нед Яну 29, 2012 3:30 pm |
|
 |
|
ike
Ранг: Форумен бог
Регистриран на: Пет Фев 04, 2005 9:59 pm Мнения: 6019 Местоположение: София
|
 Re: Въпрос относно ADC на ПИК
Пробвай с sum= 100.0*coef; а coef колко е, проверявал ли си го? adc2 може ли да стане 0? Можеш да пробваш и float sum,coef; int adc1,adc2; sum= (100*adc1)/adc2;
_________________ Warriors of the Night, ASSEMBLER!!!
|
| Нед Яну 29, 2012 4:19 pm |
|
 |
|
stoyanoff
Ранг: Форумен бог
Регистриран на: Чет Юни 25, 2009 1:01 pm Мнения: 2251
|
 Re: Въпрос относно ADC на ПИК
Не. Adc2 не става 0. Обаче когато adc1<adc2 sum става 0. Иначе всичко е наред. Защо се получава тоя бъг???
_________________www.elkran.com
|
| Нед Яну 29, 2012 5:56 pm |
|
 |
|
bateAz
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 4:11 pm Мнения: 3750 Местоположение: София
|
 Re: Въпрос относно ADC на ПИК
int a = 1000; int b = 1001; c = a / b; // това дава c = 0. Справка: учебничето по ANSI C
|
| Нед Яну 29, 2012 6:29 pm |
|
 |
|
ps66
Ранг: Форумен бог
Регистриран на: Пет Яну 19, 2007 9:16 am Мнения: 1063 Местоположение: путинофили: "иди н***й"
|
 Re: Въпрос относно ADC на ПИК
Това пък още повече ще дава 0  мадежа ще си оправи "бъга" най-лесно така: float sum,coef; int adc1,adc2; sum= (100 .0*adc1)/adc2;[/quote]
|
| Нед Яну 29, 2012 6:33 pm |
|
 |
|
stoyanoff
Ранг: Форумен бог
Регистриран на: Чет Юни 25, 2009 1:01 pm Мнения: 2251
|
 Re: Въпрос относно ADC на ПИК
Ясно! Значи номера е просто да не допускам числителя да стане по-голям от знаменателя. Първоначалната ми идея беше да си намирам частно(коефициент) и с него да смятам по-нататък и така да спестя няколко операции. Явно ще се прави по тоя начин.
_________________www.elkran.com
|
| Нед Яну 29, 2012 7:01 pm |
|
 |
|
Cekins
Ранг: Форумен бог
Регистриран на: Сря Апр 20, 2005 12:02 pm Мнения: 9119 Местоположение: Разград
|
 Re: Въпрос относно ADC на ПИК
Май не ти стана много ясно... Очевидно компилатора го тълкува това дето го пишеш така :
int c = int a / int b (което е равно на 0) и след това float d = int c
пробвай първо да прехвърлиш двете Int променливи във float и тогава давай с деленето.
Батето за това ти натвъди да погледнеш книжките.
едит :...
Последна промяна Cekins на Нед Яну 29, 2012 9:59 pm, променена общо 2 пъти
|
| Нед Яну 29, 2012 7:21 pm |
|
 |
|
ps66
Ранг: Форумен бог
Регистриран на: Пет Яну 19, 2007 9:16 am Мнения: 1063 Местоположение: путинофили: "иди н***й"
|
 Re: Въпрос относно ADC на ПИК
вземи да прочетеш някоя книжка, преди да коментираш !
|
| Нед Яну 29, 2012 9:44 pm |
|
 |
|
Cekins
Ранг: Форумен бог
Регистриран на: Сря Апр 20, 2005 12:02 pm Мнения: 9119 Местоположение: Разград
|
 Re: Въпрос относно ADC на ПИК
Его още един дето не разбира от шеги.
|
| Нед Яну 29, 2012 9:56 pm |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30686 Местоположение: София
|
 Re: Въпрос относно ADC на ПИК
Абе пак ти гледах кода ползваш read_adc(), това изобщо не ти позволява само да четеш ADC та да изпълняваш други процеси, това вътре си има един while() който чака ADC да свърши меренето. Има два начина за да не губиш време, или постоянно в тялото проверяваш ADC done бита, или ползваш прекъсване. А относно резултата, горе вече колегите са писали.
|
| Нед Яну 29, 2012 10:54 pm |
|
 |
|
stoyanoff
Ранг: Форумен бог
Регистриран на: Чет Юни 25, 2009 1:01 pm Мнения: 2251
|
 Re: Въпрос относно ADC на ПИК
Специално за ТОНИ: while(time<160){ time=read_timer0(); .......... процеси ......... if(adc_done()==1 && adc_bool==1) { adc=read_adc(); adc_bool=0; } }
Ето за това ми трябва. Периодично да си проверявам дали е готово. И да си върши контролера и други неща понеже имам още 1 процес, който зависи от времето. Не искам да имам 2 прекъсвания.
_________________www.elkran.com
|
| Пон Яну 30, 2012 11:20 am |
|
 |
|
Cekins
Ранг: Форумен бог
Регистриран на: Сря Апр 20, 2005 12:02 pm Мнения: 9119 Местоположение: Разград
|
 Re: Въпрос относно ADC на ПИК
Що? Много ще го затормозят прекъсванията? И ти е критично време от порядък на 1-2 микросекунди ? Така пък написано не се знае кога точно ще се прочете ацп-то. Щото тия процеси ако включват някакви сметки (което обикновенно е така) никой не може да ти каже колко време отнемат - примерно едно 32бит/24 бит делене може да хване от 200 до 1500 цикъла (примерно). Да не говорим за флоата.
|
| Пон Яну 30, 2012 12:50 pm |
|
 |
|
bateAz
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 4:11 pm Мнения: 3750 Местоположение: София
|
 Re: Въпрос относно ADC на ПИК
Да не ползваш прекъсвания е велико! Кефи ме ! Същото е като да караш кола само на първа предавка. Така имаш много яка возия ! Ба си, как другите не са се сетили досега ...
|
| Пон Яну 30, 2012 1:52 pm |
|
|