Двухканальное устройство управления освещением (диммер) для бытового светильника
Курсовой проект - Физика
Другие курсовые по предмету Физика
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:; Если было нажа