roboforum.ru

Технический форум по робототехнике.
Текущее время: 27 ноя 2024, 14:30

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 266 ]  На страницу Пред.  1 ... 7, 8, 9, 10, 11, 12, 13 ... 18  След.
Автор Сообщение
 Заголовок сообщения: Re: Магический кристалл
СообщениеДобавлено: 11 мар 2010, 01:12 
Не в сети
Аватара пользователя

Зарегистрирован: 07 окт 2009, 00:29
Сообщения: 6028
Откуда: СПб
Если частота проца 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 секунд:
Стек проинициализировать не забудьте!!!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Магический кристалл
СообщениеДобавлено: 11 мар 2010, 01:41 
Не в сети

Зарегистрирован: 06 июн 2009, 20:42
Сообщения: 231
Откуда: Москва
Цитата:
Если частота проца 8 мегагерц,
У меня так (на ATmega8):
Вложение:
888.png
888.png [ 4.8 КиБ | Просмотров: 1950 ]
Может быть не стоит ставить 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

Результат не изменился - светодиод горит, не моргая.
Что я не правильно сделал?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Магический кристалл
СообщениеДобавлено: 11 мар 2010, 01:59 
Не в сети
Аватара пользователя

Зарегистрирован: 07 окт 2009, 00:29
Сообщения: 6028
Откуда: СПб
В принципе 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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Магический кристалл
СообщениеДобавлено: 11 мар 2010, 07:32 
Не в сети
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Магический кристалл
СообщениеДобавлено: 11 мар 2010, 09:44 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
Michael_K писал(а):
В принципе 8МГц для просто моргания лампочкой - это избыток...
Просто по умолчанию так стоит,


Где такая частота по-умолчанию ?

_________________
Читайте !


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Магический кристалл
СообщениеДобавлено: 11 мар 2010, 10:43 
Не в сети

Зарегистрирован: 06 июн 2009, 20:42
Сообщения: 231
Откуда: Москва
А зачем точность в указании памяти для стека? Можно ли так:
Цитата:
ldi Temp,RamEnd
out SPL,Temp
ldi Temp, RamEnd
out SPH,Temp


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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Магический кристалл
СообщениеДобавлено: 11 мар 2010, 10:54 
Не в сети
Аватара пользователя

Зарегистрирован: 07 окт 2009, 00:29
Сообщения: 6028
Откуда: СПб
avr123.nm.ru писал(а):
Где такая частота по-умолчанию ?

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

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

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

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

Я, честно, не помню какие конкретно компиляторы любят такую запись,
каким надо говорить "lo8(RamEnd)", каким "low(RAMEND)" - мне лично проще заглянуть
в даташит и написать циферку 0x5F, чем шариться по многочисленным вложенным друг в друга
хеадерам... :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Магический кристалл
СообщениеДобавлено: 11 мар 2010, 12:07 
Не в сети
Аватара пользователя

Зарегистрирован: 15 сен 2007, 13:03
Сообщения: 6338
Откуда: Красноярск
прог. языки: ASM(МК), C(PC)
ФИО: Гагарский Андрей Александрович
ну в студии корректно переверивается

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


ПС ППЦ!!! так и тянет ТАб нажать када код пишу ))) на каждой строчке хоть раз да нажал )

_________________
«Как сердцу выразить себя? … Мысль изреченная есть ложь!»
В этом мире меня подводит доброта и порядочность...
"двое смотрят в лужу, один видит лужу, другой отраженные в ней звезды"


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Магический кристалл
СообщениеДобавлено: 11 мар 2010, 13:21 
Не в сети
Аватара пользователя

Зарегистрирован: 05 окт 2005, 12:03
Сообщения: 3340
Откуда: Литва
прог. языки: asm
2 GrayHunter:
asm+hex


Вложения:
Led1.zip [617 байт]
Скачиваний: 4

_________________
_________
Sincerely,
Vovan
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Магический кристалл
СообщениеДобавлено: 11 мар 2010, 15:06 
Не в сети
скрытый хозяин вселенной :)
Аватара пользователя

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

в васике бы за два вечера накидали прожку))

_________________
<telepathmode>На вопросы отвечает Бригадир Телепатов!</telepathmode>
Всё уже придумано до нас!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Магический кристалл
СообщениеДобавлено: 11 мар 2010, 15:41 
Не в сети
Аватара пользователя

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

_________________
Проект [[Open Robotics]] - Универсальные модули для построения роботов


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Магический кристалл
СообщениеДобавлено: 11 мар 2010, 17:13 
Не в сети
Аватара пользователя

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

_________________
«Как сердцу выразить себя? … Мысль изреченная есть ложь!»
В этом мире меня подводит доброта и порядочность...
"двое смотрят в лужу, один видит лужу, другой отраженные в ней звезды"


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Магический кристалл
СообщениеДобавлено: 11 мар 2010, 19:37 
Не в сети

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

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

P.S.- поставил 1 МГц, для экономии питания.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Магический кристалл
СообщениеДобавлено: 11 мар 2010, 19:53 
Не в сети
Аватара пользователя

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

_________________
_________
Sincerely,
Vovan


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Магический кристалл
СообщениеДобавлено: 11 мар 2010, 20:32 
Не в сети

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

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


Последний раз редактировалось GrayHunter 11 мар 2010, 20:42, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 266 ]  На страницу Пред.  1 ... 7, 8, 9, 10, 11, 12, 13 ... 18  След.

Часовой пояс: UTC + 4 часа


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

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


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
phpBB SEO