This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
en:examples:timer:delay [2015/11/05 10:04] – heikopikner | en:examples:timer:delay [2020/07/20 09:00] (current) – external edit 127.0.0.1 | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ~~PB~~ | + | < |
====== Delay ====== | ====== Delay ====== | ||
Line 63: | Line 63: | ||
<code c> | <code c> | ||
- | // Software delay in milliseconds. | + | // Software delay in milliseconds |
void sw_delay_ms(unsigned short count) | void sw_delay_ms(unsigned short count) | ||
{ | { | ||
Line 69: | Line 69: | ||
while (count-- > 0) | while (count-- > 0) | ||
{ | { | ||
- | // 1ms delay with a special function. | + | // 1ms delay with a special function |
_delay_ms(1); | _delay_ms(1); | ||
} | } | ||
Line 78: | Line 78: | ||
<code c> | <code c> | ||
- | // The demonstration program of the software delay of the HomeLab. | + | // The demonstration program of the software delay of the HomeLab |
- | // The program is blinking a LED for a moment after ~1 second. | + | // The program is blinking a LED for a moment after ~1 second |
#include < | #include < | ||
#include < | #include < | ||
Line 86: | Line 86: | ||
int main(void) | int main(void) | ||
{ | { | ||
- | // Setting the pin of the LED as output. | + | // Setting the pin of the LED as output |
pin_setup_output(led_debug); | pin_setup_output(led_debug); | ||
Line 101: | Line 101: | ||
pin_set(led_debug); | pin_set(led_debug); | ||
- | // Software delay for 900 milliseconds. | + | // Software delay for 900 milliseconds |
sw_delay_ms(900); | sw_delay_ms(900); | ||
} | } | ||
Line 115: | Line 115: | ||
<code c> | <code c> | ||
- | // Hardware delay in milliseconds. | + | // Hardware delay in milliseconds |
void hw_delay_ms(unsigned short count) | void hw_delay_ms(unsigned short count) | ||
{ | { | ||
- | // Calculating the initial value of the timer. | + | // Calculating the initial value of the timer |
register unsigned char timer_start = 256 - F_CPU / 1000 / 64; | register unsigned char timer_start = 256 - F_CPU / 1000 / 64; | ||
- | // Starting the timer. | + | // Starting the timer |
timer0_init_normal(TIMER0_PRESCALE_64); | timer0_init_normal(TIMER0_PRESCALE_64); | ||
- | // Counting the variable of the delay to the 0. | + | // Counting the variable of the delay to the 0 |
while (count-- > 0) | while (count-- > 0) | ||
{ | { | ||
- | // Initializing the timer. | + | // Initializing the timer |
timer0_set_value(timer_start); | timer0_set_value(timer_start); | ||
- | // Zeroing the overflow flag. | + | // Zeroing the overflow flag |
timer0_overflow_flag_clear(); | timer0_overflow_flag_clear(); | ||
- | // Waiting for overflow. | + | // Waiting for overflow |
while (!timer0_overflow_flag_is_set()) | while (!timer0_overflow_flag_is_set()) | ||
{ | { | ||
Line 140: | Line 140: | ||
} | } | ||
- | // Zeroing the overflow flag. | + | // Zeroing the overflow flag |
timer0_overflow_flag_clear(); | timer0_overflow_flag_clear(); | ||
- | // Stoping the timer. | + | // Stoping the timer |
timer0_stop(); | timer0_stop(); | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Referenced delay function uses a timer library whose source code for ATmega controller looks like the following: | ||
+ | |||
+ | <code c> | ||
+ | // Timer 0 prescaler selection type | ||
+ | typedef enum | ||
+ | { | ||
+ | TIMER0_NO_PRESCALE | ||
+ | TIMER0_PRESCALE_8 | ||
+ | TIMER0_PRESCALE_32 | ||
+ | TIMER0_PRESCALE_64 | ||
+ | TIMER0_PRESCALE_128 | ||
+ | TIMER0_PRESCALE_256 | ||
+ | TIMER0_PRESCALE_1024 | ||
+ | } | ||
+ | timer0_prescale; | ||
+ | |||
+ | // Setting Timer 0 to a normal mode | ||
+ | inline void timer0_init_normal(timer0_prescale prescale) | ||
+ | { | ||
+ | TCCR0 = prescale & 0x07; | ||
+ | } | ||
+ | |||
+ | // Stopping the Taimer 0 | ||
+ | inline void timer0_stop() | ||
+ | { | ||
+ | TCCR0 = 0x00; | ||
+ | } | ||
+ | |||
+ | // Taimer 0 value set | ||
+ | inline void timer0_set_value(unsigned char value) | ||
+ | { | ||
+ | TCNT0 = value; | ||
+ | } | ||
+ | |||
+ | // Timer 0 overflow flag clear | ||
+ | inline void timer0_overflow_flag_clear(void) | ||
+ | { | ||
+ | bit_set(TIFR, | ||
+ | } | ||
+ | |||
+ | // Timer 0 overflow flag state reading | ||
+ | inline bool timer0_overflow_flag_is_set(void) | ||
+ | { | ||
+ | return (bit_is_set(TIFR, | ||
} | } | ||
</ | </ | ||
Line 151: | Line 198: | ||
<code c> | <code c> | ||
- | // Demonstration program of hardware delay of the HomeLab. | + | // Demonstration program of hardware delay of the HomeLab |
- | // The Program blinks LED for a moment after every ~1 second. | + | // The Program blinks LED for a moment after every ~1 second |
#include < | #include < | ||
#include < | #include < | ||
- | // Main program. | + | // Main program |
int main(void) | int main(void) | ||
{ | { | ||
- | // Setting the pin of the LED as output. | + | // Setting the pin of the LED as output |
pin_setup_output(led_debug); | pin_setup_output(led_debug); | ||
- | // Endless loop. | + | // Endless loop |
while (true) | while (true) | ||
{ | { | ||
- | // Lighting the LED. | + | // Lighting the LED |
pin_clear(led_debug); | pin_clear(led_debug); | ||
- | // Hardware delay for 100 milliseconds. | + | // Hardware delay for 100 milliseconds |
hw_delay_ms(100); | hw_delay_ms(100); | ||
- | // Switch off of the LED. | + | // Switch off of the LED |
pin_set(led_debug); | pin_set(led_debug); | ||
- | // Hardware delay for 900 milliseconds. | + | // Hardware delay for 900 milliseconds |
hw_delay_ms(900); | hw_delay_ms(900); | ||
} | } |