Обсуждаем цифровые устройства...
Ответить

Чт сен 25, 2008 18:14:54

Вобще unsugned long int from 0 to 4294967295. Число F_CPU * TCNT1 / (TCNT0 + 256 * t0) не такое уж и большое получается, явно укладывается в эти пределы. Только вот числитель великоват, по хоже мк считает сначала числитель и офигевает, а потом уже делит. Пробовал сделать TCNT1 / (TCNT0 + 256 * t0) float или double (кстати в чём различие?), а затем умножить на F_CPU
Код:
unsigned long int frequ = 123456789;
float freq;
.............
freq = TCNT1 / (TCNT0 + 256 * t0);
frequ = freq * F_CPU;

получаются всегда нули непонятно почему :( . Да, ещё одна проблема когда частота слишком большая цифры низких порядков из-за неточности измерения начинают бешено бегать, как бы это исправить думаю, куда бы влепить задержку?

Сб сен 27, 2008 23:26:41

Так что делать товарисчи?? Может посоветуете большие числа как нибудь через ассемблер умножить? Мне бы прям программой, если не трудно, а то я ассемблер не знаю совсем.

Вт сен 30, 2008 18:11:06

Код:
unsigned long int frequ = 123456789;
float freq;
.............
freq = TCNT1 / (TCNT0 + 256 * t0);
frequ = freq * F_CPU;


А тут и будет практически всегда 0.
Попробуйте вот так:
freq= ((float) TCNT1)/(TCNT0+256*t0)
или так
freq=((float) TCNT1)/((float) TCNT0 + 256*t0)

А что бы младшие порядки не скакали, выводить не мгновенное, а усреднённое значение.

Вт сен 30, 2008 21:23:41

Огромное спасибо BerZerK-ku! Мучился целую неделю :shock:
Супер, всё получилось:)
Ответить