Вы находитесь на странице: 1из 114

PicBasic Pro Compiler -1-

PicBasic Pro Compiler


microEngineering Labs, Inc.

____________________________________________________________________________

COPYRIGHT NOTICE

Copyright c2002 microEngineering Labs, Inc.


All rights reserved.

This manual describes the use and operation of the PicBasic Pro
Compiler from microEngineering Labs, Inc. Use of the PicBasic Pro
Compiler without first obtaining a license is a violation of law. To
obtain a license, along with the latest version of the product and
documentation, contact microEngineering Labs, Inc.

Publication and redistribution of this manual over the Internet or in


any other medium without prior written consent is expressly forbidden.
In all cases this copyright notice must remain intact and unchanged.

microEngineering Labs, Inc.


Box 60039
Colorado Springs CO 80960-0039
(719) 520-5323
(719) 520-1867 fax
email: support@melabs.com
web: www.melabs.com

TRADEMARKS

EPIC and PicBasic Pro are trademarks of microEngineering Labs, Inc.


BASIC Stamp is a trademark of Parallax, Inc.
PICmicro is a registered trademark of Microchip Technology Inc.

5/02a

____________________________________________________________________________

Предисловие переводившего.

Перевод кустарный. Просто мне не удалось разыскать описание PIC BASIC


на русском языке, пришлось разбирать английский. Касательно единства
стиля, - всякий стиль вообще отсутствует как таковой, даже и не ищите.
Задача была - попросту понять, что же хотели сказать авторы. Понять
мне удалось не все. Вероятно, смысл некоторых абзацев здорово
перевран, я не мог проверить на опыте.
Этот текст сделан по черновику машинного перевода, поэтому, кое-где
можно найти несоответствия в роде или падеже, не замеченные мной при
правке ввиду значительного объема работы.
Так что, уж не пеняйте: "что выросло - то выросло!"(C).

Эгиль Д. Шу,
лето 2005.

----------------------------------------------------------------------
PicBasic Pro Compiler -2-

1. Введение

PicBasic Pro Compiler (или PBP) - наш язык программирования следующего


поколения, который делает более живым и простым для Вас
программирование мощных микроконтроллеров Microchip PICmicro
Technology. Бейсик, подобный Английскому, намного более легкий для
чтения и написания чем накрученный ассемблер Microchip.

PBP подобен BASIC Stamp II и имеет большинство библиотек и функций


BASIC Stamp I и II. Это полноценный компилятор, и программы
выполняются намного быстрее и могут быть длиннее чем их эквиваленты в
Stamp.

PicBasic Pro не столь же хорошо совместим с BASIC Stamps как наш


исходный PicBasic компилятор - с BASIC Stamp I. Мы надеемся, что
сделанные изменения в целом улучшили язык. Одно из них, например,
добавлен настоящий IF..THEN..ELSE..ENDIF вместо IF..THEN(GOTO) из
Stamps. Эти различия описаны далее в этом руководстве более подробно.

PBP по умолчанию создает файлы, которые выполняются на PIC16F84-04/P с


тактовой частотой 4MHz. Из других деталей необходимо минимум: два
конденсатора по 22pf, кварц 4MHz, резистор 4.7K, связанный со штырьком
/MCLR и электропитание 5 вольт. Многие микроконтроллеры PICmicro
отличающиеся от 16F84, также как и генераторы частот других чем 4MHz,
тоже могут быть использованы с PBP.

1.1. Микроконтроллеры PICmicro

PicBasic Pro Compiler производит код, который может быть


запрограммирован в широкое разнообразие микроконтроллеров PICmicro,
имеющих от 8 до 84 ножек и различные особенности, включая встроенные
A/D конвертеры, аппаратные таймеры и последовательные порты.

Текущая версия PBP поддерживает все микроконтроллеры Microchip


Technology PICmicro, включая 12-разрядное ядро, 14-разрядное ядро и
серию на 16-разрядном ядре, устройства PIC17CXXX и PIC18XXXX, также
как и Micromint PicStics. Ограниченная поддержка была добавлена для
микроконтроллеров PICmicro, основанных на исходном 12-разрядном ядре.
Поддержка ограничена 12-разрядными микроконтроллерами имеющими
ограниченный набор ресурсов, включая меньший стек и меньший размер
кодовой страницы. См. список в README.TXT о самом последнем
поддерживаемом микропроцессоре.

В общем, микропроцессорные разработки, использующие PicBasic Pro


Compiler, PIC16F628, 16F84, 16F876, 16F877, 18F252 и 18F452 - выбраны.
Эти микроконтроллеры использующие технологию flash, позволяют быстрое
стирание и перепрограммирование, допуская быструю отладку программы.
Щелчком мыши в программном обеспечении программатора, flash MCU
PICmicro может быть немедленно стерт и затем перепрограммирован снова
и снова. Другие микроконтроллеры PICmicro, маркированные буквой C:
PIC12C5XX, 12C67x, 14C000, 16C4xx, 16C5x, 16C55x, 16C6xx, 16C7xx,
16C9xx, 17Cxxx, 18Cxxx - однократно программируемые (OTP), а имеющие
кварцевое окно в корпусе (JW) - требуют стирания на ультрафиолетовой
лампе за несколько минут.

PIC16F628, 16F84, 16F87x и 18Fxxx устройства содержат от 64 до 1024


байтов энергонезависимой памяти данных, которая может
использоваться, чтобы сохранить данные программы и другие параметры,
PicBasic Pro Compiler -3-

когда питание выключено. К этой области данных можно обращаться


просто, используя команды READ и WRITE. (Программный код всегда
постоянно сохраняется в пространстве кода MCU PICmicro, включено
питание или отключено.)

Используя flash MCU PICmicro для начального испытания программы,


процесс отладки может быть ускорен. Когда главные подпрограммы
отлажены, MCU PICmicro с расширенными возможностями могут
использоваться.

В то время как много особенностей MCU PICmicro будут обсуждены в этом


руководстве, для полной информации MCU PICmicro необходимо получить
соответствующие данные или CD-ROM от Microchip Technology.
Обратитесь к Приложению F для информации о возможностях контактов.

1.2. Об этом руководстве

Это руководство не является полным трактатом о языке BASIC. Оно


описывает систему команд PBP и обеспечивает примеры о том, как
использовать это. Если Вы не знакомы с программированием на Бейсике,
Вы должны приобрести книгу по теме. Или прямо начинайте: Бейсик
разработан как удобный в работе язык. Испробуйте несколько простых
команд, чтобы видеть, как они работают. Или начните с примеров и затем
пользуйтесь ими.

Следующий раздел этого руководства охватывает установку PicBasic Pro и


запись вашей первой программы. Затем - раздел, описывающий различные
параметры для компилирования программ.

Затем охвачены основы программирования, сопровожденные разделом


справок, где каждая команда PicBasic Pro описана подробно. Раздел
справок показывает каждый прототип команды, описание команды и
некоторые примеры. Фигурные скобки {} указывают необязательные
параметры.

Остальная часть руководства содержит информацию для продвинутого


программиста - о внутренней работе транслятора.

1.3. Типовые программы

Примеры программ, чтобы помочь Вам начать, находятся в подкаталоге


SAMPLES. Дополнительные примеры программ можно найти в разделе типовых
программ на сайте microEngineering Labs, Inc.

Прим. пер. Работоспособность этих примеров на практике я не


проверял. Но, просматривая, заметил разницу с приводимыми в этом
руководстве текстами. Так что ошибки очень даже возможны, но я
оставил, как они мне достались. Кто наломал - не знаю.
PicBasic Pro Compiler -4-

2. Начало

2.1. Инсталляция PicBasic Pro.

Файлы PicBasic Pro сжаты в само-извлекающийся файл на дискете. Они


должны быть распакованы на ваш жесткий диск перед использованием.
Это может быть сделано в DOS или Windows. Чтобы распаковать архив в
DOS, создайте подкаталог на вашем жестком диске, назовите PBP или
иначе, на ваш выбор, печатая:

md PBP

в командной строке DOS. Войдите в созданный каталог:

cd PBP

Вставьте дискету с дистрибутивом в дисковод a: и распакуйте архив в


подкаталог PBP:

a:\pbpxxx -d

Где xxx - номер версии транслятора на диске. Не забудьте -d опцию в


конце команды. Это гарантирует что надлежащие подкаталоги внутри PBP
будут созданы.

Также INSTALL.BAT может быть выполнен, чтобы совершить подобные шаги.


Если Каталог PBP уже существует, Вы получите сообщение об ошибках и
инсталляция продолжится.

Удостоверитесь, что FILES и BUFFERS установлены в по крайней мере 50 в


вашем файле CONFIG.SYS. В зависимости от того, сколько FILES и BUFFERS
уже в использовании вашей системой, больший номер может
понадобиться.

Чтобы устанавливать PicBasic Pro в Windows, выполните A:\INSTALL.BAT


из пункта "Выполнить" в Меню Пуск Windows.

Прочтите README.TXT файл на дискете для получения дополнительной


информации о распаковке архива. Также читайте README.TXT файл, который
распакован в каталог PBP на вашем жестком диске для самой свежей
информации о PBP.

2.2. Ваша Первая Программа

Для работы с компилятором PicBasic Pro Вы будете нуждаться в текстовом


редакторе для создания вашего исходного файла программы, каком-нибудь
программаторе микроконтроллеров PICmicro типа нашего EPIC Plus
PICmicro Programmer, и сам PBP. Конечно Вы также нуждаетесь в PC,
чтобы выполнить все это.

Последовательность действий является чем-нибудь вроде этого:

Сначала создайте исходный файл Бейсик-программы, использовав выбранный


Вами текстовый редактор. Если Вы не знаете, какой выбрать,
воспользуйтесь, например, досовским EDIT (в комплекте MS-DOS) или
NOTEPAD из комплекта Windows и Windows95/98. Имя исходного файла
должно (но не обязательно) оканчиваться расширением .BAS .

Текстовый файл, который создан, должен содержать только текст ASCII.


Не должно быть никаких специальных кодов (которые иногда автоматически
вставляются некоторыми текстовыми процессорами для их собственных
PicBasic Pro Compiler -5-

нужд. Но в этом случае они обычно дают опцию на сохранения файла как
чистый текст DOS или ASCII).

Ниже следующая программа обеспечивает хорошее первое испытание


микропроцессора на опыте. Вы можете напечатать это или просто
копировать это из подкаталога PBP\SAMPLES, файл называется BLINK.BAS.
Такой исходный файл должен быть создан или перемещен в тот же самый
каталог, где находится PBP.EXE.

' Пример программы моргания светодиода (LED), подключенного к PORTB.0 раз в


секунду.
loop: High PORTB.0 ' Включение LED
Pause 500 ' Задержка 0.5 сек
Low PORTB.0 ' Выключение LED
Pause 500 ' Задержка 0.5 сек
Goto loop ' Возврат обратно, циклически моргание LED снова.
End

Когда Вы убедились, что программа, которую Вы написали, должна


работать безупречно, можно выполнить компиляцию при помощи PicBasic
Pro, вводя PBP и затем имя вашего текстового файла в командной строке
DOS. Например, если Текстовый файл, который Вы создавали, назван
BLINK.BAS, команда DOS будет:

PBP blink

Компилятор отобразит копирайт и обработает ваш файл. Если ваш файл


удовлетворителен, будет создан исходный текст на ассемблере (в этом
случае с именем BLINK.ASM) и автоматически вызван Ассемблер (PM),
чтобы завершить задачу. Если все идет хорошо, конечный файл кода MCU
будет создан с именем BLINK.HEX (в этом случае). Если компиляция
неудачна, будет показана строка ошибок, которые должны быть исправлены
в вашем исходном BASIC-файле прежде, чем Вы попробуете компилировать
снова.

Чтобы помочь гарантии, что ваш исходный файл является безупречным,


лучше начать запись и испытание вашей программы короткими частями, чем
записать целиком 100,000 непрерывных строк зараз, и затем пытаться
отлаживать это с начала до конца.

Если Вы не установили иное, по умолчанию PBP создает код для PIC16F84.


Чтобы компилировать код для других микропроцессоров, используйте опцию
-P командной строки (описана ниже в этом руководстве), чтобы
определить соответствующий объектный процессор. К примеру, если Вы
намереваетесь выполнить вышесказанную программу BLINK.BAS на
PIC16F877, компилируйте ее, используя команду:

PBP -p16f877 blink

2.3. Программирование микроконтроллера

Остались два шага: помещение вашей откомпилированной программы в


микроконтроллер PICmicro и испытание этого.

PBP генерирует стандартный 8-разрядный HEX-файл (по спецификации


Intel), который может использоваться с любым программатором
микроконтроллеров, типа нашего EPIC Plus PICmicro Programmer.
Микроконтроллеры PICmicro не могут программироваться при помощи
программирующего кабеля от BASIC Stamp.

Следующее - пример того, как микропроцессор PICmicro может быть


запрограммирован с использованием нашего EPIC Plus PICmicro
PicBasic Pro Compiler -6-

Programmer.

Удостоверьтесь, что никакой микропроцессор не установлен в


программатор.

Соедините EPIC Plus PICmicro Programmer c PC через параллельный порт


(принтерный) 25-контактный, розетка, проводом с 25-контактной вилкой.

Подключите питающий адаптер программатора, или вставьте 2 исправных


9-вольтовых батареи и установите джампер "Batt ON". Но лучше все же
пользоваться адаптером питания от сети, чем батарейками.

Лампочка включения программатора не должна гореть, когда


микропроцессор вставляется в панель программирования, а программы
обеспечения программатора должны быть уже запущены.

Под Windows, запустить EPICWin. EPICWin - 32-разрядная версия для


Windows 95, 98, ME, NT, 2000 или XP.

Если Вы имеете только DOS или Windows 3.1, используйте DOS-версию


EPIC. DOS-версия EPIC выполняется только в сеансе "чистой" DOS.
DOS-версия EPIC поддерживает ограниченное число микроконтроллеров.
Используйте EPICWIN для программирования самых последних
микроконтроллеров PICmicro. Просмотрите EPIC readme файл для
законченного списка поддержки.

Программное обеспечение EPIC произведет поиск подключенного


программатора и подготовит его к работе. Если программатор не найден,
проверьте все кабели и убедитесь, что в панель программирования ничего
не вставлено. Как только экран программирования отображен, выберите
тип микроконтроллера. Затем кликните мышкой на Open file и выберите
BLINK.HEX или другой файл, которым Вы хотели запрограммировать.

Файл загрузится и Вы можете смотреть на окно Code, чтобы видеть ваш


код программы для MCU. Вы должны также смотреть на окно Configuration
и желательно проверить перед продолжением.

Вообще, Oscillator должен быть установлен в XT для 4MHz кварца и


Watchdog Timer должен быть установлен в ON для программ PicBasic Pro.
Больше всего важно, Code Protect должен быть OFF при программировании
любого микроконтроллера с прозрачным окном (JW), иначе Вы не сможете
снова стереть его. Вы можете найти более подробную информацию в
описании на микроконтроллер, который Вы используете.

-----------------
Примечание пер.: Кварц, конечно, вещь хорошая. Но не для каждой
конструкции требуется высокая точность поддержания скорости
микроконтроллера. Многие микроконтроллеры, в т. ч. PIC16F84 можно
запускать без кварца, при помощи одного конденсатора. Но для этого,
вместо XT в Configuration программатора надо установить RC. Тогда
микроконтроллер будет запрограммирован на работу с конденсатором.
Для дальнейшей (самостоятельной) работы микроконтроллера, этот
конденсатор подключается вместо кварца по следующей схеме:

земля ────┤├─┬──████─── +5V R = 4.7k .. 100k


C │ R C >= 20pF
OSC1

Частоту (МГц) можно определить по формуле (кОм, пФ):


f = 740*(1+R/1000)/(R*C+4*R+40)

Вывод OSC2 будет тогда являться выходом, на котором выделяется f/4,


PicBasic Pro Compiler -7-

которую можно использовать в конструкции. Более новые


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

Вот теперь можно вставить микроконтроллер в программатор и щелкнуть на


Program. MCU будет сначала проверен, что он пуст, и затем ваш код
будет записан в него. Если микропроцессор не пустой и это PIC16F84 или
другое flash или EEPROM устройство, Вы можете программировать без
предварительного стирания.

Как только программирование закончено и индикатор погас, пришло время


испытать Вашу программу.

2.4. Это в жизни

Типовое схемное решение ниже показывает Вам, как надо подключать MCU
PICmicro, чтобы он работал. В основном, все, в чем Вы нуждаетесь - это
резистор в цепи /MCLR, кварц 4MHz с двумя конденсаторами, и
какой-нибудь источник 5 вольт. Нам надо еще добавить светодиод (LED) с
резистором, чтобы увидеть результат работы программы BLINK.

+5V +5V
│ │
│ │
│ │
│ 1┌───────────┐18 │
│ ─┤RA2 RA1├─ 22pf │
┌┴┐ 2│ │17 │
4.7K│ │ ─┼RA3 RA0├─ ┌───┬────┤├─┐ │
│ │ 3│ │16│ ─┴─ │ │
└┬┘ ─┼RA4 OSC1├──┘ ░░░ ├───┐ │
│ 4│____ │15 ─┬─ │ │ │
└────────┤MCLR OSC2├──────┴────┤├─┘ │ │
5│ │14 22pf ─┴─ │
┌─────────────┤Vss Vdd├──────────────────────┤
│ 6│ │13 │
│ ┌────┤RB0 RB7├─ │
│ ┌┴┐ 7│ │12 ─┴─
│ 470│ │ ─┤RB1 RB6├─ 0.1мкФ ─┬─
│ │ │ 8│ │11 │
│ └┬┘ ─┤RB2 RB5├─ │
│ +_│_ 9│ │10 │
│ LED \ / ─┤RB3 RB4├─ │
│ ─┬─ └───────────┘ │
│ │ PIC16F84 │
│ │ │
─┴─ ─┴─ ─┴─

Изготовьте, внимательно проверяя, эту простую схему на макетной плате


с микроконтроллером, который Вы только что запрограммировали. Наши
макетные платы PICProto хороши для таких вещей.

Включите электропитание. Микроконтроллер должен ожить и начать мигать


PicBasic Pro Compiler -8-

LED раз в секунду. Если это не мигает, проверить все соединения и


удостовериться, что 5 вольт присутствуют на соответствующих ножках
микроконтроллера.

С подобного простого начала, Вы можете создавать свою собственную


программу, завоевывающую мир.

2.5. Возможные проблемы

Наиболее обычные проблемы требуют проверить, что различные внешние


компоненты имеют соответствующие параметры и должным образом соединены
с микроконтроллером. Следующее подсказки, призваны помочь наладить
выполнение.

Удостоверьтесь, что штырек /MCLR связан с 5V через какую-либо цепь


сброса или просто через резистор 4.7k. Если Если Вы оставите штырек
неподключенным, его уровень будет "плавать" и иногда MCU может
работать, но обычно - не будет. MCU PICmicro имеют встроенную схему
автоматического сброса при включении, поэтому допускается просто
резистор. В некоторых случаях, когда MCU PICmicro не может
запуститься должным образом, внешняя схема сброса может быть
необходима. См справочник Microchip для дополнительной информации.

Убедитесь, что Вы имеете хороший кварц с конденсаторами правильного


номинала, подключенными к нему. Номинал конденсаторов может оказаться
сложно разобрать. Если конденсаторы отсутствуют или слишком велики,
генератор не будет запускаться чтобы давать должным образом 4MHz.
Кварц с двумя керамическими дисковыми конденсаторами по 22pF хорошо
запускает большинство микроконтроллеров PICmicro. Опять же, посмотрите
справочник Microchip для дополнительных соображений по этому вопросу.

Удостоверьтесь, что электропитание приходит. В то время как сам MCU


PICmicro потребляет очень небольшую мощность, электропитание должно
быть фильтровано довольно хорошо. Если MCU PICmicro управляет
устройствами, которые потребляют большой ток когда включаются и
выключаются, они могут вызвать достаточную помеху по цепям питания,
чтобы нарушилась нормальная работа MCU. Даже светодиодный индикатор
может создать достаточный мгновенный импульс, чтобы кратковременно
подсаживалось слабое электропитание (как, например, 9-вольтовая
батарейка) и микроконтроллер в результате терял весь свой разум.

Маленькое начало. Пишите короткие программы, чтобы протестировать


особенности, в которых Вы не уверены или подозреваете возможные
проблемы. Как только эти тестовые программы работают должным образом,
в этом виде можно пользоваться ими.

Пытайтесь использовать различные пути. Иногда то, что Вы пробуете


делать должно, казалось бы, работать, но не работает, независимо от
того, сколько усилий Вы прикладываете. Обычно имеется больше чем один
способ оформить программу. Попытайтесь подойти к проблеме с другой
стороны, и возможно, озарение последует.

2.5.1. Специальные вопросы MCU PICmicro

ОБЯЗАТЕЛЬНО ПРОЧИТАЙТЕ ОПИСАНИЕ ОТ MICROCHIP НА ТЕ МИКРОКОНТРОЛЛЕРЫ,


КОТОРЫЕ ВЫ ИСПОЛЬЗУЕТЕ. Некоторые устройства имеют особенности
которые могут сталкиваться с ожидаемыми операциями штырька. PIC16C62X
и 16F62x (частично 16C620, 621, 622, 16F627 и 628) хороший пример
этого. Эти микроконтроллеры PICmicro имеют аналоговые компараторы на
PORTA. Когда эти микросхемы запускаются, PORTA установлен в аналоговый
режим. Это заставляет штырек PORTA функционировать неожиданным
образом. Чтобы переключить штырьки на цифровой режим, просто добавьте
PicBasic Pro Compiler -9-

строку:

CMCON = 7

в начале вашей программы.

Любой MCU PICmicro с аналоговыми входами, серий PIC16C7xx, PIC16F87x и


PIC12C67x, стартуют в аналоговом режиме. Если Вам нужен цифровой
режим, установите его

ADCON1 = 7

Другой пример возможных затруднений - когда штырек 4 PORTA используют


как выход. Дело в том, что этот штырек имеет "открытый выход" в
отличие от остальных выходов биполярных. Это означает, что он может
соединять с "землей" когда установлен уровень 0, но будет просто
отключен, когда установлен в 1, вместо соединения с высоким уровнем.
Заставить этот штырек работать обычным способом можно, поставив между
ним и проводом 5V резистор от 1К до 33К, в зависимости от устройства,
подключенного к этому штырьку. Работа этого штырька не отличается от
всех остальных, когда используется как вход.

Некоторые микроконтроллеры типа PIC16F627, 628, 873, 874, 876 и 877,


позволяют низковольтное программирование. Эта функция занимает один из
штырьков PORTB и может заставлять устройство действовать беспорядочно,
если этот штырек не соединен с "землей". Лучше всего - удостовериться,
что режим низковольтного программирования не задействован в то время,
когда MCU уже запрограммирован.

Все штырьки MCU PICmicro установлены как входы при включении питания.
Если надо, чтобы штырек был выходом, установите ему режим выхода
прежде, чем начнете использовать, или примените соответствующую
команду PicBasic Pro, которая сделает это автоматически. Еще раз,
перечитайте описание на микроконтроллер, чтобы ознакомиться со
специфическими особенностями.

Нет регистра направления данных (TRIS) для PORTA на PIC17Сxxx


устройствах. Поэтому, команды, которые опираются на регистр TRIS в
своем функционировании, типа I2CRead и I2CWrite, не могут
использоваться на PORTA.

Имена штырьков порта на PIC12C5XX, 12CE5xx, 12C67x и 12CE67x


устройствах- GPIO. Имена для регистра TRIS- TRISIO.

GPIO.0 = 1
TRISIO = %101010

На PIC12C5XX и 12CE5xx устройствах, штырьки GPIO.2, принудительно


входы, независимо от настройки регистра TRIS. Чтобы использовать этот
штырек как стандартный штырек ввода-вывода, добавьте следующую строку
в начале программы:

OPTION_REG.5 = 0

Как подсказано выше, имя OPTION регистра на всех микроконтроллерах


PICmicro - OPTION_REG.

Некоторые микроконтроллеры PICmicro имеют встроенную долговременную


память данных подключенную через интерфейс I2C как последовательное
EEPROM. READ и WRITE не будут работать на таких устройствах со
встроенной I2C-EEPROM, как PIC12CE51X, 12CE67x и 16CE62x в частности.
Используйте команды I2CREAD и I2CWRITE вместо READ и WRITE.
PicBasic Pro Compiler - 10 -

Некоторые микроконтроллеры PICmicro, особенно PIC12C671, 672, 12CE673


и 674, имеют встроенные RC-генераторы. Эти устройства содержат
калибровочный коэффициент генератора в конце пространства кода.
Встроенный генератор может быть подстроен присвоением данных от этого
расположения и помещением их в регистр OSCCAL. Два DEFINE, были
созданы, чтобы совершать эту задачу автоматически каждый раз при
запуске программы:

Define OSCCAL_1K 1 'Установка OSCCAL для 1K устройства


Define OSCCAL_2K 1 'Установка OSCCAL для 2K устройства

Вставьте одно из этих двух определений в начало PicBasic Pro


программы, чтобы совершать настройку OSCCAL.

Если УФ-ППЗУ было стерто, значение не может читаться из памяти. Если


один из этих DEFINE, используется на стертой части, это введет
программу в бесконечный цикл. Чтобы установить OSCCAL на стертую
часть, в начале программы добавьте строку:

OSCCAL = $a0 'Установить регистр OSCCAL в $a0

$a0 - просто пример. Фактическое значение OSCCAL для конкретного


устройства должно было быть получено прочтением прежде стирания.

PicBasic Pro автоматически загрузит значение OSCCAL для PIC12C5xx и


12CE51x устройств, если это доступно. С этими устройствами
вышесказанные определения не требуются.

Пожалуйста просмотрите описание на микроконтроллер для дополнительной


информации об OSCCAL и любого из других регистров MCU PICmicro.

2.5.2. Совместимость PicBasic и BASIC Stamp

Имеются некоторые различия между стандартным PicBasic Compiler, BASIC


Stamps и PicBasic Pro Compiler. См. Раздел 10 для информации
относительно этих различий.

2.5.3. Сообщение о кодах, пересекающих границу страницы памяти

Во многих микроконтроллерах PICmicro память сегментируется в 512, 2K


или 8K текстовые страницы. Когда большие файлы транслируются и затем
собираются, они могут начать использовать более чем первую страницу.
Когда каждая страница используется, PM, ассемблер, передаст сообщение,
что код пересекает определенную границу. Это - нормально, и не причина
для тревоги. PBP позаботится о большинстве сообщений для Вас.

Единственная вещь, на которую Вы должны обратить внимание - это


команда BRANCH. Если BRANCH пытается переходить к метке по другую
сторону границы, это не будет работать правильно. BRANCHL должно
использоваться взамен (может адресовать метки на любой кодовой
странице).

2.5.4. Ошибка Out of Memory

Компилирование больших PicBasic-файлов исходной программы может


исчерпать память PC, на котором запущен компилятор. Если выдана ошибка
Out of Memory а FILES и BUFFERS установлены как выше рекомендовано,
воспользуйтесь альтернативной версией PBPW.EXE под Windows. Она может
использовать всю память доступную под Windows 95, 98,ME, NT, 2000 и
XP. Вы должны,конечно, выполнять в DOS-сессии одной из этих 32-бит
Windows сред или быть внутри Microchip's MPLAB или другой Windows IDE.
PicBasic Pro Compiler - 11 -

Для того, чтобы запустить Windows-версию из командной строки DOS,


просто замените PBPW для PBP.

PBPW blink

2.6. Стиль кодирования.

Написание удобочитаемых и эффективных программ - искусство. Есть


несколько простых техник которым Вы можете последовать, что поможет
Вам сделаться художником.

2.6.1. Комментарии

Используйте побольше комментариев. Даже если некоторый код вполне


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

Делайте комментарии, сообщающие Вам нечто полезное о действии


программы. Комментарий типа "Pin0 устанавливается в 1" просто
дублирует синтаксис языка но не делает ничего, чтобы пояснить Вам
почему программа должна сделать это. А что-нибудь вроде "Включаем
индикатор разрядки батареи" могло бы быть значительно полезнее.

Блок комментариев в начале программы и перед каждой секцией кода


сможет описать что именно должно случаться, более подробно чем
пространство, остающееся после каждой команды. Но не пренебрегайте
также и комментариями индивидуальной строки - используйте оба.

В начале программы описывается, что программа предназначена делать,


кто ее писал и когда. Может также оказаться полезным внести список
обновления версий и даты. Укажите какой штырек куда подключается; это
может быть полезно чтобы помнить, под какие аппаратные средства эта
конкретная программа разрабатывается. Если она собирается быть
выполняемой с нестандартным кварцем или специальными параметрами
трансляции, обязательно укажите это.

2.6.2. Имена штырьков и переменных

Делайте имя штырька или переменной более информативным, чем Pin0 или
B1. Кроме того, дружественное использование комментариев, понятность
описаний штырьков и имен переменных может существенно увеличить
удобочитаемость. Следующий фрагмент кода демонстрирует:

BattLED var PORTB.0 ' индикатор разряда батареи


level var byte ' переменная содержит уровень заряда батареи

If level < 10 Then ' если уровень батареи низкий


High BattLED ' включаем светодиод
Endif

2.6.3. Метки

Метки должны также быть более понятными чем "label1:" или "here:".
Даже метка "loop:" более описательна (хоть и немного). Обыкновенно,
строка или программа, на которую Вы переходите делает нечто особенное.
Попытайтесь дать хотя бы намек на ее функции меткой и последующим
комментарием.
PicBasic Pro Compiler - 12 -

2.6.4. GOTO

Постарайтесь не использовать слишком много GOTO. Пока GOTO является


неизбежным злом, пытайтесь минимизировать их использование сколь
возможно. Пытайтесь записывать ваш код логическими секциями и не
прыгать по сторонам слишком много. При соблюдении этого, GOSUB может
быть полезен.

3. Опции командной строки

3.1. Использование

PicBasic Pro Compiler может быть вызван из DOS командной строки,


используя следующий формат команды:

PBP Options Filename

Несколько Опций могут использоваться, чтобы модифицировать способ,


которым PBP компилирует заданный файл. Опции предваряются знаком
минуса (-) или наклонной чертой вправо (/). Символ после минуса или
черты - буква, которая устанавливает Опцию. Могут следовать еще
дополнительные символы, если Опция требует более информации. Каждая
Опция должна быть отделена пробелом и никакие пробелы не должны
появляться внутри Опции.

Несколько Опций могут использоваться совместно. Например командная


строка:

PBP -p16c71 -ampasm blink

вызовет на трансляцию файл BLINK.BAS, с использованием в качестве


ассемблера MPASM, и предназначенный для микроконтроллера PIC16C71.

Первый пункт, не начинающийся с минуса, считается именем файла. Если


никакое расширение не задано, по умолчанию используется расширение
.BAS . Если маршрут определен, в этом директорий ищется поименованный
файл. Независимо от где находится исходный файл, файлы, генерируемые
PBP сохраняются в текущий каталог.

По умолчанию, PBP автоматически запускает ассемблер PM.EXE, если


компиляция не имеет никаких ошибок. PBP ищет PM.EXE в том же
директории, где PBP.EXE. Если компиляция имеет ошибки или
используется опция -S, ассемблер не запускается.

Если PBP вызван без параметров или имени файла, отображается экран
краткой подсказки.

3.2. Опции

Option Description
--------------------------------------------------------------
A Использовать другой Ассемблер
C Вставлять исходные строки как ассемблерные комментарии
E Вывод сообщений об ошибках в файл
H(?) Показать подсказку
L Использовать другой файл библиотеки
O Передать опцию Ассемблеру
P Задание типа микроконтроллера
S По завершении, не запускать Ассемблер
V Показывать дополнительную информацию о ходе работы
Z Добавлять отладочную информацию
PicBasic Pro Compiler - 13 -

---------------------------------------------------------------

3.2.1. Опция -A
Использовать другой ассемблер.

PBP имеет способность использовать PM из комплекта PBP, либо Microchip


MPASM как свой ассемблер. Для того, чтобы определить MPASM (который
должен быть приобретен у Microchip), используйте -ampasm в командной
строке:

PBP -ampasm filename

Если никакой ассемблер не определен в командной строке, используется


PM. См. раздел о программировании на ассемблере для большей
информации.

3.2.2. Опция -C
-C опция включает строки комментария исходного BASIC-файла как
комментарии в исходный файл ассемблера. Это может быть полезно как
средство отладки или изучения так как показывается и команда бейсика
вслед за инструкциями ассемблера, которые ею были сгенерированы.

PBP -c filename

3.2.3. Опция -E
-E опция посылает все сообщения об ошибках в файл filename.er.

PBP -e filename

3.2.4. Опция -H или -?


-H или -? опция отображает экран краткой подсказки. Этот экран
подсказки также отображается если никакой опции и имени файла не
определено в командной строке.

3.2.5. Опция -L
-L опция позволяет Вам выбирать библиотеку, используемую PicBasic Pro.
Эта опция - обычно необязательна, так как библиотека используемого по
умолчанию файла устанавливается в файл конфигурации для каждого
микроконтроллера. Более подробно о библиотеках PicBasic Pro см. гл. 6
этого руководства.

PBP -lpbpps2 filename

Этот пример сообщает PBP компилировать filename файл, используя


PicStic2 библиотеку.

3.2.6. Опция -O
-O опция передает следующие за ней буквы ассемблеру в качестве опций
его командной строки. Руководство по PICmicro Macro Assembler на диске
содержит информацию о ассемблере и его опциях.

PBP -ol filename

В этом примере ассемблеру задано генерировать filename.lst файл после


успешной компиляции.

Более чем одна -O опция может быть передана ассемблеру одновременно.

3.2.7. Опция -P
Задает тип микроконтроллера.

Если эта опция не задана PBP будет по умолчанию создавать код для
PicBasic Pro Compiler - 14 -

PIC16F84. Если требуется получить код для другого микроконтроллера,


его номер надо поместить в опцию -P. Например, если делаем программу
для микроконтроллера PIC16F877, командная строка должна выглядеть
приблизительно следующим образом:

PBP -p16F877 filename

3.2.8. Опция -S
Отменить автоматический запуск ассемблера.

Обычно, когда PBP успешно скомпилирует программу, он автоматически


запустит ассемблер. Это сделано, чтобы преобразовать ассемблерный
результат PBP в .HEX файл. -S Опция предотвращает это, так что после
отработки PBP остается сгенерированный .ASM-файл. Поскольку -S
предотвращает запуск ассемблера, параметры, которые должны
передаваться в ассемблер опцией -O аннулируются.

PBP -s filename

3.2.9. Опция -V
-V опция включает режим работы PBP, при котором выдается больше
информации о течении процесса компиляции.

PBP -v filename

3.2.10. Опция -Z
-Z опция сообщает PBPW добавить информацию для отладки и симуляции в
файлы, генерируемые в течение компиляции. Для примера того как
использовать это внутри MPLAB, см. README.TXT файл.

PBP -z filename

4. Основы PicBasic Pro

4.1. Идентификаторы

Идентификатор - это просто имя. Идентификаторы используются в PBP для


меток строки и имен переменных. Идентификатор это любая
последовательность букв, цифр и подчерков, хотя он не должен
начинаться с цифры. Идентификаторы не регистрочувствительны, таким
образом метки LABEL и Label рассматриваются полностью как
эквивалентные. Метки могут быть длиной любого количества символов, но
PBP распознает только первые 31.
Русские буквы в именах не допускаются (прим. перев.)

4.2. Метки строк

PBP использует метки строки для того, чтобы выделить операторы, на


которые в программе требуется сделать переход при помощи команд GOTO
или GOSUB. В отличие от многого более старого Бейсика, PBP не требует
нумеровать строки, и не требует, чтобы каждая строка была помечена.
Любая строка в PBP может начаться с метки строки, которая - просто
идентификатор, завершаемый двоеточием(:).

here: Serout 0,N2400,["Hello, World!",13,10]


Goto here

4.3. Переменные

В переменные загружаются временные данные в программе. Они создаются


при помощи ключевого слова VAR. Переменные могут быть размеров BIT,
PicBasic Pro Compiler - 15 -

BYTE или WORD. Пространство для каждой переменной автоматически


отводится компилятором в оперативной памяти микроконтроллера. Формат
команды для создания переменной - следующим образом:

Label VAR Size{.Modifiers}

Label - любой идентификатор, за исключением ключевых слов. Size - это


BIT, BYTE или WORD. Modifiers - не обязательные модификаторы,
добавляют дополнительное управление через то, как переменная
создается (разъяснено в главе о Псевдонимах). Некоторые примеры
создания переменных:

dog VAR byte


cat VAR bit
w0 VAR word

В PicBasic Pro нет встроенных пользовательских переменных. Ради


совместимости были сделаны два файла создающие стандартные
переменные, используемые в BASIC Stamps: BS1DEFS.BAS и BS2DEFS.BAS.
Для того, чтобы использовать один из этих файлов, добавьте строку:

Include "bs1defs.bas"
или
Include "bs2defs.bas"

в начале вашей программы. Эти файлы содержат многочисленные VAR


операторы, которые создают все переменные BASIC Stamp и описания
штырьков.

Тем не менее, вместо использования этих "искусственных" файлов, мы


рекомендуем, чтобы Вы создавали ваши собственные переменные, используя
имена, которые удобнее для Вас.

Доступное количество переменных зависит от размера оперативной памяти


на используемого микроконтроллера и от размера переменных и массивов.
PBP резервирует приблизительно 24 позиции RAM для своего собственного
использования. Он может также создать дополнительные временные
переменные для использования в сортировке сложных вычислений.

4.4. Псевдонимы

VAR могут также использоваться, чтобы создать псевдоним (другое имя)


для переменной. Это весьма полезный способ для доступа к внутренностям
переменной.

fido VAR dog ' fido это другое имя для dog
b0 VAR w0.byte0 ' b0 это первый байт словной переменной w0
b1 VAR w0.byte1 ' b0 - второй байт w0
flea VAR dog.0 ' flea это бит 0 переменной dog

модификаторы переменных могут также использоваться в качестве части


переменных в операторах:

b = w0.byte0

-----------------+----------------------------------------------------
Модификатор Описание
-----------------+----------------------------------------------------
BIT0 или 0 Создает псевдоним для бита 0 из байта или слова
BIT1 или 1 Создает псевдоним для бита 1 из байта или слова
BIT2 или 2 Создает псевдоним для бита 2 из байта или слова
BIT3 или 3 Создает псевдоним для бита 3 из байта или слова
PicBasic Pro Compiler - 16 -

BIT4 или 4 Создает псевдоним для бита 4 из байта или слова


BIT5 или 5 Создает псевдоним для бита 5 из байта или слова
BIT6 или 6 Создает псевдоним для бита 6 из байта или слова
BIT7 или 7 Создает псевдоним для бита 7 из байта или слова
BIT8 или 8 Создает псевдоним для бита 8 из слова
BIT9 или 9 Создает псевдоним для бита 9 из слова
BIT10 или 10 Создает псевдоним для бита 10 из слова
BIT11 или 11 Создает псевдоним для бита 11 из слова
BIT12 или 12 Создает псевдоним для бита 12 из слова
BIT13 или 13 Создает псевдоним для бита 13 из слова
BIT14 или 14 Создает псевдоним для бита 14 из слова
BIT15 или 15 Создает псевдоним для бита 15 из слова
BYTE0 или LOWBYTE Создает псевдоним для младшего байта слова
BYTE1 или HIGHBYTE Создает псевдоним для старшего байта слова
----------------------------------------------------------------------

4.5. Массивы

Массивы переменных могут быть созданы способом, аналогичным созданию


переменных.

Label VAR Size[Number of elements]

Label - любой идентификатор, исключая ключевые слова, как указано


выше. Size это BIT, BYTE или WORD. Number of elements - сколько
элементов массива требуется. Некоторые примеры, создания массивов:

sharks VAR byte[10]


fish VAR bit[8]

Счет элементов массива начинается с нуля. В массиве fish определенном


выше, элементы отсчитаны с fish[0] до fish[7], давая 8 элементов в
итоге.

Из-за пути, которым массивы распределяются в памяти, есть пределы


размера для каждого типа:

Size Макс. кол-во элементов


---------------------------------
BIT 256
BYTE 96*
WORD 48*
---------------------------------
*Зависит от типа микроконтроллера.
См. раздел о распределении памяти.

Массивы должны формироваться полностью внутри одного банка RAM в


большинстве микроконтроллеров PICmicro. Они не могут распределить
банки RAM на 12-битных, 14-битных или 17Cxxx устройствах. (Массивы
могут распределить банки на 18Xxxx устройствах. Массивы, разрядностью
BYTE и WORD ограничиваются по длине только количеством памяти.)
Компилятор будет гарантировать, что массивы правильно приспособлены в
памяти перед успешной компиляцией.

4.6. Константы

Именованные константы могут быть созданы способом, аналогичным


переменным. Может оказаться более удобным использовать постоянное имя
вместо постоянного числа. Если число должно быть изменено, оно может
быть изменено только в одном месте в программе - где константа
определяется. Переменные данные не могут быть загружены в константу.
PicBasic Pro Compiler - 17 -

Label CON Constant expression

Некоторые примеры констант:

mice CON 3
traps CON mice * 1000

4.7. Символы

Символ дает еще один метод создания псевдонимов для переменных и


констант. Включен для совместимости с BS1. Оператор SYMBOL не может
использоваться, чтобы создать переменную. Используйте VAR, чтобы
создать переменную.

SYMBOL lion = cat ' cat была предварительно создана при помощи VAR
SYMBOL mouse = 1 ' то же, что mouse CON 1

4.8. Числовые Константы

PBP позволяет определять числовые константы в трех основаниях:


десятичные, двоичные и шестнадцатеричные. Двоичные величины
определяются использованием префикса '%' и шестнадцатеричные - '$'.
Десятичные величины - по умолчанию, они не требуют никакого префикса.

100 ' Десятичная величина 100


%100 ' Двоичная величина, равная четырем
$100 ' Шестнадцатеричное, равное десятичному 256

Для удобства программирования, одиночные символы преобразуются в их


ASCII эквиваленты. Символьные константы должны быть заключены в
кавычки и содержать только один символ (в противном случае, они -
строковые константы, см. ниже).

"A" ' ASCII величина, десятичное 65


"d" ' ASCII величина, десятичное 100

4.9. Строковые константы

PBP не имеет возможностей обрабатывать строки, но строки могут


использоваться с некоторыми командами. Строка содержит один или более
символов и ограничена кавычками. Никакие ESC-последовательности не
поддерживаются для не-ASCII символов (хотя большинство PBP команд
имеют этот встроенный обработчик).

Lcdout "Hello" ' строка на вывод, сокращенное "H","e","l","l","o"

Строка обычно рассматривается как список индивидуальных символьных


величин.

4.10. Порты и другие регистры

Все регистры MCU PICmicro включая порты, могут управляться подобно


любой другой byte-переменной в PicBasic Pro. Это означает, что они
могут быть прочитаны, записаны, или использованы непосредственно в
вычислениях:

PORTA = %01010101 ' Запись величины в PORTA


anyvar = PORTB & $0f ' выделение младших 4 бит PORTB и передача
результата в anyvar
PicBasic Pro Compiler - 18 -

4.11. Штырьки

Штырьками можно управлять различными путями. Наилучший способ, чтобы


определить штырек для операции - просто использовать имя его порта и
номера бита:

PORTB.1 = 1 ' Устанавливаем PORTB, бит 1 в 1

Чтобы облегчить запоминание, какой штырек для чего используется, ему


можно назначить имя, используя команду VAR. При этом способе имя может
затем использоваться в любой операции:

led Var PORTA.0 ' Переименовываем PORTA.0 в led


High led ' Устанавливаем led (PORTA.0) в высокий уровень

Для совместимости с BASIC Stamp, штырьки при использовании в командах


PicBasic Pro Compiler могут также обозначаться числом 0 - 15. Это
число отличается от порядкового номера ножки микросхемы, зависящего от
того, сколько ножек микроконтроллер имеет.

-----------------------+-------+---------
кол-во ножек 0 - 7 8 - 15
-----------------------+-------+---------
8-pin GPIO* GPIO*
18-pin PORTB PORTA*
28-pin (except 14C000) PORTB PORTC
28-pin (14C000) PORTC PORTD
40-pin PORTB PORTC
-----------------------+-------+---------
*GPIO и PORTA не имеют 8 I/O штырьков.

Если порт не имеет 8 штырьков, как например, PORTA, используются числа


штырьков, которые существуют, то есть 8 - 12. Использование штырьковых
чисел 13 - 15 не будет иметь никакого различимого эффекта.

Это штырьковое число 0 - 15 не имеет ничего общего с физическим


номером ножки микросхемы. В зависимости от конкретного типа
микроконтроллера, штырьковое число 0 может быть физически ножкой 6, 21
или 33, но в каждом случае он отображается на PORTB.0 (или GPIO.0 для
8-штырьковых устройств, или PORTC.0 для PIC14C000).

Штырьки могут обозначаться числом (0 - 15), именем (напр. Pin0, если


подключены BS1DEFS.BAS или BS2DEFS.BAS или Вы определили имена), или
полное битовое имя (напр. PORTA.1). Любой штырек или бит
микроконтроллера могут управляться, используя следующий метод.

Имена штырьков (т. е. Pin0) автоматически не включаются в вашу


программу. В большинстве случаев, Вы сами определяете имена штырьков
используя команду VAR:

led Var PORTB.3

Тем не менее, два файла определений были предоставлены для увеличения


совместимости с BASIC Stamp. Файлы BS1DEFS.BAS или BS2DEFS.BAS могут
быть включены в PicBasic Pro программе, чтобы обеспечить штырьки и
битовые имена, соответствующие именам BASIC Stamp.

Include "bs1defs.bas"
или
Include "bs2defs.bas"
PicBasic Pro Compiler - 19 -

BS1DEFS.BAS определяет Pins, B0-B13, W0-W6 и большинство других имен


штырьков и переменных, соответствующих BS1.

BS2DEFS.BAS определяет Ins, Outs, B0-B25, W0-W12 и большинство других


имен штырьков и переменных, соответствующих BS2.

Когда микроконтроллер PICmicro включен, всем штырькам устанавливается


режим входов. Для того, чтобы использовать штырек как выход, штырек
или порт должен быть установлен в режим выхода или должна
использоваться команда, автоматически устанавливающая штырек как
выход.

Чтобы установить штырек или порт как выход (или вход), установите его
регистр TRIS. Установка TRIS бита в 0 делает его штырек
соответствующего порта выходом. Установка TRIS бита в 1 делает его
штырек соответствующего порта входом. Например:

TRISA = %00000000 ' или TRISA = 0

делает все штырьки PORTA выходами.

TRISB = %11111111 ' или TRISB = 255

делает все штырьки PORTB входами

TRISC = %10101010

делает все четные штырьки PORTC выходами, и нечетные штырьки входами.


Направления отдельных битов могут устанавливаться таким же манером.

TRISA.0 = 0

делает штырек 0 PORTA выходом, режимы остальных штырьков на PORTA не


изменяются.

Имена переменных BASIC Stamp: Dirs, Dirh, Dirl и Dir0-Dir15 не


определены и не должны использоваться с PicBasic Pro Compiler.
Взамен следует использовать TRIS, учитывая, что он имеет состояние,
противоположное Dirs.

следующее НЕ БУДЕТ работать в PicBasic Pro:

Dir0 = 1 ' Не устанавливают штырек PORTB.0 на выход

Делать вместо это:

TRISB.0 = 0 ' Устанавливают штырек PORTB.0 на выход

или просто используйте команду, которая автоматически устанавливает


штырьку направление.

4.12. Комментарии

В PBP комментарии начинаются с ключевого слова REM, одиночной кавычки


(') или точки с запятой (;). Все последующие символы в этой строке
будут проигнорированы.

В отличие от многих Бейсиков, REM - самостоятельное ключевое слово а


не аббревиатура от REMark. Таким образом, имена переменных могут
начинаться с REM (хотя само REM - было бы неправильно).
PicBasic Pro Compiler - 20 -

4.13. Несколько команд в одной строке

Для того, чтобы сделать программу более компактной и для логического


группирования связанных команд, PBP поддерживает использование
двоеточия (:) чтобы разделить операторы установленные в одну строку.
(Кроме опредлений DEFINE. прим. перев.)
Таким образом, следующие два примера эквивалентны:

W2 = W0
W0 = W1
W1 = W2

то же самое, как:

W2 = W0 : W0 = W1 : W1 = W2

Это, кстати, не влияет на размер сгенерированного кода.

4.14. Символ удлинения строки

Максимальное количество символов, которое может появиться на одной PBP


строке - 256. Более длинные операторы могут быть перенесены на
следующую строку используя символ подчерка (_) в конце каждой строки,
которую нужно продолжить.

Branch B0,[label0,label1,label2,_
label3,label4]

4.15. INCLUDE

В исходный файл программы PBP можно вставлять другие .BAS-файлы,


используя INCLUDE. Возможно, у Вас есть стандартные подпрограммы,
определения или другие файлы, которые Вы хотели бы сохранять отдельно.
Определения для Stamp и режимов COM-порта - примеры этого. Эти файлы
могут быть включены в программы, когда это необходимо, но содержатся
вне программ, которым они не нужны.

Исходные строки включенного файла включаются в программу точно где


поставлен INCLUDE.

INCLUDE "modedefs.bas"

4.16. DEFINE

Некоторые элементы, подобные частоте тактового генератора или позиции


штырьков LCD - встроены в PBP. DEFINE позволяет PBP программе
изменять эти определения, если хотите.

DEFINE может использоваться, чтобы изменить частоту встроенного


генератора, отладочные штырьки, скорость обмена позиции штырьков LCD,
и многие другие вещи.

Эти определения должны быть всегда верхнем регистре, точно как


показано. Если нет, компилятор не сможет распознать их. Никакое
сообщение об ошибке не будет производиться для нераспознанных DEFINE.

Прим. перев. Нельзя состыковывать в одну строку при помощи двоеточия


несколько DEFINE или DEFINE с другими операторами.
PicBasic Pro Compiler - 21 -

См. соответствующие разделы руководства для специальной информации об


этих определениях. Полный список DEFINE приведен в Приложении B.

DEFINE OSC 4 ' скорость Генератора в MHz: 3(3.58) 4 8 10 12 16 20 24 25 32


33 40

4.17. Математические Операторы

В отличие от BASIC Stamp, PicBasic Pro Compiler выполняют все


математические и операции сравнения в полном иерархическом порядке.
Это означает, что соблюдается приоритет операций в операторах.
Умножение и деление выполняются прежде, чем, например, сложение и
вычитание. Для того, чтобы гарантировать, что операции выполняются в
порядке, который Вы хотели бы, используйте скобки, чтобы сгруппировать
операции:

A = (B + C) * (D - E)

Все математические операции - беззнаковые и выполняются с 16-бит


точностью.

Оператор Описание
--------------------------------------------
+ Сложение
- Вычитание
* Умножение
** Старшие 16 битов произведения
*/ Средние 16 битов произведения
/ Деление
// Остаток (Модуль)
<< Сдвиг влево
>> Сдвиг вправо
ABS Абсолютная величина*
COS Косинус
DCD 2n Декодирование
DIG Десятичный разряд
DIV32 Деление 31-бит на 15-бит
MAX Максимум*
MIN Минимум*
NCD Кодирование
REV Реверсирование битов
SIN Синус
SQR Квадратный корень
& Поразрядное AND
| Поразрядное OR
^ Поразрядное Исключающее Или
~ Поразрядное NOT
&/ Поразрядное NOT AND
|/ Поразрядное NOT OR
^/ Поразрядное NOT Исключающее Или
--------------------------------------------
*Реализация отличается от BASIC Stamp.

4.17.1. Умножение

PBP выполняет беззнаковое 16-бит x 16-бит умножение. Оператор '*'


возвращает младшие 16 битов 32-битного произведения. Это - типичное
умножение обнаруживаемое в большинстве языков программирования.
Оператор '**' возвращает старшие 16 битов 32-битного произведения. Эти
PicBasic Pro Compiler - 22 -

два оператора могут использоваться в конъюнкция, чтобы выполнить


16-бит x 16-бит умножение, которое создает 32-бит результаты.

W1 = W0 * 1000 ' Умножение значения W0 на 1000 и передать результат в W1


W2 = W0 ** 1000 ' Умножить W0 на 1000 и передать старшие 16 бит (могут
быть 0) в W2

оператор '*/' возвращает средние 16 битов 32-битного внутреннего


результата.

W3 = W1 */ W0 ' Умножает W1 на W0 и передает средние 16 бит в W3

4.17.2. Деление

PBP выполняет беззнаковое деление 16-бит на 16-бит. Оператор '/'


возвращает 16-бит результат. Оператор '//' возвращает остаток. Это
иногда рассматривают как модуль числа.

W1 = W0 / 1000 ' Разделить W0 на 1000 и передать результат в W1

W2 = W0 // 1000 ' Разделить W0 на 1000 и передать результат в W2

4.17.3. Сдвиг

'<<' и '>>' операторы сдвигают величину влево или вправо,


соответственно, на 0 - 15 бит. Освобождающиеся биты заполняются
нулями.

B0 = B0 << 3 ' Сдвиг B0 влево на 3 двоичных разряда. (эквив. умножению на


8)
W1 = W0 >> 1 ' Сдвиг W0 вправо на 1 разряд (то же, что разделить на 2)

4.17.4. ABS

ABS возвращает абсолютную величину числа. Если байт - больше чем 127
(старший бит установлен), ABS возвратит разность 256 - величина. Если
слово больше чем 32767 (старший бит установлен), ABS возвратит
65536 - величина.

B1 = ABS B0

4.17.5. COS

Возвращает 127*cos(X) где X в диапазоне 0-255 соответствует 0-359


градусов. Чтобы найти результат используется четвертьволновая
таблица перекодировки.

B1 = COS B0

4.17.6. DCD

DCD устанавливает в 1 заданный бит (от 0 до 15), прочие же биты


обнуляет.

B0 = DCD 2 ' в B0 передается 4 (двоичное %00000100)

4.17.7. DIG
PicBasic Pro Compiler - 23 -

DIG извлекает заданную десятичную цифру из числа. Номера цифр - от 0


до 5, начиная с младшей.

B0 = 123 ' устанавливаем 123 в B0


B1 = B0 DIG 1 ' В B1 передается цифра номер 2(в данном случае это 1)

4.17.8. DIV32

Функция умножения (*) в PBP оперирует данными 16 x 16 бит и получает


32-битный внутренний результат. Тем не менее, поскольку компилятор
поддерживает максимальный размер переменной только 16 битов, доступ к
такому результату должен производиться в два этапа: c=b*a дает младшие
16 битов произведения, а d=b**a дает старшие 16 битов, поскольку нет
способа получить доступ сразу к 32 битам.

Но во многих случаях желательно делить целый 32-битный результат


умножения на 16-битное число (для усреднения или масштабирования).
Новая функция была добавлена с этой целью: DIV32. DIV32 в
действительности ограничена делением 31-битного беззнакового целого
(max 2147483647) на 15-битное беззнаковое целое (max 32767). В
большинстве случаев этого достаточно.

Так как компилятор имеет максимальный размер переменной 16 битов,


DIV32 доверяет, что умножение просто выполнялось, и что внутренние
переменные компилятора все еще содержат 32-битный результат умножения.
Никакая другая операция не должна появляться между умножением и DIV32,
так как внутренние переменные могут оказаться изменены и уничтожен
32-битный результат умножения.

Это означает, между прочим, что ON INTERRUPT должно быть запрещено


(DISABLE) перед умножением, и до завершения DIV32. Если ON INTERRUPT
не используется, нет необходимости добавлять DISABLE в программу.
Ассемблерные прерывания не имеют никакого влияния на внутренние
переменные PBP, поэтому могут использоваться, не оглядываясь на
DIV32.

Следующий фрагмент кода показывает операцию DIV32:

a Var Word
b Var Word
c Var Word
dummy Var Word

b = 500
c = 1000

Disable ' Необходимо, когда используется On Interrupt

dummy = b * c ' Можно также использовать ** или */


a = DIV32 100

Enable ' Необходимо, когда используется On Interrupt

Эта программа присваивает b величину 500 и c величину 1000. После


умножения результат будет 500000. Это число превышает 16-бит размера
переменной (65535). Так, переменная dummy содержит только младшие 16
битов результата, но в любом случае она не имеет отношения к функции
DIV32. DIV32 использует своими операндами внутренние переменные
компилятора.
PicBasic Pro Compiler - 24 -

В этом примере, DIV32 делит 32-битный результат умножения b*c на 100 и


передает результат этого деления, 5000, в переменную a, размера word
(16 бит).

4.17.9. MAX И MIN

MAX и MIN возвращает максимум и минимум, соответственно, двух чисел.


Обычно используется, чтобы ограничить числа по величине.

B1 = B0 MAX 100 ' Устанавливает B1 больше B0 или 100 (B1 будет между 100 и
255)

B1 = B0 MIN 100 ' Устанавливает B1 меньше B0 или 100 (B1 не будет больше
100)

4.17.10. NCD

NCD возвращает номер самого старшего ненулевого бита числа (в


диапазоне 1 - 16). Возвращает 0 если ни один бит не установлен.

B0 = NCD %01001000 ' B0 будет равно 7

4.17.11. REV
REV переставляет в обратном порядке указанное количество младших
байтов. Количество битов, которые нужно переставлять - от 1 до 16.

B0 = %10101100 REV 4 ' B0 будет равно %00000011

4.17.12. SIN

SIN возвращает 8-битный синус величины. Результат - в двойной


комплементарной форме (т. е. от -127 до 127). Чтобы найти результат,
используется четвертьволновая таблица перекодировки. Аргумент в
диапазоне 0-255 соответствует 0-359 градусов.

B1 = SIN B0

4.17.13. SQR

SQR возвращает квадратный корень величины. Поскольку PicBasic Pro


работает только с целыми, результат будет всегда 8-битным целым, не
превосходящим фактический результат.

B0 = SQR W1 ' Устанавливает B0 квадратный корень W1

4.17.14. Поразрядные операторы

Поразрядные операторы логически обрабатывают каждый из разрядов числа


независимо. Они могут использоваться, чтобы воздействовать на
отдельные биты числа.

B0 = B0 & %00000001 ' Выделяет бит 0 числа B0


B0 = B0 | %00000001 ' Устанавливают в единицу бит 0 числа B0
B0 = B0 ^ %00000001 ' Инвертитрует бит 0 числа B0

4.18. Операторы сравнения


PicBasic Pro Compiler - 25 -

Операторы сравнения используются в команде IF..THEN, чтобы сравнить


одно выражение с другим. Эти сравнения - беззнаковые. Они не могут
использоваться, чтобы проверить, что число менее 0.

оператор описание
----------------------------
= или == Равенство
<> или != Не равно
< Меньше
> Больше
<= Меньше или равно
>= Больше или равно
----------------------------

If i > 10 Then loop

4.19. Логические операторы

Логические Операторы отличаются от поразрядных операторов. Они дают


результат их операции в форме "истинность/ложность". Значение 0
означает "ложно", любая другая величина - "истинно". Они по большей
части используются в связи операторами сравнения в командах IF..THEN.

Поддерживаемые операторы:

Оператор Описание
------------------------------------------
AND или && Логическое И
OR или || Логическое ИЛИ
XOR или ^^ Логическое Исключающе ИЛИ
NOT или ! Логическое НЕ
ANDNOT Логическое И-НЕ
ORNOT Логическое ИЛИ-НЕ
XORNOT Логическое NXOR
------------------------------------------

If (A == big) AND (B > mean) Then run

Используйте скобки, чтобы сообщить PBP точный порядок, в котором Вы


хотите выполнять операции.

5. Справка по операторам PicBasic Pro

@ Вставить одну строку ассемблерного кода.


ADCIN Чтение встроенного АЦП.
ASM..ENDASM Вставка блока ассемблерных команд.
BRANCH Вычисляемое GOTO (эквив. ON..GOTO).
BRANCHL BRANCH за пределы страницы (длинное BRANCH).
BUTTON Ввод с защитой от дребезга и автоповтором.
CALL Вызов ассемблерной подпрограммы.
CLEAR Обнуляет все переменные.
CLEARWDT Сброс сторожевого таймера.
COUNT Подсчет числа импульсов на штырьке.
DATA Задать исходное содержание встроенного EEPROM.
DEBUG Асинхронный последовательный вывод с постоянной скоростью.
DEBUGIN Асинхронный последовательный ввод с постоянной скоростью.
DISABLE Запрещение отработки ON DEBUG и ON INTERRUPT.
PicBasic Pro Compiler - 26 -

DISABLE DEBUG Запрещение отработки ON DEBUG.


DISABLE INTERRUPT Запрещение отработки ON INTERRUPT.
DTMFOUT Вывод на штырек сигналов тонального набора.
EEPROM Инициализация EEPROM.
ENABLE Разрешить отработку ON DEBUG и ON INTERRUPT.
ENABLE DEBUG Разрешить отработку ON DEBUG.
ENABLE INTERRUPT Разрешить отработку ON INTERRUPT.
END Стоп программы и переход в режим низкого энергопотребления.
ERASECODE Стирание блока кода в памяти.
FOR..NEXT Цикл для повторения операторов.
FREQOUT Выдает на штырек 1 или 2 частоты.
GOSUB Вызов по метке BASIC-подпрограммы.
GOTO Переход на указанную метку.
HIGH Подать на штырек-выход высокий уровень.
HPWM Создание широтно-импульсной модуляции.
HSERIN Аппаратный асинхронный последовательный ввод.
HSEROUT Аппаратный асинхронный последовательный вывод.
I2CREAD Чтение устройства I2C.
I2CWRITE Запись в устройство I2C.
IF..THEN..ELSE..ENDIF Операторы условного выполнения.
INPUT Сделать штырек входом.
LCDIN Чтение LCD RAM.
LCDOUT Вывод символов на LCD.
{LET} Присвоить значение выражения переменной.
LOOKDOWN Поиск в списке констант.
LOOKDOWN2 Поиск в списке констант/переменных.
LOOKUP Извлечь константу из списка.
LOOKUP2 Извлечь константу/переменную из списка.
LOW Подать на штырек-выход низкий уровень.
NAP "Спящий" режим на заданный промежуток времени.
ON DEBUG Установить отладочный обработчик.
ON INTERRUPT Установить BASIC-прерывания.
OWIN Ввод по протоколу Dallas Semiconductor.
OWOUT Вывод по протоколу Dallas Semiconductor.
OUTPUT Сделать штырек выходом.
PAUSE Задержка в миллисекундах.
PAUSEUS Задержка в микросекундах.
PEEK Чтение байта из регистра.
PEEKCODE Чтение байта из области кода.
POKE Запись байта в регистр.
POKECODE Запись байта в область кода во время программирования
устройства.
POT Ввод с потенциометра на выбранном штырьке.
PULSIN Измерение длительности импульса.
PULSOUT Генерация одиночного импульса.
PWM Вывод широтно-импульсной модуляции.
RANDOM Генерация псевдослучайного числа.
RCTIME Измерение времени состояния штырька.
READ Чтение байта из встроенного EEPROM.
READCODE Чтение слова из памяти кода.
RESUME Возврат из подпрограммы обработки прерывания.
RETURN Возврат из подпрограммы, вызываемой по GOSUB.
REVERSE Превратить выход во вход, или наоборот.
SELECT CASE Создание множественного выбора.
SERIN Асинхронный последовательный ввод (BS1 стиль).
SERIN2 Асинхронный последовательный ввод (BS2 стиль).
SEROUT Асинхронный последовательный вывод (BS1 стиль).
SEROUT2 Асинхронный последовательный вывод (BS2 стиль).
SHIFTIN Синхронный последовательный ввод.
SHIFTOUT Синхронный последовательный вывод.
SLEEP Выключить процессор на определенное время.
SOUND Генерировать звуковой тон или белый шум на выбранном штырьке.
PicBasic Pro Compiler - 27 -

STOP Стоп выполнения программы.


SWAP Обменять две переменных значениями.
TOGGLE Инвертировать уровень на штырьке.
USBIN Ввод с USB.
USBINIT Инициализация USB.
USBOUT Вывод на USB.
WHILE..WEND Выполнять цикл, пока истинно.
WRITE Записать байт в EEPROM.
WRITECODE Записать слово в память кода.
XIN Ввод по протоколу X-10.
XOUT Вывод по протоколу X-10.

5.1. @

@ Statement

@ в начале строки обеспечивает вставку ассемблерной строки в вашу PBP


программу. Это может использоваться чтобы соединять код ассемблера с
командами PicBasic Pro.

i Var byte
rollme Var byte
For i = 1 To 4
@ rlf _rollme, F ; Rotate byte left once
Next i

@ может также использоваться, чтобы включить программы ассемблера,


находящиеся в другом файле. Например:

@ Include "fp.asm"

@ сбрасывает регистр страниц в 0 перед выполнением инструкции


ассемблера. Регистр страниц не должен изменяться используя @.

См. раздел об ассемблерном программировании для большей информации.

5.2. ADCIN

ADCIN Channel,Var

Чтение канала Channel встроенного аналого-цифрового преобразователя


(ADC) и передача значения в переменную Var. Хотя регистры ADC могут
управляться непосредственно, ADCIN делает процесс несколько легче.

Прежде, чем ADCIN может использоваться, соответствующий регистр TRIS


должен установить желаемые штырьки входами. ADCON1 также должен
установить желаемые штырьки как аналоговые входы и, в некоторых
случаях, установить формат результата и источника тактов. См.
Microchip data sheets для большей информации об этих регистрах и как
устанавливать их для конкретного устройства.

В зависимости от устройства, оно, возможно, имеет 8-, 10- или


12-битный ADC. Старший бит ADCON1 управляет выравниванием
результата по левому или правому краю. В большинстве случаев, 8-битные
результаты должны быть выравненными по левому краю (ADCON1.7 = 0) и
10- и 12-бит результаты должны быть выравненными по правому краю
(ADCON1.7 = 1).

Различные DEFINE также могут использоваться. Умолчания показаны ниже:


PicBasic Pro Compiler - 28 -

DEFINE ADC_BITS 8 ' Установка количества битов результата (8, 10 или


12)
DEFINE ADC_CLOCK 3 ' Установка источника тактов (rc=3)
DEFINE ADC_SAMPLEUS 50 ' Установка времени дискретизация в микросекундах

ADC_SAMPLEUS - количество микросекунд, которые программа ожидает между


установкой Channel и началом аналого-цифрового преобразования. Это -
время дискретизации. Минимальное количество микросекунд определено
минимальным временем для PAUSEUS (См. соответствующую справку).

TRISA = 255 ' PORTA - все входы.


ADCON1 = 0 ' PORTA - аналоговый режим
ADCIN 0, B0 ' чтение канала 0 в B0

5.3. ASM..ENDASM

ASM
ENDASM

ASM и ENDASM инструкции сообщают PBP, что код между этими двумя
строками на ассемблере и не должен интерпретироваться как команды
PicBasic Pro. Вы можете использовать эти две инструкции, чтобы
смешать код ассемблера с командами PicBasic Pro.

Максимальный размер для секции текста ассемблера - 8K. Это -


максимальный размер фактического исходника, включая комментарии, а не
сгенерированного кода. Если текстовый блок больше, надо разбить его на
несколько ASM..ENDASM секций или вынести в отдельный файл.

ASM сбрасывает регистр страниц на 0. Вы должны убедиться, что регистр


страниц - сброшен в 0 перед ENDASM, если код ассемблера изменял это.

См. программировании в ассемблере для большей информации.

ASM
bsf PORTA, 0 ; Бит 0 на PORTA устанавливается в 0
bcf PORTB, 0 ; Очистка бита 0 на PORTB
ENDASM

5.4. BRANCH

BRANCH Index,[Label{,Label...}]

BRANCH вызывает переход на различные метки, в зависимости от индекса.


Это - подобно On..Goto в других Бейсиках.

Index выбирает одну из списка меток. Например, если Index - нулевой,


программа переходит на первую Label, определенную в списке, если Index
- единица, программа переходит на вторую Label, и так далее. Если
Индекс - больше или равен количеству меток, никакой переход не
делается, и выполняется команда, следующая за BRANCH. Вплоть до 255
(256 для PIC18Xxxx) Label может использоваться в BRANCH.

Для 12- и 14-битных ядер и PIC17Cxxx устройств, Label должна


находиться на той же кодовой странице что и BRANCH. Если Вы не
уверены, будут ли они на одной кодовой странице, используйте BRANCHL
(ниже). Для PIC18Xxxx устройств, Label должна отстоять не дальше 1K,
PicBasic Pro Compiler - 29 -

так как используется относительный переход. Если Label - вне этой


области, используйте BRANCHL.

BRANCH B4,[dog,cat,fish]
' Работает как:
' If B4=0 Then dog (goto dog)
' If B4=1 Then cat (goto cat)
' If B4=2 Then fish (goto fish)

5.5. BRANCHL

BRANCHL Index,[Label{,Label...}]

BRANCHL (BRANCH long) работает очень похоже на BRANCH, делая переход


на позицию, определяемую переменным индексом. Основные различия - что
он может переходить на метку, расположенную на другой кодовой странице
чем инструкция BRANCHL для 12- и 14-битных ядер и PIC17Cxxx устройств,
или дальше чем 1K для PIC18Xxxx устройств и, что он генерирует код
удвоенного размера в сравнении с кодом, производимым BRANCH. Если Вы
уверены, что метки - на той же странице BRANCH или если
микроконтроллер не имеет более чем одну кодовую страницу,
использование BRANCH вместо BRANCHL будет минимизировать затраты
памяти.

Index выбирает одну из списка меток. Например, если Index - нулевой,


программа переходит на первую Label, определенную в списке, если Index
- единица, программа переходит на вторую Label, и так далее. Если
Индекс - больше или равен количеству меток, никакой переход не
производится, и выполняется команда, следующая за BRANCHL. Вплоть до
127 (256 для PIC18Xxxx) Label может использоваться в BRANCHL.

BRANCHL B4,[dog,cat,fish]
' Работает как:
' If B4=0 Then dog (goto dog)
' If B4=1 Then cat (goto cat)
' If B4=2 Then fish (goto fish)

5.6. BUTTON (кнопка)

BUTTON Pin,Down,Delay,Rate,BVar,Action,Label

Читает штырек и дополнительно выполняет подавление дребезга и


авто-повтор. Штырек автоматически делается входом. Pin может быть
константой, 0-15, или переменной, содержащей число 0-15 (например B0)
или имя штырька (например PORTA.0).

Down Состояние штырька, когда кнопка нажата (0..1).


Delay Циклический счет перед началом авто-повтора (0..255).
Если 0, не выполняется подавления дребезга и
авто-повтора. Если 255,- только подавление дребезга,
без авто-повтора.
Rate Скорость авто-повтора (0..255).
BVar Переменная, размером byte, используемая во внутреннем
счетчике задержки/повтора. Она должна быть
проинициализирована на 0 до использования и не
употребляться в программе где-нибудь еще.
Action Индикатор нажатия кнопки: 0 - не нажата, 1 - нажата.
Label Выполнение передается на эту метку если Action истинно.
PicBasic Pro Compiler - 30 -

+5V +5V
│ │
┌┴┐ │
10K│ │ /
│ │ ┐
└┬┘ ├── I/O
│ ┌┴┐
├── I/O │ │
/ 10K│ │
┐ └┬┘
│ │
─┴─ ─┴─

' Переход на notpressed если кнопка на Pin2 не нажата


BUTTON PORTB.2,0,100,10,B2,0,notpressed

Команда BUTTON должна использоваться внутри цикла для авто-повторения,


чтобы работать правильно.

BUTTON выполняет подавление дребезга, делая паузу на 10 миллисекунд,


чтобы ожидать контакта, установившегося нажатия. Для того, чтобы
изменить величину паузы, используйте DEFINE:

' Установить задержку в 50ms для подавления дребезга


DEFINE BUTTON_PAUSE 50

Проверьте, что BUTTON_PAUSE написано заглавными буквами. Максимальная


задержка для 12-битных устройств - 65ms.

Вообще, легче просто читать состояние штырька в IF..THEN, чем


использовать команду BUTTON, например:

If PORTB.2 = 1 Then notpressed

Пример программы:

INCLUDE "modedefs.bas" ' Вставка настроек последовательного вывода

SO Con 0 ' Определить штырек для последовательного вывода


Bpin Con 2 ' Определить штырек для ввода с кнопки
B0 Var Byte
B0 = 0 ' Обнуление буфера работы кнопки

loop: BUTTON Bpin,1,10,5,B0,0,notp ' Проверка кнопки (пропускается, когда


не нажата)
Serout SO,N2400,["Press",13,10] ' Индикация, что кнопка нажата
notp: Serout SO,N2400,[#B0,13,10] ' Показать рабочую переменную
Pause 100 ' Ожидаем немножко
Goto loop ' Повторять это всегда

5.7. CALL
PicBasic Pro Compiler - 31 -

CALL Label

Выполняет подпрограмму ассемблера по ее имени.

Обычно, чтобы выполнить подпрограмму PicBasic Pro, используется GOSUB.


Основное различие между GOSUB и CALL - это при CALL существование
метки не проверяется пока не начнется ассемблерная трансляция. Метки
для CALL доступны в секции ассемблера, в противном случае недоступны
для PBP.

Смотри раздел об ассемблерном программировании для большей информации


о CALL.

CALL pass ' Выполняет подпрограмму ассемблера названную _pass

5.8. CLEAR

CLEAR

Устанавливает все регистры RAM в нуль.

CLEAR обнуляет все регистры RAM в каждом банке. Это установит все
переменные, включая внутренние системные переменные (но не PICmicro
MCU аппаратные регистры) в нуль. Это не делается автоматически, когда
PBP стартует программу, как в BASIC Stamp. Вообще-то, переменные
должны быть проинициализированы в программе в подходящее состояние, а
не использованием CLEAR.

CLEAR ' Обнуление всех переменных

5.9. CLEARWDT

CLEARWDT

Очистка (сброс) сторожевого таймера.

Сторожевой таймер используется в связи с командами SLEEP и NAP, чтобы


будить микроконтроллер после определенного периода времени.
Ассемблерные инструкции (clrwdt) для предохранения при нормальной
работе сторожевого таймера от переполнения, и сброса им MCU,
вставляются в подходящих местах программы автоматически. CLEARWDT
позволяет разместить дополнительные clrwdt в программе.

CLEARWDT ' Очистка сторожевого таймера

Чтобы убрать все автоматически добавляемые компилятором инструкции


clrwdt, может использоваться DEFINE:

DEFINE NO_CLRWDT 1 ' не вставлять CLRWDT

5.10. COUNT

COUNT Pin,Period,Var

Подсчитывает количество импульсов, появившихся на штырьке Pin за


период Period и передает результат в Var. Штырек автоматически
делается входом. Pin может быть константой, 0-15, или переменной,
содержащей число 0-15 (напр. B0) или имя штырька (напр. PORTA.0).

Period - в миллисекундах. Он отслеживается частотой генератора,


PicBasic Pro Compiler - 32 -

основанного на OSC, определенном посредством DEFINE.

COUNT проверяет состояние Pin в быстром цикле и считает переходы


уровня с низкого на высокий. С 4MHz генератором он проверяет состояние
штырька каждый 20us. С 20MHz генератором он проверяет состояние
штырька каждые 4us. Из этого можно определить, что самая верхняя
частота импульсов, которая может быть считана - 25KHz с 4MHz
генератором, и 125KHz с 20MHz генератором, если частота имеет 50%
заполнение периода (время на высоком уровне - то же, что и на низком).

' Счет # импульсов на Pin1 за 100 миллисекунд


COUNT PORTB.1,100,W1

' Показание частоты на штырьке


COUNT PORTA.2, 1000, W1 ' Счет в течение 1 сек
Serout PORTB.0,N2400,[W1]

5.11. DATA

{Label} DATA {@Location,}Constant{,Constant...}

Запоминает константы во встроенном энергонезависимом EEPROM в процессе


программирования устройства. Если необязательные аргументы опущены,
первый DATA запоминается по адресу 0 и последующие - в следующих
позициях. Если Location определена, она обозначает начальную позицию,
с которой запоминаются данные. Необязательная метка Label (не
сопровождаемая двоеточием) может быть присвоена стартовому адресу
EEPROM для последующего обращения к ней в программе.

Constant может быть числовой или строковой константой. Если


модификатор WORD не используется, то будет загружен только младший
байт числовой величины. Строки загружаются как последовательность
байтов ASCII. Значения длины или ограничитель автоматически не
добавляются.

DATA работает только с микроконтроллерами со встроенным EEPROM, как,


например, PIC16F84, PIC16C84 и PIC16F87x серии. Не окажет влияния на
устройства со встроенным EEPROM с последовательным интерфейсом I2C,
таких как 12CE67x и 16CE62x. Поскольку EEPROM - энергонезависимая
память, данные остаются целыми, даже если питание выключается.

Данные загружаются в пространство EEPROM только один раз, когда


микроконтроллер программируется, а не всякий раз, когда
выполняется программа. Если надо установить величины во встроенное
EEPROM во время выполнения программы, используйте WRITE.

Чтобы во время работы программы извлечь величины, загруженные при


помощи DATA, предназначена команда READ.

' Запоминаются 10, 20 и 30 начиная с позиции 4


DATA @4,10,20,30

' Присвоение метки значению размером word в последующей позиции


dlabel DATA word $1234 ' Запоминаются: $34, $12

' Пропуск 4 позиций и запоминание 10 0s (десяти нулей? прим. перев.)


DATA (4),0(10)
PicBasic Pro Compiler - 33 -

5.12. DEBUG

DEBUG Item{,Item...}

Последовательная передача одного (или более) элементов Item через


заранее определенный штырек с заранее установленной скоростью, в
стандартном асинхронном формате: 8 бит, без четности, 1 стоп-бит
(8N1). Штырек автоматически становится выходом.

Если Item предваряется значком # , будут последовательно отсылаться


каждая цифра в формате ASCII. DEBUG (на всех устройствах кроме
12-битных) поддерживает те же модификаторы данных, как SEROUT2. См
описание SEROUT2 в этом руководстве.

Модификатор Операция
----------------------------------------------------
{I}{S}BIN{1..16} Отсылает двоичные цифры
{I}{S}DEC{1..5} Отсылает десятичные цифры
{I}{S}HEX{1..4} Отсылает шестнадцатеричные цифры
REP c\n Отсылает знак c, повторенный n раз
STR ArrayVar{\n} Отсылает строку из n символов
----------------------------------------------------

DEBUG это одна из встроенных функций последовательного асинхронного


обмена. Это - компактнейшая и самая быстрая из программно генерируемых
подпрограмм последовательного обмена. Она может использоваться, чтобы
послать отладочную информацию (переменные, маркеры программной
позиции, и т.п.) в терминальную программу подобную Hyperterm. Можно
воспользоваться в любой желаемый момент через фиксированный штырек на
фиксированной скорости обмена.

Штырек и скорость обмена предварительно определяются, используя


DEFINE:

' Установить port для Debug


DEFINE DEBUG_REG PORTB

' Установить бит для Debug


DEFINE DEBUG_BIT 0

' Установить скорость обмена (бод) для Debug


DEFINE DEBUG_BAUD 2400

' Установить режим Debug: 0 = прямая передача, 1 = инвертирование


DEFINE DEBUG_MODE 1

DEBUG рассчитана на кварц 4MHz при генерации бита синхронизации. Для


того, чтобы обеспечить соответственную скорость обмена при другой
частоте генератора, обязательно установите соответствующую величину
OSC при помощи DEFINE.

В некоторых случаях, инструкция DEBUG может выдавать символы слишком


часто для получающего устройства. DEFINE может добавлять символ темпа
для последовательной передачи. Этот символ темпа делает дополнительный
промежуток времени между передаваемыми символами. Символ темпа
обеспечивает задержку вплоть до 65535 мкс между каждым переданным
символом.

Например, для 1 миллисекунды между передачей каждого символа:


PicBasic Pro Compiler - 34 -

DEFINE DEBUG_PACING 1000

Пока общеупотребительны недорогие однокристальные преобразователи


уровня RS-232. Но благодаря текущей реализации RS-232 и отличным I/O
техническим качествам MCU PICmicro, в большинстве случаев такие
преобразователи уровня могут не потребоваться. Можно использовать
прямое соединение при уровнях TTL в инверсном режиме (DEBUG_MODE 1).
Предпочтительно включить в цепь токоограничительный резистор 1К (хотя
RS-232 устойчив к закоротке).

DB9 DB25
1K
Pin ────████──── RS-232 Rx Конт 2 Конт 3

┌───── RS-232 GND Конт 5 Конт 7


─┴─

' Асинхронно послать текст "B0=", затем десятичную величину B0 и перевод


строки
DEBUG "B0=",DEC B0,10

5.13. DEBUGIN

DEBUGIN {Timeout,Label,}[Item{,Item...}]

Принимает один или более пунктов Item с предварительно определенного


штырька на установленной скорости передачи в стандартном асинхронном
формате: 8 бит данных, без четности, 1 стоповый бит (8N). Штырек
автоматически становится входом.

Необязательные Timeout и Label могут быть заданы, чтобы позволить


программе, чтобы продолжиться если ничего не получено в течение
определенного времени. Timeout задается в миллисекундах. Если штырек
последовательного приема остается в ожидании в сверх времени Timeout,
программа покинет команду DEBUGIN и перейдет на Label.

DEBUGIN (на всех устройствах кроме 12-битных) поддерживает те же


модификаторы данных, как SEROUT2. См описание SEROUT2 в этом
руководстве.

Модификатор Операция
----------------------------------------------------------------------------
BIN{1..16} Прием двоичной цифры
DEC{1..5} Прием десятичной цифры
HEX{1..4} Прием шестнадцатеричной цифры (заглавные)
SKIP n Пропустить n принятых знаков
STR ArrayVar\n{\c} Принять строку n знаков. Опционально: завершаемых
знаком c
WAIT ( ) Ожидать последовательность знаков
WAITSTR ArrayVar{\n} Ожидать строку знаков
----------------------------------------------------------------------------

DEBUGIN - это одна из встроенных функций последовательного


асинхронного обмена. Это - компактнейшая и самая быстрая из программно
генерируемых подпрограмм последовательного обмена. Она может
использоваться, чтобы принять отладочную информацию от терминальной
программы подобной Hyperterm. Можно воспользоваться в любой желаемый
момент через фиксированный штырек на фиксированной скорости обмена.

Штырек и скорость обмена предварительно определяются, используя


PicBasic Pro Compiler - 35 -

DEFINE:

' Установить port для Debugin


DEFINE DEBUGIN_REG PORTB

' Установить бит для Debugin


DEFINE DEBUGIN_BIT 0

' Установить скорость обмена, бод (то же, что и для Debug)
DEFINE DEBUG_BAUD 2400

' Установить режим Debugin: 0 = прямые данные, 1 = инвертирование


DEFINE DEBUGIN_MODE 1

Если любое из этих DEFINE не включены в программу, порт DEBUGIN,


штырек или режим принимаются за те же, которые заданы для DEBUG.
Скорость обмена DEBUGIN - всегда та же самая, что и для DEBUG. Она не
может быть сделана отличающейся.

DEBUGIN рассчитана на кварц 4MHz при генерации бита синхронизации. Для


того, чтобы обеспечить соответствующую скорость обмена при другой
частоте генератора, обязательно установите соответствующую величину
OSC при помощи DEFINE.

Пока общеупотребительны недорогие однокристальные преобразователи


уровня RS-232. Но благодаря текущей реализации RS-232 и отличным I/O
техническим качествам MCU PICmicro, в большинстве случаев такие
преобразователи уровня могут не потребоваться. Можно использовать
прямое соединение при уровнях TTL в инверсном режиме (DEBUG_MODE 1). В
цепь необходимо включить токоограничительный резистор 22К чтобы
погасить более высокое и, временами, отрицательное напряжение от
интерфейса RS-232.

DB9 DB25
22K
Pin ────████──── RS-232 Tx Конт 3 Конт 2

┌───── RS-232 GND Конт 5 Конт 7


─┴─

' Ожидать получения символа "A" и поместить последующий символ в B0


DEBUGIN [WAIT("A"),B0]

' Пропустить 2 символа и принять число из 4 десятичных цифр


DEBUGIN [SKIP 2,DEC4 B0]

5.14. DISABLE

DISABLE

DISABLE отключает как отладчик, так и обработку прерываний, начиная со


следующей команды. Прерывания могут все еще появиться но BASIC-овский
обработчик прерываний в PicBasic Pro программе и отладчик не будут
выполняться до тех пор, пока не встретится ENABLE.

DISABLE и ENABLE это псевдооперации; они дают указания компилятору, а


не действительно генерируют код. Смотри ON DEBUG и ON INTERRUPT для
большей информации.
PicBasic Pro Compiler - 36 -

DISABLE ' Отключение прерываний для обработчика


myint: led = 1 ' включить светодиод, когда прерывание
Resume ' Возврат в основную программу
Enable ' Включение прерываний после обработчика

5.15. DISABLE DEBUG

DISABLE DEBUG

DISABLE DEBUG отключение отладчика, начиная со следующей инструкции.


Отладчик не будет вызываться между инструкциями до тех пор, пока не
будет встречена ENABLE или ENABLE DEBUG.

DISABLE DEBUG и ENABLE DEBUG - псевдооперации; они дают указания


компилятору, а не действительно генерируют код. Смотри ON DEBUG для
большей информации.

DISABLE DEBUG ' отключить вызов отладчика

5.16. DISABLE INTERRUPT

DISABLE INTERRUPT

DISABLE INTERRUPT отключает вызов прерываний, начиная со следующей


команды. Прерывания могут все еще появиться но BASIC-овский обработчик
прерываний в PicBasic Pro программе и отладчик не будут выполняться до
тех пор, пока не встретится ENABLE.

DISABLE INTERRUPT и ENABLE INTERRUPT это псевдооперации; они дают


указания компилятору, а не действительно генерируют код. Смотри ON
INTERRUPT для большей информации.

DISABLE INTERRUPT ' Отключение прерываний для обработчика


myint: led = 1 ' включить светодиод, когда прерывание
Resume ' Возврат в основную программу
Enable Interrupt ' Включение прерываний после обработчика

5.17. DTMFOUT

DTMFOUT Pin,{Onms,Offms,}[Tone{,Tone...}]

Выдает последовательность DTMF-тонов на штырек. Штырек автоматически


становится выходом. Pin может быть константой 0-15 или переменной,
содержащей число 0-15 (напр. B0) или имя штырька (напр. PORTA.0).

Onms - количество миллисекунд звучания каждого тона и Offms -


количество миллисекунд паузы между каждым тоном. Если они не
определены, Onms по умолчанию 200ms и Offms по умолчанию 50ms.

Tone - номера тонов, 0-15. Тоны 0-9 - те же как на телефонной малой


клавиатуре. Tone 10- клавиша * , tone 11- # и тоны 12-15
соответствуют расширенным клавишам A-D.

DTMFOUT использует FREQOUT, чтобы сгенерировать двойные тоны. FREQOUT


генерирует тоны, используя широтно-импульсную модуляцию. Сигнал,
полученный на штырьке, выглядит изрядно страшно. Обычно нужен
PicBasic Pro Compiler - 37 -

какой-нибудь тип фильтра, чтобы сгладить сигнал к синусоидальной волне


и отделаться от высших гармоник, сопровождавших генерацию:

1К 1К
I/O ───███────┬────███───┬───── к усил.
│ │
─┴─ ─┴─
─┬─ 0.1 ─┬─ 0.1
│ │
─┴─ ─┴─

DTMFOUT работает наилучшим образом с 20MHz или 40MHz генератором. Он


может также работать с 10MHz генератором и даже с 4MHz, хотя тогда
требуется очень глубокая фильтрация, оставляющая довольно низкую
амплитуду. Любая другая частота вызовет DTMFOUT генерировать частоту,
которая будет коэффициентом использованного генератора к 20
мегагерцам, что не будет особенно полезным для посылки сенсорных
тонов.

DTMFOUT не поддерживается на 12-битных микроконтроллерах PICmicro


вследствие ограниченности RAM и стека.

' Посылать тоны DTMF в Pin1 для набора номера 212


DTMFOUT PORTB.1,[2,1,2]

5.18. EEPROM

EEPROM {Location,}[Constant{,Constant...}]

Загружает константы во встроенное EEPROM. Если необязательное Location


опущено, первый оператор EEPROM начинает хранение в адресе 0 и
следующие загружают в следующие позиции. Если величина Location
указана, она обозначает начальную позицию, куда эти величины будут
загружены.

Constant может быть числовой или строковой константой. Для числовых


величин загружается только младший байт. Строки загружаются как
последовательные байты ASCII, значение длины или ограничитель
автоматически не добавляются.

EEPROM работает только с микроконтроллерами со встроенным EEPROM, как,


например, PIC16F84, PIC16C84 и PIC16F87x серии. Не окажет влияния на
устройства со встроенным EEPROM с последовательным интерфейсом I2C,
таких как 12CE67x и 16CE62x. Поскольку EEPROM - энергонезависимая
память, данные остаются целыми, даже если питание выключается.

Данные загружаются в пространство EEPROM только один раз, когда


микроконтроллер программируется, а не всякий раз, когда
выполняется программа. Если надо установить величины во встроенное
EEPROM во время выполнения программы, используйте WRITE. Чтобы
прочитать загруженные величины во время работы программы, используется
READ.

' Загрузить 10, 20 и 30, начиная с позиции 4


EEPROM 4,[10,20,30]
PicBasic Pro Compiler - 38 -

5.19. ENABLE

ENABLE

ENABLE включает, начиная со следующей инструкции, обработчики отладки


и прерываний, которые были раньше отключены.

DISABLE и ENABLE это псевдооперации; они дают указания компилятору, а


не действительно генерируют код. Смотри ON DEBUG и ON INTERRUPT для
большей информации.

Disable ' Отключение прерываний для обработчика


myint: led = 1 ' включить светодиод, когда прерывание
Resume ' Возврат в основную программу
ENABLE ' Включение прерываний после обработчика

5.20. ENABLE DEBUG

ENABLE DEBUG

ENABLE DEBUG со следующей инструкции включает отладчик, если он прежде


был отключен.

DISABLE DEBUG и ENABLE DEBUG - псевдооперации; они дают указания


компилятору, а не действительно генерируют код. Смотри ON DEBUG для
более информации.

ENABLE DEBUG ' Разрешить вызовы отладчика

5.21. ENABLE INTERRUPT

ENABLE INTERRUPT

ENABLE INTERRUPT со следующей инструкции включает обработчик


прерываний если он прежде был отключен.

DISABLE INTERRUPT и ENABLE INTERRUPT это псевдооперации; они дают


указания компилятору, а не действительно генерируют код. Смотри ON
INTERRUPT для большей информации.

Disable Interrupt ' Отключение прерываний для обработчика


myint: led = 1 ' включить светодиод, когда прерывание
Resume ' Возврат в основную программу
ENABLE INTERRUPT ' Включение прерываний после обработчика

5.22. END

END

Останавливает выполнение программы и переводит микроконтроллер в режим


низкого потребления мощности. Все I/O штырьки остаются в их текущем
состоянии. END работает, непрерывно выполняя в цикле инструкцию Sleep.

END или STOP или GOTO должны быть установлены в конце каждой
программы, чтобы предохранить ее от перезапуска переходом за конец
памяти.
PicBasic Pro Compiler - 39 -

END

5.23. ERASECODE

ERASECODE Block

Некоторые flash-MCUs PICmicro, подобные серии PIC18Fxxx, требуют


стирания кода, прежде, чем он сможет быть вновь записан с помощью
WRITECODE. На этих устройствах стирание выполняется поблочно. Блок
стирания может быть 32 слова (64 байта) или другого размера, в
зависимости от устройства. Этот размер - обычно больший, чем размер
блока записи. См. описание конкретного микроконтроллера, который Вы
используете, для информации о размере блока.

Первую позицию блока, которая нужно стирать, определяет Block. Block -


байтовый адрес от 0 до 65535, а не адреса слова, для PIC18Fxxx
устройств. Осторожнее, чтобы не задать блок, который содержит
программный код.

Flash program writes в программаторе должно быть enabled в


конфигурации программатора для PICmicro MCU, чтобы ERASECODE мог
стирать. Использование этой инструкции на устройствах, которые не
поддерживают блочное стирание, вызовет ошибку компиляции.

ERASECODE $100 ' стирание блока кода, начиная с позиции $100

5.24. FOR..NEXT

FOR Count = Start TO End {STEP {-} Inc}


{Body}
NEXT {Count}

Цикл FOR..NEXT позволяет программам повторить несколько команд {Body}


многократно, используя переменную как счетчик. Вследствие сложности и
универсальности, FOR..NEXT лучше описывать пошагово:

1) Индексной переменной Count присваивается величина Start.


Count может быть переменной любого типа.
2) Выполняются команды, находящиеся вместо обозначения {Body}. Они
необязательны и могут быть опущены (напр. для цикла задержки).
3) Величина Inc прибавляется (или вычитается, если "-") к Count. Если
Inc не задана, прибавляется единица.
4) Если Count еще не достигла величины End или не превысила ее, цикл
повторяется с шага 2.

Если цикл требуется повторять более чем 255 раз, должна использоваться
переменная размера word.

FOR i = 1 TO 10 ' счет от 1 до 10


Serout 0,N2400,[#i," "] ' Передача каждого числа на Pin0 асинхронно
NEXT i ' возврат на следующий проход цикла
Serout 0,N2400,[10] ' Передаем конец строки.

FOR B2 = 20 TO 10 STEP -2 ' Счет от 20 до 10 с шагом -2


PicBasic Pro Compiler - 40 -

Serout 0,N2400,[#B2," "] ' Передача каждого числа на Pin0 асинхронно


NEXT B2 ' возврат на следующий проход цикла
Serout 0,N2400,[10] ' Передаем конец строки.

5.25. FREQOUT

FREQOUT Pin,Onms,Frequency1{,Frequency2}

Выдает одну или две заданные частоты через штырек Pin на Onms
миллисекунд. Штырек автоматически становится выходом. Pin может быть
константой 0-15 или переменной, содержащей число 0-15 (напр. B0) или
имя штырька (напр. PORTA.0).

Одновременно могут быть получены одна или две частоты от 0 до 32767


Герц.

FREQOUT генерирует тоны, используя широтно-импульсную модуляцию.


Сигнал, полученный на штырьке, выглядит изрядно страшно. Обычно нужен
какой-нибудь тип фильтра, чтобы сгладить сигнал к синусоидальной волне
и отделаться от высших гармоник, сопровождавших генерацию:

1К 1К
I/O ───███────┬────███───┬───── к усил.
│ │
═╤═ 0.1 ═╤═ 0.1
│ │
─┴─ ─┴─

FREQOUT работает наилучшим образом с 20MHz или 40MHz генератором. Он


может также работать с 10MHz генератором и даже с 4MHz, хотя тогда
требуется очень глубокая фильтрация, оставляющая довольно низкую
амплитуду. Любая другая частота вызовет FREQOUT генерировать частоту,
которая будет коэффициентом использованного генератора к 20
мегагерцам.

FREQOUT не поддерживается на 12-битных микроконтроллерах PICmicro


вследствие ограниченности RAM и стека.

' Посылает тон 1KHz на Pin1 в течение 2 сек


FREQOUT PORTB.1,2000,1000

' Посылает 350Hz/440Hz (телефонный тон) в течение 2 сек


FREQOUT PORTB.1,2000,350,440

5.26. GOSUB

GOSUB Label

Переход на подпрограмму по метке Label, с сохранением адреса возврата


в стеке. В отличие от GOTO, выполнением команды RETURN производится
возврат к команде, расположенной после выполненного GOSUB.

Неограниченное количество подпрограмм может использоваться в


программе. Подпрограммы могут также быть вложены. Другими словами,
возможно для подпрограммы, чтобы вызвать другую подпрограмму. Такая
вложенность подпрограмм должна ограничиваться не более чем четырьмя
уровнями глубины (12 уровней для 17Cxxx и 27 уровней для 18Xxxx).
PicBasic Pro Compiler - 41 -

GOSUB beep ' Выполняет подпрограмму beep


. . .

beep: High 0 ' Включаем светодиод на Pin0


Sound 1,[80,10] ' Бип на динамик, подключенный к Pin1
Low 0 ' Гасим светодиод на Pin0
Return ' Возврат в вызывавшую программу
5.27. GOTO

GOTO Label

Переход к оператору по метке Label.

GOTO send ' Переход на оператор, помеченный, как send

. . .

send: Serout 0,N2400,["Hi"] ' Асинхронно посылает "Hi" через Pin0

5.28. HIGH

HIGH Pin

Устанавливает высокий логический уровень (около +5 вольт) на указанном


штырьке. Штырек автоматически становится выходом. Pin может быть
константой 0-15 или переменной, содержащей число 0-15 (напр. B0) или
имя штырька (напр. PORTA.0).

HIGH 0 ' Делает Pin0 выходом и устанавливает на нем +5 вольт


HIGH PORTA.0 ' Делает PORTA, pin 0 выходом и устанавливает на нем +5
вольт

led var PORTB.0 ' определить штырек для светодиода


HIGH led ' Сделать штырек LED выходом и подать на него +5 вольт

Тем не менее, если штырек - уже выход, значительно более быстрый и


короткий способ установить это высокий будет:

PORTB.0 = 1 ' Установить PORTB pin 0 высокий уровень

5.29. HPWM

HPWM Channel,Dutycycle,Frequency

Выдает широтно-модулированные импульсы, используя средства PWM


имеющиеся на некоторых MCU PICmicro. Это может работать непрерывно в
фоновом режиме, пока программа выполняет другие инструкции.

Channel определяет какое аппаратный PWM канал использовать. Некоторые


устройства имеют 1, 2 или 3 PWM канала. В описании на микроконтроллер
указывается фиксированный аппаратный штырек для каждого канала.
Например, для PIC16F877, Канал 1 - CCP1, который - штырек PORTC.2.
Канал 2 - CCP2, который - штырек PORTC.1.

Некоторые устройства, как например, PIC18C452, имеет альтернативные


штырьки, которые могут использоваться для HPWM. Следующие DEFINE
позволяют использовать эти штырьки:

DEFINE CCP1_REG PORTC ' Hpwm 1 pin port


PicBasic Pro Compiler - 42 -

DEFINE CCP1_BIT 2 ' Hpwm 1 pin bit


DEFINE CCP2_REG PORTC ' Hpwm 2 pin port
DEFINE CCP2_BIT 1 ' Hpwm 2 pin bit

Dutycycle - скважность. Определяет отношение вкл/откл (высокий/низкий)


в диапазоне от 0 до 255, где 0=откл. (низкий уровень все время) и
255=вкл. (высокий все время). Величина 127 дает 50% заполнение периода
(меандр).

Frequency - желаемая частота PWM сигнала. На устройствах с 2 каналами,


частота должна одна и та же в обоих каналах. Самая Верхняя частота при
любой скорости генератора - 32767Hz. Самая низкая возможная частота
HPWM для каждой частоты генератора показана в следующей таблице:

------+---------------+----------
OSC 14-битные MCU 17Cxxx
и 18Xxxx
------+---------------+----------
4MHz 245Hz 3907Hz
8MHz 489Hz 7813Hz
10MHz 611Hz 9766Hz
12MHz 733Hz 11719Hz
16MHz 977Hz 15625Hz
20MHz 1221Hz 19531Hz
24MHz 1465Hz 23438Hz
25MHz 1527Hz 24415Hz
33MHz 2015Hz 32227Hz
40MHz 2442Hz -
------+---------------+----------

Следующие DEFINE определяют, какой таймер, 1 или 2, использовать с PWM


каналом 2 и PWM каналом 3 для PIC17C7xx устройств. Таймер по
умолчанию- 1, если DEFINE не заданы.

DEFINE HPWM2_TIMER 1 ' выбран Hpwm 2 timer


DEFINE HPWM3_TIMER 1 ' выбран Hpwm 3 timer
HPWM 1,127,1000 ' Генерируем сигнал 1kHz, скважностью 2
HPWM 1,64,2000 ' Сигнал 2kHz, с 25% заполнением

5.30. HSERIN

HSERIN {ParityLabel,}{Timeout,Label,}[Item{,...}]

Принимает один или более пунктов Item из аппаратного асинхронного


порта на микроконтроллерах, имеющих такой специальный порт.

HSERIN - одна из встроенных асинхронных последовательных функций. Она


может использоваться только с устройствами, имеющими аппаратный USART.
Смотри спецификацию устройства для информации о штырьке
последовательного приема и других параметрах. Параметры связи и
скорость передачи задаются при помощи DEFINE:

' Установка премного регистра в разрешенном приемнике


DEFINE HSER_RCSTA 90h

' Установка передающего регистра в разрешенном передатчике


DEFINE HSER_TXSTA 20h

' Установить скорость (в бодах)


DEFINE HSER_BAUD 2400

' Установит прямой SPBRG (обычно установлен по HSER_BAUD)


PicBasic Pro Compiler - 43 -

DEFINE HSER_SPBRG 25

HSER_RCSTA, HSER_TXSTA и HSER_SPBRG просто устанавливают


шестнадцатеричную величину каждому соответствующему регистру MCU
PICmicro: RCSTA, TXSTA и SPBRG один раз, в начале программы. Смотри
описание на устройство для большой информации о каждом из этих
регистров.

Бит BRGH регистра TXSTA (бит 2) управляет высокоскоростным режимом


генератора скорости обмена. Определенные скорости при некоторых
генераторах требуют установки в 1 этого бита, чтоб работать правильно.
Чтобы выполнить это, установите HSER_TXSTA в 24h вместо 20h. См табл
скоростей в описаниях последовательного порта, и дополнительную
информацию.

HSERIN рассчитан на кварц 4MHz при расчете скорости обмена в бодах.


Для того, чтобы поддержать соответствующую скорость обмена при другой
частоте генератора, убедитесь, что в DEFINE правильно задана эта
частота для OSC.

Необязательные Timeout и Label могут быть включены, чтобы позволить


программе продолжиться если символ не получается дольше определенного
времени. Timeout задается в миллисекундах. Если никакой символ не
получен в течение времени Timeout, программа покинет команду HSERIN и
перейдет на метку Label.

Последовательный формат данных определенный по умолчанию - 8N1: 8


битов данных, без бита четности и 1 стоповый бит. Форматы 7E1 (7 битов
данных, проверка на четность, 1 стоповый бит) или 7O1 (7 битов данных,
проверка на нечетность, 1 стоповый бит) можно включить, используя один
из следующих DEFINE:

' Использовать, если нужна проверка на четность


DEFINE HSER_EVEN 1

' Использование если нужна проверка на нечетность


DEFINE HSER_ODD 1

Установка четности, вместе со всеми другими DEFINE HSER воздействует


на как HSERIN так и на HSEROUT.

ParityLabel необязательна. Программа продолжит с этой позиции, если


получен символ с ошибкой четности. Это можно использовать только если
четность проверяется, используя одно из вышеописанных DEFINE.

Поскольку последовательный порт аппаратных средств имеет только


2-байтовый входной буфер, он может легко переполниться, если символы
не считываются оттуда достаточно часто. Если это случилось, USART
перестает принимать новые символы и должен быть перезапущен. Эта
ошибка переполнения может быть сброшена переключением бита CREN в
регистре RCSTA. Можно использовать DEFINE, чтобы автоматически
очистить эту ошибку. Но Вы не узнаете, что была ошибка, и символы,
возможно, были потеряны.

DEFINE HSER_CLROERR 1

Чтобы вручную очистить ошибку переполнения:

RCSTA.4 = 0
RCSTA.4 = 1

Поскольку асинхронный прием сделан аппаратно, невозможно установить


PicBasic Pro Compiler - 44 -

инвертирование уровней, чтобы осуществить прямое подключение к RS-232


без микросхемы-согласователя. Следовательно, подходящий согласователь
должен использоваться с HSERIN.

На устройствах с 2 последовательными аппаратными портами HSERIN будет


использовать только первый порт. Второй порт может быть установлен и
прочитан из его регистров непосредственно. Или может быть добавлено
DEFINE, чтобы сообщить HSERIN, чтобы использовать второй
последовательный порт вместо первого:

DEFINE HSER_PORT 2

HSERIN поддерживает те же модификаторы данных, как и SERIN2. См


описание SERIN2.

Модификатор Операция
----------------------------------------------------------------------------
BIN{1..16} Прием двоичных цифр
DEC{1..5} Прием десятичных цифр
HEX{1..4} Прием шестнадцатеричных цифр (заглавные)
SKIP n Пропустить n принятых знаков
STR ArrayVar\n{\c} Прием строки n знаков, опционально завершаемых знаком c
WAIT ( ) Ожидать последовательность знаков
WAITSTR ArrayVar{\n} Ожидать строку знаков
----------------------------------------------------------------------------

HSERIN [B0,DEC W1]

5.31. HSEROUT

HSEROUT [Item{,Item...}]

Посылать один или более пунктов Item через порт аппаратного


последовательного асинхронного обмена.

HSEROUT - одна из встроенных асинхронных последовательных функций. Он


может использоваться только с устройствами, имеющими аппаратный USART.
Смотри спецификацию устройства для информации о штырьке
последовательного приема и других параметрах. Параметры связи и
скорость передачи задаются при помощи DEFINE:

' Установка премного регистра в разрешенном приемнике


DEFINE HSER_RCSTA 90h

' Установка передающего регистра в разрешенном передатчике


DEFINE HSER_TXSTA 20h

' Установить скорость (в бодах)


DEFINE HSER_BAUD 2400

' Установит прямой SPBRG (обычно установлен по HSER_BAUD)


DEFINE HSER_SPBRG 25

HSER_RCSTA, HSER_TXSTA и HSER_SPBRG просто устанавливают


шестнадцатеричную величину каждому соответствующему регистру MCU
PICmicro: RCSTA, TXSTA и SPBRG один раз, в начале программы. Смотри
описание на устройство для большой информации о каждом из этих
регистров.

Бит BRGH регистра TXSTA (бит 2) управляет высокоскоростным режимом


генератора скорости обмена. Определенные скорости при некоторых
PicBasic Pro Compiler - 45 -

генераторах требуют установки в 1 этого бита, чтоб работать правильно.


Чтобы выполнить это, установите HSER_TXSTA в 24h вместо 20h. См табл
скоростей в описаниях последовательного порта, и дополнительную
информацию.

HSEROUT рассчитан на кварц 4MHz при расчете скорости обмена в бодах.


Для того, чтобы поддержать соответствующую скорость обмена при другой
частоте генератора, убедитесь, что в DEFINE правильно задана эта
частота для OSC.

Последовательный формат данных определенный по умолчанию - 8N1: 8


битов данных, без бита четности и 1 стоповый бит. Форматы 7E1 (7 битов
данных, проверка на четность, 1 стоповый бит) или 7O1 (7 битов данных,
проверка на нечетность, 1 стоповый бит) можно включить, используя один
из следующих DEFINE:

' Использовать, если нужна проверка на четность


DEFINE HSER_EVEN 1

' Использование если нужна проверка на нечетность


DEFINE HSER_ODD 1

Установка четности, вместе со всеми другими DEFINE HSER воздействует


на как HSERIN так и на HSEROUT.

Поскольку последовательный прием сделан аппаратно, невозможно


установить инвертирование уровней, чтобы осуществить прямое
подключение к RS-232 без микросхемы-согласователя. Следовательно,
подходящий согласователь должен использоваться с HSEROUT.

На устройствах с 2 последовательными аппаратными портами HSEROUT будет


использовать только первый порт. Второй порт может быть установлен и
прочитан из его регистров непосредственно. Или может быть добавлено
DEFINE, чтобы сообщить HSEROUT, чтобы использовать второй
последовательный порт вместо первого:

DEFINE HSER_PORT 2

HSEROUT поддерживает те же модификаторы данных, как и SEROUT2. См


описание SEROUT2.

Модификатор Операция
--------------------------------------------------
{I}{S}BIN{1..16} Послать двоичные цифры
{I}{S}DEC{1..5} Послать десятичные цифры
{I}{S}HEX{1..4} Послать шестнадцатеричные цифры
REP c\n Послать знак c повторенный n раз
STR ArrayVar{\n} Послать строку n знаков
--------------------------------------------------

' Послать десятичное значение B0, с переводом строки, через аппаратный USART
HSEROUT [DEC B0,10]

5.32. I2CREAD

I2CREAD DataPin,ClockPin,Control,{Address,}[Var{,Var...}]{,Label}

Посылает Control и необязательный Address через ClockPin и DataPin и


загружает принятый байт(ы) в Var. ClockPin и DataPin могут быть
константами 0-15, или переменными, содержащими число 0-15 (напр. B0)
или имя штырька (напр. PORTA.0).
PicBasic Pro Compiler - 46 -

I2CREAD и I2CWRITE используются, чтобы прочитать и записать данные в


последовательную EEPROM с 2-проводным интерфейсом I2C, как например,
Microchip 24LC01B и аналогичные устройства. EEPROM является
энергонезависимой памятью и сохраняет данные даже во время отключения
питания. Эти команды работают с I2C в режиме master mode, и могут
также использоваться, чтобы связываться с другими устройствами с I2C
интерфейсом, такими как датчики температуры и аналогоцифровые
преобразователи.

Для 12-битных MCU PICmicro только:


I2C штырьки тактов и данных фиксируются во время трансляции по DEFINE.
Они все равно должны потом быть заданы в I2CREAD командах, хотя эта
информация проигнорируется компилятором.

DEFINE I2C_SCL PORTA,1 ' Только для 12-битных MCU


DEFINE I2C_SDA PORTA,0 ' Только для 12-битных MCU

Старшие 7 битов Control содержат управляющий код вместе с чип-селект


или дополнительной адресной информацией, в зависимости от конкретного
устройства. Младший бит - внутренний флаг, индицирующий команда чтения
это, или команда записи, и должен содержать 0. Этот формат байта
Control отличается от используемого исходным компилятором PicBasic.
Обязательно использовать этот формат в PBP с I2C операциями.

Например, при связи с 24LC01B, управляющий код- %1010 и чип-селект не


используется, поэтому Control будет %10100000 или $A0. Форматы байтов
Control для некоторых других частей приводится ниже:

Устройство Объем Control Address(размер)


----------+------+----------+---------------
24LC01B 128byt %1010xxx0 1 byte
24LC02B 256byt %1010xxx0 1 byte
24LC04B 512byt %1010xxb0 1 byte
24LC08B 1K %1010xbb0 1 byte
24LC16B 2K %1010bbb0 1 byte
24LC32B 4K %1010ddd0 2 bytes
24LC65 8K %1010ddd0 2 bytes
----------+------+----------+---------------
bbb = биты выбора блока (старший порядок адреса)
ddd = биты выбора устройства
xxx = безразлично

Адресный размер посылки (байт или слово) определен размером


переменной, которая используется. Если для Address используется
однобайтовая переменная, 8-битный адрес послан. Если переменная
размером word, то 16-битный адрес послан. Обязательно используйте
переменную размера, соответствующего устройству с которым Вы хотите
сообщаться. Константы не должны использоваться для Адреса, так как
размер может измениться в зависимости от размера константы. Также не
следует использовать выражения; они могут вызвать неправильный размер
Адреса, который нужно послать.

Если определена Var размером word, 2 байта читаются и загружаются в


Var старший байт первым, затем младший байт. Этот порядок - другой чем
путь, которым переменные обычно загружаются (сначала младший байт).

Модификатор STR может быть включен перед именем переменной. Так можно
загрузить сразу целый массив (строку). Если STR задан, следующая
переменная должна быть именем слова или байтового массива,
сопровождаемого обратной косой чертой (\) и количеством:

a var byte[8]
PicBasic Pro Compiler - 47 -

I2CREAD PORTC.4,PORTC.3,$a0,0,[STR a\8]

Если размер массива - word, 2 байта, из которых состоит каждый элемент


читаются: младший байт сначала. Это не противоречит пути, по которому
компилятор нормально загружает переменные размера word.

Если необязательная Label задана, на эту метку будет переход, если I2C
устройство не опознано.

I2C Инструкции могут использоваться, чтобы управлять встроенным


последовательным EEPROM на 12CExxx и 16CExxx устройствах. Просто
определите имена штырьков для подходящих внутренних линий как часть
I2C команды, и устанавливать следующее DEFINE вначале программы:

DEFINE I2C_INTERNAL 1

Для 12CE67x устройств, линия данных - GPIO.6 и линия тактов - GPIO.7.


Для 16CE62x устройств, линия данных - EEINTF.1 и линия тактов -
EEINTF.2. См описание этих устройств для большей информации.

Синхронизация I2C инструкций установлена как стандартная скорость


устройства (100kHz) доступная с тактовой частотой 8MHz.
Высокоскоростные устройства (400kHz) могут быть использоваться до
20MHz. Если желательно управлять стандартным ускоренным устройством
8MHz как выше указано, должно быть добавлено в программе следующее
DEFINE:

DEFINE I2C_SLOW 1

Из-за ограниченности памяти и размера стека, это DEFINE на 12-битные


MCU не повлияет никак. Низкоскоростные (100 kHz) I2C устройства могут
использоваться до 4MHz. Свыше 4MHz должны использоваться
быстродействующие (400kHz) устройства.

Передача по I2C шине может быть приостановлена получением устройством


и удержанием, низкого уровня на линии тактов (не поддерживается на
12-битных PICmicro MCUs). Чтобы включить это, следующее DEFINE должно
быть добавлено в программе:

DEFINE I2C_HOLD 1

I2C линии тактов и данных данных должны быть подпитаны от напряжения


питания через резистор 4.7K по следующей схеме, как они оба
запускаются двунаправленным способом, с открытым коллектором.

Чтобы сделать линию тактов I2C биполярной вместо открытого коллектора,


можно добавить в программе следующее DEFINE:

DEFINE I2C_SCLOUT 1

addr var byte


cont con %10100000
addr = 17 ' установить адрес 17
' читать данные по адресу 17 в B2
I2CREAD PORTA.0,PORTA.1,cont,addr,[B2]

См Microchip "Non-Volatile Memory Products Data Book" для большей


информации об этих и других устройствах, которые могут использоваться
с I2CREAD и I2CWRITE командами.
PicBasic Pro Compiler - 48 -

+5V +5V +5V


│ │ │
│4.7K ┌───────────────────────────┐ │4.7K │
┌┴┐ │ +5v │ ┌┴┐ ┌┴┐
│ │ 1┌─────────┐18 │ 1┌───────┐8 │ │ │ │ │ │
│ │ ─┤RA2 RA1├─────────────┘ ┌──┤A0 Vcc├───┘ │ │ │ │ │
└┬┘ 2│ │17 │ 2│ │7 │ └┬┘ └┬┘
│ ─┼RA3 RA0├──────────────────┐ ├──┤A1 WP├───┐ │ │ 4.7K│
│ 3│ │16┌──┬─┤├┐ 22pf │ │ 3│ │6 ─┴─ ├──┘ │
│ ─┼RA4 OSC1├──┘ ─┴─ │ │ ├──┤A2 SCL├───────┘ │
│ 4│____ │15 ░░░ ├─┐ │ │ 4│ │5 │
└───┤MCLR OSC2├──┐ ─┬─ │ │ +5V │ ├──┤Vss SDA├───────┐ │
5│ │14└──┴─┤├┘ │ │ │ │ └───────┘ ├────────┘
┌───┤Vss Vdd├───┐ 22pf ─┴─ │ │ ─┴─ 24LC01B │
│ 6│ │13 └──────────┤ │ │
│ ─┤RB0 RB7├─ │ └──────────────────────┘
│ 7│ │12 ─┴─
│ ─┤RB1 RB6├─ ─┬─ 0.1мкФ
│ 8│ │11 │
│ ─┤RB2 RB5├─ │
│ 9│ │10 │
│ ─┤RB3 RB4├─ │
│ └─────────┘ │
│ PIC16F84 │
│ │
─┴─ ─┴─

5.33. I2CWRITE

I2CWRITE DataPin,ClockPin,Control,{Address,}[Value{,Value...}]{,Label}

I2CWRITE Посылает Control и необязательный Address через ClockPin и


DataPin в сопровождении Value. ClockPin и DataPin могут быть
константами 0-15, или переменными, содержащими число 0-15 (напр. B0)
или имя штырька (напр. PORTA.0).

Для 12-битных MCU PICmicro только:


I2C штырьки тактов и данных фиксируются во время трансляции по DEFINE.
Они все равно должны потом быть заданы в I2CREAD командах, хотя эта
информация проигнорируется компилятором.

DEFINE I2C_SCL PORTA,1 ' Только для 12-битных MCU


DEFINE I2C_SDA PORTA,0 ' Только для 12-битных MCU

Адресный размер посылки (байт или слово) определен размером


переменной, которая используется. Если для Address используется
однобайтовая переменная, 8-битный адрес послан. Если переменная
размером word, то 16-битный адрес послан. Обязательно используйте
переменную размера, соответствующего устройству с которым Вы хотите
сообщаться. Константы не должны использоваться для Адреса, так как
размер может измениться в зависимости от размера константы. Также не
следует использовать выражения; они могут вызвать неправильный размер
Адреса, который нужно послать.

При записи в последовательную EEPROM, необходимо ожидать 10ms (зависит


от устройства) для завершения записи перед следующей попыткой связи с
устройством. Если последующий I2CREAD или I2CWRITE попытается
прежде, чем запись завершится, доступ будет игнорироваться.
PicBasic Pro Compiler - 49 -

Поскольку одиночная команда I2CWRITE может использоваться, чтобы


записать много байтов сразу, этим можно нарушить вышеуказанную
синхронизацию записи, требующуюся для последовательных EEPROM.
Некоторые последовательные EEPROM позволяют Вам записывать многие
байты в единственную страницу прежде требующегося ожидания. См
описание на конкретное устройство, которое Вы используете для этих
деталей. Многобайтовая запись может также применяться с другими I2C
устройствами, кроме последовательных EEPROM, которые не требуют
ожидать между записями.

Если Value имеет размер word, 2 байта посылаются: старший байт первым,
младший вслед за ним. Этот порядок иной, чем обычная загрузка, когда
младший байт загружается сначала. Модификатор STR может быть поставлен
перед именем переменной. Это может использоваться, чтобы записать
целый массив (строка) сразу и имеет преимущество перед страничным
режимом последовательного EEPROM. Данные надо сформировать в одной
странице SEEPROM. Размер страницы зависит от конкретного устройства
SEEPROM. Если STR указан, следующая переменная должна быть именем
слова или байтового массива, сопровождаемого обратной косой чертой (\)
и количеством:

a var byte[8]
I2CWRITE PORTC.4,PORTC.3,$a0,0,[STR a\8]

Если размер массива - word, 2 байта, из которых состоит каждый элемент


читаются: младший байт сначала. Это не противоречит пути, по которому
компилятор нормально загружает переменные размера word.

Если необязательная Label задана, на эту метку будет переход, если I2C
устройство не опознано. I2C Инструкции могут использоваться, чтобы
управлять встроенным последовательным EEPROM на 12CExxx и 16CExxx
устройствах. Просто определите имена штырьков для подходящих
внутренних линий как часть I2C команды, и устанавливать следующее
DEFINE вначале программы:

DEFINE I2C_INTERNAL 1

Для 12CE67x устройств, линия данных - GPIO.6 и линия тактов - GPIO.7.


Для 16CE62x устройств, линия данных - EEINTF.1 и линия тактов -
EEINTF.2. См описание этих устройств для большей информации.

Синхронизация I2C инструкций установлена как стандартная скорость


устройства (100kHz) доступная с тактовой частотой 8MHz.
Высокоскоростные устройства (400kHz) могут быть использоваться до
20MHz. Если желательно управлять стандартным ускоренным устройством
8MHz как выше указано, должно быть добавлено в программе следующее
DEFINE:

DEFINE I2C_SLOW 1

Из-за ограниченности памяти и размера стека, это DEFINE на 12-битные


MCU не повлияет никак. Низкоскоростные (100 kHz) I2C устройства
могут быть использоваться до 4MHz. Свыше 4MHz должны использоваться
быстродействующие (400kHz) устройства.

Передача по I2C шине может быть приостановлена получением устройством


и удержанием, низкого уровня на линии тактов (не поддерживается на
12-битных PICmicro MCUs). Чтобы включить это, следующее DEFINE должно
быть добавлено в программе:

DEFINE I2C_HOLD 1
PicBasic Pro Compiler - 50 -

Чтобы сделать линию тактов I2C биполярной вместо открытого коллектора,


можно добавить в программе следующее DEFINE:

DEFINE I2C_SCLOUT 1

См команду I2CREAD выше в этом руководстве.

addr var byte


cont con %10100000

addr = 17 ' Установить адрес 17


' Передаем байт 6 по адресу 17
I2CWRITE PORTA.0,PORTA.1,cont,addr,[6]
Pause 10 ' Задержка 10ms на завершение записи

addr = 1 ' Установить адрес 1


' Передаем байт из B2 по адресу 1
I2CWRITE PORTA.0,PORTA.1,cont,addr,[B2]
Pause 10 ' Задержка 10ms на завершение записи

5.34. IF..THEN

IF Comp {AND/OR Comp...} THEN Label


IF Comp {AND/OR Comp...} THEN
Statement...
ELSE
Statement...
ENDIF

Выполняет одно или несколько сравнений. Каждый Comp может относиться к


переменной или константе или к другой переменной, включая один из
операторов сравнения, упомянутых прежде.

IF..THEN производит сравнение условий на истинность или ложность. Если


оно истинно (удовлетворяется), выполняется операция после THEN. Если
оно ложно, операция после THEN не выполняется. Сравнения, которые дают
0, считаются ложью. Любая другая величина считается истинностью.

Все сравнения - беззнаковые, так как PBP поддерживает только


беззнаковые типы. IF..THEN не может использоваться, чтобы проверить
что число - менее 0.

Прим. перев. Чтобы проконтролировать "отрицательность" величины в


этих условиях, требуется узнать, установлен ли старший бит
переменной. Это можно выяснить различными способами, например,
использовать функцию ABS:
IF ABS(N)<>N THEN MINUS ' переход, если N<0.

Обязательно следует использовать скобки, чтобы определить порядок в


котором должна производиться проверка. В противном случае, приоритет
операций будет определен автоматически и результат может не
соответствовать задуманному.

IF..THEN может работать двумя способами. В одной форме, THEN в


IF..THEN эквивалентен GOTO. Если условие - действительное, программа
сделает переход на меткой после THEN. Если состояние ложно, программа
продолжится со следующей строки после IF..THEN.
PicBasic Pro Compiler - 51 -

'если кнопка на Pin0 нажата (0), переход на метку pushd


If Pin0 = 0 Then pushd

' если величина переменной B0 больше или равна 40, переход на old
If B0 >= 40 Then old

' если на PORTB, pin 0 высокий уровень, (1) переход на itson


If PORTB.0 Then itson

If (B0 = 10) And (B1 = 20) Then loop

Во второй форме IF..THEN может условно выполнить группу инструкций,


следующих за Then. Инструкции могут сопровождаться необязательным
Else. ENDIF завершает структуру.

If B0 <> 10 Then
B0 = B0 + 1
B1 = B1 - 1
Endif

If B0 = 20 Then
led = 1
Else
led = 0
Endif

5.35. INPUT

INPUT Pin

Делает определенный штырек входом. Pin может быть константой 0-15, или
переменной, содержащей число 0-15 (напр. B0) или имя штырька (напр.
PORTA.0).

INPUT 0 ' Делает Pin0 входом


INPUT PORTA.0 ' Делает PORTA, pin 0, входом

Кроме того, штырек может быть установлен как вход значительно более
быстрым и коротким способом (из сгенерированной кодовой позиции):

TRISB.0 = 1 ' Устанавливает PORTB, pin 0 в режим входа

Все штырьки в порте могут быть сделаны входами устанавливая целый


TRIS-регистр сразу:

TRISB = %11111111 ' Устанавливает весь PORTB в режим входов

5.36. LCDIN

LCDIN{Address,}[Var{,Var...}]

Читает LCD RAM по адресу Address и запоминает данные в Var.

LCDы имеют встроенную RAM, которая используется для памяти знаков.


Большинство LCD имеют RAM предназначенную для воспроизведение знаков.
Такая RAM может быть записана при помощи инструкции LCDOUT. Инструкция
LCDIN предназначена для RAM, которые можно читать.
PicBasic Pro Compiler - 52 -

CG (генератор символов) RAM начинается с адреса $40 по $7f.


Отображение данных RAM начинается с адреса $80. Об этих адресах и
функциях см. описание на конкретный LCD.

Необходимо соединить линию чтения/записи LCD с MCU PICmicro штырьком


так, чтобы можно было управлять, выбрав чтение (LCDIN) или запись
(LCDOUT). Два DEFINE управляют адресом штырька:

DEFINE LCD_RWREG PORTE ' LCD чтение/запись pin port

DEFINE LCD_RWBIT 2 ' LCD чтение/запись pin bit

О соединении с LCD с PICmicro MCU, см описание LCDOUT.

LCDIN [B0]

5.37. LCDOUT

LCDOUT Item{,Item...}

Показывает пункты Item на интеллектуальном жидкокристаллическом (LCD)


дисплее. PBP поддерживает LCD модули с контроллером Hitachi 44780
или эквивалентным. Эти LCD обычно имеют 14 или 16 штырьков и одно- или
двухстолбцовый заголовок на одном крае.

Если пункту Item предшествует знак # , на LCD посылается ASCII


представление для каждой цифры. LCDOUT (на всех устройствах кроме
12-битных) может также использовать любой из модификаторов,
используемых с SEROUT2. См раздел о SEROUT2.

Модификатор Операция
-----------------+-------------------------------------
{I}{S}BIN{1..16} Посылает двоичные цифры
{I}{S}DEC{1..5} Посылает десятичные цифры
{I}{S}HEX{1..4} Посылает шестнадцатеричные цифры
REP c\n Посылает символ c повторенный n раз
STR ArrayVar{\n} Посылает строку n символов
-----------------+-------------------------------------

Программа должна ожидать по крайней мере полсекунды перед посылкой


первой команды на LCD. Это может взять совсем, пока LCD включится (-?
прим перев).

LCD инициализируется первой командой или любым символом посланным ему


при помощи LCDOUT. Если по каким-то причинам в течение операции
питание LCD отключается а затем включается снова, внутренний флаг
может быть сброшен, чтобы сообщить программе чтобы инициализировать
это в следующий раз при использовании LCDOUT:

FLAGS = 0

Команды посылаются на LCD отсылкой $FE с последующей командой.


Некоторые полезные команды указываются в следующей таблице:

Команда Операция
----------+-------------------------------
$FE, 1 Очистка дисплея
$FE, 2 Курсор в позицию "Home"
$FE, $0C Откл. курсор
$FE, $0E Вкл. курсор-подчерк
PicBasic Pro Compiler - 53 -

$FE, $0F Вкл. мерцание курсора


$FE, $10 Курсор влево
$FE, $14 Курсор вправо
$FE, $80 Курсор в начало первой строки
$FE, $C0 .. в начало второй
$FE, $94 .. в начало третьей
$FE, $D4 .. в начало четвертой
----------+-------------------------------

Имейте в виду, что есть команды, чтобы переместить курсор в начало


других строк многострочного дисплея. Для большинства LCD, отображаемые
символы и строки не слитны в памяти дисплея, они могут иметь разрывы
между позициями. Для большинства дисплеев 16x2, первая строка
начинается с $80 и вторая - с $C0. Команда:

LCDOUT $FE, $80 + 4

настраивает дисплей начать вывод символов с четвертой позиции первой


строки. Дисплеи 16x1 обычно организованы как дисплеи 8x2 с разрывом
между позициями памяти для первых и вторых восьми символов. 4-строчные
дисплеи также имеют перепутанную карту распределения памяти, как видно
из вышеуказанной таблицы.

См описание конкретного LCD устройства о позициях символьной памяти и


дополнительных командах.

LCDOUT $FE,1,"Hello" ' Очистка дисплея и вывод Hello

LCDOUT $FE,$C0,"World" ' Переход на вторую строку и показ World

LCDOUT B0,#B1 ' Отображения B0 и десятичный ASCII-код B1

LCD Может быть подключен к PICmicro MCU, использующему 4-бит или 8-бит
шина. Если используется 8-битная шина, все 8 бит должны быть на одном
порте. Если используется 4-битная шина, верхние 4 бита данных LCD
должны быть подключены или к нижним, или к верхним четырем битам
одного порта. Разрешение и Выбор Регистра могут быть подключены к
штырьку любого порта. R/W может быть связан с землей, если команда
LCDIN не используется.

PBP считает LCD подключенным к определенным штырькам если не


переопределено иное при помощи DEFINE. Он считает что LCD будет
использоваться с 4-бит шиной с линиями данных DB4 - DB7 подключенными
к PORTA.0 - PORTA.3, Выбор Регистра - на PORTA.4 и Разрешение - на
PORTB.3.

Также предустановлена инициализация LCD двухстрочного.

Для того, чтобы изменить эту установку, установите одно или несколько
из следующих DEFINE, все в верхнем регистре, в начале вашей PicBasic
Pro программы:

' Задать LCD порт данных


DEFINE LCD_DREG PORTB
' Задать начальный бит данных (0 or 4) если 4-битная шина
DEFINE LCD_DBIT 4
' Задать порт Выбора Регистра LCD
DEFINE LCD_RSREG PORTB
' Задать бит Выбора Регистра LCD
DEFINE LCD_RSBIT 1
PicBasic Pro Compiler - 54 -

' Задать порт Разрешения LCD


DEFINE LCD_EREG PORTB
' Задать бит Разрешения LCD
DEFINE LCD_EBIT 0
' Задать ширину шины LCD (4 или 8 бит)
DEFINE LCD_BITS 4
' Задать колич строк LCD
DEFINE LCD_LINES 2
' Задать время задержки команды, us
DEFINE LCD_COMMANDUS 2000
' Задать время задержки данных, us
DEFINE LCD_DATAUS 50

Эта установка сообщит PBP о 2-строковом LCD подключенном в 4-битном


режиме с шиной данных на верхних 4 битах PORTB, Выбор Регистра - на
PORTB.1, и Разрешение - на PORTB.0.

Следующая схема показывает способ подключения LCD к MCU PICmicro, по


умолчанию:

┌────────────────────────────────────────────┐
│ │
│ ┌────────────────────────────────────┐ │
│ │ │ │
│ │ ▐ ▐▀▀ ▐▀▄ │ │
│ │ ▐ ▐ ▐ ▌ │ │
│ │ ▐▄▄ ▐▄▄ ▐▄▀ │ │
+5V │ │ │ │
│ │ └────────────────────────────────────┘ │
│ │ Vss Vdd Vo RS R/W E 0 1 2 3 4 5 6 7 │
│ └───┬───┬──┬──┬──┬──┬──┬─┬─┬──┬──┬──┬──┬──┬──┘
├──────┐ 1│ 2│ 3│ 4│ 5│ 6│ 7│8│9│10│11│12│13│14│
┌┴┐20K └─────┼───┘ │ │ │ │ │ │ │ │
│ │<──────────┼──────┘ │ │ │ │ │ │ │
└┬┘ │ │ │ │ │ │ │ │
├────────────┴─────────┼──┘ │ │ │ │ │
─┴─ ┌──────────────────┼─────┘ │ │ │ │
│ +5V ┌───────┘ │ │ │ │
│ │ │ ┌────────────────────────┼──┼──┼──┘
│ ┌┴─┐ │ │ ┌──────────────────────┼──┼──┘
│ │ │10K │ │ │ │ │
│ │ ┌┴┐ │ │ │1┌───────────┐18 │ │
│ │ │ │ │ │ └─┤RA2 RA1├────────┼──┘ +5V
│ ┌┴┐│ │ │ │ 2│ │17 │ │
│ │ │└┬┘ │ └───┼RA3 RA0├────────┘ │
│ │ │ │ │ 3│ │16┌───┬────┤├─┐ │
│ └┬┘ └────┴─────┼RA4 OSC1├──┘ ─┴─ 22pf│ │
│ │10K 4│____ │15 ░░░4MHz ├───┐ │
│ └─────────────┤MCLR OSC2├──┐ ─┬─ │ │ │
│ 5│ │14└───┴────┤├─┘ │ │
│ ┌────┤Vss Vdd├────┐ 22pf ─┴─ │
│ │ 6│ │13 └─────────────────┤
│ │ ─┤RB0 RB7├─ │
│ │ 7│ │12 ─┴─
│ │ ─┤RB1 RB6├─ 0.1мкФ ─┬─
│ │ 8│ │11 │
│ │ ─┤RB2 RB5├─ │
│ ─┴─ 9│ │10 │
└────────────────┤RB3 RB4├─ │
└───────────┘ │
PIC16F84 ─┴─
PicBasic Pro Compiler - 55 -

5.38.{LET}

{LET} Var = Value

Присваивает величину Value переменной Var. Величина может быть


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

LET B0 = B1 * B2 + B3
B0 = Sqr W1

5.39. LOOKDOWN

LOOKDOWN Search,[Constant{,Constant...}],Var

Оператор LOOKDOWN ищет среди списка 8-битных Constant величину, равную


Search. Если обнаружена, номер найденной константы загружается в Var.
Если обнаружена величина самом начале списка, Var принимается за нуль.
Если вторая в списке, Var принимается за единицу, и так далее. Если не
найдено, Var остается неизмененной.

Список констант может быть смесью числовых и строковых констант.


Каждый символ в строке рассматривается как отдельная константа с
величиной ASCII. Массивы с переменным индексом не могут использоваться
в LOOKDOWN, хотя массивы с постоянным индексом позволены. Вплоть до
255 (256 для PIC18Xxxx) констант позволяются в списке.

Serin 1,N2400,B0 ' Асинхронно получает шестнадцатеричный символ из Pin1

LOOKDOWN B0,["0123456789ABCDEF"],B1 'Преобразование шестнадцатеричного


символа в B0 в десятичную величину B1

Serout 0,N2400,[#B1] ' Асинхронная отсылка десятичной величины через Pin0

5.40. LOOKDOWN2

LOOKDOWN2 Search,{Test}[Value{,Value...}],Var

Оператор LOOKDOWN2 ищет наличие величины Search в списке величин


Value. Если обнаруженно, номер найденной константы(? прим пер)
загружается в Var. Если обнаружена величина самом начале списка, Var
принимается за нуль. Если вторая в списке, Var принимается за единицу,
и так далее. Если не найдено, Var остается неизмененной.

Необязательный параметр Test может использоваться, чтобы выполнить


другие проверки, кроме равенства ("=") во время поиска. Например, в
списке может искаться первый элемент, с которым Search больше чем
Value, использовав ">" как параметр Test. Если Test пропущен,
принимается за "=".

Value может быть смесью 8- и 16-битных числовых и строковых констант и


переменных. Каждый символ в строке рассматривается как отдельная
константа с величиной ASCII. Выражения не могут использоваться в
списке величин, но они могут использоваться в качестве Search.

Массивы с переменным индексом не могут использоваться в LOOKDOWN2,


хотя массивы с постоянным индексом позволены. Вплоть до 85 (256 для
PicBasic Pro Compiler - 56 -

PIC18Xxxx) величин позволяются в списке.

LOOKDOWN2 генерирует код, в 3 раз объемнее, чем LOOKDOWN. Если список


поиска содержит только 8-битные константы и строки, используйте
LOOKDOWN.

LOOKDOWN2 W0,[512,W1,1024],B0
LOOKDOWN2 W0,>[1000,100,10],B0

5.41. LOOKUP

LOOKUP Index,[Constant{,Constant...}],Var

Оператор LOOKUP может использоваться, чтобы получить величины из


таблицы 8-битовых констант. Если Index -нулевой, Var присваивается
значение первой Constant. Если Index - единица, Var присваивается
значение второй Constant, и так далее. Если Index - равен или
превышает количество констант в списке, Var остается неизменной.

Список констант может быть смесью числовых и строковых констант.


Каждый символ в строке рассматривается как отдельная константа с
величиной ASCII. Массивы с переменным индексом не могут использоваться
в LOOKUP, хотя массивы с постоянным индексом позволены. Вплоть до 255
(256 для PIC18Xxxx) констант позволяются в списке.

For B0 = 0 To 5 ' Счет от 0 до 5


LOOKUP B0,["Hello!"],B1 ' Взять знак номером B0 из строки в переменную
B1
Serout 0,N2400,[B1] ' Послать знак из B1 через Pin0
последовательной передачей
Next B0 ' Обработать следующий знак

5.42. LOOKUP2

LOOKUP2 Index,[Value{,Value...}],Var

Оператор LOOKUP2 может использоваться, чтобы получить величины из


таблицы 8-битовых величин. Если Index - нулевой, Var присваивается
значение первой Value. Если Index - единица, Var присваивается
значение второй Value, и так далее. Если Index - равен или превышает
количество элементов в списке, Var остается неизменной.

Value может быть смесью 16-битных числовых и строковых констант и


переменных. Каждый символ в строке рассматривается как отдельная
константа с величиной ASCII. Выражения не могут использоваться в
списке величин, но они могут использоваться в качестве Index. Массивы
с переменным индексом не могут использоваться в LOOKUP2, хотя массивы
с постоянным индексом позволены. Вплоть до 85 (256 для PIC18Xxxx)
величин позволяются в списке.

LOOKUP2 генерирует код в 3 раза объемнее, чем LOOKUP. Если список


величин состоит из только 8-битных констант и строк, используйте
LOOKUP.

LOOKUP2 B0,[256,512,1024],W1
PicBasic Pro Compiler - 57 -

5.43. LOW

LOW Pin

Подает на указанный штырек низкий уровень. Штырек автоматически


становится выходом. Pin может быть константой 0 - 15, или переменной
содержащей число 0 - 15 (напр. B0) или имя штырька (напр. PORTA.0).

LOW 0 ' Делает Pin0 выходом и устанавливает на нем 0 вольт

LOW PORTA.0 ' Делает PORTA, pin 0 выходом и устанавливает на нем 0 вольт

led var PORTB.0 ' Задаем штырек LED


LOW led ' Делаем LED выходом и устанавливаем на нем 0 вольт

Кроме того, если штырек - уже выход, значительно более быстрый и


короткий путь (из сгенерированной кодовой позиции), чтобы установить
на нем низкий уровень, будет:

PORTB.0 = 0 ' Установить низкий уровень на PORTB, pin 0

5.44. NAP

NAP Period

Устанавливает микроконтроллер в режим низкого энергопотребления на


короткий период времени. В течение этого NAP, потребление мощности
сокращается до минимума. Указанные периоды - только приближенные
поскольку синхронизация производится от Сторожевого Таймера, который
работает от R/C-генератора и может существенно изменяться от чипа к
чипу и от температуры. Поскольку NAP использует Сторожевой Таймер, его
синхронизация независима от частоты кварца.

Period Задержка(приближ.)
------+-------------------
0 18 milliseconds
1 36 milliseconds
2 72 milliseconds
3 144 milliseconds
4 288 milliseconds
5 576 milliseconds
6 1.152 seconds
7 2.304 seconds
--------------------------

NAP 7 ' Пауза с низким потреблением мощности на 2.3 секунды

5.45. ON DEBUG

ON DEBUG GOTO Label

ON DEBUG позволяет подпрограмме обработчика отладки выполняться между


каждой PicBasic Pro инструкцией

Это достигнуто использованием ON INTERRUPT GOTO. Когда ON DEBUG GOTO


встречается, перед каждой инструкцией PicBasic Pro в программе,
вставляется вызов на указанную отладочную метку. DISABLE DEBUG
PicBasic Pro Compiler - 58 -

предотвращает вставки такого вызова, пока ENABLE DEBUG не продолжит


вставку вызовов.

Обработчик может быть написан так, чтобы активизироваться перед каждой


инструкцией. Он может посылать данные на LCD или через com-порт в
принимающую программу. Любая программная информация может отображаться
или даже изменяться в этом способе. Небольшая программа-обработчик
прислан, например, на нашем web-сайте.

Системная переменная размером word, которая находится в BANK0


требуется зарезервировать место под адреса программы прежде, чем она
будет вызвана по ON DEBUG GOTO:

DEBUG_ADDRESS VAR WORD BANK0 SYSTEM

Дополнительная переменная размером byte может использоваться, чтобы


возвратить уровень текущего стека программы:

DEBUG_STACK VAR BYTE BANK0 SYSTEM

Этот уровень должен никогда не быть больше чем 4 для 12- и 14-битных
MCU PICmicro, 12 для PIC17Cxxx устройств, или 27 для PIC18Xxxx
устройств. Поставленная переменная будет инкрементироваться при каждом
GOSUB и декрементироваться при каждом RETURN. Эта переменная должна
быть обнулена в начале программы.

Добавление этой переменной в программе увеличивает затраты ресурсов,


так как она должна обрабатываться при каждом GOSUB и RETURN.

5.46. ON INTERRUPT

ON INTERRUPT GOTO Label

ON INTERRUPT позволяет обрабатывать прерывания микроконтроллера


подпрограмме PicBasic Pro.

Есть 2 пути, чтобы оперировать прерываниями, используя PicBasic Pro


Компилятор.
Первый - написать ассемблерную программу обработки прерываний. Это
способ, чтобы оперировать прерываниями с самым коротким временем
ожидания и самыми низкими потерями, но должно содержать только
ассемблер, не BASIC, код. Этот метод обсуждается в специальных
разделах ниже.

Второй метод - чтобы написать PicBasic Pro программу обработки


прерывания. Это выглядит просто как PicBasic Pro подпрограмма но
оканчивающаяся RESUME.

Когда прерывание появляется, устанавливается соответствующий флаг. Как


только текущий оператор PicBasic Pro завершится, программа перейдет на
BASIC-программу обработки прерывания по метке Label. Когда программа
обработки прерывания закончится, команда RESUME посылает программу
обратно, где она была, когда обнаружилось прерывание, продолжая
прерванную работу.

DISABLE и ENABLE позволяют выполнить желаемые фрагменты PicBasic Pro


программы без прерываний. Наиболее примечательное место, где надо
использовать DISABLE - это перед собственно программой обработки
прерывания. Или программа обработки прерывания может быть помещена
перед командой ON INTERRUPT, так как флаг прерывания не установлен
перед первым ON INTERRUPT в программе.
PicBasic Pro Compiler - 59 -

Время ожидания это разница между фактическим временем на прерывание и


временем с момента начала действия программы обработки прерывания.
Поскольку PicBasic Pro утверждения не реентрантные (то есть Вы можете
выполнить другой оператор PicBasic Pro, пока один выполняется), там
может быть значительным время ожидания перед запуском программы
обработки.

PBP не запустит BASIC-программу обработки прерывания до тех пор, пока


не завершится выполнение текущего оператора. Если это PAUSE или SERIN,
это могло быть долгое время, прежде чем прерывание подтверждено.
Программа должна разрабатываться с учетом этого времени. Если это
неприемлемо и прерывания должны обрабатываться более быстро, должна
использоваться программа обработки прерываний на ассемблере.

Затраты ресурсов - второй вопрос. ON INTERRUPT добавит инструкции


перед каждым оператором, чтобы проверить каждый раз, обнаружилось ли
прерывание. DISABLE отключает добавление этих инструкций, ENABLE
включает это снова. Обычно, дополнительные инструкции не будут
значительной проблемой, но длинные программы в небольших
микроконтроллерах могут быть стеснены.

В программе можно использовать более чем одно ON INTERRUPT.

ON INTERRUPT GOTO myint ' Обработчик прерывания - myint


INTCON = %10010000 ' Вкл прерывание RB0
. . .
DISABLE ' Отключить прерывания на время обработки
myint: led = 1 ' Включение LED по прерыванию
RESUME ' Возврат в основную программу
ENABLE ' Включить прерывания после завершения обработки

Чтобы выключить прерывания постоянно (или до тех пор, пока действует


ON INTERRUPT, используйте INTCON и $80:

INTCON = $80

5.47. OUTPUT

OUTPUT Pin

Делает указанный штырек выходом. Pin может быть константой 0-15, или
переменной, содержащей число 0-15 (напр. B0) или имя штырька (напр.
PORTA.0).

OUTPUT 0 ' Делает Pin0 выходом


OUTPUT PORTA.0 ' делает PORTA, pin 0 выходом

Кроме того, штырек может быть установлен как вход значительно более
быстрым и коротким способом (из сгенерированной кодовой позиции):

TRISB.0 = 0 ' Устанавливает PORTB, pin 0 в режим выхода

Все штырьки в порте могут быть сделаны выходами, устанавливая целый


TRIS-регистр сразу:

TRISB = %00000000 ' Устанавливает весь PORTB в режим входов


PicBasic Pro Compiler - 60 -

5.48. OWIN

OWIN Pin,Mode,[Item...]

Оционально посылает импульс сброса на однопроводное устройство (такое,


вероятно, как известные "таблеточные" ключи. прим. перев) и затем
читает с него один или более битов или байтов данных, заканчивая,
опционально, снова импульсом сброса.

Pin может быть константой 0-15, или переменной, содержащей число 0-15
(напр. B0) или имя штырька (напр. PORTA.0).

Биты числа Mode определяют, сброс послан перед и/или после операции и
размер элементов данных: бит или байт.

номер бита Mode Влияние


----------------+------------------------------------------
0 1=посылать импульс сброса перед данными
1 1=посылать импульс сброса после данных
2 0=байтовые данные, 1=битовые данные
----------------+------------------------------------------

Некоторые примеры Mode: Mode=0 нет сброса и байтовые данные, Mode=1


сброс перед данными и байтовые данные, Mode=4 без сброса и битовые
данные.

Item - одна или более переменных или модификаторы, разделяемые


запятыми. Допустимые модификаторы - STR для чтения данных в переменную
байтового массива и SKIP для пропуска нескольких входных величин.

SKIP и STR модификаторы не поддерживаются для 12-бит PICmicro MCUs


из-за ограниченности RAM и размера стека.

OWIN PORTC.0,0,[STR temperature\2,SKIP 4, count_remain, count_per_c]

Этот оператор получит байты от однопроводного устройства на


PORTC Pin 0 без посылаемого сброса импульса. Он получит 2 байта и
устанавливало их в байтовый массив температуры, пропустит следующие 4
байта и затем прочтет конечные 2 байта в отдельные переменные.

5.49. OWOUT

OWOUT Pin,Mode,[Item...]

Оционально посылает импульс сброса на однопроводное устройство и


затем записывает в него один или более битов или байтов данных,
заканчивая, опционально, снова импульсом сброса.
Pin может быть константой
0-15, или переменной,
содержащей
число 0-15 (напр. B0) или имя штырька (напр.
PORTA.0).

Биты числа Mode определяют, сброс послан перед и/или после операции и
размер элементов данных: бит или байт.

номер бита Mode Влияние


----------------+------------------------------------------
0 1=посылать импульс сброса перед данными
1 1=посылать импульс сброса после данных
2 0=байтовые данные, 1=битовые данные
PicBasic Pro Compiler - 61 -

----------------+------------------------------------------
Некоторые примеры Mode: Mode=0 нет сброса и байтовые данные, Mode=1
сброс перед данными и байтовые данные, Mode=4 без сброса и битовые
данные.

Item - одна или более переменных или модификаторы, разделяемые


запятыми. Допустимые модификаторы - STR для посылки данных из
переменной байтового массива и REP для посылки повторяемой величины.

REP и STR модификаторы не поддерживаются для 12-битных PICmicro MCUs


из-за ограниченности RAM и размера стека.

OWOUT PORTC.0,1,[$cc,$be]

Этот оператор пошлет импульс сброса на однопроводное устройство на


PORTC Pin 0, затем байты $cc и $be.

5.50. PAUSE

PAUSE Period

Pause останавливает программу на Period миллисекунд. Period -


16-битный, так что задержки могут закончиться в 65,535 миллисекунд
(немного больше минуты). В отличие от других функций задержки (NAP и
SLEEP), PAUSE не устанавливает микроконтроллер в режим низкого
энергопотребления. Таким образом, PAUSE поглощает больше мощности но
за то более точна. Она имеет ту же точность как системные часы.

PAUSE рассчитана на частоту генератора 4MHz. Если частота генератора


другая, это следует объявить для PBP, используя DEFINE OSC.

PAUSE 1000 ' Задержка на 1 сек

5.51. PAUSEUS

PAUSEUS Period

Останавливает программу на Period микросекунд. Period - 16-битный, так


что задержки могут закончиться в 65,535 микросекунд. В отличие от
других функций задержки (NAP и SLEEP), PAUSE не устанавливает
микроконтроллер в режим низкого энергопотребления. Таким образом,
PAUSEUS поглощает больше мощности но за то более точна.

Поскольку PAUSEUS берет для работы минимальное количество циклов в


зависимости от частоты генератора, задержек менее чем минимальное
количество микросекунд поучить невозможно. Для того, чтобы получить
задержки короче, используйте программу ассемблера.

OSC Мин. задержка


-----------------------
3(3.58) 20us
4 24us
8 12us
10 8us
12 7us
16 5us
20 3us
24 3us
25* 2us
32* 2us
33* 2us
PicBasic Pro Compiler - 62 -

40** 2us
-----------------------
* PIC17Cxxx и PIC18Xxxx только.
** PIC18Xxxx только.

PAUSEUS рассчитана на частоту генератора 4MHz. Если частота генератора


другая, это следует объявить для PBP, используя DEFINE OSC.

PAUSEUS 1000 ' задержка на 1 миллисекунду

5.52. PEEK

PEEK Address,Var

Читает регистр микроконтроллер по указанному адресу и загружает


результат в Var. Специальные особенности MCU PICmicro как например,
A/D преобразователи и дополнительные порты I/O могут быть прочитаны,
используя PEEK.

Если Address - константа, содержимое этого регистра передается в Var.


Если Address - имя специального функционального регистра, напр.
PORTA, содержимое этого регистра будет передано в Var. Если Address -
это адрес RAM, сначала будет читаться величина из RAM, затем будет
передано содержимое регистра, описанного этой величиной.

Тем не менее, все регистры MCU PICmicro могут и должны управляться без
использования PEEK и POKE. Все регистров MCU PICmicro считаются
8-битными переменными PicBasic Pro, и могут использоваться как и любая
другая байтовая переменная. Они могут быть прочитаны непосредственно
или использованы непосредственно в вычислении.

B0 = PORTA ' передает текущее состояние штырьков PORTA в B0

5.53. PEEKCODE

PEEKCODE Address,Var

Читает величину из области кода по указанному адресу и загружает


результат в Var.

PEEKCODE может использоваться, чтобы прочитать данные загруженные в


область кода MCU PICmicro. Выполняется вызов (call) по указанному
адресу и возвращенная величина помещается в Var. Определенная
позиция должна содержать retlw и данные. Чтобы загрузить эту величину
(во время программирования устройства) надо использовать POKECODE.

PEEKCODE $3ff, OSCCAL ' получает величину OSCCAL для PIC12C671/12CE673


PEEKCODE $7ff, OSCCAL ' получает величину OSCCAL для PIC12C672/12CE674

5.54. POKE

POKE Address,Value

Записывает Value в регистр микроконтроллера по указанному адресу.


Специальные особенности MCU PICmicro, как например, A/D
преобразователи и дополнительные I/O порты могут быть записаны
используя POKE.

Если Address - константа, содержимое этого регистра передается в Var.


PicBasic Pro Compiler - 63 -

Если Address - имя специального функционального регистра, напр.


PORTA, содержимое этого регистра будет передано в Var. Если Address -
это адрес RAM, сначала будет читаться величина из RAM, затем будет
передано содержимое регистра, описанного этой величиной.

Тем не менее, все регистры MCU PICmicro могут и должны


управляться без использования PEEK и POKE.
Все регистров MCU PICmicro считаются 8-битными переменными PicBasic Pro,
и могут использоваться как и любая другая
байтовая переменная. Они могут быть прочитаны непосредственно
или использованы непосредственно в вычислении.

TRISA = 0 ' Сделать PORTA все выходами


PORTA.0 = 1 ' Установить высокий уровень на PORTA бит 0

5.55. POKECODE

POKECODE Value{,Value...}

Записывает величины Value,.. в область кода по текущему адресе в


программе во время программирования микроконтроллера.

POKECODE может использоваться, чтобы сгенерировать таблицы в кодовом


пространстве PICmicro MCU. Он генерирует код retlw с данными. Доступ к
таким данным - при помощи инструкции PEEKCODE.

Ассемблерная инструкция Org может использоваться, чтобы установить


позицию начала для накопления данных. Если это не задано, накопление
данных будет располагаться сразу же после последней записанной
инструкции программы.

Для того, чтобы избежать прерывания хода программы, POKECODE должен


быть последней строкой вашей программы. Его следует размещать после
команды END или STOP.

POKECODE 10, 20, 30 ' Записывает 10, 20, и 30 в область кода

Генерируются:
retlw 10
retlw 20
retlw 30

@ org 7ffh ' Устанавливает начало в $7ff


POKECODE $94 ' Устанавливает величину OSCCAL для PIC12C672/12CE674

Генерируются:
org 7ffh
retlw 94h

5.56. POT

POT Pin,Scale,Var

Читает потенциометр (или какое-либо другое резистивное устройство) на


штырьке. Pin может быть константой 0-15, или переменной, содержащей
число 0-15 (напр. B0) или имя штырька (напр. PORTA.0).

Сопротивление измеряется по времени заряда конденсатора через резистор


(типично 5K - 50K). Scale используется, чтобы учесть постоянную
времени RC. Для больших RC Scale должна быть установлена меньшей
(минимально - единица). Для меньших RC, Scale должна устанавливаться
PicBasic Pro Compiler - 64 -

большей, максимально 255. Когда Scale установлена правильно, Var


должна быть нулем около минимального сопротивления и 255 при
максимальном сопротивлении.

К сожалению, это определяется экспериментально. Для того, чтобы


сделать так, установите потенциометр на максимальное сопротивление и
прочитайте это со Scale, равной 127. Настраивайте Scale, пока команда
POT не выдаст 254. Если 255, уменьшите Scale. Если 253 или меньше,
увеличите Scale. (Примечание: Это подобно процессу, выполняемому
опцией окружения Alt-P в BS1).

Используйте следующий код, чтобы автоматизировать процесс подбора.


Убедитесь, что потенциометр стоит на максимальном сопротивлении.

B0 Var Byte
scale Var Byte
For scale = 1 To 255
POT 0,scale,B0
If (B0 > 253) Then calibrated
Next scale
Serout 2,0,["Increase R or C.",10,13]
Stop
calibrated:
Serout 2,0,["Scale= ",#scale,10,13]

Пример подключения потенциометра:

┌─┐
│ │
Pin ───────>│ │ 5 - 50K
│ │
└┬┘

─┴─
─┬─ 0.1


─┴─

5.57. PULSIN

PULSIN Pin,State,Var

Измеряет ширину импульса на Штырьке. Если State=1, измеряется ширина


импульсов, а если State=0 - то ширина промежутков между импульсами
(инверсные импульсы). Измеренная ширина передается в Var. Если фронт
импульса не приходит, или длительность импульса слишком велика, Var
принимается за нуль. Если используется 8-битная переменная,
возвращается только младший байт 16-битного результата измерения.

Штырек автоматически становится входом. Pin может быть константой


0-15, или переменной, содержащей число 0-15 (напр. B0) или имя штырька
(напр. PORTA.0).

Разрешение PULSIN зависит от частоты генератора. Если используется


4MHz генератор, измеренная ширина импульса приращается по 10us. Если
20MHz генератор используется, ширина импульса будет измерена с
разрешением 2us. Величина OSC не имеет никакого влияния на PULSIN.
Разрешение всегда определяется фактической скоростью генератора.

PULSIN нормально ожидает максимум 65535 отсчетов прежде, чем он


определит, что нет импульса. Если требуется ожидать меньшее время,
PicBasic Pro Compiler - 65 -

можно добавить DEFINE:

DEFINE PULSIN_MAX 1000

Такое DEFINE также воздействует на RCTIME.

' Измерение импульса (высокого уровня) на Pin4, передаем в W3


PULSIN PORTB.4,1,W3

5.58. PULSOUT

PULSOUT Pin,Period

Генерирует на штырьке импульс заданной длительности. Импульс


генерируется переключая штырек дважды, таким образом, начальное
состояние штырька определяет полярность импульса. Штырек автоматически
становится выходом. Pin может быть константой 0-15, или переменной,
содержащей число 0-15 (напр. B0) или имя штырька (напр. PORTA.0).

Разрешение PULSOUT зависит от частоты генератора. Если используется


4MHz генератор, измеренная ширина импульса приращается по 10us. Если
20MHz генератор используется, ширина импульса будет измерена с
разрешением 2us. Величина OSC не имеет никакого влияния на PULSIN.
Разрешение всегда определяется фактической скоростью генератора.

' Посылать на Pin5 импульс 1mSec (при 4MHz)


PULSOUT PORTB.5,100

5.59. PWM

PWM Pin,Duty,Cycle

Выводит на штырек широтно-импульсную модуляцию. Каждый цикл PWM


состоит из 256 шагов. Duty определяет заполнение цикла (скважность) 0
(0%) до 255 (100%). Этот PWM цикл повторяется Cycle раз. время Цикла.
Pin может быть константой 0-15, или переменной, содержащей число 0-15
(напр. B0) или имя штырька (напр. PORTA.0).

Время цикла PWM зависит от частоты генератора. Если используется кварц


4MHz, каждый цикл длится 5ms. Если 20MHz, то 1ms. Величина OSC не
имеет никакого влияния на PWM. Время цикла всегда определяется
фактической скоростью генератора.

Если Вы хотите непрерывный PWM выход и MCU PICmicro имеет для этого
аппаратные средства PWM, вместо PWM может использоваться HPWM.

Широтно-импульсная модуляция позволяет получить аналоговый выход, если


пропустить сигнал через ФНЧ, чтобы освободиться от зашумляющих
гармоник. Такая RC-цепь может использоваться в качестве простейшего
цифро-аналогового преобразователя:

10K
Pin ───█████─────┬────── аналоговый выход
│+
─┴─ 1мкФ
─┬─

─┴─

PWM PORTB.7,127,100 ' Посылает 100 циклов 50%-ного заполнения на Pin7


PicBasic Pro Compiler - 66 -

5.60. RANDOM

RANDOM Var

Выполняет одну итерацию псевдо-рандомизации на Var. Var должна быть


16-битной переменной. Массивы с переменным индексом не могут
использоваться в RANDOM, хотя массивы с постоянным индексом позволены.
Var используется как для аргумента, так и для результата. Используемый
псевдослучайный алгоритм имеет длину прохода 65535 (только нуль не
продуцируется).

RANDOM W4 ' "Перемешивает" величину в W4

5.61. RCTIME

RCTIME Pin,State,Var

RCTIME измеряет время, которое штырек остается в указанном состоянии.


Это основная часть PULSIN. Штырек автоматически становится входом. Pin
может быть константой 0-15, или переменной, содержащей число 0-15
(напр. B0) или имя штырька (напр. PORTA.0).

RCTIME может использоваться, чтобы прочитать потенциометр (или


какое-либо другое резистивное устройство). Сопротивление измеряется по
времени заряда конденсатора через резистор (типично 5K - 50K).

Разрешение RCTIME зависит от частоты генератора. Если используется


4MHz генератор, измеренная ширина импульса приращается по 10us. Если
20MHz генератор используется, ширина импульса будет измерена с
разрешением 2us. Величина OSC не имеет никакого влияния на RCTIME.
Разрешение всегда определяется фактической скоростью генератора.

Если состояние не меняется совсем, возвращается 0. RCTIME нормально


ожидает максимум 65535 отсчетов прежде, чем он определит, что нет
импульса. Если требуется ожидать меньшее время, можно добавить DEFINE:

DEFINE PULSIN_MAX 1000

Такое DEFINE также воздействует на PULSIN.

Low PORTB.3 ' Разрядить емкость перед стартом


Pause 10 ' 10ms на разрядку
RCTIME PORTB.3,0,W0 ' чтение потенциометра на Pin3

5.62. READ

READ Address,Var

Читает байт из встроенного EEPROM по указанному адресу и загружает


результат в Var. Эта инструкция может использоваться с только MCU
PICmicro имеющими встроенное EEPROM данных, как например, PIC16F84,
16C84 и 16F87x серия.

READ не окажет влияние на устройства со встроенной EEPROM интерфейса


I2C, подобно PIC12CE67x и частью 16CE62x. Для них используйте взамен
инструкцию I2CREAD.

READ 5,B2 ' Передает в B2 величину из позиции 5 EEPROM


PicBasic Pro Compiler - 67 -

Чтобы прочитать слово, каждый из двух байтов, составляющих слово


должны быть прочитаны раздельно:

w Var Word
READ 0,w.BYTE0
READ 1,w.BYTE1

5.63. READCODE

READCODE Address,Var

Читает код по адресу Address в Var.

Некоторые PIC16Fxxx и PIC18Xxxx устройства позволяют читать


программный код при выполнении. Это может быть полезно для
дополнительного накопления данных или проверки достоверности
программного кода.

Для PIC16Fxxx устройств, 14-битные данные будут читаться при помощи


16-битных адресов.

Для PIC18Xxxx устройств, байтовые или двухбайтовые данные могут


читаться при помощи байтовых адресов в диапазоне 0 - 65535.

Можно посмотреть файл листинга, чтобы определить программные адреса.

READCODE $100,w ' Передать кодовое слово из позиции $100 в W

5.64. RESUME

RESUME {Label}

Возвращает программу к месту, где она выполнялась, после окончания


обработки прерывания. RESUME подобно RETURN но используется в конце
PicBasic Pro программы обработки прерывания.

Если используется необязательная Label, программное выполнение


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

Смотри ON INTERRUPT для большей информации.

clockint: seconds = seconds + 1 ' Счет времени


RESUME ' Возврат в программу после прерывания

error: High errorled ' Включить индикатор ошибки


RESUME restart ' Уход на рестарт

5.65. RETURN

RETURN

Возврат из подпрограммы. RETURN возвращает выполнение к команде,


следующей за GOSUB, которым была вызвана подпрограмма.

Gosub sub1 ' Переход к подпрограмме sub1


...
sub1: Serout 0,N2400,["Lunch"] ' Посылает "Lunch" послед. передачей через
Pin0
PicBasic Pro Compiler - 68 -

RETURN ' Возврата в основную программу после Gosub

5.66. REVERSE

REVERSE Pin

Если штырек - вход, делается выходом; если выход, - делается входом.


Pin может быть константой 0-15, или переменной, содержащей число 0-15
(напр. B0) или имя штырька (напр. PORTA.0).

Output 4 ' Делает Pin4 выходом


REVERSE 4 ' превращает Pin4 во вход.

5.67. SELECT CASE

SELECT CASE Var


CASE Expr1 {, Expr...}
Statement...
CASE Expr2 {, Expr...}
Statement...
{CASE ELSE
Statement...}
END SELECT

CASE иногда легче использовать, чем многократное IF..THEN. Эти


операторы используются, чтобы сравнить переменную с другими величинами
или с диапазоном величин, и предпринимать действия, в зависимости от
ее величины.
Переменная Var, которая нужно использовать в всех сравнениях
определяется в операторе SELECT CASE. Каждый CASE с последующими за
ним операторами будет выполнен, если CASE - истинно. IS может
использоваться, чтобы определить сравнение, кроме равного. Если ни
один из CASE не будет истинным, выполнятся операторы под
необязательным CASE ELSE. END SELECT закрывает SELECT CASE.

SELECT CASE x
CASE 1
y = 10
CASE 2, 3
y = 20
CASE IS > 5
y = 100
CASE ELSE
y = 0
END SELECT

5.68. SERIN

SERIN Pin,Mode,{Timeout,Label,}{[Qual...],}{Item...}

Принять один или более пунктов Item в стандартном асинхронном формате,


использующем: 8 битов данных, без четности, один стоповый бит (8N1).
SERIN - подобна команде Serin BS1 с дополнением Timeout. Штырек
автоматически становится входом. Pin может быть константой 0-15, или
переменной, содержащей число 0-15 (напр. B0) или имя штырька (напр.
PORTA.0).

Имена Mode (напр. T2400) определены в файле MODEDEFS.BAS. Для того,


чтобы использовать их, добавьте строку:

Include "modedefs.bas"
PicBasic Pro Compiler - 69 -

в начале программы PicBasic Pro. BS1DEFS.BAS и BS2DEFS.BAS уже


включают MODEDEFS.BAS. Не включайте его снова, если один из этих
файлов уже включен. Числа Mode могут использоваться и без включения
этого файла.

-----+----+-----+-----------
Mode Mode Бод Состояние
No.
-----+----+-----+-----------
T2400 0 2400
T1200 1 1200 Прямой
T9600 2 9600
T300 3 300
-----+----+-----+-----------
N2400 4 2400
N1200 5 1200 Инверсный
N9600 6 9600
N300 7 300
-----+----+-----+-----------

Необязательные Timeout и Label могут быть включены, чтобы позволить


программе, продолжить если символ не получается в течение
определенного времени. Timeout определяется в миллисекундах. Если
последовательный входной штырек остается в холостом состоянии в
течение времени Timeout, программа покинет команду SERIN и перейдет на
метку Label.

Список элементов данных, который нужно получать может предваряться


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

Как только классификаторы удовлетворяются, SERIN начинает передавать


данные в переменные по каждому пункту Item. Если используется просто
имя переменной, величина полученного символа ASCII загружается в
переменную. Если переменная предшествуется знаком # , SERIN
преобразовывает десятичную величину из ASCII и загружает результат в
переменную. Все не-цифры, полученные до первой цифры десятичной
величины, игнорируются и отвергаются; не-цифровой символ, который
завершает десятичную величину, также отвергается.

SERIN рассчитана на кварц 4MHz при генерации бита синхронизации. Для


того, чтобы обеспечить соответствующую скорость обмена при другой
частоте генератора, обязательно установите соответствующую величину
OSC при помощи DEFINE.
Пока общеупотребительны недорогие однокристальные преобразователи
уровня RS-232. Но благодаря текущей реализации RS-232 и отличным I/O
техническим качествам MCU PICmicro, в большинстве случаев такие
преобразователи уровня могут не потребоваться. Достаточно использовать
инвертирование входом (N300..N9600), подключенным через
токоограничительный резистор 22К.

DB9 DB25
22K
Pin ────████──── RS-232 Tx Конт 3 Конт 2

┌───── RS-232 GND Конт 5 Конт 7


PicBasic Pro Compiler - 70 -

─┴─

' Ожидать, пока на Pin1 будет принят символ "A" и передать следующий в B0
SERIN 1,N2400,["A"],B0

5.69. SERIN2

SERIN2 DataPin{\FlowPin},Mode,{ParityLabel,}{Timeout,Label,}[Item...]

Получает один или более пунктов через штырек в стандартном асинхронном


формате. SERIN2 - аналог Serin в BS2. DataPin автоматически делается
входом. Необязательный FlowPin автоматически делается выходом. DataPin
и FlowPin могут быть константами 0-15, или переменными, содержащими
число 0-15 (напр. B0) или имя штырька (напр. PORTA.0).

Необязательный штырек управления потоком данных, FlowPin, может быть


задан, чтобы помочь предохранить данные при переполнении приемника.
Если он используется, FlowPin автоматически устанавливается во
включенное состояние, позволяя передачу каждого символа. Это
включенное состояние определено полярностью данных, задаваемой в Mode.

Mode используется, чтобы определить скорость обмена и, рабочие


параметры последовательной передачи. Младшие 13 битов выбирает
скорость обмена. Бит 13 определяет четность или без четности. Бит 14
выбирает инвертирование или прямую передачу. Бит 15 не используется.

Биты скорости передачи определяют время передачи бита в микросекундах


минус 20. Для того, чтобы найти величину для конкретной скорости
передачи в бодах, используйте формулу:

(1000000/бод)-20

Некоторые стандартные скорости показаны в следующей таблице.

Baud Bits
rate 0..12
-------+-------
300 3313
600 1646
1200 813
2400 396
4800 188
9600* 84
19200* 32
-------+-------
*Может потребоваться
кварц более 4MHz.

Бит 13 = 1 -проверка на четность, бит 13 = 0 -без проверки. Нормальная


последовательная передача - 8N1 (8 битов данных, без четности, 1
стоповый бит). Если четность выбрана, данные будут получены как 7E1 (7
битов данных, проверка на четность и 1 стоповый бит). Для того,
чтобы получить проверку на нечетность вместо проверки на четность,
поставьте следующее DEFINE в программе:

DEFINE SER2_ODD 1

Бит 14 выбирает активный уровень для штырьков данных и управления


потоком данных. Если бит 14 = 0, данные получаются в истиной форме,
при работе через микросхему-преобразователь уровней RS-232. Если бит
14 = 1, получаемые данные инвертируются. Этот режим может
использоваться для прямого подключения к RS-232, без дополнительных
PicBasic Pro Compiler - 71 -

преобразователей.

Некоторые примеры Mode: Mode=84 (9600 бод, без четности, прямой),


Mode=16780 (2400 бод, без четности, инвертирующий), Mode=27889 (300
бод, проверка на четность, инвертирующий). В Приложении A есть еще
примеры Mode.

Если ParityLabel указана, на эту метку будет переход, если получен


символ с неправильной четностью. Это должно использоваться только если
четность выбрана (бит 13 = 1).

Необязательные Timeout и Label могут быть указаны, чтобы позволить


программе продолжиться если символ не получен в течение заданного
времени. Timeout задается в миллисекундах. Если последовательный
входной штырек остается в холостом состоянии в течение времени
Timeout, программа покинет SERIN2 команда и перейдет на Label.

DEFINE позволяет задать другую битность данных, чем 8 (или 7 с


четностью). Битность данных SER2_BITS может быть в пределах от 4 битов
до 8 (по умолчанию, когда DEFINE отсутствует). Включение четности
возьмет один от заданного количества битов.

Определяя SER2_BITS в 9, позволяем читать и записывать 8 бит, вместе с


9 битом четности.

Без четности (по умолчанию):

DEFINE SER2_BITS 4 ' Установить в 4 бита данных для Serin2 и Serout2


DEFINE SER2_BITS 5 ' Установить в 5 бит данных для Serin2 и Serout2
DEFINE SER2_BITS 6 ' Установить в 6 бит данных для Serin2 и Serout2
DEFINE SER2_BITS 7 ' Установить в 7 бит данных для Serin2 и Serout2
DEFINE SER2_BITS 8 ' Установить в 8 бит данных для Serin2 и Serout2 (по
умолчанию)

С четностью:

DEFINE SER2_BITS 5 ' Установить в 4 бита данных для Serin2 и Serout2


DEFINE SER2_BITS 6 ' Установить в 5 бит данных для Serin2 и Serout2
DEFINE SER2_BITS 7 ' Установить в 6 бит данных для Serin2 и Serout2
DEFINE SER2_BITS 8 ' Установить в 7 бит данных для Serin2 и Serout2
DEFINE SER2_BITS 9 ' Установить в 8 бит данных для Serin2 и Serout2

SERIN2 поддерживает многие другие модификаторы данных, которые могут


свободно смешиваться и сопоставляться внутри одного оператора SERIN2,
чтобы обеспечить различные форматы входа.

Модификатор Операция
----------------------------------------------------------------------------
BIN{1..16} Прием двоичной цифры
DEC{1..5} Прием десятичной цифры
HEX{1..4} Прием шестнадцатеричной цифры (заглавные)
SKIP n Пропустить n принятых знаков
STR ArrayVar\n{\c} Принять строку n знаков. Опционально: завершаемых
знаком c
WAIT ( ) Ожидать последовательность знаков
WAITSTR ArrayVar{\n} Ожидать строку знаков
----------------------------------------------------------------------------

1) Если переменной предшествует BIN, принимаемые символы ASCII будут


считаться двоичной записью числа. Например, если задано BIN B0 и
принято "1000", B0 будет присвоено 8.
PicBasic Pro Compiler - 72 -

2) Если переменной предшествует DEC, принимаемые символы ASCII будут


считаться десятичной записью числа. Например, если задано DEC B0 и
принято "123", B0 будет присвоено 123.

3) Если переменной предшествует HEX, принимаемые символы ASCII будут


считаться шестнадцатеричной записью числа. Например, если задано HEX
B0 и принято"FE", B0 будет присвоено 254.

4) SKIP сопровожденный количеством, исключит столько символов из


входного потока. Например, SKIP 4 пропустит четыре символа.

5) STR с последующей переменной байтового массива, количеством и


необязательным символом окончания, получит строку символов. Длина
строки определена заданным количеством или когда указанный символ
появится на вход.

6) Список элементов данных, которые нужно принять может


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

7) WAITSTR можно использовать как WAIT, чтобы заставить SERIN2 ждать


строку символов опциональной длины(-? прим. перев.) перед процессом.

Как только классификаторы WAIT или WAITSTR удовлетворяются, SERIN2


начинает сохранять данные в переменных, назначенных каждому пункту.
Если используется просто имя переменной, величина полученного символа
ASCII загружается в переменную. Если переменная предшествуется BIN,
DEC или HEX, тогда SERIN2 преобразовывает двоичную, десятичную или
шестнадцатеричную величину из ASCII и загружает результат в
переменную. Все не-цифры полученные до первой цифры десятичной
величины игнорируются и отвергаются. Не-цифровой символ, который
завершает величину, также отвергается.

BIN, DEC и HEX может последовать за числом. Обычно принимается столько


цифр, сколько есть на входе. Тем не менее, если за модификатором
следует число, SERIN2 всегда примет это количество цифр, пропустив
незначащие цифры, как необходимо.

SERIN рассчитана на кварц 4MHz при генерации бита синхронизации. Для


того, чтобы обеспечить соответствующую скорость обмена при другой
частоте генератора, обязательно установите соответствующую величину
OSC при помощи DEFINE. Скорость генератора больше 4MHz может
понадобиться для надежной работы на 9600 бод и выше.

Пока общеупотребительны недорогие однокристальные преобразователи


уровня RS-232. Но благодаря текущей реализации RS-232 и отличным I/O
техническим качествам MCU PICmicro, в большинстве случаев такие
преобразователи уровня могут не потребоваться. Можно использовать
прямое соединение при уровнях TTL в инверсном режиме
(Mode: бит14 = 1). Предпочтительно включить в цепь токоограничительный
резистор (хотя RS-232 устойчив к закоротке).
DB9 DB25
22K
Pin ────████──── RS-232 Tx Конт 3 Конт 2
┌───── RS-232 GND Конт 5 Конт 7
PicBasic Pro Compiler - 73 -

─┴─

SERIN2 не поддерживается на 12-битных MCU PICmicro вследствие


ограниченности RAM и стека.

' Ожидать, пока на Pin1 будет принят символ "A" и передать следующий в B0
SERIN2 1,16780,[WAIT("A"),B0]

' Пропустить 2 символа и принять 4 десятичных цифры числа


SERIN2 PORTA.1,84,[SKIP 2,DEC4 B0]

SERIN2 PORTA.1\PORTA.0,84,100,tlabel,[WAIT("x", b0),STR ar]

5.70. SEROUT

SEROUT Pin,Mode,[Item{,Item...}]

Посылает один или более пунктов Item на штырек в стандартном


асинхронном формате: 8 битов данных, без четности и один стоповый бит
(8N1). SEROUT подобен команде Serout в BS1. Штырек автоматически
делается выходом. Pin может быть константой 0-15, или переменной,
содержащей число 0-15 (напр. B0) или имя штырька (напр. PORTA.0).

Имена Mode (напр. T2400) определены в файле MODEDEFS.BAS. Для того,


чтобы использовать их, добавьте строку:

Include "modedefs.bas"

в начале программы PicBasic Pro. BS1DEFS.BAS и BS2DEFS.BAS уже


включают MODEDEFS.BAS. Не включайте его снова, если один из этих
файлов уже включен. Числа Mode могут использоваться и без включения
этого файла.

-----+----+-----+-----------
Mode Mode Бод Состояние
No.
-----+----+-----+-----------
T2400 0 2400
T1200 1 1200 Прямой
T9600 2 9600
T300 3 300
-----+----+-----+-----------
N2400 4 2400
N1200 5 1200 Инверсный
N9600 6 9600
N300 7 300
-----+----+-----+-----------
OT2400 8 2400
OT1200 9 1200 Прямой
OT9600 10 9600 Открытый
OT300 11 300
-----+----+-----+-----------
ON2400 12 2400
ON1200 13 1200 Инверсный
ON9600 14 9600 Открытый
ON300 15 300
-----+----+-----+-----------
* Открытые режимы не поддерживаются
на 12-битных PICmicro MCU.

SEROUT поддерживает три различных типа данных, которые могут свободно


смешиваться и сопоставляться внутри одного оператора SEROUT.
PicBasic Pro Compiler - 74 -

1) Строковая константа - отсылается как литерная строка символов.

2) Числовая величина (переменная или константа) отсылает


соответствующий символ ASCII. Особые: 13 - возврат каретки и 10 -
перевод строки.

3)-Числовая величина, предшествуемая знаком # , пошлет представление


десятичной величины в ASCII. Например, если W0 = 123, затем #W0 (или
#123), то пошлется "1", "2", "3".

SEROUT рассчитана на кварц 4MHz при генерации бита синхронизации. Для


того, чтобы обеспечить соответствующую скорость обмена при другой
частоте генератора, обязательно установите соответствующую величину
OSC при помощи DEFINE.

В некоторых случаях, инструкция SEROUT может выдавать символы слишком


часто для получающего устройства. DEFINE может добавлять символ темпа
для последовательной передачи. Этот символ темпа делает дополнительный
промежуток времени между передаваемыми символами. Символ темпа
обеспечивает задержку вплоть до 65535 мкс между каждым переданным
символом.

Например, для 1 миллисекунды между передачей каждого символа:

DEFINE CHAR_PACING 1000

Пока общеупотребительны недорогие однокристальные преобразователи


уровня RS-232. Но благодаря текущей реализации RS-232 и отличным I/O
техническим качествам MCU PICmicro, в большинстве случаев такие
преобразователи уровня могут не потребоваться. Можно использовать
прямое соединение при уровнях TTL в инверсном режиме (N300..N9600).
Предпочтительно включить в цепь токоограничительный резистор 1К (хотя
RS-232 устойчив к закоротке).
DB9 DB25
1K
Pin ────████──── RS-232 Rx Конт 2 Конт 3

┌───── RS-232 GND Конт 5 Конт 7


─┴─

' последовательно посылает через Pin0 ASCII-величину B0, завершая переводом


строки
SEROUT 0,N2400,[#B0,10]

5.71. SEROUT2

SEROUT2 DataPin{\FlowPin},Mode,{Pace,}{Timeout,Label,}[...]

Посылает один или более пунктов Item, через DataPin в стандартном


асинхронном формате.
SEROUT2 подобен команде Serout в BS2. DataPin автоматически делается
выходом. Необязательный FlowPin автоматически делается входом. DataPin
и FlowPin могут быть константами 0-15, или переменными, содержащими
число 0-15 (напр. B0) или имя штырька (напр. PORTA.0).

Необязательный штырек управления потоком данных FlowPin может быть


задан, чтобы помочь предохранять данные при переполнении приемника.
Если он используется, последовательные данные не будут посылаться до
тех пор, пока FlowPin не установится в соответствующее состояние. Это
состояние определяется полярностью данных, задаваемой в Mode.
PicBasic Pro Compiler - 75 -

Timeout и Label могут быть указаны, чтобы позволить программе


продолжиться если FlowPin не активен в течение заданного времени.
Timeout задается в миллисекундах. Если FlowPin остается не активным в
течение времени Timeout, программа покинет команду SEROUT2 и перейдет
на Label.

В некоторых случаях, инструкция SEROUT2 может выдавать символы слишком


часто для получающего устройства. Если по каким-либо причинам
нежелательно использовать штырек FlowPin для управления потоком
данных, используйте опцию Pace, чтобы вставить паузы между
передаваемыми символами. Они могут составлять от 1 до 65535
миллисекунд между каждым переданным символом.

Mode используется, чтобы определить скорость обмена и, рабочие


параметры последовательной передачи. Младшие 13 битов выбирает
скорость обмена. Бит 13 определяет четность или без четности. Бит 14
выбирает инвертирование или прямую передачу. Бит 15 не используется.

Биты скорости передачи определяют время передачи бита в микросекундах


минус 20. Для того, чтобы найти величину для конкретной скорости
передачи в бодах, используйте формулу:

(1000000/бод)-20

Некоторые стандартные скорости показаны в следующей таблице.

Baud Bits
rate 0..12
------+-------
300 3313
600 1646
1200 813
2400 396
4800 188
9600* 84
19200* 32
------+-------
*Может потребоваться
кварц более 4MHz.

Бит 13 = 1 -проверка на четность, бит 13 = 0 -без проверки. Нормальная


последовательная передача - 8N1 (8 битов данных, без четности, 1
стоповый бит). Если четность выбрана, данные будут получены как 7E1 (7
битов данных, проверка на четность и 1 стоповый бит). Для того,
чтобы получить проверку на нечетность вместо проверки на четность,
поставьте следующее DEFINE в программе:

DEFINE SER2_ODD 1

Бит 14 выбирает активный уровень для штырьков данных и управления


потоком данных. Если бит 14 = 0, данные получаются в истиной форме,
при работе через микросхему-преобразователь уровней RS-232. Если бит
14 = 1, получаемые данные инвертируются. Этот режим может
использоваться для прямого подключения к RS-232, без дополнительных
преобразователей.

Бит 15 управляет режимом штырька: биполярный (бит 15 = 0), или


открытый в одном из состояний (бит 15 = 1). Открытый режим может
использоваться, чтобы подключить несколько устройств совместно на
одной шине.
Некоторые примеры Mode: Mode=84 (9600 бод, без четности, прямой),
PicBasic Pro Compiler - 76 -

Mode=16780 (2400 бод, без четности, инвертирующий), Mode=27889 (300


бод, проверка на четность, инвертирующий). В Приложении A есть еще
примеры Mode.

DEFINE позволяет задать другую битность данных, чем 8 (или 7 с


четностью). Битность данных SER2_BITS может быть в пределах от 4 битов
до 8 (по умолчанию, когда DEFINE отсутствует).
Включение четности возьмет один от заданного количества битов.
Определяя SER2_BITS в 9, позволяем читать и записывать 8 бит, вместе с
9 битом четности.

Без четности (по умолчанию):

DEFINE SER2_BITS 4 ' Установить в 4 бита данных для Serin2 и Serout2


DEFINE SER2_BITS 5 ' Установить в 5 бит данных для Serin2 и Serout2
DEFINE SER2_BITS 6 ' Установить в 6 бит данных для Serin2 и Serout2
DEFINE SER2_BITS 7 ' Установить в 7 бит данных для Serin2 и Serout2
DEFINE SER2_BITS 8 ' Установить в 8 бит данных для Serin2 и Serout2 (по
умолчанию)

С четностью:

DEFINE SER2_BITS 5 ' Установить в 4 бита данных для Serin2 и Serout2


DEFINE SER2_BITS 6 ' Установить в 5 бит данных для Serin2 и Serout2
DEFINE SER2_BITS 7 ' Установить в 6 бит данных для Serin2 и Serout2
DEFINE SER2_BITS 8 ' Установить в 7 бит данных для Serin2 и Serout2
DEFINE SER2_BITS 9 ' Установить в 8 бит данных для Serin2 и Serout2

SEROUT2 поддерживает многие другие модификаторы данных, которые могут


свободно смешиваться и сопоставляться внутри одного оператора SEROUT2,
чтобы обеспечить различные форматы выхода.

Модификатор Операция
-----------------+-------------------------------------
{I}{S}BIN{1..16} Посылает двоичные цифры
{I}{S}DEC{1..5} Посылает десятичные цифры
{I}{S}HEX{1..4} Посылает шестнадцатеричные цифры
REP c\n Посылает символ c повторенный n раз
STR ArrayVar{\n} Посылает строку n символов
-----------------+-------------------------------------

1) Строковая константа посылается как литерная строка символов.

2) Числовая величина (переменная или константа) отсылает


соответствующий символ ASCII. Особые: 13 - возврат каретки и 10 -
перевод строки.

3) Числовая величина, предшествуемая BIN пошлет написание в ASCII ее


двоичной величины. Например, если B0 = 8, затем BIN B0 (или BIN 8)
будет отослано "1000".

4) Числовая величина, предшествуемая DEC пошлет написание в ASCII ее


десятичной величины. Например, если B0 = 123, затем DEC B0 (или DEC
123) будет отослано "123".

5) Числовая величина, предшествуемая HEX пошлет написание в ASCII его


шестнадцатеричной величины. Например, если B0 = 254, затем HEX B0 (или
HEX 254) будет отослано "FE".

6) REP с последующим символом и количеством, повторит символ заданное


число раз. Например, REP "0"\4 пошлет "0000".
PicBasic Pro Compiler - 77 -

7) STR с последующей переменной байтового массива и (необязательным)


количеством, пошлет строку символов. Длина строки задана количеством,
или заканчивается, когда символ с кодом 0 встречается в строке.

BIN, DEC и HEX могут предшествоваться или сопровождаться различными


дополнительными параметрами. Если любое из них предшествуется I
(индицировать), выход будет также предшествоваться "%", "#" или "$",
индицирующими тип передаваемых данных.

Если предшествуется S (знак), посылаемые данные будут преобразованы в


формат со знаком, и добавлен предшествующий "-", если старший бит
установлен. Это позволяет передавать отрицательные числа. Имейте в
виду, что вся математика и сравнения в PBP - беззнаковые. Тем не
менее, беззнаковая математика может давать результаты со знаком.
Например, возьмем случай B0 = 9 - 10. Результат DEC B0 будет "255".
Посылка SDEC B0 даст "-1", поскольку старший бит установлен. Так с
небольшой хитростью, беззнаковая математика PBP может дать результаты
со знаком.

BIN, DEC и HEX могут также дополняться числом. Обычно, эти


модификаторы отображают ровно столько цифр, как необходимо; нуль
бланкируется (начальные нули не посылаются). А если модификатор
дополняется числом, то оно означает количество разрядов, которые
SEROUT2 должен отсылать. Если передаваемая величина короче -
дополняется начальными нулями, если длиннее - старшие цифры будут
усечены. Например, BIN6 8 пошлет "001000", а BIN2 8 пошлет "00".
Любые или все комбинации модификатора могут использоваться сразу.
Например, ISDEC4 B0.

SEROUT2 рассчитана на кварц 4MHz при генерации бита синхронизации. Для


того, чтобы обеспечить соответствующую скорость обмена при другой
частоте генератора, обязательно установите соответствующую величину
OSC при помощи DEFINE. Скорость генератора больше 4MHz может
понадобиться для надежной работы на 9600 бод и выше.

Пока общеупотребительны недорогие однокристальные преобразователи


уровня RS-232. Но благодаря текущей реализации RS-232 и отличным I/O
техническим качествам MCU PICmicro, в большинстве случаев такие
преобразователи уровня могут не потребоваться. Можно использовать
прямое соединение при уровнях TTL в инверсном режиме (Mode:
бит 14 = 1). Предпочтительно включить в цепь токоограничительный
резистор величиной 1К (хотя RS-232 устойчив к закоротке).

DB9 DB25
1K
Pin ────████──── RS-232 Rx Конт 2 Конт 3

┌───── RS-232 GND Конт 5 Конт 7


─┴─

SEROUT2 не поддерживается на 12-битных PICmicro MCU вследствие


ограниченности RAM и стека.

' Послать через Pin0 десятичную величину B0 в ASCII, с переводом строки,


2400 бод
SEROUT2 0,16780,[DEC B0,10]

' Через PORTA pin 1 послать "B0 =" и HEX-величину B0, 9600 бод
SEROUT2 PORTA.1,84,["B0=", IHEX4 B0]
PicBasic Pro Compiler - 78 -

5.72. SHIFTIN

SHIFTIN DataPin,ClockPin,Mode,[Var{\Bits}...]

Принимает синхронные биты через DataPin, тактируемые через ClockPin и


загружает полученные данные в Var. ClockPin и DataPin могут быть
константами 0-15, или переменными, содержащими число 0-15 (напр. B0)
или имя штырька (напр. PORTA.0).

Необязательный \Bits определяет количество битов, которое нужно


принять. Если не определено, принимаются 8 битов, независимо от типа
переменной. Принимаемые биты в процессе не инвертируются, независимо
от используемого Mode: LSB или MSB.

Имена Mode (напр. MSBPRE) определены в файле MODEDEFS.BAS. Для того,


чтобы использовать их, добавьте строку:

Include "modedefs.bas"

в начале программы PicBasic Pro. BS1DEFS.BAS и BS2DEFS.BAS уже


включают MODEDEFS.BAS. Не включайте его снова, если один из этих
файлов уже включен. Числа Mode могут использоваться и без включения
этого файла. Некоторые Режимы не имеют имени.

Для Mode 0-3 тактирование осуществляется переключением с низкого


уровня на высокий во время бита, и возврат на низкий (прямой
синхроимпульс), а для Mode 4-7 - с высокого на низкий и обратно:
инверсный синхроимпульс.

------+----+----------------------------------------------------------------
Mode Mode Операция
No
------+----+----------------------------------------------------------------
MSBPRE 0 Чтение по фронту прямого синхроимпульса, начиная со старшего
бита
LSBPRE 1 Чтение по фронту прямого синхроимпульса, начиная с младшего бита
MSBPOST 2 Чтение по спаду прямого синхроимпульса, начиная со старшего бита
LSBPOST 3 Чтение по спаду прямого синхроимпульса, начиная с младшего бита
4 Чтение по фронту инверсного синхроимпульса, начиная со старшего
бита
5 Чтение по фронту инверсного синхроимпульса, начиная с младшего
бита
6 Чтение по спаду инверсного синхроимпульса, начиная со старшего
бита
7 Чтение по спаду инверсного синхроимпульса, начиная с младшего
бита
------+----+----------------------------------------------------------------

Частота синхроимпульсов - около 50kHz, зависит от генератора. Активное


состояние держится минимум 2 микросекунды. DEFINE позволяет активное
состояние синхроимпульса вплоть до 65535 мкс (65.535 миллисекунды),
чтобы замедлить тактовую частоту. Минимальная дополнительная задержка
определяется PAUSEUS (см ее описание). Смотри его секцию для минимума
для любого данного генератора. Это DEFINE не поддерживается на
12-битных MCU PICmicro.

Например, чтобы замедлить такты на 100 микросекунд:

DEFINE SHIFT_PAUSEUS 100


PicBasic Pro Compiler - 79 -

Следующая диаграмма показывает отношение снхросигнала и данных для


различных режимов:

PRE POST
: :
: :
┌──┐ ┌──┐ ┌──┐ ┌──┐ ┌──┐ ┌──┐ ┌──┐ ┌──┐
Прямые │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
──────┘ └───┘ └───┘ └───┘ └───┘ └───┘ └───┘ └───┘ └──────
такты : :
──────┐ ┌───┐ ┌───┐ ┌───┐ ┌───┐ ┌───┐ ┌───┐ ┌───┐ ┌──────
Инверсн │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
└──┘ └──┘ └──┘ └──┘ └──┘ └──┘ └──┘ └──┘
: :
LSB : :
──── ────── ────── ────── ────── ────── ────── ────── ────── ────
│ bit0 │ bit1 │ bit2 │ bit3 │ bit4 │ bit5 │ bit6 │ bit7 │
──── ────── ────── ────── ────── ────── ────── ────── ────── ────
данные : :
──── ────── ────── ────── ────── ────── ────── ────── ────── ────
│ bit7 │ bit6 │ bit5 │ bit4 │ bit3 │ bit2 │ bit1 │ bit0 │
──── ────── ────── ────── ────── ────── ────── ────── ────── ────
MSB : :
: :

SHIFTIN 0,1,MSBPRE,[B0,B1\4]

5.73. SHIFTOUT

SHIFTOUT DataPin,ClockPin,Mode,[Var{\Bits}...]

Передает синхронные биты из Var через DataPin, тактируя через


ClockPin. ClockPin и DataPin могут быть константами 0-15, или
переменными, содержащими число 0-15 (напр. B0) или имя штырька (напр.
PORTA.0).

Необязательный \Bits определяет количество битов, которое нужно


передать. Если не определено, передаются 8 битов, независимо от типа
переменной. Передаваемые биты в процессе не инвертируются, независимо
от используемого Mode: LSB или MSB. От одной переменной можно передать
до 16 бит. Если требуется больше, между квадратными скобками следует
поставить несколько переменных.

Имена Mode (напр. LSBFIRST) определены в файле MODEDEFS.BAS. Для того,


чтобы использовать их, добавьте строку:

Include "modedefs.bas"

в начале программы PicBasic Pro. BS1DEFS.BAS и BS2DEFS.BAS уже


включают MODEDEFS.BAS. Не включайте его снова, если один из этих
файлов уже включен. Числа Mode могут использоваться и без включения
этого файла. Некоторые Режимы не имеют имени.

Для Mode 0,1, тактирование осуществляется переключением с низкого


уровня на высокий во время бита, и возврат на низкий (прямой
синхроимпульс), а для Mode 4,5, - с высокого на низкий и обратно:
инверсный синхроимпульс.
PicBasic Pro Compiler - 80 -

--------+----+----------------------------------------------------------
Mode Mode Операция
No
--------+----+----------------------------------------------------------
LSBFIRST 0 Передача начиная с младшего бита, прямой синхроимпульс
MSBFIRST 1 Передача начиная со старшего бита, прямой синхроимпульс
4 Передача начиная с младшего бита, инверсный синхроимпульс
5 Передача начиная со старшего бита, инверсный синхроимпульс
--------+----+----------------------------------------------------------

Частота синхроимпульсов - около 50kHz, зависит от генератора. Активное


состояние держится минимум 2 микросекунды. DEFINE позволяет активное
состояние синхроимпульса вплоть до 65535 мкс (65.535 миллисекунды),
чтобы замедлить тактовую частоту. Минимальная дополнительная задержка
определяется PAUSEUS (см ее описание). Смотри его секцию для минимума
для любого данного генератора. Это DEFINE не поддерживается на
12-битных MCU PICmicro.

Например, чтобы замедлить такты на 100 микросекунд:

DEFINE SHIFT_PAUSEUS 100

Следующая диаграмма показывает соотношение синхросигнала и данных для


различных режимов:

PRE POST
: :
: :
┌──┐ ┌──┐ ┌──┐ ┌──┐ ┌──┐ ┌──┐ ┌──┐ ┌──┐
Прямые │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
──────┘ └───┘ └───┘ └───┘ └───┘ └───┘ └───┘ └───┘ └──────
такты : :
──────┐ ┌───┐ ┌───┐ ┌───┐ ┌───┐ ┌───┐ ┌───┐ ┌───┐ ┌──────
Инверсн │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
└──┘ └──┘ └──┘ └──┘ └──┘ └──┘ └──┘ └──┘
: :
LSB : :
──── ────── ────── ────── ────── ────── ────── ────── ────── ────
│ bit0 │ bit1 │ bit2 │ bit3 │ bit4 │ bit5 │ bit6 │ bit7 │
──── ────── ────── ────── ────── ────── ────── ────── ────── ────
данные : :
──── ────── ────── ────── ────── ────── ────── ────── ────── ────
│ bit7 │ bit6 │ bit5 │ bit4 │ bit3 │ bit2 │ bit1 │ bit0 │
──── ────── ────── ────── ────── ────── ────── ────── ────── ────
MSB : :
: :

SHIFTOUT 0,1,MSBFIRST,[B0,B1]
SHIFTOUT PORTA.1,PORTA.2,1,[wordvar\4]
SHIFTOUT PORTC.1,PORTB.1,4,[$1234\16, $56]

5.74. SLEEP

SLEEP Period

Переводит микроконтроллер в режим низкого энергопотребления на Period


секунд. Period - 16 бит, так что задержка может достигать 65535 секунд
(около 18 часов).

SLEEP использует Сторожевой Таймер, независимый от частоты кварца.


PicBasic Pro Compiler - 81 -

Степень дискретизации - около 2.3 секунды, и может изменяться в


зависимости от экземпляра и температуры. Здесь есть отличие от BASIC
Stamp. Изменение требовалось, поскольку когда PICmicro MCU выполняет
сброс Сторожевого Таймера, он восстанавливает многие внутренние
регистры в предопределенные величины. Эти величины могут существенно
отличиться от того, как ожидалось бы из вашей программы. Мы обошли
это, оставив команду SLEEP некалиброванной.

SLEEP 60 ' Ожидать 1 минуту

5.75. SOUND

SOUND Pin,[Note,Duration{,Note,Duration...}]

Генерирует тон и/или белый шум на определенном штырьке. Штырек


автоматически становится выходом. Pin может быть константой 0-15, или
переменной, содержащей число 0-15 (напр. B0) или имя штырька (напр.
PORTA.0).

Note = 0 - тишина. Note= 1..127 - тоны. Note= 128..255 - белый шум.


Тоны и белые шумы - в возрастающем порядке (т.е. 1 и 128 - самые
низкие частоты, 127 и 255 - самые высокие). Note=1: 78.74Hz и
Note=127: 10,000Hz.
Прим. перев. В технике шум называется "белым", когда он равномерно
распределен по всему диапазону, не имея какой-либо определенной
преимущественной частоты. Поэтому непонятно, что имели ввиду авторы,
говоря о "частотах белого шума".

Duration - 0-255: определяет сколько миллисекунд играется Note (в


12-миллисекундных приращениях). Note и Duration не должны быть
константами.

SOUND выводит прямоугольные колебания TTL-уровня. Благодаря отличной


I/O характеристике MCU PICmicro, через конденсатор к штырьку можно
подключать динамик. Величина конденсатора должна зависеть от
интересующей частоты и характеристик динамика. Пьезо-капсюли могут
подключаться непосредственно.

+ /│
Pin ────┤├─────█ │
┌─█ │
10 мкФ │ \│

─┴─

SOUND PORTB.7,[100,10,50,10] ' Выведет 2 звука поочередно на Pin7

5.76. STOP

STOP

Останавливает выполнение программы, входя в бесконечный цикл. Это не


устанавливает микроконтроллер в режим низкого энергопотребления.
Микроконтроллер продолжит работать как всегда. Просто программа не
пойдет дальше.

STOP ' Программа остановлена на своем пути.


PicBasic Pro Compiler - 82 -

5.77. SWAP

SWAP Variable,Variable

Обменивает значения между двумя переменными. Обычно, это скучный


процесс, чтобы обменять величины 2 переменных. SWAP делает это в одном
операторе без использования каких-либо промежуточных переменных. Может
использоваться с битовыми, байтовыми и word-переменными. Массивы
переменных с переменным индексом не могут использоваться в SWAP, хотя
массивы с постоянным индексом позволены.

temp = B0 ' Старый способ


B0 = B1
B1 = temp

SWAP B0,B1 ' Новый способ

5.78. TOGGLE

TOGGLE Pin

Инвертирует уровень на указанном штырьке. Штырек автоматически


становится выходом. Pin может быть константой 0-15, или переменной,
содержащей число 0-15 (напр. B0) или имя штырька (напр. PORTA.0).

Low 0 ' Начнем с низкого уровня на Pin0


TOGGLE 0 ' Меняем уровень на Pin0 на высокий

5.79. USBIN

USBIN Endpoint,Buffer,Countvar,Label

Принимает любые доступные данные USB для Endpoint и помещает их в


Buffer. Buffer должен быть байтовым массивом достаточной длины, чтобы
содержать данные. Countvar будет содержать количество байтов
переданное в Buffer. Если нет доступных данных, будет переход на метку
Label.

Эта инструкция может использоваться только с MCU PICmicro, имеющими


встроенный USB-порт, как например PIC16C745 и PIC16C765.

Подкаталог USB содержит модифицируемые Microchip USB библиотеки, а


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

USB связь гораздо сложнее чем синхронная (SHIFTIN и SHIFTOUT) и


асинхронная (SERIN, SEROUT и т. п.) связь. Есть гораздо большее о USB,
чем возможно описать здесь. Следует изучить информацию об USB с сайта
Microchip. Также, книга "USB Complete" от Jan Axelson может быть
полезна.

USBIN 1, buffer, cnt, idleloop


PicBasic Pro Compiler - 83 -

5.80. USBINIT

USBINIT

USBINIT должна быть одной из первых команд в программе, которая


использует USB связь. Она проинициализирует USB-часть PICmicro MCU и
дождется, пока USB шина сконфигурируется и включится.

Эта инструкция может использоваться только с MCU PICmicro, имеющими


встроенный USB-порт, как например PIC16C745 и PIC16C765.

Подкаталог USB содержит модифицируемые Microchip USB библиотеки, а


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

USB связь гораздо сложнее чем синхронная (SHIFTIN и SHIFTOUT) и


асинхронная (SERIN, SEROUT и т. п.) связь. Есть гораздо большее о USB,
чем возможно описать здесь. Следует изучить информацию об USB с сайта
Microchip. Также, книга "USB Complete" от Jan Axelson может быть
полезна.

USBINIT

5.81. USBOUT

USBOUT Endpoint,Buffer,Count,Label

Берет количество Count байтов из массива переменных Buffer, и посылает


их в Endpoint USB. Если буфер USB не свободен из-за "зависшей"
передачи, никакие данные не будут переданы и выполнение программы
продолжится с метки Label.

Эта инструкция может использоваться только с MCU PICmicro, имеющими


встроенный USB-порт, как например PIC16C745 и PIC16C765.

Подкаталог USB содержит модифицируемые Microchip USB библиотеки, а


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

USB связь гораздо сложнее чем синхронная (SHIFTIN и SHIFTOUT) и


асинхронная (SERIN, SEROUT и т. п.) связь. Есть гораздо большее о USB,
чем возможно описать здесь. Следует изучить информацию об USB с сайта
Microchip. Также, книга "USB Complete" от Jan Axelson может быть
полезна.

USBOUT 1, buffer,4,outloop

5.82. WHILE..WEND

WHILE Condition
Statement...
WEND
PicBasic Pro Compiler - 84 -

Многократно выполняет операторы Statement, пока условие Condition -


истинно. Как только Condition перестало быть истинным, выполнение
продолжается с команды, следующей за WEND. Condition может быть любым
выражением сравнения.

