MISTAKES


Page 19
INDEX

The fastest way to learn is from your own mistakes. But up to now, you may not have done any PIC programming and so we will have to show you some that were generated recently. 

1. One of the biggest mistakes when creating a program is making an output line HIGH but failing to make it an OUTPUT.
If a line not made an OUTPUT, it will not go HIGH when the bit is set (made "1").
The requirement is to make "line 0" an output. 

Here is the faulty code:
SetUp   MOVLW 0D ;0000  1101
  TRISB  
  GOTO Start  
     
Start BSF 06,0  

The value 0D does not make the lowest line an output - it makes it an INPUT!
Here is the correct code:
SetUp   MOVLW 0E ;0000  1110
  TRISB  
  GOTO Start  
     
Start BSF 06,0  

2. Another mistake is referring to the wrong bit in a file. The  bits are referred to as bit0, bit1, bit2, bit3, bit4, bit5, bit6, and bit7. The lowest bit is bit0 NOT bit1
In the following code, the programmer thought he made the lowest bit of file 0C HIGH, but he made the second lowest bit HIGH:
   BSF 0C,1 ;Set the lowest line HIGH

The correct code is:
   BSF 0C,0 ;Set the lowest line HIGH

3. Another oversight is forgetting line GP3 for a PIC12c508A is input only.
   BSF 06,3 ;Make GP3 HIGH

The instruction above will have no effect. An output device (such as LED or speaker) should not be connected to line GP3. It will not be activated.

4. Line RA4 of a PIC16F84 will only sink a current. It does not deliver a current. The diagrams below show how a LED can be connected to RA4. The LED in diagram 2 will illuminate when a LOW is output on RA4.

        
SetUp   MOVLW 2F ;0010  1111
  TRISA ;Make RA4 output
  GOTO Start  
     
Start BCF 05,4 ;Make RA4 LOW

5. The DECFSZ instruction decrements a file and skips the next instruction in the program when the file is zero. If we use file 0C, the result of the decrementing must be placed in the file. In other words file 0C will be ONE LESS after the operation. If the wrong destination is used, the file will not get decremented to zero. In the following delay routine the programmer used the wrong destination. (0 = the result of an operation is placed in W.  1 = the result of an operation is placed in the file itself).

Delay1   DECFSZ 0C,0 ;DECrement file 0C
  GOTO Delay1  
  RETLW 00  

When the micro enters the delay routine above, file 0C is decremented but the result is placed in W and 0C remains unchanged! The micro will advance to the next line, execute the instruction GOTO Delay1 and decrement file 0C again. The value of 0C will not change. The micro will be stuck in the loop created by these two instructions and NEVER emerge!
The correct instructions are:

Delay1   DECFSZ 0C,1 ;DECrement file 0C
  GOTO Delay1  
  RETLW 00  

6. The following routine will not work:  Why? 

Delay1   DECFSZ 0C,1 ;DECrement file 0C
  NOP  
  GOTO Delay1  
  RETLW 00  

In the delay routine above, the micro will NEVER reach the RETLW 00 instruction. The micro will advance to the NOP instruction and when file 0C is zero, the micro will jump to GOTO Delay1 and loop the 3 instructions again. 
The instruction after a DECFSZ must be able to answer the following question:
               The file is NOT zero
and go to another location. (such as Delay1)
The next instruction answers the question:
               The file is ZERO
and returns to the routine that called the Delay routine. (or maybe continues with further instructions.)

This is the correct layout for the sub-routine:

Delay1   DECFSZ 0C,1  
  GOTO Delay1 ;The file is NOT zero
  RETLW 00 ;The file is ZERO

7. Comparing two files to see if they are the same can be done with the XOR instruction. The value in one file is put into W and the following instruction is executed:

   XORWF 0C,0 ;XOR W with file 0C (result in W)

If the two files are the same, a bit in the status file will be turned into a "1". Let's not worry about the name of the "bit" because this will confuse you. 
We now look at the "bit" and see if it is "set". If it is "set", the two files are the SAME.
   BTFSC 03,2 ;Look at bit 2 in the status flag

We now create two instructions below BTFSC 03,2:

   BTFSC 03,2 ;Look at bit 2 in the status flag
  GOTO xxxx ;The bit is NOT zero
  GOTO yyyy ;The bit is ZERO

Name the 2 faults with the following set of instructions:

  MOVF 0B,1 ;Copy file 0B into W
  XORWF 0C,0 ;XOR W with file 0C (result in W)
   BTFSS 03,2 ;Look at bit 2 in the status flag
  GOTO xxxx ;The bit is NOT zero
  GOTO yyyy ;The bit is ZERO

A: MOVF 0B,1 will not copy the contents of file 0B into W - it only moves the contents in and out of file 0B and sets the zero flag.
A: The comments: The bit is NOT zero and The bit is ZERO are around the wrong way for the BTFSS 03,2 instruction. 

The correct instructions/comments are:

  MOVF 0B,0 ;Copy file 0B into W
  XORWF 0C,0 ;XOR W with file 0C (result in W)
   BTFSS 03,2 ;Look at bit 2 in the status flag
  GOTO xxxx ;The bit is  zero
  GOTO yyyy ;The bit is NOT ZERO

 

NEXT