# btfsc instruction

Status
Not open for further replies.

#### gregmcc

##### Member
I seem to having endless problems with this simple instruction.

If I have the following code:

movlw b'00000000'
btfsc W, 0
goto Intrusion
goto Main

According to the datasheet - btfsc: If bit is set then skip next instruction. On the above bit zero is clear so it should execute the next instruction. Why's it that my mode keeps jumping to Main

#### Nigel Goodwin

##### Super Moderator
gregmcc said:
I seem to having endless problems with this simple instruction.

If I have the following code:

movlw b'00000000'
btfsc W, 0
goto Intrusion
goto Main

According to the datasheet - btfsc: If bit is set then skip next instruction. On the above bit zero is clear so it should execute the next instruction. Why's it that my mode keeps jumping to Main
You need to try reading the datasheet! - BTFSC can't be used on the W register, only on file registers - the only reason it assembles OK is that W is in the include file as a destination.

#### gregmcc

##### Member
Thanks - that might explain why I was having trouble

I've done a search through the 16F62X datasheet and under the BTFSC instruction it doesn't mention anything about not using the W register. Unless of course I'm not reading it correctly, which by this stage anything is possible. <grin>

#### Nigel Goodwin

##### Super Moderator
gregmcc said:
Thanks - that might explain why I was having trouble

I've done a search through the 16F62X datasheet and under the BTFSC instruction it doesn't mention anything about not using the W register. Unless of course I'm not reading it correctly, which by this stage anything is possible. <grin>
It's in a section for action only on file registers - W is defined in the include file as either 0 or 1 (can't remember which as you never need to know). So your line actually read:

btfsc 1, x

or

btfsc 0, x

#### gregmcc

##### Member
Thanks found it. Looks like its back to basics for me

#### Pommie

##### Well-Known Member
To test bit 0 of W you can do the following,
Code:
     andlw  b'00000001'
btfss  STATUS,Z
goto   BitWasOne
To test a different or multiple bits just change the 0's to 1's.
The above does of course corrupt W.

Mike.

#### Ayne

##### New Member
To test bit 0 of W you can do the following,

Code:
Code:
 andlw  b'00000001'
btfss  STATUS,Z
goto   BitWasOne
To test a different or multiple bits just change the 0's to 1's.
The above does of course corrupt W.

Mike.
Z: Zero bit
1 = The result of an arithmetic or logic operation is zero
0 = The result of an arithmetic or logic operation is not zero

#### Attachments

• 4.7 KB Views: 216

#### gregmcc

##### Member
Thanks - I'll paste that right into my code

#### Nigel Goodwin

##### Super Moderator
gregmcc said:
Thanks - I'll paste that right into my code
Or just copy W to a file register, and check that - this doesn't alter the W register.

Using ANDLW is really a 'non-PIC' method though, most processors don't have bit-wise instructions, and logical operations on the entire byte are the only way to test, or modify, individual bits. PIC's are designed for low level operations, and thus have bit-wise operators - you may as well use them?.

Code:
movlw b'00000000'
movwf Temp
btfsc Temp, 0
goto Intrusion
goto Main

#### Ayne

##### New Member
Pommie said:
To test bit 0 of W you can do the following,
Code:
     andlw  b'00000001'
btfss  STATUS,Z
goto   BitWasOne
To test a different or multiple bits just change the 0's to 1's.
The above does of course corrupt W.

Mike.
Above code is right???
plz guide me that
if W = 0000 0001 AND Litrel = 0000 0001 then Z = ???

#### Nigel Goodwin

##### Super Moderator
Looks OK to me, but it's just not really the way you would do it on a PIC - PIC's are 'better' than that!.

#### gregmcc

##### Member
I've copied it to a file register (I need to use the value later again the program) Its working great now.

#### Pommie

##### Well-Known Member
Ayne said:
Above code is right???
plz guide me that
if W = 0000 0001 AND Litrel = 0000 0001 then Z = ???
0000 0001 AND 0000 0001 = 0000 0001
0000 0001 is not equal to 0
Therefore Zero flag = Not True = 0

Mike.

Status
Not open for further replies.