発電実験:発電機励磁装置
元に戻る
Ⅸ.プログラム(ソースリスト)
2024/7/2
本文目次
本文以外目次
1.初期値・定数
2.リセットベクター~初期化
3.サブルーチン LCD
4.割込みサブルーチン
5.テーブル
本 文
1.初期値・定数
;******************************************* ;CONFIG 125P LIST P=PIC16F1938 ; LIST宣言で、使用するPICをPIC16F1938と定義する INCLUDE P16F1938.INC ; 設定ファイルp16f1938.incを読み込む ERRORLEVEL -207,-302,-306 __CONFIG _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_OFF & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOREN_OFF & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF __CONFIG _CONFIG2, _WRT_OFF & _VCAPEN_OFF & _PLLEN_ON & _STVREN_OFF & _BORV_19 & _LVP_OFF ;******************************************* ; プログラムを書き込む時に ■■ 試験 の場所を処理すること BANK0 MACRO MOVLB 0 ENDM BANK1 MACRO MOVLB 1 ENDM BANK2 MACRO MOVLB 2 ENDM BANK3 MACRO MOVLB 3 ENDM BANK4 MACRO MOVLB 4 ENDM ;BANK5 MACRO ; MOVLB 5 ; ENDM BANK6 MACRO MOVLB 6 ENDM BANK7 MACRO MOVLB 7 ENDM BANK8 MACRO MOVLB 8 ENDM ;この中にプログラムを記載する。 ;############################################ ; 定数値/変数アドレス設定 ;############################################ ;定数 ;●CPUの各レジスターの初期値の定数 詳細はMPLABIDEの使い方のプログラミング 定数設定を参照 SET_OSCCON EQU B'11110000' ;8MHz×4 '11110000' SET_OPTION EQU B'00100001' ;(5)=0 ;入出力設定 SET_TRISA_PWMT EQU B'00110000' ;PWM使用時設定 出力=0 CCP5(4)の初期ロックで=1 SET_TRISA EQU B'00100000' ;出力=0 CCP5(4)は出力=0 SET_ANSELA EQU B'00100000' ;RA5(AN4) SET_WPUB EQU B'00000000' ; プルアップ設定 SET_TRISB EQU B'11111110' ; 1,2はロータリーエンコーダ SET_ANSELB EQU B'00000000' SET_IOCBP EQU B'00010000' ; 4は立上りで検出 SET_IOCBN EQU B'00000110' ; 1,2は立下りでフラグ SET_TRISC EQU B'00000000' ;A/D関係 SET_ADCON0 EQU B'00010001' ;6-2:AN4の使用 0:ADCイネーブルビット SET_ADCON1 EQU B'11100000' ;7:右詰め 6-4:A/DクロックFosc/64 2,1-0 基準電圧 ;タイマー関係 SET_TMR0 EQU 0x00 ;0xDA ;割込みサブルーチンで再使用するための定数 SET_T2CON EQU B'00000000' ;PMW用 リセット信号分周期 SET_PR2 EQU 0xFF ;PWM用 タイマーカウント比較値 SET_CCPTMRS1 EQU B'00000000' ;PWM用 CCP5= B'xxxxxx00' SET_CCP5CON EQU B'00111100' ;PWM用 プリスケラーほか設定 SET_CCPR5L EQU 0x80 ;PWM用 出力値デューティ時間 SET_T4CON EQU B'00001011' ;AVR用 割り込み分周期 SET_PR4 EQU D'125' ;AVR用 タイマーカウント比較値 SET_T6CON EQU B'01111011' ;インデンシャル動作信号割り込み分周期 SET_PR6 EQU D'125' ;インデンシャル動作信号用タイマーカウント比較値 ;割り込み関係 SET_INTCON EQU B'11001000' ;標準 B'11001000' ;7: GIE :グローバル割り込みイネーブルビット ;6: PEIE :周辺装置割り込みイネーブルビット ;5: TMR0IE:Timer0オーバーフロー割り込みイネーブルビット ;4: INTE :RB0/INT外部割込みイネーブルビット ;3: IOCIE :状態変化イネーブルビット ;2: TMR0IF:Timer0オーバーフロー割り込みフラグビット ;1: INTF :INT外部割込みフラグビット ;O: IOCIF :状態変化割り込みフラグビット SET_PIE1 EQU B'00000000' ;6: ADIE:A/Dコンバータ割り込みイネーブルビット SET_PIE2 EQU B'00000000' ; SET_PIE3 EQU B'00001010' ;3,1:TMRx/PRx x=6,4 Timer6,4 割り込みに使用 ;設定 SET_AVR_90RH EQU D'0' SET_AVR_90R EQU D'200' SET_AVR_90SH EQU D'0' SET_AVR_90S EQU D'100' SET_PGAIN EQU D'30' ;Pゲイン初期値 SET_IGAIN EQU D'60' ;Iゲイン初期値 SET_DGAIN EQU D'10' ;Dゲイン初期値 ;●その他定数 TBLA EQU 3 ;■■■■ テーブルデータのアドレスに注意! プログラム変更で再確認必要 LRW EQU 4 ;RW 1で読込み LE EQU 5 ;E 1でイネーブル LRS EQU 6 ;RS 1でデータ CS_MAX EQU 6 ;カーソル最大+1番号 ;●メモリーのアドレス(定数) TM1 EQU 0x20 ;タイマー, で使用 TM2 EQU 0x21 ;タイマー, で使用 TM3 EQU 0x22 ;INIT, で使用 STRC EQU 0x23 ;LCD文字列長さカウンター MEMST EQU 0x24 ;LCDメモリー転送アドレス格納 SETUP EQU 0x25 ;テーブルデータにアドレス記載あり変更時に同様に変更の事 LOOP EQU 0x26 ;演算で使用する回数 CSNO EQU 0x27 ;カーソル位置番号 CSNOB EQU 0x28 ;同上 DIN_H EQU 0x29 ;②微分値(ゲイン前) DIN_L EQU 0x2A DSIG_H EQU 0x2B ;④微分信号 DSIG_L EQU 0x2C ISIG_H EQU 0x2D ;⑤積分信号 ISIG_L EQU 0x2E IpsD_H EQU 0x2F ;⑦積分値+微分値 IpsD_L EQU 0x30 PSIG_H EQU 0x31 ;⑧比例信号 PSIG_L EQU 0x32 OUT_H EQU 0x33 ;⑨出力 OUT_L EQU 0x34 AVR_90SH EQU 0x35 ;設定値 90SH AVR_90S EQU 0x36 ;設定値 90S AVR_90RH EQU 0x37 ;設定値 90RH AVR_90R EQU 0x38 ;設定値 90R CALC_H EQU 0x39 ;演算サブルーチン用データ引数エリア_H CALC_M EQU 0x3A ;演算サブルーチン用データ引数エリア_M CALC_L EQU 0x3B ;演算サブルーチン用データ引数エリア_L CALC_A EQU 0x3C ;演算サブルーチン用データ引数エリア_A CALC_B EQU 0x3D ;演算サブルーチン用データ引数エリア_A XC_H EQU 0x3E ;90Rと90Sの値を入れ替え処理(RB_IDS)でしようする XC_L EQU 0x3F ;同上 OP_H EQU 0x42 ;計算で使用する OP_M EQU 0x43 ;同上 OP_L EQU 0x44 ;同上 ;だめなら 0x70以上 PG EQU 0x45 ;設定値 比例ゲイン 0~100 IG EQU 0x46 ;設定値 積分ゲイン 0~100 DG EQU 0x47 ;設定値 微分ゲイン 0~100 PWM_H EQU 0x48 ;PWMの上位2bit PWM_L EQU 0x49 ;PWMの下位8bit NW_H EQU 0x4A ;今回差H NW_L EQU 0x4B ;今回差L BF_H EQU 0x4C ;前回差H BF_L EQU 0x4D ;前回差L TL_H EQU 0x4E ;累計H TL_L EQU 0x4F ;累計L AD_H EQU 0x70 ;A/D 値 ADRESH AD_L EQU 0x71 ;A/D 値 ADRESL CAI_H EQU 0x72 ;バンク切り替えを伴う引数 CAI_L EQU 0x73 ;バンク切り替えを伴う引数 FG EQU 0x7F ;7 ;6 ;5 ;4 ダイヤル 1=加算処理 ;3 ダイヤル処理完了 ;2 LCDカーソル表示を 1:2にする ;1 LCD表示の処理 1=内容表示とボタン処理 0=カーソル表示 ;0 ボタン割込み処理OK 処理 ;各値のLCDメモリーアドレス ;LCDMAD_A EQU 0x59 ;LCDM90_A EQU 0x5D ;LCDMP_A EQU 0x61 ;LCDMI_A EQU 0x65 ;LCDMD_A EQU 0x69 ;LCDMSS_A EQU 0x6C ;LCDMS_A EQU 0x6D ;LCD_No0 EQU 0x5F ;LCD_No1 EQU 0x62 ;LCD_No2 EQU 0x66 ;LCD_No3 EQU 0x6A ;LCD_No4 EQU 0x6F ;LCD_No5 EQU 0x6C ;AVR_90RSET EQU 0xFE ;LCDカーソルの表示メモリアドレス テーブルへ移動 LCDMEM_SD EQU 0x50 ;下段メモリースタートアドレス LCDMEM_SU EQU 0x60 ;上段メモリースタートアドレス LCDMEM_C EQU 0x10 ;0x10 ;メモリー読込み回数 LCDV EQU 0x59 ;電圧表示上位アドレス LCDR EQU 0x5D ;90R表示上位アドレス LCDP EQU 0x61 ;比例ゲイン表示上位アドレス LCDI EQU 0x65 ;積分ゲイン表示上位アドレス LCDD EQU 0x69 ;微分ゲイン表示上位アドレス LCDS EQU 0x6D ;90セット表示上位アドレス LCDC EQU 0x6C ;カーソル位置
[目次に戻る]
2.リセットベクター~初期化
;############################################ ; リセットベクター ;############################################ ORG 00h GOTO INIT ;############################################ ; 割り込みベクター 割込み内のFSRxH,FSRxLのxは0を使用 ;############################################ ORG 4 BANK0 BCF INTCON,GIE BTFSC INTCON,IOCIF CALL I_RB BTFSC PIR3,TMR6IF CALL I_TMR6 BTFSC PIR3,TMR4IF CALL I_TMR4 BANK0 ;割込みを開始する。 MOVLW SET_INTCON MOVWF INTCON RETFIE ;############################################ ; 初期化~メイン処理 ;############################################ ;======= I/Oの初期化 ======= INIT BANK4 MOVLW SET_WPUB MOVWF WPUB BANK0 CLRF TM1 CLRF TM2 CLRF TM3 CLRF STRC CLRF MEMST CLRF SETUP CLRF LOOP CLRF CSNO CLRF CSNOB CLRF DIN_H CLRF DIN_L CLRF DSIG_H CLRF DSIG_L CLRF ISIG_H CLRF ISIG_L CLRF IpsD_H CLRF IpsD_L CLRF PSIG_H CLRF PSIG_L CLRF OUT_H CLRF OUT_L MOVLW SET_AVR_90SH MOVWF AVR_90SH MOVLW SET_AVR_90S MOVWF AVR_90S MOVLW SET_AVR_90RH MOVWF AVR_90RH MOVLW SET_AVR_90R MOVWF AVR_90R CLRF CALC_H CLRF CALC_M CLRF CALC_L CLRF CALC_A CLRF CALC_B CLRF XC_H CLRF XC_L CLRF OP_H CLRF OP_M CLRF OP_L MOVLW SET_PGAIN MOVWF PG MOVLW SET_IGAIN MOVWF IG MOVLW SET_DGAIN MOVWF DG CLRF PWM_H CLRF PWM_L CLRF NW_H CLRF NW_L CLRF BF_H CLRF BF_L CLRF TL_H CLRF TL_L CLRF AD_H CLRF AD_L CLRF CAI_H CLRF CAI_L CLRF FG CLRF INTCON CLRF PIR1 CLRF PIR2 CLRF PIR3 CLRF PORTA CLRF PORTB CLRF PORTC BANK2 CLRF LATA CLRF LATB CLRF LATC BANK1 CLRF ADRESH CLRF ADRESL MOVLW SET_OSCCON MOVWF OSCCON MOVLW SET_OPTION MOVWF OPTION_REG MOVLW SET_TRISA_PWMT MOVWF TRISA MOVLW SET_TRISB MOVWF TRISB MOVLW SET_TRISC MOVWF TRISC CALL LCD_INT BANK3 MOVLW SET_ANSELA MOVWF ANSELA MOVLW SET_ANSELB MOVWF ANSELB BANK1 MOVLW SET_ADCON0 MOVWF ADCON0 MOVLW SET_ADCON1 MOVWF ADCON1 BANK0 ;PWMの設定 MOVLW SET_CCPTMRS1 MOVWF CCPTMRS1 MOVLW SET_PR2 MOVWF PR2 MOVLW SET_T2CON MOVWF T2CON BANK6 MOVLW SET_CCP5CON MOVWF CCP5CON MOVLW SET_CCPR5L MOVWF CCPR5L BANK0 CLRF PIR1 BSF T2CON,2 PWM_ZYUNBITYU BTFSS PIR1,TMR2IF GOTO PWM_ZYUNBITYU BCF PIR1,TMR2IF BANK1 MOVLW SET_TRISA MOVWF TRISA BANK0 LOOP1 BTFSS PORTA,4 GOTO LOOP1 CLRF PWM_H CLRF PWM_L ;その他Timer関係 BANK8 MOVLW SET_PR4 MOVWF PR4 MOVLW SET_T4CON MOVWF T4CON MOVLW SET_PR6 MOVWF PR6 MOVLW SET_T6CON MOVWF T6CON ;割込み関係 BANK1 MOVLW SET_PIE1 MOVWF PIE1 MOVLW SET_PIE2 MOVWF PIE2 MOVLW SET_PIE3 MOVWF PIE3 BANK7 MOVLW SET_IOCBP MOVWF IOCBP MOVLW SET_IOCBN MOVWF IOCBN CLRF IOCBF BANK8 BSF T4CON,2 BANK0 MOVLW SET_TMR0 MOVWF TMR0 MOVLW SET_INTCON MOVWF INTCON ; CALL SET_PWM ;############################################ ; ; メイン処理 ; ;############################################ END_TEST CALL LCD_CRT GOTO END_TEST
[目次に戻る]
3.サブルーチン LCD
;=========================== ; LCD初期化サブルーチン ;=========================== LCD_INT ;======= LCDの初期化 ======= BANK0 ;LCD表示文字をメモリーへ移動 MOVLW LCDMEM_C MOVWF STRC MOVLW LCDMEM_SD MOVWF FSR1 MOVLW TBLA MOVWF PCLATH LCD_DATAD MOVF STRC,W CALL LCDD_INT1 MOVWI INDF1++ DECFSZ STRC,F GOTO LCD_DATAD MOVLW LCDMEM_C MOVWF STRC MOVLW LCDMEM_SU MOVWF FSR1 MOVLW TBLA MOVWF PCLATH LCD_DATAU MOVF STRC,W CALL LCDD_INT2 MOVWI INDF1++ DECFSZ STRC,F GOTO LCD_DATAU ;LCD初期化 CALL TM_20ms MOVLW B'00000011' CALL LCD_CM CALL TM_2ms MOVLW B'00000011' CALL LCD_CM CALL TM_2ms MOVLW B'00000011' CALL LCD_CM CALL TM_2ms MOVLW B'00000010' CALL LCD_CM CALL TM_50us MOVLW B'00101000' CALL LCD_CM4 MOVLW B'00001111' CALL LCD_CM4 MOVLW B'00000110' CALL LCD_CM4 MOVLW B'00000001' CALL LCD_CM4 CALL TM_2ms ;表示 CALL LCD_CRT RETURN ;=========================== ; LCD関係サブルーチン ;=========================== ;LCD表示メモリー内容をLCDで表示する LCD_CRT BTFSS FG,1 GOTO LCD_CRT1 CALL LCDMAD_HX BTFSS FG,2 GOTO LCD_CRT21 BCF FG,1 LCD_CRT21 BSF FG,2 GOTO LCD_CRT2 LCD_CRT1 MOVLW TBLA MOVWF PCLATH MOVF CSNO,W CALL LCD_MNo MOVWF FSR1 MOVLW 0x5F MOVWI INDF1++ BSF FG,1 NOP BCF FG,2 LCD_CRT2 BANK0 ;1行目表示 MOVLW B'10000000' CALL LCD_CM4 MOVLW LCDMEM_C MOVWF STRC MOVLW LCDMEM_SD MOVWF FSR1 LCD_C1 MOVIW INDF1++ CALL LCD_DA4 DECFSZ STRC,F GOTO LCD_C1 ;2行目表示 MOVLW B'11000000' CALL LCD_CM4 MOVLW LCDMEM_C MOVWF STRC MOVLW LCDMEM_SU MOVWF FSR1 ;INDF1 LCD_C2 MOVIW INDF1++ CALL LCD_DA4 DECFSZ STRC,F GOTO LCD_C2 BCF FG,0 RETURN LCD_CM4 MOVWF TM3 SWAPF TM3,W ANDLW 0x0F CALL LCD_CM MOVF TM3,W ANDLW 0x0F CALL LCD_CM CALL TM_50us RETURN LCD_CM MOVWF PORTC NOP BCF PORTC,LRW NOP BCF PORTC,LRS NOP BSF PORTC,LE NOP BCF PORTC,LE RETURN LCD_DA4 MOVWF TM3 SWAPF TM3,W ANDLW 0x0F CALL LCD_DA MOVF TM3,W ANDLW 0x0F CALL LCD_DA CALL TM_50us RETURN LCD_DA MOVWF PORTC NOP BCF PORTC,LRW NOP BSF PORTC,LRS NOP BSF PORTC,LE NOP BCF PORTC,LE NOP BCF PORTC,LRS RETURN ; ; LCD 表示データの更新 ; LCDMAD_HX ;ADの値16bitをLCDメモリーに記載する MOVF AD_H,W ANDLW 0x0F ADDLW 0xF6 BTFSS STATUS,C ADDLW 0xF9 ADDLW 0x41 MOVWF LCDV SWAPF AD_L,W ANDLW 0x0F ADDLW 0xF6 BTFSS STATUS,C ADDLW 0xF9 ADDLW 0x41 MOVWF LCDV+1 MOVF AD_L,W ANDLW 0x0F ADDLW 0xF6 BTFSS STATUS,C ADDLW 0xF9 ADDLW 0x41 MOVWF LCDV+2 LCDM90R_HX ;■90Rの値をLCDメモリーに記載する MOVF AVR_90RH,W ANDLW 0x0F ADDLW 0xF6 BTFSS STATUS,C ADDLW 0xF9 ADDLW 0x41 MOVWF LCDR SWAPF AVR_90R,W ANDLW 0x0F ADDLW 0xF6 BTFSS STATUS,C ADDLW 0xF9 ADDLW 0x41 MOVWF LCDR+1 MOVF AVR_90R,W ANDLW 0x0F ADDLW 0xF6 BTFSS STATUS,C ADDLW 0xF9 ADDLW 0x41 MOVWF LCDR+2 LCDMP_HX SWAPF PG,W ANDLW 0x0F ADDLW 0xF6 BTFSS STATUS,C ADDLW 0xF9 ADDLW 0x41 MOVWF LCDP MOVF PG,W ANDLW 0x0F ADDLW 0xF6 BTFSS STATUS,C ADDLW 0xF9 ADDLW 0x41 MOVWF LCDP+1 LCDMI_HX SWAPF IG,W ANDLW 0x0F ADDLW 0xF6 BTFSS STATUS,C ADDLW 0xF9 ADDLW 0x41 MOVWF LCDI MOVF IG,W ANDLW 0x0F ADDLW 0xF6 BTFSS STATUS,C ADDLW 0xF9 ADDLW 0x41 MOVWF LCDI+1 LCDMD_HX SWAPF DG,W ANDLW 0x0F ADDLW 0xF6 BTFSS STATUS,C ADDLW 0xF9 ADDLW 0x41 MOVWF LCDD MOVF DG,W ANDLW 0x0F ADDLW 0xF6 BTFSS STATUS,C ADDLW 0xF9 ADDLW 0x41 MOVWF LCDD+1 LCDMS_ST MOVLW 'S' MOVWF LCDC LCDMS_HX MOVF AVR_90SH,W ANDLW 0x0F ADDLW 0xF6 BTFSS STATUS,C ADDLW 0xF9 ADDLW 0x41 MOVWF LCDS SWAPF AVR_90S,W ANDLW 0x0F ADDLW 0xF6 BTFSS STATUS,C ADDLW 0xF9 ADDLW 0x41 MOVWF LCDS+1 MOVF AVR_90S,W ANDLW 0x0F ADDLW 0xF6 BTFSS STATUS,C ADDLW 0xF9 ADDLW 0x41 MOVWF LCDS+2 RETURN ;====== タイマー ======= TM_20ms MOVLW 0xCE MOVWF TM2 MOVLW 0xF7 MOVWF TM1 GOTO TM_B1 TM_5ms MOVLW 0x33 MOVWF TM2 MOVLW 0xB7 MOVWF TM1 GOTO TM_B1 TM_2ms MOVLW 0x14 MOVWF TM2 MOVLW 0xAF MOVWF TM1 GOTO TM_B1 TM_150us MOVLW 0x01 MOVWF TM2 MOVLW 0x8A MOVWF TM1 GOTO TM_B1 TM_50us MOVLW 0x00 MOVWF TM2 MOVLW 0x82 MOVWF TM1 TM_B1 DECFSZ TM1,F GOTO TM_B1 MOVF TM2,F BTFSC STATUS,Z GOTO TM_B2 DECF TM2,F GOTO TM_B1 TM_B2 RETURN
[目次に戻る]
4.割込みサブルーチン
;=========================== ;AVR演算処理用 Timer4処理 ;=========================== I_TMR4 BANK1 BSF ADCON0,1 ;A/D変換サイクル開始 I_TMR41 BTFSC ADCON0,1 GOTO I_TMR41 MOVF ADRESH,w ANDLW B'00000011' MOVWF AD_H MOVF ADRESL,w MOVWF AD_L BANK0 CALL OPX1 MOVLW B'00000010' XORWF PORTA,F BCF PIR3,1 RETURN ;=========================== ;インデンシャル動作信号用 Timer6処理 ;=========================== I_TMR6 BANK8 BCF T6CON,2 BANK0 BCF PORTA,2 NOP BCF PIR3,3 RETURN ;=========================== ; A/D変換 ;=========================== I_AD ;ADCON0 レジスタの GO/DONE(1) ビットを「1」にセットすると A/D 変換を開始します ;GO/DONE ビットをクリアする ;ADIF 割り込みフラグ ビットをセットする ;ADRESH:ADRESL レジスタに新しい変換結果を書き込む BANK0 BCF PIR1,ADIF BANK1 MOVF ADRESH,w MOVWF AD_H MOVF ADRESL,w MOVWF AD_L BANK0 BANK1 BSF ADCON0,1 ;A/D変換サイクル開始 BANK0 RETURN ;=========================== ; 演算 ;=========================== ;PID制御回路 OPX1 ;① 90R(AVR_90Rx) - A/D(ADx) = 今回差(NW_x) MOVF AVR_90RH,W MOVWF NW_H MOVF AVR_90R,W MOVWF NW_L MOVF AD_L,W SUBWF NW_L,F MOVF AD_H,W BTFSS STATUS,C ADDLW 0x01 SUBWF NW_H,F OPX2 ;② 今回差(NW_x)-前回差(BF_x)=DIN(DIN_x) MOVF NW_H,W MOVWF DIN_H MOVF NW_L,W MOVWF DIN_L MOVF BF_L,W SUBWF DIN_L,F MOVF BF_H,W BTFSS STATUS,C ADDLW 0x01 SUBWF DIN_H,F OPX3 ;③ 今回差=前回差 MOVF NW_H,W MOVWF BF_H MOVF NW_L,W MOVWF BF_L OPX4 ;④ DIN×微分ゲイン(8bit)=DSIG(微分出力) MOVF DIN_H,W MOVWF CALC_H MOVF DIN_L,W MOVWF CALC_L BTFSC DIN_H,7 CALL OPX_HO MOVF DG,W MOVWF CALC_A CALL MU BTFSC DIN_H,7 CALL OPX_HO MOVF CALC_H,W MOVWF DSIG_H MOVF CALC_L,W MOVWF DSIG_L OPX5 ;⑤ 今回差×積分ゲイン=ISIG MOVF NW_H,W MOVWF CALC_H MOVF NW_L,W MOVWF CALC_L BTFSC NW_H,7 CALL OPX_HO MOVF IG,W MOVWF CALC_A CALL MU BTFSC NW_H,7 CALL OPX_HO MOVF CALC_H,W MOVWF ISIG_H MOVF CALC_L,W MOVWF ISIG_L OPX6 ;⑥ 累計値(TL_x)+ISIG=累計値(TL_x) MOVF ISIG_L,W ADDWF TL_L,F MOVF ISIG_H,W BTFSC STATUS,C ADDLW 0x01 ADDWF TL_H,F OPX7 ;⑦ FG,6=0 ●累積値+DSIG=IpsD MOVF TL_L,W MOVWF IpsD_L MOVF TL_H,W MOVWF IpsD_H MOVF DSIG_L,W ADDWF IpsD_L,F MOVF DSIG_H,W BTFSC STATUS,C ADDLW 0x01 ADDWF IpsD_H,F OPX8 ;⑧ 今回差×比例ゲイン(8bit)=PSIG MOVF NW_H,W MOVWF CALC_H MOVF NW_L,W MOVWF CALC_L BTFSC NW_H,7 CALL OPX_HO MOVF PG,W MOVWF CALC_A CALL MU BTFSC NW_H,7 CALL OPX_HO MOVF CALC_H,W MOVWF PSIG_H MOVF CALC_L,W MOVWF PSIG_L OPX9 ;⑨ IpsD+PSIG=OUT MOVF IpsD_H,W MOVWF OUT_H MOVF IpsD_L,W MOVWF OUT_L MOVF PSIG_L,W ADDWF OUT_L,F MOVF PSIG_H,W BTFSC STATUS,C ADDLW 0x01 ADDWF OUT_H,F BTFSS OUT_H,7 GOTO OPX10 CLRF OUT_H CLRF OUT_L OPX10 ;⑩ 上位2bit,下位8bit → 上位8bit,下位2bitへ変換しPWM書込み準備 MOVF OUT_H,W MOVWF CAI_H MOVF OUT_L,W MOVWF CAI_L LSRF CAI_H,F RRF CAI_L,F RRF CAI_H,F RRF CAI_L,F RRF CAI_H,F LSRF CAI_H,F LSRF CAI_H,F BANK6 MOVLW B'11001111' ANDWF CCP5CON,F MOVF CAI_H,W IORWF CCP5CON,F MOVF CAI_L,W MOVWF CCPR5L BANK0 RETURN OPX_HO ;CALCの 2の補数表現処理サブルーチン ;反転 MOVLW B'11111111' XORWF CALC_H,F MOVLW B'11111111' XORWF CALC_L,F ;加算 INCFSZ CALC_L,F RETURN INCF CALC_H,F RETURN ;--------------------------- ; 掛け算/割合の処理演算 MU ;--------------------------- MU ;10bitの数値を100%で乗算する ;10bit×7bit(MAX100)/7bit(100) ;10bitの数値はCALC_H,CALC_Lに入れる ;7bitの数値はCALC_Aに入れる ;答えはCALC_H,CALC_Lに入っている ;初期処理 MOVF CALC_L,W MOVWF CALC_M CLRF CALC_L MOVLW B'00000011' ANDWF CALC_H,F MOVLW B'01111111' ANDWF CALC_A,F ;掛け算部 MOVLW D'6' MOVWF CALC_B MU1 LSLF CALC_M,F RLF CALC_H,F DECFSZ CALC_B,F GOTO MU1 ;掛け算 MOVLW D'10' MOVWF CALC_B MU2 LSLF CALC_L,F RLF CALC_M,F RLF CALC_H,F MOVF CALC_A,W BTFSC STATUS,C ADDWF CALC_L,F BTFSC STATUS,C INCF CALC_M,F DECFSZ CALC_B,F GOTO MU2 ;割り算部 MOVLW D'6' MOVWF CALC_B MU3 LSLF CALC_L,F RLF CALC_M,F RLF CALC_H,F DECFSZ CALC_B,F GOTO MU3 ;割り算 MOVLW D'10' MOVWF CALC_B MU4 LSLF CALC_L,F RLF CALC_M,F RLF CALC_H,F MOVLW D'100' SUBWF CALC_H,W BTFSS STATUS,C GOTO MU5 MOVWF CALC_H BSF CALC_L,0 MU5 DECFSZ CALC_B,F GOTO MU4 MOVLW B'00000011' ANDWF CALC_M,W ;後処理 MOVWF CALC_H CLRF CALC_M RETURN ;=========================== ; PWM ;=========================== SET_PWM ;10Bit→PWM用10Bitデータへ変換し、書込み MOVF PWM_L,W MOVWF OP_L MOVF PWM_H,W ANDLW B'00000011' MOVWF OP_M LSRF OP_M,F RRF OP_L,F RRF OP_M,F RRF OP_L,F RRF OP_M,F LSRF OP_M,F LSRF OP_M,F BANK6 MOVLW B'11001111' ANDWF CCP5CON,F MOVF OP_M,W IORWF CCP5CON,F MOVF OP_L,W MOVWF CCPR5L BANK0 RETURN ;=========================== ; ボタン・ダイヤル処理(B処理) ;=========================== I_RB BANK7 BCF INTCON,IOCIF NOP ;IOCBFを見て割込み場所の確認とクリアをする BTFSC IOCBF,1 GOTO RB_AF BTFSC IOCBF,2 GOTO RB_BF BTFSC IOCBF,4 GOTO RB_BT ;エラー処理 RETURN ;A方向フラグ処理 RB_AF ;2を確認し、Lで無かったら1の先on BCF IOCBF,1 BANK0 BTFSC PORTB,2 RETURN MOVF CSNO,W MOVWF CSNOB BTFSC STATUS,Z GOTO RB_AF_RIN DECFSZ CSNOB,F GOTO RB_AF_IIN RB_AF_PIN ;■■■ Pゲインの加算 ■■■ INCF PG,F MOVLW 0x64 SUBWF PG,W BTFSS STATUS,C RETURN RB_AF_PIN100 ;100より大きい場合 MOVLW 0x64 MOVWF PG RETURN RB_AF_IIN DECFSZ CSNOB,F GOTO RB_AF_DIN ;■■■ Iゲインの加算 ■■■ INCF IG,F MOVLW 0x64 SUBWF IG,W BTFSS STATUS,C RETURN RB_AF_IIN100 ;100より大きい場合 MOVLW 0x64 MOVWF IG RETURN RB_AF_DIN DECFSZ CSNOB,F GOTO RB_AF_SIN ;■■■ Dゲインの加算 ■■■ INCF DG,F MOVLW 0x64 SUBWF DG,W BTFSS STATUS,C RETURN RB_AF_DIN100 ;100より大きい場合 MOVLW 0x64 MOVWF DG RETURN RB_AF_SIN DECFSZ CSNOB,F GOTO RB_IDS ;■■■ LCDNo4の加算処理 ■■■ INCFSZ AVR_90S,W GOTO RB_AF_SIN2 MOVF AVR_90SH,W ADDLW 0xFD BTFSC STATUS,C GOTO RB_AF_SIN1 INCF AVR_90SH,F CLRF AVR_90S RETURN RB_AF_SIN1 ;Ioc43_INC ;2以上になった場合の暴走を防ぐ MOVLW 0x03 MOVWF AVR_90SH RETURN RB_AF_SIN2 MOVWF AVR_90S RETURN RB_AF_RIN ;■■■ LCDNoOの加算処理 ■■■ INCFSZ AVR_90R,W GOTO RB_AF_RIN3 MOVF AVR_90RH,W ADDLW 0xFD BTFSC STATUS,C GOTO RB_AF_RIN2 INCF AVR_90RH,F CLRF AVR_90R RETURN RB_AF_RIN2 ;Ioc03_INC ;2以上になった場合の暴走を防ぐ MOVLW 0x03 ;02 MOVWF AVR_90RH RETURN RB_AF_RIN3 ;Ioc02_INC MOVWF AVR_90R RETURN ;A,B共通処理 RB_IDS ;Ioc51 ;■■■ インデンシャル処理 ■■■ BSF PORTA,2 MOVF AVR_90R,W MOVWF XC_L MOVF AVR_90RH,W MOVWF XC_H MOVF AVR_90S,W MOVWF AVR_90R MOVF AVR_90SH,W MOVWF AVR_90RH MOVF XC_L,W MOVWF AVR_90S MOVF XC_H,W MOVWF AVR_90SH BANK8 BSF T6CON,2 BANK0 RETURN ;B方向フラグ処理 RB_BF ;2を確認し、Lで無かったら1の先on BCF IOCBF,2 BANK0 BTFSC PORTB,1 RETURN MOVF CSNO,W MOVWF CSNOB BTFSC STATUS,Z GOTO RB_BF_RDE RB_BF_PDE ;Ioc11_DEC DECFSZ CSNOB,F GOTO RB_BF_IDE ;■■■ Pゲインの減算 ■■■ MOVF PG,F BTFSC STATUS,Z RETURN DECF PG,F RETURN RB_BF_IDE DECFSZ CSNOB,F GOTO RB_BF_DDE ;■■■ Iゲインの減算 ■■■ MOVF IG,F BTFSC STATUS,Z RETURN DECF IG,F RETURN RB_BF_DDE DECFSZ CSNOB,F GOTO RB_BF_SDE ;■■■ Dゲインの減算 ■■■ MOVF DG,F BTFSC STATUS,Z RETURN DECF DG,F RETURN RB_BF_SDE DECFSZ CSNOB,F GOTO RB_IDS ;■■■ LCDNo4の減算処理 ■■■ MOVF AVR_90S,F BTFSS STATUS,Z GOTO RB_BF_SDE3 ;桁下がり処理 MOVF AVR_90SH,W BTFSC STATUS,Z GOTO RB_BF_SDE2 DECF AVR_90SH,F DECF AVR_90S,F RETURN RB_BF_SDE2 CLRF AVR_90SH CLRF AVR_90S RETURN RB_BF_SDE3 DECF AVR_90S,F RETURN ;■■■ LCDNoOの減算処理 ■■■ RB_BF_RDE MOVF AVR_90R,F BTFSS STATUS,Z GOTO RB_BF_RDE3 ;桁下がり処理 MOVF AVR_90RH,W BTFSC STATUS,Z GOTO RB_BF_RDE2 DECF AVR_90RH,F DECF AVR_90R,F RETURN RB_BF_RDE2 CLRF AVR_90RH CLRF AVR_90R RETURN RB_BF_RDE3 DECF AVR_90R,F RETURN ; ; ボタン押下げ処理 ; RB_BT BANK0 BTFSC FG,0 GOTO RB_BT1 NOP BTFSS PORTB,4 GOTO RB_BT1 INCF CSNO,F MOVLW CS_MAX SUBWF CSNO,W BTFSC STATUS,C CLRF CSNO BSF FG,0 RB_BT1 BANK7 BCF IOCBF,4 BANK0 RETURN
[目次に戻る]
5.テーブル
NOP LCDD_INT1 ;LCD表示データ1 ADDWF PCL,F RETLW 'F' RETLW '0' RETLW '0' RETLW '0' RETLW 'R' RETLW '0' RETLW '0' RETLW '0' RETLW 'V' RETLW ' ' RETLW 'H' RETLW 'T' RETLW 'y' RETLW 'b' RETLW 'R' RETLW 'V' RETLW 'A' LCDD_INT2 ;LCD表示データ2 ADDWF PCL,F RETLW 'F' RETLW '0' RETLW '0' RETLW '0' RETLW 'S' RETLW ' ' RETLW '0' RETLW '0' RETLW 'D' RETLW ' ' RETLW '0' RETLW '0' RETLW 'I' RETLW ' ' RETLW '0' RETLW '0' RETLW 'P' LCD_MNo ;CSNOからLCDのメモリーに記載するアドレスを取得するためのデータ ADDWF PCL,F RETLW 0x5F RETLW 0x62 RETLW 0x66 RETLW 0x6A RETLW 0x6F RETLW 0x6C MNo_AD ;CSNOから設定するメモリーアドレスを取得する。 ADDWF PCL,F RETLW 0x71 ;AVR_90R -1で Hのアドレス RETLW 0x7A ;PG RETLW 0x7B ;IG RETLW 0x7C ;DG RETLW 0x27 ;R90S RETLW 0x28 MNo_V ;CSNOから数の最大数を取得する。 ADDWF PCL,F RETLW 0xFF ;3FF RETLW 0x64 RETLW 0x64 RETLW 0x64 RETLW 0xFF ;3FF RETLW 0x01 END
[目次に戻る]