Управление внутренней памятью микроконтроллеров AVR — КиберПедия 

Автоматическое растормаживание колес: Тормозные устройства колес предназначены для уменьше­ния длины пробега и улучшения маневрирования ВС при...

История развития хранилищ для нефти: Первые склады нефти появились в XVII веке. Они представляли собой землянные ямы-амбара глубиной 4…5 м...

Управление внутренней памятью микроконтроллеров AVR

2017-11-17 342
Управление внутренней памятью микроконтроллеров AVR 0.00 из 5.00 0 оценок
Заказать работу

Лабораторная работа №1

 

УПРАВЛЕНИЕ ВНУТРЕННЕЙ ПАМЯТЬЮ МИКРОКОНТРОЛЛЕРОВ AVR

АРХИТЕКТУРА МИКРОКОНТРОЛЛЕРОВ АVR И РIС

 

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

 

Введение

 

В принципе, все микроконтроллеры построены по одной схеме. Система управления, состоящая из счетчика команд и схемы декодирования, выполняет считывание и декодирование команд из памяти программ, а операционное устрой­ство отвечает за выполнение арифметических и логических операций; интерфейс ввода/вывода позволяет обмениваться данными с периферийными устройствами; и, наконец, необходимо иметь запоминающее устройство для хранения программ и данных (рис. 1.1).

Рисунок 1.Обобщенная структура микроконтроллера

Не будем привязывается к какому-либо конкретному типу микроконтроллеров АVR. или РIС, поэтому ниже будут рассмотрены только общие для большинства микроконтроллеров особенности архитектуры памяти, вопросы ввода/вывода, обработки прерываний, сброса и др.

Память

 

В микроконтроллерах АVR и РIС память реализована по Гарвардской архи­тектуре, что подразумевает разделение памяти команд и данных. Это означает, что обращение к командам осуществляется независимо от доступа к данным. Преимуществом такой организации является повышение скорости доступа к памяти.

К тому же, в микроконтроллерах Р1С к памяти данных и к памяти команд можно обращаться фактически одновременно, что еще больше повышает скорость обра­ботки программ. Рассмотрим, какие типы памяти могут использоваться в микро­контроллерах АVR и РIС.

Память данных

 

Память данных предназначена для записи/чтения данных, используемых программами. Является энергозависимой, то есть, при отключении питания микро­контроллера все хранимые в ней данные, будут потеряны. В микроконтроллерах АVR память данных имеет более развитую структуру по сравнению с микроконтроллерами РIC, что показано на рис. 1.2.

Примечние: Здесь и далее шестнадцатеричные числа будут представлены ы форме принятой в языке С: с префиксом 0X

 

 

Рисунок 2. Структура памяти данных в микроконтроллерах АVR и РIC

 

Область статической памяти SRАМ (StaticRandomАссеssМеmогy) обозначе­на на рис. 1.2 пунктиром, поскольку используется не всеми микроконтроллерами АVR (это относится как к внутренней, так и к внешней SRАМ). Ее начальный адрес — 0x060, а верхний адрес — разный в различных устройствах.

В некоторых микроконтроллерах АVR можно увеличивать пространство памяти SRАМ посредством подключения внешних блоков памяти вплоть до 64 Кбайт, однако для этого приходится пожертвовать портами А и С, которые в этом случае применяются для передачи данных и адресов.

 

Регистры общего назначения

Область регистров общего назначения (рабочих регистров) предназначена для временного хранения переменных и указателей, используемых процессором для выполнения программ. В микроконтроллерах АVR она состоит из 32 восьмиразрядных регистров (диапазон адресов 0x000 - 0x01F). В микроконтроллерах Р1Срегистры общего назначения также восьмиразрядные, однако их количество и диапазон адресов зависят от конкретного типа устройства.

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

 

Стек

 

Стек — это особая область памяти данных, используемая процессором для временного хранения адресов возврата из подпрограмм, промежуточных результатов вычислений и др. В микроконтроллерах РIС и некоторых микроконтролле­рах АVR стек реализован аппаратно — для этого выделено отдельное запоми­нающее устройство фиксированного объема в несколько (или несколько десятков) байт. Для микроконтроллеров АVR компиляторы языка С (например, при обра­щении к подпрограммам) могут также создавать один или более стеков программ­но, начиная с верхних адресов области SRАМ.

Стек действует по принципу LIFO — "Lastin, FirstOut", что означает "по­следним вошел, первым вышел". Это означает, что новые данные вначале поме­щаются на вершину (первый уровень) стека, а затем, с поступлением следующих данных, "проталкиваются" на его нижние уровни. Извлечение из стека происходит в обратном порядке: вначале считываются данные, помещенные последнимина вершину, после чего данные, размещенные на нижних уровнях, как бы "вытал­киваются" на один уровень вверх. Ячейка памяти, которая является в данный мо­мент вершиной стека, адресуется указателем стека (для АVR — регистровой па­рой SPL, SPH).

Поскольку область памяти данных, отводимая для программного стека, огра­ничивается только объемом памяти SRАМ, при написании программ следует сле­дить за тем, чтобы стек не становился слишком большим, затирая полезные данные.

 

Память программ

 

Память программ как в микроконтроллерах АVR, так и в микроконтроллерах РIС реализована по технологии Flash-ЕРRОМ, которая подразумевает программи­рование пользователем и вытирание электрическим способом. Размер этой памяти варьируется в зависимости от микроконтроллера и обычно составляет несколько Кбайт командных слов.

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

Адресация команд в памяти программ реализуется с помощью специального регистра — счетчика команд, разрядность которого определяет допустимый раз­мер этой памяти. Разрядность ячеек памяти программ, в зависимости от типа мик­роконтроллера, может составлять 14-16 бит.

Кроме того, следует отметить, что в микроконтроллерах РIС в первых ячейках памяти программ (начиная с адреса 0x0000) содержатся векторы (адреса перехода) сброса и прерываний.

Рекомендации

 

Для настройки UART рекомендуется использовать встроенный в CodeVision генератор кода CodeWizard. Для этого необходимо запустить генератор кода (рис.3), выбрать закладку управления USART (рис.4), выполнить настройку UART на требуемую скорость и режим, а затем запустить предварительный просмотр кода (рис.5). В открывшемся окне отыскать и скопировать фрагмент программы инициализации UART.

 

Рисунок 4 – Значок генератора кода

 

Для корректного вывода по UART переменных типа float необходимо выбрать соответствующую опцию компилятора (рис.6). В случае недостатка памяти увеличить размер стека.

 

 

Рисунок 5 – Вид закладки USART

 

 

Рисунок 6 – Выбор предварительного просмотра кода

 

 

Рисунок 7 – Выбор типов выдаваемых по UART данных

 

Таблица 2 – Поддерживаемые символы типа преобразования для функций вывода. (Лебедев М.Б. CV пособие для начинающих. С. 256-260)

 

ВАЖНО! Для правильной работы необходимо изменить скорость обмена данными компонента «Виртуальный терминал» в соответствии с заданием.

 

 

Краткие технические характеристики стенда EV8031/AVR:

– Два последовательных канала передачи данных RS232;

– Устройство дискретного ввода информации: 2 кнопки;

– Клавиатура 4х3

– Статическая 4-разрядная семисегментная светодиодная индикация;

– Динамическая 4-х разрядная семисегментная индикация (плата расширения);

– Статическая светодиодная индикация, 8 шт.;

– Знакосинтезирующий светодиодный индикатор 5x7 1 шт. (плата расширения);

– Цифроаналоговый и аналого-цифровой преобразователь (плата расширения);

– Генератор с фиксированной частотой генерации – около 10 Кгц, генератор с изменяемой частотой генерации от 1 кГц до 50 кГц (плата расширения).

Микроконтроллер стенда работает в микропроцессорном режиме. В этом режиме параллельные порты РА и РС выполняют альтернативне функции и формируют внешнюю 16-разрядную шину адреса и 8-разрядную шину данных. Для фиксации младшего байта адреса используется регистр защелка U5 (см. рис.8). Внешняя периферия (память, индикация, клавиатура и т.п.) подключаются непосредственно к этим шинам. Чтобы исключить конфликт устройств на шине дешифраторы шины адреса U19 и U20 формирует сигналы выбора кристалла CS (ChipSelect), посредством которых в конкретно выбранный момент времени активируется только одно внешнее устройство на шине даннях.

 

 

Рис.8 Узел центрального процессора стенда

 

Статическая индикация в стенде представлена линейкой светодиодов и 4-разрядным ССИ.

Линейка светодиодов содержит 8 светодиодов HL1-HL8, доступ к которым осуществляется как к ячейке внешнего ОЗУ по адресу 0A006h. Светодиоды зажигаются записью логических единиц в соответствующие разряды. Схемотехника узла линейки светодиодов стенда приведена на рисунке 9.

Четырехразрядный семисегментный светодиодный индикатор подключен к системному контроллеру, который автоматически выполняет декодирование двоичного кода в код семисегментного индикатора. Схема статического ССИ стенда приведена на рисунке 10. Индикатор работает всегда, сразу после подачи питания. Контроллер индикатора содержит два восьмиразрадных регистра, содержимое которых отображается на индикаторе. Содержимое регистра с адресом 0xA000 отображается на двух левых разрядах, содержимое регистра с адресом 0xВ000 – на двух правых разрядах в шестнадцатеричной форме. Управление десятичными точками и гашением осуществляется через регистр DC_REG (0xA004). Биты DP3..DP0 управляют десятичными точками. Запись 1 в соответствующий разряд включает десятичную точку. Биты BL3..BL0 управляют гашением разрядов индикатора. Запись 1 в эти биты вызывает гашение соответствующего разряда индикатора (см.рис.11).

 

Рис.9 Узел линейки светодиодов

 

Рис.10 Схема статического индикатора стенда

 

 

Рис.11 Адреса и управляющие биты статического индикатора

 

Пример программирования статических индикаторов стенда

Пример. Засветить 4 левые светодиоды линейки светодиодов.

#include<mega8515.h>

//Описание регистров стенда

unsigned char *leds=(unsigned char *)0xA006;

//****************************************************************************************

Voidmain()

{

MCUCR=(MCUCR | 0b11000000);//Работаем со стендом (МП-режим и задержка)

*leds=0x0F;//Засветили 4 светодиода линейки светодиодов

while(1);

}

 

Пример. Программа обеспечивает мигание с частотой 1 Гц числа 1234.

#include<mega8515.h>

#include<delay.h>

//Описаниерегистровстенда

unsigned char *ind12=(unsigned char *)0xA000;

unsigned char *ind34=(unsigned char *)0xB000;

unsigned char *DC_REG=(unsigned char *)0xA004;

//****************************************************************************************

Void main()

{

MCUCR=(MCUCR | 0b11000000);

*ind12=0x12;

*ind34=0x34;

while(1)

{

*DC_REG=0;//Зажгли

delay_ms(500);

*DC_REG=0x0F;//Потушили

delay_ms(500);

}

}

 

Пример. Функция вывода целочисленной переменной на статический индикатор в диапазоне от 0 до 9999.

//Функция вывода переменной на статический индикатор *************************************

//Диапазон: 0-9999

//Формат вывода: 0-9999 без гашения

voidOutStatIndic_1(unsignedshortx)

{

unsigned char buf[4];

if (x>9999) x=9999;

buf[0]=x/1000;//единицы кГц

x=x-(short)buf[0]*1000;

buf[1]=x/100;//сотни герц

x=x-(short)buf[1]*100;

buf[2]=x/10;//десятки герц

buf[3]=x%10;//остаток - герцы

*DC_REG=0;

//вывод на индикатор

*ind12=(buf[0]<<4)+buf[1];

*ind34=(buf[2]<<4)+buf[3];

}

Пример. Функция вывода целочисленной переменной на статический индикатор в диапазоне от 0 до 65535 в формате _,1- 65,5 с гашением незначащих разрядов.

//Функция вывода переменной на статический индикатор *************************************

//Диапазон: 100-65535

//Формат вывода:,1- 65,5 с гашением незначащих разрядов

void OutStatIndic_2(unsigned short x)

{

unsigned char buf[3],temp;

x=x/100;//округлили до сотен Гц

buf[0]=x/100;//десяткикГц

x=x-(short)buf[0]*100;

buf[1]=x/10;//единицы килогерц

buf[2]=x%10;//остаток - сотни герц

temp=0b01000001;

//гашение незначащих нулей

if (buf[0]==0)

{

temp=(temp | 0b00000010);

if (buf[1]==0) temp=(temp | 0b00000100);

}

*DC_REG=temp;

//вывод на индикатор

*ind12=buf[0];

*ind34=(buf[1]<<4)+buf[2];

}

 

Задание

1. Вывести Ф.И.О.

2. Вывести построчно:

X1=100; (Х1 переменная типа unsignedchar)

Y1=1000; (Y1 переменная типа unsignedshort)

Z1=100000; (Z1 переменная типа unsignedlong)

F1=3,1416. (F1 переменная типа float)

X2= –100; (Х2 переменная типа signedchar)

Y2= –1000; (Y2 переменная типа signedshort)

Z2= –100000; (Z2 переменная типа signedlong)

F2= –40,230С.

3. Переслатьтекст Ф. И. О. студента выполняющего лабораторную работу из Flash-памяти (фамилия) из EEPROM (имя отчество) в оперативную память SRAM. Текст из SRAM выдать на UART оператором printf. В первой программе не должно быть указателей, во второй нужно использовать указатели.

4. Вывести информацию на статические индикаторы и светодиодную линейку в соответствии с таблицей вариантов.

 

Таблица 3 – Варианты заданий

Вариант ОбработкаMAS СкоростьUART, Бод
                        Реализовать «бегущий огонь» влево на линейкесветодиодов. Реализовать «бегущий огонь» вправо на линейкесветодиодов. Реализовать «бегущуютень» вправо на линейкесветодиодов. Выдать на статическийиндикатор номер по журналу с гашениемнезначащихразрядов. Выдать число _3,14 на статическийиндикатор. Отобразить «1234» в виде бегущей строки вправо. Отобразить «1234» в виде бегущей строки влево. Реализовать «бегущий огонь» влево на линейкесветодиодов. Реализовать «бегущий огонь» вправо на линейкесветодиодов. Реализовать «бегущуютень» вправо на линейкесветодиодов. Выдать на статическийиндикатор номер по журналу с гашениемнезначащихразрядов. Выдать число _3,14 на статическийиндикатор. Отобразить «1234» в виде бегущей строки вправо. Отобразить «1234» в виде бегущей строки влево. Реализовать «бегущий огонь» влево на линейкесветодиодов. Реализовать «бегущий огонь» вправо на линейкесветодиодов. Реализовать «бегущуютень» вправо на линейкесветодиодов. Выдать на статическийиндикатор номер по журналу с гашениемнезначащихразрядов. Выдать число _3,14 на статическийиндикатор. Отобразить «1234» в виде бегущей строки вправо. Отобразить «1234» в виде бегущей строки влево.                        

 


 

Пример. Форматированный вывод по UART переменных различных типов.

 

#include <mega8515.h>

#include <stdio.h>

//Функцияначальнойинициализации ********************************************************

Voidsetup()

{

// USART initialization

// Communication Parameters: 8 Data, 1 Stop, No Parity

// USART Receiver: Off

// USART Transmitter: On

// USART Mode: Asynchronous

// USART Baud Rate: 9600

UCSRA=0x00;

UCSRB=0x08;

UCSRC=0x86;

UBRRH=0x00;

UBRRL=0x2F;

}

//***************************************************************************************

void main(void)

{

char *W="Primer";

unsigned char ux=100;

signed char sx=-100;

unsigned short uy=1000;

signed short sy=-1000;

unsigned long uz=100000;

signed long sz=-100000;

float pi=3.1416;

setup();

printf("Start\r");

printf("%s\r",W);

printf("ux=%u\r",ux);

printf("sx=%d\r",sx);

printf("uy=%u\r",uy);

printf("sy=%d\r",sy);

printf("uz=%lu\r",uz);

printf("sz=%ld\r",sz);

printf("pi=%f\r",pi);

while (1);

}

 

 

Рисунок8 – Результат работы программы

 

Пример. Работа с памятью различных типов

/* В программе нет указателей*/

#include<90s8515.h>

#include <stdio.h>

flash char char_const[] = "bcdef";//Массив "bcdef" расп. программ. пам. FLASH

unsigned char memr[5];

char k;

voidmain (void)

{

/* ВключениепередатчикаUART*/

UCR=0x08;

/* скорость передачи 9600 бод */

UBRR=0x19;

for(k=0;k<=4;k++)//Цикл вывода массива MEMR на UART

{memr[k]=char_const[k];

printf(" %c",memr[k]);

}

printf("\r");//переводстроки

while(1);

}

 

/* Пример программы, выполняющей теже функции с использованием указателей*/

#include<90s8515.h>

#include <stdio.h>

flash unsigned char char_const[] = {'b','c','d','e','f','\0'};//Массив "bcdn

//flash char char_const[] ="bcdef";

unsigned char memr[6];

char k;

unsigned char z;

unsigned char *pam;// Указательнапеременнуютипа unsigned char, находящуюся

// в SRAM

flash unsigned char *pam1;//Указательнапеременнуютипа unsigned char,

находящуюся // во Flash-памяти

void main (void)

{

unsignedchar *pam;// Указательнапеременнуютипаunsignedchar, находящуюся

// в SRAM

flash unsigned char *pam1;//Указательнапеременнуютипа unsigned char,

находящуюся // во Flash-памяти

/* ВключениепередатчикаUART*/

UCR=0x08;

/* скорость передачи 9600 бод */

UBRR=0x19;

for(k=0;k<=5;k++)//Цикл вывода массива MEMR на UART

{

z=*pam1++;

*pam=z;

printf("%c ",*pam++);//вывод содержимого memr по указателю на UART

}

printf("\r");//перевод строки

while(1);

}

 

Порядок выполнения работы

 

1. Написать программы на языке Си, реализующую поставленную задачу.

2. Выполнить компиляцию программы в CODEVISION AVR и получить файлы с расширением *.hex и.cof.

3. Выполнить отладку разработанной программы.

4. Собрать схему согласно задания и проверить работоспособность программы в симуляторе Proteus.

 

 

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

 

1. Задание

2. Текст программы на языке СИ согласно варианта задания

3. Результаты выполнения программы.

 

Контрольные вопросы

 

1. Перечислите все ключевые слова для определения констант, находящихся во Flash-памяти, EEPROM-памяти, в регистрах и оперативной памяти.

2. Что означает в последовательности символов конечный символ ‘\0’.

3. Что означает символ типа преобразования для функции вывода.

4. Типы данных языка Си.

5. Достоинства светодиодов.

6. Схемы подключения к МК одиночного светодиода.

7. Схемы подключения к МК RGB-светодиодов.

8. Назначение семисегментных светодиодных индикаторов (ССИ). Расположение сегментов и их обозначение.

9. Условное графическое обозначение (УГО) одиночных ССИ и способы соединения сегментов.

10. Схемы подключения одиночных ССИ к МК.

11. УГО многоразрядных ССИ.

12. Адреса статических индикаторов стенда.

13. Как погасить выбранные разряды дисплея ССИ?

14. Как включить десятичные точки?

 

Лабораторная работа №1

 

УПРАВЛЕНИЕ ВНУТРЕННЕЙ ПАМЯТЬЮ МИКРОКОНТРОЛЛЕРОВ AVR


Поделиться с друзьями:

Биохимия спиртового брожения: Основу технологии получения пива составляет спиртовое брожение, - при котором сахар превращается...

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

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

Археология об основании Рима: Новые раскопки проясняют и такой острый дискуссионный вопрос, как дата самого возникновения Рима...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.16 с.