Перейти к содержанию
    

PIC16F887. Long call.

Добрый день! Код для PIC16F887 после ассемблирования пересёк границу банка памяти.

Как правильно написать call, чтобы вазвать поцедуру из другого банка памяти и верннуться в вызывавший банк?

И как то же самое проделать с goto?

Если можно, то с "кусками" ассемблера.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добрый день! Код для 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Непонятно...) этош 16-ый pic тамже вроде по банкам только регистры расбросанны

 

так и пишиш :

org 0x0

goto main

...

main:

call _delay5us

 

...

_delay5us:

nop

nop

nop

nop

return

 

...

end

или я эт дурак?)

Изменено пользователем Integro

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Непонятно...) этош 16-ый pic тамже вроде по банкам только регистры расбросанны

В системе команд мелких пиков разрядность адреса в инструкциях call и goto составляет 11 бит, поэтому память программ режется на 2К страницы, выбор которых выполняется в PCLATH.

Не ленитесь заглядывать в даташиты.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добрый день! Код для PIC16F887 после ассемблирования пересёк границу банка памяти.

Как правильно написать call, чтобы вазвать поцедуру из другого банка памяти и верннуться в вызывавший банк?

И как то же самое проделать с goto?

Если можно, то с "кусками" ассемблера.

 

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

Там же и остальное, что использовал, вдруг чего пригодится.

 

MACDEFS.ZIP

 

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

 

 

Но мой вам совет: идите-ка вы в Си, бросайте на чистом ассме писать. Вставки ассмовские раз в пять лет приходится делать, но не каждый год.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...