Can someone tell me how to flash a led without stopping the rest of the program loop?
You could write your loop so that increments and integer each time through. Set up an IF statement that is dependent on the value of the incremented integer. For example, if you were counting from 0 to 1023, you could say IF x < 511, LEDPin = HIGH. IF x > 512, LEDPin = LOW. The loop would continue running, but the value of your integer would determine the state of your output pin.
At 16MHz, it would get to 1023 pretty quickly, so you may have to other things to make it slow enough for human perception, but this should give you something to work with.
I'm sure there are other ways to do this as well. This is just one of many.
In the IDE example programs there is blink without delay sketch that shows you a method to time actions, such as when to turn on or off a LED, without using a blocking operation like delay().
/* Blink without Delay
Turns on and off a light emitting diode(LED) connected to a digital
pin, without using the delay() function. This means that other code
can run at the same time without being interrupted by the LED code.
The circuit:
* LED attached from pin 13 to ground.
* Note: on most Arduinos, there is already an LED on the board
that's attached to pin 13, so no hardware is needed for this example.
created 2005
by David A. Mellis
modified 17 Jun 2009
by Tom Igoe
http://www.arduino.cc/en/Tutorial/BlinkWithoutDelay
*/
// constants won't change. Used here to
// set pin numbers:
const int ledPin = 13; // the number of the LED pin
// Variables will change:
int ledState = LOW; // ledState used to set the LED
long previousMillis = 0; // will store last time LED was updated
// the follow variables is a long because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
long interval = 1000; // interval at which to blink (milliseconds)
void setup() {
// set the digital pin as output:
pinMode(ledPin, OUTPUT);
}
void loop()
{
// here is where you'd put code that needs to be running all the time.
// check to see if it's time to blink the LED; that is, is the difference
// between the current time and last time we blinked the LED bigger than
// the interval at which we want to blink the LED.
if (millis() - previousMillis > interval) {
// save the last time you blinked the LED
previousMillis = millis();
// if the LED is off turn it on and vice-versa:
if (ledState == LOW)
ledState = HIGH;
else
ledState = LOW;
// set the LED with the ledState of the variable:
digitalWrite(ledPin, ledState);
}
}
Lefty
I'd prefer a timer interrupt to change the led states, i think much cleaner application since the main loop doesn't need to be concerned about the led at all.