roboforum.ru

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

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

Ответить

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 секунд:
Стек проинициализировать не забудьте!!!

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

GrayHunter » 11 мар 2010, 01:41

Если частота проца 8 мегагерц,
У меня так (на ATmega8):
888.png
888.png (4.8 КиБ) Просмотров: 1940
Может быть не стоит ставить 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: Магический кристалл

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

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

Angel71 » 11 мар 2010, 07:32

повторю еще разочек свой вредный совет. сделай частоту как можно меньше, в разумных пределах.

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

avr123.nm.ru » 11 мар 2010, 09:44

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


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

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

GrayHunter » 11 мар 2010, 10:43

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


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

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

Michael_K » 11 мар 2010, 10:54

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

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

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

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

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

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

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

Duhas » 11 мар 2010, 12:07

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

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


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

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

Vovan » 11 мар 2010, 13:21

2 GrayHunter:
asm+hex
Вложения
Led1.zip
(617 байт) Скачиваний: 4

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

Myp » 11 мар 2010, 15:06

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

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

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

=DeaD= » 11 мар 2010, 15:41

+1 или в Си, но:
"человек выбрал Асм" (с) :D

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

Duhas » 11 мар 2010, 17:13

смейтесь смейтесь )

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

GrayHunter » 11 мар 2010, 19:37

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

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

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

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

Vovan » 11 мар 2010, 19:53

а остальные 2? "агласите весь список, пжалуста"(с) :)

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 раз.


Rambler\'s Top100 Mail.ru counter