Как правильно скомпоновать программу для PIC?
- Aaantonnn15
- Встал на лапы
- Сообщения: 101
- Зарегистрирован: Пт авг 20, 2010 18:31:05
- Контактная информация:
Как правильно скомпоновать программу для PIC?
Доброго времени суток всем котам и кошкам. Занимаюсь програмированием микроконтороллеров совсем недавно, по-этому просьба камнями не закидывать! Работаю с PICами, пишу на асемблере. Пишу программу для универсального терморегулятора(много всевозможных настроек и режимов работы) Микроконтроллер использую PIC16F877A(8кБ памяти). И все, вроде, было нормально пока программа умещалась в 2кБ(0 страница памяти), когда же объем программы пересек границу нулевой страницы- начались проблемы... Разобрался... Указал где начинается первая страница памяти и все, вроде, заработало. Но появилось одно но... Запаса памяти в нулевой странице нет, а мне переодически необходимо вносить туда изменения... И приходится сдвигать указатель начала первой страницы то вверх, то вниз, а после сдвига переписывать часть программы заново. Вообщем много головняка. Поделитесь опытом кто как поступает? Есть у меня книга "Микроконтроллеры Microchip практическое руководство"-В.С. Яценков, там вычитал, что в MPLab есть компоновщик MPLink. А разобраться что и до чего не получается. Может ли он делать что-то подобное? Помогите, пожалуйста, кто сталкивался с этим компоновщиком. Научите пользоваться. Заранее огромное спасибо! 
- Реклама
- Хатуль_мадан
- Электрический кот
- Сообщения: 1007
- Зарегистрирован: Ср мар 03, 2010 11:48:00
- Откуда: Уфа
Re: Как правильно скомпоновать программу для PIC?
Тоже пишу на ассм. для PIC16F876 и тоже недавно. Были вопросы по переходу границ страницы. Решил просто, основная программа находится на 0 странице, а большинство подпрограмм, таблиц и прочее разместил на первой. Мне показалось так нагляднее и проще, чем разбираться с компоновщиком, хотя и мне интересно как он работает.
зы:
А что за терморегулятор, у которого программа более 2 кБ? В моей конструкции она менее 1кБ и тоже вроде универсальный.
зы:
А что за терморегулятор, у которого программа более 2 кБ? В моей конструкции она менее 1кБ и тоже вроде универсальный.
- Dmitry Dubrovenko
- Поставщик валерьянки для Кота
- Сообщения: 2358
- Зарегистрирован: Вс янв 09, 2011 16:51:39
- Откуда: Санкт-Ленинград
- Контактная информация:
Re: Как правильно скомпоновать программу для PIC?
Да, в общем-то, элементарно, Ватсон. 
Перед тем, как писАть программу, прикидываю, что и сколько будет занимать, и соответственно распределяю по страницам.
Например: основная программа на 3-й странице, прерывание от TMR0 - на 0-й, от TMR1 и UART - на 1-й.
Если уж основная программа получается такой громоздкой, что не умещается на одной странице (хотя у меня такого ни разу не было), надо её разбить на логические блоки.
Перед тем, как писАть программу, прикидываю, что и сколько будет занимать, и соответственно распределяю по страницам.
Например: основная программа на 3-й странице, прерывание от TMR0 - на 0-й, от TMR1 и UART - на 1-й.
Если уж основная программа получается такой громоздкой, что не умещается на одной странице (хотя у меня такого ни разу не было), надо её разбить на логические блоки.
ICQ нет, и, в ближайшее время, не будет.
- Aaantonnn15
- Встал на лапы
- Сообщения: 101
- Зарегистрирован: Пт авг 20, 2010 18:31:05
- Контактная информация:
Re: Как правильно скомпоновать программу для PIC?
Было в моей практике уже такое. Программа у меня выглядела след. образом. 1- шапка, 2-начальные установки, 3- основной цикл, 4- подпрограммы, таблицы. Делал по такому принципу часы на PIC16F628A. Сколько было трудностей... Некоторые из них: 1- таблица для вычесляемого перехода попадала на адреса не допустимые для табличного чтения, 2- проблемы с индикацией. Теперь пишу немного по другому: 1- шапка, 2- начальные установки, 3- таблицы для вычесляемого перехода(должны быть розмещены в памяти до 255 адреса), 4-основной цикл. Причем основной цикл переплетен с подпрограммами, пример:Хатуль_мадан писал(а):Тоже пишу на ассм. для PIC16F876 и тоже недавно. Были вопросы по переходу границ страницы. Решил просто, основная программа находится на 0 странице, а большинство подпрограмм, таблиц и прочее разместил на первой. Мне показалось так нагляднее и проще, чем разбираться с компоновщиком, хотя и мне интересно как он работает.
зы:
А что за терморегулятор, у которого программа более 2 кБ? В моей конструкции она менее 1кБ и тоже вроде универсальный.
call Delay 250
goto Prodol
Delay 250
-------------
-------------
return
Prodol
-------------
-------------
После таких изменений половина проблем исчесла сама собой.
В моем устройстве большое древовидное меню, которое и поедает много памяти. А функция терморегулирования не много места занимает.
- Aaantonnn15
- Встал на лапы
- Сообщения: 101
- Зарегистрирован: Пт авг 20, 2010 18:31:05
- Контактная информация:
Re: Как правильно скомпоновать программу для PIC?
Может такой стиль неправильный... Но избавиться от некоторых проблем помогает. 
- Реклама
- Хатуль_мадан
- Электрический кот
- Сообщения: 1007
- Зарегистрирован: Ср мар 03, 2010 11:48:00
- Откуда: Уфа
Re: Как правильно скомпоновать программу для PIC?
Можно и так, но может проще шапку и таблицы вывести в отдельный подключаемый файл, причем начало таблиц указывать с конкретного адреса, кратного 255, то же относится и к ПП вычисляемого перехода. Например так:Aaantonnn15 писал(а):...Теперь пишу немного по другому: 1- шапка, 2- начальные установки, 3- таблицы для вычесляемого перехода(должны быть розмещены в памяти до 255 адреса), 4-основной цикл. Причем основной цикл переплетен с подпрограммами, пример...
После таких изменений половина проблем исчесла сама собой.
Код: Выделить всё
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
и так далее..- Aaantonnn15
- Встал на лапы
- Сообщения: 101
- Зарегистрирован: Пт авг 20, 2010 18:31:05
- Контактная информация:
Re: Как правильно скомпоновать программу для PIC?
Хатуль_мадан писал(а):Можно и так, но может проще шапку и таблицы вывести в отдельный подключаемый файл, причем начало таблиц указывать с конкретного адреса, кратного 255, то же относится и к ПП вычисляемого перехода. Например так:Aaantonnn15 писал(а):...Теперь пишу немного по другому: 1- шапка, 2- начальные установки, 3- таблицы для вычесляемого перехода(должны быть розмещены в памяти до 255 адреса), 4-основной цикл. Причем основной цикл переплетен с подпрограммами, пример...
После таких изменений половина проблем исчесла сама собой.А в начале программы, как обычно, переходы на инициализацию периферии и обработка прерываний, затем основной цикл, а в конце все часто вызываемые подпрограммы. Очень много примеров на микрочипе и именно по PIC. Как то попадалась неплохая статейка по оформлению программ, если нужно могу дома поискать.Код: Выделить всё
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 и так далее..
Вариан очень даже неплохой!
Как то попадалась неплохая статейка по оформлению программ, если нужно могу дома поискать.[/quote] Буду очень признателен.
- Хатуль_мадан
- Электрический кот
- Сообщения: 1007
- Зарегистрирован: Ср мар 03, 2010 11:48:00
- Откуда: Уфа
Re: Как правильно скомпоновать программу для PIC?
Вот, нашел. Скачивал с микрочипа, но в какой теме не помню, много времени прошло. Автор сего В. Тимофеев.
Мне очень помогло это описание на начальном этапе.
Мне очень помогло это описание на начальном этапе.
- Вложения
-
- MPASM_formatting.pdf
- (314.04 КБ) 1843 скачивания
Re: Как правильно скомпоновать программу для PIC?
Вот ссылка http://progcode.narod.ru/stati/asm_stan ... atting.pdf, статья В.Тимофеева.
Опс... опоздал.
С уважением.
Опс... опоздал.
С уважением.
- Aaantonnn15
- Встал на лапы
- Сообщения: 101
- Зарегистрирован: Пт авг 20, 2010 18:31:05
- Контактная информация:
Re: Как правильно скомпоновать программу для PIC?
Хотелось бы что-то услышать об MPLink. Что никто с ним не работает...?
- Dmitry Dubrovenko
- Поставщик валерьянки для Кота
- Сообщения: 2358
- Зарегистрирован: Вс янв 09, 2011 16:51:39
- Откуда: Санкт-Ленинград
- Контактная информация:
Re: Как правильно скомпоновать программу для PIC?
Это и будет примерно:Хатуль_мадан писал(а):причем начало таблиц указывать с конкретного адреса, кратного 255
А проблема данная возникает из-за неправильного алгоритма вычисляемого перехода (из-за игнорирования PCLATH). Скорректируйте алгоритм, и вставляйте вычисляемый переход куда душе угодно.Aaantonnn15 писал(а):3- таблицы для вычесляемого перехода(должны быть розмещены в памяти до 255 адреса)
ICQ нет, и, в ближайшее время, не будет.
- Хатуль_мадан
- Электрический кот
- Сообщения: 1007
- Зарегистрирован: Ср мар 03, 2010 11:48:00
- Откуда: Уфа
Re: Как правильно скомпоновать программу для PIC?
Ну не совсем так. Указывая конкретные адреса блоков, можно таблицы перенести куда угодно, а не только вначале программы до 255 адреса, да и это проще чем разбираться с регистром PCLATH. Хотя, если таблица более 255 значений, то все равно придется.
Dmitry Dubrovenko раз уж советуете, то не мешал бы примерчик такого вычсляемого перехода, опыт лишним не бывает.
Dmitry Dubrovenko раз уж советуете, то не мешал бы примерчик такого вычсляемого перехода, опыт лишним не бывает.
- Aaantonnn15
- Встал на лапы
- Сообщения: 101
- Зарегистрирован: Пт авг 20, 2010 18:31:05
- Контактная информация:
Re: Как правильно скомпоновать программу для PIC?
А проблема данная возникает из-за неправильного алгоритма вычисляемого перехода (из-за игнорирования PCLATH). Скорректируйте алгоритм, и вставляйте вычисляемый переход куда душе угодно.
[/quote]
Как я понял PCLATH необходим для перехода по страницам памяти. А как он помогает если таблица переходит через границу адреса 255? Случай для одной страницы памяти(нулевой например)?
Как я понял PCLATH необходим для перехода по страницам памяти. А как он помогает если таблица переходит через границу адреса 255? Случай для одной страницы памяти(нулевой например)?
- Aaantonnn15
- Встал на лапы
- Сообщения: 101
- Зарегистрирован: Пт авг 20, 2010 18:31:05
- Контактная информация:
Re: Как правильно скомпоновать программу для PIC?
2.3.1 Вычисляемый переход
Вычисляемый переход может быть выполнен командой приращения к регистру РСL (например, ADDWF PCL). При выполнении табличного чтения вычисляемым переходом следует заботиться о том, чтобы значение РСL не пересекло границу блока памяти (каждый блок 256 байт). Дополнительную информацию по выполнению вычисляемого перехода смотрите в документации А№556 «Выполнение табличного чтения». Выдержка из даташита на PIC16F877A. Про PCLATH тут ничего не сказано. Может есть какие-то особые процедуры?Dmitry Dubrovenko поделитесь опытом?
Вычисляемый переход может быть выполнен командой приращения к регистру РСL (например, ADDWF PCL). При выполнении табличного чтения вычисляемым переходом следует заботиться о том, чтобы значение РСL не пересекло границу блока памяти (каждый блок 256 байт). Дополнительную информацию по выполнению вычисляемого перехода смотрите в документации А№556 «Выполнение табличного чтения». Выдержка из даташита на PIC16F877A. Про PCLATH тут ничего не сказано. Может есть какие-то особые процедуры?Dmitry Dubrovenko поделитесь опытом?
- Dmitry Dubrovenko
- Поставщик валерьянки для Кота
- Сообщения: 2358
- Зарегистрирован: Вс янв 09, 2011 16:51:39
- Откуда: Санкт-Ленинград
- Контактная информация:
Re: Как правильно скомпоновать программу для PIC?
Ну, я же сказал: "Примерно".Хатуль_мадан писал(а):можно таблицы перенести куда угодно, а не только вначале программы до 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 нет, и, в ближайшее время, не будет.
Re: Как правильно скомпоновать программу для PIC?
Обращаться к таблице можно просто вычислив её адрес:
Вот кусок из моей демонстрячки графического LCD дисплея. Всю память занимают данные для анимации (картинки по-кадрово). Просто вычисляется адрес в ПЗУ, записывается в две ячейки frameptr (h и l), делается call runner и по возвращении имеем. Сам адрес вычисляется как сложение двух 16-ти битных числа (ну я надеюсь, это вы уже проходили?)
Вот кусок из моей демонстрячки графического 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?
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?
Ага, щас - чуть не чокнулся, пока разобрался (работал с вычисляемыми адресами таблицы данных знакогенератора "нерусского" ЖКИ для динамической перепрошивки букв названия месяца - Янв, Фев и т.п), потому, что в ЛЮБЫХ контроллерах среднего среднего семейства ПИКов при любой явной загрузке в PCL (смещения допустим), PCН тупо грузится из PCLATH! То есть, если мы работаем не в 0-й (0-0xFF) странице - извольте знать в каких адресах сидите и припишите их в PCLATH. а AN556 об этом честно молчит!!!Aaantonnn15 писал(а):Как я понял PCLATH необходим для перехода по страницам памяти
Вы всё неправильно поняли.
Програмный счётчик состоит из двух байтов. Младший - PCL доступен для чтения и записи, а доступ к старшему - PCH возможен только через регистр PCLATH (по-русски - буфер).
Команды goto и call младшие 11 (с 0 по 10) битов адреса используют из опкода команды, и только 11 и 12 берут из PCLATH. Отсюда возникает ограничение на страницу в 2 килослова.
Все остальные команды (в том числе и addwf), как мы знаем, работают только с одним байтом (в данном случае PCL), и содержание другого (в данном случае PCLATH) не изменяют.
Собственно, это я Вам рассказываю даташит на любой контроллер среднего семейства ПИКов.
Для 16F6x8 - п. 4.3, для 16F87x - п. 2.3 (кстати, с картинками)
( и в 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?
Я не знаю, кто такой этот AN556, но об этом написанно в каждом даташите.Old Grumble писал(а):а AN556 об этом честно молчит!!!
ICQ нет, и, в ближайшее время, не будет.
- Old Grumble
- Открыл глаза
- Сообщения: 53
- Зарегистрирован: Вс июн 14, 2009 21:36:46
- Откуда: Кап.Яр-1 Астраханская обл.
Re: Как правильно скомпоновать программу для PIC?
Dastasheet на PIC16F62X "PIC16F627 PIC16F628 Datasheet" DS40300C pаge 25 - "3.3 PCL and PCLATH" - ни слова за исключением предупреждения о границе сегмента (0xFF).Dmitry Dubrovenko писал(а):Я не знаю, кто такой этот AN556, но об этом написанно в каждом даташите.Old Grumble писал(а):а AN556 об этом честно молчит!!!
(для непонятливых - 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


