From 2beecbe7227241772360fa4913b63cfa2b437187 Mon Sep 17 00:00:00 2001 From: finga Date: Fri, 24 Sep 2021 12:25:47 +0200 Subject: [PATCH 1/7] Move shifting of TWI slave address As this may be obscure the shifting of the TWI slave address is moved to where it is used instead of where it is set. --- firmware/src/main.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/firmware/src/main.c b/firmware/src/main.c index 27add27..d51eb62 100644 --- a/firmware/src/main.c +++ b/firmware/src/main.c @@ -22,7 +22,7 @@ #define TWI_SDA PC4 #define TWI_SCL PC5 -#define SI5351_ADDRESS (0x60 << 1) +#define SI5351_ADDRESS 0x60 #define SYM_ENTRY(SYM) { SYM, sizeof(SYM) / 2 } @@ -386,8 +386,8 @@ static uint8_t twi_read_register(const uint8_t address, const uint8_t reg) { twi_start(); - if (twi_transmit(address) != TW_MT_SLA_ACK) twi_error(); + if (twi_transmit(address << 1) != TW_MT_SLA_ACK) if (twi_transmit(reg) != TW_MT_DATA_ACK) twi_error(); @@ -398,8 +398,8 @@ static uint8_t twi_read_register(const uint8_t address, twi_start(); - if (twi_transmit(address + 1) != TW_MR_SLA_ACK) twi_error(); + if (twi_transmit((address << 1) + 1) != TW_MR_SLA_ACK) if (twi_receive() != TW_MR_DATA_NACK) twi_error(); @@ -414,8 +414,8 @@ static void twi_write_register(const uint8_t address, const uint8_t data) { twi_start(); - if (twi_transmit(address) != TW_MT_SLA_ACK) twi_error(); + if (twi_transmit(address << 1) != TW_MT_SLA_ACK) if (twi_transmit(reg) != TW_MT_DATA_ACK) twi_error(); From 144da8d7f2426560d49d88842b98180bcae9473e Mon Sep 17 00:00:00 2001 From: finga Date: Fri, 24 Sep 2021 12:27:53 +0200 Subject: [PATCH 2/7] Add flag to invert output of `twi_error()` This is only for convinience for the eye to be able to print "debugging" information not inverted. --- firmware/src/main.c | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/firmware/src/main.c b/firmware/src/main.c index d51eb62..6c4379d 100644 --- a/firmware/src/main.c +++ b/firmware/src/main.c @@ -335,21 +335,24 @@ static void lcd_splash(void) { } } -static void twi_error(void) { - lcd_fill(0xFF); +static void twi_error(bool inverted) { + if (inverted) + lcd_fill(0xFF); + else + lcd_fill(0x00); for (uint8_t i = 0; i < 2; i++) { lcd_move_cursor(0, i); - lcd_write_string_page("TW_STATUS:\0", i, true); - lcd_write_kerning(2, true); - lcd_write_integer_page(TW_STATUS, 3, i, true); + lcd_write_string_page("TW_STATUS:\0", i, inverted); + lcd_write_kerning(2, inverted); + lcd_write_integer_page(TW_STATUS, 3, i, inverted); } for (uint8_t i = 0; i < 2; i++) { lcd_move_cursor(0, i + 2); - lcd_write_string_page("TW_DATA:\0", i, true); - lcd_write_kerning(16, true); - lcd_write_integer_page(TWDR, 3, i, true); + lcd_write_string_page("TW_DATA:\0", i, inverted); + lcd_write_kerning(16, inverted); + lcd_write_integer_page(TWDR, 3, i, inverted); } for (;;); @@ -360,7 +363,7 @@ static void twi_start(void) { while (!(TWCR & (1 << TWINT))); // Wait until start is transmitted if (TW_STATUS != TW_START) // Check status - twi_error(); + twi_error(true); } static uint8_t twi_transmit(const uint8_t data) { @@ -386,11 +389,11 @@ static uint8_t twi_read_register(const uint8_t address, const uint8_t reg) { twi_start(); - twi_error(); if (twi_transmit(address << 1) != TW_MT_SLA_ACK) + twi_error(true); if (twi_transmit(reg) != TW_MT_DATA_ACK) - twi_error(); + twi_error(true); twi_stop(); @@ -398,11 +401,11 @@ static uint8_t twi_read_register(const uint8_t address, twi_start(); - twi_error(); if (twi_transmit((address << 1) + 1) != TW_MR_SLA_ACK) + twi_error(true); if (twi_receive() != TW_MR_DATA_NACK) - twi_error(); + twi_error(true); twi_stop(); @@ -414,14 +417,14 @@ static void twi_write_register(const uint8_t address, const uint8_t data) { twi_start(); - twi_error(); if (twi_transmit(address << 1) != TW_MT_SLA_ACK) + twi_error(true); if (twi_transmit(reg) != TW_MT_DATA_ACK) - twi_error(); + twi_error(true); if (twi_transmit(data) != TW_MT_DATA_ACK) - twi_error(); + twi_error(true); twi_stop(); } From 45bfe04537922cff189307dc1bb5fd2f851fc76c Mon Sep 17 00:00:00 2001 From: finga Date: Fri, 24 Sep 2021 12:29:35 +0200 Subject: [PATCH 3/7] Also move and rename drawing the splash screen For consistency `lcd_splash()` was moved before `draw_home()` and renamed to `draw_splash()`. --- firmware/src/main.c | 39 +++++++++++++++++++-------------------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/firmware/src/main.c b/firmware/src/main.c index 6c4379d..69aaae6 100644 --- a/firmware/src/main.c +++ b/firmware/src/main.c @@ -316,25 +316,6 @@ static void lcd_write_integer_page(const uint8_t integer, } } -static void lcd_splash(void) { - lcd_fill(0x00); - - for (uint8_t i = 0; i < 5; i++) { - lcd_move_cursor(31, 1 + i); - - for (uint8_t j = 0; j < 40; j++) - lcd_write(sacred_chao[i * 40 + j]); - - } - - for (uint8_t i = 0; i < 2; i++) { - lcd_move_cursor(26, 6 + i); - - for (uint8_t j = 0; j < 48; j++) - lcd_write(onders_org[i * 48 + j]); - } -} - static void twi_error(bool inverted) { if (inverted) lcd_fill(0xFF); @@ -429,6 +410,24 @@ static void twi_write_register(const uint8_t address, twi_stop(); } +static void draw_splash(void) { + lcd_fill(0x00); + + for (uint8_t i = 0; i < 5; i++) { + lcd_move_cursor(31, 1 + i); + + for (uint8_t j = 0; j < 40; j++) + lcd_write(sacred_chao[i * 40 + j]); + } + + for (uint8_t i = 0; i < 2; i++) { + lcd_move_cursor(26, 6 + i); + + for (uint8_t j = 0; j < 48; j++) + lcd_write(onders_org[i * 48 + j]); + } +} + static void draw_home(void) { lcd_fill(0x00); @@ -793,7 +792,7 @@ int main(void) { TIMSK1 |= (1 << OCIE1A); // Enable match compare A // Show splash screen - lcd_splash(); + draw_splash(); _delay_ms(2000); // Load the menu From a34a58535b12bdc01b7bc72b60075dc36a755e9b Mon Sep 17 00:00:00 2001 From: finga Date: Fri, 24 Sep 2021 23:19:02 +0200 Subject: [PATCH 4/7] Improve and add symbols Add symbols for `D` and `M` and improve `U`. --- firmware/src/main.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/firmware/src/main.c b/firmware/src/main.c index 69aaae6..1829d80 100644 --- a/firmware/src/main.c +++ b/firmware/src/main.c @@ -68,6 +68,8 @@ static const __flash uint8_t sym_b[] = { 0xFC, 0xFC, 0x8C, 0x8C, 0xFC, 0x78, 0x3F, 0x3F, 0x31, 0x31, 0x3F, 0x1E }; static const __flash uint8_t sym_c[] = { 0xF8, 0xFC, 0x0C, 0x1C, 0x18, 0x1F, 0x3F, 0x30, 0x38, 0x18 }; +static const __flash uint8_t sym_d[] = { 0xFC, 0xFC, 0x0C, 0x1C, 0xF8, 0xF0, + 0x3F, 0x3F, 0x30, 0x38, 0x1F, 0x0F }; static const __flash uint8_t sym_e[] = { 0xFC, 0xFC, 0x8C, 0x8C, 0x0C, 0x3F, 0x3F, 0x31, 0x31, 0x30 }; static const __flash uint8_t sym_g[] = { 0xF8, 0xFC, 0x0C, 0x0C, 0x3C, 0x38, @@ -80,6 +82,8 @@ static const __flash uint8_t sym_k[] = { 0xFC, 0xFC, 0xC0, 0xF0, 0x7C, 0x1C, 0x3F, 0x3F, 0x03, 0x0F, 0x3E, 0x38 }; static const __flash uint8_t sym_l[] = { 0xFC, 0xFC, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x30, 0x30, 0x30 }; +static const __flash uint8_t sym_m[] = { 0xFC, 0xFC, 0x38, 0x70, 0xE0, 0x70, 0x38, 0xFC, 0xFC, + 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F }; static const __flash uint8_t sym_n[] = { 0xFC, 0xFC, 0xF0, 0xC0, 0x00, 0xFC, 0xFC, 0x3F, 0x3F, 0x00, 0x03, 0x0F, 0x3F, 0x3F }; static const __flash uint8_t sym_o[] = { 0xF8, 0xFC, 0x0C, 0x0C, 0xFC, 0xF8, @@ -93,7 +97,7 @@ static const __flash uint8_t sym_s[] = { 0xF8, 0xFC, 0x8C, 0x8C, 0x9C, 0x18, static const __flash uint8_t sym_t[] = { 0x0C, 0x0C, 0xFC, 0xFC, 0x0C, 0x0C, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00 }; static const __flash uint8_t sym_u[] = { 0xFC, 0xFC, 0x00, 0x00, 0xFC, 0xFC, - 0x3F, 0x3F, 0x30, 0x30, 0x3F, 0x3F }; + 0x1F, 0x3F, 0x30, 0x30, 0x3F, 0x1F }; static const __flash uint8_t sym_underscore[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20 }; @@ -126,7 +130,7 @@ static const struct symbol symbol_table[] = { SYM_ENTRY(sym_0), SYM_ENTRY(sym_a), SYM_ENTRY(sym_b), SYM_ENTRY(sym_c), - SYM_ENTRY(sym_invalid), + SYM_ENTRY(sym_d), SYM_ENTRY(sym_e), SYM_ENTRY(sym_invalid), SYM_ENTRY(sym_g), @@ -135,7 +139,7 @@ static const struct symbol symbol_table[] = { SYM_ENTRY(sym_0), SYM_ENTRY(sym_invalid), SYM_ENTRY(sym_k), SYM_ENTRY(sym_l), - SYM_ENTRY(sym_invalid), + SYM_ENTRY(sym_m), SYM_ENTRY(sym_n), SYM_ENTRY(sym_o), SYM_ENTRY(sym_p), From 22095d6e78e81d7664d8202314919f9fd9f263fa Mon Sep 17 00:00:00 2001 From: finga Date: Fri, 24 Sep 2021 23:37:04 +0200 Subject: [PATCH 5/7] Pass kerning when writing string In order to be able to print more compact strings also pass the kerning parameter to `lcd_write_string_page()`. --- firmware/src/main.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/firmware/src/main.c b/firmware/src/main.c index 1829d80..79e953c 100644 --- a/firmware/src/main.c +++ b/firmware/src/main.c @@ -289,10 +289,11 @@ static void lcd_write_character_page(const char character, } static void lcd_write_string_page(const char* string, + const uint8_t kerning, const uint8_t page, const bool invert) { for (uint8_t i = 0; string[i] != 0; i++) { - lcd_write_kerning(2, invert); + lcd_write_kerning(kerning, invert); lcd_write_character_page(string[i], page, invert); } } @@ -328,14 +329,14 @@ static void twi_error(bool inverted) { for (uint8_t i = 0; i < 2; i++) { lcd_move_cursor(0, i); - lcd_write_string_page("TW_STATUS:\0", i, inverted); + lcd_write_string_page("TW_STATUS:\0", 2, i, inverted); lcd_write_kerning(2, inverted); lcd_write_integer_page(TW_STATUS, 3, i, inverted); } for (uint8_t i = 0; i < 2; i++) { lcd_move_cursor(0, i + 2); - lcd_write_string_page("TW_DATA:\0", i, inverted); + lcd_write_string_page("TW_DATA:\0", 2, i, inverted); lcd_write_kerning(16, inverted); lcd_write_integer_page(TWDR, 3, i, inverted); } @@ -457,19 +458,19 @@ static void draw_home(void) { for (uint8_t i = 0; i < 2; i++) { lcd_move_cursor(0, i); - lcd_write_string_page("CH1\0", i, ch1_selected); + lcd_write_string_page("CH1\0", 2, i, ch1_selected); lcd_write_kerning(2, ch1_selected); lcd_move_cursor(0, 2 + i); - lcd_write_string_page("CH2\0", i, ch2_selected); + lcd_write_string_page("CH2\0", 2, i, ch2_selected); lcd_write_kerning(2, ch2_selected); lcd_move_cursor(0, 4 + i); - lcd_write_string_page("CH3\0", i, ch3_selected); + lcd_write_string_page("CH3\0", 2, i, ch3_selected); lcd_write_kerning(2, ch3_selected); lcd_move_cursor(33, 6 + i); - lcd_write_string_page("SETUP\0", i, setup_selected); + lcd_write_string_page("SETUP\0", 2, i, setup_selected); lcd_write_kerning(2, setup_selected); } } @@ -504,13 +505,13 @@ static void draw_setup(void) { for (uint8_t i = 0; i < 2; i++) { lcd_move_cursor(0, i); lcd_write_kerning(30, true); - lcd_write_string_page("SETUP\0", i, true); + lcd_write_string_page("SETUP\0", 2, i, true); lcd_write_kerning(33, true); } for (uint8_t i = 0; i < 2; i++) { lcd_move_cursor(0, 2 + i); - lcd_write_string_page("CONTRAST:\0", i, contrast_selected); + lcd_write_string_page("CONTRAST:\0", 2, i, contrast_selected); lcd_write_kerning(2, contrast_selected); lcd_write_kerning(16, false); lcd_write_integer_page(value_contrast, 2, i, @@ -520,7 +521,7 @@ static void draw_setup(void) { for (uint8_t i = 0; i < 2; i++) { lcd_move_cursor(0, 4 + i); - lcd_write_string_page("BACKLIGHT:\0", i, backlight_selected); + lcd_write_string_page("BACKLIGHT:\0", 2, i, backlight_selected); lcd_write_kerning(2, backlight_selected); lcd_write_kerning(5, false); lcd_write_integer_page(value_backlight, 3, i, @@ -530,7 +531,7 @@ static void draw_setup(void) { for (uint8_t i = 0; i < 2; i++) { lcd_move_cursor(33, 6 + i); - lcd_write_string_page("BACK:\0", i, back_selected); + lcd_write_string_page("BACK:\0", 2, i, back_selected); lcd_write_kerning(2, back_selected); } } From dada6fe5d42f4487a09070ec3fd14ef129f79ffd Mon Sep 17 00:00:00 2001 From: finga Date: Fri, 24 Sep 2021 23:39:56 +0200 Subject: [PATCH 6/7] Allow to print larger integers Use `uint32_t` instead of `uint8_t` when printing integers with `lcd_write_integer_page()`. --- firmware/src/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firmware/src/main.c b/firmware/src/main.c index 79e953c..f185255 100644 --- a/firmware/src/main.c +++ b/firmware/src/main.c @@ -298,7 +298,7 @@ static void lcd_write_string_page(const char* string, } } -static void lcd_write_integer_page(const uint8_t integer, +static void lcd_write_integer_page(const uint32_t integer, const uint8_t digits, const uint8_t page, const bool invert) { From 953649725b6ffa2a782acb538184a9e2c1d0dc18 Mon Sep 17 00:00:00 2001 From: finga Date: Fri, 24 Sep 2021 23:41:21 +0200 Subject: [PATCH 7/7] Remove colon from "BACK" setup menu entry Rename "BACK:" to "BACK" in setup menu. --- firmware/src/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firmware/src/main.c b/firmware/src/main.c index f185255..cb2c868 100644 --- a/firmware/src/main.c +++ b/firmware/src/main.c @@ -531,7 +531,7 @@ static void draw_setup(void) { for (uint8_t i = 0; i < 2; i++) { lcd_move_cursor(33, 6 + i); - lcd_write_string_page("BACK:\0", 2, i, back_selected); + lcd_write_string_page("BACK\0", 2, i, back_selected); lcd_write_kerning(2, back_selected); } }