Двухканальное устройство управления освещением (диммер) для бытового светильника
Курсовой проект - Физика
Другие курсовые по предмету Физика
n Temp, ADCH; Иначе производится очередное измерение напряжения. В расчет принимаются только старшие 8 бит АЦП.
rjmp ADCSampling
ADCExit:
cbr rOutChannels, (1<<bChannel1) + (1<<bChannel2); Принудительное выключение каналов при
out pMainOut, rOutChannels; достижении максимально допустимого числа измерений.
clr rCh1OffTime
clr rCh2OffTime
; ******************Выполнение общих процедур для обоих каналов*******************
sbrs reSystemBits, ebOwnersAtHome; При включенном режиме Имитация Присутствия Хозяев (ИПХ)
rjmp Channel1Processing
lds Temp, mOwnersAtHomeSeconds; каждые 10мс происходит декремент счетчика этого режима.
dec TempmOwnersAtHomeSeconds, TempExitOwnersAtHome Temp, 100
; ldi Temp, 5; уменьшение таймаута для ускорения тестирования
sts mOwnersAtHomeSeconds, TempTemp, mOwnersAtHomeMinutesTempmOwnersAtHomeMinutes, TempExitOwnersAtHomeTemp, 60mOwnersAtHomeMinutes, TempTemp, mOwnersAtHomeSharedCellTempmOwnersAtHomeSharedCell, TempExitOwnersAtHome; Как только счетчик отсчитает заданный интервал,rBit1, bIsChannel1On; происходит включение,OwnersAtHomeToOffState; или выключение обоих каналов,rBit1, (1<<bSoftTurnCh1) + (1<<bSoftTurnCh2) + (1<<bIsChannel1On) + (1<<bIsChannel2On) + (1<<bBrightVectorCh1) + (1<<bBrightVectorCh2) reSystemBits, (1<<ebPowerStateCh1) + (1<<ebPowerStateCh2); Если во время включения произойдет сбой питания, то после его восстановления каналы включаться.
lds Temp, meOwnersAtHomeOnPeriod; Если режим случайного выбора значений функции ИПХ не выбран,
sbrs reUserBits1, ebRandomOAH
rjmp OwnersAtHomeSharedCellWrite; то таймер будет отсчитывать заранее заданное значение длительности включенного состояния.
rcall RandomNumber8bit; Если выбран, то формируется случайное значение яркости.
cpi Temp, cMinBrightOAH; Если случайная яркость оказывается меньше cMinBrightOAH (примерно 25% от максимальной яркости),
brsh PC+2
ldi Temp, cMinBrightOAH; она становится равной cMinBrightOAH.
; ldi Temp, 150; заглушка режима случайного выбора яркости функции ИПХ, позволяющая задать требуемую яркость
sts meOwnersAtHomeBright, Temp
rcall RandomNumber8bit; Затем формируется случайное значение длительности работы во включенном состоянии.
cpi Temp, (cMaxDurationOAH + 1); Если случайная длительность превышает (cMaxDurationRndOAH + 1) (240 минут),
brlo PC+2
ldi Temp, cMaxDurationOAH; она заменяется на cMaxDurationRndOAH.
; ldi Temp, 4; заглушка режима случайного выбора длительности включенного состояния функции ИПХ
rjmp OwnersAtHomeSharedCellWrite; После этого происходит запись длительности в соответствующую ячейку памяти.
OwnersAtHomeToOffState:
lds Temp, meOwnersAtHomeOffPeriod;
sbrs reUserBits1, ebRandomOAH; Если режим случайного выбора яркости\длительностей в функции ИПХ включен,
rjmp OwnersAtHomeSetOffState
rcall RandomNumber8bit; происходит выбор случайного значения длительности выключенного состояния.
cpi Temp, (cMaxDurationOAH + 1); Если случайная длительность превышает (cMaxDurationRndOAH + 1) (240 минут),
brlo PC+2
ldi Temp, cMaxDurationOAH; она заменяется на cMaxDurationRndOAH.
; ldi Temp, 4; заглушка режима случайного выбора длительности выключенного состояния функции ИПХ
OwnersAtHomeSetOffState:
cbr rBit1, (1<<bIsChannel1On) + (1<<bIsChannel2On); При переходе в выключенное состояние для обоих каналов сбрасываются признаки включенного состояния
sbr rBit1, (1<<bSoftTurnCh1) + (1<<bSoftTurnCh2); и дается команда плавного выключения.
OwnersAtHomeSharedCellWrite:
sts mOwnersAtHomeSharedCell, Temp; Запись длительности включенного или выключенного состояния в ячейку оперативной памяти.
ExitOwnersAtHome:
; ******************Обработка первого канала****************************Processing: rBit1, bSoftTurnCh1; Если бит установлен, значит надо выполнить
rjmp CheckButton1; включение или выключение канала.
sbrs rBit1, bIsChannel1On; Если канал включен,
rjmp SoftTurnOffCh1; происходит его плавное выключение.
lds Temp, meOwnersAtHomeBright; При включении канала в режиме ИПХ,
sbrc reSystemBits, ebOwnersAtHome
rjmp CompareBrightnessCh1
lds Temp, meLastBright1_1; а также в обычном первом
sbrc reSystemBits, ebChannel1ModeTemp, meLastBright1_2; или втором режиме1:
cp Temp, rBrightnessCh1; происходит плавное нарастание яркости до тех пор,
brne SoftTurnOnCh1; пока ее текущее значение не сравняется с заданным (для режима ИПХ) или предыдущим (для первого или второго режима).
SoftTurnOnCh1Completed:
cbr rBit1, 1<<bSoftTurnCh1; Как только это произойдет, сбрасывается признак плавного режима,
sbr reSystemBits, 1<<ebPowerStateCh1; устанавливается признак включенного состояния,
ldi rButton1HoldTime, 255; и начинается ожидание момента отпускания кнопки.
lds Temp, meBrightnessMaxCh1; Если текущая яркость
cp rBrightnessCh1, Temp; больше или равна максимально допустимой,
brlo PC+2
cbr rBit1, 1<<bBrightVectorCh1; вектор изменения яркости направляется в сторону ее уменьшения.
rjmp GoOutCh1; Состояние кнопки опрашивается в следующем цикле чтобы учесть изменившееся состояние битов.
SoftTurnOnCh1:; Плавное увеличение яркости при включении канала.
lds Temp, meTurnOnSpeedMode1Ch1; Загрузка длительности нарастания яркости, заданной для первого
sbrc reSystemBits, ebChannel1ModeTemp, meTurnOnSpeedMode2Ch1; или второго режима. rSoftTurnSpeedCh1; Инкремент счетчика импульсов, определяющего скорость изменения яркости.
cp Temp, rSoftTurnSpeedCh1; Если значение счетчика еще не сравнялось с заданной длительностью,
brne ExitSoftTurnOnCh1; то выйти из процедуры, оставив текущую яркость неизменной.
clr rSoftTurnSpeedCh1; Если сравнялось, то сбросить счетчик,
inc rBrightnessCh1; и увеличить текущую яркость на единицу.
ExitSoftTurnOnCh1:
rjmp GoOutCh1; Во время плавного включения кнопка не опрашивается.
SoftTurnOffCh1:; Плавное уменьшение яркости при выключении канала.
cbr reSystemBits, 1<<ebPowerStateCh1; Сброс признака включенного состояния (чтобы канал не включился в случае прерывания питания во время плавного выключения канала).
sbrs rBit1, bTurnOffStartedCh1; При втором способе автоотключения яркость нужно снизить до значения, указанного в регистре rSoftOffBrightCh1.
clr rSoftOffBrightCh1; Если же автоотключение не активно, яркость нужно снизить до нуля.
cp rBrightnessCh1, rSoftOffBrightCh1; Если яркость еще не сравнялась
breq SoftTurnOffCh1Completed; с заданным значением,
lds Temp, meTurnOffSpeedMode1Ch1reSystemBits, ebChannel1ModeTemp, meTurnOffSpeedMode2Ch