- 2022年12月19日
以前に組んだブレッドボードの物(SPIのLCDは無い)が有るだけで、
デバッグ用の3つのLEDの点滅はするプログラム(旧1)は出来ている所まで。
(プログラムは書き込めると言う段階)
次は、SPIのLCDを入れた回路図を描く事にしたい。電源(電池)とかの周辺も入れたい。上手くすれば基板を頼めるかも?
$1だったら、手間かけてブレッドボードで組み立てるより確実の様な気がする。(ちょっと送料が高い)
他に4809とか1608とかの実験基板も頼めば相対的に送料も安く感じる
取りあえず回路図(旧1)は書いた。GPS用のコネクタも追加した。
色々な試験、実験の為には、他に、基板型のGPS、赤外線受光器、赤外線LED、RTC等も付けておきたい。
当然、ユニバーサル部分も欲しい。
CPU部分を変更するだけで、周りの物は同様で基板を作ってみたい。1608、4809とか
今後は、1608(3208)や4809に移行していくだろう。
その時を考えるとDIL型の有る4809を充実させた実験基板を作っておけば、実際の基板を頼む前に実験が出ると思う。
- 2022年12月21日
周りに色々付けた時、電源の電圧、やり取り信号の系統違いをうまく吸収する必要が出てくる。
電源は3V系(3.0、3.3、3.8)と5V系が有る。
信号は3V系(3.0V、3.3V)と5V系(主に電源電圧に依存する物)が有る。
3V系電源は、3.3Vにすれば間に合うのだが、基板型GPSの3.8Vが問題になる。
信号は3V系-5V系の変換ICを使えば問題ないはず。
GPSは電源は5Vでも良いのだが、信号は3.3Vになる。
SPIのLCDは電源が3.3Vで信号も3.3Vになる。
RTCは電源は5V必要で、信号も5Vになる。
この様な状態なので、電源は5Vにして、SPIのLCDは特別に3Vを作るのが良いだろう。
単41本から5Vを作ろうと思ったが、3Vから作って、その3Vは直接SPIのLCDに入れれば良いだろう。
信号の変換ICが使う必要が有るだろう。簡単にするには、3Vから5VはHCT系のロジックICを使い、
5Vから3Vは抵抗+ダイオード(ツェナー?)と言うのも有りかもしれない。
電池の3VをSPIのLCDの電源にするのはどうもすっきりしない。
ケチケチ作るのなら有りかもしれないが、これは、実験用なのであまりおかしな回路にして、動作が安定しないと
何を実験しているのかわからなくなる。なので、5Vから3端子レギュレータで3.3Vを作る事にする。
部品の選定だが、基本的にスルーホール部品を使う事にする。但し、RTCはSMDしかないのでしようがない。
RTC用のバックアップ電池もRTCの裏側(表側?)に付けると配線が楽なのでSMDにする。
回路図(旧2)は書いたが、99x99に入るかはまだわからない。
- 2022年12月22日
基板図を描き始めたが、入る事は入ると思う。後はユニバーサル部分がどの位になるかと言う事になる。
5Vから3Vの変換を抵抗とダイオードにしたが、変換ICの方が良いかもしれない。
適当に部品を配置して、自動で配線をしたら基板図(旧1)が出来た。
細かい手直しは必要だが目処はついた。5Vから3Vの変換を抵抗とダイオードにした。
- 2022年12月23日
回路図(旧3)と
基板図(旧2)を仕上げた。
ガーバーファイル(旧1)も出来た
- 2022年12月27日
基板のGPSの番号を思い違いをしていた。各ピンの名称も追加した。
回路図(旧4)と
基板図(旧3)を修正し、
ガーバーファイル(旧2)も変更した。
- 2023年1月19日
RTCで使っている「DS3234」が秋月で手に入らなくなっている。
他の所(RS、DigKey等)も在庫なしで注文できなくなっている。
発振子内蔵で他の物は エプソンの物、STマイクロ「M41T62LC6F」、Micro Crysta「RV-2123等10ピンSMD」の物が有るみたい。
殆どの物が精度的に同程度で無いか、同程度の物は1000円以上する様だ。また、ほとんどの物がI2Cのインターフェイスで
SPIの物は2、3個しかない。
この辺りの実験が出来る様に、これらのICのパターンも追加したい。
秋月にもNXPの「PCF2129AT/2」が660円で有った。DS3234と同じ様なSOP20ピンだが、各ピンの信号は違うので
パターンの互換は無い様だが、性能的には互換性が有りそう。精度的な事、インターフェイス等、パターンは変えなければならないが、
ソフト的にはほとんど同じで行くような気がする。
但し、電源が3.3Vで、最大でも4.2Vまでなので、5Vで使えない。
インターフェイスは「The I 2C-bus and SPI-bus interfaces of PCF2129 are 5 V 5 V tolerant」で、
INTのプルアップも5.5VまでOKなので、電源だけ3.3Vを用意すれば何とかなりそう。
もしかしたらSDOのHレベルが足りないかもしれないのでその時は変換が必要になる(規格上平均値、代表値)が書いていない。
CPUを3.3Vで動かすと言う選択も有るが、LEDをダイナミックで駆動する時は5Vが欲しい。
RTC用に3.3Vを作って、SDOはレベル変換するのが順当な使い方の様な気がする。
これも実験が出来る様にしておきたい。
- 2023年3月7日
直ぐに基板を作る事は無いので、取りあえず現状を進める事にした。
以前にSSD1306を使ってOLEDの表示をした時のファイルを持ってきた。
これは、インターフェイスがSPIなので単純にはいかないとは思う。
でも、うまくすればSPIの所だけをIICにすれば動くかもしれない。
何か正常な文字でなくても、何か表示できるのではないか、と思っている。
現状は ビルドが出来たが、実際の表示ルーチンを呼んでいないので、何もわからない。
- 2023年3月11日
SSD1306の表示する所を SPI~TWI(IIC)に変更した。ビルドは通った。
今日はここまで
- 2023年3月12日
CPUに書いたが、標示はしなかった。
一瞬、間をおいて、終わりのLED表示が始まった。
途中でエラーが出て、そのまま進んだような感じ。
最後にはオシロスコープで見る事になる。
OLEDのアドレスが間違っていた。余分な右シフトをしていた。
参考にした物の関数が内部で左シフトをしていたのだろう。
説明書に書いて有る通りの78Hで良かった。
でも、文字は表示しない。何やら砂嵐みたいな物が表示される。
電源を切らずに、リセットボタンから入るとちょっとの間外面が消えて、
また、砂嵐が表示される。
と言う事は初期化のコマンド良いみたい。但し、全クリアはダメみたい。
砂嵐の中で解りにくいが、標示したい文字が有った。位置もなんとなく正しいみたい。
インターネットで書いて有るのを思い出して、表示クリアを1行ごとに分けてやる様にしたら
表示の全クリアが出来た。
1文字表示(8行21文字)は出来た。文字列表示も出来た。
1文字反転表示が出来た。文字列反転表示も出来た。
実装が倒立(4Pコネクタが下)の時の表示も出来た。
※動画上のちらつきは、目視ではわかりません。
プログラム(旧2)は#defineで正立と倒立を切り替え可能
この後は、エラー処理が必要になるだろうが、取りあえずこれで使っていく事にする。
2倍の大きさの文字(4行10桁)、3倍の大きさの文字(2行7桁)、4倍の大きさの文字(2行5桁)、の表示も欲しい。
それ用のフォントをそろえずに、今の5x7(6x8)を縦横2倍、3倍、4倍にすれば良いと思う。
以前LCDでその様にやった時の見栄えとしては、見られるレベルだと思う。元々が小さいのでそれ程あらが目立たない。
- 2023年3月14日
2倍、3倍、は「pr_ake6_glcd」の「glcd.c」を参考に作れば良いだろう。
2倍、3倍は有るが、4倍は作っていないので、止める。ビルドは出来た。
- 2023年3月15日
プログラム(旧3)をCPUに書き込んで表示をチェックした。
これで使う事にする。位置決めがもう少し細かく欲しくなるような気がするが、その時は改めて考える事にする。
やはり、2倍、3倍の時の位置決めが荒すぎる感じなので、位置指定に関しては1ドット単位(縦0~63、横0~127)でして出来る様にしたい。
但し、Y方向に関しては8ドット単位に丸める。つまり、「X=26、Y=12」の指定でも実際に表示する「X=26、Y=8」になる。
そこで、問題になるのが、文字の途中でYが63、Xが127を超える時の処理で、出来る所までは表示したい。
文字が途中で切れるが、それでも何も表示しないよりは良いと思う。
-->1ドット単位の指定が出来る様に修正をしたが、これの延長上で4倍の物も出来そうなので、作る事にする。
- 2023年3月16日
4倍も有る1ドット単位で位置指定出来るプログラムを作った。
表示の確認も行った。
- 2023年3月17日
TWIの速度を400kHzにしてみた。確かに表示がキビキビした感じになる。
その時に、SDAのプルアップ(10kΩ)を外しても普通にしていれば問題なく表示は出来ているが、
SDA、SCL、VCC、GNDなどの端子に手で触れていると止まってしまう事が有る。
速度が100kHzの時は同じ状況で触ってみても止まる事は無かった。
やはり、プルアップ抵抗は入れる必要が有るだろう。
そして、見た目よりも安定性を考えるならば、100kHzの動作にする方が良い。
- 2023年5月4日
RTCのIC動作チェックの為ちょっと大きいブレッドボードに回路を移した。
まだ、RTC(RX8900)は付けていない。
- 2023年5月13日
RX8900(DIL変換済)を接続した。
今までのOLEDの表示だけのプログラムは同じ様に動作しているので、今の所は 悪さはしていないみたい。
プロジェクトを、元のOLED表示をコピーして作った。
これにRTC(RX8900)の部分と「明け六つLCD時計」の時計表示、設定部分を結合すれば、
何となくできそうな気がする。
RTCは以前に作成した「mega328を使った水温計」に「RX-8025SA」を使っていて、
レジスタ並びなどは似通っているので参考に出来るだろう。
- 2023年5月15日
RX8900についてはRX8025とちょっと違っているみたい。(内部のレジスタアドレス指定の値)
基本的には大きな違いは無いようなので、ちょっと修正すれば使えそう。
OLEDの時計表示は、グローバルの年月日時分秒データを表示するのは出来た。前回と違った時だけ表示する。
設定に関しては、IN17の6桁時計の所を使って、書き込む所をRX8900の物を使えば何とかなりそう。
メインプログラムは1284の8x8ドット時計を削って、すこし書き直せば行けそう。
スイッチ入力やタイマー割込みも1284の物を流用して、すこしの書き直しで済ませたい。
今後RTCを使うかはもう少しよく考えたいが、今は読み書きが出来る様にすることに専念する。
DS3234と同じレベルにしたい。
その後に 価格、使い勝手(大きさ、取扱方、等)、精度、入手状況、等を考慮して、主に使うICを決めたい。
最終的に決める前には、他のICの実験してみる必要も有るだろう。
但し、今の状況を見るとI2C(TWI)インターフェイスの物で、1秒割込みが掛けられる物になるだろう。
今の所この 秋月のRX8900CE-UAが一番コストパーフォーマンスは良い。
- 2023年5月16日
RX8025のC言語ファイルをRX8900に変更を始めた。まだコントロールレジスタの中身までは良く見ていないが、
エラーが無くコンパイルは通った。
- 2023年5月17日
RTC(RX8900)の初期化と読み出しを入れてみた。エラーにはならないで動いている。
しかし、時計が進まない。正確に言えば初期化後、
1回目までは動いているみたい(1回目までのディレーを長くすると読み出す秒数が大きくなる)
2回目以降は同じデータを読み出す。
RX8025のままではダメな所が有るのだろう。良くデータシートを読む必要が有る。
今日の所はここまで
- 2023年5月18日
昨日の変更で(RTSの広域データ名の変更)、変更忘れの箇所があり、
時計データの表示に1回しか行かない様な動作になっていた。
その部分を修正し、RTC読み出しと表示の間隔を短くしたら、1秒毎の表示が出来た。
各データの繰上りも確認できたので、RX8900も動いていて、TWIの読み書きの出来ている事の確認が出来た。
リセットスイッチでの再起動時(バッテリーバックアップと同じ状態)も 時計は00秒から始まってしまう。
初期化に何か問題がある様な気がする。
初期化の所をよく見たら、コントロールレジスタの読み書きで、内部のアドレス指定、ビット指定が違っている様だ。
これを直せば、うまく行くような気がする
初期化関数をRX8900に合わせて書き換えた。
INT0の端子(4ピン)を10kΩでプルアップした。
INT0割込みが入らない。なぜ?-->INT0は動いている。INT0(4ピン)をGNDにつなげればRTCの読み込みに行く。
RX8900の/INT端子から出ていないと言う事になる。なぜかわからないが出ていない様だ。
取りあえず /INT端子の出力は止め(UIEを止めた)、FOUTの信号を1Hzにして、これをINT0に入れる事にする。
これならば、1秒周期でRTCのデータを見に行っているので、1秒毎に時計が進んでいく。
- 2023年5月19日
/INT端子に出力が出ない件は、単純に設定を間違えていて、1分毎に出る設定になっていた。
今の所は、両方とも出る様にしているが、FOUTをINT0に入れている。不都合が有ったらその時考える。
スイッチを2つ追加して、設定動作も追加した。ビルドは出来たが、まだ書き込んでいない。
- 2023年5月20日
CPUに書き込んだが、スイッチに反応は無い。
青LEDが点滅しているので タイマー割込みは生きている。
スイッチ初期化関数を忘れていた。
その他細かい所で書き間違いなどが有ったが、基本的には設定動作を含め、時計としての機能は動いている。
RX8900の温度も表示し、
タイトルも表示する。
このプログラム(旧1)で時計としての体裁と動作は出来たと思う。
- 2023年5月21日
RX8900のバッテリーバックアップも確認した。
単三電池2本+100Ω+ショットキーダイオードをBAT端子に接続して、
現在時刻に合わした後、電源OFF。2時間以上経過して再度電源ONし、現在時刻が狂っていない事を確認した。
1秒割込みは/INT端子から信号にした。
バッテリーバックアップで4時間ぐらい電源OFFしていると、時刻が戻ってしまう。
なぜ?電池の電圧は3V有る。ノイズが入るか?確かに推奨回路に有るコンデンサは入れていないが、
それで2時間は良くて4時間がダメになるだろうか?
電源を切った時OLEDの表示が2秒ぐらい残るが、それはバッテリからの電流で表示していると思う。
その時にバッテリからの直列抵抗でBAT端子に掛かる電圧が下がってしまう事は無いのか?
もしも それが原因ならRX8900の電源(VDD)も5Vからダイオードを通して接続する必要が有るだろう。
その場合はVDDと/BAT端子の所にコンデンサは必要だろう。
なので、0.1uFを/BAT端子に追加した。現在時刻に合わせて、電源をOFFする。
- 2023年5月22日
今朝、再度電源をONして確認したら、時刻は正確で問題は無い。6~7時間はOK。
また、OFFして夜まで放置する事にした。
夜に、電源ONした。時計は狂っていなかった。12時間以上の放置なので、このコンデンサの追加で良しとする。
電池の替りに100uFのコンデンサを付けると、
消費電流を1.5uAとして約200秒(3分と20秒)はRTCの動作が保持できる。
10uFを付ければ20秒保持できる。今は0.1uFなので0.2秒ぐらいだが、10uFにすれば
電池交換の時ぐらいは保持できそう。
計算式は「t = {C × (V0 - V1)} / I」
t:放電時間 (sec.)、C:コンデンサ容量 (F)、V0:充電電圧 (V)、V1:放電後電圧 (V)、I:放電電流 (A)
1.5Fを使うと約830時間(約34日)になる。リチウム電池より良いかもしれない。
今のプログラムでは、電源ONの時にVLFだけ見ているが、
VLFが立っていなくてもVDETが立つ事が有るのでを、
それも見て1の時は0を書き込んで、温度補償を再開する必要が有る。
リチウム電池ならば、中途半端な電圧はまず出ないので、見なくても良いかと思うが、
コンデンサやマンガン電池等の時だらだら電圧が下がるので、VDETも見る必要が有るだろう。
VDETを見るプログラム(旧2)に変更して書き込んだ。
- 2023年5月23日
ライブラリにRX8900を追加して、回路図(旧5)にRX8900を追加した。
基板図はまだ出来ていない。
- 2023年5月24日
RX8900を追加した基板図(旧4)も出来た。
この基板を作る必要が有るか?
ブレッドボードでは本来の性能が出ない、SMDしかない、
そのような物の動作チェックが出来る物の方が必要なのではないか?
- 2023年5月25日
ガーバーファイル(旧1)を作った。
部品表(旧1)も作った。
- 2024年2月6日
基板は作らなかったが、OLEDとRX8900の動作が確認できて、
他の物(8x48ドットLED フォトボックス)にここのプログラムが流用出来たので、
ここは、アップロードしていないが、一旦これで完了とする。
- 2024年2月7日
終わりにするつもりだったが、mega1608の物がまだ動いていないので、
周辺の物が同じこの基板で動かしてから、1608に移植する手も有ると思いなおした。
まだ、未完とする
なので、回路図、基板図の細かい修正、見直しをする必要が有る。
今思いつく物は以下の通り
- RTCにRX8900を追加したい
- DS3234は削除したい。
- プルアップ抵抗付で押しボタンスイッチを2つぐらい追加たい。
- リセット用の押しボタンスイッチを上から押すものに変更したい。
- RX8900のFOUTにLEDを追加したい。
- 裏側にあるバックアップ用電池を表側に移したい。
mega1608で同じような物が有るので
タイトルを「mega328のOLED等のテスト」に変更した。
このhtmlファイルの名称は「munufact_328_oled_iic」に変更した。
このフォルダ名も「mega328_oled_iic_test」に変更した。
- 2024年2月9日
単純に今のままではmega1608とほとんど同じなので面白くない。
周辺に付く物を、別ブロックにしたい。RTC、GLCD、位かな。
他の物は元々別ブロック(別基板)になっている。
この二つを別基板に出来る様にして、アングルのシングルラインのコネクタを介して、立てて繋げる様にしたい
GLCD(AQM1248)はコンデンサなども含める事にして、電源2本とインターフェースの4本とリセット1本で計7本なので
7ピンのアングルシングルラインのヘッダーを付ける。
RTC(RX8900)はテスト端子(T1とT2)以外の8本なので、8ピンのアングルシングルラインのヘッダーを付ける。
- 2024年2月19日
IICの4ビットのI/Oエキスパンダーを追加して、スイッチ入力とLED点灯の動作を追加したい。
これもブロック化して、秋月のOLEDと同じ様な4Pコネクタで接続したい。
- 2024年2月22日
IICの4ビットのI/Oエキスパンダー「PCA9536D」を追加して、スイッチ入力とLEDも追加した。
回路図は GLCDとRTCとI/Oエキスパンダーをブロック化して、切り離した時には4Pコネクタで接続出来る様にした。
- 2024年2月27日
ブロック化した回路図、基板図が大体出来たが、部品番号、部品名が基板内に収まらない。
もう少し時間が掛かりそう。
まだ、コネクタを角ピンに戻していない。
コネクタに1ピン、8ピン等の表示がライブラリの中に書いて有るが、
他の部品と重なる事も有るので、ピン番号を無くしたライブラリを作りたい。
- 2024年2月28日
コネクタを角ピンに戻した。
ピン番号を無くしたライブラリを作った。
回路図(旧6)と基板図(旧5)は出来た。
ガーバーファイル(旧2)も作った。
部品表も作った。
- 2024年3月10日
今日明日という訳では無いが、以下の物を購入して実験をしたい。
マルツ(Digi key)でI/Oエキスパンダー「PCA9536D.118」350円
RSでI/Oエキスパンダー「PCA9536D.118」5個パックで1181円
- I/Oエキスパンダー「PCA9536D.118」2個(マルツで)
- 2024年3月17日
回路図は、 赤外線受光部、赤外線発光部、電源回路、の3回路をブロック化した。
- 3月20日
I/Oエキスパンダー等をマルツ(Digi key)に、注文した。
- 3月22日
秋月のGPS(GNSS)受信機の基板型の物が販売終了になっている。
RSにもGPSが有る。2231円で在庫が5個で、再入荷も無いみたい。
表面実装なので基板かする必要が有る。バッテリバックアップはどうするか?
他の所にも有るが、ほとんどがアンテナが別付の物になる。一体型の物がすこしは有るが、高い。6000円とか10000円以上とかになる。
RSのが今の所一番安い。
そうなると、秋月のケーブルでつなぐ、シリアル通信の物が現実的の様な気がする。
なお、今は以前に購入した手持ちの物(GT-902PMGG)とは型名が違っている。
- 2024年3月23日
ブロック化した物を描いた。ユニバーサル部分は無くなった。
回路図と基板図は出来た。
ガーバーファイル(旧1)も作った。
部品表はまだ出来ていない。
- 2024年3月23日
RSでは、他にもアンテナ付きの物が有るが、手はんだは非常に難しい形状になる。
ICの上にアンテナを載せた形で、基板とアンテナの隙間が2.3mmで、ICの端子は端面に半田付けする感じで1mm奥になる。
端子のピッチは2.54mmなので、やってできない事は無いかもしれないが、難しいと思う。
- 2024年7月23日
OLEDが基板からはみ出ているが、そのはみ出た部分の取付穴が、ガーバーファイルに反映されてしまい、
Elecrowに注文する時に100x100に収まらない。その為、価格が3倍以上になってしまう。
OLEDのライブラリを追加して、2つの取付穴の物を作り、それを使う回路にし、
ガーバーファイルを作り直した。
- 2024年7月24日
ElecrowにPCBを注文した。
午後には「in-production」になった
- 2024年7月29日
Elecrowから発送したとメールが来た。
配送状況を調べたら、既に、佐川急便で配達中になっている。
速すぎる(メールが遅い?)
夕方には荷物が配達された。
(いつもの宅配便みたいな伝票は貼っていなかった)
基板(表、裏)
- 2024年8月7日
在庫部品を調べ、足りない物を、「秋月」、「マルツ」、「ヒロスギネット」に注文した。
「廣杉計器」は個人で注文できなくなったので、「ヒロスギネット」になったが、比べると結構高い。
- 2024年9月10日
部品を取り付け始めた。
-
「EXT.I/O SECTION」のS6と 隣の3Pジャンパーが干渉する。
多分、S6の取り付け位置が、ほんのちょっとズレた為だと思う。
ジャンパーのベースと少し削り、取り付けた。
-
「RTC SECTION」のJP6の半田付け部分とCR1220の電池ホルダーが干渉する。
電池ホルダーを少し削り、JP6の半田の盛り上がりを少なくした。
部品を全て取り付けた。
基板(表、裏)
- 2024年9月16日
電源を入れたら、白LEDが点灯したので、電源系統は大丈夫だろう。
6Pの書き込みコネクタにISPを接続て、シグネチャーが読めたので、
あとは、プログラムを書いて確認する事になる。
- 2024年10月7日
VDETを見るプログラム(旧3)を書き込んだら、
OLEDに時計表示が出来た。しかし、秒表示が進まない。と言うか 表示が最初だけで更新されない。
リセットスイッチで再起動すると、時計は進んでいるみたい。
1秒の割込みでフラグを立て、メイン側でそれを見て処理をする所に来ていない。
強制的に約1秒でこのフラグを立てると、動作としては良くなる。なので、割込みの処理をしていない事になる。
ソフト的な設定が悪いのか、ハード的に悪いのか?
このソフトはブレッドボードで動いていたはずなので、ハードの可能性が高い。
-->割込み端子のプルアップが無かった。
今回の基板ではハードのプルアップ抵抗が無いので
CPU内部のプルアップを有効にする必要が有った。
多分、ブレッドボードではハード的に抵抗を入れていたのだろう。
CPU内部でプルアップしたプログラム(旧4)で、
RTCとOLEDの動作は確認できた。
- 2024年10月8日
外部I/Oの出力(LED)と入力(スイッチ)の確認ができた。
RTCのバッテリバックアップも確認できた。
グラフィックLCD128x48ドットの表示も確認できた。
- 2024年10月9日
グラフィックLCD128x48ドットの表示が、OLEDと上下が逆だったので合わせた。
- 2024年10月10日
リモート用赤外線LED駆動にタイマー0を使う予定だったが、信号の出力ピンをOC0Aにしている。
これだと、タイマー0の高速PWM出力で38kHzの周期を出せないので、OC0Bにする必要が有る。
しかし、高速PWM動作の場合は38kHzを出せないが、
位相基準PWMでトグル動作ならば、OC0Aに38kHzを出せる。
なので、位相基準PWMでトグル動作の設定を行う事にする。
出力のON/OFFはソフトで時間を測って(タイマー1を使うかも?)、
TCCR0AレジスタのCOM0A1ビットとCOM0A0ビットを操作して行う。
COM0A1ビット=0、COM0A0ビット=0でOFF
COM0A1ビット=0、COM0A0ビット=1でON
TCCR0BレジスタのWGM02ビット=1、
TCCR0AレジスタのWGM01ビット=0、WGM00ビット=1に設定して
位相基準PWMにする。
38kHzを出す為にはその周期の半分の時間(13.16uS)になる値をOCR0Aに書く。
プロスケーラを1/1にして
(TCCR0BレジスタのCS02ビット=0、CS01ビット=0、CS00=1)、
OCR0Aの値を105とする
- 2024年10月11日
タイマー0の位相基準PWMで38kHzは出せた。16x16ドット2色LED時計で
赤外線が入ったと認識できた。SELECTスイッチを押したコードと 短く押して離した時はコードは
出力したら、「8x48ドットLEDフォトボックス」で認識できた。
38kHzのLEDは電流が多いみたいで、ISPを接続していると電圧が落ちてしまい、リセットが掛かってしまう。
ISPを外せば大丈夫。
- 2024年10月12日
ニキシーリモコンの動作が安定しない。
「8x48ドットLEDフォトボックス」で受け付ける時も有れば、受け付けない時もある。
SETスイッチの物は、全然受け付けない。(これはソフト?)
ハード的には、大丈夫だと思うのだが、心配なのは動作クロックがCPU内部の発振なので精度は良くない。
外部の水晶発振子にした方が良い。
-->外部クリスタルにヒューズをへんこうしたら、かえって受け付けなくなった。
なぜか、元の内部発振に戻しても受け付けなくなった。
と言うか、内部でも、外部でも不安定
精度の面から考えて外部クリスタルにする
何にしろ、動作が安定しない。 オシロで信号を見ないとダメだろう
- 2024年10月13日
オシロで見た所、38kHzが出ていない。約21kHzになっている。
タイマー0の設定をどこかで間違っているみたい。
これが本当だったら、この信号を受けた動作する方がおかしい。
タイマー0のOCR0Aを47(今までは95)に変更する
-->周波数が約42kHzになった。ちょっとズレた値だが、
順調に受信してくれる。
微調が必要かもしれないが、今はこのままで良しとする
なぜ今までの値が95なのかわからない。10月10日の計算では105になっている。
なので、52にしてみると 38.79kHzで、
53にしてみると 37.59kHzになった。
ピッタリには出来ないので 近い値のなる 53にした。
- 2024年10月15日
ソフトの構成を考え直す。
- LEDの点滅の後、スイッチが2つとも押されていたら、各動作モードの選択をする。
- スイッチが押されていない時は、
保存してあるモード(EEPROMの値)で 動作を開始する
- 動作モードとしては、
- 時計動作
- ニキシー管用リモコン動作
- NECシーリングライト用リモコン動作
- GPSデータ表示動作(ジャンパー切り替え必要)
とし、SELECTスイッチとSETスイッチで指定し、動作を開始する
その時EEPROMのこのモードを保存する
- 各動作中の表示はOLEDとGLCDに同じ様に表示する
GLCDは表示行数は少ないが 表示RAMには書き込み、
それで表示出来ない項目は諦める
- 2024年10月20日
リモコンモードの受信データの表示に、スクロールが必要になるので、
表示器へのコマンドである程度対処しようとしたが、OLEDとGLCDでは
表示器のICが違うので、違うコマンドで対処する事にした。
OLEDはSSD1306だが、GLCDはSSD1306の互換では無い様だ。コマンドの種類が少ない。
- 2024年10月26日
電源ON時のスイッチ押しでのモ-ド選択は出来た。
リモコンモードの動作は送受信共に出来た。
GPSモードは受信のみだが、GPSのモジュールが見つからない。どこに仕舞ったかわからない。
仕方がないので、BPSを600にして、リモコンモードの送信を転用して、それらしいデータを出す事にして
表示のチェックは出来た。但し、本物データでない事と、通信速度が違うので本物を繋いだ時にどうなるか不安が残る。
後は、赤外NECモードがまだ出来ていない。
- 2024年10月27日
今までの赤外NECモードの送受信共に割込みを使っていない。
なので、自分で出したデータの表示は出来なかった。
PD0(RXD)信号の立ち上がり、下がりで割込みが掛けられれば、受信は割込み(PCINT16)を使い、
送信は割込みを使わない方法にすれば、自分で出したデータも受信出来そう。
GPSモードの受信では、標準で1秒間隔で送ってくるデータが1行で70バイト位で、それが11行有る。
つまり1秒毎に770バイト送って来ると言う事になる。
受信バッファは処理しきれないし、表示も1画面に入らない。$GPRMCに限って受信する必要がある。
受信バッファも今のままでは足りないので128にする必要が有る。
- 2024年10月29日
外付けGPSモジュールが見つかったので、接続してみた。
やはり、データを取りっぱぐれているみたい。受信が悪いのか、表示が悪いのか。
それと、コマンドが$GPでなく、$GNで来ている。
思い出したのだが、以前もコマンド違いでデータが取れない事が有った。
基本は$GPだが、$GA,$GB,$GL、$GN、$$GQもバージョンによって来る事が有る。
受信バッファは処理しきれないし、表示も1画面に入らない。$GPRMCに限って受信する事とする。
- 2024年11月04日
赤外NECモードの受信を割込みを使った物に買い替えた。
受信動作をさせてみると、タイマーオーバーフロー割込みが入ってしまう。
オシロで見ると、立ち上がりと立下りの両方で処理に飛んでいるのは分かった。
オーバーフローはリ-ダー部の信号無し(H)の所でオーバーフローになっているみたい。
リーダー部信号の時間は有りが約10mSで無しが約5msになっているので、
これでオーバーフローになるのがわからない。
オシロで見る時に、オシロの具合が悪く(輝度調整がうまく行かない)、波形を見るのに苦労した。
購入時から約14年経過しているので、新しいオシロが欲しい。今度は4CHが欲しい。
今の物とほとんど同じ様な感じで、4CHになって、帯域が100MHzになった物が、
秋月だと、約4万円で売っている。欲しいが、これからどの位使うかを考えると迷う。
- 2024年11月07日
PCINT16の間隔をタイマー1のカウンター値を表示してで調べてみたら、
値が思ったような値ではない。しかも、バラつきが大きい。(テキストファイル)
なぜ?
- 2024年11月08日
PCINT16の間隔のバラつきとカウンター値の違いはなぜ起こるのか?
PCINT16の割込み回数(保存データ数)が思っていた物と違う(多い)のは?
データ64回(4バイトx8ビット)+リーダー2回+ストップビット2回=68回が76回
以下 考察と検証
- カウンター値の思った物との違いは、カウントする周波数が違っているか?
-->オーバーフローが10回ごとに、青LEDの点滅を繰り返す動作で確認した。
ストップウォッチ計測で点滅が10回で13.09秒になった。
計算上の値が13.107秒(65535uSx10x20)なので、
タイマー1の設定(カウント周波数)は良い。
- カウンター値の思った物との違いは、カウント値を保存するまでの時間が長いのか?
- カウンター値の思った物との違いは、何かの傾向が有るのかを調べる必要が有る
- カウンター値がばらつくのは、PCINT16の信号にノイズが有るのか?
-->オシロで入力信号波形を調べる必要が有る。
- カウンター値がばらつくのは、カウント値を保存するまでの時間がばらつくのか?
- カウンター値のばらつき方が毎回同じなのか、細かく調べる必要が有る
- 他の割込みの時間が長くて、PCINT16の割込みが待ちになるのか?
-->オシロで入力信号と処理開始までの時間を調べる必要が有る。
- 値の違いとバラつきの両方に関係するが、タイマー1の設定が間違っているのか?
-->タイマー1の設定(カウント周波数)は良いが、
カウント値の読み出しとか、クリアーなどが間違っているかの確認が必要。
- 値の違いとバラつきの両方に関係するが、タイマー1が壊れているのか?
-->CPUを交換したが、傾向は同じだが、カウント値、割込み回数は変化する
CPUの動作として(タイマー1の動作として)も、
同じなので壊れていないと判断した。元のCPUに戻した。
- 2024年11月11日
PCINT16の間隔はリーダー部を除けば、約560uSと約1690uSになる筈。
リーダー部は約9000uSと4500uSになる筈だが、カウンター値で見る限り、全然違う値になっている。
どこか、読む所で間違っているのか?
- 2024年11月19日
PCINT16の間隔で判断する所で信号出す様にして、オシロでチェックすると、
リーダーの最初の所は来るが、2回目(38kHzが無くなる時)の割込みで、判断に来ない。
elseの所(ノイズだと判断する所)で信号を出すようにするとそこに来る事が分かった。
信号を見た時に思ったような信号(High)になっていない事になる。
オシロで入力の信号と割込みタイミング、判断の所までの時間を見ると、
入力からelseで信号を出す所までは12、3uS掛かっている。
オシロで見る限り、入力信号はHighになっている。
なぜかわからない?
ポートデータを見る所で、書き方が間違っている。入力は「PIND」と書かなければ行けないが、
「PORTD」と書いていた。入力信号を見ずに、出力信号を見ている事になる。
今日の所はここまでで、ソフト変更はまだしない
- 2024年11月20日
「PIND」に変更した。データを表示するが、4バイト目のデータが変化している。
基本的にいつも同じデータが来ている筈なので、おかしい。
データの値もおかしい。本来のデータは「0x41,0xb6,0xd5,0x2a」で
シリアルデータはMSBから出力れるので、ビット列は[01000001 10110110 11010101 00101010]になる。
表示しているのは「02-119F」となっている。そもそも「-」はおかしい。
オシロのデータを見ても(頭の方だけ)[01000001 10110110 ....]になっている。
やはり、受信(表示?)がおかしい。
- 2024年11月21日
表示がおかしいみたい。固定文字列("41B6D52A")を表示させても全然違う文字を表示する。なぜ?
赤外線のNECモードの所では表示していない。永久LED点滅を入れてもそこに来ない。
表示関数は呼んでいるが、データ数が0で戻るみたい。
- 2024年11月28日
OLEDとLCDを基板に固定した。今までは仮付けみたいな感じだった。
その時気が付いたのだが、OLEDの穴間隔が以前の物と違っていた。
今度の物の方が穴間隔が広かったのでヤスリで長穴にして固定した。
- 2024年12月2日
表示がおかしい理由が分かった。0か1かを決める時間を測った結果が範囲外の時に
その時の状態とカウンターの値(時間)を表示していた。
今の表示が「02-1198」になっているので、
状態が2(16進数)でカウンター値が1198(16進数)と言う事になる
状態が2と言う事は1ビット目のデータ部ON待ちの時で、ONしたのだが、
待っていた時間1198(10進数では4504)が範囲外なので、エラーになったと言う事になる。
つまり、リーダー部のOFF時間が「長い」或いは「短い」と言う事になる。
思惑では最小の値が4480のつもりなので、この値ならばOKだと思うのだが、どうなっているか?
リーダー部はON部分とOFF部分の合計の時間で見ていたので、OFFになった時にカウンターを0にしてはいけなかった。
カウンターの0を止めたら範囲外のエラーは無くなった。
しかし、まだデータを表示しない
- 2024年12月3日
受信データ数を戻す時に使う変数に、データ数を入れていなかった。
これを修正して 受信データを表示する様になった。
と思ったが、固定値を表示している。どこかにデバッグ用が残っているみたい。
それに加え、タイマーオーバーフローが連発する
(取りあえずオーバーフロー表示を止めている)
固定値を入れる所が有ったので修正したが、値がいつも00になる。
受信データが上手く受けわせていなかった。変数を間違えていた。
そこを修正したら それらしい値を表示したが、1番目は良いが2番目以降はいつも1番目の受信データを表示する。
まだ、うまくない。
それと、根本的にデータ数4で決め打ちで受信をしているが、
4とは限らないので 4でない場合でも表示出来る必要が有る。
リングバッファを使って、割込み側とメイン側のやり取りをして、データが有ったら表示するみたいな方式にしたい。
(ニキシー管時計用の表示みたいな方式)
- 2024年12月4日
受信データの表示で「41 B6 D5 2A」を送信している筈が「41 36 55 2A」になっている。
D7ビットが0になっている。D7がバイト単位で考えた時に最初のビットなのでそこがおかしい事になる。
OFFの時間が短いか、判断の値がおかしいかになる。判断の値は最初のビットだけが違う事は無く、
見ている所は他のビットと共通なので OFF時間が短いと言う事になる。どうだろうか?
-->比較する時間の見方が間違っていた。
ON時間は見ずにON+OFF時間で 0か1かの判定をする事にしていたのに
ONからOFFになった時にカウンターを0にしているので、
OFF時間だけで判定していた。
ONからOFFになった時のカウンターを0にするのを止めたら、
表示の値は正常になった。
基本的に、「データ(リーダー部も含め)は、ON時間+OFF時間で判定し、
ON時間とOFF時間を別々に判定はしない」と言う考えになっている。
- 2024年12月5日
受信データ数に関係なく、データを取って表示する方法をもう少し細かく考えてみる
- リングバッファで、割込み側(取得側)から表示側に渡す。
- リングバッファはunsigned short の32個のバッファとする。
- 受信データはunsigned shortの下位ビットに入れ、上位8ビットは受信データの順番(リーダー部の次が1)を入れる
- 表示側では 受信データ(下位8ビット)を2桁16進数表示とする
- 表示側では 順番が1を表示する時は次の行の一番左に”>”を書いてから表示を始める。
- リーダー部の判定は、信号の上りから下がりまでの時間が3mS以上だったら、次の立ち上がりは1番目データの信号とする
- 2024年12月6日
リングバッファ方式を考え始めるが、リングバッファ方式にするのは簡単だが、
割込みで、リーダー部の次が1番目のデータとなるが、その認識方法が本当に良いのか?
信号の上りから下がりで良いのか?、信号有る無の合計で見た方が良いのか?、
ストップビット後の信号無し時間で見た方が良いのか?
もう少しよく考える必要が有りそう。
リングバッファはソースに入れた。
まだ、1番目のデータの認識の所が出来ていない。
- 2024年12月8日
リーダー部の認識を、信号が来た時点で その前の信号が来た時から8mS以上経過していたら
リーダー部の頭(信号有り部)と認識する。
- 2024年12月9日
リーダー部認識の8mS以上を見る時にオーバーフローも確認する必要が有る。
その為にオーバーフロー割込みでフラグを立てる事にする。
それに関連して、信号が来た時(立下り割込みで)カウンター値を0にする時にそのフラグも消す必要が有る。
また、微妙な隙間を考慮すると、オーバーフロー割込み要求フラグ(TIFR1のTOV1ビット)も消す必要が有る。
よく考えたら、8mSOFF部が無い時も有りそう。
やはり、ON時間を見て、9mS(±20%)だったら 次のON部は最初のビットと言う判断で行きたい
- 2024年12月19日
ソースを修正した。オーバーフロー割込み要求フラグ(TIFR1のTOV1ビット)の処理は行っていない。
ビルドは通った。まだ、書き込みはしていない。
- 2024年12月22日
CPUに書き込んで動作をさせた。NEC照明器の表示するデータは合っているのだが、横並びにならない。
いつも1番目のデータみたいに見える。まだ、表示する所か、保存する所がおかしいみたい。
でも、データを表示していると言う事は、バッファリングでのデータの受け渡しはうまく行っているみたい。
I/O-TVのデータも正しく表示していると思う。最初のデータはスクロールアップで消えてしまって確認できないが、
終わりの4データを見た限りでは、有っている。
- 2024年12月24日
データを入れる所で番号の半数が間違っていた。
表示部分でも1番目以外の区切り記号の入れ方が間違っていた。
修正したら、NEC表示器もI/O-TVも思ったような表示になった。
しかし、表示データ数が少なくてすぐにスクロールアップしてしまうが、
1グループのデータは表示出来るので 機能的はこれで良しとする。
後は送信機能を入れる必要が有る。
送信を入れれば、自分で送信したデータを表示するはず。
- 2024年12月25日
送信の考え方として、560uSを基準単位として、その周期でタイマー割込みを掛ける。
その割込み処理で、38kHzのON/OFFを行う。
ON/OFFの元になるデータをメイン側で用意して、用意が出来たらタイマーを起動する。
割込みでデータを全て送ったら、送信完了フラグを立てるので、メイン側でタイマーを停止する。
メイン側で用意するデータは、送信バイト数と、送信データ。
割込み処理では、最初のリーダーの送信してから、データをビット単位に分解して、
0の送信か、1の送信か、をデータ数分行い、最後のストップビットの送信までを行い、
送信完了フラグを立てる事にする。
タイマーは現在使用していない「Timer0」を使いたい。
560uSピッタリでなくても、数パーセントのズレならば大丈夫だろう。
1回の割込み周期(560uS)を1Tとすると、
リーダー部はON:16T、OFF:8T
データ部は
0のビットはON:1T、OFF:1T
1のビットはON:1T、OFF:3T
ストップビットはON:1T、OFF:8T(仮)
と、考える。
細かい所、具体的な所は徐々に詰めていこうと思う
- 2024年12月26日
送信にTimer0を考えたが、このタイマーは38kHの信号出力に使っていた。
基本的な考え方をやり直す必要が有る。
タイマー割込みを使う方法はダメだろう。
どれかのタイマーのカウンター値を見るか、ソフトウエアタイマーで時間を見るしかないだろう。
どのカウンターもフリーランで動きっ放しは無いので、カウンター値を見るのはダメだろう。
どれかのタイマーの割込み時間を基準にして、そこでカウントした値を基準にはできないだろうか。
タイマー1は0クリアを途中でするので使えない。
そうなると、タイマー2か、タイマー0になるが、タイマー2は基準時間が200uSで長すぎる。
残るはタイマー0だが、今は割込みを使っていないが、38kHzの動作なので、26.3uS周期なので
その中で割込み処理をするのは結構きついような気がするが、変数を+1するだけならば、出来なくもないかな?
- 2024年12月29日
タイマー0のOVF割込みでプログラムを書いたが、割込みの確認が出来ない。
取りあえず、1回でも入れば、青LEDの点灯を入れてみる。
-->割込みはOK、確認部分がコメントになっていた。
1Tの周期を確認したら557uS周期になっていたので、周期の値もOK
送信の部分も書いてコンパイルは通った。
まだ、CPUに書き込んでいない。
- 2024年12月30日
CPUに書き込んだ。
PCINT16の設定がまずくて、38kHzが出なかったが、修正したら出た。
しかし、データがおかしい。スクロールしてハッキリわからないが、データが多い。間に00が入るみたい?
- 2025年1月1日
受信データ表示が1行に入らず、見難いので6x8ドット表示に変更した。
赤外線データの出力を見る(自分で出した物のデータ)と、00になっている。
S1(シルクS5)のデータとS2(シルクS2)のデータで出しているデータ量(時間)が違う。
なぜかS2がすごく多い。S1も表示上のデータ数は有っていない。
このNECモードに入って、すぐにスイッチを押しても表示しない。
青LEDを見る限り何か出しているみたいだが、38kHz信号の長さが正しいかはわからない。
スイッチを何度か押すとリセットが掛かったみたいに最初からプログラムが動く。なぜ?
- 2025年1月5日
オシロで出力波形を見たが、何となくだが、良さそう。
と思ったが、実際に動いている物の波形(I/Oデータ)と比べると、
全体の時間がなぜか短い(相似形)。
単位時間が間違っている?
一度受信データを表示すると、1バイトデータを出す前に23--24mS 位出しっぱなしの
時間が有る。なぜ?
仮に、1T周期を作る38kHzの割込みでパルスを出す様にした。
周期を調べたら、約14uSになる。
周期が思っていた時間と違っていた。約半分になっている。
割込みの処理時間は約2,7uSになる。
この様なタイミングで、受信と送信を同時に行うのは今の方式ではきついだろう。
1Tを測るカウンターを40に修正したソフトをCPUに書き込んだ。
受信データを表示したが、値がおかしい。
今日はここまで
- 2025年1月6日
波形を見て、S2のデータ表示がおかしいかが、分かった感じ。
データ(1バイト)とデータ(1バイト)の間に38kHzが出ている時間が23~24mSも有る。
これは、受信で1バイトとると表示に行くので、表示の時間中は38kHzの出力制御に回らない。
その為、回って来た時には38kHzを止める時間が過ぎていると言う事だろう。
但し、出力波形の時間は大体合っているみたい。なので1バイト目のデータの表示も合っている。
これを解決するには、全て割込みの中で処理すれば良いのだろうが、
割込み周期が14uSでは、処理時間が掛かり過ぎるので無理だろう
現実的な策としては、出力処理中はその中のループにして、表示に行かないようにする。
受信の割込みは入るので、受信データはバッファに溜まり、出力が終わってからその溜まったデータを表示する事にする。
S2の主力データがおかしい。値はハッキリしないが、デー数が68位有る(オシロで数えた結果)
今の問題と直接は関係ないが、年末に購入した新しいオシロスコープ(DHO804)の機能が使いやすい。
起動が遅いが、表示もきれいだし、タッチパネルなので選択項目の設定がやりやすい。
アナログ的な電圧レンジ、トリガレベル、時間軸などはつまみを回せば調整できるので、
今までの感覚から大きくズレないで使える。
パソコンと繋げられる筈なのだが、まだ、やっていない。繋げればもっと便利になるだろう。
起動時間が遅い件で、なぜか昔の仕事で使っていた真空管の大きくて重い岩通のオシロを思い出した。
そのオシロも、ファンが回りだして輝線が出るまでにずいぶん待ったような気がする。
なので、朝に電源を入れると途中で電源を切るのは昼休みぐらいだった。
(電源を切っておくと他の人に持って行かれることも有ったので)
おかしなな事で、昔を懐かしく思い出した。
- 2025年1月7日
出力処理中はその中のループにして、表示に行かないようにした。
正常なデータが出ていると思う。
表示するデータが出力した値で、S1(シルクはS5)で、シーリングライトをON/OFF出来た。
S2(シルクはS2)も、出力した値を表示出来た。
しかし、2行(3行?)表示した後にリセットが掛かったみたいになる。
- 2025年1月8日
「2行(3行?)表示した後にリセットが掛かったみたいになる」件は
ISPを接続しないと起こらないので、多分、電池が減って来て5V電源が下がったのではないか。
と言う事で、この件は問題無しとする。
S1波形、S2波形
昨日の修正は、変更箇所をなるべく少なくして変更したので、すっきりしてない所も有るので、
スッキリしたソースにしたい。
- 2025年1月9日
出力関数を「ir_nec_traciever.c」に移した。
昨日と同じ様に動作している。
出力を各ブロックごとのループにして、時間が来たら(カウンターが0になったら)そのループを抜ける様にした。
上手く動かない。何か出力はしているみたいだが、表示もしないし、シーリングライトもON/OFしない。
少し時間が経過するとリセットしたみたいな症状になる。昨日と違って電池を新しい物でISPを外しても同じ。
取りあえず、関数の内容だけ昨日と同じ物に戻した。(関数の位置は移動したまま)。
- 2025年1月10日
仮に、S1(シルクS5)は8日の関数を呼び、S2(シルクS2)は新しい関数を呼ぶようにした。
思った通り、S1(シルクS5)はデータが正しい(動作も表示も)
S2(シルクS2)は昨日と同じ様に おかしな動作になる。
おかしな表示をして、リセットから動くような感じ(スタックを食いつぶした?)
出力波形では 1ビット目のデータは出ているみたいだが、2ビット目の38kHzが出っ放し。
while文のbreakの位置が間違っている所が有った。
間違いでは無いが、ループがわかりにくかったので データを出し終わるまでのループを
while文から主にfor文の2重ループに変更した。
リセットから動くような感じは(再起動) ISPを接続した時は起きるが、
外せば起きなくて、新品の乾電池にすれば、ISPを接続しても起きないにので、
電源が弱いと言う事にした。(今までは充電池を使っていた)
これでプログラム(旧5)は出来上がりとする
- 2025年1月16日
切り離せるブロックを切り離し、コネクタで接続する形にした。
各ブロックは以下の6個に分かれ、CPUの基板にコネクタで接続される。
電源(1.5V->5V)ブロック、
赤外線発光ブロック、
赤外線受光ブロック、
LCD表示ブロック、
拡張I/Oブロック、
RTCブロック
- 2025年1月24日
GPSデータが取り逸れてるみたいなので、バッファーを大きくした。
加えて、OLED表示を速くする為にTWIの動作クロックを400kHzに変更した。
修正後のプログラム。
- 2025年1月26日
簡単な動作説明書を書いた。