;********************************************************************** ; ; Filename: PICrs232.asm ; Date: 1-15-05 ; File Version: 1 ; Author: j baumeister ; Company: himself ; ; ;********************************************************************** ; ; Files required ; 12F675.lkr ; ;********************************************************************** ; ; Notes: This is the basic RS 232 serial communication program ; It uses two subroutines, one for transmitting and one for ; receiving. The "test" program listed under "Main" echoes back ; the byte that it receives * ; Pin 3 is the output. Pin 5 the input It uses a visual basic ; program (vBasic_simple_Interface) running on a the PC to test the application ;********************************************************************** list p=12f675 ; list directive to define processor #include ; processor specific variable definitions errorlevel -302 ; suppress message 302 from list file __CONFIG _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT ; '__CONFIG' directive is used to embed configuration word within .asm file. ; The labels following the directive are located in the respective .inc file. ; See data sheet for additional information on configuration word settings. ; Reset Vector ;******************************************************************** ORG 0x000 ; processor reset vector nop ; Inserted For ICD2 Use goto Init ; go to beginning of program ;***** Assign Constants Value *************************************** #define BANK1 banksel 0x80 ;Select Bank1 #define BANK0 banksel 0x00 ;Select Bank0 #define serial_in GPIO,2 ;serial data in #define serial_out GPIO,4 ;serial data out #define bit_K h'DA' ; hex DA = 1200 bits/sec (218) ; hex 6b = 2400 bits/sec (107) ; hex 32 = 4800 bits/sec (50) ; hex 17 = 9600 bits/sec (23) ; hex 0A =19200 bits/sec (10) #define half_bit bit_K/2 ;****** Reserve Space for Variables (file registers) ******************** org 0x20 ; start at memory location Hex 20 ; assign 1, 8 bit byte of memory to each count res 1 ; used to adjust the delay time rcv_byte res 1 ; the received byte delay_cntr res 1 ; counter for serial delay routine bit_cntr res 1 ; number of transmitted bits xmt_byte res 1 ; the transmitted byte Display res 1 ; the variable that carries the byte to be ; transmitted to the RS-232 subroutine for ; transmission ;********************************************************************** Init BANK1 ;Switch to Bank1 call 0x3FF ; retrieve factory calibration value movwf OSCCAL ; update register with factory cal value movlw B'11011111' ;set internal clock(bit5=0) movwf OPTION_REG clrf VRCON ;Vref Off (power off the comparator voltage, saves power) clrf ANSEL movlw B'11001101' ; pin 4,5,7 are inputs and pins 2,3,6 are outputs movwf TRISIO ;Tri-State pins 4,5,7 .... 2,3,& 6 are outputs BANK0 ;BANK 0 clrf GPIO ;Clear Port movlw 0x07 movwf CMCON ;Comparator Off ;******************************************************************* ; this is the "Main" program which in this example is set to receive and re-transmit ; a byte sent from the computers serial port Main call Receive232 ; receive the byte sent from the computer movf rcv_byte,0 ; move the received byte to W register movwf xmt_byte ; varable used by the xmit subroutine ; contains the byte to be transmitted call xmit232 ; calls the transmit subroutine goto Main ; do it again ;********************************subroutines *********************** ;******************************************************************* xmit232 ; RS-232C serial out. the byte in file register ; xmt_bute will transmit again movlw h'08' movwf bit_cntr bsf serial_out ;bsf for direct connection ;bcf for standard connection call bit_delay xmit rrf xmt_byte,1 btfsc STATUS,0 ;btfsc STATUS,0 for direct connection ;btfss STATUS,0 for standard connection bcf serial_out btfss STATUS,0 ;btfss STATUS,0 for direct connection ;btfsc STATUS,0 for standard connection bsf serial_out call bit_delay decfsz bit_cntr,1 goto xmit bcf serial_out ;bcf for direct connection ;bsf for standard connection call bit_delay return bit_delay movlw bit_K movwf delay_cntr loop nop decfsz delay_cntr,1 goto loop return ;******************* Receive RS-232 data ******************************* Receive232 nop start_bit btfss serial_in ;btfss if connected via 22K resistor ;btfsc if standard connection goto start_bit call start_delay btfss serial_in ;btfss if connect via 22k resistor ; btfsc if standard connection goto start_bit movlw h'08' movwf bit_cntr clrf rcv_byte receive call bit_delay_R btfsc serial_in ;btfsc if connect via 22k resistor ;btfss if standard connection bcf STATUS,0 btfss serial_in ;btfss if connect via 22k resistor ;btfsc if standard connection bsf STATUS,0 rrf rcv_byte,1 decfsz bit_cntr,1 goto receive call bit_delay_R return bit_delay_R movlw bit_K movwf delay_cntr loop_R nop decfsz delay_cntr,1 goto loop_R return start_delay movlw half_bit movwf delay_cntr loop_R2 nop decfsz delay_cntr,1 goto loop_R2 return END ; directive 'end of program'