フォト
2025年3月
            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始めました(8) スピーカーで音を出してみる | トップページ | Propeller始めました(10) ビデオ出力で日本語表示 »

2015年12月 1日 (火)

Propeller始めました(9) I2Cデバイスを利用する

Propeller搭載 QuickStartボードを使って初めてのI2Cを使ってみました。

IcihgoJam用に製作したHT16K33を使った8x16LEDマトリックモジュールを繋げてみました。
Propeller用のI2Cライブラリはいくつかありますが、今回はSpin言語のみで実装している
Basic_I2C_Driverを使ってみました。

プログラムは下記の通りです。
{{ File: LED_Matrix.spin
   8x16LEDマトリック表示制御 by たま吉さん 2015/11/28    
   I2C接続LEDドライバHT16K33を使った8x16のLEDマトリックスを制御する
}}

CON
    {システムクロック設定 5Hhz×16=80Mhz}
    _clkmode = xtal1 + pll16x
    _xinfreq = 5_000_000
  
    {HT16K33 利用ピン,アドレス}
    SCL_PIN = 5         'I2C SCLピン
    SDA_PIN = 6         'I2C SDAピン
    I2CADR  = $70<<1    'HT16K33のアドレス(8ビットアドレス)

    {HT16K33 コマンド}
    HT_CMS_DATA       = $00 'データ送信
    HT_CMD_SYSSET     = $20 'システムセットアップ
    HT_CMD_BLINK      = $80 '点滅表示周期の設定
    HT_CMD_BRIGHTNESS = $E0 '明るさの設定
    
    {HT16K33 レジスタ設定値}
    HT_SYSSET_OSC_ON  = 1
    
    {HT16K33 点滅表示周期 設定値} 
    HT_BLINK_OFF        = %00000000
    HT_BLINK_DISPLAY_ON = %00000001
    HT_BLINK_2HZ        = %00000010
    HT_BLINK_1HZ        = %00000100
    HT_BLINK_05HZ       = %00000110                       

VAR  
    word    buf[8]  'HT16K33 表示パターンバッファ 横16ドットx縦8ドット
    byte    str[16]
OBJ
    i2c     : "Basic_I2C_Driver_1"
    debug   : "Parallax Serial Terminal"
    f       : "Float32.spin" 

{メイン処理}
PUB main | i,x,y,d,f_rd, f_x, f_y,f_dv,f_dx
    debug.Start (115200)
    i2c.Initialize(SCL_PIN)
    f.start
       
    ht_clear
    ht_init
    
    repeat
        repeat i from 0 to 7
            ht_clear_buffer
            ht_write_at(@msg_saitama[0], i-7, 0)
            ht_write_at(@msg_saitama[8], 15-i, 0)        
            ht_update
            waitcnt(clkfreq/1000 * 100 + cnt)       
        waitcnt(clkfreq/1000 * 500 + cnt)       
        repeat i from 0 to 7
            ht_clear_buffer
            ht_write_at(@msg_saitama[0], 0, -i)
            ht_write_at(@msg_saitama[8], 8, i)        
            ht_update
            waitcnt(clkfreq/1000 * 100 + cnt)       
        waitcnt(clkfreq/1000 * 2000 + cnt)       
           
        
        f_rd := 0
        f_x  := 0.0
        f_dv := f.FDiv (PI, 5.0)
        f_dx := f.FDiv (16.0, 80.0)
        'repeat 
        repeat 2
            f_rd := 0.0
            f_x  := 0.0
            repeat i from 0 to 80
                f_x := f.FAdd (f_x, f_dx)
                f_y := f.FAdd (f.FMul (f.Cos (f_rd), 8.0), 8.0)
                ht_clear_buffer
                ht_write_at(@msg_saitama[0], f.FTrunc (f_x) , f.FTrunc (f_y))
                ht_update
                waitcnt(clkfreq/1000 * 100 + cnt)       
                f_rd := f.FAdd (f_rd, f_dv)    
        waitcnt(clkfreq/1000 * 500 + cnt)       

        d := 1
        repeat 2
            repeat y from 0 to 7
                repeat x from 0 to 15
                    ht_set_dot(x, y, d)
                    ht_update
                    waitcnt(clkfreq/1000 * 20 + cnt)
            d:= !d & 1       

{HT16K33 初期化}
PUB ht_init
  ht_cmd(HT_CMD_SYSSET, HT_SYSSET_OSC_ON)                  'システムオシレータをONにする
  ht_cmd(HT_CMD_BLINK, HT_BLINK_DISPLAY_ON | HT_BLINK_OFF) '点滅表示周期の設定
  ht_cmd(HT_CMD_BRIGHTNESS, 0)                             '明るさの設定    

{HT16K33 コマンド送信}
PUB ht_cmd(cmd, prm)
    i2c.Start(SCL_PIN)
    i2c.Write(SCL_PIN, I2CADR)
    i2c.Write(SCL_PIN, cmd|prm)
    i2c.Stop(SCL_PIN)

{表示パターンの送信}
PUB  ht_update | i
    i2c.Start(SCL_PIN)
    i2c.Write(SCL_PIN, I2CADR)
    i2c.Write(SCL_PIN, HT_CMS_DATA)

    {16バイト分パターンデータ送信}
    repeat i from 0 to 7
        i2c.Write(SCL_PIN, buf[i]& $FF)
        i2c.Write(SCL_PIN, buf[i]>>8)

    i2c.Stop(SCL_PIN)

{バッファクリア}
PUB ht_clear_buffer | i
    wordfill(@buf, 0, 8)

{表示のクリア}
PUB ht_clear
    ht_clear_buffer
    ht_update
    
{バッファの指定座標のON/OFF}
PUB ht_set_dot(x, y, d)
    if d
        buf[y] |= $80_00 >>x
    else
        buf[y] &= !($80_00 >>x)

{バッファ上の指定座標に8x8パターンをセット(負座標指定可能)}
PUB ht_write_at(fptr, x, y) | i               
    if (x > 15) or (y > 7) or (x < -7) or (y < -7)
        return    
    repeat i from 0 to 7                   
        if i + y => 0 and i + y < 8
            if x =< 8
                buf[i + y] |= byte[fptr][i]<<(8 - x)
            else
                buf[i + y] |= byte[fptr][i]>>(x-8)
                                      
DAT
msg_saitama     byte $08,$08,$7E,$04,$24,$40,$3C,$00  'さ
                byte $00,$88,$84,$82,$82,$50,$20,$00  'い
                byte $20,$F0,$2E,$40,$48,$50,$8E,$00  'た
                byte $08,$7E,$08,$7E,$08,$7C,$7A,$00  'ま

Spin言語は超マイナー(プロペラ以外の使い道無し)ですが、
使いやすい言語です。

« Propeller始めました(8) スピーカーで音を出してみる | トップページ | Propeller始めました(10) ビデオ出力で日本語表示 »

Propeller」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: Propeller始めました(9) I2Cデバイスを利用する:

« Propeller始めました(8) スピーカーで音を出してみる | トップページ | Propeller始めました(10) ビデオ出力で日本語表示 »