Вт май 24, 2022 20:08:47
Вт май 24, 2022 20:14:44
Вт май 24, 2022 20:21:43
Ср май 25, 2022 11:39:07
Ср май 25, 2022 14:27:25
Ср май 25, 2022 14:32:40
Ср май 25, 2022 18:17:40
Для получения начального 0 придется схемотехникой побаловаться - минимум инверторы на транзисторах добавить.
Чт май 26, 2022 08:11:10
Чт май 26, 2022 09:28:36
Чт май 26, 2022 14:26:19
//==================
#include "proc_device.h"
//==================
//==================
// 1. При подаче питания на устройство на всех выходах устанавливается 0;
// 2. Включение. При кратковременной подаче на один из входов 1 (кнопка)
// - подает на один из входов/выходов 1;
// - через 30 сек появляется 1 на втором выходе;
// - через 30 сек. Появляется 1 на третьем выходе;
// при этом 1 первом и втором выходах не снимаются
// 3. Выключение. При кратковременной подаче на первый вход 1 (кнопка):
// - на третьем выходе 1 сменяется на 0;
// - через 30 сек появляется 0 на втором выходе;
// - через 30 сек появляется 0 на первом выходе.
// 4. Если процесс включения не закончился и была нажата кнопка - начинается процесс выключения (обратный порядок из места когда нажата кнопка)
//==================
//==================
void proc_device (void)
{
static u08 _proc_device;
switch (_proc_device)
{
case PROC_DEVICE_INIT:
io_init ();
_proc_device = PROC_DEVICE_WAIT_ON; // Установка состояния-режима ожидания включения
break;
case PROC_DEVICE_WAIT_ON: // Режим ожидания включения
if (Get_Event (EV_ID_KEY_PRESSED)) // Если есть событие нажатия кнопки
{
set_proc_soft_start_on (); // то установка состояния-режима включения
_proc_device = PROC_DEVICE_ON; // Установка состояния-режима включения
}
break;
case PROC_DEVICE_ON: // Режим включения
if (Get_Event (EV_ID_KEY_PRESSED)) // Если есть событие нажатия кнопки
{
set_proc_soft_start_off (); // то установка режима выключения
_proc_device = PROC_DEVICE_OFF; // Установка состояния-режима выключения
}
break;
case PROC_DEVICE_OFF: // Режим выключения
if (Get_Event (EV_ID_START_SOFT_OFF_FINISH)) // Если есть событие завершения режима выключения
{
_proc_device = PROC_DEVICE_WAIT_ON; // то установка состояния-режима ожидания включения
}
break;
default:
break;
}
proc_soft_start ();
proc_led_1 ();
}
//==================
//==================
void io_init (void)
{
set_bit (OUT_1_DDR, OUT_1); // Пин OUT_1 - выход
set_bit (OUT_1_DDR, OUT_2); // Пин OUT_2 - выход
set_bit (OUT_1_DDR, OUT_3); // Пин OUT_3 - выход
set_bit (LED_1_DDR, LED_1);
}
//==================
//==================
static u08 _proc_soft_start;
//----------
void set_proc_soft_start_on (void)
{
_proc_soft_start = 1;
}
//----------
void set_proc_soft_start_off (void)
{
_proc_soft_start = 4;
}
//----------
void proc_soft_start (void)
{
static soft_timer ST_PROC_SOFT_START;
switch (_proc_soft_start)
{
case 0: // Iddle
break;
case 1: // Режим включения
out_1_on ();
led_1_on ();
set_soft_timer (ST_PROC_SOFT_START, SOFT_START_TIME_1);
_proc_soft_start = 2;
break;
case 2:
if (handle_soft_timer (ST_PROC_SOFT_START))
{
out_2_on ();
set_soft_timer (ST_PROC_SOFT_START, SOFT_START_TIME_2);
_proc_soft_start = 3;
}
break;
case 3:
if (handle_soft_timer (ST_PROC_SOFT_START))
{
out_3_on ();
_proc_soft_start = 0; // Iddle
}
break;
case 4: // Режим выключения
out_3_off ();
set_proc_led_1_run ();
set_soft_timer (ST_PROC_SOFT_START, SOFT_START_TIME_1);
_proc_soft_start = 5;
break;
case 5:
if (handle_soft_timer (ST_PROC_SOFT_START))
{
out_2_off ();
set_soft_timer (ST_PROC_SOFT_START, SOFT_START_TIME_2);
_proc_soft_start = 6;
}
break;
case 6:
if (handle_soft_timer (ST_PROC_SOFT_START))
{
out_1_off ();
set_proc_led_1_off ();
Set_Event (EV_ID_START_SOFT_OFF_FINISH, USER_EVENT);
_proc_soft_start = 0; // Iddle
}
break;
default:
break;
}
}
//==================
//==================
static u08 _proc_led_1;
static soft_timer ST_PROC_LED_1;
void set_proc_led_1_run (void)
{
led_1_on (); // Так как в этом проекте урезанный таймер и нет немедленного исполненния, то включение светодиода.
_proc_led_1 = 1;
}
void set_proc_led_1_off (void)
{
led_1_off ();
_proc_led_1 = 0;
}
void proc_led_1 (void)
{
switch (_proc_led_1)
{
case 0:
break; // Idle.
case 1:
set_soft_timer (ST_PROC_LED_1, LED_BLINK_TIME);
_proc_led_1 = 2;
break;
case 2:
if (handle_soft_timer (ST_PROC_LED_1))
{
if (!check_bit(LED_1_PORT, LED_1))
led_1_on ();
else
led_1_off ();
set_soft_timer (ST_PROC_LED_1, LED_BLINK_TIME);
}
break;
}
}
//==================
//==================
void led_1_on (void)
{
__led_1_on ();
}
void led_1_off (void)
{
__led_1_off ();
}
void led_1_switch (void)
{
__led_1_switch ();
}
//==================
//==================
void out_1_on (void)
{
__out_1_on ();
}
void out_2_on (void)
{
__out_2_on ();
}
void out_3_on (void)
{
__out_3_on ();
}
//----------
void out_1_off (void)
{
__out_1_off ();
}
void out_2_off (void)
{
__out_2_off ();
}
void out_3_off (void)
{
__out_3_off ();
}
//==================
Чт май 26, 2022 16:10:52
Чт май 26, 2022 16:28:11
Чт май 26, 2022 16:29:38
Чт май 26, 2022 16:35:07
Чт май 26, 2022 19:43:02
Пт май 27, 2022 07:54:02
Пн май 30, 2022 20:53:16