Zápisník experimentátora
Hierarchy: Časovač (timer)
In today's article we will again look at the timer in CTC mode. We will demonstrate a simple animation with eight LEDs. Because the timer does all the work with timing animation, in the code we only have to write the appropriate code for the animation itself.
To create an animation, we can use:
Everything is connected as shown below. The LEDs are connected to pins 2-9 and the picture shows the GND connection on my LED board using two wire jumpers to Arduino. Arduino Pro Mini also has GND on the other side, so I could use a single jumper but then it would be badly photographed.
I used my app to create a 10 Hz timer. I set the required parameters in the interface and have the application skeleton generated. In the program, I also left the LED 13 flashing on the pin 13 to see the 10 Hz frequency on one LED.
Then, adding an animation code was no more serious problem. The variable counter
contains the current LED position. Takes values 0-7. The content of the setupTimer
function is unchanged from the generator. In the setup
function, pins 2-9 are set as output.
The interrupt handler is in ISR(TIMER1_COMPA_vect)
. In the cycle, I turn on the diode, which corresponds to the value of variable counter and the other diodes turn off. The last two lines ensure that the content of the variable counter is always only 0-7. The interruption occurs 10 times per second and because we have only eight diodes, you have the optical impression that it goes a bit faster.
#define ledPin 13
int counter = 0;
void setupTimer() {
noInterrupts();
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
OCR1A = 6249; // 10 Hz
TCCR1A |= 0;
TCCR1B |= (1 << WGM12);
TCCR1B |= (1 << CS12) | (0 << CS11) | (0 << CS10);
TIMSK1 |= (1 << OCIE1A);
interrupts();
}
void setup() {
pinMode(ledPin, OUTPUT);
for (int i = 2; i < 10; i++)
pinMode(i, OUTPUT);
setupTimer();
}
void loop() {
}
ISR(TIMER1_COMPA_vect) {
digitalWrite(ledPin, digitalRead(ledPin) ^ 1);
for (int i = 0; i < 8; i++)
digitalWrite(i + 2, i == counter ? true : false);
counter++;
counter %= 8;
}
The source code is located on GitHub.
04.07.2019