Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32F4Discovery
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
peroid
Доброго времени суток всем.

С контроллером только разбираюсь и опыта никакого нет. Пытаюсь двигаться вперед по урокам в интернете, слегка добавляя сам себе всякие задания.
Недавно решил написать функции определения переднего и заднего фронта сигнала (один диод должен загореться при нажатии на кнопку и выключиться через 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();}

}
}


Теперь иногда отрабатывает как нужно, а иногда сразу включается синий... а иногда только красный(лечится вторым нажатием) =(
RabidRabbit
А у кнопки точно отсутствует дребезг контактов?
peroid
Цитата(RabidRabbit @ May 11 2015, 06:01) *
А у кнопки точно отсутствует дребезг контактов?


Да, но если бы это был дребезг, разве не загорелись бы сразу оба диода?
Просто казалось бы, что при нажатии на кнопку сработали сразу два.
Попробую поиграться со счетчиком в фильтре. При инициализации указал, чтобы ножка опрашивалась с частотой 100 мГц. Тоже попробую уменьшить.
peroid
Проблема решена.
Переписал кусок кода функции определения фронтов:
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);
}
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.