$prog &HFF , &HF7 , &HD9 , &HFE 'CKDIV8 = 1 , SUT = 11 , CKSEL = 0111 , BODLEVEL = 1.8V ' ' ******************************************** ' * L6470 ステッピングモーター・ドライバー * ' * テスト・プログラム * ' * Basic Compiler is BASCOM-AVR * ' * Copyright O-Family 2017. 1.10 * ' ******************************************** ' ' Ver 0.01 試作バージョン。2017. 1.10 ' ' Const Prgver = " 0.01" 'プログラム・バージョン。 ' ' $regfile = "m328pdef.dat" '使用するAVRを設定。 $crystal = 16000000 'AVRクロックを設定。 ' $hwstack = 64 'ハードウェア・スタックの容量を設定。 $swstack = 32 'ソフトウェア・スタックの容量を設定。 $framesize = 32 'フレーム領域の容量を設定。 ' ' * ポート名の定義 * ' L6470_cs1 Alias Portb.2 'L6470の[/CS1]接続ポート。 L6470_cs2 Alias Portc.1 'L6470の[/CS2]接続ポート。 L6470_cs3 Alias Portc.2 'L6470の[/CS3]接続ポート。 L6470_busy Alias Pinb.1 'L6470の[/BUSY]接続ポート。 L6470_flag Alias Pinc.0 'L6470の[/FLAG]接続ポート。 ' Sw_1 Alias Pinc.3 'スイッチ[1]の接続ポート。 Sw_1pu Alias Portc.3 'スイッチ[1]の接続ポート(プルアップ用)。 Sw_2 Alias Pinc.4 'スイッチ[2]の接続ポート。 Sw_2pu Alias Portc.4 'スイッチ[2]の接続ポート(プルアップ用)。 Sw_3 Alias Pinc.5 'スイッチ[3]の接続ポート。 Sw_3pu Alias Portc.5 'スイッチ[3]の接続ポート(プルアップ用)。 ' ' * 変数の宣言 * ' Dim Temp1 As Byte '汎用テンポラリ変数 Byte型 No.1 Dim Temp2 As Byte '汎用テンポラリ変数 Byte型 No.2 Dim Temp3 As Byte '汎用テンポラリ変数 Byte型 No.3 Dim Temp4 As Byte '汎用テンポラリ変数 Byte型 No.4 Dim Tempw1 As Word '汎用テンポラリ変数 Word型 No.1 Dim Tempw2 As Word '汎用テンポラリ変数 Word型 No.2 Dim Tempw3 As Word '汎用テンポラリ変数 Word型 No.3 Dim Tempstr As String * 30 '汎用テンポラリ変数 String型 No.1 $baud = 9600 'ハードウェアUARTの通信速度(ボーレート)を設定。 ' ' * ポートの初期設定 * ' Set L6470_cs1 'L6470の[/CS1]を[H]にする。 Config L6470_cs1 = Output 'L6470の[/CS1]接続ポートを出力に設定する。 Set L6470_cs2 'L6470の[/CS2]を[H]にする。 Config L6470_cs2 = Output 'L6470の[/CS2]接続ポートを出力に設定する。 Set L6470_cs3 'L6470の[/CS3]を[H]にする。 Config L6470_cs3 = Output 'L6470の[/CS3]接続ポートを出力に設定する。 ' Set Sw_1pu 'スイッチ[1]の接続ポートをプルアップする。 Set Sw_2pu 'スイッチ[2]の接続ポートをプルアップする。 Set Sw_3pu 'スイッチ[3]の接続ポートをプルアップする。 ' ' * SPI通信の設定 * ' Config Spi = Hard , Master = Yes , Interrupt = Off , Data Order = Msb , Polarity = High , Phase = 1 , Clockrate = 4 , Noss = 1 , Spiin = 0 Spiinit 'SPIポートを初期化する。 ' ' * LCDの初期設定 * ' Config Lcdmode = Port 'LCDを4ビットのポートモードに設定。 Config Lcdbus = 4 'LCDデータバスを4bitに設定。 Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.4 'LCDのポート割り当て。 Config Lcdpin = Pin , Db6 = Portd.3 , Db7 = Portd.2 Config Lcdpin = Pin , E = Portd.6 , Rs = Portd.7 Config Lcd = 16 * 2 'LCD表示を16文字2行に設定。 Cls 'LCD表示をすべて消去する。 Cursor Off 'LCDのカーソルをオフにする。 ' ' * L6470の運用コマンドをサブルーチン宣言する * ' Declare Sub Mnop : Declare Sub Gohome : Declare Sub Gomark : Declare Sub Resetpos : Declare Sub Resetdevice Declare Sub Softstop : Declare Sub Hardstop : Declare Sub Softhiz : Declare Sub Hardhiz Declare Sub Setparam(byval M_adr As Byte , Byval M_value As Dword) : Declare Sub Getparam(byval M_adr As Byte) Declare Sub Run(byval M_dir As Byte , Byval M_spd As Dword) : Declare Sub Stepclock(byval M_dir As Byte) Declare Sub Move(byval M_dir As Byte , Byval M_n_step As Dword) : Declare Sub Mgoto(byval Abs_pos As Dword) Declare Sub Mgoto_dir(byval M_dir As Byte , Byval Abs_pos As Dword) Declare Sub Gountil(byval M_act As Byte , Byval M_dir As Byte , Byval M_spd As Dword) Declare Sub Relesesw(byval M_act As Byte , Byval M_dir As Byte) : Declare Sub Getstatus : Declare Sub Busycheck Dim M_temp1 As Byte , M_temp2 As Byte , M_temp3 As Byte , M_tempw1 As Word , M_tempd1 As Dword , Value As Dword , Status As Word Dim Spibuff(5) As Byte , Mselect As Byte ' ' Mnop : 何も実行されません。 ' Setparam [ADR , Value] : アドレス(ADR)のレジスターに(Value)の値を書き込みます。 ' Getparam [ADR] : アドレス(ADR)のレジスターに格納された値を返します。 (Value = 読み出し値) ' Run [DIR , Spd] : 目標速度(Spd)とモーターの方向(DIR)を指定して、定速回転をさせます。 ([1]=正方向 , [0]=逆方向) ' Stepclock [DIR] : デバイスをステップ・クロック・モードにして、方向(DIR)を指定します。 (外部クロックで駆動) ' Move [DIR , N_Step] : (DIR)方向に(N_Step)のマイクロ・ステップを行います。 (モーターが動いているときには実行されません) ' Mgoto [ABS_POS] : 最短経路で(ABS_POS)の位置へモーターを動かします。 ' Mgoto_dir [DIR , ABS_POS] : DIR方向を指定して(ABS_POS)の位置へモーターを動かします。 ' Gountil [ACT , DIR , Spd] : SWがオンになるまで(Spd)の速度で(DIR)方向に動作を実行し、SWオンで(ACT)ビットの動作が実行されSoftStopが起きます。 ' Relesesw [ACT , DIR] : SWがオフになるまで最低速度で(DIR)方向に動作を実行し、SWオフで(ACT)ビットの動作が実行されHardStopが起きます。 ' Gohome : HOME位置にモーターを持って行きます。 ' Gomark : MARK位置にモーターを持って行きます。 ' Resetpos : ABS_POSレジスタをリセットします。 (HOME位置を決めます) ' Resetdevice : デバイスを電源投入時の状態にリセットします。 ' Softstop : 減速期間の後にモーターを停止します。 (保持トルクあり) ' Hardstop : 直ちにモーターを停止します。 (保持トルクあり) ' Softhiz : 減速期間の後にブリッジをハイ・インピーダンス状態にします。 (保持トルクなし) ' Hardhiz : 直ちにブリッジをハイ・インピーダンス状態にします。 (保持トルクなし) ' Getstatus : STATUSレジスターの値を返します。 (Status = レジスター値) ' Busycheck : モーターがコマンドで指定した動作状態に至るまで待ちます。 ' ' * L6470の初期設定 * ' Lcd "L6470 Test" 'オープニングのタイトルを表示する。 Locate 2 , 5 'LCDにプログラム・バージョンを表示する。 Lcd "Ver. " ; Prgver ' For Mselect = 1 To 3 Mnop : Mnop : Mnop : Mnop 'Nopコマンドを送信してL6470の受信バッファーをクリアする。 Resetdevice 'L6470を電源投入時の状態にリセットする。 Waitms 30 ' ' Print : Print "* L6470 Register Default *" ' Gosub L6470_regread 'L6470の全レジスターの値をターミナルへ表示する。 ' ' * モーター[SM-42BYG011-25]の仕様をL6470に設定する * ' Setparam &H07 , &H20 'レジスター[07h] 最高速度 (初期値 = 041h) Setparam &H09 , &HFF 'レジスター[09h] 待機中のKVAL値 (初期値 = 29h) Setparam &H0A , &HFF 'レジスター[0Ah] 定速のKVAL値 (初期値 = 29h) Setparam &H0B , &HFF 'レジスター[0Bh] 加速開始のKVAL値 (初期値 = 29h) Setparam &H0C , &HFF 'レジスター[0Ch] 減速開始のKVAL値 (初期値 = 29h) Setparam &H18 , &H2E98 'レジスター[18h] CONFIGレジスターの[SW_MODE]を[1]にする。 Next Mselect ' ' Print : Print "* L6470 Register Setting *" ' Gosub L6470_regread Wait 2 Cls 'LCD表示をすべて消去する。 Wait 1 ' ' ******************* ' * メイン ルーチン * ' ******************* ' Main: Mselect = 1 'モーター(1)を選択する。 ' Gountil 0 , 0 , 10000 'SWがオンになるまで(Spd)の速度で(DIR)方向に動作を実行し、SWオンで(ACT)ビットの動作が実行されSoftStopが起きます。 Cls : Lcd "Gountil(0,0,10000)" Busycheck 'モーターがコマンドで指定した動作状態に至るまで待つ。 Wait 1 Gohome 'HOME位置にモーターを持って行く。 Cls : Lcd "Gohome" Busycheck 'モーターがコマンドで指定した動作状態に至るまで待つ。 Wait 2 ' Run 1 , 30000 '正方向にSpdの速度で定速回転をさせる。 Cls : Lcd "Run (1,30000)" Wait 5 ' Run 0 , 10000 '逆方向にSpdの速度で定速回転をさせる。 Cls : Lcd "Run (0,10000)" Wait 5 ' Softstop '減速期間の後にモーターを停止する。 (保持トルクあり) Cls : Lcd "Softstop" Busycheck 'モーターがコマンドで指定した動作状態に至るまで待つ。 Wait 2 ' Gohome 'HOME位置にモーターを持って行く。 Cls : Lcd "Gohome" Busycheck 'モーターがコマンドで指定した動作状態に至るまで待つ。 Wait 2 ' Mgoto 6400 '最短経路で(ABS_POS)の位置へモーターを動かす。 Cls : Lcd "Goto (6400)" Busycheck 'モーターがコマンドで指定した動作状態に至るまで待つ。 Wait 2 ' Mgoto 12800 '最短経路で(ABS_POS)の位置へモーターを動かす。 Cls : Lcd "Goto (12800)" Busycheck 'モーターがコマンドで指定した動作状態に至るまで待つ。 Wait 2 ' Mgoto 19200 '最短経路で(ABS_POS)の位置へモーターを動かす。 Cls : Lcd "Goto (19200)" Busycheck 'モーターがコマンドで指定した動作状態に至るまで待つ。 Wait 2 ' Mgoto_dir 0 , 6400 'DIR方向を指定して(ABS_POS)の位置へモーターを動かす。 Cls : Lcd "Goto_dir(0,6400)" Busycheck 'モーターがコマンドで指定した動作状態に至るまで待つ。 Wait 2 ' Mgoto_dir 1 , 41600 'DIR方向を指定して(ABS_POS)の位置へモーターを動かす。 Cls : Lcd "Goto_dir(1,41600)" Busycheck 'モーターがコマンドで指定した動作状態に至るまで待つ。 Wait 2 ' Softhiz '減速期間の後にブリッジをハイ・インピーダンス状態にする。 (保持トルクなし) Cls : Lcd "Softhiz" ' Getstatus 'STATUSレジスターの値を返す。 (Status = レジスター値) Locate 2 , 1 : Lcd Bin(status) Wait 4 ' Goto Main '( ' ********************** ' * テスト用プログラム * ' ********************** ' ' * L6470 レジスターの読み出し + シリアル出力 * ' L6470_regread: Getparam &H01 : Print " 01 : " ; Hex(spibuff(1)) ; Hex(spibuff(2)) ; Hex(spibuff(3)) ; " " ; Hex(value) Getparam &H02 : Print " 02 : " ; Hex(spibuff(1)) ; Hex(spibuff(2)) ; " " ; Hex(value) Getparam &H03 : Print " 03 : " ; Hex(spibuff(1)) ; Hex(spibuff(2)) ; Hex(spibuff(3)) ; " " ; Hex(value) Getparam &H04 : Print " 04 : " ; Hex(spibuff(1)) ; Hex(spibuff(2)) ; Hex(spibuff(3)) ; " " ; Hex(value) Getparam &H05 : Print " 05 : " ; Hex(spibuff(1)) ; Hex(spibuff(2)) ; " " ; Hex(value) Getparam &H06 : Print " 06 : " ; Hex(spibuff(1)) ; Hex(spibuff(2)) ; " " ; Hex(value) Getparam &H07 : Print " 07 : " ; Hex(spibuff(1)) ; Hex(spibuff(2)) ; " " ; Hex(value) Getparam &H08 : Print " 08 : " ; Hex(spibuff(1)) ; Hex(spibuff(2)) ; " " ; Hex(value) Getparam &H15 : Print " 15 : " ; Hex(spibuff(1)) ; Hex(spibuff(2)) ; " " ; Hex(value) Getparam &H09 : Print " 09 : " ; Hex(spibuff(1)) ; " " ; Hex(value) Getparam &H0A : Print " 0A : " ; Hex(spibuff(1)) ; " " ; Hex(value) Getparam &H0B : Print " 0B : " ; Hex(spibuff(1)) ; " " ; Hex(value) Getparam &H0C : Print " 0C : " ; Hex(spibuff(1)) ; " " ; Hex(value) Getparam &H0D : Print " 0D : " ; Hex(spibuff(1)) ; Hex(spibuff(2)) ; " " ; Hex(value) Getparam &H0E : Print " 0E : " ; Hex(spibuff(1)) ; " " ; Hex(value) Getparam &H0F : Print " 0F : " ; Hex(spibuff(1)) ; " " ; Hex(value) Getparam &H10 : Print " 10 : " ; Hex(spibuff(1)) ; " " ; Hex(value) Getparam &H11 : Print " 11 : " ; Hex(spibuff(1)) ; " " ; Hex(value) Getparam &H12 : Print " 12 : " ; Hex(spibuff(1)) ; " " ; Hex(value) Getparam &H13 : Print " 13 : " ; Hex(spibuff(1)) ; " " ; Hex(value) Getparam &H14 : Print " 14 : " ; Hex(spibuff(1)) ; " " ; Hex(value) Getparam &H16 : Print " 16 : " ; Hex(spibuff(1)) ; " " ; Hex(value) Getparam &H17 : Print " 17 : " ; Hex(spibuff(1)) ; " " ; Hex(value) Getparam &H18 : Print " 18 : " ; Hex(spibuff(1)) ; Hex(spibuff(2)) ; " " ; Hex(value) Getparam &H19 : Print " 19 : " ; Hex(spibuff(1)) ; Hex(spibuff(2)) ; " " ; Hex(value) Return ') '=========================================================================================== ' * L6470の運用コマンド サブルーチン * '----------------------------------------------------------- ' * NOP 何も実行されません * Sub Mnop Spibuff(1) = &H00 'Nopコマンド。 Gosub L6470_write1 'SPIでL6470へ1バイトを送信する。 End Sub '----------------------------------------------------------- ' * Setparam [ADR , Value] アドレス(ADR)のレジスターに(Value)の値を書き込みます * Sub Setparam(byval M_adr As Byte , Byval M_value As Dword) M_temp1 = Lookup(m_adr , M_argument) 'コマンドの引数バイトの数を取得する。 !LDD XL,Y+2 'ADRの間接アドレス[L]。 !LDD XH,Y+3 'ADRの間接アドレス[H]。 !LD R16,X 'ADR値を読み出す。 !STS {Spibuff(1)} , R16 'SetParam(ADR, Value)コマンド。 !LDD XL,Y+0 'Valueの間接アドレス[L]。 !LDD XH,Y+1 'Valueの間接アドレス[H]。 !LDS R17,{M_temp1} !CPI R17,1 !BREQ Setparam1 'If 引数が1か? Then !CPI R17,2 !BREQ Setparam2 'If 引数が2か? Then !LD R16,X+ '引数が3の場合。 !STS {Spibuff(4)} , R16 Setparam2: !LD R16,X+ !STS {Spibuff(3)} , R16 Setparam1: !LD R16,X !STS {Spibuff(2)} , R16 M_temp1 = M_temp1 + 1 : Gosub L6470_write 'SPIでL6470へ送信する。 End Sub '----------------------------------------------------------- ' * Getparam [ADR] アドレス(ADR)のレジスターに格納された値を返します (Value = 読み出し値) * Sub Getparam(byval M_adr As Byte) 'レジスター値 = Value M_temp1 = Lookup(m_adr , M_argument) 'コマンドの引数バイトの数を取得する。 !LDD XL,Y+0 'ADRの間接アドレス[L]。 !LDD XH,Y+1 'ADRの間接アドレス[H]。 !LD R16,X 'ADR値を読み出す。 !ORI R16,$20 'GetParam(ADR)コマンド。 !STS {Spibuff(1)} , R16 'SetParam(ADR, Value)コマンド。 Gosub L6470_read 'SPIでL6470から受信する。 Loadadr Value , X '変数Valueのアドレスを[X]に読み込む。 !LDS R17,{M_temp1} !CPI R17,1 !BREQ Getparam1 'If 引数が1か? Then !CPI R17,2 !BREQ Getparam2 'If 引数が2か? Then !LDS R16,{Spibuff(3)} '引数が3の場合。 !ST X+,R16 Getparam2: !LDS R16,{Spibuff(2)} !ST X+,R16 Getparam1: !LDS R16,{Spibuff(1)} !ST X+,R16 !SUBI R17,5 '残りのバイトを[00]で埋める。 !COM R17 !CLR R16 Getparam3: !ST X+,R16 !DEC R17 !BRNE Getparam3 End Sub '----------------------------------------------------------- ' * Run [DIR , Spd] 目標速度(Spd)とモーターの方向(DIR)を指定して、定速回転をさせます * Sub Run(byval M_dir As Byte , Byval M_spd As Dword) !LDD XL,Y+2 'DIRの間接アドレス[L]。 !LDD XH,Y+3 'DIRの間接アドレス[H]。 !LD R16,X 'DIR値を読み出す。 !ORI R16,$50 'Runコマンドに方向ビットを加える。[1]=正方向 , [0]=逆方向 !STS {Spibuff(1)} , R16 Gosub L6470_write4b 'パラメータ2の引数3バイトをSPIバッファーへセットして4バイトのコマンドを送信する。 End Sub '----------------------------------------------------------- ' * Stepclock [DIR] デバイスをステップ・クロック・モードにして、方向(DIR)を指定します (外部クロックで駆動) * Sub Stepclock(byval M_dir As Byte) !LDD XL,Y+0 'DIRの間接アドレス[L]。 !LDD XH,Y+1 'DIRの間接アドレス[H]。 !LD R16,X 'DIR値を読み出す。 !ORI R16,$58 'Stepclockコマンドに方向ビットを加える。[1]=正方向 , [0]=逆方向 !STS {Spibuff(1)} , R16 Gosub L6470_write1 'SPIでL6470へ1バイトを送信する。 End Sub '----------------------------------------------------------- ' * Move [DIR , N_Step] (DIR)方向に(N_Step)のマイクロ・ステップを行います * Sub Move(byval M_dir As Byte , Byval M_n_step As Dword) !LDD XL,Y+2 'DIRの間接アドレス[L]。 !LDD XH,Y+3 'DIRの間接アドレス[H]。 !LD R16,X 'DIR値を読み出す。 !ORI R16,$40 'Moveコマンドに方向ビットを加える。[1]=正方向 , [0]=逆方向 !STS {Spibuff(1)} , R16 Gosub L6470_write4b 'パラメータ2の引数3バイトをSPIバッファーへセットして4バイトのコマンドを送信する。 End Sub '----------------------------------------------------------- ' Mgoto [ABS_POS] 最短経路で(ABS_POS)の位置へモーターを動かします * Sub Mgoto(byval Abs_pos As Dword) !LDI R16,$60 'gotoコマンド。 !STS {Spibuff(1)} , R16 Gosub L6470_write4b 'パラメータ2の引数3バイトをSPIバッファーへセットして4バイトのコマンドを送信する。 End Sub '----------------------------------------------------------- ' * Mgoto_dir [DIR , ABS_POS] DIR方向を指定して(ABS_POS)の位置へモーターを動かします * Sub Mgoto_dir(byval M_dir As Byte , Byval Abs_pos As Dword) !LDD XL,Y+2 'DIRの間接アドレス[L]。 !LDD XH,Y+3 'DIRの間接アドレス[H]。 !LD R16,X 'DIR値を読み出す。 !ORI R16,$68 'goto_dirコマンドに方向ビットを加える。[1]=正方向 , [0]=逆方向 !STS {Spibuff(1)} , R16 Gosub L6470_write4b 'パラメータ2の引数3バイトをSPIバッファーへセットして4バイトのコマンドを送信する。 End Sub '----------------------------------------------------------- ' * Gountil [ACT , DIR , Spd] SWがオンになるまで(Spd)の速度で(DIR)方向に動作を実行し、SWオンで(ACT)ビットの動作が実行されSoftStopが起きます * Sub Gountil(byval M_act As Byte , Byval M_dir As Byte , Byval M_spd As Dword) !LDD XL,Y+2 'DIRの間接アドレス[L]。 !LDD XH,Y+3 'DIRの間接アドレス[H]。 !LD R16,X 'DIR値を読み出す。 !ORI R16,$82 'Gountilコマンドに方向ビットを加える。[1]=正方向 , [0]=逆方向 !LDD XL,Y+4 'ACTの間接アドレス[L]。 !LDD XH,Y+5 'ACTの間接アドレス[H]。 !LD R17,X 'ACT値を読み出す。 !LSL R17 'ACTのビット位置へ移動する。 !LSL R17 !LSL R17 !OR R16,R17 'GountilコマンドにACTビットを加える。[1]=MARKにコピー , [0]=ABS_POSをリセット !STS {Spibuff(1)} , R16 Gosub L6470_write4b 'パラメータ2の引数3バイトをSPIバッファーへセットして4バイトのコマンドを送信する。 End Sub '----------------------------------------------------------- ' * Relesesw [ACT , DIR] SWがオフになるまで最低速度で(DIR)方向に動作を実行し、SWオフで(ACT)ビットの動作が実行されHardStopが起きます * Sub Relesesw(byval M_act As Byte , Byval M_dir As Byte) !LDD XL,Y+0 'DIRの間接アドレス[L]。 !LDD XH,Y+1 'DIRの間接アドレス[H]。 !LD R16,X 'DIR値を読み出す。 !ORI R16,$92 'Releseswコマンドに方向ビットを加える。[1]=正方向 , [0]=逆方向 !LDD XL,Y+2 'ACTの間接アドレス[L]。 !LDD XH,Y+3 'ACTの間接アドレス[H]。 !LD R17,X 'ACT値を読み出す。 !LSL R17 'ACTのビット位置へ移動する。 !LSL R17 !LSL R17 !OR R16,R17 'ReleseswコマンドにACTビットを加える。[1]=MARKにコピー , [0]=ABS_POSをリセット !STS {Spibuff(1)} , R16 Gosub L6470_write1 'SPIでL6470へ1バイトを送信する。 End Sub '----------------------------------------------------------- ' * Gohome HOME位置にモーターを持って行きます * Sub Gohome Spibuff(1) = &H70 'Gohomeコマンド。 Gosub L6470_write1 'SPIでL6470へ1バイトを送信する。 End Sub ' '----------------------------------------------------------- ' * Gomark MARK位置にモーターを持って行きます * Sub Gomark Spibuff(1) = &H78 'Gomarkコマンド。 Gosub L6470_write1 'SPIでL6470へ1バイトを送信する。 End Sub ' '----------------------------------------------------------- ' * Resetpos ABS_POSレジスタをリセットします (HOME位置を決めます) * Sub Resetpos Spibuff(1) = &HD8 'Resetposコマンド。 Gosub L6470_write1 'SPIでL6470へ1バイトを送信する。 End Sub '----------------------------------------------------------- ' * Resetdevice デバイスを電源投入時の状態にリセットします * Sub Resetdevice Spibuff(1) = &HC0 'Resetdeviceコマンド。 Gosub L6470_write1 'SPIでL6470へ1バイトを送信する。 End Sub '----------------------------------------------------------- ' Softstop 減速期間の後にモーターを停止します (保持トルクあり) * Sub Softstop Spibuff(1) = &HB0 'Softstopコマンド。 Gosub L6470_write1 'SPIでL6470へ1バイトを送信する。 End Sub '----------------------------------------------------------- ' * Hardstop 直ちにモーターを停止します (保持トルクあり) * Sub Hardstop Spibuff(1) = &HB8 'Hardstopコマンド。 Gosub L6470_write1 'SPIでL6470へ1バイトを送信する。 End Sub '----------------------------------------------------------- ' * Softhiz 減速期間の後にブリッジをハイ・インピーダンス状態にします (保持トルクなし) * Sub Softhiz Spibuff(1) = &HA0 'Softhizコマンド。 Gosub L6470_write1 'SPIでL6470へ1バイトを送信する。 End Sub '----------------------------------------------------------- ' * Hardhiz 直ちにブリッジをハイ・インピーダンス状態にします (保持トルクなし) * Sub Hardhiz Spibuff(1) = &HA8 'Hardhizコマンド。 Gosub L6470_write1 'SPIでL6470へ1バイトを送信する。 End Sub '----------------------------------------------------------- ' * Getstatus STATUSレジスターの値を返します (Status = レジスター値) * Sub Getstatus Spibuff(1) = &HD0 'Getstatusコマンド。 M_temp1 = 2 Gosub L6470_read 'SPIでL6470から受信する。 Loadadr Status , X '変数Statusのアドレスを[X]に読み込む。 !LDS R16,{Spibuff(2)} 'ステータスの下位バイト。 !ST X+,R16 !LDS R16,{Spibuff(1)} 'ステータスの上位バイト。 !ST X,R16 End Sub '----------------------------------------------------------- ' * Busycheck モーターがコマンドで指定した動作状態に至るまで待ちます * Sub Busycheck Do Loop Until L6470_busy = 1 'BUSYピンが[1]になったか? End Sub ' ' * L6470へSPI送信するサブルーチン * (M_temp1 = 送信バイト数) ' L6470_write1: '1バイト送信用。 M_temp1 = 1 L6470_write: For M_temp3 = 1 To M_temp1 Gosub L6470_csset 'モーターの[/CS]を選択する。 Spiout Spibuff(m_temp3) , 1 'L6470へコマンドを送信する。 Gosub L6470_csreset 'モーターの[/CS]を解除する。 Next M_temp3 Return ' ' * L6470からSPI受信するサブルーチン * (M_temp1 = 受信バイト数) ' L6470_read: Gosub L6470_csset 'モーターの[/CS]を選択する。 Spiout Spibuff(1) , 1 'SPIバスへ1バイトのコマンドを送る。 Gosub L6470_csreset 'モーターの[/CS]を解除する。 ' For M_temp3 = 1 To M_temp1 Gosub L6470_csset 'モーターの[/CS]を選択する。 Spiin Spibuff(m_temp3) , 1 'SPIバスから1バイトのデータを受け取る。 Gosub L6470_csreset 'モーターの[/CS]を解除する。 Next M_temp3 Return ' ' * パラメータ2の引数3バイトをSPIバッファーへセットして4バイトのコマンドを送信するサブルーチン * ' L6470_write4b: !LDD XL,Y+0 'パラメータ2の間接アドレス[L]。 !LDD XH,Y+1 'パラメータ2の間接アドレス[H]。 !LD R16,X+ 'パラメータ2の引数3バイトをSPIバッファーへセットする。 !STS {Spibuff(4)} , R16 !LD R16,X+ !STS {Spibuff(3)} , R16 !LD R16,X !STS {Spibuff(2)} , R16 M_temp1 = 4 : Goto L6470_write 'SPIでL6470へ4バイトを送信する。 ' ' * モーターの[/CS]を選択するサブルーチン * ' L6470_csset: Select Case Mselect Case 2 : Reset L6470_cs2 'L6470の[/CS2]を[L]にする。 Case 3 : Reset L6470_cs3 'L6470の[/CS3]を[L]にする。 Case Else : Reset L6470_cs1 'L6470の[/CS1]を[L]にする。 End Select Waitus 1 'L6470のセットアップ時間を待つ。 Return ' ' * モーターの[/CS]を解除するサブルーチン * ' L6470_csreset: Set L6470_cs1 'L6470の[/CS1]を[H]にする。 Set L6470_cs2 'L6470の[/CS2]を[H]にする。 Set L6470_cs3 'L6470の[/CS3]を[H]にする。 Waitus 1 'L6470の処理時間を待つ。 Return '=========================================================================================== End ' ' * L6470コマンド引数のバイト数テーブル * ' M_argument: Data 0 , 3 , 2 , 3 , 3 , 2 , 2 , 2 , 2 , 1 , 1 , 1 , 1 , 2 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 2 , 1 , 1 , 2 , 2