• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Z80CPUを用いてステッピングモータを動かすアセンブラプログラムに解説をお願いします(長いです))

Z80CPUを用いてステッピングモータを動かすアセンブラプログラムに解説

このQ&Aのポイント
  • Z80CPUを使用したステッピングモータを動かすアセンブラプログラムの解説
  • スイッチを使用してステッピングモータを回転させるプログラムの詳細な解説
  • Z80CPUを活用したステッピングモータ制御プログラムの解説

質問者が選んだベストアンサー

  • ベストアンサー
  • zwi
  • ベストアンサー率56% (730/1282)
回答No.5

とりあえず解析は終わりました。ソースにコメントの形で書いてあります。 回路図があったんで何とか解析できた感じです。ステッピングモーターの情報は無くても今回は何とかなりましたんで。 #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

noname#46996
質問者

お礼

ありがとうございます。 手間をかけさせてしまい、申し訳ありませんでした。 あとは自分の力で頑張ってみます。

その他の回答 (5)

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.6

勉強ですか。しかし、このプログラムは結構難易度高いですよ。 理解しておく技術は次のものがあります。 ・割り込み ・タイマ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 ソースのコメントで分からない事があったら聞いてください。

noname#46996
質問者

お礼

本当にいろいろとありがとうございます。 明日から学校で忙しくなるのでとりあえず質問は締め切ります。 また何かあったら新しく質問させてください。 助かりました。

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.4

えーと、残念ながらステッピングモータ周りの回路図が無いみたいです。 いちばん、見たい所ですね。 そう言えば聞いていなかったのですが、この質問の最終目的は何でしょうか? 1.このプログラムを改造したい? 2.Z80のプログラムの勉強をしている。 3.ハードとプログラムの両方の勉強をしている。 目的しだいで回答の仕方も変わってくるのですが。 それとこれは学校のクラブ活動?自分の趣味?仕事の研修?のどれでしょうか? あと、今後も回路図を理解できるようになる必要があるなら回路図の勉強をしておいたほうがよいですよ。近くに回路図に関して聞ける人がいたら、その人に聞くべきだと思います。

noname#46996
質問者

お礼

返事が遅れてごめんなさい。 2.Z80のプログラムの勉強をしている。ですね。 学校の授業でやっているのですが、 教え方が専門的すぎて誰も理解できてないような感じです。 なんとかいろんな資料を集めてやっとの思いでこれを作ったんですが、 しくみは全然わかりませんでした。 回路図もポンと渡されただけのような感じで、だから何??みたいな状態で・・ ステッピングモータ周りの回路図は無いんですよね。 このプログラムをコンパイルして、専用の機械で転送したら、 ステッピングモータが回りだして「おぉっ」って感じで笑 でも理解するにはやはり回路図の勉強なども必要なのですね。 どうもありがとうございます。

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.3

調べてるんですが、コメントが無さすぎですね。 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の両方をお願いします。

noname#46996
質問者

補足

ごめんなさい。 詳しいことはわたしもよくわからないのです。 とりあえず回路図を公開してみました。 http://photos.yahoo.co.jp/ph/v_pudding_coco_120/lst?&.dir=/d144&.src=ph&.view=t 参考になればお願いします。 無理な質問で申し訳ないです;

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.2

訂正。 >CALLしているコール先の仕様 これは全部ありましたので訂正します。

noname#46996
質問者

補足

>ヘッダファイルやCALLしているコール先の仕様と使用している周辺ICの情報やステッピングモータの回路の接続状況を教えてもらわないと。 周辺ICとステッピングモータの回路の接続状態は回路図があるので分かるのでうまく説明できなくて; キー・LED部に使われているICはLS244,LS145です。 スイッチはLS145経由でINBUF[2]のbit4,5です。 割り込みはCTCSETで。モードは2です。 CTCTBLは上の補足部分にあります。 (31→4MHzで2m秒ごとの割り込み) ごめんなさい。 私自身わからないことだらけなのでうまく説明できなくて。 よろしかったらまた回答お願いします。

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.1

さすがにこれだけだと分からないですね。 ヘッダファイルやCALLしているコール先の仕様と使用している周辺ICの情報やステッピングモータの回路の接続状況を教えてもらわないと。 そもそもスイッチ11,12がどの周辺IC経由で接続されているかも分からないです。たぶん、INBUFでbit4,5だとは思いますが。 それと割り込みが使われてますが、どこで初期化してますか?モード何番の割り込みを使っていますか?割り込みテーブルはどのようになっていますか? 以上を補足してください。

noname#46996
質問者

補足

お返事ありがとうございます。 とりあえず省いていた部分を補足します。 (初期設定) 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