| Next revision | Previous revision |
| ru:avr:registers [2013/08/13 14:57] – создано eduardtlmk | ru:avr:registers [2020/07/20 09:00] (current) – external edit 127.0.0.1 |
|---|
| [{{ :images:logic:logic_all_4.png?550 |Отрицание, логическое умножение, логическое сложение и неравнозначность}}] | [{{ :images:logic:logic_all_4.png?550 |Отрицание, логическое умножение, логическое сложение и неравнозначность}}] |
| |
| ~~PB~~ | <pagebreak> |
| |
| * **Отрицание / Инверсия** \\ Отрицание изменяет значение бита на противоположное, т.е. 0 меняется на 1 и 1 меняется на 0. На языке Си знак отрицания “~“. | * **Отрицание / Инверсия** \\ Отрицание изменяет значение бита на противоположное, т.е. 0 меняется на 1 и 1 меняется на 0. На языке Си знак отрицания “~“. |
| </code> | </code> |
| |
| ~~PB~~ | <pagebreak> |
| |
| ==== Операция инвертирования бита ==== | ==== Операция инвертирования бита ==== |
| |
| <code c> | <code c> |
| // Oletame, et REG = 0x0F | // Предположим, что REG = 0x0F |
| REG = REG ^ 0x11; // Üks meetod | REG = REG ^ 0x11; // Первый метод |
| REG ^= 0x11; // Teine meetod (rakendada tohib korraga ainult üht) | REG ^= 0x11; // Второй метод (применить разом можно только один) |
| // Siinkohal REG = 0x1E | // Здесь REG = 0x1E |
| </code> | </code> |
| |
| ==== Kogu registri inverteerimine ==== | ==== Инвертирование всего регистра ==== |
| |
| [{{ :images:logic:op_reg_invert.png?229|Bittide inverteerimise tehe}}] | [{{ :images:logic:op_reg_invert.png?229|Операция инвертирования битов}}] |
| |
| Kogu registri bittide inverteerimiseks tuleb kasutada eitustehet. See on unaarne tehe ehk tal on ainult üks operand. Kõrvalnäites toodud tehe näeb C-keeles välja niimoodi: | Для инвертирования битов всего регистра, необходимо использовать операцию отрицания. У данной операции только один операнд. Операция, изображенная рядом, на языке Си выглядит следующим образом: |
| |
| ~~CL~~ | ~~CL~~ |
| |
| <code c> | <code c> |
| // Oletame, et REG = 0x0F | // Предположим, что REG = 0x0F |
| REG = ~REG; | REG = ~REG; |
| // Siinkohal REG = 0xF0 | // Здесь REG = 0xF0 |
| </code> | </code> |
| |
| ==== Üksiku biti väärtuse lugemine ==== | ==== Чтение значения отдельного бита ==== |
| |
| [{{ :images:logic:op_bit_get.png?229|Biti lugemise tehe}}] | [{{ :images:logic:op_bit_get.png?229|Операция чтения бита}}] |
| |
| Ü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: | Для чтения одного или нескольких значений бита из регистра, необходимо использовать ту же операцию, что и при обнулении – логическое умножение. Один из операндов операции должен быть регистром, другой битовой маской, где высоким настроен только тот бит, значение которого желают считать из регистра. Операция, изображённая рядом, выглядит на языке Си следующим образом: |
| |
| ~~CL~~ | ~~CL~~ |
| |
| <code c> | <code c> |
| // Oletame, et REG = 0x0F | // Предположим, что REG = 0x0F |
| unsigned char x = REG & 0x01; | unsigned char x = REG & 0x01; |
| // Siinkohal x = 0x01 | // Здесь x = 0x01 |
| </code> | </code> |
| |
| ~~PB~~ | <pagebreak> |
| |
| ==== Biti nihutamine ==== | ==== Смещение бита ==== |
| |
| Tegelikult on paljudes programmeerimiskeeltes peale binaartehete veel mõned bitioperatsioonid, mis teevad programeerija elu lihtsamaks. Need on bitinihutuse operatsioonid, mis binaararvus nihutavad bitte kas vasakule või paremale poole. Nihutusoperatsioonide põhiline väärtus seisneb registritega tegeldes nende võimes bitijärkusid bitimaskiks teisendada ja vastupidi. | На самом деле, во многих языках программирования помимо бинарных операций, существуют и некоторые битовые операции, которые облегчают работу программистов. Такими являются операции смещения бита, которые в бинарном числе смещают биты налево или направо. Основная ценность операций по смещению состоит в том, что они способны превращать разряды битов в битовую маску и наоборот. |
| |
| [{{ :images:logic:op_bit_shift_left.png?241|Bitinihe vasakule}}] | [{{ :images:logic:op_bit_shift_left.png?241|Сдвижение бита влево}}] |
| |
| Kõrvaloleval pildil on toodud näide bitinihutuse operatsioonist vasakule. Bitinihutus pole loogikaoperatsioon ja sel puudub vastav tähis, C-keeles on see aga "<<". Nihet vasakule kasutatakse bitijärgu bitimaskiks teisendamiseks. Näiteks, kui soovitakse kuuenda biti (NB! järk on 5) maski, siis tuleb arvu 1 nihutada vasakule 5 korda. Näites toodud operatsioon näeb C-keeles välja järgmiselt: | На указанном рядом изображении, приведён пример операции по сдвигу бита влево. Сдвижение не является логической операцией и у него отсутствует соответствующее обозначение, а на языке Си это “«“. Сдвиг влево используется для превращения битового разряда в битовую маску. Например, если желают маску 6 бита (NB! разряд 5), то требуется число 1 сдвинуть влево 5 раз. Операция, приведённая в примере, выглядеть на языке Си следующим образом: |
| |
| ~~CL~~ | ~~CL~~ |
| <code c> | <code c> |
| REG = 0x01 << 5; | REG = 0x01 << 5; |
| // Siinkohal REG = 0x20 | // Где REG = 0x20 |
| </code> | </code> |
| |
| [{{ :images:logic:op_bit_shift_right.png?241|Bitinihe paremale}}] | [{{ :images:logic:op_bit_shift_right.png?241|Сдвижение бита вправо}}] |
| |
| Sarnaselt bitinihkega vasakule toimib ka bitinihke operatsioon paremale. Selle operatsiooni tähis C-keeles on ">>". Nihet paremale kasutatakse bitimaskist biti loogilise väärtuse leidmiseks. Eespool oli toodud näiteks üksiku biti väärtuse lugemise tehe. Oletame, et bitt, mida lugeda, pole aga madalaima järguga, vaid näiteks järguga 5. Sel juhul oleks lugemisel vastus kas 0x20 või 0x00, kuid vahel läheb vaja vastust 1 või 0 ja siis tulebki appi nihe paremale. Kõrvalnäites toodud operatsioon näeb C-keeles välja nii: | Подобно сдвигу влево, работает и операция сдвижения налево. Обозначение данной операции на языке Си - “»“. Сдвиг вправо используется для нахождения логического значения бита из битовой маски. Впереди был приведён пример операции считывания значения одиночного бита. Предположим, что бит, которые нужно считать не с наименьшим разрядом, а например, с разрядом 5. В этом случае, ответ считывания был бы 0х20 или 0х00, но иногда требуется ответ 1 или 0 и тогда приходит на помощь сдвиг вправо. Операция, приведённая в примере, выглядеть на языке Си следующим образом: |
| |
| ~~CL~~ | ~~CL~~ |
| |
| <code c> | <code c> |
| // Oletame, et REG väärtus on 0x20 | // Предположим, что значение REG 0x20 |
| unsigned char x = REG >> 5; | unsigned char x = REG >> 5; |
| // Siinkohal on x väärtus 0x01 (ehk lihtsalt 1) | // Здесь значение x - 0x01 (т.е. просто 1) |
| </code> | </code> |
| |
| Kui bitinihke operatsioonidega nihkub bitt madalaimast järgust paremale või kõrgeimast järgust vasakule, siis see bitt kaob. Mõnedes programmeerimiskeeltes on olemas ka roteeruvad bitinihke operatsioonid, kus "servast" välja minev bitt tuleb teiselt poolt tagasi. C-keeles roteeruvad bitinihke operatsioonid puuduvad, kuid vajadusel saab need ise kirjutada. | Если в операции сдвижения бита, бит сдвигается из низкого разряда вправо или из высокого влево, то он исчезает. В некоторых языках программирования существуют вращающиеся операции сдвижения битов, где бит не исчезает, а двигается из одного конца в другой. На языке Си вращающиеся операции сдвижения бита отсутствуют, но при желании их можно написать самим. |
| |
| Kõik toodud bitioperatsioonide näited toimivad peale registrite ka muutujatega ja konstantidega. Viimased saavad muidugi ainult operandideks, mitte vastusteks olla. | Все переведённые примеры операций работают помимо регистров и с переменными и константами. Последние могут быть только операндами, а не ответами. |
| |
| ===== AVR registrid ===== | ===== Регистры AVR ===== |
| |
| 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. | Для того, чтобы сделать что-либо реальное с регистрами микроконтроллера, требуется знать как пользоваться конкретным микроконтроллером. К каждому микроконтроллеру прилагается одна или несколько спецификаций, которая описывает структуру и функциональность микроконтроллера. В спецификации описаны и регистры. Далее изучим, как разобраться в описании регистров в спецификации AVR. |
| |
| [{{ :images:logic:avr_example_register.png?580 |Üks AVR register selle andmelehest}}] | [{{ :images:logic:avr_example_register.png?580 |Один регистр AVRиз его спецификации}}] |
| |
| Pildil on toodud ATmega128 mikrokontrolleri register UCSRnA, mille pikem nimetus on "//USART Control and Status Register A//". See on register, millega sätitakse AVR-i USART moodulit ja kust saab lugeda selle mooduli olekuid. Kõik AVR-i registrite nimed kirjutatakse suurte tähtedega, kuid tähelepanelik lugeja ilmselt märkab, et selles registris on väike n-täht. Väikese n-tähega tähistatakse nimelt mõne mooduli indeksit. Kuna ATmega128-s on 2 üsna sarnast USART moodulit, siis ei kirjeldata nende registreid topelt, vaid ühe korra ja n-tähe asemele peab lugeja arvestama kas "0" või "1". Seega ATmega128-s on registrid UCSR0A ja UCSR1A. | На изображении приведён регистр UCSRnA микроконтроллера ATmega128, полное название которого “USART Control and Status Register A“. Это регистр, с помощью которого конфигурируется модуль USART AVR-а и с которого можно считать состояния этого модуля. Все названия регистров AVR пишутся заглавными буквами, но внимательный читатель заметит, что в этом регистре есть маленькая буква n. Маленькой буквой n обозначается индекс какого-нибудь модуля. Так как в ATmega128 есть 2 очень похожих USART модуля, то в регистре они не записываются вдвойне, а только один раз и вместо буквы n должен читатель вставлять „0“ или „1“. Из чего следует, что в ATmega128 есть регистры UCSR0A и UCSR1A. |
| |
| 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, on ka enamik registreid 8-bitised. Mõningad erandid on 16-bitised registrid, mis koosnevad tegelikult kahest 8-bitisest registrist. Lisaks registritele on nimi ka igal registri bitil - täpselt nagu kassetimängija nuppudelgi. Iga biti kohta on andmelehes olemas selle selgitus. Biti nimed on samuti lühendid ja n-täht neis tuleb samuti asendada mooduli indeksiga. Mõnes registris pole kõiki 8 bitti kasutatud ja sel juhul tähistatakse biti lahter sidekriipsuga. | Содержимое регистра отмечено в ящике с 8 ячейками, выделенным толстой линией. Каждая ячейка обозначает один бит. Над ящиком приведена очерёдность битов, они возрастают справа налево. Так как AVR – это 8-битный микроконтроллер, большинство регистров так же 8-битные. Есть некоторые исключения в виде 16-битных регистров, которые состоят из двух 8-битных регистров. Вдобавок к регистрам название имеет каждый бит регистра, так же как и кнопки магнитофона. В спецификации имеется объяснение к каждому биту. Названия битов – это так же сокращения и букву n в них следует заменить индексом модуля. В некоторых регистрах использованы не все биты, и в этом случае ячейка бита обозначается знаком тире. |
| |
| 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 bit lihtsalt talle omistatavat väärtust. Biti puhul, mida saab ainult kirjutada, on öeldud üks kindel väärtus, mis selle lugemisel alati tuleb. Bittide all teises reas on toodud vaikeväärtus, mis on bitil pärast mikrokontrolleri käivitamist (inglise keeles //reset//). | Под битами регистра приведены две строки, где написано, является ли бит читаемым (R), записываемым (W) или и тем и другим (R/W). Например, бит состояния нельзя переписать, и даже в случае, если это пытаются сделать в программе, не принимает бит желаемого значения. В случае с битом, который можно только записывать, указано одно конкретное значение, которое появляется всегда при его чтении. Во второй стоке под битами указано стандартное значение, которое есть у бита после запуска микроконтроллера (англ. reset). |
| | |
| | Если названия регистров AVR указывают на действительный адрес в гнезде памяти, то за названиями битов скрываются их порядковые номера. Исходя из этого, при манипуляции с битами, следует названия битов при помощи операции сдвижения преобразовать в битовую маску. Далее приведены некоторые примерные предложения на языке Си, используемые для регистра модуля USART 0. |
| |
| Kui AVR-i registrite nimed viitavad tegelikult mälupesade aadressidele, siis biti nimede taga peitub selle biti järgu number. Seega registris bittidega manipuleerimiseks tuleb bitinimed nihutusoperatsiooni abil bitimaskiks teisendada. Järgnevalt on toodud mõned C-keele näitelaused eeltoodud USART 0 mooduli registri kasutamiseks. | |
| |
| <code c> | <code c> |
| // TXC0 biti kõrgeks seadmine | // Установка бита TXC0 высоким |
| UCSR0A |= (1 << TXC0); | UCSR0A |= (1 << TXC0); |
| |
| // U2X0 biti madalaks seadmine | // Установка бита U2X0 низким |
| UCSR0A &= ~(1 << U2X0); | UCSR0A &= ~(1 << U2X0); |
| |
| // UDRE0 biti(maski) väärtuse lugemine | // Считывание значения бита (битовой маски) UDRE0 |
| unsigned char u = (UCSR0A & (1 << UDRE0)); | unsigned char u = (UCSR0A & (1 << UDRE0)); |
| |
| // Siinkohal on u väärtus kas 0 või 32, | // Здесь значение u – 0 или 32, |
| // mis võimaldab seda loogilises avaldises kasutada | // что позволяет использовать его в логическом выражении |
| if (u) | if (u) |
| { | { |
| // MPCM0 biti inverteerimine | // Инвертирование бита MPCM0 |
| UCSR0A ^= (1 << MPCM0); | UCSR0A ^= (1 << MPCM0); |
| } | } |
| |
| // Mõnikord on aga vaja saada konkreetne 0 või 1 väärtus, | // Иногда требуется получить конкретное значение 0 или 1, |
| // selleks tuleb loetud bitti nihutada paremale | // для этого следует уже считанные биты сдвинуть вправо |
| u >>= UDRE0; | u >>= UDRE0; |
| |
| // Siinkohal on u väärtus kas 0 või 1 | // Здесь значение u 0 или 1 |
| </code> | </code> |
| |