создал репозиторий
commit
f1e217b0ae
|
|
@ -0,0 +1,2 @@
|
||||||
|
/fw/out/
|
||||||
|
/fw/obj/
|
||||||
|
|
@ -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)
|
||||||
|
|
@ -0,0 +1,89 @@
|
||||||
|
#include <avr/io.h>
|
||||||
|
#include <util/delay.h>
|
||||||
|
#include <avr/interrupt.h>
|
||||||
|
|
||||||
|
#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<<Link1pin)|(1<<Link2pin)); // Пины к которым подключена оптопара - на вход
|
||||||
|
DDRB |= (1<<PLCPWRpin)|(1<<EXTPWRpin); // Пины управления транзисторами - на выход
|
||||||
|
PORTB |= (1<<Link1pin)|(1<<Link2pin)|(1<<PLCPWRpin); // Подтяжка выходов оптопар, управление внешним питанием(выключенное состояние, NPN)
|
||||||
|
PORTB &= ~(1<<EXTPWRpin); // Управление питанием PLC, выключенное состояние (P-канал)
|
||||||
|
new_mode = MODE_WAIT_LINK; // Переходи в режим ожидания линка
|
||||||
|
TCCR0B |= (1<<CS02)|(1<<CS00); // Делитель на 1024
|
||||||
|
TIMSK0 |= (1<<TOIE0); // Разрешаем прерывание по переполнению
|
||||||
|
sei(); // Разрешаем прерывания
|
||||||
|
while(1)
|
||||||
|
{
|
||||||
|
if(cur_mode != new_mode) // Переключение режимов
|
||||||
|
{
|
||||||
|
if(new_mode == MODE_WAIT_LINK)
|
||||||
|
{
|
||||||
|
PORTB &= ~(1<<PLCPWRpin); // PLC ON
|
||||||
|
timer = 60*36; // +- 60 сек
|
||||||
|
}
|
||||||
|
if(new_mode == MODE_LINK_UP)
|
||||||
|
{
|
||||||
|
PORTB |= (1<<EXTPWRpin); // Modem ON
|
||||||
|
timer = 60*36; // +- 60 сек
|
||||||
|
}
|
||||||
|
if(new_mode == MODE_SLEEP)
|
||||||
|
{
|
||||||
|
PORTB &= ~(1<<EXTPWRpin); // Modem OFF
|
||||||
|
PORTB |= (1<<PLCPWRpin); // PLC OFF
|
||||||
|
timer = 300*36; // +- 5 минут
|
||||||
|
}
|
||||||
|
cur_mode = new_mode;
|
||||||
|
}
|
||||||
|
if (cur_mode == MODE_WAIT_LINK && check_link() == 1) // Если мы в режиме ожидания линка и линк есть
|
||||||
|
{
|
||||||
|
new_mode = 2; // То переходим в рабочий режим
|
||||||
|
}
|
||||||
|
if (cur_mode == MODE_LINK_UP && check_link() == 1) // Если мы в рабочем режиме и линк есть
|
||||||
|
{
|
||||||
|
timer = 60*36; // +- 60 сек, то не даем таймеру обнулиться
|
||||||
|
}
|
||||||
|
if(timer == 0 && (cur_mode == MODE_WAIT_LINK || cur_mode == MODE_LINK_UP)) // Если таймер истек, а линка нет
|
||||||
|
{
|
||||||
|
new_mode = MODE_SLEEP; // То переходи в режим сна
|
||||||
|
}
|
||||||
|
if(timer == 0 && cur_mode == MODE_SLEEP) // Если спим и таймер истек
|
||||||
|
{
|
||||||
|
new_mode = MODE_WAIT_LINK; // То переходим в режим ожидания линка
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Binary file not shown.
Loading…
Reference in New Issue