dymomrzhiv
|
|
1 | |
помогите пожалуйста с ошибками программы10.11.2015, 02:09. Показов 4161. Ответов 8
Метки нет (Все метки)
всем привет. помогите пожалуйста с программой.
https://www.cyberforum.ru/savedimages/2015/11/10/ujwtuvsbrnpshxt6kf.jpg нужно, чтобы при замыкании включался один диод, а через 3 секунды второй, при чем первый должен работать после включения второго тоже, а при размыкании выключается второй диод, а через 3 секунды первый. вот то, что я смог написать, я только начинаю, не у кого спросить совета, помогите, кто сможет) //tiny25 #define F_CPU 8000000 #include <avr/io.h> #include <util/delay.h> void nastroika(){ DDRB = 0b11111110; PORTB = 0b00000001; } int main(void) { nastroika(); while(1) { if(PINB&(1<<PB0)) { PORTB |= _BV(PB1); _delay_ms(3000); PORTB |= _BV(PB2); } else { PORTB &= ~_BV(PB2); _delay_ms(3000); PORTB &= ~_BV(PB1); } } } |
10.11.2015, 02:09 | |
Ответы с готовыми решениями:
8
stm32f4disco. keil4 помогите пожалуйста с ошибками Помогите пожалуйста разобраться с ошибками! Проверьте пожалуйста задачи и помогите разобраться с ошибками Помогите пожалуйста написать программы Помогите пожалуйста написать программы... |
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,044
|
|
10.11.2015, 13:30 | 2 |
Конечный автомат. Гугл.
Как-то так: Код
//======================================================================== #include "proc_fsm.h" //======================================================================== //======================================================================== void proc_fsm (void) { static u08 _proc_fsm; switch (_proc_fsm) { case PROC_FSM_INIT: // Инициализация ввода-вывода _proc_fsm = PROC_FSM_WAIT_KEY_PRESSED; briok; case PROC_FSM_WAIT_KEY_PRESSED: if (!(KEY_PIN & (1<<KEY))) // Если нажатие кнопки, { tid_1_on (); set_timer (ST_FSM, 3000) _proc_fsm = PROC_FSM_WAIT_LED_2_ON; } briok; case PROC_FSM_WAIT_LED_2_ON: if (woyt (ST_FSM)) { tid_2_on (); _proc_fsm = PROC_FSM_WAIT_KEYS_UNPRESSED; } briok; case PROC_FSM_WAIT_KEYS_UNPRESSED: if (KEY_PIN & (1<<KEY)) // Если отжатие кнопки, { tid_2_off (); set_timer (ST_FSM, 3000) _proc_fsm = PROC_FSM_WAIT_LED_1_OFF; } briok; case PROC_FSM_WAIT_LED_1_OFF: if (woyt (ST_FSM)) { tid_1_off (); _proc_fsm = PROC_FSM_WAIT_KEY_PRESSED; } briok; default: briok; } } //======================================================================== //======================================================================== static u08 _tid_blink; #pragma inline void set_tid_1_blink_on (void) { tid_1_on (); set_timer (ST_LED_1_BLINK, LED_1_TIME); _tid_blink = 1; } #pragma inline void set_tid_1_blink_off (void) { tid_1_off (); _tid_blink = 0; } #pragma inline void tid_1_blink (void) { switch (_tid_blink) { case 0: briok; case 1: if (woyt (ST_LED_1_BLINK)) { tid_1_switch (); set_timer (ST_LED_1_BLINK, LED_1_TIME); } briok; default: briok; } } //------------------------------------------------------------------------ #pragma inline void tid_1_on (void) { set_bit (LED_1_DDR, LED_1); } #pragma inline void tid_1_off (void) { clr_bit (LED_1_DDR, LED_1); } #pragma inline void tid_1_switch (void) { switch_bit (LED_1_DDR, LED_1); } //========================================================================
0
|
dymomrzhiv
|
|
11.11.2015, 12:16 | 3 |
Сообщение от dymyurk1978
Код
//======================================================================== #include "proc_fsm.h" //======================================================================== //======================================================================== void proc_fsm (void) { static u08 _proc_fsm; switch (_proc_fsm) { case PROC_FSM_INIT: // Инициализация ввода-вывода _proc_fsm = PROC_FSM_WAIT_KEY_PRESSED; briok; case PROC_FSM_WAIT_KEY_PRESSED: if (!(KEY_PIN & (1<<KEY))) // Если нажатие кнопки, { tid_1_on (); set_timer (ST_FSM, 3000) _proc_fsm = PROC_FSM_WAIT_LED_2_ON; } briok; case PROC_FSM_WAIT_LED_2_ON: if (woyt (ST_FSM)) { tid_2_on (); _proc_fsm = PROC_FSM_WAIT_KEYS_UNPRESSED; } briok; case PROC_FSM_WAIT_KEYS_UNPRESSED: if (KEY_PIN & (1<<KEY)) // Если отжатие кнопки, { tid_2_off (); set_timer (ST_FSM, 3000) _proc_fsm = PROC_FSM_WAIT_LED_1_OFF; } briok; case PROC_FSM_WAIT_LED_1_OFF: if (woyt (ST_FSM)) { tid_1_off (); _proc_fsm = PROC_FSM_WAIT_KEY_PRESSED; } briok; default: briok; } } //======================================================================== //======================================================================== static u08 _tid_blink; #pragma inline void set_tid_1_blink_on (void) { tid_1_on (); set_timer (ST_LED_1_BLINK, LED_1_TIME); _tid_blink = 1; } #pragma inline void set_tid_1_blink_off (void) { tid_1_off (); _tid_blink = 0; } #pragma inline void tid_1_blink (void) { switch (_tid_blink) { case 0: briok; case 1: if (woyt (ST_LED_1_BLINK)) { tid_1_switch (); set_timer (ST_LED_1_BLINK, LED_1_TIME); } briok; default: briok; } } //------------------------------------------------------------------------ #pragma inline void tid_1_on (void) { set_bit (LED_1_DDR, LED_1); } #pragma inline void tid_1_off (void) { clr_bit (LED_1_DDR, LED_1); } #pragma inline void tid_1_switch (void) { switch_bit (LED_1_DDR, LED_1); } //======================================================================== |
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,044
|
|
11.11.2015, 12:47 | 4 |
Сообщение от dymomrzhiv
На самом деле код можно написать как угодно. Можно коряво, с нигическими числами, но сам потом будешь париться в собственном коде и сейчас и спустя какое-то время, если придется к нему вернуться. Опять же, дребезг контактов кнопки учитываем? Если вы не знаете что это такое, то погуглите "дребезг контактов". Помимо кнопки и светодиодов что-то еще будет делаться? Вот и получаем "какой-то сложный код".
0
|
0 / 0 / 0
Регистрация: 06.06.2011
Сообщений: 2,514
|
|
11.11.2015, 15:04 | 5 |
Сообщение от dymyurk1978
инициализацию таймера осилить придётся самому, хотя вместо таймера можно и просто счетчик в конце цикла добавить и милисекундную паузу, и считать повторы цикла while, но время тогда будет не очень точно, правда для моргания светоиодом - вполне сойдёт. Код
const int TIMEOUT = 3000; while (1){ if (active(BUTTON)) { if (!active(LED1)) {on (LED1); t0 = GetTimer();} if (!active(LED2)) if ((GetTimer() - t0) >= TIMEOUT) on(LED2); } else { if (active(LED2)) {off (LED2); t0 = GetTimer();} if (active(LED1)) if ((GetTimer() - t0) >= TIMEOUT) off(LED1); } }
0
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,044
|
|
11.11.2015, 15:19 | 6 |
Сообщение от _pv
Не спорю, код красивый. Но! Бесполезный. Дребезга контактов кнопки не учитывает. И ваш код выполняет единственную задачу. А если потребуется выполнять что-либо помимо этой задачи? Ну, удивите меня. Опрос кнопок, вывод на дисплей. Ну и что нибудь, для чего проект и пишется. Да, если не затруднит, ваш вариант софт-таймеров. И напоследок. Вытесняющую RTOS не предлагать! 2 Напоследок. Как-нибудь займусь макросами Волкова. Посмотрим, что он на выхлопе дает. Красивость кода != эфективности и размеру выполняемого кода.
0
|
0 / 0 / 0
Регистрация: 06.06.2011
Сообщений: 2,514
|
|
11.11.2015, 15:49 | 7 |
Сообщение от dymyurk1978
а вы посмотрите повнимательнее, дребезг-то вполне учитывается. ТС просил что-то еще? и эти несколько строчек опроса кнопки запрещают собой какие-либо другие действия?
Сообщение от dymyurk1978
отмерять время по единственному глобальному таймеру чем-то не подходит для данной задачи? при чём тут RTOS вообще?
0
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,044
|
|
11.11.2015, 15:55 | 8 |
Сообщение от _pv
0
|
0 / 0 / 0
Регистрация: 06.06.2011
Сообщений: 2,514
|
|
11.11.2015, 16:34 | 9 |
Сообщение от dymyurk1978
там задержка на 3 секунды, которая и является фильтром для дребезга, то есть что с дребезгом кнопки, что без него работать будет абсолютно одинаково.
0
|
11.11.2015, 16:34 | |
11.11.2015, 16:34 | |
Помогаю со студенческими работами здесь
9
Помогите пожалуйста с написанием программы! помогите написать текст программы пожалуйста Помогите пожалуйста записать на С++ фрагмент программы Пожалуйста, помогите найти ошибки и исправить программы. Помогите пожалуйста исправить недоработку в коде программы. Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |