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

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

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

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

Добавлен: 17.06.2025

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

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

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

Параметр BVar является байтовой переменной. Эту переменную желательно установить вначале программы в 0.

Параметр Action – однобитовая переменная либо константа. Установкой этого параметра в 0 либо в 1 мы можем регулировать то, как будет происходить реакция на нажатие клавиши.

Параметр Label - метка, на которую переходит программа, при соблюдении ряда условий.

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

В первом варианте, если параметр Action будет установлен в 0, команда BUTTON будет функционировать следующим образом. Когда программа доходит до команды BUTTON, производится анализ состояния вывода Pin. Если значение на выводе не совпадает со значением параметра DownState то программа переходит на метку Label и продолжается её дальнейшая работа. Если же значения этих двух параметров совпадут (кнопка нажата), то программа переходит на следующую строку, куда обычно записываются действия, которые программа должна выполнить в случае нажатия кнопки. Причем время выполнения команды BUTTON в этом случае будет занимать 50 мс. При этом в переменную BVar записывается значение Delay. Так как данная команда, по замыслу разработчика, должна работать в цикле то при каждом следующем обращении к команде BUTTON будет происходить декремент переменной BVar. Естественно, что это будет только тогда когда значение на выводе и значение DownState совпадают. При этом программа после команды BUTTON будет переходить на метку Label. Это будет продолжаться до тех пор, пока значение переменной BVar не станет равным 1. Если значение переменной BVar становится равной 1, то программа после команды BUTTON опять переходит на следующую строку на которой записано действие которое она должна выполнять когда кнопка нажата. Учитывая то что время выполнения одной команды BUTTON когда происходит декрементирование переменной BVar занимает 40 мкс на частоте 4 МГц (8 мкс на частоте 20 МГц), противодребезговая задержка на частоте 4 МГц будет равна 40*( Delay-1)[мкс] + 50[мс] (50 мс это то время когда команда BUTTON первый раз «столкнулась» с нажатой кнопкой). После этого при следующем обращении к команде BUTTON (при условии совпадения значений на выводе контакта Pin со значением параметра DownState) в переменную BVar будет записано значение параметра Rate. В следующем цикле при обращении к команде BUTTON будет происходить декремент переменной BVar (условие равенства значения на выводе Pin и значения DownState должно по-прежнему соблюдаться). При последующих обращениях к этой команде, пока значение переменной BVar будет > 1, программа будет продолжаться с метки Label. Когда же значение BVar станет вновь равным 1, программа продолжится со следующей строки, а в переменную BVar будет вновь записано значение Rate. Это и будет выполнением функции автоповтора. Из

93


сказанного ясно, что период времени между автоповторами будет равен 40*(Rate

– 1)[мкс] на частоте 4 МГц .

Пример:-

'Данная программа демонстрирует работу команды BUTTON. Каждая из 3

‘ кнопок переключает светодиод.

'Если Вы держите кнопку в течение 1 секунды, то светодиод будет моргать (автоповтор).

Device 16F84A

XTAL = 4

Dim buf1 As Byte Dim buf2 As Byte Dim buf3 As Byte

Symbol sw1 = PORTb.0 Symbol sw2 = PORTb.1 Symbol sw3 = PORTb.2

Symbol led1 = PORTb.7 Symbol led2 = PORTb.6 Symbol led3 = PORTb.5 delayms 500

Clear

Low PORTB.5 low PORTB.6 LOW PORTB.7

chk1: delayus 25

'Переменная для 1 кнопки

'Переменная для 2 кнопки

'Переменная для 3 кнопки

'Ждем стабилизации PIC-контроллера

'Очищаем буферы

'Выключаем все светодиоды

Button sw1,0,40,5,buf1,0,chk2

' Проверяем кнопку 1 (Переходим

‘ на 2 если не нажато)

Toggle led1

' Переключаем 1 светодиод

chk2:

Button sw2,0,40,5,buf2,0,chk3

' Проверяем кнопку 2 (переходим

‘ на 3 если на нажата)

Toggle led2

' Переключаем 2 светодиод

chk3:

Button sw3,0,40,5,buf3,0,chk1

' Проверяем кнопку 3 (переходим

‘ на 1 если не нажата)

Toggle led3

' Переключаем 3 светодиод

GoTo chk1

' Возвращаемся на начало и так до

94


‘ бесконечности

Во втором варианте работы команды BUTTON приравняем значение параметра

Action к 1.

В этом случае при первом обращении к команде BUTTON когда переменная BVar равна 0, а значение на выводе Pin не совпадает со значением переменной DownState (кнопка не нажата), программа продолжает свою работу со следующей строки и переменная BVar не меняет своего значения. Если же мы нажимаем кнопку и программа «сталкивается» с командой BUTTON (значение на выводе Pin равно значению DownState), то в этом случае программа переходит на указанную метку и в переменную BVar записывается значение Delay. Если же продолжается удержание кнопки и программа циклически обращается к команде BUTTON, то, как и в первом варианте с каждым обращением к команде будет происходить декремент переменной BVar но программа будет переходить не на указанную метку, а на следующую строку. Это будет продолжаться так же, как и в варианте 1 до тех пор, пока переменная BVar не станет равной 1. После этого в неё будет записано значение Rate, а программа перейдет на метку. Дальнейшая работа команды BUTTON будет аналогична первому варианту, но только в тех случаях, где в ранее описанном варианте происходил переход на метку, в этом варианте программа будет работать со следующей строки. Когда же программа в предыдущем варианте переходила на следующую строку, здесь она будет переходить на указанную метку и наоборот, там, где программа переходила на метку, здесь она будет переходить на следующую строку.

