ForCy-AVR基板を使用してシリアル制御でパルスモーターを回す
(有)リカージョンさんで販売されているForCy-AVRの基板を使用したテストです。
テスト風景です。

画像1

先回使用したブレッドボードからBポートの出力を取り出して自作のPICのPLS-MOTOR基板のPICのポートに入力してドライバーを動かしています。

img005

ForCY-AVRの基板には都合よくLEDが4個載っているのでドライブするパルスモーターの相モニターをしています。ソフトを作るのには助かりました。

画像3

一寸見難いですがテスト中のモニター画面です。最初の>からの文字はForCYのコンパイルしている様子です。gと言うコマンドで実行します。
1000 30が最初の命令でパルス数よ回転速度です。回転終了するとOKの文字が帰って来ます。最大回転パルス数は16bitなので6500位です。

画像4

ここからFoyCyのプログラムです。html文書はTABが取られてしまうので左詰めになって見難いです。(少し補正)
FoyCyはBASICやCの様な便利な関数がないので置き換えワード(関数)を自作しないと使い難いです。しかし自作する事は出来るので段々使い易くなって来ます。

#
/*
 I/O test program for ATmega88
 plsmotor-sio.txt
 2007/11/10 パルスモーターを廻す 相確認のLEDの一応動作O
        12 実際にパルスモーターを廻す ポートBの0-3bitへ出力 回転OK
     PB1 CW PB2 CCW
   15 出力パルスを指定して位置決め OK
   17 ボタンによる正転、逆転位置決め OK
   19 シリアル制御 OK
    送信フォーマット ***** *** パルス数16bit(MAX65300)速度は少ない数値は速くなるのでモーターに応じ対応のこと
    テストモーターは無負荷30位
  12/01 相出力の所がどんくさいのでローテイトのワードを作成中
*/
 [40]a
 ;i ;j ;b ;n ;n1 ;n2
 ;speed ;count ;pahse   //変数定義pahseは表示LEDのパターン
 ;move       //パルス数
 ;flg         //回転中フラグ
 ;dir         //回転方向
 0 =n
 i -- =i
 i { i a 0x30 - 1 * =n i -- =i } if
 i { i a 0x30 - 10 * n + =n i -- =i } if
 i { i a 0x30 - 100 * n + =n i -- =i } if
 i { i a 0x30 - 1000 * n + =n i -- =i } if
 i { i a 0x30 - 10000 * n + =n } if
// n %d
:atoi
 1 =i
 {
  @c dup =b 0x1b == break  //終了 なぜか終了しない
  b %c          //1文字受信
  b i =a         //文字配列にストア
  b 0x20 == {     //スペースなら
   atoi         //文字数値変換
   n =n1 0 =i
  } if .
   b 0x0d == {
    "\n\r" %s
   atoi         //文字数値変換
   n =n2 0 =i
//   "=" %s n1 %d " " %s n2 %d "\n\r" %s //受信データ
  } if .
  i ++ dup =i =j
  b 0x0d == break
 } do .
:jusin
 0 { ++ } for ..            //ディレー
:dely
 clk + { clk == break } do .  //待ち
:wait
 0x29 sfr 2 >> ~ 3 &      //sw入力
:sw
  speed 0xb3 =sfr        // タイマーカウント設定変更
  count               //モーター相出力
  {
   1 { 3 =pahse } case
   2 { 6 =pahse } case
   3 { 12 =pahse } case
   4 { 9 =pahse } case
  } switch .
  pahse ~ 4 << 0x0f | 0x2b =sfr      //LED出力
  pahse ~ 0xf0 | 0x25 =sfr          //モーター出力 ポートB
  dir 1 == nip { count -- dup =count 1 < nip { 4 =count } if } if     //正転
  dir 2 == nip { count ++ dup =count 4 > nip { 1 =count } if } if     //逆転
//  count %d            //相出力モニター
//  move %d             //パルス数モニター
  move -- =move         //パルスデクリメント
  move 0 == nip { { 0 0 } interrupt 0 =flg } if  //パルス数終了検知
:intclk
 1 =count
 0 0x24 =sfr      // ポートB を入力
 0xff 0x25 =sfr    // ポートB をプルアップ
 0xff 0x27 =sfr    // ポートC を出力
 0xf2 0x2a =sfr    // ポートD を出力
 0 =move
 0 =flg
 {
  jusin
  n1 =move n2 =speed 1 =dir
  "move=" %s move %d " speed=" %s speed %d "\n\r" %s //回転データ
  1 =count
  { intclk 0 } interrupt 1 =flg
  { flg while } do
  "\n\rOK \n\r" %s
 } do .
 77 0xb3 =sfr    // タイマーカウント設定変更
:main

プログラムはここまでです。
ForCyは開発環境が要らない、配線図も公開され、ソフトも公開されているのですがISPライターでAVRが簡単に書けないのが難点です。
しかし、ノートパットひとつで気楽にプログラムが出来るので使う人が増えてソフトの公開される環境が整えば本当のオープンソースに成れると思うのですが?