[][mobile][Homepage][BBS][Blog][YouTube][asablo]

過去の記事の検索が簡単にできるよ (・∀・) 例 ランチャー9
カスタム検索

秋月I2C接続キャラクタLCDモジュールをリカバリーできるファーム公開2012/07/11 23:59:02


秋月I2C LCDをリカバリするファーム公開

以前、秋月I2C接続キャラクタLCDモジュールをシリアル入力タイプに改造では、このLCDモジュールにはPIC16F689が搭載されていて、これを書き換えることで、I2Cのインターフェースをシリアルに変更出来る事を書いた。

電子工作においてLCDは、試作で使いまわされることが良くあるので、目的を達成したら、また買った状態に戻したいと思う事もあるだろう。

搭載PICはライトプロテクトが掛かっているので、同じファームウェアをバックアップ出来ず、PICマイコンを交換して書き込むという面倒な方法しかなかった。

いくら秋月にPIC16F687があるとはいえ、SSOPチップをハンダで交換するのはあまり簡単ではない。そこで、同じ機能に戻せられるプログラム(ファームウェア)を作ってみた。これなら、チップを交換しなくても、そのまま書き込めばOKである。

また、I2Cのデバイスを複数使う時、デバイスのアドレスが重なりあっていて、それが固定アドレスな場合でも、LCDの方のアドレスを変更が可能だ。このアドレス、24C04などのシリアルEEPROMのアドレスと同等の様であるから、変更したいニーズも多いと思われる。



内部回路図はLCD手前までは解析が終わっており、単純にPICのピンが外に出ている格好だ。
ハードウェアは16行2桁であるが、SC2004などの20行4桁など、各種キャラクターLCDに置き換えられるので、ハードウェアの互換が保てるという恩恵に授かることが出来る。



ACM1602NIのデータシートを見ると、フォーマットは意外にも明解。
アドレスは0x50、ライト固定でリード操作がない。続いてのデータはRS信号の制御。贅沢にも1ビットだけしか使用しておらず、bit7の状態がそのままRS信号となる様だ。最後は1バイトのデータで通信が終了。良くあるLCDイニシャライズやタイミング制御は、繋げる側が管理するので、一切不要。I2Cスレーブ動作だけ出来れば良いことになる。


秋月I2C LCDをリカバリするファーム公開

I2Cスレーブ動作は、きむ茶工房ガレージハウスこちらや、nobchaの電子回路日記こちらを参考に、コードを書いていった。そして、動作確認は、arduinoで行い、構想100年のサイトではarduinoの規律に則ったACM1602NIの専用ライブラリーがあるので、それを基準としてデバッグを進めていった。



パソコンにはMPLAB IDEと arduino IDEが起動と、なんとも滑稽なデバッグである。
余談であるが、arduinoは最近バージョンアップして1.0.1になり、日本語メニュー対応になった。
相変わらずシリアルのバグがあるが、対処方法が分かっているから特に問題は無かった。



これが以前にシリアル入力に改造したLCD。PIC16F687が張り替えられている。これに書いていきながらデバッグを行う。



最終的には、製品に手を加えていないACM1602NIに書き込んでテストする。
私が提供するHexファイルはPIC16F687であるため、ROM容量が倍の4KWあるPIC16F689に書き込むときは、一度プログラマでイレース処理が必要である。



追記 Ver.1.10では、ビルドし直さなくても、 ジャンパー処理だけでアドレスを変更できるように対応。通常使用では。アドレスは初期値と同様0x50(0xA0~A1)であるが、RXをGNDに落としながら電源を入れると別のアドレスが設定される。その時のアドレスは0x3D (0x7A~0X7B)になるので、一般的なI2CEEPROMのアドレス0x50を簡単に避ける事が可能となった。



ご注意:ACM1602N1の機能とほぼ同等の機能に回復になるが、全ての機能を検証しているわけではないので悪しからず。書き替えると元に戻せない。完全に購入時の通りに元に戻したい場合はチップを交換して対応。入手が容易なPIC16F687I-SSなどがある。




コメント

_ ききょうや ― 2012/07/13 09:58:29

ききょうやです。これいいですねぇ。元々入っているファームが気に入らないので作ろうと思っていたところだったので重宝します。いっそのこと、悪ノリしてSLinuxのLCDとコード互換にすることも考えていたのですが、いかがでしょう?しかし、このデバイスI2C EEPROMとスレーブアドレスが一緒なのに気がつかずバグりまくった経験があるので、参考までに。スレーブアドレスをPICのEEPROMにカキコしておくのもいいかもしれませんねぇ。ソース付属で公開されているので夢が広がります。ありがとうございました。

_ air_variable ― 2012/07/13 14:17:37

ストロベリーリナックスのフォーマットを見ると、bit6がRS制御になっている事と、bit7がコマンドの連続実行に割り当てられている所を直せば、通信バッファーは2バイト毎の処理ですから、数行変更するだけで行けそうな気がします。
将来的には、アイコン表示対応は外ピンへシフトレジスタを繋げられるようにして出せれば面白いかもしれないです。
http://strawberry-linux.com/pub/i2c_lcd-an001.pdf

I2CのアドレスはPICのEEPROMに書くのは良いアイディアですね。次バージョンで書き換えておきます。
0x50(0xa0)のアドレスが一般的な24C04などのEEPROMのアドレスと被っているということで、確かに被ってます。もう少しユニークな番号にしてもらえると良かったですね。

_ nobcha ― 2012/07/16 11:24:17

