Как передать данные по uart keil c51


| Текущее время: Ср янв 10, 2024 00:28:08 |
Часовой пояс: UTC + 3 часа
Запрошенной темы не существует.
Часовой пояс: UTC + 3 часа

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y
Работоспособность сайта проверена в браузерах:
IE8.0, Opera 9.0, Netscape Navigator 7.0, Mozilla Firefox 5.0
Адаптирован для работы при разрешениях экрана от 1280х1024 и выше.
При меньших разрешениях возможно появление горизонтальной прокрутки.
По всем вопросам обращайтесь к Коту: kot@radiokot.ru
©2005-2024
STM32. Передача данных через UART (работа с COM-портом)
В этой статье речь пойдет о простейших способах передачи данных в различном виде UART микроконтроллера. Это крайне полезная функция, которая помогает быстро вывести отладочную информацию или наладить общение с ПК .
Подготовка к работе
Перед началом работы рекомендуем ознакомиться с предыдущими остальными статьями нашего курса. Здесь мы не будем останавливаться на простейших действиях. Напомним только что работа будет производиться с использованием утилиты CubeMX, HAL-драйвера, IDE Keil uVision и платы Nucleo-F030R8.
Обратите внимание, что программатор ST-Link, который входит в состав платы Nucleo, уже имеет на борту преобразователь USB-to-COM. Который в свою очередь уже подключен к основному контроллеру. Это значит, что нам не потребуется абсолютно ничего, кроме самой платы Nucleo-F030R8.
Если вы используете какое-либо альтернативное аппаратное обеспечение, то необходимо найти преобразователь интерфейсов и подключить его к ПК и микроконтроллеру.
Настройка CubeMX
Чтобы включить UART, в самом простом случае, достаточно двух действий.
Во-первых, на вкладке Pinout, надо включить модуль USART2 в асинхронном режиме, как это показано на картинке ниже:
Во-вторых, на вкладке Configuration можно изменить настройки подключения. Мы изменили скорость обмена:
Все. На этом настройка порта завершена. Можно сгенерировать проект и приступить к написанию кода.
Передача строки в ASCII
Самая простая функция для передачи дачи в асинхронном режиме — HAL_UART_Transmit(). Найти ее можно в файле драйвера stm32f0xx_hal_uart.c.
Чуть позже мы разберем аргументы этой функции, а пока сконцентрируемся на результате. Итак, вызовем эту функцию в бесконечном цикле с задержкой и передадим в нее следующие параметры:
Для приема сообщения на стороне компьютера можно использовать любую терминальную программу. Мы будем использовать программу Terminal 1.9b.
Если все сделано верно, то после компиляции и прошивки контроллера, раз в секунду в COM-порт будет отправляться сообщение «Hello world!» с переводом строки. Обратите внимание на настройки терминальной программы — символы печатаются в ASCII-кодировке с переводом строки.
Всего в функцию HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout) требуется передать четыре аргумента:
- *huart — указатель на структуру данных, описывающую UART. Ранее мы не сталкивались с указателями и структурами данных. По сути, это набор переменных, объединенных для удобства под общим именем. Объявление этой переменной содержится в начале файла main.c, а описание этой структуры можно найти в файле stm32f0xx_hal_uart.h.

Обратите внимание, что заполнение полей данных этой структуры происходит при инициализации UART в файле main.c.
Унарный оператор * (в аргументе функции *huart) показывает то, что это указатель. То есть в эту функцию необходимо передать не саму структуру данных, а ее адрес в памяти. Получить адрес структуры данных (или обычной переменной) можно при помощи унарного оператора &.
Таким образом, при вызове функции HAL_UART_Transmit(), в качестве первого параметра следует указать &huart2. - *pData — аргумент-указатель на данные, которые необходимо передать. Словами «Hello world!\n» мы создаем массив из элементов типа char. А массив и указатели в Си это, фактически, одно и то же. То есть передавая его в функцию, не надо писать оператор &. Запись (uint8_t*) необходима для преобразования типа данных. Без нее тоже будет работать (так как char и uint8_t это одно и то же), но вы увидите предупреждение.
- Size — количество передаваемых байт. В нашем примере передается 13 символов. В том числе символ перевода строки «\n».
- Timeout — максимальное время работы функции. Скорее всего функции сможет выполнить передачу гораздо быстрее, но, если что-то пойдет не так, через одну секунду она прекратит попытки.
Таким образом у нас получилась запись HAL_UART_Transmit(&huart2, (uint8_t*)»Hello world!», 13, 1000);.
Дополнительные примеры
В реальных системах очень часто возникает обмена данными между различными устройствами. Рассмотренная функция подходит для того, чтобы просто передавать любые данные в виде массива или единичной переменной.
Для примера создадим переменную count. В цикле, раз в секунду, мы будем ее увеличивать и отправлять текущее значение в UART.
В функцию мы передаем указатель на переменную, то есть &count. И указываем, что требуется передать один байт. В терминале, если включить отображение данных в шестнадцатеричном формате, то в выводе мы увидим следующее:
Также иногда требуется передать значение переменной в формате ASCII. Наиболее простой способ, на наш взгляд, показан ниже:
Обратите внимание на использование функции sprintf(). Эта функция позволяет отпечатать в массив элементы с форматным выводом аргументов функции и возвращает количество отпечатанных символов. Тонкости форматного вывода, в качестве справочной информации, описаны в книге Б. Кернигана и Д. Ричи «Язык программирования Си».
Другими словами, одним действием мы передали в функцию массив, заполнили его данными и определили количество элементов. В терминальной программе при этом мы увидим как раз в секунду увеличиваются значения в формате ASCII. 
Есть также дополнительные режимы отправки данных через UART с использованием прерываний и технологии прямого доступа к памяти, но на данном этапе мы не будем рассматривать эти варианты. В следующей статье вы речь пойдет о приеме данных.
Ссылки на остальные статьи цикла можно найти здесь.
Мы будем очень рады, если вы поддержите наш ресурс и посетите магазин наших товаров shop.customelectronics.ru.
Знакомство с интегрированной средой программирования keil-C

3 Методические указания по использованию интегрированной среды программирования keil-C
3.1 Написание программы
В настоящее время программа пишется на одном из языков программирования в виде текстового файла. Это означает, что для написания программы можно воспользоваться любым текстовым редактором. Для того, чтобы программа-транслятор могла преобразовать исходный текст программы в машинные коды микропроцессора, этот текст программы должен быть записан с использованием символов ASCII или ANSI таблиц. К сожалению, некоторые текстовые редакторы для увеличения возможностей редактирования используют для записи текстов формат rtf, или свои собственные форматы (например редактор MS WORD). Такие текстовые файлы не понимаются программами-трансляторами и, следовательно, не могут быть использованы для записи исходного текста программы.
3.2 Использование интегрированной среды программирования
Для облегчения процесса разработки программы часто используются интегрированные среды программирования. В состав интегрированной среды программирования включается определенный набор программных средств: редактор исходного текста, трансляторы с выбранного языка программирования, редакторы связей, загрузчики и так далее. Редактор текстов обычно является первой программой, которую приходится использовать в процессе разработки программ: благодаря нему пользователь получает возможность набирать исходные тексты программ, написанных на ассемблере или на каком-нибудь языке высокого уровня и сохранять их на жёстком диске.
3.3 Работа с текстовым редактором интегрированной среды программирования keil-С
Работа с текстовыми файлами начинается с создания нового файла. Создать текстовый файл можно несколькими способами. Первый способ – воспользоваться главным меню, как показано на рисунке 1.

Рисунок 1 – Создание нового файла через главное меню
Второй способ – использовать быстрые клавиши Ctrl+N. И третий способ – это нажать на пиктограмму создания нового файла, как показано на рисунке 2.

Рисунок 2 – Создание нового файла при помощи пиктограммы
После выполнения этих действий открывается окно текстового редактора, в котором можно вводить исходный текст программы. Внешний вид программы с открытым окном текстового редактора показан на рисунке 3.

Рисунок 3 – Вид программы с окном тетстового редактора
Ввод программы производится с клавиатуры. Стирание одиночных ошибочно введённых символов возможно при помощи кнопок “Delete” и “Backspace”
После создания окна нового файла можно вводить исходный текст программы, используя клавиатуру. Набрав исходный текст программы в окне текстового редактора, файл необходимо сохранить на диске компьютера. Для этого можно воспользоваться меню файл, как это показано на рисунке 4:

Рисунок 4 – Сохранение файла через главное меню
Второй способ – использовать быстрые клавиши Ctrl+S. И третий способ – это нажать на пиктограмму сохранения файла, как показано на рисунке 5. При вводе имени сохраняемого файла, обязательно должно быть указано расширение (*.c).
При написании программ часто требуется копировать участки программ из одного файла в другой. Для этого в текстовом редакторе открываются оба файла. Затем необходимый участок текста выделяется при помощи мыши или клавиатуры. Для выделения строк нажимается левая кнопка мыши в начале выделяемого фрагмента и, не отпуская её, курсор мыши перемещается в конец этого фрагмента. Для выделения столбцов производятся те же действия, но, кроме того, нажимается кнопка Alt на клавиатуре.

Рисунок 5 – Сохранение файла через главное меню
После выделения необходимого фрагмента текста, этот фрагмент копируется в буфер обмена. Скопировать можно, щёлкнув мышью по пиктограмме копирования, как это показано на рисунке 6, кроме того удобно копировать в буфер обмена комбинацией клавиш Ctrl+C.

Рисунок 6 – Копирование выделенного фрагмента в буфер обмена при помощи пиктограммы
Теперь можно переключиться в окно редактирования файла, куда нужно поместить скопированный текстовый фрагмент при помощи главного меню, как это показано на рисунке 7, и вставить этот фрагмент перед текстовым курсором, вставку также можно осуществить нажатием Ctrl+V.
Вставка фрагмента из буфера обмена может быть произведена либо из меню Edit, либо при помощи пиктограммы Paste как это показано на рисунке 8. Фрагмент исходного текста будет вставлен в то место набираемого текста, где в настоящее время находится курсор.

Рисунок 7 – Выбор окна редактирования файла

Рисунок 8 – Вставка скопированного фрагмента из буфера обмена при помощи пиктограммы
Следует помнить, что копирование участка исходного текста программы эквивалентно набору этого текста программы с клавиатуры и поэтому файл, в который производилось копирование текста, необходимо сохранить на диске любым из методов, описанных ранее.
3.4 Создание программных проектов
3.4.1 Разработка программных средств
На первом шаге разработки программных средств формулируются технические требования к системе, и составляется блок-схема процесса решения нужных задач, которая обеспечит реализацию заданных требований. Блок-схема должна быть надлежащим образом структурирована, чтобы гарантировалась высокая эффективность логики программ.
Для того чтобы было легко ориентироваться в файлах на компьютере, каждую задачу помещают в отдельную директорию (папку). Написание программы тоже следует начинать в отдельной папке, тем более что как будет показано далее, даже простейшая программа состоит из нескольких файлов.
В большинстве случаев программа состоит из нескольких программных модулей. Использование в составе одной программы нескольких программных модулей позволяет увеличить скорость трансляции программ, поручать написание программных модулей различным программистам, увеличивать понятность программ.
Принцип разбиения единой программы на программные модули заключается в том, что для реализации работы с отдельными узлами аппаратуры пишутся отдельные подпрограммы, которые относительно слабо связаны с остальными частями программы. Эти подпрограммы можно выделить в отдельную программу, которую можно хранить в отдельном файле, и транслировать отдельно от остальной программы. Часто одни и те же модули могут входить в состав нескольких программ, выполняющих различные задачи, но использующие при этом одни и те же устройства.
В качестве примера можно назвать работу с клавиатурой, индикацию различных видов информации, работу с последовательными портами, с АЦП, с ЦАП. Каждое из этих устройств может обслуживаться отдельными программными модулями. Этот список можно продолжать и далее, но для составления представления о программных модулях этого достаточно.
Программные проекты можно создавать, и поддерживать вручную, но в последнее время обычно используются различные системы поддержки разработок. Это создаёт ряд дополнительных преимуществ.
Часто программа пишется, и отлаживается на одной аппаратуре (например, на оценочных платах, предлагаемых фирмами изготовителями микросхем), а используется на другой. При этом программа при отладке незначительно отличается от программы, которая будет использоваться в реальной аппаратуре. Для этого в составе программного проекта создаются назначения проекта. В качестве примера назначений программного проекта можно назвать отладку и реализацию, а также версии программы.
3.4.2 Использование системы поддержки разработок
Для облегчения процесса разработки программы часто используются системы поддержки разработок. В состав систем поддержки разработок включается определенный набор программных средств: редакторы текстов, ассемблер, редакторы связей, компиляторы, загрузчики и тому подобное. Каждая из этих программ создаёт свой файл (или свои файлы) на диске компьютера. Для того чтобы не запутаться в этих файлах при разработке программы, все эти файлы размещаются в своей, отдельной директории. Имя этой директории обычно назначают по имени программно-аппаратного проекта. Например: измеритель характеристик транзисторов или цифровой осциллограф.
3.4.3 Создание программного проекта в интегрированной среде программирования keil-С
Работа с программными проектами начинается с создания нового файла проекта. Для создания файла проекта в интегрированной среде разработки программ можно воспользоваться главным меню, как показано на рисунке 9.

Рисунок 9 – Создание нового программного проекта
После создания новой директории и нового файла программного проекта, интегрированная среда программирования предлагает выбрать конкретную микросхему из семейства MCS-51, как это показано на рисунке 10.

Рисунок 10 – Диалоговое окно выбора микросхемы для программного проекта
После нажатия кнопки “OK”, будет предложено добавить в рабочую папку и включить в проект файл начальной инициализации микроконтроллера (Copy Analog Devices Startup Code to Project Folder and Add File to Project?). Следует выбрать вариант ответа “Нет”.

Рисунок 11 – Диалоговое окно
При этом в интегрированной среде программирования окно менеджера проекта приобретает вид, показанный на рисунке 12. Название назначения программного проекта можно изменить, щёлкнув манипулятором “мышь” по названию назначения программного проекта в окне менеджера проекта (Например: отладка, реализация или сопровождение). Точно так же можно изменить название устройства в составе программного проекта (Например: носимая радиостанция, автомобильная радиостанция, стационарная радиостанция или базовая радиостанция).

Рисунок 12 – Внешний вид окна менеджера проекта после создания программного проекта
3.4.4 Настройка свойств программного проекта в интегрированной среде программирования keil-С.
После создания программного проекта в интегрированной среде программирования keil-C конечным файлом трансляции является абсолютный файл. Для загрузки в микросхему обычно используется *.hex файл. Для создания этого файла необходимо включить соответствующую опцию в свойствах программного проекта.

Рисунок 13 – Изменение свойств программного проекта через главное меню
Изменить свойства программного проекта можно несколькими способами. Первый способ – воспользоваться главным меню, как показано на рисунке 13. Второй способ – это нажать на кнопку изменения свойств программного проекта, как показано на рисунке 15.

Рисунок 14 – Изменение свойств программного проекта при помощи пиктограммы
При этом на экране компьютера появляется диалоговое окно изменения свойств программного проекта как показано на рисунке 15. В этом окне необходимо ввести параметры внешней памяти программ и памяти данных.

Рисунок 15 – Диалоговое окно настройки свойств программного проекта
Затем необходимо установить выходные параметры программного проекта. Для этого открываем закладку выход (Output), как это показано на рисунке 16. В этой закладке убеждаемся, что установлена галочка создания выходного загрузочного файла в *.hex формате. Для того чтобы не загромождать директорию проекта файлами объектных кодов можно создать отдельную директорию. Например, с названием OBJ. Новая директория может быть создана после нажатия на кнопку “Select Folder for Object”.
Точно так же можно создать директорию (папку) для файлов листингов. Для этого необходимо выбрать закладку “Listing”. В файлах листингов помещается информация об ошибках, ассемблерный код и соответствующий ему машинный код программного модуля. Использование листингов позволяет оптимизировать программу, а при работе без интегрированной среды программирования и находить синтаксические ошибки программы. Отметим, что создание файлов листингов замедляет процесс трансляции. Обычно имя для папки листингов выбирают LST.
Необходимость создания отдельных папок для листингов и объектных кодов возникает при большом количестве программных модулей, а значит при большом количестве файлов в одной папке. Обычно директории для листингов и для объектных кодов располагают внутри папки программного проекта, где содержатся исходные тексты программы.
Для настройки параметров компиляции выбирается закладка “C51”. В этой закладке настраивается уровень оптимизации транслируемого программного модуля и цель оптимизации (по скорости работы программы или по размеру выходного файла). Кроме того, в этой закладке заносится адрес векторов прерывания.
После настройки свойств программного проекта в диалоговом окне, это окно закрывается нажатием кнопки “OK”.

Рисунок 16 – Диалоговое окно настройки выходных параметров программного проекта
Теперь можно подключать к программному проекту файлы с исходным текстом программных модулей. Для этого можно щёлкнуть правой кнопкой мыши по значку группы файлов в окне менеджера проектов, как это показано на рисунке 17, и выбрать опцию добавления файлов к программному проекту. Добавляемые файлы должны быть предварительно созданы. Если файлом является программа на языке С, то этот файл должен иметь расширение *.c. Например LAB1.c. Если проект состоит из нескольких программных модулей, опцию добавления файлов следует повторить соответствующее число раз.

Рисунок 17 – Всплывающее меню менеджера проектов с выбранной опцией добавления файлов к программному проекту
3.4.5 Работа с программным проектом в интегрированной среде программирования keil-С
После завершения создания программного проекта можно открыть исходные тексты программных модулей, щёлкнув левой кнопкой мыши на названии соответствующего файла в окне менеджера проектов.Точно так же можно переключаться между программными модулями проекта, используя окно менеджера проектов.В случае необходимости можно выключать окно менеджера программных проектов, но обычно это окно удобно при написании программы.Если окно менеджера проектов отключено, то переключаться между модулями можно, используя меню “window”.
3.5 Указания по трансляции программ и программных проектов
3.5.1 Трансляция программных модулей
Как уже указывалось, программный проект может состоять из нескольких файлов. В программном проекте, состоящем из нескольких файлов, появляется возможность нескольких видов трансляции. Прежде всего, можно оттранслировать только один файл, не транслируя остальные файлы программного проекта. Это позволяет обнаружить, и исправить все синтаксические ошибки в отдельном программном модуле. При трансляции каждого программного модуля на жёстком диске формируются перемещаемый файл в объектном формате, который затем будет использоваться для создания загрузочного файла программного проекта. Этот файл называется объектный модуль. Одновременно с объектным модулем на диске формируется файл листинга программного модуля, в который помещается исходный текст программного модуля и сообщения о синтаксических ошибках.
При трансляции программного модуля, написанного на языке программирования ассемблер, в листинг помещаются машинные коды команд процессора, и их адрес относительно начала программного модуля.
При трансляции исходного текста программы, написанной на языке программирования высокого уровня, таком как C программа транслятор может быть настроена так, что она будет создавать файл с текстом исходного модуля, написанного на ассемблере или помещать этот текст в листинг программного модуля. Таким образом, появляется возможность писать, и отлаживать программу на языке высокого уровня, а затем переводить её на язык программирования ассемблер и оптимизировать её вручную.
3.5.2 Связывание объектных модулей и получение загрузочного файла
После того, как оттранслированы без ошибок все программные модули, и тем самым получены файлы объектных модулей, производится трансляция всего программного проекта (связывание объектных модулей). При этом на диске формируются абсолютный и загрузочный файлы программного проекта. Для контроля ошибок связывания формируется файл листинга редактора связей с расширением .m51.
Если обнаруживаются ошибки связывания, то абсолютный и загрузочный файлы программного проекта не формируются. В этом случае необходимо изменить исходный текст программного модуля из за которого возникла ошибка связывания, оттранслировать его и снова попытаться произвести трансляцию программного проекта (связывание объектных модулей). После получения загрузочного модуля можно начинать отладку программы.
3.5.3 Трансляция программных проектов
Интегрированная среда программирования позволяет максимально облегчить трансляцию программных проектов. Так как параметры программного проекта уже настроены, то для трансляции исходного текста программного модуля достаточно загрузить исходный текст этого программного модуля в окно текстового редактора. Это можно сделать одним из способов рассмотренных ранее.
После загрузки исходного текста программного модуля достаточно нажать на кнопку трансляции программного модуля, как это показано на рисунке 18.

Рисунок 18 – Трансляция программного модуля при помощи кнопки трансляции файла
Ещё один способ трансляции программного модуля, это воспользоваться главным меню, как это показано на рисунке 19.

Рисунок 19 – Трансляция программного модуля при помощи главного меню
Надо отметить, что в составе интегрированной среды программирования для поиска синтаксических ошибок удобнее пользоваться не файлом листинга, а окном «build»(расположено внизу рабочей области), где выводятся все сообщения об ошибках. При этом если дважды щёлкнуть мышью по сообщению об ошибке в окне «build», то в окне текстового редактора будет выделена строка программы, где была обнаружена данная ошибка.
Трансляция программного модуля и получение загрузочного файла в интегрированной среде программирования производится нажатием кнопки «Build target», как это показано на рисунке 20.

Рисунок 20 – Трансляция программного модуля проекта при помощи кнопки «Build target»
Ещё один способ трансляции программного проекта в интегрированной среде программирования, это воспользоваться главным меню, как это показано на рисунке 21, но удобнее всего нажать на клавиатуре клавишу “F7”.

Рисунок 21 – Трансляция программного проекта при помощи кнопки «Build target»
Если же необходимо оттранслировать все программные модули вне зависимости имеются объектные модули или нет, и получить загрузочный файл, то нажимается кнопка «Rebuild all target files» или выбирается соответствующее меню.
3.6 Указания по отладке программ во встроенном отладчике программ
3.6.1 Способы отладки программ
Отладка программ заключается в проверки правильности работы программы и аппаратуры. Программа, не содержащая синтаксических ошибок, тем не менее, может содержать логические ошибки, не позволяющие программе выполнять заложенные в ней функции. Логические ошибки могут быть связаны с алгоритмом программы или с неправильным пониманием работы аппаратуры, подключённой к портам микроконтроллера.
Встроенный отладчик позволяет отладить те участки кода программы, которые не зависят от работы аппаратуры, не входящей в состав микросхемы микроконтроллера.
Для отладки программ обычно применяют три способа:
- Пошаговая отладка программ с заходом в подпрограммы;
- Пошаговая отладка программ с выполнением подпрограммы как одного оператора;
- Выполнение программы до точки останова.
Пошаговая отладка программ заключается в том, что выполняется один оператор программы и, затем контролируются те переменные, на которые должен был воздействовать данный оператор.
Если в программе имеются уже отлаженные подпрограммы, то подпрограмму можно рассматривать, как один оператор программы и воспользоваться вторым способом отладки программ.

Вызов встроенного отладчика удобнее всего осуществить, нажав на кнопку отладчика на панели инструментов «file» как показано на рисунке 22 или воспользоваться быстрой кнопкой Ctrl+F5

Рисунок 22 – Вызов встроенного отладчика с использованием кнопки на панели “file”
После этого внешний вид интегрированной среды программирования принимает вид, показанный на рисунке 24. В верхней части программы появляется дополнительная панель инструментов отладчика программ (рисунок 23). В нижней части программы появляется окно просмотра памяти контроллера и окно контроля переменных «Watch».

Рисунок 23 – Дополнительная панель инструментов отладчика программ
Окно просмотра памяти контроллера можно настроить на просмотр памяти программ или памяти данных, введя в диалоговое окно “адрес” ключ, двоеточие и адрес начальной ячейки памяти. Например:
d:0 – просмотреть память данных начиная с нулевой ячейки;
c:0 – просмотреть память программ начиная с нулевой ячейки;
x:0 – просмотреть внешнюю память данных начиная с нулевой ячейки.

Рисунок 24 – Внешний вид интегрированной среды программирования в режиме отладки программ
При использовании встроенного отладчика программ для контроля переменных можно воспользоваться окном “Watch”. В большинстве случаев это намного выгоднее, чем использовать просмотр памяти данных. Переменные в этом окне отображаются в том формате, в котором они были объявлены в программе. Для добавления переменной в окно “Watch” достаточно щёлкнуть правой кнопкой мыши по переменной в тексте программы в окне отладчика программ, как это показано на рисунке 25.

Рисунок 25 – Добавления переменной в окно просмотра “Watch”
При отладке программ на языке программирования ассемблер очень важно контролировать содержимое внутренних регистров микроконтроллера. Это позволяет сделать закладка «Regs» в окне менеджера проектов, показанная на рисунке 24 ( левая рабочая область). В этом окне можно проконтролировать содержимое регистров текущего банка, указателя стека и программного счётчика, содержимое аккумуляторов A и B, а также состояние рабочих флагов микроконтроллера в регистре PSW.
Один оператор программы может быть выполнен нажатием кнопки F11. Если вызов подпрограммы рассматривается как один оператор, то пошаговая отладка программы осуществляется нажатием кнопки F10.

Использование точек останова позволяет пропускать уже отлаженную часть программы. Для того, чтобы установить точку останова, можно воспользоваться кнопкой (Insert/remove Breakpoint) на панели файлов или воспользоваться главным или всплывающим меню. Перед тем как нажать на кнопку установки точки останова, необходимо установить курсор на строку исходного текста программы, где необходимо остановить выполнение программы.
Точка останова устанавливается в местах, где необходимо проверить содержимое переменных или просто проконтролировать, передаётся ли управление данному оператору.

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

Может возникнуть ситуация, что программа не передаёт управление ни одному из операторов, на которых установлены точки останова. В этом случае для прекращения выполнения программы следует воспользоваться кнопкой (Halt) или нажать на кнопку Esc на клавиатуре.

Точка останова может быть использована многократно. Иногда же возникает необходимость однократно пропустить часть операторов. В этом случае можно воспользоваться кнопкой выполнения программы до курсора (Run to Cursor line). При нажатии на эту кнопку программа будет выполняться до тех пор, пока управление не будет передано оператору, на котором находится курсор. Как только это произойдёт, выполнение программы будет остановлено, и можно будет проконтролировать переменные и продолжить выполнение программы в пошаговом или свободнобегущем режиме.
4 Задание к работе
4.1 Войдите в интегрированную среду программирования.
4.2 Создайте новый файл исходного текста программы. Имя файла может быть например L1.c (расширение *.c обязательно).
main()< int A[10]=; //задание массива int I,S,Pr; //объявление переменных целого типа S=0; //начальное значение суммы Pr=1; //начальное значение произведения for (I=1;I<10;I++ ) //переменная цикла I изменяется от 1 до 10 с шагом 1 < Pr=Pr*A[I]; // нахождение произведения всех элементов массива if(A[I]<0) //если элемент массива меньше 0 S=S+A[I]; //нахождение суммы отрицательных элементов массива >>
Эта программа находит сумму отрицательных элементов массива А[10]. После выполнения программы результат (сумма) будет находиться в ячейке памяти S.
4.3 Создайте проект с именем LAB1.
4.4 Добавьте в проект файл с программой.
4.5 Настройте его параметры в соответствии с заданием с вашим вариантом.
Таблица1 – Варианты заданий.
| Номер варианта | Уровень оптимизации | Цель оптимизации | Формировать листинг | Микроконтроллер |
| 1 | 1 | Размер кода | с ассемблерным кодом | AduC812 |
| 2 | 2 | Скорость работы | с таблицей символов | At89c52 |
| 3 | 3 | Скорость работы | с таблицей символов | At89s53 |
| 4 | 4 | Размер кода | с таблицей символов | AduC834 |
| 5 | 5 | Размер кода | с ассемблерным кодом | DS89c420 |
| 6 | 6 | Размер кода | с ассемблерным кодом | At89c55 |
| 7 | 7 | Скорость работы | с таблицей символов | At89s51 |
| 8 | 8 | Размер кода | с таблицей символов | At89LV55 |
| 9 | 1 | Скорость работы | с ассемблерным кодом | AduC812 |
| 0 | 2 | Размер кода | с таблицей символов | At89s51 |
4.6 Оттранслируйте программный проект.
4.6 Убедитесь, что при трансляции программного модуля не обнаружены синтаксические ошибки.
4.7 Убедитесь, что в директории проекта созданы загрузочный файл с расширение *.lst и загрузочный hex-файл с расширением *.hex.
4.8 Выполните пошаговую отладку программы с использованием кнопки F11. На каждом шаге выполнения программы запишите значения используемых переменных программы: A[i] и S.
5 Методические указания к выполнению работ

5.1 Включите ЭВМ, и вызовите интегрированную среду программирования, щелкнув мышью по значку .
5.2 Создайте новый файл исходного текста программы.
5.3 Введите заданный исходный текст программы, используя клавиатуру.

5.4 Откройте диалоговое окно сохранения файла, щелкнув мышью по значку.

5.5 Создайте новую папку с именем LAB1. Для этого щёлкните мышью по значку .
5.6 Введите имя файла, например L1.c (расширение файла должно быть обязательно *.с), и нажмите на кнопку клавиатуры Enter.
5.7 Создайте новый проект. Для этого выберите подменю «New project» из меню project». Выберите папку размещения нового проекта – LAB1. Укажите имя проекта – L1.
5.8 Теперь можно подключать к программному проекту файл с исходным текстом программы. Для этого можно щёлкнуть правой кнопкой мыши по значку группы файлов в окне менеджера проектов, как это показано на рисунке 17, и выбрать опцию добавления файлов к программному проекту.
5.9 Оттранслируйте проект, нажав кнопку F7 (Rebuild all target files). Если есть ошибки, исправьте их в текстовом редакторе среды Keil.
5.10 При отсутствии ошибок убедитесь, что в директории проекта появился загрузочный файл с расширением *.hex.

5.11 Для вызова отладчика щелкните мышью значок его запуска .
5.12 Выполните пошаговую отладку программы с использованием кнопки F11. На каждом шаге выполнения программы запишите значения используемых переменных программы A[I] и S. Если при вызове отладчика в нижней части экрана отсутствует окно просмотра переменных, его можно включить, выбрав в меню «View» команду «Watch & call stack window», либо воспользоваться иконками, показанными на рисунке 23. Для добавления переменной в окно «Watch» достаточно щёлкнуть правой кнопкой мыши по нужной переменной в окне программы и в появившемся окне выбрать «ADD to Watch window».
6 Содержание отчёта
- Цель работы.
- Исходный текст программы.
- Cтруктура программного проекта.
- Порядок создания загрузочного модуля.
- Файл листинга (файл с расширением *.lst).
- Распечатка загрузочного файла (с расширением *.hex).
- Таблица значений переменных программы на каждом шаге выполнения.
- Выводы.
7 Рекомендуемая литература
- М. Рафикумазан. Микропроцессоры и машинное проектирование микропроцессорных систем 1988
- В.В. Сташин А.В. Урусов О.Ф.. Мологонцева Проектирование цифровых устройств на однокристальных микроконтроллерах 1990.
- В.Я. Нерода В.Э. Торбинский Е.Л.. Шлыков Однокристальные микроЭВМ MCS-51 Архитектура 1995.
- В.И. Сединин, А.В. Микушин. Однокристальный микроконтроллер семейства MCS-51 фирмы INTEL 8xC51GB 2001
- В.И. Сединин, А.В. Микушин. Программирование микропроцессорных систем на языке ASM-51 2003
- В.И. Сединин, А.В. Микушин. Программиро-вание микро-процессорных систем на языке C-51 Москва, «Горячая линия – Телеком», 2009. — 216с.
- http://digteh.ru/content.php
Если возникли проблемы с освоением среды програмирования, рекомендуется ознакомиться с уроками для начинающих:
- Что такое микроконтроллер. Применение микроконтроллеров
- Интегрированная среда программирования keil-C
Ввод и вывод информации через параллельные порты

2 Предварительная подготовка к работе
- По конспекту лекций и рекомендуемой литературе изучить схемы параллельных портов микроконтроллеров.
- По конспекту лекций и рекомендуемой литературе изучить схемы подключения светодиодов и датчиков к параллельным портам микроконтроллеров.
- Изучить архитектуру микроконтроллера ADuC842.
- Изучить принципиальную схему лабораторного стенда LESO1.
- Изучить работу загрузчика nwFlash.
- Изучить язык программирования C .
3 Краткие теоретические сведения
3.1 Устройство параллельных портов микроконтроллера
Параллельные порты предназначены для обмена многоразрядной двоичной информацией между микроконтроллером и внешними устройствами, при этом в качестве внешнего устройства может использоваться другой микроконтроллер. Каждый из портов содержит восьмиразрядный регистр, имеющий байтовую и битовую адресацию для установки (запись “1”) или сброса (запись “0”) разрядов этого регистра с помощью программного обеспечения. Выходы этих регистров соединены с внешними ножками микросхемы. С точки зрения внешнего устройства порт представляет собой обычный источник или приемник информации со стандартными цифровыми логическими уровнями (обычно ТТЛ), а с точки зрения микропроцессора — это ячейка памяти, в которую можно записывать данные или в которой сама собой появляется информация.
В качестве внешнего устройства может служить любой объект управления или источник информации (различные кнопки, датчики, микросхемы, дополнительная память, исполнительные механизмы, двигатели, реле и так далее).
В зависимости от направления передачи данных параллельные порты называются портами ввода, вывода или портами ввода вывода.
В качестве простейшего порта вывода может быть использован параллельный регистр, так как он позволяет запоминать данные, выводимые микропроцессором и хранить их до тех пор, пока подается питание. Все это время сигналы с выхода этого регистра поступают на внешнее устройство. Упрощенная функциональная схема порта вывода показана на рисунке 1. Двоичные слова с системной шины данных микропроцессора записываются в регистр по сигналу “WR”. Выходы «Q» регистра могут быть использованы как источники логических уровней для управления внешними устройствами. Этот регистр называется регистром данных порта вывода.
Для отображения этого регистра только в одну ячейку памяти адресного пространства микропроцессорного устройства в составе порта ввода-вывода всегда присутствует дешифратор адреса. На выходе дешифратора адреса устанавливается единица лишь тогда, когда двоичное слово на его входе имеет заданное строго определенное значение, соответствующее адресу ячейки памяти, во всех остальных случаях на выходе дешифратора адреса удерживается логический ноль.

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

Рисунок 2 – Функциональная схема порта ввода
Шинный формирователь работает следующим образом: данные с входов D0-D7 поступают на выходы Q0-Q7 лишь тогда когда на входе ОЕ (Output Enable — разрешение выхода) установлен высокий логический уровень (“1”), когда же на OE логический ноль, выходы переходят в третье состояние и никак не влияют на шину данных. Значение сигнала с внешнего вывода порта передается на шину данных (считывается) по управляющему сигналу “RD”.
Для отображения шинного формирователя порта ввода в один адрес пространства адресов микроконтроллера используется дешифратор адреса. Выделяемый дешифратором адрес называют адресом регистра данных порта ввода. Из порта ввода возможно только чтение информации.
Так как из порта ввода возможно только чтение информации (команд “RD”), а в порт вывода только запись (команда “WR”), то для портов ввода и вывода можно отвести один и тот же адрес в адресном пространстве микропроцессора.
Упрощенная схема одного разряда параллельного порта ввода-вывода приведена на рисунке 3. Подобное схемотехническое решение применяется в микроконтроллерах архитектуры MCS-51, такой порт называется квазидвунаправленным. Для микроконтроллеров других архитектур схема может отличаться.

Рисунок 3 – Упрощенная схема одного бита параллельного квазидвунаправленного порта
Один разряд регистра порта представляет собой D-триггер, запись входных данных в который происходит по высокому уровню синхросигнала (вход триггера “C”). На рисунке такой сигнал назван «запись в защелку». Мощность сигнала с инвертирующего выхода триггера усиливается при помощи МОП (металл — окись — полупроводник) транзистора, а за тем поступает на внешний вывод микросхемы. Внутренний подтягивающий резистор служит для обеспечения выходного тока порта при установленном высоком логическом уровне. Как правило, вместо резистора в портах микроконтроллера используется управляемый генератор стабильного тока (ГСТ), собранный на МОП транзисторах. Следует обратить внимание, что у некоторых портов вывода, внутреннего генератора тока может и не быть, пример тому P0.
3.2 Подключение внешних устройств к порту параллельному порту микроконтроллера
Внешними устройствами называются любые устройства, которыми управляет, от которых получает или которым передает информацию микроконтроллер. В качестве внешних устройств могут выступать устройства ввода-вывода информации — светодиодный индикатор, дисплей, датчик, кнопка, клавиатура, другой микропроцессор.
Внутренняя схема порта построена таким образом, чтобы максимально упростить подключение внешних устройств к микроконтроллеру. Присутствие в схеме порта выходного транзистора позволяет подключить к выводам порта светодиодные индикаторы непосредственно, без усилителя мощности, как это показано на рисунке 4. При этом необходимо следить за максимальной допустимой мощностью, рассеиваемой на микросхеме и отдельных выводах порта. Светодиод в такой схеме загорается при низком потенциале на выводе порта, для этого в порт должен быть записан логический ноль. Резистор R1 ограничивает ток через светодиод, если этот резистор не поставить, то ток по цепи индикатора может достигнуть недопустимой величины и светодиод или внутренний транзистор выйдут из строя.

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

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

