ホーム
08/10/17
最速クロック48MHzの USB付の PIC18F2550 でも作ってみました。
回路図
USB,ICSPコネクター,RA0の回路は使っていないので省略してください。
CNCでプリント基板作成
ソフト作成
クロックは特に意味ないですが、手持ちの12MHzを使いました。
7SEG LED はアノードコモンです。
LIST P=PIC18F2550
#INCLUDE "P18F2550.INC"
CONFIG FOSC = ECIO_EC ;EXT CLOCK, PORT FUNCTION ON RA6,
EC USED BY USB
CONFIG FCMEN = OFF ;FAIL-SAFE CLOCK MONITOR DISABLED
CONFIG PWRT = ON ;PWRT ENABLED
CONFIG BOR = OFF ;BROWN-OUT RESET DISABLED IN HARDWARE
AND SOFTWARE
CONFIG WDT = OFF ;HW DISABLED - SW CONTROLLED
CONFIG MCLRE = OFF ;RE3 INPUT PIN ENABLED; MCLR DISABLED
CONFIG LPT1OSC = OFF ;TIMER1 CONFIGURED FOR HIGHER POWER
OPERATION
CONFIG PBADEN = OFF ;PORTB<4:0> ARE CONFIGURED AS
DIGITAL I/O ON RESET
CONFIG LVP = OFF ;SINGLE-SUPPLY ICSP DISABLED
CONFIG DEBUG = OFF
ERRORLEVEL -302 ; SUPPRESS MESSAGE 302 FROM LIST FILE
DEC0 EQU 20H ; 10進格納場所(10バイト)
DEC1 EQU 21H ;100MHZ ; DEC0が最上位桁でDEC[9]が最下位桁です。
DEC2 EQU 22H ;10MHZ
DEC3 EQU 23H ;1MHZ
DEC4 EQU 24H ;100KHZ
DEC5 EQU 25H ;10KHZ
DEC6 EQU 26H ;1KHZ
DEC7 EQU 27H ;100HZ
DEC8 EQU 28H ;10HZ
DEC9 EQU 29H ;1HZ
OVERF EQU 2AH
CFB_M EQU 2EH ; 一時余り格納場所(SUBで使用)
CFB0 EQU 31H ;プリスケーラーの値
CFB1 EQU 32H ;TMR0Lの値
CFB2 EQU 33H ;TMROHの値
CFB3 EQU 34H ;TMROのオーバフローによりINCした値
WAIT_CN EQU 36H
CN EQU 37H
TEMP EQU 38H
ORG 0
GOTO INIT
ORG 8H ;高割込
GOTO INIT
ORG 18H ;低割込
GOTO INIT
INIT
MOVLW B'00001111'
MOVWF ADCON1 ;ALL DGITAL
MOVLW B'11111111'
MOVWF PORTB ;ALL HI
MOVLW B'10000000'
MOVWF TRISB ;PORTBをOUTに
MOVLW B'11111111'
MOVWF PORTC ;ALL HI
MOVLW B'00000000'
MOVWF TRISC ;PORTCをOUTに
MOVLW B'10100111' ;ENABLE,16BIT,PSON,1/256
MOVWF T0CON
CLRF TMR0L ;TMR0をクリア
CLRF TMR0H ;TMR0をクリア
MAIN
CALL C_MAIN ;COUNTER MEIN
CALL X4 ;4倍する
CALL DCMAIN ;16進->10進変換
CLRF CFB0 ;変数クリヤ
CLRF CFB1
CLRF CFB2
CLRF CFB3
GOTO MAIN
C_MAIN
MOVLW B'00011000'
MOVWF TRISA ; PORTA3 をINPUT MODE=HIGH IMPEDANCE/TMR0の開始
CLRF TMR0H ;プリセレクター自動クリヤ
CLRF TMR0L ;TMR0をクリア 250MSECカウントの始点
MOVLW D'117' ;時間調整
MOVWF CN
CMAIN0 CALL DISPLAY
DECFSZ CN,F
GOTO CMAIN0
MOVLW D'8' ;時間調整
MOVWF WAIT_CN ;
DECFSZ WAIT_CN,F
BRA $-1
NOP
CMAIN1 MOVLW B'00010000'
MOVWF TRISA ;PORTA3をOUT TMR0の停止 250MSECカウントの終点
MOVFF TMR0L,CFB1 ;TMR0のDATAをCFB1に
MOVFF TMR0H,CFB2
TOGGLE BSF PORTA,3 ;PORTA4のトグル
BCF PORTA,3
DECF CFB0,F
MOVF TMR0L,W
SUBWF CFB1,W ;CFB1-TMR0=0であれば Z=1
BTFSC STATUS,Z ;TMR0Lが+1になるまでトルグ
GOTO TOGGLE
RETURN ;CFB0への PRESCALER値の取込完
DISPLAY
MOVF DEC0,W ;100MHZ桁
CALL TABLE ;
MOVWF PORTB
BCF PORTC,7
CALL WAIT
BSF PORTC,7
MOVF DEC1,W ;10MHZ桁
CALL TABLE ;
MOVWF PORTB
BCF PORTC,6
CALL WAIT
BSF PORTC,6
MOVF DEC2,W ;1MHZ桁
CALL TABLE ;
MOVWF PORTB
BCF PORTC,2
CALL WAIT
BSF PORTC,2
MOVF DEC3,W ;100KHZ桁
CALL TABLE ;
MOVWF PORTB
BCF PORTC,1
CALL WAIT
BSF PORTC,1
MOVF DEC4,W ;10KHZ桁
CALL TABLE ;
MOVWF PORTB
BCF PORTC,0
CALL WAIT
BSF PORTC,0
MOVF DEC5,W ;1KHZ桁
CALL TABLE ;
MOVWF PORTB
BCF PORTA,5
CALL WAIT
BSF PORTA,5
MOVF DEC6,W ;100HZ桁
CALL TABLE ;
MOVWF PORTB
BCF PORTA,2
CALL WAIT
BSF PORTA,2
MOVF DEC7,W ;10HZ桁
CALL TABLE ;
MOVWF PORTB
BCF PORTA,1
CALL WAIT
BSF PORTA,1
MOVLW D'27' ;時間調整
MOVWF WAIT_CN ;
DECFSZ WAIT_CN,F
BRA $-1
NOP
RETURN
WAIT ;TMR0のオーバフロー(TMR0IF)のCHK
MOVLW D'255' ;時間調整
MOVWF WAIT_CN ;
DECFSZ WAIT_CN,F
BRA $-1
MOVFF INTCON,OVERF ;チェックした瞬間を保存
BTFSC OVERF,2 ;TMR0IF
INCF CFB3,F ;
BTFSC OVERF,2 ;
BCF INTCON,TMR0IF ; フラグクリヤ
RETURN ;
;-------------------------------------------------------------
TABLE
ANDLW B'00001111' ;下位4ビット有効
MOVWF TEMP ;SAVE
MOVF PCL,W ;PCLATU,PCLATHにPCコピー
RLNCF TEMP,W ;X2
ADDWF PCL,F ;ADD TO PC REG
; -GFEDCBA 7SEGMENT のA〜F 1で発光
DT B'00111111' ;LETTER 0
DT B'00000110' ;LETTER 1
DT B'01011011' ;LETTER 2 A
DT B'01001111' ;LETTER 3 ____
DT B'01100110' ;LETTER 4 F | | B
DT B'01101101' ;LETTER 5 |_G__|
DT B'01111101' ;LETTER 6 E | | C
DT B'00000111' ;LETTER 7 |____|
DT B'01111111' ;LETTER 8 D
DT B'01101111' ;LETTER 9
DT B'00000000'
DT B'00000000'
DT B'00000000'
DT B'00000000'
DT B'00000000'
DT B'00000000'
X4 BCF STATUS,C ;*2 250MS 計測値を4倍する32BIT
RLCF CFB0,F
RLCF CFB1,F
RLCF CFB2,F
RLCF CFB3,F
BCF STATUS,C ;*2
RLCF CFB0,F
RLCF CFB1,F
RLCF CFB2,F
RLCF CFB3,F
RETURN
;---------------------------------------------------------
;32BITバイナリ→10進変換 変換後CFBは破壊
;CFBに32BITデータを置く。(CFB3:CFB2:CFB1:CFB0)
;DECに答えが格納(DEC0:DEC1:...:DEC8:DEC[9])
DCMAIN MOVLW H'29'
MOVWF FSR0L ; 格納場所初期値
CALL DEVIDE ; 最下位変換
CALL DEVIDE ;10回繰り返し
CALL DEVIDE
CALL DEVIDE
CALL DEVIDE
CALL DEVIDE
CALL DEVIDE
CALL DEVIDE
CALL DEVIDE
CALL DEVIDE ; 最上位変換
RETURN
DEVIDE MOVLW D'32' ;÷10サブルーチン
MOVWF CN ; 32ビットくり返し
CLRF CFB_M
DEVIDE0 BCF STATUS,C
RLCF CFB0,F
RLCF CFB1,F
RLCF CFB2,F
RLCF CFB3,F
RLCF CFB_M,F
MOVLW B'11110110'
ADDWF CFB_M,0
BTFSC STATUS,C
MOVWF CFB_M
BTFSC STATUS,C
INCF CFB0,F
DECFSZ CN,F
GOTO DEVIDE0
DECF FSR0L,F
MOVFF CFB_M,INDF0 ; 余り
RETURN
;
END
従来とPIC18Fシリーズは結構変わっています。
CONFIGの設定方法
DATAテーブルの使用方法(特にPCが2ステップです)
MOVFF 命令が追加されて使いやすい
バンク切替が不要
TMR0が16ビットに
31.75486MHz測定中
作っては見ましたが、最高30MHzしか測定できません。
ソフト、ハード がいけないのか不明 これではPIC18F を使う意味がありません。何か勘違いか!!
どなたか御指導ください。
ところで私の住んでいる所で産業フェアーが開催されました。
オリジナルマインドの 新型CNC 板金で作ってコストダウンした 機種です。
CNCにボールねじは高くて手が出ませんが これは良さそうです。
「多条ねじ」 ナットとのセットでいくら位するのか?
このステッピングモーターは軸の中にねじが切ってあり非常に簡単にcncが出来ます。
見にくいので違うセットをもう一枚
シンクロも最近のものはカラフルで格好いい
ついでに基準クロックの確度を測定してみました。
16MHzのものは 15.999.915Hz 誤差 85Hz
16MHzの次のものは16.000.078Hz 誤差 78Hz
12MHzのものは 11.999.829Hz 誤差171Hz でした。
結構精度が良いので基準になるカウンターを持っていない方は無調整で7桁位までは使えそうです。
秋月の10個100円の7SEG LED GL9A040G の接続図です。
各7SEGに順電流20mA Peakで100mA 流します。4.25mcd ですので暗いです。
秋月の4個100円の2桁 7SEG LED SL-9263-22 の接続図です。