スタジオ ミュウ

MYUライター(C18・PICアセンブラを使ったネイティブプログラムの書き込み)

LED計測制御 | LED双方向通信 | LEDグループ学習 | メロディのプログラム | RCサーボの制御 | モーターのPWM制御
MYUロボ-II | MYU-USB転送ソフト | MYU USB BASIC | USBドリトル | C アセンブラMYUUSB-1基板 | MYUUSB命令一覧

■MYU-520 MYU-USB基本セット 4,235円(10%税込)
■MYU-521 MYU-USBベルト基本セット 4,235円(10%税込)
■MYU-522 3軸MYU-USB基本セット 5,390円(10%税込)
■MYU-524 MYU-USB制御基板(2モーター用) 2,860円(10%税込)
■MYU-526 MYU-USB制御基板(4モーター用) 3,080円(10%税込)

●MYUライター (myuwriter.exe)
myuwriter.exeを使うとMicroChip社提供のフリーソフトC18やPICアセンブラで作ったHEXファイルの転送がPIC書込み器がなくても可能です。
Cやアセンブラの学習がMYUUSB-1基板(PIC18F40K50)を使って簡単にできます。

MYUライター (myuwriter.exe) はここからダウンロード(40K V1.151 2017/1/20版)できます。(64bitOS対応)

●起動方法
ダウンロードしたmyurobousb.zipを展開しmyuusbホルダをCD-ROM・ハードディスク・サーバー・USBメモリなどにコピーしてください。ホルダ中のmyuwriter.exeを実行するとMYUライターが起動します。
※myuwriter.exeは、Windows7、Vista では動作しますが XP では、Microsoft .NET Framework 3.5 をインストールする必要があります。
.NET Framework 3.5は、ここからダウンロードしてください。

●プログラム
MYUWRITER.EXEを立ち上げてください。Openボタンを押してサンプルのtest1-1.hexを読み込むと下の画面になります。
PCとMYU-USB制御基板とを転送ケーブルで接続しWriteボタンを押すと転送され'ピピ'と鳴なれば転送終了です。転送ケーブルを抜きスイッチを入れ直してタクトスイッチを押すとプログラムが実行されます。このプログラムはタクトスイッチを押している間、ブザーとLEDを点滅します。

//タクトスイッチを押すとブザー&LEDが点滅(test1-1.c)
#include <p18f14k50.h>
#pragma code myu_start=0x2800  //MYU用に2800Hから展開
void wait (void);
void main (void) {
  int a;
  TRISA = 0b1000;  //RA3(In1)を入力
  WPUA = 0b1000;  //RA3をソフトプルアップ
  TRISB = 0;     //ポートBを出力
  while (1) {
    if(PORTAbits.RA3 == 1)    //IN1が押されていない場合
    {
      PORTBbits.RB7 = 0;    //LED点灯
    }
    else              //押された場合
    {
      for ( a = 0; a < 200; a++)
      {
        PORTBbits.RB7 = 1;    //ブザー&LED消灯
        wait();
        PORTBbits.RB7 = 0;    //LED点灯
        wait();
      }
      for ( a = 0; a < 500; a++)
      {
        PORTBbits.RB7 = 1;    //LED消灯
        wait();
      }
    }
  }
}
void wait (void)
{  int a;
  
  for (a = 0; a < 200; a++) { }
}

※MYUUSB基板のP18F14F50は0-27ffhまではMYUファームウエアが書き込まれています。
※MYUのユーザープログラムは2800hから3fffh(6K)までの間に書き込みます。
※基板のタクトスイッチ(IN1)を押すと2800Hからネイティブプログラムを実行します。

Openボタン
  HEXファイル読み込みテキストボックスに表示します。
Writeボタン
  HEXファイルを基板に転送します。
Readボタン
  基板に書き込まれているプログラムを読み込みテキストボックスに表示します。
Verifyボタン
  基板に書き込まれているプログラムとテキストボックスのプログラムとを比較します。
Remoteボタン
  Remote用のダイヤログが現れて各種の操作ができる。
USB-●
  転送可能かどうか表示します。


●MicroChip社提供の開発ツール MPLAB IDE と MPLAB-C18(Cコパイラ)
MPLAB IDEはPICの統合開発環境を提供するフリーソフトウェアです。MPLAB IDEはここからダウンロードしてインストールします。
MPLAB-C18は、MPLAB IDEの中に統合するPIC18シリーズ用の「Cコンパイラ」です。MPLAB-C18はここからダウンロード(PIC18 in LITE mode)してインストールします。
MYUUSB基板で使っているPIC18F14K50のデーターシートはこちら
参考書籍、改訂版 電子工作のためのPIC18F本格活用ガイドはこちら
PIC開発の参考HPはこちら、C18の参考HPはこちら

(MYUUSB-1基板の回路図)
《主な仕様》
動作電圧: 2.5V-5.5V
クロック:48MHz タイマー0:250KHz
プログラムサイズ:6141bytes
変数エリア:128bytes サブルーチンの深さ:16
最大4個のDCモータ駆動(各モータドライバ最大負荷:1W以内)
サーボモータ8個まで制御可能、またメロディのプログラムも可能
デジタル入力4BIT + 出力8BIT
アナログ入力:2-8チャンネル(8/10BIT)
※モータ駆動の数によって異なる
EEPROM(256bytes)の読書き、16BIT符号付四則演算、デバッグ機能など

《PIC18F14K50設定情報》
1:+V
2:OSC1
3:OSC2
4:RA3(入力) In1
5:RC5(出力) M4L
6:RC4(出力) M4R
7:RC3(出力) M3L,AN7
8:RC6(出力) M3R,AN8
9:RC7(出力) M2L,AN9
10:RB7(出力) LEDと圧電ブザー
11:RB6(入力) In2
12:RB5(入力) In3,AN11
13:RB4(入力) In4,AN10
14:RC2(出力) M2R,AN6
15:RC1(出力) M1L,AN5
16:RC0(出力) M1R,AN4
17:VUSB 未使用
18:D-
18:D+
20:-V
※RA3,RB4-6はプルアップされる

●MPLAB IDE アセンブラのプログラム
タクトスイッチ(IN1)を押すとLEDが消え離すと点灯するプログラムを作ってみます。
MPLAB IDEを立ち上げ、File>New をクリック。ここに下のプログラムを張り付け File>Save As で拡張子を .asm として保存します。ここでは asm1.asm としました。
Configure>Select DeviceからDeviceをPIC18F14K50を選択しOKをクリック、Project>QuitBuild asm1.asm をクリック、エラーがなければ HEXファイル作られます。
このHEXファイル(asm1.hex)をMYUWRITER.EXEで読み込み、基板に転送すると実行できます。

;---------------------------------------- ; タクトスイッチ(IN1)を押すとLEDが消え離すと点灯する ;---------------------------------------- INCLUDE "P18F14K50.inc" ORG 2800h ;MYU用に2800Hからcodeを展開 movlw B'1000' movwf TRISA ;ポートAのBIT3(RA3)を入力にセット movwf WPUA ;RA3をソフトプルアップ clrf TRISB ;ポートBを出力にセット loop btfsc PORTA,3 ;RA3がLow(IN1が押された)なら次の命令をスキップする bra loop1 ;loop1にジャンプ bsf PORTB,7 ;RB7をHigh(LED消灯) bra loop ;loopにジャンプ loop1 bcf PORTB,7 ;RB7をLow(LED点灯) bra loop ;loopにジャンプ END 
MYUUSB基板のPIC18F14K50は右図のように0000Hから27FFHまでファームウェアが書き込まれています。スイッチONとともにファームウェアが実行されクロック(48M)やIOポートなどの設定を行います。※上右の《PIC18F14K50設定情報》参照
このためユーザーのプログラムは2800HからHEXファイルを作る必要があります。転送後、タクトスイッチを押すと2800Hからネイティブ実行されます。
またファームウェアで設定されるものは、ユーザープログラムでは省略することができます。

【プログラムの説明】
上の回路図のとおりタクトスイッチ(IN1)はポートAのBIT3(RA3)に、LEDはポートBのBIT7(RB7)に接続されています。
プログラムは最初にポートの入出力を設定、RA3がHighかLowで条件分岐しています。RB7をHighかLowに出力することでLEDが点灯します。
ORG 2800H は擬似命令でアセンブラのcodeを2800Hから展開することができます。
●MPLAB-C18 Cプログラム
アセンブラで作ったものと同じ動作をするプログラムを C で作ってみます。
MPLAB IDEを立ち上げ、File>New をクリック。ここに下のプログラムを張り付け File>Save As で拡張子を .c として保存します。ここでは c1.c としました。
Projectを作ります。Project>Project Wizardをクリックし次へをクリック、DeviceをPIC18F14K50を選択し次へをクリック、Active Toolsuite:をMicrochip C18 Toolsuite、Toolsuite ContentsをMPASM Assembler[...]..を選択、次へをクリック、Create New Project FileにProject名を指定して保存します。
次へをクリック、左のボックスからc1.cをダブルクリックすると右の画面になります。次へをクリックしProjectを完了します。Project Manager内のSource filesフォルダ内のc1.cをダブルクリックするとソースが表示されます。
Project>Build Allをクリックするとコンパイルが行われエラーがなければ HEXファイル作られます。このHEXファイルをMYUWRITER.EXEで読み込み、基板に転送すると実行できます。

//---------------------------------------- // タクトスイッチ(IN1)を押すとLEDが消え離すと点灯する //---------------------------------------- #include &ltp18f14k50.h> #pragma code myu_start=0x2800 //MYU用に2800Hからcodeを展開 void main (void) { TRISA = 0b1000; //ポートAのBIT3(RA3)を入力にセット WPUA = 0b1000; //RA3をソフトプルアップ TRISB = 0; //ポートBを出力にセット while(1) { if(PORTAbits.RA3 == 0) //RA3がLow(IN1が押された)なら PORTBbits.RB7 = 1; //RB7をHigh(LED消灯) else PORTBbits.RB7 = 0; //RB7をLow(LED点灯) } }

◆タイマー0を使ったモーター制御
上の回路図のとおりポートCはモータードライバICに接続されています。下の表を参考に値をポートCに出力すると4個のモーターを自由にコントロールできます。
下のプログラムはタイマー0を使いモーターを一定時間動かすものです。
※タイマー0は16ビットタイマーです。TMR0Hが上位8ビット、TMR0Lが下位8ビットですが下位のTMR0Lの読み書きを行わないと上位のTMR0Hが更新されませんので注意が必要です。
//---------------- // 前進を1秒 //---------------- #include &ltp18f14k50.h> #pragma code myu_start=0x2800 //MYU用に2800Hからcodeを展開 void wait1m (int t); void main (void) { TRISC = 0; //ポートCを出力にセット T0CON = 0x80; //タイマ0を6Mにセット:(48M/4)/2 prescale value PORTC = 0b101; //前進の信号をポートCに出力 wait1m(1000); //1秒の待ち PORTC = 0; //停止 } void wait1m(int t) { //1msecのウエイト char t0l; while (t > 0) { TMR0H = 0; //タイマー0をクリア TMR0L = 0; while (TMR0H < 23){ t0l = TMR0L; //TMR0HはTMR0Lを読まないと更新されない } while (TMR0L < 112) { } t--; } } 
命令 RC7 RC6 RC5 RC4 RC3 RC2 RC1 RC0 10進値 2進値
停止                 0 B'0'
左前               1 B'1'
前進             5 B'101'
右前               4 B'100'
モーター3左               64 B'1000000'
モーター3右               8 B'1000'
左後               2 B'10'
後退             130 B'10000010'
右後               128 B'10000000'
右回り             129 B'10000001'
左回り             6 B'110'
モーター4左               16 B'10000'
モーター3右               32 B'100000'
※"前進"と"モーター3左"と同時に動かすには上の表からRC6,RC2,RC0のビットを'1'にすることで可能になります。

◆MYU-USB基本セットを使った迷路脱出ロボット
下は、MYU-USB転送ソフト (myuusb.exe)のサンプルプログラム、MYU-USBサンプル1.txtと同じ動作をします。
タクトスイッチを押すと左大回り(PWM制御)して左側の壁に近づきます。触覚が壁を感知すると後退し右回りして迷路を脱出することができます。

//---------------- // 迷路脱出ロボット //---------------- #include &ltp18f14k50.h> #pragma code myu_start=0x2800 //MYU用に2800Hからcodeを展開 void wait1m (int t); void main (void) { TRISB = 0b1100000; //RB5,RB6を入力にセット WPUB = 0b1100000; //RB5,RB6をソフトプルアップ TRISC = 0; //ポートCを出力にセット T0CON = 0x80; //タイマ0を6Mにセット:(48M/4)/2 prescale value while (1) { //PWM制御(左大回り) PORTC = 0b101; //前進の信号をポートCに出力 wait1m(10); //()内の数を多くすると大回りになる PORTC = 0b100; //右前の信号をポートCに出力 wait1m(4); //()内の数を多くすると小回りになる if(PORTBbits.RB6 == 0 || PORTBbits.RB5 == 0) //In2(RB6),In3(RB5)が壁に接触したら { PORTC = 0b10000010; //後退の信号をポートCに出力 wait1m(500); //0.5秒の待ち PORTC = 0b10000001; //右回りの信号をポートCに出力 wait1m(500); //0.5秒の待ち } } } void wait1m(int t) { //1msecのウエイト char t0l; while (t > 0) { TMR0H = 0; //タイマー0をクリア TMR0L = 0; while (TMR0H < 23){ t0l = TMR0L; //TMR0HはTMR0Lを読まないと更新されない } while (TMR0L < 112) { } t--; } } 
◆タイマー0を使ったLED制御
MYUUSB-1A基板を右図のようにLEDを配線してポートCに値を出力ことでLEDを光らせることができます。
下記の製品は、C18を使ってLED制御できます。

■MYU-532 LED計測制御キット(LEDハンダ付けタイプ)2,052円(8%税込)
■MYU-533 LED計測制御基板(LEDハンダ付け済み) 2,160円(8%税込)
■MYU-535 LED計測制御グループ学習セット(ハンダ付け済み) 2,538円(8%税込)

LEDはポートCのビットを1にすると点灯、0にすると消灯します。
下のプログラムはポートCの値を1秒ごとに1づつ増やしLEDを順に点灯するものです。

//------------------------ // 0.1秒ごとLEDを順に点灯する //------------------------ #include &ltp18f14k50.h> #pragma code myu_start=0x2800 //MYU用に2800Hからcodeを展開 void wait1m (int t); void main (void) { TRISC = 0; //ポートCを出力にセット T0CON = 0x80; //タイマ0を6Mにセット:(48M/4)/2 prescale value PORTC = 0; //ポートCをクリア while (1) { wait1m(100);  //0.1秒の待ち PORTC++; //ポートCを+1する } } void wait1m(int t) { //1msecのウエイト char t0l; while (t > 0) { TMR0H = 0; //タイマー0をクリア TMR0L = 0; while (TMR0H < 23){ t0l = TMR0L;  //TMR0HはTMR0Lを読まないと更新されない }
 while (TMR0L < 112) { } t--; } } 
◆リーモート操作(LED制御)
基板とPCを転送ケーブルで接続しRemoteボタンを押すと右図のダイヤログが現れて各種の操作ができます。

◆RC0-RC7のチェックボックス
  ポートCの出力をビットごと設定できます。(LED制御に便利)
◆デジタル計測ボタン
  デジタル計測が始まりIn2-In4の状態がリアルタイムで見ることができます。
◆アナログ計測ボタン(AN10-AN4)
  アナログ計測が始まり結果をリアルタイムで見ることができます。
◆サーボスライダ
  SERVO-1から8のサーボをPCからコントロールできます。
◆記録開始ボタン
  記録停止までの間、計測間隔ごとにアナログ計測値をファイル(myu.txt)に保存する。Excelなどで結果を表やグラフにできます。
◆割り込み処理(LED制御)
プログラム実行中にイベントなどにより処理を中断し別の処理を行うことを割り込み処理といいます。
PIC18F14K50には低位と高位の2種類の割り込みがあり、MYUUSB基板の場合、以下のアドレスに割り込みプログラムを書きます。

2808H 高位レベル割り込み
2816H 低位レベル割り込み

下のプログラムはメインプログラムの無限ループではなんの処理もしていませんが1秒ごとのタイマー0割り込みではポートCを1つづ増やしています。

//------------------------------------------- //1秒ごとのタイマ0割り込 USBケーブルを抜いてから実行すること //------------------------------------------- #include &ltp18f14k50.h> void main (void) { TRISC = 0; //PORTCをすべて出力 PORTC = 0; // LED消灯 T0CON = 0x87; //タイマ0を46.875Kにセット:(48M/4)/256 prescale value INTCONbits.TMR0IE = 1; // タイマ0割り込み許可 INTCONbits.GIE = 1; // グローバル割り込み許可 /// 割り込み待ちアイドルループ while(1) //無限ループ { } } // タイマ0割り込み処理 void isr0(void) { INTCONbits.TMR0IF = 0; // 割り込みフラグクリア TMR0H = 0x48; //タイマー0が1秒後に0(割り込み発生)になるようセット TMR0L = 0xe5; ++PORTC; //1秒ごとにインクリメント } #pragma code myu_start=0x2800 //MYU用に2800Hから展開 void myu_main(void) { _asm goto main _endasm } // 最初にmainにジャンプ //割り込み定義(優先レベルなし) #pragma interrupt isr0 //割り込みベクタセット #pragma code isrcode = 0x2808 //MYUの割り込アドレス void isr_direct(void) // 割り込み関数へ { _asm goto isr0 _endasm } // 割り込発生でisr0にジャンプ