This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| et:avr:timers [2014/10/14 09:11] – raivo.sell | et:avr:timers [2020/07/20 09:00] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 16: | 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 | ||
| Line 24: | Line 23: | ||
| } | } | ||
| - | 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 45: | 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 57: | 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 66: | 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 89: | 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 106: | 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 117: | 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 130: | 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); | ||