あるHPに面白そうな計算結果が出ていました。
小数以下24桁も表示しています。こんな計算どうやってやるのだろうと自分でもやって見ました。
EXCELでは小数以下16桁までしか出ません。
取りあえず以下のプログラムを使い最初はmingw、次にcygwinで計算させ結果を比較してみました。
以外とこのような計算をする例がなくちょっと苦労しましたが。
#include
main(void)
{
double x, y, z, w;
x = 180000000.0 / 4294967296.0;
y = 10.0 /0.041909515857696533203125;
z = 0.041909515857696533203125 * 238;
w = 0.041909515857696533203125 * 239;
printf("%.24f \n",x);
printf("%.24f \n",y);
printf("%.24f \n",z);
printf("%.24f \n",w);
}
mingwの結果:
$ ./a
0.041909515857696533000000
238.609294222222220000000000
9.974464774131774900000000
10.016374289989471000000000
cygwinの結果:
0.041909515857696533203125
238.6092942222222217740636552
9.974464774131774902343750
10.016374289989471435546875
gccのversionは異なりますが、この違いはどうして出てくるのでしょうね。
?????
bcc32の結果:
C:\bcc_work>calc2.exe
0.041909515857696533200000
238.609294222222217800000000
9.974464774131774902000000
10.016374289989471436000000
今年は厳冬のせいでしょうか梅の開花が遅れています。
我が家のベランダは日が当たり比較的暖かい環境のせいでしょうか、紅白の花が
咲きました。
しかし、この辺の梅の木は未だ蕾の状態で開花までには少し時間がかかりそうです。
そろそろ寒さも峠を越した様ですので、暖かい日が続けば一気に開花するのかも知れません。
暦の上では既に春ですが、実感としてやっと春の息吹を感じられる様になったかなと。
例年の冬は比較的暖かったので部屋の気温も19℃くらいで何とか寒さをしのげたのですが、
今年は15℃くらいまで下がり暖房のお世話になりました。
もう少しの辛抱が要りそうです。
春よ来い、はーやく来い!
I/O Expander経由でグラフィックLCD(SG12864)を動かして見ようと取りあえず
つないでみました。
プログラムは適当に(本当はどう作ったら良いのか分からない)作りやって見ましたが
全く反応なし。
LCDの左半分にドットを出す事を目指しています。
全く反応なしと書きましたが、2回ほど左半分にドットが表示されましたが、それっきり出ません。
ちょっと調べてみるとI/O Expander側のresetがLowになったまま、これではうまくありません。
TWIとSG12864の両方のコマンドを考えないといけません、何が何やら頭が混乱して、
しばらくこれで時間がつぶせます。
先は遠いなーー。 放り出すかも知れません。 FMラジオのプログラムの書き直しも全く進展せず
成果なし。
プログラムは難しい!
色々やってみて取りあえずこうすればプログラムで書いた順番通りに動く様になりました。
先ずconfiguration reg.を以下の様に設定します。BANK=1,disable sequential Operation
//CONFIGURATION REGISTERの設定
i2c_start(SLAVE_ADR, TW_WRITE);
i2c_write(0x05);// reg-adrs IOCON(A)選択
i2c_write(0xA0);// BANK=1, Sequencial operation = disable
i2c_stop();// ストップ・コンディション発行
i2c_start(SLAVE_ADR, TW_WRITE);
i2c_write(0x15);// reg-adrs IOCON(B)選択
i2c_write(0xA0);// BANK=1, Sequencial operation = disable
i2c_stop();// ストップ・コンディション発行
PORTA,Bを出力に設定
// GPA0~GPA7の全ポートを出力ポートに設定
i2c_start(SLAVE_ADR, TW_WRITE);// スタート・コンディション発行
i2c_write(0x00);// reg-adrs IODIRA選択
i2c_write(0x00);// 設定値 0x00, output
i2c_stop();// ストップ・コンディション発行
// GPB0~GPB7の全ポートを出力ポートに設定
i2c_start(SLAVE_ADR, TW_WRITE);// スタート・コンディション発行
i2c_write(0x10);// reg-adrs IODIRB選択
i2c_write(0x00);// 設定値 0x00, output
i2c_stop();// ストップ・コンディション発行
PORTに以下のようにデータを書き込みます。
// GPAポートに"0" or "1"を出力
i2c_start(SLAVE_ADR, TW_WRITE);// スタート・コンディション発行
i2c_write(0x09);// reg-adrs GPIOA選択
i2c_write(0xff);// LED Off、 1番
delay_ms(500);
i2c_write(0xfe);// LED0 On、2番
delay_ms(500);
i2c_write(0xfc);// LED1 ON、3番
delay_ms(500);
i2c_write(0xff);// LED0,1 OFF、4番
delay_ms(500);
i2c_stop();
// GPBポートに"0" or "1"を出力
i2c_start(SLAVE_ADR, TW_WRITE);
i2c_write(0x19);// reg-adrs GPIOB選択
i2c_write(0xff);// LED Off、5番
delay_ms(500);
i2c_write(0xfc);// LED0,1 On、6番
delay_ms(500);
i2c_write(0xff);//LED0,1 Off、7番
delay_ms(500);
i2c_stop();// ストップ・コンディション発行
この結果はプログラムの順番に(1番~7番)のLEDがオン、オフします。
MCP23017のresetを出すとデフォルトに戻ってしまうので注意が必要です。
このI/OエキスパンダにグラフィックLCDをつなごうと考えているのですが、直にmega328に
つないだ方が良さそうな気がします。