From f60fb0290175d9ee5521cc96f5ab5c0ca392ba73 Mon Sep 17 00:00:00 2001 From: Leonhard Seidel Date: Tue, 27 Feb 2024 16:57:02 +0100 Subject: [PATCH] added x scaling to the hub75e panels --- src/Settings.h | 9 ++ src/boards/board.h | 3 + src/output/hub75e/1bit_buffer.h | 195 +++++++++++------------------- src/output/hub75e/hub75e_common.h | 31 +++++ 4 files changed, 111 insertions(+), 127 deletions(-) diff --git a/src/Settings.h b/src/Settings.h index 8193ab4..551c725 100644 --- a/src/Settings.h +++ b/src/Settings.h @@ -7,6 +7,7 @@ // #define PANEL_SMALL_BRIGHT // gets the image muuuuch brighter on the hub75e 1 bit buffer at the cost of some slight ghosting // #define PANEL_HIGH_RES // changes the size from effective 64x32 on the hub7e 128x64 panels to a full 64x64 // #define PANEL_GPIO_NON_INTRUSIVE // this saves the other pins on GPIOB on the nano and other smaller boards in hub75e mode +// #define PANEL_HUB75E_SIZE //tells the library that the given panel size is meant for hub75e panels, else the given size is simulated // ######## THE FOLLOWING WORK REGARDLESS OF PANEL TYPE // #define PANEL_3_PIN_ROWS // swaps the row addressing in from 5(binary) pin to 3 pin(shift register) // #define PANEL_BIG // use 2 bit rgb image buffer @@ -50,6 +51,14 @@ #else #define PANEL_3_PIN_ROWS #endif +#ifdef PANEL_HUB75E_SIZE +#define PANEL_E_X PANEL_X +#define PANEL_E_Y PANEL_Y +#else +// default size for a hub75e panel, usually +#define PANEL_E_X 128 +#define PANEL_E_Y 64 +#endif #endif #endif // PANEL_SETTINGS_H \ No newline at end of file diff --git a/src/boards/board.h b/src/boards/board.h index e0745de..fa6fa21 100644 --- a/src/boards/board.h +++ b/src/boards/board.h @@ -6,6 +6,9 @@ // check we are on uno or nano, get pinout and how we access them #ifdef ARDUINO_AVR_NANO // nano avr 328p #include "boards/nano/nano.h" +#if PANEL_X * PANEL_Y > 4096 +#pragma GCC warning "this panel size may be too large for the mighty nano ram, please choose a smaller size and let the library simulate bigger pixels" +#endif #else #ifdef ARDUINO_AVR_UNO #include "boards/uno/uno.h" diff --git a/src/output/hub75e/1bit_buffer.h b/src/output/hub75e/1bit_buffer.h index 21fd4ee..b70e4a3 100644 --- a/src/output/hub75e/1bit_buffer.h +++ b/src/output/hub75e/1bit_buffer.h @@ -8,7 +8,7 @@ void _displaySmallBuffer() { LED *index = (LED *)&buffer; - for (uint8_t y = 0; y < PANEL_Y / 2; y++) // 32 rows + for (uint8_t y = 0; y < PANEL_E_Y / 2; y++) // 32 rows { #ifndef PANEL_SMALL_BRIGHT _stepRow(); @@ -19,224 +19,162 @@ void _displaySmallBuffer() // chip 0 _set_color(*(uint8_t *)(index) << (uint8_t)2); - DCLK_GCLK; - DCLK_GCLK; + DCLK_GCLK_SCALED; _set_color((uint8_t)((*((uint16_t *)(index)) >> (uint8_t)4))); - DCLK_GCLK; - DCLK_GCLK; + DCLK_GCLK_SCALED; _set_color((uint8_t)((*((uint16_t *)(((uint8_t *)(index) + sizeof(uint8_t))))) >> (uint8_t)2)); - DCLK_GCLK; - DCLK_GCLK; + DCLK_GCLK_SCALED; _set_color((*(((uint8_t *)(index)) + (sizeof(uint8_t) * 2)))); - DCLK_GCLK; - DCLK_GCLK; + DCLK_GCLK_SCALED; ++index; _set_color(*(uint8_t *)(index) << (uint8_t)2); - DCLK_GCLK; - DCLK_GCLK; + DCLK_GCLK_SCALED; _set_color((uint8_t)((*((uint16_t *)(index)) >> (uint8_t)4))); - DCLK_GCLK; - DCLK_GCLK; + DCLK_GCLK_SCALED; _set_color((uint8_t)((*((uint16_t *)(((uint8_t *)(index) + sizeof(uint8_t))))) >> (uint8_t)2)); - DCLK_GCLK; - DCLK_GCLK; + DCLK_GCLK_SCALED; _set_color((*(((uint8_t *)(index)) + (sizeof(uint8_t) * 2)))); - DCLK_GCLK; - DCLK_GCLK; + DCLK_GCLK_SCALED; // chip 1 ++index; _set_color(*(uint8_t *)(index) << (uint8_t)2); - DCLK_GCLK; - DCLK_GCLK; + DCLK_GCLK_SCALED; _set_color((uint8_t)((*((uint16_t *)(index)) >> (uint8_t)4))); - DCLK_GCLK; - DCLK_GCLK; + DCLK_GCLK_SCALED; _set_color((uint8_t)((*((uint16_t *)(((uint8_t *)(index) + sizeof(uint8_t))))) >> (uint8_t)2)); - DCLK_GCLK; - DCLK_GCLK; + DCLK_GCLK_SCALED; _set_color((*(((uint8_t *)(index)) + (sizeof(uint8_t) * 2)))); - DCLK_GCLK; - DCLK_GCLK; + DCLK_GCLK_SCALED; ++index; _set_color(*(uint8_t *)(index) << (uint8_t)2); - DCLK_GCLK; - DCLK_GCLK; + DCLK_GCLK_SCALED; _set_color((uint8_t)((*((uint16_t *)(index)) >> (uint8_t)4))); - DCLK_GCLK; - DCLK_GCLK; + DCLK_GCLK_SCALED; _set_color((uint8_t)((*((uint16_t *)(((uint8_t *)(index) + sizeof(uint8_t))))) >> (uint8_t)2)); - DCLK_GCLK; - DCLK_GCLK; + DCLK_GCLK_SCALED; _set_color((*(((uint8_t *)(index)) + (sizeof(uint8_t) * 2)))); - DCLK_GCLK; - DCLK_GCLK; + DCLK_GCLK_SCALED; // chip 2 ++index; _set_color(*(uint8_t *)(index) << (uint8_t)2); - DCLK_GCLK; - DCLK_GCLK; + DCLK_GCLK_SCALED; _set_color((uint8_t)((*((uint16_t *)(index)) >> (uint8_t)4))); - DCLK_GCLK; - DCLK_GCLK; + DCLK_GCLK_SCALED; _set_color((uint8_t)((*((uint16_t *)(((uint8_t *)(index) + sizeof(uint8_t))))) >> (uint8_t)2)); - DCLK_GCLK; - DCLK_GCLK; + DCLK_GCLK_SCALED; _set_color((*(((uint8_t *)(index)) + (sizeof(uint8_t) * 2)))); - DCLK_GCLK; - DCLK_GCLK; + DCLK_GCLK_SCALED; ++index; _set_color(*(uint8_t *)(index) << (uint8_t)2); - DCLK_GCLK; - DCLK_GCLK; + DCLK_GCLK_SCALED; _set_color((uint8_t)((*((uint16_t *)(index)) >> (uint8_t)4))); - DCLK_GCLK; - DCLK_GCLK; + DCLK_GCLK_SCALED; _set_color((uint8_t)((*((uint16_t *)(((uint8_t *)(index) + sizeof(uint8_t))))) >> (uint8_t)2)); - DCLK_GCLK; - DCLK_GCLK; + DCLK_GCLK_SCALED; _set_color((*(((uint8_t *)(index)) + (sizeof(uint8_t) * 2)))); - DCLK_GCLK; - DCLK_GCLK; + DCLK_GCLK_SCALED; // chip 3 ++index; _set_color(*(uint8_t *)(index) << (uint8_t)2); - DCLK_GCLK; - DCLK_GCLK; + DCLK_GCLK_SCALED; _set_color((uint8_t)((*((uint16_t *)(index)) >> (uint8_t)4))); - DCLK_GCLK; - DCLK_GCLK; + DCLK_GCLK_SCALED; _set_color((uint8_t)((*((uint16_t *)(((uint8_t *)(index) + sizeof(uint8_t))))) >> (uint8_t)2)); - DCLK_GCLK; - DCLK_GCLK; + DCLK_GCLK_SCALED; _set_color((*(((uint8_t *)(index)) + (sizeof(uint8_t) * 2)))); - DCLK_GCLK; - DCLK_GCLK; + DCLK_GCLK_SCALED; ++index; _set_color(*(uint8_t *)(index) << (uint8_t)2); - DCLK_GCLK; - DCLK_GCLK; + DCLK_GCLK_SCALED; _set_color((uint8_t)((*((uint16_t *)(index)) >> (uint8_t)4))); - DCLK_GCLK; - DCLK_GCLK; + DCLK_GCLK_SCALED; _set_color((uint8_t)((*((uint16_t *)(((uint8_t *)(index) + sizeof(uint8_t))))) >> (uint8_t)2)); - DCLK_GCLK; - DCLK_GCLK; + DCLK_GCLK_SCALED; _set_color((*(((uint8_t *)(index)) + (sizeof(uint8_t) * 2)))); - DCLK_GCLK; - DCLK_GCLK; + DCLK_GCLK_SCALED; // chip 4 ++index; _set_color(*(uint8_t *)(index) << (uint8_t)2); - DCLK_GCLK; - DCLK_GCLK; + DCLK_GCLK_SCALED; _set_color((uint8_t)((*((uint16_t *)(index)) >> (uint8_t)4))); - DCLK_GCLK; - DCLK_GCLK; + DCLK_GCLK_SCALED; _set_color((uint8_t)((*((uint16_t *)(((uint8_t *)(index) + sizeof(uint8_t))))) >> (uint8_t)2)); - DCLK_GCLK; - DCLK_GCLK; + DCLK_GCLK_SCALED; _set_color((*(((uint8_t *)(index)) + (sizeof(uint8_t) * 2)))); - DCLK_GCLK; - DCLK_GCLK; + DCLK_GCLK_SCALED; ++index; _set_color(*(uint8_t *)(index) << (uint8_t)2); - DCLK_GCLK; - DCLK_GCLK; + DCLK_GCLK_SCALED; _set_color((uint8_t)((*((uint16_t *)(index)) >> (uint8_t)4))); - DCLK_GCLK; - DCLK_GCLK; + DCLK_GCLK_SCALED; _set_color((uint8_t)((*((uint16_t *)(((uint8_t *)(index) + sizeof(uint8_t))))) >> (uint8_t)2)); - DCLK_GCLK; - DCLK_GCLK; + DCLK_GCLK_SCALED; _set_color((*(((uint8_t *)(index)) + (sizeof(uint8_t) * 2)))); - DCLK_GCLK; - DCLK_GCLK; + DCLK_GCLK_SCALED; // chip 5 ++index; _set_color(*(uint8_t *)(index) << (uint8_t)2); - DCLK_GCLK; - DCLK_GCLK; + DCLK_GCLK_SCALED; _set_color((uint8_t)((*((uint16_t *)(index)) >> (uint8_t)4))); - DCLK_GCLK; - DCLK_GCLK; + DCLK_GCLK_SCALED; _set_color((uint8_t)((*((uint16_t *)(((uint8_t *)(index) + sizeof(uint8_t))))) >> (uint8_t)2)); - DCLK_GCLK; - DCLK_GCLK; + DCLK_GCLK_SCALED; _set_color((*(((uint8_t *)(index)) + (sizeof(uint8_t) * 2)))); - DCLK_GCLK; - DCLK_GCLK; + DCLK_GCLK_SCALED; ++index; _set_color(*(uint8_t *)(index) << (uint8_t)2); - DCLK_GCLK; - DCLK_GCLK; + DCLK_GCLK_SCALED; _set_color((uint8_t)((*((uint16_t *)(index)) >> (uint8_t)4))); - DCLK_GCLK; - DCLK_GCLK; + DCLK_GCLK_SCALED; _set_color((uint8_t)((*((uint16_t *)(((uint8_t *)(index) + sizeof(uint8_t))))) >> (uint8_t)2)); - DCLK_GCLK; - DCLK_GCLK; + DCLK_GCLK_SCALED; _set_color((*(((uint8_t *)(index)) + (sizeof(uint8_t) * 2)))); - DCLK_GCLK; - DCLK_GCLK; + DCLK_GCLK_SCALED; // chip 6 ++index; _set_color(*(uint8_t *)(index) << (uint8_t)2); - DCLK_GCLK; - DCLK_GCLK; + DCLK_GCLK_SCALED; _set_color((uint8_t)((*((uint16_t *)(index)) >> (uint8_t)4))); - DCLK_GCLK; - DCLK_GCLK; + DCLK_GCLK_SCALED; _set_color((uint8_t)((*((uint16_t *)(((uint8_t *)(index) + sizeof(uint8_t))))) >> (uint8_t)2)); - DCLK_GCLK; - DCLK_GCLK; + DCLK_GCLK_SCALED; _set_color((*(((uint8_t *)(index)) + (sizeof(uint8_t) * 2)))); - DCLK_GCLK; - DCLK_GCLK; + DCLK_GCLK_SCALED; ++index; _set_color(*(uint8_t *)(index) << (uint8_t)2); - DCLK_GCLK; - DCLK_GCLK; + DCLK_GCLK_SCALED; _set_color((uint8_t)((*((uint16_t *)(index)) >> (uint8_t)4))); - DCLK_GCLK; - DCLK_GCLK; + DCLK_GCLK_SCALED; _set_color((uint8_t)((*((uint16_t *)(((uint8_t *)(index) + sizeof(uint8_t))))) >> (uint8_t)2)); - DCLK_GCLK; - DCLK_GCLK; + DCLK_GCLK_SCALED; _set_color((*(((uint8_t *)(index)) + (sizeof(uint8_t) * 2)))); - DCLK_GCLK; - DCLK_GCLK; + DCLK_GCLK_SCALED; // chip 7 ++index; _set_color(*(uint8_t *)(index) << (uint8_t)2); - DCLK_GCLK; - DCLK_GCLK; + DCLK_GCLK_SCALED; _set_color((uint8_t)((*((uint16_t *)(index)) >> (uint8_t)4))); - DCLK_GCLK; - DCLK_GCLK; + DCLK_GCLK_SCALED; _set_color((uint8_t)((*((uint16_t *)(((uint8_t *)(index) + sizeof(uint8_t))))) >> (uint8_t)2)); - DCLK_GCLK; - DCLK_GCLK; + DCLK_GCLK_SCALED; _set_color((*(((uint8_t *)(index)) + (sizeof(uint8_t) * 2)))); - DCLK_GCLK; - DCLK_GCLK; + DCLK_GCLK_SCALED; ++index; _set_color(*(uint8_t *)(index) << (uint8_t)2); - DCLK_GCLK; - DCLK_GCLK; + DCLK_GCLK_SCALED; _set_color((uint8_t)((*((uint16_t *)(index)) >> (uint8_t)4))); - DCLK_GCLK; - DCLK_GCLK; + DCLK_GCLK_SCALED; _set_color((uint8_t)((*((uint16_t *)(((uint8_t *)(index) + sizeof(uint8_t))))) >> (uint8_t)2)); - DCLK_GCLK; + DCLK_GCLK_SCALED; #ifdef PANEL_SMALL_BRIGHT @@ -246,10 +184,13 @@ void _displaySmallBuffer() _set_color((*(((uint8_t *)(index)) + (sizeof(uint8_t) * 2)))); #else - DCLK_GCLK; _set_color((*(((uint8_t *)(index)) + (sizeof(uint8_t) * 2)))); DCLK_GCLK; +#if PANEL_X > 64 + _set_color((*(((uint8_t *)(index)) + (sizeof(uint8_t) * 2)))); +#endif + // latch data from shift registers to latch register, "buffer" for global release to pwm HIGH_LAT; LATCH_GCLK; diff --git a/src/output/hub75e/hub75e_common.h b/src/output/hub75e/hub75e_common.h index 4938804..1945514 100644 --- a/src/output/hub75e/hub75e_common.h +++ b/src/output/hub75e/hub75e_common.h @@ -36,6 +36,37 @@ DCLK_GCLK; \ DCLK_GCLK +#if PANEL_X == 128 +#define DCLK_GCLK_SCALED \ + DCLK_GCLK +#else +#if PANEL_X == 64 +#define DCLK_GCLK_SCALED \ + DCLK_GCLK; \ + DCLK_GCLK +#else +#if PANEL_X == 32 +#define DCLK_GCLK_SCALED \ + DCLK_GCLK; \ + DCLK_GCLK; \ + DCLK_GCLK; \ + DCLK_GCLK +#else +#if PANEL_X == 16 +#define DCLK_GCLK_SCALED \ + DCLK_GCLK; \ + DCLK_GCLK; \ + DCLK_GCLK; \ + DCLK_GCLK; \ + DCLK_GCLK; \ + DCLK_GCLK; \ + DCLK_GCLK; \ + DCLK_GCLK +#endif +#endif +#endif +#endif + #define LSB_FAKE \ _set_color(0); \ DCLK_GCLK16X; \