Цитата(RicLab @ May 24 2010, 07:12)

Устройство должно управлять нагрузкой(светодиод) регулируя мощность на нём в зависимости от состояния двери.
В вашей программе долго разбираться и искать логическую ошибку. Могу подсказать свой метод реализации подобных программ.
Делал довольно много программ на основе переменной состояния программы.
Например нужно сделать программу которая в зависимости от состояния многих датчиков должна выполнять различные действия.
Предположим у вас есть датчик открытия двери
door. Вводите переменную
state которая определяет текущее состояние программы.
Организовываете основной цикл программы:
Код
state = 0; //исходное состояние
for(;;)
{
switch(state)
{
case 0: State0();
break;
case 1: State1();
break;
case 2: State2();
break;
case 3: State3();
break;
}
}
Описываете подпрограммы конкретных состояний.
Код
//в State0 опрашиваете датчик состояния двери
void State0(void)
{
if(door != 0)
{
//дверь открылась
state = 1; //переход в состояние повышения мощности в теч 1 сек
}
}
//в State1 реализовывается алгоритм зажигания в течение 1 сек
void State1(void)
{
if(не вышло время 1 сек)
{
наращиваете мощность
}
else
{
//переход на ожидание закрытия
state = 2;
}
}
//в State2 опрашиваете датчик состояния двери
void State2(void)
{
if(door == 0)
{
//дверь закрылась
state = 3; //переход в состояние гашения светодиода
}
}
//в State3 гасим светодиод
void State3(void)
{
if(не вышло время гашения светодиода)
{
реализуем алгоритм гашения светодиода
}
else
{
state = 0; //переход в исходное состояние
}
}
Перед основным циклом запускаете таймер-счётчик с периодлом прерываний 1-10 мС для реализации алгоритма антидребезга и отсчёта временных интервалов. В каждом состоянии можете оговорить условия перехода в любое другое состояние, описать переход подпрограммой в которой меняется не только состояние программы но и некоторые другие переменные (программные счётчики интервалов, состояния пинов мк и т.п.).
Да и поробуйте для начала сделать простой алгоритм включения/выключения в зависимости от стостояния датчика двери. А уже потом думать как плавно зажигать или гасить их. По-поводу сложных алгоритмов пауза+плавное гашение - ничто не мешает разделить этот процесс на 2 состояния программы (состояние паузы в 10 сек с переходом в состояние гашения за 3 сек).