Перейти к содержанию

demiurg1978

Members
  • Постов

    361
  • Зарегистрирован

  • Посещение

Весь контент demiurg1978

  1. Как бы в данном случае не важно. Но почему преддекремент? Ненавижу если честно эти термины, инкремент, декремент... Но альтернативы вроде нет...
  2. ТС, читайте это. Там много ответов на ваши вопросы. А в моем проекте еще и бонусом программные таймеры.
  3. Я отвык от элементарных задач. Мне зачастую проще на автоматах быстренько накидать.
  4. Дело не в элементарной задаче, пусть ТС ознакомится с конечными автоматами и программными таймерами.
  5. //======================================================================== #include "proc_device.h" //======================================================================== //======================================================================== enum { BTN_NONE = 0, BTN_DOWN, BTN_WAIT_UP, BTN_UP, }; void proc_button (void) { static u08 _proc_button; static soft_timer ST_PROC_BUTTON; switch (_proc_button) { case BTN_NONE: if (PINB & (1<<PB0)) { set_soft_timer (ST_PROC_BUTTON, 40, 0); _proc_button = BTN_DOWN; } break; case BTN_DOWN: if (handle_soft_timer (ST_PROC_BUTTON)) { if (PINB & (1<<PB0)) { Set_Event (EV_ID_KEY_PRESSED); _proc_button = BTN_WAIT_UP; } else _proc_button = BTN_NONE; } break; case BTN_WAIT_UP: if (!(PINB & (1<<PB0))) { set_soft_timer (ST_PROC_BUTTON, 40, 0); _proc_button = BTN_UP; } break; case BTN_UP: if (handle_soft_timer (ST_PROC_BUTTON)) { if (!(PINB & (1<<PB0))) { Set_Event (EV_ID_KEY_UNPRESSED); _proc_button = BTN_NONE; } else _proc_button = BTN_WAIT_UP; } break; default: break; } } //======================================================================== //======================================================================== void proc_device (void) { static u08 _proc_device; static soft_timer ST_PROC_DEVICE; proc_button (); switch (_proc_device) { case 0: set_bit (DDRB, 1); // Светодиод. _proc_device = 1; break; case 1: if (Get_Event (EV_ID_KEY_PRESSED)) // Ждем нажатия кнопки. { _proc_device = 2; } break; case 2: if (Get_Event (EV_ID_KEY_UNPRESSED)) // Ждем отжатия кнопки. { set_soft_timer (ST_PROC_DEVICE, 5000, 0); // Установка таймера на 5 с. _proc_device = 3; } break; case 3: if (Get_Event (EV_ID_KEY_PRESSED)) // Ждем повторное нажатие кнопки. { _proc_device = 4; } if (handle_soft_timer (ST_PROC_DEVICE)) // Если 5 с истекло, начинаем сначала. { _proc_device = 1; } break; case 4: if (Get_Event (EV_ID_KEY_UNPRESSED)) // Ждем отжатия кнопки. { set_bit (PORTB, 1); // Включаем светодиод. set_soft_timer (ST_PROC_DEVICE, 3000, 0); // Установка таймера на 3 с. _proc_device = 5; } break; case 5: if (handle_soft_timer (ST_PROC_DEVICE)) // Если 3 секунды истекло, { clr_bit (PORTB, 1); // то отключаем светодиод. _proc_device = 1; // и начинаем сначала. } break; } } //======================================================================== TEMPLATE_FORUM_CXEM.rar
  6. Кратковременной - это какие временные рамки? Дребезг контактов учитываем?
  7. Пример кода для семисегментных индикаторов. //======================================================================== #ifndef SEVEN_SEGM_LED_IND_H #define SEVEN_SEGM_LED_IND_H #include "seven_segm_led_ind.h" //======================================================================== //======================================================================== #include "main_def_func.h" //======================================================================== //======================================================================== #define ANODS_PORT PORTA #define ANODS_PIN PINA #define ANODS_DDR DDRA //#define ANODS_2_PORT PORTA //#define ANODS_2_PIN PINA //#define ANODS_2_DDR DDRA #define KATODS_PORT PORTC #define KATODS_PIN PINC #define KATODS_DDR DDRC //======================================================================== //======================================================================== #define ANOD_1 1<<2 #define ANOD_2 1<<3 #define ANOD_3 1<<4 #define ANOD_4 1<<5 #define ANOD_5 1<<6 #define ANOD_6 1<<7 //------------------------------------------------------------------------ #define A 1<<6 #define B 1<<7 // A #define C 1<<3 // F B #define D 1<<2 // G #define E 1<<1 // E C #define F 1<<5 // D #define G 1<<4 #define H 1<<0 //------------------------------------------------------------------------ #define ZERO (A | B | C | D | E | F) #define ONE (B | C) #define TWO (A | B | D | E | G) #define THREE (A | B | C | D | G) #define FOUR (B | C | F | G) #define FIVE (A | C | D | F | G) #define SIX (A | C | D | E | F | G) #define SEVEN (A | B | C) #define EIGHT (A | B | C | D | E | F | G) #define NINE (A | B | C | D | F | G) #define SPACE 0 #define CHAR_SPACE 10 //======================================================================== //======================================================================== #define MAX_LED_INDS 6 #define ANODS_MASK (ANOD_1 | ANOD_2 | ANOD_3 | ANOD_4 | ANOD_5 | ANOD_6) #define KATODS_MASK (A | B | C | D | E | F | G) //======================================================================== //======================================================================== extern u08 dsp_buf []; void clr_dsp_buf (void); //======================================================================== //======================================================================== void _print_val_xxx (u08 x, u08 a); #define print_val_xxx(x, a) _print_val_xxx(((x)-1), (a)) //======================================================================== //======================================================================== typedef struct index_anods { u08 i; u08 anod; } index_anods; //======================================================================== //======================================================================== void set_proc_7_segm_ind_on (void); void set_proc_7_segm_ind_off (void); void proc_7_segm_ind (void); //======================================================================== //======================================================================== #endif //======================================================================== //======================================================================== #include "seven_segm_led_ind.h" //======================================================================== //======================================================================== struct index_anods __flash tab_index_anods [] = { {0x01, ANOD_2}, {0x02, ANOD_3}, {0x03, ANOD_4}, {0x04, ANOD_5}, {0x05, ANOD_6}, {0x00, ANOD_1}, }; u08 __flash table_7_segm_char [11] = { ZERO, ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, SPACE, }; //======================================================================== //======================================================================== soft_timer ST_PROC_7_SEGM_IND; //------------------------------------------------------------------------ u08 dsp_buf [MAX_LED_INDS]; //------------------------------------------------------------------------ // Очистка буфера дисплея. u08 dsp_buf [MAX_LED_INDS]; void clr_dsp_buf (void) { for (u08 i = 0; i < MAX_LED_INDS; i++) dsp_buf [i] = CHAR_SPACE; } //======================================================================== //======================================================================== void _print_val_xxx (u08 x, u08 a) // Вывод числа в формате xx,x. { char *ptr = num_str_buf + 7; char_to_str (a); dsp_buf[x] = *ptr; // Вывод сотен. dsp_buf[x++]; ptr++; dsp_buf[x] = *ptr; dsp_buf[x++]; ptr++; dsp_buf[x] = *ptr; // Вывод единиц. } //======================================================================== //======================================================================== static u08 _proc_7_segm_ind; void set_proc_7_segm_ind_on (void) { _proc_7_segm_ind = 1; } void set_proc_7_segm_ind_off (void) { ANODS_DDR = 0; ANODS_PORT = 0; KATODS_DDR = 0; _proc_7_segm_ind = 0; } void proc_7_segm_ind (void) { static u08 cnt_7_segm_ind; switch (_proc_7_segm_ind) { case 0: break; case 1: ANODS_DDR = 0xFF; cnt_7_segm_ind = 0; set_soft_timer (ST_PROC_7_SEGM_IND, 1, 1); _proc_7_segm_ind = 2; break; case 2: if (handle_soft_timer (ST_PROC_7_SEGM_IND)) { u08 cnt = cnt_7_segm_ind; u08 anods; u08 katods; ANODS_PORT = 0; KATODS_DDR = 0; cnt_7_segm_ind = tab_index_anods [cnt].i; anods = tab_index_anods [cnt].anod; katods = table_7_segm_char [dsp_buf [cnt_7_segm_ind]]; ANODS_PORT = anods; KATODS_DDR = katods; } break; default: break; } } //======================================================================== Пример программных таймеров. //======================================================================== #ifndef SOFT_TIMERS_H #define SOFT_TIMERS_H #include "soft_timers.h" #include "main_def_func.h" //======================================================================== //======================================================================== #define ST_TCNT TCNT0 #define ST_TIMSK TIMSK #define ST_OCIE OCIE0 #define ST_OCR OCR0 #define ST_TCCR TCCR0 #define CS0 CS00 #define CS1 CS01 #define CS2 CS02 //======================================================================== //======================================================================== typedef struct soft_timer { bool status; u08 sys_tick_prev; u16 cnt; // Counter. u16 period; // Period. } soft_timer; //======================================================================== //======================================================================== void init_soft_timers (void); #define handle_soft_timer(a) _handle_soft_timer (&a) bool _handle_soft_timer (void *ptr_timer); #define set_soft_timer(a,b,c) _set_soft_timer (&a, b, c) void _set_soft_timer (void *ptr_timer, u16 time, u16 period); //======================================================================== #endif //======================================================================== // Реализация программных таймеров. // Примечание. Важно!!!!!!!!!!!!!!! // При смене состояния конечного автомата нужно сбросить // все таймеры, которые используются в этом состоянии. Иначе может быть // следующая ситуация: если таймер уже использовался в // текущем состоянии и флаг EN установлен, то по окончании времени // выполнится соответствующий код. //--------------------- Пример использования ----------------------------- // set_soft_timer (ST_LED_2_BLINK, 50, 50); // Установка таймера. // if (handle_soft_timer (ST_LED_2_BLINK)) // Проверка таймера. //======================================================================== //======================================================================== #include "soft_timers.h" //======================================================================== //======================================================================== static u08 sys_tick; //======================================================================== //======================================================================== #pragma vector = TIMER0_COMP_vect __interrupt void Timer0Comp(void) { ST_OCR += 250; sys_tick++; } //======================================================================== //======================================================================== void init_soft_timers (void) { sys_tick = 0; ST_TCNT = 0; ST_OCR = 250; ST_TCCR |= ((1<<CS0) | (1<<CS1)); set_bit (ST_TIMSK, ST_OCIE); } //------------------------------------------------------------------------ void _set_soft_timer (void *ptr_timer, u16 time, u16 period) { struct soft_timer *ptr = ptr_timer; ptr -> status = true; if (time == 0) ptr -> sys_tick_prev = ~sys_tick; else ptr -> sys_tick_prev = sys_tick; ptr -> cnt = time; ptr -> period = period; } //------------------------------------------------------------------------ bool _handle_soft_timer (void *ptr_timer) { struct soft_timer *ptr = ptr_timer; if (ptr -> status) { if (ptr -> sys_tick_prev != sys_tick) { ptr -> sys_tick_prev = sys_tick; if (ptr -> cnt == 0) { if (ptr -> period != 0) ptr -> cnt = ptr -> period; return true; } else { ptr -> cnt--; if (ptr -> cnt == 0) { if (ptr -> period != 0) ptr -> cnt = ptr -> period; return true; } } } } return false; } //======================================================================== Пример применения программных таймеров: //************************************************************************ // Example of the using //************************************************************************ soft_timer ST_LED_2_BLINK; // Immediate execution case 0: set_soft_timer (ST_LED_2_BLINK, 0, 50); break; case 1: if (handle_soft_timer (ST_PROC_NEC)) { } break; // Execution after the specified time case 0: set_soft_timer (ST_LED_2_BLINK, 50, 50); break; case 1: if (handle_soft_timer (ST_PROC_NEC)) { } break; // Other case 0: set_soft_timer (ST_LED_2_BLINK, 1000, 50); break; case 1: if (handle_soft_timer (ST_PROC_NEC)) { } break;
  8. Автоматное программирование Модуль двигателя - конечный автомат, состояния которого "Стоп", "Разгон", "Торможение", по вкусу "Авария" (КЗ к примеру). Как-то так: static u08 motor_mode; static u08 direction; static u08 speed; void proc_motor (void) { static u08 _proc_motor; switch (_proc_motor) { case PROC_MOTOR_INIT: // инициализация переменных, портов ввода-вывода. _proc_motor = PROC_MOTOR_STOP; break; case PROC_MOTOR_STOP: // Тупо простой. Ждем действия. case PROC_MOTOR_IDLE: // Тупо простой. Ждем действия. break; case PROC_MOTOR_ACCELERATION_INIT: set_soft_timer (ST_PROC_MOTOR, 10, 10); // установка таймера. break; case PROC_MOTOR_ACCELERATION: // Здесь мы разгоняемся. if (handle_soft_timer (ST_KBD)) { if (speed < MAX_SPEED) speed++; else _proc_motor = PROC_MOTOR_IDLE; } break; case PROC_MOTOR_BRAKING_INIT: set_soft_timer (ST_PROC_MOTOR, 10, 10); // установка таймера. break; case PROC_MOTOR_BRAKING: // здесь мы тормозим. if (handle_soft_timer (ST_KBD)) { if (speed > 0) speed--; else _proc_motor = PROC_MOTOR_IDLE; } break; case PROC_MOTOR_EMERG_MODE: // здесь мы сидим в аварийном режиме. break; } } u08 get_motor_mode (void) { return motor_mode; }
  9. Здравствуйте! Я с Новосибирска, занимаюсь промышленным. оборудованием. srps_nsk () mail.ru
  10. Почему именно пик? НА AVR можно спокойно запилить ваш алгоритм.
  11. Готов взяться. srps_nsk () mail.ru Для подтверждения своей компетентности могу собрать макет и выслать видео работы.
  12. ШИМ. IR4427. IRL2505. Все работает и у транзистора температура окружающей среды. Ну пару-тройку градусов выше...
  13. Все эти радиогулюбительские схемы. Симистор управляется разнополярностноми импульсами. Тиристор однополярными импульсами. Хотите управлять тиристором, управляем однополярными импульсами с частотой 100 Гц, привязанными к частоте сети. То есть ФИМ. Фазо-импульсное регулирование. Симистор управляется разнополярными импульсами. К примеру, через импульсные трансформаторы. Или соответствующие схемы.
  14. Перемотка двигателей стоит примерно 1000 р за кВт. Так как мощность двигателя меньше 1 кВт, тут уже цена зависит от жадности продавца. Также следует учитывать, что долляр скакнул, медь подорожала. В вашем случае исходите из меньшей предложенной цены. Вдогонку, перемотанные движки зачастую отрабатывают меньший срок эксплуатации. Так что решайте сами.
×
×
  • Создать...