フォト
2017年5月
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      
無料ブログはココログ

Propeller

2016年2月19日 (金)

Propeller始めました(22) ポータブルゲーム機の実装 7

先日実装したSDカードモジュールを早速活用して、MIDIファイルの再生実験をやってみました。


Parallax のForumの次の情報と公開ライラリを利用して実装しました。
  ・Music Synthesizer object with General MIDI sound set
    http://forums.parallax.com/discussion/111867/music-synthesizer-object-with-general-midi-sound-set

CPUだけで、そこそこの音が出ています。専用の音源ICを搭載しようかとも思ったのですが
不要ですね(デジカメで撮影したのでドラム音とかが拾えていないです)。

仕様的には、ソース内に次のような記載があります。

01

20音同時再生できるようです。音色もGM1サウンドセット+GM1ドラムセットをサポート
しているみたいです。

プログラム開発者が公開している実演奏(mp3形式)のを聞くと、かなり綺麗な音です。
スピーカーが悪いのか、もっと良い音が出るようです。

フォーラムを見ているとSDカードや音源処理でChaNさんの記事の引用が多いです。
ChaNさんの「ELM - 楽しい電子工作  オーディオ関係」等、色々と勉強になる記事が多いです。

Parallax Propeller関連の情報は少ないですが、量より質的のよい的な感じで色々と
勉強になります。

2016年2月17日 (水)

Propeller始めました(21) ポータブルゲーム機の実装 6

注文していたmicroSDカードもージュールが到着したので早速使ってみました。
基板上に抵抗やコンデンサが乗っているので、3.3V系のマイコンではSPI接続で
簡単に利用することが出来ます。5個で$2.98は非常に安いです。

01

到着した製品はこんな感じです。SDカード入れてみるとプッシュして飛び出す形式ではなく
取り出し時は引っ張って取り出します。

Dscn4892

5品をSPI接続にて動作確認して特に問題無し。
早速、LameStationの拡張端子に直接差し込んで利用するための基板を作成しました。

Dscn4897

SDカードだけでSPIを利用するのはもったいないのでSPI接続 16Mバイトフラッシュメモリ
も一緒に乗せました。

Dscn4900

片面基板をピン端子に接続するために、秋月電子で購入した基板用リードフレームを
利用しました。

02

若干、ピンが細くてピンソケットに挿すと緩いので、ハンダでコーティングして厚さを
増強しました。

基板用リードフレームは材質はICのピンと同じ感じなので強度的に心配がありますが、
ピンヘッダが取り付け出来ない片面基板には重宝します。

次に動作確認です。
問題無し。良かった、一発で動作しました。
これでブレッドボードによる外部回路が無くなりすっきりしました。

Dscn4902

せっかく、ここまでやったので以前作成したランチャープログラムの異常系の実装に
着手しました。

異常系として、
  SDカードリーダが無し
  SDカードが刺さっていない状態、
  SDカードがFAT形式でないケース
  SDカード内にあるべきファイルが無い
  液晶モジュールが接続されていない
等です。

これらの異常環境をわざと起こして、実験していたのですが、
本日初めてspin言語に異常等の例外を捕まえる機構があることを発見しました。

今まで、異常発生時にフリーズしてしまうことがあったのですが、
これは異常発生におけるabort状態だったのでした。

このabort状態をキャッチして異常発生の対応が可能です。しかも実に簡単です。

LameLCD液晶表示ドライバの例
  if false == \lcd.Start(gfx.Start)
        cm.Str (String("LCD devie error.",13))

メソッドの前に’\’(半角バックスラッシュ)を付けることでそのメソッドまたは、
その下位のメソッド内のメソッド終了命令abortをキャッチできます。
逆に’\’を付けないとabort命令によりabort状態となり次の処理も実行できません。
見た目上はフリーズした感じになります。

通常はメソッドの実行を終了する場合はreturnを使います。この場合は呼び出し元に
戻りますがabortを使って終了する場合はabort状態となり’\’を使った呼び出し
レベルまで戻ります。’\’を使っていない場合はメインの処理も終了となります。

この機構をもう少し早く知っていれば、異常系の実装の他にデバッグやテストで
もう少し楽が出来ていました。
abortをキャッチしないのでフリーズしたと勘違いしていたケースもあります。

以前作成したライブラリは全くこの機構を使っていないので、見直しと修正が必要です。

標準ライブラリもこの機構を意識して作られています。
SDカード用のライブラリはメソッド内で異常が発生した場合、エラーコードとエラーメッセージを
セットしてabortしてくれています。最上位の一か所でabortをキャッチしてセットされた
エラーメッセージの表示するだけで異常の状況が分かります。

試し異常系として
異常系として、
  SDカードリーダが無し
  SDカードが刺さっていない状態、
  SDカードがFAT形式でないケース
  SDカード内にあるべきファイルが無い
をやってみると、その状況と分かるエラーメッセージが表示出来ました。

SDカードリーダ部(今回作成したモジュール)を取り外してプログラムを実行すると
次のようなメッセージ(2行目の内容)が表示れれました。

Dscn4908

この機構、異常系の状況検出において非常に強力な機能です。
メソッドやライブラリを自作する場合、returnとabortを使い分けることで異常系の
実装もきちんと行えます。

そういえば、arduinoで例外処理(Try Catch Exception)を利用したことがないなぁ
今度使う時は意識してプログラミングをしてみよう。

2016年2月14日 (日)

SPI接続のカラー液晶モジュールの動作確認

Aliexpressで安価なカラー液晶モジュールを入手しました。
LCDコントローラとしてILI9341を採用しているモジュールです。
製品としてはSDカードスロット付き、タッチパネル機能が無いものです。

2.4" 240x320 SPI TFT LCD Serial Port Module 3.3V PBC Adapter SD ILI9341

2.4

安いので、あまり期待していなかったのですが、視野角・発色も良く良い製品でした。
ただし、2.4インチだと若干小さいです。一回り大きい2.8インチ、3.2インチでもよかったかも..

arduino Unoでの動作確認
動作確認には下記のスケッチを利用しました。
  Adafruit 2.8" TFT Touch Shield v2 - Graphics Test
  https://learn.adafruit.com/adafruit-2-8-tft-touch-shield-v2/graphics-test

Arduino IDE 1.06では、コンパイルするとエラーが発生します。
関数 yield() が利用出来ないようです。Arduino IDE 1.6.7では問題ありませんでした。

Arduino UNO

製品としては問題なく動作しました。表示も速いです。

次に、プロペラ(Parallax Propeller)にて試して見ました。
動作確認には次の公開ソースを利用しました。
  Propeller Object Exchange - ILI9341 SPI driver
  http://obex.parallax.com/object/723

配線においてちょっと悩みました。サンプルプログラムではピン接続が次のように
なっているのですが、nRESET と RS が何処に接続するのは今一分かりません。

nRESET= 22

RS = 23

nCS = 24

MOSI = 25

SCLK = 27

MISO = 26

色々試してRS は 製品ボード上のD/Cピン、 nRESETは RESET と判明しました。

Propeller

現在製作中のLameStationも次期バージョンはカラー液晶にしても良いかも..

2016年2月10日 (水)

Propeller始めました(20) ポータブルゲーム機の実装 5

前回ランチャーメニューを作ったのですが、英語だとちょっと表示が寂しいので、
日本語表示が出来たらいいなぁと思いやってみました。

取りあえず、日本語表示部分の仮実装が出来ました。

Dscn4850

方式としてはSDカード上に漢字フォントデータファイルを置いておいて、該当文字コードの
フォントを取得して液晶ディスプレイに表示するという感じでやってみました。

今後の拡張を考えて、文字コードはUTF8を使っています。
SDカード内のテキストファイルを読んで表示なんかもやってみたいです。

フォントの表示はLameStationのスプライト表示機能にて行っているので、
やろうと思えば1文字単位で”うねうね”と動かすことも出来ますね(たぶん)。

日本語表示部分は次のような感じです。

PUB demo4
    setPos(0,0)
    setFontSize(24)
    setColor(0,1)    
    addHSpace(4)
    Str(String("日本語表示"))
    newLine   
    setFontSize(12)
    setColor(1,0)
    addSpace(2,2)
    Str(String("取りあえず出来ました。"))
    newLine   
    setFontSize(10)
    addSpace(2,2)
    Str(String("UTF8・マルチフォント対応!"))
    newLine   
    addSpace(4,2)
    Str(String("ただし半角カタカナ非対応")) 
    lcd.DrawScreen  

面倒な座標指定を減らす感じにしています。

次のステップとしては、これをライブラリ化して、動作確認として
SDカード上の日本語テキストファイルを読んで表示するなんてのをやろうと思います。
テスト後はランチャーメニューの日本語化をやります。


2016年2月 5日 (金)

Propeller始めました(19) ポータブルゲーム機の実装 4

実質的にSDカードからブードが出来ることが分かったので、今度はブートするプログラムを
選択できるランチャーメニューを実装しました。

ランチャープログラムはEEPROM上に書きこみます。
ハードウエア的にリセットがかかるとEEPROM上のランチャーメニューが起動します。

ランチャープログラムは、選択されたプログラムをSDカードからロードしてメインRAM
に書きこみます。その後ソフトウェアリセットにより、ロードしたプログラムが実行されます。

Dscn4830

操作としては、
ジョイスティック操作でメニューをスクロールさせて起動したいプログラムを選択します。
選択中のプログラムの説明を下段に表示します。

リセットボタンを押すことランチャープログラムがロードされて、メニュー画面に戻ります。

実際の操作の様子
(デジカメでの動画撮影なのでちょっと映像が劣化しています)


メニューに表示されるプログラム一覧は、SDカード内のテキストファイルに定義して
います。ランチャープログラムがその内容を読んで表示します。

ランチャーさえあれば、簡単にプログラムの入れ替えが出来ます。
SDカードだとプログラマやシリアル接続不要ですね。
こほ方式は色々と使えそうです。

ランチャープログラムのソースはこんな感じです。

{{
    LameStation SDカードローダー
}}

CON
    _clkmode        = xtal1 + pll16x
    _xinfreq        = 5_000_000
  
    'SDカード PIN接続
    sdDO  = 16        'EX0(P16)
    sdCLK = 17        'EX1(P17)
    sdDI  = 18        'EX2(P18)
    sdCS  = 19        'EX3(P19)

VAR
    'メニュー情報
    byte    text[2048]  'メニューファイルバッファ
    long    index[32]   'インデックス
    long    count       '登録数
    long    pos         'メニューファイルバッファ用ポインタ

    'メニュー表示用
    long    mnTop       'タイトル表示開始先頭番号
    long    mnSelect    'メニュー上の選択位置(0~3)

OBJ
    cm          : "LameSerial"
    sd          : "SD-MMC_FATEngine"
    lcd         : "LameLCD"
    gfx         : "LameGFX"
    txt         : "LameText"
    fn          : "LameFunctions"
    ctrl        : "LameControl"
    font_6x8    : "gfx_font6x8_normal_w"
    font_6x8b   : "gfx_font6x8"
    font_4x6    : "gfx_font4x6"

PUB Main | ctrlChange,prevCtrl,ctrlCode,fname,p
    mnTop := 0          'ランチャーメニューリスト先頭
    mnSelect := 0       '選択カーソル先頭
    prevCtrl := 0
    ctrlCode := 0
    cm.Start

    lcd.Start(gfx.Start)        
    gfx.ClearScreen(0)
  
    count:= LoadMEnu    'メニューデータをSDカードからロード
    DrawMenu            'ランチャーメニュー表示

    'ランチャーメニュー 操作
    repeat
        '操作状態取得
        ctrl.Update     
        prevCtrl := ctrlCode
        if ctrl.B 'タイトルを選択決定した
            p:= index[mnTop+mnSelect]
            repeat while text[p++] <> 0 
            fname := @text[p]
            quit           
        if ctrl.Down
            ctrlCode := ctrl.Down
        elseif ctrl.Up
            ctrlCode := ctrl.Up
        else
            ctrlCode := 0       
        if prevCtrl <> ctrlCode
            '操作に変化があった場合は表示の更新を行う             
            if  ctrl.Down 
                if mnSelect < 3
                    mnSelect++
                else
                    if mnTop < count-4
                        mnTop++
                    else
                        mnTop := 0
                        mnSelect := 0 
            if ctrl.Up
                if mnSelect > 0
                    mnSelect--
                else
                    if mnTop > 0
                        mnTop--
                    else
                        mnTop := count-4
                        mnSelect := 3
            if ctrlCode <> 0
                DrawMenu 
   
    Run(fname)

'メニュー画面表示
PUB DrawMenu |title,fname,info,i,p
    'メニュー部    
    gfx.ClearScreen(0)
    txt.Load(font_6x8b.Addr, " ", 6, 8)
    txt.Str(string("[Menu]"),0,0)
    
    'タイトルリスト部
    txt.Load(font_6x8.Addr, " ", 6, 8)
    repeat i from mnTop to (mnTop+4 <# count)-1               
        title := @text[index[i]]
        if (i<10)
            txt.Dec(i,12, 8 + (i-mnTop)<<3)     
        else
            txt.Dec(i, 6, 8 + (i-mnTop)<<3)     
        txt.Str(String(":"), 17, 8 + (i-mnTop)<<3)
        txt.Str(title, 23, 8 + (i-mnTop)<<3)
    txt.Str(String("*"), 0, 8 + (mnSelect)<<3)
       
    '選択したタイトルの説明表示
    p:= index[mnSelect+mnTop]
    repeat while text[p++] <> 0 
    repeat while text[p++] <> 0 
    txt.Load(font_4x6.Addr, " ", 4, 6)  
    txt.box(@text[p],0,40,128,18)    
    lcd.DrawScreen    

'指定イメージファイルによるブート
PUB Run(filePathName) : statusVal | statusStr 
  ifnot sd.partitionMounted
    Mount(0)

  statusStr := \ sd.bootPartition(filePathName)
  statusVal :=   sd.partitionError

PRI Mount(partition) : statusVal | statusStr
  ifnot sd.CogStatus
    Start    
  statusStr := \ sd.mountPartition(partition)
  statusVal :=   sd.partitionError

PRI Start : okay | statusStr     
  ifnot sd.CogStatus
    okay := sd.FATEngineStart(sdDO, sdCLK, sdDI, sdCS, -1, -1, -1, -1, -1)

'SDカードからメニュー情報を取得する
PUB LoadMenu | d,i
    pos  := 0
    i := 0

    'SDカードのマウント
    sd.fatEngineStart(sdDO, sdCLK, sdDI, sdCS, -1,-1,-1,-1,-1) 
        sd.mountPartition(0) 
    if strcomp( sd.listEntry(@myfname), @myfname )
        abort

    'メニューファイルのオープン    
    sd.openFile( @myfname, "R" ) 
    if sd.partitionError
       cm.Str( string("File I/O Error.",13) )
       abort
    
    'データの読み込み
    index[i]:=0
    repeat while d := sd.readByte    
       if d == "|" 'カラム区切り
            text[pos++] := 0                  
       elseif d == $0a 'LFは行終端
            text[pos++] := 0
            index[++i]:= pos
       elseif d => 32  'CRはスキップ '通常の文字    
            text[pos++] := d
   
    'ファイルのクローズ
    sd.closeFile
    
    'パーティションのアンマウント
    sd.unmountPartition 
    'エンジン解放
    sd.FATEngineStop
    result := i+1

DAT
'ファイル名
myfname         byte "menu.txt",0    

2016年2月 1日 (月)

Propeller始めました(18) ポータブルゲーム機の実装 3

プロペラを使ったポータブルゲーム機 LameStationにmicroSDカードを搭載しようと挑戦中です。

Dscn4822

オリジナルのLameStationはプレイするゲームを変更するたびにパソコンに接続して
開発環境でコンパイルして書き込む必要があり、少々使い勝手が悪いです。

何とかmicroSDカード上の任意のイメージファイルを選択してブートする方法は無いかと
試行錯誤中です。

取りあえず、SDカードは認識してファイルのアクセスは出来るようになりました。
秋月電子のマイクロSDカードスロットDIP化キットを使って下記のような感じの回路を
ブレッドボード上に実装して接続しました。

回路図はparallax社のホームページで公開している「SD Card Data Storage」
参考にしました。

SDカードからのブートについては、microSDカードリーダ搭載の純正ボードの
"Propeller Board of Education "にて実現可能な記事を見つけました。
記事:  Make One Program Launch Another

流用で出来そうです。何とかなりそうです。
プロペラってこんなこと出来るんですね。

話変わって、"LameStation"の"Lame"ってどういう意味かを調べたら、"不自由な"
っていう意味合いなのですが、確かに不自由と言えば不自由か..

2016/02/02 追記
SDカードからのブートが出来ました。プログラムはライブラリの関数を利用することで
簡単に実現出来ました。プログラムは次のような感じです。

{{
    LameStation SDカードローダー
}}

CON
    _clkmode        = xtal1 + pll16x
    _xinfreq        = 5_000_000
  
    'SDカード PIN接続
    DO  = 16        'EX0(P16)
    CLK = 17        'EX1(P17)
    DI  = 18        'EX2(P18)
    CS  = 19        'EX3(P19)

OBJ
  sd   :   "SD-MMC_FATEngine"

PUB go
  Run(String("TANKBA~1.EEP"))

PUB Run(filePathName) : statusVal | statusStr 
  ifnot sd.partitionMounted
    Mount(0)

  statusStr := \ sd.bootPartition(filePathName)
  statusVal :=   sd.partitionError

PRI Mount(partition) : statusVal | statusStr
  ifnot sd.CogStatus
    Start    
  statusStr := \ sd.mountPartition(partition)
  statusVal :=   sd.partitionError

PRI Start : okay | statusStr     
  ifnot sd.CogStatus
    okay := sd.FATEngineStart(DO, CLK, DI, CS, -1, -1, -1, -1, -1)
 

ライブラリではロングファイル名に対応していないため、8.3形式のファイル名で
ファイルを指定する必要があります。
8.3形式のファイル名はWindowsのコマンドプロンプトで"dir /X"で確認できます。

下記の写真はSDカードから起動した様子です。

Dscn4824

SDカードは容量4Gバイト FAT16です。
起動するプログラムはSDカード上にEEPROMイメージの形式のファイルとして
"TankBattle.eeprom"というファイル名で書きこんでいます。
8.3形式のファイル名だと"TANKBA~1.EEP"となります。

EEPROMイメージの形式の作成は、開発環境にて出来ます。
ただし、私が使っている PropellerIDE で作成したイメージではブート出来ませんでした。
Parallax社純正の開発環境 PropellerToolで作成すると正常起動しました。

一々別の開発環境で作成するのも面倒なので、openspinというコマンドラインで
利用するコンパイラを利用することで作成することにしました。バッチコマンドを作成して、
そのコマンドにソースのアイコンをドロップすることで簡単に作成できるようにしました。

バッチファイル makerom.bat

中身

openspin %1 -e -L "C:\Program Files (x86)\PropellerIDE\library\library" -L E:\Propeller\lamestation\lamestation-sdk-rc2-0.4.0

2016年1月27日 (水)

Propeller始めました(17) ポータブルゲーム機の実装 2

ちびちびと実装を進めていましたLameStationがほぼ完成しました。

Dscn4784

いい感じに仕上がりました。
写真は試しにLameStation SDKのサンプルゲームを書きこんで動かしている状況です。

Dscn4778

実装は本家のLameStationの構造とはちょっと異なります。
既存のQuickStartボードを拡張する形(Arduinoのシールド形式)で実装しました。

表面実装の2x20ピン(オス)を利用してQuickStartボードを拡張するようにしました。

Dscn4738

この方法は今後も色々と使えそうです。

Dscn4775

基板の下には、ダイソーで買った発泡スチロールのボードを取り付けました。
このボードは加工しやすく、強度もそこそこあるのでケースや車体なんかの利用に
良いです。

実際の動作の様子です。片手にカメラを持って撮影しているため、ゲーム操作は適当です。
遊び方も今一分かりませんでした。


このゲーム機の実装で色々と勉強出来ました。
SDKのライブラリを使って何か作る予定です。

ライブラリにはスプライト表示やマップ表示などが充実しており、ちょっとしたゲームが
簡単に作れそうです。


2016年1月10日 (日)

Propeller始めました(16) ポータブルゲーム機の実装 1

LameStationのサイトの情報を元にポータブルゲーム機を実装することにしました。

Dscn4679

まずは一番のかなめである液晶ディスプレイを実装してみました。
LameStationのサイトの解説では、KS0108 LCDを利用しているとの記載があります。
そこで、手持ちの秋月の「LCDグラフィック・ディスプレイモジュール(液晶表示器)TG12864B-02WWBV」
を試したところ、問題なく表示出来ました。

Dscn4673

この液晶ディスプレイは2色表示のはずですが、PWM的な操作で見た目上の
中間色を再現しています。若干中間色のドットはチラつきが発生します。

若干、液晶の表示速度が遅いようでスプライト表示のデモプログラムを試したところ、
見えにくい状況でした。

液晶モジュールとプロペラ間のデータ通信の結線には15Ωの抵抗が入っています。
ダンピング抵抗というものだそうです。なくても動くようですが、とりあえず回路図に
従って入れました。

次は、ジョイスティックまわりを実装して操作が出来るようにしてみます。



2016年1月 7日 (木)

ゲームコンソールキット LameStation

面白そうなキットを見つめました。
LameStationという製品で プロペラを使ったポータブルゲームコンソールキットのようです。

http://www.lamestation.com/

似たようなキットはいくつか存在しますが、解説ドキュメントの内容が丁寧で素晴らしいです。
LameStation Manual Latest Home https://lamestation.atlassian.net/wiki/display/LAME/

キットは日本からの購入は出来ないようですが、回路図や必要パーツが公開されているので、
自力で部品を集めて自作したいですね。

2016年1月 3日 (日)

Propeller始めました(15) 温度センサーSTTS751を試してみる

ADコンバーター機能を持たないプロペラで温度を測定したいと思い、
「高精度12ビットI2C接続デジタル温度センサ STTS751」を試してみました。
秋月電子で1個100円で販売されているものです。

主な仕様
・型番       STTS751-0WB3F
・パッケージ      SOT-23-6 (6ピン)
・インタフェース  I2C (4種類のアドレス設定可能)
・電源電圧        2.25 ~ 3.6V
・測定温度範囲  -40 ~ 125℃
・分解能               9 ~ 12ビット(設定可能)

実際の製品画像

02

変換基板にて6ピンDIPに変換します。

Dscn4662

取りあえず、使い方としては次のような感じで接続します。
Addr/Thermピン、EVENTピンにてI2C経由とは別の通知機能(出力)がありますが、
今回は使わないのでGNDに接続しています。

03_2

Addr/Thermピンはプルアップ抵抗にてアドレスの設定を行うことが出来ます。



7.5K~33KΩのプルアップ抵抗にて 4つの異なるアドレスを指定することが出来ます。
GNDに接続した場合の仕様についても記載があり、Note:の箇所にアドレスが
device STTS671-0 の場合は 72h となります。

なので、抵抗なしで I2Cスレーブアドレスは 72h となります。

自作プロペラボードにて動作確認してみます。

Dscn4661

プログラムソース(Spinコード)下記のような感じとなります。

{{
 I2C接続温度センサ STTS751を使う
}}

CON
    {システムクロック設定 6Hhz×16=96Mhz}
    _clkmode = xtal1 + pll16x
    _xinfreq = 6_000_000
    
    I2CADR  = $72    'I2Cスレーブアドレス
    SCL_PIN =  28    'I2C SCLピン番号
OBJ
    i2c     : "Basic_I2C_Driver_1"
    cn      : "Parallax Serial Terminal"

{メイン処理}

PUB main | v,tH,tL,s,t1,t2, dt
    cn.Start (115200)
    i2c.Initialize(SCL_PIN)
    
    '設定
    stts751_writeByte(3,%1000_11_00)    'Configurationレジスタの設定   :EVENT無効、解像度12ビット
    stts751_writeByte(4,5)              'Conversion rateレジスタの設定 :1秒間に2回サンプリング
    
    '製品情報取得
    v := stts751_readByte($fd)
    cn.Str (string("Product ID register: "))
    cn.Hex (v,2)
    cn.str (string("h",13))
    
    v := stts751_readByte($fe)
    cn.Str (string("Manufacturer ID: "))
    cn.Hex (v,2)
    cn.str (string("h",13))

    v := stts751_readByte($ff)
    cn.Str (string("Revision number: "))
    cn.Hex (v,2)
    cn.str (string("h",13))
   
    '温度データ取得
    repeat
        tH:= stts751_readByte(0) '上位
        tL:= stts751_readByte(2) '下位(小数点以下)
        s := tH & $80            '符号取得
        t1:= th & $7f
        t2:= 0
        if tL & %1000_0000 <> 0
            t2+= 5000
        if tL & %0100_0000 <> 0
            t2+= 2500
        if tL & %0010_0000 <> 0
            t2+= 1250
        if tL & %0001_0000 <> 0
            t2+= 625

        cn.Str (string("temperture: "))
        if s <> 0
            cn.str (string("-")) '0度以下の場合、符号表示                   
        cn.dec(t1)
        cn.str(string("."))                    
        cn.dec(t2)
        cn.Char (13)                    
        waitcnt(cnt+80_000_000)      

{
  STTS751のレジスタ値参照
  adr : レジスタアドレス
  戻り値: レジスタ値
}
PUB stts751_readByte(adr)
    '参照レジスタの設定
    i2c.Start(SCL_PIN)
    i2c.Write(SCL_PIN, I2CADR)
    i2c.Write(SCL_PIN, adr)

    '1バイトデータ取得
    i2c.Start(SCL_PIN)    
    i2c.Write(SCL_PIN, I2CADR|1)
    result := i2c.Read(SCL_PIN,1)
    i2c.Stop(SCL_PIN)

{
  STTS751のレジスタ値設定
  adr : レジスタアドレス
  d   : 設定値  
  戻り値: なし
}
PUB stts751_writeByte(adr,d)
    '参照レジスタの設定
    i2c.Start(SCL_PIN)
    i2c.Write(SCL_PIN, I2CADR)
    i2c.Write(SCL_PIN, adr)
    i2c.Write(SCL_PIN, d)

実行結果はこんな感じです。

01

プログラム的にはデバイスの初期設定として、EVENTを使わない設定と解像度を12ビット
とする指定とサンプリング周期を1秒に2回としています。
初期化後は、製品情報を表示後、1秒間隔で温度データを取得して表示しています。

プロトコル的には非常にシンプルなので3.3V系のARMベースのラズパイ、Icihgojamでも
簡単に使えると思います。