PICマイコン アセンブラ入門
【Chapter1. プログラミングに向けて】
1−1.はじめに
@PICマイコンはどのようなものか
A実験で使われるパーツ
1−2.用意するもの ・・・ これだけあればまずはOK
@パソコン(Windows 〜、2000、XP、〜)
AROMライター(秋月電子のAKI−PICプログラマー
Ver4.0)
B電源(15V〜)およびケーブル
C『MPLAB IDE』(Microchip社のホームページからダウンロード)
D実験用ボード(ブレッドボード)および電源(5V)
Eプログラム作成に使うファイル(筆者のホームページからダウンロード)
1−3.最初の実験 ・・・ 開発しやすい環境の確立をめざして
@プログラム作成
Aアセンブル
Bマイコンへ書き込み
C実験用ボードで確認
Dデバッガーの活用
1−4.PICマイコンに関すること ・・・ これくらいは知っておきたい
@一般的な特徴
A3種のメモリ(プログラムメモリ、データメモリ、EEPROM)
BI/Oポート
Cオシレータ
1−5.本書に登場するPICマイコン ・・・ それぞれの特徴と機能
@16F84A ・・・ 18ピン
A16F88、16F819 ・・・ 18ピン
B12F675 ・・・ 8ピン
C16F876A ・・・ 28ピン
D16F877A ・・・ 40ピン
1−6.プログラミングに向けての第一歩 ・・・ 入門のための基礎知識
@ビット、バイトおよび二進数、十六進数
Aフローチャート
B「WAIT」
Cサブルーチン
Dデータ(テーブル)
1−7.PICマイコンのアセンブラMPASM ・・・ 約束ごと
@プログラムの書き方
Aデータメモリについて(Bank(バンク)切り替えとは)
Bコンフィギュレーションビッツについて
CW(ワーキング)レジスタ、変数(ファイルレジスタ)、定数(リテラル)
DSTATUSレジスタについて
E足し算、引き算
【Chapter2. 16F84Aでできること】=基本から発展まで=
2−1.基本編その1 ・・・ LEDによる表示でプログラミングに慣れる
@LEDを思いのままに点滅させる
P2_1_1A ・・・ PORTBの8個のLEDを1秒間隔で互い違いに点滅させる
P2_1_1B ・・・ P2_1_1Aの点灯にPORTAのRA0、RA1の点滅を加える
P2_1_1C ・・・ P2_1_1Bの点灯を5回だけ繰り返す
A入力信号に従って点滅させる
P2_1_2A ・・・ RA2を1にするとPORTBのLEDが3回点滅を繰り返す
P2_1_2B ・・・ 二つの入力待ちで、それぞれのサブルーチンをCALL
Bデータに従って点滅させる
P2_1_3A ・・・ PORTBのLEDをイルミネーションのように点灯する
Cセンサの活用とモータの制御を想定してプログラムする
P2_1_4A ・・・ データによってモータを制御する
P2_1_4B ・・・ (センサを想定して)外部からの信号でモータを制御する
D割り込みの機能を確かめる
P2_1_5A ・・・ RB0の信号入力による割り込みを確認する
P2_1_5B ・・・ RB4,--,RB7の信号入力による割り込みを確認する
Eタイマー・カウンタの機能を確かめる
P2_1_6A ・・・ タイマー0を用いて1秒毎のカウントアップをPORTBに表示
P2_1_6B ・・・ 外部からの信号をカウントしてPORTB に表示する
FウエイトでPWMを実現する
P2_1_7A ・・・ PWMでモータの回転数やLEDの明るさをコントロール
2−2.基本編その2 ・・・ LCDによる表示で活用の幅を広げる
@LCDに文字(キャラクタ)を表示する
P2_2_1A ・・・ LCDの任意の位置に任意の文字(キャラクタ)を表示する
A多くの文字をまとめて表示する
P2_2_2A ・・・ 表示したい文字をデータとしてテーブルに書き込む
Bレジスタファイル(変数)の値を二進数、十進数、十六進数で表示する
P2_2_3A ・・・ 変数の値を二進数(0、1)で表示する
P2_2_3B ・・・ 変数の値を1桁、2桁、3桁の十進数で表示する
P2_2_3C ・・・ 変数の値を十六進数で表示する
P2_2_3D ・・・ 256個のキャラクタパターンを表示する
CRAMへのデータの書き込み、読み出し
P2_2_4A ・・・ RAMに40個のデータを書き込み、それをLCDに表示する
D内蔵のEEPROMへのデータの書き込み、読み出し
P2_2_5A ・・・ 内蔵のEEPROMにデータを書き込み、さらにLCDに表示
E時計(経過時間)を表示する
P2_2_6A ・・・ 時間を「00:00:00」で表示する
2−3.発展編 ・・・ さらなる実力の向上を目指して
@LCDにオリジナルのキャラクタを表示する
P2_3_1A ・・・ LCDにオリジナルのキャラクタを書き込み、表示する
A四則演算(十進法)の結果を表示する
P2_3_2A ・・・ 簡単な四則演算を行い表示する
B掛け算・割り算を二進法で行う
P2_3_3A ・・・ 1バイト×1バイトを実行し結果を二進表示する
P2_3_3B ・・・ 2バイト÷1バイトを実行し結果を二進表示する
CUSART通信(PCとの送受信、音声LSI)
P2_3_4A ・・・ RS232C接続でPCと送受信する
P2_3_4B ・・・ 音声合成LSIにデータを送る
DSPI通信(音声LSI)
P2_3_5A ・・・ 音声合成LSIにデータを送る
EI2C通信(音声LSI、外付けEEPROM、各種LCD、RTC)
P2_3_6A ・・・ 音声合成LSIにデータを送る
P2_3_6B ・・・ 外付けのEEPROMとデータを送受信する
P2_3_6C ・・・ I2C用のLCD(ストロベリーリナックス)を活用する
P2_3_6D ・・・ I2C用のLCD(ACM1602)を活用する
P2_3_6E ・・・ RTC(Real Time Clock)を活用する
F外付けEEPROMに乱数を書き込んで活用する
P2_3_7A ・・・ EEPROMに1024個の乱数を書き込む
P2_3_7B ・・・ 乱数を活用してLCDにランダムに表示する
【Chapter3. 16F84Aではできないこと】=他のPICマイコンの活用=
3−1.小型・大型のPICマイコンおよび高機能のPICマイコンについて
@12F675(12F629)・・・ 8ピン
A16F819(16F88)・・・ 18ピン
B16F876A(16F886)・・・ 28ピン、16F877A(16F887)・・・
40ピン
3−2.内蔵オシレータの活用
@12F675(12F629)の場合
A16F819(16F88)の場合
B16F886(16F887)の場合
3−3.A/D変換の活用
@A/D変換の仕組みについて
A12F675の場合
B16F819の場合
C16F88の場合
D16F87XAの場合
EA/D変換の活用例
P3_3_6A ・・・ 10秒ごとに入力電圧を表示する(12F675)
P3_3_6B ・・・ 4つのチャンネルからの入力を保存し表示(16F877A)
3−4.タイマー1、タイマー2(PWM)の活用
@16F877Aでタイマー1を活用する
P3_4_1A ・・・ 1秒毎のカウントアップをLCDに表示する(16F877A)
A16F877Aでタイマー2を活用する
P3_4_2A ・・・ PWMの効果を目で確かめる(16F877A)
3−5.コンパレータの活用
@16F88でコンパレータを活用する
【Chapter4. プログラミングの基本】=必要に応じて参照=
4−1.MPASMの35個の命令
@MOVLW、MOVFWとMOVWF(数値の代入)
AGOTO(ジャンプ)とCALL、RETURN(サブルーチン)
BBCF、BSF(ビット操作)
CSUBLW、SUBWF(引き算)とADDLW、ADDWF(足し算)
DINCF(増加)とDECF(減少)
EINCFSZ、DECFSZ(増加・減少における分岐<スキップ>)
FBTFSC、BTFSS(ビットの値での分岐<スキップ>)
GCLRF(クリア)
HRRF、RLF(ローテーション)
Iその他
4−2.流れを分岐させる( IF 〜 THEN 〜 ELSE 〜 )
@ビットの0か1かで分岐・・・「BTFSS」、「BTFSC」を用いる
A変数の値で分岐 ・・・「SUBLW」、「SUBWF」とセットで用いる
4−3.ある処理をn回繰り返す( FOR 〜 NEXT )
@定番の「DECFSZ」を用いる
A「SUBLW」を用いる(その1)
B「SUBLW」を用いる(その2)
C多重構造にして繰り返しの回数を増やす
4−4.ウエイトの公式で任意の待ち時間を作る
@任意のウエイトを作る公式
Aきわめて短いウエイトを作るには
4−5.いつでもどこでも便利に活用できるサブルーチン
@サブルーチンの活用の仕方
Aサブルーチン
・「ADD」― 足し算(十進の4桁+4桁)
・「CGRAM_1」― CGRAM(日、月、火、水、木、金、土、年)
・「CGRAM_2」― CGRAM(棒グラフ)
・「CGRAM_3」― CGRAM(人型)
・「CGRAM_X」― CGRAM(白紙=作成用)
・「CLOCK_1」― 経過時間を1秒毎に 00:00:00 で表示
(1秒毎、10秒毎、1分毎、10分毎、1時間毎、10時間毎のタイマー可)
・「CLOCK_2」― 経過時間を1秒毎に 00:00:00 で表示(秒、分、時間の3変数)
・「DISP_1」― 変数を3桁の十進で4個×4行で表示(左端にデータのカウントを表示)
・「DISP_2」― 外付けのEEPROMのデータを2桁の十六進または3桁の十進で4×4で表示
・「DISP_2X」― 外付けのEEPROMのデータを2桁の十六進または3桁の十進で4×2で表示
・「DISP_ADCX」― 外付けEEPROM内のA/D変換のデータを「DISP_ADX」に続けて表示(スイッチで1行毎の更新が可能)
・「DISP_ADX」― 1行目に"AD1 AD2 AD3 AD4"を表示
・「DISP_BIN」― 1バイトの変数を二進で表示
・「DISP_DECI」― 2バイトの変数を十進で表示
・「DISP_NUM0」(空位の0をすべて表示する)
<DISP_N1> ― 十進で1桁表示 <DISP_N2> ― 十進で2桁表示
<DISP_N3> ― 十進で3桁表示
・「DISP_NUM」(十進では最上位の0を表示しない)
<DISP_N1> ― 十進で1桁表示 <DISP_N2> ― 十進で2桁表示
<DISP_N3> ― 十進で3桁表示 <DISP_H2> ― 十六進で2桁表示
・「DIV」― 割り算(十進の255以下÷255以下)
・「DIVI_BIN」― 二進の割り算(2バイト÷1バイト)
・「I2C_0A」― I2C通信(ポートA)
・「I2C_0B」― I2C通信(ポートB)
・「I2C_0C」― I2C通信(ポートC)
・「I2C_0G」― I2C通信(ポートG)
・「I2C_EEPROM」― 外付けのEEPROM(I2C)へのデータの書き込みおよび読み出し
・「INT_EEPROM」― 内蔵のEEPROMへのデータの書き込みおよび読み出し
・「INTRPT」― 割り込み
・「LCD_INI_B」― LCDをポートBにつなぐ場合の初期化
・「LCD_INI_D」― LCDをポートDにつなぐ場合の初期化
・「LCD_LIX_INI」― ストロベリーリナックス社のLCD(I2C)の初期化
・「LCD_TBL」― TABLEを用いてLCDに一連の文字を表示
・「MULT_BIN」― 二進の掛け算(1バイト×1バイト)
・「MULTI」― 掛け算(十進の255以下×255以下)
・「POS_SET」― 20×4のLCDで表示位置を指定
・「PWM_0」― ウエイトによるPWM
・「RAND_NUM」― (FC00H〜FFFFHに書き込まれた)乱数の読み出し
・「RTC_INI」― RTCの初期設定
・「SPI」― SPI通信
・「SUB」― 引き算(十進の4桁−4桁)
・「USART」― USART通信
・「WAIT」― 各種ウエイト(任意の時間設定が可能)
・「WAIT_0」― 基本となるウエイト(0.1Sec、1Sec)
【資料】
1.本書に登場するPICマイコン一覧
2.レジスタファイル
3.ビット・バイトおよび十六進数の変換表
4.Microchip社のホームページ
|
秋月電子の「AKI−PICプログラマーVer4.0」:
PICマイコンにプログラムを書き込む装置 |
実験用ボード: 信号の出力、入力を試すことで、プログラミングの基本を習得する |
LCD(液晶表示器)を活用する実験: データ等を表示できれば活用の幅が広がる |
十進数の表示: 3桁の表示で最上位の0を空欄にできると見易い |
四則演算: アセンブラは1バイト同士の加法と減法が可能、2バイト同士の加減法と乗法・除法はプログラミングで |
外付けのEEPROMとLCDをI2C通信で接続する実験:
I2Cの機能を備えたパーツならば、何個でも2本の線でつなげることが可能になる
|
乱数を活用する実験: EEPROMに書き込んだ乱数を使って、オリジナルのキャラクタをランダムに表示 |
8ピンのPIC12F675の活用: I2CのミニLCDに、10秒毎のAD変換値を経過時間とともに表示 |
40ピンのPIC16F877Aの活用: 4個のAD変換値をEEPROMに保存してLCDに表示、データの保存は数万個可能 |
RTC(Real Time Clock)の活用:
スタート時に時間設定を行えば、年、月、日、曜日、時、分、秒の表示ができる(1秒ごとに更新) |
オリジナルのキャラクタによるディスプレイ:
LCDにオリジナルのキャラクタを書き込めば(8個まで)、独自の表示が可能になる
|