I2C
I2Cについてはいろいろな見方があるようですが、うまく使えれば2本の信号線で接続できるので何かと便利かと思います。また、周辺チップのI2Cのものがあり、利用しやすいと思います。R8Cm12aには専用回路が無いようですので簡単なシングルマスターしかできないと思いますが、試してみようとしています。できれば、R8Cm12aをスレーブに使えたらとも考えるのですが。
1 温度センサーに挑戦 2015.04.27
2 EEPROM 24LC64 読み書き 2015.05.02
3 SPI RTC(DS3234) 2015.05.04
4 RTC(DS3232) これはI2Cです 2015.05.06
5 I2C用ヘッダファイル 2015.05.07
6 気圧計→失敗→I2Cread-test 2015.05.22
7 気圧計 2015.06.05
8 RTC(DS3231)モジュール(amazon) 2016.01.17
1 温度センサーに挑戦 2015.04.27
最初に、残念ながら1バイト読めただけです。あとは課題に・・・
R8C M12AにはI2Cの専用機能はないのですが、一般のIOを使って機能を持たせることができるようです。MAXIMの温度センサー DS7505 はAVRで使ったことがあるI2Cのデジタル温度センサーです。取り出すデータが簡単ですから使うことにしました。
私は言語も頼りないし、知識も乏しいのでいつもどうりnetの参考を(ほんとはそのものを)求めましたところ、「R8C m12aを使いクロックモジュールRTC-8564NBでI2Cのテスト」という記事が見つかりましたのでそれを変更して実験しました。
センサーのDS7505は
アドレスが 0B1001xyz(7ビット)で、xyzは端子をGNDに落としているので、0B1001000(7bit)となります。
電源電圧が3.7Vまでとなっていますので、5Vで使うことを考えて抵抗で分圧しています。
内部アドレス0x00を読むと最初の8ビットのMSBが温度の±を示し、続く7ビットで摂氏の温度を示します。続いて次の8ビットを読むと1/2、1/4、1/8、1/16 ℃を読むことができます。下位4ビットは0だそうです。
工場出荷時は1/2℃まで読めるようになっているとのことで、それ未満を読むには指示を書き込まねばなりません。
AVRの時は理解していたのですが、とりあえず1バイト読めれば温度の整数値はわかる、ということです。
手前のブレッドボードが実験回路です。
左の矢印は電源スイッチで プッシュOFF になっています。reset端子をIOに変更したものはプログラム時にスイッチがききません。電源offでリセットできます。マイクロスイッチで動きが良いので快適です。
SW off でMODEを切り替えて、SW on で書き込みをスタートさせます。
右の矢印がセンサーです。
チップには専用のクロックがありませんので、IO端子をプログラムでHLに切り替えて作っています。
私が参考にしたプログラムはI2Cデバイスの内部アドレスを指定してそこから1バイトを取り出すRTC用に作られていました。しかし、この温度センサーは内部アドレス0番地の連続した2バイトを読む必要があります。その理由で1バイトだけしか読んでいません。どうしたらよいかとそれが課題です。内部アドレスの1番地はデータの読み出しを変える書き込み番地になっています。
ソースファイルはこれです。 温度表示は Tera Term でPCに送っています。
勉強不足の失敗談::I2Cの1バイト読み出しはかなり順調に進んだのですが、uartで送り出す時に1バイトの文字は出せるのですが、文を送ることができません。strcpy()でHEWは警告もなしにビルドしてくれます。どうしても文字がでません。いろいろ試しているうちに文字リテラルなら送り出すことができました。
これでstrcpy()が怪しいとやっとわかりました。AVRの時はよく見ていたので #include <string.h>と自然に書いていたのですが、R8C M12A では目にしたプログラムが少ないので気がつかなかったのです。
調べてみると、
C:\Program Files\Renesas\Hew\Tools\Renesas\nc30wa\v600r00\inc30\
に、多くのヘッダファイルがありました。
2015.04.30 内部アドレス0番地から連続した2バイトを取り出すことに成功しました。
前述のようにソフトウエアでIOをon,offしてクロックとデータを作っています。I2Cデバイス(スレーブ)は1バイトのデータを送った後、マスターからACK信号(データL)が返ってくると次のバイトが必要だと準備し、NACK(H)が返ってくると「読み取り終了」と判断して送り出しをやめます。
参考にしたプログラムの作者の方はRTC読み書きのために開発されたのですが、そのRTCは内部アドレス1つにつき1バイトのデータしか読み書きしないことになっています。ACK/NACK信号はマスタが出す場合とスレーブが出す場合があって、スレーブが出す場合はマスタは信号を受信することになります。参考プログラムではマスタが受け取る形にすれば(障害がなければ)通信できることになります。実際に。ACK/NACK信号を評価することにはなっていませんでした。
温度センサーを読み取るために、連続して2バイト必要なら、1バイト終了時にマスタはACK(L)を返す必要があります。しかし、前述の理由により受信用のACKしかありませんからACKを発行するとデータバスはプルアップされただけの状態になりますからHとなり、それはNACKを発行したのと同じになります。
そこで、マスタのIOを出力に切り替えてLとする信号を作りました。ack()に対して、ack_out()という関数で実現しました。これで読み出しに成功しました。
このセンサーは第1バイトのMSBがプラス・マイナスを示し、残りの7バイトで温度の整数値を表します。第2バイトは上位(MSB側)4ビットが1/16℃単位の小数以下の温度を表します。下位4ビットは0が入っているようです。ただ、初期設定では第2バイトのMSBだけが有効のようで0.5℃単位でしか計測できません。内部アドレス1番地に0x60を書き込むと4ビットが有効になり0.0625℃単位の温度を読むことができます。
以前、この1番地にあるレジスタはEEPROMだと思っていたのですが、設定後電源を切ると元に戻りますからEEPROMでなくて、単なるレジスタのようです。
現在、手元の実験装置はUART入力のLCDキャラクタディスプレイとブレッドボードが繋がっていますのでRXD端子からLCD側のR8C/M12AのRXDに電線を渡すとLCDに表示されています。もっとも、LCD用のパターンで出しています。Tera Termには余分な文字が出ますが。
この感じではI2C規格の周辺チップが使えつのではないかと思います。
成功したソースファイルです。
2 EEPROM 読み書き
EEPROM M24C64-RDW の巻 2015.06.04
先に実験していた唯一のEEPROMが不注意で壊れてしまって新しい課題に取り組めませんでした。注文の品が届いたので引き続いて調べようとしたところ、どこがどうなったかわからず、残念ながら読み書きが全くできない状態になりました。理由は未だに不明なのですが、下の実験で公開したプログラムも動きません。
悪戦苦闘するうちに、ポートの番号を変えてみるとなぜか動くようになりました。
その後、話題となったのは
1 書き込みに必要な時間(delay)はどれくらいか
2 書き込みの場所、書き込みデータを変えて実験しなければ以前の書き込み結果と区別がつかない
3 内部アドレスがHLの2バイトあるが、2バイトは面倒であるだけでなく、16ビットで与えるのが良い
などでした。
書き込み時間については、delayをループで作っていますが、HEWでビルドしてオシロスコープで時間を測りましたが、細かなことも知りたいので 引数を持った1msの関数を作り、1ms単位で選択できるようにしました。
実験してみると3msでは書き込めず、4msで書き込めました。なお、規格は5msになっています。結果的には急ぐこともないので余裕を見て6msにしています。
書き込みデータをいろいろと変える方法としてはプログラムを変更、ビルドでは手間がかかるので、TeraTermを使って、キーボードからデータとアドレスを指定するのが良いと考えました。
ポインタの扱いや文字列の扱いを知らないので曲がりくどい方法を取りながらなんとかキーボードから指定できるようになりました。
入力データは簡単にするために8文字(8バイト)に限りましたが、アドレスを指定しながら、データの書き込みを続け、後に、アドレスを指定して任意の場所を読み出すことができるようになりました。
これでそれ以前の結果と区別がつかないということはなくなったと思います。
内部アドレスについては、コンピュータは16進2バイトが普通ですが、人間は0〜65536の方がわかりやすいと思います。今回使用のEEPROMは8kBですからおよそ0〜8000で考えられます。
RTCや各種センサーは内部アドレスが1バイトですから、EEPROM専用の読み書きルーチンを作るほうが良いと考えました。
ソースファイルは他のI2Cも考えてその他の関数も残しています。すこし整理しましたので前のものよりも見やすくなっています。
左がTeraTermの画面です。右が今回のeepromです。安い(5個 100円)のは嬉しいのですが、小さすぎて...
端子の間隔 0.65mmは私の手半田の限界です。ルーペでもはっきり見えなくて、感覚でつけています。
EEPROM 24LC64 読み書き 2015.05.02
上記のI2Cドライバが正常に動くなら、同じI2C仕様のEEPROMも扱えるはずだと考えて試してみました。
温度センサーのブレッドボードにDIP8ピンの24LC64を挿してSDA、SCLは温度センサーと並列につないでいます。このEEPROMチップは64kビット=8KBですから内部アドレスはHとLの2バイトになっています。以前のAVRの時は2バイトアドレスの関数を作って、1バイトの時はHを0xFFにしましたが、多くのI2Cは1バイトだろうと考えて、2バイト用を付け加えることにしました。i2cread2()、i2cwrite2()というのがそれです。このチップは8kBですからアドレスは 0x00,0x00 から 0x1f,0xff になります。(H=0〜31、L=0から255)
このチップの動作は、
書き込み時:
スタートコンディション
コントロールバイト(7バイトアドレス+R/W)
内部 Hアドレス
内部 Lアドレス
データ
ストップコンディション
となっています。ストップコンディションを受け取ると内部書き込みサイクルに入るので通信は受け付けなくなります。今回はずぼらなルーチンで約6msのディレーを取っています。
読み取り時:
スタートコンディション
コントロールバイト(W型)
内部 Hアドレス
内部 Lアドレス
スタートコンディション
コントロールバイト(R型)
データ
ストップコンディション
です。連続リードの方法もありますが、今回はテストしませんでした。
今回はぼんやりしていてdelayルーチンをミスしていたので思うように書き込めず少し戸惑いましたが、それ以外は素直に運びました。プログラムは温度センサーのものに付け加えて、なお、温度センサーは while(1){}で書いてありましたから、while(0)にして眠らせています(おおちゃくな・・・)。
プログラムです。
3 SPI RTC(DS3234) 2015.05.04
I2Cではありませんが、項目を立てるほどのことではないのでここに書きます。
RTC DS3234 はMAXIMの製品で、SPI仕様のRTCです。以前AVRでテストしたことがあって図のような形でブレッドボードに実装しやすいように加工しています。
R8C/M12Aには、ハードウエアにはSPI機能はないのですが、I2Cと同じ方法でアクセスする実験をしました。右に見える赤と黒の線はバックアップ用のリチウム電池につながるものです。
回路図は省略しますが上記の温度センサーを外して、かつ、LCD回路と端子の衝突を避けるために次のように接続しています。
DS3234 #CS -- p4_7(4番) R8C/M12
CLK -- p4_6(6番)
DO -- p3_5(9番)
DI -- p3_4(10番)
このRTCチップは、内部アドレス0x00から ss mm hh その他 となっており、内部アドレスは下位7ビットで、MSBは0がread、1がwriteになっています。また、最初にR/Wを含めたアドレスを指定するとそこから連続したデータの読み書きができます。
read 0x00 //アドレス秒を読み取りでアクセスする
read 0xXX //秒を読む
read 0xXX //次のアドレスの分を読む
read 0xXX //次のアドレスの時を読む
という形で時分秒を読み取れます。
書き込むときは最初の read 0x00 をwrite 0x80 にするだけでよろしい。
プログラムでは、連続読み書きの関数 uint8_t xmit1(uint8_t d) を使って、読み取り時は
CS_L;
xmit1(0); // set read
ss=xmit1(0); ss=ss & 0B01111111; // read 00h
mm=xmit1(0); mm=mm & 0B01111111; // read 01h
hh=xmit1(0); hh=hh & 0B00111111; // read 02h
CS_H;
また、書き込み時は
CS_L; // 連続書き込み
xmit1(0x80); // set write mode
xmit1(ss); // write 00h
xmit1(mm); // write 01h
xmit1(hh); // write 02h
CS_H;
としています。
考えがついていかないので長時間の苦労がありましたが、できてしまえばI2Cに比べるとはるかに簡単な処理ではありました。I2Cに比べると端子の数が必要になるので(4本です)R8C/M12には過酷かもしれません。
しかし、簡単な装置には便利だろうと思います。
プログラムソースです。
4 RTC(DS3232) これはI2Cです 2015.05.06
上でテストしたSPI通信のRTCはソフトウエアは簡単なのですが、R8C/M12Aの端子が4個必要ですから多くの物を繋ぎたいときには困ります。それで、機能は同じなのですが通信方法がI2CのRTC DS3232 を調べてみました。
右のような形にしておくとブレッドボードに置くときも、また、ソケットを使って実装基板につけるときも便利なので好んで使っています。そのために下のような2.54mmのストライプをエッチングで作りました。VccとGNDのパターンが裏側で並んでいますので、その間に10μFのチップコンデンサを橋渡しに入れています。
回路は上記のI2C実験と同じものを使っています。I2CはVccとGNDのほかは2本の線でよいのでつなぎ替えるのは簡単です。私の場合は、4本足の左から SCL SDA Vcc GND としていますので、差し替えるだけでI2Cパーツを変えることができます。
ソフトウエアは「温度センサー」で使った「多バイト連続読み取り」を使ったのですが、期待の時刻があらわれず無茶苦茶なデータが出てきました。このRTCチップは内部アドレス0番地がBCDの秒、1番地が分、2番地が時となっています。
連続読み取りをやめて、0番地、1番地・・・と順に1バイトずつ読むと正常な値が返ってきます。そこで、1番地は連続読み込みで行い、2,3番地は1バイトずつの読み込みをすると2番地の値が不正で、1,2番地を連続で読むと単独の3番地が不正になります。連続で読み終えたその次がおかしくなるようです。
よく見ると、連続ですべてを読み取ると、リセットのあと1回だけは正常値が返ってきました。ループで2回目になるとダメです。
読み取りルーチンでは、マスターは1つのデータを受け取るとACK(L)を返し、最後のバイトを受け取るとSTOPの前にNACK(H)を返すことになっています。したがって、スレーブはACKがあると次のバイトデータを用意するのでしょう。ところが、私の元のプログラムでは最後もACKになっているのでスレーブのデータがずれるのではないかと考えました。(これまでのプログラムでは問題にならなかった eepromでは試してないけれど)
私のプログラムにはNACK信号がありません。しかし、スレーブのACKを受け取るための「入力」となる信号があります。データバスはプルアップされているのでマスターのSDAが入力になればバスはHとなってスレーブはNACKと解釈します。そこで、最後のバイトを受け取ったあとはバスがHになる"ACK"に変更しました。もちろん、正常なデータが返ってきました。
ただ、R8C/M12Aをリセットするとどうして次は正常になるのでしょうか・・・疑問です。
本日の教訓、「マスターは読み取りの最後にNACKを返すこと」。
プログラムです。改築・増築でゴミが山のように入っていますが。
5 I2C用ヘッダファイル 2015.06.26更新
i2c ルーチンのヘッダファイルを書き換えました。
私自身はuartを併用することがほとんどなのでuartも一緒にしました。i2cのアドレスを標準の7ビットに戻しました。
RTC(DS3232)の読み書きでは正常に動きました。
i2c_uart.hとi2c_uart.cをまとめたテキストファイルです。エディタで切り分けて使います。
ヘッダファイルテスト用のプログラムです(RTC、温度センサー、eeprom)。
2015.06.26 ヘッダファイルテスト用の改良プログラムです(RTC、温度センサー、eeprom)。RTCの1秒SQWで割り込みINT3をかけて、確実に1秒1回の秒表示をします。
mainプログラムでは次のように書きます。
#include "sfr_r8m12a.h"
#include "i2c_uart.h"
//グローバル変数として d[20]とADを定義する(d[]の数は自由)
//i2c_uart.hでも定義しているので変更は不可
volatile unsigned char d[20]; // 複数バイト読み取りのバッファ d[0]から順に入る
volatile unsigned char AD; // address 7bit
//main()の中で、
AD= 0x65; //RTC i2cデバイスのアドレス(7bit)を書く
// System clock Int 20MHz 20MHzで考えている
prc0=1; //Protect off
hocoe=1;
{inti;for(i=0;i<50;i++){}}
hscksel=1;
scksel=1;
prc0=0; //Protect on
//Set I2C SCLはp4_2、SDAはp3_7につなぐ
pd4_2=1;// SCL OUT
pd3_7=1;// SDA In or OUT
s_SDA; // set SDA
//読み書きは
i2cread_n(0x00,6); //多バイト連続読み出し 内部アドレス0x00 6バイト d[0],d[1],・・
d[0]=i2cread(0); //1バイト読み出し (0)は内部アドレス
i2cwrite(0,ss); //1バイト書き込み 0は内部アドレス、ssはデータ(unsigned char)
//eepromでは内部アドレスがHL2バイトだから16bitで指定する。
//eeprom専用の読み書き関数を使う
write_eeprom(short address,unsigned char dat);
read_eeprom(short address); //戻り値=データ
6 気圧計→失敗→I2Cread-test 2015.05.22
気圧計を作りたくて、秋月に 「MPL115A2使用大気圧センサーモジュールキット(I2C)」を注文しました。
温度センサーやRTCの読み書きに成功している回路とソフトで試みたのですがうまく読めないようです。
内部アドレス0x00から2バイトづつ6項目のデータがあり、順に、気圧データ、補正用温度データ、チップの補正係数a0、b1、b2、c12となっています。
初めの頃は少しデータが読めたのですが、次第にどのデータも読めなくなりました。思い余って指先でかなり強くチップを押さえると何がしかのデータが返ってくるのですがよくわかりません。その旨を秋月に伝えると早速代品を送ってくれました。----- そこまでは良かったのですが。
届いた品もやはりデータが読めませんでした。I2Cには十分な自信がないので、最初の品は返送しましたが、代品は手元に置いて研究を続けることにしました。
実験の方法に差異があるとどこに不具合があるのかわからなくなりますので、一つのブレッドボードに気圧センサー、RTC、温度センサーを並列につなぎ(当たり前ですが)、ソフトでこれらを切り替えて、内部アドレス0x00から連続して12バイトを読み出すプログラムを作りました。
TeraTermのメニューに番号で答えるとI2Cチップを選んで12バイトを10進数で表示するものです。
温度センサーを選ぶと第1バイトに整数値の温度が現れます。RTCでは第1バイトの秒が規則正しく変化する様子がわかります。しかし、気圧センサーは255だけしか返しません。センサーを引き抜いても255は返ります。全く読めていないと思われました。
ひょっとして、センサーがアドレスを認識していないのかも知れないと考えて、スレーブからACKが返ればp1_1ポートのLEDが点灯するようにしました。正常な温度センサー、RTCではLEDが点灯しましたが、気圧センサーは点灯しません。認識していないようです。
前例にならってチップを強く押さえるとLEDが点灯し、255でないデータが返りました。繰り返して押さえて読み取ると、気圧データと温度データは似たような値が返りますが、チップ較正用のデータは
65 47 177 115 190 131 54 52
と常に同じ値を返します(理論的に当たり前です)。このことから、私としては不良品としか考えられません。日にちが経っていますので秋月に連絡はしましたが回答はないかも知れません。同じ不良状態が続いたのは残念です。ずさんな工作でハンダ付けが充分でないのかもしれません。ちなみに、知人が外国に発注したマイコン基板(簡単なものですが)では、1000枚中70枚にハンダ不良があったと聞きました。
最終的には、時刻 気圧 温度 を定時記録するものができたら、と思っています。
今回の回路とプログラムは省略します。
7 気圧計
2015.06.14 気圧計がベニア板の上で完成しました。
RTCにDS3232を使用し、気圧センサーはLPS25Hを使います。
リチウムイオン電池で駆動して移動可能にしています。
液晶に YYMMDD hh:mm:ss で日付と時間を表示します。
気圧は0.1hPa単位で、温度はセ氏で0.1℃単位で表示します。
右の写真では、(20)15年6月14日 14時5分18秒の時点で、1009.0hPa、28.4℃ を示しています。
記録は64kbit(8kB)のeepromに、時間10分ごとに書き込んでいます。レコードは 日(1バイト)、時(1バイト)、分(1バイト)、気圧(2バイト)、温度(2バイト)の合計7バイトです。計算上は1170レコードの記録が可能になります。10分ごとに記録しますから8日間の記録が可能になります。
電源が切れたり、リセットがかかったりするとeepromの記録域が初めに戻ります。0番からに絶えず戻っても100万回の繰り返し可能で良いとは思うのですが、その前の記録に上書きされることが困ります。
そこで、1レコード記録すれば、次のレコードの先頭バイトに0x00を書くことにしました。先頭バイトは「月」ですから記録があれば0x00にはなりません。
プログラムがリセットされた後は、eepromのレコード先頭バイトを読み取り、0x00であればそこから新しい記録を始めるように工夫しました。これで一巡するまでは旧記録が上書きされる心配はありません。
データの読み出しとRTCの時刻合わせのためにセレクトスイッチをつけています。プログラムライターを接続してTeraTermを立て、このスイッチを押すとメニューが現れます。読み出しを選ぶと、月日時分気圧気温がカンマ区切りでTeraTermに送られます。コピーして使用できます。
時刻合わせはYYMMDDhhmmssを入れて終りになります。
ROMは4.6kBほどになりました。2kB ROMならoverです。
電源には、センサーの耐圧が低いので3.3Vで使うことにしました。NJM2845を使っています。電圧差が0.18Vと低いので電池を十分に使えます。これが1Vもあると3.7Vの電池は使えません。
LCDは5V用ですからマイナス電源が必要です。これはタイマーでポートを反転させて矩形波を作り整流しています。
リチウムイオン電池は使いながら充電できると思いますが念のためRTCのバックアップ電池は付けています。
手元に 1608 サイズの4.7k抵抗がありましたのでプルアップはすべて4.7kにしています。
プログラム
2015.06.07 別項に書いたLCD表示ルーチンにRTC他のI2Cルーチンを取り込もうとしましたがどうしてもI2Cが取り込めません。何がじゃましているのか調べてもわかりませんでした。
そこでこの方法を諦めて、I2Cが動くルーチンにLCDを取り込むことを考えました。かなり強引にLCDルーチンをコピーしてテスト表示してみると意外に簡単にLCDが動いてくれました。
ブレッドボードでRTCを動かしたところ成功したので、さらに気圧センサーLPS25Hの読み取りも加えてみました。
結果はOKで、LCD上に 時刻 気圧 温度 を表示することができました。
これで主要なデータの取り扱いはできそうなので、あとは使いやすいプログラム構成を考えることになります。今回は途中のプログラムですから、出来上がってからアップします。
2015.06.05
前回の気圧センサーMPL115A2は2個とも不調で最後は壊してしまいましたが、今回はLPS25Hというセンサーを秋月に注文しました。
値段は同じですがスペックはこちらのほうが良いようです。精度も0〜80℃で±1hPaとなっています。また、複雑な計算もなくて読みだした3バイトをつないだ24ビットのデータを4096で割るとhPa値になるというものです。
おまけに温度センサーもついています。こちらは2バイト=16ビットの値に42.5を足すと摂氏の温度が得られます。ですから、センサーから読み取った値はマイナスになっているようです。気圧のカウントが24ビットですから扱う変数は4バイトの long に下関係で、温度の変数も同じlongを使ったところとんでもない温度になりました。2の補数だそうですが2バイト変数と4バイト変数では形が違うのでしょう。温度の扱いを2バイトの int にすると正常な数値になりました。
他の方のサイトを見ますと気圧も温度も小数以下2桁まで表示しておられるのが多いようです。精度の問題もありますが小数以下1桁はあってもよいと思います。温度は42.5℃をたせ、ということもあり小数点の処理が必要になりますが、今まで小数の計算をしたことがありません。
いつもの横着で、10倍値になるように整数計算をしておいて、表示の時に文字の間に小数点「.」を入れる方法を取りました。
プログラムで、圧力の変数に p,p1,p2 を使ったところコンパイルエラーが出ました。なかなかわからなかったのですが p はokですが、p1 はポートを示す予約語だったのですね。AVRでは考えなかったことでした。
最後は液晶と組み合わせた気圧計にするつもりですが、テストの段階でTeraTermによるPC表示としています。
気圧センサーの精度は今後時間をかけて気象庁の天気図と比べるつもりです。場合よっては修正を考える必要があるかもしれません。
前回のセンサーでは苦労をしましたが、今回はスムーズに運べてホッとしています。 プログラム
2015.10.12追記
リチウムイオン電池の充電を忘れて表示しなくなってしまいました。時計はリチウム一次電池でバックアップしてあるのですが、電源を入れてリセットしても時刻が正しく表示されません。理由はわかりません。
時刻合わせはTeraTermを使うのですが、設定は忘れてしまっています(このごろは忘れるのが上手になりました)。自分のこのページを見て、ライタを使うこと、COM4ポートで、9600bpsであること、が分かりました。
しかし、TeraTermの設定がわからないので色々試してみることになりました。結果的には見つかって目的を達したのですが、やはり書き留めておくべきだと思って次の設定をここに書いておくことにしました。
8 RTC(DS3231)モジュール(amazon) 2016.01.17
amazonに安価なRTCモジュールが出ていると聞き、購入してテストしました。
「DS3231 AT24C32 高精度時計モジュール IIC型 メモリ モジュール [並行輸入品]ノーブランド品」というもので、価格は205円、そして送料込みです。
DS3231はサンプルとしていただいて、使ったことがある素子です。高精度とは2ppmだそうで、これで作った時計は長期間合わせなくても使える、と思ったものでした。1年に1分くらいでしょうか。
少々時間をかけて、はるばる中国から粗末な包装で届きました。想像以上にしっかりした基板で、おまけに電池CR2032もついています。
すぐにでも実験したかったのですが、半年余り遠のいていたので机の上も、PCの中も、頭の中も全く準備ができていません。R8Cを差し込んであるブレッドボードを取り出して、わからない部品を取り除き、LEDを挿して。
まずはLチカで環境を思い出すことにしました。
自分のページを見ていると、「I2C用ヘッダファイル」の記事がそれに近そうなことがわかりました。(以前のことはすっかり忘れている)
回路図は省略しますが、このページの最初の「温度センサーに挑戦」のセンサーの代わりにRTCモジュールを入れてあるだけです。なお、このモジュールは3.3Vですので電源は5Vではなく3.3Vにしています。
I2Cは SCLを1番ピンに、SDA を2番ピンにプルアップ抵抗をつけて接続しています。
手前のブレッドボードです。奥は以前のままです。
I2C用ヘッダファイル」のテストプログラムを使ってみることにしましたが、これはDS3232のものですから、DS3231とデータシートを比べてみました。内部メモリとプログラム、さらにI2Cのアドレスまで同じでした。
試しに書き込んでみるとすんなり動きました。
これで実験は終了、となるのですが、このモジュールにはメモリが乗っています。チップの表面には
「ATHYO632 20432N」とあるのですが検索しても出てきません。amazonの紹介では AT24C32 となっていますのでこれを参考にすることにしました。
I2Cアドレスの下3桁はジャンパー処理になっているので初期状態では開放です。他のアドレスを調べると0x57になることがわかりました。テストに使ったプログラムはeepromも含めておりそのアドレス0x50を0x57に変えれば使えそうです。 結果はすんなりと書き込み読み取りができました。
このRTCチップはデジキーで800円以上するようです。おまけにeepromまで付いてこの値段です。実験する者にとっては嬉しいのですが、到着まではのんびり待つ必要があります。
---なかなか感覚が戻らなくて....
(2016.01.25追記) このモジュールにはI2C用のプルアップ抵抗(4.7kΩ)が付いているようです。ブレッドボードに入れていたプルアップ抵抗を外しても正常に動作しました。
1 温度センサーに挑戦 2015.04.27
工事中