commit f1e217b0aea144cfc218d393590967991959514a Author: Daniil A. Smirnov Date: Fri Dec 12 00:38:13 2025 +0300 создал репозиторий diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6f41fbe --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/fw/out/ +/fw/obj/ diff --git a/fw/Makefile b/fw/Makefile new file mode 100644 index 0000000..79bf108 --- /dev/null +++ b/fw/Makefile @@ -0,0 +1,53 @@ +# Название проекта +PRG=PLCpwr +# МК +MCU=attiny13 +# Частота МК в герцах +FREQ=9600000UL +# GCC +CC=avr-gcc +# OBJCOPY +OBJCOPY= avr-objcopy +# SIZE +SIZE=avr-size +# Флаги GCC +CFLAGS= -Wall -Os -std=gnu99 -lm +# Флаги LD +LDFLAGS= -Wall -lm +# Папка с промежуточными файлами +OBJDIR=obj +# +OUTDIR=out + +# Cписок .c файлов +C_SRC= \ +PLCpwr.c + +# Список объектных файлов (формируется автоматически на основе списка .с файлов) +OBJS=$(C_SRC:.c=.o) +OBJ=$(addprefix $(OBJDIR)/, $(OBJS)) + +.PHONY: all LD DIR clean + +# Выполняем цели в указанном порядке +all: DIR $(C_SRC) $(OBJS) LD + +# Линковка +LD: $(OBJ) + $(CC) $^ -o $(OBJDIR)/$(PRG).elf $(LDFLAGS) -mmcu=$(MCU) + $(OBJCOPY) -O ihex -R .eeprom -R .fuse -R .lock $(OBJDIR)/$(PRG).elf $(OUTDIR)/$(PRG).hex + $(OBJCOPY) -O ihex -j .eeprom $(OBJDIR)/$(PRG).elf $(OUTDIR)/$(PRG).eep + $(SIZE) -C --format=avr --mcu=$(MCU) $(OBJDIR)/$(PRG).elf + +# +%.o: %.c + $(CC) $< -o $(OBJDIR)/$@ $(CFLAGS) -mmcu=$(MCU) -DF_CPU=$(FREQ) -c + +# Создание папок +DIR: + mkdir -p $(OBJDIR) + mkdir -p $(OUTDIR) + +# +clean: + rm -rf $(OBJDIR) $(OUTDIR) diff --git a/fw/PLCpwr.c b/fw/PLCpwr.c new file mode 100755 index 0000000..221b90c --- /dev/null +++ b/fw/PLCpwr.c @@ -0,0 +1,89 @@ +#include +#include +#include + +#define Link1pin PB2 // Пин оптопары светодиода линка +#define Link2pin PB1 // Пин оптопары светодиода линка + +#define PLCPWRpin PB4 // Питание PLC +#define EXTPWRpin PB0 // Питание модема + +#define MODE_WAIT_LINK 1 +#define MODE_LINK_UP 2 +#define MODE_SLEEP 3 + +uint8_t cur_mode = 0; // Текущий режим +uint8_t new_mode = 0; // Новый режим + +volatile uint16_t timer = 0; + +ISR(TIM0_OVF_vect) +{ + if(timer > 0) + { + timer--; + } +} + +uint8_t check_link(void) // Проверка линка +{ + if(!(PINB & (1 << Link1pin) || PINB & (1 << Link2pin))) // Если горит хотя бы один светодиод линка + { + return 1; // То возвращаем 1 + } + else // Если нет + { + return 0; // То возвращаем 0 + } +} + +int main(void) +{ + DDRB &= ~((1<