第 6 章機上搭載機器について

成岡優

2006 年 10 月 15 日

全般の説明

全体説明で示したとおり、室内飛行機の機体上にはマイコンを搭載した制御機器がある。制御機器の外観を図 1 に示す。図中で中央に見える部分が本プロジェクトで作成した制御機器である。

図 1 制御機器の外観

この制御機器では、まず、無線を通じてラジコン受信機に送られてきた制御情報や外界の情報 (機体の位置等) をデコードするとともに、加速度計や超音波センサを利用して機体の姿勢や詳細な位置を取得する。ラジコン受信機とマイコンの接続図を図 2 に、超音波センサとマイコンの接続図を図 3 にあげる。加速度計はマイコンに内蔵の A/D 変換の機能を利用して取り込んでいる。

そして、これらの情報を元にモーターやラダー、エレベータの制御量を計算し、それらを駆動するためのスピコンやサーボに対して適切なパルス信号を発行する。パルスはマイコンに内蔵のタイマの機能を利用して行っている。これらは全て同時に処理される。

以下、開発環境の構築、開発手順について説明をした後、作成したソフトウェア、ハードウェアについて記載する。

開発環境の構築

1. Cygwin をインストールする。この後 gcc や make、 wget が必要になるので、パッケージの選択画面で忘れずにインストールすること (参考:コンパイラ導入手順)。

2. 開発環境を以下のコマンドにより構築する (参考:h8300-elf Makefile)。かかる時間は 2006 年 8 月現在の早いマシンにおいても 3 時間程度なので、暇なときに行うこと。

図 2 ラジコン受信機とマイコンの接続図

図 3 超音波センサとマイコンの接続図

1 $ if ![ − d /usr/local/src ]; then mkdir /usr/local/src; fi
2 $ cd /usr/local/src
3 $ wget http://fenrir.naruoka.org/download/embedded/h8devel.makefile
4 $ make − f h8devel.makefile

3. ソースコード一式を特定のディレクトリに展開する。

開発手順

1. プログラムを編集後、以下のコマンドを実行する

1 $ cd indoor
2 $ make Makefile

2. build by gcc に test.mot というファイルができるので、適当な書込みソフト (例えば StrawberryLinux の落合さんが開発された H8WriteTurbo など) を使ってプログラムを H8/3694 マイコンに書込む。書込みの際はジャンパピンの設定に注意すること。

ソフトウェア

機上搭載機器のためにプログラムを作成した。このプログラムは機体搭載機器の中の H8/3694 で動作するものである。以下に全ソースコードを掲載する。

./
indoor/ ....................................................室内飛行機プロジェクトに特化したソース
Makefile [1] .................................................プロジェクト全体ビルド用ファイル
common.h [2] ........................................................................共通ヘッダ
test.c [3] ....................................................................メインプログラム
ultra sonic.h [4]
ultra sonic.c [5] ......................................超音波モジュールとのインターフェイス
framework/ ....................................................他プロジェクトで再利用可能なソース
dependency/ .....................................................................マイコンに依存
AKI3694/ ......................................................秋月電子 H8/3694F 用ファイル
Makefile [6]
rom.x [7] ...............................................................リンカスクリプト
romcrt0.S [8] ...................................................スタートアップルーチン
3694.h [9] ......................................................................I/O 定義
AKI3694.h [10]
dependency.c [11] ...............................................割り込み許可/拒否など
common.h [12] ................................................................共通ヘッダ
ad.h [13]
ad.c [14] .......................................................................A/D 変換
sci.h [15]
sci.c [16] ...............................................シリアルインターフェイス (SCI)
timer.h [17]
timer.c [18] ..................................................................... タイマ
wdt.h [19]
wdt.c [20] ..................................................ウォッチドックタイマ (WDT)
util/ ...........................................................................マイコンに非依存
Makefile [21]
common.h [22] ...................................................................共通ヘッダ
conv.h [23]
conv.c [24] ....................................................数文字変換、 printf の代用品
fifo char.h [25]
fifo char.c [26] .................................................リングバッファ (char 型)
fifo num.h [27]
fifo num.c [28] ....................................................リングバッファ (数値型)

ソースコード 1 indoor/Makefile

1 PRE = h8300− elf−

2 export CC = $(PRE)gcc
3 export OBJCPY = $(PRE)objcopy

4

5 export BUILD DIR = $(CURDIR)/build by gcc
6 NEWLIB DIR = /usr/local/h8300− elf/lib/h8300h
7 ROOT DIR = $(CURDIR)
8 FRAMEWORK = $(ROOT DIR)/../ framework
9 DEPENDENCY = $(FRAMEWORK)/dependency/AKI3694
10 UTIL = $(FRAMEWORK)/util
11 OTHER PACKAGE = $(UTIL) $(DEPENDENCY)
12 INCLUDES = \
13 − I$(ROOT DIR) $(patsubst %,− I%, $(OTHER PACKAGE)) \
14 − I$(FRAMEWORK) \
15 − I/usr/local/h8300− elf/include

16

17 # ROMTARGET
18 STARTUP = $(DEPENDENCY)/romcrt0.S
19 LDSCRIPT = $(DEPENDENCY)/rom.x

20

21 export CFLAGS = \
22 $(INCLUDES) \
23 − Wall − mh − g − mrelax − gdwarf−2 − mint32 #− ansi − O2
24 export LDFLAGS = \
25 − nostdlib − nostartfiles− nodefaultlibs − mrelax − L$(NEWLIB DIR) − lc − lm − lgcc \
26 − T $(LDSCRIPT) − Wl,− Map,$(MAP) − Wl,− static

27

28 TARGET = test
29 GOAL = $(TARGET).elf $(TARGET).mot $(TARGET).abs

30

31 SRCS = $(shell ls ∗.c)
32 MAP = $(BUILD DIR)/$(TARGET).map

33

34 all : $(BUILD DIR) $(patsubst %, $(BUILD DIR)/%,$(GOAL))
35 @echo COMPLETED.

36

37 $(BUILD DIR) :
38 mkdir $@

39

40 $(BUILD DIR)/%.mot : $(BUILD DIR)/%.elf
41 $(OBJCPY) − O srec $< $@

42

43 $(BUILD DIR)/%.abs : $(BUILD DIR)/%.elf
44 cp $< $@

45

46 $(BUILD DIR)/%.elf : $(STARTUP) $(SRCS) $(BUILD DIR)/∗.o
47 $(CC) $ˆ $(CFLAGS) $(LDFLAGS) − o $@

48

49 $(STARTUP) :

50

51 $(BUILD DIR)/∗.o : other package

52

53 other package :
54 for package in $(OTHER PACKAGE); do \
55  (cd $$package && $(MAKE)); \
56 done

57

58 clean:
59 for package in $(OTHER PACKAGE); do \
60  (cd $$package && $(MAKE) clean); \
61 done
62 rm − f $(BUILD DIR)/∗

63

64 .PHONY: clean all other package

ソースコード 2 indoor/common.h

1 #ifndef COMMON H
2 #define COMMON H

3

4 /∗
5 ∗ 共通ヘッダ
6 ∗
7 ∗ @author fenrir (M.Naruoka)
8 ∗ @since 04/06/03
9 ∗ @version 1.0
10 ∗ @see ad.c
11 ∗/

12

13 #define DEBUG 0

14

15 #define FIFO CHAR SIZE T unsigned char

16

17 #define FIFO NUM SIZE T unsigned char
18 #define FIFO NUM T unsigned short

19

20 #define AD ONLY 4
21 #define AD BUFFER SIZE 16

22

23 #define WDT TMWD SETTING 0x0F

24

25 /∗タイマA の設定
26 ∗
27 ∗ インターバルタイマとして動作するように
28 ∗ Φ/512
29 ∗ 20MHz/(512 ∗ 256) = 160Hz= 6.4ms で割り込みがかかるようにする
30 ∗/
31 #define TIMER A SETTING 0x03

32

33 #define SCI3 TX BUFFER SIZE 64
34 #define SCI3 RX BUFFER SIZE 16

35

36 /∗∗
37 ∗ IRQ コントロール
38 ∗/
39 #ifdef cplusplus
40 extern "C"
41 {
42 #endif

43

44 extern void enableIRQ();
45 extern void disableIRQ();
46 extern void sleep();
47 extern void nop();

48

49 #define sci dump(str) sci3 write(str, strlen(str))
50 //#definesci dump(str) printf(str)

51

52 #ifdef cplusplus
53 };
54 #endif

55

56 /∗∗
57 ∗ 定数
58 ∗/
59 #define TRUE 1
60 #define FALSE 0
61 #define EXIT 0
62 #define CONTINUE 1

63 #define VOID −1
64 #define PI 3.14159
65 #define INIT STR "Initial ."
66 #ifndef NULL
67 #defineNULL 0
68 #endif

69

70 /∗ユーティリティ ∗/
71 #define min(a, b) ((a <= b) ? a : b)
72 #define max(a, b) ((a >= b) ? a : b)
73 #define pow2(x) (x ∗ x)

74

75 #endif /∗ COMMON H ∗/

ソースコード 3 indoor/test.c

1 #include <stdio.h>
2 #include <string.h>

3

4 /∗非依存ヘッダ ∗/

 5 #include "common .h"
 6 #include "ultra_sonic  .h"

7

8 /∗ユーティリティヘッダ ∗/
9 #include <fifo num.h>
10 #include <conv.h>

11

12 /∗依存ヘッダ ∗/
13 #include <AKI3694.h>
14 #include <sci.h>
15 #include <timer.h>
16 #include <ad.h>
17 #include <wdt.h>

18

19 //サーボ (スピコン含む)チャンネル数
20 #define SERVO CH 6
21 unsigned short output pulse[SERVO CH];
22 unsigned short input pulse[SERVO CH];

23

24 //超音波チャンネル数
25 #define ULTRA SONIC CH 1

26

27 //重力加速度、単位はmm/sˆ 2
28 #define SCALE 1G 9806

29

30 //サーボに与えるパルス幅の設定
31 #define MAX PULSE WIDTH 22000
32 #define MIN PULSE WIDTH 8000
33 #define MIDDLE PULSE WIDTH 15000

34

35 //サーボのぴくつきを防止するか (1=する、 0=しない)
36 #define ANTI SHAKING 1
37 #if ANTI SHAKING
38 #define SERVO MEAN NUMBER 16
39 unsigned short elevator history[SERVO MEAN NUMBER];
40 unsigned short throttle history[SERVO MEAN NUMBER];
41 unsigned short ludder history[SERVO MEAN NUMBER];
42 #endif

43 44

45 /∗処理ルーチン ∗/

46

47 /∗∗
48 ∗ その他の初期化

49 ∗
50 ∗/
51 void misc init(){

52

53 int i;

54

55 /∗サーボパルス幅の初期化 ∗/
56 for(i = 0; i < SERVO CH; i++){
57  output pulse[i] = MIDDLE PULSE WIDTH;
58  input pulse[i] = MIDDLE PULSE WIDTH;
59 }

60

61 /∗サーボ履歴の初期化 ∗/
62 #if ANTI SHAKING
63 for(i = 0; i < SERVO MEAN NUMBER; i++){
64  elevator history[i] = MIDDLE PULSE WIDTH;
65  throttle history[i] = MIDDLE PULSE WIDTH;
66  ludder history[i] = MIDDLE PULSE WIDTH;
67 }
68 #endif

69

70 /∗LED の有効化∗/
71 //IO.PCR8 = 0x03;
72 IO.PCR8 = 0x01; //P81(LED2)はタイマW(FTIOA)で使用!!

73

74 /∗PORT50〜55 はサーボにつながる∗/
75 IO.PCR5 = 0x3F;

76

77 /∗タイマW の有効化
78  ∗
79  ∗ クロックはφ/2(0.1us)
80  ∗ A=> インプットキャプチャ (割り込み)
81  ∗ B=> インプットキャプチャ (割り込み)
82  ∗ C => アウトプットコンペア
83  ∗ D => アウトプットコンペア
84  ∗/
85 TW.TCRW.BYTE = 0x10;
86 TW.TIOR0.BYTE = 0x47; //B=> 立ち上がりエッジのみ検出
87 TW.TIOR1.BYTE = 0x00;
88 TW.TIERW.BYTE = 0x03;

89

90 /∗カウントスタート ∗/
91 TW.TMRW.BIT.CTS = 1;
92 }

93

94 #define servo high(ch) (IO.PDR5.BYTE |= (0x01 << ch))
95 #define servo low(ch) (IO.PDR5.BYTE &= ˜ (0x01 << ch))

96

97 unsigned char out target ch;

98

99 inline void start pulse timerw(unsigned char ch);

100

101 inline void stop pulse timerw(){

102

103 /∗ポートLow∗/
104 servo low(out target ch);

105

106 /∗次のチャンネルへ ∗/
107 start pulse timerw(out target ch + 1);
108 }

109

110 inline void start pulse timerw(unsigned char ch){

111

112 /∗パラメータの設定 ∗/

113 if((out target ch = ch) >= SERVO CH){
114  /∗割り込み禁止 ∗/
115  TW.TIERW.BIT.IMIEC = 0;
116  return ;
117 }

118

119 TW.GRC = (TW.TCNT + output pulse[ch]);

120

121 /∗ポートHigh ∗/
122 servo high(ch);

123

124 /∗コンペアマッチC で割り込みがかかるようにする∗/
125 if(ch == 0){
126  TW.TSRW.BIT.IMFC = 0;
127  TW.TIERW.BIT.IMIEC = 1;
128 }
129 }

130

131 #define BIT IMFA 0x01
132 #define BIT IMFB 0x02
133 #define BIT IMFC 0x04
134 #define BIT IMFD 0x08

135

136 inline void check pulse(unsigned char flag){
137 static unsigned char target ch = SERVO CH;
138 static unsigned short before count;

139

140 if(target ch < SERVO CH){
141  //奇数 (1,3, ...)
142  if(target ch & 0x01){
143  if(flag& BIT IMFA){
144  unsigned short pulse width
145  = (TW.GRA > before count) ? (TW.GRA − before count) : ˜ (before count − TW.GRA);
146  if(pulse width < MAX PULSE WIDTH && pulse width > MIN PULSE WIDTH){
147  input pulse[target ch] = pulse width;
148  if(flag& BIT IMFB){
149  before count = TW.GRB;
150  target ch++;
151  return ;
152  }
153  }
154  }
155  //偶数 (0,2, ...)
156  }else{
157  if(flag& BIT IMFB){
158  unsigned short pulse width
159  = (TW.GRB > before count) ? (TW.GRB − before count) : ˜ (before count − TW.GRB);
160  if(pulse width < MAX PULSE WIDTH && pulse width > MIN PULSE WIDTH){
161  input pulse[target ch] = pulse width;
162  if(flag& BIT IMFA){
163  before count = TW.GRA;
164  target ch++;
165  return ;
166  }
167  }
168  }
169  }
170  target ch = SERVO CH;
171  TW.TIOR0.BYTE &= ˜ (0x30); //B=> 立ち上がりエッジのみ検出
172 }else{
173  if((flag& (BIT IMFA | BIT IMFB)) == BIT IMFB){
174  before count = TW.GRB;
175  target ch = 0;
176  TW.TIOR0.BYTE |= 0x30; //B=> 両エッジ検出

177  }
178 }
179 }

180

181 #pragma interrupt
182 void int timerw(){

183

184 unsigned char flag= TW.TSRW.BYTE;
185 TW.TSRW.BYTE = 0x00;

186

187 /∗IMFC ∗/
188 if(flag& BIT IMFC){
189  stop pulse timerw();
190 }

191

192 /∗IMFA, IMFB∗/
193 if(flag& (BIT IMFA | BIT IMFB)){
194  check pulse(flag);
195 }
196 }

197

198 #define CALC START 0x01
199 #define COMMAND INIT 0x02
200 unsigned char status = 0;

201

202 /∗∗
203 ∗ タイマA インターバルによる呼び出しルーチン
204 ∗ 6.4ms ごとに呼び出される
205 ∗/
206 void call every 6m4s(){
207 static unsigned char loop = 0;
208 switch(++loop){
209  case 2:
210  start pulse timerw(0);
211  break ;
212  case 3:
213  status |= CALC START;
214  //IO.PDR8.BIT.B1= (IO.PDR8.BIT.B1? 0 : 1); //P81(LED2)はタイマW(FTIOA)で使用!!
215  loop = 0;
216 }
217 }

218

219 #define pulse in range(command) (max(min(command, MAX PULSE WIDTH), MIN PULSE WIDTH))
220 #define pulse in range2(command, range) (max(min(command, MIDDLE PULSE WIDTH + range),
MIDDLE PULSE WIDTH − range))
221 #define pulse in range3(command, range) (max(min(command, range), − range))

222

223 /∗∗
224 ∗ 指令値の計算
225 ∗
226 ∗ @param accel[]
227 ∗ 3軸の加速度 0,1,2の順にX,Y,Z 軸、単位は mm /sˆ 2、
228 ∗ 例えば静止状態では
229 ∗ accel[0],accel[1]には約 0(mm/sˆ 2)
230 ∗ accel[2]には約 9806(mm/sˆ 2)
231 ∗ がセットされている
232 ∗
233 ∗ @param ultra sonic[]
234 ∗ 超音波センサから得られた距離 (未実装なので使わないこと)
235 ∗/
236 inline void calc command(short accel[3], unsigned char ultra sonic[1]){

237

238 /∗
239  ∗ 補足説明

240  ∗
241  ∗ 1.定義済み変数について
242  ∗
243  ∗ 関数の外部で次の変数が定義されています。
244  ∗ input pulse 受信機より得られたパルス幅 (0〜5)
245  ∗ output pulse 実際に送信するパルス幅 (0〜5)
246  ∗
247  ∗ パルス幅の単位は [0.1us]です。
248  ∗ 例えば、双葉のサーボなら
249  ∗ 15200[0.1us]が中心位置 (0度)で
250  ∗ 20200[0.1us]が +90度
251  ∗ 10200[0.1us]が−90 度
252  ∗
253  ∗ 詳しくは、
254  ∗ http://berry.sakura.ne.jp/technics/servo control p3.html
255  ∗ 等に情報があります。
256  ∗
257  ∗ 例えば
258  ∗ int i;
259  ∗ for(i = 0; i < 6; i++){
260  ∗ output pulse[i] = input pulse[i];
261  ∗ }
262  ∗ はマイコンが間に挿入されていないのと同じ状態、
263  ∗ つまり受信機とサーボやスピコンを直繋ぎしたのと同じ状態
264  ∗ を実現します。
265  ∗
266  ∗ 2.コーディング上の注意
267  ∗
268  ∗ 残念ながらマイコンの計算能力が高くないので、
269  ∗ 整数演算を使用するようにしてください。
270  ∗ 小数点演算や三角関数が入ると非常にスピードが落ちます。
271  ∗ 例えば、 0.25 をかける場合は
272  ∗ >> 2 (ビットシフト演算) や
273  ∗ /4 (整数演算)
274  ∗ としてください。
275  ∗ どうしても三角関数等を使用したい場合は相談してください。
276  ∗
277  ∗ 3.この関数の呼び出し速度
278  ∗
279  ∗ この関数は約 50Hz で呼び出されます。
280  ∗/
281 static unsigned char calc invoked = 0;
282 calc invoked++;

283

284 #if ANTI SHAKING

285 //ぴくつき防止用

286 static int elevator sum = MIDDLE PULSE WIDTH ∗ SERVO MEAN NUMBER;
287 static int throttle sum = MIDDLE PULSE WIDTH ∗ SERVO MEAN NUMBER;
288 static int ludder sum = MIDDLE PULSE WIDTH ∗ SERVO MEAN NUMBER;

289

290 unsigned char history index = calc invoked % SERVO MEAN NUMBER;
291 #endif

292

293 unsigned short elevator command;
294 unsigned short ludder command;
295 unsigned short throttle command;

296

297 if(input pulse[4] > MIDDLE PULSE WIDTH){

298 //自動 299 //エレベータ

300  {
301  //const short KE 1= 1;
302  //const short KE 2= 1;
303  /∗

304  elevator command = MIDDLE PULSE WIDTH− 500;
305  elevator command += KE 1∗ accel[0];
306  elevator command += KE 2∗ (accel[2] − SCALE 1G); //エレベータのパルス幅 [0.1us]
307  elevator command = pulse in range2(elevator command, 2000);
308  ∗/
309  elevator command = input pulse[1];
310  }

311

312 //スロットル

313  {

314

315  const short TARGET HIGHT = 300; //目標高度 [∗10 mm]
316  const short KT = 10; //スロットルゲイン
317  short h = ((20000 − input pulse[2]) /1000) ∗ 100; //プロポから送られてきた高度
318  throttle command = pulse in range(18500 + KT ∗ ( TARGET HIGHT − h )); //スロットルのパルス幅 [0.1us]

319

320  //throttle command = input pulse[2];
321  }

322

323 //ラダー

324  {
325  const short KR 1 = 2;
326  //const short KR 2= 2;
327  ludder command = MIDDLE PULSE WIDTH − 1000;
328  ludder command −= accel[1] /KR 1;
329  //ludder command = MIDDLE PULSE WIDTH;
330  //ludder command += accel[1] /KR 1; //ラダーのパルス幅 [0.1us]
331  //ludder command += KR 2∗ (input pulse[3] − MIDDLE PULSE WIDTH); //ラダーのパルス幅 [0.1us]
332  //ludder command = pulse in range2(ludder command, 3500);
333  }

334

335  output pulse[0] = input pulse[2];
336 #if ANTI SHAKING

337 //ぴくつき防止用

338  output pulse[1] = (elevator sum /SERVO MEAN NUMBER);
339  output pulse[2] = (throttle sum /SERVO MEAN NUMBER);
340  output pulse[3] = (ludder sum /SERVO MEAN NUMBER);
341 #else

342 //こっちだとぴくつく

343  output pulse[1] = elevator command;
344  output pulse[2] = throttle command;
345  output pulse[3] = ludder command;
346 #endif
347  output pulse[4] = input pulse[0];
348  output pulse[5] = input pulse[1];
349 }else{

350 //手動

351  int i;
352  for(i = 0; i < 6; i++){
353  output pulse[i] = input pulse[i];
354  }

355

356  elevator command = input pulse[1];
357  throttle command = input pulse[2];
358  ludder command = input pulse[3];
359 }

360

361 #if ANTI SHAKING

362 //ぴくつき防止用

363 elevator sum −= elevator history[history index];
364 elevator sum += (elevator history[history index] = elevator command);
365 throttle sum −= throttle history[history index];
366 throttle sum += (throttle history[history index] = throttle command);
367 ludder sum −= ludder history[history index];

368 ludder sum += (ludder history[history index] = ludder command);

369

370 #define DUMP COMMAND 0
371 #if DUMP COMMAND
372 if(calc invoked % 8 == 0){
373  char buf[32];
374  char ∗buf index = buf;
375  buf index = ushort2string(elevator command, buf index);
376  ∗(buf index++) = '␣';
377  buf index = ushort2string(throttle command, buf index);
378  ∗(buf index++) = '␣';
379  buf index = ushort2string(ludder command, buf index);
380  null char(crlf(buf index));
381  sci dump(buf);
382 }
383 #endif
384 #endif
385 }

386

387 //加速度計のゼロ点調整はこの値を変更すること
388 #define ACCEL X 0G 32760
389 #define ACCEL Y 0G 32500
390 #define ACCEL Z 1G 22575

391

392 inline void polling(){
393 while(!(status & CALC START));
394 status &= ˜ (CALC START);

395

396 static unsigned char invoked polling = 0;
397 invoked polling++;

398

399 unsigned char i, j;

400

401 num t accel raw[3];

402

403 //AD 変換値の計算(16回して平均をとる)
404 {
405  num t num buf;
406  accel raw[0] = accel raw[1] = accel raw[2] = 0;
407  for(i = 0; i < 16; i++){
408  ad start();
409  for(j = 0; j < 3; j++){
410  while(!fifo num read(&( fifo ad[j]), & num buf));
411  accel raw[j] += (num buf >> 4);
412  }
413  }
414 }

415

416 short accel[3];

417

418 //変換値の加工 (値がmm/sˆ 2になるようにする)
419 {
420  /∗
421  ∗ ACCEL 1G13107 //= (1 << 16) /5
422  ∗ EARTH 1G9.80665
423  ∗ ACCEL 1mm s2(4 /3) //= (ACCEL 1G/(EARTH 1G∗ 1000)) = 1.33654204
424  ∗ AD RAW/ACCEL 1mm s2= accel [mm/sˆ 2]
425  ∗/
426  //X 軸
427  accel[0] = ((short )(accel raw[0] >> 2) − (ACCEL X 0G >> 2)) ∗ 3;
428  //Y 軸
429  accel[1] = ((accel raw[1] >> 2) − (short )(ACCEL Y 0G >> 2)) ∗ 3;
430  //Z 軸
431  accel[2] = (((ACCEL Z 1G >> 2) − (short )(accel raw[2] >> 2)) ∗ 3) + SCALE 1G;

432 }

433 434

435 #if DEBUG
436 //加速度計の値出力
437 if(invoked polling % 8 == 0){
438  char buf[32];
439  char ∗buf index = buf;
440  //null char(ushort2string((unsigned short)invoked polling, buf));
441  for(i = 0; i < 3; i++){
442  ∗(buf index++) = i + '0';
443  ∗(buf index++) = ':';
444  //buf index= ushort2string(accel raw[i], buf index);
445  buf index = short2string(accel[i], buf index);
446  ∗(buf index++) = '␣';
447  }
448  null char(crlf(buf index));
449  sci dump(buf);
450 }
451 #endif

452

453 //超音波センサの値を読み込む
454 unsigned char us[ULTRA SONIC CH];
455 for(i = 0; i < ULTRA SONIC CH; i++){
456  us[i] = us read(i);
457 }

458

459 #if DEBUG
460 //パススルー
461 for(i = 0; i < SERVO CH; i++){
462  output pulse[i] = input pulse[i];
463 }
464 #else
465 //ここに制御を埋め込むこと
466 calc command(accel, us);
467 #endif
468 }

469

470 /∗∗
471 ∗ メイン関数
472 ∗
473 ∗/
474 int main(){

475

476 //Wait
477 //int i;
478 //for(i = 0; i < 100000; i++);

479

480 //初期設定
481 misc init();
482 us init();
483 timer init(call every 6m4s);
484 ad init();
485 sci3 init();
486 wdt init();

487

488 enableIRQ(); /∗割り込み有効 ∗/

489

490 sci dump("Test ␣Program ␣started !\r\n");

491

492 wdt start();

493

494 while(1){
495  polling();

497  wdt reset(12); //WDT を 100ms で動作20E6 /8192 ∗ 100 ∗ 1E−3 = 244.14

498

499  IO.PDR8.BIT.B0 = (IO.PDR8.BIT.B0 ? 0 : 1);
500 }

501

502 disableIRQ(); /∗割り込み無効 ∗/

503

504 return 0;
505 }

ソースコード 4 indoor/ultra sonic.h

1 #ifndef ULTRA SONIC H
2 #define ULTRA SONIC H

3

4 /∗∗
5 ∗ 超音波センサユニットとの接続部の初期化
6 ∗
7 ∗/
8 void us init();

9

10 /∗∗
11 ∗ 超音波センサユニットから値を読み取る
12 ∗
13 ∗/
14 unsigned char us read(unsigned char ch);

15

16 #endif /∗ ULTRA SONIC H ∗/

ソースコード 5 indoor/ultra sonic.c

1 #include <stdio.h>
2 #include <string.h>

3

4 /∗非依存ヘッダ ∗/

 5 #include "common .h"
 6 #include "ultra_sonic  .h"

7

8 /∗依存ヘッダ ∗/
9 #include <AKI3694.h>

10

11 #define US CHANNEL 3

12

13 /∗処理ルーチン ∗/
14 #define select low(ch) (IO.PDR1.BYTE &= ˜ (0x40 >> ch))
15 #define select high(ch) (IO.PDR1.BYTE |= (0x40 >> ch))
16 #define clk low() (IO.PDR5.BIT.B7 = 0)
17 #define clk high() (IO.PDR5.BIT.B7 = 1)
18 #define is data high() (IO.PDR5.BIT.B6)

19

20 /∗∗
21 ∗ 超音波センサユニットとの接続部の初期化
22 ∗
23 ∗/
24 void us init(){

25

26 /∗
27  ∗ 接続は 3チャンネル分で
28  ∗
29  ∗ P16〜P14 => SELECT(OUT)
30  ∗ P56/SDA=> DATA(IN)
31  ∗ P57/SCL=> CLK(OUT)
32  ∗/

34 /∗P14〜P16 の処理 ∗/
35 IO.PCR1 |= 0x70;

36

37 /∗P56,P57 の処理∗/
38 IO.PCR5 |= 0x80;
39 IO.PCR5 &= ˜ (0x40);

40

41 /∗SELECT と CLK は High にしておく∗/
42 IO.PDR1.BYTE |= 0x70;
43 IO.PDR5.BYTE |= 0x80;
44 }

45

46 /∗∗
47 ∗ 超音波センサユニットから値を読み取る
48 ∗
49 ∗/
50 unsigned char us read(unsigned char ch){

51

52 unsigned char mask = 0x80;
53 unsigned char result = 0x00;

54

55 select low(ch);
56 do{
57  clk low();
58  clk high();
59  if(is data high()){result |= mask;}
60 }while(mask >>= 1);
61 select high(ch);

62

63 return result;
64 }

ソースコード 6 framework/dependency/AKI3694/Makefile

1 CC = h8300− elf− gcc
2 NEWLIB DIR = /usr/local/h8300− elf/lib/h8300h

3

4 CFLAGS ?= \
5 − I../..− I. − I/usr/local/h8300− elf/include \
6 − Wall − mh − g − mint32 − mrelax − gdwarf−2

7

8 BUILD DIR ?= build by gcc

9

10 SRCS C = \
11 $(shell ls ∗.c)

12

13 OBJS = $(SRCS C:.c=.o)

14

15 all : $(BUILD DIR) $(patsubst %, $(BUILD DIR)/%,$(OBJS))

16

17 $(BUILD DIR)/%.o : %. c
18 $(CC) − c $(CFLAGS) − o $@ $<

19

20 $(BUILD DIR) :
21 mkdir $@

22

23 clean :
24 cd $(BUILD DIR); rm − f $(OBJS)

25

26 run : all

27

28 .PHONY : clean all

ソースコード 7 framework/dependency/AKI3694/rom.x

1 /∗−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−  ∗/
2 /∗rom.x
3 /∗秋月H8−3694 用リンカスクリプト
4 /∗@since 9July2006 fenrir
5 /∗−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−  ∗/
6 OUTPUT FORMAT("elf32 -h8300 ")
7 OUTPUT ARCH(h8300:h8300h)

 8 ENTRY("_start ")

9

10 /∗−−−− メモリマップ −−−− ∗/
11 MEMORY
12 {
13  vectors(r) : o = 0x0000, l = 0x34
14  rom(r) : o = 0x0034, l = 32k − 0x34
15  ram(rwx) : o = 0xf780, l = 2k
16  stack(rwx) : o = 0xff7c, l = 0x0004
17 }

18

19 /∗−−−− 各セクション定義 −−−− ∗/
20 SECTIONS
21 {

22

23 /∗リセットベクタと割り込みベクタ等の設定∗/

24 .vectors : {

25

26 SHORT(ABSOLUTE( start)) /∗0 リセット ∗/
27 SHORT(ABSOLUTE( start)) /∗1 システム予約 1 ∗/
28 SHORT(ABSOLUTE( start)) /∗2 システム予約 2 ∗/
29 SHORT(ABSOLUTE( start)) /∗3 システム予約 3 ∗/
30 SHORT(ABSOLUTE( start)) /∗4 システム予約 4 ∗/
31 SHORT(ABSOLUTE( start)) /∗5 システム予約 5 ∗/
32 SHORT(ABSOLUTE( start)) /∗6 システム予約 6 ∗/
33 SHORT(DEFINED( int nmi) ? ABSOLUTE( int nmi) : ABSOLUTE( start)) /∗7 NMI(外部割込み) ∗/
34 SHORT(DEFINED( int trap0) ? ABSOLUTE( int trap0) : ABSOLUTE( start)) /∗8 TRAPA#1 ∗/
35 SHORT(DEFINED( int trap1) ? ABSOLUTE( int trap1) : ABSOLUTE( start)) /∗9 TRAPA#2 ∗/
36 SHORT(DEFINED( int trap2) ? ABSOLUTE( int trap2) : ABSOLUTE( start)) /∗10 TRAPA#3 ∗/
37 SHORT(DEFINED( int trap3) ? ABSOLUTE( int trap3) : ABSOLUTE( start)) /∗11 TRAPA#4 ∗/
38 SHORT(ABSOLUTE( start)) /∗12 ブレーク条件成立 ∗/
39 SHORT(ABSOLUTE( start)) /∗13 スリープ命令の実行による直接遷移 ∗/
40 SHORT(DEFINED( int irq0) ? ABSOLUTE( int irq0) : ABSOLUTE( start)) /∗14 IRQ0∗/
41 SHORT(DEFINED( int irq1) ? ABSOLUTE( int irq1) : ABSOLUTE( start)) /∗15 IRQ1∗/
42 SHORT(DEFINED( int irq2) ? ABSOLUTE( int irq2) : ABSOLUTE( start)) /∗16 IRQ2∗/
43 SHORT(DEFINED( int irq3) ? ABSOLUTE( int irq3) : ABSOLUTE( start)) /∗17 IRQ3∗/
44 SHORT(DEFINED( int wkp) ? ABSOLUTE( int wkp) : ABSOLUTE( start)) /∗18 WKP∗/
45 SHORT(DEFINED( int timera) ? ABSOLUTE( int timera) : ABSOLUTE( start)) /∗19 タイマA∗/
46 SHORT(ABSOLUTE( start)) /∗20 システム予約 7 ∗/
47 SHORT(DEFINED( int timerw) ? ABSOLUTE( int timerw) : ABSOLUTE( start)) /∗21 タイマW∗/
48 SHORT(DEFINED( int timerv) ? ABSOLUTE( int timerv) : ABSOLUTE( start)) /∗22 タイマV∗/
49 SHORT(DEFINED( int sci3) ? ABSOLUTE( int sci3) : ABSOLUTE( start)) /∗23 SCI3∗/
50 SHORT(DEFINED( int iic2) ? ABSOLUTE( int iic2) : ABSOLUTE( start)) /∗24 IIC2 ∗/
51 SHORT(DEFINED( int ad) ? ABSOLUTE( int ad) : ABSOLUTE( start)) /∗25 A/D 変換終了∗/

52

53 } > vectors

54

55 /∗プログラム領域＆参照のみのデータ領域 ∗/
56 .text : {
57  text begin = . ;
58  ∗(.text) /∗プログラム領域 ∗/
59  ∗(.rodata) /∗コンスタント領域 (read only) ∗/
60  ∗(.rodata.∗)
61  ∗(.gnu.linkonce.r.∗)
62  ∗(.gnu.linkonce.t.∗)

63  text end = . ;
64 } > rom

65

66 .tors : {
67  ctors begin = . ;
68  ∗(.ctors)
69  ctors end = . ;
70  dtors begin = . ;
71  ∗(.dtors)
72  dtors end = . ;
73 } > rom

74

75 /∗初期値を持つグローバル変数，スタティック変数領域 ∗/
76 .data : AT(ADDR(.tors) + SIZEOF(.tors)){
77  data begin = . ;
78  ∗(.strings) /∗文字列 ∗/
79  ∗(.data)
80  ∗(.tiny)
81  data end = . ;
82 } > ram

83

84 /∗初期値を持たないグローバル変数，スタティック変数領域 ∗/
85 .bss : {
86  bss begin = . ;
87  ∗(.bss)
88  ∗(COMMON)
89  bss end = . ;
90  end = . ;
91 } > ram

92

93 /∗スタック領域 ∗/
94 .stack : {
95  initial stack point = . +4 ;
96  stack = . ;
97  ∗(.stack)
98 } > stack

99

100 .eight : {
101  ∗(.eight)
102 } > ram

103

104 /∗デバックセクション ∗/
105 /∗Stabs ∗/
106 .stab 0 (NOLOAD) : { ∗(.stab) }
107 .stabstr 0 (NOLOAD) : { ∗(.stabstr) }
108 .stab.excl 0 (NOLOAD) : { ∗(.stab.excl) }
109 .stab.exclstr 0 (NOLOAD) : { ∗(.stab.exclstr) }
110 .stab.index 0 (NOLOAD) : { ∗(.stab.index) }
111 .stab.indexstr 0 (NOLOAD) : { ∗(.stab.indexstr) }
112 .comment 0 (NOLOAD) : { ∗(.comment) }
113 /∗DWARF1 ∗/
114 .debug 0 (NOLOAD) : { ∗(.debug) }
115 .line 0 (NOLOAD) : { ∗(.line) }
116 /∗GNUDWARF1 拡張 ∗/
117 .debug srcinfo 0 (NOLOAD) : { ∗(.debug srcinfo) }
118 .debug sfnames 0 (NOLOAD) : { ∗(.debug sfnames) }
119 /∗DWARF1.1 & DWARF2 ∗/
120 .debug aranges 0 (NOLOAD) : { ∗(.debug aranges) }
121 .debug pubnames 0 (NOLOAD) : { ∗(.debug pubnames) }
122 /∗DWARF2 ∗/
123 .debug info 0 (NOLOAD) : { ∗(.debug info .gnu.linkonce.wi.∗) }
124 .debug abbrev 0 (NOLOAD) : { ∗(.debug abbrev) }
125 .debug line 0 (NOLOAD) : { ∗(.debug line) }
126 .debug frame 0 (NOLOAD) : { ∗(.debug frame) }

127 .debug str 0 (NOLOAD) : { ∗(.debug str) }
128 .debug loc 0 (NOLOAD) : { ∗(.debug loc) }
129 }

ソースコード 8 framework/dependency/AKI3694/romcrt0.S

1 .h8300h
2 .section .text
3 .global start

4

5 start:

6

7 /∗スタックポインタ設定 ∗/
8 mov.l # initial stack point,sp

9

10 /∗初期値 0の領域 (.bss)の 0クリア ∗/
11 mov.l # bss begin,er0
12 mov.l # bss end,er1
13 sub.w r2,r2
14 .loop:
15 mov.w r2,@er0
16 adds #2,er0
17 cmp.l er1,er0
18 blo .loop

19

20 /∗初期値付データ領域 (.data)の書き込み ∗/
21 mov.l # dtors end,er0
22 mov.l # data begin,er1
23 mov.l # data end,er2
24 .loop2:
25 mov.w @er0 ,r3
26 mov.w r3,@er1
27 adds #2,er0
28 adds #2,er1
29 cmp.l er2,er1
30 blo .loop2

31

32 /∗main()コール ∗/
33 jsr @ main
34 rts

ソースコード 9 framework/dependency/AKI3694/3694.h

1 /∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/
2 /∗H8/3694Series Include File Ver2.1 ∗/
3 /∗fromRenesas ∗/
4 /∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/

5

6 #ifndef 3694 H
7 #define 3694 H

8

9 typedef union{
10 struct {
11  unsigned char high;
12  unsigned char low;
13 } u8;
14 unsigned short u16;
15 } uc16 t;

16

