Editing of ASM file

Thread Starter

rn.ksheer

Joined May 16, 2012
8
Hi. I have successfully completed constructing CERBERES robot given in http://webspace.webring.com/people/bt/tjaco/cerberes/cerberes.html. The robot works well but when it comes to a corner where both the sensors sense the object , The robot seems to get confused and gets stuck in the same place. The given code doesn't have any instruction for the motors, when both sensors are active. Will it be possible to add a instruction to make the robot turn 180 degrees, then start moving forward or to come backwards, turn left/right then start moving forward when both the sensors sense the object. I am very new to programming so i would require the help.

Sorry for my English :)
 

Attachments

absf

Joined Dec 29, 2010
1,968
People here dont like zip files as they're sometimes having virus problems and it needs to be unzipped.

I post your asm code here so others may spot your problems easily....

Rich (BB code):
;TJACO'S DESIGN GRAVEYARD: WWW.GEOCITIES.COM/TJACODESIGN		;
;22 JULY 2002								;
;CERBERES : MINI ROBOT WITH IR EYES  					;
;USES PIC16F84 µCONTROLLER						;
;WRITTEN IN MICROCHIP ASSEMBLY USE MPASM ASSEMBLER FROM MPLAB		;
;MPLAB CAN BE DOWNLOADED FROM WWW.MICROCHIP.COM				;

;***SET UP THE CONTANTS & VARIABLES****

       LIST            P=16F84A
       ERRORLEVEL      -302    ;SUPPRESS BANK SELECTION MESSAGES
		__config		0x3FFB

STATUS	EQU H'03'		;STATUS REGISTER
TRISB 	EQU H'86'		;TRISB REGISTER FOR SETUP OF PORTB
PORTB 	EQU H'06'		;PORTB REGISTER TO DRIVE PORT B
COUNT1 	EQU H'0C'		;COUNT VARIABLE 1 IS IN GENERAL PURPOSE REG 08H
COUNT2 	EQU H'0D'		;COUNT VARIABLE 2 IS IN GENERAL PURPOSE REG 09H

;***SET UP PORT B IN & OUTPUT****
	BSF 	STATUS,5	;SWITCH TO BANK0 TO SET UP PORT B
	MOVLW 	B'11110000'	;RB7,6,5,4 IS INPUT
	MOVWF 	TRISB		;RB3,2,1,0 IS OUTPUT
	BCF 	STATUS,5	;SWITCH BACK TO BANK0 TO USE PORT B

;***MAIN PROGRAM****
START	MOVLW 	B'00000101'	;MAKE RB0&2 HIGH: MOVE FORWARD
	MOVWF 	PORTB		;
	MOVLW 	H'FE'		;RESET COUNT1 TO 254
	MOVWF 	COUNT1		;	
	MOVLW 	H'FE'		;RESET COUNT2 TO 254
	MOVWF 	COUNT2		;
	BTFSS 	PORTB,5		;CHECK RB5 (INPUT); IF IT IS LOW
	CALL 	BACKL		;THEN EXECUTE BACKLEFT ROUTINE
	BTFSS 	PORTB,6		;CHECK RB6 (INPUT); IF IT IS LOW
	CALL 	BACKR		;EXECUTE BACKRIGHT ROUTINE
	GOTO 	START		;RETURN TO LABEL START

;***BACKLEFT ROUTINE****
BACKL	MOVLW 	B'00001010'	;MAKE RB1&3 HIGH: MOVE BACKWARD
	MOVWF 	PORTB		;
	CALL 	DELAY		;
	MOVLW 	B'00001001'	;MAKE RB2&3 HIGH: ROTATE LEFT
	MOVWF 	PORTB		;
	CALL 	DELAY		;
	RETURN
;***BACKRIGHT ROUTINE****
BACKR	MOVLW 	B'00001010'	;MAKE RB1&3 HIGH: MOVE BACKWARD
	MOVWF 	PORTB		;
	CALL 	DELAY		;
	MOVLW 	B'00000110'	;MAKE RB2&3 HIGH: ROTATE RIGHT
	MOVWF 	PORTB		;
	CALL 	DELAY		;
	RETURN

DELAY	MOVLW 	H'EE'		;RESET ALL COUNTER VARIABLES
	MOVWF 	COUNT1		
	MOVLW 	H'99'	
	MOVWF 	COUNT2

LOOP1	CLRWDT			;RESET THE WATCHDOG TIMER
	DECFSZ 	COUNT1,1	;this is a delay loop    
	GOTO 	LOOP1		;tuned to make Cerberes 
	DECFSZ	COUNT2,1	;turn about 90 degrees
	GOTO	LOOP1	
	RETURN

	END;
I have looked through the codes but I dont have time to add in the needed codes for you. May be others can help you faster than me.

Allen
 
Last edited:

ErnieM

Joined Apr 24, 2011
8,377
Your link went bad. Could you post the schematic so I know where these two sensor are going?

(Why do I feel like I'm talking to a pair of spambots?)
 

Thread Starter

rn.ksheer

Joined May 16, 2012
8
After looking into the instructions set for 16f84a, i found ANDWF or ANDLW operand can be used where we can compare the two inputs. If both the inputs are low (both the sensors sense the object) a sub routine can be called to perform a operation but i am not able to find detailed examples in Google.
 

Markd77

Joined Sep 7, 2009
2,806
This might do it:

Rich (BB code):
;TJACO'S DESIGN GRAVEYARD: WWW.GEOCITIES.COM/TJACODESIGN        ;
;22 JULY 2002                                ;
;CERBERES : MINI ROBOT WITH IR EYES                      ;
;USES PIC16F84 µCONTROLLER                        ;
;WRITTEN IN MICROCHIP ASSEMBLY USE MPASM ASSEMBLER FROM MPLAB        ;
;MPLAB CAN BE DOWNLOADED FROM WWW.MICROCHIP.COM                ;

;***SET UP THE CONTANTS & VARIABLES****

       LIST            P=16F84A
       ERRORLEVEL      -302    ;SUPPRESS BANK SELECTION MESSAGES
        __config        0x3FFB

STATUS    EQU H'03'        ;STATUS REGISTER
TRISB     EQU H'86'        ;TRISB REGISTER FOR SETUP OF PORTB
PORTB     EQU H'06'        ;PORTB REGISTER TO DRIVE PORT B
COUNT1     EQU H'0C'        ;COUNT VARIABLE 1 IS IN GENERAL PURPOSE REG 08H
COUNT2     EQU H'0D'        ;COUNT VARIABLE 2 IS IN GENERAL PURPOSE REG 09H

;***SET UP PORT B IN & OUTPUT****
    BSF     STATUS,5    ;SWITCH TO BANK0 TO SET UP PORT B
    MOVLW     B'11110000'    ;RB7,6,5,4 IS INPUT
    MOVWF     TRISB        ;RB3,2,1,0 IS OUTPUT
    BCF     STATUS,5    ;SWITCH BACK TO BANK0 TO USE PORT B

;***MAIN PROGRAM****
START    MOVLW     B'00000101'    ;MAKE RB0&2 HIGH: MOVE FORWARD
    MOVWF     PORTB        ;
    MOVLW     H'FE'        ;RESET COUNT1 TO 254
    MOVWF     COUNT1        ;    
    MOVLW     H'FE'        ;RESET COUNT2 TO 254
    MOVWF     COUNT2        ;
    MOVF PORTB, W           ;put it in W register
    ANDLW b'01100000'       ;ignore bits apart from 5 and 6
    BTFSS STATUS, Z          ;(assuming sensor at low voltage means
 ;active) skip the "GOTO NEXT_TEST" instruction if result is zero.
    GOTO NEXT_TEST
;put code here for both sensors active
    GOTO START                ;don't do other checks
NEXT_TEST
    BTFSS     PORTB,5        ;CHECK RB5 (INPUT); IF IT IS LOW
    CALL     BACKL        ;THEN EXECUTE BACKLEFT ROUTINE
    BTFSS     PORTB,6        ;CHECK RB6 (INPUT); IF IT IS LOW
    CALL     BACKR        ;EXECUTE BACKRIGHT ROUTINE
    GOTO     START        ;RETURN TO LABEL START

;***BACKLEFT ROUTINE****
BACKL    MOVLW     B'00001010'    ;MAKE RB1&3 HIGH: MOVE BACKWARD
    MOVWF     PORTB        ;
    CALL     DELAY        ;
    MOVLW     B'00001001'    ;MAKE RB2&3 HIGH: ROTATE LEFT
    MOVWF     PORTB        ;
    CALL     DELAY        ;
    RETURN
;***BACKRIGHT ROUTINE****
BACKR    MOVLW     B'00001010'    ;MAKE RB1&3 HIGH: MOVE BACKWARD
    MOVWF     PORTB        ;
    CALL     DELAY        ;
    MOVLW     B'00000110'    ;MAKE RB2&3 HIGH: ROTATE RIGHT
    MOVWF     PORTB        ;
    CALL     DELAY        ;
    RETURN

DELAY    MOVLW     H'EE'        ;RESET ALL COUNTER VARIABLES
    MOVWF     COUNT1        
    MOVLW     H'99'    
    MOVWF     COUNT2

LOOP1    CLRWDT            ;RESET THE WATCHDOG TIMER
    DECFSZ     COUNT1,1    ;this is a delay loop    
    GOTO     LOOP1        ;tuned to make Cerberes 
    DECFSZ    COUNT2,1    ;turn about 90 degrees
    GOTO    LOOP1    
    RETURN

    END;
 

Thread Starter

rn.ksheer

Joined May 16, 2012
8
This might do it:

Rich (BB code):
;TJACO'S DESIGN GRAVEYARD: WWW.GEOCITIES.COM/TJACODESIGN        ;
;22 JULY 2002                                ;
;CERBERES : MINI ROBOT WITH IR EYES                      ;
;USES PIC16F84 µCONTROLLER                        ;
;WRITTEN IN MICROCHIP ASSEMBLY USE MPASM ASSEMBLER FROM MPLAB        ;
;MPLAB CAN BE DOWNLOADED FROM WWW.MICROCHIP.COM                ;

;***SET UP THE CONTANTS & VARIABLES****

       LIST            P=16F84A
       ERRORLEVEL      -302    ;SUPPRESS BANK SELECTION MESSAGES
        __config        0x3FFB

STATUS    EQU H'03'        ;STATUS REGISTER
TRISB     EQU H'86'        ;TRISB REGISTER FOR SETUP OF PORTB
PORTB     EQU H'06'        ;PORTB REGISTER TO DRIVE PORT B
COUNT1     EQU H'0C'        ;COUNT VARIABLE 1 IS IN GENERAL PURPOSE REG 08H
COUNT2     EQU H'0D'        ;COUNT VARIABLE 2 IS IN GENERAL PURPOSE REG 09H

;***SET UP PORT B IN & OUTPUT****
    BSF     STATUS,5    ;SWITCH TO BANK0 TO SET UP PORT B
    MOVLW     B'11110000'    ;RB7,6,5,4 IS INPUT
    MOVWF     TRISB        ;RB3,2,1,0 IS OUTPUT
    BCF     STATUS,5    ;SWITCH BACK TO BANK0 TO USE PORT B

;***MAIN PROGRAM****
START    MOVLW     B'00000101'    ;MAKE RB0&2 HIGH: MOVE FORWARD
    MOVWF     PORTB        ;
    MOVLW     H'FE'        ;RESET COUNT1 TO 254
    MOVWF     COUNT1        ;    
    MOVLW     H'FE'        ;RESET COUNT2 TO 254
    MOVWF     COUNT2        ;
    MOVF PORTB, W           ;put it in W register
    ANDLW b'01100000'       ;ignore bits apart from 5 and 6
    BTFSS STATUS, Z          ;(assuming sensor at low voltage means
 ;active) skip the "GOTO NEXT_TEST" instruction if result is zero.
    GOTO NEXT_TEST
;put code here for both sensors active
    GOTO START                ;don't do other checks
NEXT_TEST
    BTFSS     PORTB,5        ;CHECK RB5 (INPUT); IF IT IS LOW
    CALL     BACKL        ;THEN EXECUTE BACKLEFT ROUTINE
    BTFSS     PORTB,6        ;CHECK RB6 (INPUT); IF IT IS LOW
    CALL     BACKR        ;EXECUTE BACKRIGHT ROUTINE
    GOTO     START        ;RETURN TO LABEL START

;***BACKLEFT ROUTINE****
BACKL    MOVLW     B'00001010'    ;MAKE RB1&3 HIGH: MOVE BACKWARD
    MOVWF     PORTB        ;
    CALL     DELAY        ;
    MOVLW     B'00001001'    ;MAKE RB2&3 HIGH: ROTATE LEFT
    MOVWF     PORTB        ;
    CALL     DELAY        ;
    RETURN
;***BACKRIGHT ROUTINE****
BACKR    MOVLW     B'00001010'    ;MAKE RB1&3 HIGH: MOVE BACKWARD
    MOVWF     PORTB        ;
    CALL     DELAY        ;
    MOVLW     B'00000110'    ;MAKE RB2&3 HIGH: ROTATE RIGHT
    MOVWF     PORTB        ;
    CALL     DELAY        ;
    RETURN

DELAY    MOVLW     H'EE'        ;RESET ALL COUNTER VARIABLES
    MOVWF     COUNT1        
    MOVLW     H'99'    
    MOVWF     COUNT2

LOOP1    CLRWDT            ;RESET THE WATCHDOG TIMER
    DECFSZ     COUNT1,1    ;this is a delay loop    
    GOTO     LOOP1        ;tuned to make Cerberes 
    DECFSZ    COUNT2,1    ;turn about 90 degrees
    GOTO    LOOP1    
    RETURN

    END;
I have added the sub routine for both sensors active but when compiling in MPlab i am getting this error "Symbol not previously defined (Z)" .

Rich (BB code):
;***SET UP THE CONTANTS & VARIABLES****

       LIST            P=16F84A
       ERRORLEVEL      -302    ;SUPPRESS BANK SELECTION MESSAGES

STATUS    EQU H'03'        ;STATUS REGISTER
TRISB     EQU H'86'        ;TRISB REGISTER FOR SETUP OF PORTB
PORTB     EQU H'06'        ;PORTB REGISTER TO DRIVE PORT B
COUNT1     EQU H'0C'        ;COUNT VARIABLE 1 IS IN GENERAL PURPOSE REG 08H
COUNT2     EQU H'0D'        ;COUNT VARIABLE 2 IS IN GENERAL PURPOSE REG 09H

;***SET UP PORT B IN & OUTPUT****
    BSF     STATUS,5    ;SWITCH TO BANK0 TO SET UP PORT B
    MOVLW   B'11110000'    ;RB7,6,5,4 IS INPUT
    MOVWF   TRISB        ;RB3,2,1,0 IS OUTPUT
    BCF     STATUS,5    ;SWITCH BACK TO BANK0 TO USE PORT B

;***MAIN PROGRAM****
START    MOVLW     B'00000101'    ;MAKE RB0&2 HIGH: MOVE FORWARD
    MOVWF     PORTB        ;
    MOVLW     H'FE'        ;RESET COUNT1 TO 254
    MOVWF     COUNT1        ;    
    MOVLW     H'FE'        ;RESET COUNT2 TO 254
    MOVWF     COUNT2        ;
    MOVF PORTB, W           ;put it in W register
    ANDLW b'01100000'       ;ignore bits apart from 5 and 6
    BTFSS STATUS, Z          ;(assuming sensor at low voltage means
                             ;active) skip the "GOTO NEXT_TEST" instruction if result is zero.
    GOTO NEXT_TEST
    CALL     BTHACT          ;put code here for both sensors active
    GOTO START               ;don't do other checks
    
NEXT_TEST
    BTFSS    PORTB,5      ;CHECK RB5 (INPUT); IF IT IS LOW
    CALL     BACKL        ;THEN EXECUTE BACKLEFT ROUTINE
    BTFSS    PORTB,6     ;CHECK RB6 (INPUT); IF IT IS LOW
    CALL     BACKR        ;EXECUTE BACKRIGHT ROUTINE
    GOTO     START        ;RETURN TO LABEL START

;***BACKLEFT ROUTINE****
BACKL    MOVLW     B'00001010'    ;MAKE RB1&3 HIGH: MOVE BACKWARD
    MOVWF    PORTB        ;
    CALL     DELAY        ;
    MOVLW    B'00001001'    ;MAKE RB2&3 HIGH: ROTATE LEFT
    MOVWF    PORTB        ;
    CALL     DELAY        ;
    RETURN
    
;***BACKRIGHT ROUTINE****
BACKR    MOVLW     B'00001010'    ;MAKE RB1&3 HIGH: MOVE BACKWARD
    MOVWF    PORTB        ;
    CALL     DELAY        ;
    MOVLW    B'00000110'    ;MAKE RB2&3 HIGH: ROTATE RIGHT
    MOVWF    PORTB        ;
    CALL     DELAY        ;
    RETURN
    
;***BOTH ACTIVE****
BTHACT   MOVLW     B'00001010'    ;MAKE RB1&3 HIGH: MOVE BACKWARD
    MOVWF    PORTB        ;
    CALL     DELAY
    MOVLW    B'00000110'    ;MAKE RB2&3 HIGH: ROTATE RIGHT
    MOVWF    PORTB        ;
    CALL     DELAY        ;
    RETURN
    
DELAY    MOVLW     H'EE'        ;RESET ALL COUNTER VARIABLES
    MOVWF     COUNT1        
    MOVLW     H'99'    
    MOVWF     COUNT2

LOOP1    CLRWDT            ;RESET THE WATCHDOG TIMER
    DECFSZ   COUNT1,1    ;this is a delay loop    
    GOTO     LOOP1        ;tuned to make Cerberes 
    DECFSZ   COUNT2,1    ;turn about 90 degrees
    GOTO     LOOP1    
    RETURN

    END;
 
Last edited by a moderator:

takao21203

Joined Apr 28, 2012
3,702
16f84 is antiquated, and in no way appreciate for a robot.

You should at least use a 18F chip or better a 24F or PIC32.

If you use these antiquated chips, your thinking and problem solving remains chained to the limits of this chip.
 

Markd77

Joined Sep 7, 2009
2,806
Add this line:
#include <p16f84a.inc>
after the "LIST" line at the start. It includes definitions for things like PORTA, STATUS, and bits like Z, C.
The programmer hasn't done it, but it's easier to understand the code if you put:

DECF COUNT1, F
instead of
DECF COUNT1, 1

or
BTFSS STATUS, Z
instead of
BTFSS STATUS, 2

If you want to make the existing code easier to understand, you can make changes like that.
 

Markd77

Joined Sep 7, 2009
2,806
Good to see it working. I think I see it turn 180 degrees a few times, presumably that is when both sensors detect an object.
 
Top