PICマイクロコントローラーのプログラミング

PICマイクロコントローラーは、多くの電子プロジェクトで使用するための非常に便利で汎用性の高いツールです。 彼らは非常に安価で見つけやすいです。 また、非常に強力であり、多くは内部発振器ブロックを使用して最大64 MIPSの速度を実現でき、ほとんどの同等のAVRマイクロコントローラーよりも約16倍高速です。 PICも簡単にプログラムできますが、プロジェクトをセットアップするのは難しい場合があります。 これらの手順では、ソフトウェアのセットアップ、新しいプロジェクトの作成、構成をテストしてすべてが機能することを確認するための非常に簡単な機能のプログラミングのプロセスを順を追って説明します。 彼らは非常にオープンエンドになるように設計されています。 プロジェクトが作成され、基本が終了したら、読者はこれらの指示に含まれていないすべての機能と追加機能を調べることをお勧めします。 また、これらの手順はステップバイステップで開始されることがわかりますが、手順が終わりに近づくにつれて、読者はタスクを達成し、プロジェクトを独自のものにする他の方法を探求することが推奨されます。

必要なものPICマイクロコントローラーを使用してプロジェクトを構築するために必要なものはわずかです。

  • PICマイクロコントローラー
    • これらの命令はPIC18FシリーズMCUのプログラミング用ですが、他の命令も同様です。
    • Microchips Webサイトから取得。
    • Microchipでは、有効な.eduメールアドレスを持つ学生がサンプルPICを無料で使用できます。
    • これらの命令を作成するために使用しているPICはPIC18F22K80です。
  • PICkit 3インサーキットデバッガー
    • Microchipから入手可能。
    • 一般ユーザーには45ドル、.eduメールアドレスをお持ちの場合は学生割引で34ドルかかります。
    • 同様に機能する他のプログラマーもいます。 ただし、これは開始するのに最適な方法です。
  • ブレッドボードおよびブレッドボードワイヤ
  • LED、ボタン、ポテンショメーター、またはPICに接続したいもの

ステップ1:ハードウェアを構築する

プログラミングを行う前に、最初のステップはハードウェアを構築することです。 PIC18Fポートフォリオは非常に大規模ですが、多くのチップにはいくつかの共通点があります。 詳細については、デバイスのデータシートの「PIC18Fxxxxマイクロコントローラー入門のガイドライン」セクションを参照してください。 PICマイクロコントローラーの詳細なピン配置については、デバイスのデータシートの「ピン図」セクションを参照してください。

注:VDD =正電圧、VSS =グランド。
  1. MCLRピンを1kΩ抵抗を介してVDDに接続します。
  2. 隣接するVDD-VSSペアまたはAVDD-AVSSペアの各ペア間に0.1μFのコンデンサを接続します。
  3. VCAPとVssの間に10μFのコンデンサを接続します。
  4. MCLRピンをPICkit 3のピン1に接続します。
  5. VDDをPICkit 3のピン2に接続します。
  6. VSSをPICkit 3のピン3に接続します。
  7. PGD​​ピンをPICkit 3のピン4に接続します。
  8. PGCピンをPICkit 3のピン5に接続します。
  9. PICkit 3のピン6は未接続のままにします。
  10. ANx機能を使用してアナログ入力をピンに接続します(xは数字)。
  11. デジタル入力またはデジタル出力をRxy機能でピンに接続します。xはポートを識別する文字で、yはビットを識別する番号です。
この例では、RA0とグランドの間にLEDが接続され、ポテンショメーターのワイパーがAN1に接続され、DPSTスイッチがRA2に接続されています。 回路の回路図をスケッチしておけば、PICをプログラムするのが簡単になるかもしれません。

ステップ2:ソフトウェアを入手する

これらの手順では、MicrochipのXC8コンパイラとMPLAB X IDEを使用します。 このステップでは、これらのツールの入手方法を説明し、正しくインストールされていることを確認します。
  1. ソフトウェアの最新バージョンを入手するには、Microchips Webサイト//www.microchip.com/pagehandler/en-us/family/mplabx/にアクセスしてください。
  2. OSのソフトウェアを選択し、標準のインストール手順に従います。
注:Windows 8を使用している場合、Windows 7の互換モードでインストーラーを実行する必要がある場合があります。
  1. ソフトウェアがインストールされたら、MPLAB Xを起動します
  2. メニューバーで[ツール]-> [オプション]を選択します。
  3. [オプション]ダイアログで[埋め込み]タブを選択し、XC8が[ツールチェーン]リストにリストされていることを確認します。
  4. リストされている場合は、[OK]を選択して次の手順に進みます。
  5. リストにない場合は、注入が完了していることを確認し、[ビルドツールのスキャン]ボタンをクリックします。
  6. それでもリストにない場合は、Microchipsフォーラムで特定の問題に関するヘルプを探してください。

ステップ3:新しいプロジェクトを作成する

このステップでは、Microchipのテンプレートに基づいて新しいプロジェクトを作成します。
  1. メニューバーで[ファイル]-> [新しいプロジェクト]を選択します。
  2. 新しいファイルダイアログボックスで[サンプル]を展開し、[Microchip Embedded]を選択します
  3. プロジェクトボックスでPIC18 C Templateを選択します
  4. 次を選択
  5. プロジェクトに好きな名前を付けます
  6. [プロジェクトの場所]ボックスでプロジェクトを保存する場所を選択します
  7. プロジェクトフォルダーを既定のオプションのままにする
  8. 「メインプロジェクトとして設定」ボックスをチェックします
  9. 終了を選択
これで、プロジェクトが画面の左側のプロジェクトエクスプローラに表示されます。

ステップ4:パラメーターを作成する

プログラミングを開始する前に、ビルドパラメータを設定する必要があります。
構成を作成する
  1. プロジェクトツールバーでプロジェクト名を右クリックします。
  2. [プロジェクトプロパティ]ダイアログで、[構成の管理...]を選択します。
  3. 「構成」ダイアログで「新規」を選択します
  4. 「新規構成名」ダイアログで「デフォルト」と入力し、「OK」をクリックします
  5. 「構成」ダイアログで、「デフォルト」が選択されていることを確認し、「アクティブに設定」をクリックします
  6. 「構成」ダイアログで「OK」をクリックします
構成プロパティを設定する
  1. [プロジェクトのプロパティ]ダイアログで、[カテゴリ]リストの[設定:[デフォルト]]を選択します
    1. [デバイス]ボックスに、使用しているデバイスの名前を入力します。 私の場合、PIC18F26K80
    2. [ハードウェアツール]リストで[PICkit3]を選択します
    3. コンパイラツールチェーンで、XC8(v ...)を選択します。ここで、...はインストールしたバージョンです。
    4. 適用を選択
  2. Conf:[デフォルト]でPICkit 3を選択します
    1. オプションカテゴリの場合は、[電力]を選択します
    2. 「PICkit3の電源ターゲット回路を確認してください
    3. 適用を選択します。
  3. 設定:[デフォルト] XC8コンパイラを選択します
    1. オプションカテゴリについては、最適化を選択します
    2. 「最適化セット」を「なし」に設定します
    3. 適用を選択
  4. [OK]をクリックしてダイアログボックスを閉じます
構成をテストする構成をテストするには、クリーンアンドビルドボタン(ハンマーとほうきのあるボタン)をクリックします。 ページ下部の出力ウィンドウでテキストのスクロールが開始されます。 すべてが成功した場合、このテキストにはBUILD SUCCESSFUL(total time:...)と表示されます。 エラーが発生した場合は、この手順を繰り返して、何も見逃していないこと、すべてが適用されていることを確認してください。

ステップ5:構成ビットを設定する

次のステップは、構成ビットの設定です。 コンフィギュレーションビットは、MCUがオンになるときの初期条件を伝えます。 これらは、クロックソースと速度、ウォッチドッグ時間の構成、およびその他の同様の機能を設定するために使用されます。 構成ビットはデバイスに依存するため、使用しているチップのデータシートで詳細を確認してください。
  1. プロジェクトエクスプローラーで[ソースファイル]を展開し、configuration_bits.cを開きます
  2. #endif行の下のすべてのテキストを削除します
  3. 画面の下部に新しいタブが開いたことに注意してください
  4. プロジェクトに必要なビットを設定します。 これらはチップに依存しているため、それぞれの機能の詳細についてはデータシートを確認してください。 一般的な設定は次のとおりです。
    1. 拡張命令セット-テンプレートを使用する場合はオフに設定する必要があります
    2. オシレーター-プロセッサーの選択に使用されます。 外部水晶を使用している場合を除き、設定は内部RC発振器のままにします。 他の発振器構成については、データシートを参照してください。 注:CLKOUTを使用すると、デバッグが容易になり、使用可能な場合はオンにする必要があります。
    3. PLLイネーブル-PLLの将来の使用を可能にします。 注:これはPLLをオンにするのではなく、有効にするだけです。 有効にすることをお勧めします。
    4. ウォッチドッグタイマー-ウォッチドッグタイマーは、プロセッサがロックしないようにするために使用されます。 ただし、デバッグがはるかに困難になります。 最初のプログラミング中は無効にし、プロジェクトがほぼ完了した後にのみ有効にすることをお勧めします。
    5. コード/テーブルの書き込み/読み取り保護-特定の範囲のメモリへの書き込みまたは読み取りを無効にするために使用されます。 これらはすべて無効のままにします。
    6. 設定について不明な場合は、通常はデフォルトのままにしておくと安全です。
  5. すべての構成ビットを設定したら、パネルの下部にある「出力するソースコードを生成」ボタンをクリックします。
  6. パネルが[出力]タブに切り替わります。 このタブのすべてのテキストを選択して、クリップボードにコピーします
  7. configuration_bits.cファイルの下部に貼り付けて保存します。
  8. ほうきとハンマーのアイコンをクリックして、プロジェクトを再度クリーンおよびビルドします。
  9. ビルドが成功したことを確認します。 また、出力にエラーがなかったことを確認してください
