Система накопления данных

Автор работы: Пользователь скрыл имя, 28 Января 2014 в 22:02, курсовая работа

Описание работы

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

Содержание работы

Введение 6
1 Обзор литературы. 7
2 Анализ технического задания. 12
3 Разработка структурной схемы системы и ее описание. 21
4 Разработка функциональной схемы системы и ее описание 24
4.1 Микроконтроллер ADuC812 24
4.2 Внешняя память E2PROM 25
4.3 Матричная клавиатура AK1604A-WWB 26
4.4 Жидкокристаллический индикатор WH1602B-NGK-CP 28
4.5 Часы реального времени PCF8583P 29
4.6 ПЛИС PM3064ATC100 30
4.7 Интерфейс RS232 (COM порт) 32
4.8 Интерфейс процессора с памятью 33
5 Разработка схемы электрической принципиальной системы и ее описание 36
6 Разработка программного обеспечения. 37
6.1 Разработка программы для микроконтроллера 37
6.1.1 Создание нового проекта 38
6.1.2 Резидентный загрузчик НЕХ202 38
6.1.3 Загрузка программ в лабораторный стенд SDK-1.1 39
6.1.4 Описание основной части кода программы для микроконтроллера 40
6.2 Разработка программы для ПК 42
Заключение. 44
Список использованных источников. 45

Файлы: 1 файл

ПЗ22 12new.doc

— 1.01 Мб (Скачать файл)

При включении питания  происходит инициализация всех регистров  специального назначения их значениями по умолчанию и на ЖКИ выводится  надпись «SDK-1.1, 2001 ©LMT Ltd». Одновременно на звуковой излучатель выдается короткий сигнал.

После процедуры инициализации  системы последовательный канал  настраивается в режим 9600 бит/сек, 8 бит данных, 1 стоп-бит, нет контроля четности и в него выдается строчка  «НЕХ202-ХХ», где XX — номер версии загрузчика. Далее с интервалом примерно в 200мс выдается символ ‘.’ и ожидается ответ программы-загрузчика, запускаемой на компьютере. После успешной загрузки программы управление передаётся этой программе.

Все передаваемые из лабораторного  стенда символы можно наблюдать  в терминальном режиме загрузчика T167.exe.

6.1.3 Загрузка программ в лабораторный стенд SDK-1.1

Для облегчения работы с  загрузчиком в директории проекта  создан пакетный файл RUN_T167.BAT. Этот файл выполняет все необходимые действия по загрузке исполняемого модуля во внутреннюю память лабораторного стенда SDK-1.1.

При выполнении этого  командного файла в конец загрузочного файла, который обязательно должен быть в hex-формате, дописывается строка, обеспечивающая запуск программы с адреса 2100h. Затем открывается последовательный порт компьютера и настраивается для работы в 8-ми битном режиме работы на скорости обмена 9600 бит/с и загружается полученный в предыдущем пункте загрузочный файл во внешнюю память лабораторного стенда. Последнее, что выполняет командный файл RUN_T167.BAT – это переводит программу T167.exe в терминальный режим, в котором отображает на экране компьютера всю информацию, получаемую от лабораторного стенда по последовательному порту.

Для выхода из терминального  режима загрузчика нужно нажать на кнопку клавиатуры компьютера ‘Esc’.

 

6.1.4 Описание основной части  кода программы для микроконтроллера

Минимальная программа, не выполняющая никаких действий, для микроконтроллера выглядит следующим  образом:

#include <ADuC812.h>

void main(void)

{

}

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

Инициализация АЦП, таймеров и UART будет выполнена один раз, поэтому она не будет входить в основной цикл программы, а будет расположена сразу перед ним:

//-------Инициализация UART-----------

TH1  = 0xFD; // Скорость 9600 бит/с

TMOD = 0x20;// Таймер 1 в режиме autoreload

TCON = 0x40;// Запуск таймера  1

SCON = 0x50;// 8 bit UART, разрешение  приема

PCON &= 0x7F;// Отключение удвоения  скорости

TI = 1; // Флаги UART

RI = 1; // Transmit & Recive

EA  =0x0;// UART interrupts only

// Настроить A/D to sequentially convert each input channel.

ADCCON1 = 0x7C;   // 0111 1100

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

do

{

…// здесь будет расположена  большая часть кода

}

While(1)

В основном цикле программы  будут выполняться следующие  действия:

  1. чтение состояния клавиатуры;
  2. проверка нажатия цифровой клавиши;
  3. проверка ошибки выбора канала;
  4. задание номера канала для оцифровки;
  5. запуск АЦП и ожидание от него данных;
  6. запись данных в память;
  7. передача данных и номера канала на ПК;
  8. изменение состояния светодиодов в соответствии с оцифрованным каналом.

Это минимально необходимые  действия для нормального функционирования системы:

unsigned int conv_val = 0;

unsigned char channel = 0;

unsigned char c=0;

if (ScanKBOnce(&c))

NumChanel=chrtoint(c);

if (NumChanel>8)// каналы  больше 8го не обрабатываем

NumChanel=255;

if (NumChanel!=255)// 255 - ошибка выбора канала

{

// начать преобразование и дождаться завершения 

ADCCON2 = (ADCCON2 & 0xF0) | NumChanel;

SCONV = 1;

while (ADCCON3 & 0x80);

// Чтение A/D данных

channel = ADCDATAH >> 4;

conv_val = ADCDATAL | ((ADCDATAH & 0x0F) << 8);

// вывод на терминал

if (NumChanel==8)

{  

value2= (675-conv_val*0.61)/3;

    printf ("ADC Channel %d = %f C\n", NumChanel,value2);

}else

printf ("ADC Channel %d = 0x%X\n", NumChanel,conv_val);

}

}else

{

printf("Error selection channel\n");

}

// выведем оцифрованное  значение

/*

зажигаем светодиот  соответствующий номеру канала

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

*/

svet=convert(NumChanel,0);

WriteMax(0x7,svet);//вывод на светодиды

for(pause=0;pause<=64000;pause++);// задержка

Полный листинг программы, а также доработанная версия с использованием таймера/счетчика (с подробными комментариями описания каждого участка программы) приведены в приложении А.

6.2 Разработка программы для ПК

Компьютерная программа  должна выполнять следующие функции:

  1. Чтение данных с COM порта;
  2. Отображение принятых данных на экране;
  3. Запись принятых данных на ЖМД;
  4. Запись служебных данных на ЖМД.

Всеми вышеприведенными функциями обладает уже созданное  программное обеспечение Terminal.

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

Terminal - простая программа эмуляции терминала последовательного порта (COM). Она может использоваться для соединения с различными устройствами, такими как модемы, маршрутизаторы, встроенные uC системы, телефоны GSM... Это очень полезное средство отладки для приложений последовательной передачи.

Данное ПО полностью устраивает требования задания курсового проекта. Поэтому для записи на ЖМД будем использовать её.

Для сопряжения стенда и ПК необходимо задать правильные настройки программы:

  • Com port – порт к которому подключен стенд;
  • Baud rate – скорость передачи данных, выставить в 9600;
  • Data bits – кол-во бит данных, выставить 8;
  • Parity – бит паритета, неиспользуется(none).

Рисунок 19. Главное окно программы Terminal

После того как все  настройки были выставлены можно  подключаться к стенду, для этого  служит кнопка «Connect».

Для того что бы данные записывались на диск нужно нажать кнопку «StartLog», после этого появится окно выбора файла, в который и будут сохраняться принятые данные.

 

 

 

 

 

 

 

 

 

 

 

 

Заключение.

В данном курсовом проекте  была разработана система накопления данных, которая предназначена для оцифровки данных, поступающих с генератора звуковых частот, и записи их на жесткий магнитный диск. Данные записываются в файл, имя файла задает оператор, со служебной информацией, такой как время начала/конца оцифровки и номера оцифрованного канала. Спроектированная система организована с помощью учебного стенда SDK-1.1 на базе микроконтроллера ADuC812 с ядром MCS51 и расширителя SDX-09.

Разработка проектируемой  системы состоит из двух этапов:

    1. описание аппаратной части;
    2. разработка программного обеспечения.

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

На втором этапе был  разработан алгоритм управления, который  затем был реализован в виде программы  на языке C#. Была написана программа непосредственно для стенда и выбрана программа для сохранения получаемых данных на компьютере.

 

 

 

 

 

 

 

 

 

 

 

Список использованных источников.

 

    1. Конспект лекций.
    2. Справочные материалы по интегрированной среде программирования keil-C.
    3. С. Бобровский “Самоучитель программирования на языке С++ в системе Borland C++ Builder 4.0 ”, десс inforcom press, Москва 1999
    4. П. Киммел и др. “Borland C++ 5”: пер. с англ. — СПб.: BHV — Санкт-Петербург, 1999. — 976 с., ил.
    5. www.sibsitus.nsk.ru/~mavr
    6. Микропроцессорный комплекс SDK 1.1. Архитектура и программирование: учебное пособие /Е.В. Бурькова, А.С. Бобровский – Оренбург, ГОУ ОГУ, 2009г – 107с.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Приложение А

Листинг доработанной программы для микроконтроллера

 

#include <ADuC812.h>

#include <stdio.h>

 

#define MAXBASE 0x8

#define MyData  0x3

#define KB  0x0 

/*

То, что эта  ячейка памяти находится во внешней

памяти данных показывает уточняющее слово “xdata”,

*/        

unsigned int xdata conv_val[127] = 0;// массив из 128 элементов

unsigned short CountMas = 127;// кол-во элементов в массиве

unsigned int IndexMas = 0;

 

char KBTable[]="147*2580369#ABCD";

unsigned int NumChanel = 8;// номер канала для оцифровки

unsigned int OldChanel = 8;// номер канала для оцифровки

 

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

//Функция записи  значения регистра regnum.

/*

входные данные:

*regnum - адрес регистра

val - записываемое значение

возвращаемый  результат:

отсутствует

*/

void WriteMax(unsigned char xdata *regnum, unsigned char val)

{

unsigned char oldDPP=DPP;

DPP=MAXBASE;

*regnum=val;

DPP=oldDPP;

}

//Функция чтения  значения регистра regnum.

/*

входные данные:

*regnum - адрес регистра

возвращаемый  результат:

значения регистра

*/

unsigned char ReadMax(unsigned char xdata *regnum)

{

unsigned char oldDPP=DPP;

unsigned char val=0;

DPP=MAXBASE;

val=*regnum;

DPP=oldDPP;

return val;

}

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

//Функция реализующая  опрос клавиатуры.

/*

входные данные:

*ch - адрес буфера куда будет записан прочитанный результат

возвращаемый  результат:

0 - в случае  если нажатия не было

1 - нажатие было

*/

bit ScanKBOnce(char *ch)

{

unsigned char row,col,rownum,colnum;

unsigned int i;

    //Сканирование производится по "столбцам" клавиатуры, на которые подается

    //"бегущий 0".

    for(colnum = 0; colnum < 4; colnum++)

    {

        col = 0x1 << colnum; //0001, 0010, 0100, 1000, 0001, ...

        WriteMax(KB, ~col); //11111110, 11111101, 11111011, 11110111, 11111110, ...

        //При подаче нуля на очередной столбец на каждом из "рядов" проверяется

        //наличие нуля (факт замыкания  контакта клавишей)

        for(rownum = 0; rownum < 4; rownum++)

        {

            row = ReadMax(KB) & (0x10 << rownum);

            if( !row ) //Обнаружено нажатие клавиши:

            {      

                for(i = 0; i<10000; i++)continue;//проверка на дребезг контакта:

                       //через примерно 40мс повтор сканирования  той же клавиши

                row = ReadMax(KB) & (0x10 << rownum);

                if( !row )

                {

                    *ch = (KBTable[(colnum<<2) + rownum]);

                    return 1; //Стабильное нажатие клавиши

                }

            }

        }

    }

    return 0; //Ни одна клавиша не нажата

}

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

// функция преобразует  символ в число

/*

входные данные:

ch - символ, который необходимо преобразовать

возвращаемый результат:

255 - в случае  если передана не цифра(код  ошибки)

либо преобразованную  цифру(0,1,2...,9)

*/

unsigned int chrtoint(char ch)

{

char Digits[]="0123456789";

unsigned int sym;

for (sym=0;sym<=9;sym++)

{

if (Digits[sym]==ch)

{

return sym;

}

}

return 255;// ошибка

}

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

unsigned char ReadEXTRAM(unsigned char xdata *adr)

{

unsigned char oldDPP=DPP;

unsigned char val=0;

DPP=MyData;

val=*adr;

DPP=oldDPP;

return val;

}

void WriteEXTRAM(unsigned char xdata *adr,unsigned char val)

{    

unsigned char oldDPP=DPP;

DPP=MyData;// третья  страница памяти

*adr=val;

DPP=oldDPP;// возвращаем старое значение 

}

// передача данных на ПК

/*

описание:

передает, через UART, массив(conv_val) с сохраненными, в нем до этого, значениями

входные данные:

отсутствуют

возвращаемый  результат:

отсутствует

*/

void WriteToUART(unsigned short count)

{   

unsigned short i;// счетчик

unsigned short tmp=0;

printf ("ADC Channel: %d\nData start:\n", NumChanel);// номер канала  и служебное слово

for (i=0;i<=count;i++)

{

tmp=ReadEXTRAM(i);

//val=conv_val[i];

printf ("%d\n", tmp);// передача данных

}

printf ("Data stop\n");// конец вывода данных

}

// запись значения  во внешенее ОЗУ

/*

описание:

записывает  входное значение в массив,хранящейся во внешнем ОЗУ

входные данные:

Value - записываемое значение

Channel - номер канала с которого было получено значение,

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

возвращаемый результат:

отсутствует

<p class="dash041e_0431_044b_0447_043d_044b_0439&

Информация о работе Система накопления данных