職業訓練42日目 H8マイコン入門(アセンブラ言語による実習)
LEDの制御
LEDの点灯
早速、使用したソースコードから。
.CPU 300HA ; CPUの指定(アドレス空間は24ビット) .SECTION PROG1, CODE, LOCATE=H'000000 ; メモリの0番地から書き込むコードで、PROG1というセクション名 P1DR .EQU H'FFFFC2 ; ポート1のDRアドレスをP1DRというシンボルに設定 P1DDR .EQU H'FFFFC0 ; ポート1のDDRアドレスをP1DDRというシンボルに設定 .SECTION ROM, CODE, LOCATE=H'000100 ; メモリの100番地から書き込むコードで、ROMというセクション名 MOV.L #H'FFFF00, ER7 ; SP(スタックポインタ)にRAMのアドレスを設定 MOV.B #H'FF, R0L ; 出力用設定データを汎用レジスタに書き込む MOV.B R0L, @P1DDR ; ポート1を出力用に設定する MOV.B #B'10101100, R0L ; LED点灯データを汎用レジスタに書き込む MOV.B R0L, @P1DR ; ポート1へ点灯データを出力する LOOP: JMP @LOOP ; 待機 .END ; プログラム終了
「MOV」や「JMP」は読んで字の如しなので、説明は割愛。
ちょっと面倒だなと思ったのが、データを汎用レジスタ経由じゃないと書き込めないところ。
回路的に直接つながっていないので仕方がないけど…。
実際にやってみて「?」となったのは、「ポート」の概念。
そういえば、H8のアーキテクチャのとき、ポートについてやってなかった気がする。
ポート
ポートの概要
H8/3048Fには、以下のポートが存在する。
- 入出力ポート×10個(ポート1〜6、8、9、A、B)
- 入力専用ポート×1個(ポート7)
→ポート2、4、5では、入力用のプルアップ抵抗の働きをさせることが可能
ポートの使い方
各ポートは、データディレクションレジスタ(DDR)とデータレジスタ(DR)から構成される。
どちらも8ビットのレジスタで、内部I/Oレジスタに割り当てられている。
プルアップ機能の設定は、ポートプルアップMOSコントロールレジスタ(PCR)で行う。
ポートの各ビットを入力用か出力用のどちらで使用するかを指定する。
"0"でクリアしたビット→入力用の端子
"1"をセットしたビット→出力用の端子
書き込み専用のレジスタのため、ビット操作命令を使用するとエラーになることがある。
- DR
ポートへデータを入出力するためのレジスタ。
入力設定のポートのビット→そのビットの値("0"か"1")がDRの対応するビットに入力される
出力設定のポートのビット→DRの対応するビットの値("0"か"1")が出力される
"0"でクリアしたビット→プルアップ無効(初期値は"0")
"1"をセットしたビット→プルアップ有効
各ポートの割り当ては、前回も紹介したコチラを参照。
http://www.takamisawa.org/gcc/3048F.html
LEDの点灯
ポートの説明が終わったところで、再びLEDに戻ります。
上記のコードだと、データ"0"でLEDが点灯するので、
データを反転して出力してみる。
.CPU 300HA .SECTION PROG2, CODE, LOCATE=H'000000 P1DR .EQU H'FFFFC2 P1DDR .EQU H'FFFFC0 .SECTION ROM, CODE, LOCATE=H'000100 MOV.L #H'FFFF00, ER7 MOV.B #H'FF, R0L MOV.B R0L, @P1DDR MOV.B #B'10101100, R0L NOT.B R0L ; ここでデータを反転! MOV.B R0L, @P1DR LOOP: JMP @LOOP .END
スイッチ入力
使用しているマイコンのマザーボードには、8ビットのDIPスイッチが付いていて、
ポート2のP20〜P27に接続されている。
スイッチで設定した通りにLEDを点灯させるプログラム。
.CPU 300HA .SECTION PROG3, CODE, LOCATE=H'000000 ; 各ポートのアドレスにシンボルを設定 P1DR .EQU H'FFFFC2 P1DDR .EQU H'FFFFC0 P2DR .EQU H'FFFFC3 P2DDR .EQU H'FFFFC1 P2PCR .EQU H'FFFFD8 .SECTION ROM, CODE, LOCATE=H'000100 MOV.L #H'FFFF00, ER7 ; SPの設定 MOV.B #H'FF, R0L MOV.B R0L, @P1DDR ; ポート1を出力に設定 MOV.B #H'00, R0H MOV.B R0H, @P2DDR ; ポート2を入力に設定 MOV.B R0L, @P2PCR ; ポート2のプルアップを有効にする LOOP: MOV.B @P2DR, R0L ; ポート2からスイッチデータを入力 MOV.B R0L, @P1DR ; ポート1へ点灯データを出力 JMP @LOOP ; ラベル「LOOP」まで繰り返し .END
職業訓練41日目 H8マイコン入門(アセンブラ言語による実習)
アセンブラ言語の基礎
アセンブラ言語とは
CPUが理解できる言語 = マシン語(二進数)
→人間には分かりにくいので、人間にも分かりやすい記号(ニーモニック)で
プログラムを作成する。
ニーモニックコードの集まり = アセンブラ言語
アセンブラ制御命令
アセンブラを制御するための命令 = アセンブラ制御命令(疑似命令)
例)CPUの種類を指定する、プログラムを格納するアドレスを指定する etc.
- .CPU
H8/3048Fをアドバンストモード、24ビットのアドレス空間で使用する場合。
.CPU 300HA [:24] ; [:24]は省略可能
- .SECTION
セクション名、属性、形式を指定する。
属性には、コード(CODE)、データ(DATA)、コモン(COMMON)、スタック(STACK)、
ダミー(DUMMY)がある。
形式とは、アドレス指定方法のことで、LOCATEで絶対アドレス形式、ALIGNで相対アドレス形式を指定する。
.SECTION PROG1, CODE, LOCATE=H'000000
全アセンブラ制御命令を知るには、以下のマニュアルを参照(PDF注意)。
http://documentation.renesas.com/jpn/products/tool/j702038_h8s.pdf
職業訓練40日目 H8マイコン入門(H8/3048Fマイコンの基礎)
メモリ
メモリマップ
メモリや外部バスの選択法によって7種類の動作モードがある。
動作モードの種類については、以下のリンクを参照。
http://www.takamisawa.org/gcc/3048F.html
テキストで使用しているのは、モード7のシングルチップアドバンストモード。
→外部メモリを接続せず、内蔵のRAMとROMを利用する。
モード7では、RAMとROMが以下の番地に割り当てられる。
- ROM:00000H〜1FFFFH番地
- RAM:FEF10H〜FFF0FH番地
FFF1CH〜FFFFFH番地には、
内蔵周辺機能の動作やポートの設定を行うための内部I/Oレジスタが割り当てられている。
→メモリマップに周辺機能を割り当てて使用する方式:メモリマップドI/O方式
RAM
FEF10H〜FFF0FH番地に割り当てられている。
CPUと16ビットの内部データバスで接続されており、
バイト(8ビット)単位、またはワード単位(2バイト)単位で読み書き可能。
バイトデータは上位8ビット、ワードデータは16ビット全て使用し、
両者とも2クロックでアクセス可能。
メモリ1領域の幅は8ビットで、
ワード単位のデータアクセスをする場合は2領域を使用するため、
偶数番地のアドレスを指定する必要がある。
ROM
00000H〜1FFFFH番地に割り当てられている。
CPUと16ビットの内部データバスで接続されており、
バイト(8ビット)単位、またはワード単位(2バイト)単位で読み書き可能。
バイトデータは上位8ビット、ワードデータは16ビット全て使用し、
両者とも2クロックでアクセス可能。
有効/無効の設定は、モード設定端子のピンを使用し、動作モードを選択する。
職業訓練39日目 H8マイコン入門(マイコンでのデータ表現)
「2進数」「16進数」「ディジタル回路(の前半)」はサックリと割愛。
マスク操作
ビットを0にマスクする
0でAND演算を行う。
例)下位4ビットを0にマスクする。
11011001 元データ AND)11110000 マスクデータ = 11010000
ビットを1にマスクする
1でOR演算を行う。
例)上位2ビットを1にマスクする。
10010110 元データ OR)11000000 マスクデータ = 11010110
個々のビットの状態を調べる
調べたいビットを1、他のビットを0でAND演算を行う。
例)4番目のビットの状態を調べる。
10011101 元データ AND)00001000 マスクデータ = 00001000
シフト操作とローテート操作
算術シフト
- 左シフト
→最上位ビット(MSB)を符号情報として、消失しないようにCフラグへ格納する。
最下位ビット(LSB)には、0を代入する。
C←101100101←0 1←011001010
- 右シフト
→符号を変化させないよう最上位ビット(MSB)は移動しない。
空いたビットには符号と同じビットが入る。
101100101→C 110110010→1
論理シフト
符号ビットを考慮せずにシフト操作を行う。
- 左シフト
C←101100101←0 1←011001010
- 右シフト
0→101100101→C 010110010→1
ローテイト操作
(キャリーなし)ローテート
- 左ローテート
→MSBから出たビットデータはLSBに移動する。
Cフラグにも反映される。
C←10100110←MSB 1←01001101
- 右ローテート
→LSBから出たビットデータはMSBに移動する。
Cフラグにも反映される。
LSB→10100110→C 01010011→0
キャリーつきローテート
Cフラグを移動ビットに含めてローテートを行う。
- 左ローテート
0←10100110←C 1←01001100
- 右ローテート
C→10100110→1 11010011→0
職業訓練38日目 H8マイコン入門(H8マイコンとは)
H8の主なシリーズ
- 16ビット
- H8/500
- H8/300H
- H8/300H Tiny
- H8S/2000
- 8ビット
- H8/300
- H8/300L
代表的な機種
H8/3048F
- H8/300Hシリーズ
- ROM:128KB
- RAM:4KB
- A-D/D-Aコンバータを搭載
→今回使うのはコレ!
H8/3664F
- H8/300H Tinyシリーズ
- H8/3048Fより機能は少ないが、安価で扱いやすい
- ROM:32KB
- RAM:2KB
- A-Dコンバータを搭載
開発ツール
ソースファイル
↓
アセンブラ・コンパイル
↓
リンカ
↓
マシン語
ソフトウェア
- HEW
- 秋月電子通商版
今回使用するキットはコレなので(多分…)、
開発ツールは後者の方ですね。
http://akizukidenshi.com/catalog/g/gK-00004/
職業訓練37日目 H8マイコン入門(マイコン制御の基礎)
CPUの区分
RISC
ハードウェアは(CISCに比べると)大きい。
パイプライン処理の効率が良い。
代表的なCPU
授業では、サラッとやっただけなので、
今日もWikipediaで逃げるとしますか…。
CISC - Wikipedia
RISC - Wikipedia
パイプライン処理
ベルトコンベヤーみたいなヤーツ…。
うん、上手く説明できない…orz。
こういうときはリンクで逃げよう…。
http://journal.mycom.co.jp/column/architecture/124/index.html
つまり、RISCだと命令語長が固定なので、
パイプライン処理をする回路を作りやすい、ってことですね。
テキストの内容は割愛して、板書の内容だけまとめてみました。
- 作者: 堀桂太郎
- 出版社/メーカー: 東京電機大学出版局
- 発売日: 2003/01/01
- メディア: 単行本
- 購入: 2人 クリック: 47回
- この商品を含むブログ (6件) を見る
職業訓練36日目 ハンダ付けの練習
本来なら、前回のテキストの続きをやる予定でしたが、
建物の改修工事の騒音が大きく、座学は中止して、
丸一日ハンダ付けの練習をしました。
不器用なので、なかなか上手くいきませんね…。
すぐ出来ちゃう人がうらやましい。
でも、うらやんでいても仕方がないので、人一倍練習します!
今のカリキュラムの特徴の一つが「鉛フリー」のハンダ付けに慣れること。
従来のハンダは「スズ(Sn)+鉛(Pb)」で出来たものが主流だったのが、
最近では、有害物質である鉛が含まれていないハンダ付けの必要性が増してきているとのこと。
その辺の詳しい話は、Wikipediaへのリンクで逃げるとして、
ハンダ付けをする側として気をつけなければいけないことは、
従来のハンダ付けよりも、融点が高くなること。
自分みたいな不器用な人間がチンタラやってたら、
高温に弱いICを壊してしまいやしないか心配です。
●鉛フリーはんだの利用を促しているRoHS指令
RoHS - Wikipedia
●鉛フリーはんだの「材質」が詳しくですね
鉛フリーはんだ - Wikipedia
●HAKKOさんのページも詳しいです
[HAKKO] 白光株式会社 | 製品情報 | 鉛フリーはんだ付け
●使っているハンダゴテはこちら(だったはず)
[HAKKO] | はんだこて | HAKKO 933/934
同じの欲しいけどちょっと高いかなぁ…。
ちなみに、以前読んだ『Make:Electronics』のショッピングリストには、
ハンダ関連は主に以下のものが必要と書いてある。
- 15ワットのペンシル型(ストレート型)ハンダごて
- 30〜40ワットの汎用ハンダごて
- 0.6mmの糸ハンダ
- 1.2mmの糸ハンダ
(鉛については「鉛フリーであることを確認した方がよい」とあります…)
さらにちなみに、『CPUの創りかた』には、
「半田こては20〜30W程度のものがよいと思います。」とあります。
オススメのこてはコチラだそうです。
- 出版社/メーカー: 太洋電機産業(goot)
- メディア: Tools & Hardware
- 購入: 1人 クリック: 11回
- この商品を含むブログ (1件) を見る
- 出版社/メーカー: 太洋電機産業(goot)
- メディア: Tools & Hardware
- クリック: 10回
- この商品を含むブログ (1件) を見る
でも、いろいろ調べてる時間があったら、
何でもいいからハンダゴテ買ってきて練習した方がいいですよね…orz