📄 linmac.lst
字号:
002C E5BA 502 MOV A,SSTAT
002E 5404 503 ANL A,#04H ; mask Break Bit
0030 6019 504 JZ _NOBREAK
505 ;********************************************************************************
506 ;Break detected
507 ;********************************************************************************
0032 752101 508 MOV LINSTATE,#1 ; set Breakflag
0035 D2A0 509 SETB P2.0 ; ** DEBUG **
510
511 ;*****************************************************
512 ;*prepare Timer and counter to evaluate sync sequence*
513 ;*****************************************************
0037 C28C 514 CLR TR0
515 $IF (_HW_SYNC_COUNTER)
0039 758BFF 516 MOV TL1,#0FFH ; next falling edge on T1 generates an interrupt
003C 758DFF 517 MOV TH1,#0FFH
003F D28E 518 SETB TR1 ; enable counter
0041 D2AB 519 SETB ET1 ; enable interrupt
0043 758A00 520 MOV TL0,#0
0046 758C00 521 MOV TH0,#0 ; clear Timer 0
522 $ENDIF
523 $IF (_SW_SYNC_COUNTER)
MOV R4,#5 ;preload number of edges to count (_SyncEdgeCount = R4 in Registerbank 3)
CLR IE1
SETB EX1 ;enable external Interrupt
MOV TL0,#0FDH; Offset of -3, because stopping the timer needs three instructioncycles
MOV TH0,#0FFH
$ENDIF
530
531 ;Timer and/or external Int are prepared to evaluate the sync-field
0049 80D2 532 SJMP _EVENTRETURN
533 _RETI1:
534 ;********************************************************************************
535 ;no Break --> normal data-reception
536 ;********************************************************************************
537 _NOBREAK:
004B 209F15 538 JB FE,_UARTFRAMINGERROR
004E 300818 539 JNB LINBREAK,_PROTOCOLERROR ; Break has to be detected first
0051 300915 540 JNB LINSYNCED,_PROTOCOLERROR ; the controller has to be synced first
541 _TESTIDBIT:
0054 200A02 542 JB LINIDRECEIVED,_TESTDATARDY
0057 0100 F 543 AJMP _EVALUATE_ID
544 _TESTDATARDY:
0059 300D2C 545 JNB LINDATARDY,_PROCESS_DATA
546 _TESTFRAMERDY:
005C 300E0E 547 JNB LINFRAMERDY,_PROCESS_CRC
548 ;when the controller reaches this point,
549 ;it expected less data bytes than sent, and
550 ;accidentally the last data-byte was equal to
551 ;the CRC, so that no CRC-Error raised.
552 ;I now set the Framing-Error.
005F D213 553 SETB LINFRAMEERROR ;Frame Error
0061 80B7 554 SJMP _ERRORRETURN
555
556 _UARTFRAMINGERROR:
0063 D215 557 SETB UARTFRAMINGERROR
0065 C29F 558 CLR FE
0067 80B1 559 SJMP _ERRORRETURN
560
561 _PROTOCOLERROR:
0069 D214 562 SETB LINPROTOCOLERROR
006B 80AD 563 SJMP _ERRORRETURN
564
565 ;********************************************************************************
566 ;CRC reception and test
567 ;********************************************************************************
568 _PROCESS_CRC:
006D E599 569 MOV A,SBUF ; CRC in Accumulator
006F 300C09 570 JNB LINTXDATA,_CHECKCRC ;test if the CRC was transmittet by this node itself (Flag LinTxData)
0072 B51B02 571 CJNE A,_LINLASTSENT,__VALIDATIONERROR ;validation
572
0075 8004 573 SJMP _CHECKCRC
574 __VALIDATIONERROR:
0077 D211 575 SETB LINVALIDATIONERROR
0079 809F 576 SJMP _ERRORRETURN
577 ;*************************************************
578
579 _CHECKCRC:
007B 2F 580 ADD A,R7 ; _LinCRC
007C B4FF05 581 CJNE A,#0FFH,_CRCERROR ; sum must be 0xFF
582 ;Lin Frame Ok
007F 752167 583 MOV LINSTATE,#01100111B; set Lin status bits; reset LinTxData, LinRxdata, set Frameready, Datardy, Id, Break and Sync
0082 0100 F 584 AJMP _EVENTRETURN
585 ;*********************************************************
586
0084 D212 587 _CRCERROR: SETB LINCHECKSUMERROR
0086 0100 F 588 AJMP _ERRORRETURN
589
590 ;********************************************************************************
591 ;Process the data reception
592 ;********************************************************************************
593 _PROCESS_DATA:
0088 200C02 594 JB LINTXDATA,_DO_NOT_SET_BIT
008B D20B 595 SETB LINRXDATA
596 _DO_NOT_SET_BIT:
008D 7400 F 597 MOV A,#LINDATA
008F 2E 598 ADD A,R6;_ByteLeft
0090 F9 599 MOV R1,A
0091 A799 600 MOV @R1,SBUF ;receive the data
601 ;calculate CRC
602 _CALCCRC:
0093 EF 603 MOV A,R7;_LinCRC
0094 37 604 ADDC A,@R1
0095 5001 605 JNC _NOADD
0097 04 606 INC A
607 _NOADD:
0098 FF 608 MOV R7,A ;save CRC ; _LinCRC
609 ;test if this was the last byte
0099 EE 610 MOV A,R6;_ByteLeft
009A 7002 611 JNZ _NEXT_IS_DATA
009C D20D 612 SETB LINDATARDY
613 _NEXT_IS_DATA:
009E 1E 614 DEC R6;_ByteLeft
009F 300C16 615 JNB LINTXDATA,__RXRETI; again, test if this node has to transmit the Lin-data
616 ;validate the last data
00A2 E7 617 MOV A,@R1
00A3 B51BD1 618 CJNE A,_LINLASTSENT,__VALIDATIONERROR;
00A6 200D0A 619 JB LINDATARDY,_SENDCRC
620 ;send the next databyte
00A9 7400 F 621 MOV A,#LINDATA
00AB 2E 622 ADD A,R6;_ByteLeft
00AC F9 623 MOV R1,A
00AD 8799 624 MOV SBUF,@R1
00AF 871B 625 MOV _LINLASTSENT,@R1;
00B1 0100 F 626 AJMP _RXRETI
00B3 EF 627 _SENDCRC: MOV A,R7; LinCRC
00B4 F4 628 CPL A ; A=#0FFH-A
00B5 FB 629 MOV R3,A;_LinLastSent
00B6 F599 630 MOV SBUF,A
00B8 0100 F 631 __RXRETI: AJMP _RXRETI
632
633
634 ;********************************************************************************
635 ;Evaluating the ID-field
636 ;********************************************************************************
637 _EVALUATE_ID:
00BA E599 638 MOV A,SBUF
00BC F500 F 639 MOV LINID,A
00BE 53003F F 640 ANL LINID,#3FH
00C1 23 641 RL A
00C2 23 642 RL A ; ACC = FL,FL,X,X|X,X,P1,P0
643 ; get Frame-Length
00C3 750002 F 644 MOV LINFRAMELENGTH,#2
00C6 33 645 RLC A
00C7 500C 646 JNC _ADDRLC ; ---> one additional RLC has to be done
00C9 750004 F 647 MOV LINFRAMELENGTH,#4
00CC 33 648 RLC A
00CD 5007 649 JNC _GETPARITY
00CF 750008 F 650 MOV LINFRAMELENGTH,#8
00D2 020000 F 651 LJMP _GETPARITY
00D5 33 652 _ADDRLC: RLC A
653 ; ACC = X,X,X,X,P1,P0,C,FL
00D6 540C 654 _GETPARITY: ANL A,#0CH
00D8 F523 655 MOV _PARITY,A
656
657 _TESTPARITY :
658 ;Parity Check
00DA E500 F 659 MOV A,LINID ; renew FrameID in accumulator
00DC 5417 660 ANL A,#17H ; Mask Accumulator for Parity0
00DE A2D0 661 MOV C,P ; read Parity from Program Status Word
00E0 921E 662 MOV CALCPAR0,C ; store Parity 0
00E2 E500 F 663 MOV A,LINID ;renew FrameID in accumulator
00E4 543A 664 ANL A,#3AH ; Mask Accumulator for Parity1
00E6 A2D0 665 MOV C,P
00E8 B3 666 CPL C ; odd Parity
00E9 921F 667 MOV CALCPAR1,C ;store Parity 0
668
669 ;Parity Ready
670 ;check parity-bits
00EB E523 671 MOV A,_PARITY ; _Parity is in bitadressable RAM ... Bit 2&3 are Par0 & Par1, Bit 5&6 are calcPAr0 and calcPar1
00ED C4 672 SWAP A
00EE B5230E 673 CJNE A,_PARITY,_PARITY_ERROR
00F1 C210 674 CLR LINPARITYERROR
675
00F3 D20A 676 SETB LINIDRECEIVED
677
00F5 85001E F 678 MOV _BYTELEFT,LINFRAMELENGTH
00F8 151E 679 DEC _BYTELEFT
00FA 751F00 680 MOV _LINCRC,#0
681
00FD 0100 F 682 AJMP _EVENTRETURN
683
684 _PARITY_ERROR:
00FF D210 685 SETB LINPARITYERROR
0101 0100 F 686 AJMP _ERRORRETURN
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -