реклама на сайте
подробности

 
 
> STM32F4Discovery, не всегда откликается на кнопку
peroid
сообщение May 10 2015, 19:24
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 6-05-15
Пользователь №: 86 555



Доброго времени суток всем.

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

Нестабильность проявляется в том, что иногда при отжатии кнопки не включается второй диод.. а иногда включается.
Кажется, что я неправильно пытаюсь это реализовать.. возможно в этой самой задержке и теряется задний фронт?

Вот код программы:
CODE

#include "frontcheck.h"

//-------------------------------------------------------------------------------------------------------------------
//Opisivaem funkciu opredeleniya fronta
//-------------------------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------------------------
//Opredelyaem PEREDNIY front
//-------------------------------------------------------------------------------------------------------------------
int frontcheck (int state) {

if (state==1) { //Если кнопка нажата
if(front_memory==0) { //и временная переменная равна нулю (кнопка ранее не нажималась)
fp=1; //говорим, что появился передний фронт сигнала
front_memory=1; //устанавливаем в единицу временный бит, чтобы не выполнилась строка 3
}
else if(front_memory==1) { //В случае, если кнопка нажата, но временный бит==1(фронт уже прошел), то
fp=0; //устанавливаем бит, указывающий на фронт, равным нулю, но
front_memory=1; //оставляем временный бит==1, чтобы фронт не установился в единицу при
} //следующем скане
}

if(state==0) { //если кнопка отжата, то
fp=0; //на всякий случай пишем 0 во флаг переднего фронта и
front_memory=0; //обнуляем временную переменную
} //тем самым, мы вернулись к начальному состоянию.
return (fp);
}


//-------------------------------------------------------------------------------------------------------------------
//Opredelyaem ZADNIY front
//-------------------------------------------------------------------------------------------------------------------
int FN_frontcheck (int stateFN) {
int state2;

int fn;
int front_memory2;
if (stateFN==1){state2=1; fn=0;
}else{state2=0;
fn=0;}
if(state2==1){

front_memory2=1;
fn=0;
}else{
if(front_memory2==1){
fn=1;
front_memory2=0;}
}

return(fn);
}


И собственно main.c

CODE

int main(void){

SysTick_Config(SystemCoreClock/1000); //1ms.
LED_Init();
Button_ini();
mode_count=delay;

while(1){


if (FP_frontcheck(Button_state)==1) {
Red_ON();
delay_ms(500);
Red_OFF();
}


if (FN_frontcheck(Button_state)==1) {
Blue_ON();
delay_ms(500);
Blue_OFF();}

}
}



Спасибо.

Немного поменял код:
CODE

int main(void){

SysTick_Config(SystemCoreClock/1000); //1ms.
LED_Init();
Button_ini();
mode_count=delay;

while(1){


if (FP_frontcheck(Button_state)==1) {
Red_ON();}


if (FN_frontcheck(Button_state)==1) {
Blue_ON();
delay_ms(500);
ALL_LEDs_OFF();}

}
}


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

Сообщение отредактировал peroid - May 10 2015, 19:25
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 17:59
Рейтинг@Mail.ru


Страница сгенерированна за 0.01334 секунд с 7
ELECTRONIX ©2004-2016