Практическая работа №01 (мигание светодиодами) / Valentin Gubarev

Для выполнения практической работы потребуется отладочная плата 1986EvBrd_48_Rev3.

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

Проект состоит из двух файлов. Один из них написан на языке ассемблер, другой на языке си.

Файл startup_1986be9x.s

1
2
3
4
5
	AREA    RESET, DATA, READONLY
	IMPORT 	main
	DCD     0x20008000      ; Вершина стека
	DCD     main            ; Выполнение программы main
	END

Файл main.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
/*-----------------------------------------------*/
/* Практическая работа 01 (мигание светодиодами) */
/*-----------------------------------------------*/

/* Определение структуры порта */
typedef struct {
    unsigned RXTX;
    unsigned OE;
    unsigned FUNC;
    unsigned DIGITAL;
    unsigned PULL;
    unsigned PD;
    unsigned PWR;
    unsigned GFEN;
}struct_ports;

/* Определение функции задержки времени */
void delay(unsigned count){
    while(count--);
}

int main (void) {
    /* Включение тактирования порта F */
    *(unsigned *)(0x4002001C) |= (1<<29);

    /*-----------------------------------------------------------*/
    /* Настройка порта F (Смотри описание портов ввода вывода)   */
    /*-----------------------------------------------------------*/
    /*  RXTX - Данные порта:                                     */
    /*  OE - Направление порта:                                  */
    /*      1 - выход,                                           */
    /*      0 - вход                                             */
    /*  FUNC - Режим работы порта:                               */
    /*      00 - порт,                                           */
    /*      01 - основная функция,                               */
    /*      10 - альтернативная функция,                         */
    /*      11 - переопределенная функция                        */
    /*  DIGITAL - Режим работы порта:                            */
    /*      1 - цифровой,                                        */
    /*      0 - аналоговый                                       */
    /*  PULL - Подтяжка порта (~50 кОм):                         */
    /*      старшие 16 разрядов отвечают за подтяжку к питаню,   */
    /*      младшие 16 разрядов отвечают за подтяжку к нулю      */
    /*          0 - подтяжка выключена,                          */
    /*          1 - подтяжка включена                            */
    /*  PD - Режим драйвера:                                     */
    /*      старшие 16 разрядов отвечают за работу входа:        */
    /*          0 - тригер Шмитта выключен, гистерезис ~200 мкА, */
    /*          1 - тригер Шмитта включен,  гистерезис ~400 мкА  */
    /*      младшие 16 разрядов отвечают за работу выхода:       */
    /*          0 - управляемый драйвер,                         */
    /*          1 - открытый сток                                */
    /*  GFEN - режим работы входного фильтра:                    */
    /*      0 - фильтрация импульсов выключена,                  */
    /*      1 - фильтрация импульсов включена (<10 нс)           */
    /*  PWR - Режим работы вывода порта:                         */
    /*      00 - передатчик отключен,                            */
    /*      01 - фронт ~100 нс,                                  */
    /*      10 - фронт  ~20 нс,                                  */
    /*      11 - фронт  ~10 нс                                   */
    /*-----------------------------------------------------------*/
    struct_ports * F = ((struct_ports *) 0x400E8000);
    F->OE      = 0xFF;       /* Выход                */
    F->FUNC    = 0x0000;     /* Порт                 */
    F->DIGITAL = 0xFF;       /* Цифровые             */
    F->PULL    = 0x00000000; /* Подтяжка отключена   */
    F->PD      = 0x00000000; /* Управляемый драйвер  */
    F->PWR     = 0xFFFF;     /* Фронт ~10 нс         */
    F->GFEN    = 0x0000;     /* Фильтрация отключена */

    F->RXTX = 0x01; /* 0-й бит включен, остальные выключены */
    while(1){
        F->RXTX ^= 0x03; /* 0 и 1 биты меняют состояния */
        delay(1000000);
    }

    return 0;
}

Задания для самостоятельного выполнения

  1. Добейтесь, чтобы мигал только один из светодиодов.
  2. Добейтесь, чтобы мигал только один, но не тот, что при выполнении первого задания.
  3. Добейтесь, чтобы один из светодиодов мигал в два раза реже, чем другой.
  4. Добейтесь, чтобы два светодиода мигали одновременно.
  5. Добейтесь, чтобы светодиоды плавно увеличивали частоту мигания, а затем снижали частоту мигания.
  6. Добейтесь, чтобы светодиоды не мигали, а тускло светили (частота мигания должна быть такой большой, что бы человек не замечал этого, для человека будет казаться снижение интенсивности свечения).
  7. Добейтесь плавного циклического увеличения, а затем снижения яркости свечения светодиода.
© Code More Team, 2017
GitHub