Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

MPU_LAB_2

.docx
Скачиваний:
71
Добавлен:
18.05.2014
Размер:
26.16 Кб
Скачать

Санкт-Петербургский Государственный

Электротехнический Университет «ЛЭТИ»

Кафедра ИИСТ

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

СОЗДАНИЕ ПРОГРАММ НА ЯЗЫКЕ СИ

В СРЕДЕ ECLIPSE

Выполнил: студенты гр.0587

Морозова О.М.

Вяльмискин М.В.

Преподаватель: Марченков Р.Ю.

2014

Цель работы: освоение технологии создания программ на языке

высокого уровня.

Задание

1. Создать проект.

2. Набрать исходный текст программы из прил. 3.

3. Отладить программу.

Алгоритм работы программы.

Start

Подготовка периферии.

Подготовка кнопок.

Подготовка светодиодов.

Состояние кнопки 1

Включена или нет.

нет

да

index:=0

Состояние кнопки 2

Включена или нет.

нет

да

index:=1

index:= -1

index>=0

нет

да

Зажечь соответствующий светодиод и погасить остальные

Краткое описание некоторых из заготовочных файлов для проекта на языке Си:

Board.h - Файл описания целевой платы, на которой находится

микроконтроллер

AT91SAM7S64.h - Файл с макроопределениями адресов различных периферийных

устройств, структурами данных, описывающих эти устройства, и различными константами для микроконтроллера AT91SAM7S64

lib_AT91SAM7S64.h - Библиотека вспомогательных функций от производителя

микроконтроллера

Cstartup.S - Исходный код на языке ассемблера, подготавливающий процессор

для передачи управления машинному коду, полученному путём трансляции исходного текста на языке Си

Cstartup_SAM7.c - Исходный код функции, инициализирующей периферийное

оборудование микроконтроллера

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

Листинг программы:

00100298 <setUpLeds>:

// считывания состояния кнопок, находящихся на отладочной плате.

static AT91PS_PMC pmc = AT91C_BASE_PMC;

// Подготовка к работе со светодиодами

voidsetUpLeds (void)

{

100298: e52db004 push {fp} ; (strfp, [sp, #-4]!)

10029c: e28db000 add fp, sp, #0

// Указываем, что ножками, к которым подключены светодиоды,

// управляет PIO, а не встроенная периферия.

pioa->PIO_PER = LED_MASK;

1002a0: e59f3034 ldr r3, [pc, #52] ; 1002dc <setUpLeds+0x44>

1002a4: e5933000 ldr r3, [r3]

1002a8: e3a02806 mov r2, #393216 ; 0x60000

1002ac: e5832000 str r2, [r3]

// Ножки будем использовать как выходы

// (для подачи напряжения).

pioa->PIO_OER = LED_MASK;

1002b0: e59f3024 ldr r3, [pc, #36] ; 1002dc <setUpLeds+0x44>

1002b4: e5933000 ldr r3, [r3]

1002b8: e3a02806 mov r2, #393216 ; 0x60000

1002bc: e5832010 str r2, [r3, #16]

// Гасим светодиоды

pioa->PIO_SODR = LED_MASK;

1002c0: e59f3014 ldr r3, [pc, #20] ; 1002dc <setUpLeds+0x44>

1002c4: e5933000 ldr r3, [r3]

1002c8: e3a02806 mov r2, #393216 ; 0x60000

1002cc: e5832030 str r2, [r3, #48] ; 0x30

}

1002d0: e28bd000 add sp, fp, #0

1002d4: e8bd0800 pop {fp}

1002d8: e12fff1e bx lr

1002dc: 00200000 .word 0x00200000

001002e0 <setUpButtons>:

// Подготовка к работе с кнопками

voidsetUpButtons (void)

{

1002e0: e52db004 push {fp} ; (strfp, [sp, #-4]!)

1002e4: e28db000 add fp, sp, #0

// За кнопки отвечает PIO. По умолчанию соответствующие

//ножки сконфигурированы как входы.

pioa->PIO_PER = SW_MASK;

1002e8: e59f3024 ldr r3, [pc, #36] ; 100314 <setUpButtons+0x34>

1002ec: e5933000 ldr r3, [r3]

1002f0: e3a02706 mov r2, #1572864 ; 0x180000

1002f4: e5832000 str r2, [r3]

// Включаем тактирование PIO.

// Без этого не удастся прочитать состояния кнопок.

pmc->PMC_PCER = 1 << AT91C_ID_PIOA;

1002f8: e59f3018 ldr r3, [pc, #24] ; 100318 <setUpButtons+0x38>

1002fc: e5933000 ldr r3, [r3]

100300: e3a02004 mov r2, #4

100304: e5832010 str r2, [r3, #16]

}

100308: e28bd000 add sp, fp, #0

10030c: e8bd0800 pop {fp}

100310: e12fff1e bx lr

100314: 00200000 .word 0x00200000

100318: 00200004 .word 0x00200004

0010031c <indicate>:

// Зажечь светодиод с указанным номером (нумерация от нуля)

// и погасить все остальные

voidindicate (intindex)

{

10031c: e52db004 push {fp} ; (strfp, [sp, #-4]!)

100320: e28db000 add fp, sp, #0

100324: e24dd00c sub sp, sp, #12

100328: e50b0008 str r0, [fp, #-8]

// Зажечьсветодиод

pioa->PIO_CODR = ledMask[index];

10032c: e59f303c ldr r3, [pc, #60] ; 100370 <indicate+0x54>

100330: e5933000 ldr r3, [r3]

100334: e59f2038 ldr r2, [pc, #56] ; 100374 <indicate+0x58>

100338: e51b1008 ldr r1, [fp, #-8]

10033c: e7922101 ldr r2, [r2, r1, lsl #2]

100340: e5832034 str r2, [r3, #52] ; 0x34

// Погасить все остальные.

pioa->PIO_SODR = (~ledMask[index]) & LED_MASK;

100344: e59f3024 ldr r3, [pc, #36] ; 100370 <indicate+0x54>

100348: e5933000 ldr r3, [r3]

10034c: e59f2020 ldr r2, [pc, #32] ; 100374 <indicate+0x58>

100350: e51b1008 ldr r1, [fp, #-8]

100354: e7922101 ldr r2, [r2, r1, lsl #2]

100358: e1e02002 mvn r2, r2

10035c: e2022806 and r2, r2, #393216 ; 0x60000

100360: e5832030 str r2, [r3, #48] ; 0x30

}

100364: e28bd000 add sp, fp, #0

100368: e8bd0800 pop {fp}

10036c: e12fff1e bx lr

100370: 00200000 .word 0x00200000

100374: 00100420 .word 0x00100420

00100378 <pressedButtonIndex>:

// Определить номер нажатой кнопки (нумерация от нуля).

// Функция возвращает номер кнопки или -1, если никакая

// кнопканенажата.

intpressedButtonIndex (void)

{

100378: e52db004 push {fp} ; (strfp, [sp, #-4]!)

10037c: e28db000 add fp, sp, #0

100380: e24dd00c sub sp, sp, #12

// Прочитать состояния ножек

unsignedintpinsStatus = pioa->PIO_PDSR;

100384: e59f304c ldr r3, [pc, #76] ; 1003d8 <pressedButtonIndex+0x60>

100388: e5933000 ldr r3, [r3]

10038c: e593303c ldr r3, [r3, #60] ; 0x3c

100390: e50b3008 str r3, [fp, #-8]

// Поскольку нажатая кнопка обозначается нулевым битом

// в соответствующем ножке разряде, то выполняем логическое

// НЕ перед выполнением операции "И" c маской ножки.

if ((~pinsStatus) & SW1)

100394: e51b3008 ldr r3, [fp, #-8]

100398: e2033702 and r3, r3, #524288 ; 0x80000

10039c: e3530000 cmp r3, #0

1003a0: 1a000001 bne 1003ac <pressedButtonIndex+0x34>

return 0;

1003a4: e3a03000 mov r3, #0

1003a8: ea000006 b 1003c8 <pressedButtonIndex+0x50>

if ((~pinsStatus) & SW2)

1003ac: e51b3008 ldr r3, [fp, #-8]

1003b0: e2033601 and r3, r3, #1048576 ; 0x100000

1003b4: e3530000 cmp r3, #0

1003b8: 1a000001 bne 1003c4 <pressedButtonIndex+0x4c>

return 1;

1003bc: e3a03001 mov r3, #1

1003c0: ea000000 b 1003c8 <pressedButtonIndex+0x50>

return -1;

1003c4: e3e03000 mvn r3, #0

}

1003c8: e1a00003 mov r0, r3

1003cc: e28bd000 add sp, fp, #0

1003d0: e8bd0800 pop {fp}

1003d4: e12fff1e bx lr

1003d8: 00200000 .word 0x00200000

001003dc <main>:

// Начало программы на Си

intmain(void)

{

1003dc: e92d4800 push {fp, lr}

1003e0: e28db004 add fp, sp, #4

1003e4: e24dd008 sub sp, sp, #8

// Подготовитьсветодиоды

setUpLeds();

1003e8: ebffffaa bl 100298 <setUpLeds>

// Подготовитькнопки

setUpButtons();

1003ec: ebffffbb bl 1002e0 <setUpButtons>

// Индекснажатойкнопки

intbuttonIndex = -1;

1003f0: e3e03000 mvn r3, #0

1003f4: e50b3008 str r3, [fp, #-8]

1003f8: ea000000 b 100400 <main+0x24>

if (buttonIndex>=0)

{

// Зажечь светодиод у этой кнопки, погасив другой

indicate(buttonIndex);

}

}

1003fc: e1a00000 nop ; (mov r0, r0)

intbuttonIndex = -1;

// Вечныйцикл

while (1)

{

// Определить, нажата ли кнопка, и какая.

buttonIndex = pressedButtonIndex ();

100400: ebffffdc bl 100378 <pressedButtonIndex>

100404: e50b0008 str r0, [fp, #-8]

// Если нажата 29

if (buttonIndex>=0)

100408: e51b3008 ldr r3, [fp, #-8]

10040c: e3530000 cmp r3, #0

100410: bafffff9 blt 1003fc <main+0x20>

{

// Зажечь светодиод у этой кнопки, погасив другой

indicate(buttonIndex);

100414: e51b0008 ldr r0, [fp, #-8]

100418: ebffffbf bl 10031c <indicate>

}

}

10041c: eafffff6 b 1003fc <main+0x20>

Описание технологии разработки и отладки программ на языке Си:

  1. Создание нового проекта

  2. Добавление заготовочных файлов( или их создание)

- файл описания целевой платы, на который находится МК

- файл с макроопределителями адресов различных периферийных устройств, структурами данных, описывающих эти устройства, структурами данных, описывающих эти устройства и различными константами для МК AT91SAM7S64

-библиотека вспомогательных функций от производителя МК

-исходный код на языке ассемблера, подготавливающий процессор для передачи управления машинному коду, полученному путем трансляции исходного текста на языке Си

- исходный код функции, инициализирующей периферийное оборудование МК

3. Создание файла с расширением «.с»

4. Написание текста программы в созданном файле

5. Настройка профиля отладки программы

6. Запуск служебной программы для совместной работы отладчика и МК

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

Описание переменных:

  • staticconstintledMask – указатель на структуру, предназначенную для управления контроллером параллельного ввода-вывода

  • intpressedButtonIndex – чтение состояния ножек

  • pioa – структурная переменная для работы с входом и выходом МК

  • pmc– структурная переменная для настройки работы входа и выхода

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