Разработка программного обеспечения блока

Автор работы: Пользователь скрыл имя, 12 Марта 2015 в 07:14, курсовая работа

Краткое описание

Научная деятельность в России не стоит на месте, в том числе и сфера науки, связанная с инженерными боеприпасами. Такой вид боеприпасов обладает рядом функций, таких как обнаружение цели, классификация цели и управление временем срабатывания устройства. Важным свойством, характеризующим этот вид вооружения, является наличие «электронного мозга», способного выполнять различные задачи, такие как классификация цели или расчет временного интервала, после которого устройство сработает. С каждым годом разрабатывается все больше новых и современных видов таких боеприпасов.

Вложенные файлы: 1 файл

ДИПЛОМ КОНЕЧНЫЙ.docx

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

:140462008130E1F3959AA9DE809163008130E1F382B3877D19

:1404760082BB84E193E4A0E0B0E0409067005090680020901A

:14048A00650030906600281639064A065B0699F480916400A3

:14049E00883079F4949A8BDE809163008130E1F3959A85DE03

:1404B200809163008130E1F382B3877D82BB88E296E8A0E05F

:1404C600B0E04090670050906800209065003090660028169A

:1404DA0039064A065B0699F480916400803179F4949A67DE8B

:1404EE00809163008130E1F3959A61DE809163008130E1F39A

:1405020082B3877D82BB80E59CE0A1E0B0E040906700509066

:1405160068002090650030906600281639064A065B0699F473

:14052A0080916400803279F4949A43DE809163008130E1F3E1

:14053E00959A3DDE809163008130E1F382B3877D82BB80EA86

:1405520098E1A2E0B0E04090670050906800209065003090B6

:140566006600281639064A065B0699F480916400883179F4C5

:14057A00949A1FDE809163008130E1F3959A19DE80916300AF

:14058E008130E1F382B3877D82BB84EB9BE5A2E0B0E040908D

:1405A2006700509068002090650030906600281639064A068E

:1405B6005B0649F4969AFFDD809163008130E1F382B3877D55

:1005CA0082BB789485B7806485BF889516CF0895D5

:00000001FF

 

 

 

 

2.5. Отладка программы

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

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

Для отладки программ обычно применяют три способа:

  1. Пошаговая отладка программ с заходом в подпрограммы;
  2. Пошаговая отладка программ с выполнением подпрограммы как одного оператора;
  3. Выполнение программы до точки останова.

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

Если в программе имеются уже отлаженные подпрограммы, то подпрограмму можно рассматривать, как один оператор программы и воспользоваться вторым способом отладки программ.

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

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

 

3. Тестовый пример

3.1. Контрольный пример

 

Проверка работоспособности блока управления временем срабатывания производится следующим образом:

После подачи питания на блок УВИ на PB0 подается сигнал и блок начинает работать в режиме 1. В этом режиме с блока формирования сигналов и приема квитанции на контроллер (порт A) поступает код 0x38. Этот код записывается в EEPROM, и после записи обратно на блок формирования сигналов и получения квитанции отправляется код 0x38 для отчета о выполненной записи кода. Далее с помощью блока выбора режима работы блок УВИ переключается в режим 2. В этом режиме из ЭСППЗУ считывается записанный ранее код и запускаются таймеры счетчики для расчета времени готовности и времени срабатывания. Блок управления анализирует код и следит  за значением счетчиков. Когда счетчики AMINUTE и MINUTE отсчитывают 24 (2 минуты) с порта D с 0 и 1-го PINа подается сигнал готовности, а когда счетчик AMINUTE достигает значения 17172 (1 сутки) с порта D с 4-го PINа подается сигнал срабатывания.

PINB = 0x01 // Выбор режима 1 – входные данные

Режим 1:

PORTA = 0x38 – входные данные

PORTC = 0x07 // индикация кода – выходные данные

PORTA = 0x07 // квитанция – выходные данные

 

PINB = 0x00 // Выбор режима 2 – входные данные

Режим 2:

PORTD = 0x03 // Через 2 минуты после запуска 2-го режима – выходные данные

PORTD = 0x10 //  Через 24 часа после запуска 2-го режима – выходные данные

3.2. Результаты тестирования

Тестирования производились с помощью макетной платы с набором переключателей на входе и набором светодиодов на выходе. Были проведены проверки срабатывания сигналов готовности (через 2 минуты) и сигнала срабатывания (1, 2, 3, 4, 5 и 9 суток), также проверена правильность записи и чтения кодов из EEPROM. В ходе проведения тестирования была проверена правильность работы блока управления временными интервалами. В результате

Результаты проверки входящих кодов и времени срабатывания, приходящих на блок УВИ:

Время, соответствующее коду

Входящий код

Исходящий код

Фактическое время через которое блок сработал

1 сутки

0x38 - 111

0x07 - 111

24 часа

2 суток

0x08 - 001

0x01 - 001

48 часов

3 суток

0x10 - 010

0x02 - 010

72 часа

4 суток

0x20 - 100

0x04 - 100

96 часов

5 суток

0x18 - 011

0x03 - 011

120 часов


 

 

Все входящие коды, как видно из таблицы, были верными.

Под фактическим временем имеется в виду промежуток времени между запуском блока УВИ в режиме 2 и выдачей боком сигнала срабатывания. Как видно из таблицы, все выходные сигналы срабатывания были получены вовремя, не превышая погрешность в 1%.  

 

 

 

 

 

Заключение

В процессе выполнения дипломного проекта было разработано программное обеспечение для устройства управления временными интервалами и само устройство. Программное обеспечение было написано на языке Си с помощью IDE Image Craft. Правильность работы программы была проверена совокупностью тестов. В качестве управляющего элемента использовался микроконтроллер МИ 1887ВЕ1У российского производства. Актуальностью данной темы являлось то, что в процессе проектирования ставилась задача спроектировать устройство, которое не имело бы аналогов и отличалось новизной, малыми габаритами, продолжительным временем работы. Рассмотренное в дипломном проекте устройство может использоваться не только в инженерных боеприпасах, но их в других системах, как подсистема, управляющая временем срабатывания устройства. А легкость перепрограммирования микроконтроллера и отладки его работы делает это разрабатываемый блок  универсальным.

 

Список литературы

  1. Техническое описание КФДЛ.431295.025ТО
  2. Справочник Image Craft C for Atmel AVR
  3. Измерение, управление и регулирование с помощью AVR-микро-контроллеров. Трамперт В. 2006 год.
  4. Микроконтроллеры AVR. Вводный курс. Мортон Д. 2006 год.
  5. Основы цифровой схемотехники. Новиков Ю. В. 2001 год.
  6. Разработка устройств на микроконтроллерах. Белов А. В. 2013 год.
  7. Программирование на языке С для AVR и PIC микроконтроллеров. Шпак Ю.А. 2006 год.
  8. Микроконтроллеры AVR. Практикум для начинающих. Хартов В. Я. 2007 год.
  9. 10 практических устройств на AVR-микроконтроллерах. Книга 1 и книга 2. Кравченко А. В. 2008 год.
  10. Микроконтроллеры AVR семейств Tiny и Mega фирмы "Atmel". Евстифеев А.В. 2004 год.
  11. Применение микроконтроллеров AVR: схемы, алгоритмы, программы. Баранов В.Н. 2004 год.
  12. Практическое программирование микроконтроллеров Atmel AVR на языке ассемблера. Ревич Ю. В. 2008 год.
  13. Микроконтроллеры AVR: от простого к сложному. М. С. Голубцов. 2003 год.
  14. Искусство схемотехники. Хоровиц П., Хилл У. 1998 год.

 

 

Приложение

Приложение 1

// ICC-AVR application builder : 18.10.2012 8:11:20

// Target : M8535

// Crystal: 1.0000Mhz

 

#include <macros.h>

#include <iccioavr.h>

#include <iom8535v.h>

#include <avrdef.h>

#include <eeprom.h>

 

unsigned long MINUTE, AMINUTE; // Размер: 4 байта; Диапазон: 0..4294967295

unsigned char CODE; // Размер: 1 байт; Диапазон: 0..255

char timer_off; // Размер: 1 байт; Диапазон: -128..127

unsigned char FlagInt1;

int i; // Размер: 2 байта; Диапазон: -32768..32767

 

void EEPROM_write (unsigned int uiAddress, unsigned char ucData)

 

{

/* Ожидаем окончание  предыдущей записи */

    while (EECR & (1 << EEWE))

    ;

    while (SPMCR & (1 << SPMEN))

    ;

/* Указание адреса  и данных */

    EEAR = uiAddress;

    EEDR = ucData;

/* Запись лог. 1 в EEMWE */

    EECR |= (1 << EEMWE);

/* Запуск записи  в ЭСППЗУ путем установки EEWE */

    EECR |= (1 << EEWE);

    while (EECR & (1 << EEWE))

    ;

 

}

 

unsigned char EEPROM_read (unsigned int uiAddress)

 

{

/* Ожидание завершения  предыдущей записи*/

    while (EECR & (1 << EEWE))

    ;

/* Установка адресного  регистра */

    EEAR = uiAddress;

/* Разрешение чтения  из ЭППЗУ путем установки EERE */

    EECR |= (1 << EERE);

/* Возврат данных  из регистра данных ЭСППЗУ*/

    return EEDR;

 

}

 

// TIMER1 initialize - prescale:1024

// WGM: 0) Normal, TOP=0xFFFF

// desired value: 5Sec

// actual value:  4,999Sec (0,0%)

void timer1_init (void)

 

{

    TCCR1B = 0x00; // stop

    TCNT1H = 0xE9; // setup

    TCNT1L = 0x20;

    OCR1AH = 0x13;

    OCR1AL = 0x12;

    OCR1BH = 0x13;

    OCR1BL = 0x12;

    ICR1H  = 0x13;

    ICR1L  = 0x12;

    TCCR1A = 0x00;

    TCCR1B = 0x05; // start Timer

}

/* #pragma interrupt_handler <func>: <vector>

Объявляет функции как обработчики прерываний, чтобы компилятор генерировал команды возврата из прерывания вместо команд обычного возврата и сохранял и восстанавливал все регистры, используемые функциями прерываний*/

#pragma interrupt_handler timer1_ovf_isr:iv_TIM1_OVF

void timer1_ovf_isr (void)

 

{

    // TIMER1 has overflowed

    TCNT1H = 0xE9; // reload counter high value

    TCNT1L = 0x20; // reload counter low value

    MINUTE = MINUTE + 1; // Увеличение счетчика на единицу

    TCCR1B = 0x05;

}

 

// TIMER2 initialize - prescale:1024

// WGM: Normal

// desired value: 5Sec

// actual value:  4,969Sec (0,6%)

 

void timer2_init(void)

{

 

    TCCR2 = 0x00; // stop

    ASSR  = 0x08; // set async mode

    TCNT2 = 0x5F; // setup

    OCR2  = 0x9F;

    TCCR2 = 0x07; // start

 

}

 

#pragma interrupt_handler timer2_ovf_isr:iv_TIM2_OVF

void timer2_ovf_isr (void)

{

 

    TCNT2 = 0x5F; // reload counter value

    AMINUTE = AMINUTE + 1;

    TCCR2 = 0x07;

    while (ASSR != 0b00001000);

 

}

 

#pragma interrupt_handler int0_isr:iv_INT1

void int0_isr (void)

{

/* Отключение прерываний */

     _CLI ();

     FlagInt1 = 1; // Возведение флага

 

}

 

// TIMER0 initialize - prescale:1024

// WGM: Normal

// desired value: 120mSec

// actual value: 119,808mSec (0,2%)

 

void timer0_init (void)

{

    TCCR0 = 0x00; // stop

    TCNT0 = 0x8B; // set count

    OCR0  = 0x75;  // set compare

    timer_off = 1;

    TCCR0 = 0x05; // start timer

}

 

#pragma interrupt_handler timer0_ovf_isr:iv_TIM0_OVF

void timer0_ovf_isr (void)

 

{

    TCNT0 = 0x8B; // reload counter value

    timer_off = 0;

}

 

int main (void)

{

/* Начальная инициализация портов */

    DDRA = 0x00; // Все выводы порта A будут сконфигурированы как входы.

    DDRC = 0x07; // (00000111) Часть выводов порта D будет сконфигурирована как выходы, а часть - как входы (0 – вход, 1 – выход). 
    DDRD = 0xF7;

    PORTD = 0x08; // Если вывод сконфигурирован как выход, то единичка в соответствующем бите регистра PORTD формирует на выводе сигнал высокого уровня, а ноль - сигнал низкого уровня. 

    if ((PINB & 0x01) == 0) // Если на PB0 не поступает сигнал

    {

 

        EEPROM_write (1 , PINA); // Записываем сигнал с порта A в EEPROM

        CODE = EEPROM_read (1); // Присваиваем значение, записанное в EEPROM, переменной CODE

/* Далее идет код, отвечающий за светодиодную индикацию информации записанной в EEPROM*/

        if (CODE == 0x38)

        {

            PORTC = 0x07;

        }

        if (CODE == 0x00)

        {

            PORTC = 0x00;

        }

        if (CODE == 0x08)

        {

            PORTC = 0x01;

        }

        if (CODE == 0x10)

        {

            PORTC = 0x02;

        }

        if (CODE == 0x20)

        {

            PORTC = 0x04;

        }

       if (CODE == 0x18)

        {

            PORTC = 0x03;

        }

        if (CODE == 0x30)

        {

            PORTC = 0x06;

        }

        if (CODE == 0x28)

        {

            PORTC = 0x05;

        }

 

        DDRA = 0x00;

        PORTA = 0x00;

        _NOP ();

/*Пересылка сигнала из EEPROM (отправка квитанции) для проверки*/

        DDRA = 0x07;

        PORTA = PORTC;

    }

 

   if ((PINB & 0x01) == 1) // Если на PB0 поступает сигнал

    {

        TIMSK = 0x45; // Регистр маски прерывания

/*Задаем начальные  значения счетчиков*/

        MINUTE = 0;

        AMINUTE = 0;

        CODE = EEPROM_read (1);

        SEI (); // Разрешаем прерывания

/* Запуск таймера 1 и таймера 2 */

        timer1_init ();

        timer2_init ();

 

        while (AMINUTE < 25) // Пока не прошло 2 минуты 5 секунд

        {

 

            if (AMINUTE == 24) // если 2 минуты (Таймер 2)

 

            {

                PORTD |= 1 << PD1;

            }

 

            if (MINUTE == 24) // если 2 минуты (Таймер 1)

 

            {

                PORTD |= 1 << PD0;

            }

 

        }

 

        FlagInt1 = 0; // Задаем начальное значение флага

        MCUCR =  0b00110000;

        GICR = 0x80;

        SEI (); // Разрешаем прерывания

 

        while (1)

        {

 

Информация о работе Разработка программного обеспечения блока