Страница 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кБ и тоже вроде универсальный.

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кБ и тоже вроде универсальный.

Было в моей практике уже такое. Программа у меня выглядела след. образом. 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). Скорректируйте алгоритм, и вставляйте вычисляемый переход куда душе угодно.

Re: Как правильно скомпоновать программу для PIC?
Добавлено: Пт июн 10, 2011 11:16:36
Хатуль_мадан
Ну не совсем так. Указывая конкретные адреса блоков, можно таблицы перенести куда угодно, а не только вначале программы до 255 адреса, да и это проще чем разбираться с регистром PCLATH. Хотя, если таблица более 255 значений, то все равно придется.
Dmitry Dubrovenko раз уж советуете, то не мешал бы примерчик такого вычсляемого перехода, опыт лишним не бывает.
Re: Как правильно скомпоновать программу для PIC?
Добавлено: Пт июн 10, 2011 14:43:26
Aaantonnn15
А проблема данная возникает из-за неправильного алгоритма вычисляемого перехода (из-за игнорирования PCLATH). Скорректируйте алгоритм, и вставляйте вычисляемый переход куда душе угодно.

[/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 для работы с первой, иначе дурдом.