Chapter 3. レッスン
3.2 レッスン 1: Hello World (LED の点灯 )
3.2.1 レッスンの紹介
最初のレッスンではLEDの点灯方法を学びます。
3.2.2 ハードウェアの動作
DS1が点灯を続けます。
3.2.3 概要
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.2.4 新しく学ぶレジスタ
3.2.4.1 両デバイス共通
3.2.4.1.1 LATC
データラッチ(LATxレジスタ)は、I/Oピンが駆動している値のRead-Modify-Write動 作に便利です。LATxレジスタへの書き込み動作は、対応するPORTxレジスタへの書 き込みと同じ効果があります。LATC レジスタを読み出すと、I/O ポートラッチの保 持値が読み出されます。
3.2.4.1.2 PORTC
PORTC レジスタを読み出すと、I/O ピンの値が読み出されます。書き込みはポート
に直接行うのではなく、LATx レジスタに対して行います。
3.2.4.1.3 TRISC
このレジスタはPORTCに接続された各ピンのデータ方向を指定します。
「1」はInput (入力)の「I」の形、「0」はOutput (出力)の「O」の形になぞらえる
と簡単に覚えられます。
書き込みは必ずラッチへ実行し、読み出しは必ずポートから実行するように注意し ます。
表3-1: 新しく学ぶ両デバイス共通のレジスタ
レジスタ 目的
LATC データラッチ
PORTC PORTCの全てのピンのステータスを保持
TRISC ピンが入力(1)か出力(0)かを決定
表3-2: TRISの値と方向
TRISの値 方向
1 入力
0 出力
PICkit™ 3 スタータキット ユーザガイド
DS41628B_JP - p.42 2015 Microchip Technology Inc.
3.2.5 新しく学ぶ命令
エンハンスト ミッドレンジおよびPIC18の全命令の詳細は、各PIC® MCUのデータ シートで「命令セットのまとめ」の章を参照してください。本書では、各デバイスの 重要な命令について簡単に説明します。
3.2.5.1 両デバイス共通
3.2.5.1.1 bsf
レジスタの1ビットをセットします。
例3-1:
3.2.5.1.2 bcF
レジスタの1ビットをクリアします。
例3-2:
3.2.5.1.3 CLRF
レジスタ全体をクリアします。初期化時にLED等の周辺出力を全てOFFにする場合 に使うと便利です。
例3-3:
表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’11011000’
命令実行後:
LATC = b’00000000’
3.2.6 アセンブリ
3.2.6.1 エンハンスト ミッドレンジ
例3-4:
コメントの開始を表します。アセンブラは、セミコロンから行末までのテキストを全 て無視します。コードの可読性を高めるため、なるべく多くのコメントを挿入するよ うにします。
p16F1829.incには、このPIC MCU固有のSFRおよびその他メモリのアドレスが全 て定義してあります。この文は、プログラムのヘッダコメントの後の最初の行に記述 してください。その次に、__CONFIGディレクティブを記述します。
プロセッサのコンフィグレーションビットを設定します。このディレクティブを使う 前に、プロセッサを宣言しておく必要があります。ここで記述している各コンフィグ レーションワードの詳細は、PIC16F1829のデータシートを参照してください。この 中で最も重要なのは、RA3のマスタクリアをOFFにする「MCLRE_OFF」です。
「MESSAGE 302 – Operand not in Bank 0, check to ensure bank bits are correct」と いう警告メッセージの出力を抑制します。
以下のコードの開始アドレスを「xx」で指定します。orgを指定しない場合、アドレ ス0からコード生成が開始します。
これはラベルです。ラベルには、そのラベル直後のオペコードと同じメモリアドレス が割り当てられます。実際のコードでは、call、goto、branch 命令のジャンプ先 をラベルで指定する事を推奨します。
#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>
__CONFIG
Errorlevel -302
Org xx
Start:
Banksel TRISC
PICkit™ 3 スタータキット ユーザガイド
DS41628B_JP - p.44 2015 Microchip Technology Inc.
エンハンスト ミッドレンジコアで最もよく使う、非常に重要なディレクティブです。
この擬似命令は、アセンブラとリンカに対して TRISCレジスタが属するバンクを選 択するコードを生成するよう指示します。この場合、バンク1です。これには1命令 サイクルかかります。
ピンRC0を出力にします。このレジスタのビットを「1」にセットするとそのピンは 入力に設定され、「0」にクリアすると出力に設定されます。
全ての出力レジスタを「0」に初期化する事を推奨します。全てのレジスタがリセッ ト時にクリアされる保証はありません。
これで、PORTC0に接続されたDS1が点灯します。
これは、アセンブラに対して現在の命令へジャンプするよう指示する命令で、この命 令が無限に実行されます。
3.2.6.2 PIC18 例3-5:
ここでは、コンフィグレーション ワードとCONFIGディレクティブが異なってい ます。PIC18 の方がコンフィグレーション ワードに多くの機能があります。各コン フィグレーション ワードの役割の詳細は、PIC18F14K22のデータシートを参照して ください。
エンハンスト ミッドレンジとの最も重要な違いは、バンク切り換えの必要がない事 です。全てのSFRがアクセスバンクにあるため、banksel文は不要です。
bcf TRISC, 0
clrf LATC
bsf LATC, 0 goto $
#include <p18F14K22.inc>
;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
3.2.7 C言語
C言語のソースコードはPIC16もPIC18もほとんど同じです。
3.2.7.1 エンハンスト ミッドレンジ
例3-6:
コメントの開始を表します。コンパイラは行末までの全てのテキストを無視します。
コードの可読性を高めるため、なるべく多くのコメントを挿入するようにします。
htc.h ファイルを指定しておくと、プロジェクト作成時に選択したプロセッサのヘッ
ダファイルが自動的に読み込まれます。
コンフィグレーション ワードへの書き込みを実行します。詳細はデータシートを参照 してください。
全てのCプログラムは最初にmain関数があります。これは必須の関数です。
LATCbitsは、インクルードしたファイル(htc.h)で定義された構造体です。このプロ グラムで選択する必要があるのは、ピンRC0に接続されたDS1のみです。これは、
LATC |= 0b00000001と記述する事もできます。これはOR代入演算子と呼ばれるも ので、C0 以外の全てのピンの状態が維持されます。OR 演算を省略して LATC = 0b00000001とすると、C0以外の全てのビットがクリアされます。
このwhile文を評価すると常に真となり、continue文で現在のループに留まります。
この状態が無限に続きます。continue文がなくても正しく動作します。
アセンブリコードよりも少ない行数で同じ機能を実現しています。
#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>
__CONFIG
void main(void) LATCbits.LATC0 = 1
while (1) continue;
PICkit™ 3 スタータキット ユーザガイド
DS41628B_JP - p.46 2015 Microchip Technology Inc.
3.2.7.2 PIC18
PIC16のコードと異なるのはコンフィグレーション ワードの部分のみです。詳細は、
PIC18F14K22のデータシートを参照してください。