DS3231(AMAZON) 動かして見た。

PIC16F18326
SH1106-1.jpg
          AMZONで売ってるDS3231なるものを動かして見た。
          制御はi2cです。
          にしてもPICでのマジデ参考が少なくて大苦戦。。。
          まぁ確かに、ライブラリー&c言語などチョチョイで動作出来る方のが効率がいいのでワカランでもないんですが。
          でももし他人が作ったライブラリ無い場合は諦めばっかになってしまうような。。。
          まぁさてI2Cの信号確認から全部出来る限りやって。。。まぁオオハマりでした。Orz
          まぁ、興味のある人への参考にどうぞ~(笑)

          ●ハマリ原因1
           ええと、電源繋いで適当に読みだせばなんかでるやろー
                      ↓
           出るけどなんか毎回データーが大きく全体的にぶれる...
                      ↓
           そもそもI2Cアドレスあってるのかよーググッテモ0x68ばっか出てるけど。。。
           dataSheetは0xD0なんだが!
            ここで始めて7bitアドレス理解した。。。Orz
            何となく確かPICとアドレス違うのは知ってたけど...
            単純にpicなどは8Bitであっち系(最近はやり)は7Bitで単純に7Bit系アドレスに2掛ければいいのね。。。
            そもそもアドレスに7だの8だの気にしたのが始めてダッタリ。。。マジ適当。
            でまぁアドレスは0xD0基本でいいみたいです。今モジュールは。

          ●ハマリ原因2
            先頭から数個だけ読みだすがうまく行ってないぽい
                                ↓
            オシロ波形みる。んー全体的に受信SDAが左右にダンスしてる...
            ここでなぜかロジックアナライザもってねーよな。となって
            ググッテあこれで十分と中華製の安いロジックアナライザAmazonでポチっと。
            まぁポチッても直るわけなくハマリ続行ー。
            時間は流れて流れて流れて。。。ググッテモイマイチ他のHP参考のプログラム見ても原因がワカラン。。。c言語ぽいのを見ても。。。ダンス止まらない。。。
                                ↓
            疑惑がI2Cちゃんと動いてんの?コレ

          ●ハマリ原因3
           DS3231の初期化ってそもそもどうやるんだ。。。わからん・・・
           なんか正しい数字を書き込めばstartするって。。。正しい数字ってナンダヨ。Orz
           本当に適当に他の方のwrite情報を見てぶち込むがダンスが止まらない。。。
                                ↓
            AMAZONで頼んだロジックアナライザ来たから試すか~
            んーUSB接続エラー。。。何やってもダメ。。。サケンナ不良品かよ。。。返金してもらって又同じのを違う販売者から。今度は動いた。
            でもまだ直らない。。。
                                ↓
            ダンスを止めなければ!ってときにふと疑問。
            これ読みだし時、アドレス指定無いけど、ま・さ・か全読みだしなんかー???
            ってdatasheet翻訳すると最後まで読んだら前戻るってあったような。。。
            ってことはこのダンスの原因は読みだしアドレスで最初3BYTE読んでstopしたら次読むと続きの4BYTEからか?
            まぁそれならダンスの意味もワカランでもない。。。っと。
            でもPic自体バンク関係無しに使いやすRAMが少ねーし余分に読むのやだなー。
            Datasheetに3個目のアクセスの仕方が。
            でも普通READだからWRITE & READなんて使うか?とは最初謎には思った。
                                ↓
            ヤット他の方がWrite & Readでやってるの見かける。。。マサカ
            正解でした。
            I2C自体まぁ自分はLCDとADCぐらいしか本格的に使ったこと無かったので
            I2cのRestart自体イマイチわからんかったけどもう一回本を持ち出して読んで意味は分った。

            とまぁ解決したんですが、まぁ解決してもこのicのdata配列がまた糞メンドイですよね。
            10の桁と1の桁分れてる。。。
            まぁ実際ハマッタら原因究明に上記の記述が参考になればいいと思います。

            DS3231_TEMP
            DS3231_SEC
            DS3231_MIN
            DS3231_HOU
            DS3231_DAY
            DS3231_DATE
            DS3231_MONTH
            DS3231_YEAR
            DS3231_TEMP_HI
            DS3231_TEMP_LO

            ;*******************************************************************************
            ;DS3231
            ;*******************************************************************************
            _ds3231_read

                CALL	_i2c_start	    ;read start
                MOVLW	0xD0		    ;i2c adress Write
                CALL	_i2c_send
                MOVLW	0x00		    ;ADRESS
                CALL	_i2c_send
                CALL	_i2c_start	    ;Re.start
                MOVLW	0xD1		    ;i2c adress Read
                CALL	_i2c_send

                MOVLW	.0		    ;ACK 0
                CALL	_i2c_receive	    ;Seconds
                MOVF	I2C_TEMP,W
                MOVWF	DS3231_SEC

                MOVLW	.0		    ;ACK 0
                CALL	_i2c_receive	    ;Minutes
                MOVF	I2C_TEMP,W
                MOVWF	DS3231_MIN

                MOVLW	.0		    ;ACK 0
                CALL	_i2c_receive	    ;Hours
                MOVF	I2C_TEMP,W
                MOVWF	DS3231_HOU

                MOVLW	.0		    ;ACK 0
                CALL	_i2c_receive	    ;Day
                MOVF	I2C_TEMP,W
                MOVWF	DS3231_DAY

                MOVLW	.0		    ;ACK 0
                CALL	_i2c_receive	    ;Date
                MOVF	I2C_TEMP,W
                MOVWF	DS3231_DATE

                MOVLW	.0		    ;ACK 0
                CALL	_i2c_receive	    ;Month/Century
                MOVF	I2C_TEMP,W
                MOVWF	DS3231_MONTH

                MOVLW	.1		    ;ACK 0
                CALL	_i2c_receive	    ;year
                MOVF	I2C_TEMP,W
                MOVWF	DS3231_YEAR
                CALL	_i2c_stop

                CALL	_i2c_start	    ;read start
                MOVLW	0xD0		    ;i2c adress Write
                CALL	_i2c_send
                MOVLW	0x11		    ;ADRESS
                CALL	_i2c_send
                CALL	_i2c_start	    ;Re.start
                MOVLW	0xD1		    ;i2c adress Read
                CALL	_i2c_send

                MOVLW	.0		    ;ACK 0
                CALL	_i2c_receive	    ;DS3231_TEMP_HI
                MOVF	I2C_TEMP,W
                MOVWF	DS3231_TEMP_HI

                MOVLW	.1		    ;ACK 0
                CALL	_i2c_receive	    ;DS3231_TEMP_LO
                MOVF	I2C_TEMP,W
                MOVWF	DS3231_TEMP_LO
                CALL	_i2c_stop

                RETURN

            _ds3231_write

                CALL	_i2c_start	    ;read start
                MOVLW	0xD0		    ;i2c adress Write
                CALL	_i2c_send
                MOVLW	0x00		    ;ADRESS
                CALL	_i2c_send

                MOVF	DS3231_SEC,W	    ;Seconds
                CALL	_i2c_send
                MOVF	DS3231_MIN,W	    ;Minutes
                CALL	_i2c_send
                MOVF	DS3231_HOU,W	    ;Hours
                CALL	_i2c_send
                MOVF	DS3231_DAY,W	    ;Day
                CALL	_i2c_send
                MOVF	DS3231_DATE,W	    ;Date
                CALL	_i2c_send
                MOVF	DS3231_MONTH,W	    ;Month/Century
                CALL	_i2c_send
                MOVF	DS3231_YEAR,W	    ;Year
                CALL	_i2c_send

                CALL	_i2c_stop

                MOVLW	0x05		    ;(200ms Delay Recommended)
                CALL	_timer_wait	    ;200mS

                RETURN
        
          とりあえずこれで動きました。
          マジデ アセンブラ 終わりなんかな・・・シンプルで分りやすいんだけどな~
          i2cと_timer_waitは違うページ参照ってことで。
          1.3inch LCDの次いでだったのでそのままLCD使用。
          MSSP二つ使ってます。i2cとspi。
          そもそも、LCD動かしたらCOLOR Lcdやってみたくなって
          でもColorだとData保存領域が欲しくて外付けEEPROMかSDカードかーなったときに
          sdのが運用は楽だななりまして。
          でもSD触るなら時刻とか欲しいなってなって脱線Rtcモジュールです。
          でもSD軽く調べたらSDのが参考情報量多いのでイケルかもとは思いましたが。

         後いろんなHPで書かれてるんですがこの安物モジュールもちろん時間 ず れ ま す!!!
         ちゃんと正確なのが良い場合はちゃんとしたところからそれなりの金額で入手をおすすめします。

         注) 普通にCR2032使う場合は他のHPに書かれてるようにBTのカットとかを調べた方がいいかと。


          2022年09月17日