From 5bcfb8a37128ae5457583016ff5c58717d6178e0 Mon Sep 17 00:00:00 2001 From: Jeff Wang Date: Sat, 30 Jan 2021 18:45:44 -0500 Subject: [PATCH 1/5] do all trig calculations in degrees --- src/decn/decn.c | 48 +++-- src/decn/decn_tests_trig.cpp | 342 ++++++++++++++++++++++------------- 2 files changed, 243 insertions(+), 147 deletions(-) diff --git a/src/decn/decn.c b/src/decn/decn.c index 53f5ae1..6e9391f 100644 --- a/src/decn/decn.c +++ b/src/decn/decn.c @@ -85,9 +85,9 @@ const dec80 DECN_LN_10 = { 0, {23, 2, 58, 50, 92, 99, 40, 45, 68} }; -// 2 pi -const dec80 DECN_2PI = { - 0, {62, 83, 18, 53, 7, 17, 95, 86, 48} +// pi +const dec80 DECN_PI = { + 0, {31, 41, 59, 26, 53, 58, 97, 93, 24} }; // pi/2 @@ -1426,8 +1426,8 @@ void sqrt_decn(void){ #endif //USE_POW_SQRT_IMPL -// see W.E. Egbert, "Personal Calculator Algorithms II: Trigonometric functions" -void project_decn_into_0_2pi(void) { +// normal angle to between 0 and 360 degrees +void normalize_0_360(void) { const uint8_t is_negative = (AccDecn.exponent < 0); exp_t exponent; @@ -1436,11 +1436,14 @@ void project_decn_into_0_2pi(void) { negate_decn(&AccDecn); } exponent = get_exponent(&AccDecn); - copy_decn(&BDecn, &DECN_2PI); + //B = 360 + set_dec80_zero(&BDecn); + BDecn.lsu[0] = 36; + BDecn.exponent = 2; if (compare_magn() > 0) { do { do { - copy_decn(&BDecn, &DECN_2PI); + //B = 3.6e... BDecn.exponent = exponent; if (compare_magn() >= 0) { negate_decn(&BDecn); @@ -1450,12 +1453,13 @@ void project_decn_into_0_2pi(void) { } } while (1); exponent--; - } while (exponent >= 0); + } while (exponent >= 2); } if (is_negative) { negate_decn(&AccDecn); - copy_decn(&BDecn, &DECN_2PI); + //B = 360 + BDecn.exponent = 2; add_decn(); } } @@ -1467,13 +1471,14 @@ void project_decn_into_0_2pi(void) { #define THETA Tmp4Decn void sincos_decn(const uint8_t sincos_arctan) { const uint8_t is_negative = AccDecn.exponent < 0; - if (sincos_arctan) { + if (sincos_arctan) { //calculate arctan set_dec80_zero(&THETA); if (is_negative) negate_decn(&AccDecn); copy_decn(&COS, &AccDecn); set_decn_one(&SIN); - } else { - project_decn_into_0_2pi(); + } else { //calculate sin/cos + normalize_0_360(); + to_radian_decn(); copy_decn(&THETA, &AccDecn); set_decn_one(&COS); set_dec80_zero(&SIN); @@ -1482,13 +1487,13 @@ void sincos_decn(const uint8_t sincos_arctan) { negate_decn(&SIN); } do { - if (sincos_arctan) { + if (sincos_arctan) { //calculate arctan // THETA is in AccDecn from previous iteration if (COS.exponent < 0) { if (is_negative) negate_decn(&AccDecn); break; } - } else { + } else { //calculate sin/cos if (THETA.exponent < 0) { break; } @@ -1539,10 +1544,11 @@ void tan_decn(void) { void arctan_decn(void) { sincos_decn(1); + to_degree_decn(); } // see W.E. Egbert, "Personal Calculator Algorithms III: Inverse Trigonometric Functions" -void arcsin_decn(void) { +void arcsin_decn_rad(void) { st_push_decn(&AccDecn); copy_decn(&BDecn, &AccDecn); mult_decn(); @@ -1553,15 +1559,20 @@ void arcsin_decn(void) { recip_decn(); st_pop_decn(&BDecn); mult_decn(); - sincos_decn(1); } +void arcsin_decn(void) { + arcsin_decn_rad(); + to_degree_decn(); +} + void arccos_decn(void) { - arcsin_decn(); + arcsin_decn_rad(); negate_decn(&AccDecn); copy_decn(&BDecn, &DECN_PI2); add_decn(); + to_degree_decn(); } #undef SIN #undef COS @@ -1579,8 +1590,7 @@ void to_radian_decn(void) { void pi_decn(void) { set_dec80_zero(&BDecn); - BDecn.lsu[0] = 5; // 0.5 00 .. - copy_decn(&AccDecn, &DECN_2PI); + copy_decn(&AccDecn, &DECN_PI); mult_decn(); } diff --git a/src/decn/decn_tests_trig.cpp b/src/decn/decn_tests_trig.cpp index af1166d..d2243f9 100644 --- a/src/decn/decn_tests_trig.cpp +++ b/src/decn/decn_tests_trig.cpp @@ -22,6 +22,8 @@ namespace bmp = boost::multiprecision; using Catch::Matchers::Equals; +static const bmp::mpfr_float mPI = boost::math::constants::pi(); + static void trig_test(void (*operation)(void), bmp::mpfr_float (*mpfr_operation)(bmp::mpfr_float x), double rtol, double atol) @@ -50,10 +52,10 @@ static void trig_test(void (*operation)(void), bmp::mpfr_float (*mpfr_operation) } -static void sin_test(double rtol=5e-3, double atol=1e-3) +static void sin_test(double rtol=6e-3, double atol=1e-3) { CAPTURE("sin test"); - trig_test(sin_decn, [](bmp::mpfr_float x) -> bmp::mpfr_float {return sin(x);}, rtol, atol); + trig_test(sin_decn, [](bmp::mpfr_float x) -> bmp::mpfr_float {return sin(x * mPI / 180);}, rtol, atol); } static void sin_test(const char* a_str, int a_exp, double rtol=5e-3, double atol=1e-3) @@ -64,10 +66,10 @@ static void sin_test(const char* a_str, int a_exp, double rtol=5e-3, double atol } -static void cos_test(double rtol=5e-3, double atol=1e-3) +static void cos_test(double rtol=6e-3, double atol=1e-3) { CAPTURE("cos test"); - trig_test(cos_decn, [](bmp::mpfr_float x) -> bmp::mpfr_float {return cos(x);}, rtol, atol); + trig_test(cos_decn, [](bmp::mpfr_float x) -> bmp::mpfr_float {return cos(x * mPI / 180);}, rtol, atol); } static void cos_test(const char* a_str, int a_exp, double rtol=5e-3, double atol=1e-3) @@ -80,7 +82,7 @@ static void cos_test(const char* a_str, int a_exp, double rtol=5e-3, double atol static void tan_test(double rtol=5e-3, double atol=1e-3) { - trig_test(tan_decn, [](bmp::mpfr_float x) -> bmp::mpfr_float {return tan(x);}, rtol, atol); + trig_test(tan_decn, [](bmp::mpfr_float x) -> bmp::mpfr_float {return tan(x * mPI / 180);}, rtol, atol); } static void tan_test(const char* a_str, int a_exp, double rtol=5e-3, double atol=1e-3) @@ -93,7 +95,7 @@ static void tan_test(const char* a_str, int a_exp, double rtol=5e-3, double atol static void atan_test(double rtol=5e-3, double atol=1e-3) { - trig_test(arctan_decn, [](bmp::mpfr_float x) -> bmp::mpfr_float {return atan(x);}, rtol, atol); + trig_test(arctan_decn, [](bmp::mpfr_float x) -> bmp::mpfr_float {return atan(x)*180/mPI;}, rtol, atol); } static void atan_test(const char* a_str, int a_exp, double rtol=5e-3, double atol=1e-3) @@ -106,7 +108,7 @@ static void atan_test(const char* a_str, int a_exp, double rtol=5e-3, double ato static void asin_test(double rtol=5e-3, double atol=1e-3) { - trig_test(arcsin_decn, [](bmp::mpfr_float x) -> bmp::mpfr_float {return asin(x);}, rtol, atol); + trig_test(arcsin_decn, [](bmp::mpfr_float x) -> bmp::mpfr_float {return asin(x)*180/mPI;}, rtol, atol); } static void asin_test(const char* a_str, int a_exp, double rtol=5e-3, double atol=1e-3) @@ -119,7 +121,7 @@ static void asin_test(const char* a_str, int a_exp, double rtol=5e-3, double ato static void acos_test(double rtol=5e-3, double atol=1e-3) { - trig_test(arccos_decn, [](bmp::mpfr_float x) -> bmp::mpfr_float {return acos(x);}, rtol, atol); + trig_test(arccos_decn, [](bmp::mpfr_float x) -> bmp::mpfr_float {return acos(x)*180/mPI;}, rtol, atol); } static void acos_test(const char* a_str, int a_exp, double rtol=5e-3, double atol=1e-3) @@ -129,101 +131,175 @@ static void acos_test(const char* a_str, int a_exp, double rtol=5e-3, double ato acos_test(rtol, atol); } -const char * const pi = "3.141592653589793239"; -const char * const pi_threequarters = "2.356194490192344929"; -const char * const pi_halved = "1.570796326794896619"; -const char * const pi_quarter = ".7853981633974483096"; +// const char * const pi = "3.141592653589793239"; +// const char * const pi_threequarters = "2.356194490192344929"; +// const char * const pi_halved = "1.570796326794896619"; +// const char * const pi_quarter = ".7853981633974483096"; TEST_CASE("sin") { - sin_test("0.1", 0); - sin_test("0.05", 0, 1e-2); - sin_test("0.01", 0, -1); - sin_test("0.001", 0, -1); - sin_test("0.0001", 0, -1); - sin_test("0.00001", 0, -1); - sin_test("0.000001", 0, -1); + sin_test("0.1", 0, 0.2); sin_test("0.0", 0, -1); - sin_test("0.2", 0); - sin_test("0.3", 0); - sin_test("0.4", 0); - sin_test("0.9", 0); - sin_test("1.5", 0); - sin_test("2.0", 0); - sin_test("2.5", 0); - sin_test("3.0", 0); - sin_test(pi, 0, -1); - sin_test(pi_quarter, 0); - sin_test(pi_halved, 0); - sin_test(pi_threequarters, 0); + sin_test("1.5", 0, 0.02); + sin_test("2.0", 0, 0.02); + sin_test("2.5", 0, 0.02); + sin_test("3.0", 0, 0.02); + sin_test("10", 0); + sin_test("20", 0); + sin_test("30", 0); + sin_test("40", 0); + sin_test("80", 0); + sin_test("120", 0); + sin_test("160", 0); + sin_test("200", 0); + sin_test("240", 0); + sin_test("280", 0); + sin_test("320", 0); + sin_test("359", 0, 0.02); + sin_test("360", 0, -1, 0.001); + sin_test("361", 0, 0.02); + sin_test("400", 0); +// sin_test(pi, 0, -1); +// sin_test(pi_quarter, 0); +// sin_test(pi_halved, 0); +// sin_test(pi_threequarters, 0); + sin_test("180.0", 0, -1); + sin_test("45.0", 0); + sin_test("90.0", 0); + sin_test("135.0", 0); sin_test("1000.0", 0); - sin_test("-0.5", 0); - sin_test("-1.5", 0); - sin_test("-2.0", 0); - sin_test("-2.5", 0); - sin_test("-3.0", 0); + sin_test("-0.5", 0, 0.2); + sin_test("-1.5", 0, 0.02); + sin_test("-2.0", 0, 0.02); + sin_test("-2.5", 0, 0.02); + sin_test("-3.0", 0, 0.02); sin_test("-9.0", 0); sin_test("-18.0", 0); sin_test("-27.0", 0); sin_test("-1000.0", 0); + sin_test("-30", 0); + sin_test("-40", 0); + sin_test("-80", 0); + sin_test("-120", 0); + sin_test("-160", 0); + sin_test("-200", 0); + sin_test("-240", 0); + sin_test("-280", 0); + sin_test("-320", 0); + sin_test("-360", 0, -1, 0.001); + sin_test("-400", 0); } TEST_CASE("cos") { - cos_test("0.1", 0); - cos_test("0.05", 0); - cos_test("0.01", 0); - cos_test("0.001", 0); - cos_test("0.0001", 0); - cos_test("0.00001", 0); - cos_test("0.000001", 0); - cos_test("0.0", 0); - cos_test("0.2", 0); - cos_test("0.3", 0); - cos_test("0.4", 0); - cos_test("0.9", 0); - cos_test("1.5", 0); - cos_test("2.0", 0); - cos_test("2.5", 0); - cos_test("3.0", 0); - cos_test(pi, 0); - cos_test(pi_quarter, 0); - cos_test(pi_halved, 0, -1); - cos_test(pi_threequarters, 0); - cos_test("1000.0", 0); - cos_test("-0.5", 0); - cos_test("-1.5", 0); - cos_test("-2.0", 0); - cos_test("-2.5", 0); - cos_test("-3.0", 0); + cos_test("0.1", 0, 0.2); + cos_test("0.0", 0, -1); + cos_test("1.5", 0, 0.02); + cos_test("2.0", 0, 0.02); + cos_test("2.5", 0, 0.02); + cos_test("3.0", 0, 0.02); + cos_test("10", 0); + cos_test("20", 0); + cos_test("30", 0); + cos_test("40", 0); + cos_test("80", 0); + cos_test("120", 0); + cos_test("160", 0); + cos_test("200", 0); + cos_test("240", 0); + cos_test("280", 0, 0.006); + cos_test("320", 0); + cos_test("359", 0, 0.02); + cos_test("360", 0, -1, 0.001); + cos_test("361", 0, 0.02); + cos_test("400", 0); +// cos_test(pi, 0, -1); +// cos_test(pi_quarter, 0); +// cos_test(pi_halved, 0); +// cos_test(pi_threequarters, 0); + cos_test("180.0", 0, -1); + cos_test("45.0", 0); + cos_test("90.0", 0, -1, 0.001); + cos_test("135.0", 0); + cos_test("1000.0", 0, 0.006); + cos_test("-0.5", 0, 0.2); + cos_test("-1.5", 0, 0.02); + cos_test("-2.0", 0, 0.02); + cos_test("-2.5", 0, 0.02); + cos_test("-3.0", 0, 0.02); cos_test("-9.0", 0); cos_test("-18.0", 0); cos_test("-27.0", 0); cos_test("-1000.0", 0); + cos_test("-30", 0); + cos_test("-40", 0); + cos_test("-80", 0, 0.006); + cos_test("-120", 0); + cos_test("-160", 0); + cos_test("-200", 0); + cos_test("-240", 0); + cos_test("-280", 0); + cos_test("-320", 0); + cos_test("-360", 0, -1, 0.001); + cos_test("-400", 0); } TEST_CASE("tan") { - tan_test("0.1", 0); - tan_test("0.05", 0, 1e-2); - tan_test("0.01", 0, 5e-2); - tan_test("0.001", 0, -1); - tan_test("0.0001", 0, -1); - tan_test("0.00001", 0, -1); - tan_test("0.000001", 0, -1); + tan_test("0.1", 0, 0.2); tan_test("0.0", 0, -1); - tan_test("0.2", 0); - tan_test("0.3", 0); - tan_test("0.4", 0); - tan_test("0.9", 0); - tan_test("1.5", 0); - tan_test("2.0", 0); - tan_test("2.5", 0); - tan_test("3.0", 0); + tan_test("1.5", 0, 0.02); + tan_test("2.0", 0, 0.02); + tan_test("2.5", 0, 0.02); + tan_test("3.0", 0, 0.02); + tan_test("10", 0); + tan_test("20", 0); + tan_test("30", 0); + tan_test("40", 0); + tan_test("80", 0); + tan_test("120", 0); + tan_test("160", 0); + tan_test("200", 0); + tan_test("240", 0); + tan_test("280", 0, 0.006); + tan_test("320", 0); + tan_test("359", 0, 0.02); + tan_test("360", 0, -1, 0.001); + tan_test("361", 0, 0.02); + tan_test("400", 0); +// tan_test(pi, 0, -1); +// tan_test(pi_quarter, 0); +// tan_test(pi_halved, 0); +// tan_test(pi_threequarters, 0); + tan_test("180.0", 0, -1); + tan_test("45.0", 0); + tan_test("90.0", 0, 2); + tan_test("135.0", 0); + tan_test("1000.0", 0, 0.006); + tan_test("-0.5", 0, 0.2); + tan_test("-1.5", 0, 0.02); + tan_test("-2.0", 0, 0.02); + tan_test("-2.5", 0, 0.02); + tan_test("-3.0", 0, 0.02); + tan_test("-9.0", 0); + tan_test("-18.0", 0); + tan_test("-27.0", 0); + tan_test("-1000.0", 0); + tan_test("-30", 0); + tan_test("-40", 0); + tan_test("-80", 0, 0.006); + tan_test("-120", 0); + tan_test("-160", 0); + tan_test("-200", 0); + tan_test("-240", 0); + tan_test("-280", 0); + tan_test("-320", 0); + tan_test("-360", 0, -1, 0.001); + tan_test("-400", 0); } TEST_CASE("arctan") { - atan_test("0.001", 0, -1, 2e-3); - atan_test("-0.001", 0, -1, 2e-3); + atan_test("0.001", 0, -1, 0.06); + atan_test("-0.001", 0, -1, 0.06); atan_test("0.7", 0); atan_test("-0.7", 0); atan_test("0.1", 0); @@ -234,12 +310,12 @@ TEST_CASE("arctan") { atan_test("-2.0", 0); atan_test("3.0", 0); atan_test("-3.0", 0); - atan_test("0", 0, -1); + atan_test("0", 0, -1, 0.06); } TEST_CASE("arcsin") { - asin_test("0.001", 0, -1); - asin_test("-0.001", 0, -1); + asin_test("0.001", 0, -1, 0.06); + asin_test("-0.001", 0, -1, 0.06); asin_test("0.7", 0); asin_test("-0.7", 0); asin_test("0.1", 0, 1e-2); @@ -265,7 +341,7 @@ static const int NUM_RAND_TRIG_TESTS = 4321; //trig tests are slow TEST_CASE("sin random"){ std::default_random_engine gen; std::uniform_int_distribution distrib(0,99); - std::uniform_int_distribution exp_distrib(-1,0); //restrict range for now + std::uniform_int_distribution exp_distrib(0, 2); //restrict range for now std::uniform_int_distribution sign_distrib(0,1); for (int j = 0; j < NUM_RAND_TRIG_TESTS; j++){ for (int i = 0; i < DEC80_NUM_LSU; i++){ @@ -274,25 +350,27 @@ TEST_CASE("sin random"){ int exp = exp_distrib(gen); int sign = sign_distrib(gen); set_exponent(&AccDecn, exp, sign); + remove_leading_zeros(&AccDecn); int lsu0 = AccDecn.lsu[0]; + exp = get_exponent(&AccDecn); CAPTURE(lsu0); CAPTURE(exp); CAPTURE(sign); - if (exp == -1 && lsu0 == 0){ + if (exp <= -1){ //very small - sin_test(40); - } else if ((exp == -1 && lsu0 < 10) || (exp == 0 && lsu0 == 0)){ + sin_test(4000); + } else if (exp == 0 && lsu0 < 50){ //small sin_test(0.4); - } else if ((exp == 0 && lsu0 == 31)){ - //near pi - sin_test(0.2); - } else if ((exp == 0 && lsu0 == 62)){ - //near 2pi - sin_test(0.2); - } else if ((exp == 0 && lsu0 > 62)){ + } else if (exp == 2 && lsu0 >= 17 && lsu0 <= 19){ + //near 180 + sin_test(3); + } else if (exp == 2 && lsu0 >= 35 && lsu0 <= 36){ + //near 360 + sin_test(12); + } else if (exp == 2 && lsu0 > 50){ //large - sin_test(0.1); + sin_test(35); } else { sin_test(0.02); } @@ -302,7 +380,7 @@ TEST_CASE("sin random"){ TEST_CASE("cos random"){ std::default_random_engine gen; std::uniform_int_distribution distrib(0,99); - std::uniform_int_distribution exp_distrib(-1,0); //restrict range for now + std::uniform_int_distribution exp_distrib(0, 2); //restrict range for now std::uniform_int_distribution sign_distrib(0,1); for (int j = 0; j < NUM_RAND_TRIG_TESTS; j++){ for (int i = 0; i < DEC80_NUM_LSU; i++){ @@ -311,20 +389,24 @@ TEST_CASE("cos random"){ int exp = exp_distrib(gen); int sign = sign_distrib(gen); set_exponent(&AccDecn, exp, sign); + remove_leading_zeros(&AccDecn); int lsu0 = AccDecn.lsu[0]; + exp = get_exponent(&AccDecn); CAPTURE(lsu0); CAPTURE(exp); CAPTURE(sign); - if (exp == 0 && lsu0 == 15){ - //near pi/2 - cos_test(0.4); - } else if (exp == 0 && lsu0 == 47){ - //near 3/2 * pi - cos_test(0.4); - } else if (exp == 0 && lsu0 == 78){ - //near 5/2 * pi -// cos_test(0.4); - cos_test(1.1); //actual rtol is much worse than 0.4, random test happens to hit a bad one + if (exp == 1 && lsu0 >= 89 && lsu0 <= 90){ + //very near 90 + cos_test(500); + } else if (exp == 1 && lsu0 >= 87 && lsu0 <= 92){ + //near 90 + cos_test(2); + } else if (exp == 2 && lsu0 >= 26 && lsu0 <= 27){ + //near 270 + cos_test(500); + } else if (exp == 2 && lsu0 >= 44){ + //large + cos_test(20); } else { cos_test(0.02); } @@ -334,7 +416,7 @@ TEST_CASE("cos random"){ TEST_CASE("tan random"){ std::default_random_engine gen; std::uniform_int_distribution distrib(0,99); - std::uniform_int_distribution exp_distrib(-1,0); //restrict range for now + std::uniform_int_distribution exp_distrib(0, 2); //restrict range for now std::uniform_int_distribution sign_distrib(0,1); for (int j = 0; j < NUM_RAND_TRIG_TESTS; j++){ for (int i = 0; i < DEC80_NUM_LSU; i++){ @@ -343,35 +425,39 @@ TEST_CASE("tan random"){ int exp = exp_distrib(gen); int sign = sign_distrib(gen); set_exponent(&AccDecn, exp, sign); + remove_leading_zeros(&AccDecn); int lsu0 = AccDecn.lsu[0]; + exp = get_exponent(&AccDecn); CAPTURE(lsu0); CAPTURE(exp); CAPTURE(sign); - if (exp == -1 && lsu0 == 0){ + if (exp <= -3){ + //extremely small + tan_test(5000); + } if (exp <= -1){ //very small - tan_test(40); - } else if ((exp == -1 && lsu0 < 10) || (exp == 0 && lsu0 == 0)){ + tan_test(400); + } else if (exp == 0 && lsu0 < 50){ //small - tan_test(0.5); - } else if (exp == 0 && lsu0 == 15){ - //near pi/2 - tan_test(0.5); - } else if ((exp == 0 && lsu0 == 31)){ - //near pi - tan_test(0.2); - } else if (exp == 0 && lsu0 == 47){ - //near 3/2 * pi - tan_test(0.5); - } else if ((exp == 0 && lsu0 == 62)){ - //near 2pi - tan_test(0.2); - } else if (exp == 0 && lsu0 == 78){ - //near 5/2 * pi -// tan_test(0.5); - tan_test(0.6); //actual rtol is much worse than 0.4, random test happens to hit a bad one - } else if ((exp == 0 && lsu0 > 62)){ + tan_test(1); + } else if (exp == 1 && lsu0 >= 89 && lsu0 <= 90){ + //very near 90 + tan_test(5); + } else if (exp == 1 && lsu0 >= 87 && lsu0 <= 92){ + //near 90 + tan_test(1); + } else if (exp == 2 && lsu0 >= 17 && lsu0 <= 19){ + //near 180 + tan_test(3); + } else if (exp == 2 && lsu0 >= 26 && lsu0 <= 27){ + //near 270 + tan_test(5); + } else if (exp == 2 && lsu0 >= 35 && lsu0 <= 37){ + //near 360 + tan_test(20); + } else if (exp == 2 && lsu0 >= 44){ //large - tan_test(0.1); + tan_test(50); } else { tan_test(0.02); } From 774be02e1f8144fc26964658e4b3028fb9ebe78f Mon Sep 17 00:00:00 2001 From: Jeff Wang Date: Sat, 30 Jan 2021 19:00:37 -0500 Subject: [PATCH 2/5] use ->deg as default shifted function now that trig functions operate in degrees (->rad is down-shifted function now) --- qt_gui/main.qml | 4 ++-- src/calc.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/qt_gui/main.qml b/qt_gui/main.qml index 3e5936c..c418d37 100644 --- a/qt_gui/main.qml +++ b/qt_gui/main.qml @@ -168,7 +168,7 @@ ApplicationWindow ["Shift", "1/x", " √x ", "CLx"], ["yx ", "ln(x)", "log(x)", "π"], ["R▼", "ex", "10x", ""], - ["sin(x)", "cos(x)", "tan(x)", "►rad"], + ["sin(x)", "cos(x)", "tan(x)", "►deg"], ["off", "STO", "RCL", "LASTx"] ] @@ -180,7 +180,7 @@ ApplicationWindow ["", "", "", ""], ["", "", "", ""], ["R▲", "", "", ""], - ["asin(x)", "acos(x)", "atan(x)", "►deg"], + ["asin(x)", "acos(x)", "atan(x)", "►rad"], ["", "", "", ""] ] diff --git a/src/calc.c b/src/calc.c index 5ec1b4e..ea3ee7a 100644 --- a/src/calc.c +++ b/src/calc.c @@ -116,9 +116,9 @@ void process_cmd(char cmd){ ////////// case '-':{ if (IsShiftedUp) { - do_unary_op(to_radian_decn); - } else if (IsShiftedDown) { do_unary_op(to_degree_decn); + } else if (IsShiftedDown) { + do_unary_op(to_radian_decn); } else { negate_decn(&stack(STACK_X)); do_binary_op(add_decn); From 380b90d434b6e2cb4b56400882237910259e27af Mon Sep 17 00:00:00 2001 From: Jeff Wang Date: Sat, 30 Jan 2021 22:16:06 -0500 Subject: [PATCH 3/5] resize/remove unused variables in lcd.c --- src/lcd.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/lcd.c b/src/lcd.c index 278df08..57ebf3b 100644 --- a/src/lcd.c +++ b/src/lcd.c @@ -117,7 +117,7 @@ static char readBusy() { } static void wait_busy() { - unsigned int i; + uint8_t i; for (i = 0; i < 100; i++){ if (!readBusy()){ return; @@ -129,7 +129,6 @@ static void wait_busy() { } static void LCD_OutChar(unsigned char c) { - unsigned char lower = (c & 0x0f); DISABLE_INTERRUPTS(); wait_busy(); //output upper 4 bits: From 2a301e71a9989b42317cd2b8029c4c7a6ee8cb53 Mon Sep 17 00:00:00 2001 From: Jeff Wang Date: Sat, 30 Jan 2021 22:15:53 -0500 Subject: [PATCH 4/5] update readme (default degrees, update outdated stuff), bump version --- README.md | 12 +++++------- qt_gui.png | Bin 68571 -> 72828 bytes src/main.c | 2 +- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 2c7e4eb..12f22af 100644 --- a/README.md +++ b/README.md @@ -91,9 +91,9 @@ The keys on the *original* calculator map as follows: - acts as acos(x) when shifted down - `3 `: acts as tan(x) when shifted - acts as atan(x) when shifted down -- all trig functions are currently calculated in radians (TODO: change to degrees by default) -- `- `: acts as to radians when shifted - - acts as to degrees when shifted down +- all trig functions are calculated in degrees +- `- `: acts as to degrees when shifted + - acts as to radians when shifted down - `+ `: acts as LastX when shifted - `0 `: acts as off button when shifted @@ -206,7 +206,7 @@ I sometimes use an STC15F2K60S2 for development work. This microcontroller is av ## Programming with stcgal -Run `stcgal` as shown below, replacing `stc_rpncalc/main.hex` with the actual path to the main.hex you built. There are also prebuilt binaries in the `binaries` directory. In this example, I'm programming at a relatively high line rate of 230,400 bits/s. This works very reliably, but you may want to try at a slower speed to start (omit the `-b 230400` option), especially when using an inline resistor and diode. +Run `stcgal` as shown below, replacing `stc_rpncalc/main.hex` with the actual path to the main.hex you built. There are also prebuilt binaries in the Releases section of github. In this example, I'm programming at a relatively high line rate of 230,400 bits/s. This works very reliably, but you may want to try at a slower speed to start (omit the `-b 230400` option), especially when using an inline resistor and diode. ~~~~ $ ./stcgal.py -P stc15 -b 230400 stc_rpncalc/main.hex @@ -297,7 +297,7 @@ The number `0.135` would be stored the same way, except now the exponent is `0x7 ## Transcendental Functions - Logarithms are calculated similar to how it's described by the HP Journal article "Personal Calculator Algorithms IV: Logarithmic Functions" by William Egbert. - see `src/decn/proto/ln_mfp.cpp` for initial prototyping development work -- Exponentials are calculated similar to the HP 35 algorithm, as described [here](http://www.jacques-laporte.org/expx.htm) using the same constants as the logarithm algorithm. +- Exponentials are calculated similar to the HP 35 algorithm, as described [here](https://archived.hpcalc.org/laporte/expx.htm) using the same constants as the logarithm algorithm. - see `src/decn/proto/exp.cpp` for initial prototyping development work - Powers are calculated using the identity y^x = e^(x*ln(y)) - Square roots are calculated using a fixed number of Newton-Raphson iterations to calculatie 1/sqrt(x) and then multiplying by x. @@ -314,8 +314,6 @@ The number `0.135` would be stored the same way, except now the exponent is `0x7 - Would be nice to have the resistor color band decoder if there is more flash space - Rounding: currently, to save code space, there is no rounding being done (even for intermediate steps), and numbers are instead truncated. Still, with 18 digits of precision (two guard digits, even if all 16 digits are actually displayed), the results are fairly accurate. - Square roots could be more-accurately implemented using digit-by-digit methods similar to those described in the HP Journal article "Personal Calculator Algorithms I: Square Roots" by William Egbert. - - calculating using Newton-Raphson iterations for the reciprocal square root 1/sqrt(x), and then multiplying by the original value would probably also be more accurate, and definitely much faster - - the iteration for the reciprocal square root is new_estimate = 0.5 * estimate * (3 - x * estimate * estimate) - Reciprocal/division could also be more-accurately implemented using digit-by-digit methods (the Newton-Raphson iterations currently used are quite fast though). # Key Debouncing diff --git a/qt_gui.png b/qt_gui.png index cf2879fb05e6e546b8aba561ee12240b57399823..fb35ab4c7c54eca01a83cff17a781f057f3ff615 100644 GIT binary patch literal 72828 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 B)oK6$ literal 68571 zcmbTdbx>Tv^Dl}732uP^L4yQ$3mSZJm%!rgF2UX1-EGm}PJ+9;ySpvU+kEf)zN+`T zb^p0lv$f}(I@8lK{pmhEGhqsH5~xT7NKjBvr~pY(B`7H9Stux2K16uPlk;jt5ajQp zousBC6ck$TzaMlG9U37N6e$!y^oNRD=INTN6V4pWz}3a5mFxvs6xOdpA}hUxkVUc6 zr`~%j`Mz+e8bez?WEZhhppXz8axS70*7uJX!oSuiv`qJ3f47ktW5?IvYf+LfsPeC;+0)$#9J_XEd*-1j-RP65)XG)Sk&$N{9UN{iFYP)2rQHG_EEQlH%u^v^4?+kyv}h~! z#NHy5t(@Whr9t#3J>?QFPz>S!d#tXeRvZ!%VtI9S^%FVo*B@98y&-lovL96y6^T7P zJ;o^`lr3vELpxWJTU%RLz5_evx30<{PMQ(iAkdYDy1i~qwqxIk;2B@miP*8~a^ZPB`UL-@5fm!p< z)ckF0>lTxbu#NhYwBh*+b8|=G`G@cUKbls~(&sGZAc{y&PY1!57cQ^=L0U}b5)jZ? zZ?H@;;LP~+XVdAsaorMqn>OQ;MS~Ow^sl8C15D~Pr`aoIb5`aTK0=0&fY(f3!Evgk zKY{2Z#aL4vM-0*+^jn9FrXloAI5Rl@)TJl{xqPq;foUj;FB{oog@G4S#0lxi`y3^{ zv~x8`l>mT{oFa+nQzA(v=Y~wyK(8(IpYI!JA+P~|bBAgxMrtb{d;pV;*Yudp(u>P{ z2i~bQDCZjCH8Z4&eSfH`7F3;x{~;Zz%?E+3*a;|ARgDAwk{-3{kmSGlJil`iL{(M= zzB@zs?T!mRDuh|5g7L|f%Pg)rtMdsd1wnDyzPai-1#~HX;8*oZN zpkqHBYJgG!sj8|f+h-I|)d}t96#G~i2vkRu*E-?1ToqqN0l*bg6y_t2(Nx4qfUpmU z$5B=Nq?v3iJ7XlKNC8}+gk1Ot5umJNVr0MKn(B}GavhlsCm)#}u+Ng%HB;ADFDqLzWHNIT*4yGkazQajQX~_#vZs9I?1hVsWafckm!X-k7di zQeaNjSY#JxjoI48>fN!Slh-wNXPL!G>(bDAb97F`sTtHc5#RgO#LJe=N%2276D~)2 zdtv>IQVS7XL|FKEAP3>1QZ8eRDk(8h(u1z3@q`$p>*m&6c+$F?!7o1T3{+B8O*Ynq z=N0t4LyJ*C+rBx%V-{FVSvp^9zkQOH$<7)k;rb%R1&~lxWgqgLA~|UdmY!3@ffEbg zI<_ov;DI;#^V@^N*5;a7TiqUnMJ0x|Y*h6h2O8K2N+2CWUEfDq41Nh%e-6RCMW4?# zPnTK4UDq-^*qxEvz%GXBH>$!HOmAlBVr>(Gbw&X5b0*!Wt1WbiG6B1`m`i?exyTU+$7xBt210CCbrQpdL z7Y8eXi$y4Bspu$%YERKsmz3iMzDvNUJ6U^g%*3aT+np%AF_s31PC642M6Zz^MOl

|4qND0QxQ0po89tK|TbW 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 L Date: Sat, 30 Jan 2021 22:37:29 -0500 Subject: [PATCH 5/5] whitespace only changes to readme format as one sentence/phrase per line to make futuer diffs smaller --- README.md | 251 ++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 214 insertions(+), 37 deletions(-) diff --git a/README.md b/README.md index 12f22af..8b5792d 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,30 @@ # STC DIY Calculator Firmware -This is a replacement firmware for the [diyleyuan calculator kit](http://www.diyleyuan.com/jc/L8Q.html). The calculator kit is available for purchase for less than $13 shipped from eBay by searching for "diy calculator kit" (price has increased recently, currently closer to $18 shipped). You will have to solder the kit yourself (see "hardware connections" below). The calculator uses an STC IAP15W413AS microcontroller (an 8051 instruction set-compatible microcontroller) with a built-in serial-port bootloader. See the series [summary](http://www.stcmicro.com/datasheet/STC15W408AS_Features.pdf) and full english [datasheet](https://www.stcmicro.com/datasheet/STC15F2K60S2-en.pdf). This project uses [SDCC](http://sdcc.sourceforge.net/) to compile the C code and [stcgal](https://github.com/grigorig/stcgal) to load the new firmware. +This is a replacement firmware for the [diyleyuan calculator kit](http://www.diyleyuan.com/jc/L8Q.html). +The calculator kit is available for purchase for less than $13 shipped from eBay by searching for "diy calculator kit" +(price has increased recently, currently closer to $18 shipped). +You will have to solder the kit yourself (see "hardware connections" below). +The calculator uses an STC IAP15W413AS microcontroller +(an 8051 instruction set-compatible microcontroller) +with a built-in serial-port bootloader. +See the series [summary](http://www.stcmicro.com/datasheet/STC15W408AS_Features.pdf) +and full english [datasheet](https://www.stcmicro.com/datasheet/STC15F2K60S2-en.pdf). +This project uses [SDCC](http://sdcc.sourceforge.net/) to compile the C code +and [stcgal](https://github.com/grigorig/stcgal) to load the new firmware. -The replacement firmware supports floating-point calculations (using 18 decimal digits plus exponent for arithmetic) with a 4-level RPN stack. Functions include basic arithmetic as well as log(), exp(), y^x, 1/x and sqrt(), all in floating point. (The original firmware supported only fixed-point calculations in chain mode.) I have not added in the resistor value calculator or the decimal/hexadecimal converter features from the original firmware. +The replacement firmware supports floating-point calculations +(using 18 decimal digits plus exponent for arithmetic) +with a 4-level RPN stack. +Functions include basic arithmetic as well as log(), exp(), y^x, 1/x and sqrt(), +all in floating point. +(The original firmware supported only fixed-point calculations in chain mode.) +I have not added in the resistor value calculator or the decimal/hexadecimal converter features from the original firmware. -Note that once you change the firmware on the calculator, there's no way to go back to the original firmware (the original firmware isn't posted for download anywhere). STC's bootloader on the microcontroller deliberately prevents readback of the microcontroller's content, and STC considers this to be a "feature". +Note that once you change the firmware on the calculator, +there's no way to go back to the original firmware +(the original firmware isn't posted for download anywhere). +STC's bootloader on the microcontroller deliberately prevents readback of the microcontroller's content, +and STC considers this to be a "feature". Here's a picture of the assembled calculator kit running the new firmware: @@ -28,9 +48,15 @@ The calculator uses RPN. Calculate (2+3)/(9^2) by pressing the following keys: - `*` - `÷` -The = key is used for Enter. There is automatic stack lift so that `9`, `Enter`, `*` is equivalent to 9^2. The stack is a classic 4-level RPN stack, where the T register automatically duplicates. +The = key is used for Enter. +There is automatic stack lift so that +`9`, `Enter`, `*` +is equivalent to 9^2. +The stack is a classic 4-level RPN stack, +where the T register automatically duplicates. -The decimal key also doubles as the enter exponent key. For example the following calculates 3E8 / 1550E-9: +The decimal key also doubles as the enter exponent key. +For example the following calculates 3E8 / 1550E-9: - 3 - . @@ -52,7 +78,11 @@ The decimal key also doubles as the enter exponent key. For example the followin - 9 - `÷` -There is currently no way to force the calculator to display in scientific mode. For extremely large numbers that are hard to read, taking the log base 10 of a number will give its exponent. Numbers larger than 18 digits will automatically be displayed in scientific notation, as will numbers smaller than 1E-3. +There is currently no way to force the calculator to display in scientific mode. +For extremely large numbers that are hard to read, +taking the log base 10 of a number will give its exponent. +Numbers larger than 18 digits will automatically be displayed in scientific notation, +as will numbers smaller than 1E-3. ## Keys Some of the keys have slightly different functions, see the picture of the emulator Qt GUI. @@ -100,16 +130,36 @@ The keys on the *original* calculator map as follows: ## Floating Point -The calculator internally calculates with an 18 digit significand for better precision, even though at most 16 digits can be displayed. The exponent display is fixed at 2 digits (when it is displayed), but the calculator doesn't prevent you from doing certain operations (e.g. basic arithmetic) which result in numbers with larger exponents. +The calculator internally calculates with an 18 digit significand for better precision, +even though at most 16 digits can be displayed. +The exponent display is fixed at 2 digits (when it is displayed), +but the calculator doesn't prevent you from doing certain operations +(e.g. basic arithmetic) which result in numbers with larger exponents. -Internally, the calculator dedicates 15 bits for representing the signed exponent, so exponents up to +/- 16,383 can be represented (see the internals section below for more information). This is to ensure that intermediate parts of certain calculations (mainly taking the reciprocal of a number) do not prematurely cause overflow or underflow, even when the result is fully representable with just 2 digits. You can do calculations with greater than 2 digits in the exponent, but only 2 digits will be displayed. For larger exponents, a 10 in the ten's place of the exponent will be displayed as a '`:`'. (This just so happens to be the next character after '`9`' in the 1602 LCD's character map). +Internally, the calculator dedicates 15 bits for representing the signed exponent, +so exponents up to +/- 16,383 can be represented +(see the internals section below for more information). +This is to ensure that intermediate parts of certain calculations +(mainly taking the reciprocal of a number) +do not prematurely cause overflow or underflow, +even when the result is fully representable with just 2 digits. +You can do calculations with greater than 2 digits in the exponent, +but only 2 digits will be displayed. +For larger exponents, +a 10 in the ten's place of the exponent will be displayed as a '`:`'. +(This just so happens to be the next character after '`9`' in the 1602 LCD's character map). ## Turning off -Press `Shift` (the `mode` key on the physical calculator) and then `0` to turn off. On older stc_rpncalc firmwares, or if the calculator is unresponsive, hold `Shift` (the `mode` key on the physical calculator) and `0` *at the same time* to turn off. NOTE: There is no auto power off. +Press `Shift` (the `mode` key on the physical calculator) and then `0` to turn off. +On older stc_rpncalc firmwares, +or if the calculator is unresponsive, +hold `Shift` (the `mode` key on the physical calculator) and `0` *at the same time* to turn off. +NOTE: There is no auto power off. # Building -Github releases has prebuilt binaries for the calculator. Building is fairly straigtforward though. +Github releases has prebuilt binaries for the calculator. +Building is fairly straigtforward though. - Use the Makefile for building a new firmware for the calculator. - type `make` to build @@ -126,7 +176,18 @@ Github releases has prebuilt binaries for the calculator. Building is fairly str - `ninja` # Installing -Note that once you change the firmware on the calculator, it isn't possible to go back to the original firmware. The STC microcontroller used has a bootloader permanently stored in ROM that allows downloading new firmware over a serial port (but not reading the existing firmware). You can re-program it using a USB-to-logic-level-serial (5V) dongle, and the stcgal program. WARNING: a lot of USB-to-logic-level-serial dongles are for 3.3V logic levels instead of the 5V needed. Also note that this is a "logic-level" serial port, and not RS232 levels, which are generally a high negative voltage. The diyleyuan calculator runs at 5V to make it easier to power/drive the LCD display. You have a couple of options: +Note that once you change the firmware on the calculator, +it isn't possible to go back to the original firmware. +The STC microcontroller used has a bootloader permanently stored in ROM that allows downloading new firmware over a serial port +(but not reading the existing firmware). +You can re-program it using a USB-to-logic-level-serial (5V) dongle, +and the stcgal program. +WARNING: a lot of USB-to-logic-level-serial dongles are for 3.3V logic levels instead of the 5V needed. +Also note that this is a "logic-level" serial port, +and not RS232 levels, +which are generally a high negative voltage. +The diyleyuan calculator runs at 5V to make it easier to power/drive the LCD display. +You have a couple of options: 1. Buy a USB to logic-level serial dongle that supports 5V operation (these dongles may have a jumper you need to set to switch between 3.3V and 5V). This is the best option. - Here is one that works: https://www.amazon.com/gp/product/B00N4MCS1A/ @@ -145,11 +206,20 @@ Note that once you change the firmware on the calculator, it isn't possible to g Connect to Tx of the USB dongle. - Pin 16 is Tx from the microcontroller (purple wire in the picture). Connect to Rx of the USB dongle. -I recommend soldering Tx and Rx wires into the plated through holes on the PCB while soldering up the kit, so that the connections are more permanent. I soldered the wires from the back side (leave space for the screw hole). Note that you must "cross over" Tx/Rx going between the microcontroller and the USB dongle (i.e. Rx on the microcontroller goes to Tx on the USB dongle, and Tx on the microcontroller goes to Rx on the USB dongle). +I recommend soldering Tx and Rx wires into the plated through holes on the PCB while soldering up the kit, +so that the connections are more permanent. +I soldered the wires from the back side (leave space for the screw hole). +Note that you must "cross over" Tx/Rx going between the microcontroller and the USB dongle +(i.e. Rx on the microcontroller goes to Tx on the USB dongle, +and Tx on the microcontroller goes to Rx on the USB dongle). ![connections_back](./connections_back.jpg) -You must also connect ground to the dongle. A good point to use is header P1. (You may optionally power the calculator with +5V from the USB dongle instead of using button-cell batteries. Header P1 is again a good location to use.) To program the calculator see the "Programming with stcgal" section below. +You must also connect ground to the dongle. +A good point to use is header P1. +(You may optionally power the calculator with +5V from the USB dongle instead of using button-cell batteries. +Header P1 is again a good location to use.) +To program the calculator see the "Programming with stcgal" section below. Pin on calculator | Color used | Pin on usb-to-serial dongle ------------------|------------|----------------------------- @@ -162,27 +232,55 @@ P1 pin 2 (Gnd) | Black | (Gnd) #### Voltage regulator -Be careful when working on the calculator. The 7550 voltage regulator used has no short circuit protection. It does have a low quiescent current and extremely low dropout voltage though, and you must match the low dropout voltage if replacing the regulator. If you do end up damaging the regulator (like I did), a good replacement is the Microchip MCP1700-5002E/TO. (In the picture though, I just removed the 7550 voltage regulator, shorted pins 2 and 3, and added a capacitor between pin 1 and pins 2/3. I am powering the calculator externally, instead of with batteries.) +Be careful when working on the calculator. +The 7550 voltage regulator used has no short circuit protection. +It does have a low quiescent current and extremely low dropout voltage though, +and you must match the low dropout voltage if replacing the regulator. +If you do end up damaging the regulator (like I did), +a good replacement is the Microchip MCP1700-5002E/TO. +(In the picture though, I just removed the 7550 voltage regulator, shorted pins 2 and 3, +and added a capacitor between pin 1 and pins 2/3. +I am powering the calculator externally, instead of with batteries.) #### Parasitic powering through the usb-to-serial adapter -If you have the usb-to-serial adapter connected, the calculator may draw power parasitically through pin 15 (Rx) of the microcontroller. This may prevent the calculator and microcontroller from fully turning off. This may prevent the bootloader from running (which would prevent you from reprogramming the calculator), since the bootloader only runs on power on. To prevent this, use a diode on pin 15 (see image above, or consult the microcontroller datasheet). You may also optionally add a 330 ohm resistor on pin 16 (Tx) of the microcontroller to provide isolation on that pin. (I don't think it's necessary to prevent parasitic power though.) +If you have the usb-to-serial adapter connected, +the calculator may draw power parasitically through pin 15 (Rx) of the microcontroller. +This may prevent the calculator and microcontroller from fully turning off. +This may prevent the bootloader from running +(which would prevent you from reprogramming the calculator), +since the bootloader only runs on power on. +To prevent this, use a diode on pin 15 +(see image above, or consult the microcontroller datasheet). +You may also optionally add a 330 ohm resistor on pin 16 (Tx) +of the microcontroller to provide isolation on that pin. +(I don't think it's necessary to prevent parasitic power though.) #### Adding programming connections after the fact -If you have already soldered the kit together without adding the Tx/Rx serial wires, you can still solder wires directly to the microcontroller fairly easily. +If you have already soldered the kit together without adding the Tx/Rx serial wires, +you can still solder wires directly to the microcontroller fairly easily. ![connections](./connections.jpg) #### Schematic -Here is the schematic from the diyleyuan website. Note that the schematic symbol for the microcontroller mistakenly labels P5.4 as P0.0, and mistakenly labels P5.5 as P0.1. The net name labels are correct. +Here is the schematic from the diyleyuan website. +Note that the schematic symbol for the microcontroller mistakenly labels P5.4 as P0.0, +and mistakenly labels P5.5 as P0.1. +The net name labels are correct. ![schematic](./schematic.gif) #### Soft-latching power switch -The soft-latching power switch works as follows: Initially the calculator is off. Both Q1 and Q2 are off. Pressing the On key (S4) turns on Q1 through R1 and D2. Q1 then supplies 5V to the system. Once the microcontroller has power and starts running, it turns on Q2, which keeps Q1 on through R1. To turn off, the microcontroller turns off Q2, which in turn will turn off Q1. +The soft-latching power switch works as follows: +Initially the calculator is off. Both Q1 and Q2 are off. +Pressing the On key (S4) turns on Q1 through R1 and D2. +Q1 then supplies 5V to the system. +Once the microcontroller has power and starts running, +it turns on Q2, which keeps Q1 on through R1. +To turn off, the microcontroller turns off Q2, which in turn will turn off Q1. #### Component layout @@ -192,21 +290,47 @@ Here is the component layout from the diyleyuan website. #### Keyswitches, LCD, and other recommended replacement components -The switches used are a knockoff of the Omron B3F series. A good replacement is the B3F-5050 which requires only 130 grams force to depress. The switches included with the kit take more force to depress. (This is somewhat a matter of personal preference though.) I recommend using four 11mm M2 standoffs along with eight M2 screws instead of using the four long screws and nuts provided to hold the top and bottom together. The problem with using the long screws is that in order to tighten them tight enough that they don't become loose easily, the top plate deforms slightly and might interfere with the keys. +The switches used are a knockoff of the Omron B3F series. +A good replacement is the B3F-5050 which requires only 130 grams force to depress. +The switches included with the kit take more force to depress. +(This is somewhat a matter of personal preference though.) +I recommend using four 11mm M2 standoffs along with eight M2 screws instead of using the four long screws and nuts provided to hold the top and bottom together. +The problem with using the long screws is that in order to tighten them tight enough that they don't become loose easily, +the top plate deforms slightly and might interfere with the keys. -User toml_12953 has made a new keyboard template here (todo: can check into git directly?): https://www.dropbox.com/s/7xkg98ywonp4p1l/New%20DIY%20Template.jpg?dl=1 +User toml_12953 has made a new keyboard template here (todo: can check into git directly?): +https://www.dropbox.com/s/7xkg98ywonp4p1l/New%20DIY%20Template.jpg?dl=1 -The LCD used is a fairly standard LCD based on a HD44780-compatible controller. The hole spacing for the screw holes on the LCD is 31mm x 75mm. There are many replacements available, including ones that don't need the backlight on to be readable. I recommend a positive transflective or reflective FSTN type, although the one included (transmissive) is very usable with the backlight on. Here is a picture of a positive FSTN display with the backlight off (shown under strong office lighting): +The LCD used is a fairly standard LCD based on a HD44780-compatible controller. +The hole spacing for the screw holes on the LCD is 31mm x 75mm. +There are many replacements available, +including ones that don't need the backlight on to be readable. +I recommend a positive transflective or reflective FSTN type, +although the one included (transmissive) is very usable with the backlight on. +Here is a picture of a positive FSTN display with the backlight off +(shown under strong office lighting): ![backlight off](./no_backlight.jpg) -The included LCD is a transmissive type, and requires the backlight on to be readable. +The included LCD is a transmissive type, +and requires the backlight on to be readable. -I sometimes use an STC15F2K60S2 for development work. This microcontroller is available in a pin-compatible DIP-28 package for less than $2 a piece in single-digit quantities, and has almost 5 times the flash (a downside is that when programming, the flash takes longer to erase). To program a blank microcontroller, you will have to add the following additional options to `stcgal`: `-l 1200 -t 12000` +I sometimes use an STC15F2K60S2 for development work. +This microcontroller is available in a pin-compatible DIP-28 package for less than $2 a piece in single-digit quantities, +and has almost 5 times the flash +(a downside is that when programming, the flash takes longer to erase). +To program a blank microcontroller, +you will have to add the following additional options to `stcgal`: `-l 1200 -t 12000` ## Programming with stcgal -Run `stcgal` as shown below, replacing `stc_rpncalc/main.hex` with the actual path to the main.hex you built. There are also prebuilt binaries in the Releases section of github. In this example, I'm programming at a relatively high line rate of 230,400 bits/s. This works very reliably, but you may want to try at a slower speed to start (omit the `-b 230400` option), especially when using an inline resistor and diode. +Run `stcgal` as shown below, +replacing `stc_rpncalc/main.hex` with the actual path to the main.hex you built. +There are also prebuilt binaries in the Releases section of github. +In this example, I'm programming at a relatively high line rate of 230,400 bits/s. +This works very reliably, but you may want to try at a slower speed to start +(omit the `-b 230400` option), +especially when using an inline resistor and diode. ~~~~ $ ./stcgal.py -P stc15 -b 230400 stc_rpncalc/main.hex @@ -250,18 +374,43 @@ Disconnected! (The name for `stcgal` is probably a play on words from the `avrdude` programming software used to program AVR microcontrollers.) # Bugs -1. After division by 0, ln(-), over/underflow, or other operations which give an `Error`, it's possible to still do certain operations on `Error`. Many functions do check, and will not operate on `Error`, but not all of them yet. This is somewhat similar to old soviet Elektronika calculators where `Error` is just a number, and there wasn't enough ROM space to check for errors. (There are people who explore the inner-workings of these calculators by manipulating the `Error` "number".) +1. After division by 0, ln(-), over/underflow, or other operations which give an `Error`, +it's possible to still do certain operations on `Error`. +Many functions do check, and will not operate on `Error`, +but not all of them yet. +This is somewhat similar to old soviet Elektronika calculators where `Error` is just a number, +and there wasn't enough ROM space to check for errors. +(There are people who explore the inner-workings of these calculators by manipulating the `Error` "number".) 1. When shifted, keys which do not have a shifted function will instead be interpreted as if there were no shift. 1. Trigonometric functions are extremely slow and inaccurate. 1. There are probably more bugs waiting to be discovered. # Internals ## Number Format -The original firmware that came with this calculator used a fixed-point format, which significantly limited the range of numbers usable. Additionally, the implementation doesn't actually have enough digits for all displayable results, which can cause errors (e.g. `3,162.277*3,162.28` gives `10,000,010` instead of the correct `10,000,005.31156`). +The original firmware that came with this calculator used a fixed-point format, +which significantly limited the range of numbers usable. +Additionally, the implementation doesn't actually have enough digits for all displayable results, +which can cause errors +(e.g. `3,162.277*3,162.28` gives `10,000,010` instead of the correct `10,000,005.31156`). -This replacement calculator firmware uses decimal floating point, using base-100 to store numbers and do calculations. Base-100 allows for efficient storage into 8-bit bytes, and is easier to work with than packed-BCD. Unlike straight binary representations, base-100 is still fairly easy to display as decimal. Also unlike binary representations, there is no conversion error from binary/decimal (e.g. numbers like `0.1` can be represented exactly). +This replacement calculator firmware uses decimal floating point, +using base-100 to store numbers and do calculations. +Base-100 allows for efficient storage into 8-bit bytes, +and is easier to work with than packed-BCD. +Unlike straight binary representations, +base-100 is still fairly easy to display as decimal. +Also unlike binary representations, there is no conversion error from binary/decimal +(e.g. numbers like `0.1` can be represented exactly). -Each `uint8_t` stores a base-100 "`digit100`", referred to as an "`lsu`", for least significant unit. (The LSU terminology is borrowed from the decNumber library: I originally considered using the decNumber library similar to the WP-34S calculator, but just the library itself takes several times more flash than is available on this calculator. I also considered using the BigNumber arduino library, but that library uses C++ and lots of pointers passed to functions, which are extremely expensive on the 8051 architecture.) The number format is as follows: +Each `uint8_t` stores a base-100 "`digit100`", +referred to as an "`lsu`", for least significant unit. +(The LSU terminology is borrowed from the decNumber library: +I originally considered using the decNumber library similar to the WP-34S calculator, +but just the library itself takes several times more flash than is available on this calculator. +I also considered using the BigNumber arduino library, +but that library uses C++ and lots of pointers passed to functions, +which are extremely expensive on the 8051 architecture.) +The number format is as follows: - `lsu[0]`: contains the most significant `digit100` (the most significant 2 decimal digits) - implicit decimal point between `lsu[0]/10` and `lsu[0]%10` @@ -275,16 +424,23 @@ Each `uint8_t` stores a base-100 "`digit100`", referred to as an "`lsu`", for le - range of exponents only needs to be `+/-99` - using 15 bits for the exponent (instead of e.g. 7 bits) prevents certain intermediate results from prematurely causing overflow -For example, the number `13.5` is stored normalized (with no leading zeros in the representation) as follows: +For example, the number `13.5` is stored normalized +(with no leading zeros in the representation) as follows: - `lsu[0]`: 13 - `lsu[1]`: 50 - `lsu[2]` to `lsu[n-1]`: all 0 - exponent: 1 -There is an implicit decimal point between the 1 and 3 in `lsu[0]`, so the number is 1.350 * 10^1, which is equivalent to `13.5`. Similarly, the number `1.35` would be stored the exact same way, except now the exponent is 0. +There is an implicit decimal point between the 1 and 3 in `lsu[0]`, +so the number is 1.350 * 10^1, which is equivalent to `13.5`. +Similarly, the number `1.35` would be stored the exact same way, except now the exponent is 0. -The number `0.135` would be stored the same way, except now the exponent is `0x7FFF` (note that the sign bit is 0, and the bottom 15 bits are the 2's complement representation of -1). The number `-13.5` would be stored the same way, except now the exponent is `0x8001` (the sign bit is now 1 which means the number as a whole is negative, but the exponent itself is positive). +The number `0.135` would be stored the same way, +except now the exponent is `0x7FFF` +(note that the sign bit is 0, and the bottom 15 bits are the 2's complement representation of -1). +The number `-13.5` would be stored the same way, except now the exponent is `0x8001` +(the sign bit is now 1 which means the number as a whole is negative, but the exponent itself is positive). ## Arithmetic - Addition is done the same way as it's done by hand, although in base-100 instead of decimal. @@ -317,19 +473,38 @@ The number `0.135` would be stored the same way, except now the exponent is `0x7 - Reciprocal/division could also be more-accurately implemented using digit-by-digit methods (the Newton-Raphson iterations currently used are quite fast though). # Key Debouncing -The keyboard matrix is scanned once every 5ms. The keyboard debouncing is based on the quick draw/integrator hybrid algorithm described [here](https://summivox.wordpress.com/2016/06/03/keyboard-matrix-scanning-and-debouncing/). This algorithm combines the advantages of both methods: +The keyboard matrix is scanned once every 5ms. +The keyboard debouncing is based on the quick draw/integrator hybrid algorithm described +[here](https://summivox.wordpress.com/2016/06/03/keyboard-matrix-scanning-and-debouncing/). +This algorithm combines the advantages of both methods: 1. It signals a key press immediately, the very first instant a keyboard matrix scan detects a key is pressed (similar to the "quick-draw" method). 1. It has an "integrator" (a saturating up/down counter) to determine both when a key is fully pressed and when a key is fully released. This prevents the mechanically bouncy keys from registering multiple times when pressed. -In practice, the keyboard debouncing works much better than the original firmware (which would occasionally miss keystrokes). +In practice, the keyboard debouncing works much better than the original firmware +(which would occasionally miss keystrokes). # Implementation on an STC 8051 Microcontroller -This was my 1st time using an 8051 microcontroller. The architecture is a bit limiting for programming in "high-level" languages such as C compared to more modern architectures -- even compared to other 8-bit architectures such as the AVR (used in the arduino). Most significantly, there is no stack-pointer-relative addressing, which makes C functions takes up a lot of code space, since they have to emulate stack-pointer-relative addressing. Unfortunately, the microcontroller used only has 13K of code space. The compiler used (SDCC) also does not support using a 2nd data pointer, even though STC's implementation of the 8051 has one. +This was my 1st time using an 8051 microcontroller. +The architecture is a bit limiting for programming in "high-level" languages such as C compared to more modern architectures +-- even compared to other 8-bit architectures such as the AVR (used in the arduino). +Most significantly, there is no stack-pointer-relative addressing, +which makes C functions takes up a lot of code space, +since they have to emulate stack-pointer-relative addressing. +Unfortunately, the microcontroller used only has 13K of code space. +The compiler used (SDCC) also does not support using a 2nd data pointer, +even though STC's implementation of the 8051 has one. -I've avoided relying on the functions being able to be re-entrant, so that they do not depend on having a stack. SDCC is *not* set to use `--stack-auto` to reduce code size (this means functions are not re-entrant). Some "large" local variables are declared as static in functions to save on the code space needed to emulate a stack. I used a lot more globals than what I would typically like to have used, and a lot less pointers passed to functions, since these are extremely expensive (to account for the 3 different memory types). +I've avoided relying on the functions being able to be re-entrant, +so that they do not depend on having a stack. +SDCC is *not* set to use `--stack-auto` to reduce code size (this means functions are not re-entrant). +Some "large" local variables are declared as static in functions to save on the code space needed to emulate a stack. +I used a lot more globals than what I would typically like to have used, +and a lot less pointers passed to functions, +since these are extremely expensive (to account for the 3 different memory types). -Another weird thing about the 8051 is that not all of the memory is addressed the same way. On this microcontroller, there are 512 bytes of ram total, of which: +Another weird thing about the 8051 is that not all of the memory is addressed the same way. +On this microcontroller, there are 512 bytes of ram total, of which: - only 128 bytes can be addressed directly (or indirectly) - the start of this address space is also shared with general purpose registers, so you don't actually have the full 128 bytes of directly addressable memory @@ -339,7 +514,9 @@ Another weird thing about the 8051 is that not all of the memory is addressed th - on the original 8051, this memory would have actually been external, but on this microcontroller the "external" ram is built in - addressing this memory is more difficult than addressing indirect memory, which is itself more difficult than addressing memory directly -Thus, there are special compiler directives to tell it what address space to place variables in memory. (Even for a simple calculator, there isn't enough directly addressable memory (128 bytes) to store everything.) General-purpose pointers and operations using general-purpose pointers are relatively expensive since the pointers must encode the memory type. +Thus, there are special compiler directives to tell it what address space to place variables in memory. +(Even for a simple calculator, there isn't enough directly addressable memory (128 bytes) to store everything.) +General-purpose pointers and operations using general-purpose pointers are relatively expensive since the pointers must encode the memory type. # Licensing