Файл: Учимся программировать микроконтроллеры Pic на языке PicBasicPro (В.В. Хилинский, 2007).pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 17.06.2025

Просмотров: 1782

Скачиваний: 8

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

и данные размером в бит. Элемент - Item является одной или несколькими переменными или модификаторами, отделенными запятыми. Допустимыми модификаторами являются: STR, который служит для отправки байтового массива переменных и REP для того, чтобы отправить множество одинаковых значений. Модификаторы REP и STR не поддерживаются 12-разрядными микроконтроллерами из-за недостатка оперативной памяти.

Пример:

OWOUT PORTC. 0,1,[$cc,$be]

По этой команде посылается импульс сброса приемному устройству через вывод PORTC.0, а затем два байта $cc и $be.

Команда PAUSE.

Синтаксис:

PAUSE Period

Эта команда приостанавливает работу программы на время – Period. Параметр Period задается в миллисекундах. Значение периода – 16-разрядное число; таким образом задержки могут быть до 65 535 миллисекунд (немногим более, чем минута). В отличие от других функций задержки (NAP и SLEEP), PAUSE не переводит микроконтроллер в режим малого энергопотребления. Таким образом, в режиме PAUSE микроконтроллер потребляет больше мощности, но этот режим также намного более точен. Он работает с той же точностью, что и задающий генератор системы. По умолчанию команда PAUSE предполагает частоту задающего генератора 4 МГц. Если используется другой генератор, то необходимо компилятору PicBasicPro сообщить об этом в определении DEFINE.

Пример:

PAUSE 1000 ' Задержка на 1 сек

Команда PAUSEUS.

Синтаксис:

PAUSEUS Period

133

Эта команда аналогична команде PAUSE. Только параметр -Period задается в микросекундах. Значение периода – 16-разрядное число; таким образом задержки могут быть до 65 535 микросекунд. Поскольку команда PAUSEUS рассчитывается от времени цикла работы микроконтроллера, а время цикла, в свою очередь, зависит от частоты задающего генератора, то задержки меньшие, чем длительность такта, невозможны с оператором PAUSEUS. Чтобы получить более короткие задержки, используйте подпрограмму на ассемблере конструкции

ASM..ENDASM.

Таблица зависимости минимальных задержек от частоты задающего генератора Таблица 18

OSC

Минимальная задержка

МГц

мкс

3 (3.58)

20

4

24

8

12

10

8

12

7

16

5

20

3

25*

2

32*

2

33*

2

40**

2

*PIC17Cxxx and PIC18Cxxx only.

**PIC18Cxxx only.

По умолчанию оператор PAUSEUS предполагает частоту генератора 4 МГц. Если будет использован другой генератор, то необходимо сообщить об этом компилятору в переопределении DEFINE.

Пример:

PAUSEUS 1000 ' Задержка в 1 миллисекунду

134


Команда PEEK.

Синтаксис:

PEEK Address,Var

Команда PEEK считывает регистр микроконтроллера по указанному адресу - Address и сохраняет результат в переменной - Var. Специальные особенности PIC микроконтроллеров, типа АЦП и дополнительных портов ввода - вывода могут быть прочитаны командой PEEK. Однако, ко всем регистрам PICмикроконтроллеров можно и нужно получать доступ, не пользуясь командами PEEK и POKE. Все регистраторы PIC-микроконтроллеров можно считать как 8- разрядные переменные и использовать их в программах PicBasic Pro, как и любую переменную, размером в байт.

Команда PEEKCODE.

Синтаксис:

PEEKCODE Address,Var

Эта команда считывает значение из памяти программ по указанному адресу – Address и результат сохраняет в переменной - Var .

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

Пример:

PEEKCODE $3ff, OSCCAL ‘Установить значение OSCCAL для

PIC12C671/12CE673

PEEKCODE $7ff, OSCCAL ‘Установить значение OSCCAL для

PIC12C672/12CE674

Команда POKE.

Синтаксис:

POKE Address,Value

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

135

PEEK PORTB, B0

Однако рекомендуется команды PEEK и POKE не использовать. Намного проще просто записать:

B0 = PORTB

Команда POKECODE.

Синтаксис:

POKECODE Value{,Value...}

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

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

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

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

Пример:

POKECODE 10, 20, 30 ‘Сохранить значения 10, 20, и 30 в памяти ‘ программ

Generates: retlw 10 retlw 20 retlw 30

@

org 7ffh ‘ Установить стартовый адрес программы $7ff

POKECODE $94

‘Установить значения OSCCAL для

PIC12C672/12CE674

Generates:

org

7ffh

retlw

94h

Команда POT.

Синтаксис:

POT Pin,Scale,Var

136


По этой команде встроенный конденсатор, заряженный до напряжения питания, подключается к указанному выводу - Pin и разряжается через измеряемый потенциометр (см. рис. 36). Вывод этот может быть константой, значения которой лежат в пределах от 0 и до 15, или переменной, значения которой могут меняться от 0 и до 15 (например, B0), или названием вывода (например, PORTA.0). Величина сопротивления определяет время разряда конденсатора, которое микроконтроллер измеряет и которое является мерой измеряемого сопротивления (обычно от 5 кОм до 50 кОм). Параметр – Scale (масштаб) используется для корректировки RC-констант. Для больших RC-констант масштаб должен быть установлен в минимальное значение (1). Для малых RC констант масштаб должен быть установлен в его максимальное значение (255). Если масштаб установлен правильно, то для минимального сопротивления величина переменной Var должна быть около нуля и близко к 255 при максимальных сопротивлениях.

Рис. 36. Схема подключения потенциометра к микроконтроллру.

К сожалению, параметр Scale должен быть определен экспериментально. Чтобы сделать это, установите используемый в Вашей схеме потенциометр на максимальное значение сопротивления. Установити в тексте программы значение масштаба – 127 и прочитайте значение потенциала. Затем, корректируя каждый раз, значение масштаба добейтесь того, чтобы командой POT было возвращено значение - 254. Если будет равно 255, уменьшите масштаб. Если 253 или ниже, увеличьте масштаб.

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

B0 Var

Byte

scale Var Byte

To 255

For scale = 1

POT 0,

scale,

B0

If (B0

> 253)

Then calibrated

Next scale

Serout

2,0,["

Increase R or C.", 10,13]

Stop

137


calibrated:

Serout 2,0,[" Scale= ",# scale, 10,13]

Команда PULSIN.

Синтаксис:

PULSIN Pin,State,Var

Эта команда измеряет длительность импульса на выводе - Pin. Если значение – State равно нулю, то измеряется длительность импульса, представляющего собой переход из 1 в 0 и обратно. Если же значение - State равно единице, то измеряется импульс перехода из состояния 0 в 1 и обратно. Измеренная величина помещается в переменную - Var. Если импульс, начавшись, не кончается, или длительность импульса слишком большая, значение переменной устанавливается на нуль. Если используется 8-битовая переменная, то сохраняется только младший байт 16разрядного измерения. Вывод может быть константой, значения которой лежат в пределах от 0 и до 15, или переменной, значения которой могут меняться от 0 и до 15 (например, B0), или названием вывода (например, PORTA.0). Разрешающая способность команды PULSIN зависит на частоты задающего генератора. Если используется генератор на 4 МГц, то минимальная длительность импульса, которая может быть измерена, это 10 мкс. Если же используется генератор на 20 МГц, то минимальная ширина импульса может быть 2 мкс. Определение значения OSC не имеет никакого эффекта для команды PULSIN. Разрешающая способность всегда определяется фактической скоростью генератора.

Пример:

'Измерить длительность положительного импульса на выводе Pin4 и сохранить результат в переменной W3

PULSIN PORTB.4,1,W3

Команда PULSOUT.

Синтаксис:

PULSOUT Pin,Period

Эта команда генерирует импульс на выводе - Pin указанной длительности - Period. Импульс создается при двухкратном изменением логического уровня вывода; начальное состояние контакта определяет полярность импульса. Контакт автоматически становится выходом. Вывод может быть константой, значения которой лежат в пределах от 0 и до 15, или переменной, значения которой могут меняться от 0 и до 15 (например, B0), или названием вывода (например, PORTA.0). Разрешающая способность команды PULSOUT зависит на частоты задающего генератора. Если будет использоваться генератор на 4 МГц, то минимальная длительность сгенерированного импульса будет 10 мкс. При частоте 20 МГц, минимальная длительность – 2 мкс. Определение значения OSC не

138


оказывает влияния на PULSOUT. Разрешающая способность всегда изменяется с фактической частотой генератора.

Пример:

' Пошлите импульс длительностью 1мсек ( 4 МГц) через вывод Pin5

PULSOUT PORTB.5,100

Команда PWM.

Синтаксис:

PWM Pin,Duty,Cycle

По этой команде генерируются модулированные по ширине импульсы на выводе - Pin. Генерируемый сигнал состоит из циклов. Каждый цикл PWM состоит из 256 тактов. Параметр -Duty определяет процент заполнения импульсами одного цикла, то есть 0 это 0 % а 255 это 100 %. Параметр - Cycle характеризует количество циклов в одной команде. Вывод - Pin может быть константой, значения которой лежат в пределах от 0 и до 15, или переменной, значения которой могут меняться от 0 и до 15 (например, B0), или названием вывода (например, PORTA.0). Время одного цикла команды PWM зависит от частоты задающего генератора. Если используется генератор на 4 МГц, то продолжительность цикла - 5 мс. Если же используется генератор на 20 МГц, то - 1 мс. Определение значения OSC не оказывает влияния на PWM. Время цикла всегда изменяется в зависимости от фактической частоты задающего генератора. Вывод, который определен в команде, автоматически становится выходом. После завершения команды его состояние возвращается в исходное. Для улучшения формы выходного PWM сигнала желательно использовать фильтр, составленный из R и C элементов. На рисунке 37 представлена возможная схема такого фильтра.

Рис. 37. Схема фильтра предназначенного для выделения гармонической составляющей сигнала создаваемого командой PWM.

Пример:

PWM PORTB.7,127,100 ' Сгенерировать на выводе Pin7 режим 50%-ного заполнения сигнала PWM в 100 циклов

139

Команда RANDOM.

Синтаксис:

RANDOM Var

Эта команда генерирует псевдослучайное число и присваивает его переменной

- Var.

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

Команда RANDOM использует алгоритм, в результате работы которого генерируется различные значения от минимальных до максимальных. Максимальное значение может быть 65535. И только ноль не генерируется.

Пример:

RANDOM W4 'Сгенерировать случайное число и записать его в переменную W4

Команда RCTIME.

Синтаксис:

RCTIME Pin,State,Var

Команда RCTIME измеряет время, пока вывод - Pin остается в указанном состоянии (State) и измеренное значение присваивает переменной - Var . Это похоже на половину функции - PULSIN. Вывод может быть константой, значения которой лежат в пределах от 0 и до 15, или переменной, значения которой могут меняться от 0 и до 15 (например, B0), или названием вывода (например, PORTA.0). Команда RCTIME может использоваться для того, чтобы считывать с измеряемого потенциометра (или другого устройства, имеющего сопротивление) время спада напряжения на подключенной емкости. Разрешающая способность RCTIME зависит на частоты генератора. Если используется генератор на 4 МГц, время нахождения в указанном состоянии измеряется с точностью до 10 мкс. Если же будет использоваться генератор на 20 МГц, то дискретность измерения станет равной 2 мкс. Определение значения OSC командой-переопределением DEFINE не оказывает влияния на команду RCTIME. Разрешающая способность измерения всегда изменяется в зависимости от фактической частоты генератора. Если на выводе Pin логическое состояние остается неизменным, значение переменной возвращается в 0.

Пример:

LOW PORTB.3 ' Для начала разрядим потенциал на контакте PORTB.3 PAUSE 10 ' Выдержим паузу в 10мсек

RCTIME PORTB.3,0,W0 ' считаем потенциометр на Pin3

140