Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 02.12.2008, 15:43  
ua_gruzin
Вид на жительство
 
Регистрация: 11.12.2006
Сообщений: 317
Сказал спасибо: 0
Сказали Спасибо 12 раз(а) в 11 сообщении(ях)
ua_gruzin на пути к лучшему
По умолчанию 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, причем завершить основную прогу, типо чтобы небыло указателя на возврат на в тело проги?
Реклама:
ua_gruzin вне форума  
Непрочитано 02.12.2008, 15:53  
Cyber_RAT
Прописка
 
Регистрация: 29.11.2007
Адрес: Могилев. РБ.
Сообщений: 143
Сказал спасибо: 30
Сказали Спасибо 20 раз(а) в 20 сообщении(ях)
Cyber_RAT на пути к лучшему
По умолчанию

а почему нельзя проверить флаг (например T) и уже в зависимости от него перейти туда или сюда?
из процедуры перейти к цикл ноп просто - поставьте на выходе jmp цикл ноп и все.... если не хотите чтобы в стеке был адрес возврата - достаньте его pop r25 pop r25 (или любой ненужный регистр)
Cyber_RAT вне форума  
Непрочитано 02.12.2008, 16:00  
ua_gruzin
Вид на жительство
 
Регистрация: 11.12.2006
Сообщений: 317
Сказал спасибо: 0
Сказали Спасибо 12 раз(а) в 11 сообщении(ях)
ua_gruzin на пути к лучшему
По умолчанию

Да,... Не спорю. Вопрос не в определении условия а куда будем возвращатся.
Поддерживаю идею юзать указатель кода (PC).

Код:
CALL k          0 ≤ k ‹ 64K            PC ‹- k                  STACK ‹- PC+2
Типо в процедуре просто поднять со стека значение PC и ,присвоив ему значение начала "цикла ноп", снова запхнуть в стек. И вызвать ret. В даном случае просто в PC вернет значение уже не возврата в программу а напрямую на "цикл ноп".
Как в данном случае узнать значение PC, которое равно указателю на "цикл ноп" (лебел Go_To_loop???
Правильный ли подход?

Или предлагаете просто jmp а дальше тупо достать указатель РС и все? Просто в данном случае будет конфликт, когда мне надо будет вызвать ещё пограмму дальше... ибо типо нахожусь в другой процедуре.. (которую хоть и насильно прервал).
ua_gruzin вне форума  
Непрочитано 02.12.2008, 16:12  
sanitar249
Почётный гражданин KAZUS.RU
 
Аватар для sanitar249
 
Регистрация: 19.01.2007
Сообщений: 1,747
Сказал спасибо: 2
Сказали Спасибо 46 раз(а) в 35 сообщении(ях)
sanitar249 на пути к лучшему
По умолчанию

А что команда абсолютного перехода JMP уже отменена ?
Она "тупо" подставит в РС требуемый адрес без запоминания в стек места перехода...
Удачи!
__________________
Я, думаю, нужно подумать...
sanitar249 вне форума  
Непрочитано 02.12.2008, 16:32  
ua_gruzin
Вид на жительство
 
Регистрация: 11.12.2006
Сообщений: 317
Сказал спасибо: 0
Сказали Спасибо 12 раз(а) в 11 сообщении(ях)
ua_gruzin на пути к лучшему
По умолчанию

Да не спорю.
Но как сделать так... подобно до jmp, но чтобы информация записалась не в РС а в регистр. Ибо после записи в РС по следующем цикле - сразу перейдет на РС.
Реально как-то получить адрес лебела в регистрах?
ua_gruzin вне форума  
Непрочитано 02.12.2008, 20:06  
ua_gruzin
Вид на жительство
 
Регистрация: 11.12.2006
Сообщений: 317
Сказал спасибо: 0
Сказали Спасибо 12 раз(а) в 11 сообщении(ях)
ua_gruzin на пути к лучшему
По умолчанию

Дошел до того, что сделаю по прерыванию от таймера.
Типо в прерыванию идет оценка ситуации.
Дальше ибо возврат из прерывания, либо переход на другой конец кода.
Постал вопрос.
Паралельно данному прерыванию идут другие (около 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
Так? Прога дальше будет выполнятся?
Ресет не последует? Стоит ли занулить все флаги прерывания и как это лучше сделать?
ua_gruzin вне форума  
Непрочитано 02.12.2008, 21:57  
ra9mig
Прописка
 
Регистрация: 24.09.2008
Сообщений: 116
Сказал спасибо: 0
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
ra9mig на пути к лучшему
По умолчанию

Сообщение от 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 в какой нибудь процедуре ожидания окончания трассакции и не дождавшись вываливался в основной цикл....
__________________
Если мы вам не подходим, вы нам вовсе не нужны!
Услышал и забыл, увидел и запомнил, сделал и понял!
Нейрон - штука тонкая!
Чудес на свете не бывает!
ra9mig вне форума  
Непрочитано 02.12.2008, 22:27  
ua_gruzin
Вид на жительство
 
Регистрация: 11.12.2006
Сообщений: 317
Сказал спасибо: 0
Сказали Спасибо 12 раз(а) в 11 сообщении(ях)
ua_gruzin на пути к лучшему
По умолчанию


Так точно.

Сделал по коду как я написал выше - и все работает без проблем. Правда нада потом вызвать sei.

Тему можно считать закрытой.
ua_gruzin вне форума  
Непрочитано 03.12.2008, 01:34  
picavr
Почётный гражданин KAZUS.RU
 
Аватар для picavr
 
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
picavr на пути к лучшему
По умолчанию

Сообщение от ua_gruzin
Реально как-то получить адрес лебела в регистрах?
Делов то ....
Лабел RCALL ReadAdresPC



ReadAdresPC:
pop ZL
pop Zh
push Zh
push ZL
ret

В Z имееш адрес лабела, дальше по смещению... Ещё в

ZX Spectrum 48/128 такими вещами баловались ))))
picavr вне форума  
Непрочитано 03.12.2008, 02:21  
ua_gruzin
Вид на жительство
 
Регистрация: 11.12.2006
Сообщений: 317
Сказал спасибо: 0
Сказали Спасибо 12 раз(а) в 11 сообщении(ях)
ua_gruzin на пути к лучшему
По умолчанию

Мда.., все гениальное простое как веник - мало но функциональное
Спасиб.
ua_gruzin вне форума  
 

Закладки
Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужен совет. sciff Отвлекитесь, эмбеддеры! 11 20.06.2009 12:59
Нужен совет! yushkin Делимся опытом 20 05.01.2009 01:58
Генератор импульсов на 12Fxxx (Вопрос к Гуру( спецам)) vi-gor Микроконтроллеры, АЦП, память и т.д 15 15.11.2008 05:46
[Решено] Как становятся гуру форума? smg123 Отвлекитесь, эмбеддеры! 7 25.11.2007 14:23
Вопрос к Гуру Snixers Микроконтроллеры, АЦП, память и т.д 1 09.04.2006 23:46


Часовой пояс GMT +4, время: 15:51.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot