Смекни!
smekni.com

Создание измерительного аппаратно-программного комплекса термометра на основе микроконтроллеров семьи ATMEGA (стр. 3 из 4)

Описанный адаптер также подходит для считывания электронных ключей IButton и для подключения других однопроводных устройств.

Программа ds1820.exe, работающая под Win95/98/ME/NT, позволяет считывать и отображать показания термометра, а также считывать серийный номер и программировать два пользовательских байта. Эта программа кроме термометра DS18S20 поддерживает и его предшественника DS1820.

Вид главного окна программы показан на рисунке

Окно имеет следующие элементы управления:

Поле Device ID, куда выводится код семейства 1-проводного устройства. Для DS1820 и DS18S20 он равен 10h.

Поле Device Name, где приводится расшифровка типа устройства.

Поле Serial number, куда выводится серийный номер, записанный в ПЗУ.

Поле CRC, где отображается результат проверки контрольной суммы (OK или FAIL).

Поле TH / User byte 1, куда можно ввести значение в шестнадцатеричной форме, которое будет записано в регистр TH.

Поле TL / User byte 2, куда можно ввести значение в шестнадцатеричной форме, которое будет записано в регистр TL.

Кнопка Start запускает процесс измерения температуры. Преобразования выполняются периодически, а измеренная величина выводится в поле температуры. Дискретность представления составляет 0.1°C, что достигается дополнительными вычислениями.

Кнопка Exit позволяет выйти из программы.

Кроме того, вверху окна имеется меню, состоящее из трех пунктов: Port, Utilites и Help.

Меню Port в развернутом виде показано на рис. 13. Это меню позволяет открыть один из четырех портов COM1 – COM4. Кроме того, меню позволяет закрыть порт и выйти из программы. В списке активны только доступные порты (т.е. те, которые физически присутствуют и не заняты в данный момент другими приложениями). Когда порт открывается, проверяется наличие на этом порту адаптера (достаточно соединения TXD – RXD). Если адаптер не обнаружен, выводится соответствующее сообщение

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

Для хранения установок программа использует ini-файл, который создается автоматически в том же директории, где расположен exe-файл. В ini-файле содержится информация о положении окна программы и номер используемого COM-порта:

[General]

Left=427

Top=295

COM port=2

Если в существующем ini-файле указан номер COM-порта, который на момент запуска программы занят или отсутствует, выводится специальное сообщение

Меню Utilites содержит три пункта:

Read ROM – считывание содержимого ПЗУ (код семейства, серийный номер), а также считывание TH и TL.

Start Conv. – дублирует кнопку Start основного окна.

Write User Bytes – записывает значения TH и TL, которые введены в соответствующих полях.

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

Для генерации импульса сброса и приема ответа порт настраивается на скорость 9600 бод, длина символа 8 бит, и передается число F0h. Это приводит к формированию импульса сброса низкого уровня (с учетом инверсии адаптера) длительностью примерно 520 мкс (стартовый бит + 4 передаваемых бита). За ним следует импульс высокого уровня такой же длительности (4 передаваемых бита + стоповый бит), в течение которого ожидается ответ термометра. Если термометр не подключен, то порт примет число F0h не искаженным. Но если термометр сформировал импульс ответа, то принятое число будет содержать большее количество единиц, чем четыре. Таким образом определяется наличие ответа.

Для генерации интервалов приема и передачи битов, порт настраивается на скорость 115200 бод. Стартовый бит начинает временной интервал, затем идут 8 единичных или нулевых бит, в зависимости от значения бита, который нужно передать. Заканчивается последовательность стоповым битом, который на некоторое время устанавливает на 1-проводной шине высокий уровень. Вид этой последовательности полностью соответствует требуемому виду временного интервала передачи бита, за исключением того, что обмен является более медленным, чем способна обеспечить 1-проводная шина: на один бит затрачивается примерно 87 мкс.

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

