From 99294453118e8d992716ab5a63b1bd1114bb74ec Mon Sep 17 00:00:00 2001 From: prot Date: Wed, 5 May 2004 07:10:46 +0000 Subject: *** empty log message *** --- 2004/n/mic799/half_dup.asm | 182 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 182 insertions(+) create mode 100644 2004/n/mic799/half_dup.asm (limited to '2004/n/mic799/half_dup.asm') diff --git a/2004/n/mic799/half_dup.asm b/2004/n/mic799/half_dup.asm new file mode 100644 index 0000000..4abac8e --- /dev/null +++ b/2004/n/mic799/half_dup.asm @@ -0,0 +1,182 @@ + LIST P = 16C54, n = 66 +; +;****************************************************************************** +; RS-232 Communication With PIC16C54 +; +; Half Duplex Asynchronous Communication +; +; This program has been tested at Bauds from 1200 to 19200 Baud +; ( @ 8,16,20 Mhz CLKIN ) +; +; As a test, this program will echo back the data that has been +; received. +; +; Program: HALF_DUP.ASM +; Revision Date: +; 1-13-97 Compatibility with MPASMWIN 1.40 +; +;****************************************************************************** +; + INCLUDE + +PIC54 equ 1FFH ; Define Reset Vector +Same equ 1 +MSB equ 7 + +;***************** Communication Parameters ************************** +; +X_MODE equ 1 ; If ( X_MODE==1) Then transmit LSB first +; if ( X_MODE==0) Then transmit MSB first ( CODEC like ) +R_MODE equ 1 ; If ( R_MODE==1) Then receive LSB first +; if ( X_MODE==0) Then receive MSB first ( CODEC like ) +X_Nbit equ 1 ; if (X_Nbit==1) # of data bits ( Transmission ) is 8 else 7 +R_Nbit equ 1 ; if (R_Nbit==1) # of data bits ( Reception ) is 8 else 7 +; +Sbit2 equ 0 ; if Sbit2 = 0 then 1 Stop Bit else 2 Stop Bits +; +;************************************************************************* +X_flag equ PA0 ; Bit 5 of F3 ( PA0 ) +R_flag equ PA1 ; Bit 6 of F3 ( PA1 ) +; +DX equ 0 ; Transmit Pin ( Bit 0 of Port A ) +DR equ 1 ; Reciive Pin ( Bit 1 of Port A ) +; +; +BAUD_1 equ .68 ; 3+3X = CLKOUT/Baud +BAUD_2 equ .67 ; 6+3X = CLKOUT/Baud +BAUD_3 equ .34 ; 3+3X = 0.5*CLKOUT/Baud +BAUD_4 equ .86 ; 3+3X = 1.25*CLKOUT/Baud +BAUD_X equ .66 ; 11+3X = CLKOUT/Baud +BAUD_Y equ .66 ; 9 +3X = CLKOUT/Baud +; +;************************ Data RAM Assignments ********************** +; + ORG 08H ; Dummy Origin +; +RcvReg RES 1 ; Data received +XmtReg RES 1 ; Data to be transmitted +Count RES 1 ; Counter for #of Bits Transmitted +DlyCnt RES 1 +;*********************************************************************** +; + ORG 0 +; +Talk clrf RcvReg ; Clear all bits of RcvReg + btfsc PORTA,DR ; check for a Start Bit + goto User ; delay for 104/2 uS + call Delay4 ; delay for 104+104/4 +;*************************************************************** +; Receiver +; +Rcvr + IF R_Nbit + movlw 8 ; 8 Data bits + ELSE + movlw 7 ; 7 data bits + ENDIF +; + movwf Count +R_next bcf STATUS,C + IF R_MODE + rrf RcvReg,Same ; to set if MSB first or LSB first + ELSE + rlf RcvReg,Same + ENDIF + btfsc PORTA,DR +; + IF R_MODE + IF R_Nbit + bsf RcvReg,MSB ; Conditional Assembly + ELSE + bsf RcvReg,MSB-1 + ENDIF + ELSE + bsf RcvReg,LSB + ENDIF +; + call DelayY + decfsz Count,Same + goto R_next +;**************************************************** +R_over movf RcvReg,0 ; Send back What is Just Received + movwf XmtReg +;**************************************************** +; Transmitter +; +Xmtr + IF X_Nbit + movlw 8 + ELSE + movlw 7 + ENDIF + movwf Count +; + IF X_MODE + ELSE + IF X_Nbit + ELSE + rlf XmtReg,Same + ENDIF + ENDIF +; + bcf PORTA,DX ; Send Start Bit + call Delay1 +X_next bcf STATUS,C +; + IF X_MODE + rrf XmtReg,Same ; Conditional Assembly + ELSE ; to set if MSB first or LSB first + rlf XmtReg,Same + ENDIF +; + btfsc STATUS,C + bsf PORTA,DX + btfss STATUS,C + bcf PORTA,DX + call DelayX + decfsz Count,Same + goto X_next + bsf PORTA,DX ; Send Stop Bit + call Delay1 +; + IF Sbit2 + bsf PORTA,DX + call Delay1 + ENDIF +; + goto Talk ; Back To Reception & Transmision +; +; End of Transmission +; +DelayY movlw BAUD_Y + goto save +DelayX movlw BAUD_X + goto save +Delay4 movlw BAUD_4 + goto save +Delay1 movlw BAUD_1 ; 104 uS for 9600 baud + goto save +Delay2 movlw BAUD_2 +save movwf DlyCnt +redo_1 decfsz DlyCnt,Same + goto redo_1 + retlw 0 +; +main movlw 0EH ; Bit 0 of Port A is Output + tris PORTA ; Set PORTA.0 as output ( DX ) + bsf PORTA,DR +; + goto Talk +; +; +User movlw BAUD_3 + movwf DlyCnt +redo_2 decfsz DlyCnt,Same + goto redo_2 + goto Talk ; Loop Until Start Bit Found +; +; + ORG PIC54 + goto main +; + END -- cgit v1.2.3