- ベストアンサー
Z80CPUを用いてステッピングモータを動かすアセンブラプログラムに解説
- Z80CPUを使用したステッピングモータを動かすアセンブラプログラムの解説
- スイッチを使用してステッピングモータを回転させるプログラムの詳細な解説
- Z80CPUを活用したステッピングモータ制御プログラムの解説
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
とりあえず解析は終わりました。ソースにコメントの形で書いてあります。 回路図があったんで何とか解析できた感じです。ステッピングモーターの情報は無くても今回は何とかなりましたんで。 #4の質問は答えてくださいね。それによってアドバイスが変わりますので。 BEGIN: DI LD SP,STACK MAIN: ; 初期化 ;Z80PIO(PA)をバイト出力モードに設定。 LD A,0FH OUT (PIOAC),A ;Z80PIO(PB)をビット制御モードに設定。 LD A,0CFH OUT (PIOBC),A ;Z80PIO(PB)をbit0-3:出力 bit4-7:入力 LD A,0F0H OUT (PIOBC),A ;ZEROクリア XOR A LD (SCALE1),A LD (STEP_C),A LD (STBCNT),A LD (TOTAL_P),A LD (STROBE),A OUT (PIOBD),A ;8255の設定。Aポート出力。Bポート入力。Cポートbit0-3:入力 bit4-7:出力 LD A,83H OUT (CMDPT),A ;CTCの初期化処理 CALL CTCSET EI ; SW11,12を調べてモータのON/OFFを制御を無限ループで繰り返している。 READIN: LD HL,INBUF ;LD BC,2の方が好きだけど。問題はありません。 LD A,2 LD B,0 LD C,A ADD HL,BC MAINLP: LD A,(HL) BIT 5,A JP NZ,STOP LD A,01H LD (TOTAL_P),A STOP: LD A,(HL) BIT 4,A JP NZ,MAINLP XOR A LD (TOTAL_P),A JP MAINLP VINT0: EI RET VINTI: VINTI: JP INT1 VINT2: EI RETI VINT3: EI RETI ENABLE: EI RETI ;2m秒ごとに割り込んでくる。 INT1: PUSH HL PUSH DE PUSH BC PUSH AF CALL ENABLE ;SCALE1カウンタを+1 LD A,(SCALE1) INC A LD (SCALE1),A ;COUNTに達したら0を入れて、CALL STEP_Mステッピングモータ処理へ CP COUNT JP NZ,INT50 ;ステッピングモータ処理をスキップ XOR A LD (SCALE1),A INT16M: CALL STEP_M ;16msに1回呼び出されるみたい。 INT50: ;IN_SWスイッチ処理を呼び出し。 CALL IN_SW ;STBCNTカウンタを+1 LD A,(STBCNT) INC A LD (STBCNT),A ;6になったらクリアする。 CP 6 JP NZ,SKIP XOR A SKIP: LD (STBCNT),A ;LEDのダイナミックドライブ 兼 SWのダイナミックスキャン。Z80PIO(PB)に出力 OUT (PIOBD),A RTINT1: ;割り込みを抜けてもとの処理に戻る。 POP AF POP BC POP DE POP HL RET ;スイッチサブルーチン IN_SW: PUSH HL PUSH DE PUSH BC PUSH AF ;今ダイナミックスキャンされているSWの情報を取り込む LD HL,INBUF LD A,(STBCNT);swの横の番号 LD C,A LD B,0 ADD HL,BC ;Z80PIO(PB)から取り込み IN A,(PIOBD) LD (HL),A POP AF POP BC POP DE POP HL RET ;Z80CTCの初期化。2m秒ごとの割り込みを発生させているらしい。 CTCSET: IM 2;割り込みモード2 ;割り込みベクタの設定 LD HL,VECT0 LD A,H LD I,A LD A,L OUT (CTCADR),A ;割り込みタイマの設定。手元にZ80CTCの資料がないので自力で確認のこと。 LD HL,CTCTBL LD B,4 LD C,CTCADR CTCST1: LD A,(HL) INC HL OUT (C),A LD A,(HL) INC HL OUT (C),A INC C DJNZ CTCST1 RET ;ステッピングモータの制御 STEP_M: PUSH HL PUSH DE PUSH BC PUSH AF ;モーターON? LD A,(TOTAL_P) BIT 0,A JP Z,JPPOP ;OFFなら抜ける、 ;ステッピングモータのカウント。0~3を繰り返す。 LD A,(STEP_C) INC A AND MASK LD (STEP_C),A ;カウントとステッピングモータのフェーズテーブルを参照する。 LD E,A LD D,0 LD HL,PHASE ADD HL,DE LD A,(HL) ;ステッピングモータにフェーズデータを送る。 OUT (PORTC),A JPPOP: POP AF POP BC POP DE POP HL RET ORG 8100H (以下データ) END CTCADR EQU 00H ;CTCの制御レジスタ PIOAD EQU 08H ;Z80PIO Aポートデータ(bit0-7: LED 7SEG) PIOAC EQU 09H ;Z80PIO Aポートコントロール PIOBD EQU 0AH ;Z80PIO Bポートデータ(bit0-3:LED drive,bit4-7: swのスキャン) PIOBC EQU 0BH ;Z80PIO Bポートコントロール PORTA EQU 0CH ;8255 ポートA PORTB EQU 0DH ;8255 ポートB PORTC EQU 0EH ;8255 ポートC ここにステッピングモーターが接続されているらしい。 CMDPT EQU 0FH ;8255 コントロール STACK EQU 9000H MASK EQU 03H COUNT EQU 8 ORG 8000H (以下データ) ORG 8100H VECT0: DW VINT0 DW VINT1 DW VINT2 DW VINT3 CTCTBL: DB 05H,00H DB 0B7H,31 DB 05H,00H DB 05H,00H PHASE: DB 90H DB 30H DB 60H DB 0C0H STEP_C: DS 1 SCALE1: DS 1 TOTAL_P: DS 1 STBCNT: DS 1 INBUF : DS 6 STROBE: DS 1 END
その他の回答 (5)
- zwi
- ベストアンサー率56% (730/1282)
勉強ですか。しかし、このプログラムは結構難易度高いですよ。 理解しておく技術は次のものがあります。 ・割り込み ・タイマLSI(Z80CTC) ・パラレル入出力LSI(Z80PIO) 簡単ですが、下記ページにめとめて解説があります。 http://www.apony.com/elec/elec10/elec10.html#chap8_7 ・パラレル入出力LSI(8255) http://www.apony.com/elec/elec9/elec9.html ・ステッピングモーター ステッピングモーターの動作原理です。 http://www.robotics.ee.shibaura-it.ac.jp/manual/chap2/motorhard.html ・マトリクス・スイッチのダイナミックスキャンの解説。 少ないIOポートで多くのスイッチを接続するための技術です。このZ80ボードで使われています。 http://www.necel.com/ja/faq/mi_com/__com_ksw.html ソースのコメントで分からない事があったら聞いてください。
お礼
本当にいろいろとありがとうございます。 明日から学校で忙しくなるのでとりあえず質問は締め切ります。 また何かあったら新しく質問させてください。 助かりました。
- zwi
- ベストアンサー率56% (730/1282)
えーと、残念ながらステッピングモータ周りの回路図が無いみたいです。 いちばん、見たい所ですね。 そう言えば聞いていなかったのですが、この質問の最終目的は何でしょうか? 1.このプログラムを改造したい? 2.Z80のプログラムの勉強をしている。 3.ハードとプログラムの両方の勉強をしている。 目的しだいで回答の仕方も変わってくるのですが。 それとこれは学校のクラブ活動?自分の趣味?仕事の研修?のどれでしょうか? あと、今後も回路図を理解できるようになる必要があるなら回路図の勉強をしておいたほうがよいですよ。近くに回路図に関して聞ける人がいたら、その人に聞くべきだと思います。
お礼
返事が遅れてごめんなさい。 2.Z80のプログラムの勉強をしている。ですね。 学校の授業でやっているのですが、 教え方が専門的すぎて誰も理解できてないような感じです。 なんとかいろんな資料を集めてやっとの思いでこれを作ったんですが、 しくみは全然わかりませんでした。 回路図もポンと渡されただけのような感じで、だから何??みたいな状態で・・ ステッピングモータ周りの回路図は無いんですよね。 このプログラムをコンパイルして、専用の機械で転送したら、 ステッピングモータが回りだして「おぉっ」って感じで笑 でも理解するにはやはり回路図の勉強なども必要なのですね。 どうもありがとうございます。
- zwi
- ベストアンサー率56% (730/1282)
調べてるんですが、コメントが無さすぎですね。 PIOAD EQU 08H PIOAC EQU 09H PIOBD EQU 0AH PIOBC EQU 0BH PORTA EQU 0CH PORTB EQU 0DH PORTC EQU 0EH CMDPT EQU 0FH この各IOポートに接続されているものを教えてください。 それぞれoutとinの両方をお願いします。
補足
ごめんなさい。 詳しいことはわたしもよくわからないのです。 とりあえず回路図を公開してみました。 http://photos.yahoo.co.jp/ph/v_pudding_coco_120/lst?&.dir=/d144&.src=ph&.view=t 参考になればお願いします。 無理な質問で申し訳ないです;
- zwi
- ベストアンサー率56% (730/1282)
訂正。 >CALLしているコール先の仕様 これは全部ありましたので訂正します。
補足
>ヘッダファイルやCALLしているコール先の仕様と使用している周辺ICの情報やステッピングモータの回路の接続状況を教えてもらわないと。 周辺ICとステッピングモータの回路の接続状態は回路図があるので分かるのでうまく説明できなくて; キー・LED部に使われているICはLS244,LS145です。 スイッチはLS145経由でINBUF[2]のbit4,5です。 割り込みはCTCSETで。モードは2です。 CTCTBLは上の補足部分にあります。 (31→4MHzで2m秒ごとの割り込み) ごめんなさい。 私自身わからないことだらけなのでうまく説明できなくて。 よろしかったらまた回答お願いします。
- zwi
- ベストアンサー率56% (730/1282)
さすがにこれだけだと分からないですね。 ヘッダファイルやCALLしているコール先の仕様と使用している周辺ICの情報やステッピングモータの回路の接続状況を教えてもらわないと。 そもそもスイッチ11,12がどの周辺IC経由で接続されているかも分からないです。たぶん、INBUFでbit4,5だとは思いますが。 それと割り込みが使われてますが、どこで初期化してますか?モード何番の割り込みを使っていますか?割り込みテーブルはどのようになっていますか? 以上を補足してください。
補足
お返事ありがとうございます。 とりあえず省いていた部分を補足します。 (初期設定) PIOAD EQU 08H PIOAC EQU 09H PIOBD EQU 0AH PIOBC EQU 0BH PORTA EQU 0CH PORTB EQU 0DH PORTC EQU 0EH CMDPT EQU 0FH CTCADR EQU 00H STACK EQU 9000H MASK EQU 03H COUNT EQU 8 ORG 8000H (以下データ) ORG 8100H VECT0: DW VINT0 DW VINT1 DW VINT2 DW VINT3 CTCTBL: DB 05H,00H DB 0B7H,31 DB 05H,00H DB 05H,00H PHASE: DB 90H DB 30H DB 60H DB 0C0H STEP_C: DS 1 SCALE1: DS 1 TOTAL_P: DS 1 STBCNT: DS 1 INBUF : DS 6 STROBE: DS 1 END
お礼
ありがとうございます。 手間をかけさせてしまい、申し訳ありませんでした。 あとは自分の力で頑張ってみます。