LIST P=16F628A,R=HEX ; ; LCD TACHOMETER FOR R/C MODEL ENGINE ; SUN, PU-NENG ; ; VERSION 4.2: 09/26/2004 16*2 LCD GRAPHIC MODE 16F628, ; HIGH RESOLUTION TACHOMETER ; VERSION 4.01: 09/18/2004 16*2 LCD GRAPHIC MODE 16F628 ; VERSION 3.3: 09/11/2004 16*2 LCD ; VERSION 3.2: 09/08/2004 RA,4 CONTROLL +5V OUTPUT ; VERSION 3.1: 09/04/2004 LEAVES SELECT ; VERSION 3.0: 08/30/2004 ADD REC_T V1 FOR RECEIVER TESTING ; VERSION 2.0: 08/26/2004 ADD MID & RANDOM MODES ; VERSION 1.0: 08/25/2004 ; ;-------SYSTEM--------------------- #INCLUDE #INCLUDE __CONFIG H'3F01' ;----- Register Files------------------------------------------------------ INDF EQU H'0000' TMR0 EQU H'0001' PCL EQU H'0002' STATUS EQU H'0003' FSR EQU H'0004' PORTA EQU H'0005' PORTB EQU H'0006' PCLATH EQU H'000A' INTCON EQU H'000B' PIR1 EQU H'000C' TMR1L EQU H'000E' TMR1H EQU H'000F' T1CON EQU H'0010' TMR2 EQU H'0011' T2CON EQU H'0012' CCPR1L EQU H'0015' CCPR1H EQU H'0016' CCP1CON EQU H'0017' RCSTA EQU H'0018' TXREG EQU H'0019' RCREG EQU H'001A' CMCON EQU H'001F' OPTION_REG EQU H'0081' TRISA EQU H'0085' TRISB EQU H'0086' PC EQU H'0002' RA EQU H'0005' RB EQU H'0006' OPTIONF EQU H'0081' ;-------DEFINE BIT------------- ; C EQU 0 W EQU 0 ;d VALUE FOR INCF...... F EQU 1 ;d VALUE OFF EQU 0 ;FLAG BIT 0, RP0 EQU 5 ;STATUS BIT 5 & 6 =REGISTER BANK SELECT RP1 EQU 6 INPUT EQU 7 ;RB7 AS INPUT PORT TOIF EQU 2 ;INTCON TMR0 OVERLOW INT FLAG TOIE EQU 5 ;INTCON TOIF ENABLE GIE EQU 7 ;INTCON GLOBAL INT ENABLE ;-------USER------------------------------------- ;-------REGISTERS------ ; EE1 EQU H'20' EE2 EQU H'21' EE3 EQU H'22' EE4 EQU H'23' FF1 EQU H'24' FF2 EQU H'25' FF3 EQU H'26' FF4 EQU H'27' TCNT0 EQU H'2C' ;= (0.6SEC /INT* PRESCAL*CLOCK) INTR0 EQU H'2D' ;AFTER INT, SAVE W VALUE INTR1 EQU H'2E' ;AFTER INT, SAVE STATUS DD1 EQU H'2F' ;DATA FOR INPUT RPM DD2 EQU H'30' DD3 EQU H'31' TEMP1 EQU H'32' ; TEMP2 EQU H'33' TEMP3 EQU H'34' DD4 EQU H'35' ;100-200 +- 1 EVERY INT_DST INT_C EQU H'36' ;0-255 -1 EVERY INT_DST FLAG_REG EQU H'37' MODE_SEL EQU H'38' PWM_C EQU H'39' PUSH_C EQU H'3A' RAND_HI EQU H'3B' RAND_LO EQU H'3C' TCNT EQU H'3D' TEMP4 EQU H'3E' TEMP5 EQU H'3F' ;-------BIT---------------- F_ON EQU 0 F_UP EQU 1 F_TDST EQU 2 F_REC EQU 3 TACHO_SEL EQU 4 ESCP EQU 5 ; ;-------VARIABLES----------- ; TMR EQU D'181' ;(PRESCALE 64*1uS) * 75 = 4800 uS TCNT_2 EQU D'125' ;4.8mS*125=600mS,BUT FIX SOME ODD CODE TCNT_3 EQU D'84' ;THIS TWO * PRESCALE 1:64,TO A 0.6 SECOND DURATION TCNT_4 EQU D'62' TCNT_5 EQU D'50' BDELAY EQU D'50' ;BUTTON DELAY LDELAY EQU D'100' ;DISPLAY DELAY TMR1 EQU D'178' ;(PRESCALE 256*78) = 19968 uS RLIMIT EQU D'200' ;SERVO LIMIT LLIMIT EQU D'100' ;-------LCD SOUTINE------------------------- ;-------REGISTERS--------- ; ADDRESS1 EQU H'41' CHAR1 EQU H'42' TEMP1_LCD EQU H'43' TEMP2_LCD EQU H'44' TEMP3_LCD EQU H'45' TEMP4_LCD EQU H'46' TABLE_INDEX EQU H'47' TEMPH EQU H'48' TEMPL EQU H'49' COUNT EQU H'4A' R0 EQU H'4B' R1 EQU H'4C' R2 EQU H'4D' ; ; ; ;========== MAIN PROGRAM ========= ; ORG 0 GOTO START ;---------------------------------------- ; ORG 4 ;INTERRUPT BEGIN INTB MOVWF INTR0 ; SAVE W MOVF STATUS,W ; SAVE STATUS MOVWF INTR1 ; BCF STATUS,RP0 ; MAKE SURE SELECT BANK0 CHECK_TDST BTFSC FLAG_REG,F_TDST ;IF SET GOTO DST MODE GOTO INT_DST GOTO INTEND ;------ END OF TACHO INT --------- ;-------------------------------- PRINT_RPM GOTO PRINT_RPM2 PRINT_RPM3 RETURN ;*************************************************************************** ; BIN2BCD16 - CONVERTS A 16-BIT BINARY NUMBER IN TEMPH:TEMPL INTO A 3 BYTE PACKED ; BCD NUMBER IN R0:R1:R2. ; R0 HOLDS THE 10 THOUSANDS DIGIT ; R1 HOLDS THE HUNDREDS AND THOUSANDS DIGITS ; R2 HOLDS THE ONES AND TENS DIGITS ;*************************************************************************** ; INPUTS: TEMPH, TEMPL (16-BIT BINARY NUMBER) ; OUTPUTS: R0, R1, R2 (5 DIGIT BCD NUMBER) ; USED: COUNT BIN2BCD16 ; INITIALIZE VARIABLES BCF STATUS,C ; CLEAR CARRY BIT MOVLW D'16' MOVWF COUNT ; INIT BIT COUNTER CLRF R0 ; CLEAR OUTPUT CLRF R1 ; CLEAR OUTPUT CLRF R2 ; CLEAR OUTPUT LOOP16A2 RLF TEMPL,F ; MULT BY 2, SHIFT MSB TO TEMPH RLF TEMPH,F ; MULT BY 2, SHIFT MSB TO R2 RLF R2,F ; MULT BY 2, SHIFT MSB TO R1 RLF R1,F ; MULT BY 2, SHIFT MSB TO R0 RLF R0,F ; MULT BY 2, SHIFT MSB TO CARRY DECFSZ COUNT,F ; DECREMENT BIT COUNTER GOTO ADJDEC2 RETURN ADJDEC2 MOVLW R2 MOVWF FSR ; POINT TO R2 CALL ADJBCD2 MOVLW R1 MOVWF FSR ; POINT TO R1 CALL ADJBCD2 MOVLW R0 MOVWF FSR ; POINT TO R0 CALL ADJBCD2 GOTO LOOP16A2 ADJBCD2 MOVLW 3 ADDWF INDF,W ; W = 3 + RN MOVWF TEMP ; TEMP = 3+RN BTFSC TEMP,3 ; MOVWF INDF ; RN=TEMP MOVLW 30 ; DECIMAL ADJUST? ADDWF INDF,W ; W=30+RN MOVWF TEMP ; TEMP=30+RN BTFSC TEMP,7 MOVWF INDF ; RN=TEMP RETURN ;--------------------------------------- UDIV3216L GOTO FXD3216L FXD3216R RETURN ;--------------------------------------- ;--------------------------------- INT_DST GOTO T4 ;-------------------------------------------------- T44 MOVLW D'11' CALL DDRAM_ADDRESS MOVLW B'00110000' IORWF DD1,1 IORWF DD2,1 IORWF DD3,1 MOVFW DD1 CALL PRINT_CHAR MOVFW DD2 CALL PRINT_CHAR MOVFW DD3 CALL PRINT_CHAR MOVLW '0' CALL PRINT_CHAR MOVLW 'u' CALL PRINT_CHAR GOTO GRAPH1 GRAPH2 BSF RB,1 INT_DST1 ;10 uS LOOP NOP NOP NOP NOP NOP NOP NOP DECFSZ TEMP5,F GOTO INT_DST1 ;END OF LOOP BCF RB,1 DECF INT_C,F ;INCREASE INT_COUNTER ;------------------------------------- INTEND MOVF INTR1,W ; RESTORE STATUS MOVWF STATUS MOVF INTR0,W ; RESTORE W BCF INTCON,TOIF ; RESET FLAG OF INT T0 RETFIE ; ; ;------------------------------------------------- ;============================================ ;LCD SOUTINE ;=================================================== CGRAM_ADDRESS MOVWF ADDRESS1 BSF ADDRESS1,6 ;CGRAM MOVF ADDRESS1,0 ANDLW B'11110000' ; CALL PRINT_CONT SWAPF ADDRESS1,W ;SWAP HALVES F ANDLW B'11110000' ; CALL PRINT_CONT RETURN PRINT_DATA MOVWF RB BSF RB,2 ;RS=1, DATA BSF RB,3 BCF RB,3 CALL LOOP_S ;100 uS RETURN PRINT_CONT MOVWF RB BSF RB,3 BCF RB,3 CALL LOOP_S ;100 uS RETURN CLEAR_DISPLAY MOVLW B'00000000' ;0 CALL PRINT_CONT MOVLW B'00010000' ;1 CLEAR CALL PRINT_CONT MOVLW 1 CALL LOOP_L ;10mS RETURN DDRAM_ADDRESS MOVWF ADDRESS1 BSF ADDRESS1,7 ;DDRAM MOVF ADDRESS1,0 ANDLW B'11110000' ; CALL PRINT_CONT SWAPF ADDRESS1,W ;SWAP HALVES F ANDLW B'11110000' ; CALL PRINT_CONT RETURN PRINT_CHAR MOVWF CHAR1 ANDLW B'11110000' ; CALL PRINT_DATA SWAPF CHAR1,W ;SWAP HALVES F ANDLW B'11110000' ;SENT LOW 4 BITS CALL PRINT_DATA RETURN LOOP_S ;120uS LOOP MOVLW D'40' MOVWF TEMP4_LCD LOOP_S1 DECFSZ TEMP4_LCD,1 ; GOTO LOOP_S1 RETURN LOOP_L ;10 mS LOOP MOVWF TEMP1_LCD LOOP_L1 MOVLW D'10' ;10 mS MOVWF TEMP2_LCD LOOP_L2 MOVLW D'249' ;(249*4)+5=1001 MOVWF TEMP3_LCD LOOP_L3 NOP DECFSZ TEMP3_LCD,1 GOTO LOOP_L3 DECFSZ TEMP2_LCD,1 GOTO LOOP_L2 DECFSZ TEMP1_LCD,1 GOTO LOOP_L1 RETURN DISP_MESSAGE MOVWF TABLE_INDEX ;W -> INDEX, THE BEGIN OF MESSAGE CALL MESSAGE1 ANDLW 0FFH SKPNZ ; IF TABLE RETURN 0 , END OF MESSAGE SECTION RETURN CALL PRINT_CHAR ; DOSPLAY INCF TABLE_INDEX,0 GOTO DISP_MESSAGE ;==================================================== MODE_ADDRESS ADDWF PC,F RETLW 0 RETLW 0 RETLW D'16' RETLW D'31' RETLW D'46' MESSAGE1 ADDWF PC,F RETLW ' ' RETLW 'T' RETLW 'a' RETLW 'c' RETLW 'h' RETLW 'o' RETLW 'm' RETLW 'e' RETLW 't' RETLW 'e' RETLW 'r' RETLW ' ' RETLW ' ' RETLW ' ' RETLW ' ' RETLW 0 RETLW ' ' RETLW 'D' ;16 RETLW 'i' RETLW 'g' RETLW 'i' RETLW ' ' RETLW 'S' RETLW 'e' RETLW 'r' RETLW 'v' RETLW 'o' RETLW ' ' RETLW 'T' RETLW 'x' RETLW 0 RETLW ' ' RETLW 'S' ;31 RETLW 'p' RETLW 'e' RETLW 'e' RETLW 'd' RETLW ' ' RETLW 'C' RETLW 't' RETLW 'r' RETLW 'l' RETLW ' ' RETLW 'T' RETLW 'x' RETLW 0 RETLW ' ' RETLW 'R' ;46 RETLW 'e' RETLW 'c' RETLW '_' RETLW 'T' RETLW 'r' RETLW 'a' RETLW 'n' RETLW 's' RETLW ' ' RETLW 'T' RETLW 'x' RETLW ' ' RETLW 0 NOP NOP NOP NOP ;======================================= ;---------- PROGRAM BEGIN ----------- ;---------------------------------------- ; START CLRF RA ;16F628 ONLY MOVLW H'07' MOVWF CMCON BCF STATUS,RP1 BSF STATUS,RP0 ;SET 3,5 ENABLE BANK1 MOVLW B'00000001' MOVWF TRISB ;SET RB 1-7 OUTPUT, 0 INPUT MOVLW B'00000111' MOVWF TRISA ;SET RA0-RA2 INTPUT, RA3,RA4 OUTPUT BCF STATUS,RP0 ;ENABLE BANK0 BCF RB,1 ;OUT PWM BSF RA,4 ;OUT +5V OFF CLRF RB CLRF FLAG_REG BCF INTCON,GIE INIT_LCD MOVLW 5 ;POWER ON DELAY 50mS CALL LOOP_L SET_4BIT_MOD ;SET LCD AT 4 BIT MODEL MOVLW B'00110000' ;3 CALL PRINT_CONT MOVLW 1 CALL LOOP_L ;10mS MOVLW B'00110000' ;3 CALL PRINT_CONT MOVLW B'00110000' ;3 CALL PRINT_CONT MOVLW B'00100000' ;2, 4BIT MODE CALL PRINT_CONT MOVLW B'00100000' ;2 CALL PRINT_CONT MOVLW B'10000000' ;8 4BITS, 2 LINES, FONT 0 CALL PRINT_CONT INIT_DISPLAY MOVLW B'00000000' ;O CALL PRINT_CONT MOVLW B'11000000' ;C SCREEN ON, NO CURSOR, NO BLINKING CALL PRINT_CONT CALL CLEAR_DISPLAY ;CLEAR DISPLAY GOTO MAKEWORD MAIN_M MOVLW H'40' CALL DDRAM_ADDRESS MOVLW ' ' CALL PRINT_CHAR MOVLW ' ' CALL PRINT_CHAR MOVLW 'M' CALL PRINT_CHAR MOVLW 'u' CALL PRINT_CHAR MOVLW 'l' CALL PRINT_CHAR MOVLW 't' CALL PRINT_CHAR MOVLW 'i' CALL PRINT_CHAR MOVLW '-' CALL PRINT_CHAR MOVLW 'T' CALL PRINT_CHAR MOVLW 'e' CALL PRINT_CHAR MOVLW 's' CALL PRINT_CHAR MOVLW 't' CALL PRINT_CHAR MOVLW 'e' CALL PRINT_CHAR MOVLW 'r' CALL PRINT_CHAR ESCMODE MOVLW H'0' CALL DDRAM_ADDRESS MOVLW 'i' CALL PRINT_CHAR MOVLW 'L' ;DISPLAY FIRST SECTION MESSAGE CALL PRINT_CHAR MOVLW 'u' CALL PRINT_CHAR MOVLW 'F' CALL PRINT_CHAR MOVLW 'a' CALL PRINT_CHAR MOVLW ' ' CALL PRINT_CHAR MOVLW 'H' CALL PRINT_CHAR MOVLW 'o' CALL PRINT_CHAR MOVLW 'b' CALL PRINT_CHAR MOVLW 'b' CALL PRINT_CHAR MOVLW 'y' CALL PRINT_CHAR MOVLW ' ' CALL PRINT_CHAR MOVLW 'W' CALL PRINT_CHAR MOVLW 'e' CALL PRINT_CHAR MOVLW 'b' CALL PRINT_CHAR MOVLW LDELAY CALL LOOP_L ;DELAY 2.5 SECOND CLRF MODE_SEL INCF MODE_SEL,F ;------------------------------------------ MMODE_00 BCF INTCON,GIE BCF FLAG_REG,ESCP MOVLW H'40' CALL DDRAM_ADDRESS MOVFW MODE_SEL CALL MODE_ADDRESS ;GET MODE NAME BEGINING CALL DISP_MESSAGE ;DISPLAY MODE NAME MOVLW BDELAY CALL LOOP_L ; BTFSS RA,1 GOTO MMODE_01 ;+ PUSH, BTFSS RA,0 GOTO MMODE_02 ;SELECT PUSH, GOTO MMODE_00 MMODE_01 INCF MODE_SEL,F MOVLW 5 ;MODE_SEL 1-4 ONLY SUBWF MODE_SEL,W SKPZ GOTO MMODE_00 MOVLW 1 MOVWF MODE_SEL GOTO MMODE_00 MMODE_02 ;-------ON MODE_SEL GOTO---------- MOVLW 1 SUBWF MODE_SEL,W SKPNZ GOTO MAIN ;1 TACHO MOVLW 2 SUBWF MODE_SEL,W SKPNZ GOTO DST_MAIN ;2 DST MOVLW 3 SUBWF MODE_SEL,W SKPNZ GOTO SCT_MAIN ;3 SCT MOVLW 4 SUBWF MODE_SEL,W SKPNZ GOTO RECT_MAIN ;4 RECT ;------------------------------------ ;------------------------------------------- MAIN BSF RA,4 ;OUT +5V OFF CALL CLEAR_DISPLAY ;CLEAR DISPLAY MOVLW 0 CALL DDRAM_ADDRESS MOVLW 1 CALL MODE_ADDRESS ;GET MODE NAME BEGINING CALL DISP_MESSAGE ;DISPLAY MODE NAME MOVLW LDELAY ;DELAY............ CALL LOOP_L BCF FLAG_REG,TACHO_SEL MOVLW 1 ;DEFAULT 2 LEAVES MOVWF MODE_SEL ;------ TACHO MODE SELECT ----------- T_SEL INCF MODE_SEL,F MOVLW 6 ;MODE_SEL 2-5 ONLY SUBWF MODE_SEL,W SKPZ GOTO T_SEL1 MOVLW 2 MOVWF MODE_SEL T_SEL1 MOVLW H'40' CALL DDRAM_ADDRESS MOVLW H'30' ;CONVERT HEX TO ASCII ADDWF MODE_SEL,W ;CONVERT HEX TO ASCII CALL PRINT_CHAR MOVLW ' ' CALL PRINT_CHAR MOVLW 'L' CALL PRINT_CHAR MOVLW 's' CALL PRINT_CHAR ;-------ON MODE_SEL GOTO---------- MOVLW 2 SUBWF MODE_SEL,W SKPNZ GOTO TMODE_2 ;2 LEAVES MOVLW 3 SUBWF MODE_SEL,W SKPNZ GOTO TMODE_3 ;3 MOVLW 4 SUBWF MODE_SEL,W SKPNZ GOTO TMODE_4 ;4 ;------------------------------------ TMODE_5 ;5 MOVLW H'0' MOVWF DD1 MOVLW H'16' MOVWF DD2 MOVLW H'E3' MOVWF DD3 MOVLW H'60' MOVWF DD4 MOVLW H'0' MOVWF EE1 MOVLW H'B7' MOVWF EE2 MOVLW H'1B' MOVWF EE3 MOVLW H'00' MOVWF EE4 MOVLW H'0E' MOVWF FF1 MOVLW H'4E' MOVWF FF2 MOVLW H'1C' MOVWF FF3 MOVLW H'00' MOVWF FF4 GOTO T_SEL_5 TMODE_4 MOVLW H'0' MOVWF DD1 MOVLW H'1C' MOVWF DD2 MOVLW H'9C' MOVWF DD3 MOVLW H'38' MOVWF DD4 MOVLW H'0' MOVWF EE1 MOVLW H'E4' MOVWF EE2 MOVLW H'E1' MOVWF EE3 MOVLW H'C0' MOVWF EE4 MOVLW H'11' MOVWF FF1 MOVLW H'E1' MOVWF FF2 MOVLW H'A3' MOVWF FF3 MOVLW H'00' MOVWF FF4 GOTO T_SEL_5 TMODE_3 MOVLW H'0' MOVWF DD1 MOVLW H'26' MOVWF DD2 MOVLW H'25' MOVWF DD3 MOVLW H'A0' MOVWF DD4 MOVLW H'01' MOVWF EE1 MOVLW H'31' MOVWF EE2 MOVLW H'2D' MOVWF EE3 MOVLW H'00' MOVWF EE4 MOVLW H'17' MOVWF FF1 MOVLW H'B7' MOVWF FF2 MOVLW H'84' MOVWF FF3 MOVLW H'00' MOVWF FF4 GOTO T_SEL_5 TMODE_2 MOVLW H'0' MOVWF DD1 MOVLW H'39' MOVWF DD2 MOVLW H'38' MOVWF DD3 MOVLW H'70' MOVWF DD4 MOVLW H'01' MOVWF EE1 MOVLW H'C9' MOVWF EE2 MOVLW H'C3' MOVWF EE3 MOVLW H'80' MOVWF EE4 MOVLW H'23' MOVWF FF1 MOVLW H'C3' MOVWF FF2 MOVLW H'46' MOVWF FF3 MOVLW H'00' MOVWF FF4 GOTO T_SEL_5 T_SEL_5 MOVLW D'50' ;0.01 SECOND *50 CALL LOOP_L BTFSS RA,2 GOTO START ; BTFSS RA,1 GOTO T_SEL ;CHANGE MODE BTFSS RA,0 GOTO MAIN_0 GOTO T_SEL_5 ;------------------------------------ MAIN_0 MOVLW B'00000000' MOVWF T1CON ;T1 TIMER MODE BSF STATUS,RP0 BSF PIE1,TMR1IE BCF STATUS,RP0 BSF INTCON,GIE ;ENABLE INT BCF INTCON,PEIE ;DISABLE INT CLRF TMR1H CLRF TMR1L CLRF AARGB2 CLRF AARGB3 CALL BIN2BCD16 CALL PRINT_RPM ;----------------------------------- ;---------------------------------- MAIN01 BSF T1CON,T1CKPS0 BSF T1CON,T1CKPS1 ;PRESCALE 8 CLRF TMR1H CLRF TMR1L BCF PIR1,TMR1IF MAIN02 BTFSS PORTA,2 GOTO MAIN BTFSC PORTB,0 GOTO MAIN02 MAIN03 BTFSS PORTA,2 GOTO MAIN BTFSS PORTB,0 GOTO MAIN03 BSF T1CON,TMR1ON ;START MAIN04 BTFSC PORTB,0 GOTO MAIN04 MAIN05 BTFSS PORTB,0 GOTO MAIN05 BCF T1CON,TMR1ON ;STOP BTFSS PIR1,TMR1IF GOTO MAIN07 ; GOTO MAIN06 ;OVERFLOW MAIN06 MOVLW H'47' CALL DDRAM_ADDRESS MOVLW 'U' CALL PRINT_CHAR MOVLW 'n' CALL PRINT_CHAR MOVLW 'd' CALL PRINT_CHAR MOVLW 'e' CALL PRINT_CHAR MOVLW 'r' CALL PRINT_CHAR MOVLW D'50' CALL LOOP_L GOTO MAIN01 MAIN07 MOVLW D'31' SUBWF TMR1H,W SKPNC ;FW , C=1 GOTO RANDOM16 MOVF RAND_LO,W MOVWF PWM_C INC_B52 MOVF INT_C,W SKPZ GOTO INC_B52 BTFSS RA,2 ;STOP ? GOTO MODE_5 DECFSZ PUSH_C,F GOTO INC_B51 GOTO MODE_51 CENT_B5 MOVLW BDELAY ;0.01 SECOND * 40 CALL LOOP_L BTFSS RA,1 GOTO MODE_0 ;CHANGE MODE GOTO MODE_50 ;--------------------------------- MODE_6 BCF INTCON,GIE ;ENABLE INT MOVLW H'6' CALL DDRAM_ADDRESS MOVLW '<' CALL PRINT_CHAR MOVLW 'E' CALL PRINT_CHAR MOVLW 'S' CALL PRINT_CHAR MOVLW 'C' CALL PRINT_CHAR MOVLW '>' CALL PRINT_CHAR MODE_62 BTFSS RA,0 GOTO INC_6 BTFSS RA,1 GOTO CENT_6 GOTO MODE_62 INC_6 MOVLW BDELAY ;0.01 SECOND * 40 CALL LOOP_L BTFSS RA,0 GOTO START ;ESCAPE TO MAIN MODE GOTO MODE_62 CENT_6 MOVLW BDELAY ;0.01 SECOND * 40 CALL LOOP_L BTFSS RA,1 GOTO MODE_0 ;CHANGE MODE GOTO MODE_62 ;------ END OF DST --------------- ;---------------------------------- ;----- SPEED CONTROLLER TESTER -- SCT_MAIN BCF INTCON,GIE ;ENABLE INT BSF RA,4 ;OUT +5V OFF BSF FLAG_REG,F_TDST ;IF SET GOTO DST MODE CALL CLEAR_DISPLAY ;CLEAR DISPLAY MOVLW 0 CALL DDRAM_ADDRESS MOVLW 'S' CALL PRINT_CHAR MOVLW 'p' CALL PRINT_CHAR MOVLW 'e' CALL PRINT_CHAR MOVLW 'e' CALL PRINT_CHAR MOVLW 'd' CALL PRINT_CHAR MOVLW ' ' CALL PRINT_CHAR MOVLW 'M' CALL PRINT_CHAR MOVLW 'a' CALL PRINT_CHAR MOVLW 'n' CALL PRINT_CHAR MOVLW 'u' CALL PRINT_CHAR MOVLW ' ' CALL PRINT_CHAR MOVLW LDELAY ;DELAY............ CALL LOOP_L ;----------------------------------------------- BSF STATUS,RP0 ;SET 3,5 ENABLE BANK1 MOVLW B'10000111' MOVWF OPTIONF ;INTERNAT CLOCK,TRM0,1:256 BCF STATUS,RP0 ;ENABLE BANK0 MOVLW TMR1 ;256*78=19968 uS MOVWF TMR0 BCF INTCON,TOIF BSF INTCON,TOIE BSF INTCON,GIE ;ENABLE INT ;------------------------------------------------- SCT_1 MOVLW D'100' ;MINIMUM MOVWF PWM_C SCT_11 BTFSS RA,0 GOTO ISCT_B BTFSS RA,2 GOTO DSCT_B BTFSS RA,1 GOTO DCENT_B CLRF PUSH_C GOTO SCT_11 ISCT_B MOVLW RLIMIT SUBWF PWM_C,W SKPNZ GOTO SCT_11 ;=RLIMIT, DO NOTHING INCF PWM_C,F MOVLW D'5' ;CONTINUE 5 STEP, ACCELERATION SUBWF PUSH_C,W SKPNZ GOTO ISCT_B1 ; MOVLW D'20' ;0.2 SECOND CALL LOOP_L ;CALL 0.1 SECOND LOOP INCF PUSH_C,F GOTO SCT_11 ISCT_B1 ;FAST INC MOVLW D'6' CALL LOOP_L ;0.06 SECOND GOTO SCT_11 DSCT_B MOVLW LLIMIT SUBWF PWM_C,W SKPNZ GOTO SCT_11 ;=LLIMIT, DO NOTHING DECF PWM_C,F MOVLW D'5' ;CONTINUE 5 STEP, ACCELERATION SUBWF PUSH_C,W SKPNZ GOTO DSCT_B1 ; MOVLW D'20' ; CALL LOOP_L ;CALL 0.1 SECOND LOOP INCF PUSH_C,F GOTO SCT_11 DSCT_B1 ;FAST DEC MOVLW D'6' CALL LOOP_L ;0.06 SECOND GOTO SCT_11 DCENT_B MOVLW BDELAY ;0.01 SECOND * 40 CALL LOOP_L BTFSS RA,1 GOTO DESCMODE ;CHANGE MODE GOTO SCT_1 ;GOTO BEGINING, 1000uS DESCMODE BCF INTCON,GIE ;ENABLE INT MOVLW H'6' CALL DDRAM_ADDRESS MOVLW '<' CALL PRINT_CHAR MOVLW 'E' CALL PRINT_CHAR MOVLW 'S' CALL PRINT_CHAR MOVLW 'C' CALL PRINT_CHAR MOVLW '>' CALL PRINT_CHAR DMODE_62 BTFSS RA,0 GOTO DINC_6 BTFSS RA,1 GOTO DCENT_6 GOTO DMODE_62 DINC_6 MOVLW BDELAY ;0.01 SECOND * 40 CALL LOOP_L BTFSS RA,0 GOTO START ;ESCAPE TO MAIN MODE GOTO DMODE_62 DCENT_6 MOVLW BDELAY ;0.01 SECOND * 40 CALL LOOP_L BTFSS RA,1 GOTO SCT_MAIN ;CHANGR MODE TO SCT MAUN GOTO DMODE_62 ;------ END OF SCT ----------------- ;======================================================= RECT_MAIN BSF RA,4 ;OUT +5V OFF BSF FLAG_REG,F_TDST BSF FLAG_REG,F_REC CALL CLEAR_DISPLAY ;CLEAR DISPLAY MOVLW 0 CALL DDRAM_ADDRESS MOVLW 'R' CALL PRINT_CHAR MOVLW 'e' CALL PRINT_CHAR MOVLW 'c' CALL PRINT_CHAR MOVLW '_' CALL PRINT_CHAR MOVLW 'T' CALL PRINT_CHAR MOVLW 'r' CALL PRINT_CHAR MOVLW 'a' CALL PRINT_CHAR MOVLW 'n' CALL PRINT_CHAR MOVLW 's' CALL PRINT_CHAR MOVLW ' ' CALL PRINT_CHAR MOVLW ' ' CALL PRINT_CHAR BSF STATUS,RP0 ; MOVLW B'10000000' MOVWF OPTIONF ;INTERNAT CLOCK,TRM0,1:2 MOVLW B'00000011' ;SET RB,1 INPUT MOVWF TRISB ; BCF STATUS,RP0 ; CLRF PWM_C BSF INTCON,TOIE BSF INTCON,GIE ;ENABLE INT TO DISPLAY XXX uS CALL LOOP_S ;-------------------------------- REC_0 BCF INTCON,TOIF BCF INTCON,TOIE BCF INTCON,GIE ; ;-------START MEASURE------------- REC_2 CLRF PWM_C REC_3 BTFSS RA,2 GOTO REC_B BTFSS RB,1 GOTO REC_3 REC_4 NOP ;10 uS LOOP NOP NOP NOP INCF PWM_C,F SKPNZ GOTO REC_ERROR ;IF PWM_C > 255, ERROR BTFSC RB,1 GOTO REC_4 DECF PWM_C,F ;CORRECT 1-20 uS GOTO REC_5 REC_ERROR ;IF > 255 DISPLAY 255 MOVLW H'FF' MOVWF PWM_C REC_5 BSF INTCON,TOIE BSF INTCON,GIE ;ENABLE INT TO DISPLAY XXX uS GOTO REC_0 REC_B MOVLW BDELAY ;0.01 SECOND * 40 CALL LOOP_L BTFSS RA,2 GOTO START ;CHANGR MODE TO SCT MAUN GOTO RECT_MAIN ;------ END OF RECEIVER TX --------------------- ;------------------------------------------------- ;---------------------------------------------- ;===== SUB ROUTINE REDIRECTIONS =================== T4 MOVLW TMR1 ;256*78=19968 uS MOVWF TMR0 MOVF PWM_C,W MOVWF TEMP5 ;------------------------------------- BIN2BCD MOVWF DD3 ;1 CLRF DD2 ;10 CLRF DD1 ;100 H1 MOVLW 0X64 ; 100 SUBWF DD3,F ; SUBTRACT 100 FROM NUMBER BTFSC STATUS,C ; NEGATIVE RESULT? GOTO H2 ; NO? GOTO H2 GOTO H3 ; YES? GOTO H3 (100'S DDD3) H2 INCF DD1,F ; INCREMENT DD1 REGISTER GOTO H1 ; & LOOP BACK FOR ANOTHER TEST H3 MOVLW 0X64 ; 100 ADDWF DD3,F ; ADD 100 BACK TO NUMBER T1 MOVLW 0X0A ; 10 SUBWF DD3,F ; SUBTRACT 10 FROM NUMBER BTFSC STATUS,C ; NEGATIVE RESULT? GOTO T2 ; NO? GOTO T2 GOTO T3 ; YES? GOTO T3 (10'S DDD3) T2 INCF DD2,F ; INCREMENT DD2 REGISTER GOTO T1 ; & LOOP BACK FOR ANOTHER TEST T3 MOVLW 0X0A ; 10 ADDWF DD3,F ; ADD 10 BACK TO NUMBER GOTO T44 ;------------------------------------------------- PRINT_RPM2 MOVLW H'47' CALL DDRAM_ADDRESS MOVF R0,W SKPZ GOTO RPM5 MOVLW ' ' CALL PRINT_CHAR GOTO RPM4 RPM5 MOVF R0,W MOVLW B'00110000' IORWF R0,W CALL PRINT_CHAR SWAPF R1,W ;4 ANDLW B'00001111' IORLW B'00110000' CALL PRINT_CHAR MOVF R1,W ;3 ANDLW B'00001111' ; IORLW B'00110000' CALL PRINT_CHAR SWAPF R2,W ;2 ANDLW B'00001111' ; IORLW B'00110000' CALL PRINT_CHAR GOTO RPM1 RPM4 SWAPF R1,W ;SWAP HALVES F ANDLW B'00001111' SKPZ GOTO RPM41 MOVLW ' ' CALL PRINT_CHAR GOTO RPM3 ; RPM41 SWAPF R1,W ;SWAP HALVES F ANDLW B'00001111' IORLW B'00110000' CALL PRINT_CHAR MOVF R1,W ;3 ANDLW B'00001111' ; IORLW B'00110000' CALL PRINT_CHAR SWAPF R2,W ;2 ANDLW B'00001111' ; IORLW B'00110000' CALL PRINT_CHAR GOTO RPM1 RPM3 MOVF R1,W ANDLW B'00001111' ; SKPZ GOTO RPM31 MOVLW ' ' CALL PRINT_CHAR GOTO RPM2 RPM31 MOVF R1,W ANDLW B'00001111' IORLW B'00110000' CALL PRINT_CHAR SWAPF R2,W ;2 ANDLW B'00001111' ; IORLW B'00110000' CALL PRINT_CHAR GOTO RPM1 RPM2 SWAPF R2,W ;SWAP HALVES F ANDLW B'00001111' ; SKPZ GOTO RPM21 MOVLW ' ' CALL PRINT_CHAR GOTO RPM1 RPM21 SWAPF R2,W ;SWAP HALVES F ANDLW B'00001111' ; IORLW B'00110000' CALL PRINT_CHAR RPM1 MOVF R2,W ANDLW B'00001111' ; IORLW B'00110000' CALL PRINT_CHAR MOVLW ' ' CALL PRINT_CHAR MOVLW 'R' CALL PRINT_CHAR MOVLW 'P' CALL PRINT_CHAR MOVLW 'M' CALL PRINT_CHAR GOTO PRINT_RPM3 ;-------------------------------------- ;-------------------------------------------- ; 32/16 Bit Unsigned Fixed Point Divide 32/16 -> 32.16 ; Input: 32 bit unsigned fixed point dividend in AARGB0, AARGB1,AARGB2,AARGB3 ; 16 bit unsigned fixed point divisor in BARGB0, BARGB1 ; Use: CALL FXD3216U ; Output: 32 bit unsigned fixed point quotient in AARGB0, AARGB1,AARGB2,AARGB3 ; 16 bit unsigned fixed point remainder in REMB0, REMB1 ; Result: AARG, REM <-- AARG / BARG ; Max Timing: 2+699+2 = 703 clks ; Max Timing: 2+663+2 = 667 clks ; PM: 2+240+1 = 243 DM: 9 ;UDIV3216L ;macro ; Max Timing: 16+6*22+21+21+6*22+21+21+6*22+21+21+6*22+21+8 = 699 clks ; Min Timing: 16+6*21+20+20+6*21+20+20+6*21+20+20+6*21+20+3 = 663 clks ; PM: 240 DM: 9 FXD3216L CLRF TEMP CLRF REMB0 CLRF REMB1 RLF AARGB0,W RLF REMB1, F MOVF BARGB1,W SUBWF REMB1, F MOVF BARGB0,W BTFSS _C INCFSZ BARGB0,W SUBWF REMB0, F CLRW BTFSS _C MOVLW 1 SUBWF TEMP, F RLF AARGB0, F MOVLW 7 MOVWF LOOPCOUNT LOOPU3216A RLF AARGB0,W RLF REMB1, F RLF REMB0, F RLF TEMP, F MOVF BARGB1,W BTFSS AARGB0,LSB GOTO UADD26LA SUBWF REMB1, F MOVF BARGB0,W BTFSS _C INCFSZ BARGB0,W SUBWF REMB0, F CLRW BTFSS _C MOVLW 1 SUBWF TEMP, F GOTO UOK26LA UADD26LA ADDWF REMB1, F MOVF BARGB0,W BTFSC _C INCFSZ BARGB0,W ADDWF REMB0, F CLRW BTFSC _C MOVLW 1 ADDWF TEMP, F UOK26LA RLF AARGB0, F DECFSZ LOOPCOUNT, F GOTO LOOPU3216A RLF AARGB1,W RLF REMB1, F RLF REMB0, F RLF TEMP, F MOVF BARGB1,W BTFSS AARGB0,LSB GOTO UADD26L8 SUBWF REMB1, F MOVF BARGB0,W BTFSS _C INCFSZ BARGB0,W SUBWF REMB0, F CLRW BTFSS _C MOVLW 1 SUBWF TEMP, F GOTO UOK26L8 UADD26L8 ADDWF REMB1, F MOVF BARGB0,W BTFSC _C INCFSZ BARGB0,W ADDWF REMB0, F CLRW BTFSC _C MOVLW 1 ADDWF TEMP, F UOK26L8 RLF AARGB1, F MOVLW 7 MOVWF LOOPCOUNT LOOPU3216B RLF AARGB1,W RLF REMB1, F RLF REMB0, F RLF TEMP, F MOVF BARGB1,W BTFSS AARGB1,LSB GOTO UADD26LB SUBWF REMB1, F MOVF BARGB0,W BTFSS _C INCFSZ BARGB0,W SUBWF REMB0, F CLRW BTFSS _C MOVLW 1 SUBWF TEMP, F GOTO UOK26LB UADD26LB ADDWF REMB1, F MOVF BARGB0,W BTFSC _C INCFSZ BARGB0,W ADDWF REMB0, F CLRW BTFSC _C MOVLW 1 ADDWF TEMP, F UOK26LB RLF AARGB1, F DECFSZ LOOPCOUNT, F GOTO LOOPU3216B RLF AARGB2,W RLF REMB1, F RLF REMB0, F RLF TEMP, F MOVF BARGB1,W BTFSS AARGB1,LSB GOTO UADD26L16 SUBWF REMB1, F MOVF BARGB0,W BTFSS _C INCFSZ BARGB0,W SUBWF REMB0, F CLRW BTFSS _C MOVLW 1 SUBWF TEMP, F GOTO UOK26L16 UADD26L16 ADDWF REMB1, F MOVF BARGB0,W BTFSC _C INCFSZ BARGB0,W ADDWF REMB0, F CLRW BTFSC _C MOVLW 1 ADDWF TEMP, F UOK26L16 RLF AARGB2, F MOVLW 7 MOVWF LOOPCOUNT LOOPU3216C RLF AARGB2,W RLF REMB1, F RLF REMB0, F RLF TEMP, F MOVF BARGB1,W BTFSS AARGB2,LSB GOTO UADD26LC SUBWF REMB1, F MOVF BARGB0,W BTFSS _C INCFSZ BARGB0,W SUBWF REMB0, F CLRW BTFSS _C MOVLW 1 SUBWF TEMP, F GOTO UOK26LC UADD26LC ADDWF REMB1, F MOVF BARGB0,W BTFSC _C INCFSZ BARGB0,W ADDWF REMB0, F CLRW BTFSC _C MOVLW 1 ADDWF TEMP, F UOK26LC RLF AARGB2, F DECFSZ LOOPCOUNT, F GOTO LOOPU3216C RLF AARGB3,W RLF REMB1, F RLF REMB0, F RLF TEMP, F MOVF BARGB1,W BTFSS AARGB2,LSB GOTO UADD26L24 SUBWF REMB1, F MOVF BARGB0,W BTFSS _C INCFSZ BARGB0,W SUBWF REMB0, F CLRW BTFSS _C MOVLW 1 SUBWF TEMP, F GOTO UOK26L24 UADD26L24 ADDWF REMB1, F MOVF BARGB0,W BTFSC _C INCFSZ BARGB0,W ADDWF REMB0, F CLRW BTFSC _C MOVLW 1 ADDWF TEMP, F UOK26L24 RLF AARGB3, F MOVLW 7 MOVWF LOOPCOUNT LOOPU3216D RLF AARGB3,W RLF REMB1, F RLF REMB0, F RLF TEMP, F MOVF BARGB1,W BTFSS AARGB3,LSB GOTO UADD26LD SUBWF REMB1, F MOVF BARGB0,W BTFSS _C INCFSZ BARGB0,W SUBWF REMB0, F CLRW BTFSS _C MOVLW 1 SUBWF TEMP, F GOTO UOK26LD UADD26LD ADDWF REMB1, F MOVF BARGB0,W BTFSC _C INCFSZ BARGB0,W ADDWF REMB0, F CLRW BTFSC _C MOVLW 1 ADDWF TEMP, F UOK26LD RLF AARGB3, F DECFSZ LOOPCOUNT, F GOTO LOOPU3216D BTFSC AARGB3,LSB GOTO UOK26L MOVF BARGB1,W ADDWF REMB1, F MOVF BARGB0,W BTFSC _C INCFSZ BARGB0,W ADDWF REMB0, F UOK26L GOTO FXD3216R ;-------------------------------------------------- MAKEWORD MOVLW H'08' CALL CGRAM_ADDRESS MOVLW B'00010000' CALL PRINT_CHAR MOVLW B'00010000' CALL PRINT_CHAR MOVLW B'00010000' CALL PRINT_CHAR MOVLW B'00011111' CALL PRINT_CHAR MOVLW B'00010000' CALL PRINT_CHAR MOVLW B'00010000' CALL PRINT_CHAR MOVLW B'00010000' CALL PRINT_CHAR MOVLW B'00010000' CALL PRINT_CHAR ;END OF WORD 1, LEFT MOVLW B'00000001' CALL PRINT_CHAR MOVLW B'00000001' CALL PRINT_CHAR MOVLW B'00000001' CALL PRINT_CHAR MOVLW B'00011111' CALL PRINT_CHAR MOVLW B'00000001' CALL PRINT_CHAR MOVLW B'00000001' CALL PRINT_CHAR MOVLW B'00000001' CALL PRINT_CHAR MOVLW B'00000001' CALL PRINT_CHAR ;END OF WORD 2, RIGHT MOVLW B'00000100' CALL PRINT_CHAR MOVLW B'00000100' CALL PRINT_CHAR MOVLW B'00000100' CALL PRINT_CHAR MOVLW B'00011111' CALL PRINT_CHAR MOVLW B'00000100' CALL PRINT_CHAR MOVLW B'00000100' CALL PRINT_CHAR MOVLW B'00000100' CALL PRINT_CHAR MOVLW B'00000100' CALL PRINT_CHAR ;END OF WORD 3, CENTRAL GOTO MAIN_M ;------------------------------------------------------ GRAPH1 ;PLOT A SCALE BAR MOVF PWM_C,W MOVWF TEMP1 MOVLW D'102' SUBWF TEMP1,W SKPNC ;F=W MOVLW H'40' ;PWM < 102 CALL DDRAM_ADDRESS MOVLW '<' CALL PRINT_CHAR MOVLW D'15' MOVWF TEMP2 GRAPH_11 MOVLW '-' CALL PRINT_CHAR DECFSZ TEMP2,F GOTO GRAPH_11 GOTO GRAPH_99 ;----------------------------------- GRAPH_21 ;;PWM >= 102 MOVLW D'150' SUBWF TEMP1,W SKPZ ; GOTO GRAPH_31 MOVLW H'40' ;PWM=150 CALL DDRAM_ADDRESS MOVLW D'7' MOVWF TEMP2 GRAPH_22 MOVLW '-' CALL PRINT_CHAR DECFSZ TEMP2,F GOTO GRAPH_22 MOVLW 2 CALL PRINT_CHAR MOVLW 1 CALL PRINT_CHAR MOVLW D'7' MOVWF TEMP2 GRAPH_23 MOVLW '-' CALL PRINT_CHAR DECFSZ TEMP2,F GOTO GRAPH_23 GOTO GRAPH_99 ;---------------------------------- GRAPH_31 MOVLW D'199' SUBWF TEMP1,W SKPC ;F>=W, C=1 GOTO GRAPH_41 MOVLW H'40' ;PWM >= 199 CALL DDRAM_ADDRESS MOVLW D'15' MOVWF TEMP2 GRAPH_32 MOVLW '-' CALL PRINT_CHAR DECFSZ TEMP2,F GOTO GRAPH_32 MOVLW '>' CALL PRINT_CHAR GOTO GRAPH_99 ;---------------------------------------- GRAPH_41 ;101150 CLRF TEMP3 MOVLW D'152' SUBWF TEMP1,W SKPNC ;F= 152, TEMP1 -1 MOVLW D'102' ;PWM -102 SUBWF TEMP1,F GRAPH_42 MOVLW D'6' SUBWF TEMP1,W SKPC ;FFree Web Hosting