Команды и директивы компилятора PROTON
ORead
Синтаксис:
ORead Pin , Mode , [ Inputdata ]
По команде ORead производится считывание данных с устройств, связанных с микроконтроллером по так называемому ”однопроводному интерфейсу”, получившему название 1-Wire протокол.
Устройства 1-Wire выпускает фирма Dallas Semiconductor. Этот интерфейс является одной из форм асинхронной последовательной передачи данных. Для обмена данными по интерфейсу 1-Wire требуется только один вывод микроконтроллера, к которому может быть параллельно подключено сразу несколько 1-Wire устройств.
Pin - используемый вывод одного из портов микроконтроллера. Во время действия команды ORead этот вывод будет переключаться в режимы вывода и ввода данных, а в конце действия команды он переводится в состояние входа. Обычно этот вывод обозначается DQ.
Mode - числовая константа от 0 до 7, сообщающая компилятору информацию о выбранном режиме приема данных (см. примечание 1 ниже).
Inputdata - список переменных или массив для хранения входящих данных.
Пример 1
Dim RESULT As Byte | ' Создать переменную RESULT типа Byte |
Symbol DQ = PORTA.0 | ' Создать псевдоним DQ для PORTA.0 |
ORead DQ, 1 , [ RESULT ] | ' Получить данные по 1-Wire протоколу и поместить их в переменную ' RESULT |
В примере 1 микроконтроллер через PORTA.0 передает команду "Сброс" 1-Wire устройству, соединенному с ним по ”однопроводному интерфейсу”, а затем, после получения ответного сигнала "присутствия" от 1-Wire устройства, микроконтроллер принимает один байт и сохраняет его в переменной RESULT.
Примечание 1
Параметр Mode используется для того, чтобы переключить команду на работу в один из режимов обмена данными с 1-Wire устройствами фирмы Dallas Semiconductor. В таблицe, расположенной ниже, приведён список возможных режимов параметра Mode.
Номер режима | Действие |
0 |
' Нет сигнала "Сброс". Режим Byte |
1 |
' Сигнал "Сброс" перед данными. Режим Byte |
2 |
Сигнал "Сброс" после данных. Режим Byte |
3 |
' Сигнал "Сброс" до и после данных. Режим Byte |
4 |
' Нет сигнала "Сброс". Режим Bit |
5 |
' Сигнал "Сброс" перед данными. Режим Bit |
6 |
' Сигнал "Сброс" после данных. Режим Bit |
7 |
'Сигнал "Сброс" до и после данных. Режим Bit |
Режимы с номерами с 0 по 3 позволяют оперировать данными типа Byte, а с номерами с 4 по 7 - с данными типа Bit.
Выбор номера режима зависит от устройства подключенного к микроконтроллеру по интерфейсу 1-Wire, и прикладных требований. Поэтому для уточнения всех вариантов читайте справочные данные на подключаемое устройство.
Во многих случаях, при использовании команды ORead, необходимо устанавливать такой режим, при котором не должен формироваться сигнал "Сброс", так как, в общем случае, этот сигнал должен быть сформирован от транзакции, уже начатой командой OWrite, или быть сформирован после получения данных. В этих случаях используются режимы 0 или 4.
При использовании битовых режимов передачи данных, все переменные в параметре InputData могут получать только по одному биту. Эту особенность можно использовать для того, чтобы выделить и записать каждый бит по отдельности в свою переменную. Например, программа приведеная в примере 2 может использоваться для того, чтобы получить два бита, используя один из битовых режимов:
Пример 2
Dim BITVAR1 As Bit | ' Создать переменную BITVAR1 типа Bit |
Dim BITVAR2 As Bit | ' Создать переменную BITVAR2 типа Bit |
ORead PORTA.0 , 6 , [ BITVAR1, BITVAR2 ] | ' Получить битовые данные и сохранить их в переменных ' BITVAR1 и BITVAR2 |
В примере 2 выбран режим 6, он устанавливает битовую передачу и наличие сигнала "Сброс" после приема данных.
Можно было бы пойти по другому пути и объявить пременные BitVarl и BitVar2 не битового, а байтового типов, соответственно использовать две команды ORead для каждой переменной, но, однако, они все равно получили бы лишь по одному биту в каждой команде ORead, так как был выбран битовый режим.
Использование модификатора Str
В команде ORead может использоваться модификатор Str, с помощью которого принимаемые данные будут сохраняться в массивы.
Модификатор Str используется для того, чтобы принять данные и поместить их непосредственно в переменную типа байтового массива.
Байтовый массив это множество, состоящее из нескольких байтов, которые в свою очередь упорядочены определенным образом. Каждый из элементов в множестве имеет один и тот же размер. Например, значения 1, 2, 3 должны быть сохранены в той последовательности с которой они поступили. Данные 1 2 3 будут сохранены в байтовом множестве, состоящем из трех элементов.
Ниже приведен пример 3, в котором осуществляется прием десяти байтов по однопроводному интерфейсу и сохранение их в 10-байтовом множестве, MYARRAY:
Пример 3
Dim MYARRAY[10] As Byte | ' Создать множество из 10 байтовых элементов. |
ORead DQ, 1 , [STR MYARRAY] | ' Прочитать данные и загрузить их в массив |
Print Dec Str MYARRAY | ' Вывести на экран значения. |
Если количество полученных элементов недостаточно, чтобы заполнить все множество, то после имени множества может быть помещен formatter, который позволит получить только то количество знаков, какое им было указано.
Пример 4 иллюстрирует, как заполнить только первые n байтов множества, и затем как показать только первые n байтов множества. Параметр n относится к значению, помещенному перед наклонной чертой.
Пример 4
Dim MYARRAY[10] As Byte | ' Создать множество из 10 байтовых элементов. |
ORead DQ, 1 , [STR MYARRAY \5] | ' Заполнить первые 5 байтов массива полученными данными. |
Print Str MYARRAY \5 | ' Вывести на экран значения 5 элементов. |
Программа oread1_ds18S20.bas, листинг которой приведен ниже, демонстрирует работу микроконтроллера с полупроводниковым термометром DS18S20 по однопроводному протоколу 1-Wire. Программа считывает значения графов Ремэйнинга и графов в десятичных градусах оC.
Листинг программы oread1_DS18S20.bas
Device 16F876A | ' Использовать микроконтроллер 16F876A |
Declare XTAL 4 | ' Использовать кварцевый генератор на 4 МГц |
' ----------------------------------------Настройки подключения ЖКИ----------------------------------------- | |
Declare LCD_Type ALPHA | ' Тип ЖКИ - буквенно-цифровой |
Declare LCD_DTPin PORTB.4 | ' Порт данных ЖКИ |
Declare LCD_ENPin PORTB.3 | ' Управление цепью E |
Declare LCD_RSPin PORTB.2 | ' Управление цепью RS |
Declare LCD_Interface 4 | ' 4-х битная разрядность шины данных |
Declare LCD_CommandUs 2000 | ' Задержка перед посылкой команды |
Declare LCD_DataUs 50 | ' Задержка перед посылкой данных |
Declare LCD_Lines 4 | ' Количество строк ЖКИ |
' -----------------------------------------------Настройки портов------------------------------------------------ | |
TRISB = %00000010 | ' Сделать RB1 входом |
' ---------------------------------------------Объявление переменных------------------------------------------- | |
Symbol DQ = PORTB.1 | ' Подключить DS18S20 к выводу PORTB.1 |
Dim Temp As Word | ' Переменная для хранения значения температуры |
Dim TempIND As Word | ' Переменная для вывода на индикацию значения ' температуры |
Dim C As Byte | ' Переменная для хранения дробной части результата |
Dim CPerD As Byte | ' Переменная для хранения значения на 1 градус C |
' -----------------------------------------------------Заставка---------------------------------------------------- | |
Cls | ' Очистить дисплей ЖКИ |
Print At 1, 1, "1-Wire - DS18S20" | ' Отобразить на жки надпись 1-Wire - DS18S20 |
' ------------------------------------------------Главная программа -------------------------------------------- | |
Again: | ' Метка начала гланой программы |
' --------------------------------------Подготовка DS18S20 к измерениям------------------------------------- | |
OWRite DQ, 1, [$CC, $44] | ' Послать датчику DS18S20 команду старта измерения ' температуры |
Repeat | ' Начать внутренний цикл |
DelayMS 25 | Пауза 25 мсек |
ORead DQ, 4, [C] | ' Ждать полного преобразования пока не придет сигнал окончания ' преобразования |
Until C <> 0 | ' Выйти из цикла если DS18S20 закончило преобразование. |
OWRite DQ, 1, [$CC, $BE] | ' Послать датчику DS18S20 команду чтения из ОЗУ датчика ' значения температуры |
' ---------------------------------------Читать значение температуры ---------------------------------------- | |
ORead DQ, 2,[Temp.LowByte, Temp.HighByte, C, C, C, C, C, CPerD] | |
' ------------------------------Расчет температуры и её индикация на дисплее------------------------------ | |
TempIND = (((Temp >> 1) * 100) - 25) + (((CPerD - C) * 100) / CPerD) | |
Print At 2, 1, "Temperatura ", Dec TempIND / 100, ".", Dec2 TempIND," C " | |
Print At 3, 1, "Temp.LowByte=", Dec Temp.LowByte, " " | |
Print At 4, 1, "Temp.HighByte=", Dec Temp.HighByte, " " | |
GoTo Again | ' Перейти к началу главной программы |
На рисунке 1 приведена действующая модель oread1_ds18s20.dsn демонстрирующая работу команды ORead c датчиком DS18S20. Модель работает под управлением программы oread1_ds18s20.bas.
Примечание:
Расчет значений температуры по используемому в программе oread1_ds18s20.bas алгоритму верен только для положительных температур. Чтобы программа правильно работала и со значениями отрицательных температур, в неё необходимо включить соответствующий модуль определения значения отрицательных температур, как например, это сделано в следующем примере.
Необходимо отметить, что для организации безошибочной связи между микроконтроллером и датчиком DS18S20 необходим подтягивающий резистор величиной 4.7 кОм.
В следующей программе oread2_ds18S20.bas, листинг которой приведен ниже, демонстрируется измерение не только положительных температур, но и отрицательных тоже.
Листинг программы oread2_DS18S20.bas
' -------------------------Диапазон измерений температур -55...+125 оС, погрешность измерений 0,5 оС---------------- | |
Device 16F876A | ' Использовать микроконтроллер 16F876A |
Declare XTAL 4 | ' Использовать кварцевый генератор на 4 МГц |
' ---------------------------------------------Настройки подключения ЖКИ--------------------------------------------- | |
Declare LCD_Type ALPHA | ' Тип ЖКИ - буквенно-цифровой |
Declare LCD_DTPin PORTB.4 | ' Порт данных ЖКИ |
Declare LCD_ENPin PORTB.3 | ' Управление цепью E |
Declare LCD_RSPin PORTB.2 | ' Управление цепью RS |
Declare LCD_Interface 4 | ' 4-х битная разрядность шины данных |
Declare LCD_CommandUs 2000 | ' Задержка перед посылкой команды |
Declare LCD_DataUs 50 | ' Задержка перед посылкой данных |
Declare LCD_Lines 2 | ' Количество строк ЖКИ |
' ---------------------------------------------------Настройки портов---------------------------------------------------- | |
PortB_Pullups = true | ' Включить подтяжку резисторов к порту PORTB |
' -------------------------------------------------Объявление переменных---------------------------------------------- | |
Symbol DQ = PORTB.1 | ' Подключить DS18S20 к выводу PORTB.1 |
Dim Temp As Word | ' Переменная для хранения значения температуры |
Dim TempIND As Float | ' Переменная для вывода на индикацию значения ' температуры |
Dim C As Bit | ' Переменная для получения и хранения бита сброса |
' --------------------------------------------Создание символа знака градуса --------------------------------------- | |
Print $FE,$40,$06,$09,$09,$06,$00,$00,$00,$00 | ' Поcлать на ЖКИ команду создания знака градуса, ' чтобы можно было на ЖКИ при печати цифры 8 видеть ' символ градуса |
' ----------------------------------------------------------Заставка------------------------------------------------------- | |
Cls | ' Очистить дисплей ЖКИ |
Print At 1, 1, "1-Wire - DS18S20" | ' Отобразить на жки надпись 1-Wire - DS18S20 |
' -----------------------------------------------------Главная программа ------------------------------------------------- | |
main: | ' Метка начала гланой программы |
' -------------------------------------------Подготовка DS18S20 к измерениям------------------------------------------ | |
OWRite DQ, 1, [$CC, $44] | ' Послать датчику DS18S20 команду старта измерения ' температуры |
Repeat | ' Начать внутренний цикл |
DelayMS 25 | ' Ждать окончания преобразования пока не придет бит, |
ORead DQ, 4, [C] | ' сигнализирующий об окончании преобразования |
Until C > 0 | ' Выйти из цикла если от DS18S20 поступил бит конца ' преобразования. |
OWRite DQ, 1, [$CC, $BE] | ' Послать команду чтения из ОЗУ датчика DS18S20 ' значения температуры |
' -------------------------------------------Прием данных от дачтика DS18S20 ------------------------------------------- | |
ORead DQ, 2,[Temp.LowByte, Temp.HighByte, C] | |
' -------------------------------Определение знака температуры и расчет её значений-------------------------------- | |
If Temp.8=0 Then TempIND = Temp/2 : _GoSub Indikaziya |
' Если 8 бит = 0, то температура положительная. |
If Temp.8=1 Then TempIND = (Temp - 65535.7)/2 : _GoSub Indikaziya |
' Если 8 бит = 1, то температура отрицательная. |
GoTo main | ' Перейти к началу главной программы |
' ------------------------------------------------Подпрограмма индикации-------------------------------------------------- | |
Indikaziya: | |
Print At 2, 1, "Temperature ", Dec1 TempIND, " ", 8, "C " | |
Return | ' Возврат из подпрограммы |
На рисунке 2 приведена действующая модель oread2_ds18s20.dsn работающая с положительными и отрицательными значениями температуры полученными от DS18S20. Модель работает под управлением программы oread2_ds18s20.bas.
Программа oread3_ds18В20.bas, листинг которой приведен ниже, демонстрирует работу микроконтроллера с полупроводниковым термометром DS18В20. Этот температурный датчик обладает повышенной точностью измерения температуры, которая составляет 0,0625 оС.
Листинг программы oread3_DS18B20.bas
' ---------------Диапазон измерений температур -55...+125 оС, погрешность измерений 0,0625 оС---------------- | |||
Device 16F628A | ' Использовать микроконтроллер 16F628A | ||
Declare XTAL 4 | ' Использовать тактовый генератор на 4 МГц | ||
' --------------------------------------------Конфигурация микроконтроллера-------------------------------------------- | |||
Config BODEN_OFF, PWRTE_ON, WDT_OFF, LVP_OFF, MCLRE_OFF, INTRC_OSC_NOCLKOUT, CP_ON, DATA_CP_ON | |||
|
|||
' -----------------------------------------------Настройки подключения ЖКИ---------------------------------------------- | |||
Declare LCD_Type ALPHA | ' Тип ЖКИ - буквенно-цифровой | ||
Declare LCD_DTPin PORTB.4 | ' Порт данных ЖКИ | ||
Declare LCD_ENPin PORTB.3 | ' Управление цепью E | ||
Declare LCD_RSPin PORTB.2 | ' Управление цепью RS | ||
Declare LCD_Interface 4 | ' Использовать 4-х битную шину данных | ||
Declare LCD_CommandUs 2000 | ' Задержка перед посылкой команды | ||
Declare LCD_DataUs 50 | ' Задержка перед посылкой данных | ||
Declare LCD_Lines 2 | ' Количество строк ЖКИ равно двум | ||
' ---------------------------------------------------Настройки портов---------------------------------------------------- | |||
Declare All_Digital = On | ' Сделать все порты цифровыми | ||
' -------------------------------------------------Объявление переменных---------------------------------------------- | |||
Symbol DQ = PORTA.4 | ' Подключить DS18B20 к выводу PORTA.4 | ||
Dim R_Temp As Word | ' Переменная для получения значения температуры ' отдельными двумя байтами |
||
Dim Temp As Float | ' Переменная для преобразования значения ' температуры в данные с плавающей запятой |
||
Dim TempIND As Float | ' Переменная для вывода на индикацию значени ' температуры |
||
Dim C As Bit | ' Переменная для хранения бита сигнализации ' окончания преобразования |
||
' --------------------------------------------Создание символа знака градуса --------------------------------------- | |||
Print $FE,$40,$06,$09,$09,$06,$00,$00,$00,$00 | ' Поcлать на ЖКИ команду создания знака градуса, ' чтобы можно было на ЖКИ при печати цифры 8 видеть ' символ градуса |
||
' ----------------------------------------------------------Заставка------------------------------------------------------- | |||
Cls | ' Очистить дисплей ЖКИ | ||
Print At 1, 1, "1-Wire - DS18B20" | ' Отобразить на жки надпись 1-Wire - DS18B20 | ||
' -----------------------------------------------------Главная программа ------------------------------------------------- | |||
main: | ' Метка начала гланой программы | ||
GoSub TERMO_Convert | ' Выполнить подпрограмму измерения температуры | ||
Print At 2, 1, "T = ", Dec2 TempIND, " ", 8, "C " | ' Отобразить на ЖКИ результаты измерений | ||
GoTo main | ' Перейти к началу главной программы | ||
' -----------------------Подпрограмма измерений температуры и конвертации данных в oC----------------------- | |||
TERMO_Convert: | ' Метка начала подпрограммы измерения температуры | ||
OWrite DQ, 1, [$CC,$44] | ' Послать датчику DS18S20 команду старта измерения ' температуры |
||
Repeat | ' Начать внутренний цикл | ||
DelayMS 25 | ' Ждать окончания преобразования пока не придет бит, | ||
ORead DQ, 4, [C] | ' сигнализирующий об окончании преобразования | ||
Until C > 0 | ' Выйти из цикла если от DS18S20 поступил бит конца ' преобразования. |
||
OWrite DQ, 1, [$CC,$BE] | ' Послать команду чтения из ОЗУ датчика DS18S20 ' значения температуры |
||
ORead DQ, 2, [R_Temp.LowByte, R_Temp.HighByte] | ' Прочитать значение температуры и записать ' полученные два байта данных в переменную R_Temp ' типа Word, младщий байт в R_Temp.LowByte и ' старший байт в R_Temp.HighByte |
||
Temp = R_Temp | ' Поместить в переменную Temp содержимое ' переменной R_Temp |
||
TempIND = Temp / 16 | ' Разделить значение переменной Temp на 16 и ' результат поместить в переменную TempIND |
||
If R_Temp > 64654 Then TempIND = Temp / 16 - 4095.93 | |||
Return | ' Возврат из подпрограммы |
На рисунке 3 приведена действующая модель oread3_ds18b20.dsn, работающая в диапазоне измеряемх температур от -55 до +125 оС и погрешностью измерений 0,0625 оС. Модель работает под управлением программы oread3_ds18b20.bas.