Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdint.h>
- static uint16_t subtract_cap(uint16_t num, uint16_t sub) {
- if (num > sub)
- return num - sub;
- else
- return 1;
- }
- void calc(int f_cpu, int speed, uint16_t *txd, uint16_t *rxd_cent, uint16_t *rxd_intra, uint16_t *rxd_stop)
- {
- #define BASE 4
- uint16_t bit_delay = (f_cpu / speed) / BASE;
- *txd = subtract_cap(bit_delay, 14 / BASE);
- *rxd_cent = subtract_cap(bit_delay / 2, (4 + 4 + 44 + 14 - 14) / BASE);
- *rxd_intra = subtract_cap(bit_delay, 14 / BASE);
- *rxd_stop = subtract_cap(bit_delay * 3 / 4, (28 + 6) / BASE);
- /* convert to delay times -> real clocks */
- *txd *= BASE;
- *rxd_cent *= BASE;
- *rxd_intra *= BASE;
- *rxd_stop *= BASE;
- }
- /* original calculation code */
- void calc2(int f_cpu, int speed, uint16_t *txd, uint16_t *rxd_cent, uint16_t *rxd_intra, uint16_t *rxd_stop)
- {
- uint16_t bit_delay = (f_cpu / speed) / 4;
- *txd = subtract_cap(bit_delay, 15 / 4);
- *rxd_cent = subtract_cap(bit_delay / 2, (4 + 4 + 75 + 17 - 23) / 4);
- *rxd_intra = subtract_cap(bit_delay, 23 / 4);
- *rxd_stop = subtract_cap(bit_delay * 3 / 4, (37 + 11) / 4);
- /* convert to delay times -> real clocks */
- *txd *= 4;
- *rxd_cent *= 4;
- *rxd_intra *= 4;
- *rxd_stop *= 4;
- }
- int main(int argc, char *argv[])
- {
- #define F_CPU 16000000
- int speed_table[] = {
- 300, 600, 1200, 2400, 4800, 9600, 19200,
- 38400, 57600, 115200, 230400,
- };
- int i;
- uint16_t _rx_delay_centering, _rx_delay_centering2;
- uint16_t _rx_delay_intrabit, _rx_delay_intrabit2;
- uint16_t _rx_delay_stopbit, _rx_delay_stopbit2;
- uint16_t _tx_delay, _tx_delay2;
- for (i = 0; i < sizeof(speed_table) / sizeof(int); i++) {
- calc(F_CPU, speed_table[i], &_tx_delay, &_rx_delay_centering,
- &_rx_delay_intrabit, &_rx_delay_stopbit);
- calc2(F_CPU, speed_table[i], &_tx_delay2, &_rx_delay_centering2,
- &_rx_delay_intrabit2, &_rx_delay_stopbit2);
- printf("%8d %6d %5d(%d) %5d(%d) %5d(%d) %5d(%d)\n",
- F_CPU, speed_table[i],
- _tx_delay, _tx_delay - _tx_delay2,
- _rx_delay_centering, _rx_delay_centering - _rx_delay_centering2,
- _rx_delay_intrabit, _rx_delay_intrabit - _rx_delay_intrabit2,
- _rx_delay_stopbit, _rx_delay_stopbit - _rx_delay_stopbit2);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement