kuroの覚え書き

96の個人的覚え書き

12F675をつかう



12F675を使ったシフトタイミングインジケーターのプログラムを考えてみた。

GP2で0.5秒のパルスをカウントしGP0,1,4につないだLEDを点灯する。

1200rpm以下でシステム起動確認のために点滅。

3000,6000,9000rpmで1つずつ増えていく。9500rpm以上で3つともフラッシュ。

なお、各種コンフィグの説明をコメントの形で入れているので長大だが、実際のプログラムとしては短いものだ。


LIST P=PIC12F675
INCLUDE "P12F675.INC"

__CONFIG _BODEN_OFF & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT & _MCLRE_OFF
;内蔵4MHzオシレータを使用、内蔵MCLRを使用。
; ┌─┰─┐
;+5V Vdd ┥ ┝ Vss GND
; GP5/T1CKi/CLKIN ┥ ┝ GP0/AN0/CIN+/ICSPDAT LED1
;LED3 GP4/AN3/T1G/OSC2/CLKOUT ┥ ┝ GP1/AN1/CIN-/Vref/ICSPCLK LED2
; GP3/MCLR/Vpp ┥ ┝ GP2/AN2/T0CKI/INT/COUT PULSE IN
; └───┘
;================================
; Configuration Bits
;================================
;デフォルトはすべて1
;bit 13-12 BG1:BG0: Bandgap Calibration bits for BOD and POR voltage(1)
; 00 = Lowest bandgap voltage
; 11 = Highest bandgap voltage
;bit 11-9 Unimplemented: Read as ‘0’
;bit 8 CPD: Data Code Protection bit(2)
; 1 = Data memory code protection is disabled _CPD_OFF
; 0 = Data memory code protection is enabled _CPD_ON
;bit 7 CP: Code Protection bit(3)
; 1 = Program Memory code protection is disabled _CP_OFF
; 0 = Program Memory code protection is enabled _CP_ON
;bit 6 BODEN: Brown-out Detect Enable bit(4)
; 1 = BOD enabled _BODEN_ON
; 0 = BOD disabled _BODEN_OFF
;bit 5 MCLRE: GP3/MCLR pin function select(5)
; 1 = GP3/MCLR pin function is MCLR _MCLRE_ON
; 0 = GP3/MCLR pin function is digital I/O, MCLR internally tied to VDD _MCLRE_OFF
;bit 4 PWRTE: Power-up Timer Enable bit
; 1 = PWRT disabled _PWRTE_OFF
; 0 = PWRT enabled _PWRTE_ON
;bit 3 WDTE: Watchdog Timer Enable bit
; 1 = WDT enabled _WDT_ON
; 0 = WDT disabled _WDT_OFF
;bit 2-0 FOSC2:FOSC0: Oscillator Selection bits
; 111 = RC oscillator: CLKOUT function on GP4/OSC2/CLKOUT pin, RC on GP5/OSC1/CLKIN _EXTRC_OSC_CLKOUT
; 110 = RC oscillator: I/O function on GP4/OSC2/CLKOUT pin, RC on GP5/OSC1/CLKIN _EXTRC_OSC_NOCLKOUT
; 101 = INTOSC oscillator: CLKOUT function on GP4/OSC2/CLKOUT pin, I/O function on GP5/OSC1/CLKIN _INTRC_OSC_CLKOUT
; 100 = INTOSC oscillator: I/O function on GP4/OSC2/CLKOUT pin, I/O function on GP5/OSC1/CLKIN _INTRC_OSC_NOCLKOUT
; 011 = EC: I/O function on GP4/OSC2/CLKOUT pin, CLKIN on GP5/OSC1/CLKIN _EC_OSC
; 010 = HS oscillator: High speed crystal/resonator on GP4/OSC2/CLKOUT and GP5/OSC1/CLKIN _HS_OSC
; 001 = XT oscillator: Crystal/resonator on GP4/OSC2/CLKOUT and GP5/OSC1/CLKIN _XT_OSC
; 000 = LP oscillator: Low power crystal on GP4/OSC2/CLKOUT and GP5/OSC1/CLKIN _LP_OSC
;Note 1: The Bandgap Calibration bits are factory programmed and must be read and saved prior to erasing
;the device as specified in the PIC12F629/675 Programming Specification. These bits are reflected
;in an export of the configuration word. Microchip Development Tools maintain all calibration bits to
;factory settings.
;2: The entire data EEPROM will be erased when the code protection is turned off.
;3: The entire program memory will be erased, including OSCCAL value, when the code protection is
;turned off.
;4: Enabling Brown-out Detect does not automatically enable Power-up Timer.
;5: When MCLR is asserted in INTOSC or RC mode, the internal clock oscillator is disabled.

CBLOCK 020H ;先頭の番地を指定 12F675は020Hから最大64バイト
BYTE0 ;周波数カウンタ0
BYTE1 ;周波数カウンタ1
BYTE2 ;周波数カウンタ2
LPCNT1
LPCNT2
TEMP
OVRFLW
CNT1
CNT2
CNT3
CNT4
ENDC ;定義終わり

;************************
;JUMPING VECTOR
;************************
ORG 0
GOTO MAIN

ORG 4
GOTO INTPROC
INTPROC
RETURN

ORG 08H


;************************
; MAIN ROUTINE
;************************

MAIN
BCF INTCON,GIE ;割込禁止
BTFSC INTCON,GIE
GOTO $-2 ;(2行戻る)
CALL PORT_INI
MAINLP CALL MEASURE
CALL DISP
GOTO MAINLP

;PORT初期化
PORT_INI
BCF STATUS,RP0 ;Bank 0
CLRF GPIO ;Init GPIO
;GPIO - GPIO REGISTER (ADDRESS: 05h)
;bit 7-6: Unimplemented: Read as ’0’
;bit 5-0: GPIO<5:0>: General Purpose I/O pin.
; 1 = Port pin is >VIH
; 0 = Port pin is <VIL

MOVLW 07H ;00000111 Set GP<2:0> to
MOVWF CMCON ;digital IO (コンパレータをすべてオフ)
;CMCON ? COMPARATOR CONTROL REGISTER (ADDRESS: 19h)
;bit 7 Unimplemented: Read as ‘0’
;bit 6 COUT: Comparator Output bit
; When CINV = 0:
; 1 = VIN+ > VIN-
; 0 = VIN+ < VIN-
; When CINV = 1:
; 1 = VIN+ < VIN-
; 0 = VIN+ > VIN-
;bit5 Unimplemented: Read as ‘0’
;bit 4 CINV: Comparator Output Inversion bit
; 1 = Output inverted
; 0 = Output not inverted
;bit 3 CIS: Comparator Input Switch bit
; When CM2:CM0 = 110 or 101:
; 1 = VIN- connects to CIN+
; 0 = VIN- connects to CINbit
;2-0 CM2:CM0: Comparator Mode bits
;データシートを参照すること。

BSF STATUS,RP0 ;Bank 1
CLRF ANSEL ;Digital I/O
;ANSEL ? ANALOG SELECT REGISTER (ADDRESS: 9Fh)
;bit 7 Unimplemented: Read as ‘0’.
;bit 6-4 ADCS<2:0>: A/D Conversion Clock Select bits
; 000 = FOSC/2
; 001 = FOSC/8
; 010 = FOSC/32
; x11 = FRC (clock derived from a dedicated internal oscillator = 500 kHz max)
; 100 = FOSC/4
; 101 = FOSC/16
; 110 = FOSC/64
;bit 3-0 ANS3:ANS0: Analog Select bits
;(Between analog or digital function on pins AN<3:0>, respectively.)
; 1 = Analog input; pin is assigned as analog input(1)
; 0 = Digital I/O; pin is assigned to port or special function
;Note 1: Setting a pin to an analog input automatically disables the digital input circuitry,
;weak pull-ups, and interrupt-on-change. The corresponding TRISIO bit must be set
;to Input mode in order to allow external control of the voltage on the pin.

MOVLW 0CH ;00001100 Set GP<3:2> as inputs
MOVWF TRISIO ;and set GP<5:4,1:0> as outputs
;TRISIO ? GPIO TRISTATE REGISTER (ADDRESS: 85h)
;bit 7-6: Unimplemented: Read as ’0’
;bit 5-0: TRISIO<5:0>: General Purpose I/O Tri-State Control bit
; 1 = GPIO pin configured as an input (tri-stated)
; 0 = GPIO pin configured as an output.
;Note: TRISIO<3> always reads 1.

MOVLW 078H ;01111000
MOVWF OPTION_REG ;FOR TMR0
;OPTION_REG ? OPTION REGISTER (ADDRESS: 81h)
;bit 7 GPPU: GPIO Pull-up Enable bit
; 1 = GPIO pull-ups are disabled
; 0 = GPIO pull-ups are enabled by individual port latch values
;bit 6 INTEDG: Interrupt Edge Select bit
; 1 = Interrupt on rising edge of GP2/INT pin
; 0 = Interrupt on falling edge of GP2/INT pin
;bit 5 T0CS: TMR0 Clock Source Select bit
; 1 = Transition on GP2/T0CKI pin
; 0 = Internal instruction cycle clock (CLKOUT)
;bit 4 T0SE: TMR0 Source Edge Select bit
; 1 = Increment on high-to-low transition on GP2/T0CKI pin
; 0 = Increment on low-to-high transition on GP2/T0CKI pin
;bit 3 PSA: Prescaler Assignment bit
; 1 = Prescaler is assigned to the WDT
; 0 = Prescaler is assigned to the TIMER0 module
;bit 2-0 PS2:PS0: Prescaler Rate Select bits
; Bit Value TMR0 Rate WDT Rate
; 000 1 : 2 1 : 1
; 001 1 : 4 1 : 2
; 010 1 : 8 1 : 4
; 011 1 : 16 1 : 8
; 100 1 : 32 1 : 16
; 101 1 : 64 1 : 32
; 110 1 : 128 1 : 64
; 111 1 : 256 1 : 128

BCF STATUS,RP0 ;SET PAGE 0

;************************
;計測実行サブルーチン
;VMAXのタコメーターパルスに
;あわせるとゲートタイムは0.6秒
;だがゲートタイム0.25秒にして
;2.4をかけて考える。
;GP2がゲート制御ピン
;4MHZ内蔵オシレータ使用ver.
;************************
MEASURE
BSF STATUS,RP0 ;SET PAGE 1
MOVLW 078H ;SET TO NO PRESCALE
MOVWF OPTION_REG ;
BCF STATUS,RP0 ;SET PAGE 0
CLRF TMR0 ;カウンタリセット
BCF GPIO,2 ;ゲートを閉める

;****ゲートタイム250msec****
BSF GPIO,2 ;ゲートを開ける
CLRF OVRFLW ;OverFlowフラグをクリア
CALL MEALOOP ;249998STEP
BCF GPIO,2 ;ゲートを閉める (250000)
RETURN

;****計測実行ループ(249,996STEPS)****
MEALOOP
MOVLW 08DH ;ループ繰り返しカウンタ=141
MOVWF LPCNT1
;++++++++++
MEALP1
MOVLW 088H ;第二カウンタ=136
MOVWF LPCNT2 ;
;***********
MEALP2
BTFSS INTCON,T0IF ;13 STEPS LOOP
GOTO DUMY1
BCF INTCON,T0IF ;T0IFフラグをリセット
MOVLW 1 ;カウント更新用定数
GOTO NEXT
DUMY1
NOP ;時間調整
NOP
MOVLW 0 ;カウンタ更新用定数
NEXT
ADDWF BYTE1,F ;BYTE1+T0IF
RLF BYTE1,W ;CARRY TO D<0>
ANDLW 1 ;キャリーだけ取り出し
ADDWF BYTE2,F ;BYTE2+CARRY
DECFSZ LPCNT2,F ;ループ終了か?
GOTO MEALP2 ;
;**********
NOP
MEALP3
DECFSZ LPCNT1,F ;(13*LPCNT2+5)*LPCNT1
GOTO MEALP1 ;(13*136+5)*141=249993-1
;+++++++++++++++
RETURN ;+2+2=249996

