人気ブログランキング | 話題のタグを見る

体重と今日食べたもの

k1segawa.exblog.jp

ダイエット

ブログトップ

Japanino ArduinoISPで ATtiny13 の BASCOM-AVRでの software serial - ソフトUARTの実験(4) (31) (11/16)

シリアル通信のプログラムは1バイト毎に遅延時間を設けていた。しかし、8x8LEDMatrixは1バイトで1列分のデータ×8列なので8バイトずつ受信するつもり。それのテストを行なってみた。

最初テキスト8文字で1行の以下のファイルを送信した。
A1A2A3A4
B1B2B3B4
C1C2C3C4
D1D2D3D4
E1E2E3E4
F1F2F3F4

このデータをAの変数でなくD(8)配列で受けるようにソース修正した。
Dim A As Byte → Dim D(8) As Byte
Serin A,1 → Serin D(0),8
A=&H41 → D(0)=&H41

これはうまくいった。しかし、
A1A2A3A4
B1B2B3B4
A1C2C3C4
D1D2D3D4
E1A2E3E4
F1F2F3F4

にして、
D(2)=&H41
に変えたらおかしくなった。

E行が反応せず、合計6回なのに5回しか点滅しない。

いくつかオシロスコープで見たりしたが、はっと気が付いた。改行コードも送られてきてるのか?
D(9)にして、8→9に直すと正常に動作した。

そうか~当たり前だよなぁ。テキストと言っても改行は送っているんだから0x0Dが送られるはずだ。でもCRLFはファイル転送だとCRに変換しているのか?
そのためファイルの改行がCRでもCRLFでもCRに変換して送信している事をファイルを作って確認した。

では、バイナリファイルは?
やっぱりTeraTermのマクロで送信しないと無理なのかな、とマクロについて調査した。そして色々やって出来たのが以下のマクロ。

Sendbin.ttl:(Hexファイル→バイナリ送信マクロ)
/*
[Setting][Terminal][KanjiSend] =SJIS
Hex to bin :format("HLHLHL...HL"+CR+LF),HL*8,CR(0x0d),LF(0x0a)
Send bin , bin 8byte + wait 1500ms
*/

/* start ---- */

connect '/V /I /F=TERATERM_ATtiny13.ini' ; V:hide,I:Icon,F:TeraTerm Dir
fname = 'test12.txt'
pause_time = 1500

intdim val 8 ; int val[8], DIM val(8) as Int
fileopen fp fname 0 1 ; fOpen(fp,fname,"r") 0=seek 0 1=readOnly
if fp == -1 goto err_end

:read_loop
fileread fp 18 data ; read(fp,data,18) 18=16(str) + CRLF(bin*2)
if result == 1 goto fclose ; EOF, err

for i 0 7
strcopy data i*2+1 2 wstr ; wstr=Mid$(data,1,2)
sprintf '0x%s' wstr ; add 0x:41->0x41=>inputstr=system
str2int val[i] inputstr ; inputstr -> val[0]
next

/* if 0-255(Hi=0) then send Low byte */
send val[0] val[1] val[2] val[3] val[4] val[5] val[6] val[7]
mpause pause_time
goto read_loop

:fclose
fileclose fp
goto the_end

:err_end
messagebox 'error!' 'title'
:the_end

/* end --- */
closett ; TeraTerm window close & unlink
unlink ; <->connect

end

/*format
4131413241334134
0000000000000000
4100000000000000
0000000000000000
0000410000000000
0000000000000000
*/
マクロの詳しい説明はしないが、このマクロと同じフォルダにある1行8バイトのHEX形式で書いたtest12.txt(マクロ末尾にformat記載)を、バイナリ値に変換して行遅延時間1500msで送信(改行コードは送信しない)する機能を持つ。
パラメータはファイル先頭の値を変える事。TeraTerm.exeの直下に保存されたIniファイルの設定値(TeraTermの[設定][設定値の保存]で行う)で動く。
実行はTeraTerm sendbin.ttlか、拡張子を関連付けしてマクロのダブルクリック。
コマンド引数は使っていない。

そしてBASCOM-AVRのソースは色々変遷して以下の通り。

ソース:
'****************************************
' Copyright (c) 2016 k1segawa
' License : free
' Program : Serial LED Control
'****************************************

$regfile = "attiny13.dat"
$crystal = 9600000
$hwstack = 24
$swstack = 8
$framesize = 8

Config Portb.4 = Input 'Serial Input
Set Portb.4 'pullup (= PORTB.4=1)
Config Portb.0 = Output 'LED
Config Base = 0 'Array DIM(0)~

'Dim D(9) As Byte '8byte + CR(TeraTerm Send CR Mode)
Dim D(8) As Byte '8byte(Binariy TeraTerm MACRO)
Dim A As Byte

Portb.0 = 0 'LED OFF
' Brink LED : A/2
For A = 0 To 39
Waitms 300
Toggle Portb.0
Next I

Do

' Serin A , 1 , B , 4 , 300 , 0 , 8 , 1
' Serin D(0) , 9 , B , 4 , 300 , 0 , 8 , 1
Serin D(0) , 8 , B , 4 , 300 , 0 , 8 , 1

' If A = &H41 Then '&H41=ASC("A")
If D(2) = &H41 Then '&H41=ASC("A")
Portb.0 = 1
Waitms 500
Portb.0 = 0
Waitms 500
Else
Portb.0 = 1
Waitms 100
Portb.0 = 0
Waitms 100
End If

Loop

End
' History
' [2016/11/15]
' When Recieve 8byte binary, 1500ms works
' [2016/11/12]
' Japanino connect "RX"!! --- ATtiny13 PB4(INPUT)
これで、8x8LEDMatrixに繋げばうまくいくはず。
by k1segawa | 2016-11-15 23:36 | arduino, AVR | Comments(0)

by k1segawa