こんばんは。花盃(仮)チームリーダです。しばらくの間サッカー班とは対照的に影が薄くなっていた花盃(仮)レスキュー班ですが、実はちゃんと作業はしていましたよ。
両チームに関して言えることなのですが、機体が非常に遅れている!これは大変困ったことだ。ハードウェアもある程度動いてきたとはいえそれでは二ヵ月後の試合に間に合うのかわからない状態だ。とりあえず、テスト勉強は三時間くらい消化して手が疲れたので今日の成果報告をしたいと思います。
とりあえず、まずはじめにAVRがまともに動作しているのをこの目で確認することができました。私はプログラム内の遅延用の関数
void delay(volatile long delay){
while(delay<=0){delay–;}}
のvolatileを忘れたのです。だから勝手にコンパイラが最適化して関数を呼び出しても遅延処理が実行されず、ためしに作ったLED点滅プログラムが動かなかったわけです。
後もうひとつ、以前動かないといっていたモータドライブ回路の不具合についてやっとわかりました。MOSFETをひとつだけ基盤に乗せてFETの動作を実験してみたらよくわかりました。あ、ちゃんとスイッチングができている!それをHブリッジ構成にすればよいわけです。プルアップ関係とかも考慮してもう一回設計しなおそうと思います。結果は後日連絡します。これが動けば次はタッチセンサ、銀センサとLEDを光らせるポート、I2Cのワイヤを伸ばす位です。さあ、がんばって動かそう!(よくわからない感じで終わりました、というかいつもこんな感じかぁ)
RSS feed for comments on this post. TrackBack URL
WinAVRを使っていると思うので、AVRはいくつかライブラリが整備されているため、遅延関数も準備されています。
delay.hをインクルードすれば、_delay_ms,_delay_us関数が使えるようになります。
ただ、引数には定数しか渡せません。(正確には変数も渡せますが、ライブラリで小数点演算をしているため変数を渡すと急にコードサイズと実行速度に影響するため事実上不可)
ので、以下のような関数を作成し併用することにより正確な遅延が可能です。
またこのライブラリを使うときは必ずプロジェクトの設定でクロック周波数は定義してください。プロジェクトで定義することによりF_CPUとしてクロック周波数がDefineされます。
void delay_ms(uint16_t ms){
while(ms--){
_delay_ms(1);
}
}
(マイクロ秒の場合はmsをusに変更)
ライブラリもこの関数を作る前提で関数名をあえてdelay_msではなくアンダーバーをつけた_delay_msにしていると推測できますね。
http://www.chibiegg.net/elec/avr-elec/74hc595_sample.htm 参照。
あと、AVRは型が特殊(というよりも変数サイズがわかりやすいように再定義されている)なのでlongなどは使わずに、uint16_t(2バイト正の整数)等の型を使うようにしましょう。
AVRについては http://avrwiki.jpn.ph/wiki.cgi がおすすめです。Getting Startedは必読です。
この他にもconst(定数)の利用方法に注意があったりしますので絶対読むべきです。
例えば、
uart_putstr(“Serial test”);
などと文字列をそのまま引数で渡すと大幅なSRAMの無駄になります。
const char str[] PROGMEM = “Serial test”; //Flash上に定数を配置
uart_putstr_p(str); //「Serial test」と送信
このように一旦FLASH上に定数としてしっかり配置しそのポインタを渡すなどとする工夫が必要です。
コメント by chibiegg — 2009年12月6日 @ 13:21
っていうか、while(delay< =0)はおかしいよね。while(delay>0)やんな?
まぁ記事だけのみすならどうでもいいけど。
while(delay–); でもいいよ。
コメント by chibiegg — 2009年12月6日 @ 18:19
[…] で、今AVRをやっているんですが、koujiが少し前にいっているように、AVRのコンパイラの最適化により、wait関数が実行されていませんでした。なので引数にvolatileをつけなければいけ […]
ピンバック by 洛星中学高等学校 ロボット研究部・同好会 開発日誌 » 00年代も終わり — 2009年12月27日 @ 19:13