PIC16F18326
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日