Ввод и вывод информации через параллельные порты

Методическое указание к лабораторной работе на учебном стенде LESO1.

1 Цель работы

  1. Изучить особенности работы параллельных портов микроконтроллера.
  2. Изучить схемы подключения светодиодов к цифровым микросхемам.
  3. Научиться управлять светодиодами при помощи программы.
  4. Изучить схемы подключения кнопок и датчиков к цифровым микросхемам.
  5. Научиться определять состояние кнопок при помощи программы.
  6. Изучить способы отладки программ на лабораторном стенде LESO1.

2 Предварительная подготовка к работе

  1. По конспекту лекций и рекомендуемой литературе изучить схемы параллельных портов микроконтроллеров.
  2. По конспекту лекций и рекомендуемой литературе изучить схемы подключения светодиодов и датчиков к параллельным портам микроконтроллеров.
  3. Изучить архитектуру микроконтроллера ADuC842.
  4. Изучить принципиальную схему лабораторного стенда LESO1.
  5. Изучить работу загрузчика nwFlash.
  6. Изучить язык программирования C .

3 Краткие теоретические сведения

3.1 Устройство параллельных портов микроконтроллера

Параллельные порты предназначены для обмена многоразрядной двоичной информацией между микроконтроллером и внешними устройствами, при этом в качестве внешнего устройства может использоваться другой микроконтроллер. Каждый из портов содержит восьмиразрядный регистр, имеющий байтовую и битовую адресацию для установки (запись “1”) или сброса (запись “0”) разрядов этого регистра с помощью программного обеспечения. Выходы этих регистров соединены с внешними ножками микросхемы. С точки зрения внешнего устройства порт представляет собой обычный источник или приемник информации со стандартными цифровыми логическими уровнями (обычно ТТЛ), а с точки зрения микропроцессора — это ячейка памяти, в которую можно записывать данные или в которой сама собой появляется информация.

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

В зависимости от направления передачи данных параллельные порты называются портами ввода, вывода или портами ввода вывода.

В качестве простейшего порта вывода может быть использован параллельный регистр, так как он позволяет запоминать данные, выводимые микропроцессором и хранить их до тех пор, пока подается питание. Все это время сигналы с выхода этого регистра поступают на внешнее устройство. Упрощенная функциональная схема порта вывода показана на рисунке 1. Двоичные слова с системной шины данных микропроцессора записываются в регистр по сигналу “WR”. Выходы "Q" регистра могут быть использованы как источники логических уровней для управления внешними устройствами. Этот регистр называется регистром данных порта вывода.

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

 Функциональная схема порта вывода. 12,25КБ
Рисунок 1 – Функциональная схема порта вывода

В качестве порта ввода может быть использован шинный формирователь. Для построения порта ввода выходы шинного формирователя (Q0-Q7) подключены к внутренней шине данных микропроцессора, а на его вход подключаются сигналы, которые нужно ввести в микропроцессорную систему. Упрощенная функциональная схема порта ввода приведена на рисунке 2.

Функциональная схема порта ввода. 14,9КБ
Рисунок 2 – Функциональная схема порта ввода

Шинный формирователь работает следующим образом: данные с входов D0-D7 поступают на выходы Q0-Q7 лишь тогда когда на входе ОЕ (Output Enable — разрешение выхода) установлен высокий логический уровень (“1”), когда же на OE логический ноль, выходы переходят в третье состояние и никак не влияют на шину данных. Значение сигнала с внешнего вывода порта передается на шину данных (считывается) по управляющему сигналу “RD”.

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

Так как из порта ввода возможно только чтение информации (команд “RD”), а в порт вывода только запись (команда “WR”), то для портов ввода и вывода можно отвести один и тот же адрес в адресном пространстве микропроцессора.

Упрощенная схема одного разряда параллельного порта ввода-вывода приведена на рисунке 3. Подобное схемотехническое решение применяется в микроконтроллерах архитектуры MCS-51, такой порт называется квазидвунаправленным. Для микроконтроллеров других архитектур схема может отличаться.

Упрощенная схема одного бита параллельного порта. 15,9КБ
Рисунок 3 – Упрощенная схема одного бита параллельного квазидвунаправленного порта

Один разряд регистра порта представляет собой D-триггер, запись входных данных в который происходит по высокому уровню синхросигнала (вход триггера “C”). На рисунке такой сигнал назван "запись в защелку". Мощность сигнала с инвертирующего выхода триггера усиливается при помощи МОП (металл — окись — полупроводник) транзистора, а за тем поступает на внешний вывод микросхемы. Внутренний подтягивающий резистор служит для обеспечения выходного тока порта при установленном высоком логическом уровне. Как правило, вместо резистора в портах микроконтроллера используется управляемый генератор стабильного тока (ГСТ), собранный на МОП транзисторах. Следует обратить внимание, что у некоторых портов вывода, внутреннего генератора тока может и не быть, пример тому P0.

3.2 Подключение внешних устройств к порту параллельному порту микроконтроллера

Внешними устройствами называются любые устройства, которыми управляет, от которых получает или которым передает информацию микроконтроллер. В качестве внешних устройств могут выступать устройства ввода-вывода информации — светодиодный индикатор, дисплей, датчик, кнопка, клавиатура, другой микропроцессор.

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

Эквивалентная схема подключения светодиодного индикатора к параллельному порту. 14,8КБ
Рисунок 4 – Эквивалентная схема подключения светодиодного индикатора к параллельному порту

Если же требуется обеспечить больший ток нагрузки, то для усиления тока порта используют внешний транзистор, как показано на рисунке 5.

Схема подключения светодиодного индикатора через транзисторный ключ. 14,8КБ
Рисунок 5 – Схема подключения светодиодного индикатора через транзисторный ключ

В приведенной схеме база транзистора подключена непосредственно к выводу порта. Если выходного порта контроллера достаточно для открывания транзистора, то резистор R1 может быть исключен из схемы. Этот резистор нужен для увеличения тока базы транзисторного ключа. Резистор R2 рассчитывается исходя из допустимого тока светодиода. Для зажигания светодиода необходимо в соответствующий разряд параллельного порта записать логическую единицу, а для его гашения — логический ноль.

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

Подключение источника цифровой информации. 13,9КБ
Рисунок 6 – Подключение источника цифровой информации

Когда контакт K разомкнут то на вход микроконтроллера через резистор R подается напряжение питания, интерпретируемое контроллером как логическая единица. Если контакт замкнут, то на вход подается потенциал общего провода, что соответствует логическому нулю.

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

3.3 Особенность параллельных портом микроконтроллера ADuC842

В микроконтроллере ADuC842, фирмы Analog Devices, для обмена информации с внешними устройствами используется четыре параллельных порта ввода-вывода. Дополнительно к своему основному назначению некоторые порты могут использоваться для подключения внешней памяти.

Port0 (P0.0 – P0.7) — Двунаправленный 8-ми разрядный параллельный порт ввода-вывода с открытым стоком. При записи в бит регистра порта логической единицы соответствующая линия порта переходит в режим высокоимпедансного входа. Для работы в режиме порта ввода-вывода необходимо внешнее подтягивание каждого разряда порта к уровню логической единицы.

Port1 (P1.0 – P1.7) — Входной порт, по умолчанию настроен на ввод аналоговых сигналов (функция АЦП). Каждый ввод может быть переведен в режим цифрового входа, для этого в соответствующий бит порта должен быть записан логический ноль. Порт не имеет внутреннего усиливающего транзистора и потому при вводе дискретной информации через него не требуется записывать в разряды логическую единицу. В режиме порта цифрового ввода необходимо внешнее подтягивание каждого разряда порта к уровню логической единицы.

Port2(P2.0 – P2.7), Port3(P3.0 – P3.7) — Двунаправленные 8-ми разрядные параллельные порты ввода-вывода. При записи в бит регистра порта логической единицы, соответствующая линия порта переходит в режим высокоимпедансного входа со слабым подтягиванием сигнала к уровню логической единицы. Формат и адреса портов P0-P3 приведены на рисунке 7. На этом же рисунке показаны адреса отдельных битов портов в битовом пространстве памяти.

Адреса SFR параллельных портов. 17,6КБ
Рисунок 7 – Адреса SFR параллельных портов

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

3.4 Работа с регистрами специальных функций

Все программно доступные регистры управления, конфигурации и данных микроконтроллера включены в область регистров специальных функций (Special Function Register — SFR). Эта область формально занимает старшие 128 байт внутренней памяти данных, но обращение должно осуществляться по определенным адресам ячеек или отдельным битам. Регистры SFR реализуют интерфейс между микропроцессорным ядром и внутренней периферией микроконтроллера. Все регистры специальных функций имеют как символические имена (мнемоники), так и адреса в качестве ячеек внутренней памяти. Информацию об SFR можно найти в документации на микроконтроллер, обычно указывается не только название и адрес регистра, но и значение, записанное в них после сброса контроллера.

Часть регистров, адреса которых заканчиваются на 0h или 8h, содержит прямо адресуемые биты, адреса этих битов находятся в диапазоне 80hFFh. Кроме адресов эти биты имеют еще и имена, которые могут быть определены в языках программирования. Таким образом, к прямо адресуемым битам регистрам специальных функций можно обращаться по именам. Если в регистре биты не прямо адресуемые, то их имена служат только для удобства описания функционирования соответствующего блока микроконтроллера. Для обращения к определенному биту такого регистра должна производиться выборка байта целиком, а затем накладываться нужная маска.

Для работы с портами микроконтроллера на языке С51 введены специальные типы переменных – регистры специальных функций sfr. Синтаксис определения регистра выглядит следующим образом:

Выражения в операторах C-51
Операторы C-51
Объявление переменных

sfr name = address; 
где name — имя регистра SFR (любой идентификатор);
address — адрес регистра SFR.

Пример объявления:

sfr P0 = 0x80; /* Порт-0, адрес 80h */
sfr P1 = 0x90; /* Порт-1, адрес 90h */
sfr P2 = 0xA0; /* Порт-2, адрес A0h */
sfr P3 = 0xB0; /* Порт-3, адрес B0h */ 

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

Объявление отдельных битов в побитно адресуемых регистрах происходит с помощью ключевого слова sbit одним из следующих способов:

sbit name = sfr-name^bit-position;
sbit name = sfr-address^bit-position;
sbit name = sbit-address; 

где:
nameимя бита в SFR;
sfr-nameимя заранее объявленного SFR;
bit-positionпозиция бита в соответствующем регистре;
sfr-addressадрес регистра SFR;
sbit-addressнепосредственный адрес бита.

Таким образом, второй бит порта P0 может быть записан одним из способов:

sbit p0_2 = 0x82;   // непосредственный адрес
sbit p0_2 = 0x80^2; // используя адрес SFR
sbit p0_2 = P0^2;   // заранее объявленный P0 

Для определения адресов регистров и отдельных разрядов в них следует обратиться к рисунку 7.

Объявление регистров специальных функций следует делать перед основной подпрограммой. SFR не может быть объявлен внутри функции.

3.5 Работа загрузчика nwFlash

Для загрузки исполняемого кода во внутреннюю память микропроцессора и взаимодействия лабораторного стенда с ПК разработана программа nwFlash. Программа nwFlash позволяет:

  • производить поиск подключенных к компьютеру по USB интерфейсу лабораторных стендов;
  • активировать соединение с одним из найденных стендов;
  • выполнять сброс микроконтроллера (Reset);
  • загружать во flash - память микроконтроллера пользовательскую программу;
  • принимать и отправлять данные в текстовом и шестнадцатеричном виде по интерфейсу UART (режим терминала).

Интерфейс nwFlash состоит из трех элементов:

  • главное меню;
  • окно терминала;
  • окно состояния.
программа загрузчик 8КБ
Рисунок 8 – Интерфейс загрузчика nwFlash

Главное меню позволяет производить операции со стендом, а также настраивать параметры терминала. Окно терминала служит для отображения данных, посылаемых микроконтроллером по интерфейсу UART, а также для отправки пользовательских данных (от компьютера микроконтроллеру) по этому же интерфейсу. В окне состояния отображаются результаты всех проведённых операций для контроля.

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

