人気ブログランキング |

体重と今日食べたもの

k1segawa.exblog.jp

ダイエット

ブログトップ

2016年 08月 30日 ( 3 )

(2016/9/1修正)
前記事のプログラムが冗長なので、Flashよりずっと許容回数の多いEEPROMにDATA文を置いて短くしてみた。
結果、50バイト程度のHEXファイルの減少と、プログラムからのEEPROM活用方法が分かった。

まず、いつもやっているのだが、毎回CPUの設定をするのは面倒なので、前回のソースを開いて、[File][Save as ...]で別名で保存する。その時「Leave File old CFG file ?」(古いCFGファイルは残す?)みたいに聞かれるので、Yesを押す。
CFGファイルがCPUの設定だが、前のCFGファイルを残さないと戻れなくなるので。

新しいソースはそこから修正して作っていく。

で今回プログラムが長くなるとコンパイル後のHEXでFlashが圧迫され、固定データが増えたらプログラムのSRAM領域が足りなくなるので、64バイトのEEPROMにデータ文を退避した。
HEX書き込み時のFlashが1万回、EEPROMが10万回なので安心してもっと活用していい。

プログラムが変わり、窮屈(Out of SRAM)になったのでSRAM 64バイトの構成を変えた。
framesize = 16 → 8 だが、
hwstack = 32 → 16 でもよい。

ソース:
$regfile = "attiny13.dat"
$crystal = 9600000
$hwstack = 32
$swstack = 4
$framesize = 8
Config Scl = Portb. 1
Config Sda = Portb. 0
Config I2cdelay = 5
Declare Sub G_i2cwrite(byval D As Byte)
Dim A As String * 10
Dim I As Integer
Dim Cmd As Byte
Dim Wt As Byte
Dim W As Integer

I2cinit
Waitms 40
For I = 0 To 8
W = I * 2
Readeeprom Cmd , W
Incr W
Readeeprom Wt , W
Call G_i2cwrite(cmd)
Waitms Wt
Next I
A = "@Hello123"
'Incr W
'Readeeprom A , W
I2csend &H7C , A , 9
End

Sub G_i2cwrite(byval D As Byte)
I2cstart
I2cwbyte &H7C
I2cwbyte &H80 (2016/9/1修正 0→&H80)
I2cwbyte D
I2cstop
End Sub

' ATtiny13 EEPROM=64byte, rewrite 100,000
$eeprom
Data &H38 , 1 , &H39 , 1 , &H14 , 1 , &H70 , 1 , &H52 , 1
Data &H6C , 200 , &H38 , 1 , &H0C , 1 , &H01 , 2
'Data "@Hello246"
$data
Helloの文自体もDATA文に落とそうとしたがちょっとうまくいかなかった。
DATA文を$eeprom ~ $dataで囲み、Readeeprom 格納変数, EEPROM読出し開始位置(バイト) で格納変数にEEPROM(先頭は0)の任意の位置のデータを読み出す。データの1は2.7usを1msに置換したもの。ワーク変数Wを使ったのはReadeeprom命令でI*2のように式を書けなかったから。

by k1segawa | 2016-08-30 21:01 | arduino, AVR | Comments(0)
RaspberryPiで使用しているパッケージマネージャ synapticをインストール。
apt-getでもいいけど、何が入っているかGUIで調べやすい。

sudo apt-get install synaptic
sudo synaptic
で起動。
ionice: ioprio_set が失敗しました: 無効な引数です、と出るけど何とかOK。
a0034780_09525898.jpg
日本語入力はこちらのサイト様を参考に。
俺の Bash on Windows10 環境 - Qiita
sudo apt-get install uim-fep uim-anthy
上のsynapticでuimを検索してインストール指定してもいい。

