This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
et:examples:timer:delay [2014/10/07 09:42] – raivo.sell | et:examples:timer:delay [2020/07/20 09:00] (current) – external edit 127.0.0.1 | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ~~PB~~ | ||
====== Viide ====== | ====== Viide ====== | ||
- | //Vajalikud teadmised: [HW] [[et: | + | //Vajalikud teadmised: |
+ | [HW] [[et: | ||
+ | [AVR] [[et: | ||
+ | [LIB] [[et: | ||
===== Teooria ===== | ===== Teooria ===== | ||
Line 8: | Line 10: | ||
Tihti on mikrokontrollerite programmis vaja tekitada viiteid, et tegevusi ajastada või nende lõppu oodata. Üks idee poolest lihtsamaid meetodeid mikrokontrolleri töös paus tekitada on selle protsessor mingi muu tegevusega üle koormata - näiteks panna see lugema suuri arve. Protsessori taktsagedusest saab välja arvutada, mitmeni see arve loendama peaks, et kindlat ajalist viidet tekitada. Mingi arvu loendamine nullist protsessori taktsageduse väärtuseni hertsides tekitaks teoreetiliselt viite üks sekund. Praktikas see erinevatel põhjustel päris nii lihtne ei ole. | Tihti on mikrokontrollerite programmis vaja tekitada viiteid, et tegevusi ajastada või nende lõppu oodata. Üks idee poolest lihtsamaid meetodeid mikrokontrolleri töös paus tekitada on selle protsessor mingi muu tegevusega üle koormata - näiteks panna see lugema suuri arve. Protsessori taktsagedusest saab välja arvutada, mitmeni see arve loendama peaks, et kindlat ajalist viidet tekitada. Mingi arvu loendamine nullist protsessori taktsageduse väärtuseni hertsides tekitaks teoreetiliselt viite üks sekund. Praktikas see erinevatel põhjustel päris nii lihtne ei ole. | ||
- | Kui mikrokontrolleri protsessor arvutab arvudega, mille kahendkuju on sama lai kui selle sisemine siin (AVR puhul 8-bitti), siis protsessoritel võtab üks aritmeetiline tehe, näiteks arvu liitmine ühega, aega 1 protsessori töötakt. Selleks, et arvutada tuhandete või miljonitega, | + | Kui mikrokontrolleri protsessor arvutab arvudega, mille kahendkuju on sama lai kui selle sisemine siin (AVR puhul 8-bitti), siis protsessoritel võtab üks aritmeetiline tehe, näiteks arvu liitmine ühega, aega 1 protsessori töötakt. Selleks, et arvutada tuhandete või miljonitega, |
- | + | ||
- | Kuna kõrgtaseme keeles (näiteks C-keeles) programmeerides ei kirjutata programmi otse käsustiku baasil, peab tarkvaralise viite tekitamiseks tundma ka kompilaatorit, | + | |
===== Praktika ====== | ===== Praktika ====== | ||
Line 18: | Line 18: | ||
<code c> | <code c> | ||
unsigned char x; | unsigned char x; | ||
- | |||
// Tsükkel seni kuni x on 100 | // Tsükkel seni kuni x on 100 | ||
for (x = 0; x < 100; x++) | for (x = 0; x < 100; x++) | ||
Line 54: | Line 53: | ||
Selleks, et taimeriga viide tekitada, piisabki vaid loenduri seadistamisest ja olekubiti kõrgeks minemise ootamisest. Erinevalt tarkvaralisest viitest ei sõltu taimerite töö kompilaatorist, | Selleks, et taimeriga viide tekitada, piisabki vaid loenduri seadistamisest ja olekubiti kõrgeks minemise ootamisest. Erinevalt tarkvaralisest viitest ei sõltu taimerite töö kompilaatorist, | ||
- | |||
- | |||
- | ===== Praktika ====== | ||
Järgnev programmikood käib tarkvaralise viite funktsiooni // | Järgnev programmikood käib tarkvaralise viite funktsiooni // | ||
<code c> | <code c> | ||
- | // | ||
// Tarkvaraline viide millisekundites | // Tarkvaraline viide millisekundites | ||
- | // | ||
void sw_delay_ms(unsigned short count) | void sw_delay_ms(unsigned short count) | ||
{ | { | ||
Line 69: | Line 63: | ||
while (count-- > 0) | while (count-- > 0) | ||
{ | { | ||
- | // 1ms viide spetsiaalse funktsiooniga | + | // 1 ms viide spetsiaalse funktsiooniga |
_delay_ms(1); | _delay_ms(1); | ||
} | } | ||
Line 78: | Line 72: | ||
<code c> | <code c> | ||
- | // Kodulabori tarkvaralise viite demonstratsioonprogramm. | + | // Kodulabori tarkvaralise viite näidisprogramm |
- | // Programm vilgutab ~1 sekundi järel hetkeks LED-i. | + | // Programm vilgutab ~1 sekundi järel hetkeks LED-i |
#include < | #include < | ||
#include < | #include < | ||
Line 86: | Line 80: | ||
int main(void) | int main(void) | ||
{ | { | ||
+ | // LED-i viigu väljundiks seadmine | ||
+ | pin_setup_output(led_debug); | ||
// Lõputu tsükkel | // Lõputu tsükkel | ||
- | while (true) | + | while (1) |
{ | { | ||
// LED-i süütamine | // LED-i süütamine | ||
Line 96: | Line 92: | ||
sw_delay_ms(100); | sw_delay_ms(100); | ||
- | // LED kustutamine | + | // LED-i kustutamine |
pin_set(led_debug); | pin_set(led_debug); | ||
Line 108: | Line 104: | ||
- | Järgnev programmikood on taimeril põhinev ehk riistvaraline viitefunktsioon, | + | Järgnev programmikood on taimeril põhinev ehk riistvaraline 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. | 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 | + | // Riistvaraline viide millisekundites |
void hw_delay_ms(unsigned short count) | void hw_delay_ms(unsigned short count) | ||
{ | { | ||
Line 146: | Line 142: | ||
</ | </ | ||
- | Esitatud viite funktsioon kasutab aga taimerite teeki, mille lähtekood | + | Esitatud viite funktsioon kasutab aga taimerite teeki, mille lähtekood |
<code c> | <code c> | ||
Line 180: | Line 176: | ||
} | } | ||
- | // | ||
// Taimer 0 ületäitumise lipukese nullimine | // Taimer 0 ületäitumise lipukese nullimine | ||
- | // | ||
inline void timer0_overflow_flag_clear(void) | inline void timer0_overflow_flag_clear(void) | ||
{ | { | ||
Line 206: | Line 200: | ||
int main(void) | int main(void) | ||
{ | { | ||
+ | // LED-i viigu väljundiks seadmine | ||
+ | pin_setup_output(led_debug); | ||
// Lõputu tsükkel | // Lõputu tsükkel | ||
- | while (true) | + | while (1) |
{ | { | ||
// LED-i süütamine | // LED-i süütamine |