После выбора стенда из меню "Подключение". В окне состояния должна появиться надпись "Подключено к "имя_стенда". После этого становится доступным пункт меню "Операции", где можно:

  • выполнить сброс МК. На стенде начнёт выполняться программа, записанная в микроконтроллер в последний раз;
  • стереть flash-память микропроцессора;
  • прошить МК.

В появившемся окне необходимо указать путь к *.hex файлу.

Программа загрузчик. Меню Операции
Рисунок 9 – Интерфейс загрузчика nwFlash. Операции

После выполнения работы со стендом, выберите пункт "Отключиться" в меню "Подключение", затем закройте программу.

4 Задание к работе в лаборатории

4.1 Вывод информации через параллельный порт

  1. По принципиальной схеме установите, к каким портам микроконтроллера подключены светодиоды.
  2. По таблице регистров специальных функций (SFR) определите адреса регистров требуемых портов.
  3. Войдите в интегрированную среду программирования Keil-C.
  4. Создайте файл проекта.
  5. Введите текст программы в соответствии с заданием: Каждому студенту требуется зажечь светодиоды, соответствующие номеру своего варианта в бинарном виде.
  6. Оттранслируйте программу, и исправьте синтаксические ошибки.
  7. Загрузите полученный *.hex файл в лабораторный стенд LESO1.
  8. Убедитесь, что на лабораторном стенде LESO1 зажигаются требуемые светодиоды.
  9. Покажите результат преподавателю.

4.2 Ввод информации через параллельный порт (дополнительно).

  1. По принципиальной схеме установите, к какому порту микроконтроллера подключена кнопка S2.
  2. Определите адрес порта, к которому подключена кнопка.
  3. Измените исходный текст программы таким образом, чтобы требуемые светодиоды загорались только по нажатию кнопки.
  4. Оттранслируйте программу, и исправьте синтаксические ошибки.
  5. Загрузите полученный *.hex файл в лабораторный стенд.
  6. Убедитесь, что при нажатии на кнопку зажигается светодиоды, соответствующие вашему варианту.
  7. Покажите результат преподавателю.

5 Указания к составлению отчета

Отчет должен содержать:

  1. Цель работы.
  2. Эквивалентная схема подключения светодиода к параллельному порту.
  3. Эквивалентная схема подключения кнопки к параллельному порту.
  4. Принципиальная схема микроконтроллера с используемой в работе периферией.
  5. Графическую схему алгоритма программы.
  6. Исходный текст программы.
  7. Содержимое файла листинга программного проекта.
  8. Выводы по выполненной лабораторной работе.

Схемы, а также отчет в целом, выполняются согласно нормам ЕСКД.

Комментарии:



Пишите комментарии, задавайте вопросы. Если что не понятно -- разберемся!

Аватар пользователя Denis
sfr  P0 = 0x80;
sbit P3_2=0xB2;
void main(void)
{
    P0 = 1;
    while(1)
    {
        if (P3_2 == 0)
        {
            P0 = P0 << 1;
            while (P3_2 == 0);
        }
    }
}

Стенд LESO1. не понимаю почему не загорается соседняя лампочка? После нажатия на кнопку они просто гаснут. По идее они должны с права на лево поочередно зажигаться и гаснуть (0001->0010->0100..и.т.д)

1. Я сомневаюсь, что параллельный порт удастся использовать как обычную переменную. Может быть целесообзно завести переменную типа char, ее модифицировать и лишь потом записывать значаение в порт?

2. Вы не обеспечиваете циклический сдвиг. Единичка быстро "ускачет" влево.

3. А быстро она может "ускакать" из-за дребезга контактов. Дело в том, что при нажатии кнопки не сразу устанавливается ноль, а происходит быстрая смена состояний. Подробнее тут.

Орфографическая ошибка в тексте:
Чтобы сообщить об ошибке автору, нажмите кнопку "Отправить сообщение об ошибке". Вы также можете отправить свой комментарий.