summaryrefslogtreecommitdiffstats
path: root/app/max7219.c
diff options
context:
space:
mode:
Diffstat (limited to 'app/max7219.c')
-rw-r--r--app/max7219.c111
1 files changed, 98 insertions, 13 deletions
diff --git a/app/max7219.c b/app/max7219.c
index bebfa50..8c1c859 100644
--- a/app/max7219.c
+++ b/app/max7219.c
@@ -30,6 +30,7 @@ set (int sck, int ncs, int mosi)
else
CLEAR (MOSI);
+ // delay_us(1);
//delay_us(10);
}
@@ -80,40 +81,124 @@ write_reg (uint8_t reg, uint8_t data)
spip_send_8 (reg);
spip_send_8 (data);
+ spip_send_8 (reg);
+ spip_send_8 (data);
+
+ spip_send_8 (reg);
+ spip_send_8 (data);
+
set (0, 0, 0);
set (0, 1, 0);
unlock();
}
-static void write_pair (uint8_t reg, int d)
+
+static void
+write_regs (uint8_t reg, uint8_t data1, uint8_t data2, uint8_t data3)
{
- write_reg (reg, d / 10);
- write_reg (reg - 1, (d % 10) | 0x80);
+ while (lock());
+
+ set (0, 1, 0);
+ set (0, 0, 0);
+
+ spip_send_8 (reg);
+ spip_send_8 (data3);
+
+ spip_send_8 (reg);
+ spip_send_8 (data2);
+
+ spip_send_8 (reg);
+ spip_send_8 (data1);
+
+ set (0, 0, 0);
+ set (0, 1, 0);
+ unlock();
}
-void max7219_write (int d, int h, int m, int s)
+static void write_pair (uint8_t reg, int d1, int d2, int d3)
+{
+ write_regs (reg, d1 / 10, d2 / 10, d3 / 10);
+ write_regs (reg - 1, (d1 % 10) | 0x80, (d2 % 10) | 0x80, (d3 % 10) | 0x80);
+}
+
+
+#if 0
+static void st_test (void)
{
- write_pair (8, d);
- write_pair (6, h);
- write_pair (4, m);
- write_pair (2, s);
+ UTC u = { 0 };
+ double local_lon = 0.0;
+ ST st;
+ double ra;
+
+ // LEDS: 12.13.28.00 01.01.29.05 13.27.42.05
+
+ u.year = 2021;
+ u.month = 1;
+ u.mday = 12;
+ u.hour = 13;
+ u.minute = 28;
+
+ ra = time_utc_to_ra (u);
+ st = time_ra_to_st (ra + local_lon);
+
+ printf ("%d:%02d:%02d\n", st.hour, st.minute, st.second);
+
+ st = time_utc_to_lst (u, local_lon);
+ printf ("%d:%02d:%02d\n", st.hour, st.minute, st.second);
+
+ for (;;);
}
+#endif
+
void max7219_dispatch (void)
{
uint32_t now = HW_CLOCK_REG;
uint64_t abs = abs_extend (now);
- EPOCH e = pll_decompose (abs);
- UTC u = time_epoch_to_utc (e);
+ static unsigned m;
+ EPOCH e;
+ UTC u;
+ UTC gu;
+ ST l;
+
+
+ e = pll_decompose (abs);
+ u = time_epoch_to_utc (e);
+ l = time_utc_to_lst (u, gps_lon);
+
+ e.s += gps_utc_diff;
+ gu = time_epoch_to_utc (e);
+
+ write_pair (8, u.hour, l.hour, gps_wday);
+ write_pair (6, u.minute, l.minute, gu.hour);
+ write_pair (4, u.second, l.second, gu.minute);
+ write_pair (2, u.nanosecond / 10000000, l.nanosecond / 10000000, gu.second);
+
+ if (u.minute == m) return;
+
+ m = u.minute;
+
+ printf ("LEDS: %02d.%02d.%02d.%02d %02d.%02d.%02d.%02d %02d.%02d.%02d.%02d lon %.6f\r\n",
+ u.hour, u.minute, u.second,
+ u.nanosecond / 10000000,
+ l.hour,
+ l.minute,
+ l.second,
+ l.nanosecond / 10000000,
+ gps_wday,
+ gu.hour,
+ gu.minute,
+ gu.second,
+ gps_lon);
+
- max7219_write (u.mday, u.hour, u.minute, u.second);
}
void
-max7219_init (int on)
+max7219_init (int on, int brightness)
{
MAP_OUTPUT_PP (SCK);
MAP_OUTPUT_PP (NCS);
@@ -129,7 +214,7 @@ max7219_init (int on)
write_reg (0x9, 0xff); //BCD decode
write_reg (0xb, 0x7); //8 digits
- write_reg (0xa, 0x8); //intensity
+ write_regs (0xa, brightness, brightness, brightness);
} else {
write_reg (0xc, 0x0); //Power up
}