ホーム -> 電気工作 -> 実験用、治具用基板 -> MEGA1608のOLED(IIC)のテスト
MEGA1608のOLED(IIC)のテスト 制作メモ


回路図(旧2) 基板図(旧2) 回路図 基板図 荷物 生基板 CPU半田付け 出力ポートのチェック 15ピンコネクタ取り付け 1~5ピン側 6~10ピン側 ハンダごての細工 再度半田付け後の1~5ピン側 再度半田付け後の6~10ピン側 基板組み立て済-表 基板組み立て済-裏 LP2950シルクと逆に実装 37.87kHz twi_write()途中で止まる twi_write()修正後 RTCがリード出来ない時のstart 当てる前1ピン側 当てる前10ピン側 当てた後1ピン側 当てた後10ピン側 1回目のrtc_read() rtc_init()内の戻り値 RX8900の3ピン再半田
  • 発想 2022年12月24日
    • 秋月の0.96インチ 128×64ドット有機ELディスプレイ(OLED)の動作をmega1608でも確認したい。

  • 構想 2022年12月24日

    mega328で、0.96インチ 128×64ドット有機ELディスプレイ(OLED)の動作確認を考えたので CPUをmega1608に変更した物でも動作確認をする事にした。基板は328のCPUを変更して、付随する所を合わせる事にする。

    • 2023年5月22日

      RTCにIIcインターフェースのRX8900を追加したい。
      mega328で0.96インチ 128×64ドット有機ELディスプレイ(OLED)と RX8900の動作の確認が出来たので その時の回路をこちらに移行したい。
      バッテリバックアップ用の電池はDS3234と切り替えの共用にしたい。

  • 実装についての考え
    • 2022年12月24日

      回路は、mega328で設計した物が有るので、それを修正する事にする。 但し、CPUがSMDなので周辺部品もSMDにした方が良いかもしれない。

    • 2023年5月22日

      CPUの名称を1608で作っていたが、名称だけは3208にしたい。
      実際に取り付ける物は現在手持ちの1608になるとは思う。

  • 現状
    • 2022年12月24日

      mega328の回路図と基板図をコピーした所。この後はmega1608のライブラリを作る必要が有る

      ライブラリはTQFP32とSSOP28の2つを作った。
      回路図を書いていて気がついたのだが、MHzレベルのクリスタル(セラロック)を付ける所が無い。 32kHzのクリスタルは有るのだが、高い周波数の物は付ける場所が無い。 精度の高い動作が必要な時は、外部に発振器を付けて、外部クロックに入れる事になる様だ。
      調歩同期の周波数は、内部発振の精度がある程度高いので大丈夫だと思うが、何かの時に問題にならないか心配。

      回路図はまだ途中

    • 2022年12月26日

      回路図(旧1)と、 基板図(旧1)は大体出来た。 ガーバーファイル(旧1)も出来た。 部品は基本的にスルーホールを使った。CPUはTQFPにした。

    • 2022年12月27日

      基板のGPSの番号を思い違いをしていた。 回路図(旧2)と、 基板図(旧2)を直した。 ガーバーファイル(旧2)も作り直した。

    • 2023年5月26日

      CPUの名称を3208にした。
      RTCにRX8900を追加した回路図と基板図を描いた。

    • 2023年5月27日

      回路図をちょっと修正したので 基板図も変更した。
      ガーバーファイル部品表も作った。

    • 2023年8月2日

      Elecrowに 基板を注文した。

    • 2023年8月8日

      Elecrowから発送したとのメールが来た。
      OCSの配送状況を見たら昨日集荷されて、 今日の夕方には飛行機に乗せられて深セン宝安国際空港を出発した。

    • 2023年8月10日

      Elecrowから荷物が佐川急便の配送で届いた。
      基板は見た所は良いみたい。

    • 2023年10月27日

      CPUを半田付けした。
      この前はmega4809(TQFP48)を半田付けしていたので、
      このmega1608(TQFP32)は楽に半田付けが出来た。
      位置決めが特に楽だった。

      他の部品もある程度は取り付けた。
      電源部分は正常に動いているみたいで、5Vが出ている。

      RTC(RX8900CE)の半田付けが難しい。 位置決めが難しくて、なかなかうまく行かないが、最初にフラックスを塗ってしまって、 乾き始めた時にICを載せ、位置を決め、動かなくなるまで抑えておく。 抑えたまま、一つの隅を半田付けしてから、後の3か所を半田付けすると、何とか位置は決まるみたい。 その後に残りの6個の信号パターンを半田付けしようとしたが、ハンダごての先が入らず、 溶けたハンダが流れて行かない。信号線が半田付け出来ない状態で止まった。
      今は、どうしたら良いか、わからない。
      この半田付けが出来ないと、他のこれから組み立てる時計関係に支障が有る。
      基板を作り直さなければいけないかもしれない。

      RTCは後回しにして、LEDとリセットスイッチ(S4、PF6)を確認するプログラムを作った。
      mega1608用のプロジェクトで、mega4809実験基板のプログラムをベースにして、 LED出力部分とスイッチ入力部分を修正して作った。
      コンパイルも通り、書き込めて、LEDとスイッチの動作確認が出来た。
      スイッチはPF6で、リセットスイッチとしては使っていない。
      PICKIT4の接続するコネクタは1.5mmピッチの3Pコネクタ(CN1)を使った。

    • 2023年10月28日

      連続出力のポートとビットがmega4809のままだったので、修正した。
      出来たプログラム(旧1)は、PBとPEは無くし、PCは4ビットにした。
      ブレッドボードでポート出力のチェックをすると、 PCとPDの点灯場所がおかしい?
      -->ブレッドボードとの繋ぎを間違っていた。出力ポートには問題なし。

    • 2023年10月29日

      RTC(RX8900CE)の半田付けについては、ハンダごての細い物でもう一度やってみて 半田が流れないように見えたら、それで終わりにして、他の所を組み立てて、動作を確認する事にしたい。 -->細い物で、フラックスを付けてから、
         片側全体にハンダを付けるようにしてみたら、
         何となくハンダが盛れたが、7ピンは付いてないかもしれない。
         それと、これだけ温めてしまったのでICが正常に機能するかわからない。
         こわれてしまっていてもしようがない。
         1~5ピン側6~10ピン側の写真の拡大を見ると、
         2ピンと3ピンに半田が乗っていないみたい。
         7ピンは何とかくっついている様な感じ
         もう一度、2ピンと3ピンの半田付けに挑戦してみたい。
         その為、周りの部品は後回しにする。目視ではよくわからなかった。

      出力ポートのチェックでは、ポート出力の所にコネクタを付けなかったが、 そこまでの配線のチェックは出来た事になるので、コネクタを取り付ける事にした。

    • 2023年10月30日

      半田ごてに細工をして、もう一度RTCの半田付けをやってみた。
      1~5ピン側6~10ピン側の写真の拡大を見ると、 良くはなったみたいだが、本当についているかはよくわからない。
      今後の半田付けのやり方については、確実な所がわからないが、位置決めは正確に行わないと半田が乗りずらい。 予め、ICの端子とPCBのパターンに薄くハンダを載せて置き、フラックスを縫って、それである程度固定した後で、 半田ごてで、IC端子とパターンの半田が溶かせれば確実に付けられると思う。
      今後の事だが、ICパターンの長手方向は外側に1mm位広くした方が、手半田の時は楽になる。

      RTCのFOE(1ピン)を仮に10kΩでプルアップして(1MΩの抵抗を半田付けしていないので)、FOT信号を見たら 何か出ているみたい。テスターを当てたら直流レンジで2.5V位になったので、多分FOT信号が出てると考えてよいだろう。 と言う事は、VDD(2ピン)とGND(9ピン)は半田付けされていて、ICも壊れていない。 FOE(1ピン)とFOUT(4ピン)も半田付けされている。 後はVBAT(3ピン)、SCL(5ピン)、SDA(7ピン)、/INT(10ピン)がまだわからないが、 見た目では、SCL(5ピン)と/INT(10ピン)は半田付けは大丈夫だろう。 VBAT(3ピン)とSDA(7ピン)が半田付けされているか、ハッキリしない。 TWIの所なので、プログラムを動かすのが速いと思う。 ダメだったらどうするかは、まだ未定。

    • 2023年10月31日

      DS3234以外の全ての部品を取り付けた。(
      これでプログラムを作ってそれぞれ(赤外線、GPS、LCD表示、OLED表示、RTC)のチェックを行い、 その中でRTCのチェックも出来てくることになる。

    • 2023年11月1日

      AVRSUTUDIOでI/Oが見られなくなったが、debugモードで、ツールバーのI/Oボタンを押せば、 I/Oのウインドウが出てくる。

    • 2023年11月3日

      GLCD用の3.3Vの出力が0Vになっている。
      -->LP2950の足ピンが間違っている。入力と出力が逆になっている。
         TI(ナショナルセミコンダクタ)のLP2950Zは名称を正面に見て、
         左が出力、右が入力ピンになっていて、
         実装したLP2950Lは名称を正面に見て、左が出力ピン(1ピン)、
         右が入力(3ピン)になっている。
         ピンの機能としては同じ様に、左が出力、右が入力になる。
         なので、LP2950Zで回路図、基板図を書いて、LP2950Lを実装しても、
         動作的には問題がない筈。
         結局、ライブラリーが間違っている事が分かった。
         信号(Symbol)とフットプリント(Package)の接続(Connect)が
         間違っていた。
         シルクと逆に実装する事にして、3.3Vは出力された。
         Eagleのライブラリーは、LP2950Lとして新たにOlim_ic.lbrに追加作成した。

    • 2023年11月7日

      「mega1608_oled_test」プロジェクトに「pr_mega328_iic_oled_rtc」プロジェクトのソース(メインの有るソース以外の.cと.h)を追加した。
      予め、プロジェクトのソースはmain.cと同じフォルダにコピーをしておく。
      Solution Explorerで追加した。mega1608_oled_testのフォルダ見たいの絵がある所で右クリックで「add」が出てくるので、 マウスを動かして「Existing Item」をクリックして、 「main.c」の有るフォルダに有る「.c」と「pr_mega328_iic_oled_rtc」プロジェクトのソース(メインの有るソース以外の.cと.h)を選択して 下の「Add」ボタンを押す。これでついかできた。
      しかし、ビルドではエラーがいっぱい出てくる。
      ポート名の名称、ビット名の名称が違うみたい。他にももっと有りそう
      今日はここまで

    • 2023年11月15日

      入出力のポート(スイッチとLED)は何とかエラーが無いようになったが、 他は、ポート名称、ビット名称は違うので、そこら中エラーになってコンパイルが通らない。

      ちょっとやる気が失せる。
      一時中断して、他の事をやる事にする

    • 2023年11月23日

      Microchip Studioで、mega328のプロジェクトを作り、 そこのソースのあるホルダに「pr_mega328_iic_oled_rtc」プロジェクトのソース(.cと.h)をコピーして プロジェクトに追加した。そして、main()関数の中で、元のメイン関数(名前は変更した)を呼ぶようにした。
      "PROGRAM" はエラーが出るので、constに変更しただけで、ビルドは出来た。動くかどうかはわからない。
      この結果から、mega1608のエラーは ポート名称、ビット名称 が、間違っているだけなのだろう。(たぶん)

    • 2023年11月25日

      Microchip Studioで、mega328のプロジェクトで作ったプログラムが動くかどうか確かめる為、 PICKIT4を繋いで、書き込もうとしたが、AVR0系書き込みアダプタを使ったが、書き込めない。 まだ、アダプタの6Pコネクタの動作確認が出来ていない(回路上は良いと思う)ので、 アダプタが悪いのか、プロジェクトが悪いのか、人間の操作が悪いのか、わからない。
      ヒューズデータも良き込めない。
      この「MEGA1608のOLED(IIC)のテスト」とは直接関係は無いが、meha328でPICKIT4を使えて、 Microchip Studioで 328のプログラムが出来たら、便利だと思うので試してみたが、今の所諦める。

    • 2023年11月25日

      Microchip Studioで、mega328のプロジェクトで作ったプログラムが動くかどうか確かめる為、 今度は、ISP MarkⅡを繋いで、試してみたが最初はうまく動かなかった。 と言うか、シグネチャーも読めない状態だった。
      単純にコネクタが奥まで差し込んでいなかったのでダメだった。
      あらためて ISP MarkⅡを繋いだら、書き込みが出来たが、 プログラムとしては大雑把には動いているみたいだが、フォントがおかしいみたい。
      ROM上のデータの書き方がまずいような気がするが、そこが何とかなれば、動きと思う。

      PICKIT4に戻してやってみたが、シグネチャーも読めない状態のままなので、 mega328の時は ISP MarkⅡを使えば出来るので取りあえず、これでやめる。

    • 2024年2月6日

      取りあえず、TWIは「#if 0」でソースから外して、ビルドをしたが、タイマーの所でもエラーが出る。 ここでも、レジスタ、ビット名称が全然違う。動作は同じような事が出来そうだが、設定する物が違うみたいで 説明書をよく読まないと出来ない。ここも「#if 0」でソースから外す事になりそう。後でゆっくり修正する

      エラーの出る所は「#if 0」でソースから外す事で、ビルドは出来た。でも まだまだ動かないだろう

    • 2025年1月28日

      mega328のOLED等のテストが出来たので、約1年ぶりでこれに手を付ける事にした。

      LCD表示をやってみる事にして、mega328の所からCファイル"glcd_7565.c"と hファイル"glcd_7565_h.h"をコピーしてプロジェクトに入れた。 ビルド(コンパイル)が通らない。ポート名、ビット名がダメみたい。ここから手を付ける事にする。
      このプログラムは単純に、ポートのビットを操作してSPIで出力しているので、修正は簡単だろう(多分)

      ポート名を修正して、ビット名はよくわからないので16進数表記を直接書いた。これでコンパイルは通った。

      LEDの点滅の後、出力チェックは止めて、LCDに文字を出す事にした。ビルドは出来た。
      今日はここまでで、まだ書き込んでいない。

    • 2025年1月29日

      "Micrichip Studio" でのプログラム書き込みに手間取った(PICKIT4の選択と書き込みのボタンが見つかるまで)が、 無事書き込めて、動作確認が出来た。LCD表示は出来た。

    • 2025年1月30日

      タイマー動かしたい。200uS位で割り込んで欲しいのだが、
      割込みベクターがTCB2は1つしかないみたい。本当か?
      割込みの種類はプログラムで判断するのか?
      インターネットで割込みの関数の記述した人が居た。
      それを見たら、"TCB0.INTFLAGS = TCB_CAPT_bm; // Clear Interrupt Flag"と有ったので、
      判断をするかもしれないが、自分で割込みフラグをクリアする必要が有るみたい。
      割込みの時は自動でクリアと言う事は無いみたい。
      但し、開発環境が「MPLAB XIDE」みたい。

    • 2025年1月31日

      仮に、赤外線の入出力をポートのビットとして、ハード的に発光する事、受光する事を確認した。 発光確認には、赤外線LEDのカソードと5V間に赤LED+10kΩを取り付けて目視で確認した。

    • 2025年2月1日

      CN6に外部GPSを接続して、何かしらのデータが来ている事はDS2が点灯するので確認できた。 CPUまで来ているかはまだ。

      ヒューズビットを書き換えて、内部16MHz動作に変更した。
      ヒューズビットの書換手順
      今までは20MHz(デフォルト)で動いていたみたいだが、
      既存のプログラムは8MHzか、16MHzで動作をしていたので、
      16MHzにした方が設定値などが使いやすいと思う。
      主な動作が確認できたら、20MHzに上げて速くする事も良いと思うが、今は16MHzにする。

      ライブラリーの_delay_ms()関数を使う事にしたら時間が10倍近く違っている デフォルト値で前置分周期で1/6にしているみたいなので、変更しようと思ったら、 レジスタ名ではねられて、変更できない。
      実際の動作クロックがいくつなのかよくわからない。わからないとタイマーの設定なども困ってしまう。
      取りあえず、自前のdelay_ms()で16MHzにすると大体のディレー時間は合っているの これにする。元のuSのディレーを見るとmega328の8MHz動作とほとんど同じで2uSが10uSになっているので 8MHzの1/5の周波数か....? 本当の動作周波数はわからない。

    • 2025年2月2日

      "CLKCTRL.MCLKLOCK=1"と"CLKCTRL.MCLKCTRLB=0"は設定しても変化が無いようなのでコメントアウトした。
      ヒューズ設定で。「OSCCFG.OSCLOCK」にチェックを入れると、動作速度が倍ぐらいになる。なぜ?
      インターネットで探してみたら"ccp_write_io((void*)&(CLKCTRL.MCLKCTRLB),0x00);”で周波数を16MHzにするコードが有った。 Attiny202のコードだが0系なので、同じような物と思うがどうだろう?開発環境が違うかも....。 「#include<avr/cpufunc.h>」を入れたら、エラーは無しでビルドは出来た。動くかはわからない。
      書き込んだら、16MHzで動いた。(ストップウォッチのLEDの点滅10回で確認)

    • 2025年2月3日

      タイマー2(TCB2)割込みの書き方で「ISR(TCB2_INT_vect」)でコンパイルできた。 TCB2の初期設定も書き直して、ビルドは出来た。動作するかはわからない。

    • 2025年2月4日

      TCB2を割り込み無しのフリーランで動作している事はカウンター値を表示させて確認できた。
      TCB2の500uS割込みは出来た。10mSのタイマー変数を使ってLEDを1秒間隔で点滅させ、 その点滅の10回の時間をストップウォッチで測って確認した。

    • 2025年2月5日

      38kHzの出力にTCB0を使う様にソースを書き直した。
      実際の送信ビットに対応した38kHzを出す時の時間を測る所で使っているwait_us()は まだ出来ていない。TCAを使う必要が有りそう。
      ビルドは出来たが、まだ書き込んでいない。

    • 2025年2月6日

      書き込んだが、出力はしていない。暴走はしていない。
      タイマーの動作はしているみたい。カンターは動いている。
      でも、CCMPLとCCMPHが 00になっている。210と105を書いたら 書けた。
      なので、定数で書かないと反映されないみたい....。カウンター値もCCMPLを超える事は無いので、 8ビット動作になっていると思う。
      でも、出力は無い。CTRLBのD4はスイッチを押した時は1になっている。

    • 2025年2月7日

      回路設計が間違っていた。
      赤外線LEDが繋がっているのはPA0だが、
      そこは「0-WO」ではなく「0-WO0」になっている。 「0-WO」はPA2になる。
      そこ(PA2)を出力にして、スイッチを押した時にテスターを当てたら、
      信号出力時は約2.5Vが出るので、TBC0の動きとしては合っているのだろう。
      回路設計時はPA0が「0-WO」だと思っていた。
      PA2だったら、TWIと重なるのでTWIを代替ピンにしなければなら無かった。
      現状の回路で何とか38kHzを出す算段を考えなければならない。
      何にしても TBC0は使えなくて、TAC0を使わなくてはならない。
      PA0に出力できるか?

    • 2025年2月8日

      よく考えると、代替ピンを使わない時はこの設計しか出来ない。 今は、覚えていないが、結局こういう設計はよく考えての結果かもしれない。
      何しろ、TAC0で38kHz出力を出す事になる。
      データシートを見た限り「周波数波形生成」で出来そう。

      TAC0の動作を書いた。
      動いているみたい。スイッチを押した時、IRとパラのLEDが光っている。 周波数などの確認の為、オシロで確認したいといけない。
      でも、一安心

      オシロを繋いで周波数を見たら、約1/2(周期は2倍)になっている。
      比較値がmega328のままなので、半分にする必要が有った。
      (又はプリスケーラを1/1にするか?)
      プリスケーラを1/1にして、16MHzのカウンターにしたら、
      37.87kHzになったので 良しとする

      ニキシー用の赤外線出力をスイッチを押した時に出す様にしたが、パラのLEDを見る限り出ていない。
      今日はここまで

    • 2025年2月9日

      パラのLEDをよく見たら、ハンダ付けが外れていた。手で押さえて動作をさせたら、光っている。
      ソフト部分の問題ではないだろう。これでニキシー管時計が動かせるかな?
      -->動いた。

    • 2025年2月10日

      ニキシー管時計用のリモコンデータ受信のチェックの為、受信データを表示する所を作った。ビルドは出来た。 まだ、書き込んでいない。

    • 2025年2月11日

      CPUに書き込んだ。
      何か表示しているが、文字にならない。20H以下のコントロールコードみたい。
      表示データも多い。
      2行になる。自分で出した物も同じような表示になる。
      ビットレートが有っていないのかも?
      試しにBAUDにセットする値を2倍、4倍、8倍、1/2にしたが、 表示は変わるが、正常な値にはならない。

      送信波形をオシロ見れば、ビットレートが分かると思うので、 UART1を600BPSで初期化して、55Hを送信してみる事にする。
      CPUにUART1から55Hを送信する物を書き込んだが、まだ、オシロを繋いでいない。
      テスターを当てた限りでは、何か信号は出ているみたい。オシロで調べないとわからない

    • 2025年2月12日

      オシロを繋いで見たら1ビットが644uSになっている。
      600BPSなので1666uS辺りの筈。なぜ?
      計算が間違っているのだろう。#defineの所か?
      計算は正しかった。しかし値が16ビットに収まらなかった。(気が付かなかった)
      16MHz動作では、600BPSのシリアルは設定できないと言う事になる。
      なので、8MHz動作に変更した。これで動いた。

      8MHz動作にしたので、38kHz波形のタイマー(TCA0)と、 赤外線で600BPSを出す為のタイマー(TBC1)の設定を変更した。

    • 2025年2月13日

      GPSデータも受信できた。表示はしているが、1画面からはみ出るので、抜けが有るかまではわからない。

    • 2025年2月14日

      TWIに手を付けたが、まだ途中、mega328とレジスタが違い、ビットの割り振りも違う。 細かい制御が出来るみたいだが、まだ良く理解できていない。
      mega328のソースを書いた時の考え方を忘れたのでもう一度考え直す感じだが、
      何とかなるだろう。

    • 2025年2月16日

      TWIのソースを変更した。
      このシステムで1つだけのマスターとして、マスター動作を書いた。 (元のmega328も同じ)
      ビルドは出来たが、まだ、書き込んでいない。

    • 2025年2月17日

      CPUに書き込んだ。
      OLEDの初期化の所で止まってしまう。
      その中の TWIの初期化の所で止まる。
      その中の 最初のtwi_write()で止まる。 OLEDを取り外せば、プログラムは止まらない。

    • 2025年2月18日

      twi_start()の波形は良いと思う。
      twi_write()の所でクロックが出てこないので、データを書き込めない状態と思っているのだろう。

      データを書き込む時の条件を「WIF:High」だけにしたら、クロックが出て、プログラムが進み、表示も出来た。

    • 2025年2月19日

      RTCの時刻表示(秒)を追加した。
      ビルドは出来たが、まだ、書き込んでいない。

      書き込んで動作をさせたが、表示(秒)が動かない。00のまま
      プログラムが止まる事は無いが、秒の表示が動かない。
      TWIの戻り値をいつも0にしたら、止まってしまった。
      今日はここまで

    • 2025年2月20日

      RTC_INIT()で出てこない。
      rtc_flag_read()の中のtwi_start()のreadの時に出てこない。(Whileのループから出てこない)
      オシロで見ると、ハード的には良いと思う。
      アドレス+R/Wを出した後、SDがHighになっている。
      だけど、ソフト的にはMSTATUSのRIFがHighになっていない。

      リードなので、アドレス+R/Wの後で、スレーブがSDをHighにしたら、 マスターはクロックを出すと思うのだが、違ったか?
      或いは、単純にHighでは無く、LOWの期間が無いとダメとか?
      或いは、リードの時に必要な設定が抜けていたか?
      どうもわからない。

      私の思い違いで、アドレス+R/Wの後は、スレーブはLOWにする事でACKになる。
      と言う事は、ACKが戻っていない事になる。ハード的に繋がっていないか?(半田付け不良?)
      今日はここまで

    • 2025年2月21日

      半田付けかもしれないので、もう一度RX8900の端子に半田ごてを当ててはんだを溶かした。(多分出来たと思う)
      半田ごてを当てる前( 1ピン側10ピン側)、 当てた後( 1ピン側10ピン側
      rtc_flag_read()では止まらなくなった。
      でも まだ秒表示が出来ていない。 06秒と1回だけ、LCDだけに表示して、止まっている
      rtc_read()をやらなければ秒を表示するので、rtc_read()が悪いのだろう
      1回目のrtc_read()は抜けてくるが、2回目で抜けてこない。OLEDの表示もしないので rtc_read()の終わり方が悪くて、次のTWIが正常に動作していないのではないか?

    • 2025年2月22日

      ループ内のOLEDの表示をやめても、rtc_read()で止まる
      ループ直前のOLEDの表示をやめても、rtc_read()で止まる

      何が悪いのかわからないので、 rtc_init()の中のtwi_start()等の関数の戻り値をLCDに表示してみて検討することにした

    • 2025年2月23日

      戻り値を見ても、何が悪いのかわからない。 戻り値の次に、手動(スイッチを押したタイミング)で、 RTCの年月日時分秒を読み出し(rtc_read())て、表示すると、 25時になっている。曜日も7曜日になっている。
      rtc_init()の中の設定値が間違っていたので、正しい年月日曜時分秒にしたら、 正しい時刻になり、年月日時分秒の桁上りもうまく行っている。
      何度読み出しても止まる事は無い。

      元のプログラムに戻すと止まってしまう。
      原因がわからない?
      OLED表示の問題か?

      元の手動表示に戻す。今日はここまで

    • 2025年2月24日

      RTCの動作としては、良い。
      時刻は進んでいるし、1秒間隔の信号も出ている。

    • 2025年2月25日

      OLEDの表示をrtc_read()の前にやれば、時分秒年の表示は問題なく、何秒も表示する。
      rtc_read()の後は、OLEDには表示出来ない。
      しかも何秒後かには、止まってしまう。スイッチ入力が出来ない

    • 2025年2月26日

      RTCのバッテリバックアップをチェックしたら、うまく動作していないみたい。
      一度電源を切ると、再設定から始める。(時計が元に戻る)
      電源を切らずに再起動した時(S4をRESETにした時)は、 再設定等をしないで動作を始める。(時計が進んでいる)
      ICの半田付けか?

    • 2025年2月27日

      RTCのバッテリバックアップの端子(3ピン)を再半田した。
      パターンが短いみたいので、レジスト部分を削って再半田した。
      電池(CR1220)を入れれば、再設定はしなくなった。

    • 2025年2月28日

      RTCの/INT端子信号(PD5接続)の割込みを使って1秒フラグを+1して、 その値を表示させると正常に+1されているので、割込み処理はしている。
      しかし、そのフラグで動作を制御するとうまく動かない。
      割込みの影響とは思わないが、まだハッキリしない。

    • 2025年3月1日

      どうも動かない理由がわからない。 何となくは、そのフラグをメイン側で操作するとうまくない様な気がするが それでは使えないし、そんな事は無いはずなのだが、よくわからない。
      どうも、2度目のrtc_read()から戻ってこないみたい。
      その中の秒を読む所のtwi_read()から戻ってこない。
      その中のMSTATUSのRIFが立つまで待つ所で抜けてこない。 つまり、RIFが立たないと言う事。
      これも、TWIの問題らしい。

      割込みが正常に動作している事の再確認の為、 割込み内で青LEDの点滅をさせてみたら プログラムが止まっている時(RIFが立たないでループの時)も 点滅しているので、割込みは正常に処理されている。

      結局、TWIを何とかしないとダメと言う事になる。

    • 2025年3月22日

      他の用が出来てしまい、まとまった時間が取れなかったが、これからはまた進められそう。
      時間が有る時は少しいじっていたが、まとまった時間で無いので、つじつまの合わない修正もしていたみたい。

      どうもよくわからない。TWIの初期化が終わっても状態が00Hのまま。(未知の状態)
      電源ON後の初期化が終わっていない状態みたい。よくわからない。
      -->TWIの初期を止めてしまっていた。
         RTCとOLEDの両方でやっていたので、
      そこを消したのだが、肝心のメインの所に書くのを忘れたみたい。

      エラーは出なくなったが、これで良いのかはまだわからない

    • 2025年3月23日

      やはり、良くない。
      twi_read()の所で止まってしまう。
      細かくは MSTATUS の RIF が立つまで待つ所で、待ち続けている。

      RX-8900の説明書を再確認したら、 RTCのデータを読み出す時は RTC内のアドレスを書き込んだ後、 twi_stop()をやらないで、スレーブアドレス+読み出しでスレーブアドレスを出して、 続けて、twi_read()をすれば良いみたいに書いて有る。
      本当か? 今はtwi_stop()を出している。mega328では(いままでは)出していると思う。 mega328は(今までは)、RTC内アドレスを指定しない読み出し方になるのかもしれない。

      それにしても、何が悪いのかわからない
      今日はここまで

    • 2025年3月24日

      「twi_stop()をやらないで、スレーブアドレス+読み出し」にしたが、
      状況は変わらない。twi_read()の所で止まる。
      細かくは MSTATUS の RIF が立つまで待つ所で、待ち続けている。

      どうも、レジスタの設定が良くわからない。
      どのビットがどの様な機能が有るか?
      実際のSCL、SDAにどうかかわってくるのかがわからない。

      いっその事、SCLとSDAをソフトで制御した方が分かり易いかも
      ざっくりと考えると、系統に1マスターと言うシステムで、そのマスター動作に限れば それほど難しくなく出来そうな気がする。スピードは100kHzは出ないかもしれないし、
      きれいな1:1の矩形波は出ないと思うが、クロック同期なので通信には影響ないと思う。

      基本的な考え方として、
      SCLビットはいつも出力設定で、ソフトでパタパタする。
      SDAビットは、入力設定と出力設定を切り替える。
      当然readの時は入力設定。
      writeの時は、High出力の時は入力にして、プルアップ抵抗にHighは任せる。
      Low出力は出力設定で、Lowを出力する。
      オープンコレクタ(オープンドレイン)では無いが、同じような動きが出来ると思う。

      mega1608(0系)は、他のビットの影響無しで、
      1ビットだけのLow/High出力、1ビットだけの入出力設定変更、
      が 出来るので うまく行くと思う。まだ作成途中

      レジスタを使う方で、スレーブアドレスの使い方が違っていた。(1ビットシフトしていた)
      ある程度、プログラムは進んで、「rtc_write_with_reset」には入るみたい。 出て来たかはわからない。多分出てきていない。
      flag_read()のtwi_stop()を止めても、状況は変わらない。
      flag_read()出来ているみたい。

    • 2025年3月28日

      レジスタを使う方で、LCDとOLEDの両方に、現在時刻を表示出来た。 しかし、電源が落ちて時計データがおかしい時に、それらしいデータを書き込む所でエラーになっている。 なので、現在時刻がおかしい。しかし分と秒が増えている事は表示から確認できた。

    • 2025年3月29日

      レジスタを使う方で、電源が落ちて時計データがおかしい時に、正しいデータを書き込む所でエラーになっている件は コントロールデータを読む所で、戻り値の良否判断が間違っていた。
      直したら、正常に書き込めた。
      これで、TWIは基本的には出来た事になる。後は、ソフトTWIをどうするか?
      その前にRTCの所と、TWIのソースの整理が必要だろう。デバッグの為に余分なコードが有る。

    • 2025年3月30日

      現在のTWIのSCLは大体50kHzなので約100kHzにする。
      -->これでも、支障なく動いているので、約100kHzにする。

      TWIのソースは整理した。
      RTCのソースはチェック用の変数を残して、整理した。

      ソフトTWIに関しては、ソースは書いたが、#ifdefで切り替えられるようにして レジスタを使うソースの後半に配置した。
      目標は、レジスタの物で全体の動きを作る事にする。
      「mega328_iic_oled_rtc」と同じ動きにしたいが、 スイッチが2つ無いので、リモコンの動作にするか、TWIの拡張I/Oを追加するか、 物理的にスイッチを追加するか、になる。
      取りあえずは、物理的なスイッチを付ける方向で考える。無くてもリモコン操作で 同じ様な動きは出来る。

    • 2025年4月8日

      「mega328_iic_oled_rtc」を元にプログラムを作り替えた(ir_necは無い)が、何とかビルドは出来た。
      ちょっと修正して、モード選択とRTC表示は出来た。(細かくは見ていない)

    • 2025年4月9日

      GPSデータも表示出来た。
      モードは電源を切っても、電源を切る前と同じになったのでEEPROMのアクセスもOK。
      これで機能のチェックは出来た。
      GPSデータ表示の時に、selectスイッチの長押しで現在時刻をRTCにセットしても良いともう。 RTCの表示の時には、スイッチが1つなのでどうするか? リモコンで設定するか? 以前やった1つのスイッチで設定をするか?
      GPSデータを使うのは操作の面からは良いが、いちいちGPSを接続しなくてはならないのが面倒。バックアップ電池が必ず必要
      リモコンで設定するのも、リモコンを持って来なくてはならないので面倒。
      一つのスイッチでの設定操作は、結構大変。

      バックアップ電池が無い時でも、動作を見たい時が有るので、一つのスイッチで設定出来る事は必要。
      一つのスイッチで時計設定が出来る様にした。
      取りあえず、ソフト的にはこれで良しとする。
      後は、ソフトの整理として、使ってない所の削除(チェック用に追加した所など)

    • 2025年4月11日

      プログラムは完成とする。
      取説は「mega328のOLED等のテスト」の取説を参考にして作れば、 それ程時間はかからないだろう。
      取説は出来た。

  • 参考資料
    • 部品表
      ガーバーファイル
      基板に関してはこのガーバーファイルを直接使う事は止めてください。
      なお、基板(生基板)は 現在の手持ち分に限り 無料で差上げます。
      こちらの連絡先へメールをお送り下さい。

ホーム          カメラと写真        2025年4月11日更新 Taishi