2015-10-13 1 views
-1

Я программирую панель разработки RX63N и пытаюсь сделать следующее, изменив существующий учебник: Первоначально pattern1 встроенных светодиодов должен светиться до нажатия переключателя и при нажатии любого переключателя pattern2 должен начинаться, а затем при нажатии любого переключателя все светодиоды должны выключаться. Я инициализировал все константы и прототипы функций сверху, но не включил их здесь для краткости. BLOCK_UNTIL_SWITCH_PRESS должен включить бесконечный цикл, пока не будет нажат любой переключатель, и если после первого его появления шаблон2 должен начать, а затем после второго появления, все светодиоды должны отключиться. Но здесь код непосредственно идет от шаблона 1 до прекращения пропусков 2. Может кто-то, пожалуйста, помогите? Вот код:встроенный C: пропускает вызов функции

void main(void){ 
cmt_init(); /* Initialize the CMT unit for application timing tasks. */ 

R_SWITCHES_Init(); /* Prepare the board switches for use. */ 

/* Set up the callback function on cmt channel 0 */ 
cmt_callback_set(CHANNEL_0, &BLINK_RED_LEDS); 

/* Start 400mS count on cmt channel 0. */ 
cmt_start(CHANNEL_0, TIMER_COUNT_400MS); 

BLOCK_UNTIL_SWITCH_PRESS(); 
state = 0; 

/* Stop counting on cmt channel 0. */ 
cmt_stop(CHANNEL_0); 

/* Set up the callback function on cmt channel 0 */ 
cmt_callback_set(CHANNEL_0, &PATTERN); 

/* Start 200mS count on cmt channel 0. */ 
cmt_start(CHANNEL_0, TIMER_COUNT_200MS); 
switch_press == 0; 
BLOCK_UNTIL_SWITCH_PRESS(); 

gstate = 0; 
/* Stop counting on cmt channel 0. */ 
cmt_stop(CHANNEL_0); 


while (1) 
{ 
    /* All done. Loop here forever. LEDs will continue to flash as 
     at a variable rate as the timer ISR executes. */ 
} 
} /* End of function main(). */ 

/*Reset all LEDs */ 
void RESET_ALL_LEDS(void){ 
PORTD.PODR.BYTE = 0xFF;  /* Turn off all LEDs on port D.*/ 
PORTE.PODR.BYTE |= 0x0F;  /* Turn off all LEDs on port E.*/ 
state = 0;     /*state of RED LEDs*/ 
gstate = 0;     /*state of greeen LEDs*/ 
} 

/*All RED LEDS ON */ 
void ALL_RED_LEDS_ON(void){ 
PORTD.PODR.BYTE = ~0xC7; /*Turns on all the RED LEDS on port D*/ 
PORTE.PODR.BYTE = ~0x01; /*Turns on the RED LED on port E */ 
state = 1;     /*update state*/ 
} 

/*BLOCK UNTIL SWITCH PRESS: 
g_swX_press is predefined bool to detect a switch press and initiated false*/ 
void BLOCK_UNTIL_SWITCH_PRESS(void){ 
while(switch_press == 0){ 
    if(g_sw1_press == true){ 
     switch_press = 1 ; 
     } 
    else if(g_sw2_press == true){ 
     switch_press = 1 ; 
    } 
    else if(g_sw3_press == true){ 
     switch_press = 1 ; 
    } 
} 
g_sw1_press == false; 
g_sw2_press == false; 
g_sw3_press == false; 
} 

/*BLINK RED LEDS */ 
void BLINK_RED_LEDS(void){ 
if (state == 1){ 
    ALL_RED_LEDS_ON(); 
    state = 0; 
} 
else if(state == 0){ 
    RESET_ALL_LEDS(); 
    state = 1; 
} 
} 

void ALL_GREEN_LEDS_ON(void){ 
PORTD.PODR.BYTE = ~0x38;  /*Turns on all the Green LEDS on port D*/ 
PORTE.PODR.BYTE = ~0xFE; /*Turns on all the Green LEDS on port E*/ 
gstate = 1; 
} 

/*CUSTOM PATTERN */ 
void PATTERN (void){ 
if (gstate == 1){ 
    ALL_GREEN_LEDS_ON(); 
    gstate = 0; 
} 
else if(gstate == 0){ 
    RESET_ALL_LEDS(); 
    gstate = 1; 
} 
} 
+0

Пожалуйста, включите определения ваших глобальных переменных: 'gstate',' g_sw1_press' и т.д. – duskwuff

+0

Get полупорядочный компилятор, который предупреждает о «присваивании в выражении» и «код не имеет эффекта». Мне очень любопытно, какой кусок компилятора дерьма позволяет этому коду скользить, не давая никаких предупреждений. – Lundin

+0

Нет языка "Embedded C". Включите предупреждения компилятора и обратите внимание на них! И если ваши светодиоды «светятся», вы действительно должны уменьшить их ток! – Olaf

ответ

0

Как @jayant уже ответил, написав switch_press == 0 вы не назначая от нуля до switch_press, но вместо этого вычисляет логическое выражение (например, когда вы пишете функцию if Тион). Вы делали это в нескольких местах.

Чтобы добавить в свой ответ, вы также можете упростить вашу блокирующую функцию, чтобы что-то вроде:

// it looks like you don't need "switch_press" at all 
void BLOCK_UNTIL_SWITCH_PRESS(void) { 

    // loop until one of the switches is pressed 
    while (!g_sw1_press && !g_sw2_press && !g_sw3_press) 
    { 
     // do nothing (or you can put the cpu to sleep for a while) 
    } 

    // do you even need to reset these? 
    g_sw1_press = false; 
    g_sw2_press = false; 
    g_sw3_press = false; 
} 
+0

Несколько назначений в той же строке отнюдь не лучше, чем в отдельных строках. На самом деле, иметь их в одном ряду - это опасная и плохая практика! Поскольку в случае, если какой-либо из операндов содержит побочные эффекты, вы будете вызывать неопределенное поведение, которое приведет к очень тонким, но потенциально разрушительным ошибкам. – Lundin

+0

@ Lundin: целью было упростить цикл while и исправить неверное «присваивание», сделанное OP ('g_sw1_press == false'), я признаю, что я написал все, что было за пределами цикла в одной строке, без какой-либо особой причины и затем решил добавить комментарий. Но в любом случае я хотел бы услышать, как эта линия может когда-либо потерпеть неудачу; какие операнды могут иметь побочные эффекты при назначении целочисленного литерала нескольким переменным? – Groo

+0

Чтобы сделать слишком очевидный пример, предположим, что у вас есть 'a [f()] = b [f()] = c [f()] = false;', где 'f()' - это функция, вычисляющая индекс массива на основе внутреннего счетчика. Вы не можете определить, какой из 3 вызовов функций будет выполнен первым, поэтому исход кода не может быть известен. – Lundin

1

Назначение перед вызовом функции BLOCK_UNTIL_SWITCH_PRESS(); неправильно

switch_press == 0; 

Должно быть

switch_press = 0; 
+1

+1 OP также совершил ту же ошибку несколько раз по всему коду (например, 'g_sw1_press == false' и другие). – Groo