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

Как правильно скомпоновать программу для PIC?

Добавлено: Вт июн 07, 2011 23:35:25
Aaantonnn15
Доброго времени суток всем котам и кошкам. Занимаюсь програмированием микроконтороллеров совсем недавно, по-этому просьба камнями не закидывать! Работаю с PICами, пишу на асемблере. Пишу программу для универсального терморегулятора(много всевозможных настроек и режимов работы) Микроконтроллер использую PIC16F877A(8кБ памяти). И все, вроде, было нормально пока программа умещалась в 2кБ(0 страница памяти), когда же объем программы пересек границу нулевой страницы- начались проблемы... Разобрался... Указал где начинается первая страница памяти и все, вроде, заработало. Но появилось одно но... Запаса памяти в нулевой странице нет, а мне переодически необходимо вносить туда изменения... И приходится сдвигать указатель начала первой страницы то вверх, то вниз, а после сдвига переписывать часть программы заново. Вообщем много головняка. Поделитесь опытом кто как поступает? Есть у меня книга "Микроконтроллеры Microchip практическое руководство"-В.С. Яценков, там вычитал, что в MPLab есть компоновщик MPLink. А разобраться что и до чего не получается. Может ли он делать что-то подобное? Помогите, пожалуйста, кто сталкивался с этим компоновщиком. Научите пользоваться. Заранее огромное спасибо! :))

Re: Как правильно скомпоновать программу для PIC?

Добавлено: Ср июн 08, 2011 07:38:27
Хатуль_мадан
Тоже пишу на ассм. для PIC16F876 и тоже недавно. Были вопросы по переходу границ страницы. Решил просто, основная программа находится на 0 странице, а большинство подпрограмм, таблиц и прочее разместил на первой. Мне показалось так нагляднее и проще, чем разбираться с компоновщиком, хотя и мне интересно как он работает.

зы:
А что за терморегулятор, у которого программа более 2 кБ? В моей конструкции она менее 1кБ и тоже вроде универсальный. :dont_know:

Re: Как правильно скомпоновать программу для PIC?

Добавлено: Ср июн 08, 2011 09:01:34
Dmitry Dubrovenko
Да, в общем-то, элементарно, Ватсон. :)
Перед тем, как писАть программу, прикидываю, что и сколько будет занимать, и соответственно распределяю по страницам.
Например: основная программа на 3-й странице, прерывание от TMR0 - на 0-й, от TMR1 и UART - на 1-й.
Если уж основная программа получается такой громоздкой, что не умещается на одной странице (хотя у меня такого ни разу не было), надо её разбить на логические блоки.

Re: Как правильно скомпоновать программу для PIC?

Добавлено: Ср июн 08, 2011 12:22:19
Aaantonnn15
Хатуль_мадан писал(а):Тоже пишу на ассм. для PIC16F876 и тоже недавно. Были вопросы по переходу границ страницы. Решил просто, основная программа находится на 0 странице, а большинство подпрограмм, таблиц и прочее разместил на первой. Мне показалось так нагляднее и проще, чем разбираться с компоновщиком, хотя и мне интересно как он работает.

зы:
А что за терморегулятор, у которого программа более 2 кБ? В моей конструкции она менее 1кБ и тоже вроде универсальный. :dont_know:
Было в моей практике уже такое. Программа у меня выглядела след. образом. 1- шапка, 2-начальные установки, 3- основной цикл, 4- подпрограммы, таблицы. Делал по такому принципу часы на PIC16F628A. Сколько было трудностей... Некоторые из них: 1- таблица для вычесляемого перехода попадала на адреса не допустимые для табличного чтения, 2- проблемы с индикацией. Теперь пишу немного по другому: 1- шапка, 2- начальные установки, 3- таблицы для вычесляемого перехода(должны быть розмещены в памяти до 255 адреса), 4-основной цикл. Причем основной цикл переплетен с подпрограммами, пример:

call Delay 250
goto Prodol

Delay 250
-------------
-------------
return

Prodol
-------------
-------------
После таких изменений половина проблем исчесла сама собой.
В моем устройстве большое древовидное меню, которое и поедает много памяти. А функция терморегулирования не много места занимает.

Re: Как правильно скомпоновать программу для PIC?

Добавлено: Ср июн 08, 2011 12:33:12
Aaantonnn15
Может такой стиль неправильный... Но избавиться от некоторых проблем помогает. :))

Re: Как правильно скомпоновать программу для PIC?

Добавлено: Ср июн 08, 2011 12:48:44
Хатуль_мадан
Aaantonnn15 писал(а):...Теперь пишу немного по другому: 1- шапка, 2- начальные установки, 3- таблицы для вычесляемого перехода(должны быть розмещены в памяти до 255 адреса), 4-основной цикл. Причем основной цикл переплетен с подпрограммами, пример...
После таких изменений половина проблем исчесла сама собой.
Можно и так, но может проще шапку и таблицы вывести в отдельный подключаемый файл, причем начало таблиц указывать с конкретного адреса, кратного 255, то же относится и к ПП вычисляемого перехода. Например так:

Код: Выделить всё

		org	0x700		; последние 255 байт первой страницы
TABLE:
S_0:		Data 0x3E, 0x41, 0x41, 0x3E, 0x00			; цифра 0
S_1:		Data 0x00, 0x42, 0x7F, 0x40, 0x00			; Цифра 1
S_2:		Data 0x62, 0x51, 0x49, 0x46, 0x00			; Цифра 2
и так далее..
А в начале программы, как обычно, переходы на инициализацию периферии и обработка прерываний, затем основной цикл, а в конце все часто вызываемые подпрограммы. Очень много примеров на микрочипе и именно по PIC. Как то попадалась неплохая статейка по оформлению программ, если нужно могу дома поискать.

Re: Как правильно скомпоновать программу для PIC?

Добавлено: Ср июн 08, 2011 13:23:48
Aaantonnn15
Хатуль_мадан писал(а):
Aaantonnn15 писал(а):...Теперь пишу немного по другому: 1- шапка, 2- начальные установки, 3- таблицы для вычесляемого перехода(должны быть розмещены в памяти до 255 адреса), 4-основной цикл. Причем основной цикл переплетен с подпрограммами, пример...
После таких изменений половина проблем исчесла сама собой.
Можно и так, но может проще шапку и таблицы вывести в отдельный подключаемый файл, причем начало таблиц указывать с конкретного адреса, кратного 255, то же относится и к ПП вычисляемого перехода. Например так:

Код: Выделить всё

		org	0x700		; последние 255 байт первой страницы
TABLE:
S_0:		Data 0x3E, 0x41, 0x41, 0x3E, 0x00			; цифра 0
S_1:		Data 0x00, 0x42, 0x7F, 0x40, 0x00			; Цифра 1
S_2:		Data 0x62, 0x51, 0x49, 0x46, 0x00			; Цифра 2
и так далее..
А в начале программы, как обычно, переходы на инициализацию периферии и обработка прерываний, затем основной цикл, а в конце все часто вызываемые подпрограммы. Очень много примеров на микрочипе и именно по PIC. Как то попадалась неплохая статейка по оформлению программ, если нужно могу дома поискать.

Вариан очень даже неплохой! :))

Как то попадалась неплохая статейка по оформлению программ, если нужно могу дома поискать.[/quote] Буду очень признателен.

Re: Как правильно скомпоновать программу для PIC?

Добавлено: Ср июн 08, 2011 14:05:29
Хатуль_мадан
Вот, нашел. Скачивал с микрочипа, но в какой теме не помню, много времени прошло. Автор сего В. Тимофеев.
Мне очень помогло это описание на начальном этапе.

Re: Как правильно скомпоновать программу для PIC?

Добавлено: Ср июн 08, 2011 14:18:01
pazak
Вот ссылка http://progcode.narod.ru/stati/asm_stan ... atting.pdf, статья В.Тимофеева.

Опс... опоздал. :)))

С уважением.

Re: Как правильно скомпоновать программу для PIC?

Добавлено: Пт июн 10, 2011 00:16:56
Aaantonnn15
Хотелось бы что-то услышать об MPLink. Что никто с ним не работает...?

Re: Как правильно скомпоновать программу для PIC?

Добавлено: Пт июн 10, 2011 07:50:15
Dmitry Dubrovenko
Хатуль_мадан писал(а):причем начало таблиц указывать с конкретного адреса, кратного 255
Это и будет примерно:
Aaantonnn15 писал(а):3- таблицы для вычесляемого перехода(должны быть розмещены в памяти до 255 адреса)
А проблема данная возникает из-за неправильного алгоритма вычисляемого перехода (из-за игнорирования PCLATH). Скорректируйте алгоритм, и вставляйте вычисляемый переход куда душе угодно. :wink:

Re: Как правильно скомпоновать программу для PIC?

Добавлено: Пт июн 10, 2011 11:16:36
Хатуль_мадан
Ну не совсем так. Указывая конкретные адреса блоков, можно таблицы перенести куда угодно, а не только вначале программы до 255 адреса, да и это проще чем разбираться с регистром PCLATH. Хотя, если таблица более 255 значений, то все равно придется.
Dmitry Dubrovenko раз уж советуете, то не мешал бы примерчик такого вычсляемого перехода, опыт лишним не бывает.

Re: Как правильно скомпоновать программу для PIC?

Добавлено: Пт июн 10, 2011 14:43:26
Aaantonnn15
А проблема данная возникает из-за неправильного алгоритма вычисляемого перехода (из-за игнорирования PCLATH). Скорректируйте алгоритм, и вставляйте вычисляемый переход куда душе угодно. :wink:[/quote]


Как я понял PCLATH необходим для перехода по страницам памяти. А как он помогает если таблица переходит через границу адреса 255? Случай для одной страницы памяти(нулевой например)?

Re: Как правильно скомпоновать программу для PIC?

Добавлено: Пт июн 10, 2011 14:54:07
Aaantonnn15
2.3.1 Вычисляемый переход
Вычисляемый переход может быть выполнен командой приращения к регистру РСL (например, ADDWF PCL). При выполнении табличного чтения вычисляемым переходом следует заботиться о том, чтобы значение РСL не пересекло границу блока памяти (каждый блок 256 байт). Дополнительную информацию по выполнению вычисляемого перехода смотрите в документации А№556 «Выполнение табличного чтения». Выдержка из даташита на PIC16F877A. Про PCLATH тут ничего не сказано. Может есть какие-то особые процедуры?Dmitry Dubrovenko поделитесь опытом? :)

Re: Как правильно скомпоновать программу для PIC?

Добавлено: Пт июн 10, 2011 15:29:51
Dmitry Dubrovenko
Хатуль_мадан писал(а):можно таблицы перенести куда угодно, а не только вначале программы до 255 адреса
Ну, я же сказал: "Примерно".
Перенести-то Вы их сможете, НО таблица всё-равно не сможет превышать 255 значений, а основной программе придётся учитывать фиксированное расположение таблицы.
Хатуль_мадан писал(а):не мешал бы примерчик такого вычсляемого перехода, опыт лишним не бывает.
Пожалуйста.

Код: Выделить всё

             movlw	high tbvn    ; Задание счётчика PCLATH
             movwf	PCLATH

             movlw	low tbvn     ; Корректировка PCLATH,
             addwf	CHVRND,W     ; в случае переполнения PCL
             btfsc	STATUS,C
             incf	PCLATH,F

             movf	CHVRND,W      ; Извлечение варианта
             addwf	PCL,F        ; Содержимое счётчика команд PC увеличивается на W
tbvn         goto	varnd00       ; Вариант 0
             goto	varnd01       ; Вариант 1
Как видите, ничего сложного.

Aaantonnn15 писал(а):Как я понял PCLATH необходим для перехода по страницам памяти
Вы всё неправильно поняли.
Програмный счётчик состоит из двух байтов. Младший - PCL доступен для чтения и записи, а доступ к старшему - PCH возможен только через регистр PCLATH (по-русски - буфер).
Команды goto и call младшие 11 (с 0 по 10) битов адреса используют из опкода команды, и только 11 и 12 берут из PCLATH. Отсюда возникает ограничение на страницу в 2 килослова.
Все остальные команды (в том числе и addwf), как мы знаем, работают только с одним байтом (в данном случае PCL), и содержание другого (в данном случае PCLATH) не изменяют.
Собственно, это я Вам рассказываю даташит на любой контроллер среднего семейства ПИКов.
Для 16F6x8 - п. 4.3, для 16F87x - п. 2.3 (кстати, с картинками)

Re: Как правильно скомпоновать программу для PIC?

Добавлено: Пт июн 10, 2011 17:15:11
uldemir
Обращаться к таблице можно просто вычислив её адрес:
Вот кусок из моей демонстрячки графического LCD дисплея. Всю память занимают данные для анимации (картинки по-кадрово). Просто вычисляется адрес в ПЗУ, записывается в две ячейки frameptr (h и l), делается call runner и по возвращении имеем. Сам адрес вычисляется как сложение двух 16-ти битных числа (ну я надеюсь, это вы уже проходили?)

Код: Выделить всё

runner:
        movf    frameptrh, w
        movwf   PCLATH
        movf    frameptrl, w
        movwf   PCL

Re: Как правильно скомпоновать программу для PIC?

Добавлено: Пт июн 10, 2011 17:20:38
Aaantonnn15
uldemir писал(а):Обращаться к таблице можно просто вычислив её адрес:
Вот кусок из моей демонстрячки графического LCD дисплея. Всю память занимают данные для анимации (картинки по-кадрово). Просто вычисляется адрес в ПЗУ, записывается в две ячейки frameptr (h и l), делается call runner и по возвращении имеем. Сам адрес вычисляется как сложение двух 16-ти битных числа (ну я надеюсь, это вы уже проходили?)

Код: Выделить всё

runner:
        movf    frameptrh, w
        movwf   PCLATH
        movf    frameptrl, w
        movwf   PCL

Да. Спасибо! :)

Re: Как правильно скомпоновать программу для PIC?

Добавлено: Сб янв 28, 2012 22:42:22
Old Grumble
Aaantonnn15 писал(а):Как я понял PCLATH необходим для перехода по страницам памяти

Вы всё неправильно поняли.
Програмный счётчик состоит из двух байтов. Младший - PCL доступен для чтения и записи, а доступ к старшему - PCH возможен только через регистр PCLATH (по-русски - буфер).
Команды goto и call младшие 11 (с 0 по 10) битов адреса используют из опкода команды, и только 11 и 12 берут из PCLATH. Отсюда возникает ограничение на страницу в 2 килослова.
Все остальные команды (в том числе и addwf), как мы знаем, работают только с одним байтом (в данном случае PCL), и содержание другого (в данном случае PCLATH) не изменяют.
Собственно, это я Вам рассказываю даташит на любой контроллер среднего семейства ПИКов.
Для 16F6x8 - п. 4.3, для 16F87x - п. 2.3 (кстати, с картинками)
Ага, щас - чуть не чокнулся, пока разобрался (работал с вычисляемыми адресами таблицы данных знакогенератора "нерусского" ЖКИ для динамической перепрошивки букв названия месяца - Янв, Фев и т.п), потому, что в ЛЮБЫХ контроллерах среднего среднего семейства ПИКов при любой явной загрузке в PCL (смещения допустим), PCН тупо грузится из PCLATH! То есть, если мы работаем не в 0-й (0-0xFF) странице - извольте знать в каких адресах сидите и припишите их в PCLATH. а AN556 об этом честно молчит!!!
( и в 18 тоже :http://electronix.ru/forum/lofiversion/ ... 50408.html - "содержимое PCLATU и PCLATH переписывается в программный счётчик любой командой, которая записывает данные в регистр PCL" (с.48, pic18f45k20)".....)

Re: Как правильно скомпоновать программу для PIC?

Добавлено: Вс янв 29, 2012 14:51:17
Dmitry Dubrovenko
Old Grumble писал(а):а AN556 об этом честно молчит!!!
Я не знаю, кто такой этот AN556, но об этом написанно в каждом даташите.

Re: Как правильно скомпоновать программу для PIC?

Добавлено: Вс янв 29, 2012 16:57:10
Old Grumble
Dmitry Dubrovenko писал(а):
Old Grumble писал(а):а AN556 об этом честно молчит!!!
Я не знаю, кто такой этот AN556, но об этом написанно в каждом даташите.
Dastasheet на PIC16F62X "PIC16F627 PIC16F628 Datasheet" DS40300C pаge 25 - "3.3 PCL and PCLATH" - ни слова за исключением предупреждения о границе сегмента (0xFF).
(для непонятливых - DS40300C - номер документа Microchip)
Имеется перевод от Микро -Чип для PIC16F627 PIC16F628 ( см. на вложении скриншот) и т.д. и т.п.
А тот AN556, которого кого Вы не знаете, это тоже базовый документ, Microchip AN556 'Implementing a Table Read' где приводятся алгоритмы и примеры табличного чтения и переходов, и где указано, что PCLATH надо догружать при работе с программами более 2К.

Если бы о догрузке PCLATH было написано, как Вы говорите, в каждом даташите, этой ветки форума ВООБЩЕ БЫ НЕ БЫЛО

P.S. Добавлено 2 часа спустя - а вот выяснилось, что если таблицы находятся на разных страницах, к примеру 0х000 и 0х200, то после работы со второй таблицей (0х200) (PCLATH был 0х02) надо обнулить PCLATH для работы с первой, иначе дурдом.