Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
02.12.2008, 15:43
|
|
Вид на жительство
Регистрация: 11.12.2006
Сообщений: 317
Сказал спасибо: 0
Сказали Спасибо 12 раз(а) в 11 сообщении(ях)
|
AVRasm совет гуру
Привет.
И так.
Сидю кодю...
Возникла задача.....
Вопрос такого плана:
Есть код реализующий прогу. Есть процедуры.
Вызываю процедуру, в проге. В процедуре оказываеться, что надо завершить прогу (перейти на цикл в конце проги не возвращаясь в прогу).
Примерно так:
"прога"
"прога"
"прога"
вызов процедуры
возврат с процедуры
"прога"
"прога"
"цикл ноп"
Нада чтобы с процедуры выйшло на "цикл ноп" (при выполении некоторого условия) или на "возврат с процедуры" при отсутствии условия.
Как сделать?
Примерно код, может будет картина чотче:
Код:
|
;---------------------------
procedure_1:
ldi
ldi
ret
;---------------------------
mov
mov
mov
call procedure_1
mov
mov
mov
;---------------------------
Go_To_loop:
nop
jmp Go_To_loop
;--------------------------- |
Как выйти на Go_To_loop, причем завершить основную прогу, типо чтобы небыло указателя на возврат на в тело проги?
|
|
|
|
02.12.2008, 15:53
|
|
Прописка
Регистрация: 29.11.2007
Адрес: Могилев. РБ.
Сообщений: 143
Сказал спасибо: 30
Сказали Спасибо 20 раз(а) в 20 сообщении(ях)
|
а почему нельзя проверить флаг (например T) и уже в зависимости от него перейти туда или сюда?
из процедуры перейти к цикл ноп просто - поставьте на выходе jmp цикл ноп и все.... если не хотите чтобы в стеке был адрес возврата - достаньте его pop r25 pop r25 (или любой ненужный регистр)
|
|
|
|
02.12.2008, 16:00
|
|
Вид на жительство
Регистрация: 11.12.2006
Сообщений: 317
Сказал спасибо: 0
Сказали Спасибо 12 раз(а) в 11 сообщении(ях)
|
Да,... Не спорю. Вопрос не в определении условия а куда будем возвращатся.
Поддерживаю идею юзать указатель кода (PC).
Код:
|
CALL k 0 ≤ k ‹ 64K PC ‹- k STACK ‹- PC+2 |
Типо в процедуре просто поднять со стека значение PC и ,присвоив ему значение начала "цикла ноп", снова запхнуть в стек. И вызвать ret. В даном случае просто в PC вернет значение уже не возврата в программу а напрямую на "цикл ноп".
Как в данном случае узнать значение PC, которое равно указателю на "цикл ноп" (лебел Go_To_loop ???
Правильный ли подход?
Или предлагаете просто jmp а дальше тупо достать указатель РС и все? Просто в данном случае будет конфликт, когда мне надо будет вызвать ещё пограмму дальше... ибо типо нахожусь в другой процедуре.. (которую хоть и насильно прервал).
|
|
|
|
02.12.2008, 16:12
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.01.2007
Сообщений: 1,747
Сказал спасибо: 2
Сказали Спасибо 46 раз(а) в 35 сообщении(ях)
|
А что команда абсолютного перехода JMP уже отменена ?
Она "тупо" подставит в РС требуемый адрес без запоминания в стек места перехода...
Удачи!
__________________
Я, думаю, нужно подумать...
|
|
|
|
02.12.2008, 16:32
|
|
Вид на жительство
Регистрация: 11.12.2006
Сообщений: 317
Сказал спасибо: 0
Сказали Спасибо 12 раз(а) в 11 сообщении(ях)
|
Да не спорю.
Но как сделать так... подобно до jmp, но чтобы информация записалась не в РС а в регистр. Ибо после записи в РС по следующем цикле - сразу перейдет на РС.
Реально как-то получить адрес лебела в регистрах?
|
|
|
|
02.12.2008, 20:06
|
|
Вид на жительство
Регистрация: 11.12.2006
Сообщений: 317
Сказал спасибо: 0
Сказали Спасибо 12 раз(а) в 11 сообщении(ях)
|
Дошел до того, что сделаю по прерыванию от таймера.
Типо в прерыванию идет оценка ситуации.
Дальше ибо возврат из прерывания, либо переход на другой конец кода.
Постал вопрос.
Паралельно данному прерыванию идут другие (около 10-ти). Их порядок определить не реально, ибо идут когда им вздумается (по таймерах).
Как онулить полностью стек, так чтобы кусок проги, который мы вызовем типо выполнялся с "чистого листа"???
Код:
|
ldi TEMP_A,low(RAMEND) ; Stack
out SPL,TEMP_A
ldi TEMP_A,high(RAMEND)
out SPH,TEMP_A
;-----------------------------------
; онулим прерывания
;-----------------------------------
clr TEMP_A
out TIFR0, TEMP_A
out TIFR1, TEMP_A
out TIFR2, TEMP_A
out TIFR3, TEMP_A
out TIFR4, TEMP_A
out TIFR5, TEMP_A
out TIFR6, TEMP_A
out SREG, TEMP_A |
Так? Прога дальше будет выполнятся?
Ресет не последует? Стоит ли занулить все флаги прерывания и как это лучше сделать?
|
|
|
|
02.12.2008, 21:57
|
|
Прописка
Регистрация: 24.09.2008
Сообщений: 116
Сказал спасибо: 0
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
Сообщение от ua_gruzin
|
Дошел до того, что сделаю по прерыванию от таймера.
|
Прикольно! Но с rjmp(jmp) и возвратом из стека передыдущего адреса (или смене значения SPx при нескольких "вложениях") проще, на мой взгляд (100 раз так делал! )
Сообщение от ua_gruzin
|
Их порядок определить не реально, ибо идут когда им вздумается (по таймерах).
Как онулить полностью стек, так чтобы кусок проги, который мы вызовем типо выполнялся с "чистого листа"???
|
Во дает!
Ну а чудный флажок I для чего.
Дальше как написано (например)...
Код:
|
ldi TEMP_A,low(RAMEND) ; Stack
out SPL,TEMP_A
ldi TEMP_A,high(RAMEND)
out SPH,TEMP_A |
Сообщение от ua_gruzin
|
Ресет не последует? Стоит ли занулить все флаги прерывания и как это лучше сделать?
|
А кто его сюда "звал"!
Ну а с флагами сам уж думай...
P.S. Задача без конкретики! Я примерно так делал, когда уходил в Wait в какой нибудь процедуре ожидания окончания трассакции и не дождавшись вываливался в основной цикл....
__________________
Если мы вам не подходим, вы нам вовсе не нужны!
Услышал и забыл, увидел и запомнил, сделал и понял!
Нейрон - штука тонкая!
Чудес на свете не бывает!
|
|
|
|
02.12.2008, 22:27
|
|
Вид на жительство
Регистрация: 11.12.2006
Сообщений: 317
Сказал спасибо: 0
Сказали Спасибо 12 раз(а) в 11 сообщении(ях)
|
Так точно.
Сделал по коду как я написал выше - и все работает без проблем. Правда нада потом вызвать sei.
Тему можно считать закрытой.
|
|
|
|
03.12.2008, 01:34
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
|
Сообщение от ua_gruzin
|
Реально как-то получить адрес лебела в регистрах?
|
Делов то ....
Лабел RCALL ReadAdresPC
ReadAdresPC:
pop ZL
pop Zh
push Zh
push ZL
ret
В Z имееш адрес лабела, дальше по смещению... Ещё в
ZX Spectrum 48/128 такими вещами баловались ))))
|
|
|
|
03.12.2008, 02:21
|
|
Вид на жительство
Регистрация: 11.12.2006
Сообщений: 317
Сказал спасибо: 0
Сказали Спасибо 12 раз(а) в 11 сообщении(ях)
|
Мда.., все гениальное простое как веник - мало но функциональное
Спасиб.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 15:51.
|
|