This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
et:examples:timer:software_delay [2009/12/21 11:07] – mikk.leini | et:examples:timer:software_delay [2020/07/20 09:00] (current) – external edit 127.0.0.1 | ||
---|---|---|---|
Line 1: | Line 1: | ||
+ | < | ||
====== Tarkvaraline viide ====== | ====== Tarkvaraline viide ====== | ||
- | //Vajalikud teadmised: [HW] [[et: | + | //Vajalikud teadmised: [HW] [[et: |
===== Teooria ===== | ===== Teooria ===== | ||
- | Tihti on mikrokontrollerite programmis vaja tekitada viiteid, et tegevusi ajastada või nende lõppu oodata. Üks idee poolest lihtsamaid meetodeid mikrokontrolleri | + | Tihti on mikrokontrollerite programmis vaja tekitada viiteid, et tegevusi ajastada või nende lõppu oodata. Üks idee poolest lihtsamaid meetodeid mikrokontrolleri |
- | 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 peab arv olema 16- või 32-bitine ja nende arvutamiseks kulub 8-bitistel protsessoritel rohkem kui 1 töötakt. Niisiis, suurte arvude puhul peab tundma protsessori sisemust - täpsemalt selle käsustikku. | + | 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, peab arv olema 16- või 32-bitine ja nende arvutamiseks kulub 8-bitistel protsessoritel rohkem kui 1 töötakt. Niisiis, suurte arvude puhul peab tundma protsessori sisemust - täpsemalt selle käsustikku. |
- | Kuna kõrgtaseme keeles (näiteks C keeles) programmeerides ei kirjutata | + | Kuna kõrgtaseme keeles (näiteks C-keeles) programmeerides ei kirjutata |
- | ===== Teooria praktikas | + | ===== Praktika |
- | Järgnevalt on toodud näide tarkvaralise viite tekitamisest AVR mikrokontrolleriga. Kirjutatud on C keele programmilõik mis loendab //for// tsüklis muutujat //x// nullist sajani. Iga tsükli sees toimub ühe mitte-midagi tegeva tühi-instruktsiooni | + | Järgnevalt on toodud näide tarkvaralise viite tekitamisest AVR mikrokontrolleriga. Kirjutatud on C-keele programmilõik, mis loendab //for//-tsüklis muutujat //x// nullist sajani. Iga tsükli sees toimub ühe mittemidagitegeva tühiinstruktsiooni |
<code c> | <code c> | ||
Line 21: | Line 22: | ||
for (x = 0; x < 100; x++) | for (x = 0; x < 100; x++) | ||
{ | { | ||
- | // Tühi-instruktsiooniga | + | // Tühiinstruktsiooniga |
asm volatile (" | asm volatile (" | ||
} | } | ||
</ | </ | ||
- | Siinkohal on aga toodud sama C-keele programmilõik pärast kompileerimist. Vasakpoolsed 2 heksadetsimaalarvu on masinkood ja paremal on assembler-keeles | + | Siinkohal on aga toodud sama C-keele programmilõik pärast kompileerimist. Vasakpoolsed 2 heksadetsimaalarvu on masinkood ja paremal on assemblerkeeles |
<code asm> | <code asm> | ||
Line 36: | Line 37: | ||
</ | </ | ||
- | Kompileeritud kujul on näha mis tegelikult C-keele tsüklist saab ja selle järgi saab arvutada mitu instruktsiooni | + | Kompileeritud kujul on näha, mis tegelikult C-keele tsüklist saab, ja selle järgi saab arvutada, mitu takti ühe tsükli perioodi |
- | 100 * 4 / 14745600 = 27.13 μs | + | (1 + 100 ⋅ 4 + 1) / 14745600 = 27,26 μs |
- | Näites tekitatud viide on mikrosekundites ja muutujat mida kasutatakse | + | Näites tekitatud viide on mikrosekundites ja kasutatav muutuja |
- | Käesoleva harjutuse eesmärk ei ole siiski masinkoodi tasandil täpset tarkvaralist viidet tekitada, sest see on üsna peen töö ja pealegi on viite tekitamiseks avr-libc ja kodulabori | + | Käesoleva harjutuse eesmärk ei ole siiski masinkoodi tasandil täpset tarkvaralist viidet tekitada, sest see on üsna peen töö ja pealegi on viite tekitamiseks avr-libc ja Kodulabori |
- | Tarkvaralise viite puhul on aga oluline teada, et hoolimata oma põhimõttelisest lihtsusest on see äärmiselt ebaefektiivne meetod energiatarbe seisukohast. Kõigil neil taktidel mil mikrokontroller tegeleb kasutu loendamisega kulub energiat. Patareidega rakenduses ei ole seega soovitatav | + | Tarkvaralise viite puhul on aga oluline teada, et hoolimata oma põhimõttelisest lihtsusest on see äärmiselt ebaefektiivne meetod energiatarbe seisukohast. Kõigil neil taktidel, mil mikrokontroller tegeleb kasutu loendamisega, kulub energiat. Patareidega rakenduses ei ole seega soovitatav |
===== Praktika ====== | ===== Praktika ====== | ||
- | Järgnev programmikood käib tarkvaralise viite funktsiooni // | + | Järgnev programmikood käib tarkvaralise viite funktsiooni // |
<code c> | <code c> | ||
Line 65: | Line 66: | ||
</ | </ | ||
- | Toodud funktsiooni kasutamiseks on järgnev programm mis tekitab lõputus tsüklis kaks viidet: 100 ms ja 900 ms. Lühema viite jooksul LED põleb ja pikema ajal on kustunud - tulemusena LED perioodiliselt vilgatab. | + | Toodud funktsiooni kasutamiseks on järgnev programm, mis tekitab lõputus tsüklis kaks viidet: 100 ms ja 900 ms. Lühema viite jooksul LED põleb ja pikema ajal on kustunud - tulemusena LED perioodiliselt vilgatab. |
<code c> | <code c> | ||
// | // | ||
- | // Kodulabori tarkvaralise viite demonstratsioon-programm. | + | // Kodulabori tarkvaralise viite demonstratsioonprogramm. |
// Programm vilgutab ~1 sekundi järel hetkeks LED-i. | // Programm vilgutab ~1 sekundi järel hetkeks LED-i. | ||
// | // | ||
Line 91: | Line 92: | ||
while (true) | while (true) | ||
{ | { | ||
- | // LED-i põlema panek | + | // LED-i süütamine |
pin_clear(debug_led); | pin_clear(debug_led); | ||
Line 97: | Line 98: | ||
sw_delay_ms(100); | sw_delay_ms(100); | ||
- | // LED-i kustutamine | + | // LED kustutamine |
pin_set(debug_led); | pin_set(debug_led); | ||
Line 106: | Line 107: | ||
</ | </ | ||
- | Kuigi näib, et LED vilgatab tõesti | + | Kuigi näib, et LED vilgatab tõesti 1 sekundi järel, on aeg tegelikult siiski natuke pikem, sest LED-i ja viite funktsioonide |