「PIC AVR 工作室」サイトの日記的なブログです。
サイトに挙げなかった他愛ないことを日記的に書き残してます。
PIC AVR 工作室 ブログ



arduinoの情報を纏めたサイトを、PIC AVR工作室
の姉妹サイト(というかサブサイト)として立ち上げました。

http://nekosan0.bake-neko.net/
↑こちら。

まだまだコンテンツが未完成です。唯一見れるページは
http://nekosan0.bake-neko.net/structure.html
↑ここくらい。

それ以外をクリックすると、まだリンク切ればかりです。

これまでにこのブログで書いてきたもろもろの実験結果
などをこのサイトにもう少し纏まった形で整理して
行きたいと思っています。

少しずつ拡充していきますので、長ーーーい目で
見てください。m(..)m



コメント ( 0 )
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする




arduinoとTWI(I2C)で接続する機器を使って
遊んでいます。

丁度ぼのぐらしさんが掲示板に書き込んでいただいた
秋月のPIC-16F877ボードとCCS-Cを
使って、何年か前に作ったプログラムがあったので、
それをarduino用に移植してみようという目論見です。

TWIi/fについてはarduinoのofficial libraryies
にWireライブラリが公開されているので、きっと
簡単に行くだろうと。

ただ、16F877とCCS-Cで秋月製RTCを
弄った時には、ACK(アクノリッジ)の有無の制御
で凄くハマッた記憶があります。
http://akizukidenshi.com/catalog/items2.php?q=%22I-00233%22&s=score&p=1&r=1&page=
これですね。500円。引っ張り出してきました。

TWI(I2C)は、オープンドレイン(オープン
コレクタ)出力でバスに参加し、バスは抵抗で
プルアップして使うんですが、秋月のRTCには
このプルアップ抵抗が内蔵されています。
回路図上の2箇所をハンダで短絡させちゃえば、
外付けの抵抗を使わずにscl、sdaの2本線
だけで繋がります。


手前に2箇所こんもりとハンダが盛ってあるところが
その短絡させるところ。これでプルアップが有効に
なります。


配線も簡単。この写真では黄色と青の2本だけ。
WTI(I2C)はこれがいいところ。


さて、プログラムは以前使ったCCS-C用を流用します。
↓こんな感じ。16F877用です。(不等号は全角に変換済み)
#include <16f877.h>
#fuses HS,NOWDT,NOPROTECT,PUT,BROWNOUT,NOLVP
#use delay(CLOCK = 20000000) //クロック周波数指定
#use fast_io(B)
#use i2c(master, sda=PIN_C4, scl=PIN_C3, address=0xa0)
////// 液晶表示ライブラリ設定
#define mode 0
#define input_x input_B //ポートB使用
#define output_x output_B
#define set_tris_x set_tris_B
#define stb PIN_A0
#define rs PIN_A2
#include <lcd_lib.c>

int RTCDATA[16]; //レジスタテーブル 読み込み先配列

///// メイン関数
void main()
{
long data;
int i;

output_float(PIN_C3); //SCLピン定義(ハイインピーダンス)
output_float(PIN_C4); //SDAピン定義(ハイインピーダンス)

set_tris_a(mode); //モードセット
lcd_init(); //LCD初期化
lcd_clear(); //LCD全消去
lcd_cmd(0x80); //1行目の先頭へ
printf(lcd_data,"RTC init."); //初期メッセージ

delay_ms(1000); //立ち上げ~RTC初期化までの待ち時間

i2c_start();
i2c_write(0xa2); //書き込みモード
i2c_write(0x00); //レジスタアドレス=0をセット

i2c_write(0x00); //コントロールレジスタ1=0x00
i2c_write(0x02); //コントロールレジスタ2=0x02
i2c_write(0x15); //seconds=0x15
i2c_write(0x20); //minutes=0x20
i2c_write(0x12); //hours=0x12
i2c_write(0x25); //days=0x25
i2c_write(0x04); //weekdays=0x04
i2c_write(0x92); //month/century=0x92
i2c_write(0x03); //years=0x03
delay_us(300); //delay 300usec
i2c_stop();
delay_ms(10);

lcd_clear(); //LCD全消去
lcd_cmd(0x80); //1行目の先頭へ
printf(lcd_data,"main loop"); //メインループの処理開始メッセージ
delay_ms(2000); //2秒待ち

lcd_clear(); //LCD全消去

while(1) //永久ループ
{
i2c_start();
i2c_write(0xa2); //書き込みモード
i2c_write(0x00); //レジスタアドレス=0をセット
i2c_start();
i2c_write(0xa3); //読み込みモード

for (i=0; itokoyaさんの日記を眺めていて、スケッチの間違えに
気付き、訂正したら動きました。↓
http://brown.ap.teacup.com/nekosan0/361.html
http://nekosan0.bake-neko.net/connection_rtc.html
ありがたい!



コメント ( 4 )
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする