Principiile de funcționare cu port individual de înregistrare în biți AVR microcontroler. Detalii considerate operațiuni de biți și operațiunile de transfer de biți în limbajul C. Exemple de setare și resetarea biților în porturi de registru, citirea bitul de stare și inversarea lor.
Pentru citirea și scrierea de biți individuale în porturile microcontroler trebuie să învețe să producă operațiuni de biți, utilizați și bitmap-uri scrie în port.
structura de octet
Știm că un octet reprezintă 8 biți, iar fiecare bit este - 1 sau 0 biți dintr-un octet sunt considerate de la dreapta la stânga. Bit 1 este cel mai puțin semnificativ, și 8 biți - Senior.
Constantele și definiții fișier în bibliotecă-avr libc pentru fiecare tip de microcontroler indică valorile pentru constantele PD0, PD1, PB5, PC4 și altele. De exemplu, pentru a afișa valorile tuturor constantele IO-fișier pentru ATmega8 microcontroler și în cazul în care există o combinație „PD“ (constantele port D cauta), executa comanda:
Aici vom obține următorul rezultat:
Când utilizați constantă PD0 știți că acesta conține un număr de 0, și PD1 - 1, etc.
operație de schimbare biți
Să ne acum mai în detaliu prin exemple se referă la operatorii de biți schimbare.
În total există mai multe tipuri de operațiuni de biți schimbare, cum ar fi:
- logica (mutat biți sunt pierdute, iar pe celelalte poziții libere sunt umplute cu zerouri);
- aritmetica (trecerea la stânga - precum și cu un drept de deplasare logică - sunt umplute cu valori ale bitul cel mai din stânga, care este, de asemenea, numit punct de reper);
- ciclice (biți mutat dintr-o parte sunt mutate în poziția lăsată celuilalt ca un inel închis).
Bit operatorii de schimbare „>>“ și "<<" в языке программирования Си выполняют сдвиг битов в переменной вправо и влево на указанное число элементов. Биты которые были сдвинуты теряются, а с другой стороны появляются нули - выполняется логический сдвиг.
O rezervă importantă: trecerea spre dreapta ( „>>“) în numărul variabil, cu un semn negativ (semnat) a efectuat o deplasare aritmetică - posturi rămase libere sunt ocupate edinichki (placă de transfer). Este important să ne amintim!
De exemplu, pentru a efectua schimburi de biți în numere diferite, prima reprezentare în formă binară.
Pentru numărul 1 (dec, zecimal 1) - 00000001 (Bin, în sistemul binar 0b00000001):
Deplasare la stanga de un bit multiplică numărul de 2 și trecerea la dreapta - numărul diviziunii este 2.
Pentru numărul 209 (dec decimal 209) - 11010001 (Bin, într-un sistem binar 0b11010001):
Pentru conversia de la un sistem la altul număr este convenabil de a folosi un calculator pe Linux. acest lucru am scris deja.
Operatorii bitwise în C
Ceea ce știm acum să se mute biți într-un octet, atunci avem de a face cu operatorii de biți în C:
- " „(Logic SI, SI) sau multiplicare - operație binară, în care rezultatul este 1 numai în cazul în care ambii operanzi sunt egale cu 1, altfel va fi 0;
- „|“ (SAU logic, OR), sau adăugarea - rezultatul operației binare este egal cu 1 în cazul în care cel puțin unul dintre operanzi este 1;
- "
Luați în considerare exemplele de operații de biți pe numerele 209, 7, și reprezentarea lor de biți:
După cum puteți vedea, operațiunile de biți vă permit să setați sau să resetați biți individuale ale numărului.
Setarea de biți în registrul portului
Și acum, un pic de practică, să facem instalarea a 6 biți în portul PORTB registru care, la rândul său, va stabili un nivel ridicat pentru PB5 de canal (6 biți într-un registru). Să presupunem acum că PORTB registru conține numărul 136. în care biți de reprezentare arată ca 10001000 (nivel ridicat la canalele PB7 și PB3).
Pentru a seta data de 6 biți (100 01000), vom folosi o operație logică SAU biți, în combinație cu masca de biți. Pentru bitmask. prin care un bit va fi setat mai târziu, vom efectua un număr la stânga biți schimbare 1 (00000001) în 5 grade:
Ca urmare a funcționării biți obținem numărul 32 (00100000), o diadă cincea de descărcare de studii pentru fiecare schimb înmulțit cu 2 rezultat.
Va efectua biți sau operație pe numărul curent în registru și de a obține numărul-masca:
Acum, compara starea registrului înainte și după operație - toți biții de stare sunt salvate și instalate în plus, a 6-biți.
Pentru a instala al 6-lea bit și intrarea ulterioară a portului PORTB registru (stabilirea unui nivel înalt pentru canalul PB5), în acest exemplu poate fi oricare dintre următoarele structuri operatori, toate acestea îndeplini sarcina identice:
- PORTB = PORTB | 32;
- PORTB = PORTB | (1 <<5);
- PORTB = PORTB | (1 <
- PORTB | = (1 <
- PORTB | = (1 <
Este cel mai convenabil de a utiliza cele mai recente înregistrare scurt, care utilizează o combinație de operator logic SAU și atribuirea, în acest caz, PB5. De exemplu, PB5 constantă (port canal 5 B, 6 bit registru th) este definit într-un fișier pentru microcontroler ATmega8 /usr/lib/avr/include/avr/iom8.h și este egal cu numărul 5.
Cum se instalează câțiva biți în registru? - Puteți apela alternativ cele două desene sau modele cu operatorii, și este posibil să efectueze toate o singură echipă. Să presupunem că doriți să instalați 2 și biții a 6 în porturi PORTD registru care corespund canalelor PD1 și PD5:
Resetare biți în registrul de port
Pentru a reseta descărcarea în port înregistrați vom folosi operațiune de biți „“ (o logică „AND“), care se aplică celor doi biți (operație binar) și dă unitatea numai în cazul în care cei doi biți originale au o singură valoare, și vom avea nevoie de operațiunea de biți "
"(Logic" inversiune NU“,).
Să efectuați o resetare a 5-bit în port registru PORTD. care, la rândul său, va efectua setarea la nivel scăzut pentru a PD4 canal. Să presupunem acum că PORTD registru conține numărul 157. în care reprezentarea pic arata ca 10011101.
Pentru a reseta bitul 5-lea (1001 1101) pentru a înregistra PORTD de port, vom pregăti o mască (ca la setarea de biți), se va produce inversiune "
„Bit și de a efectua operația“ „peste valoarea curentă a registrului și masca inversat primit.
Pentru a pregăti masca de biți sunt deplasate de 4 biți includ 1 (00000001).
Masca este gata, a primit numărul 16 (00010000), 2 în gradul 4-lea. Efectuați inversiunea de biți:
Gata, rămâne să se aplice masca la conținutul registrului portului PORTB folosind operațiune de biți "„:
Acum, conținutul valorii PORTD registru de biți set 5-lea la 0 menținând în același timp pozițiile de bit rămase. În C, datele de funcționare pot fi efectuate utilizând oricare dintre următoarele comenzi cu rezultate identice:
- PORTD = PORTD
În acest caz, modul cel mai convenabil și informativ echipa va dura o versiune prescurtată.
Pentru a reseta mai mulți biți înregistrați pot fi folosite aici astfel de operatori de construcții:
- PORTD = PORTD
Verificarea biților registrului
Acum vom înțelege cum să verificați biților registrului pentru prezența 1 sau 0. Acest lucru poate fi necesar în cazul în care este necesar, pentru a primi valoarea de biți în registrele speciale (steaguri) ale microprocesorului, și pentru citirea stării diverselor dispozitive și module care transmit statutul său folosind structura de biți .
Cum se verifica valoarea bitului specificată într-un registru în C? - are nevoie pentru a ridica o expresie specială folosind operațiuni de biți, al căror rezultat este valoarea: true (Adevărat) sau fals (false). Cu valoarea Boolean (bool) putem folosi expresia pentru declarațiile condiționale ale limbajului C.
De exemplu, trebuie să verifice dacă există o unitate (1), în al 3-lea registru de biți PORTD. astfel, vom verifica dacă există un nivel ridicat de pe canalul PD2 portul PORTD. Să presupunem că valoarea actuală a registrului - 10010101 (149).
Pentru a testa, folosind o expresie care constă dintr-un pic pic masca setat pentru a verifica și registrul auditată la care se aplică operatorul de biți „“ (logic).
Masca Preparată în care doar al treilea bit este setat la 0. Pentru a efectua acest număr de deplasare 1 de 2 biți:
biți operațiune „“ Acum aplică (logic) conținutul registrului și masca PORTD rezultat:
Ca urmare, expresiile au numărul 4 (0000 0100).
În C, toate numerele care nu sunt egale cu "zero" (-100, -5, 1, 500) este un adevăr logic (True), și 0 - logică fals (false).
Prin urmare, rezultatul expresiei noastre - numărul 4 este un adevăr logic (Adevărat), ceea ce înseamnă că a treia categorie de registru PORTD conține una. Acesta este modul în care expresia va arăta în C:
Această expresie poate fi utilizat în situațiile condiționale (dacă) declarații și bucle (în timp), de exemplu:
Pentru a verifica conținutul bit în registru la zero (0), folosind aceeași construcție, numai expresia este aplicabilă rezultatul operației de inversare logică „!“ (NOT logic). Logic „!“ inversează valoarea booleana cu adevărul (adevărat) se află pe (false), și vice-versa. Spre deosebire de operațiunea de inversare biți. care inversează biții de la 1 la 0 și invers, o operațiune de inversare logică funcționează pe valorile logice: true (adevărat) se află pe (false).
expresie EXEMPLU pentru a testa pentru zero (0) bit 3a (PD2 canal) în portul PORTD registru:
Aici avem expresia „PORTD (1 <<2)" берем в круглые дужки и таким образом получаем комплексный результат выражения, к которому потом применяем оператор логической инверсии.
biți de stare inversiune în registrul
Uneori poate fi necesar să se schimbe starea unui anumit bit în registru la opusul - pentru a efectua o inversare a biților de stare.
Pentru o astfel de operațiune este operator de excelent bit „^“ (SAU exclusiv, XOR). Pentru a efectua inversul este necesar un pic specificat într-un registru pentru a crea o mască în care este stabilit acest bit, și apoi se aplică la conținutul registrului și care rezultă masca operatorului binar „^“, atunci se va scrie rezultatul în registru și gata.
Să luăm, de exemplu, trebuie să plătească LED, care este conectat la canalul PD5 portul PORTD. Când LED-ul se aprinde, înseamnă că la PD5 canal există un nivel ridicat, respectiv, acest lucru înseamnă că biți PORTD numărul de port registru 6 (PD5 = 5, 6-lea bit în registrul octet) setat la 1. Să presupunem că portul conținutul PORTD registru acum - 10111010 (numerele 186, 1 octet, 8 biți, 6-lea bit = 1).
Se prepară o mască pentru setarea 6-bit, avem nevoie pentru a muta toate biți de numere de la 1 la 5 cifre:
Aplicați masca la conținutul registrului portului PORTD:
După cum puteți vedea, 6-lea bit în registrul octet, care anterior a fost de 1, este setat la 0 (100 în ianuarie 1010). Acum trebuie să scrie numărul în registrul portului, iar problema poate fi considerată finalizată. Exemple de utilizare a unei astfel de structuri în limbajul C:
- PORTD = PORTD ^ 32;
- PORTD = PORTD ^ (1<<5);
- PORTD = PORTD ^ (1<
- PORTD ^ = (1<
- PORTD ^ = (1<
Ca și în exemplele anterioare pentru setarea și resetarea biți, ultimul design-scurt este cel mai simplu și simplu de folosit.
concluzie
La prima vedere, este ușor să te pierzi în operatori și valori, cum ar fi „“, „!“, „PD1“, „>>“ și altele, dar o dată bine înțeles și a încercat să practice, veți avea întotdeauna un concept de ceea ce funcționează, în cazul în care este luat și că acesta conține.
operații logice și biți sunt prezente în mai multe limbaje de programare, nu doar în C, astfel că această experiență va fi util pentru tine, dacă lucrați, de asemenea, cu alte limbaje de programare.