roboforum.ru

Технический форум по робототехнике.

Магический кристалл

Re: Магический кристалл

=DeaD= » 16 мар 2010, 07:11

GrayHunter писал(а):Спасибо за примеры, но я правильно понял, что ни в одном из них проверка перемычек в подпрограмму не выведена? Так же вроде никто не вывел в подпрограмму мигание ("быстрое прогорание")... Так у меня код программы будет не около 300, как на asm, а около 1000 строк на Си, наверное. :o

Я думаю вам надо сначала составить полное ТЗ, а потом уже будет иметь смысл подсказывать вам его реализацию, иначе мы вам автомобиль по просьбе "чтобы ездило", а вы нам "а где крылья?", мы вам "а зачем?", а вы "ну так ездило это же не всё, мне же потом еще чтобы летало". :D

Re: Магический кристалл

yak-40 » 16 мар 2010, 09:24

GrayHunter писал(а): я правильно понял, что ни в одном из них проверка перемычек в подпрограмму не выведена?

Можно вывести. А зачем?
GrayHunter писал(а):Так же вроде никто не вывел в подпрограмму мигание ("быстрое прогорание")...

У меня выведено. Специально для тебя сделел. Но ты не заметил. Значит невнимательно смотрел.
GrayHunter писал(а):Дело в том, что проверить мне нужно все три ножки отдельно

Да хоть двадцатьтри. Не нравится if ставь switch.
GrayHunter писал(а): Так у меня код программы будет не около 300, как на asm, а около 1000 строк на Си, наверное.

Пример в студию. А так, голословное заявление основаное на личных ощущениях.

Re: Магический кристалл

rig » 16 мар 2010, 09:29

Си-шники люди суровые, за каждую строчку спросят. Может лучше назад к asm ? 8)

Re: Магический кристалл

GrayHunter » 16 мар 2010, 09:48

Я могу выложить свою программу на asm (где только 3 момента осталось дописать) - тогда вы все увидите полное задание, так сказать. Но у меня там чуть ли не каждая строка прокомментирована профанским языком :oops: (главное в комментариях ведь то, чтобы мне самому было понятно, так?)

Вот в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 Вован вроде уже написал - осталось у него добыть :roll:

Re: Магический кристалл

=DeaD= » 16 мар 2010, 12:37

GrayHunter: Вы всерьез думаете, что кто-то будет изучать вашу программу на асм, пытаться её скрестить с задачей в моментах 1-2-3? Составьте полную постановку задачи русским языком - это 50% решения проблемы.

Re: Магический кристалл

Angel71 » 16 мар 2010, 12:54

кроме нескольких условий и пары пустых функций ака заглушек ничего по сути нет. :pardon: что тут скрещивать? тут код весь стереть легче и с 0 написать.
или на си этот чудо код нужно? :crazy: так это будет сплошной "goto style" в не самом лучшем исполнении
:roll: и вообще кристалл, тем более магический на трёхцветных диодах лучше делать.

Re: Магический кристалл

GrayHunter » 16 мар 2010, 13:21

Русским языком.....начал было всё насписывать и понял, что стою на месте с этим Си уже слишком долго. На asm уже почти всё готово, а с Си каждый раз придётся гемороиться, если захочу изменить что-то координарольное.

На asm я выше выложил всю задумку. Она работает (то, что уже написано) - значит всё правильно.

Осталось добыть понятный/с комментариями пример кода ШИМ для "дыхания" светодиода и понять, как реализовать "заряд кристалла". Надеюсь на вашу помощь :)
P.S.- сам нашёл вот что ( http://ru.edaboard.com/topic-2311750.0.html ), но там слишком мало комментариев - не могу понять, что что делает и как собственно дышать с определённой мной скоростью.

Re: Магический кристалл

=DeaD= » 16 мар 2010, 13:38

Выделите 10 минут, сформулируйте всё-таки что именно вам надо от начала и до конца. Вы намного больше потратите иначе и своего и чужого времени. :pardon:

Re: Магический кристалл

=DeaD= » 16 мар 2010, 13:44

Совести у вас нет! Вам бесплатно предлагают написать решение вашей задачи, а вам задачу сформулировать лень! :cry:

Re: Магический кристалл

Angel71 » 16 мар 2010, 13:56

там же инглицски по белому написано, вызываешь pwm_set с нужными числами и регулируешь яркость.
делаешь цикл, в нём сначала плавно ярче делаешь, потом в обратную, потом опять в обратную,... :unknown: чего тут такого тугоплавкого?
=DaeD=, да код ему сейчас зачем? задачу по пунктикам сначала расписать, потом железку до каждого резистора продумать :pardon: не, ну если вам в кайф в пустоту код пописать, который с таким подходом просто никогда свет может не увидеть. :) ну сделает сначала куб, потом окажеться, что его хватит максимум на сутки и что, всё коту...?
:oops: тут вообще по хорошему авра подтягивать можно, он всегда на связи с михаилом. через недельку-две кристаллы в нужном количестве вышлет и все будут счастливы. а так выносить мозг и себе и другим это не нормально
Последний раз редактировалось Angel71 16 мар 2010, 14:12, всего редактировалось 1 раз.

Re: Магический кристалл

=DeaD= » 16 мар 2010, 14:06

Ангел71: Надо правильно код писать, тогда не надо будет при смене железки всё переписывать ;)
Выносить надо проверки входов, выставление выходов и всякие специфичные ШИМ настройки из основной программы, вот и всё.

Re: Магический кристалл

Angel71 » 16 мар 2010, 14:15

:) не, я про железку в смысле потребления. не успел добавить про это до твоего сообщения. а код да, согласен, легко изменить. :oops: а сишного кода тут на всё про всё строк на 100, максимум на 200 затягивает, а писанины туууууут... уже на 16 страниц

Re: Магический кристалл

=DeaD= » 16 мар 2010, 14:20

Да какие нафиг 200 строк кода? Нет если конечно каждое присваивание сопровождать парой абзацев комментов из даташита - тогда да, можно нарыть.

Re: Магический кристалл

Angel71 » 16 мар 2010, 14:30

100 эт про запас, на всякий случай. кто знает, может еще пункты 4,5,6,.. есть.
:) в общем не знаю кто как, а я пока вижу только 2 варианта. если ТС хочет куб, то учитывая какими темпами всё движется, будет проще заказать. если хочет научиться нормально программировать всякие электронные штуки, то для начала брать буки и расписывать ручку "учиться, учиться, учиться,..."

Re: Магический кристалл

rig » 16 мар 2010, 14:35

непонятно утверждение работоспособности кода, как проверялось?
Код: Выделить всёРазвернуть
Charge:    sbis PIND,2  ; получаем данные с порта Столба/ножки PD2 и сравнение/сама проверка
           rjmp Charge_2_check  ; есть замыкание / Кристалл в Столбе
           rjmp Charge_Finish  ; иначе: нет замыкания


пробежался немножко, непонятны мне эти строки, с завидной регулярностью сквозящие через весь код.
тупо скачем чтоли в никуда?
Код: Выделить всёРазвернуть
RJMP k Relative Jump PC ← PC + k + 1


Rambler\'s Top100 Mail.ru counter