Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МУ_КП_МУИС.doc
Скачиваний:
0
Добавлен:
15.11.2019
Размер:
4.33 Mб
Скачать
  1. Пример разработки программного обеспечения мпс

Выполним разработку программного обеспечения (ПО) для тестирования электронных узлов МПС. В качестве среды разработки выберем программу ProView32 фирмы Franklin Software Inc. ProView32 – интегрированная среда разработки программного обеспечения для однокристальных микроконтроллеров семейства х51 и его клонов. Она включает в себя средства для создания, редактирования, компиляции, трансляции, компоновки, загрузки и отладки программ:

- стандартный интерфейс Windows;

- полнофункциональный редактор исходных текстов с выделением синтаксических элементов цветом;

- организатор проекта;

- транслятор с языка C;

- ассемблер;

- отладчик;

- встроенную справочную систему.

Все примеры ПО, рассмотренные ниже, действительны для имитационной модели, разработанной в разделе 2.

    1. Настройка UART и выдача сообщения «Start».

Разработку ПО МПС рекомендуется начать с настройки UART. Рассмотрим пример, в котором выполняется настройка UART на первый режим работы (8 информационных бит, переменная скорость) на скорости 1200 Бод с выдачей сообщения «Start».

#include<reg51.h> //Подключили файл с описанием регистров специальных функций МК

#include<stdio.h> //Подключили файл с описанием стандартных функций ввода/вывода Си

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

void main()

{

//Настройка таймера

TH1=240;//Настройка скорости UART (1200 Бод)

TMOD=0x20;//Настройка таймера для UART (2-й режим с автоперезагрузкой)

TR1=1;//Пуск Т1

//Настройка UART

SCON=0x50;

TI=1;//Без этого не работают стандартные функции ввода-вывода

printf(«Start\n»);//Выдали сообщение по UART

while(1);

}

Рис. 4.1 – Результат работы программы

    1. Выдача в UART данных по запросу.

В данном примере МК настроен на прием байта по прерыванию. Если принятый символ “1” выдается сообщение «Hello_1», если “2” – «Hello_2». Для имитации запроса необходимо в Протеусе установить курсор в окно Virtual Terminal и нажать на клавиатуре ПК соответствующий символ.

#include<reg51.h> //Подключили файл с описанием регистров специальных функций МК

#include<stdio.h> //Подключили файл с описанием стандартных функций ввода/вывода Си

//Обработчик прерываний по UART **********************************************************

void UART() interrupt 4

{

if (RI==1) //Если установлен флаг приема байта, то..

{

RI=0;//Обнулили флаг приемника

if (SBUF=='1')//Если приняли символ '1', то..

{

TI=1;//Установили флаг передатчика

printf("Hello_1\n");//Выдали сообщение

TI=0;//Сбросили флаг передатчика

}

if (SBUF=='2')

{

TI=1;

printf("Hello_2\n");

TI=0;

}

}

}

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

void main()

{

//Настройка таймера

TH1=240;//Настройка скорости UART (1200 Бод)

TMOD=0x20;//Настройка таймера для UART (2-й режим с автоперезагрузкой)

TR1=1;//Пуск Т1

//Настройка UART

SCON=0x50;

//Настройка прерываний

ES=1;//Разрешили прерывание по UART

EA=1;//Сняли общую блокировку прерываний

while(1);

}

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

Для реализации динамического принципа индикации используем таймер Т0. Для того, чтобы человеческий глаз не замечал мерцаний индикатора необходимо, чтобы информация на всех разрядах индикатора обновлялась с частотой не менее 25 Гц (Т=40 мс). Определим максимально допустимый интервал времени обновления одного разряда

мс,

где Nразр – число разрядов в дисплее.

Выберем второй режим работы таймера Т0. Это 8-разрядный режим. Определим период переполнения таймера

мс.

Получили, что период переполнения таймера 0,42 мс меньше предельного времени обновления разряда 6,7 мс, что полностью нас устраивает.

#include<reg51.h>

#define Fosc 7.37e+6

//Регистры ППА

at 0x4000 unsigned char xdata PA;

at 0x4001 unsigned char xdata PB;

at 0x4002 unsigned char xdata PC;

at 0x4003 unsigned char xdata RUS;

char n;//Указатель разряда

unsigned char buf[6];//Буфер индикатора

unsigned char scan=0xFE;//Код сканирования разрядов индикатора

//Обработчик прерываний от Т0 ************************************************************

void timer_0() interrupt 1

{

P1=0xFF;//Потушили

PC=(n << 4);//Выбрали знакоместо

P1=~buf[n];//Выдаем на инф. шину очередной символ

n++;//указатель на следующее знакоместо

if (n==6) n=0; //закольцевали

}

//Функция перекодировки символа в код семисегментного индикатора *************************

unsigned char Decoder(char Sim)

{

unsigned char kod;

switch (Sim)

{

case 0: kod=0x3F; break;

case 1: kod=0x06; break;

case 2: kod=0x5B; break;

case 3: kod=0x4F; break;

case 4: kod=0x66; break;

case 5: kod=0x6D; break;

case 6: kod=0x7C; break;

case 7: kod=0x07; break;

case 8: kod=0x7F; break;

case 9: kod=0x6F; break;

}

return (kod);

}

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

void main()

{

//Настройка ППА

RUS=0b10010001;//Настройка ППА_1: РА-ввод, РВ-вывод, младшая тетрада РС-ввод, старшая-вывод

//Настройка таймера и системы прерываний

TMOD=0x02;//Т0 8 разрядов

ET0=1;//Разрешили прерывания от Т0

EA=1;//сняли блокировку прерываний

TR0=1;//запустили индикацию

//Выдали на индикацию символы 123456

buf[0]=Decoder(1);

buf[1]=Decoder(2);

buf[2]=Decoder(3);

buf[3]=Decoder(4);

buf[4]=Decoder(5);

buf[5]=Decoder(6);

while(1);

}

Рис. 4.2 – Результат работы программы

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

Ниже приведена функция, которая заполняет буфер индикатора кодами символов, соответствующих разрядам некоторой целочисленной переменной.

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

void OutDinIndic(unsigned long x)

{

unsigned long temp;

if (x>999999) x=999999;//Ограничили сверху

temp=x/100000;//сотни тысячь

buf[0]=Decoder(temp);

x=x-temp*100000;

temp=x/10000;//десятки тысяч

buf[1]=Decoder(temp);

x=x-temp*10000;

temp=x/1000;//тысячи

buf[2]=Decoder(temp);

x=x-temp*1000;

temp=x/100;//сотни

buf[3]=Decoder(temp);

x=x-temp*100;

temp=x/10;//десятки

buf[4]=Decoder(temp);

buf[5]=Decoder(x%10);

}

    1. Функция тестирования ОЗУ.

Для тестирования ОЗУ необходимо вначале записать во все ячейки ОЗУ известный байт. Затем прочитать содержимое всех ячеек. Если прочитанное значение будет отличаться от записанного, выдаем сообщение «RAM Error», иначе – «RAM Ok».

#include<reg51.h> //Подключили файл с описанием регистров специальных функций МК

#include<stdio.h> //Подключили файл с описанием стандартных функций ввода/вывода Си

//Массив ячеек ОЗУ

at 0x0000 unsigned char xdata RAM[8192];

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

void testRAM()

{

short i;

bit error=0;

for(i=0;i<=8191;i++) RAM[i]='Q';

for(i=0;i<=8191;i++) if (RAM[i]!='Q') error=1;

if (error==1) printf("test RAM error\n");

else printf("test RAM ok\n");

}

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

void main()

{

//Настройка таймера

TH1=240;//Настройка скорости UART (1200 Бод)

TMOD=0x20;//Настройка таймера для UART (2-й режим с автоперезагрузкой)

SCON=0x50;//Настройка UART

TR1=1;//Пуск Т1

TI=1;//Без этого не работают стандартные функции ввода-вывода

printf("Start\n");//Выдали сообщение по UART

testRAM();

while(1);

}

Рис. 4.3 – Результат работы программы

    1. Работа с ЦАП.

Рассмотрим пример синтеза с помощью ЦАП синусоидального сигнала с периодом 20 мс и амплитудой 5 В.

Программное обеспечение состоит из двух функций: основной системной функции main и системной функции-обработчика прерывания от Т0 – timer_0. В основной функции выполняется настройка таймера Т0 и системы прерываний, а также заполняется массив кодов ЦАП MasKodDAC[ ].

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

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

#include<reg51.h>//Подключили библиотеку с описанием SFR регистров МК 8051

#include<math.h> //Подключили библиотеку с описанием математических функций

#define Fosc 7.37e+6

//Исходные данные:

#define TH 130 //Автозагружаемая константа для обеспечения периода переполнения 200 мкс

#define N 100 //Число точек синтеза синусоиды

//Сигнал ЦAП

sbit LE = 0xB2;

//Регистры ППА

at 0x4000 unsigned char xdata PA;

at 0x4001 unsigned char xdata PB;

at 0x4002 unsigned char xdata PC;

at 0x4003 unsigned char xdata RUS;

//Описание глобальных переменных

data unsigned char MasKodDAC[100];//Массив кодов ЦАП

data unsigned char j;//Счетчик кодов ЦАП

//Функция вывода в ЦАП ******************************************************************

void DAC(unsigned char kodDAC)

{

PB=kodDAC;

LE=1;

LE=0;

}

//Функция-обработчик прерывания от таймера Т0 ******************************************

void timer_0() interrupt 1

{

// TH0=TH;//Перезагрузили счетные регистры начальными значениями

DAC(MasKodDAC[j]);//Выдали очередной код в ЦАП

j++;//Инкрементировали счетчик кодов ЦАП

if (j==100) j=0;//Проверка на выход за диапазон

}

//Основная системная функция **********************************************************

void main()

{

unsigned char i;

TMOD=0x02;//Настройка таймера

TH0=TH;//Автозагружаемое при переполнении значение

ET0=1;//Разрешили прерывание от Т0

EA=1;//Общее разрешение прерываний

//Цикл формирования массива кодов ЦАП

for(i=0;i<N;i++) MasKodDAC[i]=128+128*sin(2*3.14*i/N);

TR0=1;//Запуск Т0

while(1);

}

Рис. 4.4 – Подключение осциллографа к выходу ЦАП

Рис. 4.5 – Результат работы программы

    1. Программа тестирования МПС.

Листинг программы тестирования МПС приведен в приложении А. В основной функции main() выполняется инициализация сигналов управления АЦП и ЦАП, настройка портов параллельного периферийного адаптера, таймеров, системы прерываний и UART. На дисплее засвечивается тестововый набор цифр «123456». В последовательный порт выдается сообщение «Start». Выполняется тестирование ОЗУ. На выходе ЦАП формируется сигнал с уровнем 1/3 от Umax. Осуществляется однократное аналого-цифровое преобразование с выдачей кода АЦП по UART.

На рисунке 4.6 приведены результаты работы программы тестирования МПС.

Рис. 4.6 – Результат работы тестового ПО.