こんにちは。ちょっと話がずれちゃいますが、i2c制御LCD関連ということでご勘弁を。
この間デジットさんでサンライク社のSCG002Bと言う2.4Vでも表示が出るというi2c液晶を買い求め、格闘しました。その中で知りえたのは。NXPのPCF2119xというイシがi2c液晶制御ICのデファクトSTDみたいということです。ストリナのイシはそれを若干もじっています。
RSに1バイトささげるとか、連続実行ビットとか、拡張コマンドビットなんかがその流れのようです。
それでこのイシはチャージポンプ方式の電圧発生回路が内蔵されていて、LCD駆動用に供与されているとのこと。
蛇足情報ですが、このあたりの流れを利用するとこの成果が使いまわせるのではないかと思って、乱入、失礼しました。

_ air_variable ― 2012/07/16 16:48:16

nobchaさん、今回は色々と参考にさせて頂きました。
PICの種類によってハードウェアでのI2Cマスター未対応品や、16F877の様な100KHzと400KHzのスルーレート調整するタイプなど、色々なものがあることが分かって勉強になりました。

デジットで扱っているLCDは
http://eleshop.jp/shop/g/gB3A41L/
これですか。なにかストリナの大型I2C LCDに良く似ています。
NXPのデバイスが使われているんですね。NXPはフィリップス時代からI2C策定していましたから、I2C製品がでて納得します。

個人的にはCGRAM増量タイプが出てくれると嬉しいです。

_ じじい ― 2013/09/08 20:31:52

最近になって、この液晶をBeagleBone BlackやRaspberry piとつないで遊んでます。
買ってから、そのままでは使えない事に気がつきもしやと思い、SB1602B/SB1602E互換ファームウェア1.40を書き込んでみましたが、結果は同じで、Linuxコマンドi2cdetect/i2cgetでI2Cバスごと固まってしまいました。

ソースを見させて頂きますと、停止の原因はWriteコマンドを受けた時にACKを返さないが原因と思います。
このチップはSSPBUFが空きだとACKを返さないので、バッファが空のままタイムアウト(=アービトレーションエラー)になっているようです。
main.cの75行目付近に、SSPSTATbit.R_nW == 1 の時にSSPBUFに書込み処理を追加すると固まらなくなります。
--75行目付近
} else { // SSPSTATbit.R_nW == 1
temp = SSPBUF ;
SSPBUF = temp ; dummy Write
SSPIF = 0 ;
SSPCONbits.CKP = 1 ;
}
--
この修正だけでは、マスターからの複数のパターンの読出しには対応しきれていないので、「デバイス内のアドレスを指定したデータの読出し」には対応していないので、その後の液晶表示の動作がおかしくなる事があります。
そこは禁止コマンドって事で。

_ air_variable ― 2013/09/09 00:03:57

じじいさん、ご指摘頂きありがとうございます。
arduinoや簡単なデバッグだけで済ませていましたので、
そのまま放置にしていました。
早速修正したファイルをホームページ上に置きました。
また何かありましたら宜しくお願いします。
http://www.ne.jp/asahi/air/variable/picmel/applications/ACM1602NI/index.html

_ yuki ― 2014/03/06 00:10:22

こんにちは。
様々なLCDをI2Cインターフェース化できるので、とても便利に使わせてもらっています。
ただ、クロックを400kHzにあげると通信できなくなってしまいました。
純正のACM1602NIは100kHzが最大ですが、PIC16F687自体は400kHzは可能なのでできると思っていたのですが、そんな単純な話ではないのでしょうか?
やはり、システムクロックを16MHzや20MHzくらいまで上げないと安定しないのでしょうか?

システム上、出来る限り400kHzで通信したいので、
ご教授よろしくお願いします。

_ air_variable ― 2014/03/09 13:51:25

ご活用いただいて光栄です。
とりあえず動いたバージョンのまま公開しているので、400KHz動作はまだ試していません。
スレーブ動作なので行けそうな感じなのですが、あいにく検証する時間が取れないです。
400KHzにする場合は、プルアップ抵抗を2.2~1KΩと少し小さくするなどにしてみる等して様子をみる手はあります。

OSCCON動作クロックを上げた場合は、lcd.hのLCD_STROBEタイミングを手動で調整する場合があります。恐らく16MHzまでであれば問題はないと思いますが、実験してみては如何でしょう。
宜しくお願いします。

_ ARaHiSi ― 2015/03/10 22:50:43

秋月電子のACM1602NIをRaspberry Piに接続して使うために調べていたらココにたどり着きました。lcd_i2c_SB1602B_16f68x.X(Ver1.50)を公開して頂いて大変助かっています。ただ、こちらで書き込んでテストしたところ直ぐに文字が化けるのが確認できたのでソースコードを修正しながら確認しました。表示の化けるのが解決するようになりました。もし、ご興味があれば変更後のプロジェクトを送ることが可能ですのでご連絡ください。

_ air_variable ― 2015/03/15 23:06:09

ARaHiSi さん、こんにちは。

お役に立てて光栄です。
この代替ファームウェアは、使い方によって動くのと動かないのとがあるのは、分かってはいたのですが、何分時間が取れずそのまま放置していました。

もし、修正部分をご指摘頂けるのであれば、是非宜しくお願い致します。修正して、ホームページ上にアップデートしたいと思います。

メールアドレスは、
air_variable_数字@yahoo.co.jp
です。数字は1215です。

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※投稿には管理者が設定した質問に答える必要があります。

名前:
メールアドレス:
URL:
次の質問に答えてください:
全角で「あ」をタイプしてください。Japanese language only.

コメント:

トラックバック





Google
www Blog HP BBS


air_variableサイトをまとめて検索 
カスタム検索
[][admin][mobile][Homepage][BBS][Blog][YouTube][asablo]