PIC16F690 code help please
+ Reply to Thread
Results 1 to 2 of 2
  1. #1
    hysteria92's Avatar
    hysteria92 Guest

    Exclamation PIC16F690 code help please

    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:

    Code:
    #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...

  2. #2
    Join Date
    Feb 2006
    Location
    Gilroy, CA
    Posts
    1,530

    Default

    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.
    Last edited by ScaleRobotics; - 24th February 2010 at 16:31.

Similar Threads

  1. Replies: 1
    Last Post: - 19th February 2009, 13:35
  2. How much code space do PBP statements use.
    By Darrel Taylor in forum Code Examples
    Replies: 5
    Last Post: - 13th February 2009, 21:31
  3. Replies: 0
    Last Post: - 13th February 2009, 03:34
  4. Loop with two motor and 2 sensors
    By MrRoboto in forum mel PIC BASIC
    Replies: 4
    Last Post: - 8th December 2008, 23:40
  5. Making Program Code Space your playground...
    By Melanie in forum Code Examples
    Replies: 15
    Last Post: - 19th July 2008, 08:26

Members who have read this thread : 0

You do not have permission to view the list of names.

Tags for this Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts