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

Do you have a question? Post it now! No Registration Necessary

Translate This Thread From Russian to

Threaded View
* 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

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

Re: PIC - две таблицы
Мир Вашему дому, 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
... Я новые краски хотел сберечь для холста,
    а выкрасил ими ряды пограничных столбов

PIC - две таблицы
                           П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.

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

PIC - две таблицы
Приветствую Вас, 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|-

PIC - две таблицы
Привет 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!

PIC - две таблицы
* 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тошевич

Re: PIC - две таблицы
П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.


Re: PIC - две таблицы
Здравствуй, 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
          /Черт бы побрал всех этих спамеров/



PIC - две таблицы
Привет 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
    http://www.altor.tk



Re: PIC - две таблицы
Hемедленно нажми на RESET, 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
Quoted text here. Click to load it
        call ldpcl
Quoted text here. Click to load it
        call ldpcl
        retfie

     ldpcl:
Quoted text here. Click to load it

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

Quoted text here. Click to load it
     table1:
        ...



Site Timeline