Corning Community College ENGR1050 C for Engineers ======Project: ELECTRONICS PI FUN - LEDBAR BINARY COUNTER (epf1)====== =====Objective===== To adapt your bcf0 program to, instead of displaying values to STDOUT, instead lights up LEDs on the LEDbar, so the binary counter, in incrementing or decrementing fashion, is better visualized. =====Reading===== In "The C Book", please read through Chapter 5. =====Diagram===== To refresh your memory, here is a diagram of the circuit you can build to drive the LEDbar: {{:haas:fall2019:c4eng:projects:ledbar.png?400|}} Be sure to use 220 Ohm resistors for this. =====Program===== It is your task to adapt your bcf0 program so that, upon accepting various pieces of input from the user, acts as a binary counter, lighting up the resultant LEDs in binary (1 being on, 0 being off), inserting an adequate delay so we can watch as it proceeds from a starting to an ending value. =====Specifications===== Your program should: * have valid, descriptive variable names of length //no shorter than// 4 symbols * have consistent, well-defined indentation (no less than 4 spaces per level of indentation) * all code within the same scope aligned to its indentation level * have proximal comments explaining your rationale and what is going on, throughout your code * to STDERR, prompt for the starting value (0-1023) * properly store this in a variable of type **signed short int** * to STDERR, prompt for the ending value (0-1023) * properly store this in a variable of type **signed short int** * immediately after each input, check to make sure starting and ending values fall appropriately in the range stated; if in violation, display an error (to STDERR) and exit with a non-zero value. * check the starting and ending values to determine if we are to perform an incrementation or a decrementation. * in binary, display the starting number and all the others as well to the LEDs * proceed to the next value in sequence, doing the same * keep going until you have arrived at the ending value, visualizing it on the LEDs it as well * using a single return statement at the conclusion of the code, return a 0 indicating successful operation * if you do not have an LEDbar component (or a fully working LEDbar component), substitute as appropriate with individual LEDs (don't forget the resistors!) Some additional points of consideration: * Note that the driving variables in your loops need to be at least of type **short int**, otherwise you may get a warning when you compile it. =====Execution===== ====Sample incrementation run==== pi@raspberrypi:~/src/c4eng/epf1$ ./epf1 Enter starting value (0-1023): 12 Enter ending value (0-1023): 28 pi@raspberrypi:~/src/c4eng/epf1$ The execution of the program is short and simple- obtain the input, do the processing, produce the output, and then terminate. ====Sample decrementation run==== pi@raspberrypi:~/src/c4eng/epf1$ ./epf1 Enter starting value (0-1023): 17 Enter ending value (0-1023): 0 pi@raspberrypi:~/src/c4eng/epf1$ ====Sample run with invalid input given (scenario 1)==== lab46:~/src/c4eng/epf1$ ./epf1 Enter starting value (0-1023): 5543 ERROR: input value must be between 0-1023! lab46:~/src/c4eng/epf1$ ====Sample run with invalid input given (scenario 2)==== lab46:~/src/c4eng/epf1$ ./epf1 Enter starting value (0-1023): 255 Enter ending value (0-1023): 7168 ERROR: input value must be between 0-1023! lab46:~/src/c4eng/epf1$ =====Obtaining binary values===== You might wonder how, when you are limited to non-binary input, how you can obtain the binary value so that you can work with it. There are a couple ways to go about this: ====Method one: convert from decimal to binary==== Using the division method, you can convert a decimal value to binary, continually dividing the value (or its quotient) by the base, until the quotient is 0, then we use the remainders to give us the binary value: * value / base * value = 15 * value / 2 * ie: 15 / 2 * quotient: 7 * remainder: 1 * value = quotient * value / 2 * ie: 7 / 2 * quotient: 3 * remainder: 1 * value = quotient * value / 2 * ie: 3 / 2 * quotient: 1 * remainder: 1 * value = quotient * value / 2 * ie: 1 / 2 * quotient: 0 * remainder: 1 The binary for 15 (decimal) is 1111 (binary) Or: * value = 11 * value / 2 * quotient: 5 * remainder: 1 * value = 5 * value / 2 * quotient: 2 * remainder: 1 * value = 2 * value / 2 * quotient: 1 * remainder: 0 * value = 1 * value / 2 * quotient: 0 * remainder: 1 The binary for 11 (decimal) is 1011 (binary). NOTE that the order in which we get the remainders produces the number from right to left. ====Method 2: bitwise AND the place values==== If one understands the weight values corresponding with the places of each bit in a binary number, we can simply do a bitwise AND and see if the result is greater than 0 or not: ^ 2 to the 7 ^ 2 to the 6 ^ 2 to the 5 ^ 2 to the 4 ^ 2 to the 3 ^ 2 to the 2 ^ 2 to the 1 ^ 2 to the 0 ^ | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | So, if we wanted to see if the 2 to the 7th bit is active, we can simply: value = number & 128; We can then check of value is greater than 0; if it is, we've got a 1 in that position, if it isn't, we have a 0. We can then repeat the operation for 64, 32, 16, etc. down to 1, to get each bit of our number. NOTE that I have only taken us out to 8-bits. You may need to extend this to incorporate all the allowed values for this project. =====Submission===== To successfully complete this project, the following criteria must be met: * Code must compile cleanly (no warnings or errors) * Output must be correct, and match the form given in the sample output above. * Code must be nicely and consistently indented * Code must be well commented * Do NOT double space your code. Group like statements together. * Output Formatting (including spacing) of program must conform to the provided output (see above). * Track/version the source code in a repository * Submit a copy of your source code to me using the **submit** tool. To submit this program to me using the **submit** tool, run the following command at your lab46 prompt: $ submit c4eng epf1 epf1.c Submitting c4eng project "epf1": -> epf1.c(OK) SUCCESSFULLY SUBMITTED You should get some sort of confirmation indicating successful submission if all went according to plan. If not, check for typos and or locational mismatches.