Ответ:
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено pv 22 января 2004 г. 12:06
В ответ на: Как константу вычислил? отправлено RUAL 22 января 2004 г. 10:26

таймер не перегружаю он все время бежит. я с него беру 2 времени.
1) сразу после того как компаратор сработал (impulsetime_start).
2) перед тем как компаратор сработал (impulsetime_stop).
и еще кол-во импульсов за это время.
константа такая потому что импульсов у меня 600 штук в секунду:
enginefreq=(кол-во импульсов)/(600*дельта_время). - получится частота в мегагерцах т.к. время в микросекундах.
т.е. мне надо перед тем как делить кол-во импульсов помножить на максимально возможное число,но чтобы ничего не переполнить. на 10^n.
а потом поделить на 600.
(10^n)/600 = 16666...
максимально за 1/100 секунды может прийти 255 импульсов (unsigned char impulse_counter ) что соответствует ~42 гц.
т.е. эта большая константа помноженная на 256 не должна из 4 байтов вылезти
((unsigned long)(impulsecounter)*16666667)/....
тут косяка вроде нету. так как я могу взять и честно посчитать
enginefreq=(кол-во импульсов)/(600*дельта_время), делая деление как столбиком:

unsigned char i;
unsigned long dividend;
unsigned long divisor;
dividend=(unsigned long)(impulsecounter)*1000000;
divisor=((unsigned long)(impulsetimer_stop-impulsetimer_start))*600;

/*
ну или
dividend=(unsigned long)(impulsecounter)*5000;
divisor=((unsigned long)(impulsetimer_stop-impulsetimer_start))*3;
что тоже самое :)
*/

enginefreq=0;
while (dividend>divisor){
dividend-=divisor;
enginefreq+=1;
}
for (i=0;i<8;i+=1){
dividend*=10;
enginefreq*=10;
while (dividend>divisor){
dividend-=divisor;
enginefreq+=1;
}
}
тем самым посчитав все то что там после запятой.
НО результат получается такой же в точности. и настолько же гонимый.
только с большей точностью (всмысле знаков после запятой больше вижу, а сам результат такой же косячный).

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru