Характеристика современных методов проектирования микропроцессорных систем. Функционирование, проектирование и архитектура микропроцессорных устройств и систем. Разработка программного обеспечения

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

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

Следует отметить, что количество структур, вообще говоря, ограничено теми рамками, которые были рассмотрены в предыдущем разделе. Так как время разработки и освоения систем в производстве становится соизмеримым с ее жизненным циклом (временем ее целесообразного существования до появления конкурентоспособного аналога), то необходимо:

· стремиться использовать уже известные типовые решения при поддержке пакетов САПР, ориентированных на разработку МПС (хотя творчески работающему специалисту хочется создать нечто оригинальное);

· разрабатывать систему с учетом "экстраполяции их развития" (расширение функций, наращиваемая мощность, модульность, адаптивность).

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

Рис.64

На рис.64 приведен рекомендуемый порядок разработки и отлад­ки, включающий основные этапы проектирования МПС. Разработка программного обеспечения (ПО), аппаратных (АС) и отладочных (ОС) средств осуществляется одновременно. Тесная координация работ на этой стадии определяется прямой зависимостью ПО от АС. В процессе создания МПС выявляются ошибки, для устранения которых приходится возвращаться на предыдущие этапы, т.е. процесс проектирования "насквозь" итерационен, что не отражено на рис.64.

Рассмотрим более подробно каждый из этапов.

Формулировка проблемы.

На рис.65 дана последовательность работ, раскрывающая суть этапа "Формулировка проблемы".

Сфера возможного применения МП очень обширна. Возникает желание взяться за решение эффектной задачи. Однако, если на предприятии к МП относятся скептически, то неудача дискредитирует саму идею применения МП. Поэтому очень важен правильный выбор перво­очередного применения МП, решаемый на первом шаге этого этапа.


Рис.65

Основными критериями достижения цели на этом шаге можно считать:

1. Быстроту разработки и организации серийного производства.

2. Эффективность применения (особенно его наглядность).

3. Минимальность затрат (быструю окупаемость). Некоторую по­мощь здесь может оказать табл.1.

Таблица 1

При выработке базовой концепции решается вопрос о том, какой быть системе: системой автоматического управления (САУ) или авто­матизированной системой управления (АСУ). САУ предназначена для управления ТОУ без вмешательства человека и поэтому проще в смыс­ле отсутствия ВУ связи с человеком и языковых интерфейсов, но должна предусмотреть все возможные ситуации, возникающие в МПС.

Для этого необходимо иметь полную математическую модель ТОУ (процесса) . В АСУ же решение нештатных ситуаций возлагается на человека и имеется возможность вмешательства в процесс. Решение о создании САУ может быть принято и без наличия точной модели ТОУ. Однако разработчик должен сознавать, что в этом случае потребует­ся проведение научных исследований для ее построения на этапе "Разработка модели управления" (см. рис.). Структурная концепция МПС в случае САУ представлена на рис.66.

Рис.66 Рис.67
Рис.68

Если принято решение о создании АСУ, приступают к определению ее макрофункций: сбор данных, советник оператора, непосредственное или супервизорное управление. Целью режима "Сбор данных" (см. рис.67) является накопление информации о состоянии ТОУ при различных условиях для построения модели процесса (когда она неполна или неизвестна) и/или управления им со знанием ситуации. Данный режим всегда присутствует как подзадача в более сложных макрофун­кциях. Его особенность - разомкнутый контур управления, т.е. в качестве решающего устройства используется человек, а МП выполняет функции предпроцессора сбора/предварительной обработки данных и постпроцессора для формирования управляющих воздействий по закону, заданному человеком. В режиме "Советник оператора" помимо сбора данных МПС вычисляет по известной модели (или ее части) управляющие воздействия и предлагает их оператору, который и принимает решение. Число управляемых переменных невелико, чтобы человек был в состоянии удержать их в поле зрения и своевременно реагировать на изменение ситуации.

Замкнутый контур управления характерен для режима "Непосредственное управление" . В этом случае АСУ отличается от САУ тем, что уставки в системе (рис.68) формируются человеком. Высшей макрофункцией АСУ является "Супервизорное управление" . Система состоит из автономного контура управления ТОУ и контура управления уставкой для него. Человек же осуществляет контроль за появлением непредвиденных ситуаций.

И в завершение этапа осуществляется разработка технического задания (ТЗ) на основе исходных данных: конструкторской документации на оборудование, используемое в техпроцессе (включая принципиальные схемы); технологической документации на процесс, требований к выпускаемой продукции, функционированию процесса произ­водства; экономических, социальных, антропогенных, экологических и других ограничений; концепции построения МПС. Определяются текущие (и, возможно, будущие) задачи, решаемые МПС, ограничения на ее функционирование и создание по производительности, габаритам, потреблению, надежности, стоимости и т.д.

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

Микропроцессорная системы сбора данных должна удовлетворять следующим требованиям: обеспечивать высокое быстродействие и быть простой в исполнении, должна обеспечивать устойчивую и безотказную работу, быть сравнительно дешевой и потреблять небольшие ресурсы. Для выполнения поставленных задач и в соответствии с предъявляемыми основными требованиями подходит микроконтроллер серии К1816ВЕ51.

Рисунок 3 - Структурная схема микропроцессорной системы сбора данных.

микропроцессорный программа алгоритм микросхема

Микропроцессорная система (МПС) состоит из следующих блоков: микроконтроллера (МК), оперативного запоминающего устройства (ОЗУ), постоянного запоминающего устройства (ПЗУ), программируемого таймера (ПТ), параллельного программируемого интерфейса (ППИ), аналого-цифрового преобразователя (АЦП), цифро-аналогового преобразователя (ЦАП), мультиплексора (MUX), программируемого контроллера прерываний (ПКП).

МК формирует шину адреса (ША), шину данных (ШД) и шину управления (ШУ). Блоки ОЗУ, ПЗУ, ПТ, ППИ, ПКП подключены к шинам.

ОЗУ предназначено для хранения данных опроса датчиков, а также промежуточные данные. ПЗУ предназначена для хранения кода программы и различных констант.

ПТ предназначен для отсчета интервала времени, которое потребуется для выполнения команд МК. Перед выполнением операции ПТ запускается. При удачном выполнении операции МК сбрасывает ПТ. Если от МК не поступает команды сброса счета (произошло зависание), ПТ по окончании отсчета интервала времени вырабатывает сигнал сброса МК.

ППИ предназначено для подключения внешних устройств. К ППИ подключены АЦП, дискретный мультиплексор и ЦАП.

АЦП предназначен для преобразования аналогового сигнала с датчиков и цифровой код, который через ППИ подается в МК. Аналоговые датчики подключаются к АЦП через аналоговый мультиплексор.

Через дискретный мультиплексор поступают данные с дискретных датчиков.

ЦАП предназначен для формирования управляющего воздействия.

ПКП предназначен для обслуживания внешних прерываний.

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

Чтобы скачать архив с документом, в поле, расположенное ниже, впишите пятизначное число и нажмите кнопку "Скачать архив"

Подобные документы

    Анализ вариантов проектных решений и выбор на его основе оптимального решения. Синтез функциональной схемы микропроцессорной системы на основе анализа исходных данных. Процесс разработки аппаратного и программного обеспечения микропроцессорной системы.

    курсовая работа , добавлен 20.05.2014

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

    дипломная работа , добавлен 13.07.2010

    Целесообразность применения МП-устройства. Архитектура микропроцессорной системы. Структурная организация БИС ВТ с изолированными шинами. Содержание и возможная направленность микроконтроллера. Обобщенная структура простого встраиваемого микроконтроллера.

    реферат , добавлен 28.04.2011

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

    курсовая работа , добавлен 22.01.2014

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

    курсовая работа , добавлен 17.08.2013

    Назначение и устройство микропроцессорной системы контроля. Описание функциональной схемы микропроцессорной системы контроля. Расчет статической характеристики канала измерения. Разработка алгоритма функционирования микропроцессорной системы контроля.

    курсовая работа , добавлен 30.08.2010

    Общее понятие о микроконтроллерах, их использование и назначение. Разработка проекта микропроцессорной системы сбора данных с использованием стендов SDK 1.1 и SDX 0.9. Создание программного обеспечения и его загрузка в лабораторный стенд SDK-1.1.

    курсовая работа , добавлен 31.01.2014

Проектирование микропроцессорных систем

Введение

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

В качестве базовой микросхемы для всех приведенных в книге примеров использована микросхема Atmega 128 популярного микропроцессорного семейства AVR фирмы Atmel. Предполагается, что читатель имеет основные представления, как о принципах микропроцессорной техники, так и об особенностях архитектуры этого микроконтроллера.

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

Главная задача языка- однозначно описать последовательность действий, которую должен выполнить микроконтроллер. В тоже время язык должен быть понятен человеку.

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

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

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

· языки низкого уровня (машинноориентированные);

· языки высокого уровня.

Типичным примером машинноориентированного языка является язык Ассемблер. В недавнем прошлом язык Ассемблера был единственным языком для программирования микроконтроллеров. В настоящее время для составления программ исподьзуются языки высокого уровня, такие как Бейсик , Си и т.п. Эти языки в свое время были разработаны для больших компьютеров. Но сейчас широко используются и для микроконтроллеров.

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

Глава1. Написание программ для микроконтроллеров

Элементы языка Си

Регистры МК (регистры - это ячейки-байты в памяти МК AVR) в программе на Си имеют названия и так как числа в большинстве из них можно менять - для программы регистры являются по сути переменными.
Переменная - это набор ячеек в памяти в которых можно хранить число или числа и менять их. Переменная имеет адрес и имя.

Константа - это как переменная но менять содержимое нельзя.

Константы

Константами называются перечисленные величины в программе. В языке СИ разделяют четыре типа констант: целые константы, константы с плавающей запятой, символьные константы и строковыми литералы.

Целая константа: это десятичное, восьмеричное, шестнадцатеричное или двоичное число, которое представляет целую величину в одной из следующих форм: десятичной, восьмеричной, шестнадцатеричной или двоичной.

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

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

Шестнадцатеричная константа начинается с обязательной последовательности 0х или 0Х и содержит одну или несколько шестнадцатеричных цифр (цифры представляющие собой набор цифр шеснадцатеричной системы счисления: 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F).

Двоичная константа записывается с помощью двоичных символов, которым должна предшествовать последовательность 0b.

например - Целые числа могут быть записаны:

В десятичной форме: 12 234 -5493

В двоичной форме с префиксом 0b так: 0b101001

В шестнадцатеричной форме с префиксом 0x так: 0x5А

В восьмеричной форме с префиксом 0 так: 0775

Если требуется сформировать отрицательную целую константу, то используют знак "-" перед записью константы (который будет называться унарным минусом). Например: -0x2A, -088, -16 .

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

Десятичные константы рассматриваются как величины со знаком, и им присваивается тип int (целая) или long (длинная целая) в соответствии со значением константы. Если константа меньше 32768, то ей присваивается тип int, в противном случае long.

Восьмеричным и шестнадцатеричным константам присваивается тип int , unsigned int (беззнаковая целая), long или unsigned long в зависимости от значения константы согласно табл1.1.

Таблица 1.1

Диапазон шестнадцатеричных констант Диапазон восьмеричных констант Тип
0x0 - 0x7FFF 0 - 077777 int
0X8000 - 0XFFFF 0100000 - 0177777 unsigned int
0X10000 - 0X7FFFFFFF 0200000 - 017777777777 long
0X80000000 - 0XFFFFFFFF 020000000000 - 037777777777 unsigned long

Число с плавающей точкой состоит из целой и дробной части и (или) экспоненты. Константы с плавающей точкой представляют положительные величины удвоенной точности (имеют тип double). Для определения отрицательной величины необходимо сформировать константное выражение, состоящее из знака минуса и положительной константы.

Примеры: 115.75, 1.5Е-2, -0.025, .075, -0.85Е2

Символьная константа - представляется символом заключенном в апострофы. Значением символьной константы является числовой код символа.

Например, "Q"- буква Q .

Символьные константы имеют тип int и при преобразовании типов дополняются знаком.

Строковая константа (литерал) - последовательность символов (включая строковые и прописные буквы русского и латинского а также цифры) заключенные в кавычки (") .

Например, “Heloo”

Символы строкового литерала сохраняются в области оперативной памяти. В конец каждого строкового литерала компилятором добавляется нулевой символ, представляемый управляющей последовательностью \0. Строковый литерал имеет тип char .

1.1.2. Идентификатор

Идентификатором называется последовательность цифр и букв, а также специальных символов, при условии, что первой стоит буква или специальный символ. Для образования идентификаторов могут быть использованы строчные или прописные буквы латинского алфавита. В качестве специального символа может использоваться символ подчеркивание (_). Два идентификатора для образования которых используются совпадающие строчные и прописные буквы, считаются различными. Например: abc, ABC, A128B, a128b .

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

Ключевые слова

Типы данных и их объявление

Важное отличие языка СИ от других языков является отсутствие принципа умолчания, что приводит к необходимости объявления всех переменных, используемых в программе явно вместе с указанием соответствующих им типов.

Формат объявления переменных имеет следующий вид:

[]

- Спецификатор класса памяти - определяется одним из четырех ключевых слов языка СИ: auto, extern, register, static, и указывает,каким образом будет распределяться память под объявляемую переменную, с одной стороны, а с другой, область видимости этой переменной, т.е., из каких частей программы можно к ней обратиться. Не объязательный элемент и он нужен только в некоторых случаях.

- если переменная может использоваться в других файлах исходного кода программы;

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

- разместить переменную в регистрах МК.

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

Локальные переменные объявляются в самом начале функций- т.е. после фигурной скобки.

- спецификатор типа данных, которых может хранить переменная.

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

Например,

Unsigned char - хранит число от 0 до 255(байт);

Unsigned Int - хранит число от 0 до 65535 (два байта);

Unsigned long Int- хранит число от 0 до 4294967295 (четыре байта).

Вместо Unsigned char можно писать просто char, так как компилятор по умолчанию считает char , беззнаковым.

Signed char - означает знаковую переменную и хранит число от -128 до 127.

Ключевые слова signed и unsigned указывают как интерпретируется нулевой бит объявляемой переменной, т.е., если указано ключевое слово unsigned (беззнаковый), то нулевой бит интерпретируется как часть числа, в противном случае нулевой бит интерпретируется как знаковый. В случае отсутствия ключевого слова unsigned целая переменная считается знаковой. В том случае, если спецификатор типа состоит из ключевого типа signed или unsigned и далее следует идентификатор переменной, то она будет рассматриваться как переменная типа int. Например:

unsigned int n;unsigned int b;int c; (подразумевается signed int c);unsigned d; (подразумевается unsigned int d);signed f; (подразумевается signed int f).

Переменная любого типа может быть объявлена как немодифицируемая. Это достигается добавлением ключевого слова const к спецификатору-типа. Объекты с типом const представляют собой данные используемые только для чтения, т.е. этой переменной не может быть присвоено новое значение. Отметим, что если после слова const отсутствует спецификатор-типа, то подразумевается спецификатор типа int. Если ключевое слово const стоит перед объявлением составных типов (массив, структура, смесь, перечисление), то это приводит к тому, что каждый элемент также должен являться немодифицируемым, т.е. значение ему может быть присвоено только один раз.

const double A=2.128E-2;const B=286; (подразумевается const int B=286) consnant char_ string constant =”this is a string constant”

Данные плавающего типа

Для переменных, представляющих число с плавающей точкой используются следующие модификаторы-типа: float, double, long double (в некоторых реализациях языка long double СИ отсутствует).

Величина с модификатором-типа float занимает 4 байта. Из них 1 бит отводится для знака, 8 бит для избыточной экспоненты и 23 бита для мантиссы. Отметим, что старший бит мантиссы всегда равен 1, поэтому он не заполняется, в связи с этим диапазон значений переменной с плавающей точкой приблизительно равен от 3.14E-38 до 3.14E+38. Величина типа double занимает 8 байт в памяти. Ее формат аналогичен формату float. Биты памяти распределяются следующим образом: 1 бит для знака, 11 бит для экспоненты и 52 бита для мантиссы. С учетом опущенного старшего бита мантиссы диапазон значений равен от 1.7E-308 до 1.7E+308.

float f, a, b;double x,y;

- имя переменной. Например imy peremennoi.

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

Например, moya peremennaya , _vasha funkzia.

Глобальные переменные, а также локальные переменные с модификатором static при старте и рестарте программы равны 0, если им не присвоили иные значения.

Несколько примеров объявления переменных:

Unsigned Char my_peremen=34 ; /* my_peremen определен как Unsigned Char , с присвоением значения 34 (можно и без присвоения) */

Unsigned Int big_ peremen=34634; /* big_ peremen объявлен как Unsigned Int */.

Объявление массива

Массивы - это группа элементов одинакового типа (double, float, int и т.п.). Из объявления массива компилятор должен получить информацию о типе элементов массива и их количестве. Объявление массива имеет два формата:

спецификатор-типа описатель [константное - выражение];

спецификатор-типа описатель ;

Описатель - это идентификатор массива.

Спецификатор-типа задает тип элементов объявляемого массива. Элементами массива не могут быть функции и элементы типа void.

Константное-выражение в квадратных скобках задает количество элементов массива. Константное-выражение при объявлении массива может быть опущено в следующих случаях:

При объявлении массив инциализируется;

Массив объявлен как формальный параметр функции.

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

Каждое константное выражение в квадратных скобках определяет число элементов по данному измерению массива, так что объявление двухмерного массива содержит два константных выражения, трехмерного – три и т.д. Отметим, что в языке Си первый элемент массива имеет индекс равный 0.

Char mass - нумерация элементов начинается с 0, т.е. элементы данного массива называются как mass, mass и в них хранятся числа 11, 22, 33. Где то в программе элементу можно присвоить значение,например mass=210. Можно элементам не присваивать значения.

Строковая переменная или массив содержащий строку символов, например,

Char stroke =”Hello” определяет 6 элементов, хотя в ней содержится всего пять символов. Шестым элементом является управляющий символ, который добавляется в конце строки \0.

Символьный массив можно объявить также без указания количества элементов.

Например,

Char str =” объявление символьного массива”

Выражения и присваивания

Опепранды и операции

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

В языке СИ присваивание также является выражением, и значением такого выражения является величина, которая присваивается.

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

Чтобы поместить число в переменную (в регистр) в языке Си есть оператор присваивания “ = ”. Этот символ в Си означает вычислить результат того, что справа от оператора присваивания и поместить этот результат в переменную находящуюся левее оператора присваивания.

1.PORTB =PINB +34; /* Эта строчка на Си означает Взять (прочитать) значение переменной (регистра) PINB, затем прибавить к нему число 34 и поместить результат в переменную PORTB */

2. ПЕРЕМЕННАЯ=PINC; /* Эта строчка на Си означает взять (прочитать) значение переменной (регистра) PINC и поместить результат в переменную с именем ПЕРЕМЕННАЯ */
3.Строка где переменная стоит слева от “ = “ но через знак & PORTB& =0x23; на Си означает - прочитать содержимое переменной PORTB, затем выполнить "поразрядное (побитное) логическое И" между прочитанным значением и числом 0x23 и поместить (записать, присвоить) результат в переменную PORTB 4. Строка где переменная стоит непосредственно слева от “=” PORTB=0x23; на Си означает - не читаясодержимое переменной PORTB присвоить ей значение 0x23 уничтожив то что было там раньше.
Вместо & "И" (AND - только 1 и 1 дают 1) могут быть и другие побитные логические операции: | "ИЛИ" (OR только 0 и 0 дают 0) ^ "Исключающее ИЛИ" (XOR изменить бит напротив "1") ~ "инвертирование битов" (INV изменить биты регистра на противоположные символы) и арифметические операции: + - * / %
С оператором присваивания используются сокращения:
ДЛИННАЯ ЗАПИСЬ СМЫСЛ СОКРАЩАЕТСЯ ДО
x = x + 1; добавить 1 x++; или ++x;
x = x - 1; вычесть 1 x--; или --x;
x = x + y; прибавить y x += y;
x = x - y; вычесть y x -= y;
x = x * y; умножить на y x *= y;
x = x / y; поделить на y x /= y;
x = x % y; остаток от деления x %= y;
x--; вычесть 1 x -= 1;
x++; добавить 1 x += 1;

Есть в Си операции которые изменяют значение переменной и без оператора присваивания:

PORTA++; /* Эта строчка на Си означает Взять значение переменной PORTA добавить к ней 1 и записать результат обратно в PORTA .Говорят: Инкрементировать регистр PORTA */

PORTC--; /* Эта строчка на Си означает обратное действие! Декрементировать - вычесть 1 из значения регистра PORTC */

Когда инкремент или декремент используется в выражении то важно где стоят два знака + или - перед переменной или после переменной:

a=4; b=7; a = b++;/* Эта строчка на Си означает: взять значение переменной b присвоить его переменной a затем добавить 1 к переменной b и сохранить результат в b.Теперь a будет содержать число 7 , bбудет содержать число 8 */ a=4; b=7; a = ++b;/* Эта строчка на Си означает: взять значение переменной b затем добавить к нему 1 и сохранить результат в b и этот же результат присвоить переменной a.Теперь a будет содержать число 8 и bбудет содержать число 8 */ 1.2.2 Арифметические операции в Си x + y// сложениеx - y// вычитаниеx * y// умножение x / y/* деление. Если числа целые результат - целое число с отброшенной дробной частью - не округленное. Т.е. если в результате деления получается 6.23411 или 6.94 то результат будет просто целое число 6. Если числа с плавающей точкой, то есть float или double и записываются с точкой и числом после точки, то и результат будет число с плавающей точкой без отбрасывания дробной части 131.9739 / 6.18 даст 21.355 */ x % y// вычислить остаток от деления нацело Примеры:

x < y // X меньше Y
x > y // больше
x <= y // меньше или равно
x >= y // больше или равно
x == y // равно
x != y /* не равно Результат выполнения этих операторов: "истина" это "1" (точнее "не ноль"), "ложно" это "0". Значения хранимые в переменных (в регистрах)
х
и у НЕ изменяются. Берутся (считываются) значения хранящиеся (или содержащиеся) в переменных и сравниваются */

1.2.5.Логические операции:

|| // "ИЛИ" - только "ложь" и "ложь"

// дают "ложь"

&& // "И" - только "истина" и "истина"
// дают "истина"

! // "НЕ" - логическое отрицание

В результате логической операции получается НЕ ЧИСЛО, а логическое значение "истина" или "ложь".

Для логических операций && и || берутся результаты выражений слева и справа от знака операции преобразованные в "истину" или "ложь" и определяется логический результат операции.

Компилятор результат "истина" превращает в 1 а не в любое отличное от 0 число.

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

Например:

if ((выражение1)&&((выражение2)||(выражение3)))
{ /* Код программы здесь будет выполняться если:

Выражение1 "Истина" (значит не ноль) и хотя бы одно из выражений 2 и 3 тоже "Истина" (значит не ноль).
} ;

1.3. Используемые конструкции на Си

1.if (){}else {}; идеальная конструкция если нужно выполнить какую то часть программы при наличии каких либо условий или при их отсутствии:

}else { не обязательный элемент конструкции, без него конструкция выглядит так:

if (выражение ) { код на Си /* делать этот код если выражение "истина" - т.е. результат его вычисления не ноль */
};

if (PINB.5) { выполнепние кода Си };
/* если на ножке PB5 есть "1" (не "0" значит "истинно") то программа выполнит код , а если на ней "0" (значит "ложно") то не сделает, а просто пойдет дальше, на следующую строку */

2.while (){};условный цикл (цикл с условием) - используется если нужно выполнять какой то код программы пока выполняется (существует,
"истино" - значит "не ноль") некоторое условие, результат вычисления выражения:

while (выражение) {код на Си /* выполнить этот код если выражение "истина" - т.е. результат его вычисления не ноль. Пока выполняется этот код выражение не проверяется на истинность.После выполнения кода происходит переход к строке while снова проверять истинность выражения */
};

Например:

while (PINA.6) { выполнение кода Си };
/* пока на ножке PA6 есть "1" (не "0" значит "истинно") то программа выполнит код, и опять проверит что на PA6 */ Если бит_6 стал "0" то программа пойдет дальше не выполняя того что в { }

Цикл while имеет вариант

Do - while

при котором код в { } выполняется по меньшей мере один раз независимо от истинности условия в скобках:

do{код на Си /* выполнить этот код один раз затем, если выражение есть "истина" - т.е. результат его вычисления не ноль - опять выполнить код с начала, и так до тех пор пока выражение истина */ } while (выражение); Циклы for(;;) и while() часто используют вот так: while(1); for (;;); /* Так написанные эти циклы означают: МК выполнять эту строчку пока есть питание, нет сброса и нет прерывания. Когда возникает прерывание, программа переходит на обработчик прерывания и (если в обработчике нет перехода в другое место программы) по завершении кода обработчика опять возвращается в этот цикл. */ while(1){ код программы }; for (;;){ код программы }; 4.for(;;){}; - этот цикл позволяет выполнить часть программы нужное число раз:

char i; /* объявление переменной для for это обычная переменная Си и следовательно может иметь любое допустимое имя по вашему желанию и тип */

for (i=5; i<20; i+=4) {
код на Си /* Вначале будет определено "истинно" или "ложно" контрольное выражение i<20. Так как переменной i присвоено значение 5 то контрольное выражение "истинно" и код цикла for будет первый раз выполнен для i=5, затем по выражению i+=4, i станет 9 , теперь снова будет проверена истинность (справедливость, выполнение) контрольного выражение i<20 и так как 9<20 код цикла for будет выполнен еще раз но для i=9. Так будет происходить до тех пор пока результат вычисления контрольного выражения даёт "истинно". Когда результат станет "ложно" - программа выйдет из цикла for не исполняя код. */
};

i = 5 это начальное выражение, то что в начале будет в переменной i. Число 5 просто для примера, может быть таким, как позволяет объявление типа переменной i , в нашем случае это char в большинстве компиляторов по-умолчанию это без знаковый символьный тип - он может хранить числа от 0 до 255

i < 20 - контрольное выражение. Может быть с разными операторами отношения, важно лишь чтобы по ходу цикла оно становилось когда-то "ложью" - иначе цикл "зациклится" т.е. никогда не кончится.

i += 4 - это счетчик или изменение переменной цикла. Обычно это i++ т.е. к переменной добавляется 1 каждый "прогон" цикла. Но опять же может быть таким, какое вам требуется.

Начальным условием - может быть любое допустимое в Си выражение результатом которого является целое число.

Контрольное выражение - определяет до каких пор будет выполнятся цикл.

Счетчик - показывает как изменяется начальное выражение перед каждым выполнением нового цикла.

Выражение - может быть не просто переменная, а функция других переменных, например:

i =(7 + i*4) или i = (функция других переменных).

5. switch (){}; - оператор множественного выбора, позволяет сделать выбор из нескольких вариантов.

Выражение, следующее за ключевым словом switch в круглых скобках, может быть любым выражением, допустимыми в языке СИ, значение которого должно быть целым. Значение этого выражения является ключевым для выбора из нескольких вариантов. Тело оператора switch состоит из нескольких операторов, помеченных ключевым словом case с последующим константным-выражением. Все константные выражения в операторе switch должны быть уникальны. Кроме операторов, помеченных ключевым словом case, может быть, но обязательно один, фрагмент помеченный ключевым словом default. Список операторов может быть пустым, либо содержать один или более операторов. Причем в операторе switch не требуется заключать последовательность операторов в фигурные скобки.

Схема выполнения оператора switch следующая:

Вычисляется выражение в круглых скобках;

Вычисленные значения последовательно сравниваются с константными выражениями, следующими за ключевыми словами case;

Если одно из константных выражений совпадает со значением выражения, то управление передается на оператор, помеченный соответствующим ключевым словом case;

Если ни одно из константных выражений не равно выражению, то управление передается на оператор, помеченный ключевым словом default, а в случае его отсутствия управление передается на следующий после switch оператор.

Все операторы, между начальным оператором и концом тела, выполняются вне зависимости от ключевых слов, если только какой-то из операторов не передаст управления из тела оператора switch. Таким образом, программист должен сам позаботится о выходе из case, если это необходимо. Чаще всего для этого используется оператор break.

switch (выражение) {

case 5 : код на Си
/* этот код будет выполняться если результат вычисления выражения равен числу 5 на этом работа оператора switch закончится */
break;

case -32 : код на Си
/* этот код будет выполняться если результат вычисления выражения равен отрицательномц числу -32. На этом работа оператора switch закончится */
break;

case "G" : код на Си
/* этот код будет выполняться если результат вычисления выражения равен числу соответствующему символу G в таблице ASCII .На этом работа оператора switch закончится */
break;

default: код на Си
/* этот код будет выполняться если результат вычисления выражения не равен ни 5 ни -32 ни "G", а так же после выполнения кода не
имеющего в конце break;

На этом работа оператора switch закончится */
};

/* switch закончен - выполняется дальнейший код программы */

case - может быть столько сколько требуется, чтобы программа работала быстрее наиболее вероятные варианты следует располагать выше.

default - не обязателен. Его можно расположить и не в конце.

break; - если его не использовать то найдя нужный вариант программа будет выполнять и следующие ниже условия case .

6.goto - оператор безусловного (немедленного) перехода.

Оператор goto передает управление на оператор, помеченный меткой имя-метки. Помеченный оператор должен находиться в той же функции, что и оператор goto, а используемая метка должна быть уникальной, т.е. одно имя-метки не может быть использовано для разных операторов программы. Имя-метки - это идентификатор. какой-то код нашей программы на Си... mesto_5:/* сюда мы попадем после выполнения строки программы goto mesto_5 */ код будет выполнятся после goto mesto_5; ... какой-то код нашей программы на Си... mesto_1:/* сюда мы попадем после выполнения строки программы goto mesto_1 */ код будет выполнятся после goto mesto_1; ... какой-то код нашей программы на Си... goto mesto_1;/* перейти в то место программы где в начале строки написано mesto_1: */ ... какой-то код нашей программы на Си... goto mesto_5;/* перейти в то место программы где в начале строки написано mesto_5: */ ... какой-то код нашей программы на Си.

Пример программы на Си

/*пункт 1 заголовок программы

Он оформляется как комментарий, и обычно содержит информацию

О названии, назначении, версии и авторе программы
- краткое описание алгоритма программы
- пояснения о назначении выводов МК и режиме его работы, фьюзы
- компилятор, инструменты и их версии
- другие сведения которые вы считает полезным указать

// пункт 2 включение внешних файлов

#include

/* перед компиляцией, препроцессор компилятора вставит вместо этой строчки содержимое (текст) заголовочного файла "хидера" mega16.h - этот файл содержит перечень регистров имеющихся в МК ATmega16 и соответствие их названий их физическим адресам в МК. Следует указать какой МК вы используете в свойствах проекта в компиляторе */

#include
/* перед компиляцией, препроцессор компилятора вставит вместо этой строчки текст "хидера" delay.h - этот файл содержит функции для создания пауз в программе. Теперь чтобы сделать паузу вам нужно лишь написать: */

/* сделать паузу N (число) микросек. Это должна быть константа - НЕ переменная!!!
например:

delay_us(12 + 7*3);
delay_us(117);

delay_ms(x); /* сделать паузу x милиСек
x - может быть переменная, выражение или число
от 0 до 65535 (тип unsigned int )
например:

delay_ms(3280);
delay_ms(переменная);
delay_ms(переменная*4 + 760); */

//пункт 3 определения пользователя

#define ADC_BUSY PINB.0
#define NCONVST PORTB.1
/* после этих двух строк, перед компиляцией, препроцессор компилятора заменит в тексте программы ADC_BUSY на PINB.0 и NCONVST на PORTB.1
Таким образом вместо того что бы помнить что вывод занятости AD7896 подключен у вас к ножке PB0 вы можете проверять значение осмысленного понятия ADC_BUSY - "АЦП занят" . А вместо управления абстрактной ножкой PB1 (через PORTB.1) вы можете управлять - NCONVST - "стартовать новое АЦ преобразование".

#define - Это удобно! Но ВОВСЕ не обязательно.
*/

Например:

#define invbit(p,n) (p=p^bit(n))

Здесь переменные величины это "p" и "n". Теперь для инвертирования бита 5 в регистре PORTB вам достаточно написать в программе:

invbit(PORTB ,5);

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

Алгоритм

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

Програма на языке Си

При создании программы на языке С мы используем компилятор C PRO for AVR. Это програмная среда специально предназначена для разработки программ на языке С для микроконтроллеров AVR.

Любая современная среда программирования работает не просто с текстом программы, а с так называемым проектом .

Задача программиста лишь написать текст программы, для которого в проекте отводится отдельный файл с расширением “с”. Компилятор переводит исходную программу в шестнадцатеричную систему (создает Hex - файл) для занесения (прошивки) ее в память микроконтроллера.

В дальнейшем мы еще рассмотрим подробно процесс установки и работу с программной средой C PRO for AVR. Сейчас же считаем, что она установлена и запущена.

Сразу после запуска компилятора все параметры принимают значения по умолчанию (все внутренние устройства выключены, внутренние порты ввода- вывода настроены на ввод, используется внутренний генератор с частотой тактирования 4МГц).Это соответствует начальному состоянию микропроцессора после системного сброса. Те параметры, которые нам не нужны трогать пока не будем (оставим по умолчанию).

Программа на языке Си выглядит следующим образом:

1 #Include < Atmega 128.h >

2 Bit oldstate ; //флаг старого состояния

3 Void main () {

4 DDB0 bit=0 ; // установка вывода РВ0 как вход

5 DDRC = 0xFF; // конфигурирование РС как вывод

6 PORTC=0xAA; // в порт С записывается исходный код

9 If (Button (& PINB,0,1,1)) { // обнаружение логической единицы

10 Oldstate =1; // обновление флага

11 if (oldstate && Button (& PINB, 0,1,0)) { // обнаружение перехода из 1в 0

12 PORTB= ~ PORTB; //инвертирование PORTC

13 oldstate=0; // обновление флага

14 } While (1); // бесконечный цикл

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

  • 1. разработки (и/или выбора типовых) аппаратных средств;
  • 2. разработки прикладного программного обеспечения;
  • 3. комплексирования аппаратных средств и программного обеспечения и отладки прототипа системы.

При использовании микропроцессора в качестве комплектующего элемента разработчик системы избавлен от необходимости проектировать и сопровождать технической документацией самую сложную центральную часть изделия. Проектная документация на аппаратные средства изделия содержит только документацию на аппаратуру сопряжения микропроцессора с датчиками и исполнительными механизмами объекта управления. С появлением аналоговых (сигнальных) микропроцессоров, интегральных ЦАП и АЦП, разнообразных больших интегральных схем (БИС) специализированных контроллеров все более сложные функциональные части автоматической системы переходят из разряда подсистем в разряд комплектующих элементов. Так как эти комплектующие элементы являются сложно организованными приборами, функционирующими под управлением программы, то удельный вес прикладного программного обеспечения в микропроцессорных системах имеет устойчивую тенденцию к увеличению, а удельный вес аппаратных средств - к снижению.

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

Проиллюстрируем вышесказанное одним из возможных подходов к созданию систем с использованием микропроцессора на примере проектирования цифрового фильтра.

Пусть требуется создать фильтр низкой частоты (ФНЧ) первого порядка.

На рис. 3.59, а показана принципиальная схема такого фильтра. Порядок фильтра определяется числом входящих в него реактивных элементов, т.е. конденсаторов и катушек индуктивности. Сигналы низких частот проходят через фильтр низкой частоты на его выход. Высокочастотные сигналы “замыкаются” через конденсатор на землю и не появляются на выходе фильтра. На рис. 3.59, б приведена амплитудно-частотная характеристика (АЧХ) этого фильтра. Граничная частота фильтра (частота излома, перегиба) логарифмической АЧХ щc=1/ф (рад/сек), где ф=RC - постоянная времени. Для представления частоты в герцах используется соотношение щc=2рf.

Рис. 3.59 Фильтр нижних частот: а) принципиальная схема; б) АЧХ

Запишем дифференциальное уравнение, описывающее процессы, происходящие в ФНЧ, показанном на рис. 3.59, с учетом, что

i = C dUвых/dt,

тогда уравнение будет иметь вид

цифровой дискретный микропроцессор автоматический

Рассмотрим значения входного и выходного сигналов в дискретные моменты времени nДt, где n = 0, 1, 2, ... и заменим производную конечной разностью

тогда (3.6) примет вид

Проделаем с (3.7) следующие преобразования:

Объединим первые два члена в (3.8) и вынесем за скобки,

Перенесем второй член (3.9) в правую часть равенства и разделим левую и правую часть полученного равенства на (Дt+RC). Тогда

Разделим числитель и знаменатель членов в правой части (3.10) на Дt:

Наконец, обозначив как k1, как k2,

Получаем

Реализовав (3.12) в виде программы для микропроцессора и использовав схему на рис. 3.60 при Дt << RC, получим цифровой фильтр нижних частот

Рис. 3.60 Схема цифрового фильтра

Цифровые устройства, созданные на базе микропроцессоров, имеют ряд преимуществ перед аналоговыми. Приведем некоторые из них на примере рассмотренного выше цифрового фильтра:

  • 1. Нечувствительность характеристик фильтра к разбросу параметров входящих в него элементов, их временному и температурному дрейфам.
  • 2. Малые размеры и высокая надежность работы фильтра, связанные с использованием БИС.
  • 3. Легкость изменения параметров и характеристик цифрового фильтра, что при использовании микропроцессора осуществляется модификацией программного обеспечения или таблиц коэффициентов.
  • 4. Возможность реализации адаптивных фильтров, т.е. фильтров с изменяющимися в процессе работы параметрами.