Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: PIC16F887. Long call.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры
JohnKorsh
Добрый день! Код для PIC16F887 после ассемблирования пересёк границу банка памяти.
Как правильно написать call, чтобы вазвать поцедуру из другого банка памяти и верннуться в вызывавший банк?
И как то же самое проделать с goto?
Если можно, то с "кусками" ассемблера.
Driver_GV
Цитата(JohnKorsh @ May 6 2011, 08:08) *
Добрый день! Код для PIC16F887 после ассемблирования пересёк границу банка памяти.
Как правильно написать call, чтобы вазвать поцедуру из другого банка памяти и верннуться в вызывавший банк?


Для перехода в следующий банк:

Код
;**********************************************************************
            ORG     0x100
;**********************************************************************
START
            PAGESEL        _INIT
            CALL                  _INIT^800
            PAGESEL        START

......
;**********************************************************************
            ORG     0x800
;**********************************************************************
                    _INIT
..
..

                    RETURN

;*****


Код
            PAGESEL        LCD_INIT
            GOTO                  LCD_INIT^800





Для перехода через банк заменить ^800 на ^1000
Для перехода через 2 банка заменить ^800 на ^1800
Integro
Непонятно...) этош 16-ый pic тамже вроде по банкам только регистры расбросанны

так и пишиш :
org 0x0
goto main
...
main:
call _delay5us

...
_delay5us:
nop
nop
nop
nop
return

...
end
или я эт дурак?)
xemul
Цитата(Integro @ May 6 2011, 09:27) *
Непонятно...) этош 16-ый pic тамже вроде по банкам только регистры расбросанны

В системе команд мелких пиков разрядность адреса в инструкциях call и goto составляет 11 бит, поэтому память программ режется на 2К страницы, выбор которых выполняется в PCLATH.
Не ленитесь заглядывать в даташиты.
Ruslan1
Цитата(JohnKorsh @ May 6 2011, 08:08) *
Добрый день! Код для PIC16F887 после ассемблирования пересёк границу банка памяти.
Как правильно написать call, чтобы вазвать поцедуру из другого банка памяти и верннуться в вызывавший банк?
И как то же самое проделать с goto?
Если можно, то с "кусками" ассемблера.


Эх, ностальгия, смахнул подступившую слезу, достал с полки архивный CD-ROM многолетней давности и вытащил из архива макросы, которые я последний раз обновлял 9 лет назад. То что вам нужно, в начале идет, CALL и GOTO с учетом страниц (PxxCALL, PxxGOTO).
Там же и остальное, что использовал, вдруг чего пригодится.

Нажмите для просмотра прикрепленного файла

там где в комментарии написано ";C ВКЛЮЧЕНИЕМ ПЕРВОЙ СТРАНИЦЫ ОЗУ (ЕСЛИ НУЖНО)" на самом деле имеется в виду любая из четырех страниц, макросы начинали писаться когда пики были маленькими, потом макросы подредактировал, а комментарии поленился sm.gif


Но мой вам совет: идите-ка вы в Си, бросайте на чистом ассме писать. Вставки ассмовские раз в пять лет приходится делать, но не каждый год.
JohnKorsh
Спасибо.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.