<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet href="/assets/xslt/rss.xsl" type="text/xsl" media="screen" ?>
<rss version="2.0"
     xmlns:dc="http://purl.org/dc/elements/1.1/"
     xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
     xmlns:admin="http://webns.net/mvcb/"
     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
  <channel>
    <title>体重と今日食べたもの</title>
    <link>http://k1segawa.exblog.jp</link>
    <description>ダイエット</description>
    <dc:language>ja</dc:language>
    <dc:creator>k1segawa</dc:creator>
    <dc:rights>2026</dc:rights>
    <pubDate>Thu, 16 Jul 2026 10:55:21 +0900</pubDate>
    <dc:date>2026-07-16T10:55:21+09:00</dc:date>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <sy:updateBase>2013-06-01T12:00:00+00:00</sy:updateBase>
    <image>
      <title>体重と今日食べたもの</title>
      <url>https://pds.exblog.jp/logo/1/200407/08/80/a0034780.jpg</url>
      <link>http://k1segawa.exblog.jp</link>
      <width>80</width>
      <height>60</height>
      <description>ダイエット</description>
    </image>
    <item>
      <title>[マイクラ統合版] 家具アドオン [ガイドブック日本語翻訳] (7/16)</title>
      <link>http://k1segawa.exblog.jp/245356034/</link>
      <guid isPermaLInk="1">http://k1segawa.exblog.jp/245356034/</guid>
      <description><![CDATA[前記事<br />
[マイクラ統合版] 2026/7 期間限定 無料ウィークエンド開始！ [アドオン] (7/11) : 体重と今日食べたもの<br />
<br />
<br />
で購入しない方がいいと言ったが、下記の対策をすれば、とても綺麗でレシピも優しく、壊れないのでちょっと生産拠点をくつろげる場所にするのに、買ってもいいかも(75%オフなら安いし)。<br />
<br />
<br />
◇<br />
<br />
<br />
家具アドオン(Furniture Add-On)のガイドブックを開き・閉じると、<br />
バグで、その都度消えない透明エンティティ(ブロックではなく、動物や敵)が残ってしまう。<br />
<br />
<br />
なので、ガイドブックをイメージ取り込みして、日本語に訳した。<br />
<br />
<br />
これで二度と開かなくて済むようになる。<br />
<br />
<br />
<br />
<br />
【重要】<br />
ちなみに残ってしまった場合、実績解除が出来なくなるが、チートONにしてからそのチャンクに行き、読み込みが終わってからコマンドで、<br />
<br />
<br />
/kill @e[type=エンティティID]<br />
エンティティID=ees_furn:guidebook_hitbox<br />
<br />
<br />
を実行する。<br />
<br />
<br />
近くにいれば[type=…]は省略可能。<br />
<br />
<br />
◎ PCでチートフラグをOFFに戻すツール(NBT Editorなど)を使って、エクスポートした.mcworldを書き換えて、再度インポートすれば元に戻る(SwitchなどはReamls経由でPCへ持っていく)。<br />
<br />
<br />
【日本語版】<br />
<center><img src="https://pds.exblog.jp/pds/1/202607/16/80/a0034780_03381934.png" alt="_a0034780_03381934.png" class="IMAGE_MID" height="591" width="500" /></center><br />
<br />
<center><img src="https://pds.exblog.jp/pds/1/202607/16/80/a0034780_03383090.png" alt="_a0034780_03383090.png" class="IMAGE_MID" height="621" width="500" /></center><br />
<center><img src="https://pds.exblog.jp/pds/1/202607/16/80/a0034780_06295937.png" alt="_a0034780_06295937.png" class="IMAGE_MID" height="596" width="500" /></center><br />
<br />
<center><img src="https://pds.exblog.jp/pds/1/202607/16/80/a0034780_03384574.png" alt="_a0034780_03384574.png" class="IMAGE_MID" height="625" width="500" /></center><br />
<br />
<center><img src="https://pds.exblog.jp/pds/1/202607/16/80/a0034780_03384987.png" alt="_a0034780_03384987.png" class="IMAGE_MID" height="595" width="500" /></center><br />
<br />
<center><img src="https://pds.exblog.jp/pds/1/202607/16/80/a0034780_06300566.png" alt="_a0034780_06300566.png" class="IMAGE_MID" height="621" width="500" /></center><br />
<center><img src="https://pds.exblog.jp/pds/1/202607/16/80/a0034780_07102909.png" alt="_a0034780_07102909.png" class="IMAGE_MID" height="602" width="500" /></center><br />
<br />
<br />
<center><img src="https://pds.exblog.jp/pds/1/202607/16/80/a0034780_07103562.png" alt="_a0034780_07103562.png" class="IMAGE_MID" height="622" width="500" /></center><br />
<br />
<br />
<center><img src="https://pds.exblog.jp/pds/1/202607/16/80/a0034780_07104018.png" alt="_a0034780_07104018.png" class="IMAGE_MID" height="594" width="500" /></center><br />
<center><img src="https://pds.exblog.jp/pds/1/202607/16/80/a0034780_07104605.png" alt="_a0034780_07104605.png" class="IMAGE_MID" height="624" width="500" /></center><br />
<br />
<center><img src="https://pds.exblog.jp/pds/1/202607/16/80/a0034780_09314756.png" alt="_a0034780_09314756.png" class="IMAGE_MID" height="597" width="500" /></center><br />
<br />
<center><img src="https://pds.exblog.jp/pds/1/202607/16/80/a0034780_09321626.png" alt="_a0034780_09321626.png" class="IMAGE_MID" height="619" width="500" /></center><br />
<br />
<center><img src="https://pds.exblog.jp/pds/1/202607/16/80/a0034780_09323406.png" alt="_a0034780_09323406.png" class="IMAGE_MID" height="601" width="500" /></center><br />
<br />
<center><img src="https://pds.exblog.jp/pds/1/202607/16/80/a0034780_09325154.png" alt="_a0034780_09325154.png" class="IMAGE_MID" height="625" width="500" /></center><br />
<br />
<center><img src="https://pds.exblog.jp/pds/1/202607/16/80/a0034780_09332367.png" alt="_a0034780_09332367.png" class="IMAGE_MID" height="596" width="500" /></center><br />
<br />
<center><img src="https://pds.exblog.jp/pds/1/202607/16/80/a0034780_09334108.png" alt="_a0034780_09334108.png" class="IMAGE_MID" height="621" width="500" /></center><br />
<br />
<center><img src="https://pds.exblog.jp/pds/1/202607/16/80/a0034780_09335774.png" alt="_a0034780_09335774.png" class="IMAGE_MID" height="600" width="500" /></center><br />
<br />
<center><img src="https://pds.exblog.jp/pds/1/202607/16/80/a0034780_09342155.png" alt="_a0034780_09342155.png" class="IMAGE_MID" height="622" width="500" /></center><br />
<br />
これでガイドブックを全て翻訳したので、安心して家具アドオンを使える。<br />
(最初にメモ帳みたいなアイコンで入手するけど、すぐ捨てる事)<br />
<br />
<br />
<br />
<br />
]]></description>
      <dc:subject>未分類</dc:subject>
      <dc:creator>k1segawa</dc:creator>
      <pubDate>Thu, 16 Jul 2026 03:52:00 +0900</pubDate>
      <dc:date>2026-07-16T03:52:00+09:00</dc:date>
    </item>
    <item>
      <title>[マイクラ統合版] 2026/7 期間限定 無料ウィークエンド開始！ [アドオン] (7/11)</title>
      <link>http://k1segawa.exblog.jp/245343323/</link>
      <guid isPermaLInk="1">http://k1segawa.exblog.jp/245343323/</guid>
      <description><![CDATA[(2026/7/13 05:21追記)<br />
現在月曜朝でも無料なので8/4辺りまでは購入できるようだ。<br />
お試し期間は長い方がいいから早い方がいいけどね。<br />
<br />
<br />
■ 自然な景観(現実に近いなだらかな山や丘、平原のぐあい - バニラの急峻な山岳や谷間とは違う)が追加<br />
<br />
<br />
1. Realistic Bioms Add-Onが追加されている。<br />
これは軽いのにバニラの景観を自然に近づけるアドオンで、地形生成系。<br />
※ ＋αで、バイブラントビジュアルが無くとも影MOD的な湿地帯の霧や雨しぐれも掛かる。<br />
太陽や月が大きくなり、動物等はバニラのまま(土が少し動的になる)でなじみやすい。<br />
夜、手に松明を持つと明るくなるので、ピースフルで流星や一番星を見ながら散策するのが楽しい。<br />
※ 山々の遠景を高高度で眺められるくらいになってから入れるべきアドオンで、序盤は不要。<br />
<br />
<br />
33%オフ 660円(本来990マインコイン)<br />
18MB<br />
実績解除も出来る。<br />
SwitchやPS5などのコンシュマー機に優しい。<br />
バニラを大きく変化させないが、松明の光の広がり方が丁寧でセンスがある。<br />
<br />
<br />
2. マッシュアップだが、絶対的な自然な景観にこだわるなら(新規バイオーム追加ではなく)、Realism Craftも重いけど良い。<br />
180MBと圧倒的な容量だ。<br />
新規作成となる。<br />
※ バイブラントビジュアル無しだと霧、遠景暗転(遠くほど暗くなる表現)は掛からない。遠景の不透明(大気を通した)は掛かる。<br />
その代わり、動的なリアルさ(風や草の揺れ、流れ星、新たな動物 - かたつむりとか渡り鳥、蝶々等）が追加され、バニラの「一人寂しい」感じが軽減されるｗｗｗ<br />
技術的にはスゴイ。<br />
でも、松明の光の広がり方などで分かるし、動物の顔がなぜバニラがあれなのか、理解していないし、子供の落書きみたいだ。<br />
(少しアホっつぽいし、少しデジタルっぽいのがマイクラに合う - リアルでないのが良い。ギリギリ公式のひよこまで)<br />
<br />
<br />
PC向けか。<br />
33%オフ 1100円(本来1690マインコイン)<br />
<br />
<br />
注：<br />
２は実績解除が無効になるので注意。<br />
だがそれも納得の出来だ。<br />
なぜならツールや武器、ボスや動物、さらにアクションの変更まで追加されるから。<br />
バニラのテクスチャも書き換えられて、違和感も少ない(Action&amp;Staffに比べて明るいファンタジーっぽくない)。<br />
バイブラントビジュアル無しでも十分だ。<br />
これだけ入って1100円は個別に買うより安い。<br />
中盤以降でもう実績解除は苦しくなって、テクスチャやアクションの変更に抵抗が無く、新しい変化を求めるPC勢ならおすすめだ。<br />
<br />
<br />
注：<br />
１も２もだが、リソースパックで出てこない時は、<br />
最初のメニュー(マイクラ終了が出来る画面)<br />
＞マーケットプレイス<br />
＞ライブラリ(自分の購入したアドオン)<br />
＞検索ボックスで"Realism"や"Realistic Biom"と検索<br />
＞左の欄から追加コンテンツ<br />
＞スクロールして探してクリック<br />
＞無料ウィークエンド！ボタンを押す<br />
＞既存と新規<br />
のどちらかを選ぶと追加可能。<br />
<br />
<br />
日替わりで追加されていくのかな？<br />
<br />
<br />
<br />
<br />
あと、家具アドオンが75%オフで330円だが、<br />
有名海外アドオン評価配信者によると、<br />
FURNITURE ADDON Works with ANY Texturepack in Minecraft Bedrock Edition - YouTube<br />
<br />
<br />
バグがあって、ガイドブックを開き閉じると、ガイドブックのあった場所(３ブロック - それも変な配置で。横２と斜め手前に1個)に透明な破壊不可能エンティティ(モブ判定)が残ってしまい、どうしようも出来なくなるとの事。<br />
1年前の事だが、本日購入したが直っていなかった。残念。<br />
(このスタジオはものすごい数出してて、たぶん直す気は無い)<br />
なので購入しない方がいい(別のクリエイティブワールドでガイドブックを開いて調べ、メインでは絶対開かないくらいの気持ちでやらないと)。<br />
<br />
<br />
(2026/7/16追加)<br />
[マイクラ統合版] 家具アドオン [ガイドブック日本語翻訳] (7/16) : 体重と今日食べたもの<br />
で、ガイドブックを画像付きで日本語訳したので、ガイドブックは開かなくて良くなった。<br />
(おわり)<br />
<br />
<br />
動画の中で、家具の素材部分をオリジナル素材の2色で塗り分けられるのと、その素材部分2種類をバニラ素材から指定できるという、画期的(木と布のペイントブラシ)とは褒めているが。<br />
実績解除をあきらめれば、チートONで、/kill @n(最も近くのエンティティ)で削除可能。<br />
<br />
<br />
(おわり)<br />
<br />
<br />
2026年7月11日(日本時間12時現在)から、サマーセールの一環で、24日間14時間(8月4日か5日くらいまで)の無料アドオンが追加されている。<br />
<br />
<br />
<center><img src="https://pds.exblog.jp/pds/1/202607/11/80/a0034780_12432616.png" alt="_a0034780_12432616.png" class="IMAGE_MID" height="270" width="480" /></center><br />
<br />
<br />
期間限定なので、フル機能が遊べるが8月4日前後になると動作しなくなるので、続けて遊ぶ場合はそのアドオンを買うか、マーケットプレイス パスへの加入が必要となる。<br />
<br />
<br />
とりあえず、ダウンロードしておいて、新規ワールドで試してみると良い。<br />
(既存のワールドには気に入るまで適用(インポート)しない)<br />
<br />
<br />
ダウンロードするアドオンの一覧だ。<br />
<br />
<br />
・ エターナルエンド<br />
・ 居住者 2.1<br />
・ Cut the Rope<br />
・ アイテム合成追加コンテンツ<br />
・ Jetpacks<br />
・ MOB LIGHTS<br />
・ Traning Dummies<br />
・ アルティメットブラスターズ<br />
・ PVP Add-On<br />
<br />
<br />
33%オフの物もあり、元々1300円くらいから430円程度まで色々。<br />
<br />
<br />
8月4日前後で無効になったら、リソースパックからの削除＋ストレージのキャッシュクリアをすればクリーンになる。<br />
<br />
<br />
居住者 2.1は有名なホラーアドオンだし、PVPも老舗だ。<br />
簡単なCut the Ropeでファンタジーっぽくなったり、Jetpacksで宇宙にロケットを飛ばしたり、アルティメットブラスターズで武器強化しても面白い。<br />
<br />
<br />
どれも評価が高いし、24日間あるから、じっくり楽しんでみると良い。<br />
(無料ウィークエンドなので本日の週末土曜日だけのダウンロードかもしれない←7/13月曜でも無料のままだったのでまだまだ大丈夫→7/15水曜でマーケットプレイス パスへの加入ボタンに変わっていたのでやはり週末だけの一時的な体験版だったようだ)<br />
<br />
<br />
★ 普通のリソパのように恒久的にPC内などに保存されるのではなく、その都度マケプレから「無料ウィークエンド！」ボタンで追加する(追加するワールドを既存or新規から選ぶ)。<br />
追加したワールド内にはアドオンとして残っているが、リソパとしては表示されない。表示されなくても入ってはいる。<br />
<br />
<br />
]]></description>
      <dc:subject>マイクラ</dc:subject>
      <dc:creator>k1segawa</dc:creator>
      <pubDate>Sat, 11 Jul 2026 12:38:00 +0900</pubDate>
      <dc:date>2026-07-11T12:38:00+09:00</dc:date>
    </item>
    <item>
      <title>[マイクラ統合版] XPクリスタルバンク [330円アドオン] (7/8)</title>
      <link>http://k1segawa.exblog.jp/245334302/</link>
      <guid isPermaLInk="1">http://k1segawa.exblog.jp/245334302/</guid>
      <description><![CDATA[XPクリスタルバンク を買ってみた。<br />
<br />
<br />
死亡で失われる経験値を、あらかじめ保存・引き出せるアドオンだ。<br />
<br />
<br />
ホットバーに全ての追加アイテムを示す。<br />
<br />
<br />
<center><img src="https://pds.exblog.jp/pds/1/202607/08/80/a0034780_16274440.png" alt="_a0034780_16274440.png" class="IMAGE_MID" height="65" width="463" /></center>(XPバンク｜XPパーソナル｜XPディスペンサー｜ガイドブック｜wiki｜ハンマー｜バール｜レンチ｜空き)<br />
<br />
<br />
<br />
<br />
【先に結論】<br />
<br />
<br />
サバイバル初期を楽にはしてくれない。実質中盤以降。<br />
<br />
<br />
理由：レシピにネザーアイテムが必要なので、聖職者か醸造台の村を探すか、ネザーに行かないといけない。<br />
初心者ソロ(自分も)は購入注意。<br />
マルチプレイの場合、経験値が共有なのがメリット(ベテランに助けてもらえる)。<br />
<br />
<br />
<br />
<br />
【目的】<br />
<br />
<br />
余った経験値がもったいなかったので、アイテム回復ただ一点のために購入した。<br />
(天空トラップタワー作成後かつ修繕のエンチャント後)<br />
<br />
<br />
評価が高いのはマルチか、唯一無二のオーブ排出と経験値無限化やXPが保存出来る持ち運びアイテムがある点。<br />
<br />
<br />
<br />
<br />
<br />
◇◇◇<br />
<br />
<br />
<br />
<br />
<br />
☆ アイテム一覧<br />
<br />
<br />
XPバンク ・・・ 経験値を預ける・引き出す<br />
XPパーソナル アカウント ・・・ 個人用XPバンク持ち運び用<br />
XPディスペンサー ・・・ 経験値オーブとして排出する(修繕用)<br />
<br />
<br />
ハンマー ・・・ XPバンク類をアイテム化<br />
バール ・・・ XPバンク類を移動<br />
レンチ ・・・ XPバンク類を回転<br />
<br />
<br />
ガイドブック ・・・文字のみの使用説明書(レシピ等)<br />
wiki ・・・ 絵による概念図(1ページ)<br />
<br />
<br />
<br />
<br />
☆ レシピ<br />
<br />
<br />
■1. XPバンク<br />
<br />
<br />
グローストーンの粉：1<br />
金インゴット：2<br />
エメラルドブロック：1<br />
黒曜石：3<br />
<center><img src="https://pds.exblog.jp/pds/1/202607/08/80/a0034780_16312360.png" alt="_a0034780_16312360.png" class="IMAGE_MID" height="144" width="309" /></center><br />
設置して、<br />
叩く(左クリック)：全預け入れ(保存)<br />
使う(右クリック)：全または一部引き出し(中断あり)<br />
対象は経験値。預け入れは全部だが、引き出しは再度右クリックで中断可能(3レベル/秒ぐらいで速い)。<br />
20分毎に利息が付く。<br />
経験値をたくさん入れて長時間放っておけば実質無限化出来る。<br />
<br />
<br />
移動には、あとの「ハンマー」が必要で、「右クリック」でアイテム化する。<br />
<br />
<br />
<br />
<br />
<br />
グローストーンは、聖職者と取引で入手する。<br />
またはネザーへ行く。<br />
<br />
<br />
黒曜石はダイヤのつるはしが必要だが、ピラミッドや壊れたネザーゲートで入手できるかも。<br />
<br />
<br />
XPバンクは全プレイヤー共用で、どこでも誰でも預けられ、どこでも誰でも引き出せる。<br />
<br />
<br />
ワールドに複数あってもよい(リンクしている)。<br />
マルチプレイでサブアカウントから預けてもよい。<br />
<br />
マルチプレイの時、他のプレイヤーが保存した経験値を使う事が出来る。<br />
<br />
<br />
<br />
<br />
<br />
経験値オーブを吸収する事はできない。<br />
<br />
<br />
(オーブはプレイヤーしか吸収できない)<br />
<br />
<br />
<br />
<br />
<br />
<br />
■2. XPパーソナル アカウント<br />
<br />
<br />
エメラルド：4<br />
レッドストーンの粉：1<br />
<br />
<br />
<center><img src="https://pds.exblog.jp/pds/1/202607/08/80/a0034780_16594152.png" alt="_a0034780_16594152.png" class="IMAGE_MID" height="145" width="308" /></center><br />
<br />
個人用XPバンク。<br />
持ち運び用で設置は出来ない。<br />
レシピが簡単なので、死亡時の備えとしては有能。<br />
<br />
<br />
使う(右クリック)：次の画面を表示し、保存と引き出しが可能。<br />
<br />
<br />
<center><img src="https://pds.exblog.jp/pds/1/202607/08/80/a0034780_17075349.png" alt="_a0034780_17075349.png" class="IMAGE_MID" height="220" width="266" /></center>(つづき)<br />
…友達と XPを共有し、さらに毎日利息を獲得したい方は「XPクリスタルバンク」をぜひご利用ください。<br />
<br />
<br />
XPバンクとは別。利息も付かない。<br />
次に示す「XPディスペンサー」に経験値を供給することは出来ない。<br />
<br />
<br />
※ 名前にアカウントと付いているが、同じアカウントなら別のワールドでも経験値が引き継げるわけではない。<br />
<br />
<br />
<br />
<br />
■3. XPディスペンサー<br />
<br />
<br />
エメラルド：4<br />
金インゴット：4<br />
XPバンク：1<br />
<center><img src="https://pds.exblog.jp/pds/1/202607/08/80/a0034780_17171062.png" alt="_a0034780_17171062.png" class="IMAGE_MID" height="141" width="311" /></center><br />
<br />
<br />
XPバンクに貯まっている経験値を、経験値オーブに戻して排出する。<br />
修繕したい武器などを回復する事が出来る。<br />
<br />
<br />
叩く(左クリック)：排出開始・途中終了<br />
使う(右クリック)：同上<br />
<br />
<br />
<br />
経験値オーブが出なくなると終了する。<br />
<br />
<br />
演算距離4チャンクを超えても排出可能。たぶんワールド全域で利用可能。<br />
<br />
<br />
XPバンクはインベントリ内やチェストにしまっていてもOK。<br />
<br />
<br />
<br />
移動は「ハンマー」で「右クリック(使う)」が必要。<br />
<br />
<br />
設置した様子はXPバンクと似ている。XPバンクは前にアメリカ連邦銀行みたいなマーク(パルテノン神殿の柱)が付いているので、近寄って正面を見るか、<br />
少し遠くからだと、正確に上下対称なひし形のがXPディスペンサーで、四角錐(すい)のような少し下半身が小さいのがXPバンク。<br />
<center><img src="https://pds.exblog.jp/pds/1/202607/08/80/a0034780_20024348.png" alt="_a0034780_20024348.png" class="IMAGE_MID" height="301" width="500" /></center>(左がXPバンク、右がXPディスペンサー)<br />
<br />
<br />
<br />
<br />
■4. ハンマー<br />
<br />
<br />
丸石：1<br />
木の棒：1<br />
<center><img src="https://pds.exblog.jp/pds/1/202607/08/80/a0034780_18191749.png" alt="_a0034780_18191749.png" class="IMAGE_MID" height="146" width="308" /></center><br />
設置したアイテムをアイテム化する(移動)。<br />
<br />
<br />
XPバンク、XPディスペンサー、wikiが対象。<br />
<br />
<br />
右クリック(使う)である点に、注意。<br />
<br />
<br />
<br />
<br />
■5. バール<br />
<br />
<br />
木の棒：2<br />
鉄インゴット：2<br />
<center><img src="https://pds.exblog.jp/pds/1/202607/08/80/a0034780_18234119.png" alt="_a0034780_18234119.png" class="IMAGE_MID" height="143" width="309" /></center><br />
<br />
設置したアイテムをその場で「前後に」移動する。<br />
右クリック(使う)：後ろ<br />
左クリック(叩く)：前<br />
<br />
<br />
左右に動かしたい場合は、面倒だが設置したアイテムの横に回って、そちらからクリックする必要がある。<br />
<br />
<br />
<br />
<br />
■6. レンチ<br />
<br />
<br />
原木：1<br />
木の棒：1<br />
<center><img src="https://pds.exblog.jp/pds/1/202607/08/80/a0034780_18294485.png" alt="_a0034780_18294485.png" class="IMAGE_MID" height="144" width="308" /></center>設置したアイテムを回転する。<br />
右クリック(使う)：右回転<br />
左クリック(叩く)：左回転<br />
<br />
<br />
8回で元に戻る。<br />
(XPバンクの場合)<br />
<br />
<br />
<br />
<br />
■7. ガイドブック<br />
<br />
<br />
本：1<br />
エメラルド：1<br />
<center><img src="https://pds.exblog.jp/pds/1/202607/08/80/a0034780_18370561.png" alt="_a0034780_18370561.png" class="IMAGE_MID" height="142" width="307" /></center>使用説明書。<br />
アドオン有効化後、最初に与えられる。<br />
<br />
<br />
最初のページの、翻訳がまだ不安定。<br />
<br />
<br />
説明内容はレシピぐらい。<br />
<br />
<br />
<br />
<br />
■8. wiki<br />
<br />
<br />
紙：1<br />
エメラルド：1<br />
グローストーンの粉：1<br />
<center><img src="https://pds.exblog.jp/pds/1/202607/08/80/a0034780_18435239.png" alt="_a0034780_18435239.png" class="IMAGE_MID" height="142" width="307" /></center><br />
図解1ページのみ。<br />
ツールは3つ。<br />
叩く(パンチ)と使う(インタラクト)。<br />
<center><img src="https://pds.exblog.jp/pds/1/202607/08/80/a0034780_18502810.png" alt="_a0034780_18502810.png" class="IMAGE_MID" height="255" width="458" /></center><br />
最初正面でなく右斜め横に配置されてしまう。一回見たら削除する。<br />
<br />
<br />
閉じるためには、ハンマー・右クリックが必要なので注意。<br />
<br />
<br />
<br />
<br />
☆ 注意<br />
<br />
<br />
XPパーソナルを持っていくと、わざわざXPバンクの所に行かなくとも保存は可能。<br />
<br />
<br />
<br />
<br />
XPディスペンサーは0.5レベル/秒くらいのゆっくりな速度で経験値オーブを出す。<br />
<br />
<br />
サバイバル初期ではXPバンク自体の作成負荷が重いので(ネザーアイテム)、結局楽にはならない。<br />
<br />
<br />
<br />
<br />
☆ 結果<br />
<br />
<br />
このアドオンは、中盤以降の経験値トラップで余るくらいの経験値を入手可能なレベルの人が買うか、<br />
よく死んで経験値を無駄にする人が買う。<br />
つまり、やりこんでる人には刺さる。<br />
<br />
<br />
細々とXPパーソナルで保存したり、XPバンクで無限化したり。<br />
<br />
<br />
ただ初心者には優しくない(運よく村人やピラミッドがあればOK)。<br />
<br />
<br />
<br />
<br />
☆ 感想<br />
<br />
<br />
マイクラ統合版の序盤難易度を、優しくし過ぎないようアドオンの作成負荷を高くする事でコントロールしてるMS・モヤングの方針が変わらない限り仕方がない(難しいからそれを乗り越えた時ハマる)。<br />
<br />
<br />
コントロールしている物<br />
移動スピードや強さや防御力、入手難易度など<br />
<br />
<br />
]]></description>
      <dc:subject>マイクラ</dc:subject>
      <dc:creator>k1segawa</dc:creator>
      <pubDate>Wed, 08 Jul 2026 06:31:00 +0900</pubDate>
      <dc:date>2026-07-08T06:31:00+09:00</dc:date>
    </item>
    <item>
      <title>[PC-G850V] ポケコンでI2C通信 - Gemini Cソース 校正 (6/22)</title>
      <link>http://k1segawa.exblog.jp/245319140/</link>
      <guid isPermaLInk="1">http://k1segawa.exblog.jp/245319140/</guid>
      <description><![CDATA[(2026/6/24追加)<br />
メインにコマンド入力機能追加。ウエイト時間の問題＞各pio系関数毎にウエイト追加。液晶クリアのみウエイト増加(液晶用lcd_commandウエイト短縮)<br />
(おわり)<br />
<br />
<br />
前回の記事で、Geminiが割とあっさり動作するコードを教えてくれた。<br />
<br />
<br />
☆１<br />
　<br />
自分が最初に書いたソースは、<br />
pioset関数とpioput関数を必ず1組のペアとして発行するソースだった(pioputで出力ピンの連続設定は除く)のだが、<br />
<br />
<br />
Geminiが教えてくれたソースは、<br />
pioset関数のみで入力切り替えだけして、入力に指定したピンが繋がっているSDA/SCLポートを、Hiにする方法だった。<br />
同様に、Lowにするのもpioput関数だけで０を指定し、元々1だった入力ピンに繋がっていたSDA/SCLポートを0(Low)にする。<br />
<br />
<br />
別に組で使わなくても行ける場合もある事を教えてくれた。<br />
<br />
<br />
それで実際動作しているので、ユーザマニュアルには書かれていない、自分が勝手に解釈して間違っていた、正しいピンの使い方なのだろう。<br />
<br />
<br />
根拠はたぶん他にあるPC-G850Gのソフトのソース。<br />
<br />
<br />
それも、pioをC言語でアクセスするソース。<br />
<br />
<br />
pio系関数は、Sharpの内部ROM上のライブラリのAPI(IOCS)なので、z88dkなどからの外部ライブラリでは呼び出せないはず(pio系関数のような形では)。<br />
<br />
<br />
とすると、ポケコンのC言語で組んだアプリで、ポートアクセスするアプリとはなんだろう？<br />
<br />
<br />
PC-E500(メモリマップドI/O)の非Z80系CPU、PC-E200やPC-G850VのZ80系CPUのForthとかあるけど、あれはポートアクセスも出来るはずだから、そこが参照元ソースなのか？<br />
<br />
<br />
ポートアクセスできる言語をインプリメントしたアプリなら、それも参考になるから、PC-E500用のBACICコンパイラがあるからそれも、ポートアクセス機能(メモリマップドI/Oだから直接はpio関数との類推は出来ないと思うが)があれば、元ソースにはなる？<br />
<br />
<br />
どうやってAIは正しいソースを得たのだろう。<br />
<br />
<br />
そして、最初の検討時に、ChatGPTに抵抗の付け方を聞いた際に、プルアップならどんなポートアクセスが普通か例を示してもらったら、piosetとpioputの組で示されて、自分でもそうだと思っていたから、そのまま補強材料として、必ずペアで発行する物だと思ってしまった。<br />
<br />
<br />
ChatGPTは部分的に、Geminiは全体の課題として、質問を投げかけたのでこんな違いが出たのだろう。<br />
pio関数をペアでソース組んでる時は、相手側はデジタル回路ではなく、スイッチとLEDの回路だったからそれでも動いたのかもしれない。<br />
<br />
<br />
なかなかAIも使い方が難しいな。<br />
<br />
<br />
☆2<br />
<br />
<br />
Geminiのソースも、そのままでは余りにも状態変化が遅すぎたので、ウエイト時間の調整など入れなければ実用には厳しかった。<br />
ただ、確実にウエイトが長い方が、動作は安定していた。<br />
ウエイトの短縮は、試行錯誤して決めたものだった。<br />
(10→5に半分にするのは何とか良くて、10→2とかにすると動作しなかった)<br />
<br />
<br />
なので、Geminiも完ぺきではない。<br />
<br />
<br />
今も不安定でうまくいかない時もある。<br />
ただリセットしたり、繰り返したりすると動作するので、前提とする回路に問題があるのではないかと疑っている。<br />
<br />
<br />
これはデジタル回路の基本で、DIP型の標準ICを探している時に、最近もっとも使われているICの種類を聞いて出てきたのが、CMOS(MOSFET)回路だった。<br />
この回路の使用上の注意を聞いたら、ピンにシュミットトリガやパスコンを入れて、立ち上がりや立下りが遅い周波数のCPUや、ノイズ信号の対策をすべきと出てきた。<br />
<br />
<br />
今のSDA/SCLポートはシュミットトリガーを入れて、綺麗な矩形波にした方がいいのかもしれないし、GNDにもパスコンを入れた方がいいのかもしれない。<br />
<br />
<br />
そういうことがわかってきて、自分やGeminiに提案した時の前提回路が、実はCMOSの弱点までカバーできていないのかもしれないと思いついた。<br />
<br />
<br />
☆3<br />
<br />
<br />
また、Geminiのソースは2回に分けて聞いたためか、ウエイト関数が重複している(i2c_waitとdelay_ms)。<br />
<br />
<br />
この冗長性が必要なのか、かえって動作を不安定にしてしまっているのかが分からない。<br />
<br />
<br />
やはりそれを指摘するには、I2Cの知識が必要で、やっぱり全く知らない部分をAIに作ってもらっても、正しいか判断できないし、修正プロンプトも作成できない。<br />
<br />
<br />
☆4<br />
<br />
<br />
なんやかんやで、まだ完ぺきではない。<br />
<br />
<br />
今はI2Cをコマンド入力できるようにして、シェルのようにその場でダイレクト入力してテストしている。<br />
<br />
<br />
そこでもたまに失敗するので、本当はpio系関数を呼び出しているところ全部に、ウエイトが足りないのではないかと疑問視している。<br />
(Z80のC言語であっても、pio系関数の連続呼び出しは、SDAとSCLの立ち上がり時間の差のMINが十分短すぎるのかもしれないと考えている)<br />
<br />
<br />
☆☆☆<br />
<br />
<br />
今のコマンド入力可能なソースはこちら：<br />
<br />
// 保持時間用のウェイト関数（長めにとっています）<br />
int i2c_wait(int c) {<br />
    int a,i; // コンパイラ最適化防止のvolatileがないのでa+=i;returnで代用<br />
    a=0;<br />
<br />
    for(i = 0; i &lt; c; i++) a+=i;<br />
<br />
    return a; <br />
}<br />
<br />
// I2C スタート条件を出力する関数<br />
void i2c_start() {<br />
    int rtn;<br />
<br />
    // 1. 初期状態：両方のピンを入力に設定し、プルアップ抵抗で確実に「Hi」にする<br />
    pioset(0x03);   // bit0(SDA)=1, bit1(SCL)=1 を入力に<br />
    rtn=i2c_wait(5);<br />
<br />
    // 2. 先に「出力」に切り替えてから、SDA（4ピン）を「Lo」に落とす<br />
    //    SCLは入力（Hi）を維持したまま、SDAだけが「Hi → Lo」になります（スタート条件）<br />
    pioset(0x02);   // bit0(SDA)=0(出力), bit1(SCL)=1(入力のままHi)<br />
    rtn=i2c_wait(5);<br />
    pioput(0x00);   // bit0(SDA)=0(Loに落とす)<br />
    rtn=i2c_wait(5);<br />
<br />
    // 3. 次にSCL（5ピン）も「出力」に切り替えて「Lo」に落とす<br />
    //    これで両方のピンがLoに固定され、データ送信の準備が整います<br />
    pioset(0x00);   // bit1(SCL)も0(出力)にする<br />
    rtn=i2c_wait(5);<br />
    pioput(0x00);   // bit1(SCL)=0(Loに落とす)<br />
    rtn=i2c_wait(5);<br />
}<br />
// 1バイトデータを送信し、液晶からのACK（0=成功, 1=失敗）を返す関数<br />
// ※事前のスタート条件により、SCL=Lo, SDA=Lo (両方出力) から始まる前提です<br />
int i2c_write_byte(unsigned char data) {<br />
    int i,w;<br />
    int ack_bit;<br />
    int rtn;<br />
    unsigned char bit_val;<br />
<br />
    // --- 1〜8ビット目のデータ送信ループ ---<br />
    for(i = 0; i &lt; 8; i++) {<br />
        // MSBファースト（最上位ビットから順に）データを取り出す<br />
        // 送るビットが1ならHi(0x01)、0ならLo(0x00)<br />
        if((data &amp; 0x80))<br />
            bit_val = 0x01;<br />
        else<br />
            bit_val = 0;<br />
        // bit_val = (data &amp; 0x80) ? 0x01 : 0x00;→三項演算子がないので<br />
        data &lt;&lt;= 1; // 次のビットのために左シフト<br />
<br />
        // SCL=Loの状態で、SDAの出力を変更する<br />
        pioput(bit_val); <br />
        rtn=i2c_wait(5);<br />
<br />
        // SCLをHiにして液晶にデータを読み込ませる<br />
        // （SCLを1にするために、入力(開放)ではなく、出力のままHiにするのが確実です）<br />
        // ※bit1(SCL)を1にするため、SDAの状態(bit0)と合わせる<br />
        pioput(bit_val | 0x02);<br />
        rtn=i2c_wait(5);<br />
<br />
        // SCLをLoに戻す<br />
        pioput(bit_val);<br />
        rtn=i2c_wait(5);<br />
    }<br />
<br />
    // --- 9ビット目：液晶からのACK（応答）を確認する処理 ---<br />
    // 1. まずSDA(4ピン/bit0)を入力モードに切り替えて、液晶が自由にSDAをLoにできるようにする<br />
    //    SCL(5ピン/bit1)は出力モード(0)のまま維持します<br />
    pioset(0x02); // bit0=1(入力), bit1=0(出力)<br />
    rtn=i2c_wait(5);<br />
<br />
    // 2. クロック(SCL)をHiにする<br />
    pioput(0x02); // bit1(SCL)=1<br />
    rtn=i2c_wait(5);<br />
<br />
    // 3. この「SCLがHi」のタイミングで、液晶がSDAをLoに引き下げているかをpiogetで確認する<br />
    //    bit0(SDA)が0（Lo）なら液晶が正常にデータを受け取った合図(ACK)です<br />
    w = pioget();<br />
    if ((w &amp; 0x01) == 0) {<br />
        ack_bit = 0; // ACK成功（正常）<br />
    } else {<br />
        ack_bit = 1; // NACK失敗<br />
    }<br />
<br />
    // 4. クロック(SCL)をLoに戻す<br />
    pioput(0x00); // bit1(SCL)=0<br />
    rtn=i2c_wait(5);<br />
<br />
    // 5. 次の通信に備えて、SDA(4ピン)を再び出力モード(0)に戻しておく<br />
    pioset(0x00); // 両方出力モードへ<br />
    rtn=i2c_wait(5);<br />
<br />
    return ack_bit; // 0なら液晶が正しく認識しています<br />
}<br />
// I2C ストップ条件を出力する関数<br />
void i2c_stop() {<br />
    int rtn;<br />
    // 1. 最初は両方「Lo（出力）」の状態で、ピンが確実にLoであることを確認する<br />
    pioset(0x00);   // 両方出力モード<br />
    rtn=i2c_wait(5);<br />
    pioput(0x00);   // 両方Lo<br />
    rtn=i2c_wait(5);<br />
<br />
    // 2. まずSCL（5ピン）だけを「入力」に切り替えて、プルアップ抵抗の力で「Hi」にする<br />
    //    SDAはLo（出力）を維持したまま、SCLだけが先に「Hi」になります<br />
    pioset(0x02); // 注0x01-&gt;0x02   // bit0(SDA)=0(出力のまま), bit1(SCL)=1(入力にしてHiへ)<br />
    rtn=i2c_wait(5);<br />
<br />
    // 3. 最後にSDA（4ピン）も「入力」に切り替えて、プルアップ抵抗の力で「Hi」にする<br />
    //    「SCLがHi」の状態で、SDAが「Lo → Hi」へ立ち上がります（ストップ条件成立）<br />
    pioset(0x03);   // bit0(SDA)=1(入力にしてHiへ), bit1(SCL)=1(入力のまま)<br />
    rtn=i2c_wait(5);<br />
}<br />
// 1つのレジスタにデータを書き込む補助関数<br />
void i2c_write_reg(unsigned char slave_addr, unsigned char reg_addr, unsigned char data) {<br />
    i2c_start();<br />
    i2c_write_byte(slave_addr &lt;&lt; 1); // スレーブアドレス＋Writeビット(0)<br />
    i2c_write_byte(reg_addr);        // 操作したいレジスタ番号<br />
    i2c_write_byte(data);            // 設定データ<br />
    i2c_stop();<br />
}<br />
<br />
// バックライトを単独で光らせる関数<br />
// r, g, b には 0(消灯) 〜 255(最大輝度) を指定します。<br />
void set_backlight_rgb(unsigned char r, unsigned char g, unsigned char b) {<br />
    // 1. バックライトICの初期化（スレーブアドレス: 0x62）<br />
    // MODE1(レジスタ0x00) と MODE2(レジスタ0x01) を通常動作モードに設定<br />
    i2c_write_reg(0x62, 0x00, 0x00); // MODE1 を 0x00 に<br />
    i2c_write_reg(0x62, 0x01, 0x00); // MODE2 を 0x00 に<br />
<br />
    // 2. LEDの出力状態を設定（レジスタ0x08）<br />
    // 各LEDピンを「PWMによる個別輝度制御モード」に割り当てます<br />
    i2c_write_reg(0x62, 0x08, 0xAA); // LEDOUT を 0xAA に<br />
<br />
    // 3. 各色の輝度を設定（各色専用のPWMレジスタ）<br />
    // ※Grove LCDの仕様上、レジスタ2=青, 3=緑, 4=赤 に割り当てられています<br />
    i2c_write_reg(0x62, 0x04, r);    // レジスタ0x04 = RED<br />
    i2c_write_reg(0x62, 0x03, g);    // レジスタ0x03 = GREEN<br />
    i2c_write_reg(0x62, 0x02, b);    // レジスタ0x02 = BLUE<br />
}<br />
<br />
// 液晶専用のミリ秒単位の長いウェイト関数<br />
void delay_ms(int ms) {<br />
    int i, j; // volatileを削除<br />
    for(i = 0; i &lt; ms; i++) {<br />
        for(j = 0; j &lt; 80; j++); // 環境に合わせて1ミリ秒になるよう調整してください<br />
    }<br />
}<br />
// 液晶（0x3E）に「コマンド」を1バイト送る補助関数<br />
void lcd_command(unsigned char cmd) {<br />
    i2c_start();<br />
    i2c_write_byte(0x3E &lt;&lt; 1); // スレーブアドレス＋Write(0) = 0x7C<br />
    i2c_write_byte(0x00);      // コントロールバイト（0x00 = 次のバイトはコマンド）<br />
    i2c_write_byte(cmd);       // コマンド本体<br />
    i2c_stop();<br />
    delay_ms(2);               // 液晶の処理待ち（基本2ms空ければ安全です）<br />
}<br />
// 液晶文字側（0x3E）の初期化関数<br />
void init_lcd_display() {<br />
    // 1. 電源立ち上がり直後の安定待ち<br />
    delay_ms(2);<br />
<br />
    // 2. ファンクションセット（基本設定）<br />
    // 0x38 = 8ビットモード, 2行表示, 5x8ドットフォント<br />
    lcd_command(0x38);<br />
    delay_ms(5); // 少し長めに待つ<br />
<br />
    // 3. ディスプレイON/OFF制御<br />
    // 0x0C = ディスプレイON, カーソルOFF, カーソル点滅OFF<br />
    // ※このコマンドが成功すると、薄い四角いブロック（背景）が消えます<br />
    lcd_command(0x0C);<br />
<br />
    // 4. 画面クリア<br />
    // 0x01 = ディスプレイ表示クリア（画面を真っ白にする）<br />
    lcd_command(0x01);<br />
    delay_ms(8); // クリア処理は時間がかかるため長めに待つ<br />
<br />
    // 5. エントリーモードセット<br />
    // 0x06 = 文字を書いた後、カーソルを自動で右に移動（画面スライドなし）<br />
    lcd_command(0x06);<br />
}<br />
// 液晶（0x3E）に文字を1文字表示する関数<br />
void lcd_putchar(char ascii_code) {<br />
    i2c_start();<br />
    i2c_write_byte(0x3E &lt;&lt; 1); // スレーブアドレス（0x7C）<br />
    i2c_write_byte(0x40);      // コントロールバイト（0x40 = 次のバイトは文字データ）<br />
    i2c_write_byte(ascii_code); // 表示したい文字のASCIIコード<br />
    i2c_stop();<br />
    i2c_wait(5);                // 液晶の書き込み待ち<br />
}<br />
<br />
// 連続して文字列を表示する関数<br />
void lcd_print(char *str) {<br />
    while(*str) {<br />
        lcd_putchar(*str++);<br />
    }<br />
}<br />
<br />
main()<br />
{<br />
    int rtn;<br />
    FILE* fp;<br />
    // 文字列モード：/の後は行末または/まで文字とみなす(1)//は/ 0は16進2桁やStart(S)/Stop(E)<br />
    int smode;<br />
    // HEX文字1文字目(1)<br />
    int hmode;<br />
    int i;<br />
    char instr[256];<br />
    char *r;    // fgets用<br />
    char c;     // 1文字ワーク<br />
    unsigned char w,hex;    // ワーク、HEX1バイトワーク<br />
<br />
    // 11ピンをパラレルでオープンする<br />
    fp = fＯpen("pio","a+"); //←タグの関係でoが全角大文字だが半角小文字にする<br />
<br />
    // バックライトを「白色（最大輝度）」で単独点灯させる<br />
    set_backlight_rgb(255, 255, 255);<br />
<br />
    // 液晶文字側（0x3E）の初期化関数<br />
    init_lcd_display();<br />
<br />
    // 液晶（0x3E）に文字を1文字表示する関数<br />
    lcd_putchar((char)'A');<br />
<br />
    while(1)<br />
    {<br />
        // 入力待ち<br />
        printf("&gt;");<br />
        r = fgets(instr,sizeof(instr),stdin);<br />
<br />
        if(*r==0) exit(1);   // エラー終了<br />
        if(instr[0]==0x0A) exit(1); // Enterのみでループ終了<br />
<br />
        // 文字列判定<br />
        i=0;<br />
        smode = 0;  // /以降全てstrとする(1)<br />
        hmode = 0;  // 数字2文字(2文字必須)でHEX(上位4ビット)を表す1文字目<br />
        hex = 0;    // 1文字目の値<br />
        while(i&lt;strlen(instr)-1)    // 0A(改行)の前までループ<br />
        {<br />
            c = instr[i];<br />
            //printf("i=%02d:%02X:%02d\n",i,c,strlen(instr)+1);<br />
<br />
            if(smode == 1)<br />
            {<br />
                if(c=='/')<br />
                {<br />
                    // "//"以外の場合<br />
                    if(instr[i-1] != '/')<br />
                    {<br />
                        // /…/でsmode 解除(例/ABC/の、後の/)<br />
                        smode = 0;<br />
                        hmode = 0;<br />
                        hex = 0;<br />
                        i++;<br />
                        continue;<br />
                    }<br />
                    // 文字として/を送りたい場合//と書く<br />
                }<br />
                rtn=i2c_write_byte(c);<br />
                if(rtn==1) exit(1); // NAK or Err<br />
<br />
                hmode = 0;<br />
                hex = 0;<br />
                i++;<br />
                continue;<br />
            }<br />
<br />
            // smode == 0<br />
            if(c=='S')<br />
            {<br />
                i2c_start();<br />
                i++;<br />
            }<br />
            else if(c=='E')<br />
            {<br />
                i2c_stop();<br />
                i++;<br />
            }<br />
            else if(c=='/')<br />
            {<br />
                smode = 1;<br />
                i++;<br />
            }<br />
            else<br />
            {<br />
                w=c-(0x30*(c&lt;'A'))-(0x37*(c&gt;'9'));<br />
                if((w&lt;0)+(w&gt;15)==0)<br />
                {<br />
                    // 0-9,A-F<br />
                    hex=hex*16+w;<br />
<br />
                    if(hmode == 1)<br />
                    {<br />
                        rtn=i2c_write_byte(hex);<br />
                        if(rtn==1) exit(1); // NAK or Err<br />
                        <br />
                        hmode = 0;<br />
                        hex = 0;<br />
                        i++;<br />
                    }<br />
                    else<br />
                    {<br />
                        hmode = 1;<br />
                        i++;<br />
                    }<br />
                }<br />
                else<br />
                {<br />
                    // 無視してhmodeもリセット<br />
                    hmode = 0;<br />
                    hex = 0;<br />
                    i++;<br />
                }<br />
            } // else<br />
        } // while<br />
    } // while(1)<br />
<br />
    // 終了4ピン(SDA)、5ピン(SCL)を入力にし、プルアップ抵抗の力でHiに解放する<br />
    pioset(3);<br />
<br />
    fclose(fp); // 忘れずにcloseする<br />
}<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
PC-G850Vで見易い様にしたソースはこちら：<br />
<br />
1010 int i2c_wait(int c) {<br />
1020  int a,i;<br />
1030  a=0;<br />
1040  for(i = 0; i &lt; c; i++) a+=i;<br />
1050  return a;<br />
1060 }<br />
1070 void i2c_start() {<br />
1080  int rtn;<br />
1090  pioset(0x03);<br />
1100  rtn=i2c_wait(5);<br />
1110  pioset(0x02);<br />
1120  rtn=i2c_wait(5);<br />
1130  pioput(0x00);<br />
1140  rtn=i2c_wait(5);<br />
1150  pioset(0x00);<br />
1160  rtn=i2c_wait(5);<br />
1170  pioput(0x00);<br />
1180  rtn=i2c_wait(5);<br />
1190 }<br />
1200 int i2c_write_byte(unsigned char data) {<br />
1210  int i,w;<br />
1220  int ack_bit;<br />
1230  int rtn;<br />
1240  unsigned char bit_val;<br />
1250  for(i = 0; i &lt; 8; i++) {<br />
1260   if((data &amp; 0x80))<br />
1270    bit_val = 0x01;<br />
1280   else<br />
1290    bit_val = 0;<br />
1300   data &lt;&lt;= 1;<br />
1310   pioput(bit_val);<br />
1320   rtn=i2c_wait(5);<br />
1330   pioput(bit_val | 0x02);<br />
1340   rtn=i2c_wait(5);<br />
1350   pioput(bit_val);<br />
1360   rtn=i2c_wait(5);<br />
1370  }<br />
1380  pioset(0x02);<br />
1390  rtn=i2c_wait(5);<br />
1400  pioput(0x02);<br />
1410  rtn=i2c_wait(5);<br />
1420  w = pioget();<br />
1430  if ((w &amp; 0x01) == 0) {<br />
1440   ack_bit = 0;<br />
1450  } else {<br />
1460   ack_bit = 1;<br />
1470  }<br />
1480  pioput(0x00);<br />
1490  rtn=i2c_wait(5);<br />
1500  pioset(0x00);<br />
1510  rtn=i2c_wait(5);<br />
1520  return ack_bit;<br />
1530 }<br />
1540 void i2c_stop() {<br />
1550  int rtn;<br />
1560  pioset(0x00);<br />
1570  rtn=i2c_wait(5);<br />
1580  pioput(0x00);<br />
1590  rtn=i2c_wait(5);<br />
1600  pioset(0x02);<br />
1610  rtn=i2c_wait(5);<br />
1620  pioset(0x03);<br />
1630  rtn=i2c_wait(5);<br />
1640 }<br />
1650 void i2c_write_reg(unsigned char slave_addr, unsigned char reg_addr, unsigned char data) {<br />
1660  i2c_start();<br />
1670  i2c_write_byte(slave_addr &lt;&lt; 1);<br />
1680  i2c_write_byte(reg_addr);<br />
1690  i2c_write_byte(data);<br />
1700  i2c_stop();<br />
1710 }<br />
1720 void set_backlight_rgb(unsigned char r, unsigned char g, unsigned char b) {<br />
1730  i2c_write_reg(0x62, 0x00, 0x00);<br />
1740  i2c_write_reg(0x62, 0x01, 0x00);<br />
1750  i2c_write_reg(0x62, 0x08, 0xAA);<br />
1760  i2c_write_reg(0x62, 0x04, r);<br />
1770  i2c_write_reg(0x62, 0x03, g);<br />
1780  i2c_write_reg(0x62, 0x02, b);<br />
1790 }<br />
1800 void delay_ms(int ms) {<br />
1810  int i, j;<br />
1820  for(i = 0; i &lt; ms; i++) {<br />
1830   for(j = 0; j &lt; 80; j++);<br />
1840  }<br />
1850 }<br />
1860 void lcd_command(unsigned char cmd) {<br />
1870  i2c_start();<br />
1880  i2c_write_byte(0x3E &lt;&lt; 1);<br />
1890  i2c_write_byte(0x00);<br />
1900  i2c_write_byte(cmd);<br />
1910  i2c_stop();<br />
1920  delay_ms(2);<br />
1930 }<br />
1940 void init_lcd_display() {<br />
1950  delay_ms(2);<br />
1960  lcd_command(0x38);<br />
1970  delay_ms(5);<br />
1980  lcd_command(0x0C);<br />
1990  lcd_command(0x01);<br />
2000  delay_ms(8);<br />
2010  lcd_command(0x06);<br />
2020 }<br />
2030 void lcd_putchar(char ascii_code) {<br />
2040  i2c_start();<br />
2050  i2c_write_byte(0x3E &lt;&lt; 1);<br />
2060  i2c_write_byte(0x40);<br />
2070  i2c_write_byte(ascii_code);<br />
2080  i2c_stop();<br />
2090  i2c_wait(5);<br />
2100 }<br />
2110 void lcd_print(char *str) {<br />
2120  while(*str) {<br />
2130   lcd_putchar(*str++);<br />
2140  }<br />
2150 }<br />
2160 main()<br />
2170 {<br />
2180  int rtn;<br />
2190  FILE* fp;<br />
2200  int smode;<br />
2210  int hmode;<br />
2220  int i;<br />
2230  char instr[256];<br />
2240  char *r;<br />
2250  char c;<br />
2260  unsigned char w,hex;<br />
2270  fp = fＯpen("pio","a+"); //←タグの関係でoが全角大文字だが半角小文字にする<br />
2280  set_backlight_rgb(255, 255, 255);<br />
2290  init_lcd_display();<br />
2300  lcd_putchar((char)'A');<br />
2310  while(1)<br />
2320  {<br />
2330   printf("&gt;");<br />
2340   r = fgets(instr,sizeof(instr),stdin);<br />
2350   if(*r==0) exit(1);<br />
2360   if(instr[0]==0x0A) exit(1);<br />
2370   i=0;<br />
2380   smode = 0;<br />
2390   hmode = 0;<br />
2400   hex = 0;<br />
2410   while(i&lt;strlen(instr)-1)<br />
2420   {<br />
2430    c = instr[i];<br />
2440    if(smode == 1)<br />
2450    {<br />
2460     if(c=='/')<br />
2470     {<br />
2480      if(instr[i-1] != '/')<br />
2490      {<br />
2500       smode = 0;<br />
2510       hmode = 0;<br />
2520       hex = 0;<br />
2530       i++;<br />
2540       continue;<br />
2550      }<br />
2560     }<br />
2570     rtn=i2c_write_byte(c);<br />
2580     if(rtn==1) exit(1);<br />
2590     hmode = 0;<br />
2600     hex = 0;<br />
2610     i++;<br />
2620     continue;<br />
2630    }<br />
2640    if(c=='S')<br />
2650    {<br />
2660     i2c_start();<br />
2670     i++;<br />
2680    }<br />
2690    else if(c=='E')<br />
2700    {<br />
2710     i2c_stop();<br />
2720     i++;<br />
2730    }<br />
2740    else if(c=='/')<br />
2750    {<br />
2760     smode = 1;<br />
2770     i++;<br />
2780    }<br />
2790    else<br />
2800    {<br />
2810     w=c-(0x30*(c&lt;'A'))-(0x37*(c&gt;'9'));<br />
2820     if((w&lt;0)+(w&gt;15)==0)<br />
2830     {<br />
2840      hex=hex*16+w;<br />
2850      if(hmode == 1)<br />
2860      {<br />
2870       rtn=i2c_write_byte(hex);<br />
2880       if(rtn==1) exit(1);<br />
2890       hmode = 0;<br />
2900       hex = 0;<br />
2910       i++;<br />
2920      }<br />
2930      else<br />
2940      {<br />
2950       hmode = 1;<br />
2960       i++;<br />
2970      }<br />
2980     }<br />
2990     else<br />
3000     {<br />
3010      hmode = 0;<br />
3020      hex = 0;<br />
3030      i++;<br />
3040     }<br />
3050    }<br />
3060   }<br />
3070  }<br />
3080  pioset(3);<br />
3090  fclose(fp);<br />
3100 }<br />
<br />
<br />
<br />
<br />
コマンド入力機能の使い方：<br />
<br />
<br />
実行すると、ＲＧＢ液晶とＡが表示された(時々失敗するが)後、ポケコン側に入力プロンプト(&gt;)が表示され、入力待ちになる。<br />
<br />
<br />
&gt;Ｓ7C40/B⏎<br />
<br />
<br />
とすると、Ａの後ろにＢが表示される(時々失敗する)。<br />
ＡＢ<br />
<br />
<br />
＞Ｅ<br />
でストップする(はず)。<br />
<br />
<br />
意味：<br />
Ｓはスタートで、Ｅがストップ。７Ｃが2桁必須の16進数(英字は大文字)で、7Cは液晶のスレーブアドレスを1ビット左シフトして0とORしたもの。<br />
40は液晶独自のコントロールバイトで40が以降データ送信を示し、続けて2桁16進数で送信データを決める。/は行末まで/以外なら文字をＡＳＣＩＩコードに置き換えてデータ送信する。<br />
<br />
<br />
/ABC/で文字列、/文字列(行末)でも良い。//で/を文字データとして指定可能。<br />
またエンターキーのみでプログラム終了。fgetsは文字列の最後に改行(0A)を付けるので、(00)と合わせて除くと最大254文字入力可能。<br />
<br />
<br />
<br />
ＥはなくてもＳでリセットになるので、SとＥを2行に分けずとも、毎回Ｓ開始ならそれでもよい。<br />
<br />
<br />
&gt;S7C40/CDEF⏎<br />
<br />
<br />
ＡＢＣＤＥＦ<br />
<br />
<br />
でも良いという事。<br />
<br />
<br />
(Ｅが文字列として含まれている点に注意)<br />
<br />
<br />
&gt;S7C40/G/ES7C40/H/E<br />
<br />
<br />
ABCDEFGH<br />
<br />
<br />
マルチステートメントっぽく。GとHを2回に分けて1行で送信。<br />
<br />
<br />
&gt;S7C40//<br />
<br />
<br />
ABCDEFGH/<br />
<br />
<br />
※ これでも時々失敗する事から、<br />
コマンド間のウエイトではなく、pio系関数の連続した部分にもっとウエイトを入れなければならないか、<br />
または回路にシュミットトリガーかパスコンを入れなければならない、はず。<br />
<br />
<br />
P.S.1<br />
(2026/6/24追加)<br />
まだ液晶クリア後の文字表示に失敗、および文字データ連続表示で失敗するので、液晶クリアのウエイト時間と連続文字表示時のウエイトに少し増加が必要なのかも。<br />
ひょっとすると、ウエイトよりもその前段階で何か必要(特に文字データは本来最後のデータのみコントロールバイトが0であるとデータシートに書いてあるので)。<br />
(おわり)<br />
<br />
<br />
P.S.<br />
AIは正確に指定しなければ間違うし、正確に知っていない場合には、ある程度のアドバイスとして受け取れるから、新しい未知の領域の勉強には好都合だ。<br />
間違っている範囲が少なければ、自分で学習・調査する意欲も沸くし、対象範囲も小さくて十分だ。<br />
<br />
<br />
結局、一発で正解を求めたいとか、全く知らないのに完璧な回答が欲しいとか、そのような無茶な要求をしなければ、<br />
AIは新しい事を学ぶのにとても良いティーチャーとなる。<br />
<br />
<br />
◎ FIREや定年退職して時間を持て余す人が、ちょっとした興味がある事を深耕したい時にぴったりかも。<br />
<br />
<br />
]]></description>
      <dc:subject>ポケコン</dc:subject>
      <dc:creator>k1segawa</dc:creator>
      <pubDate>Mon, 22 Jun 2026 03:32:00 +0900</pubDate>
      <dc:date>2026-06-22T03:32:00+09:00</dc:date>
    </item>
    <item>
      <title>[PC-G850V] ポケコンでI2C通信 実機動作 + Cソース (6/16)</title>
      <link>http://k1segawa.exblog.jp/245306225/</link>
      <guid isPermaLInk="1">http://k1segawa.exblog.jp/245306225/</guid>
      <description><![CDATA[(2026/6/17追記)<br />
ウエイト時間が多いので修正した。動画は長い待ち時間のまま。<br />
(おわり)<br />
<br />
<br />
前の記事まで、I2CやGoogle Sheetに書いて解析してたけど、結局動かなかった。<br />
で、Geminiに聞いてみた。<br />
あっさり動いた。<br />
<br />
<br />
ウエイト修正ソース：<br />
// 保持時間用のウェイト関数（長めにとっています）<br />
int i2c_wait(int c) {<br />
    int a,i; // コンパイラ最適化防止のvolatileがないのでa+=i;returnで代用<br />
    a=0;<br />
<br />
    for(i = 0; i &lt; c; i++) a+=i;<br />
<br />
    return a; <br />
}<br />
<br />
// I2C スタート条件を出力する関数<br />
void i2c_start() {<br />
    int rtn;<br />
<br />
    // 1. 初期状態：両方のピンを入力に設定し、プルアップ抵抗で確実に「Hi」にする<br />
    pioset(0x03);   // bit0(SDA)=1, bit1(SCL)=1 を入力に<br />
    rtn=i2c_wait(5);<br />
<br />
    // 2. 先に「出力」に切り替えてから、SDA（4ピン）を「Lo」に落とす<br />
    //    SCLは入力（Hi）を維持したまま、SDAだけが「Hi → Lo」になります（スタート条件）<br />
    pioset(0x02);   // bit0(SDA)=0(出力), bit1(SCL)=1(入力のままHi)<br />
    pioput(0x00);   // bit0(SDA)=0(Loに落とす)<br />
    rtn=i2c_wait(5);<br />
<br />
    // 3. 次にSCL（5ピン）も「出力」に切り替えて「Lo」に落とす<br />
    //    これで両方のピンがLoに固定され、データ送信の準備が整います<br />
    pioset(0x00);   // bit1(SCL)も0(出力)にする<br />
    pioput(0x00);   // bit1(SCL)=0(Loに落とす)<br />
    rtn=i2c_wait(5);<br />
}<br />
// 1バイトデータを送信し、液晶からのACK（0=成功, 1=失敗）を返す関数<br />
// ※事前のスタート条件により、SCL=Lo, SDA=Lo (両方出力) から始まる前提です<br />
int i2c_write_byte(unsigned char data) {<br />
    int i,w;<br />
    int ack_bit;<br />
    int rtn;<br />
    unsigned char bit_val;<br />
<br />
    // --- 1〜8ビット目のデータ送信ループ ---<br />
    for(i = 0; i &lt; 8; i++) {<br />
        // MSBファースト（最上位ビットから順に）データを取り出す<br />
        // 送るビットが1ならHi(0x01)、0ならLo(0x00)<br />
        if((data &amp; 0x80))<br />
            bit_val = 0x01;<br />
        else<br />
            bit_val = 0;<br />
        // bit_val = (data &amp; 0x80) ? 0x01 : 0x00;→三項演算子がないので<br />
        data &lt;&lt;= 1; // 次のビットのために左シフト<br />
<br />
        // SCL=Loの状態で、SDAの出力を変更する<br />
        pioput(bit_val); <br />
        rtn=i2c_wait(5);<br />
<br />
        // SCLをHiにして液晶にデータを読み込ませる<br />
        // （SCLを1にするために、入力(開放)ではなく、出力のままHiにするのが確実です）<br />
        // ※bit1(SCL)を1にするため、SDAの状態(bit0)と合わせる<br />
        pioput(bit_val | 0x02);<br />
        rtn=i2c_wait(5);<br />
<br />
        // SCLをLoに戻す<br />
        pioput(bit_val);<br />
        rtn=i2c_wait(5);<br />
    }<br />
<br />
    // --- 9ビット目：液晶からのACK（応答）を確認する処理 ---<br />
    // 1. まずSDA(4ピン/bit0)を入力モードに切り替えて、液晶が自由にSDAをLoにできるようにする<br />
    //    SCL(5ピン/bit1)は出力モード(0)のまま維持します<br />
    pioset(0x02); // bit0=1(入力), bit1=0(出力)<br />
    rtn=i2c_wait(5);<br />
<br />
    // 2. クロック(SCL)をHiにする<br />
    pioput(0x02); // bit1(SCL)=1<br />
    rtn=i2c_wait(5);<br />
<br />
    // 3. この「SCLがHi」のタイミングで、液晶がSDAをLoに引き下げているかをpiogetで確認する<br />
    //    bit0(SDA)が0（Lo）なら液晶が正常にデータを受け取った合図(ACK)です<br />
    w = pioget();<br />
    if ((w &amp; 0x01) == 0) {<br />
        ack_bit = 0; // ACK成功（正常）<br />
    } else {<br />
        ack_bit = 1; // NACK失敗<br />
    }<br />
<br />
    // 4. クロック(SCL)をLoに戻す<br />
    pioput(0x00); // bit1(SCL)=0<br />
    rtn=i2c_wait(5);<br />
<br />
    // 5. 次の通信に備えて、SDA(4ピン)を再び出力モード(0)に戻しておく<br />
    pioset(0x00); // 両方出力モードへ<br />
    rtn=i2c_wait(5);<br />
<br />
    return ack_bit; // 0なら液晶が正しく認識しています<br />
}<br />
// I2C ストップ条件を出力する関数<br />
void i2c_stop() {<br />
    int rtn;<br />
    // 1. 最初は両方「Lo（出力）」の状態で、ピンが確実にLoであることを確認する<br />
    pioset(0x00);   // 両方出力モード<br />
    pioput(0x00);   // 両方Lo<br />
    rtn=i2c_wait(5);<br />
<br />
    // 2. まずSCL（5ピン）だけを「入力」に切り替えて、プルアップ抵抗の力で「Hi」にする<br />
    //    SDAはLo（出力）を維持したまま、SCLだけが先に「Hi」になります<br />
    pioset(0x02);/* 0x01-&gt;0x02 */   // bit0(SDA)=0(出力のまま), bit1(SCL)=1(入力にしてHiへ)<br />
    rtn=i2c_wait(5);<br />
<br />
    // 3. 最後にSDA（4ピン）も「入力」に切り替えて、プルアップ抵抗の力で「Hi」にする<br />
    //    「SCLがHi」の状態で、SDAが「Lo → Hi」へ立ち上がります（ストップ条件成立）<br />
    pioset(0x03);   // bit0(SDA)=1(入力にしてHiへ), bit1(SCL)=1(入力のまま)<br />
    rtn=i2c_wait(5);<br />
}<br />
// 1つのレジスタにデータを書き込む補助関数<br />
void i2c_write_reg(unsigned char slave_addr, unsigned char reg_addr, unsigned char data) {<br />
    i2c_start();<br />
    i2c_write_byte(slave_addr &lt;&lt; 1); // スレーブアドレス＋Writeビット(0)<br />
    i2c_write_byte(reg_addr);        // 操作したいレジスタ番号<br />
    i2c_write_byte(data);            // 設定データ<br />
    i2c_stop();<br />
}<br />
<br />
// バックライトを単独で光らせる関数<br />
// r, g, b には 0(消灯) 〜 255(最大輝度) を指定します。<br />
void set_backlight_rgb(unsigned char r, unsigned char g, unsigned char b) {<br />
    // 1. バックライトICの初期化（スレーブアドレス: 0x62）<br />
    // MODE1(レジスタ0x00) と MODE2(レジスタ0x01) を通常動作モードに設定<br />
    i2c_write_reg(0x62, 0x00, 0x00); // MODE1 を 0x00 に<br />
    i2c_write_reg(0x62, 0x01, 0x00); // MODE2 を 0x00 に<br />
<br />
    // 2. LEDの出力状態を設定（レジスタ0x08）<br />
    // 各LEDピンを「PWMによる個別輝度制御モード」に割り当てます<br />
    i2c_write_reg(0x62, 0x08, 0xAA); // LEDOUT を 0xAA に<br />
<br />
    // 3. 各色の輝度を設定（各色専用のPWMレジスタ）<br />
    // ※Grove LCDの仕様上、レジスタ2=青, 3=緑, 4=赤 に割り当てられています<br />
    i2c_write_reg(0x62, 0x04, r);    // レジスタ0x04 = RED<br />
    i2c_write_reg(0x62, 0x03, g);    // レジスタ0x03 = GREEN<br />
    i2c_write_reg(0x62, 0x02, b);    // レジスタ0x02 = BLUE<br />
}<br />
<br />
// 液晶専用のミリ秒単位の長いウェイト関数<br />
void delay_ms(int ms) {<br />
    int i, j; // volatileを削除<br />
    for(i = 0; i &lt; ms; i++) {<br />
        for(j = 0; j &lt; 80; j++); // 環境に合わせて1ミリ秒になるよう調整してください<br />
    }<br />
}<br />
// 液晶（0x3E）に「コマンド」を1バイト送る補助関数<br />
void lcd_command(unsigned char cmd) {<br />
    i2c_start();<br />
    i2c_write_byte(0x3E &lt;&lt; 1); // スレーブアドレス＋Write(0) = 0x7C<br />
    i2c_write_byte(0x00);      // コントロールバイト（0x00 = 次のバイトはコマンド）<br />
    i2c_write_byte(cmd);       // コマンド本体<br />
    i2c_stop();<br />
    delay_ms(5);               // 液晶の処理待ち（基本2ms空ければ安全です）<br />
}<br />
// 液晶文字側（0x3E）の初期化関数<br />
void init_lcd_display() {<br />
    // 1. 電源立ち上がり直後の安定待ち<br />
    delay_ms(2);<br />
<br />
    // 2. ファンクションセット（基本設定）<br />
    // 0x38 = 8ビットモード, 2行表示, 5x8ドットフォント<br />
    lcd_command(0x38);<br />
    delay_ms(5); // 少し長めに待つ<br />
<br />
    // 3. ディスプレイON/OFF制御<br />
    // 0x0C = ディスプレイON, カーソルOFF, カーソル点滅OFF<br />
    // ※このコマンドが成功すると、薄い四角いブロック（背景）が消えます<br />
    lcd_command(0x0C);<br />
<br />
    // 4. 画面クリア<br />
    // 0x01 = ディスプレイ表示クリア（画面を真っ白にする）<br />
    lcd_command(0x01);<br />
    delay_ms(5); // クリア処理は時間がかかるため長めに待つ<br />
<br />
    // 5. エントリーモードセット<br />
    // 0x06 = 文字を書いた後、カーソルを自動で右に移動（画面スライドなし）<br />
    lcd_command(0x06);<br />
}<br />
// 液晶（0x3E）に文字を1文字表示する関数<br />
void lcd_putchar(char ascii_code) {<br />
    i2c_start();<br />
    i2c_write_byte(0x3E &lt;&lt; 1); // スレーブアドレス（0x7C）<br />
    i2c_write_byte(0x40);      // コントロールバイト（0x40 = 次のバイトは文字データ）<br />
    i2c_write_byte(ascii_code); // 表示したい文字のASCIIコード<br />
    i2c_stop();<br />
    i2c_wait(5);                // 液晶の書き込み待ち<br />
}<br />
<br />
// 連続して文字列を表示する関数<br />
void lcd_print(char *str) {<br />
    while(*str) {<br />
        lcd_putchar(*str++);<br />
    }<br />
}<br />
<br />
main()<br />
{<br />
    FILE* fp;<br />
<br />
    // 11ピンをパラレルでオープンする<br />
    fp = fＯpen("pio","a+");→(ここはタグの関係でoが全角大文字→半角小文字にする)<br />
<br />
    // バックライトを「白色（最大輝度）」で単独点灯させる<br />
    set_backlight_rgb(255, 255, 255);<br />
<br />
    // 液晶文字側（0x3E）の初期化関数<br />
    init_lcd_display();<br />
<br />
    // 液晶（0x3E）に文字を1文字表示する関数<br />
    lcd_putchar((char)'A');<br />
<br />
    // 4ピン(SDA)、5ピン(SCL)を入力にし、プルアップ抵抗の力でHiに解放する<br />
    pioset(3);<br />
<br />
    fclose(fp); // 忘れずにcloseする<br />
}<br />
<br />
<br />
PC-G850VのCで見やすい様、コメント消去とタブ=1にしたもの(ウエイト修正済み)：<br />
1010 int i2c_wait(int c) {<br />
1020  int a,i;<br />
1030  a=0;<br />
1040  for(i = 0; i &lt; c; i++) a+=i;<br />
1050  return a;<br />
1060 }<br />
1070 void i2c_start() {<br />
1080  int rtn;<br />
1090  pioset(0x03);<br />
1100  rtn=i2c_wait(5);<br />
1110  pioset(0x02);<br />
1120  pioput(0x00);<br />
1130  rtn=i2c_wait(5);<br />
1140  pioset(0x00);<br />
1150  pioput(0x00);<br />
1160  rtn=i2c_wait(5);<br />
1170 }<br />
1180 int i2c_write_byte(unsigned char data) {<br />
1190  int i,w;<br />
1200  int ack_bit;<br />
1210  int rtn;<br />
1220  unsigned char bit_val;<br />
1230  for(i = 0; i &lt; 8; i++) {<br />
1240   if((data &amp; 0x80))<br />
1250    bit_val = 0x01;<br />
1260   else<br />
1270    bit_val = 0;<br />
1280   data &lt;&lt;= 1;<br />
1290   pioput(bit_val);<br />
1300   rtn=i2c_wait(5);<br />
1310   pioput(bit_val | 0x02);<br />
1320   rtn=i2c_wait(5);<br />
1330   pioput(bit_val);<br />
1340   rtn=i2c_wait(5);<br />
1350  }<br />
1360  pioset(0x02);<br />
1370  rtn=i2c_wait(5);<br />
1380  pioput(0x02);<br />
1390  rtn=i2c_wait(5);<br />
1400  w = pioget();<br />
1410  if ((w &amp; 0x01) == 0) {<br />
1420   ack_bit = 0;<br />
1430  } else {<br />
1440   ack_bit = 1;<br />
1450  }<br />
1460  pioput(0x00);<br />
1470  rtn=i2c_wait(5);<br />
1480  pioset(0x00);<br />
1490  rtn=i2c_wait(5);<br />
1500  return ack_bit;<br />
1510 }<br />
1520 void i2c_stop() {<br />
1530  int rtn;<br />
1540  pioset(0x00);<br />
1550  pioput(0x00);<br />
1560  rtn=i2c_wait(5);<br />
1570  pioset(0x02);<br />
1580  rtn=i2c_wait(5);<br />
1590  pioset(0x03);<br />
1600  rtn=i2c_wait(5);<br />
1610 }<br />
1620 void i2c_write_reg(unsigned char slave_addr, unsigned char reg_addr, unsigned char data) {<br />
1630  i2c_start();<br />
1640  i2c_write_byte(slave_addr &lt;&lt; 1);<br />
1650  i2c_write_byte(reg_addr);<br />
1660  i2c_write_byte(data);<br />
1670  i2c_stop();<br />
1680 }<br />
1690 void set_backlight_rgb(unsigned char r, unsigned char g, unsigned char b) {<br />
1700  i2c_write_reg(0x62, 0x00, 0x00);<br />
1710  i2c_write_reg(0x62, 0x01, 0x00);<br />
1720  i2c_write_reg(0x62, 0x08, 0xAA);<br />
1730  i2c_write_reg(0x62, 0x04, r);<br />
1740  i2c_write_reg(0x62, 0x03, g);<br />
1750  i2c_write_reg(0x62, 0x02, b);<br />
1760 }<br />
1770 void delay_ms(int ms) {<br />
1780  int i, j;<br />
1790  for(i = 0; i &lt; ms; i++) {<br />
1800   for(j = 0; j &lt; 80; j++);<br />
1810  }<br />
1820 }<br />
1830 void lcd_command(unsigned char cmd) {<br />
1840  i2c_start();<br />
1850  i2c_write_byte(0x3E &lt;&lt; 1);<br />
1860  i2c_write_byte(0x00);<br />
1870  i2c_write_byte(cmd);<br />
1880  i2c_stop();<br />
1890  delay_ms(5);<br />
1900 }<br />
1910 void init_lcd_display() {<br />
1920  delay_ms(2);<br />
1930  lcd_command(0x38);<br />
1940  delay_ms(5);<br />
1950  lcd_command(0x0C);<br />
1960  lcd_command(0x01);<br />
1970  delay_ms(5);<br />
1980  lcd_command(0x06);<br />
1990 }<br />
2000 void lcd_putchar(char ascii_code) {<br />
2010  i2c_start();<br />
2020  i2c_write_byte(0x3E &lt;&lt; 1);<br />
2030  i2c_write_byte(0x40);<br />
2040  i2c_write_byte(ascii_code);<br />
2050  i2c_stop();<br />
2060  i2c_wait(5);<br />
2070 }<br />
2080 void lcd_print(char *str) {<br />
2090  while(*str) {<br />
2100   lcd_putchar(*str++);<br />
2110  }<br />
2120 }<br />
2130 main()<br />
2140 {<br />
2150  FILE* fp;<br />
2160  fp = fＯpen("pio","a+");→(ここはタグの関係でoが全角大文字→半角小文字にする)<br />
2170  set_backlight_rgb(255, 255, 255);<br />
2180  init_lcd_display();<br />
2190  lcd_putchar((char)'A');<br />
2200  pioset(3);<br />
2210  fclose(fp);<br />
2220 }<br />
<br />
動作環境の様子：<center><img src="https://pds.exblog.jp/pds/1/202606/16/80/a0034780_04234148.png" alt="_a0034780_04234148.png" class="IMAGE_MID" height="375" width="500" /></center><br />
<br />
<br />
ズームアップ：<center><img src="https://pds.exblog.jp/pds/1/202606/16/80/a0034780_04234772.png" alt="_a0034780_04234772.png" class="IMAGE_MID" height="375" width="500" /></center>動画：<br />
[PC-G850V]RGBキャラクタ液晶をI2Cで表示 - C言語[ポケコン] - YouTube<br />
<br />
<br />
<center><img src="https://pds.exblog.jp/pds/1/202606/16/80/a0034780_04482745.png" alt="_a0034780_04482745.png" class="IMAGE_MID" height="337" width="500" /></center><br />
<br />
<br />
前はスレーブアドレスのACKエラーで、文字背景の黒をクリアさえ出来なかった。<br />
<br />
<br />
動画はちょっとウエイト時間が長かったかな。<br />
<br />
前記事と同じだが回路図も。<center><img src="https://pds.exblog.jp/pds/1/202606/15/80/a0034780_03010363.png" alt="_a0034780_03010363.png" class="IMAGE_MID" height="334" width="331" /></center><br />
開発環境は、<br />
USB変換ケーブルを作り(買ってつなぐ)、Teraterm(最後^Z)やPC-Linkなどでファイル送信。<br />
TEXTで、SioのFormatで設定(9600,8,1,none,CR LF,1A,yes,RS/CS)し、Loadで読込んで、<br />
2ndF+TEXTでCompilerのCキーでコンパイル、GoのGキーで実行。<br />
(毎回TEXTで、DeleteでYを押して削除)<br />
<br />
<br />
デバッグ：<br />
g800のROM載せで、コンパイルチェック、Trace<br />
<br />
<br />
ユーザ領域：<br />
*USER<br />
FREE:0100-1FFF<br />
<br />
<br />
液晶：<br />
Grove-LCD RGB Backlight V2.0<br />
]]></description>
      <dc:subject>ポケコン</dc:subject>
      <dc:creator>k1segawa</dc:creator>
      <pubDate>Tue, 16 Jun 2026 04:15:00 +0900</pubDate>
      <dc:date>2026-06-16T04:15:00+09:00</dc:date>
    </item>
    <item>
      <title>[PC-G850V] ポケコンでI2C通信 実機確認 - Cソース修正 (6/14)</title>
      <link>http://k1segawa.exblog.jp/245301896/</link>
      <guid isPermaLInk="1">http://k1segawa.exblog.jp/245301896/</guid>
      <description><![CDATA[(5/16追記14日に気が付いているが、ChatGPTの回答のコピーなので部分的に間違っているのを修正)<br />
<br />
<br />
前回の記事に従って、Cソースを修正している時ACK受信感じた違和感をChatGPTに指摘したが、自分がbit0とbit1が逆の役割と勘違いしていたからだった。<br />
正しいコードはコメントも含めてこうなる。<br />
<br />
<br />
～～～～～<br />
// SDA解放<br />
(5/16追記ここだけ間違っているので修正)<br />
pioset(1);      // SDA入力、SCL出力Low<br />
pioput(1);<br />
(5/16追記修正おわり)<br />
<br />
// SCL解放<br />
pioset(3);<br />
<br />
// クロックストレッチ待ち<br />
do{<br />
　w = pioget();<br />
}while((w &amp; 0x02)==0);   // SCL=1待ち<br />
<br />
// ACK判定<br />
if ((w &amp; 0x01)==0) {<br />
　// ACK<br />
} else {<br />
　// NAK<br />
}<br />
<br />
<br />
1.スレーブにACKビットを任せるためSDAを解放する。<br />
2.SCLを解放して9ビット目を開始する。<br />
3.スレーブがクロックストレッチしていればSCLをLowに保持するので、SCLがHighになるまで待つ。<br />
4.SCLがHighになったらSDAを読んでACK/NAKを判定する。<br />
<br />
という、I²Cの仕様に沿った自然な処理になります。<br />
～～～～～<br />
<br />
<br />
※ このACKコードはGoogle Sheetの複数の上矢印↑のACK部分だ。<br />
<br />
<br />
そして前後の入力切り替え処理だが、<br />
<br />
<br />
[入力切り替え]<br />
前の入力切り替え処理は、このACK受信処理に含まれているので不要で、<br />
後の入力切り替え処理は、SCL/SDA両方を出力切替にして、次に⑦でSCL Low/SDA Lowから始まっているので、pioset(0);pioput(0)となり不要。<br />
そして残る「初」の①だが、これの前の入力切り替えも①が⑦と同じSCL Low/SDA Lowなので、不要だ。<br />
<br />
<br />
[結論]<br />
つまり、ACK受信の前や①や⑦の前の[入力切り替え]処理は不要。<br />
※ もちろん「初」に30msの遅延で、スレーブにSCL Low/SDL Lowを検出させるウエイト時間は必要だ。<br />
<br />
<br />
あとでGoogle Sheetからも削除してACKの中を詳細化すべきだろう。<br />
<br />
<br />
修正Cソース：<br />
(結局動かなかった)<br />
<br />
<br />
次の記事で動いたソースを載せる。<br />
]]></description>
      <dc:subject>ポケコン</dc:subject>
      <dc:creator>k1segawa</dc:creator>
      <pubDate>Sun, 14 Jun 2026 11:13:00 +0900</pubDate>
      <dc:date>2026-06-14T11:13:00+09:00</dc:date>
    </item>
    <item>
      <title>[PC-G850V] ポケコンでI2C通信 実機確認 - ピンのON/OFFを見直し 図解 (6/13)</title>
      <link>http://k1segawa.exblog.jp/245300528/</link>
      <guid isPermaLInk="1">http://k1segawa.exblog.jp/245300528/</guid>
      <description><![CDATA[(5/16追記)<br />
間違っている旧4=SCL、5=SDAの回路図だけは修正済み。<br />
これに伴うChatGPTの回答は、4を5、5を4に置き換えて読む事。<br />
(5/16追記おわり)<br />
<br />
<br />
つまり、どういうことかと言うと、<br />
<br />
<br />
マスタ側データ送信は、次のようになる。<br />
※<br />
データ1を送信する例を4ピンで、<br />
データ0を送信する例を5ピンで説明する。<br />
<br />
<br />
[マスタ側データ送信]<br />
<br />
<br />
<center><img src="https://pds.exblog.jp/pds/1/202606/15/80/a0034780_03442748.png" alt="_a0034780_03442748.png" class="IMAGE_MID" height="352" width="411" /></center><br />
<br />
(5/16追記)4、5ピンの役割を取り違えたのでSCLとSDAをSDAとSCLに修正済み(おわり)<br />
【SDA/SCLへの出力の場合】<br />
(4,5)=(SDA 0,SCL 0)：pioset(0),pioput(0)<br />
(4,5)=(SDA 1,SCL 0)：pioset(1),pioput(1)<br />
(4,5)=(SDA 0,SCL 1)：pioset(2),pioput(2)<br />
(4,5)=(SDA 1,SCL 1)：pioset(3)<br />
(5/16追記修正ココまで)<br />
と設定する。<br />
<br />
<br />
マスタから0を送りたい時は、ポートを出力モードにして0を出力し、<br />
マスタから1を送りたい時はポートを解放すると、入力に自然となるのだ。<br />
<br />
<br />
オープンドレイン方式(回路的にはワイヤードAND構成)というやつだ。<br />
<br />
<br />
※ マスタからデータを送りたいのと、ポート(ピン)の出力モードは別物だという事！<br />
電気理論は奥が深いな～<br />
<br />
<br />
<br />
<br />
で、このオープンドレイン方式で、マスタ側データ入力は、以下のようにする。<br />
<br />
<br />
[マスタ側データ入力]<br />
<br />
<br />
<br />
<center><img src="https://pds.exblog.jp/pds/1/202606/15/80/a0034780_03443648.png" alt="_a0034780_03443648.png" class="IMAGE_MID" height="365" width="401" /></center><br />
(5/16追記)4、5ピンの役割を取り違えたのでSCLとSDAをSDAとSCLに修正済み(おわり)<br />
【SDA/SCLからの入力の場合】<br />
(5/16追記修正ココまで)<br />
(4,5)=(0,0)：pioset(3),w=pioget(),(w &amp; 0x03)==0<br />
(4,5)=(1,0)：pioset(3),w=pioget(),(w &amp; 0x01)==1→0x03<br />
(4,5)=(0,1)：pioset(3),w=pioget(),(w &amp; 0x02)==1→0x03,2<br />
(4,5)=(1,1)：pioset(3),w=pioget(),(w &amp; 0x03)==3<br />
<br />
<br />
<br />
<br />
<br />
<br />
となるという事。<br />
<br />
<br />
ここで、以下のようにChatGPTにチェックをかけてもらったら、取り消し線の指摘が的確にあったので、修正した。<br />
<br />
<br />
素晴らしい事に、「クロスストレッチ」による、ACK受信待ちの方法もついでに教えてくれた。感謝。<br />
<br />
<br />
：<br />
<br />
<br />
(5/16追記 ここからは修正できないのでそのままにしてある。↑上のピンとpio関数の関係とSDA/SCLで読み解く事。)<br />
[ChatGPTとのやり取り]<br />
～～～～～<br />
質問：<br />
これで合っていますか？ <br />
【両4,5ピン出力の場合】<br />
 (4,5)=(SCL 0,SDA 0)：pioset(0),pioput(0)<br />
 (4,5)=(SCL 1,SDA 0)：pioset(1),pioput(1)<br />
 (4,5)=(SCL 0,SDA 1)：pioset(2),pioput(2)<br />
 (4,5)=(SCL 1,SDA 1)：pioset(3) と設定<br />
 【両4,5ピン入力の場合】<br />
 (4,5)=(0,0)：pioset(3),w=pioget(),(w &amp; 0x03)==0<br />
 (4,5)=(1,0)：pioset(3),w=pioget(),(w &amp; 0x01)==1<br />
 (4,5)=(0,1)：pioset(3),w=pioget(),(w &amp; 0x02)==1<br />
 (4,5)=(1,1)：pioset(3),w=pioget(),(w &amp; 0x03)==3<br />
回答：<br />
はい、基本的な考え方は合っています。<br />
<br />
ただし、**I2Cとしては「1を出力する」のではなく、「1は入力（Hi-Z）にする」**という考え方になるので、少し整理すると分かりやすくなります。<br />
<br />
出力<br />
SCL    SDA    設定<br />
0    0    pioset(0), pioput(0)<br />
1    0    pioset(1), pioput(1)<br />
0    1    pioset(2), pioput(2)<br />
1    1    pioset(3)<br />
<br />
ここで、<br />
<br />
pioset(0)：4,5ピンとも出力<br />
pioset(1)：4ピン入力、5ピン出力<br />
pioset(2)：4ピン出力、5ピン入力<br />
pioset(3)：4,5ピンとも入力<br />
<br />
だとすると、<br />
<br />
(SCL,SDA)=(0,0)<br />
→両方を出力にして0を出力<br />
<br />
(SCL,SDA)=(1,0)<br />
→SCLを入力（解放）<br />
→SDAを出力0<br />
<br />
(SCL,SDA)=(0,1)<br />
→SCLを出力0<br />
→SDAを入力（解放）<br />
<br />
(SCL,SDA)=(1,1)<br />
→両方入力（解放）<br />
<br />
となり、I2Cとして理想的です。<br />
<br />
入力<br />
<br />
ここは少し修正した方がよいです。<br />
<br />
pioset(3);     // 両方入力<br />
w = pioget();<br />
<br />
として、<br />
<br />
(w &amp; 0x03)==0   // (0,0)<br />
(w &amp; 0x03)==1   // (1,0)<br />
(w &amp; 0x03)==2   // (0,1)<br />
(w &amp; 0x03)==3   // (1,1)<br />
<br />
と判定するのが自然です。<br />
<br />
質問の<br />
<br />
(w &amp; 0x02)==1<br />
<br />
は、<br />
<br />
w &amp; 0x02<br />
<br />
の結果が取り得る値は<br />
<br />
0<br />
2<br />
<br />
なので、<br />
<br />
(w &amp; 0x02)==1<br />
<br />
は常に偽になります。<br />
<br />
したがって<br />
<br />
(0,1)：(w &amp; 0x03)==2<br />
<br />
または<br />
<br />
(w &amp; 0x02)!=0<br />
<br />
とする必要があります。<br />
<br />
ACK受信<br />
<br />
例えば、<br />
<br />
// SDA解放<br />
(5/16追記 下からここも意味がわかったので修正できる - ↑上から、解放は入力モードにする事)<br />
pioset(１);          // SCL→DA入力、SDA→CL出力0<br />
pioput(１);<br />
<br />
// SCL解放<br />
pioset(3);<br />
<br />
// クロックストレッチ待ち<br />
do{<br />
　　w = pioget();<br />
(5/16追記 下からここも意味がわかったので修正できる)<br />
}while((w &amp; 0x01→２)==0);    // SCL=1待ち<br />
<br />
// SDA読む<br />
(5/16追記 ここは意味がはっきりしてるので修正できる)<br />
if((w &amp; 0x02→1)==0)<br />
　　ACK;<br />
else<br />
　　NAK;<br />
<br />
のようにすると、クロックストレッチ対応のI2Cになります。<br />
<br />
この pioset() と pioput() の仕様が、<br />
<br />
bit0 = 4ピン(SCL)←(5/16追記 残念。ここ以降ChatGPTの誤回答がわからなくなるので残す)<br />
bit1 = 5ピン(SDA)<br />
pioset()：1=入力、0=出力<br />
pioput()：出力時の値<br />
<br />
であるなら、PC-G850VのソフトウェアI2Cとしてかなり美しい実装になっていると思います。特に (1,1)=pioset(3) だけで両線を解放できるので、START、STOP、ACK、クロックストレッチの処理が非常に書きやすそうです。<br />
～～～～～(ChatGPTの回答おわり)<br />
<br />
<br />
これで、メインである旧出力pioput(n)をそれぞれ書き換えると、<br />
マスタ側データ送信の上から順に対応するので、<br />
<br />
<br />
☆ 次の記事でやらかしたので、逆と勘違いしやすいのであえてここに書く。<br />
(これより上の内容にも間違いがありそうなので見直すように！)<br />
<br />
<br />
(5/16追記やっと追いついた。ここからは逆だったことに気が付いている)<br />
☆ bit 0が4ピンでSDA、bit 1が5ピンでSCLであるので、<br />
<br />
<br />
旧pioput(0)→pioset(0),pioput(0) /* bit 0:SDA 0,bit 1:SCL 0 */<br />
旧pioput(1)→pioset(1),pioput(1) /* bit 0:SDA 1(入力モードで1を出力しても無効なのがポイント), bit 1;SCL 0 */<br />
旧pioput(2)→pioset(2),pioput(2) /* bit 0:SDA 0,bit 1:SCL 1 */<br />
旧pioput(3)→pioset(3) /* bit 0,1:SDA 1,SCL 1(入力モードにするとオープンドレインでHiになる) */<br />
<br />
<br />
に書き換えればよい。<br />
<br />
<br />
そして、ACK受信処理は、<br />
例えばの後のSDA解放・SCL解放・クロックストレッチ待ち・SDA読むをそのまま採用する。<br />
<br />
<br />
Cソースを書き換えよう。出力側のコメントも、1をxxx入力、0をxxx解放、に修正しよう。<br />
]]></description>
      <dc:subject>ポケコン</dc:subject>
      <dc:creator>k1segawa</dc:creator>
      <pubDate>Sat, 13 Jun 2026 22:28:00 +0900</pubDate>
      <dc:date>2026-06-13T22:28:00+09:00</dc:date>
    </item>
    <item>
      <title>[PC-G850V] ポケコンでI2C通信 実機確認 - ピンのON/OFFを見直し (6/13)</title>
      <link>http://k1segawa.exblog.jp/245300339/</link>
      <guid isPermaLInk="1">http://k1segawa.exblog.jp/245300339/</guid>
      <description><![CDATA[(5/16追記)<br />
間違っていた旧４＝SCL、5=SDAの回路図を与えてしまった時のChatGPTの回答なので、<br />
正しく、4ピンは5ピン、5ピンは4ピンへと修正済み。<br />
(5/16追記おわり)<br />
<br />
<br />
<br />
その後、ChatGPTに聞いたところ、こんな点を指摘されてしまった。<br />
～～～～～<br />
一つ気になる点<br />
<br />
PC-G850Vの11ピンの4、5番端子が、<br />
CMOS入出力でHighインピーダンスにできる<br />
Low出力が可能<br />
ならそのままI2Cをソフトウェアで実装できます。<br />
<br />
しかし、<br />
High出力（プッシュプル）しかできない<br />
出力モードで常にHを駆動する<br />
ような仕様だと、I2CデバイスがLowを出力したときに衝突します。<br />
<br />
PC-G850Vでは通常、ポートを<br />
<br />
High（入力状態）<br />
Low（出力）<br />
<br />
のように切り替えてI2Cを実装するため、ポート仕様の確認が重要です。<br />
～～～～～<br />
なんだか、聞き覚えのある(プッシュプル・High Low・衝突)ような、無い(インピーダンス)ような言葉を使われてしまった。<br />
そして、「ポートの仕様の確認が重要」との事。<br />
<br />
<br />
赤の部分が理解できない。<br />
<br />
<br />
なので、「ソフトウェアI2Cを実装予定です。理想の回路はどうなりますか？」で、出てきたのが前の記事の回路。<br />
<br />
<br />
そして、その説明が衝撃だった。<br />
～～～～～<br />
回答：<br />
I2Cでは High を出力するのではなく、<br />
Lowを出力する<br />
Highにしたい時は入力（High-Z）にする<br />
<br />
という制御を行います。<br />
例えばSDAなら、<br />
状態ポート設定<tbody data-start="561" data-end="588">Low出力0High入力</tbody><br />
<br />
SCLも同様です。こうすると、4.7kΩのプルアップ抵抗によって自然にHighになります。～～～～～<br />
あれ？<br />
クロックに合わせて、データHigh,Lowと送るだけじゃないの？<br />
<br />
<br />
ポートを入力にしてHighを出力する？<br />
どういうこと？<br />
<br />
<br />
～～～～～<br />
質問：<br />
この場合、PC-G850VからのHiは1ですか？また相手側からのHiも1ですか？<br />
<br />
<br />
回答：<br />
はい、ソフトウェアI2Cではそのように考えてよいです。<br />
<br />
ただし、「1を出力する」というより、<br />
<br />
0（Low）を出力する<br />
1（High）は出力しないで、入力（High-Z）にする<br />
<br />
というのが正確な表現です。<br />
<br />
PC-G850V側<br />
Lowを送りたいとき<br />
(5/16追記)ここの4、5を５、４に修正済み(おわり)<br />
5ピン(SCL) = 出力0<br />
4ピン(SDA) = 出力0<br />
<br />
電圧は約0Vになります。<br />
<br />
Highを送りたいとき<br />
5ピン(SCL) = 入力<br />
4ピン(SDA) = 入力<br />
(5/16追記ここまでで修正おわり)<br />
<br />
すると4.7kΩのプルアップ抵抗によって、<br />
<br />
+5V<br />
 │<br />
4.7kΩ<br />
 │<br />
 SCL,SDA<br />
<br />
が約5Vになり、論理1になります。<br />
<br />
I2Cデバイス側<br />
<br />
相手側も同じです。<br />
<br />
相手が0を送りたいとき<br />
<br />
内部トランジスタで線をGNDへ引き下げます。<br />
<br />
相手が1を送りたいとき<br />
<br />
何もしません（High-Z）。<br />
<br />
その結果、プルアップ抵抗によって線は+5Vとなり、論理1になります。<br />
<br />
まとめ<br />
動作    PC-G850V    I2Cデバイス    線の状態<br />
1    解放（入力）    解放    High<br />
0    Low出力    解放    Low<br />
1    解放    解放    High<br />
1    解放    Low出力    Low<br />
0    Low出力    Low出力    Low<br />
<br />
つまり、<br />
<br />
「0は誰かが作る、1はみんなが手を離すことで自然にできる」<br />
<br />
というのがI2Cの特徴です。<br />
<br />
したがって、PC-G850Vから見ても、相手側から見ても、<br />
<br />
Low = 0<br />
High = 1<br />
<br />
であり、双方とも「1」はプルアップ抵抗によって作られた同じ5Vの状態を見ています。<br />
<br />
このため、送信側と受信側が同時に通信線を共有でき、ACK信号やクロックストレッチなどのI2C特有の動作が可能になります。～～～～～<br />
～～～～～質問：まさにクロスストレッチだと思うので、スレーブ側がACKの処理が長引いている時、SCL=Hiにしたままなので、SCLがLowになるのを待ち、SDAがLowになればACK、HiならNAK処理をしようと思っています。回答：その考え方はほぼ正しいですが、ACKの判定タイミングだけ少し注意が必要です。<br />
<br />
クロックストレッチを考慮した場合、マスター（PC-G850V）側の処理は次のようになります。<br />
<br />
SDAを解放（入力）<br />
SCLを解放（入力）<br />
実際にSCLがHighになるまで待つ<br />
SCLがHighになったらSDAを読む<br />
SDA=0ならACK、SDA=1ならNAK<br />
SCLをLowにする<br />
<br />
擬似コードで書くと、<br />
<br />
; ACK受信<br />
<br />
SDA ← 入力      ; 解放<br />
SCL ← 入力      ; 解放<br />
<br />
; クロックストレッチ待ち<br />
while (SCL == 0)<br />
    ;<br />
<br />
; この時点でSCLは実際にHigh<br />
if (SDA == 0)<br />
    ACK<br />
else<br />
    NAK<br />
<br />
SCL ← 0         ; 次のクロックへ<br />
<br />
つまり、<br />
<br />
SCLがLowになるのを待つ<br />
<br />
ではなく、<br />
<br />
SCLがHighになるのを待つ<br />
<br />
になります。<br />
<br />
なぜか？<br />
<br />
スレーブがクロックストレッチしている間は、<br />
<br />
マスター：SCLを解放（Highにしたつもり）<br />
スレーブ：SCLをLowに保持<br />
<br />
となっており、実際のSCL線はLowです。<br />
<br />
SCL線<br />
────┐    ┌────<br />
　　　　　│____│<br />
       ↑<br />
   クロックストレッチ<br />
<br />
スレーブの準備が終わるとSCLを解放するので、プルアップ抵抗によってSCLがHighになります。<br />
<br />
そのHigh期間中にSDAをサンプリングして、<br />
<br />
SDA=0 → ACK<br />
SDA=1 → NAK<br />
<br />
を判定します。<br />
<br />
したがって、PC-G850VでソフトウェアI2Cを実装するなら、<br />
<br />
SCLを解放<br />
↓<br />
SCL端子を読み続ける<br />
↓<br />
SCL=1になった<br />
↓<br />
SDA端子を読む<br />
↓<br />
ACK/NAK判定<br />
<br />
という流れにすれば、クロックストレッチ対応の完全なI2Cマスターになります。<br />
<br />
PC-G850Vの4、5ピンが入出力兼用であることを利用すると、まさにこの方式を自然に実装できます。Z80アセンブラでも比較的簡単に組めます。<br />
<br />
質問：<br />
なるほど。スレーブ側はACKを返す前にSCL Lowになっているので、処理が間に合わなければ、SCLをLowのままにして処理を引っ張っているのですね。<br />
回答：<br />
その理解で正しいです。<br />
<br />
I2Cのクロックストレッチは、まさに<br />
<br />
「ACKを返したいが、まだ準備が終わっていないので、SCLをLowのままにして待ってもらう」<br />
<br />
という仕組みです。<br />
<br />
1バイト送信後を例にすると、<br />
<br />
       マスター          スレーブ<br />
SCL ____|‾|_|‾|_|‾|_|‾|___________<br />
　　　　　　　　　　　　　　↑<br />
                      9ビット目(ACK)<br />
<br />
SDA D7 D6 D5 D4 D3 D2 D1 D0    ACK<br />
<br />
8ビット目を送り終えた後、<br />
<br />
マスターはSDAを解放（入力）<br />
マスターはSCLを解放（Highにしたつもり）<br />
スレーブはまだ忙しいのでSCLをLowに保持<br />
スレーブ内部で<br />
データを取り込む<br />
EEPROMなら書き込み準備<br />
センサなら変換結果を準備<br />
ACKを返せる状態になったら<br />
SDAをLowにする（ACK）<br />
SCLを解放<br />
SCLがHighになったところでマスターがSDAを読む<br />
<br />
という流れになります。<br />
<br />
つまり、<br />
<br />
SCLをHighにしたつもり<br />
↓<br />
実際にはLowのまま<br />
↓<br />
「まだ待って」<br />
↓<br />
準備完了<br />
↓<br />
SDAをACK状態にする<br />
↓<br />
SCLを解放<br />
↓<br />
マスターがACKを読む<br />
<br />
という順番です。<br />
<br />
そのため、ソフトウェアI2Cのマスターでは、<br />
<br />
; SCLを解放<br />
; ↓<br />
Wait:<br />
    SCLを読む<br />
    Lowなら Wait<br />
; ↓<br />
; SCLが本当にHighになった<br />
; ↓<br />
SDAを読む<br />
; ↓<br />
0ならACK<br />
1ならNAK<br />
<br />
という実装が、クロックストレッチ対応の正しい実装になります。<br />
<br />
ちなみに、I2Cの仕様上は SCLをLowに保持できるのはスレーブだけでなくマスターも可能 です。クロックの主導権はマスターにありますが、「Lowは誰でも作れる、Highはみんなが手を離した結果」というオープンドレイン方式のおかげで、クロックストレッチという非常に巧妙な同期機構が実現されています。<br />
<br />
PC-G850VのようなポケコンでソフトウェアI2Cを実装する場合、この仕組みを理解していると、ACK待ちやバス競合の処理を非常に自然に書けると思います。<br />
<br />
質問：<br />
オープンドレイン方式というのですね。ワイヤードAND方式と言うのも効いた事があります。<br />
回答：<br />
はい、その通りです。<br />
<br />
オープンドレイン方式（Open Drain）<br />
ワイヤードAND方式（Wired-AND）<br />
<br />
は密接に関係しており、I2Cでは両方の言葉が使われます。<br />
<br />
オープンドレイン方式<br />
<br />
これは、各デバイスの出力回路の構造を表す言葉です。<br />
<br />
      +5V<br />
       │<br />
      4.7kΩ<br />
       │<br />
───────●──── 信号線<br />
       │<br />
      Tr<br />
       │<br />
      GND<br />
<br />
トランジスタONで Low を出力し、<br />
<br />
トランジスタOFFで「何もしない（High-Z）」状態になります。<br />
<br />
つまり、<br />
<br />
ON → 0<br />
OFF → 解放<br />
<br />
であり、Highを直接出力する回路はありません。<br />
<br />
ワイヤードAND方式<br />
<br />
これは複数のオープンドレイン出力を1本の線に接続したときの論理動作を表す言葉です。<br />
<br />
例えば、<br />
<br />
      +5V<br />
       │<br />
      4.7kΩ<br />
       │<br />
       ●───共通線<br />
      ／＼<br />
     A    B<br />
<br />
A、BのどちらかがLowを出せば、<br />
<br />
A=0 B=0 → 線=0<br />
A=0 B=1 → 線=0<br />
A=1 B=0 → 線=0<br />
A=1 B=1 → 線=1<br />
<br />
となります。<br />
<br />
これは論理積（AND）の真理値表と同じです。<br />
<br />
A    B    線<br />
0    0    0<br />
0    1    0<br />
1    0    0<br />
1    1    1<br />
<br />
そのため、ワイヤードANDと呼ばれます。<br />
<br />
負論理で見るとワイヤードOR<br />
<br />
電子回路の教科書では、<br />
<br />
「オープンコレクタはワイヤードOR」<br />
<br />
という説明が出てくることがあります。<br />
<br />
これは負論理で考えているためで、<br />
<br />
Low = TRUE<br />
High = FALSE<br />
<br />
とすると、<br />
<br />
Low OR Low → Low<br />
Low OR High → Low<br />
High OR Low → Low<br />
High OR High → High<br />
<br />
となるからです。<br />
<br />
I2Cでは<br />
<br />
回路的には<br />
<br />
オープンドレイン出力<br />
<br />
複数接続した結果の論理として<br />
<br />
ワイヤードAND<br />
<br />
と呼ぶのが一般的です。<br />
<br />
PC-G850VでソフトウェアI2Cを実装する場合、<br />
<br />
「0は積極的に作る」<br />
「1はみんなで手を離して作る」<br />
<br />
という感覚で考えると、クロックストレッチやACKの動作も非常に理解しやすくなります。<br />
<br />
実際、I2Cは「オープンドレイン＋ワイヤードAND」を最も巧みに利用した通信方式の一つと言えます。～～～～～<br />
]]></description>
      <dc:subject>ポケコン</dc:subject>
      <dc:creator>k1segawa</dc:creator>
      <pubDate>Sat, 13 Jun 2026 21:10:00 +0900</pubDate>
      <dc:date>2026-06-13T21:10:00+09:00</dc:date>
    </item>
    <item>
      <title>[PC-G850V] ポケコンでI2C通信 実機確認 - C言語 (6/13)</title>
      <link>http://k1segawa.exblog.jp/245300312/</link>
      <guid isPermaLInk="1">http://k1segawa.exblog.jp/245300312/</guid>
      <description><![CDATA[(6/15追記)<br />
ここの「結果」は、回路図が4=SCL、5=SDAだと思い込んでた頃の物なので、無効。<br />
ソースはちゃんとしてるのに～<br />
(6/15追記おわり)<br />
<br />
<br />
BASICだと、定型パターンならOKだが色々試すには、<br />
C言語で、それぞれの初期化や設定を関数化してパラメータを変えて呼び出すようにしないとやっかいだ。<br />
<br />
<br />
そのため、組んだがうまく動かない。<br />
BASICでもそうだったが、スレーブのACK応答が返ってこない。<br />
<br />
<br />
Cソース：<br />
/* SDA(4pin=bit 0) SCL(5pin=bit 1) */<br />
send_start()<br />
{<br />
    pioput(0);<br />
    pioput(1);<br />
    pioput(3);    /* SDA 1+SCL 1 */<br />
    pioput(2);<br />
    pioput(0);<br />
}<br />
send_stop()<br />
{<br />
    pioput(1);<br />
    pioput(3);<br />
    pioput(3);<br />
}<br />
send_i2c(unsigned char i2c)<br />
{<br />
    /* pioput (SDA x+2*SCL x) DATA =&gt; Bit Pulse */<br />
    unsigned char b,c;<br />
<br />
    /* DATA=i2c(bit 7-0) */<br />
    for(c=0x80;c&gt;1;c=(c&gt;&gt;1)) {<br />
        b = i2c &amp; c;<br />
        if(b != 0) b=1;<br />
        pioput(b);        /* SDA x + SCL 0 */<br />
        pioput(b+2);    /* SDA x + SCL 1 */<br />
        pioput(b);        /* SDA x + SCL 0 */<br />
    }<br />
}<br />
int recv_ack()<br />
{<br />
    int c;<br />
    unsigned char d;<br />
    pioset(3);    /* 61H=3 4,5pin input */<br />
<br />
    c=0;<br />
    do<br />
    {<br />
        d = pioget();   -----&gt; そもそもクロックのタイミングで受け取れてるのか？<br />
        /* ACK=(SCL 1 &amp;&amp; SDA 0) */<br />
        if( (d &amp; 3) == 2 )    /* recv_ack */  ---&gt; Trace Onで遅い十分なスピードにしてもif文が成立しない。おかしい。<br />
        {<br />
            /* ACK OK */<br />
            pioput(0);<br />
            pioput(2);<br />
            pioput(0);<br />
<br />
            return 0;<br />
        }<br />
        c++;<br />
    } while(c&lt;8);<br />
    return 1;<br />
}<br />
main()<br />
{<br />
    int rtn;<br />
    FILE* fp;<br />
    unsigned char sadr,mode;<br />
    int i;<br />
<br />
    fp = fоpen("pio","a+");    /* 60H=1 paralell mode */ ---&gt; オープンが使えないので全角文字<br />
<br />
    pioset(0);    /* 61H=0 all output */<br />
<br />
    send_start();<br />
<br />
    /* slave addr */<br />
    sadr = 0x3E;<br />
    mode = 0;    /* R/W=0 */<br />
    send_i2c((sadr &lt;&lt; 1) | (mode &amp; 0x01));<br />
    rtn = recv_ack();<br />
    if(rtn == 1)<br />
    {<br />
        printf("Slave ACK Err\n");<br />
        exit(1);<br />
    }<br />
<br />
    /* Set Data = Interface is 8bit long. */<br />
    for(i=0;i&lt;3;i++)<br />
    {<br />
        /* Function Set Control Byte */<br />
        send_i2c(0x80 | 0x00);    /* 0x80:Co=1 0x00:RS=0 */<br />
        rtn = recv_ack();<br />
        if(rtn == 1)<br />
        {<br />
            printf("Func8bit %i Ctrl ACK Err\n",i);<br />
            exit(1);<br />
        }<br />
        /* Function Set Data 8bit long. */<br />
        send_i2c(0x30);<br />
        rtn = recv_ack();<br />
        if(rtn == 1)<br />
        {<br />
            printf("Func8bit %i Data ACK Err\n",i);<br />
            exit(1);<br />
        }<br />
    }<br />
<br />
    /* Function Set Control Byte */<br />
    send_i2c(0x80 | 0x00);    /* 0x80:Co=1 0x00:RS=0 */<br />
    rtn = recv_ack();<br />
    if(rtn == 1)<br />
    {<br />
        printf("Func Ctrl ACK Err\n");<br />
        exit(1);<br />
    }<br />
    /* Function Set(DB5=1) Data DL(DB4),N(DB3),F(DB2) */<br />
    /* DL=1(8bit Set),N=1(2Line),F=0(5x8dot) */<br />
    send_i2c(0x20 | 0x10 | 0x08 | 0x04);<br />
    rtn = recv_ack();<br />
    if(rtn == 1)<br />
    {<br />
        printf("Func Data ACK Err\n");<br />
        exit(1);<br />
    }<br />
<br />
    /* Display ON/OFF Control */<br />
    send_i2c(0x80 | 0x00);<br />
    rtn = recv_ack();<br />
    if(rtn == 1)<br />
    {<br />
        printf("DispOnCtrl ACK Err\n");<br />
        exit(1);<br />
    }<br />
    /* Display ON/OFF(DB3=1) Data D(DB2) | C(DB1) | B(DB0) */<br />
    /* Display ON,Cursor ON,Blinking OFF */<br />
    send_i2c(0x08 | 0x04 | 0x02 | 0x00);<br />
    rtn = recv_ack();<br />
    if(rtn == 1)<br />
    {<br />
        printf("DispOnData ACK Err\n");<br />
        exit(1);<br />
    }<br />
<br />
    /* Display Clear Control */<br />
    send_i2c(0x80 | 0x00);<br />
    rtn = recv_ack();<br />
    if(rtn == 1)<br />
    {<br />
        printf("DispClrCtrl ACK Err\n");<br />
        exit(1);<br />
    }<br />
    /* Display Clear(DB0=1) Data */<br />
    send_i2c(0x01);<br />
    rtn = recv_ack();<br />
    if(rtn == 1)<br />
    {<br />
        printf("DispClrData ACK Err\n");<br />
        exit(1);<br />
    }<br />
<br />
    /* Entry Mode Set Control */<br />
    send_i2c(0x80 | 0x00);<br />
    rtn = recv_ack();<br />
    if(rtn == 1)<br />
    {<br />
        printf("EntryCtrl ACK Err\n");<br />
        exit(1);<br />
    }<br />
    /* Entry Mode Set(DB2=1) Data I/D(DB1) | S(DB0) */<br />
    /* I/D=0(No LShift),S=0(No RShift) */<br />
    send_i2c(0x04 | 0x00 | 0x00);<br />
    rtn = recv_ack();<br />
    if(rtn == 1)<br />
    {<br />
        printf("EntryData ACK Err\n");<br />
        exit(1);<br />
    }<br />
<br />
<br />
    /* CG/DDRAM DATA ADDRESS Control */<br />
    send_i2c(0x80 | 0x00);    /* 0x80:Co=1 0x00:RS=0 */<br />
    rtn = recv_ack();<br />
    if(rtn == 1)<br />
    {<br />
        printf("DATA WR. ACK Ctrl Err\n");<br />
        exit(1);<br />
    }<br />
    /* CG/DDRAM DATA ADDRESS(DB7) Data DB6-0 */<br />
    /* DB6-0=0(Home) */<br />
    send_i2c(0x80 | 0x00);<br />
    rtn = recv_ack();<br />
    if(rtn == 1)<br />
    {<br />
        printf("DATA WR. ACK Data Err\n");<br />
        exit(1);<br />
    }<br />
<br />
<br />
    /* CG/DDRAM DATA WRITE Control */<br />
    send_i2c(0x80 | 0x40);    /* 0x80:Co=1 0x40:RS=1 */<br />
    rtn = recv_ack();<br />
    if(rtn == 1)<br />
    {<br />
        printf("DATA WR. ACK Ctrl Err\n");<br />
        exit(1);<br />
    }<br />
    /* CG/DDRAM DATA WRITE(R/W=RS=1) Data DB7-0 */<br />
    /* DB7-0=(0011 0000)b "@" */<br />
    send_i2c(0x30);<br />
    rtn = recv_ack();<br />
    if(rtn == 1)<br />
    {<br />
        printf("DATA WR. ACK Data Err\n");<br />
        exit(1);<br />
    }<br />
<br />
    send_stop();<br />
    fclose(fp);<br />
}<br />
<br />
<br />
ACKそのものが送れていないのか、ACK応答が返ってこないのか、そもそも回路は正しいのか？<br />
仕方ない。ChatGPTに回路図を見せて正しいか聞いてみたら、合ってはいるが出力に設定してスレーブから出力Highが来るとショートする恐れがあるとの事。なるほどな～<br />
<br />
<br />
元の回路<br />
(5/16追記)回路図を修正済み。元の回路も。詳しくは文頭へ(おわり)<center><img src="https://pds.exblog.jp/pds/1/202606/15/80/a0034780_01574062.png" alt="_a0034780_01574062.png" class="IMAGE_MID" height="222" width="331" /></center><br />
<br />
<br />
そのため、4ピンとスレーブとの間に抵抗が必要との事。<br />
<br />
<br />
それで、教えられた回路図がこれ。<br />
抵抗値が4.7kΩで、330Ωの安全を高めるための抵抗が入った。<br />
(6/15追記)回路図を修正済み。詳しくは文頭へ(おわり)<center><img src="https://pds.exblog.jp/pds/1/202606/15/80/a0034780_03010363.png" alt="_a0034780_03010363.png" class="IMAGE_MID" height="334" width="331" /></center><br />
<br />
この抵抗バランスはさっぱりわからない。やっぱりハードは難しい。<br />
<br />
<br />
]]></description>
      <dc:subject>ポケコン</dc:subject>
      <dc:creator>k1segawa</dc:creator>
      <pubDate>Sat, 13 Jun 2026 20:54:00 +0900</pubDate>
      <dc:date>2026-06-13T20:54:00+09:00</dc:date>
    </item>
    <item>
      <title>[PC-G850V] ポケコンでI2C通信 実機確認  - テストBASIC [GAME] (6/10)</title>
      <link>http://k1segawa.exblog.jp/245295322/</link>
      <guid isPermaLInk="1">http://k1segawa.exblog.jp/245295322/</guid>
      <description><![CDATA[(6/15追記)<br />
ここの確認は、回路図が4=SCL、5=SDAだと取り違えていた頃の結果なので、無効。<br />
(6/15追記おわり)<br />
<br />
<br />
実機での確認をする。<br />
<br />
<br />
ポケコンにテキストをシリアルで転送し、Basic ← text でBASICで変換。<br />
<br />
<br />
回路は、前の記事<br />
[PC-G850V] ポケコンでI2C通信 [GAME] (6/5) : 体重と今日食べたもの<br />
から、<br />
(6/15追記)図を4＝SDA、５＝SCLに修正。前の記事も修正済み。(6/15追記おわり)<br />
<br />
<br />
修正済みの回路図<center><img src="https://pds.exblog.jp/pds/1/202606/15/80/a0034780_01574062.png" alt="_a0034780_01574062.png" class="IMAGE_MID" height="222" width="331" /></center><br />
実行<br />
<br />
<br />
まず、2ピンを繋いだところ、液晶の1行目の各16キャラクタ部分が黒くなり、バックライトは未点灯だ。<br />
実行してみると、30秒ほど時間が経ってエラー無く終了した。<br />
PRINT A;PRINT N<br />
3  457<br />
と表示され、最後までDATAを送信し終わっている。<br />
<br />
<br />
SC1602 LCDモジュール (HD44780コンパチブル) の使い方<br />
<br />
<br />
どうもLCDが光ってないのがそもそもあれなので、やはりRGBバックライトの方も(I2C=0x62)点灯しないといけなさそう。<br />
<br />
<br />
]]></description>
      <dc:subject>ポケコン</dc:subject>
      <dc:creator>k1segawa</dc:creator>
      <pubDate>Wed, 10 Jun 2026 14:41:00 +0900</pubDate>
      <dc:date>2026-06-10T14:41:00+09:00</dc:date>
    </item>
    <item>
      <title>[PC-G850V] ポケコンでI2C通信 実装編 テストBASIC [GAME] (6/9)</title>
      <link>http://k1segawa.exblog.jp/245295007/</link>
      <guid isPermaLInk="1">http://k1segawa.exblog.jp/245295007/</guid>
      <description><![CDATA[(6/15追記)<br />
ここは回路の4ピンと５ピンが４＝SCLと５＝SDAに入れ替わってた時期のソースなので、ACK判定で動かない。<br />
(6/15追記おわり)<br />
<br />
<br />
まずは、BASICで確認。<br />
前の黒枠の部分をDATA文にして、READで回すプログラム。<br />
<br />
<br />
BASICソース：<br />
100 '==I2C JHD1313<br />
110 OPEN "PIO:"<br />
120 '--main<br />
125 N=0<br />
130 *LOOP<br />
140 READ A:N=N+1<br />
150 IF A=4 THEN PIOSET 0:GOTO *LOOP<br />
160 IF A=5 THEN PIOSET 3:GOTO *LOOP<br />
170 IF A=6 THEN GOSUB *ACK<br />
180 IF A=99 THEN GOTO *STOP<br />
190 PIOPUT A<br />
200 GOTO *LOOP<br />
210 '--sub<br />
220 *ACK<br />
225 C=0<br />
230 REPEAT<br />
240   D=PIOGET<br />
250   IF (D AND 2) = 2 THEN RETURN (6/15追記：旧この5=SDAでがHiでACK判定してる。ACKに入る前に両方Lowに落としてる)<br />
260   C=C+1                        (新)実は入れ替わってて5=SCL Hiなので偶然合ってるので、回路だけ修正済みなら動いてた？)<br />
270 UNTIL C&gt;8<br />
280 PRINT "ERROR N=";N<br />
290 END<br />
300 '--stop<br />
310 *STOP<br />
320 READ A<br />
330 PIOPUT A<br />
340 READ A<br />
350 PIOPUT A<br />
360 READ A<br />
370 PIOPUT A<br />
380 END<br />
390 '--data<br />
400 DATA 4,0,1,3,2,0,0,2,0,1,3,1,1,3,1,1<br />
410 DATA 3,1,1,3,1,1,3,1,0,2,0,0,2,0,5,6<br />
420 DATA 4,0,2,0,1,3,1,0,2,0,0,2,0,0,2,0<br />
430 DATA 0,2,0,0,2,0,0,2,0,0,2,0,5,6,4,0<br />
440 DATA 2,0,0,2,0,0,2,0,1,3,1,1,3,1,1,3<br />
450 DATA 1,0,2,0,0,2,0,0,2,0,5,6,4,0,2,0<br />
460 DATA 1,3,1,0,2,0,0,2,0,0,2,0,0,2,0,0<br />
470 DATA 2,0,0,2,0,0,2,0,5,6,4,0,2,0,0,2<br />
480 DATA 0,0,2,0,0,2,0,0,2,0,1,3,1,1,3,1<br />
500 DATA 0,2,0,0,2,0,5,6,4,0,2,0,1,3,1,0<br />
510 DATA 2,0,0,2,0,0,2,0,0,2,0,0,2,0,0,2<br />
520 DATA 0,0,2,0,5,6,4,0,2,0,0,2,0,0,2,0<br />
530 DATA 0,2,0,0,2,0,0,2,0,0,2,0,0,2,0,1<br />
540 DATA 3,0,5,6,4,0,2,0,1,3,1,0,2,0,0,2<br />
550 DATA 0,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0<br />
560 DATA 5,6,4,0,2,0,0,2,0,0,2,0,0,2,0,0<br />
570 DATA 2,0,0,2,0,1,3,1,1,3,1,1,3,1,5,6<br />
580 DATA 4,0,2,0,1,3,1,0,2,0,0,2,0,0,2,0<br />
590 DATA 0,2,0,0,2,0,0,2,0,0,2,0,5,6,4,0<br />
600 DATA 2,0,0,2,0,0,2,0,1,3,1,1,3,1,1,3<br />
610 DATA 1,0,2,0,0,2,0,0,2,0,5,6,4,0,2,0<br />
620 DATA 1,3,1,0,2,0,0,2,0,0,2,0,0,2,0,0<br />
630 DATA 2,0,0,2,0,0,2,0,5,6,4,0,2,0,1,3<br />
640 DATA 1,0,2,0,0,2,0,0,2,0,0,2,0,0,2,0<br />
650 DATA 0,2,0,0,2,0,5,6,4,0,2,0,1,3,1,1<br />
660 DATA 3,1,0,2,0,0,2,0,0,2,0,0,2,0,0,2<br />
670 DATA 0,0,2,0,5,6,4,0,2,0,0,2,0,0,2,0<br />
680 DATA 1,3,1,1,3,1,0,2,0,0,2,0,0,2,0,0<br />
690 DATA 2,0,5,6,4,0,2,0,99,1,3,3<br />
<br />
<br />
エミュで実行すると、エラーになって、<br />
ERROR N=32.<br />
と出る。<br />
<br />
<br />
NはREADしたDATAの数なので、<br />
6でエラー。ACK処理だ。<br />
<br />
<br />
当然、実機でないので応答が返ってくるはずもない。<br />
<br />
<br />
一応、これを実機に送って、配線は、VCCとGNDにプルアップ抵抗10kΩ付けて、4,5ピンと繋ぐ。<br />
<br />
<br />
]]></description>
      <dc:subject>ポケコン</dc:subject>
      <dc:creator>k1segawa</dc:creator>
      <pubDate>Tue, 09 Jun 2026 23:41:00 +0900</pubDate>
      <dc:date>2026-06-09T23:41:00+09:00</dc:date>
    </item>
    <item>
      <title>[PC-G850V] ポケコンでI2C通信 実装編 データ化 [GAME] (6/9)</title>
      <link>http://k1segawa.exblog.jp/245294949/</link>
      <guid isPermaLInk="1">http://k1segawa.exblog.jp/245294949/</guid>
      <description><![CDATA[これで、Google Sheet のS/P、スレーブアドレス、データ(この液晶では2バイト毎のコマンドワード)にそれぞれの初期化コマンドや各種コマンドを当てはめてみる。<br />
<br />
<br />
ほとんどがデータ発行(送信)だが、ACKの受信や、入出力切り替えの状態変化がある。<br />
これをデータ駆動のように、62Hへ出力すべきデータに、門番データを追加する。<br />
<br />
<br />
使われてないデータとして4以上を使って、動作移行のフラグとする。<br />
4・・・入出力を出力に切り替え(61Hに0)<br />
5・・・入出力を入力に切り替え(61Hに3)<br />
6・・・ACK受信<br />
<br />
<br />
<center><img src="https://pds.exblog.jp/pds/1/202606/09/80/a0034780_21312112.png" alt="_a0034780_21312112.png" class="IMAGE_MID" height="126" width="500" /></center><br />
<br />
<br />
これで0,1,2,3なら62Hに出力し、それ以外なら動作を変更する。<br />
黒枠の部分がそれ。<br />
<br />
<br />
そして、データ部は、Co=1と0で状態が変化するが、Co=1で統一し、Co=0は使わない。<br />
∵ストップコンディションの発行で強制的にCo=0と同じ事が出来ると予想。<br />
<br />
<br />
では、初期化コマンドや各種コマンドのデータ部の様子を示す。<br />
<br />
<br />
<center><img src="https://pds.exblog.jp/pds/1/202606/09/80/a0034780_21441491.png" alt="_a0034780_21441491.png" class="IMAGE_MID" height="332" width="500" /></center><br />
<center><img src="https://pds.exblog.jp/pds/1/202606/09/80/a0034780_21441998.png" alt="_a0034780_21441998.png" class="IMAGE_MID" height="441" width="500" /></center><br />
<center><img src="https://pds.exblog.jp/pds/1/202606/09/80/a0034780_21442370.png" alt="_a0034780_21442370.png" class="IMAGE_MID" height="284" width="500" /></center>最後はデータ駆動ではストップコンディション発行に移行できないが、データ末尾を99にし、その検知で発行する。<br />
<br />
<br />
データ駆動はテスト。<br />
<br />
<br />
実際は各コマンドを順番に並べて、該当する62Hのデータを発行する。<br />
コマンドをカスタマイズするには、引数を与える。<br />
例えば文字コードなど。<br />
<br />
<br />
コマンドは内部でACK受信して、受信リトライ失敗ならコマンドエラーを返す。<br />
<br />
<br />
<br />
<br />
]]></description>
      <dc:subject>ポケコン</dc:subject>
      <dc:creator>k1segawa</dc:creator>
      <pubDate>Tue, 09 Jun 2026 21:52:00 +0900</pubDate>
      <dc:date>2026-06-09T21:52:00+09:00</dc:date>
    </item>
    <item>
      <title>[PC-G850V] ポケコンでI2C通信 実装編 コマンド発行 [GAME] (6/9)</title>
      <link>http://k1segawa.exblog.jp/245294438/</link>
      <guid isPermaLInk="1">http://k1segawa.exblog.jp/245294438/</guid>
      <description><![CDATA[RGBはとりあえずパワーオンで白で起動しそうなので、<br />
JHD1313の初期化コマンドの発行から。<center><img src="https://pds.exblog.jp/pds/1/202606/09/80/a0034780_15251665.png" alt="_a0034780_15251665.png" class="IMAGE_MID" height="481" width="334" /></center>パワーオン時、30msウエイト。<br />
全てRS=0。<br />
5x7ドットフォントなので、1-line modeというのは縦10ドットのキャラクタを使うモードらしく、1ラインだけ使うモードのようだ。<br />
2-line modeを選ぶ。<br />
Function SetをN=1、F=0、X=0で発行。<br />
Display ON/OFF ControlをD=1、C=0、B=0で発行。<br />
Display Clearを発行。<br />
I/Dはカーソル移動で表示すると次の位置が前か後ろになる。<br />
Entry Mode SetをI/D=1、SH=1で発行。<br />
<br />
<br />
文字を実際に表示する。<br />
<center><img src="https://pds.exblog.jp/pds/1/202606/09/80/a0034780_15425071.png" alt="_a0034780_15425071.png" class="IMAGE_MID" height="392" width="361" /></center>1文字出すだけなら、DL=1、N=1、F=0(1は縦10)で、<br />
FUNCTION SETを発行。<br />
CGRAMは16文字だけユーザ文字を作成出来、昔の外字などに使っていたのだろう。<br />
今回、「0」(ゼロ)を1文字左上隅に表示するだけなので、<br />
DDRAM AD SETを、ADD=0で発行。<br />
DATA WRITE=００11 0000(b)でフォント 0を指定して、<br />
CGRAM/DDRAM DATA WRITEを発行。<br />
<br />
<br />
フォントテーブルは以下の通り。<br />
<center><img src="https://pds.exblog.jp/pds/1/202606/09/80/a0034780_15593290.png" alt="_a0034780_15593290.png" class="IMAGE_MID" height="453" width="373" /></center>ここで注意なのは、<br />
CGRAM/DDRAM DATA WRITEの、コントロールバイトはRS=1にする事。<br />
データバイトは8ビットでOK。<br />
<br />
<br />
これだけで終わりなら、コントロールバイトはCo=0にし、ストップコンディションを発行して終わる。<br />
<br />
<br />
コマンド概要はHD44780の解説サイト様が詳しい。<br />
キャラクタLCDモジュールの使いかた<br />
<br />
<br />
DL=1で8Data Busが今は標準だ。<br />
Fは0の方が良くI/DやSの説明もある。<br />
<br />
<br />
]]></description>
      <dc:subject>ポケコン</dc:subject>
      <dc:creator>k1segawa</dc:creator>
      <pubDate>Tue, 09 Jun 2026 15:46:00 +0900</pubDate>
      <dc:date>2026-06-09T15:46:00+09:00</dc:date>
    </item>
    <item>
      <title>[PC-G850V] ポケコンでI2C通信 実装編 RGB [GAME] (6/9)</title>
      <link>http://k1segawa.exblog.jp/245293582/</link>
      <guid isPermaLInk="1">http://k1segawa.exblog.jp/245293582/</guid>
      <description><![CDATA[このLCDはRGBの輝度を変えられる。<br />
つまり、別のI2Cでバックライト用ICを制御する。<br />
<br />
<br />
Grove - LCD RGB バックライト | Seeed Studio Wiki<br />
<br />
<br />
もう一つのスレーブアドレス(I2Cアドレス)は、0x62だ。<br />
<center><img src="https://pds.exblog.jp/pds/1/202606/09/80/a0034780_08372477.png" alt="_a0034780_08372477.png" class="IMAGE_MID" height="241" width="500" /></center><br />
変更履歴から0x30に変わっている可能性があるが、それはRGB コントローラがPCA9632 から SGM31323 に変更された場合だ。<br />
<br />
<br />
PCA9633.pdfは前回のドキュメントにある。<br />
Grove_LCD_RGB_Backlight/res/PCA9633.pdf at master · SeeedDocument/Grove_LCD_RGB_Backlight · GitHub<br />
<br />
<br />
<br />
<br />
ピン数は8(DP1),10(DP2),16(PW,D16)本と色々あるが、JH1313.pdfの3ページ目に「PCA9632DP1」とあるので、DP1は8ピンだ。<br />
PCA9633は32の電位改造バックライトICとの事。もっと大切な違いは32は標準が4ビットバス幅で、33は標準８ビットバス幅。<br />
なので、33ではDL=1(8D)を選択する。NXPの9632/33の説明より。<br />
<center><img src="https://pds.exblog.jp/pds/1/202606/09/80/a0034780_09075270.png" alt="_a0034780_09075270.png" class="IMAGE_MID" height="287" width="500" /></center><br />
9633.pdfの5ページ目にある8ピンのDP1だ。<br />
<br />
<center><img src="https://pds.exblog.jp/pds/1/202606/09/80/a0034780_09100290.png" alt="_a0034780_09100290.png" class="IMAGE_MID" height="346" width="456" /></center><br />
<br />
<br />
これにより、I2Cの10,16ピンバージョンのレジスタ書込みは無関係と分かる。<br />
<br />
<br />
<br />
<br />
8ページからの７章 Functional DescriptionがI2Cプロトコルだ。<br />
<br />
<br />
7.1でDevice Ａｄdressとして、<br />
LCDはサブアドレスであと3つI2Cバスにくっつけられる。<br />
<br />
<br />
7.2からレギュラースレーブアドレスとして、説明がある。<br />
<br />
<br />
CALL ALL I2C Addressとして、たぶんパワーオン時、全てのRGB バックライトがONになっている状態と思われるので、<br />
バックライトの色を変えない限り、特にI2Cスレーブアドレス0x62に向けてのコマンド発行は不要。<br />
<br />
<br />
ソフトリセットがあり、ほぼパワーオンリセットと同じ。<br />
<br />
<br />
それ以外は個別にRGB LEDそれぞれの明るさをコントロールしたい場合に、PWMのDuty値をそれぞれ変更可能なようだ。<br />
これにより、液晶のバックライトの色を変えられる。<br />
<br />
<br />
という事で、こちらは後回し。<br />
<br />
<br />
]]></description>
      <dc:subject>ポケコン</dc:subject>
      <dc:creator>k1segawa</dc:creator>
      <pubDate>Tue, 09 Jun 2026 09:22:00 +0900</pubDate>
      <dc:date>2026-06-09T09:22:00+09:00</dc:date>
    </item>
    <item>
      <title>[マイクラ統合版PC] Java版の工業MOD「CREATE」 がついに統合版にも！ [アドオン] (6/7)</title>
      <link>http://k1segawa.exblog.jp/245290629/</link>
      <guid isPermaLInk="1">http://k1segawa.exblog.jp/245290629/</guid>
      <description><![CDATA[(Android版マイクラでもインストールとアイテム設置まではOKだが、水車やハンドルが回らなかった。自分だけ？)<br />
Java版の「CREATE」という、超有名な工業MODが、遂に統合版へ提供開始！<br />
<br />
<br />
<center><img src="https://pds.exblog.jp/pds/1/202606/07/80/a0034780_05171410.png" alt="_a0034780_05171410.png" class="IMAGE_MID" height="370" width="286" /></center><br />
<br />
<br />
以下のサイト様から、Create_Add-On.mcaddon をダウンロードして、それをダブルクリックするだけ！<br />
(フリーアドオン)<br />
Create Add-On | Vatonage<br />
<br />
<center><img src="https://pds.exblog.jp/pds/1/202606/07/80/a0034780_04230430.png" alt="_a0034780_04230430.png" class="IMAGE_MID" height="219" width="500" /></center><br />
<br />
<br />
非公式アドオンだが、インストール形式が 「.mcaddon」になったのですごく簡単。<br />
<br />
<br />
ダウンロードすると、以下のようになる。<center><img src="https://pds.exblog.jp/pds/1/202606/07/80/a0034780_04245140.png" alt="_a0034780_04245140.png" class="IMAGE_MID" height="18" width="500" /></center><br />
<br />
<br />
<br />
<br />
インストールは、ダブルクリック。<br />
<br />
<br />
マイクラが起動し、"インポートに成功しました"、と出ればOK。<br />
<br />
<br />
続けて、<br />
<br />
<br />
プレイ ＞ ワールド新規作成 ＞ リソースパック ＞ 購入済み ＞ Create Bedrock ＞ 認証する<br />
<br />
<br />
<center><img src="https://pds.exblog.jp/pds/1/202606/07/80/a0034780_04333991.png" alt="_a0034780_04333991.png" class="IMAGE_MID" height="282" width="500" /></center><br />
最後に、作成ボタンを押す。<br />
<br />
<br />
たったこれだけ！<br />
<br />
<br />
画面下に"Create Bedrockが有効になりました"、と3秒間表示される。<br />
<br />
<br />
※ 作成を押す前に、認証するのがポイント。<br />
<br />
<br />
インベントリ画面<br />
<br />
<br />
<center><img src="https://pds.exblog.jp/pds/1/202606/07/80/a0034780_04452567.png" alt="_a0034780_04452567.png" class="IMAGE_MID" height="280" width="500" /></center><br />
<br />
作業台<br />
<br />
<center><img src="https://pds.exblog.jp/pds/1/202606/07/80/a0034780_05171410.png" alt="_a0034780_05171410.png" class="IMAGE_MID" height="370" width="286" /></center><br />
楽しみだ～～<br />
<br />
<br />
今回の提供はこちらのサイト様で、日本語音声で解説されている。<br />
Create Mod on Bedrock Changes EVERYTHING... - YouTube<br />
<br />
<br />
<center><img src="https://pds.exblog.jp/pds/1/202606/07/80/a0034780_04492216.png" alt="_a0034780_04492216.png" class="IMAGE_MID" height="376" width="500" /></center><br />
<br />
<br />
コメント欄も、興奮しているのがわかって面白い。<br />
<br />
<br />
CREATE詳細はこちらから。<br />
Create Mod is FINALLY on Minecraft Bedrock, and ITS INSANE - YouTube<center><img src="https://pds.exblog.jp/pds/1/202606/08/80/a0034780_10035940.png" alt="_a0034780_10035940.png" class="IMAGE_MID" height="337" width="500" /></center><br />
<br />
<br />
<br />
<br />
公式動画で、貨物列車が動いている。<br />
夢の「トロッコ」アップグレード版かなw<br />
This is Create. (2022) - YouTube<center><img src="https://pds.exblog.jp/pds/1/202606/08/80/a0034780_14424490.png" alt="_a0034780_14424490.png" class="IMAGE_MID" height="371" width="500" /></center><br />
<br />
<br />
<br />
<br />
日本語wikiもある。<br />
マイクラ Create mod日本語wiki<br />
<br />
<br />
P.S.<br />
<br />
<br />
Vatonage：JavaのModを統合版のアドオン化しているサイト様<br />
<br />
Vatonage による Create アドオン (v1.01) は、参照される v26.21 がこの現在のバージョンを指すと仮定すると、Minecraft Bedrock の最新の公式安定バージョン (1.21.xx) と互換性があるように設計されています。適切な機能を使用するには、実験設定で Holiday Creator 機能、今後の Creator 機能、およびベータ API を有効にし、リソース パックとビヘイビアー パックの両方をアクティブ化する必要があります。詳細については、次のサイトをご覧ください。 <br />
<br />
<br />
元々、統合版へ移植していた二次作成のチームVatonageによるもの。<br />
Create Addon Minecraft PE Bedrock Edition (MCPE) Mod - YouTube<br />
<br />
<br />
リソースパックの認証するだけでビヘイビアパックも入るので、あとは実験的機能からベータAPIを有効にするかどうかだが、OFFのままでも水車(Water Wheel)は動き、動力を伝えてはいる。<br />
ベータAPIは今後、ONにするかどうかは機能しないパーツが出てきたら(特に貨物列車)考えよう～<br />
<br />
<br />
P.S.2<br />
<br />
<br />
初回提供で、有名配信者にリアルタイム配信してもらってるので、安全性は高い。<br />
v.1.01なので、まだ不具合はあるだろう。<br />
現在日本語フォントに無い文字を使っているので、お豆腐になっているのがこちら。<br />
<br />
<br />
<center><img src="https://pds.exblog.jp/pds/1/202606/08/80/a0034780_16193656.png" alt="_a0034780_16193656.png" class="IMAGE_MID" height="278" width="376" /></center><br />
英語<center><img src="https://pds.exblog.jp/pds/1/202606/08/80/a0034780_16194103.png" alt="_a0034780_16194103.png" class="IMAGE_MID" height="230" width="332" /></center><br />
<br />
<br />
数字が出てるのでそれほど困らない。色は変わる(16 RPMで1個ON)。<br />
<br />
<br />
2週間前に出てたので、先達様の動画サイトはこちら。<br />
【マイクラ統合版】ついに統合版でCreate MODが使える時代きた〜！！！【マイクラアドオン紹介】【ボイロ解説】 - YouTube<br />
<br />
<br />
<center><img src="https://pds.exblog.jp/pds/1/202606/08/80/a0034780_16382069.png" alt="_a0034780_16382069.png" class="IMAGE_MID" height="313" width="500" /></center><br />
<br />
<br />
こちらも有名なアドオン。<br />
【マイクラ統合版】車・船・戦車・飛行機！なんでも作れて動かせる物理アドオンを完全解説‼︎【マイクラアドオン紹介】【ボイロ解説】 - YouTube<br />
<center><img src="https://pds.exblog.jp/pds/1/202606/08/80/a0034780_16460068.png" alt="_a0034780_16460068.png" class="IMAGE_MID" height="321" width="500" /></center><br />
<br />
<br />
同時に使えるといいのにな～(未検証)<br />
<br />
<br />
英語だが、CREATE入門にはちょうど良いサイト様があった。<br />
字幕を日本語翻訳にしたら、とてもわかりやすく、てきぱきと教えてくれる。<br />
(こちらも出た直後に投稿された)<br />
Minecraft Java's BEST Mod is now on Bedrock Edition!? // Create Mod [MCPE/MCBE] - YouTube<center><img src="https://pds.exblog.jp/pds/1/202606/10/80/a0034780_08134419.png" alt="_a0034780_08134419.png" class="IMAGE_MID" height="260" width="500" /></center><br />
<br />
<br />
]]></description>
      <dc:subject>マイクラ</dc:subject>
      <dc:creator>k1segawa</dc:creator>
      <pubDate>Sun, 07 Jun 2026 04:38:00 +0900</pubDate>
      <dc:date>2026-06-07T04:38:00+09:00</dc:date>
    </item>
    <supplier>
      <url>
        <excite>https://www.excite.co.jp/</excite>
        <exblog>https://www.exblog.jp/</exblog>
        <idcenter>https://ssl2.excite.co.jp/</idcenter>
      </url>
    </supplier>
  </channel>
</rss>
