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.