17 struct st lvd { /∗struct LVD∗/
18  union { /∗LVDCR∗/
19  unsigned char BYTE; /∗ByteAccess∗/
20  struct { /∗BitAccess∗/
21  unsigned char LVDE :1; /∗LVDE∗/

22  unsigned char :3; /∗∗/
23  unsigned char LVDSEL:1; /∗LVDSEL∗/
24  unsigned char LVDRE :1; /∗LVDRE∗/
25  unsigned char LVDDE :1; /∗LVDDE∗/
26  unsigned char LVDUE :1; /∗LVDUE∗/
27  } BIT; /∗∗/
28  } CR; /∗∗/
29  union { /∗LVDSR∗/
30  unsigned char BYTE; /∗ByteAccess∗/
31  struct { /∗BitAccess∗/
32  unsigned char :6; /∗∗/
33  unsigned char LVDDF:1; /∗LVDDF∗/
34  unsigned char LVDUF:1; /∗LVDUF∗/
35  } BIT; /∗∗/
36  } SR; /∗∗/
37 }; /∗∗/
38 struct st iic2 { /∗struct IIC2 ∗/
39  union { /∗ICCR1∗/
40  unsigned char BYTE; /∗ByteAccess∗/
41  struct { /∗BitAccess∗/
42  unsigned char ICE :1; /∗ICE ∗/
43  unsigned char RCVD:1; /∗RCVD∗/
44  unsigned char MST :1; /∗MST∗/
45  unsigned char TRS :1; /∗TRS∗/
46  unsigned char CKS :4; /∗CKS∗/
47  } BIT; /∗∗/
48  } ICCR1; /∗∗/
49  union { /∗ICCR2∗/
50  unsigned char BYTE; /∗ByteAccess∗/
51  struct { /∗BitAccess∗/
52  unsigned char BBSY :1; /∗BBSY∗/
53  unsigned char SCP :1; /∗SCP ∗/
54  unsigned char SDAO :1; /∗SDAO∗/
55  unsigned char SDAOP :1; /∗SDAOP∗/
56  unsigned char SCLO :1; /∗SCLO∗/
57  unsigned char :1; /∗∗/
58  unsigned char IICRST:1; /∗IICRST∗/
59  } BIT; /∗∗/
60  } ICCR2; /∗∗/
61  union { /∗ICMR∗/
62  unsigned char BYTE; /∗ByteAccess∗/
63  struct { /∗BitAccess∗/
64  unsigned char MLS :1; /∗MLS∗/
65  unsigned char WAIT:1; /∗WAIT∗/
66  unsigned char :2; /∗∗/
67  unsigned char BCWP:1; /∗BCWP∗/
68  unsigned char BC :3; /∗BC∗/
69  } BIT; /∗∗/
70  } ICMR; /∗∗/
71  union { /∗ICIER∗/
72  unsigned char BYTE; /∗ByteAccess∗/
73  struct { /∗BitAccess∗/
74  unsigned char TIE :1; /∗TIE∗/
75  unsigned char TEIE :1; /∗TEIE∗/
76  unsigned char RIE :1; /∗RIE∗/
77  unsigned char NAKIE:1; /∗NAKIE∗/
78  unsigned char STIE :1; /∗STIE∗/
79  unsigned char ACKE :1; /∗ACKE∗/
80  unsigned char ACKBR:1; /∗ACKBR∗/
81  unsigned char ACKBT:1; /∗ACKBT∗/
82  } BIT; /∗∗/
83  } ICIER; /∗∗/
84  union { /∗ICSR∗/
85  unsigned char BYTE; /∗ByteAccess∗/

86  struct { /∗BitAccess∗/
87  unsigned char TDRE :1; /∗TDRE∗/
88  unsigned char TEND :1; /∗TEND∗/
89  unsigned char RDRF :1; /∗RDRF∗/
90  unsigned char NACKF:1; /∗NACKF∗/
91  unsigned char STOP :1; /∗STOP∗/
92  unsigned char ALOVE:1; /∗ALOVE∗/
93  unsigned char AAS :1; /∗AAS∗/
94  unsigned char ADZ :1; /∗ADZ∗/
95  } BIT; /∗∗/
96  } ICSR; /∗∗/
97  union { /∗SAR∗/
98  unsigned char BYTE; /∗ByteAccess∗/
99  struct { /∗BitAccess∗/
100  unsigned char SVA:7; /∗SVA∗/
101  unsigned char FS :1; /∗FS ∗/
102  } BIT; /∗∗/
103  } SAR; /∗∗/
104  unsigned char ICDRT; /∗ICDRT∗/
105  unsigned char ICDRR; /∗ICDRR∗/
106 }; /∗∗/
107 struct st tw { /∗struct TW∗/
108  union { /∗TMRW∗/
109  unsigned char BYTE; /∗ByteAccess∗/
110  struct { /∗BitAccess∗/
111  unsigned char CTS :1; /∗CTS∗/
112  unsigned char :1; /∗∗/
113  unsigned char BUFEB:1; /∗BUFEB∗/
114  unsigned char BUFEA:1; /∗BUFEA∗/
115  unsigned char :1; /∗∗/
116  unsigned char PWMD :1; /∗PWMD∗/
117  unsigned char PWMC :1; /∗PWMC∗/
118  unsigned char PWMB :1; /∗PWMB∗/
119  } BIT; /∗∗/
120  } TMRW; /∗∗/
121  union { /∗TCRW∗/
122  unsigned char BYTE; /∗ByteAccess∗/
123  struct { /∗BitAccess∗/
124  unsigned char CCLR:1; /∗CCLR∗/
125  unsigned char CKS :3; /∗CKS∗/
126  unsigned char TOD :1; /∗TOD∗/
127  unsigned char TOC :1; /∗TOC∗/
128  unsigned char TOB :1; /∗TOB∗/
129  unsigned char TOA :1; /∗TOA∗/
130  } BIT; /∗∗/
131  } TCRW; /∗∗/
132  union { /∗TIERW∗/
133  unsigned char BYTE; /∗ByteAccess∗/
134  struct { /∗BitAccess∗/
135  unsigned char OVIE :1; /∗OVIE∗/
136  unsigned char :3; /∗∗/
137  unsigned char IMIED:1; /∗IMIED∗/
138  unsigned char IMIEC:1; /∗IMIEC∗/
139  unsigned char IMIEB:1; /∗IMIEB∗/
140  unsigned char IMIEA:1; /∗IMIEA∗/
141  } BIT; /∗∗/
142  } TIERW; /∗∗/
143  union { /∗TSRW∗/
144  unsigned char BYTE; /∗ByteAccess∗/
145  struct { /∗BitAccess∗/
146  unsigned char OVF :1; /∗OVF∗/
147  unsigned char :3; /∗∗/
148  unsigned char IMFD:1; /∗IMFD ∗/
149  unsigned char IMFC:1; /∗IMFC ∗/

150  unsigned char IMFB:1; /∗IMFB∗/
151  unsigned char IMFA:1; /∗IMFA∗/
152  } BIT; /∗∗/
153  } TSRW; /∗∗/
154  union { /∗TIOR0∗/
155  unsigned char BYTE; /∗ByteAccess∗/
156  struct { /∗BitAccess∗/
157  unsigned char :1; /∗∗/
158  unsigned char IOB:3; /∗IOB∗/
159  unsigned char :1; /∗∗/
160  unsigned char IOA:3; /∗IOA∗/
161  } BIT; /∗∗/
162  } TIOR0; /∗∗/
163  union { /∗TIOR1∗/
164  unsigned char BYTE; /∗ByteAccess∗/
165  struct { /∗BitAccess∗/
166  unsigned char :1; /∗∗/
167  unsigned char IOD:3; /∗IOD ∗/
168  unsigned char :1; /∗∗/
169  unsigned char IOC:3; /∗IOC ∗/
170  } BIT; /∗∗/
171  } TIOR1; /∗∗/
172  /∗unsigned int TCNT;(− mint32) ∗//∗TCNT∗/
173  unsigned short TCNT;
174  /∗unsigned int GRA;(− mint32) ∗//∗GRA∗/
175  unsigned short GRA;
176  /∗unsigned int GRB;(− mint32) ∗//∗GRB∗/
177  unsigned short GRB;
178  /∗unsigned int GRC;(− mint32) ∗//∗GRC∗/
179  unsigned short GRC;
180  /∗unsigned int GRD;(− mint32) ∗//∗GRD∗/
181  unsigned short GRD;
182 }; /∗∗/
183 struct st flash{ /∗struct FLASH∗/
184  union { /∗FLMCR1∗/
185  unsigned char BYTE; /∗ByteAccess∗/
186  struct { /∗BitAccess∗/
187  unsigned char :1; /∗∗/
188  unsigned char SWE:1; /∗SWE∗/
189  unsigned char ESU:1; /∗ESU∗/
190  unsigned char PSU:1; /∗PSU ∗/
191  unsigned char EV :1; /∗EV∗/
192  unsigned char PV :1; /∗PV∗/
193  unsigned char E :1; /∗E ∗/
194  unsigned char P :1; /∗P ∗/
195  } BIT; /∗∗/
196  } FLMCR1; /∗∗/
197  union { /∗FLMCR2∗/
198  unsigned char BYTE; /∗ByteAccess∗/
199  struct { /∗BitAccess∗/
200  unsigned char FLER:1; /∗FLER∗/
201  } BIT; /∗∗/
202  } FLMCR2; /∗∗/
203  union { /∗FLPWCR∗/
204  unsigned char BYTE; /∗ByteAccess∗/
205  struct { /∗BitAccess∗/
206  unsigned char PDWND:1; /∗PDWND∗/
207  } BIT; /∗∗/
208  } FLPWCR; /∗∗/
209  union { /∗EBR1∗/
210  unsigned char BYTE; /∗ByteAccess∗/
211  struct { /∗BitAccess∗/
212  unsigned char :3; /∗∗/
213  unsigned char EB4:1; /∗EB4∗/

214  unsigned char EB3:1; /∗EB3∗/
215  unsigned char EB2:1; /∗EB2∗/
216  unsigned char EB1:1; /∗EB1∗/
217  unsigned char EB0:1; /∗EB0∗/
218  } BIT; /∗∗/
219  } EBR1; /∗∗/
220  char wk[7]; /∗∗/
221  union { /∗FENR∗/
222  unsigned char BYTE; /∗ByteAccess∗/
223  struct { /∗BitAccess∗/
224  unsigned char FLSHE:1; /∗FLSHE∗/
225  } BIT; /∗∗/
226  } FENR; /∗∗/
227 }; /∗∗/
228 struct st tv { /∗struct TV∗/
229  union { /∗TCRV0∗/
230  unsigned char BYTE; /∗ByteAccess∗/
231  struct { /∗BitAccess∗/
232  unsigned char CMIEB:1; /∗CMIEB∗/
233  unsigned char CMIEA:1; /∗CMIEA∗/
234  unsigned char OVIE :1; /∗OVIE∗/
235  unsigned char CCLR :2; /∗CCLR∗/
236  unsigned char CKS :3; /∗CKS∗/
237  } BIT; /∗∗/
238  } TCRV0; /∗∗/
239  union { /∗TCSRV∗/
240  unsigned char BYTE; /∗ByteAccess∗/
241  struct { /∗BitAccess∗/
242  unsigned char CMFB:1; /∗CMFB∗/
243  unsigned char CMFA:1; /∗CMFA∗/
244  unsigned char OVF :1; /∗OVF∗/
245  unsigned char :1; /∗∗/
246  unsigned char OS :4; /∗OS∗/
247  } BIT; /∗∗/
248  } TCSRV; /∗∗/
249  unsigned char TCORA; /∗TCORA∗/
250  unsigned char TCORB; /∗TCORB∗/
251  unsigned char TCNTV; /∗TCNT∗/
252  union { /∗TCRV1∗/
253  unsigned char BYTE; /∗ByteAccess∗/
254  struct { /∗BitAccess∗/
255  unsigned char :3; /∗∗/
256  unsigned char TVEG:2; /∗TVEG∗/
257  unsigned char TRGE:1; /∗TRGE∗/
258  unsigned char :1; /∗∗/
259  unsigned char ICKS:1; /∗ICKS∗/
260  } BIT; /∗∗/
261  } TCRV1; /∗∗/
262 }; /∗∗/
263 struct st ta { /∗struct TA∗/
264  union { /∗TMA∗/
265  unsigned char BYTE; /∗ByteAccess∗/
266  struct { /∗BitAccess∗/
267  unsigned char CKSO:3; /∗CKSO∗/
268  unsigned char :1; /∗∗/
269  unsigned char CKSI:4; /∗CKSI∗/
270  } BIT; /∗∗/
271  } TMA; /∗∗/
272  unsigned char TCA; /∗TCA∗/
273 }; /∗∗/
274 struct st sci3 { /∗struct SCI3∗/
275  union { /∗SMR∗/
276  unsigned char BYTE; /∗ByteAccess∗/
277  struct { /∗BitAccess∗/

278  unsigned char COM :1; /∗COM∗/
279  unsigned char CHR :1; /∗CHR∗/
280  unsigned char PE :1; /∗PE ∗/
281  unsigned char PM :1; /∗PM ∗/
282  unsigned char STOP:1; /∗STOP∗/
283  unsigned char MP :1; /∗MP ∗/
284  unsigned char CKS :2; /∗CKS∗/
285  } BIT; /∗∗/
286  } SMR; /∗∗/
287  unsigned char BRR; /∗BRR∗/
288  union { /∗SCR3∗/
289  unsigned char BYTE; /∗ByteAccess∗/
290  struct { /∗BitAccess∗/
291  unsigned char TIE :1; /∗TIE∗/
292  unsigned char RIE :1; /∗RIE∗/
293  unsigned char TE :1; /∗TE∗/
294  unsigned char RE :1; /∗RE∗/
295  unsigned char MPIE:1; /∗MPIE ∗/
296  unsigned char TEIE:1; /∗TEIE∗/
297  unsigned char CKE :2; /∗CKE∗/
298  } BIT; /∗∗/
299  } SCR3; /∗∗/
300  unsigned char TDR; /∗TDR∗/
301  union { /∗SSR∗/
302  unsigned char BYTE; /∗ByteAccess∗/
303  struct { /∗BitAccess∗/
304  unsigned char TDRE:1; /∗TDRE∗/
305  unsigned char RDRF:1; /∗RDRF∗/
306  unsigned char OER :1; /∗OER∗/
307  unsigned char FER :1; /∗FER ∗/
308  unsigned char PER :1; /∗PER ∗/
309  unsigned char TEND:1; /∗TEND∗/
310  unsigned char MPBR:1; /∗MPBR∗/
311  unsigned char MPBT:1; /∗MPBT∗/
312  } BIT; /∗∗/
313  } SSR; /∗∗/
314  unsigned char RDR; /∗RDR∗/
315 }; /∗∗/
316 struct st ad { /∗struct A/D ∗/
317  /∗unsigned int ADDRA;(− mint32) ∗//∗ADDRA∗/
318  uc16 t ADDRA;
319  /∗unsigned int ADDRB;(− mint32) ∗//∗ADDRB∗/
320  uc16 t ADDRB;
321  /∗unsigned int ADDRC;(− mint32) ∗//∗ADDRC∗/
322  uc16 t ADDRC;
323  /∗unsigned int ADDRD;(− mint32) ∗//∗ADDRD∗/
324  uc16 t ADDRD;
325  union { /∗ADCSR∗/
326  unsigned char BYTE; /∗ByteAccess∗/
327  struct { /∗BitAccess∗/
328  unsigned char ADF :1; /∗ADF∗/
329  unsigned char ADIE:1; /∗ADIE∗/
330  unsigned char ADST:1; /∗ADST∗/
331  unsigned char SCAN:1; /∗SCAN∗/
332  unsigned char CKS :1; /∗CKS∗/
333  unsigned char CH :3; /∗CH ∗/
334  } BIT; /∗∗/
335  } ADCSR; /∗∗/
336  union { /∗ADCR∗/
337  unsigned char BYTE; /∗ByteAccess∗/
338  struct { /∗BitAccess∗/
339  unsigned char TRGE:1; /∗TRGE∗/
340  } BIT; /∗∗/
341  } ADCR; /∗∗/

342 }; /∗∗/
343 struct st wdt { /∗struct WDT∗/
344  union { /∗TCSRWD∗/
345  unsigned char BYTE; /∗ByteAccess∗/
346  struct { /∗BitAccess∗/
347  unsigned char B6WI :1; /∗B6WI∗/
348  unsigned char TCWE :1; /∗TCWE∗/
349  unsigned char B4WI :1; /∗B4WI∗/
350  unsigned char TCSRWE:1; /∗TCSRWE∗/
351  unsigned char B2WI :1; /∗B2WI∗/
352  unsigned char WDON :1; /∗WDON∗/
353  unsigned char B0WI :1; /∗B0WI∗/
354  unsigned char WRST :1; /∗WRST∗/
355  } BIT; /∗∗/
356  } TCSRWD; /∗∗/
357  unsigned char TCWD; /∗TCWD∗/
358  union { /∗TMWD∗/
359  unsigned char BYTE; /∗ByteAccess∗/
360  struct { /∗BitAccess∗/
361  unsigned char :4; /∗∗/
362  unsigned char CKS:4; /∗CKS∗/
363  } BIT; /∗∗/
364  } TMWD; /∗∗/
365 }; /∗∗/
366 struct st abrk { /∗struct ABRK∗/
367  union { /∗ABRKCR∗/
368  unsigned char BYTE; /∗ByteAccess∗/
369  struct { /∗BitAccess∗/
370  unsigned char RTINTE:1; /∗RTINTE∗/
371  unsigned char CSEL :2; /∗CSEL∗/
372  unsigned char ACMP :3; /∗ACMP∗/
373  unsigned char DCMP :2; /∗DCMP ∗/
374  } BIT; /∗∗/
375  } CR; /∗∗/
376  union { /∗ABRKSR∗/
377  unsigned char BYTE; /∗ByteAccess∗/
378  struct { /∗BitAccess∗/
379  unsigned char ABIF:1; /∗ABIF∗/
380  unsigned char ABIE:1; /∗ABIE∗/
381  } BIT; /∗∗/
382  } SR; /∗∗/
383  void ∗BAR; /∗BAR∗/
384  /∗unsigned int BDR;(− mint32) ∗//∗BDR∗/
385  unsigned char BDR H;
386  unsigned char BDR L;
387 }; /∗∗/
388 struct st io { /∗struct IO ∗/
389  union { /∗PUCR1 ∗/
390  unsigned char BYTE; /∗ByteAccess∗/
391  struct { /∗BitAccess∗/
392  unsigned char B7:1; /∗Bit7 ∗/
393  unsigned char B6:1; /∗Bit6 ∗/
394  unsigned char B5:1; /∗Bit5 ∗/
395  unsigned char B4:1; /∗Bit4 ∗/
396  unsigned char :1; /∗Bit3 ∗/
397  unsigned char B2:1; /∗Bit2 ∗/
398  unsigned char B1:1; /∗Bit1 ∗/
399  unsigned char B0:1; /∗Bit0 ∗/
400  } BIT; /∗∗/
401  } PUCR1; /∗∗/
402  union { /∗PUCR5 ∗/
403  unsigned char BYTE; /∗ByteAccess∗/
404  struct { /∗BitAccess∗/
405  unsigned char :2; /∗Bit7,6 ∗/

406  unsigned char B5:1; /∗Bit5 ∗/
407  unsigned char B4:1; /∗Bit4 ∗/
408  unsigned char B3:1; /∗Bit3 ∗/
409  unsigned char B2:1; /∗Bit2 ∗/
410  unsigned char B1:1; /∗Bit1 ∗/
411  unsigned char B0:1; /∗Bit0 ∗/
412  } BIT; /∗∗/
413  } PUCR5; /∗∗/
414  char wk1[2]; /∗∗/
415  union { /∗PDR1 ∗/
416  unsigned char BYTE; /∗ByteAccess∗/
417  struct { /∗BitAccess∗/
418  unsigned char B7:1; /∗Bit7 ∗/
419  unsigned char B6:1; /∗Bit6 ∗/
420  unsigned char B5:1; /∗Bit5 ∗/
421  unsigned char B4:1; /∗Bit4 ∗/
422  unsigned char :1; /∗Bit3 ∗/
423  unsigned char B2:1; /∗Bit2 ∗/
424  unsigned char B1:1; /∗Bit1 ∗/
425  unsigned char B0:1; /∗Bit0 ∗/
426  } BIT; /∗∗/
427  } PDR1; /∗∗/
428  union { /∗PDR2 ∗/
429  unsigned char BYTE; /∗ByteAccess∗/
430  struct { /∗BitAccess∗/
431  unsigned char :5; /∗Bit7−3 ∗/
432  unsigned char B2:1; /∗Bit2 ∗/
433  unsigned char B1:1; /∗Bit1 ∗/
434  unsigned char B0:1; /∗Bit0 ∗/
435  } BIT; /∗∗/
436  } PDR2; /∗∗/
437  char wk2[2]; /∗∗/
438  union { /∗PDR5 ∗/
439  unsigned char BYTE; /∗ByteAccess∗/
440  struct { /∗BitAccess∗/
441  unsigned char B7:1; /∗Bit7 ∗/
442  unsigned char B6:1; /∗Bit6 ∗/
443  unsigned char B5:1; /∗Bit5 ∗/
444  unsigned char B4:1; /∗Bit4 ∗/
445  unsigned char B3:1; /∗Bit3 ∗/
446  unsigned char B2:1; /∗Bit2 ∗/
447  unsigned char B1:1; /∗Bit1 ∗/
448  unsigned char B0:1; /∗Bit0 ∗/
449  } BIT; /∗∗/
450  } PDR5; /∗∗/
451  char wk3; /∗∗/
452  union { /∗PDR7 ∗/
453  unsigned char BYTE; /∗ByteAccess∗/
454  struct { /∗BitAccess∗/
455  unsigned char :1; /∗Bit7 ∗/
456  unsigned char B6:1; /∗Bit6 ∗/
457  unsigned char B5:1; /∗Bit5 ∗/
458  unsigned char B4:1; /∗Bit4 ∗/
459  } BIT; /∗∗/
460  } PDR7; /∗∗/
461  union { /∗PDR8 ∗/
462  unsigned char BYTE; /∗ByteAccess∗/
463  struct { /∗BitAccess∗/
464  unsigned char B7:1; /∗Bit7 ∗/
465  unsigned char B6:1; /∗Bit6 ∗/
466  unsigned char B5:1; /∗Bit5 ∗/
467  unsigned char B4:1; /∗Bit4 ∗/
468  unsigned char B3:1; /∗Bit3 ∗/
469  unsigned char B2:1; /∗Bit2 ∗/

470  unsigned char B1:1; /∗Bit1 ∗/
471  unsigned char B0:1; /∗Bit0 ∗/
472  } BIT; /∗∗/
473  } PDR8; /∗∗/
474  char wk4; /∗∗/
475  union { /∗PDRB∗/
476  unsigned char BYTE; /∗ByteAccess∗/
477  struct { /∗BitAccess∗/
478  unsigned char B7:1; /∗Bit7 ∗/
479  unsigned char B6:1; /∗Bit6 ∗/
480  unsigned char B5:1; /∗Bit5 ∗/
481  unsigned char B4:1; /∗Bit4 ∗/
482  unsigned char B3:1; /∗Bit3 ∗/
483  unsigned char B2:1; /∗Bit2 ∗/
484  unsigned char B1:1; /∗Bit1 ∗/
485  unsigned char B0:1; /∗Bit0 ∗/
486  } BIT; /∗∗/
487  } PDRB; /∗∗/
488  char wk5[2]; /∗∗/
489  union { /∗PMR1∗/
490  unsigned char BYTE; /∗ByteAccess∗/
491  struct { /∗BitAccess∗/
492  unsigned char IRQ3:1; /∗IRQ3∗/
493  unsigned char IRQ2:1; /∗IRQ2∗/
494  unsigned char IRQ1:1; /∗IRQ1∗/
495  unsigned char IRQ0:1; /∗IRQ0∗/
496  unsigned char :2; /∗∗/
497  unsigned char TXD :1; /∗TXD∗/
498  unsigned char TMOW:1; /∗TMOW∗/
499  } BIT; /∗∗/
500  } PMR1; /∗∗/
501  union { /∗PMR5∗/
502  unsigned char BYTE; /∗ByteAccess∗/
503  struct { /∗BitAccess∗/
504  unsigned char :2; /∗∗/
505  unsigned char WKP5:1; /∗WKP5∗/
506  unsigned char WKP4:1; /∗WKP4∗/
507  unsigned char WKP3:1; /∗WKP3∗/
508  unsigned char WKP2:1; /∗WKP2∗/
509  unsigned char WKP1:1; /∗WKP1∗/
510  unsigned char WKP0:1; /∗WKP0∗/
511  } BIT; /∗∗/
512  } PMR5; /∗∗/
513  char wk6[2]; /∗∗/
514  unsigned char PCR1; /∗PCR1 ∗/
515  unsigned char PCR2; /∗PCR2 ∗/
516  char wk7[2]; /∗∗/
517  unsigned char PCR5; /∗PCR5 ∗/
518  char wk8; /∗∗/
519  unsigned char PCR7; /∗PCR7 ∗/
520  unsigned char PCR8; /∗PCR8 ∗/
521 }; /∗∗/
522 union un syscr1 { /∗union SYSCR1∗/
523  unsigned char BYTE; /∗ByteAccess∗/
524  struct { /∗BitAccess∗/
525  unsigned char SSBY :1; /∗SSBY∗/
526  unsigned char STS :3; /∗STS∗/
527  unsigned char NESEL:1; /∗NESEL∗/
528  } BIT; /∗∗/
529 }; /∗∗/
530 union un syscr2 { /∗union SYSCR2∗/
531  unsigned char BYTE; /∗ByteAccess∗/
532  struct { /∗BitAccess∗/
533  unsigned char SMSEL:1; /∗SMSEL∗/

534  unsigned char LSON :1; /∗LSON∗/
535  unsigned char DTON :1; /∗DTON∗/
536  unsigned char MA :3; /∗MA∗/
537  unsigned char SA :2; /∗SA∗/
538  } BIT; /∗∗/
539 }; /∗∗/
540 union un iegr1 { /∗union IEGR1∗/
541  unsigned char BYTE; /∗ByteAccess∗/
542  struct { /∗BitAccess∗/
543  unsigned char NMIEG:1; /∗NMIEG∗/
544  unsigned char :3; /∗∗/
545  unsigned char IEG3 :1; /∗IEG3 ∗/
546  unsigned char IEG2 :1; /∗IEG2 ∗/
547  unsigned char IEG1 :1; /∗IEG1 ∗/
548  unsigned char IEG0 :1; /∗IEG0 ∗/
549  } BIT; /∗∗/
550 }; /∗∗/
551 union un iegr2 { /∗union IEGR2∗/
552  unsigned char BYTE; /∗ByteAccess∗/
553  struct { /∗BitAccess∗/
554  unsigned char :2; /∗∗/
555  unsigned char WPEG5:1; /∗WPEG5∗/
556  unsigned char WPEG4:1; /∗WPEG4∗/
557  unsigned char WPEG3:1; /∗WPEG3∗/
558  unsigned char WPEG2:1; /∗WPEG2∗/
559  unsigned char WPEG1:1; /∗WPEG1∗/
560  unsigned char WPEG0:1; /∗WPEG0∗/
561  } BIT; /∗∗/
562 }; /∗∗/
563 union un ienr1 { /∗union IENR1∗/
564  unsigned char BYTE; /∗ByteAccess∗/
565  struct { /∗BitAccess∗/
566  unsigned char IENDT:1; /∗IENDT∗/
567  unsigned char IENTA:1; /∗IENTA∗/
568  unsigned char IENWP:1; /∗IENWP∗/
569  unsigned char :1; /∗∗/
570  unsigned char IEN3 :1; /∗IEN3∗/
571  unsigned char IEN2 :1; /∗IEN2∗/
572  unsigned char IEN1 :1; /∗IEN1∗/
573  unsigned char IEN0 :1; /∗IEN0∗/
574  } BIT; /∗∗/
575 }; /∗∗/
576 union un irr1 { /∗union IRR1∗/
577  unsigned char BYTE; /∗ByteAccess∗/
578  struct { /∗BitAccess∗/
579  unsigned char IRRDT:1; /∗IRRDT∗/
580  unsigned char IRRTA:1; /∗IRRTA∗/
581  unsigned char :2; /∗∗/
582  unsigned char IRRI3:1; /∗IRRI3∗/
583  unsigned char IRRI2:1; /∗IRRI2∗/
584  unsigned char IRRI1:1; /∗IRRI1∗/
585  unsigned char IRRI0:1; /∗IRRI0∗/
586  } BIT; /∗∗/
587 }; /∗∗/
588 union un iwpr { /∗union IWPR∗/
589  unsigned char BYTE; /∗ByteAccess∗/
590  struct { /∗BitAccess∗/
591  unsigned char :2; /∗∗/
592  unsigned char IWPF5:1; /∗IWPF5 ∗/
593  unsigned char IWPF4:1; /∗IWPF4 ∗/
594  unsigned char IWPF3:1; /∗IWPF3 ∗/
595  unsigned char IWPF2:1; /∗IWPF2 ∗/
596  unsigned char IWPF1:1; /∗IWPF1 ∗/
597  unsigned char IWPF0:1; /∗IWPF0 ∗/

598  } BIT; /∗∗/
599 }; /∗∗/
600 union un mstcr1 { /∗union MSTCR1∗/
601  unsigned char BYTE; /∗ByteAccess∗/
602  struct { /∗BitAccess∗/
603  unsigned char :1; /∗∗/
604  unsigned char MSTIIC:1; /∗MSTIIC∗/
605  unsigned char MSTS3 :1; /∗MSTS3∗/
606  unsigned char MSTAD :1; /∗MSTAD∗/
607  unsigned char MSTWD :1; /∗MSTWD∗/
608  unsigned char MSTTW :1; /∗MSTTW∗/
609  unsigned char MSTTV :1; /∗MSTTV∗/
610  unsigned char MSTTA :1; /∗MSTTA∗/
611  } BIT; /∗∗/
612 }; /∗∗/
613 #define LVD (∗(volatile struct st lvd ∗)0xF730) /∗LVDAddress∗/
614 #define IIC2 (∗(volatile struct st iic2 ∗)0xF748) /∗IIC2 Address∗/
615 #define TW (∗(volatile struct st tw ∗)0xFF80) /∗TWAddress∗/
616 #define FLASH (∗(volatile struct st flash∗)0xFF90) /∗FLASHAddress∗/
617 #define TV (∗(volatile struct st tv ∗)0xFFA0) /∗TVAddress∗/
618 #define TA (∗(volatile struct st ta ∗)0xFFA6) /∗TAAddress∗/
619 #define SCI3 (∗(volatile struct st sci3 ∗)0xFFA8) /∗SCI3Address∗/
620 #define AD (∗(volatile struct st ad ∗)0xFFB0) /∗A/D Address∗/
621 #define WDT (∗(volatile struct st wdt ∗)0xFFC0) /∗WDTAddress∗/
622 #define ABRK (∗(volatile struct st abrk ∗)0xFFC8) /∗ABRKAddress∗/
623 #define IO (∗(volatile struct st io ∗)0xFFD0) /∗IO Address∗/
624 #define SYSCR1 (∗(volatile union un syscr1∗)0xFFF0) /∗SYSCR1Address∗/
625 #define SYSCR2 (∗(volatile union un syscr2∗)0xFFF1) /∗SYSCR2Address∗/
626 #define IEGR1 (∗(volatile union un iegr1 ∗)0xFFF2) /∗IEGR1Address∗/
627 #define IEGR2 (∗(volatile union un iegr2 ∗)0xFFF3) /∗IEGR2Address∗/
628 #define IENR1 (∗(volatile union un ienr1 ∗)0xFFF4) /∗IENR1Address∗/
629 #define IRR1 (∗(volatile union un irr1 ∗)0xFFF6) /∗IRR1Address∗/
630 #define IWPR (∗(volatile union un iwpr ∗)0xFFF8) /∗IWPRAddress∗/
631 #define MSTCR1 (∗(volatile union un mstcr1∗)0xFFF9) /∗MSTCR1Address∗/

632

633 #endif /∗ 3694 H ∗/

ソースコード 10 framework/dependency/AKI3694/AKI3694.h

1 #ifndef AKI3694 H
2 #define AKI3694 H

3

4 #include "3694. h"
5 //#defineprintf ((int (∗)(const char ∗,...))0x00002bb0)
6 //#definescanf ((int (∗)(const char ∗,...))0x00002c02)

7

8 #define AD MAX 0xffc0

9

10 #define PORT0 (unsigned char )0x01
11 #define PORT1 (unsigned char )0x02
12 #define PORT2 (unsigned char )0x04
13 #define PORT3 (unsigned char )0x08
14 #define PORT4 (unsigned char )0x10
15 #define PORT5 (unsigned char )0x20
16 #define PORT6 (unsigned char )0x40
17 #define PORT7 (unsigned char )0x80

18

19 #endif /∗ AKI3694 H ∗/

ソースコード 11 framework/dependency/AKI3694/dependency.c

1 /∗
2 ∗ CPU レジスタの操作など、チップの固有性に依存するルーチン
3 ∗

4 ∗ @author fenrir (M.Naruoka)
5 ∗ @since 04/06/04
6 ∗ @version 1.0
7 ∗/

8

9 inline void enableIRQ(){

10 asm volatile ("andc .b␣#0x7f,ccr");

11 }

12

13 inline void disableIRQ(){

14 asm volatile ("orc.b␣#0x80,ccr");

15 }

16

17 inline void sleep(){
18 asm volatile ("sleep ");
19 }

20

21 inline void nop(){
22 asm volatile("nop");
23 }

ソースコード 12 framework/dependency/AKI3694/common.h

1 #ifndef COMMON H
2 #define COMMON H

3

4 /∗common.h がユーザ側で定義されていない場合のひな方∗/

5

6 //#defineAD ONLY 4
7 //#defineDISABLE SCI3

8

9 //#defineSCI3 TX BUFFER SIZE32
10 //#defineSCI3 RX BUFFER SIZE16

11

12 //#defineWDT TMWD SETTING0x0F

13

14 /∗タイマA の設定
15 ∗
16 ∗ インターバルタイマとして動作するように
17 ∗ Φ/32
18 ∗ 20MHz/(32 ∗ 256) = 2.5KHz= 0.4ms で割り込みがかかるようにする
19 ∗/
20 #define TIMER A SETTING 0x06

21

22 #endif

ソースコード 13 framework/dependency/AKI3694/ad.h

1 #ifndef AD H
2 #define AD H

3

4 /∗
5 ∗ A/D 変換を行うルーチン
6 ∗
7 ∗ @author fenrir (M.Naruoka)
8 ∗ @since 04/06/03
9 ∗ @version 1.0
10 ∗ @see ad.c
11 ∗/

12

13 #include <util/fifo num.h>

14

15 #ifndef AD ONLY 4
16 #defineAD CH 8

17 #else
18 #defineAD CH 4
19 #endif

20

21 #ifndef AD BUFFER SIZE
22 #defineAD BUFFER SIZE 8 /∗バッファのサイズ ∗/
23 #endif

24

25 #ifdef cplusplus
26 extern "C"
27 {
28 #endif

29

30 void ad init();
31 void ad start();
32 void ad end();

33

34 extern fifo num tfifo ad[AD CH]; /∗A/D 変換後の結果用の FIFO、全部で 8 チャンネル ∗/

35

36 #ifdef cplusplus
37 }
38 #endif

39

40 #endif /∗ AD H ∗/

ソースコード 14 framework/dependency/AKI3694/ad.c

1 /∗
2 ∗ A/D 変換を行うルーチン
3 ∗
4 ∗ @author fenrir (M.Naruoka)
5 ∗ @since 04/06/02
6 ∗ @version 1.0
7 ∗/

 8 #include "AKI3694 .h"

9 #include <common.h>
10 #include <util/fifo num.h>
11 #include "ad.h"

12

13 static num t buffer ad[(AD BUFFER SIZE + 1) ∗ AD CH];
14 fifo num tfifo ad[AD CH];

15

16 /∗∗
17 ∗ A/D 変換の初期設定をする関数
18 ∗
19 ∗/
20 void ad init(){

21

22 /∗A/D 変換後用の FIFO の初期化∗/
23 int i;
24 for(i = 0; i < AD CH; i++){
25  fifo num init(&( fifo ad[i]), &( buffer ad[(AD BUFFER SIZE + 1) ∗ i]), (AD BUFFER SIZE + 1));
26 }

27

28 /∗A/D 変換停止∗/
29 AD.ADCSR.BIT.ADST = 0;

30

31 /∗スキャンモード
32  ∗ 高速変換
33  ∗ 割り込み可
34  ∗ はじめはグループ 0のAD0〜AD3 を変換
35  ∗ 8チャンネル時はさらにその後グループ 1のAD4〜AD7 を変換
36  ∗/
37 AD.ADCSR.BYTE = 0x5b; //5

38 }

39

40 /∗∗
41 ∗ A/D 変換の開始をする関数
42 ∗ インターバルタイマの割り込みによって、
43 ∗ またグループ 0のAD 変換終了後に呼び出してもらう。
44 ∗
45 ∗ @see ad end();
46 ∗/
47 void ad start(){
48 AD.ADCSR.BIT.ADST = 1; /∗A/D 変換スタート∗/
49 }

50

51 /∗∗
52 ∗ A/D 変換の終了後に起動される関数
53 ∗ 割り込みで呼び出してもらう
54 ∗
55 ∗ @see int ad();
56 ∗/
57 void ad end(){

58

59 AD.ADCSR.BYTE &= 0x5f; /∗終了フラグをクリア & AD 変換を完全停止∗/

60

61 #if AD CH > 4
62 /∗どっちのグループを変換していたか ∗/
63 if((AD.ADCSR.BYTE & 0x04) == 0){
64 #endif

65

66  /∗グループ 0(AD0〜AD3)を変換していた ∗/

67

68 #if DEBUG > 2
69  fifo num write(& fifo ad[0], 230);
70  fifo num write(& fifo ad[1], 340);
71  fifo num write(& fifo ad[2], 560);
72  fifo num write(& fifo ad[3], 780);
73 #else
74  /∗fifo num write(& fifo ad[0], ((AD.ADDRA H<< 8) | AD.ADDRA L)); 旧方式 ∗/
75  fifo num write(& fifo ad[0], AD.ADDRA.u16);
76  fifo num write(& fifo ad[1], AD.ADDRB.u16);
77  fifo num write(& fifo ad[2], AD.ADDRC.u16);
78  fifo num write(& fifo ad[3], AD.ADDRD.u16);
79 #endif

80

81 #if AD CH > 4
82  AD.ADCSR.BYTE |= 0x04; /∗グループ 1に切り替えて ∗/
83  ad start(); /∗再度AD 変換∗/
84 }else{

85

86  /∗グループ 1(AD4〜AD7)を変換していた ∗/

87

88 #if DEBUG > 2
89  fifo num write(& fifo ad[4], 230);
90  fifo num write(& fifo ad[5], 340);
91  fifo num write(& fifo ad[6], 560);
92  fifo num write(& fifo ad[7], 780);
93 #else
94  fifo num write(& fifo ad[4], AD.ADDRA.u16);
95  fifo num write(& fifo ad[5], AD.ADDRB.u16);
96  fifo num write(& fifo ad[6], AD.ADDRC.u16);
97  fifo num write(& fifo ad[7], AD.ADDRD.u16);
98 #endif

99

100  AD.ADCSR.BYTE &= ˜ (0x04); /∗グループ 0に切り替え ∗/
101 }

102 #endif
103 }

104

105 /∗∗
106 ∗ A/D 変換の終了によって呼びだされる割り込み関数
107 ∗
108 ∗ @see ad end
109 ∗/
110 #pragma interrupt
111 void int ad(){
112 if(AD.ADCSR.BIT.ADF){AD.ADCSR.BIT.ADF = 0;}
113 ad end();
114 }

ソースコード 15 framework/dependency/AKI3694/sci.h

1 #ifndef SCI H
2 #define SCI H

3

4 /∗
5 ∗ SCI をコントロールするルーチン
6 ∗
7 ∗ @author fenrir (M.Naruoka)
8 ∗ @since 04/06/04
9 ∗ @version 1.0
10 ∗/

11

12 #ifdef cplusplus
13 extern "C"
14 {
15 #endif

16

17 #include <util/fifo char.h>

18

19 /∗SCI3∗/
20 #ifndef SCI3 DISABLE

21

22 #ifndef SCI3 TX BUFFER SIZE
23 #defineSCI3 TX BUFFER SIZE 31
24 #endif
25 #ifndef SCI3 RX BUFFER SIZE
26 #defineSCI3 RX BUFFER SIZE 15
27 #endif

28

29 void sci3 init();
30 fifo char size tsci3 write(char ∗data, fifo char size tsize);
31 fifo char size tsci3 read(char ∗c, fifo char size tsize);
32 fifo char size tsci3 tx size();
33 fifo char size tsci3 rx size();

34

35 #endif /∗SCI3 DISABLE∗/

36

37 #ifdef cplusplus
38 };
39 #endif

40

41 #endif /∗ SCI H ∗/

ソースコード 16 framework/dependency/AKI3694/sci.c

1 /∗
2 ∗ リングバッファ +割り込みを利用したシリアル通信
3 ∗
4 ∗ @author fenrir (M.Naruoka)

5 ∗ @since 04/05/30
6 ∗ @version 1.0
7 ∗/
8 #include <stdio.h>

 9 #include "AKI3694 .h"

10 #include <common.h>
11 #include "sci.h"

12

13 /∗送信 ∗/
14 static fifo char size tsci write(fifo char t∗, char ∗, fifo char size t);
15 static void sci send(volatile struct st sci3 ∗, fifo char t∗);

16

17 /∗受信 ∗/
18 static fifo char size tsci read(fifo char t∗, char ∗, fifo char size t);
19 static void sci recieve(volatile struct st sci3 ∗, fifo char t∗);

20

21 /∗バッファサイズ ∗/
22 static fifo char size tsci fifo size(fifo char t∗);

23

24 /∗エラー処理 ∗/
25 static void sci error handler(volatile struct st sci3 ∗);

26 27

