Я могу выложить свою программу на asm (где только 3 момента осталось дописать) - тогда вы все увидите полное задание, так сказать. Но у меня там чуть ли не каждая строка прокомментирована профанским языком
(главное в комментариях ведь то, чтобы мне самому было понятно, так?)
Вот
вeсь кoд на asm (работает в Студии):
Код:
.include "m8def.inc" ; подключаем заголовочный файл для ATmega8L-8PU, (ATmega8L-8PI), PbFree PDIP28
.def Temp=R16 ; разное
.def Secret=R17 ; Секрет/загадка, находящийся в Экране (Экран = Screen)
.def Voltage=R18 ; минимальная норма Вольтажа/Питания
.cseg ; начало программного сегмента
.org 0 ; задает начальный адрес. В данном случае он = 0
ldi Secret,1 ; изначально секрет Экрана разгадан (не разгадан = 0 | разгадан = 1)
ldi Voltage,1 ; ??? минимальная норма Вольтажа/Питания ??????????????????????????????????????????????
ldi Temp,0b00000001 ; определение ножек МК портов B (1 = вывод | 0 = ввод). Порты B относятся к разному
out DDRB,Temp ; настраивает ножки МК портов B в соответствии с данными выше
ldi Temp,0b00000000 ; убираем напряение с определённых портов/ножек
out PortB,Temp
ldi Temp,0b00000000 ; определение ножек МК портов D (1 = вывод | 0 = ввод). Порты D относятся к датчикам, определяющим местонаходжение Кристалла
out DDRD,Temp ; настраивает ножки МК портов D в соответствии с данными выше
ldi Temp,0b00111111 ; подаём напряение на определённые порты/ножки
out PortD,Temp
ldi Temp, low(RAMEND) ; инициализация цикла
out SPL, Temp ; инициализация цикла
ldi Temp, high(RAMEND) ; инициализация цикла
out SPH, Temp ; инициализация цикла
;************_ В ОЖИДАНИИ АКТИВАЦИИ _************
Continue_Waiting_For_Start_Playing: rcall TEST ; Проверка Заряда Кристалла и Вольтажа????????
rcall Screen ; вызов/запуск подпрограммы Screen
cpi Temp,0
breq Continue_Waiting_For_Start_Playing2 ; продолжить мастерское управление Кристаллом = Кристалл ещё не игровой
rjmp Start_Playing ; мастерское управление Кристаллом законченно = Кристалл стал игровым/Активирован
Continue_Waiting_For_Start_Playing2: rcall Jewellery ; вызов/запуск подпрограммы Jewellery
cpi Temp,0
breq Continue_Waiting_For_Start_Playing3 ; продолжить мастерское управление Кристаллом = Кристалл ещё не игровой
rjmp Start_Playing ; мастерское управление Кристаллом законченно = Кристалл стал игровым/Активирован
Continue_Waiting_For_Start_Playing3: rcall Charge ; вызов/запуск подпрограммы Charge
cpi Temp,0
breq Continue_Waiting_For_Start_Playing4 ; быстро моргнуть Светодиодом (сигнал неигрового состояния Кристалла)
rjmp Start_Playing ; мастерское управление Кристаллом законченно = Кристалл стал игровым/Активирован
Continue_Waiting_For_Start_Playing4: ldi Temp,0b00000001 ; подаём напряение на светодиод
out PortB,Temp
rcall wait_1 ; задержка
rcall wait_1 ; задержка
rcall wait_1 ; задержка
rcall wait_1 ; задержка
rcall wait_1 ; задержка
ldi Temp,0b00000000 ; убираем напряжение с светодиода
out PortB,Temp
rcall wait_1 ; задержка
rcall wait_1 ; задержка
rcall wait_1 ; задержка
rcall wait_1 ; задержка
rcall wait_1 ; задержка
rjmp Continue_Waiting_For_Start_Playing ; продолжить мастерское управление Кристаллом = Кристалл ещё не игровой
;************_ ИГРА НАЧАЛАСЬ / КРИСТАЛЛ АКТИВИРОВАН _************
Start_Playing: rjmp Searching_1 ; Кристалл активирован, перейти к метке Searching_1, чтобы выяснить где он
Searching_1: rcall Screen; вызов/запуск подпрограммы Screen
cpi Temp,0
breq Searching_2 ; Кристалл Не в Экране, проверять/искать дальше
rjmp YES_In_Screen ; Кристалл в Экране
Searching_2: rcall Jewellery; вызов/запуск подпрограммы Jewellery
cpi Temp,0
breq Searching_3 ; Кристалл Не в Бижутерии, проверять/искать дальше
rjmp YES_In_Jewellery ; Кристалл в Бижутерии
Searching_3: rcall Charge; вызов/запуск подпрограммы Jewellery
cpi Temp,0
breq OUTSIDE ; Кристалл Не в Столбе, он Снаружи/вынут
rjmp YES_In_Charge ; Кристалл в Столбе
OUTSIDE: cpi Secret,0 ; проверка разгадан ли Секрет Экрана
breq Death ; Секрет Не разгадан, Кристалл теряет Весь Заряд
rjmp Fast_Burning ; Секрет разгадан, Кристалл Быстро Прогорает
YES_In_Screen: sbis PIND,4 ; получаем данные с порта Секрета/ножки PD4 и сравнение/сама проверка
rjmp YES_In_Screen_Yes_secret ; есть замыкание / Секрет разгадан
rjmp YES_In_Screen_No_secret ; нет замыкания / Секрет Не разгадан
YES_In_Screen_No_secret: ldi Secret,0 ; записать, что Секрет Не разгадан
rcall TEST ; Проверка Заряда Кристалла и Вольтажа
rcall Breath_Slowly ; Дышать Медленно (яркость, зависит от Заряда Кристалла)
; ???уменьшить заряд со скоростью Экрана???
rjmp Start_Playing ; вернуться к определению местанахождения Кристалла
YES_In_Screen_Yes_secret: ldi Secret,1 ; записать, что Секрет разгадан
rcall TEST ; Проверка Заряда Кристалла и Вольтажа
rcall Breath_Quickly ; Дышать Быстро (яркость, зависит от Заряда Кристалла)
; ???уменьшить заряд со скоростью Бижутерии???
rjmp Start_Playing ; вернуться к определению местанахождения Кристалла
YES_In_Jewellery: rcall TEST ; Проверка Заряда Кристалла и Вольтажа
; ???светиться с яркостью, зависящей от Заряда Кристалла???
; ???уменьшить заряд со скоростью Бижутерии???
rjmp Start_Playing ; вернуться к определению местанахождения Кристалла
YES_In_Charge: rcall TEST ; Проверка Заряда Кристалла и Вольтажа
; если Заряд Кристалла максимальный, то светиться пульсируя (rcall Pulsing) и перейти к метке Start_Playing, иначе:
rcall Breath_Quickly ; Дышать Быстро (яркость, зависит от Заряда Кристалла)
sbis PIND,3 ; получаем данные с порта Столба с Буфером/ножки PD3 и сравнение/сама проверка
rjmp YES_In_Charge_with_Buffer ; есть замыкание / Столб с Буфером
rjmp YES_In_Charge_with_OUT_Buffer ; нет замыкания / Столб БЕЗ Буфера
YES_In_Charge_with_Buffer: sbis PIND,5 ; получаем данные с порта Мастерского Столба/ножки PD5 и сравнение/сама проверка
rjmp YES_In_Charge_Master_Yes ; есть замыкание / Столб Мастерский
rjmp YES_In_Charge_Master_No ; нет замыкания / Столб НЕ Мастерский
YES_In_Charge_Master_Yes: ; ???Увеличить заряд до Максимума???
rjmp Start_Playing ; вернуться к определению местанахождения Кристалла
YES_In_Charge_Master_No: ; ???Увеличить заряд со скоростью Столба с Буфером???
rjmp Start_Playing ; вернуться к определению местанахождения Кристалла
YES_In_Charge_with_OUT_Buffer: ; ???Увеличить заряд со скоростью Столба БЕЗ Буфером???
rjmp Start_Playing ; вернуться к определению местанахождения Кристалла
Fast_Burning: rcall TEST ; Проверка Заряда Кристалла и Вольтажа
rcall Pulsing; светится максимально ярко, пульсируя
; ???уменьшить заряд со скоростью Быстро???
rjmp Start_Playing ; вернуться к определению местанахождения Кристалла
Death: ; ??? Кристалл теряет Весь Заряд и не светится, пока его не Зарядят в Столбе (или не перезагрузят, выключив и снова включив)
Full_Death: in Temp,2;???РЕАЛЬНЫЙ_ВОЛЬТАЖ (вместо 2)??? ; данные о Вольтаже/Питании
cp Voltage,Temp ; сверяем данные выше с нормой - если Вольтаж/Питание меньше нормы,
brmi Full_Death; то Кристалл больше не засветится, пока его не перезагрузят (выключив и снова включив), и не активирутся, пока Вольтаж/Питание не нормализуют
rjmp Start_Playing ; иначе: вернуться к определению местанахождения Кристалла
;************************_ ПОДПРОГРАММЫ _****************************
;тестовая Задержка
wait_1:
ldi r24,10
mov r25,r24
wait_1_1: ldi r24,200
rcall wait_1_2
rcall wait_1_2
rcall wait_1_2
rcall wait_1_2
dec r25
brne wait_1_1
ret
wait_1_2:
dec r24
breq wait_1_ret
nop
nop
nop
nop
rjmp wait_1_2
wait_1_ret: ret
; Проверка находится ли Крисалл в Экране?
Screen: sbis PIND,0 ; получаем данные с порта Экрана/ножки PD0 и сравнение/сама проверка
rjmp Screen_2_check ; есть замыкание / Кристалл в Экране
rjmp Screen_Finish ; иначе: нет замыкания
Screen_2_check: sbis PIND,1 ; получаем данные с порта Бижутерии/ножки PD1 и сравнение/сама проверка
rjmp Fast_Burning ; есть замыкание / Кристалл Быстро Прогарает
rjmp Screen_3_check ; иначе2: нет замыкания
Screen_3_check: sbis PIND,2 ; получаем данные с порта Столба/ножки PD2 и сравнение/сама проверка
rjmp Fast_Burning ; есть замыкание / Кристалл Быстро Прогарает
ldi Temp,1 ; иначе3: проверка показала, что Кристалл находится именно в Экране
rjmp Screen_ret
Screen_Finish: clr Temp ; очистить регистр Temp, результат проверки: Кристалл Не в Экране
Screen_ret: ret ; конец подпрограммы. При этом продолжится выполнение программы, вызвавшей данную подпрограмму,
; с места вызова. Т.е., с команды, следующей за командой rcall
; Проверка находится ли Крисалл в Бижутерии?
Jewellery: sbis PIND,1 ; получаем данные с порта Бижутерии/ножки PD1 и сравнение/сама проверка
rjmp Jewellery_2_check ; есть замыкание / Кристалл в Бижутерии
rjmp Jewellery_Finish ; иначе: нет замыкания
Jewellery_2_check: sbis PIND,0 ; получаем данные с порта Экрана/ножки PD0 и сравнение/сама проверка
rjmp Fast_Burning ; есть замыкание / Кристалл Быстро Прогарает
rjmp Jewellery_3_check ; иначе2: нет замыкания
Jewellery_3_check: sbis PIND,2 ; получаем данные с порта Столба/ножки PD2 и сравнение/сама проверка
rjmp Fast_Burning ; есть замыкание / Кристалл Быстро Прогарает
ldi Temp,1 ; иначе3: проверка показала, что Кристалл находится именно в Бижутерии
rjmp Jewellery_ret
Jewellery_Finish: clr Temp ; очистить регистр Temp, результат проверки: Кристалл Не в Бижутерии
Jewellery_ret: ret ; конец подпрограммы. При этом продолжится выполнение программы, вызвавшей данную подпрограмму,
; с места вызова. Т.е., с команды, следующей за командой rcall
; Проверка находится ли Крисалл в Столбе?
Charge: sbis PIND,2 ; получаем данные с порта Столба/ножки PD2 и сравнение/сама проверка
rjmp Charge_2_check ; есть замыкание / Кристалл в Столбе
rjmp Charge_Finish ; иначе: нет замыкания
Charge_2_check: sbis PIND,0 ; получаем данные с порта Экрана/ножки PD0 и сравнение/сама проверка
rjmp Fast_Burning ; есть замыкание / Кристалл Быстро Прогарает
rjmp Charge_3_check ; иначе2: нет замыкания
Charge_3_check: sbis PIND,1 ; получаем данные с порта Бижутерии/ножки PD1 и сравнение/сама проверка
rjmp Fast_Burning ; есть замыкание / Кристалл Быстро Прогарает
ldi Temp,1 ; иначе3: проверка показала, что Кристалл находится именно в Столбе
rjmp Charge_ret
Charge_Finish: clr Temp ; очистить регистр Temp, результат проверки: Кристалл Не в Столбе
Charge_ret: ret ; конец подпрограммы. При этом продолжится выполнение программы, вызвавшей данную подпрограмму,
; с места вызова. Т.е., с команды, следующей за командой rcall
; Проверка Заряда Кристалла и Вольтажа:
TEST: ; ???
TEST_ret: ret ; конец подпрограммы. При этом продолжится выполнение программы, вызвавшей данную подпрограмму,
; с места вызова. Т.е., с команды, следующей за командой rcall
; Дышать Медленно:
Breath_Slowly: ; ???
Breath_Slowly_ret: ret ; конец подпрограммы. При этом продолжится выполнение программы, вызвавшей данную подпрограмму,
; с места вызова. Т.е., с команды, следующей за командой rcall
; Дышать Быстро:
Breath_Quickly: ; ???
Breath_Quickly_ret: ret ; конец подпрограммы. При этом продолжится выполнение программы, вызвавшей данную подпрограмму,
; с места вызова. Т.е., с команды, следующей за командой rcall
; Светиться максимально ярко Пульсируя:
Pulsing: ; ???
Pulsing_ret: ret ; конец подпрограммы. При этом продолжится выполнение программы, вызвавшей данную подпрограмму,
; с места вызова. Т.е., с команды, следующей за командой rcall
Здесь не хватает только трёх моментов:
-
момент 1-
моменты 2 и 3ШИМ (он же момент 2) на asm Вован вроде уже написал - осталось у него добыть