すべてがうまくいったら、次のステップに進みます。 エラーまたは警告がある場合は、先に進む前にそれらを修正します。

ステップ6:オシレーターの構成

次のステップは、プログラミングを開始することです。 ただし、アプリケーションコードに到達する前に、システムコードをプログラムする必要があります。 システムコードは、発振器の構成や基本的な遅延機能などの低レベルの機能です。

設定の決定

設定をプログラムする前に、実行速度を選択する必要があります。 この例では、ほとんどのPICがこの速度で実行できるため、16MHzを使用します。 私の構成では、HF-INTOSCからの4MHzポストコーラーと、4MHz * 4x = 16MHzの出力周波数を与える4x PLLを使用します。
  1. データシートで、Oscillator Configurationsというラベルのセクションを見つけます
  2. このセクションで最初にリストされるのは、オシレーターの種類です。 内部発振器を使用している場合、INTIO1に関連する設定を使用します
  3. 次の1〜2ページに、表示されているものと同様のオシレーターの回路図があります。 この図面で信号をトレースすると、正しい速度が選択されていることを確認するのに役立ちます。
  4. 次のステップは、これらの設定をMCUにプログラムすることです。 これは、レジスタを設定することにより行われます。 設定する最初のレジスタはOSCCONです。
    1. IDLEN-sleepコマンドの動作を制御するために使用されます。 デフォルトのままにしておくことができます。
    2. IRCF-発振器の選択。 HF-INTOSC / 4(4MHz)を使用しているため、これをバイナリ値101に設定する必要があります。
    3. OSTS-読み取り専用ビット
    4. HFIOFS-読み取り専用ビット
    5. SCS-クロック選択ビット。 私は内部発振器を使用しているため、1xに設定します。xは0または1です。
  5. 次のレジスタはOSCCON2です。 ただし、このレジスタはほとんど読み取り専用であり、この時点では重要ではありません
  6. 最後の発振器構成レジスタはOSCTUNEです。 このプロジェクトの周波数は調整しませんが、このレジスタを使用して、PLLENビットを使用してPLLをオンにする必要があります。

設定を適用する

  1. MPLABに戻る
  2. プロジェクトエクスプローラーの[ソースファイル]でsystem.cを開きます。
  3. このファイルの下部には、ConfigureOscillator関数があります。 その関数のコメントを削除します。
  4. すべてのレジスタタイプのビットを設定するには、レジスタ名を大文字にし、その後に小文字のワードビット、ピリオド、ビット名を続けます。
  5. ビットを設定するには、それに等号を付けます。 バイナリタイプ0bXXXXを使用するには、XXXXはバイナリ番号です。 最後に行をセミコロンで終了します。
  6. 上記で決定したOSCCONレジスタのすべてのビットを設定します。 例:OSCCONbits.IRCF = 0b101;
  7. 必要な他のすべての発振器レジスタについても同じことを行います。 完成したConfigureOscillator関数の例については、以下を参照してください。
  8. ビルドが完了したら、警告/エラーを確認します

 / ** *クロックソースと速度を設定します* / void ConfigureOscillator(void){OSCCONbits。 IRCF = 0b101; OSCCONbits。 SCS = 0b00; OSCTUNEbits。 PLLEN = 0b1; } 

ステップ7:ミリ秒関数を待つ

最も便利な関数の1つはwait_msです。 ただし、これは標準ライブラリの関数ではないため、ユーザーがプログラムする必要があります。 この実装では、指定された時間が経過するまでプロセッサを保持するループがあります。

PIC18Fマイクロコントローラーは、1行のアセンブリコードを実行するために4クロックサイクルを必要とします。 したがって、16MHzのクロックでは、ラインは毎秒400万ライン=ミリ秒あたり4000ラインで実行されます。 forループは比較のために毎回1つの命令を取り、演算のために2つの命令がループの本体のために1つかかるため、完全に機能します。 ミリ秒あたり1000回ループするためのforループが必要です。
  1. system.cで、タイプvoid wait_ms(uint16_t time)のファイルの下部に新しい関数を作成します。
  2. 以下は完成した機能です
 / ** *ビジー待機スキームを使用して、指定されたミリ秒数待機します。 * @param time-ミリ秒単位の待機時間。 * / void wait_ms(uint16_t time){static long timel = 0; timel =時間* 1000l; for(; timel; timel-); //初期条件なし、time> 0の間、各ループ時間をデクリメントする} 
  1. プロジェクトブラウザーのヘッダーファイルフォルダーでsystem.hを開きます。
  2. 最後に行void wait_ms(uint16_t);を追加します。 関数のプロトタイプを作成します。
  3. 行8を8000000Lから16000000Lに変更します
  4. エラー/警告を作成して確認する

ステップ8:LEDを点滅させる

すべてが正しくセットアップされていることをテストする最良の方法は、LEDライトを点滅させることです。 ライトが予想される速度で点滅する場合、すべてが正しく構成されています。 この例では、LEDはポートA、ピン0(データシートのRA0)に接続されています。 LEDを別のピンに接続している場合は、適切なレジスタとビットを使用してください。
  1. ソースファイルの下のプロジェクトビューアーでmain.cを開きます。
関数void main(void)は、プログラムのメインエントリポイントです。 MCUが最初に電源を入れると、MCUはこの機能に入ります。 最初の行は、入力したConfigureOscillator関数を呼び出して、クロックソースと速度を設定します。 次の行は、すぐに埋める関数であるInitAppを呼び出し、最終的に無限ループに入ります。 関数に戻るオペレーティングシステムがないため、最後に戻り呼び出しはありません。
完成した関数は次のようになります。
  1. whileループのすぐ上に次のコードを追加します。
    1. 出力としてLEDピンを設定します-TRISAbits.TRISA0 = 0; //出力としてTRISビットを0セットに設定し、入力として1セットに設定
  2. whileループ内に次のコードを追加します
    1. LEDをオフに設定-LATAbits.LATA0 = 0; // LATビットはピンの出力を制御します。 0 =低、1 =高
    2. 1/2秒待つ-wait_ms(500);
    3. LEDをオンに設定-LATAbits.LATA0 = 1;
    4. 1/2秒待つ-wait_ms(500);
 void main(void){/ *デバイスの発振器を設定* / ConfigureOscillator(); / *アプリケーションのI / Oおよびペリフェラルを初期化* / InitApp(); TRISAbits.TRISA0 = 0; //ピンを出力に設定するwhile(1){LATAbits.LATA0 = 0; //ピンをLOWに設定wait_ms(500); // 0.5秒待機LATAbits.LATA0 = 1; //ピンをHIGHに設定wait_ms(500); // 0.5秒待ちます}} 
  1. プログラムをビルドし、エラーまたは警告を確認します
  2. PICkitがPICとコンピューターに正しく接続されていることを確認します
  3. デバイスの作成とプログラムボタン([クリーンしてビルド]ボタンの右側のボタン)をクリックします。
  4. プロンプトが表示されたら、PICkit 3を選択して[OK]をクリックします
  5. 警告にダブルチェックが表示されたら、回路に正しいPICがあり、[OK]をクリックします。
  6. ターゲットデバイスIDに関する警告が表示されたら、[OK]をクリックして無視します

ステップ9:アナログ値の読み取り

これまでのところ、プログラムはLEDを点滅させることができます。 次に、ユーザー入力を行います。 ポテンショメータを使用して、LEDの速度を変更するアナログ信号を作成します。 ADCはアナログ電圧を受け取り、デジタル値を出力します。
  1. プロジェクトブラウザで、[ソースファイル]の下のuser.cを開きます。
  2. InitApp関数の上に新しい関数void init_adc(void)作成します
  3. 次のコードを入力して、ADCモジュールを初期化します
 / ** * A / Dコンバーターを初期化します。 * / void init_adc(void){TRISAbits。 TRISA1 = 0b1; //入力ANCON0bitsとしてピンを設定します。 ANSEL1 = 0b1; //ピンをアナログADCON1bitsに設定します。 VCFG = 0b00; // v +リファレンスをVdd ADCON1bitsに設定します。 VNCFG = 0b0; // v-リファレンスをGND ADCON1bitsに設定します。 CHSN = 0b000; //負の入力をGND ADCON2bitsに設定します。 ADFM = 0b1; //出力ADCON2bitsを右揃えにします。 ACQT = 0b110; // 16 TAD ADCON2bits。 ADCS = 0b101; //クロックソースADCON0bitsにFosc / 16を使用します。 ADON = 0b1; // ADCをオンにします} 
  1. 次に、 uint16_t adc_convert(uint8_t channel)直後に別の関数を作成します
 / ** *アナログからデジタルへの変換をプリフォームします。 * @param channel使用するADC入力チャンネル。 * @return変換の値。 * / uint16_t adc_convert(uint8_t channel)ADRESL; //結果を返します 
  1. InitApp関数で、行init_adc()追加します
  2. ファイルuser.hにプロトタイプuint16_t adc_convert(uint8_t);追加しますuint16_t adc_convert(uint8_t);
  3. mainを次のように変更します。
 void main(void){uint16_t adc_value; // ADC変換結果を保持する変数//デバイスのオシレーターを構成* / ConfigureOscillator(); / *アプリケーションのI / Oおよびペリフェラルを初期化* / InitApp(); TRISAbits。 TRISA0 = 0; //ピンを出力として設定しますwhile(1){LATAbits。 LATA0 = 0; //ピンをLOWに設定adc_value = adc_convert(1); //チャネル1でA / D変換を実行wait_ms(adc_value>> 2); // 0.5秒LATAbits待ちます。 LATA0 = 1; //ピンをHIGHに設定adc_value = adc_convert(1); //チャネル1でA / D変換を実行wait_ms(adc_value>> 2); // 0.5秒待ちます}} 
  1. コードをビルドしてダウンロードします。 POTを回すと、LEDの点滅速度が変わります

ステップ10:デジタル値を読む

次に、スイッチからデジタル入力を取得します。 スイッチがオフのときは、プログラムにこれまで実行していたことを実行させ、スイッチがオンのときは、スイッチが再びオフになるまでプログラムがLEDを点灯させます。
  1. ピンを入力として設定するには、そのピンに1を書き込みますTRISAbits.TRISA2 = 1;レジスタビットTRISAbits.TRISA2 = 1;
  2. ピンがアナログ機能を共有している場合、ANCONxレジスタの適切なビットをクリアしてデジタルに設定する必要がある場合があります
  3. ピンに値を書き込むときは、LATレジスタを使用します。 ただし、ピンから値を読み取る場合は、PORTレジスタを使用しvalue = PORTAbits.RA2;
  4. mainを次のように変更します。
 void main(void){uint16_t adc_value; // ADC変換結果を保持する変数//デバイスのオシレーターを構成* / ConfigureOscillator(); / *アプリケーションのI / Oおよびペリフェラルを初期化* / InitApp(); TRISAbits。 TRISA0 = 0; //ピンを出力TRISAbitsとして設定します。 TRISA2 = 1; //入力ANCON0bitsとしてピンを設定します。 ANSEL2 = 0; //ピンをデジタルに設定しますwhile(1){if(PORTAbits。RA2)//ピンがhighの場合{LATAbits。 LATA0 = 1; //ピンをハイに設定} else //ピンがローであれば{// LED LATAbitsを点滅。 LATA0 = 0; //ピンをLOWに設定adc_value = adc_convert(1); //チャネル1でA / D変換を実行wait_ms(adc_value>> 2); // LATAbitsの時間待ちます。 LATA0 = 1; //ピンをHIGHに設定adc_value = adc_convert(1); //チャネル1でA / D変換を実行wait_ms(adc_value>> 2); //しばらくお待ちください}}} 

それだ! これで、新しいプロジェクトの設定方法、デジタルピンの読み取りと書き込み、アナログピンの読み取り方法に関する基本的な知識が得られました。 これらの3つの機能により、インターネット上のPICを使用してプロジェクトの90%を実行できます。 また、PICマイクロコントローラーの調査を続けると、他のほとんどの機能では、周辺機器を構成し、読み取りと登録を行うための非常に類似した手順が必要になります。

関連記事