This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| et:avr:registers [2010/02/09 16:58] – raivo.sell | et:avr:registers [2020/07/20 09:00] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====== Registrid ====== | ====== Registrid ====== | ||
| - | Üks kõige raskemini mõistetavaid asju mikrokontrollerite juures on algajate jaoks tavaliselt " | + | Üks kõige raskemini mõistetavaid asju mikrokontrollerite juures on algajate jaoks tavaliselt " |
| ===== Olemus ===== | ===== Olemus ===== | ||
| Line 16: | Line 16: | ||
| * Paus | * Paus | ||
| - | Iga nupp teeb midagi, kuid ainult õigel kasutamisel. Näiteks stopp-nupp ei tee midagi enne, kui kassett on mängima pandud - alles siis teeb see midagi arusaadavat ja peatab mängimise. Edasi- või tagasikerimise nuppe võib aga igal ajal vajutada, sest linti hakatakse kerima nii poole mängimise, kui seismise ajal. Salvestama hakkab kassetimängija aga ainult siis, kui salvestamise nupp koos mängimise nupuga alla vajutada. Mõni on ehk proovinud mitu nuppu või kõik nupud korraga alla vajutada - sel juhul võis mängija mida iganes teha või üldse katki minna. | + | Iga nupp teeb midagi, kuid ainult õigel kasutamisel. Näiteks stopp-nupp ei tee midagi enne, kui kassett on mängima pandud - alles siis teeb see midagi arusaadavat ja peatab mängimise. Edasi- või tagasikerimise nuppe võib aga igal ajal vajutada, sest linti hakatakse kerima nii poole mängimise kui seismise ajal. Salvestama hakkab kassetimängija aga ainult siis, kui salvestamise nupp koos mängimise nupuga alla vajutada. Mõni on ehk proovinud mitu nuppu või kõik nupud korraga alla vajutada - sel juhul võis mängija mida iganes teha või üldse katki minna. |
| Mikrokontrolleri registriga on sama lugu nagu kassetimängija nuppudega - iga nupuke paneb seal õigel kasutamisel midagi käima. Valesid nuppe vajutades mikrokontroller (enamasti) küll katki ei lähe, kuid ei tööta ka. Tegelikult registris selliseid nuppe nagu kodumasinatel muidugi pole, on hoopis hulk transistore, | Mikrokontrolleri registriga on sama lugu nagu kassetimängija nuppudega - iga nupuke paneb seal õigel kasutamisel midagi käima. Valesid nuppe vajutades mikrokontroller (enamasti) küll katki ei lähe, kuid ei tööta ka. Tegelikult registris selliseid nuppe nagu kodumasinatel muidugi pole, on hoopis hulk transistore, | ||
| Line 41: | Line 41: | ||
| Heksadetsimaalarvus pole numbrid mitte 0 ja 1, nagu binaarsüsteemis, | Heksadetsimaalarvus pole numbrid mitte 0 ja 1, nagu binaarsüsteemis, | ||
| - | ~~CL~~ | + | Üksikute bittide muutmiseks arvus (registris, muutujas või kus iganes) tuleb kasutada binaartehteid. Binaartehe on tehe binaararvude vahel, kus nende arvude iga biti vahel toimub omaette loogikatehe. Enamasti on mikrokontrollerites kasutusel neli binaartehet, |
| - | [{{ : | + | [{{ : |
| - | [{{ : | + | |
| - | [{{ : | + | |
| - | [{{ : | + | |
| - | Üksikute bittide muutmiseks arvus (registris, muutujas või kus iganes) tuleb kasutada binaartehteid. Binaartehe on tehe binaararvude vahel, kus nende arvude iga biti vahel toimub omaette loogikatehe. Enamasti on mikrokontrollerites kasutusel neli binaartehet, | ||
| * **Eitus / Inversioon** \\ Eitus muudab biti väärtuse vastupidiseks ehk 0 muutub 1 ja 1 muutub 0. C-keeles on eituse märk " | * **Eitus / Inversioon** \\ Eitus muudab biti väärtuse vastupidiseks ehk 0 muutub 1 ja 1 muutub 0. C-keeles on eituse märk " | ||
| Line 63: | Line 59: | ||
| [{{ : | [{{ : | ||
| - | Selleks, et üks või enam bitte registris kõrgeks ehk üheks seada, tuleb kasutada loogilist liitmise tehet. Liitmistehte üks operand peab olema register, teine binaararv, kus kõrge on ainult see bitt, mida ka registris soovitakse kõrgeks seada. Seda teist binaararvu nimetatakse ka bitimaskiks. Kõrvalnäites toodud tehe näeb C-keeles välja niimoodi: | + | Selleks et üks või enam bitte registris kõrgeks ehk üheks seada, tuleb kasutada loogilist liitmise tehet. Liitmistehte üks operand peab olema register, teine binaararv, kus kõrge on ainult see bitt, mida ka registris soovitakse kõrgeks seada. Seda teist binaararvu nimetatakse ka bitimaskiks. Kõrvalnäites toodud tehe näeb C-keeles välja niimoodi: |
| ~~CL~~ | ~~CL~~ | ||
| Line 122: | Line 118: | ||
| [{{ : | [{{ : | ||
| - | Ühe või enam biti väärtuse lugemiseks registrist tuleb kasutada sama tehet, mis biti nullimisel - loogilist korrutamist. Tehte üks operand peab olema register, teine bitimask, kus kõrgeks on seatud vaid see bitt, mille väärtust registrist lugeda soovitakse. Kõrvalnäites toodud tehe näeb C-keeles välja järgmiselt: | + | Ühe või enama biti väärtuse lugemiseks registrist tuleb kasutada sama tehet, mis biti nullimisel - loogilist korrutamist. Tehte üks operand peab olema register, teine bitimask, kus kõrgeks on seatud vaid see bitt, mille väärtust registrist lugeda soovitakse. Kõrvalnäites toodud tehe näeb C-keeles välja järgmiselt: |
| ~~CL~~ | ~~CL~~ | ||
| Line 131: | Line 127: | ||
| // Siinkohal x = 0x01 | // Siinkohal x = 0x01 | ||
| </ | </ | ||
| - | |||
| - | ~~PB~~ | ||
| ==== Biti nihutamine ==== | ==== Biti nihutamine ==== | ||
| - | Tegelikult on paljudes programmeerimiskeeltes peale binaartehete veel mõned bitioperatsioonid, | + | Tegelikult on paljudes programmeerimiskeeltes peale binaartehete veel mõned bitioperatsioonid, |
| [{{ : | [{{ : | ||
| - | Kõrvaloleval pildil on toodud näide bitinihutuse operatsioonist vasakule. Bitinihutus pole loogikaoperatsioon ja sel puudub vastav tähis, C-keeles on see aga "<<" | + | Kõrvaloleval pildil on toodud näide bitinihutuse operatsioonist vasakule. Bitinihutus pole loogikaoperatsioon ja sel puudub vastav tähis, C-keeles on see aga "<<" |
| ~~CL~~ | ~~CL~~ | ||
| Line 167: | Line 161: | ||
| ===== AVR registrid ===== | ===== AVR registrid ===== | ||
| - | Selleks et midagi reaalselt mikrokontrolleri registritega teha saaks, tuleb osata selle mikrokontrolleriga läbi saada. Kõigi mikrokontrolleritega käib kaasas üks või mitu andmelehte, kus on dokumenteeritud kogu mikrokontrolleri struktuur ja funktsionaalsus. Andmelehes on kirjeldatud ka registrid. Järgnevalt uurime, kuidas saada aru AVR-i andmelehe registrite kirjeldusest. | + | Selleks, et midagi reaalselt mikrokontrolleri registritega teha saaks, tuleb osata selle mikrokontrolleriga läbi saada. Kõigi mikrokontrolleritega käib kaasas üks või mitu andmelehte, kus on dokumenteeritud kogu mikrokontrolleri struktuur ja funktsionaalsus. Andmelehes on kirjeldatud ka registrid. Järgnevalt uurime, kuidas saada aru AVR-i andmelehe registrite kirjeldusest. |
| [{{ : | [{{ : | ||
| Line 175: | Line 169: | ||
| Registri sisu tähistab paksu piirjoonega 8 lahtriga kast. Iga lahter tähistab üht bitti. Kasti kohal on toodud biti järgud - suurenevad paremalt vasakule. Kuna AVR on 8-bitine mikrokontroller, | Registri sisu tähistab paksu piirjoonega 8 lahtriga kast. Iga lahter tähistab üht bitti. Kasti kohal on toodud biti järgud - suurenevad paremalt vasakule. Kuna AVR on 8-bitine mikrokontroller, | ||
| - | Registri bittide all on toodud kaks rida, kus on kirjas, kas bitt on loetav (R), kirjutatav (W) või mõlemat (R/W). Näiteks olekubitte ei saa üle kirjutada ja isegi kui seda programmis üritada ei omanda | + | Registri bittide all on toodud kaks rida, kus on kirjas, kas bitt on loetav (R), kirjutatav (W) või mõlemat (R/W). Näiteks olekubitte ei saa üle kirjutada ja isegi siis, kui seda programmis üritada, ei omanda |
| - | Kui AVR-i registrite nimed viitavad tegelikult mälupesade aadressidele, | + | Kui AVR-i registrite nimed viitavad tegelikult mälupesade aadressidele, |
| <code c> | <code c> | ||
| Line 188: | Line 182: | ||
| // UDRE0 biti(maski) väärtuse lugemine | // UDRE0 biti(maski) väärtuse lugemine | ||
| unsigned char u = (UCSR0A & (1 << UDRE0)); | unsigned char u = (UCSR0A & (1 << UDRE0)); | ||
| - | |||
| // Siinkohal on u väärtus kas 0 või 32, | // Siinkohal on u väärtus kas 0 või 32, | ||
| - | | + | </code> |
| - | if (u) | + | |
| - | { | + | |
| - | // MPCM0 biti inverteerimine | + | |
| - | | + | |
| - | } | + | |
| - | // Mõnikord on aga vaja saada konkreetne 0 või 1 väärtus, | + | Atmeli xmega seeria kontrolleritel, mis on kasutusel Kodulabori III seeria plaatidel |
| - | // selleks | + | |
| - | u >>= UDRE0; | + | |
| - | // Siinkohal on u väärtus kas 0 või 1 | + | < |
| - | </code> | + | // TXEN biti kõrgeks seadmine |
| + | USARTD0.CTRLB |= (USART_TXEN_bm); | ||
| + | // CLK2X biti madalaks seadmine | ||
| + | USARTD0.CTRLB &= ~(USART_CLK2X_bm); | ||
| + | |||
| + | // DREIF biti(maski) väärtuse lugemine | ||
| + | unsigned char u = (USARTD0.STATUS & (USART_DREIF_bm)); | ||
| + | // Siinkohal on u väärtus kas 0 või 32, | ||
| + | u >>= USART_DREIF_bp; | ||
| + | // Siinkohal on u väärtus kas 0 või 1, | ||
| + | </ | ||