これまた難関でした。I2C通信をしたくて参考本のプログラムを改造したが、うまくいかない(参考本のRTCからの時刻取得はソフトI2Cで行ってるのでちゃんとしたものでやりたかった)。改造方が悪いだけでした。まったく理解せずこんな感じだろう的な改造だったのでダメでした。
風呂の中で参考本と仕様書を見る。なんとなくわかったのでやってみたが、秒の表示がおかしい・・・。I2c通信自体はうまくいってるっぽい。
なんども仕様書を見てみるとあることに気がついた。10の位と一の位が別に入力されてる。なるほど。
ということで、これも半日悩み成功した。
参考本のMP3プレイヤーでI2C通信でEEPROMを読んでる関数をRTC用に改造。改造といってもほぼ一緒。
void i2c_2_write(
unsigned long addr,
unsigned char* data,
unsigned char bytecnt)
{
i2c_start();
i2c_writebyte(0xa2); // SLA + W
i2c_writebyte(addr);
while(bytecnt > 0){
i2c_writebyte(*data++);
bytecnt--;
}
i2c_stop();
}
void i2c_2_read(
unsigned long addr,
unsigned char* data, unsigned char bytecnt)
{
i2c_start();
i2c_writebyte(0xa2); // SLA + W
i2c_writebyte(addr);
i2c_start();
i2c_writebyte(0xa2 | 0x01); // SLA + R
while(bytecnt > 0){
*data++ = i2c_readbyte(bytecnt == 1);
bytecnt--;
}
i2c_stop();
}
その後、タイマー割込みに挑戦するが一日中格闘するも挫折。割り込みが一回しか入らない。オープンドレイン端子ということを見つけるが良くわからずプルアップしてもダメ。0x01のコントロール2アドレスのTI/TPに書き込んでも読み込むとなくなってる。よくわからん。
ということで、1Hz周波数を貰うことにする。怒りが有頂天。
-追記 ポインタアドレスに実値を入れていた、ソースを修正してタイマー割り込みに戻す。カイバー
*今後はwarningを無視してはいけない・・・
unsigned char datw[0x10] ={0x20,0x00,0x00,0x57,0x12,0x28,0x01,0x07,0x10,0x80,0x80,0x80,0x80
,0x83,0x00,0x00};
unsigned char stset[0x03] ={0x00,0x11,0x00};
i2c_2_write(0, datw ,0xf);
i2c_2_write(0, stset ,2);
// 外部割込み初期化
EICRA = 1;
EIMSK = 1; // INT0割り込み許可
sei();
ISR (INT0_vect){
i2c_2_read( 0 , datw2 ,9);
lcd_position(8,1);
printf("%1d%1d:%1d%1d:%1d%1d"
,(datw2[4] >> 4)& 0x03,(int)(datw2[4]& 0x0f)
,(datw2[3] >> 4)& 0x07,(int)(datw2[3]& 0x0f)
,(datw2[2] >> 4)& 0x07,(int)(datw2[2]& 0x0f)
);
}
0 件のコメント:
コメントを投稿