今度はLCDの制御です。
と言っても既にあるライブラリを使うと簡単です。
Source Files に lcd.c を追加します。
あとは、 fdevopen関数 に lcd_put_ch を指定すれば printf関数 が使えるようになります。
#include <avr/io.h>
#include <stdio.h>
#include "lcd.h"
int main( void )
{
lcd_init();
fdevopen( lcd_put_ch,NULL );
lcd_position( 0,0 );
printf( "Hello World!" );
}
これをコンパイルすると・・・
../T01.c:12: warning: passing arg 1 of `fdevopen' from incompatible pointer type
という警告(warning)が出ちゃいます。 いいのかなぁ~
割り込みによるタイマーで1/100秒を計れるようになりました。
しかし、もっと基本的な時間待ちを試してみたくなりました。
そうです。
単なるループでの時間待ちです。
何回のループで1秒の待ちになるか確認してみます。
500,000,000回(5億回)のループで大体8秒でした。
ということは、1回のループに0.000000002秒です。(0.002μ秒 速っ~!)
すごいよAVR!
と単純にびっくりしていましたが・・・待てよ! また単純なプログラムなので、変数がレジスタに乗ってしまっているだけかも知れない・・・と疑ってみるとやっぱりそうでした。
ループの変数の定義に volatile を付けてみると・・・とてつもなく遅くなりました。
2,500,000回のループで大体11秒です。
すると、1回のループに0.0000004秒です。(0.4μ秒 まあ、こんなもんか)
#include <avr/io.h>
#define LED_SET DDRC |= 0x10
#define LED_ON PORTC |= 0x10
#define LED_OFF PORTC &= ~0x10
int main( void )
{
volatile long i;
LED_SET;
while(1)
{
LED_ON;
for(i=0 ; i<2500000L ; i++);
LED_OFF;
for(i=0 ; i<500000L ; i++);
}
}
よ~し だんだん思い出してきたゾ。
それじゃ、調子に乗って、タイマー割り込みを・・・
このプログラムを動作させると、PC4に接続したLEDが一秒毎に点滅します。
#include <avr/io.h>
#include <avr/interrupt.h>
#define LED_SET DDRC |= 0x10
#define LED_ON PORTC |= 0x10
#define LED_OFF PORTC &= ~0x10
volatile unsigned long cnt = 0;
ISR( SIG_OVERFLOW1 ) // 10ms毎に割り込み
{
TCNT1 = 0x10000 - 1250;
cnt++;
}
int main( void )
{
LED_SET;
TCCR1A = 0x00;
TCCR1B = 0x03; // 64分周
TCNT1 = 0x10000 - 1250; // 10ms毎にオーバーフロー
TIFR1 |= 0x01; // オーバーフロー許可
TIMSK1 |= 0x01; // タイマ割り込み許可
sei( ); // 割り込み有効
while(1)
{
cnt = 0;
LED_ON;
while( cnt < 20 ); // 0.2秒点灯
LED_OFF;
while( cnt<100 ); // 0.8秒消灯
}
}
0.01秒(10ms)毎にグルーバル変数 cnt がインクリメントされます。
1250のところを12500にすると、10ms毎のカウントではなく、100ms毎のカウントになります。
確か前回は、volatileを知らなくて、ハマッテいました。
この1250という数値は以下の式で算出しました。
1(秒) ÷ 8,000,000(クロックHz) × 64(分周) × 定数 = 0.01(秒)
となる定数を逆算すると 1,250 になります。
まだ、よく思い出せないAVRですが・・・とりあえず、タイマーを使った時間待ちを作ってみました。
これで、1秒間だけLEDを点灯することができます。
#include <avr\io.h> // LEDを一秒間点灯する
void wait(long t) // 10ms待つ
{
while(t-- > 0)
{
TCNT0=0;
while( TCNT0<78 );
}
}
int main( void )
{
TCCR0B = 0x05; //プリスケーラ1024分周
TCNT0 = 0; //タイマークリア
DDRC |= 0x10; // PC4を出力に設定
PORTC |= 0x10; // PC4をHに設定
wait( 100 ); // 1秒待つ
PORTC &= ~0x10; // PC4をLに設定
}
この 78 と言う数値は以下の式で算出しました。
1 (秒)÷ 8,000,000(クロックHz) × 1,024(分周) × 定数 = 0.001(秒)
となる 定数 を逆算すると、大体 78 となります。
梅雨明けしたとはいえ、ここのところ嵐のような雨が降っていましたが・・・
本日は、本来の夏の暑さを取り戻したようです。
この暑いのに、「M&Y家族」は暑さに対抗して、昨日の夕食は焼肉、本日の昼食はラーメンです。
暑い! 熱い! 汗が・・・でもうまい。
でも、さすがに食べた後はクーラーが恋しいですねぇ。
し か も
懲りもせずに、この暑い中、サイクリングに行ってきました。
いつもと同じ、多摩川まで・・・
二子玉川の河川敷では、サッカー少年、野球少年たちが、この暑い中で一生懸命試合をしています。
ある野球のチームが円陣を組んで
監督 「まだいける」
一同 「はい」
監督 「まだいける」
一同 「はい」
監督 「まだいける」
一同 「は~い」
監督 「よし、逆転してこい!」
なんて、やってました。
本日はとっても強い南風です。
行きはすごい向かい風、帰りは背中いっぱいに追い風を受けて走ってきましたよ。
ここのところ、ドラクエIXを、やってます。
やっぱり、面白いです。
グラフィックスも素晴らしい出来です。
ドラクエの世界での基本作業は健在のようです。
他人に家に勝手に入り・・・家の人が居るにも関わらず、タンスを空け、ツボを割り、宝箱を開けて中に入っていた物を(勝手に)自分の物にする。
家の人は、「勇者様には逆らえない」と、あきらめてるのかな?
これぞ、ドラクエの世界ですねぇ。
では、プレゼンの最終回です。
2007年にレッドゾーンのルールが出来たときには、本当に途方にくれましたねぇ。
「黒線が無くて、どうやって被災者を探せば良いのだよ!(怒)」
でも、それまで参加していたチームも皆悩んでいたのですね。
大きなルールの変更があったからこそ、「M&Y」が参入できたのかなぁ。
お掃除方式はともかく、壁で方向転換した後に一定時間後ろに下がってロボットを壁に押し付けるのは「M&Y」オリジナルだと(勝手に)考えています。
蘇州世界大会の時の楊枝の量は、半端じゃなかったです。
競技が終わるごとに審判が、ざくざくと撒いていましたから・・・まさに楊枝の海でした。
ちなみに、このジャパンオープンでのプレゼンですが・・・
途中で読むのをあきらめた方・・・普通の反応だと思います。
最後まで長い時間を掛けて読んでくれた方・・・ありがとうございました。
銀河英雄伝説の外伝も、全部見終わりました。
いや~楽しかった。
外伝だけでDVD17枚です。
ところで、帝国軍ってドイツっぽい感じがしますよね。
この物語の中で、キルヒアイスが酒場に入って「黒ビールに玉子とハチミツを入れてシェークしたもの」を注文するのですが・・・そんな飲み方があるんですかねぇ?
私自身アルコールは一切飲まないので、分かりません。
日本で言う玉子酒みたいなもの?
本日、Y(とM&Y母)は、日本科学未来館のイベントで「解剖実験コース」なるものに参加してきました。
真アジ(さかな)の心臓、胃、眼の水晶体など、いろいろなものを取り出して中身や断面を確認したそうです。
※もっと生々しい写真もあったのですが、食事中の方もいるかと思い、掲載は自粛しました。
なんか、研究者みたい。
最後にお土産として、腎臓から取り出したDNAを持って帰ってきました。
でもこれ、持って帰ってきて、いったいどうするの?
帰りに、1/1ガンダムを見てきたそうです。 (もしかして、こっちがメイン?)
でっけっ~
眼が光っていて、かっこよかった! (とのことです。)
まあ、そんなガンダムも M&Y母 の手に掛かれば、ひょいと手の上のおもちゃですけどね・・・(笑)
先日、あるチームのメンターさんからメールをいただきました。
もともと、この「M&Yの履歴」を見て、ロボカップに参加しようと思った、とか・・・
そう言って頂けるだけでも、このブログを立ち上げた甲斐がありましたよ。
次の世代も育ったし・・・もうそろそろ引退してもいいですかねぇ。(笑)
ネタも尽きてきたし・・・
「M&Y」がロボカップに参加してから3年目ですが・・・この短い期間に、急に競技のレベルが上がってしまった様に感じています。 初心者の参入が難しくなったのでは無いかと(ちょっと)心配しております。
1年ほど前に、妻のお母さん(つまり義母さん)が、「パソコンが欲しい」というので、DELLのパソコンを買いました。
余計なものなどがインストールされていたし、ハードディスク全体がCドライブになっていたので、3つに分割したかったし・・・ということで、すぐにWindowsを再インストールしてしまいました。
どうも、そこに落とし穴があったようです。
このDELLのパソコンには、(余計なことに!)DELL MEDIA DIRECTなる、機能が備わっており、無効にはできません。
この機能は、電源OFFのときでもCDを聞いたり、写真を見たりできる便利な機能のようです。 (本当かよ!)
この機能を起動するためには、キーボードの上にある「家」のマークのボタンを押します。 するとMEDIA DIRECTというアプリが起動するハズなのですが・・・
上で書いたように、Windowsを際インストールする時に、あっさりと必要な領域やアプリを消してしまったようです。 (いやっ、消しました。 はいっ 消しましたよ。)
義母さんが電源ボタンと間違って「家ボタン」を押してしまったので、パソコンはMEDIA DIRECTを一所懸命起動しようとするのですが、そんなものがないのでハングアップ・・・となります。
アプリが無いのだから、そのままOSを起動してくれれば良いのですが、そうならないばかりか、電源を入れなおしてもOSが起動せず・・・もうお手上げ状態です。
世間では「自爆ボタン」と言われているようです。
結局、説明書どおりに、MEDIA DIRECTでパーテーションを切りなおし、Windowsを再インスト-ルしてからMEDIA DIRECTのアプリを入れて・・・「爆弾」の起爆装置は解除となりました。