こんにちは、しゅうです。
番外編を終えて迷路解析にまた取り組もうと思っておりますが、今までCS+で書いていたお話しをMacに移行するところで割とてこずっています泣
今回は、短めの備忘録という事で、必要な変更箇所や移行方法をお話しします。そういえばソフトウェアのお話を書いている時って、どういう写真を載せるか悩みますね。
コーディングの進め方
いきなり、今までのソースコードをそのまま持ってきてもうまくコンパイルできない可能性が大きいです。そもそも前回まで、コンパイルできるようにかなり書き換えていきましたものね。
そこで、ここからは1つずつコードを移してきます。とりあえずmain関数にinit, interrupt, iodefineなどなど書き込んで行って、それらがちゃんと使えることを確認してから別のファイルに移したりしていきます。つまり最初はmain.cがかなり長いコードになります。
また、Pi:Coを購入した時に同梱されているサンプルプログラム(step1 ~ step9)に沿って勧めるとわかりやすいです。僕は勉強し直すつもりでもう一度読み返しながらコーディングして行っています。
wait_ms関数を使いたい
何かと便利な関数。例えば音楽を鳴らす時にwait_ms関数を駆使してたり、チャタリング防止のためにちょっぴり待ち時間を設けていたり。使ってみようとCS+の時のソースコードを持ってきてコンパイルしたらエラーが出ました。変数定義をしているのに「そんなのないヨ」って言われちゃいました…どうも今回の環境だと、extern volatile unsigned int timer;と定義しても拾ってくれないみたいです。
という事で、変数定義をしているファイルを用意しちゃいましょう。glob_varです。.cで実体を作り、.hに使っていく変数を書いていきます。今までだと、地図のパラメータやモータ制御、スラローム用の変数をまとめていたところです。そこで次のように書けばエラーが出ないようになりました。
#ifdef _GLOB_VAR #define GLOBAL #else #define GLOBAL extern #endif GLOBAL unsigned int timer;
CS+の時と同じですが、.cの方も書いておきます。
#define _GLOB_VAR #include "glob_var.h"
割り込み関数
今となってはちょっと、お恥ずかしいお話です。
wait_ms関数が使えるようになって嬉しくてint_cmt関数でお試しで入れてみようと思いました。でもLEDがうまく光らなかった、どうして?としばらく悩んでいて…結局わからなかったのでサンプルプログラムを見返すと、なんと、割り込み関数でwait_ms関数を使っていなかった、のです。僕は今回、int_cmt0でLEDを制御しint_cmt1でtimerのカウントをさせてました。これが原因です。
簡単にいうと、int_cmt0でwait_ms関数を呼び出してwhile文から抜けるのを待っている間、int_cmt1のカウントアップが動かないので永久的にwhile文から抜け出せない状態にあったのです。互いにお仕事の邪魔をしちゃっている状態です。なので、int_cmt0はfor文を使ってLED制御をして、main関数の中でwait_ms関数を使ったLED制御をするようにコードを書いたら無事動きました。ちゃんと個別にLEDが点滅してました。
Makefile
今回触れたファイルを、MakefileのCSOURCESに書き足すのを忘れないように!一部を下記に書いておきます。
CSOURCES = main.c \ intprg.c \ vecttbl.c \ misc.c \ init.c \ glob_var.c
僕は、misc.cにwait_ms関数を、glob_var.cに使いたい変数を、init.cに初期化に関するお話を書きました。
ちなみにヘッダーファイルなどは、こちらでお話ししたSYSINCSやAPPINCSなどで認識されているので特に指定していなくても大丈夫ですよ。
また、make cleanがどういう挙動をするかを定義していました(clean:のところ)。これと同様に、書き込む時のコマンドを定義しておけば楽ですよ。僕はrunと定義して、make runを実行すると書き込みが始まるようにしてます。
今後の方針
今回はwait_ms関数、割り込み関数、Makefileへの書き足しについて少しお話ししました。これで、他にも便利関数を使いたい時の書き方や割り込み関数の扱い方が掴めたことと思います。
ここからは、ブザーを鳴らす・モード変更機能・モータを動かす・センサー値を読み取る・迷路解析をする、などなど実装することがたくさんあります。進みはかなり遅くなると思いますが、1つずつ確実に実装していきたいと思います。