28 /∗∗∗∗∗∗∗∗∗∗/
29 /∗SCI3∗/
30 /∗∗∗∗∗∗∗∗∗∗/
31 #ifndef SCI3 DISABLE

32

33 static fifo char tfifo tx3;
34 static fifo char tfifo rx3;
35 static char buffer tx3[SCI3 TX BUFFER SIZE + 1];
36 static char buffer rx3[SCI3 RX BUFFER SIZE + 1];

37

38 /∗∗
39 ∗ SCI3 を初期化します。
40 ∗
41 ∗/
42 void sci3 init(){
43 fifo char init(& fifo tx3, buffer tx3, SCI3 TX BUFFER SIZE + 1);
44 fifo char init(& fifo rx3, buffer rx3, SCI3 RX BUFFER SIZE + 1);

45

46 /∗SCI3 のレジスタ設定はここに書くこと∗/

47

48 /∗通信全二重通信
49  ∗ 通信モード調歩同期式モード
50  ∗ クロック内部クロック
51  ∗ データ長 8bit
52  ∗ パリティ無
53  ∗ ストップビット長 1bit
54  ∗ ビットレート 9600bps(BRR=64@20MHz )
55  ∗ 割り込み TXI(送信データエンプティ)、RXI(受信データフル)、ERI(受信エラー)
56  ∗/
57 SCI3.SCR3.BYTE = 0x00;
58 SCI3.SMR.BYTE = 0x00;
59 SCI3.BRR = 64;
60 int i; for(i = 0; i < 10000; i++); //1bit 期間待機
61 SCI3.SSR.BYTE &= 0x80; //エラーフラグクリア
62 SCI3.SCR3.BYTE |= 0xf0; //割り込み許可
63 IO.PMR1.BIT.TXD = 1;
64 }

65

66 /∗∗
67 ∗ SCI3 から送信するデータを登録します。
68 ∗

69 ∗ @param data 送信データ
70 ∗ @param size 送信データサイズ
71 ∗ @return (int) 送信バッファに登録されたデータサイズ
72 ∗/
73 fifo char size tsci3 write(char ∗data, fifo char size tsize){
74 fifo char size t size = sci write(& fifo tx3, data, size);
75 /∗
76  ∗ バッファが空の状態のときTXI は一時的に無効になっているので、
77  ∗ それを再度有効にする
78  ∗/
79 if( size > 0 && (SCI3.SCR3.BIT.TIE == 0)){SCI3.SCR3.BIT.TIE = 1;}
80 return size;
81 }

82

83 /∗∗
84 ∗ SCI3 の送信バッファにたまっているデータ量を返します。
85 ∗
86 ∗ @return (int) SCI3 の送信バッファにたまっているデータ量
87 ∗/
88 fifo char size tsci3 tx size(){return sci fifo size(& fifo tx3);}

89

90 /∗∗
91 ∗ SCI3 から受信したデータをもらいます。
92 ∗
93 ∗ @param c 受信したデータを格納するバッファ
94 ∗ @param size 受信したデータを格納するバッファのサイズ
95 ∗ @return (int) 実際にバッファから読み込んだサイズ
96 ∗/
97 fifo char size tsci3 read(char ∗c, fifo char size tsize){return sci read(& fifo rx3, c, size);}

98

99 /∗∗
100 ∗ SCI3 の受信バッファにたまっているデータ量を返します。
101 ∗
102 ∗ @return (int) SCI3 の受信バッファにたまっているデータ量
103 ∗/
104 fifo char size tsci3 rx size(){return sci fifo size(& fifo rx3);}

105

106 /∗割り込み処理 ∗/
107 #pragma interrupt
108 void int sci3(){
109 /∗エラー処理 ∗/
110 if(SCI3.SSR.BYTE & 0x38){
111  /∗フラグクリア ∗/
112  SCI3.SSR.BYTE &= ˜ (0x38);
113  sci error handler(& SCI3);
114 }
115 /∗送信データエンプティ ∗/
116 if(SCI3.SSR.BIT.TDRE){
117  sci send(& SCI3, & fifo tx3);
118 }
119 /∗受信データフル ∗/
120 if(SCI3.SSR.BIT.RDRF){
121  sci recieve(& SCI3, & fifo rx3);
122 }
123 }

124

125 #endif /∗SCI3 DISABLE∗/

126

127 /∗∗∗∗∗∗∗∗∗∗∗∗/
128 /∗汎用 ∗/
129 /∗∗∗∗∗∗∗∗∗∗∗∗/

130

131 /∗送信 ∗/
132 static fifo char size tsci write(fifo char t∗fifo, char ∗data, fifo char size tsize){

133 return fifo char write(fifo, data, size); /∗リングバッファに書き込み ∗/
134 }

135

136 static void sci send(volatile struct st sci3 ∗sci, fifo char t∗fifo){

137

138 /∗書き込むデータがあるか確認 ∗/
139 if(fifo char read(fifo, (char ∗)&( sci−> TDR), 1) == 0){

140

141  /∗書き込むデータがないので、一時的にTXI 割り込みがかからないようにする∗/
142  sci−> SCR3.BIT.TIE = 0;
143 }
144 }

145

146 /∗受信 ∗/
147 static fifo char size tsci read(fifo char t∗fifo, char ∗c, fifo char size tsize){
148 return fifo char read(fifo, c, size); /∗リングバッファから読み込み ∗/
149 }

150

151 static void sci recieve(volatile struct st sci3 ∗sci, fifo char t∗fifo){
152 fifo char write(fifo, (char ∗)&( sci−> RDR), 1); /∗リングバッファに 1バイト書き出し ∗/
153 }

154

155 /∗バッファサイズ ∗/
156 static fifo char size tsci fifo size(fifo char t∗fifo){
157 return fifo char size(fifo);
158 }

159

160 /∗エラー処理 ∗/
161 static void sci error handler(volatile struct st sci3 ∗sci){

162

163 }

ソースコード 17 framework/dependency/AKI3694/timer.h

1 #ifndef ITU H
2 #define ITU H

3

4 /∗
5 ∗ タイマをコントロールするルーチン
6 ∗
7 ∗ @author fenrir (M.Naruoka)
8 ∗ @since 04/06/04
9 ∗ @version 1.0
10 ∗/

11

12 #ifndef TIMER A SETTING
13 #define TIMER A SETTING 0x06
14 #endif

15

16 #ifdef cplusplus
17 extern "C"
18 {
19 #endif

20

21 void timer init(void (∗)());

22

23 #ifdef cplusplus
24 }
25 #endif

26

27 #endif /∗ ITU H ∗/

ソースコード 18 framework/dependency/AKI3694/timer.c

1 /∗
2 ∗ タイマをコントロールするルーチン
3 ∗
4 ∗ @author fenrir (M.Naruoka)
5 ∗ @since 04/06/04
6 ∗ @version 1.0
7 ∗/

 8 #include "AKI3694 .h"

9 #include <common.h>
10 #include "timer .h"

11

12 //インターバルタイマによって呼び出される関数

13 static void (∗timer a callback)();

14

15 /∗∗
16 ∗ タイマA を初期化するルーチン
17 ∗
18 ∗ @param f タイマA(インターバル)割り込みによってコールバックされる関数
19 ∗/
20 void timer init(void (∗f)()){

21

22 /∗タイマA の設定
23  ∗
24  ∗/
25 TA.TMA.BYTE = TIMER A SETTING;

26

27 /∗タイマA コールバック関数の登録∗/
28 timer a callback = f;

29

30 /∗タイマA 割り込み許可∗/
31 IENR1.BIT.IENTA = 1;
32 }

33

34 /∗∗
35 ∗ タイマ割り込みによって呼び出されるルーチン
36 ∗
37 ∗/
38 #pragma interrupt
39 void int timera(){
40 IRR1.BIT.IRRTA = 0;
41 timer a callback();
42 }

ソースコード 19 framework/dependency/AKI3694/wdt.h

1 #ifndef WDT H
2 #define WDT H

3

4 /∗
5 ∗ ウォッチドックタイマをコントロールするルーチン
6 ∗
7 ∗ @author fenrir (M.Naruoka)
8 ∗ @since 04/06/04
9 ∗ @version 1.0
10 ∗/

11

12 #ifndef WDT TMWD SETTING
13 #define WDT TMWD SETTING 0x0F
14 #endif

15

16 #ifdef cplusplus
17 extern "C"
18 {
19 #endif

21 void wdt init();
22 void wdt start();
23 void wdt stop();
24 void wdt reset(unsigned char tcwd);
25 unsigned char wdt reseted();

26

27 #ifdef cplusplus
28 }
29 #endif

30

31 #endif /∗ ITU H ∗/

ソースコード 20 framework/dependency/AKI3694/wdt.c

1 /∗
2 ∗ タイマをコントロールするルーチン
3 ∗
4 ∗ @author fenrir (M.Naruoka)
5 ∗ @since 04/06/04
6 ∗ @version 1.0
7 ∗/

 8 #include "AKI3694 .h"

9 #include <common.h>
10 #include "wdt.h"

11

12 /∗∗
13 ∗ ウォッチドックタイマを初期化するルーチン
14 ∗/
15 void wdt init(){
16 /∗WDT の設定
17  ∗
18  ∗/
19 WDT.TMWD.BYTE = WDT TMWD SETTING;
20 }

21 22

23 /∗∗
24 ∗ ウォッチドックタイマを開始するルーチン
25 ∗/
26 void wdt start(){
27 WDT.TCSRWD.BYTE = 0x9A;
28 WDT.TCSRWD.BYTE = 0xA6;
29 }

30

31 /∗∗
32 ∗ ウォッチドックタイマをリセットするルーチン
33 ∗
34 ∗/
35 void wdt reset(unsigned char tcwd){
36 WDT.TCSRWD.BYTE = 0x6A;
37 WDT.TCWD = tcwd;
38 }

39

40 /∗∗
41 ∗ ウォッチドックタイマをストップするルーチン
42 ∗
43 ∗/
44 void wdt stop(){
45 WDT.TCSRWD.BYTE = 0x9A;
46 WDT.TCSRWD.BYTE = 0xA2;
47 }

48

49 /∗∗

50 ∗ ウォッチドックタイマによるリセットかを検出する
51 ∗/
52 unsigned char wdt reseted(){
53 return WDT.TCSRWD.BIT.WRST == 1;
54 }

ソースコード 21 framework/util/Makefile

1 CC = h8300− elf− gcc
2 NEWLIB DIR = /usr/local/h8300− elf/lib/h8300h

3

4 CFLAGS ?= \
5 − I../..− I. − I/usr/local/h8300− elf/include \
6 − Wall − mh − g − mint32 − mrelax − gdwarf−2

7

8 BUILD DIR ?= build by gcc

9

10 SRCS C = \
11 $(shell ls ∗.c)

12

13 OBJS = $(SRCS C:.c=.o)

14

15 all : $(BUILD DIR) $(patsubst %, $(BUILD DIR)/%,$(OBJS))

16

17 $(BUILD DIR)/%.o : %. c
18 $(CC) − c $(CFLAGS) − o $@ $<

19

20 $(BUILD DIR) :
21 mkdir $@

22

23 clean :
24 cd $(BUILD DIR); rm − f $(OBJS)

25

26 run : all

27

28 .PHONY : clean all

ソースコード 22 framework/util/common.h

1 #ifndef COMMON H
2 #define COMMON H

3

4 /∗common.h がユーザ側で定義されていない場合のひな方∗/

5

6 /∗∗
7 ∗ 定数
8 ∗/
9 #define TRUE 1
10 #define FALSE 0
11 #define EXIT 0
12 #define CONTINUE 1
13 #define VOID −1
14 #define PI 3.14159
15 #define INIT STR "Initial ."
16 #ifndef NULL
17 #defineNULL 0
18 #endif

19

20 /∗ユーティリティ ∗/
21 #define min(a, b) (a <= b ? a : b)
22 #define max(a, b) (a >= b ? a : b)
23 #define pow2(x) (x ∗ x)

24

25 #endif

ソースコード 23 framework/util/conv.h

1 #ifndef CONV H
2 #define CONV H

3

4 /∗文字列処理 ∗/
5 char ∗uint2string(unsigned int i, char ∗buffer);
6 char ∗int2string(int i, char ∗buffer);
7 char ∗ushort2string(unsigned short i, char ∗buffer);
8 char ∗short2string(short i, char ∗buffer);
9 char ∗long2string(long l, char ∗buffer);
10 inline char ∗crlf(char ∗buffer);
11 inline char ∗null char(char ∗buffer);

12

13 #endif /∗ CONV H ∗/

ソースコード 24 framework/util/conv.c

1 #include <common.h>
2 #include "conv .h"

3

4 /∗文字列処理、printf の代用品∗/
5 char ∗uint2string(unsigned int i, char ∗buffer){
6 unsigned int digit;
7 unsigned int power;
8 unsigned char hit = FALSE;
9 for(power = 10000000; power > 1; power /=10){
10  digit = i /power;
11  if(digit > 0){hit = TRUE;}
12  if(hit){∗(buffer++) = digit + '0';}
13  i −= digit ∗ power;
14 }
15 ∗(buffer++) = i + '0';
16 return buffer;
17 }

18

19 char ∗int2string(int i, char ∗buffer){
20 if(i < 0){
21  ∗(buffer++) = '-';
22  i ∗= −1;
23 }
24 return uint2string((unsigned int)i, buffer);
25 }

26

27 char ∗ushort2string(unsigned short i, char ∗buffer){
28 unsigned short digit;
29 unsigned short power;
30 unsigned char hit = FALSE;
31 for(power = 10000; power > 1; power /=10){
32  digit = i /power;
33  if(digit > 0){hit = TRUE;}
34  if(hit){∗(buffer++) = digit + '0';}
35  i −= digit ∗ power;
36 }
37 ∗(buffer++) = i + '0';
38 return buffer;
39 }