~/.uim
(define default-im-name 'anthy)
(define-key generic-on-key? '(" " "`"))
(define-key generic-off-key? '(" " "`"))

次は、うちの環境では最後の行を定義するとbash on Ubuntuで起動したルートのbash自体がエラーになって、立ち上がらなくなって詰むのでコメントアウトしている。
~/.bashrc
export XMODIFIERS=@im=uim
#exec uim-fep -e bash
(ここまで)

lxterminal &
(lxterminal上で)
uim-fep

末尾行にantyh[An- R]と表示されれば成功。
コントロール+スペースで、ON/OFF
(各端末でuim-fep起動しなければならないので、ルートと区別する方法があれば何とかしたい)

詰んだ時の直し方:
デスクトップのbashショートカットを読む。コマンドプロンプト(管理者権限)を開き、
cd c:\windows\system32
bash.exe --norc (.bashrcを読み込まない)
cd /home/xxxxx (ユーザ名)
ed .bashrc (edで編集。総行数が表示される)
p (定義が最終行ならexec uim-fep -e bashと表示される)
d (カレント行削除)
p (最終行export XMODIFIERS=@im=uimと表示される)
w (書き込み)
q (ed終了)
bash - コマンド (プログラム) の説明 - Linux コマンド集 一覧表 - kazmax Linuxで自宅サーバー のサイト様でbashの起動オプション詳細を参照の事。

by k1segawa | 2016-08-30 09:55 | X-Window | Comments(0)
(2016/9/1修正)
BASCOM-AVRでI2Cを制御する。
秋月で買った8x2ミニ液晶 AQM0802A-RN-GBW を制御。
ブレッドボード変換基板に乗せてVDD,RESET,SCL,SDA,GNDの5 Pinにする。
必要なコンデンサ、プルアップ抵抗は全て有効活用。変換基板のPUは両方とも結線する。
ATtiny13の内部プルアップ抵抗は使わない。外部抵抗10kΩをSCL,SDAに接続する。
変換基板のPUを結線した場合は下図の10kΩ抵抗×2は必要無い。

回路:
米粒AVRでI2C通信を使ってLCD表示のサイト様の回路図を参考に。
a0034780_04113900.jpg
Japaninoもミニ液晶もfritzingにないので代用で。WriterとLCDの差を見ながら配線。VDDが離れているのは抵抗を短く描けなかったから。

BASCOM-AVR:
I2Cを試す。(ATTiny2313編) - 団塊親父のブログ のサイト様のソースを参考に。
BASCOMの「くせ」 のサイト様の通り、i2c.LBXを編集する。
BASCOM-AVRの実行形式のディレクトリ/LIBの中にある。
編集するには、i2c.LBXを[右クリック][プロパティ][セキュリティタブ][編集ボタン][Users(xxxxx)選択][書き込み許可ON][適応ボタン]を押す。
以下の通り、28行目を書き換え、コンパイルエラーになるので[書き込み許可OFF]に戻す。
旧:* sbi  _sclDDR,_SCL
新:* cbi _sclDDR,_SCL
かつ今回の回路は5Vなので、
Netduinoシリアル通信(I2C)でLCD表示 のサイト様の、下の方に「リスト1 LCD接続のためのサンプルコード」の欄外の、
『5. データシートでは3.3V用に「0x56」になっているが、「0x04」(=ブースター回路On/Off)を「0」(off)にすることで、入力電圧5Vをそのまま使用する』との記述に従い、56→52に修正する(ボタン電池の3.3Vならそのまま)。

ソース:
$regfile = "attiny13.dat"
$crystal = 9600000
$hwstack = 32
$swstack = 4
$framesize = 16
Config Scl = Portb. 1
Config Sda = Portb. 0
Config I2cdelay = 5
Declare Sub G_i2cwrite(byval D As Byte)
Dim A As String * 10

I2cinit
Waitms 40
Call G_i2cwrite(&H38)
Waitus 27
Call G_i2cwrite(&H39)
Waitus 27
Call G_i2cwrite(&H14)
Waitus 27
Call G_i2cwrite(&H70)
Waitus 27
Call G_i2cwrite(&H52) '56->52
Waitus 27
Call G_i2cwrite(&H6c)
Waitms 200
Call G_i2cwrite(&H38)
Waitus 27
Call G_i2cwrite(&H0c)
Waitus 27
Call G_i2cwrite(&H01)
Waitms 2

A = "@Hello123"
I2csend &H7C , A , 9
End

Sub G_i2cwrite(byval D As Byte)
I2cstart
I2cwbyte &H7C
I2cwbyte &H80 (2016/9/1修正 0→&H80)
I2cwbyte D
I2cstop
End Sub
買った部品の説明書の「初期化設定例」の通りコマンドを発行。
G_i2cwriteはユーザ定義関数。
8桁の文字列は先頭に@を1文字追加。
$hwstack = 32
$swstack = 4
$framesize = 16
Config Scl = Portb. 1
Config Sda = Portb. 0
は、[Options][Programmer][Compilerタブ][Chipタブ]/[I2C,SPI,1WIREタブ]より優先される。stackなどの値はソース内の制御命令や配列などの追加に従い、調整する。図はHelloだがHello123と表示する。文字列はNULL分を+1して確保するため10で宣言する。
Arduino IDEだとI2Cライブラリも含めると相当大きいだろう。BASCOM-AVRだとI2CxxxがI2Cライブラリで682バイトで済む。
ATtiny13の使えるピンは少なくとも3(=5-2)個余ってるのでSPI接続のセンサーで入力して表示するといいかも。ボタン電池で動くようにするには、Writerに対応する線(オレンジ2本~白2本まで)全てを取り外し、VDDにボタン電池の+を、GNDにーをつなげばよい(52→56も)。Pin 1のPB5(RESET)はつながなくても動くが、不安定なのでVDDと10kΩ抵抗で結ぶとなお良い。
by k1segawa | 2016-08-30 02:05 | arduino, AVR | Comments(0)