In this tutorial, I will show you how to make a delay function with timer 0 on Arduino Uno. The delay function will generate a delay of 10ms. The settings that I used for this timer is normal mode. In this mode, timer will count from a loaded value up to timer overflow value. Loaded value for timer 0 (TCNT0) can be calculated with this formula TCNT0 = (1 + 0xFF) - (T * CLK)/N. T is the period of this timer will be overflow (0.01s), N is the prescaler, and CLK is the crystal frequency (16 MHz). The prescaler that I use is 1024. Therefore the TCNT0 value is (1 + 0xFF) - (0.01s * 16000000Hz)/1024 = 100 = 0x64.
This is the function for generating 10ms delay using timer 0:
// Delay 10ms with timer 0 normal mode, pooling void T0Delay() { // Load initial count value TCNT0 = 0x64; // Init timer mode and prescaler TCCR0A = 0; TCCR0B = (1 << CS02) | (1 << CS00); // Wait until timer 0 overflow while ((TIFR0 & (1 << TOV0)) == 0); // Stop timer 0 TCCR0B = 0; // Clear time 0 overflow flag TIFR0 = (1 << TOV0); }
In this function there is a while loop for waiting until timer 0 is overflow. Using while loop for waiting something happen is usually called pooling method. When use pooling method, CPU is not do anything and can't do other task, just wait until something happen.
To test the delay function, we can use this main program:
void setup() { // PORTB.5(pin 13 Arduino) as an output bitSet(DDRB, 5); } void loop() { // Toggle LED on pin 13 Arduino bitSet(PINB, 5); // Delay 1s(100 * 10ms) for (int i = 0; i < 100; i++) T0Delay(); }
In main function, we test delay function that we have made before to generate 1s delay by looping it 100 times. So, every 1s LED will be toggled.
Thank you for posting such a useful, impressive.your blog is so beautiful. you have give me great news.
ReplyDeleteAMC Coaching for Doctors in Melbourne
OET Coaching in Adelaide
OET Training in Adelaide
OET Coaching for Dentists in Adelaide
Thank you so much for reading my blog.
Delete