📄 linmac.lst
字号:
687
688
689 ;#############################################################################
690 ;# UART Tx-routine #
691 ;#############################################################################
692 INTUARTTX:
0103 C0E0 693 PUSH ACC
0105 C0D0 694 PUSH PSW
695
0107 43D018 696 ORL PSW,#18H; : regbank 3
010A C299 697 CLR TI
698
010C E521 699 MOV A,LINSTATE
010E B4070A 700 CJNE A,#07H,_TXRETI ;test Flags
701
0111 D20C 702 SETB LINTXDATA; this Bit indicates, that the node is tranmitting data
703 ;send the first data byte
0113 7400 F 704 MOV A,#LINDATA
0115 2E 705 ADD A,R6; _ByteLeft
0116 F9 706 MOV R1,A
0117 8799 707 MOV SBUF,@R1; send the first Databyte
0119 871B 708 MOV _LINLASTSENT,@R1
709
710 _TXRETI:
011B D0D0 711 POP PSW
011D D0E0 712 POP ACC
011F 32 713 RETI
714
715
716 $IF (_HW_SYNC_COUNTER)
717 ;####################################################################################
718 ;# Timer1 ISR #
719 ;####################################################################################
720 INTTIMER1:
0120 C0D0 721 PUSH PSW
722
0122 43D018 723 ORL PSW,#18H; ; use Registerbank 3
724
0125 B28C 725 CPL TR0 ;enable/disable timer0 for bittiming evaluation
0127 C28F 726 CLR TF1
0129 C28E 727 CLR TR1 ; stop counter
012B 308C0B 728 JNB TR0,_LOADNEWBAUDVAL
729 ;start of counter
012E 758DFF 730 MOV TH1,#0FFH ;preload counter
0131 758BFC 731 MOV TL1,#0FCH
0134 D28E 732 SETB TR1 ;start counter
733
0136 D0D0 734 POP PSW
0138 32 735 RETI
736 $ENDIF
737
738 $IF (_SW_SYNC_COUNTER)
;######################################################################################
;# external Int1 ISR #
;######################################################################################
INTEXT1:
PUSH PSW
ORL PSW,#18H; ; use Registerbank 3
SETB TR0
DJNZ R4,_COUNTING ; R4 in Registerbak 2 is _SyncEdgeCount
CLR TR0
CLR EX1 ; disable external int
SJMP _LOADNEWBAUDVAL
_COUNTING:
POP PSW
RETI
$ENDIF
755
756 ;****************************
757 ;calculating and loading the new
758 ;baudrate. Same function for HW or SW counter
759 _LOADNEWBAUDVAL:
0139 C0E0 760 PUSH ACC
013B C0F0 761 PUSH B
762
763 ;calculating the new baudrategenerator reload value from TH0 and TL0
764 ;the formular is:
765 ;THL0/4 with round on the last bit
013D 858CF0 766 MOV B,TH0
0140 E58A 767 MOV A,TL0
0142 7802 768 MOV R0,#2
769
770 _DIV_2_16:
0144 C5F0 771 XCH A,B ; divide 16bit-value by 2
0146 C3 772 CLR C
0147 13 773 RRC A ; High-byte
0148 C5F0 774 XCH A,B
014A 13 775 RRC A ; Low-byte
014B D8F7 776 DJNZ R0,_DIV_2_16 ; 2 times to divide by 4
777
014D 5005 778 JNC _NO_ROUND_UP ; test if the result has to be round up
014F 04 779 INC A ; round up
0150 7002 780 JNZ _NO_HIGH_INC ; test if high-byte also needs to be increased due to the round up
0152 05F0 781 INC B
782
783 _NO_HIGH_INC:
784 _NO_ROUND_UP:
785 ;flush the UART-buffer, so that the next falling edge is interpreted as Start of the Startbit
0154 75BD02 786 MOV BRGCON,#2 ; stop the generator
0157 C2AC 787 CLR ESR ; disable receive-int
0159 75BF00 788 MOV BRGR1,#0 ; maximum baudrate
015C 75BE00 789 MOV BRGR0,#0
015F 75BD03 790 MOV BRGCON,#3 ;enable baudrategenerator
0162 C298 791 CLR RI
0164 3098FD 792 JNB RI,$ ;wait for next receive-int
793 ;load the calculated value into the baudrategenerator
0167 75BD02 794 MOV BRGCON,#2 ;disable baudrategenerator
016A 85F0BF 795 MOV BRGR1,B ; load high byte
016D F5BE 796 MOV BRGR0,A ; load low byte
016F 75BD03 797 MOV BRGCON,#3 ; start generator again
798
0172 D209 799 SETB LINSYNCED
0174 D0F0 800 POP B
0176 0100 F 801 AJMP _EVENTRETURN ; this Symbol can be found in the Rx-ISR. A little bit cruel to jump into another
802 ; ISR, but at least it safes some byte.
803
804 ;############################################################################
805 ;# Initialisation Routine #
806 ;############################################################################
807 INITLINMAC:
808 ; reset all Flags
0178 752100 809 MOV LINSTATE,#0
017B 752200 810 MOV LINERROR,#0
811 ;Initialise Baudrategenerator for default baudrate
017E 75BD02 812 MOV BRGCON,#2
0181 75BE80 813 MOV BRGR0 , # 128
0184 75BF01 814 MOV BRGR1 , # 1
815 ; put UART to 8-bit mode
0187 5387BF 816 ANL PCON,#0BFH
018A 759850 817 MOV SCON,#050H
018D 438740 818 ORL PCON,#040H ; Make FE-bit visible
0190 75BA21 819 MOV SSTAT,#21H ; seperate Rx and Tx int, Break generates an Int
820 ;initialise Sync-Sequence evaluation
0193 758F00 821 MOV TAMOD,#0 ;set Timer mode
822 $IF (_HW_SYNC_COUNTER)
0196 758951 823 MOV TMOD,#01010001B ; Timer0 as 16bit Timer
824 ; Timer1 as 16bit counter with preloadvalue
0199 C28E 825 CLR TR1
826 $ENDIF
827 $IF (_SW_SYNC_COUNTER)
ANL TMOD,#0F0H
ORL TMOD,#01H ; Timer0 as 16bit Timer
SETB IT1 ; edge trigger
$ENDIF
832
019B 75BD03 833 MOV BRGCON,#3 ;start baudrate generator
834
019E 53BAF1 835 ANL SSTAT,#0F1H ; reset the SSTAT register
01A1 53987C 836 ANL SCON,#7CH ; CLR TI, CLR RI, CLR FE
837 ;set interrupt priorities
838 ;UART is absolutely not time-critical, so Priority 0 (reset value)
839 ;The Sync-Measurement is very time-critical, so it gets Priority 3 (Ext1 or Timer1)
840 $IF (_HW_SYNC_COUNTER)
01A4 43B708 841 ORL IP0H,#08H
01A7 43B808 842 ORL IP0,#08H
843 $ENDIF
844 $IF (_SW_SYNC_COUNTER)
ORL IP0H,#04H
ORL IP0,#04H
$ENDIF
848
849 ;allow UART Tx and Rx interrupt
01AA D2AC 850 SETB ESR
01AC D2EE 851 SETB EST
01AE 22 852 RET
853
854 END
MACRO ASSEMBLER LINMAC 05/21/02 11:28:48 PAGE 0
SYMBOL TABLE LISTING
------ ----- -------
N A M E T Y P E V A L U E ATTRIBUTES REFERENCES
LINCHECKSUMERROR . B ADDR 0022H.2 A 339# 375 414# 587
KB3. . . . . . . . B ADDR 0080H.3 A 204#
ECCU . . . . . . . B ADDR 00E8H.4 A 172#
P2M1 . . . . . . . D ADDR 00A4H A 98#
P1M2 . . . . . . . D ADDR 0092H A 97#
P0 . . . . . . . . D ADDR 0080H A 90#
KBPATN . . . . . . D ADDR 0093H A 81#
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -