PDA

View Full Version : PIC16F690 code help please



hysteria92
- 24th February 2010, 15:49
hi,
im using the PIC16F690 and PICkit 2 programmer, my aim is to make a wifi controlled car by using serial communication with a router, which the PIC will then interpret and use to control the car. I have got a program for a PIC16F628A from the internet (used for the same project), and have been trying to modify it for the PIC16F690. Just wondered if anyone would take a look at the program for me and tell me if theres anywhere ive gone wrong? Since i don't seem to be able to get it to work.

here's the code i have at the moment:



#define DEBUG 0
greenLED equ b'00010000'
redLED equ b'01000000'


right equ b'00001000'
left equ b'00000100'
back equ b'00000010'
forward equ b'00000001'


LIST P=16F690, R=DEC ; Use the pic16f690 and decimal system
#include <p16F690.inc>
__config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF)

CBLOCK 0x20 ; Declare variable addresses starting at 0x20
dataL
in_char
temp
d1
d2
ENDC

ORG 0x000 ; Program starts at 0x000

;
; --------------------------------
; set ANALOG/DIGITAL INPUTS PORT A
; --------------------------------
;
cm1con0=0 ; Comparator 1 disabled
cm2con0=0 ; Comparator 2 disabled
ansel=0 ; Pins to be Digital
anselh=0 ; Pins to be Digital
;
; ----------------
; INITIALIZE PORTS
; ----------------
;
movlw b'00000000' ; set up portC
movwf PORTC

movlw b'10000000' ; RB7(TX)=1 others are 0
movwf PORTB

bsf STATUS,RP0 ; RAM PAGE 1

movlw 0x00
movwf TRISC ; portC all pins output

movlw b'00100000' ; RB5(RX)=input, others output
movwf TRISB

; ------------------------------------
; set BAUD RATE TO COMMUNICATE WITH PC
; ------------------------------------
; Boot Baud Rate = 9600, No Parity, 1 Stop Bit
;
movlw 0x19 ; 0x19=9600 bps (0x0C=19200 bps)
movwf SPBRG
movlw b'00100100' ; brgh = high (2)
movwf TXSTA ; enable Async Transmission, set brgh

bcf STATUS,RP0 ; RAM PAGE 0

movlw b'10010000' ; enable Async Reception
movwf RCSTA
;
; ------------------------------------
; PROVIDE A setTLING TIME FOR START UP
; ------------------------------------
;
clrf dataL
settle: decfsz dataL,F
goto settle

movf RCREG,W
movf RCREG,W
movf RCREG,W ; flush receive buffer

;
; ---------
; MAIN LOOP
; ---------
;
clrf PORTC
movlw redLED
movwf PORTB

call message ; prints out a message if DEBUG is 1
call check_init ; wait for INIT message from WRT54GL
bsf PORTB,7
loop: call receive_delay ; wait for a char
call add_green ;set greenLED on
call process_input ;make sure that forward and backward aren't both high! or that greenLED and redLED aren't both high! or that left and right aren't both high!
call send ; send the char
goto loop

process_input:
; Make sure that Forward & Backward cannot be ON at the same time
; Make sure that Left & Right cannot be ON at the same time
; Output result to PORTB

MOVWF temp
BTFSC temp,0 ;//Execute next line if temp,0 is HIGH
BCF temp,1
BTFSC temp,2 ;//Execute next line if temp,2 is HIGH
BCF temp,3
BTFSC temp,6 ;//Execute next line if temp,6 is HIGH
BCF temp,7
MOVF temp,0
andlw b'00001111'
movwf PORTA
movf temp,0
andlw b'11110000'
movwf PORTB
movf temp,0
return

add_green:
movwf temp
btfss temp,7 ;If greenLED is LOW execute next line
bsf temp,7
movf temp,0
return

;
; -------------------------------------------
; RECEIVE CHARACTER FROM RS232 AND STORE IN W
; -------------------------------------------
; This routine does not return until a character is received.
;
receive:
btfss PIR1,RCIF ; (5) check for received data
goto receive

data_received:
movf RCREG,W ; save received data in W
return


check_init:
; waits to receive 'jbpro' from the router meaning that the software is up and ;running after the message is received, the greenLED is turned on and ;microcontroller can drive the car
call receive_delay
sublw 'j'
btfss STATUS, Z
goto check_init
call receive_delay
sublw 'b'
btfss STATUS, Z
goto check_init
call receive_delay
sublw 'p'
btfss STATUS, Z
goto check_init
call receive_delay
sublw 'r'
btfss STATUS, Z
goto check_init
call receive_delay
sublw 'o'
btfss STATUS, Z
goto check_init

#if DEBUG
;prints message and goes in to an endless loop of flashing greenLED
call message

Loop:
movlw greenLED
movlw 0xff
movwf PORTA ;set all bits on
call Delay ;this waits for a while!
movlw 0x00
movwf PORTA
call Delay
goto Loop ;go back and do it again
#endif

return


receive_delay:
;299993 cycles
movlw 0x5E
movwf d1
movlw 0xEB
movwf d2
delay_0:
btfsc PIR1,RCIF ;check for serial data
goto got_data ;if we do, goto got_data!
decfsz d1, f
goto $+2
decfsz d2, f
goto delay_0
movlw 0x00
return

got_data:
;move data in to W

btfsc PIR1,RCIF
movf RCREG,W
return

#if DEBUG
Delay:
movlw d'250' ;delay 250 ms (4 MHz clock)
movwf temp
d11:
movlw 0xC7
movwf d1
movlw 0x01
movwf d2
Delay_0:
decfsz d1, f
goto $+2
decfsz d2, f
goto Delay_0

decfsz temp, f
goto d11
retlw 0x00
#endif

;
; -------------------------------------------------------------
; SEND CHARACTER IN W VIA RS232 AND WAIT UNTIL FINISHED SENDING
; -------------------------------------------------------------
;
send:
#if DEBUG
movwf TXREG ; send data in W

TransWt:
bsf STATUS,RP0 ; RAM PAGE 1
WtHere: btfss TXSTA,TRMT ; (1) transmission is complete if hi
goto WtHere
bcf STATUS,RP0 ; RAM PAGE 0
#endif
return
;
; -------
; MESSAGE
; -------
;
message
#if DEBUG
movlw '1'
call send
movlw '6'
call send
movlw 'F'
call send
movlw '6'
call send
movlw '2'
call send
movlw '8'
call send
movlw ' '
call send
movlw 'a'
call send
movlw 'l'
call send
movlw 'i'
call send
movlw 'v'
call send
movlw 'e'
call send
movlw 0x0D ; CR
call send
movlw 0x0A ; LF
call send
#endif
return

.END

Any help would be greatly appreciated...

ScaleRobotics
- 24th February 2010, 16:17
It seems like you would need to set the OSCCON register, to tell it what speed you want the internal oscillator to run at.

Edit: That's not it. Page 53 of the data sheet says it automatically is set for 4mhz, which looks right for you.