This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
et:avr:timers [2013/03/26 21:15] – external edit 127.0.0.1 | et:avr:timers [2020/07/20 09:00] (current) – external edit 127.0.0.1 | ||
---|---|---|---|
Line 2: | Line 2: | ||
Loendurid (inglise keeles // | Loendurid (inglise keeles // | ||
+ | | ||
+ | Atmeli xmega kontrollerite puhul tuleb jälgida, mis siini taimerit kasutatakse. AVR xmega taimerite registritesse kirjutamine toimib sarnaselt eelnevates peatükkides toodud näidetega. Režiimid on sarnased ning täpsem kirjeldus on toodud andmelehes. | ||
===== Loenduri normaalrežiim ===== | ===== Loenduri normaalrežiim ===== | ||
- | Normaalrežiimis ei täida loendur muud funktsiooni kui pidevat | + | Normaalrežiimis ei täida loendur muud funktsiooni, kui pidevat |
<box 100% round # | <box 100% round # | ||
Line 14: | Line 16: | ||
#include < | #include < | ||
- | ISR(TIMER0_OVF_vect) | + | ISR(TIMER0_OVF_vect) { |
- | { | + | |
// Loendurile sellise väärtuse omistamine, | // Loendurile sellise väärtuse omistamine, | ||
- | // et järgmine ületäitumine tekiks 10 ms pärast. | + | // et järgmine ületäitumine tekiks 10 ms pärast |
// Valem: 256 - 8 MHz / 1024 / 100 Hz = 177,785 = ~178 | // Valem: 256 - 8 MHz / 1024 / 100 Hz = 177,785 = ~178 | ||
TCNT0 = 178; | TCNT0 = 178; | ||
} | } | ||
- | int main() | + | int main(void) { |
- | { | + | |
// Et esimene ületäitumise katkestus tekiks 10 ms pärast, | // Et esimene ületäitumise katkestus tekiks 10 ms pärast, | ||
- | // tuleb ka siinkohal loendur algväärtustada. | + | // tuleb ka siinkohal loendur algväärtustada |
TCNT0 = 178; | TCNT0 = 178; | ||
- | |||
// Sagedusjaguri teguriks 1024 | // Sagedusjaguri teguriks 1024 | ||
TCCR0 = 0x07; | TCCR0 = 0x07; | ||
- | |||
// Loenduri täitumise katkestuse lubamine | // Loenduri täitumise katkestuse lubamine | ||
TIMSK |= (1 << TOIE0); | TIMSK |= (1 << TOIE0); | ||
Line 43: | Line 41: | ||
Näites toodud loendurile omistatava väärtusega siiski täpselt 10 ms järel katkestust ei tekitata, sest vaja oleks loendurile omistada komakohaga väärtus, kuid see pole võimalik. Et täpset katkestuse intervalli saada, tuleb nii sagedusjaguri tegur kui ka loendurile täitumisel omistatav väärtus valida nii, et taktsagedus jaguks täpselt. Paraku pole see alati võimalik, ja eriti just 8-bitise loenduri puhul, sest selle väärtuste skaala on üsna väike. Täpsema ja suurema intervalli tekitamiseks saab kasutada 16-bitist loendurit. | Näites toodud loendurile omistatava väärtusega siiski täpselt 10 ms järel katkestust ei tekitata, sest vaja oleks loendurile omistada komakohaga väärtus, kuid see pole võimalik. Et täpset katkestuse intervalli saada, tuleb nii sagedusjaguri tegur kui ka loendurile täitumisel omistatav väärtus valida nii, et taktsagedus jaguks täpselt. Paraku pole see alati võimalik, ja eriti just 8-bitise loenduri puhul, sest selle väärtuste skaala on üsna väike. Täpsema ja suurema intervalli tekitamiseks saab kasutada 16-bitist loendurit. | ||
- | |||
</ | </ | ||
Line 55: | Line 52: | ||
<box 100% round # | <box 100% round # | ||
- | |||
Vaja on 8 MHz taktsagedusel töötava ATmega128-ga mõõta välise 122 Hz - 100 kHz loogilise nelinurksignaali sagedust 1 Hz täpsusega. Programm on tehtud 16-bitise loendur 1 sündmuste püüdjaga. | Vaja on 8 MHz taktsagedusel töötava ATmega128-ga mõõta välise 122 Hz - 100 kHz loogilise nelinurksignaali sagedust 1 Hz täpsusega. Programm on tehtud 16-bitise loendur 1 sündmuste püüdjaga. | ||
Line 64: | Line 60: | ||
// Sündmuse toimumise katkestus | // Sündmuse toimumise katkestus | ||
- | ISR(TIMER1_CAPT_vect) | + | ISR(TIMER1_CAPT_vect) { |
- | { | + | |
// Loenduri nullimine | // Loenduri nullimine | ||
TCNT1 = 0; | TCNT1 = 0; | ||
Line 87: | Line 82: | ||
} | } | ||
- | int main() | + | int main(void) { |
- | { | + | |
// Tõusva frondi registreerimine, | // Tõusva frondi registreerimine, | ||
TCCR1B = (1 << ICES1) | (1 << CS10); | TCCR1B = (1 << ICES1) | (1 << CS10); | ||
Line 104: | Line 98: | ||
Programmis tekib välise signaali tõusva frondi ajal sündmuse katkestus. Katkestuse jooksul kontrollitakse, | Programmis tekib välise signaali tõusva frondi ajal sündmuse katkestus. Katkestuse jooksul kontrollitakse, | ||
- | |||
</ | </ | ||
Line 115: | Line 108: | ||
Mõnedel signaali genereerimise režiimidel on määratav ka loenduri suurim väärtus - loenduri füüsiline suurus jääb küll samaks, kuid mängus on võrdlusregister, | Mõnedel signaali genereerimise režiimidel on määratav ka loenduri suurim väärtus - loenduri füüsiline suurus jääb küll samaks, kuid mängus on võrdlusregister, | ||
- | Loendurid ja nende abil genereeritavate signaalide režiimid on ühed keerulisemad perifeeriamoodulid AVR-il. Kõigist neist kirjutamine läheks pikaks ja enamasti pole nende kasutamisel kõike detailselt teada. Seetõttu on järgnevalt kirjeldatud vaid üht levinuimat PWM signaali robootikas. Ülejäänut saab juba AVR dokumentatsioonist järgi uurida. | + | Loendurid ja nende abil genereeritavate signaalide režiimid on ühed keerulisemad perifeeriamoodulid AVR-il. Kõigist neist kirjutamine läheks pikaks ja enamasti pole nende kasutamisel |
==== Pulsilaius-modulatsioon ==== | ==== Pulsilaius-modulatsioon ==== | ||
Line 128: | Line 121: | ||
#include < | #include < | ||
- | int main() | + | int main(void) { |
- | { | + | |
// Viigud väljundiks | // Viigud väljundiks | ||
DDRB |= (1 << PIN5) | (1 << PIN6); | DDRB |= (1 << PIN5) | (1 << PIN6); |