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/02/08 12:48] – mikk.leini | en:examples:timer:hardware_delay [2020/07/20 09:00] (current) – external edit 127.0.0.1 | ||
---|---|---|---|
Line 1: | Line 1: | ||
====== Hardware delay ====== | ====== Hardware delay ====== | ||
- | //Vajalikud teadmised: [HW] [[en: | + | //Necessary knowledge: [HW] [[en: |
- | ===== Teooria | + | ===== Theory |
- | Tarkvaraline viide pole ainus meetod pausi tekitamiseks. Sama asja saab teha ka taimeriga. Taimer on riistvaraline kindla sagedusega suurenev või vähenev loendur. Loenduri taktsignaali saab enamasti tekitada mikrokontrolleri töötaktist või mingist välisest taktist. Taktsignaali sagedust saab üldjuhul ka läbi jagada, et väiksem taktsagedus saavutada | + | 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 with a multiplier to reach a smaller frequency |
- | [{{ : | + | [{{ : |
- | AVR loendurid saab panna loenduri ületäitumisest (inglise keeles //overflow//) või kindla väärtuse saavutamisest (inglise keeles //compare | + | AVR counters can be made to inform about overflow |
+ | |||
+ | 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, which makes them more reliable. At the same time the diversity (or complexity) of the set-up of the AVR counter can be considered fairly troublesome. Depending on the microcontroller’s timing signal, may happen that it will not divide exactly with the desired delay period and the delay will not be accurate. | ||
- | Selleks, et taimeriga viide tekitada, piisabki vaid loenduri seadistamisest ja olekubiti kõrgeks minemise ootamisest. Erinevalt tarkvaralisest viitest ei sõltu taimerite töö kompilaatorist, mis teeb nende kasutamise töökindlamaks. Samas võib AVR loendurite mitmekesisuse (või ka segasuse) tõttu | + | ===== 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 // | ||
- | ===== Praktika ===== | + | 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. |
- | Allpool olev programmikood on aga taimeril põhinev viitefunktsioon, | ||
- | |||
- | 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); | ||
} | } |