This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
en:examples:timer:hardware_delay [2010/03/04 14:27] – priitj | en:examples:timer:hardware_delay [2020/07/20 09:00] (current) – external edit 127.0.0.1 | ||
---|---|---|---|
Line 5: | Line 5: | ||
===== Theory ===== | ===== Theory ===== | ||
- | The software delay is not the only method for creating breaks. The same can be done using timer. Timer is a hardware which counts up or counts | + | The software delay is not the only method for creating breaks. The same can be done using timer. Timer is a hardware which counts up or down with a certain frequency. The clock frequency of the timer can be generated from microcontroller’s frequency or from some kind of other outside pace. In general the clock frequency can be divided |
[{{ : | [{{ : | ||
- | AVR counters can be made informing | + | AVR counters can be made to inform |
- | For generating a delay using a timer, it is sufficient when only the timer is set and waiting for the status bit to go high. Different from the software delay, the work of the timer is not depending on the compiler, | + | For generating a delay using a timer, it is only necessary to set the timer and waiting for the status bit to go high. Different from the software delay, the work of the timer is not depending on the compiler, |
===== Practice ===== | ===== Practice ===== | ||
+ | The program code below is a delay function based on a timer, which is simplified a little bit. The principle of counting is the same as it is at software delay function – a desired amount of 1 ms long delays are produced. The delay is produced with an 8-bit ATmega 128 counter 0. It is calculated previously that at clock frequency 14,7456 Mhz the timing signal has to be divided at least 64 times, so that the counter would not reach to overflow in 1 ms. The value which the counter must have so that the overflow occurs after 1 ms is presented in the form of an expression and the variable is // | ||
- | Allpool olev programmikood on aga taimeril põhinev viitefunktsioon, mida on natuke lihtsustatud. Loendamise põhimõte on sama mis tarkvaralise viite funktsioonilgi - tekitatakse soovitud arv 1 ms pikkuseid viiteid. Viite tekitamiseks on kasutusel ATmega128 8-bitine loendur 0. Eelnevalt on juba välja arvutatud, et 14,7456 Mhz taktsageduse puhul peab loenduri taktsignaal olema vähemalt 64 korda jagatud, et 1 ms jooksul 8-bitine loendur üle ei täituks. See, mis väärtust loendur omama peab, et ületäitumine toimuks 1 ms järel, on esitatud avaldise kujul ja omistatud muutujale // | + | In the cycle takes place initialing of the counter and zeroing the flag of the overflow (by writing 1 into that). Then is waited until the counter counts to 256 from the initial value, i.e. to the overflow. At the moment of the overflow the flag goes high and the delay of 1 ms has taken place. In the end of the function the timer is stopped. |
- | Tsüklis toimub loenduri algväärtustamine ja ületäitumise lipukese nullimine (sellesse 1 kirjutades). Seejärel oodatakse, kuni loendur loendab algväärtusest 256-ni, ehk ületäitumiseni. Ületäitumise hetkel läheb ületäitumise lipuke kõrgeks ja 1 ms viide ongi toimunud. Funktsiooni lõpus taimer peatatakse. | ||
<code c> | <code c> | ||
// | // | ||
- | // Riistvaraline viide millisekundites | + | // Hardware delay in milliseconds. |
// | // | ||
void hw_delay_ms(unsigned short count) | void hw_delay_ms(unsigned short count) | ||
{ | { | ||
- | // Taimeri algväärtuse arvutamine | + | // 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; | ||
- | // Taimeri käivitamine | + | // Starting the timer. |
timer0_init_normal(TIMER0_PRESCALE_64); | timer0_init_normal(TIMER0_PRESCALE_64); | ||
- | // Viite muutuja nullini loendamine | + | // Counting the variable of the delay to the 0. |
while (count-- > 0) | while (count-- > 0) | ||
{ | { | ||
- | // Taimeri algväärtustamine | + | // Initializing the timer. |
timer0_set_value(timer_start); | timer0_set_value(timer_start); | ||
- | // Ületäitumise lipukese nullimine | + | // Zeroing the overflow flag. |
timer0_overflow_flag_clear(); | timer0_overflow_flag_clear(); | ||
- | // Ületäitumise ootamine | + | // Waiting for overflow. |
while (!timer0_overflow_flag_is_set()) | while (!timer0_overflow_flag_is_set()) | ||
{ | { | ||
Line 47: | Line 47: | ||
} | } | ||
- | // Ületäitumise lipukese nullimine | + | // Zeroing the overflow flag. |
timer0_overflow_flag_clear(); | timer0_overflow_flag_clear(); | ||
- | // Taimeri peatamine | + | // Stoping the timer. |
timer0_stop(); | timer0_stop(); | ||
} | } | ||
</ | </ | ||
- | Järgnevalt on toodud samasugune programm nagu tarkvaralise viite näiteski. Lühemal | + | The following is a similar program to the example of the software delay. In the shorter |
<code c> | <code c> | ||
// | // | ||
- | // Kodulabori raudvaralise viite demonstratsioonprogramm. | + | // Demonstration program of hardware delay of the HomeLab. |
- | // Programm vilgutab | + | // The Program blinks LED for a moment after every ~1 second. |
// | // | ||
#include < | #include < | ||
Line 66: | Line 66: | ||
// | // | ||
- | // Test LED viigu määramine | + | // Determining the pin of the Test LED. |
// | // | ||
pin debug_led = PIN(B, 7); | pin debug_led = PIN(B, 7); | ||
// | // | ||
- | // Põhiprogramm | + | // Main program. |
// | // | ||
int main(void) | int main(void) | ||
{ | { | ||
- | // LED-i viigu väljundiks seadmine | + | // Setting the pin of the |
pin_setup_output(debug_led); | pin_setup_output(debug_led); | ||
- | // Lõputu tsükkel | + | // Endless loop. |
while (true) | while (true) | ||
{ | { | ||
- | // LED-i süütamine | + | // Lighting the LED. |
pin_clear(debug_led); | pin_clear(debug_led); | ||
- | // Riistvaraline paus 100 millisekundit | + | // Hardware delay for 100 milliseconds. |
hw_delay_ms(100); | hw_delay_ms(100); | ||
- | // LED-i kustutamine | + | // Switch off of the LED. |
pin_set(debug_led); | pin_set(debug_led); | ||
- | // Riistvaraline paus 900 millisekundit | + | // Hardware delay for 900 milliseconds. |
hw_delay_ms(900); | hw_delay_ms(900); | ||
} | } |