職業訓練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

プログラムの書き方
ラベル オペレーション オペランド

 

  • ラベル

その行が格納されているメモリ上のアドレスを示す記号。
条件分岐やサブルーチンの分岐先の名前として、任意の行に付ける。

  • オペレーション

実行命令、アセンブラ制御命令などを記述する。

オペレーションの操作対象となるデータを記述する。
例)アドレス、レジスタ etc.

  • コメント

「;(セミコロン)」から始まる行はコメント。

  • 定数

整数定数と文字列定数がある。
よく登場するのは整数定数なので、そっちだけまとめる。

進数 記号
2 B' B'0010
8 Q' Q'012
10 D' D'23
16 H' H'0D

 

開発の手順([]括弧内は使用ソフト)
  1. ソースプログラムの記述
  2. アセンブル [A38H.EXE]
  3. リンク [L38H.EXE]
  4. コンバージョン [C38H.EXE]
  5. ROMに転送 [FLASH.EXE]

職業訓練40日目 H8マイコン入門(H8/3048Fマイコンの基礎)

アーキテクチャ

アーキテクチャの概要
CPU H8/300H
RAM 4KB
ROM 128KB
最大動作クロック 16MHz

 

H8/3048Fの考え方
  • CPU
  • メモリ
  • 入出力ポート
  • 周辺機能

メモリ

メモリマップ

メモリや外部バスの選択法によって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クロックでアクセス可能。
有効/無効の設定は、モード設定端子のピンを使用し、動作モードを選択する。

CPU

CPUの構成
汎用レジスタ(ERn)

32ビットの汎用レジスタを8本(ER0〜ER7)備える。
ER7はSP(スタックポインタ)として使用することが可能なため、
利用する際は注意が必要。
32ビットを分割することによって、16ビットまたは8ビットレジスタとして使用可能。
初期値は不定なので、初期化が必要な場合もある。

コントロールレジスタ
  1. PC:CPUが次に実行する命令のメモリのアドレスを格納するレジスタ
  2. CCR:CPUの内部状態を示す8ビットのレジスタ
スタックポインタ

サブルーチンを実行後に戻ってくるアドレスを格納する。
サブルーチンがネストしている場合、複数の戻りアドレスを格納する必要があるため、
スタックになっている。

職業訓練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コンバータを搭載

開発ツール

ソースファイル
 ↓
アセンブラコンパイル
 ↓
リンカ
 ↓
マシン語

ソフトウェア
  1. HEW
  2. 秋月電子通商

今回使用するキットはコレなので(多分…)、
開発ツールは後者の方ですね。
http://akizukidenshi.com/catalog/g/gK-00004/

職業訓練37日目 H8マイコン入門(マイコン制御の基礎)

CPUの区分

  1. 可変命令語長 → CISC
  2. 固定命令語長 → RISC
CISC

ハードウェアは(RISCに比べると)小さい。
コンパイラが作りやすい。

代表的なCPU

RISC

ハードウェアは(CISCに比べると)大きい。
パイプライン処理の効率が良い。

代表的なCPU

授業では、サラッとやっただけなので、
今日もWikipediaで逃げるとしますか…。
CISC - Wikipedia
RISC - Wikipedia

パイプライン処理

ベルトコンベヤーみたいなヤーツ…。

うん、上手く説明できない…orz。
こういうときはリンクで逃げよう…。
http://journal.mycom.co.jp/column/architecture/124/index.html

つまり、RISCだと命令語長が固定なので、
パイプライン処理をする回路を作りやすい、ってことですね。


テキストの内容は割愛して、板書の内容だけまとめてみました。

H8マイコン入門

H8マイコン入門

職業訓練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 一般電気用はんだこて KS-20R

goot 一般電気用はんだこて KS-20R

goot 一般電気用はんだこて KS-30R

goot 一般電気用はんだこて KS-30R

こちらは随分リーズナブルで良いですな。

でも、いろいろ調べてる時間があったら、
何でもいいからハンダゴテ買ってきて練習した方がいいですよね…orz