PICkit 3 Starter Kit User’s Guide
|
|
|
- しょうり かいじ
- 9 years ago
- Views:
Transcription
1 注意 : この日本語版文書は参考資料としてご利用ください 最新情報は必ずオリジナルの英語版をご参照願います 2015 Microchip Technology Inc. DS41628B_JP
2 Microchip 社製デバイスのコード保護機能に関して以下の点にご注意ください Microchip 社製品は 該当する Microchip 社データシートに記載の仕様を満たしています Microchip 社では 通常の条件ならびに仕様に従って使用した場合 Microchip 社製品のセキュリティレベルは 現在市場に流通している同種製品の中でも最も高度であると考えています しかし コード保護機能を解除するための不正かつ違法な方法が存在する事もまた事実です 弊社の理解では こうした手法は Microchip 社データシートにある動作仕様書以外の方法で Microchip 社製品を使用する事になります このような行為は知的所有権の侵害に該当する可能性が非常に高いと言えます Microchip 社は コードの保全性に懸念を抱いているお客様と連携し 対応策に取り組んでいきます Microchip 社を含む全ての半導体メーカーで 自社のコードのセキュリティを完全に保証できる企業はありません コード保護機能とは Microchip 社が製品を 解読不能 として保証するものではありません コード保護機能は常に進歩しています Microchip 社では 常に製品のコード保護機能の改善に取り組んでいます Microchip 社のコード保護機能の侵害は デジタルミレニアム著作権法に違反します そのような行為によってソフトウェアまたはその他の著作物に不正なアクセスを受けた場合 デジタルミレニアム著作権法の定めるところにより損害賠償訴訟を起こす権利があります 本書に記載されているデバイスアプリケーション等に関する情報は ユーザの便宜のためにのみ提供されているものであり 更新によって無効とされる事があります お客様のアプリケーションが仕様を満たす事を保証する責任は お客様にあります Microchip 社は 明示的 暗黙的 書面 口頭 法定のいずれであるかを問わず 本書に記載されている情報に関して 状態 品質 性能 商品性 特定目的への適合性をはじめとする いかなる類の表明も保証も行いません Microchip 社は 本書の情報およびその使用に起因する一切の責任を否認します 生命維持装置あるいは生命安全用途に Microchip 社の製品を使用する事は全て購入者のリスクとし また購入者はこれによって発生したあらゆる損害 クレーム 訴訟 費用に関して Microchip 社は擁護され 免責され 損害を受けない事に同意するものとします 暗黙的あるいは明示的を問わず Microchip 社が知的財産権を保有しているライセンスは一切譲渡されません 商標 Microchip 社の名称とロゴ Microchip ロゴ dspic FlashFlex KEELOQ KEELOQ ロゴ MPLAB PIC PICmicro PICSTART PIC 32 ロゴ rfpic SST SST ロゴ SuperFlash UNI/O は 米国およびその他の国におけるMicrochip Technology Incorporated の登録商標です FilterLab Hampshire HI-TECH C Linear Active Thermistor MTP SEEVAL Embedded Control Solutions Company は 米国におけるMicrochip Technology Incorporatedの登録商標です Silicon Storage Technology は 他の国における Microchip Technology Inc. の登録商標です Analog-for-the-Digital Age Application Maestro BodyCom chipkit chipkit ロゴ CodeGuard dspicdem dspicdem.net dspicworks dsspeak ECAN ECONOMONITOR FanSense HI-TIDE In-Circuit Serial Programming ICSP Mindi MiWi MPASM MPF MPLAB Certified ロゴ MPLIB MPLINK mtouch Omniscient Code Generation PICC PICC-18 PICDEM PICDEM.net PICkit PICtail REAL ICE rflab Select Mode SQl Serial Quad I/O Total Endurance TSHARC UniWinDriver WiperLock ZENA および Z-Scale は 米国およびその他の Microchip Technology Incorporated の商標です SQTP は 米国における Microchip Technology Incorporated のサービスマークです GestIC および ULPP は Microchip Technology Inc. の子会社である Microchip Technology Germany II GmbH & Co. & KG 社の他の国における登録商標です その他本書に記載されている商標は各社に帰属します 2015, Microchip Technology Incorporated, All Rights Reserved. ISBN: Microchip 社では Chandler および Tempe ( アリゾナ州 ) Gresham ( オレゴン州 ) の本部 設計部およびウェハー製造工場そしてカリフォルニア州とインドのデザインセンターが ISO/TS-16949: 2009 認証を取得しています Microchip 社の品質システムプロセスおよび手順は PIC MCU および dspic DSC KEELOQ コードホッピングデバイス シリアル EEPROM マイクロペリフェラル 不揮発性メモリ アナログ製品に採用されています さらに 開発システムの設計と製造に関する Microchip 社の品質システムは ISO 9001:2000 認証を取得しています DS41628B_JP - p Microchip Technology Inc.
3 目次 Chapter 1. 概要 1.1 はじめに ハイライト 新機能 キットの内容 PICkit 少ピン開発ボード ソフトウェアの概要 デモの実行 Chapter 2. PIC MCU のアーキテクチャ 2.1 はじめに コアの基礎 データ / プログラムバス アキュムレータ 命令 バイト指向 ビット指向 リテラル 制御 スタックレベル メモリ構成 プログラムメモリ フラッシュプログラムメモリ コンフィグレーションワード デバイス ID リビジョン ID ユーザ ID データメモリ コアレジスタ 特殊機能レジスタ 汎用 RAM 共通 RAM バンク データ EEPROM メモリ プログラミングの基礎 MPASM アセンブラの動作 XC8 の動作 アセンブラでの数値表現 XC8 コンパイラでの数値表現 Microchip Technology Inc. DS41628B_JP - p.3
4 Chapter 3. レッスン 2.17 MPASM アセンブラのディレクティブ Banksel cblock Org (addr) End Errorlevel #include レッスン レッスン 1: Hello World (LED の点灯 ) レッスンの紹介 ハードウェアの動作 概要 新しく学ぶレジスタ 新しく学ぶ命令 アセンブリ C 言語 レッスン 2: LED 点滅 レッスンの紹介 ハードウェアの動作 概要 新しく学ぶレジスタ 新しく学ぶ命令 アセンブリ C 言語 レッスン 3: ローテート レッスンの紹介 ハードウェアの動作 概要 新しく学ぶレジスタ 新しく学ぶ命令 アセンブリ C 言語 レッスン 4: A/D 変換 レッスンの紹介 ハードウェアの動作 概要 新しく学ぶレジスタ 新しく学ぶ命令 アセンブリ C 言語 レッスン 5: 可変速ローテート レッスンの紹介 ハードウェアの動作 概要 新しく学ぶレジスタ 新しく学ぶ命令 アセンブリ C 言語...62 DS41628B_JP - p Microchip Technology Inc.
5 3.7 レッスン 6: デバウンス レッスンの紹介 ハードウェアの動作 概要 新しく学ぶレジスタ 新しく学ぶ命令 アセンブリ PIC C 言語 レッスン 7: 方向切り換え付き可変速ローテート レッスンの紹介 ハードウェアの動作 概要 新しく学ぶレジスタ 新しく学ぶ命令 アセンブリ C 言語 レッスン 8: パルス幅変調 (PWM) レッスンの紹介 ハードウェアの動作 概要 新しく学ぶレジスタ アセンブリ レッスン 9: Timer レッスンの紹介 ハードウェアの動作 概要 新しく学ぶレジスタ アセンブリ C 言語 レッスン 10: 割り込みとプルアップ レッスンの紹介 ハードウェアの動作 概要 新しく学ぶレジスタ 新しく学ぶ命令 アセンブリ C 言語 レッスン 11: 間接アドレス指定 レッスンの紹介 ハードウェアの動作 概要 新しく学ぶレジスタ 新しく学ぶ命令 アセンブリ言語 C 言語 レッスン 12: ルックアップテーブル レッスンの紹介 ハードウェアの動作 概要 新しく学ぶレジスタ 新しく学ぶレジスタ 新しく学ぶ命令 Microchip Technology Inc. DS41628B_JP - p.5
6 アセンブリ言語 C 言語 レッスン 13:EEPROM レッスンの紹介 ハードウェアの動作 概要 新しく学ぶレジスタ 新しく学ぶ命令 アセンブリ言語 C 言語...95 補遺 A. ブロック図と MPLAB X IDE のショートカット A.1 MPLAB X IDE の便利なショートカット...98 A.2 レジスタ名の定義...98 A.3 PIC MCU のアセンブリコーディング作法...98 DS41628B_JP - p Microchip Technology Inc.
7 まえがき お客様へのご注意 全ての文書の内容は時間と共に古くなります 本書も例外ではありません Microchip 社の製品は お客様のニーズを満たすために常に改良を重ねており 実際のダイアログやツールが本書の説明とは異なる場合があります 最新の文書は弊社ウェブサイト ( で公開しています 文書は DS 番号で識別します この識別番号は 各ページのフッタのページ番号の前に記載しています DS 番号 DSXXXXXA の XXXXX は文書番号 A は文書のリビジョンレベルを表します 開発ツールの最新情報は MPLAB X IDE のオンラインヘルプで提供しています [Help] メニューから [Topics] を選択すると オンラインヘルプファイルのリストが表示されます はじめに 本書の構成 この章には PICkit 3 スタータキットを使い始める前に知っておくと便利な一般情報を記載しています 主な内容は以下の通りです 本書の構成 本書の表記規則 保証登録 推奨参考資料 Microchip 社のウェブサイト 開発システムの顧客変更通知サービス カスタマサポート 改訂履歴 本書では PICkit 3 スタータキットを開発ツールとして使って ターゲット基板のファームウェアのエミュレーションとデバッグを行う方法を説明します 以下に本書の構成を示します セクション第 1 章 概要 セクション第 2 章 PIC MCU のアーキテクチャ セクション第 3 章 レッスン 補遺 A. ブロック図と MPLAB X IDE のショートカット 2015 Microchip Technology Inc. DS41628B_JP - p.7
8 本書の表記規則 本書では以下の表記規則を適用します 本書の表記規則表記 意味 例 Arial/MS ゴシックフォント : 二重かぎカッコ : 参考資料 MPLAB IDE ユーザガイド テキストの強調... は唯一のコンパイラです... 角カッコ : [ ] ウィンドウ名 [Output] ウィンドウ ダイアログ名 [Settings] ダイアログ メニューの選択肢 [Enable Programmer] を選択 かぎカッコ : ウィンドウまたはダイアロ Save project before build グのフィールド名 右山カッコ (>) を使い 角カッコ メニューパス File>Save で囲まれた下線付きテキスト 角カッコで囲んだ太字のテキ ダイアログのボタン [OK] をクリックする スト タブ [Power] タブをクリックする N Rnnnn Verilog 形式の数値 : N は総桁数 R は基数 n は各桁の値 4 b hf1 山カッコ (< >) で囲んだテキストキーボードのキー <Enter> <F1> を押す Courier New フォント : 標準の Courier New サンプルソースコード #define START ファイル名 autoexec.bat ファイルパス c:\mcc18\h キーワード _asm, _endasm, static コマンドラインオプション -Opa+, -Opa- ビット値 0, 1 定数 0xFF, A 斜体 変数の引数 file.o (file は有効な任意のファイル名 ) 角カッコ : [ ] オプションの引数 mcc18 [options] file [options] 中カッコとパイプ文字 : { } どちらかの引数を選択する errorlevel {0 1} 場合 (OR 選択 ) 省略記号... 繰り返されるテキスト var_name [, var_name...] ユーザが定義するコード void main (void) {... } DS41628B_JP - p Microchip Technology Inc.
9 まえがき 保証登録 推奨参考資料 同封の保証登録カードにご記入の上 お早めに郵送してください 折り返し製品のアップデート情報をお届けします ソフトウェアのマイナーリリースは弊社ウェブサイトで提供しております 本書では PICkit 3 スタータキットの使い方を説明しています その他の便利な文書を 以下に一覧でご紹介します 以下の Microchip 社文書を推奨します PICkit 3 スタータキットの Readme ファイル PICkit 3 スタータキットの使い方についての最新情報は MPLAB X IDE のインストール先ディレクトリの Readmes サブディレクトリにある Readme for PICkit 3 Starter Kit Board User s Guide.txt ファイル (ASCII テキストファイル ) を参照してください Readme ファイルには 本書に記載できなかった最新情報と既知の問題を記載しています PIC16(L)F1825/29 データシート (DS41440) このデータシートは PIC16F1829 の機能についてまとめています PIC18(L)F1XK22 データシート (DS41365) このデータシートは PIC18F14K22 の機能についてまとめています Readme ファイルその他のツールの使い方についての最新情報は MPLAB X IDE のインストール先ディレクトリの Readmes サブディレクトリにある各ツールの Readme ファイルを参照してください Readme ファイルには 本書に記載できなかった最新情報と既知の問題を記載しています 2015 Microchip Technology Inc. DS41628B_JP - p.9
10 Microchip 社のウェブサイト Microchip 社は自社が運営するウェブサイト ( を通してオンラインサポートを提供しています 当ウェブサイトでは お客様に役立つ情報とファイルを簡単に見つけ出せます お好みのインターネットブラウザを使って以下の内容をご覧になれます 製品サポート データシートとエラッタ アプリケーションノート サンプルコード 設計リソース ユーザガイドとハードウェアサポート文書 最新ソフトウェアリリース ソフトウェアアーカイブ 一般的技術サポート よく寄せられる質問 (FAQ) 技術サポートのご依頼 オンラインディスカッショングループ Microchip 社のコンサルタントプログラムおよびメンバーリスト ご注文とお問い合わせ 製品セレクタと注文ガイド 最新プレスリリース セミナー / イベントの一覧 お問い合わせ先 ( 営業所 / 販売代理店 ) の一覧 開発システムの顧客変更通知サービス Microchip 社の顧客変更通知サービスは お客様に Microchip 社製品の最新情報をお届けするサービスです ご興味のある製品ファミリまたは開発ツールに関する変更 更新 リビジョン エラッタ情報をいち早くメールにてお知らせします Microchip 社のウェブサイト にアクセスし [Customer Change Notification] からご登録ください 以下の開発システム製品カテゴリをお選び頂けます コンパイラ - Microchip 社の C コンパイラとその他の言語ツールの最新情報です これには HI-TECH C C16 MPLAB C18 MPLAB C30 C コンパイラ MPASM および MPLAB ASM30 アセンブラ MPLINK および MPLAB LINK30 オブジェクトリンカ MPLIB および MPLAB LIB30 オブジェクトライブラリアンが含まれます インサーキットデバッガ Microchip 社の MPLAB ICD 2 MPLAB ICD 3 PICkit 3 インサーキットデバッガの最新情報です MPLAB X IDE - Microchip 社の MPLAB IDE( 開発システムツール向け Windows 統合開発環境 ) の最新情報です これには MPLAB X IDE MPLAB SIM シミュレータ MPLAB IDE プロジェクトマネージャ 一般的な編集およびデバッグ機能が含まれます プログラマ - Microchip 社のプログラマの最新情報です これには MPLAB PM3 デバイスプログラマと PICkit 3 開発用プログラマが含まれます DS41628B_JP - p Microchip Technology Inc.
11 まえがき カスタマサポート 改訂履歴 Microchip 社製品をお使いのお客様は 以下のチャンネルからサポートをご利用頂けます 販売代理店 弊社営業所 技術サポートサポートは販売代理店までお問い合わせください もしくは弊社までご連絡ください 本書の末尾には各国営業所の一覧を記載しています 技術サポートは下記のウェブページからもご利用頂けます リビジョン A (2012 年 10 月 ) 本書は初版です リビジョン B (2012 年 11 月 ) セクション 表 3-15 を改訂しました 2015 Microchip Technology Inc. DS41628B_JP - p.11
12 NOTES: DS41628B_JP - p Microchip Technology Inc.
13 第 1 章概要 1.1 はじめに 本章ではキットに含まれるハードウェアを紹介し ソフトウェアのダウンロードとインストール方法についても簡単に説明します 1.2 ハイライト 本章の内容は以下の通りです - 新機能 - キットの内容 - PICkit 少ピン開発ボード - ソフトウェアの概要 - デモの実行 1.3 新機能 このキットは PICkit 2 スタータキットの後継製品です 従来の少ピン開発ボード (DM ) を改良し デバッグヘッダなしでコードの全機能をデバッグできるようにしています ソフトウェアも新しい技術に対応するため更新しました 以下に新機能の一覧を示します 1. アセンブリと C の両言語でソフトウェアを提供 2. レッスンおよびモジュールの数を拡充 3. 従来の MPLAB 8 に加えて MPLAB X をサポート 4. 新しいエンハンストミッドレンジ PIC16 および PIC18 のルーチンを提供 5. ユニバーサル XC8 コンパイラを使用 以下に PICkit 少ピン開発ボードの変更点を示します 1. ポテンショメータを RA4 に接続 ( 以前は RA0) 2. スイッチを RA2 に接続 ( 以前は RA3) この少ピン開発ボードは以前のものと互換です 以前のピンを新しいピンに接続すると 以前の機能に戻せます 1.4 キットの内容 1. PICkit 3 プログラマ (x1) 2. マイクロ USB ケーブル (x1) 3. PICkit 少ピン開発ボード ( 製品番号 :DM ) (x1) 4. PIC16F1829-I/P (x1) 5. PIC18F14K22-I/P (x1) 13 のレッスンはウェブからダウンロードできます PIC16F1829 は新しいエンハンストミッドレンジデバイスで 従来のミッドレンジ PIC16 MCU より多くの機能をサポートしています このキットに付属のソフトウェアは PIC16F1829 と PIC18F14K22 をサポートしています このソフトウェアはこれら 2 つのデバイスで動作するよう作成してありますが 他のデバイスにも容易に移植できます 2015 Microchip Technology Inc. DS41628B_JP - p.13
14 1.5 PICkit 少ピン開発ボード 18 ピン PIC MCU を使うにはボードに若干の変更が必要です 14 ピンおよび 20 ピン PIC MCU は全てのインターフェイスデバイスを利用できます 8 ピン PIC MCU を使う場合はピンと LED を接続し直す必要があります スイッチとポテンショメータは 8 ピンデバイスがサポートするピンに接続済みです このボードは LED の横に穴を設けてあり ハードウェアの変更が必要な場合は簡単にはんだ付けできます この基板は PICkit プログラマ等のインサーキットシリアルプログラマ (ICSP ) でプログラムできます この基板には 5 V を供給します 図 1-1 に PICkit 少ピン開発ボードを示します 図 1-1: PICkit 少ピン開発ボードのレイアウト ICSP Programming Header External Power 20-pin DIP Socket 14-pin Expansion Header Generous Prototyping Area Push Button Potentiometer LEDs 表 1-1 に このボードに付属する 2 つの PIC MCU に接続されている部品を示します 表 1-1: ピン割り当て デバイス LED <DS4:DS1> スイッチ SW1 ポテンショメータ RP1 PIC16F1829 <RC3:RC0> RA2 RA4 PIC18F14K22 <RC3:RC0> RA2 RA4 1.6 ソフトウェアの概要 本書は 読者に電子工学の基礎知識がある事を前提としています PIC MCU のプログラミング経験がなくてもかまいませんが プログラミングに関する基礎知識やビットとバイトの違いといった基礎知識は必要です DS41628B_JP - p Microchip Technology Inc.
15 概要 1.7 デモの実行 このソフトウェアはアセンブリと C で記述してあり MPLAB X 統合開発環境 (IDE) と MPLAB 8 IDE の両方のプロジェクトを含んでいます アセンブリで記述したコードは行数が多く複雑ですが PIC MCU のハードウェアと密接に関係しているため C と一緒にアセンブリも学習すると理解が深まります C 言語は高級言語であるため プログラムの流れを容易に理解できます 各レッスンにはアセンブリと C の両方のコードがあり どちらも機能は同じです ほとんどのレッスンは前のレッスンで学んだ内容を基にしているため レッスンは順番通りに進める事を推奨します 各レッスンでは それぞれ新しい周辺モジュールまたは概念を学びます 本書をお読みになる際は 必ずソースコードを参照してください エンハンストミッドレンジと PIC18 のコードを順に紹介し その相違点について説明します このボードのデバイスには 本書のレッスンが 1 つプログラム済みです このプログラムを実行するには 電源ヘッダ (P2) に 5 V を印加するか プログラマヘッダ (P1) にプログラマを接続して IDE を使ってプログラマから 5 V を供給します デモプログラムを実行すると 4 つの LED が 1 つずつ順番に点灯します ( ローテート ) プッシュボタン (SW1) を押すと ローテートの方向が反転します ポテンショメータ (RP1) を回すとローテートの速度が変わります このデモプログラムは 本書のレッスン 1 ~ 7 の内容に基づいて作成しています 2015 Microchip Technology Inc. DS41628B_JP - p.15
16 NOTES: DS41628B_JP - p Microchip Technology Inc.
17 第 2 章 PIC MCU のアーキテクチャ 2.1 はじめに 本章では エンハンストミッドレンジ PIC16F1829 (DS41440) と PIC18F14K22 (DS41365) のアーキテクチャを説明します 2.2 コアの基礎 エンハンストミッドレンジ PIC16 MCU と PIC18 MCU は改良型ハーバードアーキテクチャを採用しており プログラムメモリとデータメモリが独立しています このアーキテクチャではコード命令とデータに同時にアクセスできるため より高速な実行が可能です 現在の命令をデコードおよび実行中に 次の命令をフェッチします 図 2-1 と図 2-3 から分かるようにデータバスとプログラムバスが分離しています 本書では これらの図に記載されたレジスタとモジュールのほとんどを取り上げます 各ブロックの連携を理解するため 以下のブロック図を参照しながら各レッスンを進めてください 図 2-1: エンハンストミッドレンジ PIC MCU の概略ブロック図 15 Configuration 15 Data Bus Program Counter 8 MUX Flash Program Memory 16-Level 8 Stack (13-bit) (15-bit) RAM Program 14 Bus Instruction Reg reg Direct Addr 7 8 Program Memory Read (PMR) 5 BSR FSR Reg reg FSR1 reg Reg 12 RAM Addr Addr MUX Indirect Addr FSR0 reg Reg STATUS Reg reg Power-up Timer 3 MUX OSC1/CLKIN OSC2/CLKOUT Instruction Decode and & Control Timing Generation Oscillator Start-up Timer Power-on Reset Watchdog Timer Brown-out Reset 8 ALU W Reg Internal Oscillator Block VDD VSS 2015 Microchip Technology Inc. DS41628B_JP - p.17
18 図 2-2: エンハンストミッドレンジ PIC MCU の概略データブロック図 Program Flash Memory RAM EEPROM OSC2/CLKOUT Timing Generation PORTA OSC1/CLKIN INTRC Oscillator CPU PORTB MCLR 図 2-1 PORTC PORTD SR Latch ADC 10-Bit Timer0 Timer1 Timer2 Timer4 Timer6 Comparators PORTE LCD ECCP1 ECCP2 ECCP3 CCP4 CCP5 MSSP EUSART Note: 周辺モジュールの詳細は 各モジュールに対応する章を参照してください Note 1: See applicable chapters for more information on peripherals. DS41628B_JP - p Microchip Technology Inc.
19 PIC MCU のアーキテクチャ 図 2-3: PIC18 の概略ブロック図 Table Pointer<21> inc/dec logic Address Latch Program Memory Data Latch 8 Instruction Bus <16> Data Bus<8> 8 8 PCLATU PCLATH PCU PCH PCL Program Counter 31-Level Stack STKPTR Table Latch ROM Latch Data Latch PORTA RA0 Data Memory RA1 (512/768 bytes) RA1 Address Latch 12 Data Address<12> BSR FSR0 Access Bank FSR1 FSR2 12 inc/dec logic Address Decode PORTB RA3 RA4 RA5 RB4 RB5 RB6 RB7 IR OSC1 (2) OSC2 (2) MCLR (1) VDD, VSS Internal Oscillator Block LFINTOSC Oscillator 16 MHz Oscillator Instruction Decode and Control Single-Supply Programming State machine control signals Power-up Timer Oscillator Start-up Timer Power-on Reset Watchdog Timer Fail-Safe Clock Monitor 8 PRODH PRODL 8 x 8 Multiply 3 8 BITOP W ALU<8> 8 Precision FVR Band Gap Reference PORTC RC0 RC1 RC2 RC3 RC4 RC5 RC6 RC7 BOR Data EEPROM Timer0 Timer1 Timer2 Timer3 FVR CVREF Comparator ECCP1 MSSP EUSART ADC 10-bit FVR CVREF Note 1: RA3 を使うには MCLR 機能を無効にする必要があります 2: OSC1/CLKIN と OSC2/CLKOUT は 特定のオシレータモードにおいてこれらのピンをデジタル I/O として 使っていない場合のみ使えます 2015 Microchip Technology Inc. DS41628B_JP - p.19
20 2.3 データ / プログラムバス 2.4 アキュムレータ データバスはポートピンを介してデバイス外部および全ての周辺レジスタ ( 例 : タイマ ADC PWM) に接続しています プログラムバスは プログラムが格納されるフラッシュメモリに接続しています アセンブル済みのコードはここに書き込まれます アキュムレータはワーキングレジスタ (WREG) の 1 つだけです アキュムレータは算術演算等データバスに関連する全タスクを処理します ALU が扱うデータサイズは 8 ビットで 8 ビット MCU の名称はここに由来します 2.5 命令 命令は PIC MCU が実行すべき処理の内容 ( ビットシフト ジャンプ等 ) を指示します プログラムメモリに格納されるプログラムで中心的な役割を果たすのが命令です エンハンストミッドレンジ PIC MCU 全てで命令数は 49 個のみです PIC18 には 75 個の命令があります PIC MCU はごくわずかの命令を覚えるだけで良く RISC( 縮小命令セットコンピューティング ) プロセッサと呼ばれます 各命令の詳細は この後のレッスン時に説明します ここでは各命令の基本構成について説明します 1 命令サイクルは 4 クロックサイクルで構成されます つまり PIC MCU の動作周波数が 4 MHz の場合 1 命令の実行には 1 µs かかります ( 式 2-1 参照 ) 式 2-1: 命令実行時間 T clock cycle = FOSC 4 * T = = = 1 µ s FOSC 4 MHz 基本的に命令は全て 1 命令サイクルで実行されます 例外は条件テストが真の場合 またはプログラムカウンタ (PC) が変わる場合です これらの場合には NOP (No Operation) 命令サイクルが追加される 実行に 2 命令サイクルを要します 例 2-1 例 2-1: BTFSS PORTA, RA0 この命令はピン RA0 が High (= 1) の場合のみ 2 命令サイクルかかります これはスキップ動作によってプログラムカウンタの値が変化するためです PIC18 は エンハンストミッドレンジ PIC16 アーキテクチャに比べワードサイズが拡張されています PIC18 のワードサイズは 16 ビット幅で この中にオペコードと必要な全てのオペランドを含みます エンハンストミッドレンジ PIC16 のワードサイズは 14 ビット幅です オペコードは各命令に固有で プロセッサによって解釈されます オペコードのフォーマットには以下の 4 つがあります 1. バイト指向 2. ビット指向 3. リテラル 4. 制御 DS41628B_JP - p Microchip Technology Inc.
21 PIC MCU のアーキテクチャ 2.6 バイト指向 エンハンストミッドレンジ PIC16 のバイト指向命令は全て 6 ビットのオペコード 7 ビットのファイルアドレス 1 ビットの結果格納先ビットで構成されます PIC18 のバイト指向命令は全て 6 ビットのオペコード 8 ビットのファイルアドレス 1 ビットの結果格納先ビット 1 ビットの RAM アクセスビットで構成されます これら全てのビットフィールドのサイズを合計すると エンハンストミッドレンジ PIC16 コアの場合は命令ワードサイズの 14 ビット幅に一致します 同様に PIC18 の場合も全てのビットフィールドのサイズを合計すると 16 ビット幅のワードサイズに一致します バンクセレクトレジスタ (BSR) を使ってユーザがバンクを選択する場合 PIC18 の RAM アクセスビット (a) をセットします PIC16 の場合 ディレクティブの banksel を使って常に正しいバンクに切り換える必要があります これは 最初のいくつかのレッスンで説明します 結果格納先ビット (d) は 結果を WREG に格納するか元のファイルレジスタに書き戻すかを指定します d = 0 の場合は結果を WREG レジスタに格納します d = 1 の場合は結果をファイルレジスタに書き込みます ファイルレジスタ (f) は どのレジスタを使うかを指定します 特殊機能レジスタ (SFR) または汎用レジスタ (GPR) を指定できます 例 2-2: ADDWF data,f 2.7 ビット指向 この命令は WREG の内容と data を加算し 結果をファイルレジスタ data に書き戻します PIC18 では あるファイルレジスタのデータを WREG を使わずに別のファイルレジスタへ直接移動できます エンハンストミッドレンジ PIC16 アーキテクチャでは データ移動は必ず WREG 経由で行います ビット指向命令はファイルレジスタの特定の 1 ビットに対して演算を実行します これらの命令はファイルレジスタの特定の 1 ビットをセットまたはクリアします また ファイルレジスタの特定のビットを検査する事もできます エンハンストミッドレンジ PIC16 のビット指向命令は全て 4 ビットのオペコード 7 ビットのファイルアドレス 3 ビットのビットアドレスで構成されます PIC18 のビット指向命令は全て 4 ビットのオペコード 8 ビットのファイルアドレス 3 ビットのビットアドレス 1 ビットの RAM アクセスビットで構成されます 例 2-3: BSF PORTA,RA0 この命令は PORTA レジスタのピン RA0 をセットします 2.8 リテラル リテラル命令は 命令内にデータオペランドを含みます どちらのアーキテクチャも 8 ビットの即値を使います 残りのビットはオペコードに使います 例 2-4: MOVLW A この命令は A の ASCII 値 (0x41) を WREG に格納します 2015 Microchip Technology Inc. DS41628B_JP - p.21
22 2.9 制御 プログラムカウンタに格納するプログラムメモリのアドレスを指定する命令を制御命令と呼びます これには call goto branch が含まれます これらの命令はそれぞれワード長が異なります 詳細は 各 PIC MCU のデータシートで 命令セットのまとめ の章を参照してください DS41628B_JP - p Microchip Technology Inc.
23 PIC MCU のアーキテクチャ 図 2-4: エンハンストミッドレンジ PIC16 命令の一般的な形式 Byte-oriented file register operations OPCODE d f (FILE #) d = 0 for destination W d = 1 for destination f f = 7-bit file register address Example Instruction ADDWF MYREG, W Bit-oriented file register operations OPCODE b (BIT #) f (FILE #) b = 3-bit bit address f = 7-bit file register address Literal and control operations General OPCODE k (literal) BSF MYREG, BIT k = 8-bit immediate value CALL and GOTO instructions only OPCODE k (literal) k = 11-bit immediate value MOVLW 0x45 MOVLP instruction only OPCODE k (literal) k = 7-bit immediate value CALL LABEL MOVLB instruction only OPCODE k (literal) MOVLP 15 k = 5-bit immediate value BRA instruction only OPCODE k (literal) MOVLB 3 k = 9-bit immediate value FSR Offset instructions OPCODE n k (literal) n = appropriate FSR k = 6-bit immediate value BRA LABEL FSR Increment instructions OPCODE n m (mode) n = appropriate FSR m = 2-bit mode value ADDFSR FSR1, 3 OPCODE only 13 0 OPCODE MOVIW ++FSR Microchip Technology Inc. DS41628B_JP - p.23
24 図 2-5: PIC18 の命令の一般的な形式 Byte-oriented file register operations OPCODE d a f (FILE #) d = 0 for result destination to be WREG register d = 1 for result destination to be file register (f) a = 0 to force Access Bank a = 1 for BSR to select bank f = 8-bit file register address Byte to Byte move operations (2-word) OPCODE f (Source FILE #) f (Destination FILE #) Example Instruction ADDWF MYREG, W, B MOVFF MYREG1, MYREG2 f = 12-bit file register address Bit-oriented file register operations OPCODE b (BIT #) a f (FILE #) BSF MYREG, bit, B b = 3-bit position of bit in file register (f) a = 0 to force Access Bank a = 1 for BSR to select bank f = 8-bit file register address Literal operations OPCODE k (literal) MOVLW 7Fh k = 8-bit immediate value Control operations CALL, GOTO and Branch operations OPCODE n<7:0> (literal) n<19:8> (literal) GOTO Label n = 20-bit immediate value OPCODE S n<7:0> (literal) n<19:8> (literal) S = Fast bit CALL MYFUNC OPCODE n<10:0> (literal) BRA MYFUNC OPCODE n<7:0> (literal) BC MYFUNC 図 2-1 と図 2-3 のブロック図にはいくつかの小さな違いがあります 本書では いくつかの重要な相違点について説明します DS41628B_JP - p Microchip Technology Inc.
25 PIC MCU のアーキテクチャ 2.10 スタックレベル 2.11 メモリ構成 2.12 プログラムメモリ スタックレベルはエンハンストミッドレンジコアが 16 段 PIC18 が 31 段です スタックの段数が多いほど ソフトウェアでサブルーチンを呼び出して元のアドレスに戻る前に別のサブルーチンを呼び出す階層を多くできます call または goto 命令を実行するとプログラムカウンタはコードの別の場所を指し示すように書き換えられます これらの命令がなければ コードは最初から最後まで順番通りに実行されるだけです その意義については 後述します プログラムメモリの別の位置へジャンプする前に コールスタックに戻りアドレスを保存しておきます 参考までに挙げると ベースライン MCU (PIC10/12) にはコールスタックの深さが 2 段しかないものもあります スタックレベルが浅いと モジュール方式のコードを作成するのは非常に困難です エンハンストミッドレンジ PIC16 および PIC18 MCU のメモリは 以下の 3 つで構成されます 1. プログラムメモリ 2. データ RAM 3. データ EEPROM プログラムメモリは以下の 5 つで構成されます 1. フラッシュプログラムメモリ 2. コンフィグレーションワード 3. デバイス ID 4. リビジョン ID 5. ユーザ ID フラッシュプログラムメモリ エンハンストミッドレンジおよび PIC18 MCU は全てプログラムメモリにフラッシュを使っています フラッシュの採用により PIC MCU は数十万回の消去と書き込みを可能にしています PIC18 のプログラムバスは 21 ビット幅で エンハンストミッドレンジコアは 15 ビット幅です プログラムバスの幅が広いほど大きなアドレスを指定できるため プログラムメモリの容量を大きくできます 図 2-6 に示すように エンハンストミッドレンジコアのプログラムカウンタは 32K x 14 のプログラムメモリ空間をアドレス指定できます 2015 Microchip Technology Inc. DS41628B_JP - p.25
26 図 2-6: エンハンストミッドレンジのプログラムメモリマップとコールスタック PC<14:0> CALL, CALLW 15 RETURN, RETLW Interrupt, RETFIE Stack Level 0 Stack Level 1 Stack Level 15 Reset Vector 0000h On-chip Program Memory Interrupt Vector Page 0 Page 1 Page 2 Page 3 Rollover to Page h 0005h 07FFh 0800h 0FFFh 1000h 17FFh 1800h 1FFFh 2000h Rollover to Page 3 7FFFh 図 2-7 に示す通り PIC18 MCU は 2 MB のプログラムメモリ空間をアドレス指定できます また 割り込みベクタの数がエンハンストミッドレンジは 1 つですが PIC18 MCU は 2 です 大きな違いとして エンハンストミッドレンジコアのプログラムメモリは複数ページありますが PIC18 にはページの概念はありません エンハンストミッドレンジコアでは 現在のページから別のページへ実行が移る場合はページ切り換えが必要です この後のレッスンで紹介するエンハンストミッドレンジ PIC16 のコードはどれも 1 ページを超えないため ページの切り換えは不要です コードが別のページにオーバーフローする場合 pagesel が必要である事を示す警告がアセンブラから出力されます DS41628B_JP - p Microchip Technology Inc.
27 PIC MCU のアーキテクチャ 図 2-7: PIC18 のプログラムメモリマップとコールスタック CALL,RCALL,RETURN RETFIE,RETLW PC<20:0> Stack Level 1 Stack Level On-Chip Program Memory 1FFFh 2000h PIC18(L)F13K22 Reset Vector High Priority Interrupt Vector Low Priority Interrupt Vector On-Chip Program Memory 3FFFh 4000h PIC18(L)F14K h 0008h 0018h User Memory Space Read 0 Read 0 1FFFFFh h コンフィグレーションワード これらの PIC MCU には複数のコンフィグレーションワード ( メモリ ) があり これによって動作時の設定を書き換えられるようにしています オシレータの選択 メモリ保護 低電圧検出等を設定できます 設定項目の内容はデバイスによって異なります エンハンストミッドレンジのコンフィグレーションビットは コード実行中は読み出し専用です PIC18 はコード実行中に全てのコンフィグレーションビットが読み出し可能で ほとんどのコンフィグレーションビットに書き込みできます コンフィグレーションビットは特別な方法で書き込みます これについては レッスンのソースファイルで見ていきます デバイス ID デバイス ID は読み出し専用で PIC MCU のデバイス固有 ID を格納しています PIC16F1829 の ID は DEVICEID に格納され PIC18F14K22 の ID は DEVID1 と DEVID2 に格納されます リビジョン ID 各 PIC MCU にはシリコンリビジョンを示す 5 ビットの ID があります これらのビットは読み出し専用で DEVID レジスタに格納されています 通常 1 つの PIC MCU に対して複数のシリコンリビジョンがあります 各リビジョンのエラーとその回避策はエラッタで説明しています データシートと併せて参照してください 2015 Microchip Technology Inc. DS41628B_JP - p.27
28 2.13 データメモリ 2.14 バンク ユーザ ID これら 4 つのメモリアドレスは ユーザがチェックサムまたはその他のコード識別番号を格納できる ID 位置として指定されています これらは通常実行中に読み書き可能です これら 2 つのデバイスファミリはデータメモリのレイアウトが大きく異なっています どちらのファミリもデータメモリは以下の 4 つで構成されます 1. コアレジスタ 2. 特殊機能レジスタ 3. 汎用 RAM 4. 共通 RAM コアレジスタ コアレジスタには PIC MCU の基本動作に直接影響するレジスタが含まれ データメモリの全てのバンクに同じレジスタが割り当てられています 12 個のコアレジスタのうち 以下に 3 つの例を示します 1. STATUS 2. WREG 3. INTCON STATUS レジスタは ALU による算術演算の状態を格納します WREG レジスタはレジスタとの間でデータの受け渡しに使います INTCON レジスタは PIC MCU を割り込みベクタへジャンプさせる各種割り込みのイネーブルビットとフラグビットを格納しています 特殊機能レジスタ 特殊機能レジスタはデバイス内蔵の周辺モジュールにアクセスする際に使います エンハンストミッドレンジコアでは 特殊機能レジスタは各データメモリバンクのコアレジスタ直後の 20 バイト ( アドレス x0ch/x8ch ~ x1fh/x9fh) を占めます PIC18 コアの特殊機能レジスタは全てアクセス RAM にあります ( セクション 2.14 バンク 参照 ) 汎用 RAM 汎用 RAM は ユーザアプリケーションでのデータ格納および一時的なデータと状態を保存するために使います この領域はプログラムで RAM として使えますが アクセス前にバンクを正しく選択しておく必要があります エンハンストミッドレンジコアでは 各データメモリバンクの SFR 直後に最大 80 バイトの汎用 RAM があります 共通 RAM エンハンストミッドレンジコアには全てのバンクからアクセス可能な 16 バイトの共通 RAM があります PIC18 アーキテクチャにはアクセス RAM と呼ばれる同様の RAM が最大 96 バイトあります PIC18F14K22 のデータメモリは 16 個のバンク (1 バンク 256 バイト ) に分割されます PIC16F1829 のデータメモリは 32 個のメモリバンク (1 バンク 128 バイト ) に分割されます エンハンストミッドレンジ PIC16 では バンクは以下の内容で構成されます 個のコアレジスタ DS41628B_JP - p Microchip Technology Inc.
29 PIC MCU のアーキテクチャ 個の特殊機能レジスタ (SFR) 3. 最大 80 バイトの汎用 RAM (GPR) バイトの共通 RAM ( 全バンクからアクセス可能 ) 図 2-8 に エンハンストミッドレンジ PIC16 のバンク構成を示します 図 2-8: エンハンストミッドレンジのメモリバンク構成 7-bit Bank Offset Memory Region 00h 0Bh 0Ch 1Fh 20h Core Registers (12 bytes) Special Function Registers (20 bytes maximum) General Purpose RAM (80 bytes maximum) 6Fh 70h 7Fh Common RAM (16 bytes) アドレス 70h ~ 7Fh は全てのバンクで共有します この 16 バイトの RAM 領域に格納したデータは バンク切り換えなしでアクセスできるため便利です 図 2-9 に PIC16F1829 の最初の 8 バンクを示します 16 バイトの共通 RAM 同様 先頭の 12 個のコアレジスタも全バンクからアクセスできます 2015 Microchip Technology Inc. DS41628B_JP - p.29
30 DS41628B_JP - p Microchip Technology Inc. 図 2-9: PIC16F1829 のメモリマップ ( レジスタ読み書きの前にバンク選択が必要 ) BANK 0 BANK 1 BANK 2 BANK 3 BANK 4 BANK 5 BANK 6 BANK 7 000h INDF0 080h INDF0 100h INDF0 180h INDF0 200h INDF0 280h INDF0 300h INDF0 380h INDF0 001h INDF1 081h INDF1 101h INDF1 181h INDF1 201h INDF1 281h INDF1 301h INDF1 381h INDF1 002h PCL 082h PCL 102h PCL 182h PCL 202h PCL 282h PCL 302h PCL 382h PCL 003h STATUS 083h STATUS 103h STATUS 183h STATUS 203h STATUS 283h STATUS 303h STATUS 383h STATUS 004h FSR0L 084h FSR0L 104h FSR0L 184h FSR0L 204h FSR0L 284h FSR0L 304h FSR0L 384h FSR0L 005h FSR0H 085h FSR0H 105h FSR0H 185h FSR0H 205h FSR0H 285h FSR0H 305h FSR0H 385h FSR0H 006h FSR1L 086h FSR1L 106h FSR1L 186h FSR1L 206h FSR1L 286h FSR1L 306h FSR1L 386h FSR1L 007h FSR1H 087h FSR1H 107h FSR1H 187h FSR1H 207h FSR1H 287h FSR1H 307h FSR1H 387h FSR1H 008h BSR 088h BSR 108h BSR 188h BSR 208h BSR 288h BSR 308h BSR 388h BSR 009h WREG 089h WREG 109h WREG 189h WREG 209h WREG 289h WREG 309h WREG 389h WREG 00Ah PCLATH 08Ah PCLATH 10Ah PCLATH 18Ah PCLATH 20Ah PCLATH 28Ah PCLATH 30Ah PCLATH 38Ah PCLATH 00Bh INTCON 08Bh INTCON 10Bh INTCON 18Bh INTCON 20Bh INTCON 28Bh INTCON 30Bh INTCON 38Bh INTCON 00Ch PORTA 08Ch TRISA 10Ch LATA 18Ch ANSELA 20Ch WPUA 28Ch 30Ch 38Ch INLVLA 00Dh PORTB (1) 08Dh TRISB (1) 10Dh LATB (1) 18Dh ANSELB (1) 20Dh WPUB (1) 28Dh 30Dh 38Dh INLVLB (1) 00Eh PORTC 08Eh TRISC 10Eh LATC 18Eh ANSELC 20Eh WPUC 28Eh 30Eh 38Eh INLVLC 00Fh 08Fh 10Fh 18Fh 20Fh 28Fh 30Fh 38Fh 010h 090h 110h 190h 210h 290h 310h 390h 011h PIR1 091h PIE1 111h CM1CON0 191h EEADRL 211h SSP1BUF 291h CCPR1L 311h CCPR3L 391h IOCAP 012h PIR2 092h PIE2 112h CM1CON1 192h EEADRH 212h SSP1ADD 292h CCPR1H 312h CCPR3H 392h IOCAN 013h 093h 113h CM2CON0 193h EEDATL 213h SSP1MSK 293h CCP1CON 313h CCP3CON 393h IOCAF 014h 094h 114h CM2CON1 194h EEDATH 214h SSP1STAT 294h PWM1CON 314h 394h IOCBP (1) 015h TMR0 095h OPTION_REG 115h CMOUT 195h EECON1 215h SSP1CON 295h CCP1AS 315h 395h IOCBN (1) 016h TMR1L 096h PCON 116h BORCON 196h EECON2 216h SSP1CON2 296h PSTR1CON 316h 396h IOCBF (1) 017h TMR1H 097h WDTCON 117h FVRCON 197h 217h SSP1CON3 297h 317h 397h 018h T1CON 098h OSCTUNE 118h DACCON0 198h 218h 298h CCPR2L 318h CCPR4L 398h 019h T1GCON 099h OSCCON 119h DACCON1 199h RCREG 219h SSP2BUF (1) 299h CCPR2H 319h CCPR4H 399h 01Ah TMR2 09Ah OSCSTAT 11Ah SRCON0 19Ah TXREG 21Ah SSP2ADD (1) 29Ah CCP2CON 31Ah CCP4CON 39Ah CLKRCON 01Bh PR2 09Bh ADRESL 11Bh SRCON1 19Bh SPBRGL 21Bh SSP2MSK (1) 29Bh PWM2CON 31Bh 39Bh 01Ch T2CON 09Ch ADRESH 11Ch 19Ch SPBRGH 21Ch SSP2STAT (1) 29Ch CCP2AS 31Ch 39Ch MDCON 01Dh 09Dh ADCON0 11Dh APFCON0 19Dh RCSTA 21Dh SSP2CON (1) 29Dh PSTR2CON 31Dh 39Dh MDSRC 01Eh CPSCON0 09Eh ADCON1 11Eh APFCON1 19Eh TXSTA 21Eh SSP2CON2 (1) 29Eh CCPTMRS 31Eh 39Eh MDCARL 01Fh CPSCON1 09Fh 11Fh 19Fh BAUDCON 21Fh SSP2CON3 (1) 29Fh 31Fh 39Fh MDCARH 020h 0A0h 120h 1A0h 220h 2A0h 320h 3A0h 汎用 汎用 汎用 汎用 汎用 汎用 レジスタ レジスタ レジスタ レジスタ レジスタ レジスタ 汎用レジスタ 80 バイト 80 バイト 80 バイト 80 バイト 80 バイト 80 バイト 06Fh 96 バイト 0EFh 16Fh 1EFh 26Fh 2EFh 36Fh 3EFh 070h 0F0h 170h 1F0h 270h 2F0h 370h 3F0h アクセス アクセス アクセス アクセス アクセス アクセス 70h ~ 7Fh 70h ~ 7Fh 70h ~ 7Fh 70h ~ 7Fh 70h ~ 7Fh 70h ~ 7Fh 07Fh 0FFh 17Fh 1FFh 27Fh 2FFh 37Fh 3FFh 凡例 : 未実装のデータメモリ領域 0 として読み出し Note 1: PIC16(L)F1829 でのみ使えます 汎用レジスタ 80 バイト アクセス 70h ~ 7Fh PICkit 3 スタータキットユーザガイド
31 PIC MCU のアーキテクチャ アセンブリで PIC16F1829 を使う際は図 2-9 を常に参照し SFR への書き込み前に正しいバンクを選択している事を確認します PIC18 MCU ではバンク選択が効率化されており SFR へのアクセスにはバンク切り換えが不要です これは データメモリの一部をマッピングしたアクセスバンクが用意されており この領域にはユーザがバンクセレクトレジスタを指定しなくてもアクセスできるためです アクセスバンクは バンク 0 のメモリの先頭 96 バイトとバンク 15 の末尾 160 バイトで構成されます 下位のブロックは アクセス RAM と呼ばれ GPR で構成されます 上位のブロックにはデバイスの SFR ( バンク 15) がマッピングされます この後のレッスンで見ていくように PIC18 のアセンブリコードにはバンク切り換えがありません 図 2-10 と図 2-11 に この改良されたマッピング方式を示します 2015 Microchip Technology Inc. DS41628B_JP - p.31
32 図 2-10: PIC18F14K22 のデータメモリマップ BSR<3:0> = 0000 = 0001 = 0010 = 0011 = 0100 Bank 0 Bank 1 Bank 2 Bank 3 Bank 4 00h FFh 00h FFh 00h FFh 00h FFh 00h Data Memory Map Access RAM GPR 000h 05Fh 060h 0FFh 100h 1FFh 200h 2FFh 300h 3FFh 400h a = 0 の場合 : BSR を無視してアクセスバンクを使います 先頭の 96 バイトはバンク 0 の汎用 RAM です 残りの 160 バイトはバンク 15 の特殊機能レジスタ (SFR) です a = 1 の場合 : BSR で指定したバンクを命令で使います = 0101 Bank 5 FFh 00h 4FFh 500h = 0110 = 0111 = 1000 Bank 6 Bank 7 Bank 8 FFh 00h FFh 00h FFh 00h UNUSED Read 00h 5FFh 600h 6FFh 700h 7FFh 800h Access Bank Access RAM Low Access RAM High (SFRs) 00h 5Fh 60h FFh = 1001 Bank 9 FFh 00h 8FFh 900h = 1010 Bank 10 FFh 00h 9FFh A00h = 1011 Bank 11 FFh 00h AFFh B00h = 1100 Bank 12 FFh 00h BFFh C00h = 1101 Bank 13 FFh 00h CFFh D00h = 1110 = 1111 Bank 14 Bank 15 FFh 00h FFh 00h FFh Unused SFR (1) SFR DFFh E00h EFFh F00h F53h F5Fh F60h FFFh Note 1: F53h ~ F5Fh のアドレスにある SFR はアクセスバンクには含まれません DS41628B_JP - p Microchip Technology Inc.
33 PIC MCU のアーキテクチャ 図 2-11: PIC18F14K22 のバンク 15 に含まれる特殊機能レジスタ (F60h ~ FFFh はアクセス RAM に含まれる ) Address Name Address Name Address Name Address Name Address Name FFFh TOSU FD7h TMR0H FAFh SPBRG F87h (2) F5Fh (2) FFEh TOSH FD6h TMR0L FAEh RCREG F86h (2) F5Eh (2) FFDh TOSL FD5h T0CON FADh TXREG F85h (2) F5Dh (2) FFCh STKPTR FD4h (2) FACh TXSTA F84h (2) F5Ch (2) FFBh PCLATU FD3h OSCCON FABh RCSTA F83h (2) F5Bh (2) FFAh PCLATH FD2h OSCCON2 FAAh (2) F82h PORTC F5Ah (2) FF9h PCL FD1h WDTCON FA9h EEADR F81h PORTB F59h (2) FF8h TBLPTRU FD0h RCON FA8h EEDATA F80h PORTA F58h (2) FF7h TBLPTRH FCFh TMR1H FA7h EECON2 (1) F7Fh ANSELH F57h (2) FF6h TBLPTRL FCEh TMR1L FA6h EECON1 F7Eh ANSEL F56h (2) FF5h TABLAT FCDh T1CON FA5h (2) F7Dh (2) F55h (2) FF4h PRODH FCCh TMR2 FA4h (2) F7Ch (2) F54h (2) FF3h PRODL FCBh PR2 FA3h (2) F7Bh (2) F53h (2) FF2h INTCON FCAh T2CON FA2h IPR2 F7Ah IOCB FF1h INTCON2 FC9h SSPBUF FA1h PIR2 F79h IOCA FF0h INTCON3 FC8h SSPADD FA0h PIE2 F78h WPUB FEFh INDF0 (1) FC7h SSPSTAT F9Fh IPR1 F77h WPUA FEEh POSTINC0 (1) FC6h SSPCON1 F9Eh PIR1 F76h SLRCON FEDh POSTDEC0 (1) FC5h SSPCON2 F9Dh PIE1 F75h (2) FECh PREINC0 (1) FC4h ADRESH F9Ch (2) F74h (2) FEBh PLUSW0 (1) FC3h ADRESL F9Bh OSCTUNE F73h (2) FEAh FSR0H FC2h ADCON0 F9Ah (2) F72h (2) FE9h FSR0L FC1h ADCON1 F99h (2) F71h (2) FE8h WREG FC0h ADCON2 F98h (2) F70h (2) FE7h INDF1 (1) FBFh CCPR1H F97h (2) F6Fh SSPMASK FE6h POSTINC1 (1) FBEh CCPR1L F96h (2) F6Eh (2) FE5h POSTDEC1 (1) FBDh CCP1CON F95h (2) F6Dh CM1CON0 FE4h PREINC1 (1) FBCh VREFCON2 F94h TRISC F6Ch CM2CON1 FE3h PLUSW1 (1) FBBh VREFCON1 F93h TRISB F6Bh CM2CON0 FE2h FSR1H FBAh VREFCON0 F92h TRISA F6Ah (2) FE1h FSR1L FB9h PSTRCON F91h (2) F69h SRCON1 FE0h BSR FB8h BAUDCON F90h (2) F68h SRCON0 FDFh INDF2 (1) FB7h PWM1CON F8Fh (2) F67h (2) FDEh POSTINC2 (1) FB6h ECCP1AS F8Eh (2) F66h (2) FDDh POSTDEC2 (1) FB5h (2) F8Dh (2) F65h (2) FDCh PREINC2 (1) FB4h (2) F8Ch (2) F64h (2) FDBh PLUSW2 (1) FB3h TMR3H F8Bh LATC F63h (2) FDAh FSR2H FB2h TMR3L F8Ah LATB F62h (2) FD9h FSR2L FB1h T3CON F89h LATA F61h (2) FD8h STATUS FB0h SPBRGH F88h (2) F60h (2) 凡例 : = 未実装のデータメモリ領域 0 として読み出し Note 1: これは物理レジスタではありません 2: 未実装レジスタは 0 として読み出されます 図 2-11 に示したバンク 15 の SFR のうち F60h ~ FFFh のレジスタは全てアクセスバンクに含まれるためバンク切り換えは必要ありません エンハンストミッドレンジコアではバンク切り換えに 2 命令が必要なため PIC18 ではプログラム全体で命令数を大幅に削減できる可能性があります 2015 Microchip Technology Inc. DS41628B_JP - p.33
34 2.15 データ EEPROM メモリ 2.16 プログラミングの基礎 データ EEPROM はデータ RAM とプログラムメモリの両方から独立した不揮発性メモリアレイで プログラムデータの長期格納に使います EEPROM はレジスタファイルにもプログラムメモリ空間にも直接マッピングされておらず 特殊機能レジスタを介して間接的にアドレス指定します EEPROM は通常動作中に読み書き可能です PIC16F1829 と PIC18F14K22 はどちらも 256 バイトの EEPROM を内蔵しています この EEPROM には高い消去 / 書き込み耐性があります バイト書き込みを実行すると 書き込み位置を自動的に消去してから新しいデータが書き込まれます 詳細はセクション 3.14 レッスン 13:EEPROM を参照してください このセクションでは アセンブリと C の基礎について簡単に説明します C プログラミングについては さらに詳しいチュートリアルをウェブで見つける事ができます 本書では PIC16F1829 と PIC18F14K22 の両方に XC8 コンパイラ v.1.00 を使います これ以降のバージョンであれば問題なく動作します まず XC8 コンパイラのユーザガイドからお読みになる事を推奨します C 言語は移植性が非常に高く ほとんどのコンパイラで問題なくビルドできるのが大きな利点の 1 つです アセンブリはコンパイルされるのではなく MPASM と呼ばれるユーティリティでアセンブルされます 本書では 全ての PIC1X MCU に対応したユニバーサルアセンブラの MPASM アセンブラ v5.43 を使います C 等の高級言語は 扱うマイクロプロセッサのアーキテクチャを理解していなくてもプログラミングできるのが大きな利点の 1 つです アーキテクチャに関する知識はコンパイラが持っているため コンパイラに任せておけば C コードをアセンブリにコンパイルしてくれます アセンブリを使う場合 PIC MCU の命令セットを使う必要があり さらにメモリマップを理解する必要があります アセンブリを使うと PIC MCU のアーキテクチャに関する知識が身につくだけでなく コードサイズも大幅に縮小できるという利点があります MPASM アセンブラの動作 本書のレッスンは全て絶対コードで記述しています つまり アセンブラが必要とするものは全てソースファイルに含まれています このプロセスを以下に示します 図 2-12: MPASM アセンブラの動作 code.asm MPASM code.hex Programmer assembler MCU この方法でソースファイルをアセンブルする場合 ソースファイルで使っている全ての変数とルーチンをそのソースファイル内か そのソースファイルに明示的にインクルードされているファイル内で定義する必要があります アセンブルがエラーなく完了すると ターゲットの PIC MCU で実行可能なマシンコードを含む HEX ファイルが生成されます このファイルをデバッガで使ってコード実行をテストする事も デバイスプログラマで使ってマイクロコントローラをプログラミングする事もできます XC8 の動作 コンパイラは 高級言語で記述したコードを PIC MCU が理解できるレベルに変換するのに必要な処理を全て実行します 図 2-13 に この処理の流れを示します DS41628B_JP - p Microchip Technology Inc.
35 PIC MCU のアーキテクチャ 図 2-13: XC8 の動作 コンパイラとアセンブラから出力されるのはどちらも HEX ファイルです コンパイラが生成するアセンブリは MPLAB IDE の逆アセンブリウィンドウで表示できます 図 2-14: 逆アセンブリウィンドウに表示したコード 図 2-14 は レッスン 5 の逆アセンブリの一部を表示したものです C は直感的に理解および記述できるよう設計された言語です C の各コード行の下には 2 行のコードが表示されています これは C と同じ結果が得られるように PIC MCU 固有の命令を使って記述したものです 2015 Microchip Technology Inc. DS41628B_JP - p.35
36 アセンブラでの数値表現 特に明記しない限り アセンブラはプログラム内の数値定数を 16 進数 ( 基数 16) と見なします 2 進数 ( 基数 2) 8 進数 ( 基数 8) 10 進数 ( 基数 10) ASCII 符号もサポートされます 表 2-1: XC8 コンパイラでの数値表現 特に明記しない限り コンパイラはプログラム内の数値定数を 10 進数 ( 基数 10) と見なします 2.17 MPASM アセンブラのディレクティブ ディレクティブはソースコードに記述されるアセンブラのコマンドですが 通常はオペコードには直接変換されません これらは入力 出力 データ割り当て等 アセンブラの制御に使います アセンブラのディレクティブの多くには 複数の名前とフォーマットがあります これらは Microchip 社の従来のアセンブラとの下位互換性 および各種プログラミング手法との互換性を維持するために存在します MPASM アセンブラのディレクティブの詳細は MPLAB X IDE のメニューバーで [Help]>[Help Contents] と選択してヘルプを参照してください Banksel banksel label このディレクティブは label を含むバンクに切り換えるためのバンク選択コードを生成するようアセンブラとリンカに指示します 人為的ミスを防ぐため BSR を直接設定するのではなく必ずこのディレクティブを使います cblock 例 2-5: cblock [address] Variable endc アセンブラでの数値表現 基数フォーマット例 16 進数 # 0x# H # 12 0x12 H 12 10,8 進数.# D # Octal O #.12 D 12 Octal O 12 2 進数 B # B ASCII A # # A c c 表 2-2: コンパイラでの数値表現 基数フォーマット例 16 進数 0x# 0x12 10 進数 # 12 2 進数 0b# 0b ASCII # c address で指定したアドレスを先頭に連続する複数の変数を定義します DS41628B_JP - p Microchip Technology Inc.
37 PIC MCU のアーキテクチャ Org (addr) Org は addr で指定したアドレスからコード生成を開始するようアセンブラに指示します 基本的に 本書で紹介するレッスンのコードはアドレス 0x0000 から開始します End End は アセンブラに対してアセンブルを中止するように命令します プログラムの最後に 1 つ必要です 必ずしもファイルの最後に置く必要はありませんが End 文の後の行はアセンブルされません Errorlevel アセンブラからの警告を抑止します メッセージを出力ウィンドウに表示しないようにするのは そのメッセージの意味を十分に理解している場合のみとします 例 2-6: MESSAGE 302 Operand Not in Bank 0, check to ensure bank bits are correct #include 例 2-7: include include_file #include <include_file> 指定したファイルをソースコードとして読み込みます これは インクルードファイルの内容全体を include 文の場所に挿入したのと同じ効果があります 山カッコ (< >) で囲んだ場合 そのファイルがアセンブラのライブラリフォルダにある事を示します 二重引用符 ( ) で囲んだ場合 インクルードファイルが現在の作業ディレクトリにある事を示します これらディレクトリの場所は IDE で変更できます 2015 Microchip Technology Inc. DS41628B_JP - p.37
38 NOTES: DS41628B_JP - p Microchip Technology Inc.
39 第 3 章レッスン 以下の 13 レッスンでは 特に重要なコード行を示しながらそのレッスンで初めて学ぶ PIC MCU のレジスタと命令について説明します 各レッスンでは それぞれ新しい周辺モジュールまたは機能を紹介していきます PIC16 と PIC18 ではコードが若干異なる事があります 各レッスンでは これらの違いを取り上げて説明します 最初にエンハンストミッドレンジの PIC16 について説明し その後で PIC18 について説明します 両デバイスでほとんど違いがない事もあります 違いが全くない場合 PIC18 のセクションに なし と記載しています 一度説明した違いについては以降改めて説明しません このため 順番通りにレッスンを進める必要があります コードが異なるのは主にアセンブリで C のプログラムはほとんど違いがありません 各レッスンでは C コードだけでなくアセンブリコードも学習する事を強く推奨します レッスンのフォルダ構造は以下の通りです 1. < アーキテクチャ > 以下に例を示します a. < 言語 > i. < レッスン > 1. < レッスン >.X (MPLABX プロジェクト ) 2. Mplab8 (MPLAB 8.x プロジェクト ) 3. < レッスン >.< 拡張子 > ( ソースファイル ) 2.PIC16 a. Assy b. C i. 01 Hello World 1. Hello_world.X (MPLABX プロジェクト ) 2. Mplab8 (MPLAB 8.x プロジェクト ) 3. Hello_world.asm i. 01 Hello World 1. Hello_world.X (MPLABX プロジェクト ) 2. Mplab8 (MPLAB 8.x プロジェクト ) 3. Hello_world.c どちらのプロジェクトもソースファイルは共通です このため MPLAB X を使ってソースファイルに変更を加えると MPLAB 8プロジェクトにも変更が反映されます MPLAB X IDE を使う事を推奨します 変更を加えるのはソースファイルのみとし プロジェクトフォルダのファイルは変更しません MPLAB X IDE のスタートページからリンクしてある入門ビデオを参照してください MPLAB 8.XX の場合 MPLAB IDE Quick Start Guide (DS51281) ( を入門ガイドとして参照してください 2015 Microchip Technology Inc. DS41628B_JP - p.39
40 DS41628B_JP - p Microchip Technology Inc. 3.1 レッスン # レッスン新しく学ぶモジュール新しく学ぶ概念新しく学ぶレジスタ新しく学ぶ命令 1 Hello World ALU ラッチポート PIC MCU プログラミングの基礎 2 LED 点滅 1. GPR 2. SFR 3. アクセス RAM 4. オシレータ 1. 遅延 2. I/O 3. バンク切り換え TRISC PORTC LATC BSF BCF CLRF OSCCON MOVLW DECFSZ GOTO MOVWF BRA BTG 3 ローテートビット検査 STATUS BTFSC LSRF RRCF 4 A/D 変換 ADC ビットシフト ANSEL ADCON0/1/2 SWAPF 5 可変速ローテート ハードウェアスタック 関数 CALL RETURN XORWF TSTFSZ RCALL 6 デバウンスプリプロセッサマクロ 7 方向切り換え付き可変速ローテート コードのモジュール化 パルス幅変調 (PWM) ECCP 1. PWM 分解能 CCPxCON PRx TxCON ANDLW 8 2. PWM 周波数 CCPTMRS CCPRxL 3. 変調 9 Timer0 Timer0 タイマ OPTION_REG T0CON 割り込みとプルアップ 1. 割り込みベクタ ( 優先度高 / 低 ) 1. 割り込みの有用性 IOCAN IOCA RETFIE 弱プルアップ IOCAF RCON WPUA 間接仮想レジスタ 1. ポインタ INDFx FSRx INCF 11 アドレス指定ルックアップテーブルプログラムメモリ読み出し 1. メモリの節約 EEADRx EEDATx EECON1 MOVIW RETLW BRW 2. 自己読み出し ステートマシン PCL PCLATH TBLRD* TBLPTR TABLAT 13 EEPROM 不揮発性メモリ低消費電力 EECON2 SLEEP RLNCF PICkit 3 スタータキットユーザガイド
41 レッスン 3.2 レッスン 1: Hello World (LED の点灯 ) レッスンの紹介 最初のレッスンでは LED の点灯方法を学びます ハードウェアの動作 DS1 が点灯を続けます 概要 LED は RC0 ~ RC3 の I/O ピンに接続されています まず これらの I/O ピンを出力に設定します このレッスンでは これらのピンの 1 本を High に駆動 (RC0 = 1) して LED を点灯させます これら 2 つの論理レベルは PIC MCU の電源ピンに基づいて決定します PIC MCU の電源ピン (VDD) は 5 V に接続され ソース (VSS) はグランド (0 V) に接続されるため 1 は 5 V 0 は 0 V と等価です 新しく学ぶレジスタ 両デバイス共通 表 3-1: LATC PORTC TRISC 新しく学ぶ両デバイス共通のレジスタレジスタ目的データラッチ PORTC の全てのピンのステータスを保持ピンが入力 (1) か出力 (0) かを決定 LATC データラッチ (LATx レジスタ ) は I/O ピンが駆動している値の Read-Modify-Write 動作に便利です LATx レジスタへの書き込み動作は 対応する PORTx レジスタへの書き込みと同じ効果があります LATC レジスタを読み出すと I/O ポートラッチの保持値が読み出されます PORTC PORTC レジスタを読み出すと I/O ピンの値が読み出されます 書き込みはポートに直接行うのではなく LATx レジスタに対して行います TRISC このレジスタは PORTC に接続された各ピンのデータ方向を指定します 表 3-2: TRIS の値と方向 TRIS の値 1 入力 0 出力 方向 1 は Input ( 入力 ) の I の形 0 は Output ( 出力 ) の O の形になぞらえると簡単に覚えられます 書き込みは必ずラッチへ実行し 読み出しは必ずポートから実行するように注意します 2015 Microchip Technology Inc. DS41628B_JP - p.41
42 3.2.5 新しく学ぶ命令 エンハンストミッドレンジおよび PIC18 の全命令の詳細は 各 PIC MCU のデータシートで 命令セットのまとめ の章を参照してください 本書では 各デバイスの重要な命令について簡単に説明します 両デバイス共通 表 3-3: bsf レジスタの 1 ビットをセットします 例 3-1: bcf レジスタの 1 ビットをクリアします 例 3-2: CLRF レジスタ全体をクリアします 初期化時に LED 等の周辺出力を全て OFF にする場合に使うと便利です 例 3-3: 新しく学ぶ両デバイス共通の命令 命令英語名目的 bsf Bit Set f 指定したビットを 1 (5 V) にする bcf Bit Clear f 指定したビットを 0 (0 V) にする clrf Clear f レジスタの全てのビットを 0 にする bsf LATC, 0 命令実行前 : RC0 = 0 命令実行後 : RC0 = 1 bcf LATC, 0 命令実行前 : RC0 = 1 命令実行後 : RC0 = 0 clrf LATC 命令実行前 : LATC = b 命令実行後 : LATC = b DS41628B_JP - p Microchip Technology Inc.
43 レッスン 例 3-4: アセンブリ エンハンストミッドレンジ #include <p16f1829.inc> CONFIG _CONFIG1, (_FOSC_INTOSC & _WDTE_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOREN_ON & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF); CONFIG _CONFIG2, (_WRT_OFF & _PLLEN_OFF & _STVREN_OFF & _LVP_OFF); errorlevel -302 ;supress the 'not in bank0' warning ORG 0 Start: banksel TRISC ; select bank1 bcf TRISC,0 ; make IO Pin C0 an output banksel LATC ; select bank2 clrf LATC ; init the LATCH by turning off everything bsf LATC,0 ; turn on LED C0 (DS1) goto $ ; sit here forever! ; end ; コメントの開始を表します アセンブラは セミコロンから行末までのテキストを全て無視します コードの可読性を高めるため なるべく多くのコメントを挿入するようにします #include <p16xxxx.inc> p16f1829.inc には この PIC MCU 固有の SFR およびその他メモリのアドレスが全て定義してあります この文は プログラムのヘッダコメントの後の最初の行に記述してください その次に CONFIG ディレクティブを記述します CONFIG プロセッサのコンフィグレーションビットを設定します このディレクティブを使う前に プロセッサを宣言しておく必要があります ここで記述している各コンフィグレーションワードの詳細は PIC16F1829 のデータシートを参照してください この中で最も重要なのは RA3 のマスタクリアを OFF にする MCLRE_OFF です Errorlevel -302 MESSAGE 302 Operand not in Bank 0, check to ensure bank bits are correct という警告メッセージの出力を抑制します Org xx 以下のコードの開始アドレスを xx で指定します org を指定しない場合 アドレス 0 からコード生成が開始します Start: これはラベルです ラベルには そのラベル直後のオペコードと同じメモリアドレスが割り当てられます 実際のコードでは call goto branch 命令のジャンプ先をラベルで指定する事を推奨します Banksel TRISC 2015 Microchip Technology Inc. DS41628B_JP - p.43
44 エンハンストミッドレンジコアで最もよく使う 非常に重要なディレクティブです この擬似命令は アセンブラとリンカに対して TRISC レジスタが属するバンクを選択するコードを生成するよう指示します この場合 バンク 1 です これには 1 命令サイクルかかります 例 3-5: ピン RC0 を出力にします このレジスタのビットを 1 にセットするとそのピンは入力に設定され 0 にクリアすると出力に設定されます clrf LATC 全ての出力レジスタを 0 に初期化する事を推奨します 全てのレジスタがリセット時にクリアされる保証はありません bsf LATC, 0 これで PORTC0 に接続された DS1 が点灯します goto $ これは アセンブラに対して現在の命令へジャンプするよう指示する命令で この命令が無限に実行されます PIC18 #include <p18f14k22.inc> bcf TRISC, 0 ;Config settings CONFIG IESO = OFF, PLLEN = OFF, FOSC = IRC, FCMEN = OFF, PCLKEN = OFF CONFIG BOREN = SBORDIS, BORV = 19, PWRTEN = OFF, WDTEN = OFF CONFIG MCLRE = OFF, HFOFST = OFF, DEBUG = OFF, STVREN = ON CONFIG XINST = OFF, BBSIZ = OFF, LVP = OFF CONFIG CP0 = OFF, CP1 = OFF CONFIG CPD = OFF, CPB = OFF CONFIG WRT0 = OFF, WRT1 = OFF CONFIG WRTB = OFF, WRTC = OFF, WRTD = OFF CONFIG EBTR0 = OFF, EBTR1 = OFF CONFIG EBTRB = OFF errorlevel -302 ;suppress the 'not in bank0' warning ORG 0 Start: bcf TRISC,0 ;make IO Pin C0 an output clrf LATC ;init the LATCH by turning off everything bsf LATC,0 ;turn on LED C0 (DS1) goto $ ;sit here forever! end ここでは コンフィグレーションワードと CONFIG ディレクティブが異なっています PIC18 の方がコンフィグレーションワードに多くの機能があります 各コンフィグレーションワードの役割の詳細は PIC18F14K22 のデータシートを参照してください エンハンストミッドレンジとの最も重要な違いは バンク切り換えの必要がない事です 全ての SFR がアクセスバンクにあるため banksel 文は不要です DS41628B_JP - p Microchip Technology Inc.
45 レッスン C 言語 C 言語のソースコードは PIC16 も PIC18 もほとんど同じです エンハンストミッドレンジ 例 3-6: #include <htc.h> //PIC hardware mapping //config bits that are part-specific for the PIC16F1829 CONFIG(FOSC_INTOSC & WDTE_OFF & PWRTE_OFF & MCLRE_OFF & CP_OFF & CPD_OFF & BOREN_ON & CLKOUTEN_OFF & IESO_OFF & FCMEN_OFF); CONFIG(WRT_OFF & PLLEN_OFF & STVREN_OFF & LVP_OFF); //Every program needs a `main` function void main(void) { TRISCbits.TRISC0 = 0; //using pin as output LATC = 0; //init to zero LATCbits.LATC0 = 1; //turn on the LED by writing to the latch while(1) continue; //sit here forever doing nothing } // コメントの開始を表します コンパイラは行末までの全てのテキストを無視します コードの可読性を高めるため なるべく多くのコメントを挿入するようにします #include <htc.h> htc.h ファイルを指定しておくと プロジェクト作成時に選択したプロセッサのヘッダファイルが自動的に読み込まれます CONFIG コンフィグレーションワードへの書き込みを実行します 詳細はデータシートを参照してください void main(void) 全ての C プログラムは最初に main 関数があります これは必須の関数です LATCbits.LATC0 = 1 LATCbits は インクルードしたファイル (htc.h) で定義された構造体です このプログラムで選択する必要があるのは ピン RC0 に接続された DS1 のみです これは LATC = 0b と記述する事もできます これはOR 代入演算子と呼ばれるもので C0 以外の全てのピンの状態が維持されます OR 演算を省略して LATC = 0b とすると C0 以外の全てのビットがクリアされます while (1) continue; この while 文を評価すると常に真となり continue 文で現在のループに留まります この状態が無限に続きます continue 文がなくても正しく動作します アセンブリコードよりも少ない行数で同じ機能を実現しています 2015 Microchip Technology Inc. DS41628B_JP - p.45
46 PIC18 PIC16 のコードと異なるのはコンフィグレーションワードの部分のみです 詳細は PIC18F14K22 のデータシートを参照してください DS41628B_JP - p Microchip Technology Inc.
47 レッスン 3.3 レッスン 2: LED 点滅 レッスンの紹介 このレッスンでは 前のレッスンで使った LED (DS1) を点滅させます 動作自体はあまり変わりませんが アセンブリコードを記述しようとすると PIC MCU の実行の仕組みを深く理解する必要があります ハードウェアの動作 DS1 が 1.5 秒周期で点滅を繰り返します 概要 遅延を生成する手段の 1 つに ある値をデクリメントして時間を消費する方法があります アセンブリではコード実行をユーザが直接制御できるため タイミングを正確にプログラミングできます C では コンパイラが C コードをアセンブリにコンパイルした後 PIC MCU に書き込むファイル (HEX ファイル ) を作成します このため C コードの場合は 1 行の実行に何命令が必要かを正確に予測する事は困難です MPLAB X と MPLAB 8.xx にはどちらも C プロジェクトの逆アセンブリウィンドウがあります プログラムのビルドが正常に完了したら コンパイラが生成した命令をこのウィンドウで確認できます 新しく学ぶレジスタ 両デバイス共通 表 3-4: OSCCON 新しく学ぶ両デバイス共通のレジスタレジスタ目的プロセッサ速度を設定する OSCCON どのようなプログラムでも このレジスタに必ず書き込む必要があります 正確な遅延ループを得るには プロセッサ速度を設定する事が重要です レッスン 1 のようにこのレジスタへの書き込みを省略した場合 周波数は既定値 (PIC16F1829 の場合は 500 khz PIC18F14K22 の場合は 1 MHz) となります 既定値はデバイスによって異なります 新しく学ぶ命令 両デバイス共通 表 3-5: 新しく学ぶ両デバイス共通の命令 命令英語名目的 movlw Move literal to WREG バイト値を移動する movwf Move WREG to f バイト値を移動する decfsz Decrement f, Skip if 0 遅延ループを作る bra label Relative branch 条件ジャンプする goto label Go to address ジャンプする MOVLW 8 ビットのリテラル ( 定数 ) をワーキングレジスタ (WREG) に書き込みます movlw 0x5A 命令実行後 :W = 0x5A 2015 Microchip Technology Inc. DS41628B_JP - p.47
48 アセンブリでは非常によく使う命令です 通常 データを WREG に代入した後 演算を実行するか別のレジスタへ代入します movwf movlw に似た命令で WREG のデータを別のレジスタへ代入します 例 3-7: movwf OPTION_REG 命令実行前 : OPTION_REG = 0xFF W = 0x4F 命令実行後 : OPTION_REG = 0x4F W = 0x4F decfsz レジスタの値を 1 つデクリメントします デクリメント後のレジスタの値が 0 の場合 次の命令をスキップします これは遅延ループの作成に使います bra/goto これら 2 つの命令は コードの別のセクションへのジャンプに使います BRA は現在のプログラムカウンタの位置からの相対分岐です エンハンストミッドレンジコアの場合 カウンタはプログラムメモリの -256 n 255 のアドレスレンジにアクセスできます PIC18 の BRA は プログラムメモリの n 1023 のアドレスレンジにアクセスできます 値と符号に注意が必要です エンハンストミッドレンジコアでは 相対分岐を使うとページ境界を越えてジャンプできるため便利です goto は無条件ジャンプで エンハンストミッドレンジの場合は現在のページ内の任意のアドレスにアクセスできます PIC18 では goto 命令で全てのプログラムメモリにアクセスできます ただしプログラムメモリを 2 ワード必要とする事に注意が必要です つまりPIC18 では 1つの goto 命令がBRA 命令の2 倍の空間を必要とします PIC18 では 分岐先アドレスが現在のアドレスから ±1024 以内であれば GOTO ではなく相対分岐を推奨します エンハンストミッドレンジでは ページ境界を越えたジャンプを繰り返す場合のみ相対分岐に利点があります PIC18 表 3-6: btg 指定したレジスタのビット値を反転します アセンブリ 新しく学ぶ PIC18 の命令 命令英語名目的 btg Bit Toggle f LED を点滅する エンハンストミッドレンジ 例 3-8: movlw b' ' ;set cpu clock speed movwf OSCCON DS41628B_JP - p Microchip Technology Inc.
49 レッスン ここでは PIC MCU の動作周波数を 500 khz に設定しています ワーキングレジスタ (WREG) を使ってレジスタにバイト値を代入します このレジスタへの書き込みを省略した場合も PIC16F1829 は既定値の 500 khz で動作します しかし既定値はデバイスによって異なるため コードの冒頭で必ずこのレジスタへの書き込みが必要です これで PIC MCU は 1 命令を 8 µs で実行するようになります ( 式 3-1 参照 ) 式 3-1: 実行時間 Instruction time = = = FOSC kHz 8 µs 4 4 LED を点滅させるには まず LED を点灯した後に一定時間待ってから同じ時間だけ LED を消灯するようにプログラムを記述する必要があります これには内蔵 RAM を使います 例 3-9: cblock 0x70 Delay1 Delay2 endc ;shared memory location that is accessible from all banks ; Define two file registers for the delay loop in shared memory 例 3-10: CBLOCK はユーザメモリを割り当てます CBLOCK の後の数値は どのアドレスからメモリを割り当てるかを指定します 0x70 は エンハンストミッドレンジコアでは全てのバンクで共有する共通 RAM のアドレスです ここに格納できるのは 16 バイトのみです これらの変数を使う場合 プログラムでバンクを切り換える必要はありません ここから先のレッスンでは エンハンストミッドレンジではこの共通 RAM に PIC18 ではアクセス RAM に変数を格納します ここに 以下の遅延ループを作成するための 2 つの変数を格納します bsf LATC, 0 ; turn LED on OndelayLoop: decfsz Delay1,f ; Waste time. bra OndelayLoop ; The Inner loop takes 3 instructions per loop * 256 loops = 768 instructions decfsz Delay2,f ; The outer loop takes an additional 3 instructions per lap * 256 loops bra OndelayLoop ; (768+3) * 256 = instructions / 125K instructions per second = ;sec. bcf PORTC,0 ; Turn off LED C0 - NOTE: do not need to switch banks with 'banksel' since ;bank0 is still selected OffDelayLoop: decfsz Delay1,f ; same delay as above bra OffDelayLoop decfsz Delay2,f bra OffDelayLoop bra MainLoop ; Do it again... bra でループ先頭に戻り 処理を繰り返します このループの実行には 3 命令サイクル ( デクリメントに 1 命令サイクル bra に 2 命令サイクル ) かかります そしてカウンタの動作によってこのループを 256 回実行するため 実行には合計 768 命令サイクルがかかります それでも 人間の目にはほとんど認識できないほどの速さです そこで このループの外側にもう 1 つのループを追加してさらに速度を落とします 内周ループの実行時間が 768 サイクルで 外周ループの 3 サイクルを足したものを 256 回繰り返します すなわち 実行時間は (768+3) * 256 = 命令 /125K 命令 /s = s です 2015 Microchip Technology Inc. DS41628B_JP - p.49
50 例 3-11: goto 命令とbra 命令が2 命令サイクルを必要とするのは このプロセッサがパイプライン構造をしているためです プロセッサは現在の命令を実行中に次の命令をフェッチします プログラムが発生すると goto または bra の後のフェッチ済み命令は実行されません その代わりに NOP が実行され その間に分岐先の命令をフェッチします 変数 Delay1 と Delay2 は 0 から 255 へロールオーバします このため デクリメントする前に変数 Delay1 と Delay2 に値を代入しておく必要はありません PIC18 エンハンストミッドレンジコアには全バンクで共有できる汎用 RAM ( 共通 RAM) が 16 バイトありますが PIC18 にはこれに相当する領域として 0x00->0x5F があります この 96 バイトはバンク指定なしでアクセスできます cblock 0x00 ; Access RAM Delay1 ; Define two file registers for the delay loop in shared memory Delay2 endc C 言語 両デバイス共通変数カウンタを使った C による遅延ループでは 実際の遅延時間は予測できません C コードの場合 PIC MCU に書き込む前にコンパイラがユーザコードをアセンブリに変換するステップが入ります ループの実行時間は コンパイラの効率およびプログラムの記述方法によって異なります 従って 遅延ループ用のライブラリ関数を使う事を推奨します このレッスンでは両方の方法を紹介します このレッスンのコードの最後でコメントアウトしたセクションは XC8 コンパイラ内蔵の高精度な遅延関数を使っています これ以降のレッスンでは この内蔵遅延マクロを使います 例 3-12: #define _XTAL_FREQ //Used by the HI-TECH delay_ms(x) macro 例 3-13: この高精度なルーチンを使うには PIC MCU のプロセッサ速度を定義しておく必要があります delay = 7500; while (1) { while(delay--!= 0)continue; //each instruction is 8us (1/(500KHz/4)) LATCbits.LATC0 ^= 1; delay = 7500; //toggle the LED //assign a value since it is at 0 from the delay loop 変数 delay を作成し デクリメントしてから LED をトグルしています ^ はピンの値と 1 を XOR 演算しており これによってピンの値をトグルしています コンパイラの最適化レベルを変えると生成されるコードが変化し 遅延時間が増減します DS41628B_JP - p Microchip Technology Inc.
51 レッスン 3.4 レッスン 3: ローテート レッスンの紹介 4 つの LED の点灯を循環させます ( ローテート ) ハードウェアの動作 LED が左から右へ 1 つずつ順に点灯する動作を繰り返します 概要 このレッスンでは シフト命令とビット指向のスキップ命令を使って LED を順番に点灯させる方法を学びます 新しく学ぶレジスタ 両デバイス共通 表 3-7: STATUS 新しく学ぶ両デバイス共通のレジスタレジスタ目的 ALU のステータスを調べる STATUS STATUS レジスタは 算術演算を実行するたびにハードウェアによって自動的に更新されます このレジスタを使うと以下の条件をチェックできます 1. ゼロ 2. ディジットキャリー 3. キャリー 4. オーバーフロー 5. 負個々の命令がどのビットに影響するかは 各 PIC MCU のデータシートの 命令セットのまとめ を参照してください 新しく学ぶ命令 両デバイス共通 表 3-8: 新しく学ぶ両デバイス共通の命令 命令英語名目的 btfsc Bit Test f, Skip if Clear If/Else 文 btfsc 指定したレジスタの指定したビットを検査します そのビットがクリア ( 値が 0 ) なら次の命令をスキップします これは IF-ELSE 文を実行するのと同じです 2015 Microchip Technology Inc. DS41628B_JP - p.51
52 エンハンストミッドレンジ 表 3-9: PIC18 新しく学ぶエンハンストミッドレンジの命令 命令英語名目的 lsrf Logical Right Shift ビットを右方向へシフトする 表 3-10: 新しく学ぶ PIC18 の命令 命令英語名目的 rrcf Rotate Right f through Carry ビットを右方向へシフトする LSRF/RRCF LSRF と RRCF の違いは 前者の場合は MSb に 0 が入るという事です 後者の場合は carry ビットの内容を MSb にシフトします どちらの命令も LSb を carry ビットにシフトします 以下に例を示します 図 3-1: LSRF MSb LSb C X 図 3-2: RRCF MSb LSb C 例 3-14: シフトの結果 carry ビットに 1 が入った場合 次のローテートを実行するとレジスタの MSb に 1 が入るため それを避けたい場合は carry ビットをクリアしておく必要があります アセンブリ エンハンストミッドレンジ Rotate: lsrf LATC,F ;shift the LEDs and turn on the next LED to the right btfsc STATUS,C ;did the bit rotate into the carry (i.e. was DS1 just lit?) bsf LATC, 3 ;yes, it did and now start the sequence over again by turning on DS4 goto MainLoop ;repeat this program forever DS41628B_JP - p Microchip Technology Inc.
53 レッスン DS1 は RC0 に接続され DS2 は RC1 に接続されています ( 以下同様 ) ビットを右方向へシフトすると LED は右から左へ順番に点灯していきます これを分かりやすくまとめた表を以下に示します 表 3-11: ピンと LED の対応関係 LATC Bit # MSb (7) LSb (0) LED DS4 DS3 DS2 DS1 プログラムを開始すると DS4 が点灯します 表 3-12: LED 点灯のローテート LATC Bit # MSb (7) LSb (0) LED DS4 DS3 DS2 DS1 値 遅延の後 右方向への論理シフトを実行します 表 3-13: LED 点灯のローテート LATC Bit # MSb (7) LSb (0) LED DS4 DS3 DS2 DS1 値 これで DS3 が点灯します carry ビットには LATCbits.LATC0 にあった値が格納されます この場合は 0 です 次にこのプログラムは carry ビットがセットされているかを検査します これは DS1 が点灯した状態で lsrf が実行された場合のみ結果が真となります この場合 carry ビットがセットされているため 次の行が実行されます 例 3-15: bsf LATC, 3 ;yes, it did and now start the sequence over again by turning on DS4 例 3-16: これで DS4 が再点灯し プログラムは最初に戻って同じ点灯パターンを繰り返します なお MSb (bit 7) は常にクリアされる事に注意してください これは lsrf 命令の性質によるものです PIC18 PIC18 の論理シフト命令はエンハンストミッドレンジとは異なります Rotate: rrcf LATC,f ;rotate the LEDs (through carry) and turn on the next LED to the right btfss STATUS,C ;did the bit rotate into the carry (i.e. was DS1 just lit?) goto MainLoop ;nope, repeat this program forever bsf LATC, 3 ;yes, it did and now start the sequence over again by turning on DS4 bcf STATUS, C ;clear the carry goto MainLoop ;repeat this program forever 2015 Microchip Technology Inc. DS41628B_JP - p.53
54 PIC18 には carry ビットを使うローテート命令と使わないローテート命令があります carry ビットを使わないローテート命令の場合 LSb の値がそのまま MSb に入ります PIC16 の場合と同様 このプログラムも直前まで左端の LED (DS1) が点灯していたかどうかを carry ビットを使って調べる必要があります 唯一の違いは セットされた carry ビットをクリアする必要があるという点です このビットをクリアしなくても DS3 は正しく点灯しますが LATCbits.LATC7 もセットされるため ローテート命令を繰り返すうちにこのビットが LED の接続された <RC3:RC0> のレンジに入り やがて全ての LED が点灯してしまいます C 言語 両デバイス共通 C コードの方がはるかにシンプルで 容易に理解できます このプログラムは 500 ms の遅延の後 LATC レジスタを右方向へシフトし LATC の carry ビットがセットされているかを検査しています セットされている場合は RC3 をセットしてローテートを続けます 例 3-17: 上記のシフトは 符号なしレジスタであるため論理シフトである事に注意してください この場合もシフト後に STATUS レジスタが更新されます C にはいくつかの省略記法があり 例 3-17 に示したシフトもその 1 つです 例 3-18 に例を示します 例 3-18: delay_ms(500); //delay 500ms LATC >> = 1; //shift to the right by 1 if(statusbits.c) //when the last LED is lit, restart the pattern LATCbits.LATC3 = 1; LATC >> = 1; 等価な代入文 : LATC = LATC >> 1; 等価なアセンブリ命令 : lsrf LATC,F ;shift the LEDs and turn on the next LED to the right DS41628B_JP - p Microchip Technology Inc.
55 レッスン 3.5 レッスン 4: A/D 変換 レッスンの紹介 このレッスンでは ADC の設定 A/D 変換の実行 基板上のポテンショメータ (RP1) で制御されるアナログ電圧の読み出しを実行し 上位 4 ビットを LED に表示する方法を学びます ハードウェアの動作 A/D 変換結果の上位 4 ビットを LED に表示します ポテンショメータを回すと LED の表示が変化します 概要 どちらの PIC MCU デバイスも分解能 10 ビットの A/D コンバータ (ADC) を内蔵しており 12 チャンネルのいずれか 1 つに対して A/D 変換を実行できます この ADC の参照電圧には デバイスの VDD または外部参照電圧が使えます このレッスンでは VDD を参照電圧とします A/D 変換結果は 参照電圧に対する電圧の比として表されます 式 3-2: ADC = (V/VREF) * 1023 A/D 変換結果を電圧値に変換するには V について解く必要があります V = (ADC/1023) * VREF このレッスンでは 以下の設定を行います 1. ADC ピンをアナログ入力として設定する 2. A/D 変換クロックを選択する 3. チャンネル 変換結果のフォーマット VREF の電圧源を選択する 新しく学ぶレジスタ 両デバイス共通 表 3-14: レジスタ ANSELx ADCON0 新しく学ぶ両デバイス共通のレジスタ 目的 ピンをデジタルまたはアナログに設定する ADC チャンネル選択 ADC モジュールイネーブル 変換完了 (DONE) ビット ANSEL ANSEL レジスタは ピンをデジタル I/O (1 または 0) とするかアナログ I/O ( 可変電圧 ) とするかを決定します アナログ入力として設定した I/O ピンはデジタル入力検出回路が無効になり常に 0 として読み出され ピンのアナログ機能が正しく動作します ANSELx ビットの状態はデジタル出力機能には影響を与えません ピンをアナログ入力として設定する場合 ピンの電圧を外部から制御するには対応する TRIS ビットをセットして入力モードに設定する必要があります このレッスンではポテンショメータを使って電圧を変化させるため RA4 をアナログ入力に設定します 2015 Microchip Technology Inc. DS41628B_JP - p.55
56 表 3-15: PIC18F14K22 の ANSEL レジスタは多少異なりますが 機能は同じです 各 PIC MCU のデータシートに示したレジスタ定義の表では 一番上の行に各ビットの機能の詳細 ( 既定値の状態等 ) を表示しています ANSA0 ビットは読み書き可能で パワーオンリセット (POR) とブラウンアウトリセット (BOR) 時の既定値はアナログ入力です BOR は 電源電圧がコンフィグレーションワードで設定したしきい値より下がると発生します ADCON0 ADCON0 は ADC の動作を制御します bit 0 は ADC モジュールのイネーブルビットです bit 1 は A/D 変換を開始するためのビットで bit <6:2> は ADC が読み出すチャンネルを選択します このレッスンでは ADC を有効にして RA4 を入力チャンネルに選択します ADCON1 レジスタ ( 後述 ) で内部参照電圧を選択し A/D 変換クロックを 8TOSC とします チャンネル変更後 ADC サンプリングコンデンサのセトリングに約 5 μs 必要です 最後に ADCON0 レジスタの GO ビットをセットすると変換が開始します GO ビットには DONE フラグとしての役割もあります つまり 変換が完了すると ADC は GO ビットをハードウェアでクリアします 変換結果は ADRESH:ADRESL レジスタペアに格納されます 変換結果の上位 4 ビットをコピーして PORTC に接続された LED に表示します ADC の変換結果は左詰めフォーマットで格納され 青で示したビットが LATC にコピーされる bit 6 が DS1 を制御し bit 7 が DS2 を制御する ( 以下同様 ) レジスタ ADRESH ADRESL 結合後の bit # (LSb) PIC16 表 3-16: ADCON1 新しく学ぶエンハンストミッドレンジのレジスタレジスタ目的変換結果のフォーマット 変換速度 参照電圧 PIC18 表 3-17: ADCON1 ADCON2 新しく学ぶ PIC18 のレジスタレジスタ目的参照電圧変換結果のフォーマット 変換速度 ADCON1 PIC16 の ADCON1 レジスタと PIC18 の ADCON2 レジスタは プロセッサクロック速度と変換速度の比を選択します ADC は 1 ビットの変換に少なくとも 1.6 μs を必要とするため この設定が重要です クロックが速すぎても遅すぎても精度が低下します プロセッサクロック速度を高くした場合 変換速度を維持するには分周値を大きくする必要があります 10 ビットの変換結果を右詰めと左詰めのどちらで格納するかは ADFM ビット (bit <7>) で選択します このプログラムでは左詰めを選択しているため 下位 2 ビットが ADRESL レジスタに格納され 上位 8 ビットが ADRESH レジスタに格納されます しかし実際にこのプログラムで使うのは ADRESH レジスタの上位 4 ビットのみです ADC 参照電圧は VDD または VREF に接続した別の参照電圧のどちらかを参照電圧指定ビットで選択します DS41628B_JP - p Microchip Technology Inc.
57 レッスン 新しく学ぶ命令 両デバイス共通 表 3-18: 新しく学ぶ両デバイス共通の命令 命令英語名目的 SWAPF Swapf nibbles in f ニブルを入れ換える SWAPF ニブルを入れ換えます ニブルは 4 ビットの事で 1 バイトは 2 個のニブルで構成されます 以下に例を示します 例 3-19: movlw b 表 3-19: WREG SWAPF 実行前 レジスタ B 値 ADC を実行します ADRESH には A/D 変換結果の b' が格納されます 表 3-20: ADRESH SWAPF 実行前 レジスタ B 値 例 3-20: swapf ADRESH, w ; now perform the swapf and save in WREG, leaving ADRESH intact 表 3-21: WREG ADRESH 図 3-3: SWAPF 実行後 レジスタ SWAPF の図解 B B 値 ADRESH WREG Microchip Technology Inc. DS41628B_JP - p.57
58 3.5.6 アセンブリ エンハンストミッドレンジ ;Start the ADC nop ;requried ADC delay of 8uS => (1/(Fosc/4)) = (1/(500KHz/4)) = 8uS banksel ADCON0 bsf ADCON0, GO ;start the ADC btfsc ADCON0, GO ;this bit will be cleared when the conversion is complete goto $-1 ;keep checking the above line until GO bit is clear ;Grab Results and write to the LEDs swapf ADRESH, w ;Get the top 4 MSbs (remember that the ADC result is LEFT justified!) Banksel LATC movwf LATC ;move into the LEDs bra MainLoop A/D 変換結果を左詰めで格納している事に注意します このため swapf 命令を使って上位 4 ビットを LATC に代入できます 例 3-21: goto $-1 ;keep checking the above line until GO bit is clear ドル記号 ($) はアドレスカウンタの現在の値を表します $-1 は goto 命令のジャンプ先を ( 現在のアドレス - 1) すなわち 1 つ前の命令とするようアセンブラに指示しています PIC18 例 3-22: goto $-2 ;keep checking the above line until GO bit is clear ここでは 1 の代わりに $-2 としている事に注意します これは非常に重要な違いです PIC18 のプログラムメモリはバイト単位でアドレス指定できますが PIC18 の命令ワードは 2 バイト長です 1 つ前の命令は アドレス空間では 2 バイト前に相当します PIC18 の命令のアドレスは常に偶数です C 言語 両デバイス共通 例 3-23: ここでは ADRESH レジスタを右方向へ 4 回シフトしています 符号なし変数に対するシフトは論理シフトです 以下に例を示します 表 3-22: delay_us(5); //wait for ADC charging cap to settle GO = 1; while (GO) continue; //wait for conversion to be finished LATC = (ADRESH >> 4); //grab the top 4 MSbs シフト前の ADRESH シフト前の ADRESH Bit # MSb (7) LSb (0) 値 DS41628B_JP - p Microchip Technology Inc.
59 レッスン ADRESH >> 4; //grab the top 4 MSbs 表 3-23: シフト後の一時作業領域レジスタ シフト後の ADRESH Bit # MSb (7) LSb (0) 値 LED はピン <RC3:RC0> に接続されているため この一時作業領域レジスタの内容を LATC に代入する事ができます PORTC レジスタのそれ以外のビットは無視できます ポテンショメータを時計方向に回しても LED はなかなか点灯しません これは A/D 変換結果の上位 4 ビットを表示しているためで 電圧を大きく変化させないとこれらのビットには影響しません 自習課題として 下位ニブル (bit 0 ~ 3) を LATC に代入して試してみましょう LED の状態がより頻繁に変化します 2015 Microchip Technology Inc. DS41628B_JP - p.59
60 3.6 レッスン 5: 可変速ローテート レッスンの紹介 このレッスンでは これまでに学んだ全てのレッスンの内容を組み合わせ A/D 変換結果の値に応じて LED のローテート速度を変化させます A/D 変換結果の値に反比例して LED のローテート速度が変化します ハードウェアの動作 ポテンショメータを反時計方向に回すと LED のシフトが速くなります 概要 このレッスンでは A/D 変換結果が 0 かどうかを調べる処理が重要です このゼロチェックを行わないと A/D 変換結果が 0 の場合に LED が正しい速度でローテートしません これは 遅延の値が 0 から 255 へロールオーバーするためです 図 3-4: プログラムのフロー ADC を設定する I/O ポートを設定する A/D 変換結果を取得する A/D 変換結果が 0 かチェックする A/D 変換結果に応じた遅延を挿入する LED をローテートする 新しく学ぶレジスタ なし 新しく学ぶ命令 両デバイス共通 表 3-24: 新しく学ぶ両デバイス共通の命令 命令英語名目的 call label Call Subroutine コードのモジュール化 return Return from Subroutine コードのモジュール化 xorwf Exclusive OR WREG with f レジスタのビットをトグルする call call は C で関数を追加するのと同じ働きをします この命令を使うと サブルーチンを作成して main 関数から呼び出す事ができます これによりメモリの利用効率とプログラムの可読性が向上します DS41628B_JP - p Microchip Technology Inc.
61 レッスン call 命令はスタックを 1 段使います 前述の通り PIC18 のスタックサイズは 31 段で エンハンストミッドレンジコアは 16 段です call 命令を実行するたびにリターンアドレスがスタックにプッシュされ プログラムカウンタは label のプログラムメモリアドレスへ移動します スタックの深さを超えないように注意する必要があります 例えば PIC16F1829 で一度もリターンアドレスに戻らず call 命令を 17 回実行すると スタックオーバーフローが発生します PIC18 の call 命令はプログラム空間を 2 ワード占有しますが プログラム空間の任意のアドレスに移動できます エンハンストミッドレンジでは call のジャンプ先が現在選択中のページ以外にある場合 まずページ選択ビットを設定してから call を実行する必要があります RETURN return 命令を実行すると スタックに最後に保存したアドレスがプログラムカウンタに戻り スタックポインタはプログラムカウンタの直前の call に移動します これで プログラムカウンタは call 命令の直後の命令を指し示します call 命令を実行せずに return 文を実行すると スタックアンダーフローが発生します STVREN コンフィグレーションビットを使うと スタックアンダーフロー / オーバーフロー時にリセットを発生させる事ができます call 命令と return 命令はどちらも 2 サイクル必要です XORWF このレッスンでは XORWF を使って A/D 変換結果が 0 かどうかを調べます 以下に XOR の真理値表を示します 表 3-25: XOR の真理値表 A 入力 B 出力 例 3-24: movlw d'0' ;load wreg with '0' xorwf Delay2, w ;XOR wreg with the ADC result and save in wreg btfss STATUS, Z ;if the ADC result is NOT '0', then simply return to MainLoop これは Delay2 レジスタと 0 を XOR 演算して Delay2 の値が 0 かどうかを調べています Delay2 の値が 0 であれば XOR 演算結果が 0 となるため STATUS レジスタの Z ビットがセットされます PIC18 表 3-26: 新しく学ぶ PIC18 の命令 命令 英語名 目的 tstfsz Test f, skip if 0 簡単なゼロチェック (IF 文 ) rcall Relative Call コードのモジュール化 TSTFSZ レジスタが 0 かどうかをこの命令で簡単に調べる事ができます PIC18 では PIC16 の XORWF の代わりにこの命令を使うと命令数を少なくできます 以下に例を示します 2015 Microchip Technology Inc. DS41628B_JP - p.61
62 例 3-25: tstfsz Delay2 ;if the ADC result is NOT '0', then simply return to MainLoop return ;return to MainLoop Delay2 が 0 の場合 return 命令はスキップされるため実行されません rcall ジャンプ先アドレスが現在のプログラムカウンタのアドレスから 1K のレンジ内にある場合は rcall を使います これは 通常の call 命令がプログラム空間を 2 ワードを占有するのに対し rcall 命令は 1 ワードしか占有しないためです アセンブリ 両デバイス共通 例 3-26: MainLoop: call A2d ;get the ADC result ;top 8 MSbs are now in the working register (Wreg) movwf Delay2 ;move ADC result into the outer delay loop call CheckIfZero ;if ADC result is zero, load in a value of '1' or else the delay loop will decrement starting at 255 call DelayLoop ;delay the next LED from turning ON call Rotate ;rotate the LEDs bra MainLoop ;do this forever call を使う事で これまでのレッスンに比べ メインループの可読性が向上しています その他 ADC 遅延ループ ローテートのモジュール ( 関数 ) があります call の後は goto ではなく return で戻るように注意します CheckIfZeroは 遅延ループが0から255へロールオーバーしないようにするために必要です この call 命令を省略すると A/D 変換結果が 0 の場合に LED のローテート速度が非常に遅くなります C 言語 こちらのコード実装の方がはるかに理解が容易です 例 3-27: delay_ms(50); //delay for AT LEAST 50ms while (delay--!= 0) delay_ms(2); //decrement the 8 MSbs of the ADC and delay 2ms for each このルーチンは A/D 変換結果が 0 の場合に少なくとも 50 ms の遅延を挿入します A/D 変換結果の値が 1 つ大きくなるたびに このループで 2 ms の遅延を挿入します このレッスンでは 新たに関数呼び出しも使っています delay = adc(); //grab the top 8 MSbs これは アセンブリで call を実装するのと同じです プログラムカウンタはプログラム空間内でこの ADC 関数が存在するアドレスへ移動し コードを実行します そして 1 つの値を返し これを delay に代入します なお 関数の実体を main 関数の後で定義する場合 最初にプロトタイプを宣言しておく必要がある点に注意します unsigned char adc(void); //prototype DS41628B_JP - p Microchip Technology Inc.
63 レッスン 3.7 レッスン 6: デバウンス レッスンの紹介 機械式スイッチはコンピュータ マイクロプロセッサ マイクロコントローラを使ったほとんど全てのアプリケーションで幅広く使われ 重要な役割を果たしています 機械式スイッチは低コストで信頼性に優れています しかし機械式スイッチにはノイズの問題があります ノイズの主な要因はスイッチの瞬間的な開閉にあり 電気的な状態がきれいに ( なめらかに ) 遷移する事はほとんどありません 最終的にスイッチの状態が安定するまでに何回も接点の開閉が繰り返され 場合によっては数百回にも及ぶ事があります この問題はスイッチのバウンス ( チャタリング ) と呼ばれます このように開閉が繰り返される原因の 1 つに スイッチ接点同士が実際に衝突している事が挙げられます 例えば 2 つのビリヤードの球を衝突させた場合を考えてください 硬質な非弾性素材は 動きの運動エネルギを吸収しません ビリヤードの球を衝突させるとそれに反発する動作が発生し 時間の経過と摩擦に伴いエネルギが放散します 硬質金属のスイッチ接点も同じような反応を示します また スイッチ接点は完全な平滑ではありません 接点同士が接触する際 接点表面の凹凸や不純物によって電気接続が途切れる現象が起こります この結果 スイッチのバウンスが生じます スイッチのバウンスを補正しないで生じる結果は ごく軽微なものから深刻なものまで様々です 例えばテレビのチャンネルを変える時に 次のチャンネルに進むつもりが 2 つ 3 つ先のチャンネルまで進んでしまう事も考えられます このような状況が起こらないよう対策をとる必要があります スイッチのバウンス問題は最初期のコンピュータ以前から存在していました 古典的な対処法には RC 回路を使う テーブルシフトレジスタをリセットする等のフィルタ処理があります これらの方法は今でも効果的ですが材料 取り付け 基板面積等の点でコストがかさみます 図 3-5: スイッチのデバウンス +V SW R1 R2 C 1 Filtered Switch Output スイッチのデバウンスとして最も簡単なのは 信号が安定するまでスイッチをサンプリングするか バウンスが検出されなくなるまで信号のサンプリングを継続する方法です サンプリングをどれだけ継続すれば良いかは 詳細な検討が必要です 通常は 5 ms もあれば十分で ユーザが気付く事はありません PICkit 少ピン開発ボードのスイッチはそれほど大きなバウンスはありませんが システムで使う全スイッチについてデバウンス処理を実行すべきです ハードウェアの動作 スイッチを押すと DS1 が点灯します スイッチを離すと消灯します 2015 Microchip Technology Inc. DS41628B_JP - p.63
64 3.7.3 概要 このレッスンでは 簡単な遅延ルーチンを使ってスイッチピン操作時に表れるノイズを除去しています このコードで生成する遅延はわずか 5 ms ですが ほとんどのノイズを除去できます 必要な遅延量は使用するスイッチによって異なります スイッチによっては より長い遅延が必要です このレッスンでは C とアセンブリの両方でプリプロセッサシンボルの #define についても学びます ピン位置をコード内に直接記述するのは良いコーディング手法とは言えません 将来変わる可能性のある値はプリプロセッサシンボルで定義するようにします 別の PIC MCU を使ってこのレッスンを実行する場合 全てのピンが変わってしまう事もあります ピン位置をコードに直接記述している場合 その部分を全て調べて変更しなくてはいけません 例 3-28: #define SWITCH PORTA, 2 ;pin where SW1 is connected..note: always READ from the PORT and WRITE to the LATCH #define LED LATC, 0 ;DS1 こうしておけば この 1 行を変更するだけで全体に反映されます bsf LATC, 0 ;turn on the LED 例 3-29: bsf LED ;turn on the LED プリプロセッサは LED という識別子を検出すると全て LATC, 0 に置き換えます これはコードのアセンブル / コンパイル処理 ( プロセス ) の前に実行されるため プリプロセッサと呼ばれます 新しく学ぶレジスタ なし 新しく学ぶ命令 なし アセンブリ エンハンストミッドレンジ MainLoop: banksel PORTA ;get into Bank0 btfsc SWITCH ;defined above...notice how the PORT is being read and not the LATCH bra LedOff ;switch is not pressed - turn OFF the LED bra Debounce ;switch is held down, pin needs to be debounced これまでのレッスンとの大きな違いは 1 つだけです それは プログラムでスイッチの状態をチェックする際 ラッチではなくポートを読み出しているという点です PORTA でなく LATA とするとスイッチの状態を検出できません 前述の通り 読み出しは必ずポートから 書き込みは必ずラッチへ実行します LATA レジスタに対して Read-Modify-Write を実行すると PORTA のラッチ出力値を読み出して書き戻します PIC18 なし C 言語 新しく学ぶ内容はありません DS41628B_JP - p Microchip Technology Inc.
65 レッスン 3.8 レッスン 7: 方向切り換え付き可変速ローテート レッスンの紹介 このレッスンは これまでに学んだ全てのレッスンの内容を組み合わせ スイッチを押してローテートの方向を反転させます ローテーションの速度はポテンショメータで制御します ハードウェアの動作 A/D 変換結果の値に応じた速度で LED がローテートします スイッチを押すと LED のローテート方向が反転します 概要 このプログラムではローテート方向を追跡する必要があります また 反対方向にローテートするためのコードを追加する必要があります レッスン 5 は右方向へシフトし carry ビットが 1 かどうかを検査して 1 なら最初に戻って同じ点灯パターンを繰り返していました レッスン 7 では 両方向へのローテートが必要で 左方向へローテートする場合は bit 4 が 1 かどうかを検査する必要があります LATC の bit 4 に 1 が表れたら これを bit 0 に反映します 図 3-6: レッスン 7 のプログラムのフロー Rotate LEDs to Left YES Rotate LEDs to Right NO Main Init Get ADC Measurement Left Direction Check if ADC Result is 0 NO Delay Using ADC Result NO Is Switch Down? YES Delay 5ms YES Is Switch Still Down? YES Was It Held Down Previously? NO Change Direction 2015 Microchip Technology Inc. DS41628B_JP - p.65
66 このレッスンでは スイッチを長押しした場合でも正しく動作するように デバウンスルーチンでより複雑な処理を実行しています 何も対処をせず SW1 を長押しすると LED のローテート方向が次々と変化し 制御が不安定になったかのような印象を与えます 上記のフローチャートでは スイッチを長押しした場合は最初に押し込んだ時だけ方向を変え いったんスイッチを離して再び押し込まれるまではスイッチの状態を無視しています スイッチは プログラムがスイッチの状態を検査するループ処理を完了するまでは押し続けておく必要があります ここでは PIC MCU の動作速度が 500 khz であるため その時間はごくわずかです 新しく学ぶレジスタ なし 新しく学ぶ命令 PIC18 表 3-27: 命令英語名目的 RLNCF Rotate Left f (no carry) ビットを左方向へシフトする RLNCF carry ビットを使わずにビットを左へローテートします 直前の MSb がそのまま LSb に入ります 一般に これを循環シフトと呼びます 図 3-7: RLNCF MSb LSb アセンブリ エンハンストミッドレンジ 例 3-30: RotateRight: lslf LATC, f ;logical shift left btfsc LATC, 4 ;did it rotate out of the LED display? bsf LATC, 0 ;yes, put in bit 0 bra MainLoop 以前のレッスンでは 点灯した LED が左端から押し出されたかどうかを carry ビットを検査して調べていましたが ここではラッチを左方向へシフトしているため LATC4 を検査します LATC4 には何も接続されておらず このビットがセットされていれば直前まで DS4 が点灯していた事を意味します このため DS1 を点灯し 最初から同じ点灯パターンを繰り返す必要があります PIC18 のコードも同様ですが lslf の代わりに rlncf を使っています PIC18 PIC18 の場合は carry ビットがセットされていると複数の LED が同時に点灯してしまうため 常に carry ビットがクリアされている事を確認する必要があります DS41628B_JP - p Microchip Technology Inc.
67 レッスン 例 3-31: RotateLeft: bcf STATUS, C ;clear the carry rrcf LATC,f ;rotate the LEDs (through carry) and turn on the next LED to the right btfss STATUS,C ;did the bit rotate into the carry (i.e. was DS1 just lit?) bra MainLoop bsf LATC, 3 ;yes, it did and now start the sequence over again by turning on DS4 bcf STATUS, C ;clear the carry bra MainLoop ;repeat this program forever C 言語 両デバイス共通このコードでは グローバル変数を使っています ローカル変数とは異なり グローバル変数には関数のスコープがなく この変数を宣言したソースファイル内の全ての関数から呼び出す事ができます グローバル変数である事が分かるように 変数名の先頭にアンダースコア (_) を付ける等のコーディング作法を推奨します unsigned char _previous_state = SWITCH_UP; //global variable このバイト値は check_switch 関数で変更され その結果がメインループに返されます 例 3-32: void main(void) { unsigned char delay; unsigned char direction;... } unsigned char check_switch(void){..... } 変数 delay と direction が main の内側で宣言されている事に注意してください これらは main の外側では変更できません また check_switch からメインループへは char 型符号なしバイトが 1 つ返されます C では 1 つの変数しか返す事ができません 2015 Microchip Technology Inc. DS41628B_JP - p.67
68 3.9 レッスン 8: パルス幅変調 (PWM) レッスンの紹介 このレッスンは今までのレッスンとは直接関係しませんが 同じコーディング手法とこれまでに学んだ内容を使います このレッスンでは PIC MCU が生成する PWM 信号で LED を点灯させ その輝度をポテンショメータで制御します ハードウェアの動作 LED の輝度をポテンショメータで調整します 概要 PWM ( パルス幅変調 ) は完全 ON と完全 OFF の状態を切り換えながら負荷に電力を供給する仕組みです PWM 信号は矩形波に似ており 信号の High の部分が ON Low の部分が OFF です High の部分はパルス幅とも呼ばれ その時間の長さをステップ単位で変化させます High の ON 時間を長くすると LED の輝度が上がります PWM の周波数または周期は変化しません ステップ数を多くするとパルス幅が広くなり 負荷に供給される電力が増加します ステップ数を少なくするとパルス幅が狭くなり 負荷に供給される電力が減少します 1 サイクル全体 ( すなわち ON 時間と OFF 時間の合計 ) を PWM 周期といいます 1 回の PWM 周期に設定できる最大ステップ数を PWM 分解能といいます PWM 分解能が高いほどパルス幅の時間 すなわち負荷に供給される電力を細かく制御できます このレッスンのプログラムでは 設定可能な最大分解能 (10 ビット ) を使います PWM 周期全体に対する ON 時間の割合を % で表したものをデューティサイクルと呼び 0% なら完全 OFF 100% なら完全 ON を表します この場合 デューティサイクルの値が小さいほど負荷に供給される電力が少なく 値が大きいほど多くなります 新しく学ぶレジスタ 両デバイス共通 表 3-28: レジスタ CCPxCON PRx CCPTMRS CCPRxL TxCON 新しく学ぶ両デバイス共通のレジスタ目的キャプチャ / コンペア /PWM モジュールの設定 PWM 周期は Timer2/4/6 の PRx レジスタで指定します PWM で使うタイマモジュールを選択 PWM の上位 8 ビットタイマ制御レジスタ 上記の全レジスタ PIC16F1829 は 2 つの CCP モジュールを内蔵しており このレッスンでは CCP2 を使います PIC18F14K22 は 1 つの CCP モジュールを内蔵しており このレッスンではその CCP1 を使います 上記の各レジスタの詳細は データシートのキャプチャ / コンペア /PWM モジュールのセクションを参照してください このレッスンでは PWM モジュールの設定方法を簡単に説明します 図 3-8 に PWM の波形を示します DS41628B_JP - p Microchip Technology Inc.
69 レッスン 図 3-8: PWM の波形 Period Pulse Width TMRx = PRx TMRx = CCPRxH:CCPxCON<5:4> TMRx = 0 PWM 周期は PRx レジスタで指定します Timer2/4/6 を使って CCPRxH レジスタと CCPxCON レジスタの下位 2 ビットを連結した値と一致するまでカウントします CCPRxL は CCPRxH への書き込みに使います CCPRxL は読み書き可能なバッファと見なす事ができます CCPRxH は読み出し専用です タイマが PRx に一致すると 直後のインクリメントサイクルで以下の 3 つのイベントが実行されます 1. TMRx がクリアされる 2. CCPx ピンがセットされる 3. PWM デューティサイクルが CCPRxL から CCPRxH にラッチされる CCP モジュールを標準型 PWM 動作に設定するには 以下のステップを順番通りに実行します 1. PWM 生成に使うタイマ (Timer2/4/6) を CCPTMRS レジスタの CxTSEL<1:0> ビットで選択する 2. 対応する TRIS ビットをセットして CCPx ピン出力ドライバを無効にする 3. PRx レジスタに PWM 周期の値を書き込む 4. CCPxCON レジスタに適切な値を書き込んで CCP モジュールを PWM モードに設定する 5. CCPRxL レジスタと CCPxCON レジスタの DCxB ビットに PWM のデューティサイクル値を書き込む 6. Timer2/4/6 を設定して開始する a) PIRx レジスタの TMRxIF 割り込みフラグビットをクリアする b) TxCON レジスタの TxCKPS ビットでタイマのプリスケーラ値を設定する c) TxCON レジスタの TMRxON ビットをセットしてタイマを有効にする 7. PWM 出力ピンを有効にする このレッスンでは 周波数を 486 Hz とします 周波数を約 60 Hz 以上とすれば フリッカはほとんど気になりません 例 3-33: ;PWM Period = [PR2 + 1]*4*Tosc*T2CKPS = [255=6+ 1]*4*(1/500kHz) * 1 PWM 分解能も考慮する必要があります 式 3-3: PWM 分解能 log 4 PRx + 1 Resolution = log 2 bits このレッスンでは 以下の 2 つの条件を満たす必要があります ビットの分解能 2. LED のフリッカがない事 2015 Microchip Technology Inc. DS41628B_JP - p.69
70 どちらのデバイスも 拡張 PWM モジュールの機能を一部使っています PIC16 では CCP2 の P2A ピンが DS4 に直接接続されているため CCP モジュールを単一出力で動作させます PIC18 では CCP モジュールをフルブリッジモードで動作させ DS3 が接続された P1D を変調します 分解能は 8 ビットの PRx レジスタを最大値の 0xFF (255) に設定すると最大になります 下図は LED の輝度が低い場合の PWM 信号波形をオシロスコープで観測したものです これを見ると周期が約 2 ms パルス幅が数百 µs です 図 3-9: パルス幅 : 小 図 3-10 は ポテンショメータを時計方向へ 30% の位置まで回転した時の波形です 図 3-9 と比べると 周波数は同じでパルス幅が大きくなっているのが分かります 図 3-10: パルス幅 : 大 表 3-29: 命令英語名目的 andlw AND literal with WREG 値をマスクする DS41628B_JP - p Microchip Technology Inc.
71 レッスン アセンブリ エンハンストミッドレンジ 例 3-34: call A2d ;begin the Analog to Digital conversion ;ADRESH and ADRESL are now both full of the ADC result! movf ADRESH, w ;Get the top 8 MSbs (remember that the ADC result is LEFT justified!) banksel CCPR2L movwf CCPR2L これで A/D 変換結果の上位 8 ビットが PWM レジスタに格納されます この次の数行は コメントアウトしても実際の出力はほとんど変わりません これは 下位 2 ビットはデューティサイクル分解能にほとんど影響しないためです ただし完全を期すために このレッスンでは 10 ビット全てを使います 例 3-35: ;to fill all 10 bits of the duty cycle, the 2 LSbs will be put into the ;Duty Cycle Bits (DC2B) of the CCP2CON register which are bits 5 and 4. ;So we need to shift these LSb into place and OR them with CCP2CON ; in order to save the control settings above and fill these last bits in banksel ADRESL ;ADRESL = b'xx000000' where 'xx' are the 2 LSbs from the ;ADC result lsrf ADRESL, f ;ADRESL = b'0xx00000' lsrf ADRESL, f ;ADRESL = b'00xx0000' movf ADRESL, w ;now move into wreg banksel CCP2CON xorwf CCP2CON, w ;move the 2 LSbs into place without disturbing the rest of ;CCP2CON settings andlw B' ' xorwf CCP2CON, f bra MainLoop ;do this forever 例 3-35 では A/D 変換結果の下位 2 ビットを格納している ADRESL レジスタをシフトしています bit <5:0> は常にクリアされ bit <7:6> には A/D 変換結果の下位 2 ビットが格納されます このレジスタを右方向へ 2 回シフトして 変換結果の下位 2 ビットが bit <5:4> に格納されるようにしています シフトした結果は WREG ではなく ADRESL レジスタに書き戻しています 次の 3 つの命令は まず xorwf 命令を使って同じ値のビットをクリアして異なる値のビットをセットしています この結果を WREG に格納します 次の andlw 命令で WREG 内の全ての制御ビットをクリアし 最後の処理で値が変更されないようにしています 最後の worwf 命令は 変化したビットのみを変化させ それ以外のビットをそのまま維持しています この結果を CCP2CON レジスタに書き込みます movwf または iorwf 命令では初期化時の設定値を保持できないため 正しく動作しません PIC18 PIC18 では上記コードの lsrf 命令の代わりに rrncf 命令を使っています ただし rrcf 命令でも動作します C 言語新しく学ぶ内容はありません 2015 Microchip Technology Inc. DS41628B_JP - p.71
72 3.10 レッスン 9: Timer レッスンの紹介 このレッスンでは 3.4 レッスン 3: ローテート と同じ結果を出力します 唯一の違いは このレッスンでは遅延ルーチンに Timer0 を使うという事です ハードウェアの動作 レッスン 3 と同じで LED が右から左へローテートします 概要 Timer0 はプロセッサに内蔵されているカウンタです 命令サイクル または命令サイクル以下のレートで発生する外部イベントをカウントするために使います PIC18 の Timer0 は 8/16 ビットのカウンタまたはタイマとして使えます エンハンストミッドレンジコアは 8 ビットカウンタのみを実装しています このレッスンでは Timer0 で命令サイクルをカウントし ロールオーバーするとフラグをセットするように設定します こうすると 遅延ループで命令サイクルを無駄に消費する事がなく プロセッサはより有意義なタスクを実行できます カウンタを使うと プロセッサは命令サイクルをカウントする以外の処理を実行できるため 時間の計測または遅延ループを上手に実装できます 新しく学ぶレジスタ エンハンストミッドレンジ 表 3-30: OPTION_REG OPTION_REG このレジスタは Timer0 の設定以外にも 後のレッスンで使う弱プルアップ等いくつかの機能を制御します PIC18 新しく学ぶエンハンストミッドレンジのレジスタ レジスタ 目的 Timer0 弱プルアップ 割り込みの設定 表 3-31: T0CON 新しく学ぶ PIC18 のレジスタ レジスタ Timer0 の設定 目的 T0CON OPTION_REG レジスタ同様 T0CON レジスタにもプリスケーラ設定と Timer0 の割り当てに関するビットが含まれます エンハンストミッドレンジでは Timer0 は常に有効なため イネーブルビットはありません PIC18 では 弱プルアップと割り込みエッジの設定は別のレジスタで実行します TMR0 レジスタが 0xFF から 0x00 へオーバーフローすると Timer0 は割り込みを生成します (PIC18 では 8 ビットモードの場合 ) Timer0 割り込みの有効 / 無効に関わらず TMR0 レジスタがオーバーフローするたびに INTCON レジスタの TMR0IF 割り込みフラグビットがセットされます TMR0IF ビットはソフトウェアでのみクリアできます Timer0 割り込みを有効にするには INTCON レジスタの TMR0IE ビットをセットします DS41628B_JP - p Microchip Technology Inc.
73 レッスン アセンブリ PIC16 例 3-36: btfss INTCON, TMR0IF ;did TMR0 roll over yet? bra $-1 ;wait until TMR0 overflows and sets TMR0IF bcf INTCON, TMR0IF ;must clear flag in software ;rotate the LEDs... このプログラムの MainLoop ラベルでの処理は 単にタイマがオーバーフローするのを待っているだけです タイマがオーバーフローすると割り込みフラグをクリアして LED をシフトします このフラグはソフトウェアでクリアする必要があります レッスン 3 と比べるとこのレッスンのコードは行数が少なく 容易に理解できます タイマを使うと遅延ループを非常に簡単に実装でき 正確なタイミングを必要とするイベントに適しています PIC18 エンハンストミッドレンジとの違いは 初期化が若干異なるのと相対分岐で $-2 を使っている点のみです C 言語 新しく学ぶ内容はありません 2015 Microchip Technology Inc. DS41628B_JP - p.73
74 3.11 レッスン 10: 割り込みとプルアップ レッスンの紹介 このレッスンでは割り込みとその有用性について学びます また ほとんどの PIC MCU デバイスに内蔵されている弱プルアップについても説明します このレッスンはこれまでのレッスンを発展させたものですが 主にレッスン 9 と 3 をベースにしています ハードウェアの動作 LED が一定の速度でローテートし スイッチを押すと方向が反転します 概要 このレッスンでは割り込みと弱プルアップという 2 つの新しい概念を学びます 割り込み割り込み機能を使うと 特定のイベントが通常のプログラムフローに割り込む事ができます つまり マイクロコントローラが外部の状況を認識できるように設定できます 外部イベント発生時にルーチンを実行できます ファームウェアによって割り込み要因を判断し それに基づいて処理を実行します どの割り込みも MCU をスリープから復帰させるように設定できます ほとんどの周辺モジュールが割り込みを生成できます I/O ピンによっては 状態変化時に割り込みを生成するように設定できます 周辺モジュールがサービスの実行を要求する場合 そのモジュールの割り込みフラグをセットします 各モジュールの割り込みフラグビットとイネーブルビットを AND 演算し これを全ての周辺モジュールで OR 演算した結果をマスタ割り込みとします このマスタ割り込みとグローバル割り込みイネーブル (GIE) ビットを AND 演算します 各モジュールのイネーブルビットを使う事で 特定の周辺モジュールのみを割り込み要因に設定できます 詳細は 各 PIC MCU のデータシートで割り込みロジックの図を参照してください 以下に 簡単な図を示します 図 3-11: 割り込みフローの概要 Interrupt Flag Interrupt Enable Ms Global Interrupt Enable Other Interrupt Sources PIC18 の割り込み構造はやや異なり 割り込み優先度を設定できます エンハンストミッドレンジコアには割り込みベクタが 1 つしかありません つまり何らかの割り込みが発生すると プログラムカウンタはアドレス 0x0004 の割り込みサービスルーチンにジャンプします PIC18 では ほとんどの割り込み要因に対して高または低優先レベルを割り当てできます 高優先度ベクタアドレスは 0x0008 低優先度ベクタアドレスは 0x0018 です 高優先度割り込みイベントは 低優先度割り込み処理中でも割り込む事ができます このレッスンでは割り込み優先度は使いません その代わり IPEN ビットをクリアしてエンハンストミッドレンジと同等の割り込み機能を使います すなわち どちらのデバイスも 1 つのベクタからのみサービスを実行します 割り込み処理が始まるとグローバル割り込みイネーブル (GIE) ビットがクリアされ 以降の割り込みは無効になります 戻りアドレスがスタックにプッシュされ プログラムカウンタには割り込みベクタのアドレスが書き込まれます エンハンストミッ DS41628B_JP - p Microchip Technology Inc.
75 レッスン ドレンジと PIC18 MCU のどちらも WREG STATUS BSR レジスタのコンテクストを自動で待避します FSR レジスタと PCLATH レジスタは エンハンストミッドレンジデバイスの場合のみ自動で待避されます PIC18 でコンテクストを復元するには retfie, fast 命令を実行する必要があります 割り込みサービスルーチン (ISR) のファームウェアでは 割り込みフラグビットをポーリングして割り込み要因を判断します 同じ割り込み動作の繰り返しを避けるため ISR から抜ける前に割り込みフラグビットをクリアする必要があります ISR 実行中に発生する割り込みは全て割り込みフラグで記録されますが GIE ビットがクリアされているためretfie 命令を実行してGIEビットがセットされるまではプロセッサがその割り込みベクタにリダイレクトする事はありません 弱プルアップこのチュートリアルで使うエンハンストミッドレンジと PIC18 MCU はどちらも一部のピンで内部プルアップ抵抗を有効にできます これにより 外付けハードウェアの必要性が大幅に減少します 図 3-12: 弱プルアップの回路図 VDD SW1 R2 Irp Rpull-up RA2 To PIC MCU GND 図 3-12 に示したように 弱プルアップを有効にすると他の外部回路を RA2 に接続しなくてもピンは常に 1 として読み出されます この少ピン開発ボードは 抵抗がスイッチを経由してグランドに接続されています スイッチを押すと RA2 の電圧は VDD でなくなり 0 V ( グランド ) に近い値になります 電気的仕様にはプルアップ抵抗値ではなく電流値 Ipur を記載しています PIC16F1829 では この値は 140 µa (Typ.) です 電流がこの仕様上の代表値の場合 スイッチを閉じた時の RA2 の電圧は下式で求める事ができます 式 3-4: V = I * R VA3 = 140 * 10 6 * 2k = 28mV この抵抗を使ってもピンはすぐには VDD に達しないため 弱 プルアップと呼ばれます より強いプルアップの方が抵抗値が低く ピンはすぐに VDD に達します ピンの静電容量が大きい場合 PIC MCU 内部でピンの状態が論理 High になるまでには時間がかかります これは弱プルアップであるため 1 ~ 10k (typ.) の外付け抵抗を使ってこの内部設定を容易にオーバーライドし ピンの状態を変更できます 2015 Microchip Technology Inc. DS41628B_JP - p.75
76 新しく学ぶレジスタ 両デバイス共通 表 3-32: WPUA 新しく学ぶ両デバイス共通のレジスタレジスタ目的弱プルアップイネーブル PORTA の各ピンの内部プルアップ回路を個別に有効にする エンハンストミッドレンジ 表 3-33: レジスタ IOCAN IOCAF 新しく学ぶエンハンストミッドレンジのレジスタ目的 PORTA 立ち下がりエッジ状態変化割り込み PORTA 状態変化割り込みフラグ IOCAN/IOCAF PIC16F1829 は立ち上がりおよび立ち下がりエッジの状態変化割り込みを検出できます IOCAN レジスタには立ち下がりエッジ検出イネーブルビットがあり IOCAF レジスタには割り込みフラグビットがあります このレッスンでは IOCAN レジスタを使ってスイッチ入力を状態変化割り込みピンとして有効に設定しており 割り込みサービスルーチン内で IOCAF レジスタのフラグを全てクリアしています このレッスンでは状態変化割り込み機能を利用して RA2 の状態が High から Low へ遷移すると PIC MCU をアドレス 0x0004 ( 割り込みベクタ ) へジャンプさせます 図 3-13: 立ち上がり / 立ち下がりエッジ Rising Edge Falling Edge PIC18 表 3-34: 新しく学ぶ PIC18 のレジスタ レジスタ IOCA PORTA 状態変化割り込み ( 両エッジ ) RCON 割り込み要因の検出 IOCA PIC18F14K22 の状態変化割り込みには立ち上がりエッジと立ち下がりエッジの区別はなく 1 つのビットで両方の検出が有効になります どちらのエッジが発生したかを判定するために より多くのコード行が必要です RCON RCON レジスタには PIC MCU のリセット要因を検出するためのビットと優先割り込みイネーブルビットがあります このレッスンでは このレジスタを使って優先割り込みを無効にしています 目的 DS41628B_JP - p Microchip Technology Inc.
77 レッスン 新しく学ぶ命令 両デバイス共通 表 3-35: RETFIE retfie 命令は 割り込み前に実行していたアドレスをスタックからポップし GIE ビットをセットして ISR を終了します PIC18 では 待避したコンテクストを復元するには retfie, fast 命令を実行する必要があります エンハンストミッドレンジにはこの区別はありません アセンブリ 両デバイス共通 新しく学ぶ両デバイス共通の命令 命令英語名目的 retfie Return from interrupt 通常のプログラム実行に戻る 例 3-37: MainLoop: bra MainLoop ;can spend rest of time doing something critical here 割り込みを使うと メインループは数値演算や LCD への書き込み等 他の処理に命令サイクルを費やす事ができます これまでのレッスンのように プログラムはフラグがセットされるのを待たずに処理を継続できます ただし このサンプルコードは割り込みを待つ間何も処理を実行せず MainLoop への分岐を無限に繰り返すだけです エンハンストミッドレンジ 例 3-38: Org 0x0 ;Reset Vector starts at 0x0000 bra Start ;main code execution ORG 0x0004 ;Interrupt Vector starts at address 0x0004 goto ISR これで割り込みサービスルーチンへジャンプします 割り込みベクタアドレスの直後に goto 文がある事に注意してください 例 3-39: ;Enter here if an interrupt has occurred ;First, check what caused the interrupt by checking the ISR flags ;This lesson only has 2 flags to check ISR: banksel IOCAF ;bank7 btfsc IOCAF, 3 ;check the interrupt-on-change flag bra Service_SW1 ;switch was pressed bra Service_TMR0 ;Timer0 overflowed 割り込みサービスルーチンの中で 割り込み要因を調べています 割り込み要因が分かったら その割り込みに応じた分岐先で割り込みフラグをクリアして 割り込みサービスルーチンから抜けられるようにしています retfie 命令を実行すると 待避したコンテクストを復元して GIE ビットを再びセットして割り込みサービスルーチンを抜け 割り込み発生時に実行していた命令の次の命令へ戻ります 2015 Microchip Technology Inc. DS41628B_JP - p.77
78 例 3-40: #ifdef PULL_UPS banksel WPUA bsf WPUA, 2 ;enable the weak pull-up for the switch banksel OPTION_REG bcf OPTION_REG, NOT_WPUEN ;enable the global weak pull-up bit ;this bit is active HIGH, meaning it must be cleared for it to be enabled #endif #ifdef は ディレクティブ ( ここでは PULL_UPS) が定義済みかどうかを調べるプリプロセッサ擬似命令です 定義済みであった場合 #ifdef と #endif の間のコードがアセンブルされます この 2 行でピン RA2 の弱プルアップ抵抗を有効にします PIC18 PIC18 は立ち上がりエッジと立ち下がりエッジを区別しません 従って レッスン 7 と同じデバウンスルーチンとフローチャートを使います ( 図 3-6) 例 3-41: Org 0x0000 ;Reset Vector starts at 0x0000 bra Start ;main code execution Org 0x0008 goto ISR ;High Priority Interrupt Vector starts at address 0x0008 優先割り込みを無効にすると 全ての割り込み発生時にアドレス 0x0008 の割り込みサービスルーチンが実行されます 例 3-42: #ifdef PULL_UPS bsf WPUA, 2 ;enable the weak pull-up for the switch bcf INTCON2, NOT_RABPU ;enable the global weak pull-up bit ;this bit is active HIGH, meaning it must be cleared for it to be enabled #endif レジスタ名とビット名がやや異なる以外 PIC16 と同じです C 言語 エンハンストミッドレンジコアは 1 つしか割り込みベクタを定義できません 割り込みベクタを定義するには interrupt キーワードを使って関数を作成します void interrupt ISR(void) この名前は ISR 専用の予約語です PIC18 は割り込みベクタを 2 つ定義できますが このレッスンでは上記の 1 つしか使いません DS41628B_JP - p Microchip Technology Inc.
79 レッスン 3.12 レッスン 11: 間接アドレス指定 レッスンの紹介 このレッスンでは 間接アドレス指定という非常に重要なトピックを学びます このコードは間接アドレス指定を使って移動平均フィルタを実装しています このレッスンでは レッスン 4 の A/D 変換のコードに移動平均フィルタを追加します 移動平均では 直近 n 個の A/D 変換結果をリストとして保持し その平均値を求めます このフィルタには 循環キューと平均値を求める関数の 2 つが必要です ポテンショメータを回すと A/D 変換結果の値が変化します この値に移動平均フィルタを適用した値を LED に出力して表示します このフィルタは最新 8 個の A/D 変換結果の平均値を求めます サンプル数を 2 のべき乗とすると 汎用の除算ルーチンではなくローテート命令を使って簡単に除算が使えます また 8 個の A/D 変換結果の値を毎回合計するのではなく キューを使って最も古い値を引き 最も新しい値を足した方が処理が高速です 図 3-14: 間接アドレス指定による移動平均 ハードウェアの動作 このレッスンの出力はレッスン 4 と同じです ポテンショメータを回転すると LED の表示が変化します A/D 変換結果の上位 4 ビットの状態が LED に反映されます 概要 プログラムメモリのアドレスはプログラムカウンタでしか指定できませんが データメモリ空間のアドレスはいくつかの方法で指定できます ほとんどの命令はアドレス指定モードが固定されています しかし一部の命令では どのオペランドを使うか拡張命令セットを使うかどうかに応じて 最大 3 つのモードでアドレスを指定できます 2015 Microchip Technology Inc. DS41628B_JP - p.79
80 アドレス指定モードには以下の種類があります 1. 含意 2. リテラル 3. 直接 4. 間接 含意およびリテラル PIC MCU の制御命令の多くは引数を必要としません これらの命令はデバイス全体に影響する処理を実行するか 1 つのレジスタに暗黙的に処理を実行するかのどちらかです このようなアドレス指定モードを含意アドレス指定と呼びます 例として EEPROM のレッスンで使う SLEEP および RESET 命令があります 似たような動作の命令で オペコードに明示的な引数をとるものがあります このように何らかのリテラル値を引数として必要とするものをリテラルアドレス指定モードと呼びます 例として addlw movlb call goto 命令があります 直接アドレス指定直接アドレス指定では 演算のソースアドレスおよび結果の格納先アドレス ( またはそのどちらか一方 ) の アドレス全体またはその一部をオペコードの中で指定します オプションは命令の引数として指定します PIC MCU のコア命令セットでは ビット / バイト指向命令が既定値で直接アドレス指定を使います これらの命令は いずれも下位バイトに 7 ビット (PIC18 では 8 ビット ) のリテラルアドレスを含みます このアドレスは データ RAM のいずれかのバンクにおけるレジスタアドレスか アクセスバンク (PIC18 を使う場合 ) 内の位置を表し 命令のデータソースとして参照されます 演算結果の格納先は 格納先ビット d によって決まります d が 1 の場合 結果はソースレジスタに上書きの形で書き戻されます d が 0 の場合 結果は W レジスタに格納されます 間接アドレス指定間接アドレス指定では 命令内で固定アドレスを指定しなくてもデータメモリ内のアドレスにアクセスできます この場合 読み書き対象のメモリアドレスへのポインタとしてファイルセレクトレジスタ (FSR) を使います FSR 自体も特殊ファイルレジスタとして RAM 内に存在するため プログラム制御で直接操作できます このため FSR はデータメモリ内にテーブルや配列等のデータ構造を実装する時に非常に便利です 間接アドレス指定で使うレジスタとして 間接ファイルオペランド (INDF) も実装されています このオペランドを使って ポインタ値の自動インクリメント 自動デクリメント 別の値によるオフセットの操作を自動で実行できます INDFn レジスタは物理的なレジスタではありません これらは SFR 空間にマッピングされていますが物理的には実装されておらず 仮想 レジスタと見なす事ができます 特定の INDF レジスタに対する読み書きは 実際には対応する FSR レジスタペアへのアクセスです 例えばINDF1からの読み出しの場合 データはFSR1H:FSR1L が示すアドレスから読み出されます DS41628B_JP - p Microchip Technology Inc.
81 レッスン 新しく学ぶレジスタ 両デバイス共通 表 3-36: INDFx FSRx 新しく学ぶ両デバイス共通のレジスタレジスタ目的仮想的な間接レジスタ仮想レジスタのターゲットアドレスを格納 INDFx/FSRx PIC18 とエンハンストミッドレンジコアのどちらも間接アドレス指定ではアドレスレンジ全体を使うため データ RAM のバンク切り換えは不要です PIC18 の FSR レジスタは 12 ビットアドレスを構成し エンハンストミッドレンジの FSR レジスタは 16 ビットアドレスを構成します つまり PIC18 の FSR ではデータメモリ全体へのアクセスが可能で エンハンストミッドレンジの FSR では読み出し専用のプログラムメモリを含むメモリバンク全体へのアクセスが可能です 図 3-15: エンハンストミッドレンジの間接 / 直接アドレス指定 Direct Addressing Indirect Addressing 4 BSR 0 6 From Opcode 0 7 FSRxH FSRxL 0 Bank Select Location Select Bank Select x00 Location Select 0x7F Bank 0 Bank 1 Bank 2 Bank 新しく学ぶ命令 両デバイス共通 表 3-37: 新しく学ぶ両デバイス共通の命令 命令 英語名 目的 incf Increment f 現在の値に 1 を加算する INCF 指定したファイルレジスタの値に 1 を加算します 2015 Microchip Technology Inc. DS41628B_JP - p.81
82 アセンブリ言語 両デバイス共通 例 3-43: FilterInit: movlw low Queue ;point to the Queue holding the ADC values movwf FSR0L movlw high Queue movwf FSR0H これで FSR0 は Queue のアドレスを指し示します 図 3-16 で図 3-43 のコードを説明します ページ境界を超えてプログラムメモリのアドレスを指定できるように FSR0 は 2 バイト幅である事に注意してください 図 3-16: FilterInit 呼び出し前 FSR0L:FSR0H Address: 0x004:0x005 Value:?????? INDF0 Queue [7] Address:0x0054 Value[0]: d 15 Address:0x000 Value:?????? 図 3-17: FilterInit 呼び出し後 FSR0L:FSR0H Address: 0x004:0x005 Value:0x0054 INDF0 Queue [7] Address:0x0054 Value[0]: d 15 Address:0x000 Value: d 15 FilterInit を呼び出すと FSR0レジスタはキューの最初のバイトを指し示します これで INDF0 レジスタの読み書きが可能になります INDF0 レジスタの値を変更すると FSR0 レジスタが指し示すアドレスのレジスタの値が変更されます FSR0 をインクリメントすると Queue レジスタの次のバイトを指し示します この例では これは 2 回目の A/D 変換結果です rrcf RunningSum,w ; divide by 2 and copy to a version we can corrupt 右方向へ 1 ビットローテートまたはシフトすると 値を簡単に 2 で割る事ができます DS41628B_JP - p Microchip Technology Inc.
83 レッスン 式 3-5: 右ローテート前 : b' '= d'10' 右ローテート後 :b' '= d'5' C 言語 例 3-44: while (1) { ptr_queue = &queue; 両デバイス共通 PIC16/PIC18 の INDF/FSR ペアと同じ働きを C ではポインタを使って実装しています アセンブリコード同様 メインループの最初にポインタの参照先をキューの最初のバイトに設定してポインタをリセットしています 次に A/D 変換結果を取得してキューに保存します 次に LATC にキューの平均値を代入します このキューは 8 バイト幅であるため A/D 変換結果のサンプルを 8 個格納できます ( 変換結果の下位 2 ビットは保存しません ) 例 3-45: unsigned char average(unsigned char *ptr) { unsigned char adc_value; //point to the first byte in this array (RESET the pointer) for (i = NUM_READINGS; i!= 0; i--){ LATC = (average(ptr_queue) >> 4 ); //only want the 4 MSbs for 4 LEDs ptr_queue++; } _sum -= *ptr; //subtract the current value out of the sum adc_value = adc(); *ptr = adc_value; //assign ADC value to the queue _sum += adc_value; //add to the sum return (_sum/num_readings); //compute the average 関数 average はキューへのポインタをパラメータとして持ちます _sum はグローバル変数のため この関数の外側でも値を保持します 移動合計から現在値を引きます アスタリスク (*) は間接演算子で ポインタの参照先の値を使う事を意味します 新しい A/D 変換結果を取得し 移動合計とキューに追加します 次に 関数 average の戻り値がメインループに返され シフトした値が LED に表示されます ウェブには C 言語のポインタについて解説したサイトが多くあります 詳細は それらのサイトを参照してください 2015 Microchip Technology Inc. DS41628B_JP - p.83
84 3.13 レッスン 12: ルックアップテーブル レッスンの紹介 ある値を別の値に変換する際 テーブルを実装すると便利な事があります 高級言語で表すと これは以下のように表す事ができます 式 3-6: y = function(x); これは x の値が変化すると一意に対応する y の値が関数によって返される事を意味します ルックアップテーブルを使うと 入力値を意味のあるデータに迅速に変換できます これは 伝達関数が事前に計算済みであり その場で計算するのではなく ルックアップ ( 参照 ) するだけで良いためです 16 進数の値を ASCII 値に変換する関数は こうした例の 1 つです ルックアップテーブルの大きな利点は 容量に制約のある RAM 空間ではなく大容量のフラッシュメモリに定数値を格納できるという事です これによりプログラムの柔軟性が向上し プログラムで利用できるメモリ容量が拡大します ハードウェアの動作 ポテンショメータを回すと A/D 変換結果の 2 進数をグレイコードに変化した値が LED に表示されます 概要 このレッスンでは プログラムメモリにアクセスする複数の方法を学びます 簡単なテーブルを使って通常の 2 進数をグレイコードに変換します グレイコードは エンコーダアプリケーションで急激な状態変化を避けるためによく使われます 一般的な 2 進エンコーダは不透明な回転盤にスリットを設け 光センサで値を読み取ります この場合 ビット位置によってしきい値レベルが異なるため各ビットの変化するタイミングがわずかに異なり 一時的に不正な結果が得られる事があります グレイコードは 1 回の状態変化で必ず 1 ビットしか変化しないため 不正な遷移を防ぐ事ができます 現在のコードは次のコードに遷移するまで正しいままです 2 進数とグレイコードを相互に変換するアルゴリズムは かなり複雑です このため ビット数が少ない場合はルックアップテーブルを使った方がコードサイズが小さく高速に処理できます 新しく学ぶレジスタ 両デバイス共通 表 3-38: レジスタ PCL PCLATH 新しく学ぶ両デバイス共通のレジスタ プログラムカウンタはバイト単位でプログラムメモリのアドレスを指定します 前述の通り プログラムカウンタのサイズはエンハンストミッドレンジが 15 ビット PIC18 が 21 ビットです ただし オフセットの実装はどちらのデバイスもよく似ています PCL PCL レジスタと呼ばれる下位バイトは読み書き可能です 上位バイトの PCH レジスタは 直接読み書きできません PCH レジスタは PCLATH レジスタを介して更新します 目的 プログラムカウンタ (PC) の下位バイト プログラムカウンタ上位 7 ビット (PIC18 の場合は 8 ビット ) の書き込みバッファ DS41628B_JP - p Microchip Technology Inc.
85 レッスン PIC18 のプログラムカウンタには PCU と呼ばれるレジスタもあります このレジスタには PIC18 の PC<20:16> ビットが含まれ PCH と同様に直接読み書きできません PCU レジスタは PCLATU レジスタを介して更新します PCLATH PCL への書き込み動作を実行するたびに PCLATH( および PIC18 の場合は PCLATU) の内容がプログラムカウンタに転送されます 同様に PCL からの読み出し動作を実行するたびにプログラムカウンタの上位バイトが PCLATH ( および PIC18 の場合は PCLATU) に転送されます これは PC のオフセットを計算で求める場合に便利で このレッスンでもこの機能を使っています PIC18 では プログラムメモリ内の連続する命令を順番にアドレス指定する場合 プログラムカウンタは 2 ずつインクリメントします エンハンストミッドレンジコアでは PC は 1 つずつインクリメントします これまでのレッスンで学んだアセンブリコードで ドル記号 ($) とオフセットリテラルを組み合わせた記述がありました エンハンストミッドレンジコアのアセンブリでは $-1 としてプログラムメモリの 1 つ前の有効なプログラム命令に戻ります これに対し PIC18 は $-2 を使います 図 3-18: エンハンストミッドレンジコアのプログラムカウンタへの 5 種類の書き込み方法 2015 Microchip Technology Inc. DS41628B_JP - p.85
86 新しく学ぶレジスタ エンハンストミッドレンジ 表 3-39: レジスタ EEADRx EEDATx EECON1 新しく学ぶエンハンストミッドレンジのレジスタ目的プログラムメモリまたは EEPROM メモリの読み書き先アドレス 14 ビットの読み書きデータを格納する 2 バイトワードメモリアクセス制御用レジスタ フラッシュプログラムメモリは通常の動作中も書き込み可能です 一般に これを 自己書き換えコード または 自己書き込み と呼びます これが可能なのは 改良型ハーバードアーキテクチャを実装しているためです EEADRx/EEDATx プログラムメモリブロックへアクセスする場合 EEDATH:EEDATL レジスタペアの 2 バイトワードに読み書き用の 14 ビットデータを格納し EEADRH:EEADRL レジスタペアの 2 バイトワードにプログラムメモリのアクセス先の 15 ビットアドレスを格納します EECON1 プログラムメモリにアクセスするかデータメモリにアクセスするかを EEPGD 制御ビットで決定します このビットをクリアした場合 その後の動作は全て EEPROM メモリに対して実行されます このビットをセットした場合 その後の動作は全てプログラムメモリに対して実行されます リセット時の既定値では EEPROM が選択されます RD 制御ビットと WR 制御ビットで それぞれ読み出しと書き込みを開始します これらのビットは ソフトウェアではセットのみ可能でクリアはできません 読み出しまたは書き込み操作が完了すると ハードウェアでクリアされます WR ビットをソフトウェアでクリアできないようにする事で 書き込み動作が誤って中断されるのを防いでいます WREN ビットをセットすると 書き込み動作が許可されます WREN ビットは 電源投入時にクリアされます PIC18 表 3-40: レジスタ TBLPTR TABLAT 新しく学ぶ PIC18 のレジスタ目的プログラム空間内の 1 バイトのアドレスを指し示すポインタプログラム空間からの 8 ビットデータを格納 TBLPTR テーブルポインタ (TBLPTR) はプログラム空間内の 1バイトのアドレスを指し示します TBLRD を実行すると TBLPTR が指すバイトが TABLAT に格納されます TBLPTR の値を自動的に変更して次のテーブル読み出しを実行する事もできます TBLPTR は 3 つの SFR レジスタで構成されます テーブルポインタ最上位バイト テーブルポインタ上位バイト テーブルポインタ下位バイト (TBLPTRU:TBLPTRH:TBLPTRL) の 3 つです これら 3 つを結合して 22 ビット幅のポインタを構成します TABLAT テーブルラッチ (TABLAT) は SFR 空間にマッピングされた 8 ビットのレジスタです TABLAT レジスタは プログラムメモリとデータ RAM 間でデータを転送する時に 8ビットのデータを保持します DS41628B_JP - p Microchip Technology Inc.
87 レッスン 新しく学ぶ命令 両デバイス共通 表 3-41: retlw 命令ワードで指定した 8 ビットのリテラル値を WREG レジスタに書き込みます プログラムカウンタには TOS ( リターンアドレス ) が書き込まれます 先に述べたように PIC MCU は改良型ハーバードアーキテクチャを採用しています 改良型とは 命令メモリの内容をあたかもデータであるかのようにアクセスできる事を意味しています エンハンストミッドレンジ moviw この命令は WREG と間接レジスタ (INDFn) の間のデータ移動に使います この動作の前後では プリ ( ポスト ) インクリメント / デクリメントでポインタ (FSRn) がアップデートされます 前述の通り INDFn レジスタは物理的なレジスタではありません INDFn レジスタにアクセスする命令は 実際には FSRn で指定したアドレスにあるレジスタ値にアクセスしています FSRn のレンジは 0000h ~ FFFFh です インクリメント / デクリメントによってこのレンジを超えると ラップアラウンドが発生します brw 相対分岐の brw 命令は プログラムカウンタにオフセット値を加算します brw 命令により 再配置可能コードとページ境界をまたぐコードが可能です この命令はプログラムカウンタに WREG ( 符号なし ) の内容を加算します プログラムカウンタは次の命令をフェッチするためにインクリメントしているため 新しいアドレスは PC (WREG) となります この命令を使う場合 プログラムメモリの境界をまたぐかどうかを気にする必要はありません PIC18 新しく学ぶ両デバイス共通の命令 命令英語名目的 retlw Return with literal in WREG テーブルルックアップ 表 3-42: 新しく学ぶエンハンストミッドレンジの命令 命令英語名目的 moviw Move INDFx to WREG インクリメント / デクリメント付きの movlw brw Relative Branch with WREG ローカルジャンプテーブル 表 3-43: 新しく学ぶ PIC18 の命令 命令英語名目的 tblrd* Table Read テーブルを参照してしてデータを取得 tblrd この命令は プログラムメモリの内容を読み出す際に使います プログラムメモリのアドレスは テーブルポインタと呼ばれる 3 バイトのポインタを使って指定します tblrd* 命令を実行する前にテーブルポインタの 3 バイト全てを設定しておく必要があります 2015 Microchip Technology Inc. DS41628B_JP - p.87
88 図 3-19: テーブルポインタを使った 1 バイトのデータ読み出し ( 結果は TABLAT に格納 ) Note 1: テーブルポインタレジスタはプログラムメモリ内の 1 バイトを指します アセンブリ言語 エンハンストミッドレンジプログラムメモリの定数へアクセスする方法は 3 つあります 1. 計算型 GOTO 2. 間接アドレス指定 3. テーブル読み出しこのコードでは 以下の方法による 3 種類の実装を示しています 1. 計算型 GOTO a) プログラムカウンタ b) BRW 命令 2. 間接アドレス指定 a) FSR/INDF 3. テーブル読み出し a) EECON/EEDAT/EEADR SFR 3 番目の方法は 14 ビットのプログラムメモリワード全体を返しますが 最初の 2 つの方法は 8 ビットバイトしか返しません このレッスンではこれら 3 つの方法を全て紹介しますが 3 番目の方法では取得したデータは下位 8 ビットしか使いません プログラムカウンタルックアップテーブルの呼び出しでは テーブルが 256 バイトのページ境界をまたぐ場合 またはテーブルへのインデックスがテーブル境界を越える場合 テーブル以外のアドレスへジャンプするという制約があります そこで このレッスンのコードにはいくつかの命令を追加しています まず このテーブルは 16 エントリしかないため 16 より大きい値を渡さないようにしています これを最も簡単に行うには PCL を書き換える前に WREG の内容に対して以下のように AND 演算を実行します ANDLW 0x0F アプリケーションによっては より複雑なエラー回復方式の方が適切な事があります また テーブルが 256 ワード境界をまたぐ場合についても注意が必要です プログラムカウンタは 15 ビット幅ですが PCL には下位 8 ビットしか格納されません 残りの7ビットは PCLATH に格納されます しかし下位 8 ビットがオーバーフローしても DS41628B_JP - p Microchip Technology Inc.
89 レッスン 自動的には PCLATH にキャリーオーバーしません このため テーブルオフセットの加算直後に STATUS レジスタのキャリーフラグをチェックして 必要に応じて PCLATH を変更する必要があります 例 3-46: ;Using the Program Counter (PC) directly movlw high TableStart ; get high order part of the beginning of the table movwf PCLATH movlw low TableStart ; load starting address of table addwf temp,w ; add offset from ADC conversion btfsc STATUS,C ; did it overflow? incf PCLATH,f ; yes: increment PCLATH movwf PCL ; modify PCL brw 命令 WREG に A/D 変換結果を格納すれば 上の方法よりも間接的な方法でプログラムカウンタを変更できます プログラムカウンタに WREG の値をオフセットとして加算します テーブルのサイズが小さい場合はこの方法が最も効率的です 例 3-47: EnhancedMethod: brw ;jumps ahead by the amount currently in wreg TableStart: retlw b'0000' ; 0 例 3-48: movlw movwf movlw 間接アドレス指定この例では FSRx/INDFx レジスタペアを使う方法も適しています ルックアップテーブルのサイズが大きい場合はこの方法を推奨します 下記のコードでは まずグレイコードテーブルの開始アドレスを読み込みます 次に A/D 変換結果の値をオフセットとして FSR0 に加算します これで FSR0 は対応するグレイコード値を指し示します high TableStart ; get high order part of the beginning of the table FSR0H low TableStart ; get lower order part of the table addwf temp, w ; add offset from ADC conversion btfsc STATUS, C ; did it overflow? incf FSR0H, f ; yes: increment high byte movwf FSR0L ; modify lower byte moviw FSR0++ ; move the value that FSR0 is pointing to into wreg return ; grey code now in wreg, return to MainLoop テーブル読み出しこの方法は フラッシュプログラムメモリの読み出し / 書き込み専用の特別な SFR を使います プログラムメモリへの書き込みは複雑で制約がありますが プログラムメモリからの読み出しは簡単です 2015 Microchip Technology Inc. DS41628B_JP - p.89
90 例 3-49: banksel EEADRL ; bank 3 movlw high TableStart ; movwf EEADRH ; Store MSb of address movlw low TableStart ; addwf temp, w btfsc STATUS, C incf EEADRH, f movwf EEADRL ; Store LSb of address bcf EECON1, CFGS ; Do not select Configuration Space bsf EECON1, EEPGD ; Select Program Memory bcf INTCON, GIE ; Disable interrupts bsf EECON1, RD ; Initiate read nop ; Executed nop ; Ignored bsf INTCON, GIE ; Restore interrupts movf EEDATL, w ; Get LSb of word return ;movwf PROG_DATA_LO ; Store in user location ;movf EEDATH,W ; Get MSb of word ;movwf PROG_DATA_HI ; Store in user location このコードはプログラムメモリから 1 バイトを読み出します 下位 8 ビットのみを使います まず テーブルの上位アドレスを EEADRH レジスタに書き込みます 下位アドレスを EEADRL レジスタに書き込む前に A/D 変換結果の値をオフセットとしてアドレスに加算します これは 下位アドレスにオフセットを加算した時のオーバーフロー (255->0) を確実に検出するためです PIC18 PIC18 では プログラムメモリの定数へアクセスする方法が 2 つあります 1. 計算型 GOTO 2. テーブル読み出しこのコードでは 以下の方法による 2 種類の実装を示しています 1. 計算型 GOTO プログラムカウンタ 2. テーブル読み出し tblrd 命令また PIC18 でも EECON/EEDAT/EEADR SFR を使ってテーブル読み出しを実行できます 詳細は エンハンストミッドレンジコアのアセンブリでの実装を参照してください プログラムメモリを読み書きするには プログラムメモリ空間とデータ RAM の間でプロセッサがデータバイトを移動できる命令が 2 つあります テーブル読み出し (tblrd) テーブル書き込み (tblwt) このレッスンではテーブル読み出しを実行するため tblrd 命令を使います プログラムメモリ空間は 16 ビット幅であるのに対し データ RAM 空間は 8 ビット幅です テーブル読み書きは 8 ビットのレジスタ (TABLAT) を介して これら 2 つのメモリ空間の間でデータを移動します テーブル読み出しでは1バイトのデータをプログラムメモリから直接取得し TABLAT レジスタに格納します DS41628B_JP - p Microchip Technology Inc.
91 レッスン プログラムカウンタエンハンストミッドレンジコアの実装とほぼ同じですが PCLATU を使って 21 ビット全体にアクセスしている事 そして A/D 変換結果に 2 を掛けている事が異なります これは PIC18 の 16 ビット命令をバイト単位でアドレス指定するには偶数アドレスを指定する必要があるためです 例 3-50: ;Using the Program Counter (PC) directly movlw upper TableStart ; move upper part movwf PCLATU movlw high TableStart ; get high order part of the beginning of the table movwf PCLATH movlw low TableStart ; load starting address of table rlcf temp, f ; multiply by 2 by shifting to the left (remember that the PIC18 has 16bit program counter) addwf temp,w ; add offset from ADC conversion btfsc STATUS,C ; did it overflow? incf PCLATH,f ; yes: increment PCLATH movwf PCL ; modify PCL テーブル読み出しこのコードはプログラムカウンタを使った上記のコードと同じですが プログラムカウンタを直接使うのではなく TBLPTR レジスタを使っている点が異なります また A/D 変換結果を格納している一時レジスタに 2 を掛けています これが必要なのは プログラムワードの下位バイトにデータを保存している場合のみです データをバイトとして保存している場合 プログラムメモリはバイト単位でアドレス指定できるため 2 を掛けなくてもテーブルにアクセスできます 左方向へ 1 回ローテートすると 2 倍になり 右方向へ 1 回ローテートすると 1/2 になります 例 3-51: movlw upper TableStart ; Load TBLPTR with the base movwf TBLPTRU ; address of the word movlw high TableStart movwf TBLPTRH movlw low TableStart rlcf temp, f ;multiply by 2 by shifting to the left addwf temp, w btfsc STATUS, C incf TBLPTRH, f movwf TBLPTRL 適切に設定ができたら 読み出しを実行します 例 3-52: READ_WORD: tblrd* movf return ; read into TABLAT TABLAT, w ; get data これで WREG にグレイコードを格納して処理がメインループに戻ります C 言語 両デバイス共通他のレッスン同様 C コードの方が理解しやすく 可読性もはるかに優れます 2015 Microchip Technology Inc. DS41628B_JP - p.91
92 ルックアップテーブルは 配列を作成して定数として宣言する事で実装しています こうすると コンパイラはデータ空間ではなくプログラム空間にテーブルを配置します 例 3-53: const unsigned char gray_code[] = { //lookup table for binary->gray code 0b0000,0b0001,0b0011,0b0010,0b0110, 0b0111,0b0101,0b0100,0b1100,0b1101, 0b1111,0b1110,0b1010,0b1011,0b1001, 0b10000 }; 図 3-20: PIC18 MCU の場合 コンパイラは char 型をバイトとして認識し 1 プログラムメモリワードにつき 2 つのバイトアドレス指定可能なデータポイントを割り当てます この const キーワードを省略した場合 データ空間には以下のような違いが生じます 定数として宣言した場合 Memory Summary: Program space used 7Eh ( 126) of 4000h bytes ( 0.8%) Data space used 1h ( 1) of 1A0h bytes ( 0.2%) 図 3-21: 定数として宣言しない場合 Memory Summary: Program space used 9Ch ( 156) of 4000h bytes ( 1.0%) Data space used 11h ( 17) of 1A0h bytes ( 4.1%) const キーワードを省略するとコンパイラはこれらのバイトをデータ空間に配置するため データ空間の使用量が 16 バイト多くなっています キーワードを付けた場合 RAM は 1 バイトしか使っていません この 1 バイトは main 関数で使われる adc_value (A/D 変換結果の上位 8 ビットを格納する変数 ) に使われます データメモリよりプログラムメモリの方が容量が大きい事に注目してください 16 バイトの RAM はデータ空間全体の 4% に相当しますが この配列をフラッシュに格納しても使用量は 0.2% しか増加しません メインループでは A/D 変換結果の値を配列へのオフセットとして使い 等価なグレイコードを返しています 例 3-54: while(1){ adc_value = adc(); //get the ADC value from the POT adc_value >> = 4; //save only the top 4 MSbs LATC = gray_code[adc_value]; //convert to Gray Code and display on the LEDs } DS41628B_JP - p Microchip Technology Inc.
93 レッスン 3.14 レッスン 13:EEPROM レッスンの紹介 このレッスンでは 内蔵 EEPROM に対して 1 バイトを読み書きするコードを紹介します EEPROM は不揮発性メモリで 電源を OFF にしても値が失われません これに対し RAM は電源を OFF にすると値が失われます EEPROM は 電源を OFF にしても変数の値を保持する必要がある場合に使います また RAM 容量が足りない場合にも EEPROM を使う事ができます PIC16F1829 と PIC18F14K22 はどちらも 256 バイトの EEPROM を内蔵しています EEPROM への読み書きは比較的高速で プログラムメモリに対する読み書きよりもはるかに高速です ハードウェアの動作 スイッチを押すと LED パターンが保存されます その後 電源をいったん OFF にします 次に電源を ON にすると プログラムが開始して同じ LED パターンが点灯します 概要 このレッスンのコードを最初に書き込んだ時点では ポテンショメータを回しても LED は点灯しません スイッチを押すと その時点での A/D 変換結果に対応する LED が点灯し もう一度スイッチを押すまで PIC MCU はスリープに移行します スイッチを押すたびに A/D 変換結果の値が EEPROM に保存されます PIC MCU は割り込みを使ってスリープから復帰し A/D 変換結果を取得して EEPROM に保存し 再びスリープに移行します 図 3-22: プログラムのフロー Init Read EEPROM and move data onto LEDs Sleep Check if ADC result is 0 Switch pressed/released Not down Debounce Still down Take ADC reading and move it onto LEDs Write ADC value to EEPROM 2015 Microchip Technology Inc. DS41628B_JP - p.93
94 新しく学ぶレジスタ 両デバイス共通 表 3-44: EECON2 レジスタ 新しく学ぶ両デバイス共通のレジスタ 目的 EEPROM 書き込みに必要なシーケンスを実行する EECON2 EEPROM に書き込むには EECON2 レジスタに対して特別なシーケンスを実行する必要があります このレジスタは EEPROM 書き込み以外の用途には使いません 新しく学ぶ命令 両デバイス共通 表 3-45: Sleep SLEEP 命令を実行すると オシレータが停止してプロセッサはスリープモードに移行 します スリープ中 プロセッサの消費電流は最小限 (µa オーダ ) に抑えられます スリープ中も 一部の周辺モジュールと割り込みは動作を継続します スリープに移行したデバイスの状態は 以下の通りです 1. CPU クロックが無効化される khz LFINTOSC は影響を受けない このオシレータで動作する周辺モジュー ルは スリープ中も動作を継続できる 3. Timer1 の外部オシレータは影響を受けない このオシレータで動作する周辺モ ジュールは スリープ中も動作を継続できる 4. 専用の FRC クロックを選択している場合 ADC は影響を受けない 5. I/O ポートは SLEEP 命令実行前の状態 (High Low ハイインピーダンスのいず れか ) を維持する 6. WDT 以外のリセットはスリープの影響を受けない スリープ中の周辺モジュールの動作に関する詳細は データシートの各周辺モジュー ルの章を参照してください このレッスンでは どちらのデバイスも状態変化割り込みを使ってプロセッサをス リープから復帰させ EEPROM への書き込みと A/D 変換結果の取得を実行します アセンブリ言語 新しく学ぶ両デバイス共通の命令 命令英語名目的 SLEEP Go into Standby mode 低消費電力の動作 両デバイス共通このコードは EEPROM に対して 1 バイトのみの読み書きを実行します アドレス 0x00 はプログラムの最初の数行で定義しています 前のレッスンと同様 メモリの書き込み / 読み出しには EECON1/EEADRL/EEDAT レジスタを使います EEPROM に書き込むには 仮想レジスタの EECON2 に特別なシーケンスを書き込む必要があります DS41628B_JP - p Microchip Technology Inc.
95 レッスン 例 3-55: ;REQUIRED SEQUENCE for EEPROM write movlw 0x55 movwf EECON2 movlw 0xAA movwf EECON2 bsf EECON1, WR ;begin write WR ビットをセットすると EEPROM への書き込みが完了するまでセットされたままです C 言語 例 3-56: eeprom_read(<addr>) eeprom_write(<addr>,<value>); 両デバイス共通 XC8 コンパイラには EEPROM に対する読み書きを大幅に簡略化する 2 つの関数があります これらの関数を使って EEPROM に対してバイト読み書きを実行します 2015 Microchip Technology Inc. DS41628B_JP - p.95
96 NOTES: DS41628B_JP - p Microchip Technology Inc.
97 補遺 A. ブロック図と MPLAB X IDE のショートカット 図 A-1: PICkit 少ピン開発基板の回路図 P1 VPP/MCLR VDD GND ICSPDAT ICSPCLK NC U1 VDD RA5 RA4 RA3 RC5 RC4 RC3 RC6 RC7 RB DIP DIP DIP20 VSS RA0 RA1 RA2 RC0 RC1 RC2 RB4 RB5 RB , 14 and 20 PIN Compatible Devices 2 1 HDR1X14 P2 2 JP1 2 JP2 2 RC2 JP3 2 RC3 JP J1 1K R2 R1 10K C1 0.1uF DS1 DS2 DS3 DS4 R3 470R R4 470R R5 470R R6 470R C2 1K 0.1uF R7 GND SW1 SW-B3F1000 +V GND RA5 RA4_T1G RA3_MCLR_VPP RC5 RC4 RA3_MCLR_VPP +V RC3 RC6 RA0_ICSPDAT RA1_ICSPCLK RA4_T1G GND RC7 RB7 +V JP5 +V +V GND RC0 RA4_T1G RC1 GND GND RA0_ICSPDAT RA1_ICSPCLK RA2 RC0 RC1 RC2 RB4 RB5 RB6 GND PICkit RA2 +V CW RP1 2 10K POT-3352E CCW GND RC0 RC1 RC2 RC3 RA5 RA4_T1G RA3_MCLR_VPP RC5 RC4 RC3 RA0_ICSPDAT RA1_ICSPCLK RA2 RC0 RC1 +V RC2 GND 2015 Microchip Technology Inc. DS41628B_JP - p.97
98 A.1 MPLAB X IDE の便利なショートカット A.2 レジスタ名の定義 MPLAB X IDE には MPLAB IDE にはなかった新しい機能がいくつか追加されています この IDE は開発プラットフォーム Netbeans をベースにしています 以下に コード作成時に使える便利なショートカットを示します 1. Alt + Shift + F a) コードの自動フォーマット 2. Ctrl + E a) 現在の行を削除する 3. Ctrl + ; a) 現在の行の最後にセミコロン (;) を追加する (C コードの場合のみ ) 4. Ctrl + Shift + a) 現在の行と同じ行を 1 行下に挿入する b) 複数行を選択した場合も同様 [Edit]>[Start Macro Recording] を選択すると カスタムマクロを作成できる Ctrl を押しながら関数呼び出しの関数名をクリックすると その関数が定義されている行まで移動するその他のショートカットは netbeans.com を参照してください 同サイトのフォーラムも大いに役立ちます 全てのレジスタとそのアドレスの対応はヘッダファイルで定義されており このファイルを各ソースファイルの先頭でインクルードする必要があります 本書のレッスンで使うヘッダファイルは以下のシステムディレクトリにあります アセンブラ (MPASM): 1. C:\Program Files\Microchip\MPASM Suite\P18F14K22.inc 2. C:\Program Files\Microchip\MPASM Suite\P16F1829.inc XC8 1. C:\Program Files\microchip\xc8\v1.00\include\pic16f1829.h 2. C:\Program Files\microchip\xc8\v1.00\include\pic18f14K22.h A.3 PIC MCU のアセンブリコーディング作法 アセンブリ言語は複雑で分かりにくいため 一般論としてコメントをなるべく多く挿入する事を推奨します 書き込みはラッチへ 読み出しはポートから 重要なビット操作を強調したい場合は単なるmovlw ではなくビット指向命令 (bcf/bsf) を使う 割り込みサービスルーチン (ISR) は最後の関数として置く アセンブラ擬似命令 ( 下記 ) は小文字で表記する res, org, #define, #include, banksel, ラベルは内容が分かりやすい名前とし 最後にコロン (:) を付ける アドレスをコードに直接記述しない 変数にアドレスを割り当てる場合は clbock/endc( リンカを使わない場合 ) または #pragma udata sections( リンカを使う場合 ) を使ってアセンブラまたはリンカに割り当てさせる DS41628B_JP - p Microchip Technology Inc.
99 ブロック図と MPLAB X IDE のショートカット 例 A-1: Bad: #define flowrate 0x20 flowrate equ 0x20 Good: Cblock 0x20 flowrate flowtotal endc 2015 Microchip Technology Inc. DS41628B_JP - p.99
100 NOTES: DS41628B_JP - p Microchip Technology Inc.
101 各国の営業所とサービス 北米本社 2355 West Chandler Blvd. Chandler, AZ Tel: Fax: 技術サポート : support URL: アトランタ Duluth, GA Tel: Fax: オースティン TX Tel: ボストン Westborough, MA Tel: Fax: シカゴ Itasca, IL Tel: Fax: クリーブランド Independence, OH Tel: Fax: ダラス Addison, TX Tel: Fax: デトロイト Novi, MI Tel: ヒューストン TX Tel: インディアナポリス Noblesville, IN Tel: Fax: ロサンゼルス Mission Viejo, CA Tel: Fax: ニューヨーク NY Tel: サンノゼ CA Tel: カナダ - トロント Tel: Fax: アジア / 太平洋アジア太平洋支社 Suites , 37th Floor Tower 6, The Gateway Harbour City, Kowloon Hong Kong Tel: Fax: オーストラリア - シドニー Tel: Fax: 中国 - 北京 Tel: Fax: 中国 - 成都 Tel: Fax: 中国 - 重慶 Tel: Fax: 中国 - 杭州 Tel: Fax: 中国 - 香港 SAR Tel: Fax: 中国 - 南京 Tel: Fax: 中国 - 青島 Tel: Fax: 中国 - 上海 Tel: Fax: 中国 - 瀋陽 Tel: Fax: 中国 - 深圳 Tel: Fax: 中国 - 武漢 Tel: Fax: 中国 - 西安 Tel: Fax: 中国 - 厦門 Tel: Fax: 中国 - 珠海 Tel: Fax: アジア / 太平洋インド - バンガロール Tel: Fax: インド - ニューデリー Tel: Fax: インド - プネ Tel: 日本 - 大阪 Tel: Fax: 日本 - 東京 Tel: Fax: 韓国 - 大邱 Tel: Fax: 韓国 - ソウル Tel: Fax: または マレーシア - クアラルンプール Tel: Fax: マレーシア - ペナン Tel: Fax: フィリピン - マニラ Tel: Fax: シンガポール Tel: Fax: 台湾 - 新竹 Tel: Fax: 台湾 - 高雄 Tel: 台湾 - 台北 Tel: Fax: タイ - バンコク Tel: Fax: ヨーロッパオーストリア - ヴェルス Tel: Fax: デンマーク - コペンハーゲン Tel: Fax: フランス - パリ Tel: Fax: ドイツ - デュッセルドルフ Tel: ドイツ - ミュンヘン Tel: Fax: ドイツ - プフォルツハイム Tel: イタリア - ミラノ Tel: Fax: イタリア - ヴェニス Tel: オランダ - ドリューネン Tel: Fax: ポーランド - ワルシャワ Tel: スペイン - マドリッド Tel: Fax: スウェーデン - ストックホルム Tel: イギリス - ウォーキンガム Tel: Fax: /25/14 DS41628B_JP - p Microchip Technology Inc.
PowerPoint プレゼンテーション
マイコンプログラミング演習 I 第 04-05 回 LEDを用いたI/O 制御担当 : 植村 実験の目的 本実験ではマイコンシステムを用いた信号の入出力の制御方法を理解することを目的とし, マイコンのアーキテクチャを理解 実装するとともに, アセンブラによるプログラミング技術の習得を行う. 回路の構成として,PIC16F84A を用いてスイッチを入力とする LED の点灯 / 消灯の出力操作を行う回路ならびにアセンブラプログラムを実装する.
Microsoft Word - 工学ゼミ3_テキスト
2017 年 工学ゼミ Ⅲ 安全 環境活動に役立つ LEDイルミネーションの製作 1. 概要 3~5 名の学生グループで安全 環境活動に役立つ LED イルミネーションを作製する 作品のデザイン画や部品リスト 回路図 動作フロー図等は事前に作成し 計画的に作業を行うことが求められる 2. 達成すべき目標 作品に係る資料を事前にまとめ それに基づいて製作が行える 集団の中で 自身の知識 技術を積 極的に応用しながら
Microsoft PowerPoint - 工学ゼミⅢLED1回_2018
工学ゼミ Ⅲ 安全 環境活動に役立つ LEDイルミネーションの製作 第 1 回 1. 概要 3~5 名の学生グループで安全 環境活動に役立つ LED イルミネーションを作製する 作品のデザイン画や部品リスト 回路図 動作フロー図等は事前に作成し 計画的に作業を行うことが求められる 2. 達成すべき目標 作品に係る資料を事前にまとめ それに基づいて製作が行える 集団の中で 自身の知識 技術を積極的に応用しながら
PIC18 Istructios PIC16, PIC x Microchip Techology Icorporated. All Rights Reserved. PICmicro PIC18 52
PIC18 2003 Microchip Techology Icorporated. All Rights Reserved. PICmicro PIC18 51 PIC18 Istructios PIC16, PIC17 16 16 8x8 2003 Microchip Techology Icorporated. All Rights Reserved. PICmicro PIC18 52 PIC18
1.1 ラベル ラベルはカラム 1 から始まらなければならない ラベルの後にはコロン スペース タブ 改行が続いてよい ラベルはアルファベットかアンダーバーで始まり 英数字 アンダーバー クエスチョンマークを含んでよい ラベルは 32 文字までである デフォルトではこれらは大文字と小文字を区別するが
MPASM MPASM は Microchip Tecnology Inc. 社の開発した PIC のためのアセンブリ言語である ここでは MPASM の文法と使用法などについて記述する 1. 文法 ソースコードファイルは ASCII テキストファイルエディターを使って作成する そのように作られたソースコードは以下に示す基本的ガイドラインに従うべきである ソースファイルの各行は次の 4 つのタイプの情報を含んでよい
Microsoft Word - 工学ゼミ3_テキスト
2016 年 工学ゼミ Ⅲ 安全 環境活動に役立つ LEDイルミネーションの製作 1. 概要 3~5 名の学生グループで安全 環境活動に役立つ LED イルミネーションを作製する 作品のデザイン画や部品リスト 回路図 動作フロー図等は事前に作成し 計画的に作業を行うことが求められる 2. 達成すべき目標 作品に係る資料を事前にまとめ それに基づいて製作が行える 集団の中で 自身の知識 技術を積 極的に応用しながら
実習内容 PIC18C242 のポート B に接続した LED を点滅させます ( 他の実習と同じ内容です ) 8 個の LED に表示される値が +3 ずつインクリメントします MPLAB を使って MPASM アセンブラのソース ファイルをアセンブルします MPLAB とソース ファイルは配布し
エンベデッド コントロール セミナー 2000 2000 Microchip Technology Incorporated. All Rights Reserved. S9002A Embedded Control Seminar 2000 1 実習内容 PIC18C242 のポート B に接続した LED を点滅させます ( 他の実習と同じ内容です ) 8 個の LED に表示される値が +3
PowerPoint プレゼンテーション
マイコンプログラミング演習 I 第 02-03 回回路構築 /LEDを用いた出力制御担当 : 植村 導入 講義内容 本講義では携帯電話や携帯オーディオプレイヤー 各種ロボットなどの電子機器 情報機器に用いられるマイコン制御技術を 実習を通して理解する PIC: Peripheral Interface Controller 直訳 : 周辺装置インタフェースコントローラー マイクロコンピュータ CPUやメモリをワンチップ化した小型のコンピュータパソコンのような汎用性はないが低コスト
スライド 1
2. 転送命令を学ぼう 2004 年 8 月に本講義ノートを Web にアップして以来, とても多くの方の訪問を受けてきました. 内容が一部古くなっていたので,2012 年 5 月時点の情報に書き改めました. 主な変更点は以下の通りです. 第 0 章に本講座の準備のための章を設け, 以下の更新をしました. 1. プログラム開発環境 (MPLAB IDE) を v8.84 に更新しました. 2012
untitled
PIC Pic MPLAB HEX Pic PIC 18CXXX 14000 17CXXX 16C92X 16F8XX 16C7XX 16C6XX 16C62X 16F8X 12C5XX 16C5X 16C55X 12C6XX d f b f k k PIC 4 2 1 2 1 SPI SPI,SSART SPI 4 5 8 1 2 SPI,USART 1 64 128 256 8 (10bit)
3 1EEPROMElectrically Erasable PROM PROMProgrammable ROM 2 EEPROM 3
1 ROM 3 1EEPROMElectrically Erasable PROM PROMProgrammable ROM 2 EEPROM 3 000 001 EEPROM 3FF 14bit1024 A B 00 INDIRECT ADDR 80 INDIRECT ADDR 01 TMR0 81 OPTION 02 PCL 82 PCL 03 STATUS 83 STATUS 04 FSR 84
また RLF 命令は 図 2 示す様に RRF 命令とは逆に 各ビットを一つずつ 左方向に回転 ( ローテイト ) する命令である 8 ビット変数のアドレスを A とし C フラグに 0 を代入してから RLF A,1 を実行すると 変数の内容が 左に 1 ビットシフトし 最下位ビット (LSB)
コンピュータ工学講義プリント (12 月 11 日 ) 今回は ローテイト命令を用いて 前回よりも高度な LED の制御を行う 光が流れるプログラム 片道バージョン( 教科書 P.119 参照 ) 0.5 秒ごとに 教科書 P.119 の図 5.23 の様に LED の点灯パターンが変化するプログラムを作成する事を考える この様にすれば 光っている点が 徐々に右に動いているように見え 右端まで移動したら
スライド 1
8. ステッピングモータの制御を学ぼう 秋月電子通商 PIC ステッピングモータドライバキット ( 小型モータ付き ) を参照しました. 回路製作の詳細は第 0 章を参照してください. 1 2 第 0 章図 28 より完成写真 ( マイコン回路 + ステッピングモータ駆動回路 ) PIC マイコンによるステッピングモータの制御 PIC16F84 R 1 R 2 RB6 RB0 ステッピングモータ S
,, ( ) 5 ma ( ) 5V V 5 6 A B C D E F G H I J , LED LED, LED, 7 LED,, 7 LED ( ) V LED VCC 5V 7 LED VCC f g f a g b a b c e d e d c dp dp VCC (
[] PIC 8 (/6, 6/ ) (/, 6/) (5/7, 6/8) PIC PIC PIC (5/, 6/5) V 5 (5/, 7/ ) V LED ( LED ( /, 6/) V V V ( 5/8, 6/9) V ( 5/5, 6/6) ( V 5/8, 7/ 9) V % 6%, LED, LED /7, 6/ 5) 7,, LED, LED LED ,, ( ) 5 ma ( )
前付(念).indd
図解 PIC マイコン実習 ( 第 2 版 ) サンプルページ この本の定価 判型などは, 以下の URL からご覧いただけます. http://www.morikita.co.jp/books/mid/078332 このサンプルページの内容は, 第 2 版 1 刷発行時のものです. i 第 2 版 まえがき 10 MPLAB PIC USB MPLAB X 2 PIC16F84A PIC PIC
スライド 1
RX62N 周辺機能紹介データフラッシュ データ格納用フラッシュメモリ ルネサスエレクトロニクス株式会社ルネサス半導体トレーニングセンター 2013/08/02 Rev. 1.00 00000-A コンテンツ データフラッシュの概要 プログラムサンプル 消去方法 書き込み方法 読み出し方法 FCUのリセット プログラムサンプルのカスタマイズ 2 データフラッシュの概要 3 データフラッシュとは フラッシュメモリ
PIC10(L)F320/322 Product Brief
注意 : この日本語版文書は参考資料としてご利用ください 最新情報は必ずオリジナルの英語版をご参照願います PIC10(L)F320/322 PIC10(L)F320/322 製品概要 高性能 RISC CPU: 命令は 35 しかなく習得が容易 : - 分岐命令を除き 全てシングルサイクル命令 動作速度 : - DC 16 MHz クロック入力 - DC 250 ns 命令サイクル 最大 1 K
スライド 1
9. 割り込みを学ぼう 9.1 外部からの割り込み (SW1 を押すことにより割り込みをかける方法 ) 9.2 タイマ 0 による割り込み ( 処理タイミングの管理方法 : 一定時間毎に LED1, 2, 3 を点滅させる方法 ) 回路製作の詳細は第 0 章を参照してください. 1 9.1 外部からの割り込み (SW1 を押すことにより割り込みをかける方法 ) ;Interrupt test program
PIC
PIC - 1 ページ 2 週目 UBW を使用してみる 2010 年 5 月 23 日 15:28 前回の Gainer mini はあくまでも PC 側にプログラムがあり PIC は IO ボックス的な使用しかできなかった 入出力デバイスとして PIC を使う場合は 簡易で便利であるが それ以上の事 (PC なしでの動作 PC と対等の動作 ) は出来ない 今週からは 本来の PIC としての使い方を学ぶ
3 4 PIC
PIC 16 2 9 3 4 PIC 5 7 4-1 4-2 4-3 4-4 4-5 4-6 4-7 4-8 4-9 7 7 7 0 7 0 7 11 13 14 15 19 5-1 5-2 5-3 19 19 19 5-4 20 5-5 20 5-6 22 5-7 23 5-8 25 5-9 26 5-10 27 29 6-1 29 6-2 29 6-3 29 1 6-4 IC 30 6-5 31
RL78開発環境移行ガイド R8C/M16C, H8S/H8SXからRL78への移行(統合開発環境編)(High-performance Embedded Workshop→CS+)
RL78 開発環境移行ガイド R8C/M16C, H8S/H8SXからRL78への移行 ( 統合開発環境編 ) (High-performance Embedded Workshop CS+) 2017/4/7 R20UT2087JJ0103 ソフトウェア事業部ソフトウエア技術部ルネサスシステムデザイン株式会社 はじめに 本資料は 統合開発環境 High-performance Embedded Workshop
arduino プログラミング課題集 ( Ver /06/01 ) arduino と各種ボードを組み合わせ 制御するためのプログラミングを学 ぼう! 1 入出力ポートの設定と利用方法 (1) 制御( コントロール ) する とは 外部装置( ペリフェラル ) が必要とする信号をマイ
arduino プログラミング課題集 ( Ver.5.0 2017/06/01 ) arduino と各種ボードを組み合わせ 制御するためのプログラミングを学 ぼう! 1 入出力ポートの設定と利用方法 (1) 制御( コントロール ) する とは 外部装置( ペリフェラル ) が必要とする信号をマイコンから伝える 外部装置の状態をマイコンで確認する 信号の授受は 入出力ポート 経由で行う (2) 入出力ポートとは?
MPLAB Code Configurator User’s Guide
MPLAB Code Configurator ユーザガイド 注意 : この日本語版文書は参考資料としてご利用ください 最新情報は必ずオリジナルの英語版をご参照願います 2015 Microchip Technology Inc. DS40001725B_JP Microchip 社製デバイスのコード保護機能に関して以下の点にご注意ください Microchip 社製品は 該当する Microchip
計算機アーキテクチャ
計算機アーキテクチャ 第 11 回命令実行の流れ 2014 年 6 月 20 日 電気情報工学科 田島孝治 1 授業スケジュール ( 前期 ) 2 回日付タイトル 1 4/7 コンピュータ技術の歴史と コンピュータアーキテクチャ 2 4/14 ノイマン型コンピュータ 3 4/21 コンピュータのハードウェア 4 4/28 数と文字の表現 5 5/12 固定小数点数と浮動小数点表現 6 5/19 計算アーキテクチャ
#include "uart.h" // #define RTC8583 0xA0 // RTC address #define CTRL 0x00 // RTC register notation START/STOP #defin
****************** RTC clock with thermo & moisture meter by PIC12F1829 LCD display and serial output with internal clock By nobcha all right reserved Reffer to 05/22/2014 PIC16F1827+RTC8564NB + SHT-11
1. USB の VCP( 仮想 COM ポート ) について USB の VCP( 仮想 COM ポート ) は USB を非同期シリアル通信として使用するための USB のドライバです PC には VCP ドライバをインストールする必要があります USB の VCP( 仮想 COM ポート )
TrueSTUDIO 用 F4D_VCP の説明 V001 2014/07/05 USB の VCP( 仮想 COM ポート ) による非同期シリアル通信を行うプログラムです 無料の試用版開発ツール Atollic TrueSTUDIO for ARM Lite で作成したプロジェクトです ビルド可能なプログラムのコードサイズが 32Kbyte 以内の制限があります プログラムの開始番地は 0x08000000
DS41364B_JP
データシート 28/40/44 ピンフラッシュベース 8 ビット CMOS マイクロコントローラ (LCD ドライバおよびナノワット XLP テクノロジ対応 ) ご注意 : この日本語版ドキュメントは 参考資料としてご使用の上 最新情報につきましては 必ず英語版オリジナルをご参照いただきますようお願いします 2009 Microchip Technology Inc. Preliminary DS41364B_JP
CoIDE 用 F4D_VCP の説明 V /07/05 USB の VCP( 仮想 COM ポート ) による非同期シリアル通信を行うプログラムです Free の開発ツール CoIDE で作成した STM32F4 Discovery 用のプロジェクトです プログラムの開始番地は 0x
CoIDE 用 F4D_VCP の説明 V001 2014/07/05 USB の VCP( 仮想 COM ポート ) による非同期シリアル通信を行うプログラムです Free の開発ツール CoIDE で作成した STM32F4 Discovery 用のプロジェクトです プログラムの開始番地は 0x08000000 です デバッグが可能です 目次 1. USB の VCP( 仮想 COM ポート )
Notes and Points for TMPR454 Flash memory
表紙 TMPR454 内蔵 Flash メモリ対応版手順書 株式会社 DTS インサイト ご注意 (1) 本書の内容の一部または 全部を無断転載することは禁止されています (2) 本書の内容については 改良のため予告なしに変更することがあります (3) 本書の内容について ご不明な点やお気付きの点がありましたら ご連絡ください (4) 本製品を運用した結果の影響については (3) 項にかかわらず責任を負いかねますのでご了承ください
スライド 1
RL78/G13 周辺機能紹介安全機能 ルネサスエレクトロニクス株式会社 ルネサス半導体トレーニングセンター 2013/08/02 Rev. 0.00 00000-A コンテンツ 安全機能の概要 フラッシュ メモリ CRC 演算機能 RAM パリティ エラー検出機能 データの保護機能 RAM ガード機能 SFR ガード機能 不正メモリ アクセス機能 周辺機能を使用した安全機能 周波数検出機能 A/D
ヒント 2: CWG を使ったハーフブリッジまたはフルブリッジ回路の駆動 ハーフブリッジまたはフルブリッジモータ回路を駆動するために多ピンマイクロコントローラは必ずしも必要ではありません PWM モジュールと CWG モジュールを組み合わせると 少ピンデバイスでも駆動できます 図 2: CWG によ
注意 : この日本語版文書は参考資料としてご利用ください 最新情報は必ずオリジナルの英語版をご参照願います 新周辺モジュール活用のヒントとコツ 相補波形ジェネレータ (CWG) 構成可能なロジックセル (CLC) 数値制御オシレータ (NCO) 周辺モジュール活用のヒントとコツ はじめに マイクロチップ社は 小型化と高性能化ならびに使いやすさと信頼性の向上を目指して常に先進的な製品を提供しています
Microsoft Word - テキスト.docx
学籍番号 氏 名 情報電子工学演習 Ⅴ( ハードウェア実技編 ) PIC マイコンによる光学式テルミンの製作 新潟工科大学情報電子工学科 課題チェック欄 課題 ドレミ音の発生 (6/28) 回路図 (7/5) フローチャート (7/12) 評価 スケジュール < 内容 > < 集合場所 > 第 1 回 (6/14) PIC マイコンとタイマモジュールの活用 [S2-9] 第 2 回 (6/21) パルスの発生とオシロスコープによる観察
Microsoft PowerPoint - NxLecture ppt [互換モード]
011-05-19 011 年前学期 TOKYO TECH 命令処理のための基本的な 5 つのステップ 計算機アーキテクチャ第一 (E) 5. プロセッサの動作原理と議論 吉瀬謙二計算工学専攻 kise_at_cs.titech.ac.jp W61 講義室木曜日 13:0-1:50 IF(Instruction Fetch) メモリから命令をフェッチする. ID(Instruction Decode)
内容 1. 仕様 動作確認条件 ハードウェア説明 使用端子一覧 ソフトウェア説明 動作概要 ファイル構成 オプション設定メモリ 定数一覧 変数一
RX210 グループ IRQ 割り込みを使用したパルス出力 要旨 本サンプルコードでは IRQ 割り込みが発生すると 一定期間タイマでパルスを出力する 方法について説明します 対象デバイス RX210 1 / 25 内容 1. 仕様... 3 2. 動作確認条件... 3 3. ハードウェア説明... 3 3.1 使用端子一覧... 3 4. ソフトウェア説明... 4 4.1 動作概要... 4
PIC24F Family Reference Manual, Section 9 Watchdog Timer (WDT)
注意 : この日本語版文書は参考資料としてご利用ください 最新情報は必ずオリジナルの英語版をご参照願います セクション 9. ウォッチドッグタイマ (WDT) ハイライト 本セクションには以下の主要項目を記載しています 9.1 はじめに... 9-2 9.2 WDT の動作... 9-3 9.3 レジスタマップ... 9-7 9.4 設計のヒント... 9-8 9.5 関連アプリケーションノート...
Flash Loader
J MA1309-A プロジェクターファームウェア更新ガイド 本書はお読みになった後も大切に保管してください 本書の最新版は下記ウェブサイトに公開されております http://world.casio.com/manual/projector/ Microsoft Windows Windows Vistaは米国 Microsoft Corporationの米国およびその他の国における登録商標または商標です
AN1526 RX開発環境の使用方法(CS+、Renesas Flash Programmer)
RX 開発環境の使用方法 (CS+ Renesas Flash Programmer) 第 2 版 2018 年 03 月 13 日 1. 概要 1.1 概要 本アプリケーションノートでは RX シリーズで使用する開発環境についての解説を行います 解説を行う開発環境は以下の 3 つです 1.RX ファミリ用 C/C++ コンパイラパッケージ 2.Renesas Flash Programmer(RFP)
割り込み 今までのプログラムは 順番にそって命令を実行していくのみ それはそれで良いが 不便な場合もある 例えば 時間のかかる周辺機器を使う場合 その周辺機器が動作を終了するまで CPU は待たなければいけない 方法 1( ポーリング ) 一定時間毎に 周辺機器の動作が終了したか調べる 終了していれ
第 2 回 本日の内容割り込みとは タイマー 割り込み 今までのプログラムは 順番にそって命令を実行していくのみ それはそれで良いが 不便な場合もある 例えば 時間のかかる周辺機器を使う場合 その周辺機器が動作を終了するまで CPU は待たなければいけない 方法 1( ポーリング ) 一定時間毎に 周辺機器の動作が終了したか調べる 終了していれば 次の動作に移るし そうでなければ また少し待ってから同じことを繰り返す
PIC16(L)F1703/7 Data Sheet
注意 : この日本語版文書は参考資料としてご利用ください 最新情報は必ずオリジナルの英語版をご参照願います 14/20 ピン 8 ビット先進アナログフラッシュマイクロコントローラ コアの特長 : C コンパイラ向けに最適化された RISC アーキテクチャ わずか 49 個の命令 動作速度 : - 0 ~ 32 MHz - 最小 125 ns の命令サイクル 割り込み機能 16 段のハードウェアスタック
インテル(R) Visual Fortran コンパイラ 10.0
インテル (R) Visual Fortran コンパイラー 10.0 日本語版スペシャル エディション 入門ガイド 目次 概要インテル (R) Visual Fortran コンパイラーの設定はじめに検証用ソースファイル適切なインストールの確認コンパイラーの起動 ( コマンドライン ) コンパイル ( 最適化オプションなし ) 実行 / プログラムの検証コンパイル ( 最適化オプションあり ) 実行
命令セットの構成例 a) 算術 演算命令 例 )ADD dest, source : dest dest + source SUB dest, source : dest dest - source AND dest, source : dest dest AND source SHR reg, c
第 11 回機械語とアーキテクチャ コンピュータは, 記号で組み立てられ, 記号で動く機械 : ソフトウェアソフトウェア としても理解されなければならない ソフトウェアの最も下位レベルのしくみが ( 命令セット ) アーキテクチャ である 講義では命令符号 ( 機械語 ) の構成と種類についてまとめる また, 機械語を効率良く実行するために採用されている技術について紹介する 機械語とアセンブリ言語
MSP430 CCSv5 を使い Flash Memory 内容と version 情報を確認する方法 ( テクニック編 ) Rev: PIC Trout 今回は 下記の2 件について説明します 1) CCSv5 を使用して MSP430 の Flash Memory 内容を
MSP430 CCSv5 を使い Flash Memory 内容と version 情報を確認する方法 ( テクニック編 ) Rev:01 10.4.2013 PIC Trout 今回は 下記の2 件について説明します 1) CCSv5 を使用して MSP430 の Flash Memory 内容を確認する方法 JTAG アクセスができるデバイス ( セキュリティ Fuse 断ではできません ) に対して
SMSC LAN8700 Datasheet
注意 : この日本語版文書は参考資料としてご利用ください 最新情報は必ずオリジナルの英語版をご参照願います Microchip 社 LAN9252 SDK と Beckhoff 社 EtherCAT SSC の統合 Author: Kansal Mariam Banu Shaick Ibrahim Microchip Technology Inc. 概要 Microchip 社の LAN9252 は
1. 新規プロジェクト作成の準備新規プロジェクトのためのフォルダを用意して そこにプロジェクトを作成します [ 新しいフォルダー ] をクリックして希望のフォルダに新しいフォルダを作成します この例では TrST_F401N_BlinkLD2 というフォルダを作成しました TrST_F401N_Bl
NUCLEO-F401RE の TrueSTUDIO プロジェクト構築方法 V001 2014/09/24 Atollic TrueSTUDIO for ARM Lite を使用して NUCLEO-F401RE のプロジェクトを新規に作成する方法について説明します また ビルドとデバッグについても説明しています 目次 1. 新規プロジェクト作成の準備... 2 2. 新規プロジェクトの作成... 3
Sharpdesk V3.5インストレーションガイド:プロダクトキー編
Sharpdesk V3.5 インストレーションガイド : プロダクトキー編 Version 1.0 著作権 このソフトウェアの著作権はシャープ株式会社にあります 著作権法で許諾される場合を除き 無断で複製 転載 翻訳することはできません 登録商標 SHARP および Sharpdesk はシャープ株式会社の登録商標です Microsoft および Windows は Microsoft 社の登録商標です
Nios II Flash Programmer ユーザ・ガイド
ver. 8.0 2009 年 4 月 1. はじめに 本資料は Nios II 開発環境においてフラッシュメモリ または EPCS へのプログラミングを行う際の参考マニュアルです このマニュアルでは フラッシュメモリの書き込みの際に最低限必要となる情報を提供し さらに詳しい情報はアルテラ社資料 Nios II Flash Programmer User Guide( ファイル名 :ug_nios2_flash_programmer.pdf)
Notes and Points for ADuCM320 Internal Flash memory
表紙 ANALOG DEVICES 社製 ADuCM320 内蔵 Flash メモリ対応手順書 株式会社 DTS インサイト ご注意 (1) 本書の内容の一部または 全部を無断転載することは禁止されています (2) 本書の内容については 改良のため予告なしに変更することがあります (3) 本書の内容について ご不明な点やお気付きの点がありましたら ご連絡ください (4) 本製品を運用した結果の影響については
Sample Rate Conversion Library for PIC32 User’s Guide
注意 : この日本語版文書は参考資料としてご利用ください 最新情報は必ずオリジナルの英語版をご参照願います 2013 Microchip Technology Inc DS61190A_JP Microchip 社製デバイスのコード保護機能に関して次の点にご注意ください Microchip 社製品は 該当する Microchip 社データシートに記載の仕様を満たしています Microchip 社では
Microsoft Word - DWR-S01D_Updater_取扱説明書_120514A.doc
DWR-S01D Updater 取扱説明書 発行日 :2012/5/14 目次 概要...3 機能...3 準備するもの...3 本ソフトウェアについて...3 インストール手順...4 USBドライバーのインストール手順...8 デバイスマネージャーからのUSBドライバーのインストール手順...11 アップデート手順...16 アップデート後の確認...17 アップデートに失敗した場合...17
ブート領域、フラッシュ領域の分割方法 RL78ファミリ用Cコンパイラ CC-RL
ブート領域 フラッシュ領域の分割方法 RL78 ファミリ用 C コンパイラ CC-RL 2016 年 10 月 5 日 Rev.2.00 ソフトウエア事業部 ソフトウエア技術部 ルネサスシステムデザイン株式会社 R20UT3475JJ0200 アジェンダ はじめにページ 3 概要ページ 4 ブート領域 フラッシュ領域共通ページ 12 ブート領域ページ 19 フラッシュ領域ページ 38 デバッグツールページ
Visual DSP++ install and tutorial
Visual DSP++ インストール & チュートリアル 第 4 版 金子システム株式会社 1 ご注意 1. 本資料に記載されている内容は本資料発行時点のものであり 予告なく変更することがあります 当社製品のご購入およびご使用にあたりましては 当社ホームページを通じて公開される情報を参照ください 2. 当社から提供する情報の正確性と信頼性には万全を尽くしていますが 誤りがないことを保証するものではありません
-2 外からみたプロセッサ GND VCC CLK A0 A1 A2 A3 A4 A A6 A7 A8 A9 A10 A11 A12 A13 A14 A1 A16 A17 A18 A19 D0 D1 D2 D3 D4 D D6 D7 D8 D9 D10 D11 D12 D13 D14 D1 MEMR
第 回マイクロプロセッサのしくみ マイクロプロセッサの基本的なしくみについて解説する. -1 マイクロプロセッサと周辺回路の接続 制御バス プロセッサ データ バス アドレス バス メモリ 周辺インタフェース バスの基本構成 Fig.-1 バスによる相互接続は, 現在のコンピュータシステムのハードウェアを特徴づけている. バス (Bus): 複数のユニットで共有される信号線システム内の データの通り道
1. 概念 STM32F4 Discovery 基板は Mini USB を接続して デバッグやプログラムの書き込みができるようになっています 通常は CPU の 0x 番地からプログラムを実行します では なぜわざわざこのプロジェクトの雛形を使用して CPU の 0x
Base_STM32F4_Discovery の説明 2013/09/05 STM32F4 Discovery 基板の CPU STM32F407VG の FlashMemory 0x08010000 番地に書き込んで実行させる ユーザープログラムのためのプロジェクトの雛形です 本プロジェクトを元にユーザープログラムを作成して USB 経由で CPU に書き込みます USB 経由で CPU にプログラムを書き込むためには
Visual DSP++ install and tutorial
Visual DSP++ インストール & チュートリアル 第 3 版 金子システム株式会社 1 ご注意 1. 本資料に記載されている内容は本資料発行時点のものであり 予告なく変更することがあります 当社製品のご購入およびご使用にあたりましては 当社ホームページを通じて公開される情報を参照ください 2. 当社から提供する情報の正確性と信頼性には万全を尽くしていますが 誤りがないことを保証するものではありません
ex05_2012.pptx
2012 年度計算機システム演習第 5 回 2012.05.25 高水準言語 (C 言語 ) アセンブリ言語 (MIPS) 機械語 (MIPS) コンパイラ アセンブラ 今日の内容 サブルーチンの実装 Outline } ジャンプ 分岐命令 } j, jr, jal } レジスタ衝突 回避 } caller-save } callee-save 分岐命令 ( 復習 ) } j label } Jump
Application Note Application Note No. ESC-APN Document No.: ESC-APN adviceluna Linux デバッグ手順 (MIPS コア編 ) はじめに adviceluna Linux デバッグ手順 ( 以
No. ESC-APN-026-02 Document No.: ESC-APN-026-02 adviceluna Linux デバッグ手順 (MIPS コア編 ) はじめに adviceluna Linux デバッグ手順 ( 以下 本書 ) は adviceluna にて下記 Linux 環境をデバッグする手順を説明した文書です Application Shared Library Loadable
始める スタート > 全てのプログラム > Cypress > PSoC Creator 2.0 > PSoC Creator 2.0 をクリックします プロジェクトを作成する / 開く Start Page の "Create New Project" をクリックし 要求されたプロジェクト情報を入
PSoC Creator クイックスタートガイド インストール http://www.cypress.com/go/creator から PSoC Creator をダウンロードするか キット CD からインストールします 支援が必要な場合は Cypress Support 1-800-541-4736 へ電話して 8 を選択してください 機能 システム要件およびインストールの注意事項については http://www.cypress.com/go/creatordownloads
Microsoft Word - PIC-USBマイコンボード_v1-02@WEB公開用資料.docx
PIC-USB マイコンボード C 言語による PIC プログラミング入門 ( 浅川毅著 ) にて使用しているマイコンボードです プログラム ファームウェア 基板単体 パーツ類 URL1 より全てダウンロード可能 URL2 より購入可能 URL2 または電子パーツ店より購入可能 URL1 ソースファイルほか http://www.tdupress.jp/download/robot-mpu/isbn978-4-501-55350-0-2.html
余白 : 上下 25.4mm, 左右 19mm (Word2012 での やや狭い 設定 ) マイコンプログラミング演習 I レポート 1 実験日 提出日 回路構築 /LED を用いた I/O 制御 [16pt] 班員と担当責任者第 0 班レポート作成
レポートを書く上での心得 実験レポートは, この実験を何も知らない人がこのレポート通りに実験を行って, ほぼ同じ結果が出せる程度の完成度 ( 実験の再現性 ) が求められる. そのためには教科書やスライドを丸写しするのではなく, 自分で内容を理解し, 自分の言葉で書く必要がある. また, 学術分野などで多少の違いはあるが, 一般的なレポートおよびレジュメ等の書き方としての大まかなルールを以下に示す.
RH850の割り込み/例外実現方法 CC-RHアプリケーションガイド
RH850の割り込み / 例外実現方法 CC-RH アプリケーションガイド R20UT3546JJ0101 2018.10.12 ソフトウェア開発統括部 ソフトウェア技術部ルネサスエレクトロニクス株式会社 アジェンダ 概要ページ 03 割り込み / 例外発生時に実行する関数の定義ページ 10 直接ベクタ方式のベクタの定義ページ 17 テーブル参照方式のベクタの定義ページ 25 その他 割り込み制御ページ
プログラミング基礎
C プログラミング Ⅰ 授業ガイダンス C 言語の概要プログラム作成 実行方法 授業内容について 授業目的 C 言語によるプログラミングの基礎を学ぶこと 学習内容 C 言語の基礎的な文法 入出力, 変数, 演算, 条件分岐, 繰り返し, 配列,( 関数 ) C 言語による簡単な計算処理プログラムの開発 到達目標 C 言語の基礎的な文法を理解する 簡単な計算処理プログラムを作成できるようにする 授業ガイダンス
Microsoft PowerPoint - OS07.pptx
この資料は 情報工学レクチャーシリーズ松尾啓志著 ( 森北出版株式会社 ) を用いて授業を行うために 名古屋工業大学松尾啓志 津邑公暁が作成しました 主記憶管理 主記憶管理基礎 パワーポイント 27 で最終版として保存しているため 変更はできませんが 授業でお使いなる場合は松尾 ([email protected]) まで連絡いただければ 編集可能なバージョンをお渡しする事も可能です 復習 OS
スクールCOBOL2002
(h) 登録集原文の指定方法 . 登録集原文の指定方法 複数の COBOL プログラムに共通の記述を別のソースファイルとしておき COPY 文で取り込むことができます 登録集原文の概念図を下欄に示します このようにすると コーディング量を削減でき 記述ミスもなくなるため 開発効率を高めることができます ここでは 第 章で実習した reidai.cbl というソースファイルの DATA0 と YYMMDD
まず,13 行目の HardwareTimer Timer(1); は,HardwareTimer というクラスを利用するという宣言である. この宣言によって Timer というインスタンスが生成される.Timer(1) の 1 は,OpenCM に 4 個用意されているタイマのうち,1 番のタイマ
8 タイマ割り込みを使ってみよう割り込み (Interrupt) とは, 言葉の意味の通り, ある作業中に割り込むことである. マイコンにおいてはとても重要な機能の一つである. 例えば, インスタントカップ麺にお湯を入れて 3 分間待ってから食べることを想像してみよう. お湯を入れてカップ麺ができるまでの 3 分間, 時計の針だけを見つめ続けて, 他には何にもせずに待ち続ける人はほとんどいないだろう.
PICF/LF1847 表 1: デバイス PICF/LF1847 ファミリの各製品 プログラムメモリフラッシュ ( ワード ) データ EEPROM ( バイト ) SRAM ( バイト ) I/O 10 ビット A/D (ch) タイマ 8/ ビット EUSART MSSP CCP/ ECCP
ご注意 : この日本語版ドキュメントは 参考資料としてご使用の上 最新情報につきましては 必ず英語版オリジナルをご参照いただきますようお願いします PICF/LF1847 18/20/28 ピン 8 ビットフラッシュマイクロコントローラ製品概要 高性能 RISC CPU: 命令数は 49 で習得が容易 動作速度 : - DC 32 MHz クロック入力 - DC 12 ns 命令サイクル 割り込み機能
CoIDE 用 STM32F4_UART2 の説明 V /03/30 STM32F4 Discovery の非同期シリアル通信ポート UART2 の送受信を行うプログラムです Free の開発ツール CoIDE で作成したプロジェクトサンプルです プログラムの開始番地は 0x08000
CoIDE 用 STM32F4_UART2 の説明 V002 2014/03/30 STM32F4 Discovery の非同期シリアル通信ポート UART2 の送受信を行うプログラムです Free の開発ツール CoIDE で作成したプロジェクトサンプルです プログラムの開始番地は 0x08000000 です デバッグが可能です 提供する PC のアプリケーションの Access_SerialPort
1. UART について UART は Universal Asynchronous Receiver Transmitter の頭文字をとったもので 非同期シリアル通信と呼ばれます シリアル通信とは 一本の信号線でデータをやりとりするために 1bit ずつデータを送出することをいいます データを受
STM32L_UART1 の説明 V004 2014/03/30 STM32L-Discovery の UART 1 の送受信を行うプログラムです 無料の開発ツール Atollic TrueSTUDIO for ARM Lite( 試用版 ) で作成したプロジェクトです プログラムの開始番地は 0x08000000 です デバッグが可能です PC アプリケーションの Access_SerialPort
正転時とは反対に回転する これが逆転である 図 2(d) の様に 4 つのスイッチ全てが OFF の場合 DC モータには電流が流れず 停止する ただし 元々 DC モータが回転していた場合は 惰性でしばらく回転を続ける 図 2(e) の様に SW2 と SW4 を ON SW1 と SW3 を O
コンピュータ工学講義プリント (1 月 29 日 ) 今回は TA7257P というモータ制御 IC を使って DC モータを制御する方法について学ぶ DC モータの仕組み DC モータは直流の電源を接続すると回転するモータである 回転数やトルク ( 回転させる力 ) は 電源電圧で調整でき 電源の極性を入れ替えると 逆回転するなどの特徴がある 図 1 に DC モータの仕組みを示す DC モータは
Crucial Client SSDでのファームウェアアップデート手順
Crucial Client SSD でのファームウェアアップデート手順 概要このガイドを使うことにより パーソナルコンピューティング環境に ( 以下本文書ではホストシステムという ) インストールされた Crucial SSD でファームウェアアップデートを実行することがきます このガイドでは 2 つのアップデート方法を説明します 方法 1:Crucial Storage Executive ソフトウェアを介したオンラインアップデート
PowerPoint プレゼンテーション
コンピュータアーキテクチャ 第 13 週 割込みアーキテクチャ 2013 年 12 月 18 日 金岡晃 授業計画 第 1 週 (9/25) 第 2 週 (10/2) 第 3 週 (10/9) 第 4 週 (10/16) 第 5 週 (10/23) 第 6 週 (10/30) 第 7 週 (11/6) 授業概要 2 進数表現 論理回路の復習 2 進演算 ( 数の表現 ) 演算アーキテクチャ ( 演算アルゴリズムと回路
PIC (, 2, 3 ) PIC ( 1, 2, 3 ) 1 2 (, 2 ) PIC ( 1, 2 ) 2.1 (p.34) define #define (define ) (p.61) 1 30 (RD 7 /P SP 7 ) 32 (V DD ) IC
PIC 19 12 22 1 (, 2, 3 ) PIC ( 1, 2, 3 ) 1 2 (, 2 ) PIC ( 1, 2 ) 2.1 (p.34) define #define (define ) 2.2 4-1 (p.61) 1 30 (RD 7 /P SP 7 ) 32 (V DD ) IC 2.3 5-2 (p.102) 5 6 ADCON0< 5 >, ADCON0< 4 > ADCON1
Manchester Decoder Using the CLC and NCO
注意 : この日本語版文書は参考資料としてご利用ください 最新情報は必ずオリジナルの英語版をご参照願います AN1470 CLC と NCO を使ったマンチェスタデコーダ 著者 : 概要 PIC16F150x が内蔵する CLC( 構成可能なロジックセル ) と NCO ( 数値制御オシレータ ) を使うと マンチェスタデコーダを構築できます PIC16F150x は 低消費電力 XLP 技術に対応したエンハンストコアを実装したデバイスです
1. 使用する信号 1.1. UART 信号 UART 通信に使用する信号と接続相手との接続は以下の通りです UART 信号表 番号 CPU 機能名 CPU 信号名 基板コネクタピン番号 方向 接続相手の信号名 1 USART1_TX PA9 CN > RxD 2 USART1_R
TrueSTUDIO 用 L152CD_UART1 の説明 V001 2014/10/22 UART( 非同期シリアル通信 ) で送受信を行う STM32L152C-DISCO のプロジェクトサンプルです STM32L152C-DISCO は STMicroelectronics 社製の Cortex-M3 ARM CPU である STM32L152RCT6 を搭載した基板です 試用版の開発ツール
DSP5Dアップグレードガイド
DSP5D アップグレードガイド このガイドでは DSP5D の各種ファームウェアを最新にアップデートする手順を説明します 必ずお読みください アップデート作業は お客様ご自身の責任において行なっていただきます アップデートを実行する前に 必要なデータはバックアップしておいてください PM5D とカスケード接続している場合は DSP5D をアップデートすると PM5D のアップデートも必要になる場合があります
WLAR-L11G-L/WLS-L11GS-L/WLS-L11GSU-L セットアップガイド
の特長や 動作環境を説明します プロバイダ契約について の特長 動作環境 各部の名称とはたらき 設定ユーティリティについて 第 章 はじめにお読みください 動作確認プロバイダや最新の情報は のホームページからご覧いただけます は次の通りです を使ってインターネットをご利用になるためには 以下の条件を満たしたプロバイダと契約してください ルータを使用して 複数台のパソコンをインターネットに接続できるプロバイダ
改訂履歴 改訂日付 改訂内容 2014/11/01 初版発行 2017/01/16 Studuino web サイトリニューアルに伴う改訂 2017/04/14 Studuino web サイトリニューアルに伴うアクセス方法の説明変更 2018/01/22 Mac 版インストール手順変更に伴う改訂
Arduino IDE 環境 設定手順書 Windows/Mac 用 2014/11/01 作成 2018/01/22 改訂 改訂履歴 改訂日付 改訂内容 2014/11/01 初版発行 2017/01/16 Studuino web サイトリニューアルに伴う改訂 2017/04/14 Studuino web サイトリニューアルに伴うアクセス方法の説明変更 2018/01/22 Mac 版インストール手順変更に伴う改訂
AN1019 そのような配慮として 下記の基本的ガイドラインに沿って 可能な限り 環境条件または動作条件を制限する必要があります アプリケーションの温度を可能な限り下げる アプリケーションの電圧 ( または EEPROM の VCC 電圧 ) を可能な限り下げる 書き込みバイト数を可能な限り少なくす
注意 : この日本語版文書は参考資料としてご利用ください 最新情報は必ずオリジナルの英語版をご参照願います EEPROM 書き込み耐性の基礎 AN1019 Author: 基礎 David Wilkie Microchip Technology Inc. EEPROM の 書き込み耐性 を一言で明確に定義して理解する事はできません 以下で説明するように メーカーごとに定義が異なります 全てのメーカー
WAGO PROFIBUS バスカプラ/コントローラと、QJ71PB92Dとのコンフィグレーションマニュアル
< 概要 > WAGO-I/O-SYSTEM750 シリーズ PROFIBUS バスカプラ / コントローラと 三菱電機 製 PROFIBUS ユニット QJ71PB92D とのコンフィグレーション手順を説明しております < 使用機器接続図 > 下記機器を準備し 図の通り接続しました WAGO-I/O-SYSTEM PROFIBUS バスカプラ / コントローラ 750-xxx および I/O モジュール
回路 : Vdd GND 回路図と呼べるようなものではありません オシレータは外部 ( セラミック発振子 ) なので GP4 と GP5 は使えません 四角の枠内はモジュールなので ここから VDD GND TX RX の4 本をつなぐだけです 測定端子 (GP0) は 1MΩの抵抗と 2MΩの半固
ペン型オシロスコープ ( もどき ) の作り方 本書は PC 接続タイプの簡易 ペン型オシロスコープ を自作する方のための解説書です 開発時間 経費を極力おさえたため 通常の電子回路やファームウェアの作成方法と異なることがあります 動作不具合 故障などは保証いたしません また 本機を接続 ソフトウェアを使用したことによるパソコンの故障等の一切の責務は当方にはありません 自己責任にてご利用ください と
