Файл: Учимся программировать микроконтроллеры Pic на языке PicBasicPro (В.В. Хилинский, 2007).pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 17.06.2025
Просмотров: 1777
Скачиваний: 8
установки скорости на частоте 8 МГц и выше то добавьте в начале текста программы следующее определение:
DEFINE I2C_SLOW 1
В связи с тем, что размер памяти и стека у 12-разрядных микроконтроллеров ограничен, это DEFINE с этими микроконтроллерами ничего не изменяет. Поэтому для стандартных скоростей должны использоваться генераторы до 4 MHz. А для скоростей – 400 кГц должны использоваться генераторы выше 4 МГц.
Передача информации по шине I2C может быть приостановлена приемным устройством. Для этого надо установить вывод синхросигнала в низкое логическое состояние. Чтобы это разрешить добавьте в начале программы следующее определение:
DEFINE I2C_HOLD 1
Цепь синхронизации I2C и вывод данных должны быть подключены к выводу питания Vcc через подтягивающий резистор в 4.7 кОм, поскольку к этим выводам подключены устройства, которые работают двунаправленным способом с открытым коллектором (см. рисунок 40). Для того чтобы сделать вывод синхронизации I2C биполярным вместо вывода с открытым коллектором необходимо добавить в начале программы следующее определение:
DEFINE I2C_SCLOUT 1 addr VAR byte
cont CON %10100000
addr = 17 ' Установить адрес 17
' Считать данные по адресу 17 и записать их в переменную B2
I2CREAD PORTA.0,PORTA.1,cont,addr,[B2]
Для получения дополнительной информации об этих и других запоминающих устройствах, которые могут использоваться с командами I2CREAD и I2CWRITE, смотрите справочные материалы в “Non-Volatile Memory Products Data Book”.
Команда I2CWRITE.
Синтаксис:
I2CWRITE
DataPin,ClockPin,Control,{Address,}[Value{,Value...}]{,Labe l}
Команда I2CWRITE служит для записи информации во внешние устройства. Микроконтроллер по этой команде посылает через выводы DataPin и ClockPin
118
сигналы управления и выбора адреса. Контакты ClockPin и DataPin могут быть константами, значения которых лежат в пределах от 0 и до 15, или переменными, значения которых могут меняться от 0 и до 15 (например, B0) или названием вывода (например, PORTA.0). Размер адреса (байт или слово) определяется размером переменной, которая используется для этого. Вы должны контролировать, что правильно определили размер переменной в зависимости от устройства, с которым Вы желаете общаться. Для этих целей нельзя использовать константы.
Только для 12-разрядных PIC-микроконтроллеров при работе по протоколу I2C, вначале основного текста программы необходимо указать выводы данных и синхронизации с помощью соответствующих DEFINE. И хотя указания на эти выводы должны присутствовать в команде I2CWRITE, но компилятор эту информацию игнорирует.
DEFINE I2C_SCL PORTA,1 ' Только для 12-разрядных микроконтроллеров DEFINE I2C_SDA PORTA,0 ' Только для 12-разрядных микроконтроллеров
При записи в последовательную EEPROM необходимо подождать 10 мс прежде, чем вновь обращаться к немй. Если Вы попытаетесь использовать команды I2CREAD или I2CWRITE прежде, чем пройдет указанный промежуток времени (запись еще полностью не закончена), то доступ будет игнорироваться. Обычно для записи 1 байта информации используется одна команда I2CWRITE. После чего идет время ожидания конца записи. При попытке записать несколько байтов информации может быть нарушено вышеупомянутое требование выбора времени для последовательного СППЗУ. Некоторые же последовательные EEPROM разрешают записывать множество байтов в отдельную страницу но затем все равно сделать необходимую паузу. Для уточнения этих деталей смотрите справочные листы данных для выбранных устройств. Возможность многократной побайтовой записи может быть полезной с устройствами, работающими с шиной I2C, кроме последовательных СППЗУ, которые не допускают пауз между циклами записи. Если информационное значение определено размером в слово, то посылаются 2 байта. Вначале старший байт, а затем младший. Этот порядок отличен от того, как обычно сохраняются переменные, то есть, сначала сохраняется младший байт а затем стпрший.
Перед именем переменной может быть включен модификатор STR. Это может потребоваться для того, чтобы записать массив строковых переменных в последовательную EEPROM в постраничном режиме. Данные должны вписаться в отдельную страницу SEEPROM. Размер страницы зависит от специфического устройства SEEPROM. Если присутствует модификатор STR, то следующим должно быть имя переменной (размером в слово или байт), а затем наклонная черта влево (\) и количество записываемых значений:
a VAR byte[8]
I2CWRITE PORTC.4,PORTC.3,$a0,0,[STR a\8]
119
Если множество переменных определено размером в слово, то сначала записывается младший байт. Это - противоположно тому, как обычно записываются простые слова, и совместимо со способом, которым компилятор обычно сохраняет переменные размером в слово. Если в команде будет включена дополнительная метка -Label, то программа перейдет на эту метка, если не будет получено подтверждение от устройства I2C.
Выбор времени для команд I2C установлен так, что стандартные установки скорости (100 КГц) будут доступны для тактовых частот до 8 МГц. В режиме быстрых устройств (400 кГц) могут использоваться до 20 МГц. Если Вы желаете получить доступ к стандартному устройству скорости для вышеупомянутой 8 МГц, то в начале программы должно быть добавлено следующее определение:
DEFINE I2C_SLOW 1
Передача по шине I2C может быть приостановлена ведомым устройством. Для этого необходимо установить низкий логический уровень в цепи синхронизации (это не поддерживается 12-разрядными микроконтроллерами). Чтобы это разрешить надо добавить в начале программы следующую строку:
DEFINE I2C_HOLD 1
Чтобы сделать цепь синхронизации шины I2C биполярной, вместо цепи с открытым коллектором, введите в начале Вашей программы следующее определение:
DEFINE I2C_SCLOUT 1
Пример: |
|
addr VAR |
byte |
cont CON |
%10100000 |
addr = 17 |
' Установить адрес 17 |
' Послать 6 байтов начиная с адреса 17 |
|
I2CWRITE |
PORTA.0,PORTA.1,cont,addr,[6] |
PAUSE 10 |
' Ждем 10 мс пока запишется |
addr = 1 |
' Устанавливаем адрес 1 |
' Отправим байт в B2 по адресу 1 |
|
I2CWRITE |
PORTA.0,PORTA.1,cont,addr,[B2] |
PAUSE 10 |
' Ждем 10 мс пока запишется |
120
Команда IF...THEN.
Синтаксис:
IF Comp {AND/OR Comp...} THEN
Statements...
ELSE
Statements...
ENDIF
Этот оператор выполняет одно или несколько сравнений. Каждый элемент набора может связывать переменную с константой или другой переменной и включает один из операторов сравнения. Выражение If..Then производит сравнение и оценивает истинно оно или ложно. Если оно оценено как истинное, то выполняется операция, стоящая после слова Then. Если же оно оценено как ложное, то операция, стоящая после Then не выполняется. Сравнения, в результате которых получается 0, считаются ложными. Любое другое значение считается истинным. Все аргументы сравнения должны быть без знака. Используйте круглые скобки для того чтобы определить порядок, в котором должны выполняться операции сравнения.
Оператор 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
Команда INPUT.
Синтаксис:
INPUT Pin
Эта команда делает указанный контакт входом. Контакт может быть константой, значения которой лежат в пределах от 0 и до 15, или переменной, значения которой могут меняться от 0 и до 15 (например, B0) или названием вывода (например, PORTA.0).
Пример:
121
INPUT 0 ' Сделать Pin0 входом
INPUT PORTA.0 ' Сделать pin 0 PORTA, входом
Однако, любой вывод можно сделать входом намного более быстрым и более коротким способом (с точки зрения сгенерированной программы) это:
TRISB.0 = 1 ' Установить pin 0 PORTB, в состояние входа
Все выводы порта можно сделать входами, если записать 1 сразу в весь регистр
TRIS:
TRISB = %11111111 ' Установить все выводы PORTB в состояние входа
Команда LET.
Синтаксис:
{LET} Var = Value
Команда LET помещает значение выражения в переменную. Выражение может быть константой, переменной или значением некоторого другого выражения. Обычно, дополнительное управляющее слово LET исключается.
Пример:
LET B0 = B1 * B2 + B3
B0 = SQR W1
Во втором выражении управляющее слово LET – опущено.
Команда LCDIN.
Синтаксис:
LCDIN {Address,}[Var{,Var...}]
Эта команда считывает данные из ОЗУ ЖК-монитора по указанному адресу – Address и считанные значения сохраняет в переменной - Var.
ЖК мониторы имеют встроенное ОЗУ, которое используется для хранения выводимых знаков. Большинство ЖК мониторов имеет большое доступное ОЗУ, которое является необходимым для визуализируемой области. Данные в это ОЗУ могут быть записаны, используя команду LCDOUT. Команда же LCDIN позволяет считывать эту информацию из ОЗУ.
Знакогенератор ОЗУ работает с адресами от $40 до $7f. Стартовый адрес данных ОЗУ дисплея начинается с адреса $80. Смотрите справочные листы
122
данных для определенного типа ЖК монитора относительно его функций и адресов.
Для работы этой команды необходимо соединить цепь чтение/запись (R/W) ЖК монитора с соответствующим выводом PIC контроллера. Состояние ее, 0 или 1, определяет, то какая команда в данный момент используется – чтения (LCDIN) или записи (LCDOUT). А в начале программы записать два DEFINE указывающие на адрес вывода:
DEFINE LCD_RWREG PORTE ' Подключить цепь R/W ЖК монитора к
PORTE
DEFINE LCD_RWBIT 2 ' Подключить цепь R/W ЖК монитора к выводу 2
Команда LCDOUT.
Синтаксис:
LCDOUT Item {,Item...}
Эта команда выводит информацию на экран алфавитно-цифрового ЖК монитора. Компилятор PicBasicPro поддерживает модули ЖК мониторов с контроллерами типа Hitachi 44780 или эквивалентными ему. Эти мониторы обычно имеют 14 или 16 контактов - или двухрядный разъем.
Если элементу предшествует признак (#), то это значит, что на ЖК монитор посылается ASCII код (это утверждение справедливо для всех микроконтроллеров кроме 12-разрядных). С командой LCDOUT может также использоваться любой из модификаторов, используемых с командой SEROUT2 (см. таблицу 11).
Может потребоваться относительно длительное время для запуска ЖК монитора после включения питания. Поэтому программа должна выждать, по крайней мере, 0.5 секунды перед посылкой первой команды на ЖК монитор. В таблице 15 перечислены некоторые полезные команды, в которых присутствует код $FE.
Таблица 15 |
|||
Команда |
Операция |
||
$FE, 1 |
Очистить дисплей |
||
$FE, 2 |
Вернутся домой (идти на первую строку и первое знакоместо) |
||
$FE, $0C |
Выключить курсор |
||
$FE, $0E |
Курсор в форме подчеркивания |
||
$FE, $0F |
Включить мигающий курсор |
||
$FE, $10 |
Сдвинуть курсор влево на одну позицию |
||
$FE, $14 |
Сдвинуть курсор вправо на одну позицию |
||
$FE, $C0 |
Переместить курсор на начало второй строки |
||
123
$FE, $94 Переместить курсор на начало третьей строки $FE, $D4 Переместить курсор на начало четвертой строки
Замечание. Для большинства ЖК мониторов отображаемые знакоместа и строки размещены не последовательно в памяти дисплея. Поэтому может быть промежуток между знакоместами. Большинство мониторов имеют формат экрана 16x2, и первая строка начинается со значения $0, а вторая строка со значения $40. Поэтому команда:
LCDOUT $FE, $C0
Сообщает монитору, что показ знаков надо начинать с начала второй строки. В мониторах с форматом экрана 16x1 знакомест обычно форматируются как 8x2 знакоместа с промежутком в памяти между первыми и вторыми 8 знаками.
Экраны с 4 строками также имеют перепутанную карту памяти. Поэтому смотрите справочные листы данных для каждого конкретного ЖК монитора относительно расположения в памяти знаков и дополнительных команд.
Пример:
LCDOUT $FE, 1, "Hello" ' Очистить экран и вывести “Hello”
LCDOUT B0, #B1
ЖК монитор может быть связан с PIC микроконтроллером с использованием 4 или 8-разрядной шины. Если используется 8-разрядная шина, то все 8 цепей должны быть подключены к одному порту. Если же используется 4-разряднаяя шина, то она должна быть связана или со старшими или с младшими 4 разрядами одного порта. Цепи Enable (E) и Select Register (SR) могут быть связаны с контактами любого порта. Цепь R/W должна быть подключена к цепи “земля”, поскольку команда LCDOUT работает только на запись в ЖК монитор. Вообще в PicBasicPro, если не указано иначе, ЖК монитор подключается к микроконтроллеру к определенным контактам. Это означает, что, если ЖК монитор будет соединен 4-разрядной шиной, то цепи данных DB4 - DB7,
подключаются к контактам PORTA.0 - PORTA.3, Select Register к PORTA.4, а Enable к PORTB.3. Чтобы изменять эти установки, необходимо поместить в начале программы следующие переопределения:
'Определим порт данных
DEFINE LCD_DREG PORTB
'Установим, стартовый информационный разряд (0 или 4), если 4-разрядная шина
DEFINE LCD_DBIT 4
'Установим порт к которому подключается цепь Register Select
DEFINE LCD_RSREG PORTB
124
'Установим разряд порта к которому подключается цепь Register Select
DEFINE LCD_RSBIT 1
'Установим порт к которому подключается цепь Enable
DEFINE LCD_EREG PORTB
'Установим разряд порта к которому подключается цепь Enable
DEFINE LCD_EBIT 0
'Установим тип шины (4 или 8 разрядов)
DEFINE LCD_BITS 4
‘Установим тип LCD (количество строк на экране)
DEFINE LCD_LINES 2
'Установить команду задержки в мкс
DEFINE LCD_COMMANDUS 2000
'Установить время задержки данных в мкс
DEFINE LCD_DATAUS 50
Эти установки сообщат PicBasicPro, что используется ЖК монитор с 2 строками, связанный 4-разрядной шиной данных подключенной к старшим 4
разрядам PORTB, цепь Select Register подключена к PORTB.1, а цепь Enable к PORTB.0 (см. рисунок 35).
Рис. 35. Вариант схемы подключения алфавитно-цифрового ЖКИ к PIC16F84 с использованием 4-проводной шины.
Команда LOOKDOWN.
Синтаксис: |
|
LOOKDOWN Search,[Constant{,Constant... |
}],Var |
125