; File: PCA_Rxd2.A51 Date: 04/18/94 ; ; /* (c) Copyright BLUE EARTH RESEARCH, MANKATO, MN 1994. */ ; /* All rights reserved. */ ; ; ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ; º º ; º PCA SECOND SERIAL PORT RECEIVE ONLY ROUTINE º ; º º ; ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ; PROGRAM ADAPTED FROM MCS(R)-51 REFERENCE MANUAL PAGE 6-63 ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ; ³ BLUE EARTH RESEARCH ³ ; ³ MANKATO, MN 56001 ³ ; ³ Author: Tom Hiniker ³ ; ³ Revised 7/10/92 by Tom Bachmann ³ ; ³ Revised 4/18/94 by Tom Bachmann ³ ; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ $ TITLE (SECOND SERIAL PORT RECEIVE USING PCA) $ DATE (04/18/94) NOGEN $ XREF DEBUG ERRORPRINT $ PAGELENGTH (60) PAGEWIDTH (110) ; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ; ³ EXAMPLE BASIC PROGRAM ³ ; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ; I connected the second serial port Rxd line on the Micro-440 and used the ; following BASIC program to check out operation of this assembly language ; program. Characters entered on the keyboard are stored in a circular buffer ; located at 5000H and echoed back to the console. ; REM INITIALIZE INTERRUPT ; 10 CALL 7800H ; REM WAIT FOR CHARACTER TO BE RECEIVED ; 20 DO : A=DBY(18H) : UNTIL A ; REM CLEAR OUT RECEIVED CHARACTER ; 30 DBY(18H)=0 ; REM ECHO CHARACTER TO PRIMARY SERIAL PORT AND LOOP ; 40 PRINT CHR$(A) : GOTO 20 $ EJECT ; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ; ³ SYMBOL DEFINITIONS ³ ; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ; Register Declarations for the 8xC51FA/FB Processors ; ; BYTE Registers CCON DATA 0D8H CMOD DATA 0D9H CCAPM3 DATA 0DDH CL DATA 0E9H CCAP3L DATA 0EDH CH DATA 0F9H CCAP3H DATA 0FDH ; BIT Registers ; CCON CR BIT 0DEH CCF3 BIT 0DBH DSEG AT 18H RecvSBUF: DS 1 ; Software Receive SBUF BitCounter: DS 1 ; Counter for receiving bits RecvTemp: DS 1 BuffPoint: DS 1 ; Buffer location pointer BSEG AT 0 StartBit: DBIT 1 ; Receive Flags DoneBit: DBIT 1 PCAAddress EQU 4033H ; PCA Interrupt Vector NegEdge EQU 011H SoftTimer EQU 049H ; NOTE: The serial port Baud Rate can be changed by editing the following ; program variable and then assembling the source file. Baud EQU 24 ; Baud Rate in 00's (2400) FullBitTime EQU 10000/Baud ; 417uS is the bit period HalfBitTime EQU FullBitTime/2 ; for 2400 baud. (12 Mhz) $ EJECT ; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ; ³ EXTERNAL DATA SEGMENT ³ ; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ XSEG AT 5000H ; This memory page is used to accumulate the characters received on P1.6. RecvBuffer: DS 256 ; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ; ³ CODE SEGMENT ³ ; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ CSEG AT 7800H MOV DPTR,#PCAAddress ; Stuff "LJMP PCAINT" into MOV A,#2 ; mirrored PCA interrupt MOVX @DPTR,A ; vector at address 4033H. INC DPTR MOV A,#HIGH PCAINT ; Location of PCA MOVX @DPTR,A ; interrupt routine. INC DPTR MOV A,#LOW PCAINT MOVX @DPTR,A ; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ; ³ INITIALIZE RECEIVE MODE ³ ; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ CLR StartBit CLR DoneBit MOV BuffPoint,#0 MOV RecvTemp,#0 MOV RecvSBUF,#0 ; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ; ³ INITIALIZE CPU FUNCTIONS ³ ; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ MOV CL,#0 ; CLEAR PCA TIMER REGISTERS MOV CH,#0 ; ÚÄÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄ¿ ; IE = ³ EA ³ EC ³ ET2 ³ ES ³ ET1 ³ EX1 ³ ET0 ³ EX0 ³ ; ÀÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÙ ; 1 1 0 0 0 0 0 0 MOV IE,#0C0H ; ÚÄÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄ¿ ; CCAPM = ³ -- ³ ECOM ³ CAPP ³ CAPN ³ MAT ³ TOG ³ PWM ³ ECCF ³ ; ÀÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÙ ; Module 3 -> 0 0 0 1 0 0 0 1 ; Module 4 -> 0 1 0 0 1 0 0 1 MOV CCAPM3,#NegEdge ; ÚÄÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄ¿ ; CMOD = ³ CIDL ³ WDTE ³ -- ³ -- ³ -- ³ CPS1 ³ CPS0 ³ ECF ³ ; ÀÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÙ ; 0 0 0 0 0 0 0 0 MOV CMOD,#0 ; ÚÄÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄ¿ ; CCON = ³ CF ³ CR ³ -- ³ CCF4 ³ CCF3 ³ CCF2 ³ CCF1 ³ CCF0 ³ ; ÀÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÙ ; 0 1 0 0 0 0 0 0 MOV CCON,#40H RET ; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ; ³ PCA INTERRUPT ³ ; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ PCAINT: JBC CCF3,ReceiveInt ; Check for receive Interrupt RETI ; Not a valid Interrupt ; ---------------------------- RECEIVE INTERRUPT ------------------------------ ReceiveInt: PUSH ACC PUSH PSW ReceiveNow: MOV A,CCAPM3 ANL A,#7FH CJNE A,#NegEdge,CheckStart MOV A,#LOW HalfBitTime ; Setup for next PCA int. ADD A,CCAP3L MOV CCAP3L,A MOV A,#HIGH HalfBitTime ADDC A,CCAP3H MOV CCAP3H,A MOV CCAPM3,#SoftTimer POP PSW POP ACC RETI CheckStart: CJNE A,#SoftTimer,Error JB StartBit,DecrBitCtr JB P1.6,Error SETB StartBit MOV BitCounter,#9 SetUpFull: MOV A,#LOW FullBitTime ; Setup for next PCA int. ADD A,CCAP3L MOV CCAP3L,A MOV A,#HIGH FullBitTime ADDC A,CCAP3H MOV CCAP3H,A POP PSW POP ACC RETI $ EJECT DecrBitCtr: DJNZ BitCounter,RotateBit CheckStop: JNB P1.6,Error CLR StartBit MOV CCAPM3,#NegEdge SETB DoneBit MOV RecvSBUF,RecvTemp ; Got the character! PUSH DPH ; Save DPTR PUSH DPL MOV DPH,#HIGH RecvBuffer ; Store received character MOV DPL,BuffPoint ; in next buffer location. MOV A,RecvTemp MOVX @DPTR,A POP DPL POP DPH ; Restore DPTR INC BuffPoint ; Increment buffer pointer POP PSW POP ACC RETI RotateBit: MOV C,P1.6 ; Shift in next data bit. MOV A,RecvTemp RRC A MOV RecvTemp,A SJMP SetUpFull Error: MOV CCAPM3,#NegEdge ; Receive error. CLR StartBit POP PSW POP ACC RETI END ; Following is the HEX file derived from the assembled source ; file. This can be used for directly loading the program via ; MONITOR-51 and almost any terminal program. :107800009040337402F0A37478F0A3742EF0C20099 :10781000C201751B00751A0075180075E90075F92D :107820000075A8C075DD1175D90075D8402210DB30 :107830000132C0E0C0D0E5DD547FB4111474D0250E :10784000EDF5ED740035FDF5FD75DD49D0D0D0E0E6 :1078500032B4494D200019209647D2007519097499 :10786000A025EDF5ED740135FDF5FDD0D0D0E03269 :10787000D5192530962BC20075DD11D201851A1855 :10788000C083C082758350851B82E51AF0D082D0F8 :1078900083051BD0D0D0E032A296E51A13F51A80EA :0B78A000BE75DD11C200D0D0D0E03278 :00000001FF