commit b1173ebc9e77b49c73dbd633592d7d92b92276da Author: victor Date: Mon Oct 13 12:34:02 2025 +0200 bless diff --git a/.clangd b/.clangd new file mode 100644 index 0000000..704032d --- /dev/null +++ b/.clangd @@ -0,0 +1,8 @@ +CompileFlags: + Add: + - -I/usr/avr/include + - -mmcu=atmega32u4 + - -DF_CPU=8000000UL + - --target=avr + Remove: + - -m* diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..cf0ccae --- /dev/null +++ b/Makefile @@ -0,0 +1,16 @@ +BOARD = adafruit:avr:leonardo +PORT = /dev/ttyACM0 + +SRC := main.c + +CC = avr-gcc + +INCLUDE := /usr/avr +CFLAGS := -mmcu=atmega32u4 -DF_CPU=8000000UL -I$(INCLUDE) + +all: + $(CC) $(CFLAGS) -Os $(SRC) -o main.elf + avr-objcopy -O ihex main.elf main.hex + +upload: all + sudo avrdude -p atmega32u4 -c avr109 -P /dev/ttyACM0 -U flash:w:main.hex diff --git a/main.c b/main.c new file mode 100644 index 0000000..ada2fc6 --- /dev/null +++ b/main.c @@ -0,0 +1,93 @@ +#include +#define F_CPU 8000000UL // 8 MHz + +#include +#include + +#define SN74_SER (1 << PC6) +#define SN74_RCLK (1 << PB5) +#define SN74_SRCLK (1 << PE6) + +#define SEG_DIG1 (1 << PF6) +#define SEG_DIG2 (1 << PF5) +#define SEG_DIG3 (1 << PF4) +#define SEG_DIG4 (1 << PF1) + +void init_3461BS() { + DDRF |= SEG_DIG1 | SEG_DIG2 | SEG_DIG3 | SEG_DIG4; + + PORTF &= ~(SEG_DIG1 | SEG_DIG2 | SEG_DIG3 | SEG_DIG4); +} + +void init_74HC595() { + DDRC |= SN74_SER; + DDRB |= SN74_RCLK; + DDRE |= SN74_SRCLK; + + PORTB &= ~SN74_RCLK; + PORTE &= ~SN74_SRCLK; +} + +const uint8_t digit_segments[] = { + 0b11111110, // 0 + 0b11001111, // 1 + 0b10010010, // 2 + 0b10000110, // 3 + 0b11001100, // 4 + 0b10100100, // 5 + 0b10100000, // 6 + 0b10001101, // 7 + 0b10000000, // 8 + 0b10000100, // 9 +}; + +void send_serial_byte(uint8_t n) { + for (int i = 7; i > 0; i--) { + if (n & (1 << i)) { + PORTC |= SN74_SER; + } + else { + PORTC &= ~SN74_SER; + } + PORTE |= SN74_SRCLK; + _delay_ms(100); + PORTE &= ~SN74_SRCLK; + PORTC &= ~SN74_SER; + _delay_ms(100); + } + + PORTB |= SN74_RCLK; + _delay_ms(100); + PORTB &= ~SN74_RCLK; +} + +int main() { + init_74HC595(); + init_3461BS(); + + while (1) { + for (int i = 0; i < 255; i++) { + for(int j = 0; j < 100; j++) { + PORTF |= SEG_DIG1; + send_serial_byte(digit_segments[i / 1000]); + _delay_ms(2); + PORTF &= ~SEG_DIG1; + + PORTF |= SEG_DIG2; + send_serial_byte(digit_segments[(i / 100) % 10]); + _delay_ms(2); + PORTF &= ~SEG_DIG2; + + PORTF |= SEG_DIG3; + send_serial_byte(digit_segments[(i / 10) % 10]); + _delay_ms(2); + PORTF &= ~SEG_DIG3; + + PORTF |= SEG_DIG4; + send_serial_byte(digit_segments[i % 10]); + _delay_ms(2); + PORTF &= ~SEG_DIG4; + } + } + } +} diff --git a/main.elf b/main.elf new file mode 100755 index 0000000..5e189f4 Binary files /dev/null and b/main.elf differ diff --git a/main.hex b/main.hex new file mode 100644 index 0000000..36624b1 --- /dev/null +++ b/main.hex @@ -0,0 +1,44 @@ +:100000000C9456000C946B000C946B000C946B00D9 +:100010000C946B000C946B000C946B000C946B00B4 +:100020000C946B000C946B000C946B000C946B00A4 +:100030000C946B000C946B000C946B000C946B0094 +:100040000C946B000C946B000C946B000C946B0084 +:100050000C946B000C946B000C946B000C946B0074 +:100060000C946B000C946B000C946B000C946B0064 +:100070000C946B000C946B000C946B000C946B0054 +:100080000C946B000C946B000C946B000C946B0044 +:100090000C946B000C946B000C946B000C946B0034 +:1000A0000C946B000C946B000C946B0011241FBE1D +:1000B000CFEFDAE0DEBFCDBF11E0A0E0B1E0E4E9D0 +:1000C000F2E002C005900D92AA30B107D9F70E9464 +:1000D000AD000C9448010C94000080B3826780BB93 +:1000E00081B38D7881BB08953E9A259A6E9A2D989A +:1000F0007698089527E030E090E0AC01022E02C02F +:10010000559547950A94E2F740FF25C0469A769A9E +:100110004FEF50E762E0415050406040E1F700C0CF +:100120000000769846984FEF50E762E0415050400B +:100130006040E1F700C0000021503040F1F62D9AF8 +:100140008FEF90E722E0815090402040E1F700C01F +:1001500000002D9808954698DACFCDB7DEB72897DE +:100160000FB6F894DEBF0FBECDBF0E9474000E9490 +:100170006D000AE010E01F8218868F81988564E682 +:1001800070E00E942001FB018F819885B8010E94D8 +:1001900020019C01CB01B8010E94200144E6E42E1D +:1001A000F12CAF0140505F4F49835A83FC01E0506E +:1001B000FF4FEB83FC83A90140505F4F4D835E836B +:1001C0008E9A8EEF0E947A008FE99FE00197F1F7F7 +:1001D00000C000008E988D9AE981FA8180810E948A +:1001E0007A008FE99FE00197F1F700C000008D9839 +:1001F0008C9AEB81FC8180810E947A008FE99FE0DC +:100200000197F1F700C000008C98899AED81FE817A +:1002100080810E947A008FE99FE00197F1F700C08A +:100220000000899891E0E91AF10851F6EF81F8850C +:100230003196EF83F887EF3FF10509F09ECF9BCF12 +:1002400097FB072E16F4009407D077FD09D00E9483 +:10025000340107FC05D03EF4909581959F4F089599 +:10026000709561957F4F0895AA1BBB1B51E107C094 +:10027000AA1FBB1FA617B70710F0A61BB70B881F36 +:10028000991F5A95A9F780959095BC01CD010895C5 +:04029000F894FFCF10 +:0A029400FECF9286CCA4A08D8084DA +:00000001FF