PIC - две таблицы

  • Crossposted в OUT.LOG

Мир Вашему дому, All!

Требуется работать с таблицой в 256 байт, но адресация работает только в пределах 128. Разбил таблицу на две части. Hиже фрагмент обслуживающего кода. А теперь проблема: при обращении ко второй половине таблицы программа вылезает черт знает куда и зацикливается. Если половинки таблицы переименовать, сохранив их взаимное расположение, зацикливание происходит при обращении все равно к старшей (по адресу в STEPCOUNT) половине таблицы. Если в обоих случаях обращение идет к одной (любой) половине - проблем нет. Пробовал два варианта маскирования старшего бита (один закомментарен). Подскажите, кто виноват и что делать?

================================== movf STEPCOUNT,W ; Pass table offset via W

btfss STEPCOUNT,7 ; test half-table goto GetTable0 ; Get table 0 value ;else goto GetTable1 ; Get table 1 value

GetTable1 ; getting value from table 1 andlw b'01111111' ; bcf W,7 ; clear hi bit call Table1 ; call Table0 retfie ; return from interrupt

; GetTable0 ; getting value from table 0 call Table0 ; call Table1 retfie ; return from interrupt

Table0 addwf PCL,F retlw b'00010000' ;0 retlw b'00000110' ;1 retlw b'00100110' ;2

==================================

Удачи! Sergej Pipets

... Диоген зажигает свой красный фонарь

Reply to
Sergej Pipets
Loading thread data ...

Мир Вашему дому, Vladislav!

Среда Август 13 2003 20:48, Vladislav Baliasov писал(а) Sergej Pipets:

SP>> Требуется работать с таблицой в 256 байт, но адресация работает SP>> только в пределах 128. VB> Как так ?

Где-то с D2 или D6 или чуть позже (почему-то не круглого адреса) происходит обращение мимо таблицы.

SP>> Пробовал два варианта маскирования старшего бита (один SP>> закомментарен). SP>> Подскажите, кто виноват и что делать?

VB> Где расположена вторая таблица (физические адреса таблиц или фрагмент VB> листинга транслятора) ?

Сразу за первой. Дальность перехода по Call не превышается, да и простое переименование таблиц (0->1, 1->0) сохраняет проблему на старшей (по регистру с адресом) половине.

================================

0026 00013 Table0 ; 0026 0782 00014 addwf PCL,F ; 0027 3410 00015 retlw b'00010000' ;0 0028 3406 00016 retlw b'00000110' ;1 .......... 00A5 3419 00141 retlw b'00011001' ;126 00A6 3419 00142 retlw b'00011001' ;127 00143 ; table 1 00A7 00144 Table1 ; 00A7 0782 00145 addwf PCL,F ; 00A8 3418 00146 retlw b'00011000' ;128 00A9 341A 00147 retlw b'00011010' ;129 00AA 3412 00148 retlw b'00010010' ;130

================================

VB> Ты про PCLATH не забыл ?

Видимо, забыл. Что с ним необходимо делать? В примерах по работе с таблицами я ничего не нашел. Там все не более 128 слов.

Удачи! Sergej Pipets ... Я новые краски хотел сберечь для холста, а выкрасил ими ряды пограничных столбов

Reply to
Sergej Pipets

Привет Sergej!

Среда 13 Августа , 2003 года (а было тогда 20:49) Sergej Pipets в своем письме к All писал:

SP> Требуется работать с таблицой в 256 байт, но адресация работает SP> только в пределах 128. Разбил таблицу на две части. Hиже фрагмент SP> обслуживающего кода. А теперь проблема: при обращении ко второй SP> половине таблицы программа вылезает черт знает куда и зацикливается.

Вот тебе пример таблицы пересекающей страницу 256, может быть хоть во всю память.

=== Грызь! test.asm начинается === cblock 0x70 Lo ; Hi endc org 0x0000 ;--------------------------------------- Init movlw 0x03 ; Hачало таблицы -1 movwf Hi movlw 0xF6 movwf Lo Loop incf Lo,f btfsc STATUS,Z incf Hi,f call Next call OutPut movlw 0x04 subwf Hi,w btfss STATUS,Z goto Loop movlw 0x05 subwf Lo,w btfss STATUS,Z goto Loop goto Init ;---------------------------------- Next movf Hi,w movwf PCLATH movf Lo,w movwf PCL ;--------------------------- OutPut ; сдесь данные из таблицы

return ; ==================================== org 0x03F7 Tabl retlw 0x00 ; 3F7 <-- Адреса програмной памяти retlw 0x01 ; 3F8 retlw 0x02 ; 3F9 retlw 0x03 ; 3FA retlw 0x04 ; 3FB retlw 0x05 ; 3FC retlw 0x06 ; 3FD retlw 0x07 ; 3FE retlw 0x08 ; 3FF retlw 0x09 ; 400 retlw 0x0A ; 401 retlw 0x0B ; 402 retlw 0x0C ; 403 retlw 0x0D ; 404 retlw 0x0E ; 405 retlw 0x0F ; 406 retlw 0x10 ; 407 retlw 0x11 ; 408 retlw 0x12 ; 409 retlw 0x13 ; 40A ;========================================== end

=== Грызь! test.asm кончился ===

С уважением, Andrey Четверг 14 Августа , 2003 года

... Жуйте ORBIT без сахара - это предотвратит CARRIER!

Reply to
Andrey Bivshih

Пpивет, Sergej!

*** 14 Aug 03 06:40, Sergej Pipets wrote to Vladislav Baliasov:

SP>>> Требуется работать с таблицой в 256 байт, но адресация работает SP>>> только в пределах 128. VB>> Как так ?

SP> Где-то с D2 или D6 или чуть позже (почему-то не круглого адреса) SP> происходит обращение мимо таблицы.

Что-то странное. Команда модификации PCL использует 8 битов W, так что 256 элементов таблицы должно адресоваться (само собой, таблица не должна переходить границу 256 словного сегмента, т.е. есть жесткое ограничение на размещение таблицы). Если у тебя таблица начнется с адреса 2E, то дальше элемента D2 ты не залезешь, попадешь совсем в другое место (или надо дополнительно вычислять и каждый раз загружать PCLATH).

SP> Сразу за первой. Дальность перехода по Call не превышается, да и SP> простое переименование таблиц (0->1, 1->0) сохраняет проблему на SP> старшей (по регистру с адресом) половине.

SP> 00A7 00144 Table1 ; SP> 00A7 0782 00145 addwf PCL,F ; 00A8 3418

И таблица из 128 элементов ? Перешел границу - сам и виноват.

SP> Видимо, забыл. Что с ним необходимо делать? В примерах по работе с SP> таблицами я ничего не нашел. Там все не более 128 слов.

Загрузить значение, которое будет использоваться для загрузки старших битов PC при addwf PCL,f.

с уважением Владислав

Reply to
Vladislav Baliasov

Пpивет, Sergej !

SP> Тpебуется pаботать с таблицой в 256 байт, но адpесация pаботает только в SP> пpеделах 128. Разбил таблицу на две части. ... SP> пpогpамма вылезает чеpт знает куда и зацикливается. ...

Вот pаботает: SP> movf STEPCOUNT,W ; Pass table offset via W addlw Low(Table0) movwf temp movlw High(Table0) btfsc STATUS,C addlw 1 movwf PCLATCH movf temp,w call go_PCL1 ;W=walue from table ... ... SP> retfie ; return from interrupt go_PCL1: movwf PCL

SP> Table0 SP> addwf PCL,F SP> retlw b'00010000' ;0 SP> retlw b'00000110' ;1 SP> retlw b'00100110' ;2

Anatoly.

Reply to
Anatoly Marooschenko

Здравствуй, Sergej Pipets! августа месяца тринадцатого дня ты писал(а):

SP> Мир Вашему дому, All!

SP> Требуется работать с таблицой в 256 байт, но адресация работает только SP> в пределах 128. Разбил таблицу на две части. Hиже фрагмент

До 256 байт ничего разбивать не надо, надо лишь проследить, чтобы самый первый RETLW ("нулевой") располагался в начале 256-байтной страницы, ну и не забыть перед обращением к собственно таблице занести в PCLATH старшую часть адреса таблицы (блока RETLW):

. . . movlw high Table movwf PCLATH movf STEPCOUNT,W ; Pass table offset via W call Table . . .

org 1ffh ; Уточнить по месту Table addwf PCL,F retlw b'00010000' ;0 retlw b'00000110' ;1 retlw b'00100110' ;2 . . .

[...]

Если таблица одна и весь код в пределах одной программной страницы (2К слов), то загрузку PCLATH можно произвести один раз при старте программы и больше "не вспоминать" про него. Работа с таблицами рассмотрена в аппноте AN556 от MicroChip.

SP> Удачи! SP> Sergej Pipets

С уважением, Игорь Хавторин (aka Gary). E-mail: gary <точк> kedr <собак> overta <точк> ru /Черт бы побрал всех этих спамеров/

Reply to
Igor Havtorin

Привет Sergej!

Wednesday August 13 2003 20:49, Sergej Pipets wrote to All:

SP> Требуется работать с таблицой в 256 байт, но адресация работает только в SP> пределах 128. Разбил таблицу на две части. Hиже фрагмент обслуживающего SP> кода. А теперь проблема: при обращении ко второй половине таблицы SP> программа вылезает черт знает куда и зацикливается. Если половинки таблицы SP> переименовать, сохранив их взаимное расположение, зацикливание происходит SP> при обращении все равно к старшей (по адресу в STEPCOUNT) половине SP> таблицы. Если в обоих случаях обращение идет к одной (любой) половине - SP> проблем нет. Пробовал два варианта маскирования старшего бита (один SP> закомментарен). Подскажите, кто виноват и что делать?

1) не разбивать на две - таблица 256 элементов прекрасно работает, вот 257 - нет :) 2) Выровнять таблицу по границе 256 байт (командой ORG), 3) Hе забыть устанавливать правильно PCLATH на начало таблицы.

Alexander Torres, 2:461/28 aka 2:461/640.28 aka 2:5020/6400.28 aka snipped-for-privacy@yahoo.com

formatting link

Reply to
Alexander Torres

Приветствую Вас, Sergej!

Однажды 14 Авг 03 в 06:40, Sergej Pipets писал(а) к Vladislav Baliasov...

VB>> Ты про PCLATH не забыл ? SP>

SP> Видимо, забыл. Что с ним необходимо делать? В примерах по работе с SP> таблицами я ничего не нашел. Там все не более 128 слов.

Может пpигодится. Я несколько месяцев назад столкнулся тоже, AN mchip'овские почитал и выpодил. Кусок из моей пpоги, думаю pазбеpешься. Из любого места в пpогpамме получает значение из таблицы, находящейся в любой части пpогpаммной памяти (в т.ч. pеpесекающей сегмент)

PwrGet movf Power,W ;для этого паpаметpа в таблице convTable лежит символ movwf offset movlw LOW convTable addwf offset,F movlw HIGH convTable btfsc STATUS,C addlw 1 movwf PCLATH movf offset,W ; это все, чтобы учесть и pасположение таблицы и ; пеpесечение сегмента call convTable ; Hаконец-то!

Хотя, обычно пеpед таблицей пpосто: org H'число кpатное сегменту'

С уважением, Виталий.

... -|O|-

Reply to
Vitaliy Romaschenko
  • Crossposted в RU.EMBEDDED
  • Crossposted в OUT.LOG

Мир Вашему дому, Andrey!

Четверг Август 14 2003 09:15, Andrey Bivshih писал(а) Sergej Pipets:

SP>> Требуется работать с таблицой в 256 байт, но адресация работает SP>> только в пределах 128. Разбил таблицу на две части. Hиже фрагмент SP>> обслуживающего кода. А теперь проблема: при обращении ко второй SP>> половине таблицы программа вылезает черт знает куда и зацикливается.

AB> Вот тебе пример таблицы пересекающей страницу 256, может AB> быть хоть во всю память.

AB> === Грызь! test.asm начинается === AB> cblock 0x70

Спасибо! С проблемой уже справился, а этот текст в заначку спрячу, зимой пригодится.

Удачи! Sergej Pipets ... Амеpика - самая богатая стpана в миpе, потому что половину ее населения составляют сбежавшие из Евpопы кассиpы и их потомки (с) Казимеж Баpтошевич

Reply to
Sergej Pipets

SP> GetTable0 ; getting value from table 0 SP> call Table0 SP> ; call Table1 SP> retfie ; return from interrupt

SP> Table0 SP> addwf PCL,F SP> retlw b'00010000' ;0 SP> retlw b'00000110' ;1 SP> retlw b'00100110' ;2

Вот и не нужно списывать примеры бездумно.

GetTable0: movlw table0>>8

call ldpcl

call ldpcl retfie

ldpcl:

; (младший байт) выравнивать table0: dt 0x10, 0x06, 0x26...

table1: ...

Reply to
Kirill Frolov

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.