"DVDXpert" - компас в мире Hi-Fi и High End техники и другой stereo и home cinema аппаратуры.

ПРОГРАММЫ И СХЕМЫ ПИШЕМ ПЕРВЫЕ ПРОГРАММЫ

20-11-2019

Таким образом осуществляется прямое принудительное смещение программного счетчика на величину, которая была передана в аккумуляторе, относительного того положения где должен был бы находиться программный указатель после считывания команды ADDWF PCL, F. Если, например, было W=0, то программный счетчик не изменится и будет выполнена следующая команда, retlw b'01010000', которая вызовет возврат из подпрограммы с записью в аккумулятор константы '01010000'. Исходный номер шага 0 будет перекодирован в константу, соответствующую необходимым уровням на выходных портах.

Если, например, W=2, то программный счетчик сместится на команду retlw b' 10100000' и номер шага 2 перекодируется в другую константу.

Несмотря на внешнюю простоту, необходимо очень осторожно обращаться с подпрограмми табличной конвертации Дело в том, что в процессе табличной конвертации, при сложении используются только два младших байта программного счетчика. Это означает, что данный метод не позволяет конвертировать более чем 256 значений в одной таблице. И более того, даже если вы конвертируете лишь несколько значений, применение табличной конвертации может привести к полной неработоспособности программы.

Дело в том, что если не принимать особых мер, то подпрограмма табличной конвертации может оказаться в неизвестном заранее фрагменте физической памяти. Может получиться так, что первые несколько команд RETLW kk работают нормально, а при обращении к другим командам RETLW kk этой же таблицы происходит переполнение двух младших байтов регистра PCL, но реального переноса аппаратно не происходит и программный счетчик "вылетает" на случайное значение адреса, что приводит к сбою программы. То есть возникает отвратительная ситуация, когда сбой происходит только в определенном случае. Найти причину такого сбоя бывает очень тяжело. Поэтому, скомпилировав свою программу, откройте окно "Program Memory" программы MPLAB и убедитесь, что ваша подпрограмма табличной конвертации размещена корректно и нигде на ее протяжении не происходит переноса из второго байта программного счетчика. Если это все же случилось, попробуйте в исходном тексте программы переставить местами ее фрагменты так, чтобы таблица перекодировки располагалась корректно.

Казалось бы, можно применить директиву ORG 0x00, где х старшее число в адресе блока, и поместить ее перед началом подпрограммы конвертации, чтобы заставить ассемблер разместить подпрограмму в нужном месте, но этот метод не работает. По крайней мере, он не работает в контроллерах, выпущенных в конце 1998 года начале 1999 года. В имеющемся у автора экземпляре, при внешней корректности программы, во время табличной конвертации при помощи подпрограммы, размещенной с применением директивы ORG 0x00 периодически "слетал" ...указатель стека! А ведь стек всего лишь должен хранить ранее записанные адреса возврата и никак не реагировать на арифметические операции с текущим значением регистра PCL. На практике процессор нормально входил в подпрограмму, нормально вычислял смещенный адрес и уходил на него, но при возврате по команде RETLW kk записывал константу в аккумулятор и возвращался почемуто не на адрес возврата, записанный в стек, а на адрес ООхх, где хх величина смещения, исходного значения, которое использовалось при конвертации. Этого в принципе не должно быть, но это так.


Смотрите также:
 Недостатки аналогового телевидения
 Эфирное цифровое телевидение: DVB-T
 ЦИФРОВЫЕ КОНСТАНТЫ И СИСТЕМЫ СЧИСЛЕНИЯ
 Интерактивный проектор
 Возможности виртуальных студий

Добавить комментарий:
Введите ваше имя:

Комментарий:

Защита от спама - решите пример: