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

Обсуждаем рождающиеся мысли и результаты экспериментов.

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

Сообщение Michael_K » 11 мар 2010, 01:12

Если частота проца 8 мегагерц,
то, чтобы сделать задержку написать что-то типа:

Код: Выделить всё
wait_ms:
   mov   r25,r24
wms_l:   ldi   r24,200
   rcall   wait_us
   rcall   wait_us
   rcall   wait_us
   rcall   wait_us
   dec   r25
   brne   wms_l
   ret

wait_us:
   dec   r24
   breq   wus_e
   nop
   nop
   nop
   nop
   rjmp   wait_us
wus_e:   ret


Здесь описаны две функции:
wait_ms
и
wait_us

Обе принимают один аргумент (количество милли- или микросекунд, соответственно)
в регистре r24 и обнуляют его. Функция wait_ms кроме того портит (обнуляет) регистр r25

Например, чтобы получить задержку в одну секунду можно вызвать
функцию wait_ms с аргументом 250 четыре раза подряд.

Код: Выделить всё
ldi r24,250
rcall wait_ms
ldi r24,250
rcall wait_ms
ldi r24,250
rcall wait_ms
ldi r24,250
rcall wait_ms


Добавлено спустя 3 минуты 8 секунд:
Vovan писал(а):...судя по тому ЧТО Вы в Temp загружаете...

Дело даже не в этом - тут без вложенных циклов нереально заметные глазу задержки получить.
Кстати, у "кота" В КОНЦЕ СТРАНИЦЫ циклы-то вложенные!

Добавлено спустя 15 минут 27 секунд:
Стек проинициализировать не забудьте!!!
Аватара пользователя
Michael_K
 
Сообщения: 6028
Зарегистрирован: 07 окт 2009, 00:29
Откуда: СПб

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

Сообщение GrayHunter » 11 мар 2010, 01:41

Если частота проца 8 мегагерц,
У меня так (на ATmega8):
888.png
888.png (4.8 КиБ) Просмотров: 1943
Может быть не стоит ставить 8 Мгц? всё-таки вроде как питания будет хватить намого меньше, а ничего больше не изменится...или как?

Я прошил таким кодом:
Код: Выделить всё
.include "m8def.inc"  ; подключаем заголовочный файл

.def     Temp=R16  ; разное

.cseg  ; начало программного сегмента
.org 0  ; задает начальный адрес. В данном случае он = 0

ldi Temp,0b00000001
out DDRB,Temp

again:                                ldi Temp,0b00000001
                                      out PortB,Temp                                       
ldi r24,250
rcall wait_ms
ldi r24,250
rcall wait_ms
ldi r24,250
rcall wait_ms
ldi r24,250
rcall wait_ms                                                                                                                                     
                                       ldi Temp,0b00000000
                                       out PortB,Temp
ldi r24,250
rcall wait_ms
ldi r24,250
rcall wait_ms
ldi r24,250
rcall wait_ms
ldi r24,250
rcall wait_ms                                                                                                     
                                      rjmp again

wait_ms:
   mov   r25,r24
wms_l:   ldi   r24,200
   rcall   wait_us
   rcall   wait_us
   rcall   wait_us
   rcall   wait_us
   dec   r25
   brne   wms_l
   ret

wait_us:
   dec   r24
   breq   wus_e
   nop
   nop
   nop
   nop
   rjmp   wait_us
wus_e:   ret

Результат не изменился - светодиод горит, не моргая.
Что я не правильно сделал?
GrayHunter
 
Сообщения: 231
Зарегистрирован: 06 июн 2009, 20:42
Откуда: Москва

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

Сообщение Michael_K » 11 мар 2010, 01:59

В принципе 8МГц для просто моргания лампочкой - это избыток...
Просто по умолчанию так стоит, поэтому часто так и пользуют.

Стек не проинициализировали.
В самом начале нужно что-то типа
Код: Выделить всё
   
ldi Temp,чего-то там       ;инициализация стека
out SPL,Temp
ldi Temp,чего-то там       ;инициализация стека
out SPH,Temp


Стек нужен, чтобы после вызова подпрограммы управление возвращалось обратно...

Добавлено спустя 3 минуты 41 секунду:
Посмотрел для меги8:
Код: Выделить всё
ldi Temp,0x5F       ;инициализация стека
out SPL,Temp
ldi Temp,0x04       ;инициализация стека
out SPH,Temp
Аватара пользователя
Michael_K
 
Сообщения: 6028
Зарегистрирован: 07 окт 2009, 00:29
Откуда: СПб

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

Сообщение Angel71 » 11 мар 2010, 07:32

повторю еще разочек свой вредный совет. сделай частоту как можно меньше, в разумных пределах.
Аватара пользователя
Angel71
 
Сообщения: 10668
Зарегистрирован: 18 апр 2009, 22:18

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

Сообщение avr123.nm.ru » 11 мар 2010, 09:44

Michael_K писал(а):В принципе 8МГц для просто моргания лампочкой - это избыток...
Просто по умолчанию так стоит,


Где такая частота по-умолчанию ?
Читайте !
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва

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

Сообщение GrayHunter » 11 мар 2010, 10:43

А зачем точность в указании памяти для стека? Можно ли так:
ldi Temp,RamEnd
out SPL,Temp
ldi Temp, RamEnd
out SPH,Temp


Или для SPH нужно как-иначе универсально память указывать?
GrayHunter
 
Сообщения: 231
Зарегистрирован: 06 июн 2009, 20:42
Откуда: Москва

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

Сообщение Michael_K » 11 мар 2010, 10:54

avr123.nm.ru писал(а):Где такая частота по-умолчанию ?

Ой, и правда мегагерц :)

Или для SPH нужно как-иначе универсально память указывать?

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

Запись
ldi Temp,RamEnd - она не слишком корректна.
(так как RamEnd больше 255 и явно не лезет в однобайтный регистр)
Будет оно так работать, нет или будет через ворнинги - теоретически может зависеть от компилятора.

Я, честно, не помню какие конкретно компиляторы любят такую запись,
каким надо говорить "lo8(RamEnd)", каким "low(RAMEND)" - мне лично проще заглянуть
в даташит и написать циферку 0x5F, чем шариться по многочисленным вложенным друг в друга
хеадерам... :)
Аватара пользователя
Michael_K
 
Сообщения: 6028
Зарегистрирован: 07 окт 2009, 00:29
Откуда: СПб

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

Сообщение Duhas » 11 мар 2010, 12:07

ну в студии корректно переверивается

ldi tmp, low(RAMEND)
out SPL, tmp
ldi tmp, high(RAMEND)
out SPH, tmp


ПС ППЦ!!! так и тянет ТАб нажать када код пишу ))) на каждой строчке хоть раз да нажал )
«Как сердцу выразить себя? … Мысль изреченная есть ложь!»
В этом мире меня подводит доброта и порядочность...
"двое смотрят в лужу, один видит лужу, другой отраженные в ней звезды"
Аватара пользователя
Duhas
 
Сообщения: 6338
Зарегистрирован: 15 сен 2007, 13:03
Откуда: Красноярск
прог. языки: ASM(МК), C(PC)
ФИО: Гагарский Андрей Александрович

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

Сообщение Vovan » 11 мар 2010, 13:21

2 GrayHunter:
asm+hex
Вложения
Led1.zip
(617 байт) Скачиваний: 4
_________
Sincerely,
Vovan
Аватара пользователя
Vovan
 
Сообщения: 3340
Зарегистрирован: 05 окт 2005, 12:03
Откуда: Литва
прог. языки: asm

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

Сообщение Myp » 11 мар 2010, 15:06

хоспаде
я думал тут уже всё готово давно :shock:
а тут тока ещё вложенные циклы и задерки на асме проходят)))

в васике бы за два вечера накидали прожку))
<telepathmode>На вопросы отвечает Бригадир Телепатов!</telepathmode>
Всё уже придумано до нас!
Аватара пользователя
Myp
скрытый хозяин вселенной :)
 
Сообщения: 18018
Зарегистрирован: 18 сен 2006, 12:26
Откуда: Тверь по прозвищу Дверь
прог. языки: псевдокод =) сила в алгоритме!
ФИО: глубокоуважаемый Фёдор Анатольевич

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

Сообщение =DeaD= » 11 мар 2010, 15:41

+1 или в Си, но:
"человек выбрал Асм" (с) :D
Проект [[Open Robotics]] - Универсальные модули для построения роботов
Аватара пользователя
=DeaD=
 
Сообщения: 24218
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов

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

Сообщение Duhas » 11 мар 2010, 17:13

смейтесь смейтесь )
«Как сердцу выразить себя? … Мысль изреченная есть ложь!»
В этом мире меня подводит доброта и порядочность...
"двое смотрят в лужу, один видит лужу, другой отраженные в ней звезды"
Аватара пользователя
Duhas
 
Сообщения: 6338
Зарегистрирован: 15 сен 2007, 13:03
Откуда: Красноярск
прог. языки: ASM(МК), C(PC)
ФИО: Гагарский Андрей Александрович

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

Сообщение GrayHunter » 11 мар 2010, 19:37

Спасибо за помощь - с морганием разобрался.
Проверил свою программу - всё работает как запланировано. :)

Осталось 3 момента - момент №1:
Подскажите, пожалуйста, как сделать так, чтобы МК мог измерять вольтаж (и, следовательно, яркость светодиода). Мне это нужно, чтобы если питание уже село настолько, что светодиод не может светиться достаточно ярко, чтобы МК обесточил светодиод, дабы он не выглядел жалко/плохо/тускло.
Как такое сделать?

P.S.- поставил 1 МГц, для экономии питания.
GrayHunter
 
Сообщения: 231
Зарегистрирован: 06 июн 2009, 20:42
Откуда: Москва

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

Сообщение Vovan » 11 мар 2010, 19:53

а остальные 2? "агласите весь список, пжалуста"(с) :)
_________
Sincerely,
Vovan
Аватара пользователя
Vovan
 
Сообщения: 3340
Зарегистрирован: 05 окт 2005, 12:03
Откуда: Литва
прог. языки: asm

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

Сообщение GrayHunter » 11 мар 2010, 20:32

Момент №2:
как сделать "дыхание" светодиода (чтобы он "дышал")? Т.е. постепенно сначала увеличивалась бы яркость, а потом уменьшалась.
Причём очень желательно, чтобы максимальная яркость при дыхании ограничивалась бы "зарядом кристалла" (например: 4 уровня максимальной яркости).

Момент №3:
задумка Магического Кристалла предполагает ограниченное время его работы (свечения), чтобы игрокам проходилось его заряжать в зарядных столбах. Но заряжать не питание, а "заряд кристалла", т.е. "количество энергии, содержащейся в кристалле".
Так вот, нужно, чтобы при определённых условиях этот заряд уменьшался или увеличился. Условия я все уже прописал и проверил - с ними всё нормально. А вот как сам заряд сделать - пока не знаю.
Особенность заключается в том, что надо таким образом написать программу, чтобы можно было точно выставить сколько именно заряда расходуется/добавляется при определённом условии, а так же максимально возможный заряд (его бы вообще рандомным в определённых рамках сделать :roll: ).
Например: максимального заряда кристалла хватит либо на 6 часов, если он находится в украшении, либо на 2 минуты, если он нигде не находится (вынут из всего, где он мог бы быть (украшение, идол, зарядный столб)). Если цифрами, то так:
макс. заряд = 12 часов реального времени
1 секунда в украшении = -2 секунды от текущего заряда
1 секунда в нигде = -360 секунд от текущего заряда
1 секунда в зарядном столбе = +2 секунды к текущему заряду, но не больше макс. заряда
Последний раз редактировалось GrayHunter 11 мар 2010, 20:42, всего редактировалось 1 раз.
GrayHunter
 
Сообщения: 231
Зарегистрирован: 06 июн 2009, 20:42
Откуда: Москва

Пред.След.

Вернуться в Идеи

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7