12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- /*
- * baudcheck.c
- * Mar, 2013 by Bill Westfield (WestfW@yahoo.com)
- * Exercises in executing arithmetic code on a system that we can't count
- * on having the usual languages or tools installed.
- *
- * This little "C program" is run through the C preprocessor using the same
- * arguments as our "real" target (which should assure that it gets the
- * same values for clock speed and desired baud rate), and produces as
- * output a shell script that can be run through bash, and THAT in turn
- * writes the desired output...
- *
- * Note that the C-style comments are stripped by the C preprocessor.
- *
- * Copyright 2013-2015 by Bill Westfield.
- * This software is licensed under version 2 of the Gnu Public Licence.
- * See optiboot.c for details.
- */
- /*
- * First strip any trailing "L" from the defined constants. To do this
- * we need to make the constants into shell variables first.
- */
- bpsx=BAUD_RATE
- bps=${bpsx/L/}
- bps=${bps/U/}
- fcpux=F_CPU
- fcpu=${fcpux/L/}
- fcpu=${fcpu/U/}
- // echo f_cpu = $fcpu, baud = $bps
- /*
- * Compute the divisor
- */
- #ifdef SINGLESPEED
- BAUD_SETTING=$(( ( ($fcpu + $bps * 8) / (($bps * 16))) - 1 ))
- #else
- BAUD_SETTING=$(( ( ($fcpu + $bps * 4) / (($bps * 8))) - 1 ))
- #endif
- // echo baud setting = $BAUD_SETTING
- /*
- * Based on the computer divisor, calculate the actual bitrate,
- * And the error. Since we're all integers, we have to calculate
- * the tenths part of the error separately.
- */
- #ifdef SINGLESPEED
- BAUD_ACTUAL=$(( ($fcpu/(16 * (($BAUD_SETTING)+1))) ))
- #else
- BAUD_ACTUAL=$(( ($fcpu/(8 * (($BAUD_SETTING)+1))) ))
- #endif
- BAUD_ERROR=$(( (( 100*($BAUD_ACTUAL - $bps) ) / $bps) ))
- ERR_TS=$(( ((( 1000*($BAUD_ACTUAL - $bps) ) / $bps) - $BAUD_ERROR * 10) ))
- ERR_TENTHS=$(( ERR_TS > 0 ? ERR_TS: -ERR_TS ))
- /*
- * Print a nice message containing the info we've calculated
- */
- echo BAUD RATE CHECK: Desired: $bps, Real: $BAUD_ACTUAL, UBRRL = $BAUD_SETTING, Difference=$BAUD_ERROR.$ERR_TENTHS\%
|