40

41 char ∗short2string(short i, char ∗buffer){
42 if(i < 0){
43  ∗(buffer++) = '-';
44  i ∗= −1;
45 }
46 return ushort2string((unsigned short )i, buffer);
47 }

49 char ∗long2string(long l, char ∗buffer){

50

51 if(l < 0){∗(buffer++) = '-'; l ∗= −1;}

52

53 int digit;
54 long power;
55 unsigned char hit = FALSE;
56 for(power = 1000000000; power > 1; power /=10){
57  digit = l /power;
58  if(digit > 0){hit = TRUE;}
59  if(hit){∗(buffer++) = digit + '0';}
60  l −= digit ∗ power;
61 }
62 ∗(buffer++) = l + '0';
63 return buffer;
64 }

65

66 inline char ∗crlf(char ∗buffer){
67 ∗(buffer++) = '\r';
68 ∗(buffer++) = '\n';
69 return buffer;
70 }

71

72 inline char ∗null char(char ∗buffer){
73 ∗(buffer++) = '\0';
74 return buffer;
75 }

ソースコード 25 framework/util/fifo char.h

1 /∗
2 ∗ RingBuffer という FIFO を表現するヘッダファイル
3 ∗ ring buffer.c がメインソース
4 ∗
5 ∗ @author fenrir (M.Naruoka)
6 ∗ @since 04/05/30
7 ∗ @version 1.0
8 ∗/

9

10 #ifndef FIFO CHAR H
11 #define FIFO CHAR H

12

13 #ifdef cplusplus
14 extern "C"
15 {
16 #endif

17

18 #ifndef FIFO CHAR SIZE T
19 #defineFIFO CHAR SIZE T int
20 #endif

21

22 typedef FIFO CHAR SIZE T fifo char size t;

23

24 typedef struct rbuffer char t{
25 char ∗buffer;
26 fifo char size tsize;
27 char ∗prius;
28 char ∗follower;
29 } fifo char t;
30 /∗リングバッファルール
31 ∗ follower(追っかけ)はprius(先行者)に追いつくことはできないし、追い抜くこともできない
32 ∗ prius(先行者)はfollower(追っかけ)に追いつくことはできるが、追い抜くことはできない
33 ∗/

35 fifo char t∗fifo char init(fifo char t∗buffer, char ∗c, fifo char size tsize);
36 fifo char size tfifo char write(fifo char t∗buffer, char ∗data, fifo char size tsize);
37 fifo char size tfifo char read(fifo char t∗buffer, char ∗c, fifo char size tsize);
38 fifo char size tfifo char size(fifo char t∗buffer);

39

40 #ifdef cplusplus
41 }
42 #endif

43

44 #endif /∗ FIFO CHAR H ∗/

ソースコード 26 framework/util/fifo char.c

1 /∗
2 ∗ リングバッファ (FIFO)を表現するC ソース
3 ∗ これは文字列 (char)用。
4 ∗
5 ∗ @author fenrir (M.Naruoka)
6 ∗ @since 04/05/30
7 ∗ @version 1.0
8 ∗/

9

10 #include <stdio.h>
11 #include <common.h>

12 #include "fifo_char .h"

13

14 /∗∗
15 ∗ リングバッファを初期化します。
16 ∗
17 ∗ @param buffer初期化するリングバッファ
18 ∗ @param c 実際にバッファとして機能する領域
19 ∗ @param size 実際のバッファサイズ、c の大きさ
20 ∗ @return (fifo char t) 初期化されたリングバッファ
21 ∗/
22 fifo char t∗fifo char init(fifo char t∗buffer, char ∗c, fifo char size tsize){

23

24 if(size > 0){

25

26  buffer−> buffer = c;
27  buffer−> size = size;
28  buffer−> prius = buffer−> buffer;
29  buffer−> follower = buffer−> buffer + size − 1;
30  return buffer;
31 }else{return NULL;}
32 }

33

34 /∗∗
35 ∗ リングバッファにデータを書き込みます。
36 ∗
37 ∗ @param buffer書き込む対象リングバッファ
38 ∗ @param data 書き込むデータ
39 ∗ @param size 書き込むデータのサイズ (byte)
40 ∗ @return int 正常に書き込まれたデータのサイズ (byte)
41 ∗/
42 fifo char size tfifo char write(fifo char t∗buffer, char ∗data, fifo char size tsize){

43

44 fifo char size t size = 0;

45

46 if(data != NULL){

47

48  /∗バッファに書き込み ∗/
49  while( size < size){

51  if(buffer−> prius == buffer−> buffer + buffer−> size){buffer−> prius = buffer−> buffer;}
52  if(buffer−> prius == buffer−> follower){break ;}
53  ∗((buffer−> prius)++) = ∗(data + ( size++));
54  }
55 }

56

57 return size;
58 }

59

60 /∗∗
61 ∗ リングバッファからデータを読み取ります。
62 ∗
63 ∗ @param buffer読み込み元となるリングバッファ
64 ∗ @param c 読み取ったデータを格納するバッファ
65 ∗ @param size 最大読み込みサイズ (byte)
66 ∗ @return int 読み取ったデータの大きさ (byte)
67 ∗/
68 fifo char size tfifo char read(fifo char t∗buffer, char ∗c, fifo char size tsize){

69

70 fifo char size t size = 0;

71

72 if(c != NULL){

73

74  /∗読込先に書き込み ∗/
75  while( size < size){

76

77  if((buffer−> follower + 1 − buffer−> prius) % buffer−> size == 0){break ;}
78  if(++buffer−> follower == buffer−> buffer + buffer−> size){buffer−> follower = buffer−> buffer;}
79  ∗(c + ( size++)) = ∗(buffer−> follower);
80  }
81 }

82

83 return size;
84 }

85

86 /∗∗
87 ∗ リングバッファ上にあるデータサイズを求めます。
88 ∗
89 ∗ @param bufferリングバッファ
90 ∗ @return int バッファ上のデータの大きさ (byte)
91 ∗/
92 fifo char size tfifo char size(fifo char t∗buffer){

93

94 return (buffer−> prius > buffer−> follower ?
95  buffer−> prius − buffer−> follower − 1:
96  buffer−> prius + buffer−> size − buffer−> follower − 1);
97 }

ソースコード 27 framework/util/fifo num.h

1 /∗
2 ∗ 数値用RingBuffer(FIFO)のヘッダファイル
3 ∗ fifo num.c がメインソース
4 ∗
5 ∗ @author fenrir (M.Naruoka)
6 ∗ @since 04/05/30
7 ∗ @version 1.0
8 ∗ @see fifo num.c
9 ∗ @see common.h
10 ∗/

11

12 #ifndef FIFO NUM H
13 #define FIFO NUM H

15 #ifdef cplusplus
16 extern "C"
17 {
18 #endif

19

20 #ifndef FIFO NUM SIZE T
21 #define FIFO NUM SIZE T int
22 #endif

23

24 typedef FIFO NUM SIZE T fifo num size t;

25

26 #ifndef FIFO NUM T
27 #define FIFO NUM T int
28 #endif

29

30 typedef FIFO NUM T num t;

31 32

33 typedef struct {
34 num t ∗buffer;
35 fifo num size tsize;
36 num t ∗prius;
37 num t ∗follower;
38 } fifo num t;
39 /∗リングバッファルール
40 ∗ follower(追っかけ)はprius(先行者)に追いつくことはできないし、追い抜くこともできない
41 ∗ prius(先行者)はfollower(追っかけ)に追いつくことはできるが、追い抜くことはできない
42 ∗/

43

44 fifo num t∗fifo num init(fifo num t∗buffer, num t ∗array, fifo num size tsize);
45 num t ∗fifo num write(fifo num t∗buffer, num t data);
46 num t ∗fifo num read(fifo num t∗buffer, num t ∗data);
47 fifo num size tfifo num size(fifo num t∗buffer);

48

49 #ifdef cplusplus
50 };
51 #endif

52

53 #endif /∗ FIFO NUM H ∗/

ソースコード 28 framework/util/fifo num.c

1 /∗
2 ∗ リングバッファ (FIFO)を表現するC ソース
3 ∗ これは数値用。
4 ∗ num t を定義して使用のこと
5 ∗
6 ∗ @author fenrir (M.Naruoka)
7 ∗ @since 04/05/30
8 ∗ @version 1.0
9 ∗/

10

11 #include <stdio.h>
12 #include <common.h>

13 #include "fifo_num .h"

14

15 /∗∗
16 ∗ FIFO を初期化します。
17 ∗
18 ∗ @param buffer初期化するFIFO
19 ∗ @param array 実際にバッファとして機能する領域
20 ∗ @param size 実際のバッファサイズ、array の大きさ
21 ∗ @return (fifo num t) 初期化されたリングバッファ
22 ∗/

23 fifo num t∗fifo num init(fifo num t∗buffer, num t ∗array, fifo num size tsize){

24

25 if(size > 0){

26

27  buffer−> buffer = array;
28  buffer−> size = size;
29  buffer−> prius = buffer−> buffer;
30  buffer−> follower = buffer−> buffer + size − 1;
31  return buffer;
32 }else{return NULL;}
33 }

34

35 /∗∗
36 ∗ FIFO に数値データを書き込みます。
37 ∗
38 ∗ @param buffer書き込む対象FIFO
39 ∗ @param data 書き込む数値データ
40 ∗ @return (accuracy ∗) 正常に書き込まれたかどうか、NULL は異常
41 ∗/
42 num t ∗fifo num write(fifo num t∗buffer, num t data){

43

44 /∗空いているかチェック ∗/
45 if(buffer−> prius != buffer−> follower){
46  if(buffer−> prius == buffer−> buffer + buffer−> size){buffer−> prius = buffer−> buffer;}
47  ∗(buffer−> prius++) = data;
48  return buffer−> prius;
49 }

50

51 return NULL;
52 }

53

54 /∗∗
55 ∗ FIFO から数値データを読み取ります。
56 ∗
57 ∗ @param buffer読み込み元となるFIFO
58 ∗ @param data 読み取ったデータを格納するバッファ
59 ∗ @return (accuracy ∗) 読み取ったデータを格納するバッファ、データを読み込まなかった場合、NULL
60 ∗/
61 num t ∗fifo num read(fifo num t∗buffer, num t ∗data){

62

63 if(data != NULL){

64

65  /∗リングバッファ上にデータがあるかチェック ∗/
66  if(((buffer−> follower + 1) − buffer−> prius) % buffer−> size != 0){

67

68  /∗読込先に書き込み ∗/
69  if(++buffer−> follower == buffer−> buffer + buffer−> size){buffer−> follower = buffer−> buffer;}
70  ∗data = ∗(buffer−> follower);
71  return data;
72  }
73 }

74

75 return NULL;
76 }

77

78 /∗∗
79 ∗ FIFO 上にあるデータの個数を取得します。
80 ∗
81 ∗ @param bufferFIFO
82 ∗ @return (int) FIFO 上にあるデータの個数
83 ∗/
84 fifo num size tfifo num size(fifo num t∗buffer){

85

86 return (buffer−> prius > buffer−> follower ?

87  buffer−> prius − buffer−> follower − 1:
88  buffer−> prius + buffer−> size − buffer−> follower − 1);
89 }

ハードウェア

機体搭載機器として以下のハードウェアを作成した。回路図を図 4 に示す。また、この回路図にそって基板を作成した。基板のレイアウトを図 5 に記載する。使用した部品を表 1 にあげる。

図 4 機体搭載機器回路図

補足を行うと、スピコンから供給される電圧が 5V であったため、作成した基板のレギュレータを使用する必要はなかった。レギュレータを使用しない設定の場合、秋月 H8/3694F のジャンパ線を一箇所切断する必要がある (秋月のマ

図 5 機体搭載基板レイアウト (表・裏)

ニュアルを参照) ので注意すること。これを怠ると秋月基板上のレギュレータに逆電圧がかかり損傷する恐れがある。最後に、ハードウェアの参考リソースとして以下のものをあげておく。

• 秋月電子通商キット取扱い説明書回路図集

• 同 H8/3664FP フラットマイコンモジュール・キット今回使用したモジュールの取説。

• ルネサス H8/3694 グループマイコンのマニュアル等がダウンロードできる。

表 1 機体搭載基板部品表

名前値説明
C1  10μ/16V  OS コン、千石地下 1 階
C2  0.1μ  1608 パッケージ
C3  10μ/16V  OS コン、千石地下 1 階
C4  0.1μ  1608 パッケージ
C5  0.1μ  1608 パッケージ
CON1  フルピッチ (2.54 mmピッチ) 3 穴
CON2  フルピッチ 3 穴
CON3  フルピッチ 3 穴
CON4  フルピッチ 3 穴
CON5  フルピッチ 3 穴
CON6  フルピッチ 3 穴
CON7  フルピッチ 3 穴
CON8  フルピッチ 3 穴
CON9  フルピッチ 3 穴
CON10  フルピッチ 3 穴
CON11  フルピッチ 3 穴
CON12  フルピッチ 3 穴
CON13  フルピッチ 3 穴
CON14  2.0 mmピッチ 3 穴
CON15  2.0 mmピッチ 3 穴
CON16  2.0 mmピッチ 3 穴
CON17  2.0 mmピッチ 3 穴
CON18  2.0 mmピッチ 3 穴
CON19  2.0 mmピッチ 3 穴
CON20  2.0 mmピッチ 3 穴
CON21  2.0 mmピッチ 3 穴
IC1  LM2940CT-5.0 3 端子レギュレータ、秋月
IC2  74VHC32F  SOP14 パッケージ、千石
U1  KXM52  DIP8 パッケージ、秋月 3 軸加速度計モジュール
U2  AE-3694  秋月 H8/3664FP フラットマイコンモジュール・キット