С Новым годом! Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 30.01.2023
Сообщений: 5
1

Мигание светодиодом на микроконтроллере LPC4320

22.03.2024, 00:18. Показов 641. Ответов 3

Author24 — интернет-сервис помощи студентам
Доброго времени суток читающим, возикла проблема при выполнении стандартной задачи - не могу поморгать светодиодом, подсоединенным к ножке P7_7 микроконтроллера LPC4320FBD144, но в силу моего небольшого опыта программирования микроконтроллеров что то у меня не получается))
Взяв мануал на тысячу с лишним страниц я нашел регистры, вроде как отвечающие за управление ножкой, и у меня получился такой код:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#define  GPIO_BASE 0x400F4000
#define DIR7 (GPIO_BASE + 0x201C) //direction registers port 7
#define SET7 (GPIO_BASE + 0x221C) // write:set register for port 7 // read: output bits for port 7
#define CLR7 (GPIO_BASE + 0x229C) // clear port 7
 
volatile unsigned *gpio;
 
int main(void) {
   int i = 0, j = 0;
   gpio[DIR7 / sizeof(unsigned int)] = 1;
 
   for (; i < 10; i++){
      gpio[SET7 / sizeof(unsigned int)] |= 1 << 7;
 
      for(; j < 1000000; j++);
 
      gpio[CLR7 / sizeof(unsigned int)] |= 1 << 7;
 
      for(; j < 1000000; j++);
   }
 
   return 0;
}
Как по мне, так вроде бы выглядит логично, но проблема в том, что код не работает...
Был бы очень признателен, если бы мне все это разжевали как маленькому ребенку
Заранее спасибо
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.03.2024, 00:18
Ответы с готовыми решениями:

Мигание светодиодом(ми)
и так... начитался я всякой всячины, насмотрелся видео на сайтах и захотелось чего то большего......

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

Мигание светодиодом от кнопки чаще
Здравствуйте! Я только знакомлюсь с Ардуино. Стоит задание сделать программу, чтобы светодиод...

Мигание светодиодом на ATMega8515 (Proteus)
Доброго времени дня. Подскажите, как реализовать мигание светодиодом определенное количество раз?...

Мигание светодиодом при нажатии Enter
Всем привет. Решил написать код, смысл такой: при нажатии клав. Enter, через монитор порта,...

3
652 / 350 / 54
Регистрация: 22.09.2023
Сообщений: 1,030
22.03.2024, 03:07 2
Цитата Сообщение от makson_cheg Посмотреть сообщение
но проблема в том, что код не работает...
В чем именно это выражается? Светодиод не светится вообще или горит "вполнакала"? Предполагаю, что второе.
Цитата Сообщение от makson_cheg Посмотреть сообщение
for(; j < 1000000; j++);
Любой вменяемый компилятор с включенной оптимизацией этот код выкинет, как "не меняющий состояние абстрактной машины" и ваш светодиод будет мигать очень-очень быстро, сливаясь в постоянное неяркое горение. Чтобы он работал так, как вы хотите, надо j объявлять с квалификатором volatile. У тому же после прохода первого цикла у вас j останется равным 1000000 и все последующие циклы будут пропущены. Лучше объявлять такую переменную прямо в цикле: for(int volatile j = 0; j < 1000000; j++);
0
0 / 0 / 0
Регистрация: 30.01.2023
Сообщений: 5
22.03.2024, 09:07  [ТС] 3
Да, вы правы, я допустил ряд тупых ошибок, я этот код в пути на коленке накидал с телефона))
Фактически, если я изменю j на volatile, и если я нормально напишу циклы задержки, то все равно ничего не поменяется. Светодиод как не горел, так и не будет гореть, и он не горит в полсилы.
Скажу прямо: пытаюсь изменить исходный код прошивки на HackRF. Я пытался это сделать по образу и подобию того, как там управляются светодиоды RX, TX и USB. Грубо говоря, вот код:
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
79
// файл hackrf_core.c
/* GPIO Output PinMux */
static struct gpio_t gpio_led[] = {
    GPIO(2, 1),
    GPIO(2, 2),
    GPIO(2, 8),
        GPIO(7, 7), //////////////мой светодиод
#ifdef RAD1O
    GPIO(5, 26),
#endif
};
 
//...
//...
 
void pin_setup(void)
{
    /* Configure all GPIO as Input (safe state) */
    gpio_init();
 
    /* Configure SCU Pin Mux as GPIO */
    scu_pinmux(SCU_PINMUX_LED1, SCU_GPIO_NOPULL);
    scu_pinmux(SCU_PINMUX_LED2, SCU_GPIO_NOPULL);
    scu_pinmux(SCU_PINMUX_LED3, SCU_GPIO_NOPULL);
        scu_pinmux(P7_7, SCU_GPIO_NOPULL); //////////////////////// мой светодиод
#ifdef RAD1O
    scu_pinmux(SCU_PINMUX_LED4, SCU_GPIO_NOPULL | SCU_CONF_FUNCTION4);
#endif
 
    /* Configure USB indicators */
#ifdef JAWBREAKER
    scu_pinmux(SCU_PINMUX_USB_LED0, SCU_CONF_FUNCTION3);
    scu_pinmux(SCU_PINMUX_USB_LED1, SCU_CONF_FUNCTION3);
#endif
 
    gpio_output(&gpio_led[0]);
    gpio_output(&gpio_led[1]);
    gpio_output(&gpio_led[2]);
        gpio_output(&gpio_led[3]); /////////////////////////// мой светодиод
#ifdef RAD1O
    gpio_output(&gpio_led[4]);
#endif
 
//...
//...
 
// файл hackrf_usb.c
 
//...
//...
 
int main(void)
{
        int i = 0;
    // Copy M0 image from ROM before SPIFI is disabled
    m0_rom_to_ram();
 
    detect_hardware_platform();
    pin_setup();
    enable_1v8_power();
        for(; i < 50; i++) {
                led_on(LED1);
                delay(700000);
                led_on(LED2);
                delay(700000);
                led_on(LED3);
                delay(700000);
                led_on(LED4);
                delay(700000);
 
                led_off(LED1);
                delay(700000);
                led_off(LED2);
                delay(700000);
                led_off(LED3);
                delay(700000);
                led_off(LED4);
                delay(700000);
        }
где
C
1
2
3
4
5
6
7
8
9
void led_on(const led_t led)
{
    gpio_set(&gpio_led[led]);
}
 
void led_off(const led_t led)
{
    gpio_clear(&gpio_led[led]);
}
и
C
1
2
3
4
5
6
7
typedef enum {
    LED1 = 0,
    LED2 = 1,
    LED3 = 2,
    LED4 = 3,
    LED5 = 4
} led_t;
Я пытался сделать по подобию того, как мигают эти три светодиода, настройки все вроде одни и те же, но эти три светтотдиода мигают после перезагрузки, а мой не мигает, поэтому решил попробовать достучаться до физ. памяти, но и тут неудача. Что я делаю не так?
0
652 / 350 / 54
Регистрация: 22.09.2023
Сообщений: 1,030
22.03.2024, 10:09 4
Увы, тут не знаю. Может вы заливаете не новую прошивку, а оригинальную, без ваших изменений?

Добавлено через 11 минут
Дополнено: и зря вы добавили свой светодиод в середину массива. Ведь теперь все обращения к LED4 из остального кода будут дергать ваш светодиод вместо GPIO(5, 26). И даже если вы измените порядок в led_t нет гарантий, что какой-нибудь "мамкин хакер" в остальном коде не обращается к LED4 просто через gpio_led[3] или led_on(3)/led_off(3) (судя по typedef это не плюсы, тут можно вместо enum подставить int не получив от компилятора по рукам).
0
22.03.2024, 10:09
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.03.2024, 10:09
Помогаю со студенческими работами здесь

ATmega128. Мигание светодиодом через таймер0
Добрый вечер, столкнулся с тупиком. Суть задания- на лабораторном стенде атмега128 организовать...

Мигание светодиодом на PIC. Организация задержки
объясните пожалуйста как сформировать чередующуюся еденицу и нолик длительностью 1(2) секунды, при...

Управляем СВЕТОдиодом
Парни! Помогите плиз по коду. Хочется что бы: 1. кнопку нажал, диод загорелся 2. кнопку отжал,...

управление светодиодом...?
хочу поэкспериментировать со светодиодами....купил парочку... (I=350мА, V=2,3В красные) начал...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru