G2009_ひな形プロジェクトの説明
2024年12月3日
6:34
G2009_lpc_template_project_report
下記にLPCマイコンの早見表をアップしました、ダウンロードしてご活用ください
LPCマイコンの早見表.pdf
LPC812_TEMPLATE プロジェクトの説明
- #include 命令は、テキストファイルに分割されたプログラムコードをビルドするときに展開します
- テキストファイルの拡張子は、.h で、ヘッダーファイルと呼んでいます
- 下記は、メーカーから提供されたコードをそのまま使っています
- 運用中このコードを変更することはありません
自作関数をまとめたヘッダーファイル
- lpc812_kyo.h は、LPC812専用の関数をまとめています
- 要はLPC11U35と統一コードが作れなかった関数を泣く泣く収めているものです
- ややこしいのですが、仕方がありません
- lpc_kyo.h は LPC812とLPC11U35 の両方で利用できる、汎用性の高い関数をまとめています
- これらは、今後新しい関数が増えたり、バグが発見されたら修正されます
- ひとり開発が基本なので、皆様が独自の関数をお使いになりたい場合の仕組みは全く考慮していません
- これらのヘッダーファイルに独自関数を追加されることは、おすすめ出来ません
- 新しいヘッダーファイルをおつくりになることを、強くお酢するします
- #include 行を追加してお使いになるとよいでしょう
- あるいは、ファイル名を変更してしまって、後々の管理はすべてユーザ様の下で行っていただくのが良いでしょう
- バグ修正のファイルを配布した場合、ユーザ様の関数が消えてしまうからです
LPC812とLPC11U35を比較します
- LPC1114ははんだ作業が困難と言うことで、今後2種類のCPUのみ対象とします
- (接触不良が頻回な確率で発生しています)
- LPC812は16KBしかコード容量がないので、実験用、また簡単な用途に利用します
- 本格的なロボット製作に入ると、LPC11U35の出番です
- LPC11U35の64KBの容量でも不足するアプリの場合は、分散制御を考えていきます
- 512KBの容量がある、LPC1768は調査はしましたが、未完成です
- バックアップCPUに運転切り替えするアプリを設計する場合でも、規模が小さいほど取り回しが簡単と言えます
- ただ、プログラムコードの書き込み方法が異なり、ライター基板を2タイプ所持する必要があるのがデメリットです
スイッチマトリックス
- この部分は、ヘッダーファイルに分離することにします
- lpc812_matrix.h という名称でヘッダーファイルを追加します
ヘッダーファイルの追加
- lpc812_kyo.h をコピーして、ファイル名の変更をします
インクルード定義を変更します
- このように、コード編集ウインドウが開きます
- コピーした ままですから、内容は lpc812_kyo.h のままです
- すべて削除して、スイッチマトリックのコードをコピーペーストします
- lpc812_matrix.h で貼り付けして完成です
忘れずに、保存を実行しましょう
- ビルドに失敗しました
- ビルドでは、main.c の保存はされますが、ほかのヘッダーファイルなどは保存されないようです
- 下記の保存を実行することで、エラーは解消しました
インターバル関数
- 現在実験用に、待ち時間を生成するために利用していますが、緊急停止などの制御用途に活用します
- アプリごとに、独自コードを記述する必要があるので、これはヘッダーファイルに移行できません
実験用関数の配置場所
- mian()プログラムで利用する関数をここに配置しますが、コードが多くなると見通しが悪くなります
- コードの折りたたみ機能は、プロジェクトを閉じると、無効になってしまいます
- そのような場合は、main() の後方に関数を配置して、関数の型定義を行うことで対処します
メインコード
- マイコンが動き始めると、ここから始まるように見えます
- 変数定義 機能の初期化 無限ループ というような流れになります
- 無限ループ内部の1周期をスキャンとも呼びます
変数定義
- main() コード内部の変数はすべて自動変数となりますが、関数の自動変数とは異なりマイコンが動いている間は保持されます
- 存在はグローバル変数のようですが、関数から参照はできません
- 関数内部で定義される自動変数は、関数の外に出た時点で消失します
- 型定義は特殊でC#とは異なっています
- 特に整数はビットサイズが明示的に定義でき、メモリの消耗を計算しやすくなっています
- おそらくですが、メモリはプログラムコードのメモリではなく、RAMが消費されると思います
- LPC812では わずか 8KBしかありません
|
符号あり
|
範囲
|
符号なし
|
範囲
|
8ビット
|
int8_t
|
-128~127
|
uint8_t
|
0~255
|
16ビット
|
int16_t
|
-256~255
|
uint16_t
|
0~65,535
|
32ビット
|
int32_t
|
|
uint32_t
|
0~4,294,967,295
|
8ビット 0xFF
16ビット 0xFFF
32ビット 0xFFFFFFFF
実数型の注意
- マイコンでも、実数型は使えますが、よほどの事情がない限り、整数利用に制限するのがおすすめです
- 大小判定は、少数桁を 10倍/100倍などの処理を工夫します
- 実数型の扱いは、いろいろと面倒であることがわかってきます
シリアル通信のコマンド処理
- 最初に定義されているのは、実験で利用するシリアル通信のコマンド受信変数です
- rcx_buf_max 受信バッファサイズ 40バイト
- rcv_buf[40+2] 受信コマンドを保存する
char型の配列です
- +2 はオーバーフローのトラブルを回避するための、おまじないのようなものです
- rcv_cnt コマンドの受信文字数が保存されます
モニタ用LEDのピン番号
- わざわざ変数に代入するのは、複数個所に利用されるため、ピン番号の変更が簡単にできる工夫です
- コピペする時も、修正の必要がありません
マイコンの初期化手続き
- 以前説明した、マイコンピンの役割を定義する、スイッチマトリックスを実行しています
- システムクロックに関する初期化ですが、筆者も詳しくは知りません
- メーカーから提供されたひな形コードをそのまま使っています
- UARTInit()
- シリアル通信の初期化処理です
- これもメーカーから提供されたひな形です
- LPC_i2c_init()
- I2C通信のための初期化処理です
- これは、メーカーから提供されたひな形コードを、関数にコピペしてコードを見やすくしました
PIOピンの入力、出力設定
- 6番以降のピンは、入力、出力のどちらかに役割を固定して使います
- 入出力両方に使うことは基本出来ないと、お考え下さい
- この事例では モニタ用LEDの出力に20番ピンを使っています
- pin_set_output( ピン番号 );
- 指示されたピン番号を出力に固定します
- pin_set_input( ピン番号 );
- 指示されたピン番号を入力に固定します
マイコンのメインループ
- 実験や説明の都合上、スキャンロスをあえて容認して、このような処理をしています
- LEDが点滅して、スキャンが動いていることを示します
- ロボット制御では、このようなスキャンロスは絶対に使いません
コマンドの受信を判定しています
- コマンドの終端の CR LF を受信すると、コマンドの完成と判定し、下方に処理が流れます
- コマンドが受信されなければ、この行以降に、制御は渡りません
- UART_puts("\r\n"); とコーディングすれば、
- このように画面表示されます、実行すると シリアル通信に CR LF が出力されます