это было дикая спагетти кода, потом частично завернул в функции, но все равно не нравилось как получилось,
последний раз написал на protothreads, уже как-то глаз радует, а теперь сижу и опять не доволен
не охото к каждому проекту пихать protothreads, + оборачивать макросами PT_BEGIN,PT_END
Как можно красиво написать похожее чисто на си ? Думаю в сторону переключения адреса, но как это сделать красиво ?
на protothreads получилось такое:
Код
//PT_YIELD(pt); - выход из функции, + сохранение место выхода
#define SetDelay_us(value) TCCR3B=0x01; TCNT3H=(0xFFFF-value*(CPU_CLK/1000000))>>8;\
TCNT3L=(0xFFFF-value*(CPU_CLK/1000000));\
PT_YIELD(pt);\
PT_THREAD(Wire_Reset_thread(struct pt *pt,unsigned char *ReturnValue)){
static unsigned short int Ack[2];
PT_BEGIN(pt);
//---------------------------------------------
Ack[0]=0;
Ack[1]=0;
//--Переключаем линию на выход и записываем 0--
Switch_Out();
SetDelay_us(480);
//--Переключаем линию на выход-----------------
Switch_In();
//---------------------------------------------
SetDelay_us(80);
//---------------------------------------------
Ack[0]=T1;
//---------------------------------------------
SetDelay_us(250);
//---------------------------------------------
Ack[1]=T1;
//---------------------------------------------
if((Ack[0] == 0)&&(Ack[1] ==1)){
*ReturnValue=SENSOR_INIT_VALIDATION_SUCCESS;
}else{
//------------------------------------------------------------------------------------------
//*ReturnValue=SENSOR_INIT_VALIDATION_FAIL;
if((Ack[0]==1)&&(Ack[1]==1)){
*ReturnValue=TYPE_T_SHORT_CIRCUIT_1;
}else{
*ReturnValue=TYPE_T_SHORT_CIRCUIT_0;
}
//------------------------------------------------------------------------------------------
}
//---------------------------------------------
PT_END(pt);
}
#define SetDelay_us(value) TCCR3B=0x01; TCNT3H=(0xFFFF-value*(CPU_CLK/1000000))>>8;\
TCNT3L=(0xFFFF-value*(CPU_CLK/1000000));\
PT_YIELD(pt);\
PT_THREAD(Wire_Reset_thread(struct pt *pt,unsigned char *ReturnValue)){
static unsigned short int Ack[2];
PT_BEGIN(pt);
//---------------------------------------------
Ack[0]=0;
Ack[1]=0;
//--Переключаем линию на выход и записываем 0--
Switch_Out();
SetDelay_us(480);
//--Переключаем линию на выход-----------------
Switch_In();
//---------------------------------------------
SetDelay_us(80);
//---------------------------------------------
Ack[0]=T1;
//---------------------------------------------
SetDelay_us(250);
//---------------------------------------------
Ack[1]=T1;
//---------------------------------------------
if((Ack[0] == 0)&&(Ack[1] ==1)){
*ReturnValue=SENSOR_INIT_VALIDATION_SUCCESS;
}else{
//------------------------------------------------------------------------------------------
//*ReturnValue=SENSOR_INIT_VALIDATION_FAIL;
if((Ack[0]==1)&&(Ack[1]==1)){
*ReturnValue=TYPE_T_SHORT_CIRCUIT_1;
}else{
*ReturnValue=TYPE_T_SHORT_CIRCUIT_0;
}
//------------------------------------------------------------------------------------------
}
//---------------------------------------------
PT_END(pt);
}