Я программирую панель разработки 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;
}
}
Пожалуйста, включите определения ваших глобальных переменных: 'gstate',' g_sw1_press' и т.д. – duskwuff
Get полупорядочный компилятор, который предупреждает о «присваивании в выражении» и «код не имеет эффекта». Мне очень любопытно, какой кусок компилятора дерьма позволяет этому коду скользить, не давая никаких предупреждений. – Lundin
Нет языка "Embedded C". Включите предупреждения компилятора и обратите внимание на них! И если ваши светодиоды «светятся», вы действительно должны уменьшить их ток! – Olaf