Скрипач, пророк (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);
} }
... но не любой ценой.