Как определить регистр во всех банках?

56
8

Как я могу определить регистр для всех банков, в сборке, используя PIC16F887 или подобное?

Предполагается, что файл должен быть доступен без изменения бит STATUS.

Я пытаюсь сохранить регистр W во временном файле (W_TEMP), прежде чем вводить процедуру прерывания.

Из документа Microchip:

Регистр пользователя W_TEMP должен быть определен во всех банках и должен быть определен с одинаковым смещением от базового адреса банка (т.е. W_TEMP определяется в 0x70 - 0x7F в Bank0)

спросил(а) 2016-09-16T03:15:00+03:00 3 года, 9 месяцев назад
1
Решение
76

Когда происходит прерывание, нам нужно сохранить W и STATUS, но STATUS уже находится в ОЗУ, и нет инструкции, которая перемещает регистр из места расположения RAM в другой, поэтому его сначала нужно скопировать в W а затем в конечный пункт назначения.
Это означает, что мы должны сохранить W и STATUS в этом точном порядке.

Сохранить W Переместить STATUS в W Сохранить W (= STATUS)

Мы не можем модифицировать STATUS прежде чем переместить его в W иначе мы никогда не сможем восстановить его, теперь потенциально потерянное, исходное значение; поскольку мы перемещаем STATUS после сохранения W мы не можем изменить его, чтобы выбрать конкретный банк для сохранения W

Когда происходит прерывание, любой банк может быть выбран, поэтому мы должны иметь возможность сохранять W в любом банке.
Если мы используем

 #define W_TEMP 0x40

Это означает, что адреса 0x40, 0x80 + 0x40, 0x100 + 0x100, 0x180 + 0x40 должны рассматриваться как зарезервированные нашей программой, так как эти места могут быть внезапно перезаписаны прерыванием.

В этом смысл

Регистр пользователя W_TEMP должен быть определен во всех банках и должен быть определен с одинаковым смещением от базового адреса банка

и это, может быть, не очень понятно, предупреждение о том, что W_TEMP живет во всех банках (или вообще нет банка, если он не сохраняется). Чтобы "определить" регистр, нужно установить для него смещение, число.

Когда дело доходит до сохранения STATUS мы должны быть осторожны, мы не можем сохранить его в любом банке, потому что ISR изменит его, и мы потеряем исходные бит RP<1:0> которые сообщают банку, в котором сохранено STATUS.
Поэтому нам нужно выбрать банк и использовать его, обычно это банк 0, потому что у некоторых чипов есть оперативная память только там.
Поскольку для настройки банка требуется изменить STATUS это кажется неразрешимой проблемой.
К счастью, нам нужно переместить STATUS в W чтобы сохранить его, поэтому, когда он находится в W мы можем использовать инструкцию BCF для установки текущего банка без изменения исходного STATUS (теперь в W).

Пример кода

#define W_TEMP 0x70
#define STATUS_TEMP 0x71

MOVWF W_TEMP ;Save W
SWAPF STATUS, W
BCF STATUS, RP0 ;Set bank0
MOVWF STATUS_TEMP ;Save STATUS

Примечание. Использование SWAPF для сохранения STATUS в W необходимо, потому что MOVF изменяет флаг Z и не может использоваться во время восстановления.

После того, как ISR восстановит статус, приведенные выше операции должны быть выполнены в обратном порядке

SWAPF STATUS_TEMP, W
MOVWF STATUS ;Restore STATUS (and bank)

;There is no load W from memory without affecting flags

SWAPF W_TEMP, F ;We swap W_TEMP in place (no flags affected)
SWAPF W_TEMP, W ;Then swap W_TEMP in W (this restoring W)

Некоторые устройства, такие как PIC16F887, имеют часть ОЗУ, распределенную по всем банкам.
Эта часть - последние 16 байт каждого банка, смещение 0x70-0x7f.
В этом случае, если W_TEMP и STATUS_TEMP определены там, нам не нужно переключать банк во время сохранения контекста:

#define W_TEMP 0x70
#define STATUS_TEMP 0x71

MOVWF W_TEMP
SWAPF STATUS, W
MOVWF STATUS_TEMP

Это объясняет

(т.е. W_TEMP определяется в 0x70 - 0x7F в Bank0)

часть цитаты.

Более подробную информацию об обработке прерывания можно найти в этом документе Microchip.
Помните, что некоторые комментарии в лучшем случае загадочны, вводящие в заблуждение в худшем.

ответил(а) 2016-09-16T17:24:00+03:00 3 года, 9 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема