[Menu]>[Circuits Gallery]>[DC motor]
001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 032 033 034 035 036 037 038 039 040 041 042 043 044 045 046 047 048 049 050 051 052 053 054 055 056 057 058 059 060 061 062 063 064 065 066 067 068 069 070 071 072 073 074 075 076 077 078 079 080 081 082 083 084 085 086 087 088 089 090 091 092 093 094 095 096 097 098 099 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 | ;******************************************************** ; ; DC motor speed controller ; ; Device : PIC16F873 ; Author : Seiichi Inoue ;******************************************************** list p=pic16f873 include p16f873.inc __config _hs_osc & _wdt_off & _pwrte_on & _lvp_off errorlevel -302 ;Suppress bank warning ;**************** Label Definition ******************** speed equ d'8' ;Reference speed (5x8/256=0.156V) change equ d'1' ;Change value (2mV/ms) led equ h'20' ;LED control data save area ;**************** Program Start *********************** org 0 ;Reset Vector goto init org 4 ;Interrupt Vector goto int ;**************** Initial Process ********************* init ;*** Port initialization bsf status,rp0 ;Change to Bank1 movlw b'00000001' ;AN0 to input mode movwf trisa ;Set TRISA register clrf trisb ;Set TRISB to uotput mode clrf trisc ;Set TRISC to output mode bcf status,rp0 ;Change to Bank0 ;*** A/D converter initialization movlw b'10000001' ;ADCS=10 CHS=AN0 ADON=ON movwf adcon0 ;Set ADCON0 register bsf status,rp0 ;Change to Bank1 movlw b'00001110' ;ADFM=0 PCFG=1110 movwf adcon1 ;Set ADCON1 register bcf status,rp0 ;Change to Bank0 ;*** PWM initialization clrf tmr2 ;Clear TMR2 register movlw b'11111111' ;Max duty (low speed) movwf ccpr1l ;Set CCPR1L register bsf status,rp0 ;Change to Bank1 movlw d'255' ;Period=1638.4usec(610Hz) movwf pr2 ;Set PR2 register bcf status,rp0 ;Change to Bank0 movlw b'00000110' ;Pst=1:1 TMR2=ON Pre=1:16 movwf t2con ;Set T2CON register movlw b'00001100' ;CCP1XY=0 CCP1M=1100(PWM) movwf ccp1con ;Set CCP1CON register ;*** Compare mode initialization clrf tmr1h ;Clear TMR1H register clrf tmr1l ;Clear TMR1L register movlw h'61' ;H'61A8'=25000 movwf ccpr2h ;Set CCPR2H register movlw h'a8' ;25000*0.4usec = 10msec movwf ccpr2l ;Set CCPR2L register movlw b'00000001' ;Pre=1:1 TMR1=Int TMR1=ON movwf t1con ;Set T1CON register movlw b'00001011' ;CCP2M=1011(Compare) movwf ccp2con ;Set CCP2CON register ;*** Interruption control bsf status,rp0 ;Change to Bank1 movlw b'00000001' ;CCP2IE=Enable movwf pie2 ;Set PIE2 register bcf status,rp0 ;Change to Bank0 movlw b'11000000' ;GIE=ON PEIE=ON movwf intcon ;Set INTCON register wait goto $ ;Interruption wait ;*************** Interruption Process ***************** int clrf pir2 ;Clear interruption flag ad_check btfsc adcon0,go ;A/D convert end ? goto ad_check ;No. Again movfw adresh ;Read ADRESH register sublw speed ;Ref speed - Detect speed btfsc status,c ;Reference < Detect ? goto check1 ;No. Jump to > or = check ;--- control to low speed --- movfw ccpr1l ;Read CCPR1L register addlw change ;Change value + CCPR1L btfss status,c ;Overflow ? movwf ccpr1l ;No. Write CCPR1L goto led_cont ;Jump to LED control check1 btfsc status,z ;Reference = Detect ? goto led_cont ;Yes. Jump to LED control ;--- control to fast speed --- movlw change ;Set change value subwf ccpr1l,f ;CCPR1L - Change value btfsc status,c ;Underflow ? goto led_cont ;Jump to LED control clrf ccpr1l ;Set fastest speed ;**************** LED control Process ****************** led_cont comf ccpr1l,w ;Complement CCPR1L bit movwf led ;Save LED data movlw b'00010000' ;Set compare data subwf led,w ;LED - data btfsc status,c ;Under ? goto led1 ;No. movlw b'00000000' ;Set LED control data goto int_end ;Jump to interrupt end led1 movlw b'00100000' ;Set compare data subwf led,w ;LED - data btfsc status,c ;Under ? goto led2 ;No. movlw b'00000001' ;Set LED control data goto int_end ;Jump to interrupt end led2 movlw b'01000000' ;Set compare data subwf led,w ;LED - data btfsc status,c ;Under ? goto led3 ;No. movlw b'00000011' ;Set LED control data goto int_end ;Jump to interrupt end led3 movlw b'01100000' ;Set compare data subwf led,w ;LED - data btfsc status,c ;Under ? goto led4 ;No. movlw b'00000111' ;Set LED control data goto int_end ;Jump to interrupt end led4 movlw b'10000000' ;Set compare data subwf led,w ;LED - data btfsc status,c ;Under ? goto led5 ;No. movlw b'00001111' ;Set LED control data goto int_end ;Jump to interrupt end led5 movlw b'10100000' ;Set compare data subwf led,w ;LED - data btfsc status,c ;Under ? goto led6 ;No. movlw b'00011111' ;Set LED control data goto int_end ;Jump to interrupt end led6 movlw b'11000000' ;Set compare data subwf led,w ;LED - data btfsc status,c ;Under ? goto led7 ;No. movlw b'00111111' ;Set LED control data goto int_end ;Jump to interrupt end led7 movlw b'11100000' ;Set compare data subwf led,w ;LED - data btfsc status,c ;Under ? goto led8 ;No. movlw b'01111111' ;Set LED control data goto int_end ;Jump to interrupt end led8 movlw b'11111111' ;Set LED control data ;************ END of Interruption Process ************** int_end movwf portb ;Set PROTB retfie ;******************************************************** ; END of DC motor speed controller ;******************************************************** end |
MPASM 02.50.02 Intermediate MOTOR.ASM 11-24-2001 19:54:44 PAGE 1 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00001 ;******************************************************** 00002 ; 00003 ; DC motor speed controller 00004 ; 00005 ; Device : PIC16F873 00006 ; Author : Seiichi Inoue 00007 ;******************************************************** 00008 00009 LIST P=PIC16F873 00010 INCLUDE P16F873.INC 00001 LIST 00002 ; P16F873.INC Standard Header File, Version 1.00 00358 LIST 2007 3F72 00011 __CONFIG _HS_OSC & _WDT_OFF & _PWRTE_ON & _LVP_OFF 00012 ERRORLEVEL -302 ;Suppress bank warning 00013 00014 ;**************** Label Definition ******************** 00000008 00015 SPEED EQU D'8' ;Reference speed (5x8/256=0.156V) 00000001 00016 CHANGE EQU D'1' ;Change value (2mV/ms) 00017 00000020 00018 LED EQU H'20' ;LED control data save area 00019 00020 ;**************** Program Start *********************** 0000 00021 ORG 0 ;Reset Vector 0000 2805 00022 GOTO INIT 0004 00023 ORG 4 ;Interrupt Vector 0004 282D 00024 GOTO INT 00025 00026 ;**************** Initial Process ********************* 0005 00027 INIT 00028 00029 ;*** Port initialization 0005 1683 00030 BSF STATUS,RP0 ;Change to Bank1 0006 3001 00031 MOVLW B'00000001' ;AN0 to input mode 0007 0085 00032 MOVWF TRISA ;Set TRISA register 0008 0186 00033 CLRF TRISB ;Set TRISB to uotput mode 0009 0187 00034 CLRF TRISC ;Set TRISC to output mode 000A 1283 00035 BCF STATUS,RP0 ;Change to Bank0 00036 00037 ;*** A/D converter initialization 000B 3081 00038 MOVLW B'10000001' ;ADCS=10 CHS=AN0 ADON=ON 000C 009F 00039 MOVWF ADCON0 ;Set ADCON0 register 000D 1683 00040 BSF STATUS,RP0 ;Change to Bank1 000E 300E 00041 MOVLW B'00001110' ;ADFM=0 PCFG=1110 000F 009F 00042 MOVWF ADCON1 ;Set ADCON1 register 0010 1283 00043 BCF STATUS,RP0 ;Change to Bank0 00044 00045 ;*** PWM initialization 0011 0191 00046 CLRF TMR2 ;Clear TMR2 register 0012 30FF 00047 MOVLW B'11111111' ;Max duty (low speed) 0013 0095 00048 MOVWF CCPR1L ;Set CCPR1L register 0014 1683 00049 BSF STATUS,RP0 ;Change to Bank1 0015 30FF 00050 MOVLW D'255' ;Period=1638.4usec(610Hz) MPASM 02.50.02 Intermediate MOTOR.ASM 11-24-2001 19:54:44 PAGE 2 LOC OBJECT CODE LINE SOURCE TEXT VALUE 0016 0092 00051 MOVWF PR2 ;Set PR2 register 0017 1283 00052 BCF STATUS,RP0 ;Change to Bank0 0018 3006 00053 MOVLW B'00000110' ;Pst=1:1 TMR2=ON Pre=1:16 0019 0092 00054 MOVWF T2CON ;Set T2CON register 001A 300C 00055 MOVLW B'00001100' ;CCP1XY=0 CCP1M=1100(PWM) 001B 0097 00056 MOVWF CCP1CON ;Set CCP1CON register 00057 00058 ;*** Compare mode initialization 001C 018F 00059 CLRF TMR1H ;Clear TMR1H register 001D 018E 00060 CLRF TMR1L ;Clear TMR1L register 001E 3061 00061 MOVLW H'61' ;H'61A8'=25000 001F 009C 00062 MOVWF CCPR2H ;Set CCPR2H register 0020 30A8 00063 MOVLW H'a8' ;25000*0.4usec = 10msec 0021 009B 00064 MOVWF CCPR2L ;Set CCPR2L register 0022 3001 00065 MOVLW B'00000001' ;Pre=1:1 TMR1=Int TMR1=ON 0023 0090 00066 MOVWF T1CON ;Set T1CON register 0024 300B 00067 MOVLW B'00001011' ;CCP2M=1011(Compare) 0025 009D 00068 MOVWF CCP2CON ;Set CCP2CON register 00069 00070 ;*** Interruption control 0026 1683 00071 BSF STATUS,RP0 ;Change to Bank1 0027 3001 00072 MOVLW B'00000001' ;CCP2IE=Enable 0028 008D 00073 MOVWF PIE2 ;Set PIE2 register 0029 1283 00074 BCF STATUS,RP0 ;Change to Bank0 002A 30C0 00075 MOVLW B'11000000' ;GIE=ON PEIE=ON 002B 008B 00076 MOVWF INTCON ;Set INTCON register 00077 002C 00078 WAIT 002C 282C 00079 GOTO $ ;Interruption wait 00080 00081 ;*************** Interruption Process ***************** 002D 00082 INT 002D 018D 00083 CLRF PIR2 ;Clear interruption flag 002E 00084 AD_CHECK 002E 191F 00085 BTFSC ADCON0,GO ;A/D convert end ? 002F 282E 00086 GOTO AD_CHECK ;No. Again 0030 081E 00087 MOVFW ADRESH ;Read ADRESH register 0031 3C08 00088 SUBLW SPEED ;Ref speed - Detect speed 0032 1803 00089 BTFSC STATUS,C ;Reference < Detect ? 0033 2839 00090 GOTO CHECK1 ;No. Jump to > or = check 00091 00092 ;--- control to low speed --- 0034 0815 00093 MOVFW CCPR1L ;Read CCPR1L register 0035 3E01 00094 ADDLW CHANGE ;Change value + CCPR1L 0036 1C03 00095 BTFSS STATUS,C ;Overflow ? 0037 0095 00096 MOVWF CCPR1L ;No. Write CCPR1L 0038 2840 00097 GOTO LED_CONT ;Jump to LED control 00098 0039 00099 CHECK1 0039 1903 00100 BTFSC STATUS,Z ;Reference = Detect ? 003A 2840 00101 GOTO LED_CONT ;Yes. Jump to LED control 00102 00103 ;--- control to fast speed --- MPASM 02.50.02 Intermediate MOTOR.ASM 11-24-2001 19:54:44 PAGE 3 LOC OBJECT CODE LINE SOURCE TEXT VALUE 003B 3001 00104 MOVLW CHANGE ;Set change value 003C 0295 00105 SUBWF CCPR1L,F ;CCPR1L - Change value 003D 1803 00106 BTFSC STATUS,C ;Underflow ? 003E 2840 00107 GOTO LED_CONT ;Jump to LED control 003F 0195 00108 CLRF CCPR1L ;Set fastest speed 00109 00110 ;**************** LED control Process ****************** 0040 00111 LED_CONT 0040 0915 00112 COMF CCPR1L,W ;Complement CCPR1L bit 0041 00A0 00113 MOVWF LED ;Save LED data 0042 3010 00114 MOVLW B'00010000' ;Set compare data 0043 0220 00115 SUBWF LED,W ;LED - data 0044 1803 00116 BTFSC STATUS,C ;Under ? 0045 2848 00117 GOTO LED1 ;No. 0046 3000 00118 MOVLW B'00000000' ;Set LED control data 0047 2873 00119 GOTO INT_END ;Jump to interrupt end 0048 3020 00120 LED1 MOVLW B'00100000' ;Set compare data 0049 0220 00121 SUBWF LED,W ;LED - data 004A 1803 00122 BTFSC STATUS,C ;Under ? 004B 284E 00123 GOTO LED2 ;No. 004C 3001 00124 MOVLW B'00000001' ;Set LED control data 004D 2873 00125 GOTO INT_END ;Jump to interrupt end 004E 3040 00126 LED2 MOVLW B'01000000' ;Set compare data 004F 0220 00127 SUBWF LED,W ;LED - data 0050 1803 00128 BTFSC STATUS,C ;Under ? 0051 2854 00129 GOTO LED3 ;No. 0052 3003 00130 MOVLW B'00000011' ;Set LED control data 0053 2873 00131 GOTO INT_END ;Jump to interrupt end 0054 3060 00132 LED3 MOVLW B'01100000' ;Set compare data 0055 0220 00133 SUBWF LED,W ;LED - data 0056 1803 00134 BTFSC STATUS,C ;Under ? 0057 285A 00135 GOTO LED4 ;No. 0058 3007 00136 MOVLW B'00000111' ;Set LED control data 0059 2873 00137 GOTO INT_END ;Jump to interrupt end 005A 3080 00138 LED4 MOVLW B'10000000' ;Set compare data 005B 0220 00139 SUBWF LED,W ;LED - data 005C 1803 00140 BTFSC STATUS,C ;Under ? 005D 2860 00141 GOTO LED5 ;No. 005E 300F 00142 MOVLW B'00001111' ;Set LED control data 005F 2873 00143 GOTO INT_END ;Jump to interrupt end 0060 30A0 00144 LED5 MOVLW B'10100000' ;Set compare data 0061 0220 00145 SUBWF LED,W ;LED - data 0062 1803 00146 BTFSC STATUS,C ;Under ? 0063 2866 00147 GOTO LED6 ;No. 0064 301F 00148 MOVLW B'00011111' ;Set LED control data 0065 2873 00149 GOTO INT_END ;Jump to interrupt end 0066 30C0 00150 LED6 MOVLW B'11000000' ;Set compare data 0067 0220 00151 SUBWF LED,W ;LED - data 0068 1803 00152 BTFSC STATUS,C ;Under ? 0069 286C 00153 GOTO LED7 ;No. 006A 303F 00154 MOVLW B'00111111' ;Set LED control data 006B 2873 00155 GOTO INT_END ;Jump to interrupt end 006C 30E0 00156 LED7 MOVLW B'11100000' ;Set compare data MPASM 02.50.02 Intermediate MOTOR.ASM 11-24-2001 19:54:44 PAGE 4 LOC OBJECT CODE LINE SOURCE TEXT VALUE 006D 0220 00157 SUBWF LED,W ;LED - data 006E 1803 00158 BTFSC STATUS,C ;Under ? 006F 2872 00159 GOTO LED8 ;No. 0070 307F 00160 MOVLW B'01111111' ;Set LED control data 0071 2873 00161 GOTO INT_END ;Jump to interrupt end 0072 30FF 00162 LED8 MOVLW B'11111111' ;Set LED control data 00163 00164 ;************ END of Interruption Process ************** 0073 00165 INT_END 0073 0086 00166 MOVWF PORTB ;Set PROTB 0074 0009 00167 RETFIE 00168 00169 ;******************************************************** 00170 ; END of DC motor speed controller 00171 ;******************************************************** 00172 00173 END MPASM 02.50.02 Intermediate MOTOR.ASM 11-24-2001 19:54:44 PAGE 5 The label list has been deleted. MEMORY USAGE MAP ('X' = Used, '-' = Unused) 0000 : X---XXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0040 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXX----------- 2000 : -------X-------- ---------------- ---------------- ---------------- All other memory blocks unused. Program Memory Words Used: 114 Program Memory Words Free: 3982 Errors : 0 Warnings : 0 reported, 0 suppressed Messages : 0 reported, 6 suppressed |
motor_source.zip motor_hex.zip |