Atmel start 4: Blinky två-växlar, Pull-Up motstånd och Bit Ops (3 / 11 steg)
Steg 3: Bitvis operationer
Portar med kräver blandat in- och utgångar, som i tabell 1, ofta maskering verksamhet som består av en mask och en bitvis operation [16]. Maskeringen väljer ut enskilda bitar eller en delmängd av port bitar för att testa. De bitvisa operationerna gör maskering verksamhet. På detta sätt kan de indata- och bitarna av en IO-port avskiljs och manipuleras.
Överväga några belysande exempel som ska användas med Blinky två. Dessa exempel skriva och manipulera bitarna i en 8-bitars variabel A ges av A = rstuvwxy där bokstäverna r, s, t,..., y är bitar med värden antingen 0 eller 1. A = 10001000 innebär till exempel att r = 1 och v = 1 och resten är noll. Vi arbetar med allmän A och inte tilldelats värden till r, s,..., y. I C-liknande notation, kan man skriva A = "0brstuvwxy" där 0b berättar kompilatorn numret är binary; denna notation fungerar dock inte i ett program.
1. bitvis "och" företräds av et-tecknet "&"
Överväga den 8-bitars variabel A = rstuvwxy. Antag att vi vill kontrollera värdet av bit #1 (inte bit #0). Är x = 0 eller är x = 1? Så definierar vi Mask = 00000010. Notera värdet 1 i bit #1 position som motsvarar positionen för lite i variabeln A som vi vill kontrollera. Ordet Mask är tänkt att innebära att vissa bitar kommer att tas bort från behandling och andra belyste för övervägande. Nu, överväga den bit-för-bit logiska och drift utgör av '&'. Överväga
Test = A & Mask.
Tabell 2 visar bitarna i A, Mask och resultatet av en bit-för-bit och. meddelande kolumnen längst till höger i tabellen representerar lite #0 som också är den minst signifikanta bit.
Tabell 2: Exempel på bitvis AND mellan två 8-bitars variabler
Variabel A | r | s | t | u | v | w | x | y |
Mask | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
Test = A & Mask | 0 | 0 | 0 | 0 | 0 | 0 | x | 0 |
Operatorn "&" är i huvudsak-av-bitars multiplikation med följande definitioner 1 & 1 = 1, 0 & 1 = 0, 1 & 0 = 0, 0 & 0 = 0 vilket kan ses som likvärdiga boolesk Algebra eller Aristoteles logik med 1 = True och 0 = False. De första två produkterna (specifikt, 1, 1 = 1, 0 & 1 = 0) visar uppföljningskod x & 1 = x i tabell 2. Detta är den egenskap som vi behöver för maskering med "&" sedan alla bitar i "Variabeln" kommer att mappas till noll utom i de fall där masken har en 1. Se referens [16] för mer information om bitvis operationer. Vi kan nu fråga om "Test" är lika med noll. Om Test = 0 då x måste vara noll.
2. bitvis OR representeras av den vertikala linjen ' |'
Igen, överväga den variabla A = rstuvwxy där är..., y representerar bitar med värdena 0 eller 1. Anta att denna tid vi vill se till att bits har #0 och #4 värdet 1 utan att ändra någon av de andra i A. Det vill säga vi vill ange y = 1 och du = 1. Till gör så, överväga en mask med alla nollbitar utom #0 och #4.
Mask2 = 00010001
Driften av maskering i detta fall blir den bit för bit OR åtgärd representeras av den vertikala linjen |. Eller påverkar den följande bitar: 1 | 1 = 1, 0 | 1 = 1, 1 | 0 = 1, 0 | 0 = 0. Eller kan anses vara likartade eller i Aristoteles logik-systemet med 1 = True och 0 = False. Tabell 3 visar de OR-åtgärden för A | Mask2.
Tabell 3: Exempel på bitvis eller mellan två 8-bitars nummer
8-bitars variabel A | r | s | t | u | v | w | x | y |
Mask2 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 |
A | Mask2 | r | s | t | 1 | v | w | x | 1 |
De två OR definitionerna av 1 | 0 = 1, 0 | 0 = 0 (dvs, ekvivalentt x | 0 = x) visar att dessa mask bitar i tabell 3 som är noll inte ändrar de motsvarande bitarna i variabeln (se bitar r-t, v-x) vid beräkning av Variable| Mask2 i den nedersta raden. Men bitvis eller definitivt ger en 1 i resultatet lite där masken har en 1 som du och y i tabellen.
Slutligen då, om vi tilldelar resultatet av "A | Mask2 "tillbaka till en (med C/C++ tilldelning operatören av '='), det vill säga A = A | Mask2, då vi kommer fram till det önskade resultatet av inställningen bitar 0 och 4 till värdet ett.
3. bitvis NEGATION föreställer av Twiddle ~
Igen, överväga den variabla A = rstuvwxy där är..., y representerar bitar med värdena 0 eller 1. Anta att denna tid vi vill se till att bits har #0 och #4 värdet 0 utan att ändra någon av de andra i A. Det vill säga vi vill ange y = 0 och du = 0. Till gör så, överväga en mask med alla nollbitar utom #0 och #4.
Mask3 = 00010001
som bekvämt råkar vara samma som Mask2 i föregående exempel. Det kan vara lättast att titta på tabell 4 se vad måste hända.
Tabell 4: Exempel på bitvis AND mellan två 8-bitars nummer
8-bitars variabel | r | s | t | u | v | w | x | y |
Mask3 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 |
~ Mask3 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 0 |
Variabel & ~ Mask3 | r | s | t | 0 | v | w | x | 0 |
Vi vet från de tidigare exemplen, att OR kan användas för att ändra lite till 1, och det och kan användas för att ändra lite till en nolla. Så det verkar som att vi behöver det och. I tabell 4 visas har Mask3 en 1 på dessa platser att resultatet har en 0. Om du vill kombinera Mask3 med AND, vi har en hjärna storm och inse att vi behöver bara vända bitarna i Mask3 och sedan använda den och.
Den logiska inte eller NEGATION har följande definition ~ 0 = 1, ~ 1 = 0. Så nu lite positioner i ~ Mask3 (se tabell 4) med 0 är placerar av variabel A som ska anges till noll. Använda resultaten för det första exemplet och faktumet att y & 0 = 0 (etc) vi till den nedersta raden av tabell 4. Om vi lagrar resultatet tillbaka i variabeln A enligt
A = A & ~ Mask3
sedan har vi avslutat vår uppgift att inställningen bit #0 och #4 till noll i orginal numret. Här använder '=' som ett C/C++ uppdrag.