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

 
 
 
Reply to this topicStart new topic
> 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
RabidRabbit
сообщение May 11 2015, 05:01
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 397
Регистрация: 3-12-09
Из: Россия, Москва
Пользователь №: 54 040



А у кнопки точно отсутствует дребезг контактов?
Go to the top of the page
 
+Quote Post
peroid
сообщение May 11 2015, 06:51
Сообщение #3


Участник
*

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



Цитата(RabidRabbit @ May 11 2015, 06:01) *
А у кнопки точно отсутствует дребезг контактов?


Да, но если бы это был дребезг, разве не загорелись бы сразу оба диода?
Просто казалось бы, что при нажатии на кнопку сработали сразу два.
Попробую поиграться со счетчиком в фильтре. При инициализации указал, чтобы ножка опрашивалась с частотой 100 мГц. Тоже попробую уменьшить.
Go to the top of the page
 
+Quote Post
peroid
сообщение May 11 2015, 13:17
Сообщение #4


Участник
*

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



Проблема решена.
Переписал кусок кода функции определения фронтов:
CODE

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

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

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

}

return(fn);
}
Go to the top of the page
 
+Quote Post

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

 


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


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