From 2003938552ba3d41fecf685b9dde1ef1ecb9c2bc Mon Sep 17 00:00:00 2001 From: chrissy Date: Wed, 7 Oct 2026 00:12:45 +0200 Subject: [PATCH] initial commit, first Hardwaretest works --- Makefile | 23 ++ src/.led_panel_example.c.swp | Bin 0 -> 20480 bytes src/.mqtt_ledpanel.c.swp | Bin 0 -> 32768 bytes src/.si5351_rfgen.c.swp | Bin 0 -> 16384 bytes src/led_panel_example.c | 206 +++++++++++++++++ src/mqtt_ledpanel.c | 430 +++++++++++++++++++++++++++++++++++ src/uart.h | 15 ++ 7 files changed, 674 insertions(+) create mode 100644 Makefile create mode 100644 src/.led_panel_example.c.swp create mode 100644 src/.mqtt_ledpanel.c.swp create mode 100644 src/.si5351_rfgen.c.swp create mode 100644 src/led_panel_example.c create mode 100644 src/mqtt_ledpanel.c create mode 100644 src/uart.h diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..4823d5e --- /dev/null +++ b/Makefile @@ -0,0 +1,23 @@ +PROGRAM_NAME = mqtt_ledpanel +SRC_DIR = src +BUILD_DIR = build + +all: $(PROGRAM_NAME) + +# Create the build directory +$(BUILD_DIR): + mkdir -pv $(BUILD_DIR) + +# Compile and build the program for Atmega328P +$(PROGRAM_NAME): $(BUILD_DIR) + avr-gcc -mmcu=atmega328p -Wall -Os -o $(BUILD_DIR)/$(PROGRAM_NAME).elf $(SRC_DIR)/$(PROGRAM_NAME).c + + avr-objcopy -j .text -j .data -O ihex $(BUILD_DIR)/$(PROGRAM_NAME).elf $(BUILD_DIR)/$(PROGRAM_NAME).hex + +# Upload the built program (hex file) to Atmega328P using USBasp +upload: $(PROGRAM_NAME) + avrdude -c arduino -p m328p -P /dev/ttyUSB0 -b 57600 -U flash:w:$(BUILD_DIR)/$(PROGRAM_NAME).hex -D + +# Remove build directory with all built files +clean: + rm -rf $(BUILD_DIR) diff --git a/src/.led_panel_example.c.swp b/src/.led_panel_example.c.swp new file mode 100644 index 0000000000000000000000000000000000000000..18d211565747324bc0bd5e2184c6ebc6d3b437dc GIT binary patch literal 20480 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 Okh!w!9dauXpZpsa*1_rk literal 0 HcmV?d00001 diff --git a/src/.mqtt_ledpanel.c.swp b/src/.mqtt_ledpanel.c.swp new file mode 100644 index 0000000000000000000000000000000000000000..09be9497b40d8dea245e86b15b108c6f70a3771e GIT binary patch literal 32768 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 literal 0 HcmV?d00001 diff --git a/src/.si5351_rfgen.c.swp b/src/.si5351_rfgen.c.swp new file mode 100644 index 0000000000000000000000000000000000000000..0dcf27c7a172bab2c6971080d7b601fa1be086a5 GIT binary patch literal 16384 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 +#include +#include + +/// ATMEGA 328p + +#define ENABLE PD7 +#define LATCH PB0 +#define CLOCK PB1 + +#define ROT PD6 +#define GRÜN PD5 +#define BLAU PD4 + + + + + + + +void sendSPI (uint16_t SPIdata); + + uint16_t count = 0; + uint16_t value ; + + uint16_t SPIstring [16]; + uint16_t SPIbuffer = 0; + uint16_t SPIstring_count; + + uint8_t bcd [5]; + + + +//////////////////////////////////////// M A I N ///////////////////////////////////////////// +int main(void) +{ + + DDRD = 0xF0; // PD0-3 als Eingang, PD4-7 als Ausgang setzen + DDRB = 0x0F; // PB0-3 als Ausgang, PD4-7 als Ausgang setzen + PORTD = 0x0F; // Pullup für PD0-3 aktivieren. + // Initialisierung des LED + PORTB |= (1<> 1 ; // Byte um 1 nach links verschieben + PORTB |= (1 < +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include "uart.h" + +#define BAUDRATE 9600 +#define TRUE 1 +#define FALSE 0 + +#define CHAR_NEWLINE '\n' +#define CHAR_RETURN '\r' +#define RETURN_NEWLINE "\r\n" +#define CR "\r\n" +volatile unsigned char data_in[32]; +unsigned char command_in[32]; + +volatile unsigned int data_count; +volatile unsigned char command_ready; +volatile unsigned char remote; + +//volatile char cmd[32], value[32], unit[32]; +unsigned long t1, freq; + +#define ENABLE PD7 +#define LATCH PB0 +#define CLOCK PB1 + +#define ROT PD6 +#define GRÜN PD5 +#define BLAU PD4 + + + + +void sendSPI (uint16_t SPIdata); + + uint16_t count = 0; + uint16_t value ; + + uint16_t SPIstring [16]; + uint16_t SPIbuffer = 0; + uint16_t SPIstring_count; + + uint8_t bcd [5]; + + + +//////////////////////////////// BCD to bitmap converting /////////////////////////////////// + +void LED_putC (uint8_t putChar ){ +switch (putChar){ + case 0: SPIstring[SPIstring_count] = 0x5552; SPIstring[SPIstring_count+4] = 0x0255; break; + case 1: SPIstring[SPIstring_count] = 0x2232; SPIstring[SPIstring_count+4] = 0x0722; break; + case 2: SPIstring[SPIstring_count] = 0x2452; SPIstring[SPIstring_count+4] = 0x0712; break; + case 3: SPIstring[SPIstring_count] = 0x2452; SPIstring[SPIstring_count+4] = 0x0254; break; + case 4: SPIstring[SPIstring_count] = 0x7554; SPIstring[SPIstring_count+4] = 0x0444; break; + case 5: SPIstring[SPIstring_count] = 0x3117; SPIstring[SPIstring_count+4] = 0x0344; break; + case 6: SPIstring[SPIstring_count] = 0x3116; SPIstring[SPIstring_count+4] = 0x0255; break; + case 7: SPIstring[SPIstring_count] = 0x2447; SPIstring[SPIstring_count+4] = 0x0112; break; + case 8: SPIstring[SPIstring_count] = 0x2552; SPIstring[SPIstring_count+4] = 0x0255; break; + case 9: SPIstring[SPIstring_count] = 0x5552; SPIstring[SPIstring_count+4] = 0x0346; break; + } + SPIstring_count++; + if (SPIstring_count &0x04) SPIstring_count = SPIstring_count + 4; + } +///////////////////////// END of Data to bitmap converting /////////////////////////////////// + + + +/////////////////////////////////SPI-STRING//////////////////////////////////////////// +// Hier wird 16bit-Daten & Takt & /CS an SPI-PORT rausschicken & gesteuert. +void sendSPI (uint16_t SPIdata){ + SPIbuffer = SPIdata ; // Daten an MAX504 anpassen, 2 bit nach links verschieben + + int ii=1; + while(ii <= 16) { // 16mal wiederholen. + ii++; + PORTB &= ~(1 << PB1); // Takt fallende Flanke + _delay_us (1); // Verzögerung von 1µS + PORTD &= ~(1 << PD4); // MOSI auf LOW + PORTD &= ~(1 << PD5); // MOSI auf LOW + PORTD &= ~(1 << PD6); // MOSI auf LOW + if (SPIbuffer &0x0001) { // wenn 1, dann MOSI = H + PORTD |= (1 <> 1 ; // Byte um 1 nach links verschieben + PORTB |= (1 <>8); + UBRR0L = (uint8_t) (ubrr); + // Interrupts kurz deaktivieren + cli(); + // UART Receiver und Transmitter anschalten, Receive-Interrupt aktivieren + // Data mode 8N1, asynchron + UCSR0B = (1 << RXEN0) | (1 << TXEN0) | (1 << RXCIE0); + UCSR0C = (0 << 4) | (0 << 3) | (3 << 1); + // Flush Receive-Buffer (entfernen evtl. vorhandener ungültiger Werte) + do + { + // UDR auslesen (Wert wird nicht verwendet) + UDR0; + } + while (UCSR0A & (1 << RXC0)); + + // Rücksetzen von Receive und Transmit Complete-Flags + UCSR0A = (1 << RXC0) | (1 << TXC0); + +} + + +int uart_putc (const uint8_t c) +{ + // Warten, bis UDR bereit ist für einen neuen Wert + while (!(UCSR0A & (1 << UDRE0))) + ; + + // UDR Schreiben startet die Übertragung + UDR0 = c; + + return 1; +} + +void uart_puts (const char *s) +{ + do + { + uart_putc (*s); + } + while (*s++); +} + + +void usart_ok() +{ + uart_puts("OK\r\n"); +} + +void copy_command () +{ + // The USART might interrupt this - don't let that happen! + ATOMIC_BLOCK(ATOMIC_FORCEON) { + // Copy the contents of data_in into command_in + memcpy(command_in, data_in, 32); + + // Now clear data_in, the USART can reuse it now + memset(data_in, 0, 32); + } +} + +//void split_command(char str[]){ +// str[strlen(str)-1] = '\0'; +// strcpy(cmd, strtok(str , " ")); +// strcpy(value, strtok(NULL, " ")); +// strcpy(unit , strtok(NULL, " ")); +//} + +//////////////////////////////////////// M A I N ///////////////////////////////////////////// +int main(void) +{ + + DDRD = 0xF0; // PD0-3 als Eingang, PD4-7 als Ausgang setzen + DDRB = 0x0F; // PB0-3 als Ausgang, PD4-7 als Ausgang setzen + PORTD = 0x0F; // Pullup für PD0-3 aktivieren. + // Initialisierung des LED + PORTB |= (1< + +extern void uart_init (void); +extern int uart_putc (const uint8_t); +extern char uart_getc (void); + +static inline void uart_flush (void) +{ + while (UCSR0B & (1 << UDRIE0)); +} + +#endif /* UART_H */