When we first started writing effects and debugging them, we noticed that the functions using random numbers displayed the exact same animations every time. It was random alright, but the same random sequence every time. Turns out the random number generator in the ATmega needs to be seeded with a random number to create true random numbers.
We wrote a small function called bootwait(). This function serves two purposes.
1) Create a random seed. 2) Listen for button presses to select mode of operation.
It does the following:
1) Set counter x to 0.
2) Start an infinite loop, while(1).
3) Increment counter x by one.
4) Use x as a random seed.
5) Delay for a while and set red status led on.
6) Check for button presses. If the main button is pressed, the function returns 1. If the PGM button is pressed it returnes 2. The return statements exits the function thus ending the infinite loop.
7) Delay again and set green led on.
8) Check for button presses again.
9) Loop forever until a button is pressed.
The loop loops very fast, so the probability that you will stop it at the same value of x two times in a row is very remote. This is a very simple but effective way to get a good random seed.
Bootwait() is called from the main() function and its return value assigned to the variable i.
If i == 1, the main loop starts a loop that displays effects generated by the ATmega. If i == 2, it enters into RS232 mode and waits for data from a computer.