Южно-Уральский государственный университет
Заочный инженерно - экономический факультет
Контрольная (курсовая) работа №3
По Информатике
Выполнил студент- заочник 2го курса
Шифр – ЭПА-04-588
Группа – 247
«____»___________2009г. «____»___________2009г.
Срок предоставления работы по графику Дата отправки работы
№_____________ по журналу «____»___________2009г.
___________________ Хусаинов Р.З.
отметка о зачете работы
Преподаватель
____________________
Подпись преподавателя
«____»_____________2009г.
1. Построить два графика в одной координатной сетке: функция f(x)=Sin(x)+Sin(3x)/3 и F(x)=Sin(x)+Sin(3x)/3+Sin(5x)/5+Sin(7x)/7. Диапазон изменения переменной х Є[0;6.28]. На графике вывести обозначение масштабов переменных, вывести название графика.
Программа:
/* Программа построения графиков функции*/
/* F(x)=Sin(x)+Sin(3x)/3+Sin(5x)/5+Sin(7x)/7*/
/* и f(x)=Sin(x)+Sin(3x)/3*/
#include <conio.h>
#include <graphics.h>
#include <math.h>
void main()
{
/* Инициализация графического режима и переменных*/
int i,a,bf=220,bF=220;
float x,db;
double dx;
int dr=VGA, mode=VGAHI;
initgraph(&dr,&mode,"c:\\TC\\BGI");
/*initgraph (&dr,&mode,"G:\\lang\\tc\\bgi");*/
/* Прорисовка осей*/
setbkcolor(BLACK); setlinestyle(0,0,2);
line (20,220,640,220); /*X*/
moveto (630,218);lineto(640,220);lineto(630,222);lineto(630,218);
line (20,0,20,440); /*Y*/
moveto (20,0);lineto(18,10);lineto(22,10);lineto(20,0);
/*Разметка осей*/
setcolor (WHITE);
for(i=20;i<440;i=i+20)
{outtextxy (20,i-3,"-");}
outtextxy (30,420,"-1");
outtextxy (30,20,"1");
outtextxy (32,2,"Y");
outtextxy (630,205,"X");
/* Название графика*/
setfillstyle (1,GREEN);
bar (50,435,68,445);
settextstyle (6,0,1);
outtextxy (80,429,"-Функция f(x)=Sin(x)+Sin(3x)/3");
setfillstyle (1,RED);
bar (50,455,68,465);
outtextxy (80,450,"-Функция F(x)=Sin(x)+Sin(3x)/3+Sin(5x)/5+Sin(7x)/7");
/*Определение приращения (x) и координат по осям*/
dx=6.28/580; /*dx с шагом в 1 пиксель по х*/
db=(460-20)/2;
/*Построение графика Sin(x)+(Sin(3x))/3*/
moveto (20,220);
for (i=0;i<=580;i++)
{
setlinestyle(0,0,4);
setcolor(GREEN);
x=dx*i;
a=20+i;
bf=220-db*(sin(x)+(sin(3*x))/3);
lineto(a,bf); /*Рисуем f(х)*/
moveto(a,bF); /*Переходим к F(x)*/
/*Построение графика Sin(x)+(Sin(3x))/3+(Sin(5x))/5+(Sin(7x))/7*/
setcolor(RED);
bF=220-db*(sin(x)+(sin(3*x))/3+(sin(5*x))/5+(sin(7*x))/7);
lineto(a,bF); /*Рисуем F(х)*/
moveto(a,bf); /*Переходим к f(x)*/
/*Ставим метку по оси Х*/
if(i%(580/10)==0)
{
setcolor(WHITE);
outtextxy(a,217,"|");
moveto(a,bf);
gotoxy(a/8+2,15);
printf ("%3.2f",x );
}
}
getch();
closegraph();
}
Пример исполнения:
2.Выполнить расчет определенного интеграла функции f (x)=Sin(x)+(Sin(3x))/3 методом трапеции. Диапазон изменения переменной х=[0;6.28]. Построить график зависимости погрешности расчета интеграла от количества точек расчета N=20…150. Истинное значение рассчитывается с помощью формулы Ньютона-Лейбница.
Программа:
/*Программа построения графика зависимости погрешности расчета интеграла*/
/* функции f(x)=Sin(x)+(Sin(3x))/3 при х=[0;6.28], методом трапеции, */
/* от количества точек расчета 'n'=20...150 */
#include <conio.h>
#include <math.h>
#include <graphics.h>
void main()
{
/* Инициализация графического режима и переменных*/
int i,n,nn,nx=150-20,a,a1,b,b1;
float w,da,db,k,ny=4.45;
double st,sl,y,x,dx;
int dr=VGA, mode=VGAHI;
initgraph(&dr,&mode,"c:\\TC\\BGI");
/*initgraph (&dr,&mode,"G:\\lang\\tc\\bgi");*/
/* Прорисовка осей*/
textcolor(7); setcolor(7); setbkcolor(BLACK); setlinestyle(0,0,2);
line (50,380,640,380); /*X*/
moveto (630,382);lineto(640,380);lineto(630,378);lineto(630,382);
line (50,0,50,380); /*Y*/
moveto (50,0);lineto(48,10);lineto(52,10);lineto(50,0);
/*Разметка осей*/
/*По оси 'Y'*/
for(i=380,k=0;i>=60;i=i-(380-60)/10,k+=ny/10)
{
outtextxy (45,i-3,"-");
gotoxy (1,i/16+1);
printf ("%3.2f",k);
}
/*По оси 'X'*/
for(i=50,k=20;i<=570;i=i+(570-50)/13,k+=10)
{
outtextxy (i-3,380,"|");
gotoxy(i/8+1,25);
printf ("%3.0f",k);
}
outtextxy (62,8,"%");
outtextxy (630,360,"n");
/*Название графика*/
settextstyle(6,0,2); setcolor(7);
outtextxy(10,420,"График зависимости погрешности расчета интеграла, методом");
outtextxy(10,438,"трапеции, функции f(x)=Sin(x)+(Sin(3x))/3 при х=[0;6.28]");
outtextxy(10,456,"от количества точек расчета.");
outtextxy(160,8,"Количество точек расчета?(20...150)-");
gotoxy(70,2); scanf("%d",&nn);
/*Определение приращения по осям*/
da=(570-50)/nx;
db=(380-60)/ny;
/*Расчет итеграла f(x)=Sin(x)+(Sin(3x))/3*/
for(n=20;n<=150;n++)
{
dx=6.28/n;
st=0;sl=0;
for(i=0;i<n;i++)
{
x=dx*i;
/*методом трапеции*/
st+=(((sin(x)+(sin(3*x))/3)+(sin(x+dx)+(sin(3*(x+dx)))/3))/2)*dx;
/*методом Ньютона-Лейбница*/
y=sin(x)+(sin(3*x))/3;
y+=3*(sin(x+dx/3)+(sin(3*(x+dx/3)))/3);
y+=3*(sin(x+dx*2/3)+(sin(3*(x+dx*2/3)))/3);
y+=(sin(x+dx)+(sin(3*(x+dx)))/3);
sl+=y/8*dx;
}
/*Расчет погрешности*/
w=(sl-st)/sl*100;
if(n==nn)
{
setcolor(7);
outtextxy(160,24,"Погрешность");
gotoxy(56,3);
printf("- %6.4f%",w);
outtextxy(80,24*2,"Значение интеграла:");
outtextxy(160,24*3,"метод трапеции");
gotoxy(53,6);
printf("- %+20.18f",st);
outtextxy(160,24*4-8,"метод Ньютона-Лейбница");
gotoxy(53,7);
printf("- %+20.18f",sl);
}
/*Вывод в график*/
setlinestyle(0,1,1);setcolor(GREEN);
a=50+da*(n-20);
b=380-db*w;
if(n==20){a1=a;b1=b;}
else {line(a,b,a1,b1); a1=a; b1=b;}
if(n==nn)
{
setlinestyle(1,1,1);setcolor(7);
moveto(a,b);lineto(a,380);moveto(a,b);
lineto(50,b);moveto(a,b);
}
}
getch();
closegraph();
}
Пример исполнения:
Алгоритм:
1. Высокопроизводительные 8-разрадные RISC микроконтроллеры семейства AT90S AT90S\LS8535 и AT mega8535 фирмы Atmel Corporation: параметры , архитектура, система команд.
AT mega8535
AT mega8535L
8-разрядные КМОП RISC микроконтроллеры с внутрисистемно программируемым Flash ПЗУ
Общие сведения
Как и все микроконтроллеры AVR фирмы «Atmel», микроконтроллеры семейства Mega являются 8-разрядными микроконтроллерами, предназначенными для встраиваемых приложений. Они изготавливаются по малопотребляющей КМОП-технологии, которая в сочетании с усовершенствованной RISC - архитектурой позволяет достичь наилучшего соотношения быстродействие/энергопотребление. Контроллеры описываемого семейства являются наиболее развитыми представителями микроконтроллеров AVR.
Отличительные особенности
К числу особенностей микроконтроллеров AVR семейства Mega относятся:
• FLASH-память программ объемом 8 Кбайт (число цикле стирания/записи не менее 1000);
• оперативная память (статическое ОЗУ) объемом 512 байт;
• память данных на основе ЭСППЗУ (EEPROM) объем 512 байт (число циклов стирания/записи не мене 100000);
• возможность защиты от чтения и модификации памяти программ и данных;
• возможность программирования непосредственно в системе через последовательные интерфейсы SPI и JTAG;
• возможность самопрограммирования;
• возможность внутрисхемной отладки в соответствии со стандартом IEEE 1149.1 (JTAG);
• различные способы синхронизации: встроенный RC-генератор с внутренней или внешней времязадающей RC-цепочкой или с внешним резонатором (пьезокерамическим или кварцевым); внешний сигнал синхронизации;
• наличие нескольких режимов пониженного энергопотребления;
• наличие детектора снижения напряжения питания (brown-out detector,BOD);
• возможность программного снижения частоты тактового генератора.
Характеристики процессора
Подавляющее большинство основных характеристик процессора микроконтроллеров семейства Mega такие же, что и у микроконтроллеров других семейств — Classic и Tiny:
• полностью статическая архитектура; минимальная тактовая частота равна нулю;
• АЛУ подключено непосредственно к регистрам общего назначения;
• многоуровневая система прерываний; поддержка очереди прерываний.
В то же время процессор микроконтроллеров семейства Mega имеет ряд характеристик, присущих именно этому семейству:
• 130 команд, большинство команд выполняются за один машинный цикл;
• 17 внутренних+3 внешних источников прерываний;
• наличие программного стека во всех моделях семейства;
• наличие аппаратного умножителя.
Характеристики подсистемы ввода/вывода
Все характеристики подсистемы ввода/вывода микроконтроллеров семейства Mega такие же, как и у микроконтроллеров других семейств:
• программное конфигурирование и выбор портов ввода/вывода;
• выводы могут быть запрограммированы как входные или как выходные независимо друг от друга;
• входные буферы с триггером Шмитта на всех выводах;
• возможность подключения ко всем входам внутренних подтягивающих резисторов (сопротивление резисторов составляет 35...120кОм).
Периферийные устройства
Микроконтроллеры семейства Mega имеют наиболее богатый набор периферийных устройств (ПУ). При этом в большинстве моделей имеются все ПУ, которые вообще встречаются в составе микроконтроллеров AVR. Этими устройствами являются:
• 2а 8-разрядных таймера/счетчика (таймеры ТО и Т2
• 16-разрядный таймер/счетчик (таймер ТЗ);
• 4 генератора сигнала с ШИМ разрядностью 8 бит (один из режимов работы 8-разрядных таймеров/счетчиков ТО и Т2);
• аналоговый компаратор;
• многоканальный 10-разрядный АЦП как с несимметричными, так и с дифференциальными входами;
• полнодуплексный универсальный синхронный/асинхронный приемопередатчик (USART);
• последовательный синхронный интерфейс SPI;
• последовательный двухпроводный интерфейс TWI (аналог интерфейса 12С).
Архитектура ядра
Ядро микроконтроллеров AVR семейства Mega выполнено по усовершенствованной RISC-архитектуре (enhanced RISC). Арифметико-логическое устройство (АЛУ), выполняющее все вычисления подключено непосредственно к 32-м рабочим регистрам, объединенным в регистровый файл. Благодаря этому АЛУ выполняет одну операцию (чтение содержимого регистров, выполнение операции и запись результата обратно в регистровый файл) за один машинным цикл. Практически каждая из команд (за исключением команд у которых одним из операндов является 16-разрядный адрес) занимает одну ячейку памяти программ.
AT90S8535
AT90LS8535
8-разрядные КМОП RISC
микроконтроллеры с внутрисистемно программируемым Flash ПЗУ
Отличительные особенности
• AVR RISC архитектура - архитектура высокой производительности и малого потребления
• 118 команд, большинство которых выполняется за один машинный цикл
• 8 Кбайт Flash ПЗУ программ, с возможностью внутрисистемного перепрограммирования и загрузки через SPI последовательный канал,1000 циклов стирание/запись
• 512 байтов ЭСППЗУ данных, с возможностью внутрисистемного перепрограммирования и загрузки через SPI последовательный канал, 100000 циклов стирание/запись
• 512 байтов встроенного СОЗУ
• 32 x 8 бит регистра общего назначения
• 32 программируемые линии ввода/вывода
• 8-канальный 10-разрядный аналого-цифровой преобразователь
• 16-разрядный и 32-разрядный формат команд
• Программируемый полный дуплексный UART
• Диапазон напряжений питания от 2,7 В до 6,0 В (AT90LS8535) и от 4,0 В до 6,0 В (AT90S8535)
• Полностью статический прибор - работает при тактовой частоте от 0 Гц до 8 МГц
(AT90S8535) и при тактовой частоте от 0 Гц до 4 МГц (AT90LS8535)
• Производительность до 8 MIPS при частоте 8 МГц
• Два 8-разрядных таймера/счетчика с отдельным прескалером и режимом сравнения
• 16-разрядный (с режимами сравнения и захвата) таймер/счетчик с отдельным прескалером
• Три ШИМ канала
• Внешние и внутренние источники сигналов прерывания
• Программируемый сторожевой таймер с собственным встроенным генератором
• Встроенный аналоговый компаратор
• Встроенные часы реального времени с собственным встроенным генератором и режимом счетчика
• Блокировка режима программирования
• Режимы энергосбережения: пассивный (idle), экономичный (power save) и стоповый(power down)
• Встроенная схема сброса по подаче питания
• Промышленный (-40°C...85°C) и коммерческий (0°C...70°C) диапазоны температур
• 40-выводной корпус PDIP и 44-выводные PLCC и TQFP
Архитектура микроконтроллеров семейства Mega
Микроконтроллеры AVR семейства Mega являются 8-разрядными микроконтроллерами с RISC-архитектурой. Они имеют электрически стираемую память программ (FLASH) и данных (EEPROM), а также разнообразные периферийные устройства. Следует отметить, что микро контроллеры семейства Mega имеют самый богатый набор периферийных устройств по сравнению с микроконтроллерами других семейств. Более того, состав этих устройств от модели к модели практически не меняется (меняются только их функциональные возможности). К устройствам, присутствующим не во всех моделях семейства, относятся АЦП, модуль двухпроводного интерфейса TW1 (Two Wire Interface, аналог шины 12С), а также модуль интерфейса JTAG. Структурная схема микроконтроллеров семейства Mega приведена на Рис.
Организация памяти
В микроконтроллерах AVR реализована Гарвардская архитектура, в соответствии с которой разделены не только адресные пространства памяти программ и памяти данных, но также и шины доступа к ним. Способы адресации и доступа к этим областям памяти также различны. Такая структура позволяет центральному процессору работать одновременно как с памятью программ, так и с памятью данных, что существенно ограничивает производительность. Каждая из областей памяти данных (ОЗУ и EEPROM) также расположена в своем адресном пространстве.
Память программ
Память программ предназначена для хранения команд, управляющих функционированием микроконтроллера. Память программ также часто используется для хранения таблиц констант, не меняющихся во время работы программы.
Как уже было сказано, память программ представляет собой электрически стираемое ППЗУ (FLASH-ПЗУ). В связи с тем что длина всех команд кратна одному слову (16 бит), память программ имеет 16-разрядную организацию. Соответственно, объем памяти микроконтроллеров семейства составляет 8К (8x1024) 16-разрядных слов. Логически память программ разделена на две неравные части — область прикладной программы и область загрузчика. В последней может располагаться специальная программа (загрузчик), позволяющая микроконтроллеру самостоятельно управлять загрузкой и выгрузкой прикладных программ. Если же возможность самопрограммирования микроконтроллера не используется, прикладная программа может располагаться и в области загрузчика.
Для адресации памяти программ используется счетчик команд (PC — Program Counter). Размер счетчика команд составляет 12разрядов
По адресу $0000 памяти программ находится вектор сброса. После инициализации (сброса) микроконтроллера выполнение программы начинается с этого адреса (по этому адресу должна размещаться команда перехода к инициализационной части программы). Начиная с адреса $001 памяти программ, располагается таблица векторов прерываний. Размер этой области 20 байт ($001…$014).
При возникновении прерывания после сохранения в стеке текущего значения счетчика команд происходит выполнение команды, расположенной по адресу соответствующего вектора. Поэтому по этим адресам располагаются команды перехода к подпрограммам обработки прерываний. В качестве этих команд используются команды относительного перехода (RJMP.
Если прерывания в программе не используются либо таблица векторов прерываний располагается в области загрузчика, то основная программа может начинаться непосредственно с адреса $0001.
Как известно, память программ может использоваться не только для хранения кода программы, но также и для хранения различных констант. Для пересылки байта из памяти программ в память данных имеется специальная команда — LPM. При использовании команды LPM адрес, по которому производится чтение, определяется содержимым индексного регистра Z. При этом старшие 15 разрядов содержимого регистра будут определять адрес слова (0...32К), а младший разряд будет определять, какой из байтов будет прочитан: «О» — младший байт, «1» — старший байт
В заключение следует отметить, что FLASH-ПЗУ, используемое в микроконтроллерах AVR, рассчитано как минимум на 1000 циклов стирания/записи.
Память данных
Память данных микроконтроллеров разделена на три части: регистровая память, оперативная память (статическое ОЗУ) и энерго независимое ЭСППЗУ (EEPROM).
Регистровая память включает 32 регистра общего назначения (РОН), объединенных в файл, и служебные регистры ввода/вывода (РВВ).
В обеих областях регистров ввода/вывода располагаются различные служебные регистры (регистр управления микроконтроллером, регистр состояния и т. п.), а также регистры управления периферийными устройствами, входящими в состав микроконтроллера
Для хранения переменных программ помимо регистров общего назначения также может использоваться статическое ОЗУ объемом 512 байт.
Для долговременного хранения различной информации, которая может изменяться в процессе функционирования готовой системы (калибровочные константы, серийные номера, ключи и т. п.), в микроконтроллерах используется EEPROM-память. Ее объем составляет 512 байт. Эта память расположена в отдельном адресном пространстве, а доступ к ней осуществляется с помощью определенных РВВ.
Статическое ОЗУ
Прежде всего, следует сказать, что в микроконтроллерах AVR используется линейная организация памяти. Объем статического ОЗУ составляет 512 байт
В адресном пространстве ОЗУ также расположены все регистры микроконтроллеров, под них отведены младшие 96 адресов. Остальные адреса отведены под 512ячеек статического ОЗУ
Каждый регистр имеет свой собственный адрес в пространстве памяти данных. Поэтому к ним можно обращаться двумя способами (как к регистрам и как к памяти), несмотря на то что физически эти регистры не являются ячейками ОЗУ. Такое решение является еще одной отличительной особенностью архитектуры AVR, повышаю щей эффективность работы микроконтроллера и его производительность.
. Регистры ввода/вывода
Все регистры ввода/вывода условно можно разделить на две группы — служебные регистры микроконтроллера и регистры, относя щиеся к конкретным периферийным устройствам (в т. ч. регистры портов ввода/вывода).
Во всех микроконтроллерах семейства Mega (как и в микроконтрол лерах остальных семейств) регистры ввода/вывода располагаются в так называемом пространстве ввода/вывода размером 64 байта
К РВВ, расположенным в основном пространстве ввода/вывода, можно напрямую обратиться с помощью команд IN и OUT, выполняющих пересылку данных между одним из 32-х РОН и пространством ввода/вывода. В системе команд имеется также четыре команды поразрядного доступа, использующие в качестве операндов регистры ввода/вывода: команды установки/сброса отдельного бита (SBI и CBI) и команды проверки состояния отдельного бита (SBIS и SBIC). К сожалению, эти команды могут обращаться только к 1-й половине основных регистров ввода/вывода (адреса $00...$1F).
Помимо непосредственной адресации (с помощью команд IN и OUT), к РВВ можно обращаться и как к ячейкам ОЗУ с помощью соответствующих команд ST/SD/SDD и LD/LDS/LDD
В первом случае используются адреса РВВ, принадлежащие основному пространству ввода/вывода ($00...$3F). Во втором случае адрес РВВ необходимо увеличить на $20.
Среди всех РВВ есть один регистр, используемый наиболее часто в процессе выполнения программ. Этим регистром является регистр состояния SREG. Он располагается по адресу $3F ($5F) и содержит набор флагов, показывающих текущее состояние микроконтроллера. Большинство флагов автоматически устанавливаются в «1» или сбрасываются в «О» при наступлении определенных событий (в соответствии с результатом выполнения команд). Все разряды этого регистра доступны как для чтения, так и для записи; после сброса микроконтроллера все разряды регистра сбрасываются в «О».
Способы адресации памяти данных
Микроконтроллеры поддерживают 8 способов адресации для доступа к различным областям памяти данных (РОН, РВВ,ОЗУ).
Вообще говоря, в действительности способов адресации всего два: прямая адресация и косвенная. Однако каждый способ адресации имеет несколько разновидностей в зависимости от того, к какой области памяти производится обращение (при прямой адресации) или какие дополнительные действия выполняются над индексным регистром (при косвенной адресации).
Прямая адресация
При прямой адресации адреса операндов содержатся непосредственно в слове команды. В соответствии со структурой памяти данных существуют следующие разновидности прямой адресации: прямая адресация одного РОН, прямая адресация двух РОН, прямая адресация РВВ, прямая адресация ОЗУ.
Косвенная адресация
При использовании команд косвенной адресации с постинкрементом после обращения по адресу, который находится в индексном регистре, содержимое индексного регистра увеличивается на 1.
Адресация ОЗУ
Микроконтроллеры семейства поддерживают 6 команд (по 2 для каждого индексного регистра) косвенной адресации с постинкрементом: LD Rd, X+/Y+/Z+ (пересылка байта из ОЗУ в РОН) и ST X+/Y+/Z+, Rd (пересылка байта из РОН в ОЗУ). Адрес регистра общего назначения содержится в разрядах 8... 4 слова команды.
Энергонезависимая память данных (EEPROM)
Все микроконтроллеры семейства Mega имеют в своем составе энергонезависимую память (EEPROM-память). Объем этой памяти 512 байт. EEPROM-память расположена в своем адресном пространстве и так же, как и ОЗУ, организована линейно. Для работы с EEPROM-памятью используются три регистра ввода/вывода: регистр адреса, регистр данных и регистр управления.
Регистр адреса
Регистр адреса EEPROM-памяти EEAR (EEPROM Address Register) физически размещается в двух РВВ EEARH:EEARL, расположенных по адресам $1F (S3F) и $1Е ($ЗЕ) соответственно. В этот регистр загружается адрес ячейки, к которой будет производиться обращение. Регистр адреса доступен как для записи, так и для чтения. При этом в регистре EEARH задействуются только младшие разряды (количество задействованных разрядов зависит от объема EEPROM-памяти). Незадействованные разряды регистра EEARH доступны только для чтения и содержат «О».
Регистр данных
Регистр данных EEPROM-памяти EEDR (EEPROM Data Register) расположен по адресу $1D ($3D). При записи в этот регистр загружаются данные которые должны быть загружены в EEPROM. При чтении помещаются данные считанные из EEPROM.
Регистр управления
Регистр управления EEPROM-памяти EECR (EEPROM control Register) расположен по адресу $1С ($3C). Этот регистр используется для управления доступом к EEPROM-памяти
Прерывания
Общие сведения
Прерывание прекращает нормальный ход программы для выполнения приоритетной задачи, определяемой внутренним или внешним событие» микроконтроллера. При возникновении прерывания микроконтроллер сохраняет в стеке содержимое счетчика команд PC и загружает в него адрес соответствующего вектора прерывания. По этому адресу, как правило, находится команда безусловного перехода к подпрограмме обработки прерывания. Последней командой подпрограммы обработки прерывания должна быть команда RETI, которая обеспечивает возврат в основную программу и восстановление предварительно сохраненного счетчика команд.
Поскольку источниками прерываний, в частности, являются различные периферийные устройства микроконтроллеров, количество прерываний зависит от конкретной модели.
Таблица векторов прерываний
Как и все микроконтроллеры AVR, микроконтроллеры семейства Mega имеют многоуровневую систему приоритетных прерываний. Младшие адреса памяти программ начиная с адреса $0001 отведены под таблицу векторов прерывания. Каждому прерыванию соответствует адрес в этой таблице, который загружается в счетчик команд при возникновении прерывания. Положение вектора в таблице также определяет и приоритет соответствующего прерывания: чем меньше адрес, тем выше приоритет прерывания. Размер вектора прерывания зависит от объема памяти программ микроконтроллера и составляет 1 байт. Соответственно для перехода к подпрограммам обработки прерываний используются команды RJMP.
Таблица может располагаться не только и начале памяти программ, а также и в начале области загрузчика. Причем перемещение таблицы может быть осуществлено непосредственно в ходе выполнения программы.
Управление размещением таблицы прерываний осуществляется двумя младшими разрядами регистров GICR: IVSEL (1-й разряд) и IVSE (0-й разряд). Состояние флага IVSEL определяет положение таблицы в памяти программ. Если флаг сброшен в «О», таблица векторов прерываний располагается в начале памяти программ, если флаг установлен в «1» — в начале области загрузчика. Конкретное значение начального адреса области загрузчика зависит от установок конфигурационных ячеек BOOTSZ1 и BOOTSZO. Разряд IVСЕ предназначен для разрешения изменения флага IVSEL.
Для изменения положения таблицы векторов прерываний необходимо установить разряд IVСЕ в «1» и затем в течение следующих четырех машинных циклов занести требуемое значение в разряд IVSEL. При этом разряд IVCE сбрасывается в «О». В противном случае разряд IVСЕ будет сброшен аппаратно по истечении четырех машинных циклов, запрещая дальнейшее изменение флага IVSEL.
На время выполнения описанной последовательности прерывания автоматически запрещаются и разрешаются только после сброса флага IVCE. Состояние флага I регистра SREG при этом не меняется. Если прерывания в работе микроконтроллера не предусматриваются, то на месте таблицы векторов прерываний может быть размещена часть основной программы
Счетчик команд и выполнение программы
Счетчик команд
Счетчик команд представляет собой регистр, в котором содержится адрес следующей исполняемой команды. Напрямую из программы он недоступен. Размер счетчика команд зависит от объема имеющейся памяти программ и составляет 12 разрядов.
При нормальном выполнении программы содержимое счетчика команд автоматически увеличивается на 1 или на 2 (в зависимости от выполняемой команды) в каждом машинном цикле. Этот порядок нарушается при выполнении команд перехода, вызова и возврата из подпрограмм, а также при возникновении прерываний.
После включения питания, а также после сброса микроконтроллера в счетчик программ автоматически загружается стартовый адрес $0000 или начальный адрес сектора загрузчика. Как правило, по этому адресу располагается команда безусловного перехода к инициализационной части программы.
При возникновении прерывания в счетчик команд загружается адрес соответствующего вектора прерывания. Если прерывания используются в программе, по адресам векторов прерываний должны размещаться команды перехода к подпрограммам обработки прерываний.
Как и во всех микроконтроллерах AVR, в микроконтроллерах семейства Mega используется конвейерная обработка команд.
Абсолютный вызов подпрограммы — команда CALL
При выполнении команды после сохранения в стеке текущего значения счетчика команд в последний загружается число, являющееся операндом команды. С помощью этой команды можно осуществлять вызов в пределах всего адресного пространства имеющихся на сегодняшний день микроконтроллеров AVR.
Команда абсолютного вызова подпрограмм выполняется за 4 машинных цикла.
Косвенный вызов подпрограммы — команда ICALL
Команда ICALL сначала сохраняет в стеке значение счетчика команд. Затем в счетчик команд загружается содержимое индексного регистра. Максимально возможная величина перехода составляет 64К слов (128 Кбайт), поэтому данная команда также не имеет ограничений по области действия.
Как и команда RCALL, команда косвенного вызова подпрограмм выполняется за 3 машинных цикла.
Команды возврата из подпрограмм
В конце каждой подпрограммы обязательно должна находиться команда возврата из нее. В системе команд микроконтроллеров семейства имеется две таких команды. Для возврата из обычной подпрограммы, вызываемой командой RCALL, используется команда RET. Для возврата из подпрограммы обработки прерывания используется команда RETI.
Обе команды восстанавливают из стека содержимое счетчика команд, сохраненное там перед переходом к подпрограмме. Команда возврата из подпрограммы RETI дополнительно устанавливает в «1» флаг общего разрешения прерываний I регистра SREG, сбрасываемый аппаратно при возникновении прерывания.
На выполнение каждой из команд возврата из подпрограммы требуется 4 машинных цикла.
Стек
Во всех микроконтроллерах семейства стек реализован программно. Он размещается в памяти данных, и его глубина определяется только размером свободной области памяти программ. В качестве указателя стека во всех моделях используется пара регистров ввода/вывода SPH:SPL, расположенных по адресам $ЗЕ ($5Е) и $3D ($5D) соответственно. Так как после подачи напряжения питания (или после сброса) в регистрах содержится нулевое значение, в самом начале программы указатель стека необходимо проинициализировать, записав в него значение верхнего адреса памяти данных.
При вызове подпрограмм адрес команды, расположенной за командой вызова, сохраняется в стеке. Значение указателя стека при этом уменьшается на 2, т. к. для хранения счетчика команд требуется 2 байта. При возврате из подпрограммы этот адрес извлекается из стека и загружается в счетчик команд. Значение указателя стека соответственно увеличивается на 2. То же происходит и во время прерывания. При генерации прерывания адрес следующей команды сохраняется в стеке, а при возврате из подпрограммы обработки прерывания он восстанавливается из стека.
Во всех моделях микроконтроллеров семейства стек доступен программно. Для работы со стеком в наборе команд имеется две команды: команда занесения в стек (PUSH) и команда извлечения из стека (POP).
Порты ввода/вывода
Общие сведения
Каждый порт микроконтроллеров состоит из определенного числа выводов, через которые микроконтроллер может осуществлять прием и передачу цифровых сигналов. Задание направления передачи данных через любой контакт ввода/вывода может быть произведено программно в любой момент времени.
Выходные буферы всех портов, имея симметричные нагрузочные характеристики, обеспечивают высокую нагрузочную способность при любом уровне сигнала. Нагрузочной способности достаточно для непосредственного управления светодиодными индикаторами.
Входные буферы всех выводов построены по схеме триггера Шмитта. Для всех входов имеется возможность подключения внутреннего подтягивающего резистора между входом и шиной питания.
Отличительной особенностью портов микроконтроллеров семейства Mega (как и всех микроконтроллеров AYR) при использовании их в качестве цифровых портов ввода/вывода общего назначения является реализация истинной функциональности вида «чтение/модификация/запись». Благодаря этому можно выполнять операции над любым выводом (с помощью команд SBI и CBI), не влияя на другие выводы порта. Это относится к изменению режима работы контакта ввода/вывода, к изменению состояния выходного буфера (для выходов) и к изменению состояния внутреннего подтягивающего резистора (для входов).
Регистры портов ввода/вывода
Обращение к портам производится через регистры ввода/вывода. Под каждый порт в адресном пространстве ввода/вывода зарезервировано по 3 адреса, по которым размещены следующие регистры: регистр данных порта PORTx, регистр направления данных DDRx и регистр выводов порта PINx. Действительные названия регистров получаются подстановкой названия порта вместо символа «х», соответственно регистры порта А называются PORTA, DDRA, PINA, порта В — PORTB, DDRB, PINB и т. д. Поскольку с помощью регистров PIN* осуществляется доступ к физическим значениям сигналов на выводах порта, они доступны только для чтения, тогда как остальные два регистра доступны и для чтения, и для записи.
Таймеры
Таймер/счетчик ТО имеет минимальный набор функций. Он может использоваться только для отсчета и измерения временных интервалов или как счетчик внешних событий, возможность генерации сигналов с широтно-импульсной модуляцией (ШИМ) фиксированной разрядности, а также возможность работать в асинхронном режиме в качестве часов реального времени.
Таймер/счетчик Т2 полностью аналогичен таймеру/счетчику ТО
Таймер/счетчик ТЗ имеет те же функциональные возможности, что и ТО, он может работать в качестве широтно-импульсного модулятора, но уже переменной разрядности и к тому же многоканальный.
Сторожевой таймер
Как и микроконтроллеры остальных семейств, все микроконтроллеры семейства Mega имеют в своем составе сторожевой таймер, предназначенный для защиты микроконтроллера от сбоев в процессе работы. Исполнение сторожевого таймера одинаково для всех моделей семейства.
Сторожевой таймер имеет независимый тактовый генератор, поэтому он работает даже во время нахождения микроконтроллера в любом из спящих режимов. Типовое значение частоты этого генератора равно 1 МГц при Vcс=5.0В. Фактическая частота генератора зависит oт напряжения питания устройства, температуры, технологического разброса.
Если сторожевой таймер включен, то через промежутки времени равные его периоду, он выполняет сброс микроконтроллера. Чтобы избежать сброса при нормальном выполнении программы, сторожевой таймер необходимо регулярно сбрасывать через промежутки времени, меньшие его периода. Сброс сторожевого таймера осуществляется командой WDR.
Для управления сторожевым таймером предназначен регистр WDTCR, который во всех моделях расположен по адресу $21 ($41).
Назначение выводов таймеров/счетчиков
Каждый таймер/счетчик использует один или более выводов микроконтроллера. Эти выводы — линии портов ввода/вывода общего назначения, а функции, реализуемые этими выводами при работе совместно с таймерами/счетчиками, являются их альтернативными функциями.
Аналоговый компаратор
Модуль аналогового компаратора входит в состав всех без исключения микроконтроллеров семейства Mega. Будучи включенным, компаратор позволяет сравнивать значения напряжений, присутствующих на двух выводах микроконтроллера. Результатом сравнения является логическое значение, которое может быть прочитано из программы. По результату сравнения может быть сгенерировано прерывание, а также осуществлен захват состояния таймера/счетчика Т1. Последняя функция позволяет, в частности, измерять длительности аналоговых сигналов.
Используемые компаратором выводы являются контактами портов ввода/вывода общего назначения
Чтобы указанные выводы могли использоваться аналоговым компаратором, они должны быть сконфигурированы как входы (соответствующий разряд регистра DDRx установлен в «1»). Кроме того, необходимо отключить внутренние подтягивающие резисторы записью лог. 0 в соответствующий разряд регистра PORTх.
Аналого-цифровой преобразователь
Модуль 10-разрядного АЦП последовательного приближения входящий в состав моделей имеет следующие основные параметры:
• абсолютная погрешность: ±2 МЗР;
• интегральная нелинейность: ±0.5 МЗР;
• быстродействие: до 15 тыс. выборок/с.
На входе модуля АЦП всех моделей имеется 8-канальный аналоговый мультиплексор, предоставляющий в распоряжение пользователя 8 каналов с несимметричными входами.
В качестве источника опорного напряжения для АЦП может использоваться как напряжение питания микроконтроллера, так и внутренний либо внешний источник опорного напряжения.
В процессе работы АЦП может функционировать в двух режимах:
• режим одиночного преобразования, когда запуск каждого преобразования инициируется пользователем;
• режим непрерывного преобразования, когда запуск преобразований выполняется непрерывно через определенные интервалы времени.
Универсальный асинхронный (синхронный/асинхронный) приемопередатчик
Все без исключения микроконтроллеры семейства Mega имеют в своем составе модули либо универсального асинхронного (UART), либо универсального синхронно/асинхронного (USART) приемопередатчика. Более того, в некоторых моделях имеется по два таких модуля. Заметим, что модули USART при работе в асинхронном режиме совместимы с модулями UART как по расположению разрядов управляющих регистров, так и по функционированию. Небольшие различия имеются только в работе схемы буферизации блока приемника модулей и в названии (но не в назначении) некоторых разрядов управляющих регистров.
Все модули приемопередатчиков обеспечивают полнодуплексный обмен по последовательному каналу, при этом скорость передачи данных может варьироваться в довольно широких пределах. В модулях UART посылка может быть 8- или 9-разрядной, а в модулях USART ее длина может составлять от 5 до 9 разрядов. Еще одной особенностью модулей USART является наличие схем формирования и контроля четности.
Модули USART/UART, реализованные в микроконтроллерах семейства, могут обнаруживать следующие внештатные ситуации:
• переполнение;
• ошибка кадрирования;
• неверный старт-бит.
Для уменьшения вероятности сбоев в модулях также реализована такая полезная функция, как фильтрация помех.
Для взаимодействия с программой в модулях предусмотрены 3 прерывания, запрос на генерацию которых формируется при наступлении следующих событий: «передача завершена», «регистр данных передатчика пуст» и «прием завершен».
Как обычно, выводы микроконтроллера, используемые модулями USART/UART, являются линиями портов ввода/вывода общего назначения.
Последовательный периферийный интерфейс SPI
Последовательный периферийный интерфейс SPI (Serial Peripheral In-lerface), имеет двоякое назначение. Во-первых, с его помощью может осуществляться обмен данными между микроконтроллером и различными периферийными устройствами, такими, как цифровые потенциометры, ЦАП/АЦП, FLASH-ПЗУ и др. Посредством этого интерфейса также может производиться обмен данными между несколькими микроконтроллерами AVR. Кроме того, через интерфейс SPI может быть осуществлено программирование микроконтроллера (т. е. режим последовательного программирования). При обмене данными по интерфейсу SPI микроконтроллер AVR может работать как ведущий (режим «Master») либо как ведомый (режим «Slave»). При этом пользователь может задавать скорость передачи (семь программируемых значений) и формат передачи (от младшего разряда к старшему или наоборот).
Дополнительной возможностью подсистемы SPI является «пробуждение» микроконтроллера из режима Idle при поступлении данных.
Модуль SPI использует четыре вывода микроконтроллера. Как и для большинства прочих периферийных устройств, эти выводы являются линиями портов ввода/вывода общего назначения.
Последовательный двухпроводный интерфейс
Модуль двухпроводного последовательного интерфейса (Two-wire Serial Interface, TWI) является полным аналогом базовой версии интерфейса 12С фирмы «Philips». Интерфейс TWI позволяет объединить вместе до 128 различных устройств с помощью двунаправленной шины, состоящей всего из двух линий: линии тактового сигнала (SCL) и линии данных (SDA). Единственными дополнительными элементами для реализации шины являются два подтягивающих резистора, по одному на каждую линию.
Шинные формирователи всех TWI-совместимых устройств выполняются по схеме с открытым коллектором (стоком), что позволяет реализовать функцию «монтажное И». Соответственно, НИЗКИЙ уровень на линии устанавливается тогда, когда одно или более устройств выставляют на линию сигнала лог. 0, а ВЫСОКИЙ уровень на линии устанавливается тогда, когда все устройства, подключенные к ней, устанавливают свои выходы в третье состояние.
Общие сведения о системе команд
Введение в систему команд
Система команд микроконтроллеров весьма развита и насчитывает до 130 различных инструкций. Несмотря на то что микроконтроллеры AVR являются микроконтроллерами с RISC-архитектурой (процессор с сокращенным набором команд), по количеству реализованных инструкций и их разнообразию они больше похожи на микроконтроллеры с CISC-архитектурой (процессор с полным набором команд). Практически каждая из команд (за исключением команд, у которых одним из операндов является 16-разрядный адрес) занимает только одну ячейку памяти программ. Причем это достигнуто не за счет сокращения количества команд процессора, а за счет увеличения разрядности памяти программ.
Операнды
Программа для любого микроконтроллера представляет собой последовательность команд, записанных в памяти программ. Большинство команд при выполнении изменяют содержимое одного или нескольких регистров общего назначения, регистров ввода/вывода или ячеек ОЗУ.
Для обращения к различным областям адресного пространства памяти данных используются различные команды, реализующие, в свою очередь, различные способы адресации
Доступ к регистрам ввода/вывода осуществляется по их адресам, являющимися операндами команды. Вместе с тем при написании ассемблерных программ гораздо удобнее обращаться к регистрам, используя вместо числовых значений адресов их стандартные, принятые символические имена.
Чтобы задать соответствие этих имен реальным адресам необходимо подключить в начале программы (при помощи директивы ассемблера .INCLUDE) файл определения адресов регистров ввода/вывода. Помимо всего прочего, такое решение облегчит перенос программного обеспечения с одного типа кристалла на другой.
Эти файлы (для каждой модели микроконтроллеров семейства) свободно распространяются фирмой «Atmel» вместе с документацией на микроконтроллеры (в частности, они, находятся на web-сайте фирмы). Для РОН, входящих в состав индексных регистров, в этих файлах определяются также дополнительные символические имена
Дополнительные символические имена индексных регистров
Регистр | Символическое имя |
R26 | XL |
R27 | ХН |
R28 | YL |
R29 | YH |
R30 | ZL |
R31 | ZH
|