MicroCHIP.RU
Главная Документация Отладочные средства Справочник Поиск Ссылки
 Новости   Конференция   Контакты 
 

Re: как правильно работать с PCLATH

 Нoвaя темa  |  Наверх  |  Перейти к теме  |  Поиск  |  Правила  |  Вход 

ВНИМАНИЕ!
Вы просматриваете архив форума.

Этот форум работает только в режиме просмотра и поиска.

Действующий форум переведен на новый движок и
находится по адресу www.microchip.su

 как правильно работать с PCLATH
Автор: DrLivsi ()
Дата:   31/10/2005 10:22

Поправте если неправильно что то понял

Есть таблица

NUM_TABLE
	addwf	PCL, F
	retlw	'0'
	retlw	'1'
	retlw	'2'
	retlw	'3'
	retlw	'4'
	retlw	'5'
	retlw	'6'
	retlw	'7'
	retlw	'8'
	retlw	'9'


Вызывается она из проги по call, соответственно если судить по доке на 16pic,
регистр PCLATH не меняется, и для нормальной обработки этой таблице необходимо
установить страницу памяти в которой она расположена а потом вернуть на исходную.
Вызов осущ конструкцией

	MOVF	pr3,W
	CALL	BIN_2_BCD
	MOVF	MSD, W
	CALL	NUM_TABLE
	CALL	SEND_CHAR
	MOVF	LSD, W
	CALL	NUM_TABLE
	CALL	SEND_CHAR


находятся за org 300h (16F84)
При чем таких вызовов очень много.
Что бы не парится с PCLATH запихал таблицу в 1 страницу и тоды при вязове ее с
любого места не меняя PCLATH, мы получаем ее нормальную обработку.

Это привильно, или правильней как то по другому ?


 
 Re: как правильно работать с PCLATH
Автор: MCHP ()
Дата:   31/10/2005 11:38

В целом, если вызов осуществляется между страницами памяти, нужно менять
PCLATH перед вызовом и восстанавливать после:
#include "p16f877a.inc"

	org	0

	lgoto	Start	; Длинный переход (меняет PCLATH)

tbl	addwf	PCL, f
	dt	"Tra-lya-lya"


	org	0x1000
Start	movlw	7
	lcall	tbl	; Длинный вызов (меняет PCLATH)
	pagesel	$	; Восстановим наш PCLATH
	b	Start

	end



 
 Re: как правильно работать с PCLATH
Автор: DrLivsi ()
Дата:   31/10/2005 11:52

елси у меня проги
MOVF pr3,W
CALL BIN_2_BCD
MOVF MSD, W
CALL NUM_TABLE
CALL SEND_CHAR
MOVF LSD, W
CALL NUM_TABLE
CALL SEND_CHAR
почти пол текста занимеют, там перед каждой ставить этот переход и потом
востанавливат?
ПАмяти не хватит !!! Какие еще варианты бывают ?


 
 Re: как правильно работать с PCLATH
Автор: MCHP ()
Дата:   31/10/2005 11:58

Всё в одной странице, и таблица и её вызовы, какие ещё варианты?


 
 Re: как правильно работать с PCLATH
Автор: Greg ()
Дата:   31/10/2005 12:03

DrLivsi писал(а):

> почти пол текста занимеют, там перед каждой ставить этот
> переход и потом востанавливат?
> ПАмяти не хватит !!! Какие еще варианты бывают ?

1. Использовать компилятор языка Си. Он возьмет на себя задачу распихивания ваших таблиц по щелям.
2. Взять другой проц, 18-й (там есть специальная инструкия чтения своей памяти) или хотя бы 16 с
возможностью чтения своей памяти (16F87x), или вообще какой-нибудь совсем другой...

Или ручками пихать во все щели (пикоману обычно это в удовольствие)
А выход за страницу контролировать, например, с помощью сообщений
        ADDWF   PCL

    TABLE1:

        DT      "Test"

        IF ((HIGH ($)) != (HIGH (TABLE1)))
            ERROR "TABLE1 CROSSES PAGE BOUNDARY!"
        ENDIF




 
 Re: как правильно работать с PCLATH
Автор: MCHP ()
Дата:   31/10/2005 12:44

Вариант - поместить на каждой странице по одному длинному вызову
той "далёкой" таблицы и в пределах страницы вызывать этот вызов (не
запутались? :)
Тогда код Вам в помощь:
	org	0x77	; Page 0
tbl	addwf	PCL, f
	dt	"Наша \"далёкая\" таблица"

	org	0x800	; Page 1
tbl1	lcall	tbl	; Вызов таблицы
	pagesel	$
	return
; ...
	movlw	3
	call	tbl1	; достучимся до нашей таблицы
	; тут PCLATH останется = $ и pagesel'а не надо
	movlw	4
	call	tbl1	; достучимся до нашей таблицы опять

	org	0x1000	; Page 2
tbl2	lcall	tbl	; Вызов таблицы
	pagesel	$
	return
; ...
	movlw	7
	call	tbl2	; достучимся до нашей таблицы
	; тут PCLATH останется = $ и pagesel'а не надо






 
 Re: как правильно работать с PCLATH
Автор: MCHP ()
Дата:   01/11/2005 10:28

Вот, за примером далеко ходить не надо, чем себе только голову не морочит
асмист, лиш бы не написанием оптимального кода. Это сколько же таких
обращений к таблице нужно чтобы "памяти стало не хватать"? Ну пусть 3к
кода и 1000 (лучше словами, тысяча!!!) обращений к таблице (эт в
8К PIC16F877 лезет). На каждый длинный вызов - 5 асм комманд. Мало?
Памяти не хватит? Так и будем строчить линейный код последовательно
вызывая таблицу тратя всего одну маш. инстукцию на вызов и при этом
думая, что мы "жутко" оптимальный код пишем (на асме ведь)? Вместо того,
чтобы разместить один единственный вызов таблицы в цикле а сам
цикл поместить в функцию, которая, к тому же, сможет обрабатывать таблицы
как в ПамятиПрограмм так и в Оперативке и будет "залпом" выводить нашу
строку на дисплей или обрабатывать нашу таблицу. О функциональной
декомпозиции и нисходящем программировании слышали? Микроликбез - вся
прога представляется сначала одной большой функцией (main), далее
разбивается на несколько подфункций, которые, в свою очередь, на более
мелкие подфункции, и так до тех пор, пока код функции не станет настолько
прост и понятен, что сможем прямо его сходу написать, детализуем прогу до
самого мелкого кирпичика. Вот грамотная ф-циональная декомпозиция как раз
и даст в результате более компактный, эфективный код.
Вы того, ещё немного на асме посидите, повникайте что к чему и для чего,
хотя бы для того, чтобы потом иметь представление, чего Сишный компилятор
в листингах наворотил. Дальше я бы посоветовал прислушаться к Greg'у
(пункт 1):
http://www.microchip.ru/phorum/read.php?f=2&i=108139&t=108129
Потом даже не вспомните о PCLATH или RP0, RP1 или как это забацать
таблицу длиннее 255 байт.
По мне так лучше проиграть в мелочах, выиграв в крупном, чем наоборот.



Отправка отредактированного (01/11/2005 11:39)