/* ** =================================================================== ** Method : Servo2_SetDutyMS (bean PWM) ** ** Description : ** This method sets the new duty value of the output signal. The ** duty is expressed in milliseconds as a 16-bit unsigned integer ** number. ** Parameters : ** NAME - DESCRIPTION ** Time - Duty to set [in milliseconds] ** (0 to 2 ms in high speed mode) ** Returns : ** --- - Error code, possible codes: ** ERR_OK - OK ** ERR_SPEED - This device does not work in ** the active speed mode ** ERR_MATH - Overflow during evaluation ** ERR_RANGE - Parameter out of range ** =================================================================== */ byte Servo2_SetDutyMS(word Time) { dlong rtval; /* Result of two 32-bit numbers multiplication */ PE_Timer_LngMul((dword)Time,(dword)1717986918,&rtval); /* Multiply given value and high speed CPU mode coefficient */ if (PE_Timer_LngHi2(rtval[0],rtval[1],&RatioStore)) { /* Is the result greater or equal than 65536 ? */ RatioStore = 65535; /* If yes then use maximal possible value */ } SetRatio(); /* Calculate and set up new appropriate values of the duty and period registers */ return ERR_OK; /* OK */ }
/* ** =================================================================== ** Method : M_1_SetDutyMS (component PWM) ** Description : ** This method sets the new duty value of the output signal. ** The duty is expressed in milliseconds as a 16-bit ** unsigned integer number. ** Parameters : ** NAME - DESCRIPTION ** Time - Duty to set [in milliseconds] ** (0 to 20 ms in high speed mode) ** Returns : ** --- - Error code, possible codes: ** ERR_OK - OK ** ERR_SPEED - This device does not work in ** the active speed mode ** ERR_MATH - Overflow during evaluation ** ERR_RANGE - Parameter out of range ** =================================================================== */ byte M_1_SetDutyMS(word Time) { dlong rtval; /* Result of two 32-bit numbers multiplication */ if (Time > 0x14U) { /* Is the given value out of range? */ return ERR_RANGE; /* If yes then error */ } PE_Timer_LngMul((dword)Time, 0x0CCCC6EFUL, &rtval); /* Multiply given value and High speed CPU mode coefficient */ if (PE_Timer_LngHi2(rtval[0], rtval[1], &ActualRatio.Value)) { /* Is the result greater or equal than 65536 ? */ ActualRatio.Value = 0xFFFFU; /* If yes then use maximal possible value */ } SetRatio(); /* Calculate and set up new appropriate values of the compare and modulo registers */ return ERR_OK; /* OK */ }
/* ** =================================================================== ** Method : FC321_GetTimeMS (bean FreeCntr32) ** ** Description : ** Returns the time (as a 16-bit unsigned integer) in milliseconds ** since the last resetting after the last reset. ** Parameters : ** NAME - DESCRIPTION ** * Time - A pointer to the returned 16-bit value ** in milliseconds ** Returns : ** --- - Error code, possible codes: ** ERR_OK - OK ** ERR_SPEED - This device does not work in ** the active speed mode ** ERR_OVERFLOW - Software counter overflow ** ERR_MATH - Overflow during evaluation ** =================================================================== */ byte FC321_GetTimeMS(word *Time) { dlong RTval; /* Result of two 32-bit numbers multiplication */ if (LoadTicks()) { /* Load actual state of counter */ return ERR_OVERFLOW; /* If yes then error */ } PE_Timer_LngMul(LTicks, 42949673UL, &RTval); /* Multiply ticks and high speed CPU mode coefficient */ if (PE_Timer_LngHi4(RTval[0], RTval[1], Time)) { /* Is the result greater or equal than 65536 ? */ return ERR_MATH; /* If yes then error */ } else { /* Is the result less than 65536 ? */ return ERR_OK; /* If yes then OK */ } }
/* ** =================================================================== ** Method : TickTimer_SetPeriodMS (bean TimerInt) ** ** Description : ** This method sets the new period of the generated events. ** The period is expressed in miliseconds as a 16-bit ** unsigned integer number. ** This method is available only if runtime setting type ** 'from interval' is selected in the Timing dialog box in ** Runtime setting area. ** Parameters : ** NAME - DESCRIPTION ** Time - Period to set [in miliseconds] ** (1 to 20 milliseconds) ** Returns : ** --- - Error code, possible codes: ** ERR_OK - OK ** ERR_SPEED - This device does not work in ** the active speed mode ** ERR_MATH - Overflow during evaluation ** ERR_RANGE - Parameter out of range ** =================================================================== */ byte TickTimer_SetPeriodMS(word Time) { dlong rtval; /* Result of two 32-bit numbers multiplication */ word rtword; /* Result of 64-bit number division */ if ((Time > 20) || (Time < 1)) /* Is the given value out of range? */ return ERR_RANGE; /* If yes then error */ PE_Timer_LngMul((dword)Time,204734464,&rtval); /* Multiply given value and high speed CPU mode coefficient */ if (PE_Timer_LngHi2(rtval[0],rtval[1],&rtword)) /* Is the result greater or equal than 65536 ? */ rtword = 65535; /* If yes then use maximal possible value */ CmpHighVal = rtword; /* Store result (compare register value for high speed CPU mode) to the variable CmpHighVal */ SetCV(CmpHighVal); /* Store appropriate value to the compare register according to the selected high speed CPU mode */ return ERR_OK; /* OK */ }
/* ** =================================================================== ** Method : FC81_GetTimeMS (component FreeCntr8) ** ** Description : ** Returns the time (as a 16-bit unsigned integer) in milliseconds ** since the last resetting after the last reset. ** Parameters : ** NAME - DESCRIPTION ** * Time - A pointer to the returned 16-bit value ** in milliseconds ** Returns : ** --- - Error code, possible codes: ** ERR_OK - OK ** ERR_SPEED - This device does not work in ** the active speed mode ** ERR_OVERFLOW - Software counter overflow ** ERR_MATH - Overflow during evaluation ** =================================================================== */ byte FC81_GetTimeMS(word *Time) { dlong rtval; /* Result of two 32-bit numbers multiplication */ LoadTicks(); /* Load actual state of counter */ if (LOvf) { /* Testing counter overflow */ return ERR_OVERFLOW; /* If yes then error */ } PE_Timer_LngMul((dword)LTicks,34359738UL,&rtval); /* Multiply ticks and high speed CPU mode coefficient */ if (PE_Timer_LngHi4(rtval[0],rtval[1],Time)) { /* Is the result greater or equal than 65536 ? */ return ERR_MATH; /* If yes then error */ } else { /* Is the result less than 65536 ? */ return ERR_OK; /* If yes then OK */ } }