i = 1
WHILE i <= 10
Serout 0,N2400,["No:",#i,13,10]
i = i + 1
WEND

5.83. WRITE

WRITE Address,Value

Записывает байт Value во встроенное EEPROM по указанному адресу.


Эта инструкция может использоваться только с MCU PICmicro, которые
имеют встроенное EEPROM данных, как, например, PIC16F84, 16C84 и
16F87x серия.

WRITE используется, чтобы записывать данные во встроенное EEPROM во


время выполнения программы. Чтобы записать величины во встроенное
EEPROM во время программирования микроконтроллера, используйте команду
DATA или EEPROM.

Каждая WRITE - самосинхронизирующаяся и требует около 10 миллисекунд,


чтобы выполниться на PICmicro MCU.

Если прерывания используются в программе, они должны быть выключены


(маскированием, а не командой DISABLE) перед выполнением WRITE, и
включены снова (если надо) после того, как инструкция WRITE завершена.
Если прерывание появится в течение записи, она может быть повреждена.

WRITE не окажет влияние на устройства со встроенной EEPROM с


интерфейсом I2C, подобно PIC12CE67x и 16CE62x части. Используйте
взамен инструкцию I2CWRITE.

WRITE 5,B0 ' Записывает величину B0 в EEPROM по адресу 5

Чтобы записать слово, каждый из двух байтов, которые создают слово,


надо записывать поочередно:

w Var Word
WRITE 0,w.BYTE0
WRITE 1,w.BYTE1

5.84. WRITECODE

WRITECODE Address,Value

Записывает Value в область кода по адресу Address.

Некоторые PIC16Fxxx и PIC18Fxxx устройства позволяют записывать код


программы во время ее выполнения. В то время как запись
самомодифицирующегося кода может быть опасной методикой, это позволяет
долговременное хранение данных сверх 64 - 256 байтов. Нужно быть очень
осторожным, чтобы при этом не записать данные по активной программе.

Надо посмотреть файл листинга, чтобы определить, каковы программные


адреса.
PicBasic Pro Compiler - 85 -

Для устройств PIC16Fxxx, данные 14-битные, могут быть записаны в word


Адресах области кода.

Для PIC18Fxxx устройств, байтовые данные или размера word, могут быть
записаны в байтовых Адресах области кода между 0 и 65535.

Для устройств блочного доступа, подобно PIC16F877a и 18F452, должен


быть записан сразу полный блок. Размер этого блока записи свой для
конкретного MCU PICmicro. См описание на конкретное устройство.

В добавок, некоторые PICmicro MCU имеющие flash-память, подобно


PIC18Fxxx серии, требуют стирать нужную часть кодового пространства,
прежде, чем она сможет быть вновь записана WRITECODE. См раздел о
ERASECODE для большей информации.

Если прерывания используются в программе, они должны быть выключены


(маскированием, а не командой DISABLE) перед выполнением WRITECODE, и
включены снова (если надо) после того, как инструкция WRITECODE
завершена. Если прерывание появится в течение записи, она может быть
повреждена.

Чтобы с помощью WRITECODE можно было записывать flash-память, запись в


нее должна быть разрешена в конфигурации программатора, когда
микросхема программировалась.

WRITECODE $100,w ' Посылает значение W, в позицию $100 области кода.

5.85. XIN

XIN DataPin,ZeroPin,{Timeout,Label,}[Var{,...}]

Принимает данные X-10 и загружает House Code и Key Code в Var.

XIN используется, чтобы получить информацию с X-10 устройств, которые


могут посылать такую информацию. X-10 модули доступны из широкого
ряда источников под различными торговыми марками. При этом интерфейсе
требуется соединять микроконтроллер через провода питания переменного
тока. Для дуплексной X-10 связи с XIN, требуется TW-523. Это
устройство содержит интерфейс силовой сети и изолирует микроконтроллер
от фаз переменного тока. Поскольку X10 формат является
запатентованным, этот интерфейс также покрывает лицензионные гонорары.

DataPin автоматически становится входом, чтобы получить данные с X-10


интерфейса. ZeroPin автоматически становится входом для получения
перехода через нуль, синхронизирующего X-10 интерфейс. Оба штырька
должны быть соединены с +5 вольт через резистор 4.7K. DataPin и
ZeroPin могут быть константами 0-15, или переменными, содержащими
число 0-15 (напр. B0) или имя штырька (напр. PORTA.0).

Необязательные Timeout и метка Label могут быть включены, чтобы


позволить программе продолжиться если X-10 данные не получаются в
течение определенного времени. Timeout определяется полупериодом
сетевого напряжения в силовой сети (приблизительно 8.33 миллисекунды
(у них частота сети 60 герц. прим.перев.)).

XIN обрабатывает данные при каждом переходе через нуль силовой фазы,
как регистрируется на ZeroPin. Если не отмечается переходов на этой
линии, XIN будет продолжать бесконечно ожидать.

Если Var - размером word, каждый полученный House Code загружается в


PicBasic Pro Compiler - 86 -

старший байт слова. Каждый полученный Key Code загружается в младший


байт слова. Если Var - байтовая, загружается только Key Code.

House Code - число между 0 и 15 это соответствует House Code,


установленному в X-10 модуле A через P.

Key Code может быть или числом специфического модуля X-10 или
функцией, которая должна выполняться модулем. В нормальной практике,
сначала посылается команда, определяющая число модуля X-10, затем
следует команда, определяющая желаемую функцию. Некоторые функции
оперируют во всех модулях сразу, в таком случае число модуля
необязательно. Надеемся, последующие примеры разъяснят эти вещи. Числа
Key Code 0-15 соответствуют числам модуля 1-16.

Эти числа Key Code - отличаются от фактических чисел посланных и


полученных X10 модулями. Это различие введено, чтобы обеспечить
совместимость Key Code с BS2. Для того, чтобы убрать такое
перекодирование для Stamp, воспользуйтесь следующим DEFINE:

DEFINE XINXLAT_OFF 1

XIN не поддерживается на 12-битных PICmicro MCU вследствие


ограниченности RAM и стека.

XOUT (см ниже) описывается функции и подключение.

housekey Var Word


' Получить X-10 данные
loop: XIN PORTA.2,PORTA.0,[housekey]

' Показать X-10 data на LCD


Lcdout $fe,1,"House=",#housekey.byte1,
"Key=",#housekey.byte0
Goto loop ' постоянно делать опять.

' Проверить наличие данных X-10, если нету, перейти на nodata


XIN PORTA.2,PORTA.0,1,nodata,[housekey]

5.86. XOUT

XOUT DataPin,ZeroPin,[HouseCode\KeyCode{\Repeat}{,...}]

Посылает в X10 формате: HouseCode, затем KeyCode, повторяя Repeat раз.


Если Repeat не указано, то 2 раза (минимум). Повторение обычно
резервируется для использования с командами Bright и Dim.

XOUT используется, чтобы послать управляющую информацию в X-10 модули.


Эти модули - доступны из широкого ряда источников под различными
торговыми марками. При этом интерфейсе требуется соединять
микроконтроллер через провода питания переменного тока. Для
дуплексной X-10 связи требуется TW-523, а если на отсылку только - то
PL-513. Эти устройства содержит интерфейс силовой сети и изолирует
микроконтроллер от фаз переменного тока. Поскольку X10 формат является
запатентованным, этот интерфейс также покрывает лицензионные гонорары.

DataPin автоматически становится выходом, чтобы посылать данные на


X-10 интерфейс. ZeroPin автоматически становится входом для получения
перехода через нуль, синхронизирующего X-10 интерфейс. Оба штырька
должны быть соединены с +5 вольт через резистор 4.7K. DataPin и
ZeroPin могут быть константами 0-15, или переменными, содержащими
число 0-15 (напр. B0) или имя штырька (напр. PORTA.0).
PicBasic Pro Compiler - 87 -

XOUT обрабатывает данные при каждом переходе через нуль силовой фазы,
как регистрируется на ZeroPin. Если не отмечается переходов на этой
линии, XOUT будет продолжать бесконечно ожидать.

House Code - число между 0 и 15 это соответствует House Code,


установленному в X-10 модуле A через P.

Key Code может быть или числом специфического модуля X-10 или
функцией, которая должна выполняться модулем. В нормальной практике,
сначала посылается команда, определяющая число модуля X-10, затем
следует команда, определяющая желаемую функцию. Некоторые функции
оперируют во всех модулях сразу, в таком случае число модуля
необязательно. Надеемся, последующие примеры разъяснят эти вещи. Числа
Key Code 0-15 соответствуют числам модуля 1-16.

KeyCode (function) имена (напр. unitOn) определены в файле


MODEDEFS.BAS. Для того, чтобы использовать их, добавьте строку:

Include "modedefs.bas"

в начале программы PicBasic Pro. BS1DEFS.BAS и BS2DEFS.BAS уже


включают MODEDEFS.BAS. Не включайте его снова, если один из этих
файлов уже включен. Числа KeyCode могут использоваться и без включения
этого файла.

KeyCode KeyCode No. Операция


-----------------------------------------------------
unitOn %10010 Включить модуль
unitOff %11010 Отключить модуль
unitsOff %11100 Отключить все модули
lightsOn %10100 Включить все зажженные модули
lightsOff %10000 Отключить все зажженные модули
bright %10110 Зажженный модуль - ярче
dim %11110 Зажженный модуль - затемнить
-----------------------------------------------------

Эти числа Key Code - отличаются от фактических чисел посланных и


полученных X10 модулями. Это различие введено, чтобы обеспечить
совместимость Key Code с BS2. Для того, чтобы убрать такое
перекодирование для Stamp, воспользуйтесь следующим DEFINE:

DEFINE XOUTXLAT_OFF 1

XOUT не поддерживается на 12-битных PICmicro MCU вследствие


ограниченности RAM и стека.

Подключение интерфейса X-10 требует 4 соединения. Выход с интерфейса


X10 (переход через нуль и данные приемника) - с открытым коллектором и
требует подключения нагрузочных резисторов около 4.7K до линии +5
вольт. Разводка для каждого интерфейса показана в таблице ниже:

PL-513

номер цвет назначение


-----+------+------------------------
1 черн контр. перех. 0, выход
2 красн контр. перех. 0, общий
3 зел передатчик X-10, общий
4 желт передатчик X-10, вход
-----+------+------------------------
PicBasic Pro Compiler - 88 -

TW-523

номер цвет назначение


-----+------+------------------------
1 черн контр. перех. 0, выход
2 красн общий
3 зел приемник X-10, выход
4 желт передатчик X-10, вход
-----+------+------------------------

house Var Byte


unit Var Byte

Include "modedefs.bas"

house = 0 ' Установить дом на 0 (A)


unit = 8 ' Установить устройство на 8 (9)

' Включить устройство 8 в доме 0


XOUT PORTA.1,PORTA.0,[house\unit,house\unitOn]

' Отключить все засвеченные в доме 0


XOUT PORTA.1,PORTA.0,[house\lightsOff]

' Моргать засвеченные 0 вкл и откл каждые 10 сек


XOUT PORTA.1,PORTA.0,[house\0]

loop: XOUT PORTA.1,PORTA.0,[house\unitOn]


Pause 10000 ' Ожидать 10 сек

XOUT PORTA.1,PORTA.0,[house\unitOff]
Pause 10000 ' Ожидать 10 сек

Goto loop

6. Структура Cтранслированной Программы

PBP разрабатывался, чтобы быть легким в использовании. Программы могут


быть оттранслированы и выполнены без особенного вникания во внутренние
процессы PBP. Некоторые люди, тем не менее, тогда имеют доверие к
продукту, когда они понимают его внутреннюю работу. Другие - просто
интересуются.

Этот раздел описывает файлы используемые и генерируемые PBP на выходе,


и дает некоторое представление как и что идет.

6.1. Файлы, связанные с моделями микроконтроллеров.

Используются три типа таких файлов, предназначенных к использованию с


каждой моделью микроконтроллера. Эти файлы называются заголовочными.
Один используется PBP, два других включены для использования
ассемблером.

Файл с именем микроконтроллера и расширением .BAS содержит


специфическую информацию о микросхеме, необходимую PBP. Это включает
профиль памяти чипа, какую библиотеку он использует, и включения
определения ему нужных переменных. Для PIC16F84, микроконтроллера по
умолчанию, файл назван 16F84.BAS.
PicBasic Pro Compiler - 89 -

Файл с именем микроконтроллера сопровождающегося расширением .INC


включается в сгенерированный файл .ASM, чтобы дать ассемблеру
информацию о чипе, включая встроенные параметры конфигурации (режим
генератора, установка Сторожевого Таймера, и т.п.). Для PIC16F84,
например, файл назван 16F84.INC.

Наконец, ассемблер имеет свои собственные включаемые файлы, которые


определяют адреса регистров микроконтроллера. Эти файлы обычно
называются нечто вроде M16F8x.INC и находятся в подкаталоге INC.

6.2. Библиотечные Файлы

PBP включают комплект библиотечных файлов, который содержит весь код и


файлы определения для конкретной группы микроконтроллеров. например, в
случае 14-битных микроконтроллеров PICmicro, эти файлы начинаются с
имени PBPPIC14.

PBPPIC14.LIB содержит все подпрограммы ассемблера, используемые


компилятором. PBPPIC14.MAC содержит все макросы, которые вызывают эти
подпрограммы. Большинство команд PicBasic Pro состоят из макрокоманд
и, обычно, связанной библиотечной подпрограммы.

PBPPIC14.RAM содержит операторы VAR, которые распределяют память


необходимую библиотеке.

PIC14EXT.BAS содержит внешние определения, которые сообщают PBP все


имена регистров 14-битных MCU.

6.3. Как PBP генерирует код

PicBasic Pro компилирует программу в несколько встроенных стадий.


Сначала PBP создает .ASM файл. Затем формирует заказной .MAC файл,
который содержит только макросы из макробиблиотеки, которые
используются в .ASM файле. Если все - свободно от ошибок вплоть до
этого места, он запускает ассемблер.

Ассемблер генерирует свой собственный комплект файлов. Сюда относится


конечный выходной .HEX-файл и, возможно, листинг и отладочные файлы.

6.4. Структура файла .ASM

.ASM-файл имеет очень специфическую структуру. Вещи должны быть


сделаны в определенном порядке, чтобы работать правильно.

Первый пункт установленный в файл - приравнивание, определяющее какой


ассемблер должен использоваться, затем INCLUDE, чтобы сообщить
ассемблеру, для какого микропроцессора предназначается код. Дальше -
все переменные распределяются и поименовываются в листинге. Затем
инициализация EEPROM, если есть обращения к ней.

После этого располагаются INCLUDE макро-файлов и INCLUDE для


библиотечных подпрограмм.

Наконец, фактический программный код. Этот программный код - просто


список макросов, который сгенерирован из строк программы PicBasic Pro.

7. Остальные Соображения PicBasic Pro

7.1. Какая быстрота достаточна?


По умолчанию, PicBasic Pro Compiler генерирует программы для
микроконтроллера с кварцем или керамическим резонатором на 4MHz. Все
PicBasic Pro Compiler - 90 -

время-чувствительные инструкции принимают параметры в единицах


микросекунд. Это позволяет, например, PAUSE 1000 - задержка 1 секунда
и SERIN и SEROUT дают точные скорости в бодах.
Прим. перев.: В этом абзаце в оригинале стоит явно: микросекунды. Но
из расчета следует, что PAUSE 1000 = 1 сек -речь идет о
миллисекундах. Возможно, описка авторов.

Есть моменты, тем не менее, когда было бы полезно, чтобы запустить


PICmicro MCU на другой частоте. Даже если оттранслированные
программы движутся в хорошем темпе, могло бы быть неплохо выполнить их
еще более быстро. Или, может быть, требуется делать последовательный
обмен на 19200 бод или выше.

PicBasic Pro программы могут быть выполнены на других частотах парой


других путей. Первый - чтобы просто использовать кварц иной, чем 4MHz
и не сообщать PBP. Это может быть полезной техникой, если Вы учтете
самостоятельно, что случится с инструкциями, связанными со временем.

Если Вы хотите запустить последовательную шину на 19200, как


говорилось выше, Вы будете просто тактировать микроконтроллер кварцем
8MHz, а не 4MHz. Это, в результате, ускорит все выполнения вдвое,
включая SERIN и SEROUT команды. Если Вы сообщаете SERIN или SEROUT,
чтобы выполнить в 9600 бод, удвоение скорости кварца удвоит
фактическую скорость обмена до 19200 бод.

Тем не менее, имейте в виду, что команды как например, PAUSE и SOUND
также выполнятся вдвое быстрее. PAUSE 1000, упомянутая выше, будет
только 0.5 секунды с 8MHz кварцем.

Предпочтительная техника - чтобы использовать другую частоту


генератора и сообщать об этом PBP. Это делается с помощью DEFINE.
DEFINE, как продемонстрировано в команде LCDOUT в предшествующем
разделе, используется, чтобы сообщить PBP использовать нечто, кроме
его умолчаний.

Нормально PBP по умолчанию использует генератор 4MHz. Дополнительный


оператор:

DEFINE OSC 8

в начале PicBasic Pro программы сообщит PBP, что 8MHz генератор будет
использоваться взамен. Определение приемлемого генератора:

-------+----------
миним.
OSC задержка
-------+----------
3(3.58) 20us
4 24us
8 12us
10 8us
12 7us
16 5us
20 3us
24 3us
25* 2us
32* 2us
33* 2us
40** 2us
-------+----------
* PIC17Cxxx и
PIC18Xxxx только.
PicBasic Pro Compiler - 91 -

** PIC18Xxxx только.

Сообщение для PBP частоты генератора позволяет это компенсировать и


продуцировать правильную синхронизацию для COUNT, DEBUG, DEBUGIN,
DTMFOUT, FREQOUT, HPWM, HSERIN, HSEROUT, I2CREAD, I2CWRITE, LCDOUT,
OWIN, OWOUT, PAUSE, PAUSEUS,SERIN, SERIN2, SEROUT, SEROUT2, SHIFTIN,
SHIFTOUT, SOUND, XIN и XOUT.

Изменение частоты генератора может также использоваться, чтобы


увеличить разрешение PULSIN, PULSOUT и RCTIME инструкций. В 4MHz эти
инструкции работают с разрешением 10 микросекунд. Если 20MHz кварц
используется, разрешение возрастает в 5 раз, до 2 микросекунд. Но
палка о двух концах: ширина импульса все еще измеряется в 16-битной
переменной размера word. С разрешением 2 микросекунды, максимальная
ширина измеряемого импульса сократится до 131070 микросекунд.

Движение в другом направлении и запуск с кварцем 32.768kHz


проблематичен. Он может быть желательным, чтобы попытаться сократить
потребляемую мощность. И, хотя это и будет работать в известной мере,
но SERIN и SEROUT команды станут непригодными, а Сторожевой Таймер
может не успевать очищаться, и, в результате, периодически сбрасывать
микроконтроллер. Определите экспериментально, возможно ли ваше
конкретное приложение с этой скоростью генератора; это не приведет к
повреждениям.

7.2. Установки Конфигурации

Как упомянуто раньше, установочные параметры конфигурации по умолчанию


для конкретного устройства устанавливаются в .INC файле с тем же
именем как устройство, например, 16F84.INC. Эти установочные параметры
могут быть изменены когда устройство физически программируется.

Генератор по умолчанию на большинстве устройств - XT. Это установка по


умолчанию для 4MHz генератора. Если более быстрый генератор
используется, эта установка должна быть изменена на HS.

Сторожевой Таймер включен. Он используется вместе с TMR0 прескалером


для поддержки NAP и SLEEP. Если эти команды не используются в
программе, Сторожевой Таймер можно отключить, и прескалер использовать
для чего-нибудь еще.

Code Protect по умолчанию отключен, но можно включить, когда


устройство физически программируется. Не включайте Code Protect для
микроконтроллеров с кварцевым окошком.

См описание конкретного устройства для данных об этих особенностях


конфигураций.

7.3. Работа с памятью

В общем, не обязательно знать, как RAM распределяется PBP в


микроконтроллеры. PBP позаботится о всех деталях, освободив от этого
программиста. Тем не менее, есть моменты, когда это знание могло быть
полезно.

Переменные загружаются в регистры RAM микропроцессоров PICmicro.


Первая доступная позиция RAM - $0C для PIC16F84 и некоторых меньших
MCU, и $20 для PIC16C74 и других больших MCU. Обратитесь к
справочникам Microchip PICmicro MCU для сведений о фактической позиции
начала регистров RAM для данного микроконтроллера.
PicBasic Pro Compiler - 92 -

Переменные присваиваются RAM последовательно в следующем порядке.


Первые массивы типа word (если любое), затем байтовые и битовые
массивы. Затем пространство распределяется для слов, байтов и,
наконец, индивидуальных битов. Биты упаковываются в байты по
возможности. Этот порядок делает наилучшее использование доступного
ЗУПВ. (Для PIC18Xxxx устройств, массивы распределяются последними.)

Массивы должны быть сформированы в единственном банке на большинстве


PICmicro MCU. Они не могут пересечь границу банка. Это эффективно
ограничивает длину индивидуального массива. См предшествующую главу о
массивах, про эти пределы.

Вы можете предложить PBP конкретный банк, чтоб установить туда


переменную:

penny VAR WORD BANK0


nickel VAR BYTE BANK1

Если сделаны запросы специфического банка, они обрабатываются


сначала. Если недостаточно объема в запрошенном банке, используется
первое доступное пространство и дается предупреждение.

Вы можете даже устанавливать специфические адреса для переменных. В


большинстве случаев, лучше позволять управление памятью PBP. Но в
некоторых случаях, как например, запоминание W регистра в программе
обработки прерывания, необходимо определять фиксированный адрес. Это
может быть сделано способом, аналогичном выбору банка:

w_store VAR BYTE $20

Различные системные переменные, используют 24 байта RAM, автоматически


распределенные компилятором для использования библиотечными
подпрограммами. Эти переменные распределяются в файле PBPPIC14.RAM и
должны быть в банке 0 (или банк A на PIC18Xxxx устройствах).

Переменные Пользователя добавляются с подчеркиванием (_), а системные


переменные не имеют никакого подчеркивания, так что они не создают
помехи друг для друга.

R0 VAR WORD SYSTEM

Переменные BASIC Stamp B0 - B25 и W0 - W12 автоматически не


распределяются. Наилучший способ создавать ваши собственные переменные
- использовать инструкцию VAR. Тем не менее, если Вы хотите чтобы эти
переменные были созданы для Вас, просто включите подходящий файл
BS1DEFS.BAS или BS2DEFS.BAS, в начале PicBasic Pro программы. Эти
переменные занимают отдельное пространство от любых других
переменных, которые Вы можете позже создать. Это отличается от BS2,
где использование искусственных и пользовательских переменных могут
увлечь Вас в омут.

Дополнительные временные переменные могут быть сгенерированы


автоматически компилятором, чтобы помочь это сортировать выражения.
Листинг этих переменных, а также полной карты распределения памяти,
может быть найден в сгенерированном .ASM или .LST файле.

Если недостаточно доступной RAM-памяти для переменных и невозможно


приспособить переменную, будет передаваться сообщение об ошибке
памяти.
PicBasic Pro Compiler - 93 -

7.4. Зарезервированные Слова

Зарезервированные слова - просто это слова, которые резервируются


для использования компилятором и не могут служить именами переменных
или меток. Зарезервированные слова являются именами команд,
псевдоопераций, типами переменных или именами регистров PICmicro MCU.

Псевдооперации, типы переменных и ключевые слова команд указываются в


их соответствующих разделах и в Приложении C. Имена PICmicro MCU
регистров определяются в файле PIC14EXT.BAS. Если файлы BS1DEFS.BAS,
BS2DEFS.BAS или MODEDEFS.BAS включаются, определения в них, по
существу, становятся зарезервированными словами и не могут быть
переопределены.

7.5. Жизнь После 2K

Да, есть жизнь после 2K, используя PicBasic Pro Компилятор.

PICmicro MCUs имеют сегментированное кодовое пространство. Такие


инструкции в 14-битных PICmicro MCU как например, Call и Goto имеют
достаточно битов в своем составе, чтобы адресовать только 2K
программного пространства. Для того, чтобы перейти на код за пределами
2K границы, регистр PCLATH должен быть установлен перед каждым Call
или Goto.

PBP автоматически устанавливает биты PCLATH для Вас. Тем не менее,


есть несколько налагаемых ограничений. Библиотека PicBasic Pro должна
находиться полностью в странице 0 кодового пространства (первая
половина страницы 0 для 12-битных устройств). Обычно это не проблема,
так как целая библиотека меньше чем 2K. Тем не менее, следует уделить
внимание этому вопросу, если используются дополнительные библиотеки.

Драйверы прерывания Ассемблера должны также размещаться в странице 0


кодового пространства. Установка их в начале PicBasic Pro программы
должна выполнить это условие. См дальнейший раздел об ассемблере для
большей информации.

Дополнительные инструкции, чтобы установить биты PCLATH являются


дополнительными затратами в создаваемый код. PBP будет устанавливать
биты PCLATH перед любым Call или Goto на 12-битных MCU с более чем 512
словами кодового пространства, 14-битных MCU с более чем 2K и
PIC17Cxxx с более чем 8K кодового пространства.

Существуют специальные PicBasic Pro инструкции, чтобы помочь с


вопросами 2K.

BRANCHL создавалась, чтобы позволить переходы к меткам, которые могут


быть дальше чем 1K позиция на PIC18Xxxx устройствах или по другую
сторону границы страницы для остальных устройств. Если PICmicro MCU
имеет только одну кодовую страницу программного пространства, BRANCH
может использоваться, она требует по меньше памяти чем BRANCHL. Если
микроконтроллер имеет более чем одну страницу кодового пространства, и
Вы не можете быть уверены, что BRANCH всегда останется внутри той же
страницы, используйте BRANCHL.

Ассемблер может передать предупреждение, что граница страницы была


пересечена. Это - нормально, и сделано так, в расчете, если Вы
проверяете любые BRANCH, которые могут пересечь границу страницы.
PicBasic Pro Compiler - 94 -

7.6. О 12-битных микропроцессорах

Из-за архитектуры 12-битного ядра, программы оттранслированные для них


на PBP будут, в общем, большими и медленными. Тем не менее, во многих
случаях, выбор устройства одного из этих семейств может оказаться
подходящим. Многие полезные программы могут быть записаны и
оттранслированы для 12-битных MCU.

Два случая наиболее вероятны из-за их ограничений: исчерпание памяти


RAM для переменных и переход 256-словного предела для библиотечных
подпрограмм. Эти ограничения сделали необходимым исключить некоторые
команды компилятора и модифицировать некоторые операции.

Компилятор для 12-битных PICmicro MCU использует от 20 до 22 байтов


RAM для своих внутренних переменных, с дополнительным RAM,
использованным для любых необходимых временных переменных. Это
распределение RAM включает 4-уровневый стек программ так, что
BASIC-программа может вложить GOSUBы вплоть до 4 уровней глубины.
Некоторые PICmicro MCU устройства имеют только 24 или 25 байтов RAM,
так что остается очень небольшое пространство для переменных
пользователя на тех устройствах. Если при компиляции выдается ошибка
Unable to Fit Variable, выберите другой MCU PICmicro, с более
универсальным RAM.

12-битные PICmicro MCU могут вызвать только первую половину (256 слов)
кодовой страницы. Поскольку программы библиотеки компилятора все
управляются вызовами, они должны находиться полностью среди первых 256
слов кодового пространства PICmicro MCU. Многие библиотечные
программы, как например, I2CREAD, - довольно большие. Достаточно
несколько программ, чтобы выйти за границу первых 256 слов кодового
пространства. Если необходимо использовать больше библиотечных
программы, которые располагаются в первой половине первой кодовой
страницы, тогда необходимо перейти на 14- или 16-битные
микроконтроллеры вместо 12-битных.

8. Ассемблерное программирование.

Подпрограммы на Ассемблере могут быть полезным дополнением в программе


на PicBasic Pro. В общем, большинство заданий могут быть сделаны
полностью в BASIC, но иногда может понадобиться сделать конкретное
задание более быстрым или меньшего объема кода, или просто иначе, чем
компилятор сделал его. В этом случае полезно иметь возможности
включаемого ассемблера.

Это может быть выгодным для записи основной программы быстро,


используя язык PicBasic Pro, а затем черкануть несколькими строками
ассемблерный код, чтобы увеличить функциональность. Этот
дополнительный код может быть вставлен непосредственно в PBP-программу
или включен как другой файл.

8.1. Два Ассемблера

При работе, PBP сначала переводит программы на ассемблерный язык и


автоматически запускает ассемблер, а тот уже преобразовывает ее в
конечный .HEX файл, который может быть запрограммирован в
микроконтроллер.

Два различных ассемблера могут использоваться с PBP: PM, наш PICmicro


Macro Assembler, и MPASM, ассемблер от Microchip. PM поставляется с
компилятором, в то время как MPASM должен быть получен непосредственно
от Microchip через их web-сайт или вместе с их программатором MCU
PicBasic Pro Compiler - 95 -

PICmicro.

Есть преимущества и недостатки в использование каждого ассемблера. PM


- удобен, поскольку он включен как часть PBP. Он также много быстрее
чем MPASM и может ассемблировать значительно большие программы в DOS.
PM включает 8051-систему команд, которая более интуитивна, чем
мнемоники Microchip. Для полной информации о макроассемблере
PICmicro см. файл PM.TXT на диске.

С другой стороны, MPASM имеет способность создавать .COD файл. Этот


файл содержит дополнительную информацию, которая может быть очень
полезна с эмуляторами и симуляторами. MPASM также более совместим с
широким рядом примеров на ассемблере имеющихся на web-сайтах и в
справочниках Microchip.

По умолчанию PBP использует PM. Для того, чтобы пользоваться MPASM с


PBP, установите все файлы MPASM в их собственный подкаталог,
прописанный в PATH DOS.

MPASM может использоваться с PBP двумя путями. Если используется опция


командной строки "-ampasm", MPASM будет запускаться вслед за
компиляцией, чтобы завершить процесс. MPASM отобразит свой собственный
экран с ходом выполнения.

PBP -ampasm filename

Другая, опция командной строки "-amp" запустит MPASM в тихом режиме и


будет отображать только случаи ошибок. Этот режим, однако, потребляет
дополнительно памяти, следовательно MPASM-у ее останется меньше.

PBP -amp filename

Для выделения максимума памяти MPASM, должна использоваться опция


командной строки "-ampasm" или Windows-версия MPASM, "-ampasmwin". В
любом случае, MPASM не поставляется с PBP и должен быть получен от
Microchip.

8.2. Программирование на Ассемблере

PBP-программа может содержать единственную строку ассемблера,


предшествуемую символом "at" (@), или одна или более ассемблерного
кода, предшествуемому ключевым словом ASM и завершаемого ENDASM. Оба
ключевых слова ставят отдельно, в их собственных строках программы.

@ bsf PORTA,0
Asm
bsf STATUS,RP0
bcf TRISA,0
bcf STATUS,RP0
Endasm

Ассемблерные строки дословно копируются в ассемблерный выходной


файл. Это позволяет PBP программе использовать все ресурсы PM,
Макроассемблера PICmicro. Это также, тем не менее, требует, чтобы
программист имел хорошую осведомленность о библиотеках PBP. Нотация
PBP подобна другим коммерческим компиляторам, и не должна бы вызвать
шока у программистов, знающих включаемое ассемблирование.

Все идентификаторы, определенные в PBP-программе, аналогично


определяются и в ассемблере, но с именем, предшествуемым с подчерком
(_). Это позволяет доступ в ассемблере к пользовательским переменным,
PicBasic Pro Compiler - 96 -

константам и даже меткам.

Таким образом, любое имя определенное в ассемблере, начинающееся с


подчерка имеет возможность конфликта с символом, сгенерированным PBP.
Если конфликт аннулируется, могут ли эти подчеркнутые ассемблерные
величины быть доступны из PBP? - Нет. Запомните: подчеркнутые имена,
генерируемые PBP - только тени фактической информации, определенной в
компиляторе. Поскольку вставленный ассемблерный фрагмент копируется
непосредственно в выходной файл, не обрабатываясь компилятором,
компилятор не только не обладает никаким типом информации об
ассемблерных символах, но даже не подозревает об их существовании.
Если переменные должны использоваться совместно ассемблером и PBP, Вы
должны определить (define) переменные в PBP.

Так как символы подчерка имеют возможность конфликтов, не начинайте


имена с подчерков. Проблема - внутренние библиотечные идентификаторы.
К счастью, большинство библиотечных идентификаторов содержат "?" или
ссылаются на один из рабочих регистров (как например, R0). Избежание
таких имен должно уменьшить проблемы. Если произошла коллизия имен,
ассемблер сообщит о двойном определении как ошибке.

В ассемблере комментарий обозначается полудвоеточием (;), а в PicBasic


Pro - единственной кавычкой (').

' комментарий PicBasic Pro


; комментарий Ассемблера

8.3. Размещение Ассемблерных вставок

Операторы PBP выполняются в порядке их появления в исходном тексте.


Код организовывается следующим образом: Старт с позиции 0, вектор
сброса, PBP включает некоторые стартовочные коды, сопровождаемые jump
к INIT. Дальнейшее заполняется библиотечными подпрограммами,
вызываемыми по call. В конце библиотеки есть INIT, где любая
дополнительная инициализация завершена. Наконец, от метки MAIN
начинается код операторов, оттранслированный PicBasic-ом.

Первая выполняемая строка, которая появляется в PicBasic Pro источнике


- где программа начинает выполнение. Этот оператор буквально
появляется в памяти прямо за стартом контроллера и библиотечным кодом,
прямо после метки MAIN. (-? прим. перев.)

Тенденция программистов - установить свои собственные библиотечные


функции записанные, используя ассемблерные вставки перед или после их
кода. В свете вышеуказанного объяснения, это могло бы создать
некоторые очевидные проблемы. Если они появляются в начале программы,
ассемблерные программы выполняются прежде любых PBP инструкций
(некоторые программисты непременно будут эксплуатировать эту
особенность). Если они появляются в хвосте программы, выполнение,
которое "falls off the end" PBP операторов может непостижимо найти
себя непреднамеренно выполняющим ассемблерные программы. (Смысл абзаца
мне не ясен. прим. перев.)

Есть пара соображений о том, где могло бы быть наилучшее место, чтоб
вставить подпрограммы ассемблера. Если целая программа
приспосабливается в одну кодовую страницу, установите ваши
ассемблерные программы после вашего PBP кода. Если Вы должны завершить
вашу программу, то явно установите END или STOP оператор в конце
вашего кода, а не выход в неопределенное пространство.

Если программа - более длинная чем одна кодовая страница, то больше


PicBasic Pro Compiler - 97 -

смысла установить программы ассемблера в начале PBP программы. Это


должно гарантировать их расположение на первой кодовой странице так,
что Вы знаете где искать их. Таким путем размещают ассемблерные
обработчики прерываний.

Если программы устанавливаются впереди, надо сделать GOTO (или JMP) в


обход этого кода к первому выполняемому оператору PBP. См. пример в
разделе прерываниях.

Фактический код для программ ассемблера может быть фрагментом в вашей


программе или отдельным файлом. Если программа используется только
одной конкретной PicBasic Pro программой, будет иметь смысл включить
код ассемблера внутрь PBP исходного файла. Эта программа может затем
вызываться при помощи команды CALL.

Если он используется различными другими PBP-программами, отдельный


файл содержащий ассемблерные программы может просто быть включен на
подходящем месте в PicBasic Pro источнике:

Asm
Include "myasm.inc"
Endasm

8.4. Другие вопросы Ассемблера

Регистры PICmicro MCU организованы банками. PBP следит, с каким


регистровым банком он работает в каждое время. Он знает: если он
указывает, например, на TRIS регистр, то он имеет необходимость
изменить биты коммутации банков памяти прежде, чем он сможет получить
доступ к PORT.

Он знает также, что надо восстановить биты коммутации банков на 0


перед Call или Goto. Он делает это, поскольку не может предвидеть
состояние битов коммутации банков на новой позиции. Так что всегда при
изменении позиции или вызове/переходе к метке, биты коммутации банков
памяти обнуляются.

Он также восстанавливает биты коммутация банков памяти перед каждой


ASM и @, так как программа на ассемблере не знает текущего состояние
битов так, что они устанавливаются в известное состояние. Код
ассемблера должен обязательно восстановить биты коммутации банков
памяти перед выходом, если они были изменены.

9. Прерывания

Прерывания могут быть ужасно эффективным способом сделать вашу


программу действительно трудноотлаживаемой.

Прерывания запускаются аппаратными событиями, такими как изменения


состояний I/O штырьков, или таймер, и так далее. Если разрешены (по
умолчанию - нет), прерывание заставляет процессор, оставить все, чем
он занимается и перейти на заданную подпрограмму в микроконтроллере -
это вызов обработчика прерывания.

Прерывания - не для слабонервных. Они могут быть очень мудреными,


чтобы выполнить все правильно, но в то же самое время, они могут
обеспечить очень полезные функции. Например, прерывание могло
использоваться, чтобы сбуферизовать асинхронные данные, пока основная
PicBasic Pro программа занята чем-нибудь еще. (Конкретно эта задача
потребует микроконтроллер с аппаратным UART.)
PicBasic Pro Compiler - 98 -

Есть многие пути, чтобы избежать использовать прерывания. Быстрый


опрос штырьков или битов регистра взамен - обыкновенно достаточно,
чтобы решить задачу. Или Вы можете проверить величину флага
прерывания без действительного включения прерываний.

Тем не менее, если Вы все-таки идете на это, вот несколько советов.

PicBasic Pro Compiler имеет два различных механизма, чтобы оперировать


прерываниями. Первый - просто чтобы записать программу обработки
прерывания в ассемблере и вставить ее в PBP-программу. Второй метод -
чтобы использовать команду PicBasic Pro ON INTERRUPT. Каждый метод
будет описан отдельно, после того, как мы скажем о прерываниях в общих
чертах.

9.1. Прерывания в общем

Когда прерывание появляется, PICmicro MCU загружает адрес следующей


инструкции, который он предполагал выполнять, в стек и переходит на
адрес 4. Первое, о чем это говорит - что Вам нужна дополнительная
позиция в аппаратном стеке, который только 8 уровней глубины на
14-битных устройствах.

Библиотечные программы PicBasic Pro могут израсходовать 4 позиции


стека для себя. Оставшиеся 4 (12 для PIC17Cxxx и 27 для PIC18Xxxx)
резервируются для CALLов и вложенных GOSUBов BASICа. Вы должны
убедиться, что ваши GOSUBы вложены максимум на 3 (11 для PIC17Cxxx и
26 для PIC18Xxxx) уровня глубины, без CALLов внутри них, для того,
чтобы обеспечить позицию стека, доступную для адреса возврата. Если
ваш обработчик прерывания использует стек (сам делая CALL или GOSUB,
например), Вам понадобится иметь дополнительное свободное пространство
стека.

Когда Вы разобрались с вопросами стека, можно разрешать прерывания.


Это обычно означает установку регистра INTCON. Установите необходимые
разрешающие биты вместе с Глобальным Разрешением Прерываний. Например:

INTCON = %10010000

разрешает прерывания для RB0/INT. В зависимости от желаемого


фактического прерывания, Вы, возможно, также должны устанавливать один
из регистров PIE.

Обратитесь к справочникам по Microchip PICmicro MCU для дополнительной


информации как использовать прерывания. Там даются примеры сохранения
контекста процессора, а также вся необходимая информация, как
разрешать конкретное прерывание. Такие данные - неоценимы для вашего
успеха.

Наконец, выберите наилучшую технику, с которой оперировать вашими


конкретными прерываниями.

9.2. Прерывания в BASIC

Легчайший способ, чтобы записать программу обработки прерывания -


писать ее в PicBasic Pro, используя команду ON INTERRUPT. ON INTERRUPT
сообщает PBP активизировать его внутреннее прерывание и переходить на
вашу BASIC-программу обработки прерывания, после того, как прерывание
произошло. Это приводит нас к первой трудности.

При ON INTERRUPT, когда происходит прерывание, PBP просто


устанавливает флаг случая и возвращается обратно к тому, чем он
PicBasic Pro Compiler - 99 -

занимался. Он не сделает немедленного перехода к вашей программе


обработки прерывания. Поскольку операторы PBP не реентрантны (PBP
должен сначала завершить один оператор, прежде, чем начать другой),
может получиться значительная задержка.

Скажем, например, что PicBasic Pro программа начала выполнять Pause


10000, когда появляется прерывание. PBP установит флаг прерывания и
продолжит Pause. Она может продолжаться 10 секунд, прежде чем
программа обработки прерывания выполнится. Если обработчик буферизует
символы из последовательного порта, многие символы окажутся
пропущенными.

Для того, чтобы минимизировать проблему, используйте только операторы,


которые не очень долго выполнить. Например, вместо Pause 10000,
используйте Pause 1 в длинном цикле FOR..NEXT. Это позволит PBP
завершать каждый оператор более быстро и оперировать ожидающими
прерываниями.

Если требуется обработать прерывание, быстрее, чем это может быть


предусмотрено ON INTERRUPT, следует использовать ассемблерное
прерывание.

Если задано ON INTERRUPT, по адресу 4 PICmicro MCU устанавливается


короткая программа обработки прерывания. Эта программа обработки
прерывания - просто Return. Это возврат программы назад к тому, что
она выполняла перед обнаруженным прерыванием. Это не требует сохранять
контекст процессора и восстанавливать Глобальные Прерывания, как в
случае использования Retfie.

Call к короткой подпрограмме устанавливается перед каждым оператором в


PicBasic Pro программе когда встречено ON INTERRUPT. Эта короткая
подпрограмма проверяет состояние бита Разрешения Глобальных
Прерываний. Если он отключен, прерывание рассматривается так, чтобы он
перешел в пользовательскую программу обработки прерывания. Если же он
установлен, программа продолжит следующую команду BASIC, после того,
как бит GIE проверится снова, и так далее.

Когда команда RESUME встречается в конце BASIC-программы обработки


прерывания, она устанавливает бит GIE, чтобы восстановить прерывания и
возвраты. Если RESUME получает метку, для перехода, выполнение
продолжится с указанной позиции. Все предшествующие адреса возврата
будут в этом случае потеряны.

DISABLE прекращает вставки Call на проверку прерываний после(так в


тексте. прим. перев.) каждого утверждения. Это позволяет секциям кода
выполняться без прерывания. ENABLE позволяет продолжать вставки.

DISABLE должно быть установлено перед программой обработки прерывания


чтобы предохранить от перезапуска проверкой бита GIE.

Если желательно выключить прерывания по каким-либо причинам после ON


INTERRUPT, Вы не должны выключать GIE бит. Выключение этого бита
сообщает PBP, что прерывание случилось, и он начнет выполнять
программу обработки прерывания непрерывно. Вместо этого следует
устанавливать:

INTCON = $80

Это блокирует все индивидуальные прерывания но оставляет Глобальный


бит Разрешения Прерываний установленным.
PicBasic Pro Compiler - 100 -

9.3. Прерывания в Ассемблере

Прерывания на языке Ассемблера несколько более мудреные.

Поскольку у Вас нет информации, чем процессор занимался, когда он был


прерван, у Вас нет понятия о состоянии регистра W, флагов STATUS,
PCLATH или даже на какую страницу регистров Вы указываете. Если Вы
собираетесь изменить любой из них, то Вы должны сохранить текущие
величины так, чтобы можно было восстановить их перед возвратом в
программу. Это называется сохранением и восстановлением контекста
процессора.

Если контекст процессора при возврате из прерывания не останется точно


тем же, каким был, грозят любые типы сбоев, от мелких до полного
развала.

Это конечно означает, что нельзя использовать безопасные внутренние


переменные компилятора для хранения контекста процессора. Вы не можете
сказать какие переменные используются библиотечными программами в
любой данный момент.

Вам следует создать переменные в PicBasic Pro программе для срочного


назначения сохранять W, регистр STATUS и любой другой регистр, которые
вероятно должны быть изменены. Эти переменные не должны в
противном(так в тексте. прим.перев) случае использоваться в BASIC
программе.

Пока это кажется простой задачей - сохранить W в любом регистре


памяти, но в действительности все несколько сложнее. Проблема
появляется в том, что Вы не имеете способа узнать, какой банк
регистров указан, когда прерывание произошло. Если Вы зарезервировали
позицию в Bank0, а указатели текущего регистра установлены, например,
на Bank1, Вы могли бы перезаписать не ту позицию. Следовательно Вы
должны зарезервировать позицию RAM в каждом банке устройства по
одинаковому смещению.

Возьмем, как пример, 16C74(A). У него есть 2 банка регистров памяти,


начинающихся в $20 и $A0 соответственно. Чтобы быть безопасным, мы
должны зарезервировать ту же позицию в каждом банке. В этом случае мы
выберем первую позицию в каждом банке. Специальная структура была
добавлена в команду VAR, чтобы позволить это:

wsave var byte $20 system


wsave1 var byte $a0 system

Это указывает компилятору, чтобы установить переменную в конкретной


позиции в RAM. В этом способе, если сохраняемый W "проскочил" в другой
банк, он не повредит данные.

Программа обработки прерываний должна быть столь коротка и быстра, как


только возможно. Если требуется слишком много времени чтобы
выполнить, Сторожевой Таймер может переполниться и спутать всю работу.

Программа должна закончиться с инструкцией Retfie, чтобы возвратиться


из прерывания и позволить процессору возобновить прерванное выполнение
в вашей PicBasic Pro программе.

Хорошее место, чтобы установить ассемблерную программу обработки


прерывания - в самом начале вашей PicBasic Pro программы. Перед ней
должен быть GOTO, чтобы пустить выполнение в обход, когда программа
стартует. См нижеуказанный пример для демонстрации этого.
PicBasic Pro Compiler - 101 -

Если 14-битный MCU PICmicro имеет более чем 2K кодового пространства,


заглушка прерывания автоматически добавит эти сохраняемые W, STATUS и
PCLATH регистры в переменные wsave, ssave и psave, прежде, чем перейти
к вашей программе обработки прерывания. Память для этих переменных
должна быть распределена в BASIC программе:

wsave var byte $20 system


wsave1 var byte $a0 system ' Если устройство имеет RAM bank1
wsave2 var byte $120 system ' Если устройство имеет RAM bank2
wsave3 var byte $1a0 system ' Если устройство имеет RAM bank3
ssave var byte bank0 system
psave var byte bank0 system

В любом случае, Вы должны восстановить эти регистры в конце вашей


программы обработки ассемблера прерывания. Если 14-битный PICmicro MCU
имеет 2K кодового пространства или менее, или это PIC18Xxxx
устройство, регистры не сохранены. Ваша программа обработки прерывания
должна сохранить и восстановить все используемые регистры.

Наконец, Вы должны сообщить PBP, что Вы используете ассемблерную


программу обработки прерывания, и где она находится. Это выполняется с
помощью DEFINE:

DEFINE INTHAND Label

Label - метка начала вашей программы обработки прерываний. PBP


установит переход на эту метку из позиции 4 микроконтроллера PICmicro.

' Пример прерывания на Ассемблере

led var PORTB.1

wsave var byte $20 system


ssave var byte bank0 system
psave var byte bank0 system

Goto start ' обход вокруг обработчика

' Определение обработчика прерываний


define INTHAND myint

' Обработчик прерывания на языке Ассемблера


asm
; Сохранение регистров W, STATUS и PCLATH
myint movwf wsave
swapf STATUS, W
clrf STATUS
movwf ssave
movf PCLATH, W
movwf psave

; Место для кода обработки прерывания


; Сохранить и восстановить FSR, если используется

bsf _led ; Включить LED (к примеру)

; Восстанавливаем регистры PCLATH, STATUS и W


movf psave, W
movwf PCLATH
swapf ssave, W
movwf STATUS
PicBasic Pro Compiler - 102 -

swapf wsave, F
swapf wsave, W
retfie
endasm

' Программа PicBasic Pro начинается отсюда


start: Low led ' Выключение LED

' Разрешить прерывания на PORTB.0


INTCON = %10010000

loop: Goto loop ' Здесь ожидание прерывания.

---------------
Прим. перев.:
Регистр INTCON управляет тем, какие именно прерывания будут
задействованы. Вот что означают его биты:

Бит Имя Назначение


-------------------------------------------------------------------------
7 GIE Общее (глобальное) управление прерываниями:
1 - позволяет все разрешенные прерывания
0 - запрещает все прерывания
6 Управление прерываниями от периферии:
1 - прерывания от периферии возможны
0 - все прерывания от периферии запрещены
5 T0IE Разрешение прерывания при переполнении таймера TMR0
4 INTE Разрешение внешнего прерывания (от штырька RB0/INT)
3 RBIE Разрешение формирования запроса на прерывание при изменении
сигналов на линиях порта B (PORTB).
2 T0IF Запрос (флаг) на прерывание при переполнении TMR0
1 INTF Запрос на прерывание по внешнему событию (от штырька RB0/INT)
0 RBIF Запрос на прерывание при изменении состояния порта B (PORTB)
-------------------------------------------------------------------------
Эта таблица относится к микроконтроллерам 12C6xx, 14000,
16C55 - 16C8x, 16F8x(x), 16C9xx.
Для этих MCU при срабатывании прерывания, выполнение передается
всегда на один и тот же адрес: 0x004, где и должен находится
обработчик прерываний (или переход к нему).
Периферия - это встроенные устройства, например USART. Они имеют
собственные дополнительные регистры выборочного
разрешения/запрещения своих прерываний (PIE).
Прерывания в PIC18Cxx управляются примерно так же, но если
установлены бит 7 регистра RCON и бит P источника прерывания,
выполнение будет с адреса 0x00008, а если P сброшен, то с адреса
0x00018.
18Cxx и 17Cxx имеют уровни приоритетов прерываний.

----------------------------------------------------------------------

10. Различия PicBasic Pro / PicBasic / Stamp

Совместимость это обоюдоострый меч. И у него есть острие. PicBasic Pro


сделал некоторые уступки в использовании и размере кода.
Следовательно, мы называем это "подобно BASIC Stamp", а не BASIC
Stamp-совместимый. PBP имеет большинство BASIC Stamp I и II команд и
синтаксис. Тем не менее есть некоторые значимые различия.

Следующие разделы рассматривают детали реализации PBP программ,


которые могли бы представить проблемы. Надеемся, что если Вы
встречаете проблемы, эти дискуссии помогут освещать различия и
PicBasic Pro Compiler - 103 -

возможные решения.

10.1. Скорость Выполнения

Самая большая потенциальная проблема - скорость. Без потерь чтения


инструкций из последовательного EEPROM, многие PBP инструкции (как
например, GOTO и GOSUB) выполнять сотни раз быстрее чем их эквиваленты
BASIC Stamp. В то время, как во многих случаях это - польза, программы
которые был разработаны эмпирически могут испытать проблемы.

Простое решение - хорошие программы не полагаются на время выполнения


команд, как например, FOR..NEXT циклы. Везде, где возможно,
программа должна использовать квитирование связей и другие
не-временные методы синхронизации. Если задержки необходимы, должны
использоваться команды, специально генерирующие задержки (PAUSE,
PAUSEUS, NAP или SLEEP).

10.2. Цифровой ввод-вывод

В отличие от BASIC Stamp, программы PBP оперируют непосредственно на


PORT и TRIS регистрах. Пока это имеет скорость и преимущества
размера RAM/ROM, есть один потенциальный недостаток.

Некоторые I/O команды (напр. TOGGLE и PULSOUT) выполняют операции


чтения-модификации-записи непосредственно в регистре PORT. Если две
такие операции выполняются слишком закрытые вместе и на выходе
индуктивная или емкостная нагрузка, операция может быть нарушена.

Допустим, например, что динамик подключен через 10uF конденсатор


(точно так же, как с командой SOUND). Также допустим, что на штырьке
первоначально низкий уровень и программист пытается генерировать
импульс, используя TOGGLE. Первая команда читает низкий уровень
штырька и выполняет его переворот. Устройство выхода (который теперь -
высокий) начинает заряжать конденсатор. Если вторая операция
выполняется слишком быстро, она все еще читает уровень штырька как
низкий, даже если выходной драйвер уже переключен в "1".
Следовательно, вторая операция также будет управлять штырьком - в
высокий.

На практике, это незначительная проблема. И команды, разработанные для


этих типов сопряжения (SOUND и POT, например) имеют встроенную защиту.
Эта проблема не только PBP, это - общая проблема PICmicro MCU (и
других микроконтроллеров), программ, и реалий непосредственного
программирования аппаратных средств.

10.3. Инструкции Снижения Мощности

Когда Сторожевой Таймер пробуждает PICmicro MCU из режима sleep,


выполнение возобновляется без нарушения состояний штырьков
входов/выходов (I/O). По неизвестным причинам, когда BASIC Stamp
возобновляет выполнения после инструкции низкой мощности (NAP or
SLEEP), на I/O штырьках помеха приблизительно 18 mSec. PBP программы
используют PIC I/O последовательно. ИнструкцииNAP и SLEEP не мешают
I/O штырькам.

10.4.Отсутствие Интерфейса PC

С тех пор, как PBP генерирует программы выполняемые непосредственно в


PICmicro MCU, нет потребности в Stamp интерфейсе штырьков - PC (PCO и
PCI). Отсутствие PC интерфейса вводит некоторые различия.

Без Stamp-овского IDE запущенного на PC, нет места, чтобы послать


PicBasic Pro Compiler - 104 -

отладочную информацию. Отладка может все еще быть выполнена используя


одну из инструкций последовательного обмена, подобно DEBUG или SEROUT
на связи с терминальной программой работающей под PC как например,
Hyperterm.

Без PC, можно пробудить PICmicro MCU из END или STOP кратковременным
выключением питания, или подачей низкого уровня на /MCLR, или он
останется в ожидании до тех пор, пока не появится прерывание.

10.5. Нет Автоматических Переменных

PicBasic Pro Compiler автоматически не создает никаких переменных


подобно B0 или W0. Они должны быть определены, используя VAR. Два
файла предусмотрены: BS1DEFS.BAS и BS2DEFS.BAS это определит
стандартные BS1 или BS2 переменные. Тем не менее, рекомендуется чтобы
Вы присваивали ваши собственные переменные с значимыми именами, а не,
используя один из этих файлов.

10.6. Нет Полубайтового (Nibble) типа переменных

BS2 тип переменной nibble (полубайт) не осуществлен в PicBasic Pro


Компиляторе. Так как PBP позволяет много больше переменных чем BS2,
просто смените тип полубайт - в байт.

10.7. Нет DIRS

Переменные BASIC Stamp с именами Dirs, Dirh, Dirl и Dir0 - Dir15 не


определены и не должен использоваться с PicBasic Pro. Взамен следует
использовать TRIS, но противоположно состоянию Dirs.

Это НЕ РАБОТАЕТ в PicBasic Pro:

Dir0 = 1 ' Не сделает штырек PORTB.0 выходом

Делать взамен:

TRISB.0 = 0 ' Сделает штырек PORTB.0 выходом

или просто пользуйтесь командой, которая автоматически устанавливает


направление штырька.

10.8. Нет автоматического обнуления переменных

BASIC Stamp устанавливает все переменные и регистры на 0, когда


программа стартует. Это не делается автоматически, когда стартует
программа PBP. В общем, переменные должны быть проинициализированы в
программе в подходящее состояние. Кроме того, CLEAR может
использоваться для обнуления всех переменных, когда программа
начинается.

10.9. Математические операторы

Математические выражения в PBP имеют приоритет операций. Это означает,


что они вычисляются не в строгом порядке слева направо, как в BASIC
Stamp и исходном PicBasic. В соответствии с приоритетом операций,
умножение и деление выполняются прежде, чем сложение и вычитание, к
примеру.

Чтобы сгруппировать операции в иной порядок, в котором они должны быть


выполнены, используйте скобки. Тогда уже не будет сомнений о порядке
PicBasic Pro Compiler - 105 -

операций.

Следующий список операторов в иерархическом порядке:

Наивысший Приоритет
-------------------------
( )
NOT
~
-
SQR ABS DCD NCD COS SIN
*
**
*/
/
//
+
-
<<
>>
MIN
MAX
DIG
REV
&
^
|
&/
/|
^/
&& AND
^^ XOR
|| OR
-------------------------
Наинизший приоритет.

10.10. [ ] против ( )

PBP использует квадратные скобки [] в операторах, где прежде


использовались простые скобки (). Это более в соответствии с BASIC
Stamp II синтаксисом.

Например инструкция, BS1 и исходного PicBasic Компилятора SEROUT


выглядит приблизительно:

Serout 0,T2400,(B0)

В PicBasic Pro Компиляторе инструкция SEROUT будет похожа на:

Serout 0,T2400,[B0]

Любые инструкции, которые прежде использовали () в своем синтаксисе,


должны быть измены на квадратные скобки взамен.

10.11. ABS

ABS работает немного иначе чем в Stamp в том, что она берет абсолютную
величину байта, а также и слова. (прим. перев.: выше неоднократно
написано, что математика в PBP беззнаковая. Возможно, я чего-то
недостаточно понимаю.)
PicBasic Pro Compiler - 106 -

10.12.DATA, EEPROM, READ и WRITE

BASIC Stamp позволяет последовательному EEPROM-пространству не


использованному для запоминания программы загрузить неизменяющиеся
данные. Поскольку PBP-программы выполняются непосредственно из
пространства ПЗУ MCU PICmicro, EEPROM память должна быть выполнена в
некотором другом способе.

PIC16F84 (программы PBP - по умолчанию для него), PIC16F83 и PIC16C84


имеют 64 байта встроенного EEPROM. PBP ПРОГРАММЫ могут использовать
его для EEPROM операций и поддерживает Stamp-овские команды DATA,
EEPROM, READ and WRITE.

Для того, чтобы управлять внешней энергонезависимой памятью данных,


были добавлены инструкции I2CREAD и I2CWRITE. Эти инструкции
позволяют 2-проводную связь с последовательными EEPROM, как 24LC01B от
Microchip Technology.

READ и WRITE не окажут влияние на встроенные устройства EEPROM,


подключенные способом I2C, подобно PIC12CE67x и PIC16CE62x части.
Используйте I2CREAD и I2CWRITE инструкции взамен.

10.13. DEBUG

DEBUG в PBP не - специальный случай SEROUT каким он является в


Stamps. Он является значительно более короткой программой, которая
работает с фиксированным штырьком и скоростью обмена. Он может
использоваться тем же образом, чтобы послать отладочную информацию в
терминальную программу или другое последовательное устройство.

DEBUG посылает последовательные данные на PORTB, pin 0, 2400 бод, если


иное не определено при помощи DEFINE.

Вопросные маркеры (?) в командах DEBUG проигнорированы. Модификатор


ASC? не поддерживается и не должен использоваться.

10.14. FOR..NEXT

BS2 автоматически устанавливает направление шага STEP для цикла .


FOR..NEXT. Если конечная величина - меньше чем начальная и STEP не
задано, принималась -1. PicBasic Pro всегда по умолчанию 1, если STEP
не задано. Если желательно делать счет цикла назад, шаг надо задать
явно:

For i = 10 To 1 Step -1

10.15. GOSUB и RETURN

Подпрограммы реализуются через операторы GOSUB и RETURN. Переменная


Пользователя W6 используется BS1 как четыре полубайта стека. Таким
образом, программы Stamp, могут иметь вплоть до 16 GOSUBов и
подпрограмм, вложенных до четырех уровней глубины.

PICmicro MCU имеют инструкции Call и Return, а также восьмиуровневый


стек. PBP программы используют эти инструкции и могут пользоваться
четырьмя уровнями этого стека, с другими четырьмя зарезервированными
уровнями для библиотечных программ. Таким образом, W6 не используется,
подпрограммы могут быть вложены до четырех уровней глубины (12 для
PIC17Cxxx и 27 для PIC18Xxxx) и число GOSUBов ограничивается только
пространством кода MCU PICmicro.
PicBasic Pro Compiler - 107 -

10.16. I2CREAD и I2CWRITE

I2CREAD и I2CWRITE команды отличаются от команд I2CIN и I2COUT


исходного PicBasic Компилятора. Наиболее очевидное различие - в том,
что числа данных и штырек синхронизации теперь определены как часть
команды. Они больше не фиксируются на специфических штырьках.

Другое различие - в том, что формат управляющего байта изменился. Вы


больше не устанавливаете размер адреса как часть управляющего байта.
Взамен, размер адреса определен типом переменной адреса. Если
используется байтовая переменная, посылается 8-битный адрес. Если
используется словная переменная, посылается 16-битный адрес.

10.17. IF..THEN

BASIC Stamps и исходный PicBasic компилятор позволяли только метку


после IF..THEN. PicBasic Pro дополнительно позволяет структуру
IF..THEN..ELSE..ENDIF, а также позволяет ставить фактический код,
выполняемый по IF или ELSE.

10.18. MAX и MIN

Функции операторов MAX и MIN были изменены отчасти из-за способа,


которым они работают в Stamp и исходном PicBasic Компиляторе.

MAX возвратит максимум двух величин. MIN возвратит минимум двух


величин. Это соответствует более тесно большинству других Бейсиков и
не имеет проблем предела 0 и 65535 Stamp-овских инструкций MIN и MAX.

В большинстве случаев, Вам нужно только изменение MIN на MAX и MAX на


MIN в ваших программах Stamp, чтобы работать правильно с PBP.

10.19. SERIN и SEROUT

SERIN и SEROUT используют BS1 синтаксис. SERIN2 и SEROUT2 используют


BS2 синтаксис. BS2-стиль timeout был добавлен в команду SERIN.

SERIN И SEROUT были изменены, чтобы подняться до 9600 бод от BS1


предела 2400 бод. Это было выполнено заменой мало используемой
скорости 600 бод на 9600 бод. Режимы T9600, N9600, OT9600 и ON9600
могут теперь использоваться.

600 бод - больше не доступен и вызовет ошибку компиляции, если


попытаетесь использовать его.

10.20. SLEEP

PBP команда SLEEP основывается исключительно на Сторожевом Таймере, а


не калиброванном генераторе тактовой частоты. Это изменение было
вызвано эффектом Сторожевого Таймера при сбросе PICmicro MCU.

Всякий раз, когда PICmicro MCU сбрасывался в течение SLEEP калибровки,


он изменял состояния некоторых внутренних регистров. Для небольших
PICmicro MCUs с несколькими регистрами, эти регистры могли быть
сохранены перед- и восстановлены после калибровочных сбросов. Однако,
поскольку PBP может использоваться со многими другими PICmicro MCU со
множеством изменяющихся при сбросе регистров,такое сохранение и
восстановление оказывается слишком громоздким.
PicBasic Pro Compiler - 108 -

Следовательно SLEEP выполняется в некалиброванном режиме основанном


только на точности Сторожевого Таймера. Это гарантирует устойчивость
PICmicro MCU регистров и I/O портов. Тем не менее, поскольку
Сторожевой Таймер запитан внутренним RC генератором, его период может
измениться значительно, в зависимости от температуры и индивидуальных
характеристик экземпляра. Если необходима точность больше -
используйте PAUSE, которая не вводит микроконтроллер в режим низкого
энергопотребления.

Приложение A
Примеры режимов Mode для Serin2/Serout2
----------------------------------------------------------
Baud Rate BIT 15 BIT 14 BIT 13 Mode
(Output) (Conversion) (Четность) Number
----------------------------------------------------------
300 Driven прямой
300 Driven прямой
300 Driven инверсный нет 19697
300 Driven инверсный Четн* 27889
300 Open прямой
300 Open прямой
300 Open инверсный нет 52465
300 Open инверсный Четн* 60657

1200 Driven прямой


1200 Driven прямой
1200 Driven инверсный нет 17197
1200 Driven инверсный Четн* 25389
1200 Open прямой
1200 Open прямой
1200 Open инверсный нет 49965
1200 Open инверсный Четн* 58157

2400 Driven прямой


2400 Driven прямой
2400 Driven инверсный нет 16780
2400 Driven инверсный Четн* 24972
2400 Open прямой
2400 Open прямой
2400 Open инверсный нет 49548
2400 Open инверсный Четн* 57740

9600** Driven прямой


9600** Driven прямой
9600** Driven инверсный нет 16468
9600** Driven инверсный Четн* 24660
9600** Open прямой
9600** Open прямой
9600** Open инверсный нет 49236
9600** Open инверсный Четн* 57428

19200** Driven прямой


19200** Driven прямой
19200** Driven инверсный нет 16416
19200** Driven инверсный Четн* 24608
19200** Open прямой
19200** Open прямой
19200** Open инверсный нет 49184
19200** Open инверсный Четн* 57376
----------------------------------------------------------
*Для проверки на нечетность, добавить: DEFINE SER2_ODD 1.
PicBasic Pro Compiler - 109 -

**Может потребоваться частота генератора больше 4MHz.


Дополнение В
Defines
----------------------------------------------------------------------------
DEFINE ADC_BITS 8 ' Разрядность АЦП
DEFINE ADC_CLOCK 3 ' Синхросигнал АЦП (rc = 3)
DEFINE ADC_SAMPLEUS 50 ' Период квантования АЦП, микросекунд
DEFINE BUTTON_PAUSE 10 ' Задержка на подавление дребезга, ms
DEFINE CCP1_REG PORTC ' Hpwm 1 pin порт
DEFINE CCP1_BIT 2 ' Hpwm 1 pin бит
DEFINE CCP2_REG PORTC ' Hpwm 2 pin порт
DEFINE CCP2_BIT 1 ' Hpwm 2 pin бит
DEFINE CHAR_PACING 1000 ' Serout, межсимвольная задержка, мкс
DEFINE DEBUG_REG PORTB ' Debug pin порт
DEFINE DEBUG_BIT 0 ' Debug pin бит
DEFINE DEBUG_BAUD 2400 ' Debug скорость обмена
DEFINE DEBUG_MODE 1 ' Debug режим: 0=Прямой, 1=Инвертированный
DEFINE DEBUG_PACING 1000 ' Debug межсимвольная задержка
DEFINE DEBUGIN_REG PORTB ' Debugin pin порт
DEFINE DEBUGIN_BIT 0 ' Debugin pin бит
DEFINE DEBUGIN_MODE 1 ' Debugin режим: 0=Прямой, 1=Инвертированный
DEFINE HPWM2_TIMER 1 ' Hpwm 2 выбор таймера
DEFINE HPWM3_TIMER 1 ' Hpwm 3 выбор таймера
DEFINE HSER_BAUD 2400 ' Hser скорость обмена
DEFINE HSER_SPBRG 25 ' Hser spbrg исходный
DEFINE HSER_RCSTA 90h ' Hser стстус приемника исходный
DEFINE HSER_TXSTA 20h ' Hser статус передатчика исходный
DEFINE HSER_EVEN 1 ' использовать только если нужна четность
DEFINE HSER_ODD 1 ' использовать только если нужна нечетность
DEFINE HSER_CLROERR 1 ' Автоматич очистка ошибки переполнения Hserin
DEFINE HSER_PORT 1 ' порт для нескольких устройств
DEFINE I2C_HOLD 1 ' Пауза передачи по I2C, пока синхросигнал = 0
DEFINE I2C_INTERNAL 1 ' Использ для внутренней EEPROM на 16CExxx и
12CExxx
DEFINE I2C_SCLOUT 1 ' Биполярный синхросигнал вместо открытого
коллектора (для асинхр. обмена)
DEFINE I2C_SLOW 1 ' Использ для >8MHz OSC для устройств стандартной
скорости
DEFINE I2C_SCL PORTA,1 ' Только для 12-битных
DEFINE I2C_SDA PORTA,0 ' Только для 12-битных
DEFINE LCD_DREG PORTA ' LCD порт данных
DEFINE LCD_DBIT 0 ' LCD стартовый бит 0 или 4
DEFINE LCD_RSREG PORTA ' LCD порт выбора регистра
DEFINE LCD_RSBIT 4 ' LCD бит выбора регистра
DEFINE LCD_EREG PORTB ' LCD порт включения
DEFINE LCD_EBIT 3 ' LCD бит включения
DEFINE LCD_RWREG PORTE ' LCD порт чтения/записи
DEFINE LCD_RWBIT 2 ' LCD бит чтения/записи
DEFINE LCD_BITS 4 ' LCD ширина шины 4 или 8 бит
DEFINE LCD_LINES 2 ' кол-во строк на LCD
DEFINE LCD_COMMANDUS 2000 ' время задержки комманд, мкс
DEFINE LCD_DATAUS 50 ' время задержки данных, мкс
DEFINE LOADER_USED 1 ' Использовать загрузчик
DEFINE NO_CLRWDT 1 ' Не вставлять CLRWDT
DEFINE OSC 4 ' Скорость генератора, MHz: 3(3.58) 4 8 10 12 16
20 24 25 32 33 40
DEFINE OSCCAL_1K 1 ' Установка OSCCAL для 12C671/12CE673
DEFINE OSCCAL_2K 1 ' Установка OSCCAL для 12C672/12CE674
DEFINE PULSIN_MAX 65535 ' Максимум счетчика Pulsin/ Rctime
DEFINE SER2_BITS 8 ' Кол-во бит данных для Serin2 и Serout2
DEFINE SER2_ODD 1 ' Установить нечетность для Serin2 и Serout2
DEFINE SHIFT_PAUSEUS 50 ' Замедлить синхросигнал Shiftin и Shiftout
PicBasic Pro Compiler - 110 -

DEFINE USE_LFSR 1 ' Использ 18Xxxx LFSR инструкции


DEFINE XINXLAT_OFF 1 ' Не переводить команды Xin в формат BS2
DEFINE XOUTXLAT_OFF 1 ' Не переводить команды Xout в формат BS2
Приложение C

Зарезервированные Слова

ABS CALL I2CREAD ISBIN9 PEEK SDEC4


ADCIN CASE I2CWRITE ISBIN10 PEEKCODE SDEC5
AND CLEAR IBIN ISBIN11 POKE SELECT
ANDNOT CLEARWDT IBIN1 ISBIN12 POKECODE SERIN
ASM CON IBIN2 ISBIN13 POLLIN SERIN2
AUXIO COS IBIN3 ISBIN14 POLLMODE SEROUT
BANK0 COUNT IBIN4 ISBIN15 POLLOUT SEROUT2
BANK1 DATA IBIN5 ISBIN16 POLLRUN SHEX
BANK2 DCD IBIN6 ISDEC POLLWAIT SHEX1
BANK3 DEBUG IBIN7 ISDEC1 POT SHEX2
BANK4 DEBUGIN IBIN8 ISDEC2 PULSIN SHEX3
BANK5 DEC IBIN9 ISDEC3 PULSOUT SHEX4
BANK6 DEC1 IBIN10 ISDEC4 PUT SHEX5
BANK7 DEC2 IBIN11 ISDEC5 PWM SHIFTIN
BANK8 DEC3 IBIN12 ISHEX RANDOM SHIFTOUT
BANK9 DEC4 IBIN13 ISHEX1 RCTIME SIN
BANK10 DEC5 IBIN14 ISHEX2 READ SKIP
BANK11 DEFINE IBIN15 ISHEX3 READCODE SLEEP
BANK12 DIG IBIN16 ISHEX4 REM SOUND
BANK13 DISABLE IDEC ISHEX5 REP SQR
BANK14 DIV32 IDEC1 LCDIN RESUME STEP
BANK15 DTMFOUT IDEC2 LCDOUT RETURN STOP
BANKA EEPROM IDEC3 LET REV STR
BIN ELSE IDEC4 LIBRARY REVERSE SWAP
BIN1 ENABLE IDEC5 LOOKDOWN SBIN SYMBOL
BIN2 END IF LOOKDOWN2 SBIN1 SYSTEM
BIN3 ENDASM IHEX LOOKUP SBIN2 THEN
BIN4 ENDIF IHEX1 LOOKUP2 SBIN3 TO
BIN5 ERASECODE IHEX2 LOW SBIN4 TOGGLE
BIN6 EXT IHEX3 MAX SBIN5 USBIN
BIN7 FOR IHEX4 MIN SBIN6 USBINIT
BIN8 FREQOUT IHEX5 MOD SBIN7 USBOUT
BIN9 GET INCLUDE NAP SBIN8 VAR
BIN10 GOSUB INPUT NCD SBIN9 WAIT
BIN11 GOTO INTERRUPT NEXT SBIN10 WAITSTR
BIN12 HEX IS NOT SBIN11 WEND
BIN13 HEX1 ISBIN OFF SBIN12 WHILE
BIN14 HEX2 ISBIN1 ON SBIN13 WORD
BIN15 HEX3 ISBIN2 OR SBIN14 WRITE
BIN16 HEX4 ISBIN3 ORNOT SBIN15 WRITECODE
BIT HEX5 ISBIN4 OUTPUT SBIN16 XIN
BRANCH HIGH ISBIN5 OWIN SDEC XOR
BRANCHL HPWM ISBIN6 OWOUT SDEC1 XORNOT
BUTTON HSERIN ISBIN7 PAUSE SDEC2 XOUT
BYTE HSEROUT ISBIN8 PAUSEUS SDEC3
PicBasic Pro Compiler - 111 -

Приложение D
Управляющие коды ASCII
---------------------------------------------
Dec Hex ASCII Function Key
---------------------------------------------
0 0 NUL (null) Ctrl-@
1 1 SOH (start of heading) Ctrl-A
2 2 STX (start of text) Ctrl-B
3 3 ETX (end of text) Ctrl-C
4 4 EOT (end of transmission) Ctrl-D
5 5 ENQ (enquiry) Ctrl-E
6 6 ACK (acknowledge) Ctrl-F
7 7 BEL (bell) Ctrl-G
8 8 BS (backspace) Ctrl-H
9 9 HT (horizontal tab) Ctrl-I
10 A LF (line feed) Ctrl-J
11 B VT (vertical tab) Ctrl-K
12 C FF (form feed) Ctrl-L
13 D CR (carriage return) Ctrl-M
14 E SO (shift out) Ctrl-N
15 F SI (shift in) Ctrl-O
16 10 DLE (data link escape) Ctrl-P
17 11 DC1 (device control 1) Ctrl-Q
18 12 DC2 (device control 2) Ctrl-R
19 13 DC3 (device control 3) Ctrl-S
20 14 DC4 (device control 4) Ctrl-T
21 15 NAK (negative acknowledge) Ctrl-U
22 16 SYN (synchronous idle) Ctrl-V
23 17 ETB (end of trans. block) Ctrl-W
24 18 CAN (cancel) Ctrl-X
25 19 EM (end of medium) Ctrl-Y
26 1A SUB (substitute) Ctrl-Z
27 1B ESC (escape) Ctrl-[
28 1C FS (file separator) Ctrl-\
29 1D GS (group separator) Ctrl-]
30 1E RS (record separator) Ctrl-^
31 1F US (unit separator) Ctrl-_

Стандартные коды ASCII


---+---+----┬---+---+----┬---+---+----
Dec Hex Key │Dec Hex Key │Dec Hex Key
---+---+----┴---+---+----┴---+---+----
32 20 Spc 64 40 @ 96 60 `
33 21 ! 65 41 A 97 61 a
34 22 " 66 42 B 98 62 b
35 23 # 67 43 C 99 63 c
36 24 $ 68 44 D 100 64 d
37 25 % 69 45 E 101 65 e
38 26 & 70 46 F 102 66 f
39 27 ' 71 47 G 103 67 g
40 28 ( 72 48 H 104 68 h
41 29 ) 73 49 I 105 69 i
42 2A * 74 4A J 106 6A j
43 2B + 75 4B K 107 6B k
44 2C , 76 4C L 108 6C l
45 2D - 77 4D M 109 6D m
46 2E . 78 4E N 110 6E n
47 2F / 79 4F O 111 6F o
48 30 0 80 50 P 112 70 p
49 31 1 81 51 Q 113 71 q
PicBasic Pro Compiler - 112 -

50 32 2 82 52 R 114 72 r
51 33 3 83 53 S 115 73 s
52 34 4 84 54 T 116 74 t
53 35 5 85 55 U 117 75 u
54 36 6 86 56 V 118 76 v
55 37 7 87 57 W 119 77 w
56 38 8 88 58 X 120 78 x
57 39 9 89 59 Y 121 79 y
58 3A : 90 5A Z 122 7A z
59 3B ; 91 5B [ 123 7B {
60 3C < 92 5C \ 124 7C |
61 3D = 93 5D ] 125 7D }
62 3E > 94 5E ^ 126 7E ~
63 3F ? 95 5F _ 127 7F DEL
--------------------------------------

Приложение E

Инструкции Ассемблера Microchip


-------------------------------
ADDLW** k
ADDWF f, d
ANDLW k
ANDWF f, d
BCF f, b
BSF f, b
BTFSC f, b
BTFSS f, b
CALL k
CLRF f
CLRW
CLRWDT
COMF f, d
DECF f, d
DECFSZ f, d
GOTO k
INCF f, d
INCFSZ f, d
IORLW k
IORWF f, d
MOVF f, d
MOVLW k
MOVWF f
NOP
OPTION*
RETFIE**
RETLW k
RETURN**
RLF f, d
RRF f, d
SLEEP
SUBLW** k
SUBWF f, d
SWAPF f, d
TRIS*
XORLW k
XORWF f, d

b - bit address
d - destination: 0=w, 1=f
f - register file address
PicBasic Pro Compiler - 113 -

k - literal constant
* 12-bit core only
** 14-bit core only
-------------------------------
Приложение F
Contact Information
Technical support and sales may be reached at:
microEngineering Labs, Inc.
Box 60039
Colorado Springs CO 80960-0039
(719) 520-5323
(719) 520-1867 fax
http://www.melabs.com
email:support@melabs.com

PICmicro MCU data sheets and literature may be obtained from:


Microchip Technology Inc.
2355 W. Chandler Blvd.
Chandler AZ 85224-6199
(480) 792-7200
(480) 792-7277 fax
http://www.microchip.com
email:literature@microchip.com

READ THE FOLLOWING TERMS AND CONDITIONS CAREFULLY


BEFORE OPENING THIS PACKAGE.
microEngineering Labs, Inc. ("the Company") is willing to license the
enclosed software to the purchaser of the software ("Licensee") only on
the condition that Licensee accepts all of the terms and conditions set
forth below. By opening this sealed package, Licensee is agreeing to
be bound by these terms and conditions.

Disclaimer of Liability
THE COMPANY DISCLAIMS ALL WARRANTIES, EXPRESS OR
IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE AND THE
IMPLIED WARRANTY OF MERCHANTABILITY. IN NO EVENT
SHALL THE COMPANY OR ITS EMPLOYEES, AGENTS, SUPPLIERS
OR CONTRACTORS BE LIABLE FOR ANY INCIDENTAL, INDIRECT,
SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR IN
CONNECTION WITH LICENSE GRANTED UNDER THIS
AGREEMENT, INCLUDING WITHOUT LIMITATION, LOST PROFITS,
DOWNTIME, GOODWILL, DAMAGE TO OR REPLACEMENT OF
EQUIPMENT OR PROPERTY, OR ANY COSTS FOR RECOVERING,
REPROGRAMMING OR REPRODUCING ANY DATA USED WITH
THE COMPANY'S PRODUCTS.

Software License
In consideration of Licensee's payment of the license fee, which is part
of the price Licensee paid for this product, and Licensee's agreement to
abide by the terms and conditions on this page, the Company grants
Licensee a nonexclusive right to use and display the copy of the
enclosed software on a single computer at a single location. Licensee
owns only the enclosed disk on which the software is recorded or fixed,
and the Company retains all right, title and ownership (including the
copyright) to the software recorded on the original disk copy and all
subsequent copies of the software. Licensee may not network the
software or otherwise use it on more than one computer terminal at the
same time. Copies may only be made for archival or backup purposes.
The enclosed software is licensed only to the Licensee and may not be
transferred to anyone else, nor may copies be given to anyone else.
Any violation of the terms and conditions of this software license shall
PicBasic Pro Compiler - 114 -

result in the immediate termination of the license.