Рисунок 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. На этом же рисунке показаны адреса отдельных битов портов в битовом пространстве памяти.

Рисунок 7 – Адреса SFR параллельных портов
Микроконтроллер ADuC842 в лабораторном практикуме исследуется в составе учебного лабораторного стенда LESO1, для того чтобы определить какое периферийное устройство подключено к какому порту следует изучить принципиальную схему учебного стенда.
3.4 Работа с регистрами специальных функций
Все программно доступные регистры управления, конфигурации и данных микроконтроллера включены в область регистров специальных функций (Special Function Register — SFR). Эта область формально занимает старшие 128 байт внутренней памяти данных, но обращение должно осуществляться по определенным адресам ячеек или отдельным битам. Регистры SFR реализуют интерфейс между микропроцессорным ядром и внутренней периферией микроконтроллера. Все регистры специальных функций имеют как символические имена (мнемоники), так и адреса в качестве ячеек внутренней памяти. Информацию об SFR можно найти в документации на микроконтроллер, обычно указывается не только название и адрес регистра, но и значение, записанное в них после сброса контроллера.
Часть регистров, адреса которых заканчиваются на 0h или 8h, содержит прямо адресуемые биты, адреса этих битов находятся в диапазоне 80h – FFh. Кроме адресов эти биты имеют еще и имена, которые могут быть определены в языках программирования. Таким образом, к прямо адресуемым битам регистрам специальных функций можно обращаться по именам. Если в регистре биты не прямо адресуемые, то их имена служат только для удобства описания функционирования соответствующего блока микроконтроллера. Для обращения к определенному биту такого регистра должна производиться выборка байта целиком, а затем накладываться нужная маска.
Для работы с портами микроконтроллера на языке С51 введены специальные типы переменных – регистры специальных функций sfr. Синтаксис определения регистра выглядит следующим образом:
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 – Интерфейс загрузчика nwFlash
Главное меню позволяет производить операции со стендом, а также настраивать параметры терминала. Окно терминала служит для отображения данных, посылаемых микроконтроллером по интерфейсу UART, а также для отправки пользовательских данных (от компьютера микроконтроллеру) по этому же интерфейсу. В окне состояния отображаются результаты всех проведённых операций для контроля.
Для работы с программой nwFlash следует запустить программу. При нажатии на пункт главного меню «Подключение» программа выполнит поиск подключенных стендов и отобразит их названия в раскрывшемся меню. Если вы забыли подключить стенд, то появится надпись «нет подключенных стендов», в этом случае подключите стенд и снова раскройте меню «Подключение».
После выбора стенда из меню «Подключение». В окне состояния должна появиться надпись «Подключено к «имя_стенда». После этого становится доступным пункт меню «Операции», где можно:
- выполнить сброс МК. На стенде начнёт выполняться программа, записанная в микроконтроллер в последний раз;
- стереть flash-память микропроцессора;
- прошить МК.
В появившемся окне необходимо указать путь к *.hex файлу.

Рисунок 9 – Интерфейс загрузчика nwFlash. Операции
После выполнения работы со стендом, выберите пункт «Отключиться» в меню «Подключение», затем закройте программу.
4 Задание к работе в лаборатории
4.1 Вывод информации через параллельный порт
- По принципиальной схеме установите, к каким портам микроконтроллера подключены светодиоды.
- По таблице регистров специальных функций (SFR) определите адреса регистров требуемых портов.
- Войдите в интегрированную среду программирования Keil-C.
- Создайте файл проекта.
- Введите текст программы в соответствии с заданием: Каждому студенту требуется зажечь светодиоды, соответствующие номеру своего варианта в бинарном виде.
- Оттранслируйте программу, и исправьте синтаксические ошибки.
- Загрузите полученный *.hex файл в лабораторный стенд LESO1.
- Убедитесь, что на лабораторном стенде LESO1 зажигаются требуемые светодиоды.
- Покажите результат преподавателю.
4.2 Ввод информации через параллельный порт (дополнительно).
- По принципиальной схеме установите, к какому порту микроконтроллера подключена кнопка S2.
- Определите адрес порта, к которому подключена кнопка.
- Измените исходный текст программы таким образом, чтобы требуемые светодиоды загорались только по нажатию кнопки.
- Оттранслируйте программу, и исправьте синтаксические ошибки.
- Загрузите полученный *.hex файл в лабораторный стенд.
- Убедитесь, что при нажатии на кнопку зажигается светодиоды, соответствующие вашему варианту.
- Покажите результат преподавателю.
5 Указания к составлению отчета
Отчет должен содержать:
- Цель работы.
- Эквивалентная схема подключения светодиода к параллельному порту.
- Эквивалентная схема подключения кнопки к параллельному порту.
- Принципиальная схема микроконтроллера с используемой в работе периферией.
- Графическую схему алгоритма программы.
- Исходный текст программы.
- Содержимое файла листинга программного проекта.
- Выводы по выполненной лабораторной работе.
Схемы, а также отчет в целом, выполняются согласно нормам ЕСКД.
- микропроцессор
- микроконтроллер
- паралельный порт
- регистр
- параллельный регистр
- методические указания
- ADuC842