;************************
;LED駆動ルーチン
;************************
DISP MOVF TMR0,W ;カウント値を読み込み
MOVWF TEMP ;
RPM1K MOVLW 05H ;1200rpm以上か(1200=5pulse)
SUBWF TEMP,F ;元のデータから引く
BTFSC STATUS,C
GOTO RPM3K ;プラスの時(1200rpm以上)3000rpm判定へ
FLASH MOVLW 01H ;マイナスの時(1200rpm以下)LED1が約1秒間隔で点滅
MOVWF GPIO
CALL TIME1S
MOVLW 0H
MOVWF GPIO
CALL TIME1S
RETURN

RPM3K MOVLW 0CH ;3000rpm以上か(2880rpm=12pulse)
SUBWF TEMP,F ;元のデータから引く
BTFSC STATUS,C
GOTO RPM6K ;プラスの時(3000rpm以上)6000rpm判定へ
NOSIG MOVLW 0H ;マイナスの時(1200rpm以上3000rpm以下)LED全消灯
MOVWF GPIO
RETURN
RPM6K MOVLW 0DH ;6000rpm以上か(6000rpm=25pulse 25-12=13)
SUBWF TEMP,F ;元のデータから引く
BTFSC STATUS,C
GOTO RPM9K ;プラスの時(6000rpm以上)9000rpm判定へ
SIG1ST MOVLW 01H ;マイナスの時(3000rpm以上6000rpm以下)00000001
MOVWF GPIO ;LED1点灯
RETURN
RPM9K MOVLW 0CH ;9000rpm以上か(8880rpm=37pulse 37-25=12)
SUBWF TEMP,F ;元のデータから引く
BTFSC STATUS,C
GOTO RPM95K ;プラスの時(9000rpm以上)9500rpm判定へ
SIG2ND MOVLW 03H ;マイナスの時(6000rpm以上9000rpm以下)00000011
MOVWF GPIO ;LED1,2点灯
RETURN
RPM95K MOVLW 02H ;9500rpm以上か(9360rpm=39pulse 39-37=2)
SUBWF TEMP,F ;元のデータから引く
BTFSC STATUS,C
GOTO SIG4TH ;プラスの時9500rpm以上へ
SIG3RD MOVLW 013H ;マイナスの時(9000rpm以上9500rpm以下)00010011
MOVWF GPIO ;LED1,2,3点灯
SIG4TH MOVLW 013H ;9500rpm以上全LEDが約0.25秒間隔で点滅
MOVWF GPIO
CALL TIME125M
CALL TIME125M
MOVLW 0H
MOVWF GPIO
CALL TIME125M
CALL TIME125M
RETURN

;
;タイマーサブルーチン4MHzオシレータの場合
;実行サイクルは1usec
;
;0.5msecサブルーチン 500サイクル*1usec
TIME05M MOVLW 07CH ;1 124回まわす
MOVWF CNT1 ;1 2
TIMLP1 NOP ;1
DECFSZ CNT1,F ;1
GOTO TIMLP1 ;2 2+4*124-1=497
NOP ;1 498
RETURN ;2 500 500*0.4usec=0.2msec
;12.5msec 12500サイクル
TIME5M MOVLW 019H ;1 25回まわす
MOVWF CNT2 ;1
TIMLP2 CALL TIME05M ;2+500=502
DECFSZ CNT2,F ;1
GOTO TIMLP2 ;2 2+505*25-1=12626
RETURN ;2 12628 5.05msec
;125msec 125000
TIME125M
MOVLW 0F8H ;248回
MOVWF CNT3 ;ここまでで2サイクル
TIMLP3 CALL TIME05M ;2+500
DECFSZ CNT3,F ;1
GOTO TIMLP3 ;2 2+505*248-1=125241
RETURN ;2 125243 50.1msec
;1sec
TIME1S MOVLW 08H ;8回
MOVWF CNT4 ;125msec * 8
TIMLP4 CALL TIME125M
DECFSZ CNT4,F ;このループは50msec
GOTO TIMLP4
RETURN

END

どこかおかしいところがあるらしく、正常に機能しなかった。3つのLEDがパルスの有無にかかわらずつきっぱなしになった。もっと単純なプログラムから試してみるか。

060330追記

と思ったが、プログラムをちょっと見直したらちゃんと動作するようになった。やったー。