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