Для работы с COM-портом программа пользуется функциями API через специальную «оберточную» динамическую библиотеку comapi32.dll. Однако скорость обмена получается гораздо ниже расчетной из-за того, что переключение скорости COM-порта (вызов функции SetCommState с изменённым значением поля BaudRate структуры DCB) идёт удивительно долго (порядка 200 миллисекунд!). Это весьма неприятное свойство API.

Программа DS1820.zip вместе с исходным текстом на Delphi 5 source20.zip распространяется бесплатно.

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

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

3) Робота с COM-портом в среде ОС Windows:

Вопрос «как работать с COM-портами?» стал классическим на многих конференциях по языкам программирования. Рано или поздно чуть не каждому программисту приходится работать с портами ввода/вывода. Сегодня я хочу рассказать про работу с последовательным портом из-под самой распространенной на сегодняшний день 32-разрядной операционной системы — Windows. К статье прилагается пример программы, работающей с COM-портом, написанной на Borland Delphi 7.

Статья построена по принципу «от простого к сложному». Сначала будут изложены основы работы с портами из-под Win32 с описанием необходимых функций. Затем рассмотрим применение этих функций на примере Delphi-программы. Конечным результатом будет класс, предназначенный для работы с COM-портом, и пример использующей его программы.

Очень часто программисту приходится управлять с помощью компьютера каким-либо внешним устройством, или просто анализировать состояние этого устройства. Порты ввода/вывода — самый распространенный способ сопряжения компьютера и внешнего устройства. Давным-давно уже написано множество классов, библиотек и компонент для работы с портами, поэтому можно, конечно, воспользоваться уже готовым и к тому же бесплатным решением. Именно так я и поступил лет семь назад, при этом потеряв самое главное — своевременное понимание того, как все-таки работать с портами из-под Win32. Незнание внутренних механизмов — это, во-первых, пробел в стройном ряду знаний, а во-вторых, актуальная возможность ошибок в работе программы.

С портами из-под Win32 работают так же, как и с обычными файлами, используя при этом всего несколько специфичных функций WinAPI. Однако коммуникационный порт — это не совсем обычный файл. Для него, например, нельзя выполнить позиционирование файлового указателя, или же создать порт, если таковой отсутствует. Любая работа с портом начинается с его открытия. Для этого используется файловая функция WinAPI (описания WinAPI-функций взяты из MSDN (Microsoft Developer Network), следовательно, приводятся в синтаксисе C):

HANDLE CreateFile(

LPCTSTR lpFileName,

DWORD dwDesiredAccess,

DWORD dwShareMode,

LPSECURITY_ATTRIBUTES lpSecurityAttributes,

DWORD dwCreationDistribution,

DWORD dwFlagsAndAttributes,

HANDLE hTemplateFile

);

lpFileName — указатель на строку с нулевым завершающим символом. Обычно это имя открываемого файла, но в нашем случае это должно быть название порта (COM1, COM2, …).

dwDesiredAccess — тип доступа. В нашем случае должен быть равен GENERIC_READ|GENERIC_WRITE.

dwShareMode — параметр совместного доступа. Для коммуникационных портов всегда равен 0.

lpSecurityAttributes — атрибут защиты. Для коммуникационных портов всегда равен NULL.

dwCreationDistribution — режим автосоздания. Для коммуникационных портов всегда равен OPEN_EXESTING.

dwFlagsAndAttributes — атрибут режима обработки. Для коммуникационных портов должен быть равен 0 или FILE_FLAG_OVERLAPPED.

hTemplateFile — описатель файла-шаблона. Для коммуникационных портов должен быть равен NULL.

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

Сразу оговорюсь: все недостающие описания можно найти на http://msdn.microsoft.comи еще по ряду адресов, которые вам подскажет поисковый сервер.

Из всех параметров функции CreateFile() особого пояснения требует dwFlagsAndAttributes. Работа с портом может быть организована в синхронном (nonoverlapped) или асинхронном (overlapped) режимах обработки, что и задается этим флагом. При синхронном режиме (когда параметр dwFlagsAndAttributes = 0) только один поток приложения может либо читать, либо писать в порт. Помните переговорное устройство в лифте? Нажали кнопку — можем только говорить, отпустили кнопку — можем только слушать.