Bit manipulatie

GETBIT Bekijkt het niveau van een specifiek bit in een variabele of register
SETBIT Set een specifiek bit in een variabele of register
CLEARBIT Reset een specifiek bit in een variabele of register
LOADBIT Set of reset (afhankelijk van een waarde) een specifiek bit in een variabele of register

 

Er zijn vele manieren om een bit in een variabele of register te testen (= bekijken of het bit '0' of '1' is), te setten (= '1' maken) of te resetten (= clear, '0' maken), elke manier heeft zo zijn voor- en nadelen.
De ene manier is het snelst, de andere neemt het minste geheugen in en weer een andere manier is het makkelijkst te programmeren.


Om een specifiek bit van een variabele (of register) op '0' of '1' te zetten, kun je het bitnummer van de variabele rechtstreeks opgeven door deze direct achter de naam van de variabele te zetten, gescheiden door een punt.
Om bijvoorbeeld bit 4 van variabele 'PietJanHein' op '0' te zetten kun je schrijven:

PietJanHein.4 = 0

Dit zal je bekend voorkomen omdat we deze manier ook altijd al bij de poorten (= een register) doen.

Het volgende programma is een compleet voorbeeld:.

DEVICE 16F628A                ;Gebruik een 16F628A type
CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
ALL_DIGITAL TRUE              ;Alle ingangen digitaal

;Variabelen declareren
DIM PietJanHein     AS BYTE   ;Declareer 'PietJanHein' als een BYTE variabele (8 bits) 

CLEAR                         ;Wis alle RAM geheugen
DELAYMS 500                   ;LCD stabilisering 

;Hoofdprogramma
CLS                           ;Display wissen
PRINT AT 1, 1, BIN8 PietJanHein ;Plaats waarde van 'PietJanHein' in binaire 8 bits notatie 
DELAYMS 2000                  ;De waarde van 'PietJanHein' 2 seconden weergeven

PietJanHein.0 = 1             ;Maak bit 0 van variabele 'PietJanHein' '1'
PietJanHein.6 = 1             ;Maak bit 6 van variabele 'PietJanHein' '1'

PRINT AT 1, 1, BIN8 PietJanHein ;Plaats waarde van 'PietJanHein' in binaire 8 bits notatie
DELAYMS 2000                  ;De (nieuwe) waarde van 'PietJanHein' 2 seconden weergeven

PietJanHein.6 = 0             ;Maak bit 6 van variabele 'PietJanHein' weer '0'

PRINT AT 1, 1, BIN8 PietJanHein ;Plaats waarde van 'PietJanHein' in binaire 8 bits notatie

END                           ;Beeindig het programma

Als je bovenstaand voorbeeld op een PIC met HD44780 display uitvoert, dan geeft het display het volgende aan:
00000000

Na twee seconden worden bit 6 en bit 0 op '1' gezet door PietJanHein.0 = 1 en PietJanHein.6 = 1:
01000001

Na weer twee seconden wordt bit 6 weer op '0' gezet door PietJanHein.6 = 0:
00000001


Andersom kan ook.
Je kunt van een specifiek bit opvragen wat de waarde is (of deze '0' of '1' is), door het bitnummer achter de variabelenaam te zetten, gescheiden door een punt:

DEVICE 16F628A                ;Gebruik een 16F628A type
CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
ALL_DIGITAL TRUE              ;Alle ingangen digitaal

;Variabelen declareren
DIM PietJanHein     AS BYTE   ;Declareer 'PietJanHein' als een BYTE variabele (8 bits) 

CLEAR                         ;Wis alle RAM geheugen
DELAYMS 500                   ;LCD stabilisering 

;Hoofdprogramma
CLS                           ;Display wissen

IF PietJanHein.3 = 1 THEN     ;Als bit 3 van variabele 'PietJanHein' '1' is, dan...
  PRINT "Bit 3 is EEN"        ;Plaats de tekst op het display
