/* ** =================================================================== ** Method : Servo2_SetDutyUS (bean PWM) ** ** Description : ** This method sets the new duty value of the output signal. The ** duty is expressed in microseconds as a 16-bit unsigned integer ** number. ** Parameters : ** NAME - DESCRIPTION ** Time - Duty to set [in microseconds] ** (0 to 2500 us 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_SetDutyUS(word Time) { dlong rtval; /* Result of two 32-bit numbers multiplication */ PE_Timer_LngMul((dword)Time,(dword)439804651,&rtval); /* Multiply given value and high speed CPU mode coefficient */ if (PE_Timer_LngHi3(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_SetDutyUS (component PWM) ** Description : ** This method sets the new duty value of the output signal. ** The duty is expressed in microseconds as a 16-bit ** unsigned integer number. ** Parameters : ** NAME - DESCRIPTION ** Time - Duty to set [in microseconds] ** (0 to 20000 us 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_SetDutyUS(word Time) { dlong rtval; /* Result of two 32-bit numbers multiplication */ if (Time > 0x4E20U) { /* Is the given value out of range? */ return ERR_RANGE; /* If yes then error */ } PE_Timer_LngMul((dword)Time, 0x0346DADDUL, &rtval); /* Multiply given value and High speed CPU mode coefficient */ if (PE_Timer_LngHi3(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_GetTimeUS (bean FreeCntr32) ** ** Description : ** Returns the time (as a 16-bit unsigned integer) in microseconds ** since the last resetting after the last reset. ** Parameters : ** NAME - DESCRIPTION ** * Time - A pointer to the returned 16-bit value ** in microseconds ** 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_GetTimeUS(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, 167772160UL, &RTval); /* Multiply ticks and high speed CPU mode coefficient */ if (PE_Timer_LngHi3(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_SetPeriodUS (bean TimerInt) ** ** Description : ** This method sets the new period of the generated events. ** The period is expressed in microseconds 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 microseconds] ** (1000 to 20000 microseconds) ** 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_SetPeriodUS(word Time) { dlong rtval; /* Result of two 32-bit numbers multiplication */ word rtword; /* Result of 64-bit number division */ if ((Time > 20000) || (Time < 1000)) /* Is the given value out of range? */ return ERR_RANGE; /* If yes then error */ PE_Timer_LngMul((dword)Time,52412023,&rtval); /* Multiply given value and high speed CPU mode coefficient */ if (PE_Timer_LngHi3(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_GetTimeUS (component FreeCntr8) ** ** Description : ** Returns the time (as a 16-bit unsigned integer) in microseconds ** since the last resetting after the last reset. ** Parameters : ** NAME - DESCRIPTION ** * Time - A pointer to the returned 16-bit value ** in microseconds ** 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_GetTimeUS(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,134217728UL,&rtval); /* Multiply ticks and high speed CPU mode coefficient */ if (PE_Timer_LngHi3(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 */ } }