Главная страница
Навигация по странице:

  • 4.6. ПРОГРАММА HYPERTERMINAL

  • Call Disconnect

  • Advanced

  • File Save As

  • Save

  • Send File

  • 4.7. РЕАЛИЗАЦИЯ ИНТЕРФЕЙСА RS-232 ДЛЯ СВЯЗИ МИКРОКОНТРОЛЛЕРА С ПЕРСОНАЛЬНЫМ КОМПЬЮТЕРОМ

  • Устройства управления роботами, схемотехника и программирование (М. Предко, 2004). Устройства управления роботами, схемотехника и программирование. Устройствауправления роботамисхемотехника и микроконтроллеров picmicro


    Скачать 6.79 Mb.
    НазваниеУстройствауправления роботамисхемотехника и микроконтроллеров picmicro
    АнкорУстройства управления роботами, схемотехника и программирование (М. Предко, 2004).pdf
    Дата29.08.2017
    Размер6.79 Mb.
    Формат файлаpdf
    Имя файлаУстройства управления роботами, схемотехника и программирование .pdf
    ТипРеферат
    #8441
    КатегорияПромышленность. Энергетика
    страница12 из 33
    1   ...   8   9   10   11   12   13   14   15   ...   33
    RS-232
    микроконтроллера конденсаторы 1
    конденсаторы 0,1 мкФ
    Рис. 4.8. Согласование уровней с помощью микросхемы
    Эта микросхема имеет встроенный преобразователь для формирования напря- жения ±12 В и идеально подходит для реализации трехпроводной последователь- ной передачи данных. Сигнальная «земля» в этом случае совпадает с «землей»
    источника питания микросхем.
    Кроме МАХ232, имеется большое число аналогичных микросхем других про- изводителей, предназначенных для выполнения этой же функции; они дают воз- можность осуществлять преобразование большего числа сигналов (включая ли- нии квитирования). Многие из них удобны тем, что не требуют подключения внешних конденсаторов. Разумеется, за эти достоинства, как обычно, приходится платить.
    Другой способ преобразования логических уровней интерфейса RS-232
    в стандартные уровни микросхем заключается в использовании инвертора сигнала. Соответствующая схема приведена на рис. 4.9. Недостаток этой схемы - возможность работы только в полудуплексном режиме, то есть в каждый момент передача информации может вестись только в одном направ- лении.
    Когда внешнее устройство хочет передать информацию компьютеру, оно по- сылает данные в виде импульсов и пауз между ними. При высоком уровне сигна- ла на выходе ТХ транзистор закрыт и на входе RX действует сигнал низкого уровня,

    148 Устройства управления роботами
    Рис. 4.9. Подключение периферийного устройства к последовательному порту
    Рис.
    Сопряжение уровней с помощью микросхемы
    1)275
    а при низком уровне выходного сигнала транзистор открывается и на вход пода- ется сигнал высокого уровня.
    Описанный способ достаточно прост и недорог; к тому же транзистор потреб- ляет небольшой ток. Однако он требует инвертирования входного сигнала, при- нимаемого микроконтроллером, а большинство МК не имеют для этого встроен- ных аппаратных средств. Как следствие, часто используют микросхему
    1)275
    фирмы Dallas Semiconductor, которая аналогична предыдущей схеме на навесных компонентах, но имеет еще и встроенный инвертор (рис.
    4.6. ПРОГРАММА HYPERTERMINAL
    Для того чтобы посылать данные от компьютера к микроконтроллеру и прини- мать их, требуется специальная программа - эмулятор терминала, - которая обеспечивает выполнение следующих функций:
    • эмуляцию телетайпа (TTY) и стандартного терминала ANSI (American Natio- nal Standards Institute — Американский национальный институт стандартов);
    • изменение скорости передачи/приема данных;
    • передачу/прием данных в формате 8-N-1;
    •. моноширинные шрифты для отображения информации на экране;
    • изменение настроек последовательного порта;

    Подключение к микроконтроллеру периферийных устройств 149
    выбор метода квитирования;
    • сохранение настроек;
    • передачу/прием текстовых файлов.
    Автор рекомендует использовать для этих целей программу HyperTerminal фирмы Hilgraeve Inc. Она имеется в комплекте стандартной поставки большин- ства версий операционной системы Microsoft Windows и поддерживает все необ- i
    стандартные функции. Эту программу можно свободно скачать с сайта j www.hilgraeve.com. После инсталляции программы необходимо правильно ее i сконфигурировать.
    Запустите программу
    Внешний вид окна программы показан рис. 4.11.
    Рис.
    Окно программы
    Далее отключите текущее соединение (которое могло установиться автомати- чески при запуске программы), выбрав пункты меню Call
    Disconnect (Связь
    Затем выполните команды File
    Properties (Файл
    Свойства) - экране появится диалоговое окно настройки параметров (рис. 4.12).
    Обычно для этого достаточно выполнить команды Пуск Программы Стандартные Связь
    HyperTerminal (Start Programs Accessories Media HyperTerminal). Если появится диалого- вое окно для ввода параметров нового закройте нажав кнопку Отмена (Cancel). -
    Прим. пере».
    Русские варианты названий пунктов меню могут варьироваться в зависимости от версий програм- мы. - Прим. перев.

    150 Устройства управления роботами
    Перейдите на вкладку Settings (Настройка) и убедитесь, что параметр Terminal
    Keys (клавиши терминала) активизирован, в поле выбора Emulation (Эмуляция терминала) выбран пункт ANSI, в поле ввода Telnet Terminal ID (Терминал Telnet)
    также записано значение ANSI, а в поле Backscroll buffer lines (Размер буфера)
    указано значение 500 строк. Все необходимые настройки показаны на рис. 4.13.
    Отмена
    Рис.
    Окно настройки параметров программы
    Рис.
    Настройки терминала
    Нажав кнопку Terminal Setup (Настройка), можно изменить вид курсора. Пос- ле нажатия кнопки ASCII Setup (Параметры ASCII) можно задать форматы передаваемых и принимаемых данных. Эти настройки зависят от используемых про- токолов обмена, поэтому пока оставим те режимы, что установлены по умолчанию.
    Теперь перейдите на вкладку Connect To к) и в раскрывающем- ся списке Connect Using (Подключаться через) выберите используемое соедине- ние (рис. 4.14). Необходимо указать номер последовательного порта, к которому подключено ваше устройство. Кроме одного из имеющихся на вашем компьютере последовательных портов можно указать модем или сетевой адрес (сокет) для подключения по протоколу TCP/IP.
    После выбора соединения надо нажать кнопку Configure (Настройка). В по- явившемся диалоговом окне (рис. 4.15) надо установить скорость передачи (Bits per second - количество битов в секунду), количество информационных (Data
    Bits) и стоповых битов (Stop Bits), наличие бита четности (Parity) и метод управ- ления потоком (Flow Control). Мы договорились использовать формат 8-N-1, по- этому надо указать 8 информационных битов, 1
    проверку на четность. Также необходимо выключить управление потоком (так как мы
    т
    Подключение к микроконтроллеру периферийных устройств 151
    ,
    Настройки параметров соединения
    Рис.
    Установки параметров последовательного порта соединение по трем проводам без использования сигналов квитирова- ния). В наших проектах мы будем выбирать скорость передачи 1200 бит/с.
    Далее нажмите кнопку Advanced (Дополнительно) и снимите галочку Use
    FO Buffers (Использовать буферы FIFO).
    Теперь можно подтвердить все настройки, нажав два раза подряд кнопку ОК.
    После этого надо выбрать шрифт, который будет использоваться для отображе- информации на терминале. Для этого предназначены команды меню View
    Font (Вид
    Шрифт). Желательно выбрать какой-нибудь моноширинный например Courier New (рис.
    Рис.
    Выбор шрифта

    152 Устройства управления роботами
    Наконец, желательно сохранить все настройки. Выполните команды File
    Save As (Файл
    Сохранить как). Укажите нужную папку, а в качестве имени файла выберите что-нибудь информативное, например:
    DIRECT СОМ 1 - 1200 bps и нажмите на кнопку Save (Сохранить).
    Теперь, если установить соединение, выполнив команды Call
    Call (Вызов
    Вызов), то при каждом обращении к клавиатуре через последовательный порт ва- шего компьютера внешнему устройству будет посылаться ASCII-код нажатой клавиши. А данные, приходящие от внешнего устройства, будут сразу отображать- ся на экране терминала.
    Кроме того, вы можете передать целый файл - это позволяет легко реализо- вать различные тестовые ситуации, избавляя вас от необходимости каждый раз вводить необходимые данные вручную. Для этого может быть использована ко- манда меню Send File (Передача
    Отправить файл), но предпочтительна коман- да Send Text File (Передача
    Отправить текстовый файл), поскольку в послед- нем случае данные передаются точно в том виде, как если бы вы вводили их с клавиатуры, включая специальные символы перевода строки, возврата каретки и конца файла.
    4.7. РЕАЛИЗАЦИЯ ИНТЕРФЕЙСА RS-232
    ДЛЯ СВЯЗИ МИКРОКОНТРОЛЛЕРА
    С ПЕРСОНАЛЬНЫМ КОМПЬЮТЕРОМ
    В нашем первом проекте мы реализуем передачу данных между микроконтролле- ром и персональным компьютером, используя для этого приемопередатчик
    ART,
    встроенный в микроконтроллер. Для согласования уровней интерфейса RS-232
    и стандартной ТТЛ/КМОП логики можно применить любой из способов, опи- санных в предыдущем разделе.
    Так как МК PIC16F84 не имеет модуля USART, а мы не хотим пока прибегать к его программной реализации, имеющейся в стандартной библиотеке функций компилятора
    Lite, то в этом проекте МК
    не может быть заменен
    Мы будем предполагать, что микроконтроллер подключен к компьютеру с по- мощью стандартного кабеля, имеющего разъем-вилку на одном конце и разъем- розетку на другом (этот кабель широко применяется для подключения к последо- вательному порту персональных компьютеров различных периферийных устройств).
    Если для преобразования уровней используется микросхема МАХ232, то схе- ма нашего устройства принимает вид, показанный на рис.
    Схема размеще- ния элементов на монтажной плате показана на рис. 4.18.
    Контакты 2, 3 и 5 разъема D-9 последовательного порта должны быть припая- ны к проводникам монтажной платы. При этом желательно использовать провода трех разных цветов (красный, зеленый или голубой для контактов 2 и 3, черный - для контакта 5).

    Подключение к микроконтроллеру периферийных устройств 153
    Рис. 4. IS. Схема размещения элементов на монтажной плате
    Все используемые в схеме элементы и материалы перечислены в табл.
    Наша цель заключается в том, чтобы показать, каким образом можно осуще- ствить обмен данными между микроконтроллером и персональным компьютером.
    Поэтому пока не будем нагружать наше устройство какой-либо интеллектуаль- ной обработкой информации. Допустим, мы всего лишь хотим, чтобы микрокон- получал коды символов, набираемых на клавиатуре компьютера, перево- дил их в верхний регистр и отправлял назад, чтобы они отображались на экране эмулятора терминала.

    154 Устройства управления роботами
    Таблица
    Перечень элементов, использованных в схеме на рис.
    Примечание
    U1
    PIC16F627
    или МАХ232А
    Микроконтроллер
    Микросхема преобразователя уровней
    R1
    С1
    10
    0,25 Вт
    Для «подтягивания» напряжения на выводе _MCLR
    до
    положительной шины питания
    Для фильтрации напряжения питания
    микроконтроллера
    1 или
    мкФ
    Керамический резонатор
    на 4 МГц, имеющий
    встроенный конденсатор
    Для микросхемы МАХ232 требуются конденсаторы
    емкостью 1 мкФ, а для микросхемы МАХ232А
    мкФ
    Для генератора
    импульсов
    микроконтроллера
    Материалы
    монтажные провода, источник
    питания +5 В
    Приведенный ниже текст программы можно найти в электронном приложении к этой книге в файле Code\Serial\serial.c:
    // 22 апреля 2002.
    // Передача данных через последовательный порт компьютера.
    // Введенная строка передается микроконтроллеру после
    // нажатия клавиши Enter.
    // Принимаемые символы микроконтроллер переводит в верхний регистр
    // и посылает обратно на компьютер.
    //
    // Используется модуль USART микроконтроллера PIC16F627.
    // Для согласования уровней служит микросхема
    Используемые аппаратные
    Микроконтроллер PIC16F627,
    внешний тактовый генератор работает на частоте 4 МГц.
    Вывод RB1 - приемник последовательных данных,
    вывод RB2 - передатчик последовательных данных.
    // Глобальные переменные:
    unsigned int RTC = 0;
    // Счетчик времени.
    char
    // 1 2 345678 9 0 1234567890123456
    unsigned char
    = 0;
    unsigned char
    3;
    unsigned char
    = 0;
    // Для передачи одного символа
    // строки CharOutlndex.
    // Слово
    «warning PIC16F627 with external XT oscillator selected

    Подключение к микроконтроллеру периферийных устройств 155
    // Выбран
    PIC16F627 с внешним кварцевым генератором.
    CONFIG(Ox03F61); // Слово конфигурации МК PIC16F627:
    // внешний кварцевый генератор;
    // RA6/RA7 используются для ввода-вывода;
    // внешний сигнал сброса;
    // таймер PWRT включен;
    // сторожевой таймер выключен;
    // защита кода отключена;
    // детектор падения напряжения питания
    Unsupported selected
    // Неправильно выбран тип микроконтроллера.
    Sendif
    // Обработчик прерываний:
    void interrupt unsigned char temp;
    if
    { // Если запрос на прерывание был от таймера:
    TOIF = 0; // Сбросить флаг прерывания
    // и выполнить инкремент счетчика.
    } // Конец обработчика прерываний от таймера.
    if (TXIF) { // Если запрос на прерывание получен от передатчика:
    TXIF = 0; // Сбросить флаг прерывания.
    if
    =
    ==
    if (SingleCharFlag) // Только отправить обратно?
    = 0;
    else // Нет, новая строка.
    else {
    TXREG = temp; // Вывод очередного символа.
    // Передвинуть указатель
    // к следующему символу.
    >
    > // Конец обработчика прерываний от передатчика.
    if (RCIF) { // Если запрос на прерывание получен от приемника:
    if
    = RCREG) < 0x020) // Получен управляющий символ?
    if (temp == 0x008) // Это символ Backspace?
    if
    > 3)
    = Charlnlndex] = temp;
    StringOut[CharInIndex + 1] =
    StringOut[CharInIndex + 2] = temp;
    + 3] =
    1;
    SingleCharFlag = 1;
    } else;
    else if (temp == OxOOD) { // Enter - конец строки.

    156 Устройства управления роботами
    =
    StringOut[CharInIndex++] =
    StringOut[CharInIndex] =
    = 3;
    = 0;
    = 1;
    } else;
    else { // Обычные символы if
    >=
    (temp <= 'z'))
    temp -=
    - if (Charlnlndex < 23) { //
    назад.
    = Charlnlndex] = temp;
    =
    // Символ конца строки.
    TXIF = 1; •
    SingleCharFlag = 1; '
    = 0; // Сбросить флаг прерывания.
    } // Конец обработчика прерываний от приемника.
    } // Конец обработчика прерываний.
    //
    программа:
    void main(void)
    unsigned char temp;
    OPTION = OxOD1;
    = 0;
    = 1;
    = 1;
    SPBRG = 51;
    TXEN = 1;
    CREN = 1;
    SPEN = 1;
    = 1;
    temp = RCREG;
    RCIF = 0;
    = 1;
    TXIF = 1;
    = 1;
    // Служебная переменная.
    //
    работает с THRO,
    // коэффициент деления равен 4.
    // Начальный сброс таймера
    // Разрешить прерывания от таймера TMRO.
    // Разрешить обработку прерываний.
    // Скорость передачи 1200 бит/с
    // при тактовой частоте 4 МГц.
    // Разрешить работу модуля USART.
    // Разрешить прерывания от периферийных устройств.
    // Разрешить от приемника
    // Вызвать прерывание от передатчика USART.
    while (1 1) { // Бесконечный цикл.
    } // Конец главной программы.
    Возможно, вы не нашли в этой программе того, что ожидали увидеть. Мы же до- говорились, что микроконтроллер будет получать ASCII-код символа, переводить его

    Подключение к микроконтроллеру периферийных устройств 157
    |в верхний регистр и отправлять обратно компьютеру. Поэтому логично было бы написать нечто вроде следующей
    «if
    PIC16F627 Selected
    «else
    Unsupported
    MCU selected void unsigned char temp;
    SP8RG = 51;
    TXEN = 1;
    CREN = 1;
    SPEN = 1;
    = 0;
    while (1 == 1)
    if (RCIF)
    temp = RCREG;
    if temp -=
    TXREG
    temp;
    RCIF = 0;
    // Получение строки символов,
    // преобразование их к верхнему регистру
    // и отправка назад.
    // 1200 бит/с на частоте 4 МГц.
    // Разрешить работу модуля USART.
    // Очистить прерывания от приемника.
    // Бесконечный цикл.
    // Ждем сигнал от приемника.
    // Получили код
    (temp
    -
    // Перевели символ в верхний регистр.
    // Записали его в буфер передатчика.
    // Сбросили флаг приема
    // для ожидания следующего символа.
    } // Конец главной программы.
    Эта программа прекрасно справляется с поставленной но она не мо- работать совместно с другими задачами, которые мы захотим добавить к на- проекту. Поэтому следует использовать такой метод программирования,
    позволил бы вести раздельную разработку различных интерфейсов и без- добавлять к проекту новые функции.
    Поэтому все операции, связанные с реализацией последовательной передачи дан- интерфейс RS-232, а также все другие функции электронного или механи- ского уровней мы будем выполнять не в главной программе, а внутри процедуры бработки прерываний от таймера, которые вырабатываются каждую
    Подчеркну, что такой метод программирования должен использоваться во всех
    Программа исправлена при переводе. В оригинале автор использует директиву CONFIG внутри функции main (поэтому компиляция заканчивается сообщением об ошибке), а также забывает за- крыть фигурную скобку для оператора
    По видимому, те программы в книге, которые не содер- жатся в электронном приложении, не проверялись на компьютере. — Прим. перев.
    I Строго говоря, в описанной программе прерывания генерируются не только по запросу таймера,
    который срабатывает каждые 1024 мкс, но и после приема очередного символа, представленного кодом ASCII, и по окончании передачи очередного символа. Поэтому название функ- не слишком корректно. - Прим. перев.

    158 Устройства управления роботами случаях, даже если решаемая задача на первый взгляд вообще не требует обработ- ки каких-либо прерываний.
    Для того чтобы программа могла как можно быстрее реагировать на приход очередного символа, используется прерывание от приемника модуля USART,
    а для записи очередного символа в буфер передатчика - прерывание от передат- чика USART, которое вырабатывается каждый раз по окончании передачи преды- дущего символа. Такой метод работы с данными мы будем применять и в других наших проектах, например для управления жидкокристаллическим дисплеем.
    Если бы мы использовали только прерывания от модуля USART, то програм- ма могла бы выглядеть следующим
    «warning PIC16F627 Selected
    CONFIG(Ox03F61);
    Unsupported selected void interrupt serial_int(void) // Обработчик прерываний.
    {
    unsigned char temp;
    if
    // Если получен Запрос на прерывание:
    temp = RCRE6; // Получить код if
    <=
    ('a'-'A'); // Преобразовать к верхнему регистру.
    TXREG = temp;
    RCIF = 0; // Сбросить флаг прерывания.
    }
    } // Конец процедуры обработки прерывания.
    // Главная программа:
    void main(void) {
    // 1200 бит/с на частоте 4 МГц.
    TXEN = 1; // Разрешить работу USART.
    CREN = 1;
    SPEN = 1;
    RCIF = 0; // Сбросить флаг while (1 == 1); // Бесконечный цикл.
    } // Конец главной программы.
    Эта программа выглядит намного лучше. Здесь интерфейсная часть вынесе- на за пределы главной программы и располагается в обработчике прерываний.
    Программа исправлена при переводе. В оригинале автор не только повторяет ошибку предыдущей программы, используя директиву CONFIG внутри функции main, но также располагает чик прерываний внутри главной программы. Разумеется, компилятор
    Lite, как и все ные компиляторы языка С, не допускает вложенных определений функций. - Прим. перев.

    Подключение к микроконтроллеру периферийных устройств 159
    '
    программы заключается в том, что она может передавать в основную
    (или принимать из основной программы) только один символ за один вызов обработчика.
    На первый взгляд все выглядит правильно, но что нам при полу- от компьютера какой-либо строковой команды, например
    Send Left Light Sensor Value
    (Узнать состояние левого светового датчика)
    надо выполнить эту команду, отправив компьютеру через последовательный порт байт, характеризующий освещенность этого датчика, например
    251
    Для реализации этой функции необходимо дождаться приема всей строки,
    чтобы выяснить, какую команду требуется выполнить, и только после этого пере- ее в главную программу для исполнения.
    Лучший способ обмена данных между интерфейсной частью программы и био- логическим кодом - использование стандартных для языка С строк в формате
    ASCIIZ, оканчивающихся нулевым байтом. В этом случае ограничитель строки - символ NUL с кодом 0x000 - играет роль флага, который позволяет управлять работой программы. При получении очередного байта в интерфейсной части про- граммы производится его сравнение с нулем, и если принятый байт отличен от нуля, то ожидается приход следующего символа, а если равен нулю, то вся полу- ченная строка передается в основную программу.
    Когда данные передаются микроконтроллеру с помощью эмулятора терми- нала, то ввод очередной строки пользователь завершает нажатием клавиши
    Enter. В результате генерируется символ с кодом
    (CR - возврат карет- ки). Поэтому при получении данных микроконтроллер должен заменить симво- лы с кодом 0x0 OD нулевыми байтами. Тогда фрагмент кода для обработки преры- вания от приемника модуля USART будет выглядеть примерно так:
    (RCIF) { // Если запрос на прерывание был от приемника:
    temp = RCREG;
    RCIF = 0;
    if (temp < 0x020) { // Это управляющий символ?
    if
    == 0x008)
    !=
    // Это символ Backspace?
    // Стираем предыдущий else if (temp == OxOOD)
    // Символ возврата каретки.
    StringIn[StringlnIndex] =
    = 1; // Прием строки закончен.
    } else ; // Нет других символов.
    } else
    // Обычные символы ASCII.
    = temp;
    }
    Этот фрагмент уже почти не отличается от того, что мы использовали в нашей программе. Теперь данные принимаются построчно. Разница только в том, что обратно на компьютер они все еще отправляются отдельными символами.

    160 Устройства управления роботами
    Вы, вероятно, заметили, что в приложение включена возможность стирания предыдущего принятого символа нажатием клавиши
    1   ...   8   9   10   11   12   13   14   15   ...   33


    написать администратору сайта