Паскаль
для PIC
В статье описывается одно
из средств разработки программ для микроконтроллеров фирмы Microchip. В
данном случае это незаслуженно забытый язык программирования Паскаль.
Хотелось бы немного исправить положение дел и рассказать об
этом компиляторе. Статья будет полезна всем читателям,
занимающимся разработкой и написанием программ для PIC`ов.
Среди средств разработки для микроконтроллеров ведущее место по праву
занимает ассемблер и С. По умолчанию, ассемблер можно использовать с
бесплатной средой разработки для микроконтроллеров PIC MPLAB IDE. Это
конечно мощный язык программирования, позволяющий реализовать свой
замысел достаточно полно и с минимальными программными затратами. Но
главным препятствием его широкого использования является сложность в
применении в связи с тем, что количество инструкций в этих
микроконтроллерах ограничено для младшего семейства 33-мя командами,
для среднего семейства - 35 команд, для PIC17 - 58 команд, для PIC18 -
77 команд. Ограниченный набор инструкций значительно увеличивает размер
программы и как следствие этого - повышается сложность ее отладки и
поиск ошибок. Все эти факты не очень-то способствуют распространению
данного языка программирования.
Значительно повышается скорость разработки программы и ее отладка при
использовании языков высокого уровня. Для микроконтроллеров ведущим
языком по праву считается язык С. Изначально он разрабатывался для
максимально возможно полного контроля за "железом", поэтому его
возможности при работе с микроконтроллерами используются по максимуму.
Компиляторов, генерирующих код для микроконтроллеров, разработано очень
много, начиная от монстров типа IAR C или Hi-Tech С и заканчивая
бесплатными компиляторами типа SDCC. Все это многообразие положительно
сказывается на его популярности и к тому же на просторах Интернета
можно найти большое количество исходных текстов программ для работы с
самыми распространенными аппаратными интерфейсами: I2C, SPI, USART,
1-Wire и т.п.
Но для людей, которые знают и пишут программы на Паскале, достойного
компилятора не было, если не считать компилятор от нашего
соотечественника Павла Баранова SourceBoost P2Р Pascal Compiler. Автору
хотелось бы обратить внимание разработчиков программ на компилятор
mikroPascal [1],
который имеет несколько существенных плюсов, один из которых - это
цена, стоит это удовольствие $149. Кому-то это может показаться
достаточно дорого, но если внимательно посмотреть на цены компиляторов
с языка С, а некоторые из них стоят до нескольких тысяч долларов, то
получится, что этот компилятор выгодно отличается от них. Данный
компилятор можно загрузить по ссылке [2].
На этом же сайте [1] есть форум.
Кстати на этом же сайте можно скачать
и другие компиляторы: для людей знакомых с Basic'ом подойдет
mikroBasik, для любителей С - mikroC, правда стоит он будет несколько
дороже - $249.
Данный компилятор является условно-бесплатным: на нем можно создавать
работоспособные программы размером не более 2К слов микроконтроллера,
если же необходимо убрать это ограничение, то придется получить
регистрационный ключ. Информацию по этому можно узнать на Web сайте [1]
или во встроенной справочной системе в разделе How to Register.
С первого же взгляда компилятор производит хорошее впечатление:
программа имеет современный вид, редактор исходного текста поддерживает
подсветку синтаксиса, для быстрого перемещения по тексту программы с
левой стороны от редактора текста имеется Code Explorer, содержащий в
виде иерархической структуры все переменные и процедуры, определенные в
модуле. Положение курсора в Code Explorer синхронизировано с положением
курсора в редакторе текста, что позволяет легко находить реализации
функций, процедур или описание переменных в программе. Использование
Code Explorer особенно полезно при написании большой программы, когда
очень легко потеряться в самом исходном тексте. Рядом с Code Explorer
находится закладка QHelp, позволяя, при необходимости, легко
перемещаться по тексту справки. Вместе с ними находится закладка
Keyboard дающая возможность посмотреть кнопки быстрого запуска. Ниже
этих закладок имеется возможность настроить выбранный микроконтроллер,
под который производится компиляция кода, выбор тактовой частоты, на
которой он будет работать и тип генерируемого кода: для отладчика ICD
или без него. Кроме отладчика ICD есть довольно неплохой программный
отладчик, позволяющий просматривать во время работы программы при
помощи окна Stopwatch изменения переменных и системных регистров, а с
помощью окна Watch, устанавливать/удалять/просматривать точки останова.
Кроме возможности отлаживать код, есть много дополнительных встроенных
инструментов, которые могут помочь при разработке:
- Поддержка
программатора и отладчика PICFlash mikroICD, работающего через USB 2.0
- стоит $89.
- ASCii
Chart - дает возможность просмотра кода символа в десятичном,
шестнадцатеричном и двоичном виде.
- USART
Terminal - предназначен для прием/передача данных по RS232, для
осуществления связи микроконтроллера с компьютером. Есть возможность
записи лог файла, отправка строки символов или целого файла. Есть также
полезная возможность настройки формата представления данных на экране.
- mikroBootloader
- работа с загрузчиком микроконтроллера.
- EEprom
Editor - используется для редактирования памяти EEPROM микроконтроллера
и при установленной галочке Use this EEPROM definition содержание
EEPROM будет добавлено в hex файл при компиляции проекта.
- HID
Terminal - используется для связи с микроконтроллером, имеющим
интерфейс USB, также при помощи этой программы можно сгенерировать
файл, содержащий необходимые параметры для работы этого интерфейса.
Впоследствии этот файл можно будет использовать в проекте, в котором
необходимо будет использовать USB.
- MMC
Terminal - осуществляет связь с картами памяти типа MMC при помощи
интерфейса RS-232. К сожалению, дополнительной информации об этой
программе автору не удалось получить, могу только предположить, что для
связи используется как посредник микроконтроллер, который преобразует
запросы от компьютера в интерфейс MMC.
- GLCD
Bitmap Editor - следующая программа позволяет формировать из
графического файла файл с исходным текстом, содержащий байтовый массив
данных для компиляторов mikroPascal, mikroBasic, mikroC. Этот файл
впоследствии можно использовать в своей программе для вывода рисунка на
экран индикатора. Генерация кода осуществляется для трех индикаторов:
KS0108, T6963, Nokia3110. Для последнего индикатора есть свой
встроенный редактор, где можно нарисовать нужный рисунок.
- Seven
segment convertor - программа позволяет генерировать код для семи
сегментного индикатора с общим анодом или катодом.
- UDP
Terminal - позволяет принимать и передавать данные по протоколу UDP при
настройке программы микроконтроллера.
- Конвертер
- позволяет преобразовывать числа из одного формата в другой:
поддерживаются следующие системы счисления - десятичный, двоичный,
шестнадцатеричный, с плавающей точкой стандарта IEEE, с плавающей
точкой стандарта Microchip и представление этого числа в двоичном виде.
Из дополнительных
возможностей среды разработки можно выделить возможность просмотра
некоторых параметров откомпилированной программы при помощи View
Statistics. На закладке Memory usage графически показывается процент
памяти занятый программой в памяти RAM и ROM, на закладке Procedures
(sizes) можно посмотреть распределение памяти ROM, занятое каждой
процедурой. Эта возможность особенно полезна при оптимизации программы
по размеру, по ней можно отслеживать изменение размера процедуры после
проведения оптимизации. На вкладке Procedures (locations) можно
графически видеть область памяти, занимаемую в памяти процедур и
порядок их размещения в памяти. На вкладке Procedures
(details) можно посмотреть размер каждой процедуры, начальный и
конечный адрес размещения в памяти, максимальное использование стека,
особенно полезно, когда работаешь с прерываниями, т.к. заранее не
известно насколько будет занят стек самой программой и т.д. На вкладке
RAM можно посмотреть используемые в программе ячейки памяти RAM: общего
назначения GPR, для размещения необходимых переменных и задействованные
в программе служебные регистры SFR. На последней вкладке ROM
показывается ассемблерный листинг сгенерированной программы. Данное
окно вызывается из меню View.
Настроить текущий проект можно, вызвав из главного меню Project пункт
Edit Project .... В появившемся окне можно настроить параметры слова
конфигурации микроконтроллера, выбрать необходимый тип микроконтроллера
и задать рабочую частоту кварца. Если создается новый проект, то кроме
этих пунктов здесь задается название проекта и его расположение.
Список поддерживаемых микроконтроллеров приведен в таблице.
|
PIC12C671
|
PIC12C672
|
PIC12C508A
|
PIC12CE673
|
|
PIC12CE674
|
PIC12F629
|
PIC12F635
|
PIC12F675
|
|
PIC12F683
|
PIC16C61
|
PIC16C62
|
PIC16CR62
|
|
PIC16C62A
|
PIC16C62B
|
PIC16C63
|
PIC16CR63
|
|
PIC16C63A
|
PIC16C64
|
PIC16CR64
|
PIC16C64A
|
|
PIC16CR65
|
PIC16C65
|
PIC16C65A
|
PIC16C65B
|
|
PIC16C66
|
PIC16C67
|
PIC16C70
|
PIC16C71
|
|
PIC16CR72
|
PIC16C72
|
PIC16F72
|
PIC16C72A
|
|
PIC16F73
|
PIC16C73
|
PIC16C73A
|
PIC16C73B
|
|
PIC16C74
|
PIC16F74
|
PIC16C74A
|
PIC16C74B
|
|
PIC16F76
|
PIC16C76
|
PIC16C77
|
PIC16F77
|
|
PIC16CR83
|
PIC16F83
|
PIC16C83
|
PIC16CR84
|
|
PIC16C84
|
PIC16F84
|
PIC16F84A
|
PIC16F87
|
|
PIC16C432
|
PIC16C433
|
PIC16C554
|
PIC16C557
|
|
PIC16C558
|
PIC16C620
|
PIC16C620A
|
PIC16C621
|
|
PIC16C621A
|
PIC16C622
|
PIC16C622A
|
PIC16CE623
|
|
PIC16CE624
|
PIC16CE625
|
PIC16F627
|
PIC16F627A
|
|
PIC16F628
|
PIC16F628A
|
PIC16F630
|
PIC16F636
|
|
PIC16C642
|
PIC16C662
|
PIC16F676
|
PIC16F684
|
|
PIC16F685
|
PIC16F687
|
PIC16F688
|
PIC16F689
|
|
PIC16F690
|
PIC16C710
|
PIC16C711
|
PIC16C712
|
|
PIC16C715
|
PIC16F716
|
PIC16C716
|
PIC16C717
|
|
PIC16F737
|
PIC16C745
|
PIC16F747
|
PIC16C765
|
|
PIC16F767
|
PIC16C770
|
PIC16C771
|
PIC16C773
|
|
PIC16C774
|
PIC16F777
|
PIC16C781
|
PIC16C782
|
|
PIC16F785
|
PIC16F818
|
PIC16F819
|
PIC16F870
|
|
PIC16F871
|
PIC16F872
|
PIC16F873
|
PIC16F873A
|
|
PIC16F874
|
PIC16F874A
|
PIC16F876
|
PIC16F876A
|
|
PIC16F877
|
PIC16F877A
|
PIC16F913
|
PIC16F914
|
|
PIC16F916
|
PIC16F917
|
PC16F946
|
PIC16C923
|
|
PIC16C924
|
PIC16C925
|
PIC16C926
|
PIC18F24J10
|
|
PIC18F44J10
|
PIC18F45J10
|
PIC18F65J10
|
PIC18F65J15
|
|
PIC18F66J10
|
PIC18F66J15
|
PIC18F67J10
|
PIC18F85J10
|
|
PIC18F85J15
|
PIC18F86J10
|
PIC18F87J10
|
PIC18F242
|
|
PIC18F248
|
PIC18F252
|
PIC18F258
|
PIC18F442
|
|
PIC18F448
|
PIC18F452
|
PIC18F458
|
PIC18F1220
|
|
PIC18F1320
|
PIC18F2220
|
PIC18F2221
|
PIC18F2320
|
|
PIC18F2321
|
PIC18F2331
|
PIC18F2410
|
PIC18F2420
|
|
PIC18F2431
|
PIC18F2439
|
PIC18F2455
|
PIC18F2480
|
|
PIC18F2510
|
PIC18F2515
|
PIC18F2520
|
PIC18F2525
|
|
PIC18F2539
|
PIC18F2550
|
PIC18F2580
|
PIC18F2585
|
|
PIC18F2610
|
PIC18F2620
|
PIC18F2680
|
PIC18F4220
|
|
PIC18F4221
|
PIC18F4320
|
PIC18F4321
|
PIC18F4331
|
|
PIC18F4410
|
PIC18F4420
|
PIC18F4431
|
PIC18F4439
|
|
PIC18F4455
|
PIC18F4480
|
PIC18F4510
|
PIC18F4515
|
|
PIC18F4520
|
PIC18F4525
|
PIC18F4539
|
PIC18F4550
|
|
PIC18F4580
|
PIC18F4585
|
PIC18F4610
|
PIC18F4620
|
|
PIC18F4680
|
PIC18F6310
|
PIC18F6390
|
PIC18F6410
|
|
PIC18F6490
|
PIC18F6520
|
PIC18F6525
|
PIC18F6527
|
|
PIC18F6585
|
PIC18F6620
|
PIC18F6621
|
PIC18F6622
|
|
PIC18F6627
|
PIC18F6680
|
PIC18F6720
|
PIC18F6722
|
|
PIC18F8310
|
PIC18F8390
|
PIC18F8410
|
PIC18F8490
|
|
PIC18F8520
|
PIC18F8525
|
PIC18F8527
|
PIC18F8585
|
|
PIC18F8620
|
PIC18F8621
|
PIC18F8622
|
PIC18F8627
|
|
PIC18F8680
|
PIC18F8720
|
PIC18F8722
|
|
В основном компилятор
поддерживает микроконтроллеры с памятью типа Flash, как наиболее
перспективные при разработке устройств, не только для радиолюбителей,
но и для производственных целей, т.к. позволяют производить
многократную смену программного обеспечения микроконтроллера, изменяя
функциональные возможности устройства. В особенности хорошо это видно
на микроконтроллерах старшей серии PIC18.
Компилятор также поддерживает возможность оптимизации, хотя настроить
или отключить его нельзя. Из основных возможностей оптимизации стоить
отметь, ставшей стандартом, вычисление выражения на стадии компиляции и
замена его константой, если переменной присваивается константа, то
вместо переменной используется константа, если компилятор нашел код, не
используемый в программе, то этот код не используется при генерации.
Кроме этого поддерживается локальная оптимизация переменных и кода, а
также более рациональное использование служебных переменных. Из
сомнительных возможностей оптимизации стоить отметить случай, когда
компилятор видит две переменные, принимающие одинаковые значения, то он
удаляет одну из них до конца кода и использует только одну переменную.
То же самое касается и случая когда компилятор видит, что два разных
выражения выдают один и тот же результат, то он заменит их на одно. Все
эти возможности оптимизации могут приводить к трудно уловимым ошибкам,
которые в последствии будет сложно определить и устранить.
С компилятором поставляется хорошая встроенная библиотека
дополнительных функций, расширяющая и упрощающая написание готовых
программ: есть встроенные функции для работы со всеми имеющимися в
микроконтроллере встроенными модулями АЦП, CAN, SPI, I2C, USART, ШИМ,
USB и т.д. Есть библиотека для работы с картами памяти типа Compact
Flash, для упрощения доступа к встроенной памяти типа EEPROM
используются функция чтения Eeprom_Read и процедура записи в память
Eeprom_Write. При использовании микроконтроллера для связи с сетью типа
Internet можно воспользоваться библиотекой поддерживающей основные
протоколы (ARP, IP, TCP/IP, UDP/IP, ICMP/IP), при этом связь
микроконтроллера с Интернетом осуществляется при помощи микросхемы
RTL8019AS или ENC28J60. Есть хорошая библиотека для работы с
символьными и графическими ЖК-индикаторами. Вообще список встроенных
библиотек достаточно широк и позволяет больше внимания уделять самой
программе, а не писать библиотеки подпрограмм, осуществляющих работу с
необходимыми интерфейсами или реализующими стандартные операции типа
преобразования из числа строку символов или из двоичного числа получить
число в виде BCD.

Все эти вроде бы несущественные возможности оказывают очень хорошее
впечатление на этот компилятор в целом, сразу видно о продуманности и
интерфейса и дополнительных инструментов, которые, возможно, пригодятся
при создании программы. К плюсам самой среды разработки стоит отнести
легкость и простоту использования, когда не приходится учиться работать
с программой, что особенно важно при переходе от одного компилятора
(среды разработки) к другому.
LEX_X