Пример для случая, когда параметр Action равен 1:

'Данная программа демонстрирует работу команды BUTTON. Каждая из 3 ‘ кнопок переключает светодиод.

' Если Вы держите кнопку в течение 1 секунды, то светодиод будет моргать (автоповтор).

Device 16F84A XTAL = 4

Dim buf1 As Byte Dim buf2 As Byte Dim buf3 As Byte

Symbol sw1 = PORTb.0 Symbol sw2 = PORTb.1 Symbol sw3 = PORTb.2

Symbol led1 = PORTb.5 Symbol led2 = PORTb.6 Symbol led3 = PORTb.7 delayms 500

Clear

Low PORTb.5

'Рабочий буфер для 1 кнопки команды

'Рабочий буфер для 2 кнопки команды

'Рабочий буфер для 3 кнопки команды

'Ждем стабилизации PIC-контроллера

'Очищаем буферы

'Выключаем все светодиоды

95


low PORTB.6 LOW PORTB.7

Main: delayms 20

Button sw1,0,4,5,buf1,1,chk1 ' Проверяем кнопку 1 (Переходим на ‘ метку 1 если нажато)

Button sw2,0,40,5,buf2,1,chk2 ' Проверяем кнопку 2 (переходим ‘ наметку 2 если нажато)

Button sw3,0,40,5,buf3,1,chk3 ' Проверяем кнопку 3 (переходим ‘ наметку 1 если нажато)

GoTo Main

chk1:

Toggle led1

' Зажигаем светодиод если нажато

GoTo Main

chk2:

Toggle led2

' Зажигаем светодиод если нажато

GoTo Main

chk3:

Toggle led3

' Зажигаем светодиод если нажато

GoTo Main

' Возвращаемся на начало и так до

бесконечности

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

MyButton var PortB.0

LED var PortB.7

TRISB = %00000001

Loop:

If MyButton=0 then

Toggle LED

While MyButton=0:Pause 100:Wend endif

Goto Loop

End

96

Команда CALL.

Синтаксис:

CALL Label

По этой команде происходит переход на подпрограмму ассемблера, которая помечена меткой Label. Для того чтобы выполнить переход на подпрограмму PicBasicPro, обычно используется оператор GOSUB. Основное различие между операторами GOSUB и CALL состоит в том, что в операторе CALL, существование метки Label не проверено до времени ассемблирования. Использование команды CALL недоступно в PicBasic.

Пример:

CALL pass ' Выполните подпрограмму ассемблера, по метке _pass

Команда CLEAR.

Этот оператор обнуляет всю оперативную память. По команде CLEAR обнуляются все регистры оперативной памяти в каждом банке. При этом обнуляются все переменные, включая и внутренние системные переменные. Это не делается автоматически, когда начинается программа PicBasic Pro. Вообще говоря, переменные в начале программы должны быть установлены программой в соответствующее начальное состояние вместо того, чтобы использовать команду CLEAR.

Пример:

CLEAR ' установить все переменные в 0

Команда CLEARWDT.

Обнулить сторожевой таймер.

По этой команде происходит сброс сторожевого таймера, т.е. он устанавливается в 0. Понятно, что это препятствует ему выйти из режима сна.

Пример:

CLEARWDT ' сбросить сторожевой таймер

Команда COUNT.

Синтаксис:

COUNT Pin,Period,Var

97


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

Параметр Period измеряется в миллисекундах. И он зависит от частоты задающего генератора, которая определяется оператором DEFINE OSC.

Оператор COUNT проверяет состояние вывода Pin и считает переходы из низкого логического состояния в высокое. Для случая, когда частота задающего генератора равна 4 МГц, программа проверяет состояние контакта, каждые 20 мкс. При частоте в 20 МГц проверяет каждые 4 мкс. Отсюда ясно, что самая высокая частота, которая может быть измерена - это 25 кГц при кварце в 4 МГц и 125 кГц с кварцем на 20 МГц. При этом считается, что импульсы имеют форму меандра.

Пример:

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

COUNT PORTB.1, 100, W1

'Измерить частоту на выводе - pin

COUNT PORTA.2, 1000, W1 ' Сосчитать за 1 секунду

SEROUT PORTB.0, N2400, [W1]

Команда DATA.

Синтаксис:

{label} DATA {@Location,}Constant1{,Constant2...}

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

В качестве значений Constant могут быть как числовые, так и строковые константы. Если модификатор WORD не используется, то будет сохранен только самый младший байт числового значения. Строковые переменные сохраняются как последовательность байтовых значений в кодировке ASCII. Никакого признака длины или конца автоматически не добавляется.

Оператор DATA работает только с теми микроконтроллерами, у которых на кристалле присутствует EEPROM, типа PIC16F84 и PIC16C84. Естественно, что

98