Память ЕЕРRОМ микроконтроллеров АVR

Многие микроконтроллеры АVR оборудованы встроенной памятью ЕЕРRОМ — электрически перезаписываемой энергонезависимой памятью. Хотя эта память и допускает запись, она редко используется для хранения программных переменных, поскольку, во-первых, медленнодействующая, и, во-вторых, имеет ограниченный (хотя и довольно большой) цикл перезаписи.

Учитывая вышесказанное, память ЕЕРRОМ используют, преимущественно, для хранения данных, которые не должны быть потеряны даже при потере пита­ния. Это очень удобно, к примеру, при калибровке измерительных приборов, ра­ботающих под управлением микроконтроллеров, у которых в памяти ЕЕРRОМ в процессе настройки сохраняются параметры корректировки. Благодаря этому, в большинстве случаев полностью отпадает необходимость в настроечных потен­циометрах и триммерах.

В отличие от флэш-памяти, для записи/чтения памяти ЕЕРRОМ нет необхо­димости в специальном программаторе — эти операции доступны программно и допускают побайтную передачу данных с помощью регистра управления ЕЕСR, регистра данных ЕЕDR. и регистровой пары ЕЕАRL, ЕЕАRН, определяющей адрес ячейки памяти (см. табл. 1.1).

В CodeVision AVR чтобы определить константы, хранящиеся во FLASH-памяти, следует использовать ключевые слова flash или const.

Чтобы определить константы, хранящиеся в EEPROM, следует использовать ключевое слово eeprom.

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

Константные выражения автоматически определяются в течение компиляции.

Пример:

/* эти константы будут расположены в EEPROM */

eepromint int_const1=12-7;//Целаяконстанта int_const1будетравна 5

eepromcharchar_const=’b’;//Символьная константа char_const будет равна числовому

//ASCII символа ‘b’, т. е. 0x62

/* Эти константы будут расположены во FLASH-памяти */

flash long long_int_const=136L;//целаядлиннаяконстанта

//long_int_constбудетравна 136

flashintint_array[10]={9,16};// этот целочисленный массив имеет 10 членов,

//причем первые два это 9 и 16, а остальные нули

constint int_const2=0123;//Целаяконстанта int_const2 будетравна 123

/* Эта константа будет расположена в регистре */

registerint int_const3=0x10;

/* эти константы будут расположены в SRAM */

int int_const4=0b10;

char string_const[]=”HELLO”;// этостроковаяконстанта

Константы НЕ МОГУТ быть объявлены в функциях.

Рисунок 3 – Модель схемы в Proteus

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

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

Память ЕЕРRОМ микроконтроллеров АVR - student2.ru

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

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

Память ЕЕРRОМ микроконтроллеров АVR - student2.ru

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

Память ЕЕРRОМ микроконтроллеров АVR - student2.ru

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

Память ЕЕРRОМ микроконтроллеров АVR - student2.ru

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

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

Память ЕЕРRОМ микроконтроллеров АVR - student2.ru

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

Краткие технические характеристики стенда 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);

}

Память ЕЕРRОМ микроконтроллеров АVR - student2.ru

Рисунок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. Как включить десятичные точки?

Наши рекомендации