Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 06.10.2015
Сообщений: 25
1

Смена частосты мигания при отпускании кнопки, потоки

22.10.2018, 13:25. Показов 998. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток, помогите с лабой пожалуйста по микроконтролерам.
Задание: Когда пользователь отпускает кнопку, увеличить частоту мигания светодиодов на 10%, когда частота возрастет вдвое, начать обратный процесс (уменьшение частоты на 10%).
Есть вот такой код, он работает наоборот, не при отжимании, а при нажатии кнопки:
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_syscfg.h"
#include "stm32f4xx_exti.h"
#include "misc.h"
 
#define ANTI_BOUNCING_DELAY_MS 100
 
int initDelay,                  //Initial delay diods will blink with
        minDelay,                       //Minimum delay = max frequency 
        delay,                          //Current delay
        offset,                         //Frequency change difference
        increaseFrequency;  //Should frequency be increased or decreased
 
uint32_t delay_c = 0;
uint32_t delay_anti_bouncing = 0;
 
void SysTick_Handler(void){
    if(delay_c > 0)
        --delay_c;
    if(delay_anti_bouncing > 0)
    --delay_anti_bouncing;
}
void delay_ms(uint16_t delay_t){
    delay_c = delay_t;
    while(delay_c){};
}
 
void blink() {
    GPIO_ToggleBits(GPIOD, GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15);
    delay_ms(delay);
}
 
void initRCC() {
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); 
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); 
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); 
}
 
void initGPIO(){
    GPIO_InitTypeDef gpioDInit;
    
    gpioDInit.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
    gpioDInit.GPIO_Mode = GPIO_Mode_OUT;
    gpioDInit.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOD, &gpioDInit);
    
    GPIO_InitTypeDef gpioAInit;
    gpioAInit.GPIO_Pin = GPIO_Pin_0;
    gpioAInit.GPIO_Mode = GPIO_Mode_IN;
    GPIO_Init(GPIOA, &gpioAInit);
}
 
void initEXTI(void){
    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);
 
    EXTI_InitTypeDef extiInit;
    extiInit.EXTI_Line = EXTI_Line0;
    extiInit.EXTI_Mode = EXTI_Mode_Interrupt;
    extiInit.EXTI_Trigger = EXTI_Trigger_Rising;
    extiInit.EXTI_LineCmd = ENABLE;
    
    EXTI_Init(&extiInit);
}
 
void initNVIC(void){
    NVIC_InitTypeDef nvicInit;
    
    nvicInit.NVIC_IRQChannel = EXTI0_IRQn;
    nvicInit.NVIC_IRQChannelPreemptionPriority = 0;
    nvicInit.NVIC_IRQChannelSubPriority = 0;
    nvicInit.NVIC_IRQChannelCmd = ENABLE;
    
    NVIC_Init(&nvicInit);
}
 
void init() {
    SystemCoreClockUpdate();
    SysTick_Config(SystemCoreClock/1000);
    initRCC();
    initEXTI();
    initNVIC();
    initGPIO();
    
    initDelay = 1000;
    delay = initDelay;
    minDelay = initDelay / 2;
    offset = initDelay / 10;
    increaseFrequency = 1;  
}
 
void EXTI0_IRQHandler(void)
{   
    // Anti-bouncing check
    if(delay_anti_bouncing > 0) {
        EXTI_ClearITPendingBit(EXTI_Line0);
        return;
    }
    
    if(increaseFrequency == 1) {
        delay -= offset;
        if(delay <= minDelay) {
            increaseFrequency = 0;
        }
    } else {
        delay += offset;
        if(delay >= initDelay) {
            increaseFrequency = 1;
        }
    }
    
    // Set delay for anti-bouncing
    delay_anti_bouncing = ANTI_BOUNCING_DELAY_MS;
    
    EXTI_ClearITPendingBit(EXTI_Line0);
}
 
int main (void){
    
    init();
 
    while(1)
    {
        blink();
    }
}
Вопрос, что нужно изменить в этом коде чтобы адаптировать его под нужное задание?

Добавлено через 7 минут
Работа не с потоками, а с прерываниями. STM32
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.10.2018, 13:25
Ответы с готовыми решениями:

при нажатии и отпускании левой кнопки мыши линия, квадрат и круг рисовались синим цветом, а для правой кнопки – красным
Модифицируйте программу примера 4 так, чтобы: а) при нажатии и отпускании левой кнопки мыши линия,...

Показать пароль при удерживании кнопки а при отпускании обратно скрыть
И еще один вопрос. Как сделать так, чтобы при удерживании кнопки показывался пароль, а при...

Cмена картинок при нажатии и отпускании кнопки
Здравствуйте! Помогите со сменой картинок при нажатии и отпускании кнопки мыши. В имеющемся коде...

Действие при отпускании левой кнопки мыши
В момент, когда отпускается левая кнопка мыши должно выполниться условие. Как можно отследить это?

1
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739
22.10.2018, 15:16 2
nothing1, поменяй у себя в коде
C
1
    extiInit.EXTI_Trigger = EXTI_Trigger_Rising;
на
C
1
    extiInit.EXTI_Trigger = EXTI_Trigger_Falling;
0
22.10.2018, 15:16
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.10.2018, 15:16
Помогаю со студенческими работами здесь

Какое событие возникает при отпускании кнопки мыши?
Какое событие возникает при отпускании кнопки мыши? mouseunpress unpress mouseup mouserelease...

При отпускании кнопки зажигать следующий светодиод (по кругу), прерывания
Доброго времени суток, помогите пожалуйста по микроконтролерам. Задание: Когда пользователь...

При прижатии и отпускании кнопки мыши не вызывается изменение шрифтов
Согласно задания нужно разработать приложение, после запуска которого происходит следующее: I....

При отпускании кнопки цвет возвращается в исходный (Серый) через 3 секунды
Прошу помочь и объяснить,как сделать ,чтобы цвет менялся только при удержании,а не просто нажатии,и...

смена картинки при нажатии кнопки
Доброго времени суток! Есть такой эффект на сайте disorg.ru, при нажатии кнопки меняет картинку,...

Смена изображения при нажатии на кнопки
Доброе утро\День\Вечер! Есть проблема( Есть несколько кнопок и один Image1, как реализовать так...

Смена пароля при нажатии кнопки
есть форма представлена на рисунке... на edit&quot;е прописан код: if edit1.Text = 'vbnn' then...


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

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