Страница 1 из 1

Добавлено: Пн окт 05, 2009 09:52:23
Настя
Непонятна необходимость
ухода в некую "другую" страницу (org 0x0E00).

Либо на границе страниц (это как мысль)
некий конвертер адресации (по приемке и возврату).

Добавлено: Пн окт 05, 2009 14:39:40
Настя
Вы справедливо сказали, что счетчик команд PC 13 битный.
Счетчик состоит из двух частей PCH+PCL (старшая и младшая части).
Младшая часть 8ми битная, к ней можно обращаться напрямую.
К старшей PCH обращаемся через PCLATH. Это введение.

Рассмотрим связку команд call и retlw k.
По retlw данные из стека помещаются в счетчик команд
и происходит переход (переход рабочей точки программы).
Вы ошибочно полагаете, что по retlw "загружается" 13 бит стека.
Именно по call в стек "прописывается" 11 бит возврата, а не 13.
Старшие два бита "прописываются" из PCLATH, при этом из
PCLATH берутся биты <три и четыре>.
Ваша проблема в том, что при вызове call вам нужно определить
PCLATH. Это не сложно, т.к. вы в программе на ассме всегда
можете определенно подсчитать место вызова-возврата.
Т.е. перед саll тра-та-та сделайте типа
bcf PCLATH,3
bcf PCLATH,4

Для лучшего понимания - посмотрите вложенные картинки.

Добавлено: Пн окт 05, 2009 18:58:30
Настя
Для вас не станет откровением наличие официальной русскоязычной
документации по ссылке http://www.microchip.ru/lit/articles/
На странице в секции "PIC - полные переводы даташитов на
некоторые серии микроконтроллеров" взят документ
PIC16F627_628.pdf , где на стр 25 можно прочитать "художественный"
перевод вашего фрагмента, согласно которому "Чтение из стека и
запись в счетчик команд PC происхходит при выполнении инструкций
возвращения из подпрограммы или обработке прерываний (RETURN,
RETLW, RETFIE), при этом значение PCLATH не изменяется"


Что рисует пошаговый симулятор в MPLABe?
Не поленитесь - вместо org 0x0E00
вставьте несколько тысяч нопов. Приколитесь.

Добавлено: Пн окт 05, 2009 20:36:52
Настя
Смысл нопов в том, чтобы было видно куда по retlw
вы вернетесь и проанализировать зависимость
(разумеется в процессе симуляции в MPLAB).

Разбираем дальше ваше
"чистых ячеек" = команд с кодом 3FF ="decf 0x7F, f" .
Согласно вашему даташиту на стр 234
опкод команды nop 00 0000 0xx00 0000 , в 2ичной системе
будем считать что это ноль, а не команда с опкодом 3FF.
Опкоду 3FF (11 1111 1111 1111) соответствует команда ADDLW.

Ваше "decf 0x7F, f" вообще лишено смысла, что по-человечески
звучит как "декрементировать содержимое ячейки ОЗУ с адресом
0x7F и результат сохранить в этой же ячейке".

(под ОЗУ понимается область памяти общего назначения)
(чистыми ячейки станут только тогда, когда вы явно их очистите)