#include #include #include #define FREQ 13500000.0 #define MMIN 32 #define MMAX 80 #define DMIN 4 #define DMAX 11 void approx(float target) { float fmin, fmax, f; float eps, eps1; int m, d, p; int m1, d1; printf("target = %.1f\n",target); for (p=8; p>=1; p >>= 1) { fmin = FREQ * MMIN / DMAX / p; fmax = FREQ * MMAX / DMIN / p; if (fmin <= target && target <= fmax) break; } if (p < 1) return; printf("range = %.1f..%.1f (%d)\n",fmin, fmax,p); m = MMIN; d = DMAX; f = FREQ * m / d / p; eps = fabs(f - target); m1 = m; d1 = d; eps1 = eps; for (d = d1; d >= DMIN; --d) { while (m > MMIN) { f = FREQ * m / d / p; eps = fabs(f - target); if (eps < eps1) { eps1 = eps; m1 = m; d1 = d; } if (f <= target) break; --m; } while (m < MMAX) { f = FREQ * m / d / p; eps = fabs(f - target); if (eps < eps1) { eps1 = eps; m1 = m; d1 = d; } if (f >= target) break; ++m; } } f = FREQ * m1 / d1 / p; printf("clock = %.1f (%d,%d,%d)\n",f, m1, d1, p); printf("dev = %.3f\n",eps1/f*100.0); } int main(int argc, char *argv[]) { int i; for (i=1; i