ELSE                          ;...anders... (is bit 3 van 'PietJanHein' dus '0')
  PRINT "Bit 3 is NUL"        ;Plaats de tekst op het display
ENDIF

END                           ;Beeindig het programma

Bij IF PietJanHein.3 = 1 wordt bekeken of bit 3 op '1' staat.
Is dat waar, dan wordt op het display Bit 3 is EEN weergegeven.
Anders, (als het dus niet waar is) wordt op het display Bit 3 is NUL weergegeven.

Als je bovenstaand programma op de PIC uitvoert, zal het display Bit 3 is NUL weergeven, omdat alle variabelen bij het begin van het programma door CLEAR gewist zijn (= op 0 zijn gezet).
'PietJanHein' is dus ook 0 (binair %00000000), bit 3 dus ook.


Er zit dus verschil tussen IF PietJanHein = 1 en IF PietJanHein.0 = 1.
In het eerste geval worden alle bits van de variabele 'PietJanHein' bekeken, en vergeleken met 1.
Dat betekent dat 'PietJanHein' de waarde 1 (= %00000001) moet hebben om "waar" te zijn.
Bit 0 moet dan '1' zijn en alle andere bits moeten '0' zijn.

In het tweede geval hoeft alleen bit 0 op '1' te staan, welke waarde de andere bits hebben maakt niet uit.
In dat geval is het "waar" als 'PietJanHein' de waarde 1 heeft (= %00000001), maar ook "waar" als 'PietJanHein' bijvoorbeeld waarde 67 heeft (= %01000011), omdat bit 0 hier ook '1' is.


Eén bit veranderen in een array gaat op een iets andere manier dan bij gewone variabelen (met een hekje #).
Om bijvoorbeeld bit 7 van 'PietJanHein[12]' op '0' te zetten kun je niet schrijven:

PietJanHein[12].7 = 0  ;Dit werkt zo niet                 

Maar moet je dit zo schrijven:

PietJanHein#12.7 = 0   ;Dit werkt (denk aan het hekje # ) 

Meer over array's, zie cursus deel 6.


Een specifiek bit van een variabele of register kiezen kan dus door direct het bitnummer erachter te zetten.
Maar wat nu als het bitnummer zelf een variabele moet zijn?
Dan werkt de vorige manier niet meer.

x = x + 1
PORTA.x = 0

Bovenstaande methode kan niet, je zult een error (= foutmelding) krijgen.
Om dit toch voor elkaar te krijgen heeft PIC Basic diverse functies en instructies hier voor.


GETBIT

De syntaxis
 Variabele1 =  GETBIT Variabele2, Index 

De functie GETBIT test (= bekijkt) een bit van een variabele of register.
Een arrayvariabele is (nog) niet toegestaan.
 

Variabele1 - is een door de gebruiker gedefinieerde variabele van het BIT, BYTE, WORD of DWORD type.
Het resultaat dat hier in komt zal altijd een '0' of een '1' zijn.
Variabele2 - is de variabele die getest moet worden.
Dit kan een BYTE, WORD of DWORD variabele zijn (zie zodadelijk een voorbeeld).
Index - mag een constante, variabele of een berekening zijn, dat aangeeft welk bit van Variabele2 getest moet worden.
Als Variabele2 een BYTE variabele is, dan kan voor Index een waarde van 0 ... 7 worden opgegeven.
Is Variabele2 eerder als WORD variabele gedefinieerd, dan kan voor Index een waarde van 0 ... 15 worden opgegeven en in het geval van een DWORD een waarde van 0 ... 31.

Een korte beschrijving:
Om er achter te komen wat de toestand van een bepaald (specifiek) bit van een variabele is ('0' of '1'), kun je gebruikmaken van de functie GETBIT.
Zoals je weet staat het laagste bitnummer rechts van het binaire getal..
We nemen als voorbeeld een BYTE variabele met de naam 'PietJanHein', 8 bits, en de bitnummering is dus (zoals altijd) 76543210.
Stel dat 'PietJanHein' de waarde 65 heeft, binair is dat %01000001.
Als je nu wilt weten, of bit 6 een '0' of een '1' is, kun je dat als volgt doen:

JanKlaas = PietJanHein.6

waarbij nu in 'JanKlaas' een 0 of een 1 staat, afhankelijk van of bit 6 van 'PietJanHein '0' of '1' was.
In ons voorbeeld van de waarde %01000001 zal 'JanKlaas' dus 1 zijn, omdat bit 6 van 'PietJanHein' een '1' is.

Het bovenste werkt echter niet als het getal achter die punt een variabelewaarde is.
Dus:

BitNummer = BitNummer + 1
JanKlaas  = PietJanHein.BitNummer

werkt niet.
Dit kun je oplossen met de functie GETBIT.

BitNummer = BitNummer + 1
JanKlaas  = GETBIT PietJanHein, BitNummer

Als 'PietJanHein' hier een BYTE variabele is, dan moet de waarde van 'BitNummer' tussen de 0 en 7 liggen.
Is 'PietJanHein' hier een WORD variabele dan moet dat 0 ... 15 zijn, en wordt er met GETBIT een DWORD variabele getest, dan moet de waarde van 'BitNummer' liggen tussen 0 en 31, afhankelijk van welk bit je de toestand ('0' of '1') wilt weten.

In cursus deel 10 staan een paar voorbeelden van programma's met de functie GETBIT.

 


SETBIT

De syntaxis
 SETBIT Variabele, Index 

De instructie SETBIT maakt een opgegeven bit '1'.
 

Variabele - is de variabele waarvan een bit geset moet worden (= een bit op '1' zetten).
Dit kan een BYTE, WORD of DWORD variabele zijn (zie zodadelijk een voorbeeld).
Na uitvoering van de SETBIT instructie is de in Index opgegeven bitnummer op '1' gezet.
Een arrayvariabele is (nog) niet toegestaan.
Index - mag een constante, variabele of een berekening zijn, die aangeeft welk bit van Variabele op '1' gezet moet worden.
Als Variabele een BYTE variabele is, dan kan voor Index een waarde van 0 ... 7 worden opgegeven.
Is Variabele eerder als WORD variabele gedefinieerd, dan kan voor Index een waarde van 0 ... 15 worden opgegeven en in het geval van een DWORD een waarde van 0 ... 31.

Een korte beschrijving:
Om een (specifiek) opgegeven bit van een variabele op '1' te kunnen zetten, kun je gebruikmaken van de instructie SETBIT.
Zoals je weet staat het laagste bitnummer rechts van het binaire getal.
Voor een BYTE variabele komt dat dus neer op 76543210, al bekend bij het opgeven van de binaire waarden voor o.a. TRISA en TRISB.
Voor een WORD variabele is dat 15·14·13·12·11·10·9876543210, 16 bits dus, en voor een 32 bits DWORD hetzelfde verhaal alleen dan 31...0.

We nemen als voorbeeld een BYTE variabele, 8 bits, dus 76543210, met de naam 'PietJanHein'.
Stel dat 'PietJanHein' de waarde %00001111 (oftewel 15) heeft en je bit 7 op '1' wilt zetten, dan doe je dat zo:

PietJanHein.7 = 1

Het bovenste werkt echter niet als het getal achter die punt een variabelewaarde is.
Dus:

BitNummer = 7
PietJanHein.BitNummer

werkt niet.
Dit nu, kun je oplossen met de functie SETBIT.

BitNummer = 7
SETBIT PietJanHein, BitNummer

Het resultaat is dat 'PietJanHein' nu de waarde %10001111 (oftewel 143) heeft, omdat nu ook bit 7, het meest linkse bit op '1' is gezet.
Had je voor 'BitNummer' in plaats van een 7 bijvoorbeeld een 4 ingevuld, dan zou bit 4 zijn geset (= op '1' gezet).

In cursus deel 10 staat een voorbeeld van een programma met de instructie SETBIT.
Zie ook CLEARBIT hieronder.

 


CLEARBIT

De syntaxis
 CLEARBIT Variabele, Index 

De instructie CLEARBIT maakt een opgegeven bit '0'.

De werking is precies hetzelfde als de instructie SETBIT.
Voor een beschrijving van CLEARBIT kun je dus ook kijken bij SETBIT hierboven.
Het enige verschil is dat CLEARBIT de in Index opgegeven bit '0' maakt, terwijl SETBIT deze juist op '1' zet.

Stel dat 'PietJanHein' de waarde %00001111 heeft en je bit 1 op '0' wilt zetten, dan kun je dit zo opgeven:

PietJanHein.1 = 0

Het resultaat is dat 'PietJanHein' nu de waarde %00001101 (oftewel 13) heeft, omdat bit 1 (het tweede bit van rechts) nu '0' is gemaakt.

Is het bitnummer geen constante, maar een variabele waarde, dan werkt bovenstaande regel niet.
Je kunt dus niet schrijven:

x = x + 1
PietJanHein.x = 0

Als je dat in je programma zet, krijg je een error.
Je kunt dit oplossen met de CLEARBIT instructie:

x = x + 1
CLEARBIT PietJanHein, x

In cursus deel 10 staat een voorbeeld van een programma met de instructie CLEARBIT.

 


LOADBIT

De syntaxis
 LOADBIT Variabele, Index, Waarde 

Staat het niet vast of een bit van een variabele een '0' (met CLEARBIT) of een '1' (met SETBIT) moet worden (omdat dit bijvoorbeeld afhankelijk is van weer een andere variabele) dan moet je de instructie LOADBIT gebruiken.
De instructie LOADBIT maakt een in Index opgegeven bitnummer van Variabele '0' of '1'.
Of het bit een '0' of een '1' wordt is afhankelijk van de waarde die Waarde heeft.
 

Variabele - is de variabele waarvan een bit geset of gereset moet worden.
Dit kan een BYTE, WORD of DWORD variabele zijn.
Een arrayvariabele is (nog) niet toegestaan.
Index - mag een constante, variabele of een berekening zijn, die aangeeft welk bit van Variabele geset of gereset moet worden.
Als Variabele een BYTE variabele is, dan kan voor Index een waarde van 0 ... 7 worden opgegeven.
Is Variabele eerder als WORD variabele gedefinieerd, dan kan voor Index een waarde van 0 ... 15 worden opgegeven en in het geval van een DWORD een waarde van 0 ... 31.
Waarde - mag een constante, variabele of een berekening zijn, die aangeeft of de in Index opgegeven bit een '0', dan wel een '1' zal worden.
Alleen als Waarde de waarde 0 heeft, zal het bit '0' worden gemaakt, alle overige waarden zullen het bit op '1' zetten.

Een korte beschrijving:
Om een (specifiek) opgegeven bit van een variabele een niveau te geven dat afhankelijk is van de waarde van een constante, variabele of berekening, kun je gebruikmaken van de instructie LOADBIT.

We nemen als voorbeeld een BYTE variabele, 8 bits, dus 76543210, met de naam 'PietJanHein'.
Stel dat 'JanKlaas' de waarde 0 heeft en 'PietJanHein' de waarde %00001111 (oftewel 15), en je bit 3 van 'PietJanHein' het niveau wilt geven dat 'JanKlaas' heeft, dan geef je dit als volgt op in de LOADBIT instructie:

LOADBIT PietJanHein, 3, JanKlaas

Het resultaat is dat 'PietJanHein' nu de waarde %00000111 (oftewel 7) heeft, omdat bit 3 op '0' is gezet, want 'JanKlaas' heeft de waarde 0.
Had 'JanKlaas' nu een waarde die groter is dan 0, bijvoorbeeld 1 of 33, ik noem maar wat, dan zou bit 3 nu '1' zijn geweest.
Als je voor Index in plaats van een 3 bijvoorbeeld een 5 had ingevuld, dan zou bit 5 gelijk zijn gemaakt aan de waarde van 'JanKlaas'.