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

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Аватара пользователя
Aaantonnn15
Встал на лапы
Сообщения: 101
Зарегистрирован: Пт авг 20, 2010 18:31:05
Контактная информация:

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

Сообщение Aaantonnn15 »

Доброго времени суток всем котам и кошкам. Занимаюсь програмированием микроконтороллеров совсем недавно, по-этому просьба камнями не закидывать! Работаю с PICами, пишу на асемблере. Пишу программу для универсального терморегулятора(много всевозможных настроек и режимов работы) Микроконтроллер использую PIC16F877A(8кБ памяти). И все, вроде, было нормально пока программа умещалась в 2кБ(0 страница памяти), когда же объем программы пересек границу нулевой страницы- начались проблемы... Разобрался... Указал где начинается первая страница памяти и все, вроде, заработало. Но появилось одно но... Запаса памяти в нулевой странице нет, а мне переодически необходимо вносить туда изменения... И приходится сдвигать указатель начала первой страницы то вверх, то вниз, а после сдвига переписывать часть программы заново. Вообщем много головняка. Поделитесь опытом кто как поступает? Есть у меня книга "Микроконтроллеры Microchip практическое руководство"-В.С. Яценков, там вычитал, что в MPLab есть компоновщик MPLink. А разобраться что и до чего не получается. Может ли он делать что-то подобное? Помогите, пожалуйста, кто сталкивался с этим компоновщиком. Научите пользоваться. Заранее огромное спасибо! :))
Реклама
Аватара пользователя
Хатуль_мадан
Электрический кот
Сообщения: 1007
Зарегистрирован: Ср мар 03, 2010 11:48:00
Откуда: Уфа

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

Сообщение Хатуль_мадан »

Тоже пишу на ассм. для PIC16F876 и тоже недавно. Были вопросы по переходу границ страницы. Решил просто, основная программа находится на 0 странице, а большинство подпрограмм, таблиц и прочее разместил на первой. Мне показалось так нагляднее и проще, чем разбираться с компоновщиком, хотя и мне интересно как он работает.

зы:
А что за терморегулятор, у которого программа более 2 кБ? В моей конструкции она менее 1кБ и тоже вроде универсальный. :dont_know:
Реклама
Аватара пользователя
Dmitry Dubrovenko
Поставщик валерьянки для Кота
Сообщения: 2358
Зарегистрирован: Вс янв 09, 2011 16:51:39
Откуда: Санкт-Ленинград
Контактная информация:

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

Сообщение Dmitry Dubrovenko »

Да, в общем-то, элементарно, Ватсон. :)
Перед тем, как писАть программу, прикидываю, что и сколько будет занимать, и соответственно распределяю по страницам.
Например: основная программа на 3-й странице, прерывание от TMR0 - на 0-й, от TMR1 и UART - на 1-й.
Если уж основная программа получается такой громоздкой, что не умещается на одной странице (хотя у меня такого ни разу не было), надо её разбить на логические блоки.
ICQ нет, и, в ближайшее время, не будет.
Аватара пользователя
Aaantonnn15
Встал на лапы
Сообщения: 101
Зарегистрирован: Пт авг 20, 2010 18:31:05
Контактная информация:

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

Сообщение 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
-------------
-------------
После таких изменений половина проблем исчесла сама собой.
В моем устройстве большое древовидное меню, которое и поедает много памяти. А функция терморегулирования не много места занимает.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Aaantonnn15
Встал на лапы
Сообщения: 101
Зарегистрирован: Пт авг 20, 2010 18:31:05
Контактная информация:

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

Сообщение Aaantonnn15 »

Может такой стиль неправильный... Но избавиться от некоторых проблем помогает. :))
Реклама
Аватара пользователя
Хатуль_мадан
Электрический кот
Сообщения: 1007
Зарегистрирован: Ср мар 03, 2010 11:48:00
Откуда: Уфа

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

Сообщение Хатуль_мадан »

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. Как то попадалась неплохая статейка по оформлению программ, если нужно могу дома поискать.
Реклама
Аватара пользователя
Aaantonnn15
Встал на лапы
Сообщения: 101
Зарегистрирован: Пт авг 20, 2010 18:31:05
Контактная информация:

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

Сообщение 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] Буду очень признателен.
Аватара пользователя
Хатуль_мадан
Электрический кот
Сообщения: 1007
Зарегистрирован: Ср мар 03, 2010 11:48:00
Откуда: Уфа

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

Сообщение Хатуль_мадан »

Вот, нашел. Скачивал с микрочипа, но в какой теме не помню, много времени прошло. Автор сего В. Тимофеев.
Мне очень помогло это описание на начальном этапе.
Вложения
MPASM_formatting.pdf
(314.04 КБ) 1843 скачивания
Аватара пользователя
pazak
Прорезались зубы
Сообщения: 243
Зарегистрирован: Пт фев 26, 2010 03:33:02
Откуда: Донецк

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

Сообщение pazak »

Вот ссылка http://progcode.narod.ru/stati/asm_stan ... atting.pdf, статья В.Тимофеева.

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

С уважением.
Аватара пользователя
Aaantonnn15
Встал на лапы
Сообщения: 101
Зарегистрирован: Пт авг 20, 2010 18:31:05
Контактная информация:

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

Сообщение Aaantonnn15 »

Хотелось бы что-то услышать об MPLink. Что никто с ним не работает...?
Аватара пользователя
Dmitry Dubrovenko
Поставщик валерьянки для Кота
Сообщения: 2358
Зарегистрирован: Вс янв 09, 2011 16:51:39
Откуда: Санкт-Ленинград
Контактная информация:

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

Сообщение Dmitry Dubrovenko »

Хатуль_мадан писал(а):причем начало таблиц указывать с конкретного адреса, кратного 255
Это и будет примерно:
Aaantonnn15 писал(а):3- таблицы для вычесляемого перехода(должны быть розмещены в памяти до 255 адреса)
А проблема данная возникает из-за неправильного алгоритма вычисляемого перехода (из-за игнорирования PCLATH). Скорректируйте алгоритм, и вставляйте вычисляемый переход куда душе угодно. :wink:
ICQ нет, и, в ближайшее время, не будет.
Аватара пользователя
Хатуль_мадан
Электрический кот
Сообщения: 1007
Зарегистрирован: Ср мар 03, 2010 11:48:00
Откуда: Уфа

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

Сообщение Хатуль_мадан »

Ну не совсем так. Указывая конкретные адреса блоков, можно таблицы перенести куда угодно, а не только вначале программы до 255 адреса, да и это проще чем разбираться с регистром PCLATH. Хотя, если таблица более 255 значений, то все равно придется.
Dmitry Dubrovenko раз уж советуете, то не мешал бы примерчик такого вычсляемого перехода, опыт лишним не бывает.
Аватара пользователя
Aaantonnn15
Встал на лапы
Сообщения: 101
Зарегистрирован: Пт авг 20, 2010 18:31:05
Контактная информация:

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

Сообщение Aaantonnn15 »

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


Как я понял PCLATH необходим для перехода по страницам памяти. А как он помогает если таблица переходит через границу адреса 255? Случай для одной страницы памяти(нулевой например)?
Аватара пользователя
Aaantonnn15
Встал на лапы
Сообщения: 101
Зарегистрирован: Пт авг 20, 2010 18:31:05
Контактная информация:

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

Сообщение Aaantonnn15 »

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

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

Сообщение 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 (кстати, с картинками)
ICQ нет, и, в ближайшее время, не будет.
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7359
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

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

Сообщение uldemir »

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

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

runner:
        movf    frameptrh, w
        movwf   PCLATH
        movf    frameptrl, w
        movwf   PCL
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Аватара пользователя
Aaantonnn15
Встал на лапы
Сообщения: 101
Зарегистрирован: Пт авг 20, 2010 18:31:05
Контактная информация:

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

Сообщение Aaantonnn15 »

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

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

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

Да. Спасибо! :)
Аватара пользователя
Old Grumble
Открыл глаза
Сообщения: 53
Зарегистрирован: Вс июн 14, 2009 21:36:46
Откуда: Кап.Яр-1 Астраханская обл.

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

Сообщение 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)".....)
«Просите, и дано будет вам; ищите, и найдете; стучите, и отворят вам; ибо всякий просящий получает, и ищущий находит, и стучащему отворят». Матф.гл. 7, ст. 7—8
Аватара пользователя
Dmitry Dubrovenko
Поставщик валерьянки для Кота
Сообщения: 2358
Зарегистрирован: Вс янв 09, 2011 16:51:39
Откуда: Санкт-Ленинград
Контактная информация:

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

Сообщение Dmitry Dubrovenko »

Old Grumble писал(а):а AN556 об этом честно молчит!!!
Я не знаю, кто такой этот AN556, но об этом написанно в каждом даташите.
ICQ нет, и, в ближайшее время, не будет.
Аватара пользователя
Old Grumble
Открыл глаза
Сообщения: 53
Зарегистрирован: Вс июн 14, 2009 21:36:46
Откуда: Кап.Яр-1 Астраханская обл.

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

Сообщение 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 для работы с первой, иначе дурдом.
Вложения
ds40300b.JPG
практически официальный перевод
(191.17 КБ) 526 скачиваний
«Просите, и дано будет вам; ищите, и найдете; стучите, и отворят вам; ибо всякий просящий получает, и ищущий находит, и стучащему отворят». Матф.гл. 7, ст. 7—8
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»