ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
22 ноября
301601 Топик полностью
Скрипач, пророк (24.01.2012 21:17 - 22:04, просмотров: 204) ответил Vladimir Ljaschko на А голова зачем дана? Когда накладно, то инлайнить. Пример управления двумя приводами (position control=pc) да и прочими автоматами для трех проектов в одном workspace.
Угу. Именно то, о чем я говорил. НАКЛАДНО! (Я про много служебных символов в тексте, инлайном такое не лечится) Мой вариант: #include "OS_base.h" #include "pt_ext.h" #define ai_LowP ADC_val[0] #define ai_P1 ADC_val[1] #define ai_P2 ADC_val[2] #define di_P1 (IOPort & _BV(3)) #define di_P2 (IOPort & _BV(4)) #define do_P1_1 12 #define do_P1_2 13 #define do_P2_1 14 #define do_P2_2 15 static void Pump_On(uint8_t addr){ PORTB |= UnPackBPins(_BV(addr)) & UnPackBPins(IO_OUTS_MASK); PORTD |= UnPackDPins(_BV(addr)) & UnPackDPins(IO_OUTS_MASK); } static void Pump_Off(uint8_t addr){ PORTB &= ~(UnPackBPins(_BV(addr)) & UnPackBPins(IO_OUTS_MASK)); PORTD &= ~(UnPackDPins(_BV(addr)) & UnPackDPins(IO_OUTS_MASK)); } static char LowPressure_Ctrl(struct pt *pt, int16_t pv, int16_t sp, uint8_t* Flag, uint8_t* t1){ PT_BEGIN(pt); while(1) { *Flag = 0; PT_AT_LEAST(pt, (pv < sp), *t1, 5); *Flag = 1; PT_AT_LEAST(pt, (pv > sp), *t1, 120); }; PT_END(pt); }; static char Pressure_Ctrl(struct pt *pt, int16_t pv, int16_t sp, int16_t dsp, uint8_t* out, uint8_t* t2){ PT_BEGIN(pt); while(1) { PT_AT_LEAST(pt, (pv < sp), *t2, 5); *out = 1; PT_AT_LEAST(pt, (pv > (sp + dsp)), *t2, 5); *out = 0; }; PT_END(pt); } static char Pump2(struct pt *pt, uint8_t cmd, uint8_t stat, uint8_t out1,uint8_t out2, uint8_t* t3){ PT_BEGIN(pt); while(1) { PT_WAIT_UNTIL(pt, cmd); T_RST(t3); PT_SET(pt); if(LowP_Flag){ Pump_Off(out1); T_RST(t3); PT_SYS(pt); }; if(!cmd){ Pump_Off(out1); PT_RESTART(pt);}; Pump_On(out1); if(stat) T_RST(t3); if(T_SECS(*t3) < 30) PT_SYS(pt); Pump_Off(out1); T_RST(t3); PT_SET(pt); if(LowP_Flag){ Pump_Off(out2); T_RST(t3); PT_SYS(pt); }; if(!cmd){ Pump_Off(out2); PT_RESTART(pt);}; Pump_On(out2); if(stat) T_RST(t3); if(T_SECS(*t3) < 30) PT_SYS(pt); Pump_Off(out2); PT_YIELD(pt); }; PT_END(pt); } char LowP_Flag = 0; uint8_t P1_out, P2_out; static uint8_t tm1,tm2,tm3,tm4,tm5; static struct pt P0,P1,P2,P1_pumps,P2_pumps; int main(void){ PT_INIT(&P0); PT_INIT(&P1); PT_INIT(&P2); PT_INIT(&P1_pumps); PT_INIT(&P2_pumps); while(1){ sleep_cpu(); wdt_reset(); net_process_data(); adc_oversampling(); sys_dio(); LowPressure_Ctrl(&P0, ai_LowP, eeprom_readw(ee_SP_Low), &LowP_Flag, &tm1); Pressure_Ctrl(&P1, ai_P1, eeprom_readw(ee_SP1), eeprom_readw(ee_dSP), &P1_out, &tm2); Pressure_Ctrl(&P2, ai_P2, eeprom_readw(ee_SP2), eeprom_readw(ee_dSP), &P2_out, &tm3); Pump2(&P1_pumps, P1_out, di_P1, do_P1_1, do_P1_2, &tm4); Pump2(&P2_pumps, P2_out, di_P2, do_P2_1, do_P2_2, &tm5); } }
... но не любой ценой.