Двухканальное устройство управления освещением (диммер) для бытового светильника

Курсовой проект - Физика

Другие курсовые по предмету Физика

1rSoftTurnSpeedCh1Temp, rSoftTurnSpeedCh1ExitSoftTurnOffCh1rSoftTurnSpeedCh1rBrightnessCh1; то уменьшить ее на один шаг, учитывая скорость снижения (аналогично процедуре SoftTurnOnCh1:).:GoOutCh1Completed:; Если яркость снизилась до требуемого значения, rBit1, 1<<bSoftTurnCh1; сбросить признак плавного выключения.

sbrc rBit1, bTurnOffStartedCh1; Если автоотключение активно,

sbr rBit1, 1<<bIsChannel1On; восстановить признак включенного канала.

ldi rButton1HoldTime, 255; Ждать пока кнопка не буден отпущена.

rjmp GoOutCh1

CheckButton1:; Определение нажатия кнопки первого канала.

sbic pKeyboardIn, sbChannel1; Если кнопка нажата, то:

rjmp Button1IsOff

ldi Temp, 255; 1) Начать отсчет времени (2,5 сек.) по истечении которого

sts mSaveBrightDelayCh1, Temp; значение яркости будет запомнено в eeprom;

rcall ResetAutoOffTimerCh1; 2) Начать заново отсчет времени непрерывной работы канала;

; 3) Определить дальнейшие действия в зависимости от значения счетчика времени удержания кнопки.

cpi rButton1HoldTime, cButtonOnHoldSense; Если счетчик достиг значения, обозначающего удерживание кнопки,

breq Button1OnHold; перейти к выполнению соответствующей процедуры.

cpi rButton1HoldTime, 255; Если в счетчике находится специальное значение (255),

breq PC+2; то ничего не делать - ждать пока кнопка не будет отжата.

inc rButton1HoldTime; Если же счетчик не содержит специального значения и пока еще не сравнялся с порогом удерживания кнопки в нажатом положении, то увеличить его значение на единицу.

rjmp IsChannel1On

Button1OnHold:

sbrc rBit1, bTurnOffStartedCh1; Если кнопка удерживается когда канал находится в состоянии автоотключения,

rjmp RestoreBrightnessCh1; нужно восстановить первоначальную яркость.

sbrc rBit1, bIsChannel1On; Если режим автоотключения не активен, удерживание кнопки в нажатом положении

rjmp ChangeBrightnessCh1; при включенном канале приводит к изменению яркости.

sbic pKeyboardIn, sbChannel2; Если в нажатом положении удерживаются обе кнопки

rjmp TurnCh1InSecondModeTemp, rBit1; и все каналыTemp, (1<<bBrightVectorCh1) + (1<<bBrightVectorCh2); полностью выключены,TurnCh1InSecondModereSystemBits, (1<<ebOwnersAtHome) + (1<<ebPowerStateCh1) + (1<<ebPowerStateCh2); то они включаются в режиме ИПХ. OwnersAtHomeTimerTrigger; Для этого таймер функции ИПХ настраивается на срабатывание в следующем цикле.

rjmp Channel2Processing

TurnCh1InSecondMode:

sbr reSystemBits, 1<<ebChannel1Mode; При выключенном канале удерживание кнопки в нажатом положении приводит к включению канала во втором режиме.

cbr reSystemBits, 1<<ebOwnersAtHome; При этом режим ИПХ отключается.

rjmp TurnCh1On:; Восстановление яркости. ResetAutoOffTimerCh1; Начать заново отсчет таймаута (времени непрерывной работы).

cbr rBit1, 1<<bTurnOffStartedCh1; Сбросить флаг состояния автоотключения.

sbr reSystemBits, 1<<ebPowerStateCh1; Восстановить флаг включенного состояния.

sbr rBit1, 1<<bSoftTurnCh1; Плавно восстановить яркость, существовавшую на момент истечения таймаута.

rjmp GoOutCh1

ChangeBrightnessCh1:

sbrc reSystemBits, ebOwnersAtHome; В режиме Имитация Присутствия Хозяев ручная регулировка яркости недоступна.

rjmp GoOutCh1

cp reBrightChangeSpeedCh1, rBrightCounterCh1; Если значение заданной скорости изменения яркости стало равно текущему значению счетчика-делителя,

breq BrightReadyToChangeCh1; значит пора перейти к увеличению, уменьшению, или удержанию яркости.

inc rBrightCounterCh1; Иначе увеличить значение счетчика-делителя.

rjmp IsChannel1On

BrightReadyToChangeCh1:

clr rBrightCounterCh1; Очистка счетчика-делителя для использования в следующем цикле.

sbrc rBit1, bBrightVectorCh1; Если бит сброшен, то уменьшить яркость,

rjmp IncreaseBrightnessCh1; иначе - увеличить.:Temp, meBrightnessMinCh1Temp, rBrightnessCh1 MinBrightnessReachedCh1; Если текущая яркость больше минимальной,

dec rBrightnessCh1; уменьшить ее на один шаг.

rjmp GoOutCh1

MinBrightnessReachedCh1:; При достижении минимальной яркости, или если текущая яркость меньше минимальной, счетчик-делитель отключается

mov rBrightCounterCh1, reBrightChangeSpeedCh1; чтобы устранить влияние скорости регулировки яркости на длительность удержания ее минимального значения.

lds Temp, mBrightMinCounterCh1; Если яркость достигла минимальной,

dec Temp; но счетчик удержания минимальной яркости

breq BrightMinTimeoutIsUpCh1; еще не снизился до нуля,

sts mBrightMinCounterCh1, Temp; то сохранить в оперативной памяти декрементированное значение этого счетчика,

rjmp GoOutCh1; а яркость оставить неизменной.

BrightMinTimeoutIsUpCh1:

lds Temp, meMinBrightDelayCh1; Если же счетчик достиг нулевого значения,

sts mBrightMinCounterCh1, Temp; восстановить его исходное состояние,

sbr rBit1, 1<<bBrightVectorCh1; переключить направление изменения яркости на противоположное,

clr rBrightCounterCh1; и восстановить работоспособность счетчика-делителя скорости регулировки яркости.

rjmp GoOutCh1:Temp, meBrightnessMaxCh1rBrightnessCh1, TempMaxBrightnessReachedCh1rBrightnessCh1GoOutCh1:rBrightCounterCh1, reBrightChangeSpeedCh1Temp, mBrightMaxCounterCh1TempBrightMaxTimeoutIsUpCh1mBrightMaxCounterCh1, TempGoOutCh1:Temp, meMaxBrightDelayCh1mBrightMaxCounterCh1, TemprBit1, 1<<bBrightVectorCh1rBrightCounterCh1GoOutCh11IsOff:; Кнопка не нажата, или только что была отжата.

cpi rButton1HoldTime, 255; Если счетчик длительности удерживания кнопки содержит специальное значение (255),

brne PC+2; призванное блокировать обработку состояния кнопки пока она не будет отжата,

ldi rButton1HoldTime, 0; нужно снять эту блокировку путем обнуления счетчика, и выйти из процедуры.

cpi rButton1HoldTime, 0; Если счетчик изначально был равен нулю,

breq IsChannel1On; значит кнопка не была нажата.

cpi rButton1HoldTime, cButtonOnHoldSense; Если счетчик не равен нулю (т.е. кнопка только что была отжата),

ldi rButton1HoldTime, 0; то сбросить его (команду clr здесь применять нельзя, т.к. она влияет на флаги SREG),

breq HoldButton1; и выполнить действия, соответствующие отпусканию кнопки после ее нажатия

ClickButton1:; или удерживания.

sbrc rBit1, bIsChannel1On; Если канал включен (bIsChannel1On=0)

rjmp TurnCh1Off; значит надо его выключить.

cbr reSystemBits, (1<<ebChannel1Mode) + (1<<ebOwnersAtHome); Если канал выключен, TurnCh1On; значит его надо включить в первом режиме. При этом режим ИПХ отключается.

HoldButton1:; Если было нажа