PIC16F690 code help please


Closed Thread
Results 1 to 2 of 2

Hybrid View

  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


    Did you find this post helpful? Yes | No

    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 17:31.

Similar Threads

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

Members who have read this thread : 1

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