Programming C, C++, Java, PHP, Ruby, Turing, VB
Computer Science Canada 
Programming C, C++, Java, PHP, Ruby, Turing, VB  

Username:   Password: 
 RegisterRegister   
 Help on Assembler Code for Robot
Index -> General Programming
View previous topic Printable versionDownload TopicSubscribe to this topicPrivate MessagesRefresh page View next topic
Author Message
molten_rock01




PostPosted: Wed May 24, 2006 10:01 pm   Post subject: Help on Assembler Code for Robot

Hi. I am currently working on building a robot which follows a wall. For this, I am using two limit switches, which when turned on, make the robot reverse and change direction. So far, I've only gotten the robot to move forward, but the limit switches do not work. The following code is in Assembler and I am using Microchip's P16F684 PIC.

Could you please check over this code and give me a hint why the limit switches may not be working? Thank you.

title "asmWall"
;
; Robot moves forward until a signal is received from the input switch.
; When a signal from the right input switch is received, the robot reverses direction
; for 2 seconds and then turns left for 2 seconds.
; When a signal from the left input switch is received, the robot reverses direction
; for 2 seconds and then turns right for 2 seconds.
;
; Hardware Notes:
; -P16F684 running at 4MHz
; -RC0:RC1 : right motor
; -RC2:RC3 : left motor
; -RA0 : left input switch
; -RA1 : right input switch
;
; Author
; May 22, 2006
;--------------------------------------------------------------------------
; Setup
LIST R=DEC
INCLUDE "p16f684.inc"

__CONFIG _FCMEN_OFF & _IESO_OFF & _BOD_OFF & _CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTOSCIO

; Variables
CBLOCK 0x20 ;Variable Declaration

DlayValue:2 ;Requires 24 Bit Counter (w/ WREG)

ENDC

Dlay Macro Cycles
variable CyclesLeft ;Keep Track of Remaining Cycles

variable LargeNum
CyclesLeft = Cycles
local LongLoop

if Cycles > 0x04FFFF0 ;Can't Handle > 83 Seconds (@ 4 MHz)

error "Required Delay is longer than 'Dlay' Macro can support"
endif
if Cycles > 327681 ;Need Large Loop?
LargeNum = CyclesLeft / 327681
movlw LargeNum
movwf DlayValue + 2 ;Calculate Number of Loops

LongLoop: ;Repeat for Each Loop

clrf DlayValue + 1 ;Do Maximum Possible Loop Count

clrf DlayValue
decf DlayValue, f
btfsc STATUS, Z
decfsz DlayValue + 1, f
goto $ - 3
decfsz DlayValue + 2, f ;Repeat Loop
goto LongLoop
CyclesLeft = CyclesLeft - ((LargeNum * 327681) + 1 + (LargeNum * 3))
endif ;Need Large Loop
if Cycles > 14 ;Will a Loop be Required?

movlw HIGH (((CyclesLeft - 3)/ 5) + 256)
movwf DlayValue + 1
movlw LOW (((CyclesLeft - 3)/ 5) + 256)
movwf DlayValue
decf DlayValue, f ;5 Cycle Constant Delay Loop

btfsc STATUS, Z
decfsz DlayValue + 1, f
goto $ - 3
CyclesLeft = CyclesLeft - (3 + (5 * ((CyclesLeft - 3)/ 5)))
endif ;Finished with Loop Code
while CyclesLeft >= 2 ;Put in 2 Instruction Cycle Delays

goto $ + 1
CyclesLeft = CyclesLeft - 2
endw
if CyclesLeft == 1 ;Put in the Last Required Cycle

nop
endif
endm

; --------------------------------------------------------------------------
PAGE
org 0

movlw 7 ; turn off comparators
movwf CMCON0

bsf STATUS, RP0 ; all ports are digital
clrf ANSEL ^ 0x080

clrf TRISC ^ 0x080 ; teach all of PORTC to be outputs
movlw b'0011' ; teach RA0 and RA1 to be inputs
movwf TRISA
bcf STATUS, RP0

loop: ; robot moves forward

; move robot forward
movlw b'1010'
movwf PORTC

btfss PORTA, 0
btfss PORTA, 1
call SubLSwitch

btfss PORTA, 1
goto loop
call SubRSwitch

goto loop

goto $


; --------------------------------------------------------------------------
PAGE
; Subroutines

SubLSwitch:

movlw b'0101' ; reverse for 2 seconds
movwf PORTC
Dlay 2000000

movlw b'1001' ; turn right for 2 seconds
movwf PORTC
Dlay 2000000
return

SubRSwitch:

movlw b'0101' ; reverse for 2 seconds
movwf PORTC
Dlay 2000000

movlw b'0110' ; turn left for 2 seconds
movwf PORTC
Dlay 2000000
return

end
Sponsor
Sponsor
Sponsor
sponsor
wtd




PostPosted: Wed May 24, 2006 10:56 pm   Post subject: (No subject)

Unfortunately I don't think I can offer much help, but is that PowerPC assembly?
Guest




PostPosted: Tue May 30, 2006 7:28 pm   Post subject: (No subject)

Try to use code taggings please =)
Display posts from previous:   
   Index -> General Programming
View previous topic Tell A FriendPrintable versionDownload TopicSubscribe to this topicPrivate MessagesRefresh page View next topic

Page 1 of 1  [ 3 Posts ]
Jump to:   


Style:  
Search: