📄 hcs635.lst
字号:
00530 ;
00531 ; DESCRIPTION : CHECK IF LED NEEDS TO TOGGLE, THEN TOGGLE IT, 20/21 CYCLES
00532 ;
00533 ;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
005A 00534 TST_LED
005A 0869 00535 MOVFW CLK_LED ; [1] GET NEXT LED TRANSITION TIME
005B 0267 00536 SUBWF CLK_50,W ; [1] COMPARE WITH CURRENT TIME
005C 3002 00537 MOVLW T_100 ; [1] SET LED ON TIME FOR 100MS
005D 1FD9 00538 BTFSS LEDH ; [1/2] IF LED BLINK SHOULD BLINK FASTER
005E 3001 00539 MOVLW T_50 ; [1/0] ... THEN SET LED ON TIME FOR 50MS
005F 1C07 00540 BTFSS LED ; [1/2] IF LED IF OFF
0060 300A 00541 MOVLW T_500 ; [1/0] ... THEN SET LED OFF TIME
0061 1C03 00542 BTFSS STATUS,C ; [1/2] IF TIME TEST WAS LESS THAN TRIGGER
0062 286D 00543 GOTO TST_LED2 ; [2/0] ... THEN SKIP LED UPDATE
00544
0063 0767 00545 ADDWF CLK_50,W ; [1] CALCULATE NEXT TIME TO TOGGLE
0064 00E9 00546 MOVWF CLK_LED ; [1] STORE NEXT TIME TO TOGGLE
00547 IFDEF P12F635
00548 MOVFW PORTA ; [1] GET LED SETTING
00549 BTFSC FLAGS,VLOWBAT ; [1/2] IF BATERY LEVEL IS LOW
00550 ANDLW 0FEH ; [1/0] THEN TURN LED OFF
00551 XORLW 1 ; [1] ELSE TOGGLE LED
00552 MOVWF PORTA ; [1] THEN UPDATE LED
00553 ELSE
MPASM 5.16 HCS635.ASM 4-16-2008 14:39:21 PAGE 13
LOC OBJECT CODE LINE SOURCE TEXT
VALUE
0065 0807 00554 MOVFW PORTC ; [1] GET LED SETTING
0066 1858 00555 BTFSC FLAGS,VLOWBAT ; [1/2] IF BATERY LEVEL IS LOW
0067 39FE 00556 ANDLW 0FEH ; [1/0] THEN TURN LED OFF
0068 3A01 00557 XORLW 1 ; [1] ELSE TOGGLE LED
0069 0087 00558 MOVWF PORTC ; [1] THEN UPDATE LED
00559 ENDIF
006A 00560 TST_LED1
006A 1EE0 00561 BTFSS BSL1 ; [1/2] CHECK IF BSL1 BIT IS SET
006B 3414 00562 RETLW D'20' ; [2] RETURN BAUD=100USEC AND CARRY=0
006C 3450 00563 RETLW D'80' ; [2] RETURN BAUD=400USEC AND CARRY=0
00564 ; TOTAL = [20] CYCLES WITH CALL
00565
006D 00566 TST_LED2
006D 286E 00567 GOTO $+1 ; WASTE TIME TO KEEP BOTH PATHS EQUAL TIME
006E 286F 00568 GOTO $+1 ; CANNOT USE CALL BECAUSE STACK IS FULL
006F 286A 00569 GOTO TST_LED1
00570
00571 ;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
00572 ;
00573 ; FUNCTION : TST_CLK ()
00574 ;
00575 ; DESCRIPTION : UPDATE 50MS CLOCK AS REQUIRED, 19 CYCLES
00576 ;
00577 ;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
0070 00578 TST_CLK
0070 3018 00579 MOVLW 18H ; 24x256x8 = 6144 x 8 = 49152 => 50MS
0071 1867 00580 BTFSC CLK_50,0 ; EVERY OTHER TEST DITHERS THE ERROR
0072 3019 00581 MOVLW 19H ; 24x256x8 = 6144 x 8 = 49152 => 50MS
0073 020F 00582 SUBWF TMR1H,W ; COMPARE WITH REAL TIMER COUNTER
0074 1803 00583 BTFSC STATUS,C ; IF TIMEOUT REACHED
0075 008F 00584 MOVWF TMR1H ; ... THEN STORE RESULT IN RTCC
0076 1803 00585 BTFSC STATUS,C ; IF TIMEOUT REACHED
0077 0AE7 00586 INCF CLK_50,F ; ... THEN INCREMENT THE 50MS EVENT COUNTER
0078 1FE7 00587 BTFSS CLK_50,7 ; [2/1] CHECK IF MSB SET
0079 287E 00588 GOTO TST_CLK5 ; [0/2] ... NO, THEN WASTE 2 CYCLES AND RETURN
007A 0AE8 00589 INCF CLK_HI,F ; ... THEN INCREMENT 50MS OVERFLOW COUNTER
007B 13E7 00590 BCF CLK_50,7 ; CLEAR MSB OF 50MS CLOCK COUNTER
007C 13E9 00591 BCF CLK_LED,7 ; CLEAR MSB OF LED CLOCK COUNTER
007D 3436 00592 RETLW D'54' ; RETURN START VALUE 200US DELAY
007E 00593 TST_CLK5
007E 3436 00594 RETLW D'54' ; RETURN START VALUE 200US DELAY
00595
00596 ;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
00597 ;
00598 ; FUNCTION : DLY_200US ()
00599 ;
00600 ; DESCRIPTION : WAIT FOR CNT1 x 200us DELAY, WHILE CHECKING BUTTON
00601 ;
00602 ; PAGE : 0
00603 ;
00604 ;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
007F 00605 DLY_200US
007F 00DE 00606 MOVWF CNT1 ; STORE THE NUMBER OF MS DELAY REQUIRED
MPASM 5.16 HCS635.ASM 4-16-2008 14:39:21 PAGE 14
LOC OBJECT CODE LINE SOURCE TEXT
VALUE
0080 00607 DLY_US2
0080 205A 00608 CALL TST_LED ; UPDATE LED STATUS
0081 2070 00609 CALL TST_CLK ; UPDATE 50MS CLOCK, RETURNS 120 FOR DELAY COUNTER
0082 00610 DLY_3US
0082 00DF 00611 MOVWF CNT2 ; LOAD INNER LOOP COUNTER
0083 00612 DLY_US3
0083 0BDF 00613 DECFSZ CNT2,F ; ALL INNER LOOPS DONE ?
0084 2883 00614 GOTO DLY_US3 ; ... NO, THEN DO NEXT
00615
0085 0BDE 00616 DECFSZ CNT1,F ; ALL OUTER LOOPS DONE ?
0086 2880 00617 GOTO DLY_US2 ; ... NO, THE DO NEXT
0087 3400 00618 RETLW 0H
00619
00620 ;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
00621 ;
00622 ; FUNCTION : TX_BITS ()
00623 ;
00624 ; DESCRIPTION : SEND TRANSMISSION BITS OUT ON RFOUT PIN
00625 ;
00626 ; NOTES : USE DOUBLE COUNTER SIZE TO MAKE BYTE ROLLOVER TEST EASIER
00627 ; : MODIFY WITH EXTREME CAUTION TO PRESERVE BIT CALIBRATION
00628 ; : NOW ENTERING SPAGETTI CODE WITH TOO MANY FORKS AND NO SPOON
00629 ;
00630 ;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
0088 00631 TX_BITH
0088 3001 00632 MOVLW 1 ; SEND A LOGIC 1 BIT
0089 00633 TX_1BIT
0089 14DE 00634 BSF CNT1,1 ; SET LENGTH = 1 WITHOUT MODIFING W *2
008A 00635 TX_BITW
008A 0000 00636 NOP
008B 2895 00637 GOTO TX_BITWW ; EXTRA 2 CYCLE DELAY BEFORE SENDING BITS IN W
008C 00638 TX_BITS
008C 00DE 00639 MOVWF CNT1 ; STORE LENGTH
008D 3077 00640 MOVLW NSR0-1 ; POINT TO FIRST BIT OF BUFFER WITHOUT PAGE BITS
008E 0084 00641 MOVWF FSR ; THE PAGE BITS WILL BE INSERTED LATER
00642
008F 00643 TX_BITL
008F 300E 00644 MOVLW 0EH ; GET MASK FOR BYTE ROLLOVER
0090 075E 00645 ADDWF CNT1,W ; SET DC FLAG IF ROLLOVER
0091 1C83 00646 BTFSS STATUS,DC ; IF FIRST FULL BYTE OR BYTE ROLLOVER
0092 0A84 00647 INCF FSR,F ; ... THEN POINT TO BYTE
0093 0800 00648 MOVFW INDF ; GET NEXT BYTE
0094 1C83 00649 BTFSS STATUS,DC ; IF FIRST FULL BYTE OR BYTE ROLLOVER
0095 00650 TX_BITWW
0095 00EC 00651 MOVWF CSR6 ; ... THEN STORE BYTE IN WORKING SPACE
0096 0365 00652 DECF CRC,W ; DECREMENT IS SHORTCUT FOR CRC ALGORITHM:
0097 18E5 00653 BTFSC CRC,1 ; CRC[0]n+1 = CRC[1]n XOR CRC[0]n XOR Dn
0098 3A03 00654 XORLW 3 ; CRC[1]n+1 = CRC[0]n XOR Dn
0099 00E5 00655 MOVWF CRC ; STORE FIRST HALF OF CRC CALCULATION
009A 1C6C 00656 BTFSS CSR6,0 ; IF BIT = 0
009B 09E5 00657 COMF CRC,F ; THEN INVERT CRC
00658
009C 1C59 00659 BTFSS MSEL0 ; IF MANCHESTER/PPM MODULATION NOT SELECTED
MPASM 5.16 HCS635.ASM 4-16-2008 14:39:21 PAGE 15
LOC OBJECT CODE LINE SOURCE TEXT
VALUE
009D 28B2 00660 GOTO TX_WM ; ... THEN DO PWM/VPWM
00661
009E 00662 TX_PPM
009E 289F 00663 GOTO $+1 ; EQUALIZE TIME FOR PREVIOUS GOTO + PWM TEST
00664 IFDEF P12F635
00665 MOVFW PORTA ; GET THE OTHER OUTPUT LEVELS
00666 ANDLW 0FDH ; MAKE RFOUT GO LOW
00667 BTFSC CSR6,0 ; IF TRANSMITTING A ONE
00668 IORLW 2 ; MAKE RFOUT GO HIGH
00669 MOVWF PORTA ; START BIT NOW
00670 CALL TE_DELAYL ; DO 1 TE DELAY
00671
00672 MOVFW PORTA ; GET OUTPUT LEVEL
00673 XORLW 2 ; TOGGLE OUTPUT
00674 MOVWF PORTA ; MAKE CHANGE NOW
00675 ELSE
009F 0807 00676 MOVFW PORTC ; GET THE OTHER OUTPUT LEVELS
00A0 39DF 00677 ANDLW 0DFH ; MAKE RFOUT GO LOW
00A1 186C 00678 BTFSC CSR6,0 ; IF TRANSMITTING A ONE
00A2 3820 00679 IORLW 020H ; MAKE RFOUT GO HIGH
00A3 0087 00680 MOVWF PORTC ; START BIT NOW
00A4 2032 00681 CALL TE_DELAYL ; DO 1 TE DELAY
00682
00A5 0807 00683 MOVFW PORTC ; GET OUTPUT LEVEL
00A6 3A20 00684 XORLW 020H ; TOGGLE OUTPUT
00A7 0087 00685 MOVWF PORTC ; MAKE CHANGE NOW
00686 ENDIF
00A8 1CD9 00687 BTFSS MSEL1 ; IF MANCHESTER MODULATION
00A9 28AE 00688 GOTO TX_MAN ; ... THEN SKIP LAST PPM TE
00689
00AA 2032 00690 CALL TE_DELAYL ; DO 1 TE DELAY
00AB 1287 00691 BCF RFOUT ; SET LAST TE OF PWM LOW
00AC 0000 00692 NOP
00AD 28AE 00693 GOTO $+1
00AE 00694 TX_MAN
00AE 28AF 00695 GOTO $+1
00AF 156D 00696 BSF COMP,2
00B0 2034 00697 CALL TE_DEL03 ; DO 1 TE DELAY
00B1 28CD 00698 GOTO TX_ROTATE
00699
00B2 00700 TX_WM
00B2 1CD9 00701 BTFSS MSEL1 ; IF VPWM MODULATION NOT SELECTED
00B3 28C0 00702 GOTO TX_PWM ; ... THEN DO PWM
00B4 00703 TX_VPWM
00B4 0000 00704 NOP ; EQUALIZE TIME FOR PREVIOUS GOTO
00705 IFDEF P12F635
00706 MOVFW PORTA ; READ PORTA
00707 XORLW 2 ; TOGGLE RF DATA OUT BIT
00708 MOVWF PORTA ; OUTPUT NEW BIT
00709 BSF COMP,2
00710 CALL TE_DEL03 ; DO TE DELAY TIME
00711 RRF PORTA,W ; GET OUTPUT LEVEL INTO BIT 0
00712 ELSE
MPASM 5.16 HCS635.ASM 4-16-2008 14:39:21 PAGE 16
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -