• 1
  • 2

Bitove posuny

. .

Bitové posuny a bitové operácie patria k neodmysliteľnej súčasti práce s mikropočítačom.
Používame ich pri práci s ovládaním bitových registrov, na ktorých sú namapované jednotlivé porty MCU.

 

Bitové operácie (OR, AND, NOR, NAND, NOT) využívame pri aplikácii masky na vstupné dáta za účelom dosiahnutia určitého výstupu.
Bitové posuny sú určené na vhodný posun vstupu do bitového registru.

Pri práci sa nezaobídeme bez prevodov medzi sústavami:




Pravdivostné tabuľky jednotlivých operandov:





Príklad pre MCU PIC24FJ64GB002

Porty procesora sú reprezentované ako register, ktorý ovláda jednotlivé piny. Pri odosielaní dát po zbernici, môže byť v jednom bitu registra log. 1 alebo log. 0. Do vybraného bitu registra môžeme nastaviť logickú úroveň.



0-15 - číslo pozície v bitovom registry
B0 - B15 - číslo namapovaného portu na bitový register PORTB

Problém nastáva, ak chceme ovládať bity registru na rôznej pozícií.
Pri odosielaní 8 bitov 0b11111111, by sa ovládali jednotlivé bity vždy len vedľa seba.
Ak chceme ovládať bity na pozícií 14,13 , musíme 0b11111111 prehnať maskou 0b11000000 a výsledok posunúť na 7. pozíciu bitového registra. Pri ovládaní pozícií 11,10,9 bude maska 0b00111000 a výsledok posunutý bitovým posunom na 4. pozíciu bitového registra.

Máme hodnotu 0b11111111 a chceme, aby sa nám preniesla na porty RB1, RB2, RB3, RB7, RB8, RB9, RB13, RB14.

Vyjadríme si indexy hodnoty 0b11111111:




Na porty RB14/13 , chceme dostat hodnoty na indexe 7,6. Hodnoty na ostatných indexoch budú nulové. Vytvoríme masku 0b11000000 a pôvodnú hodnotu binárne vynásobíme s maskou:




Výsledok posunieme na 7. pozíciu:





Pre porty  RB7/8/9 vytvoríme masku 0b0011100, bitovým súčinom ju vynásobíme s pôvodnou hodnotou, a bitovým
posunom ju posunieme na 4. pozíciu:





Pre porty  RB1/2/3 vytvoríme masku 0b00000111, vynásobíme ju s pôvodnou hodnotou a bitovým posunom ju
posunieme na 1. pozíciu:





Posledným krokom aplikujeme bitový súčet na všetky hodnoty:





Nebinárne:

source.c



PORTB  = (0xFF & 0xC0) << 7;
PORTB |= (0xFF & 0x38) << 4;
PORTB |= (0xFF & 0x07) << 1;