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

体重と今日食べたもの

k1segawa.exblog.jp

ダイエット

ブログトップ

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

ATtinyで8x8 LED マトリクスを光らせるのにシリアル入力で行う予定だが、BASCOM-AVRでソフトウェアシリアルはどうやるかよくわからない。

まずシリアル入出力だが、RS-232CなどのPCとのやり取りはシリアルポートがあるなら、RS-232C(信号レベル12V)-マイコン(TTL/CMOSレベル5V)の変換が必要だが、USBしかない方が多いはずで、USB 5VとTTL/CMOS 5Vなので電圧レベルは同じだが、USBシリアル変換が必要になる(負論理―正論理変換もあるかも)。
しかし、Japanino(arduino)がもうすでにUSBシリアル変換してくれてる。
それがD0,1(=RX,TX)だ。ここにATtiny13を繋ぐとPCのTera TermやArduinoIDEのシリアルモニタでデータをやり取りできる。

ATtiny13はまたハードUARTがないのでソフトUARTを行う。UARTというのはシリアル信号でやり取りする方式で、電圧レベルが違うRS-232Cも方式はシリアル方式で同じ。I2CやSPIもシリアルという意味ではまあまあ同じかな。

準備:
PC側:Tera Term で通信速度300bps,ローカルエコー有りの受信改行CRLF送信改行CR、COM3(各自の環境) ー USBケーブルでJapaninoと繋ぐ。
Japanino側:ArduinoIDE 0018で、スケッチArudino ISPをJapaninoに書込んで、ライタにする。- Japanio RX(=D0)とATtiny13のPB4を繋ぐ。これは8x8LEDマトリクスのプログラムで残ったピンがPB4でシリアル「入力」が必要だからだ。
ATtiny13側:PB4を入力ピンに設定し、プルアップ設定にし、JapanioとVCC,GND,RXをもらって繋ぐ。いつもの書込みピン(PB0:MOSI,PB1:MISO,PB2:SCK,PB5:RESET)も繋ぐ。
Japanino ArduinoISPで ATtiny13 の BASCOM-AVRでの software serial - ソフトUARTの実験 (28) (11/12)_a0034780_1973445.jpg
Japanino ArduinoISPで ATtiny13 の BASCOM-AVRでの software serial - ソフトUARTの実験 (28) (11/12)_a0034780_19275325.jpg
ここTXじゃないのが注意。一瞬そう思うがどうやら違うらしい。
確認のため、PB0にLEDを付けてシリアル入力した値によってON/OFFするタイミングを変えるプログラムを作ってテスト。もちろん8x8LEDマトリクスで実際はやるのだが、メモリがギリギリなのでテストプログラムをのせる余裕がない。

BASCOM-AVRではソフトウェアUART(ソフトウェアシリアルとも言う)は、Open-Input/Print#n-CloseとOpenが不要なSerin/Seroutがある。INKEYとかIscharwaitはハードUART用のようだ。またソフトUARTは割込みを使っているので他の割込みプログラムは作れないし、ハードUARTと違い容量を食う。まあ出来るだけ遅い通信速度で、自分でポーリングしてやればいいのだが。

まだポーリングはやってないが、とにかく何か受信できるようにしたソースはこれ。

ソース:
'****************************************
' 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

Const Open_input = 1 '#if 1:Open"COMxx" - Input #1
'#else:Serin
Dim A As Byte

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

#if Open_input = 1
Open "COMB.4:300,8,N,1" For Input As #1 'PORTB.4,300bps,channel #1
#endif

Do

#if Open_input = 1
Input #1 , A
#else
Serin A , 1 , B , 4 , 300 , 0 , 8 , 1
#endif

If A < &H38 Then '&H38=ASC("8")
Portb.0 = 1
Waitms 300
Portb.0 = 0
Waitms 300
Else
Portb.0 = 1
Wait 1
Portb.0 = 0
Wait 1
End If

Loop

End
' History
' [2016/11/12]
' Japanino connect "RX"!! --- ATtiny13 PB4(INPUT)

これをATtinyに書込む際は、Tera Termの[ファイル][接続断]を選んでCOM3(各自)を開放しておく。Japaninoに繋いだRXへのジャンパは外さなくて良い。BASCOM-AVRの書込みボタン1回目はエラーになってすぐavrdudeのDOS画面が閉じるが2回やればOK。直後にATtiny13のPB0のLEDが10回点滅する。その後、Tera Termの[設定][シリアルポート]、[編集][バッファのクリア]を行う。送信データとしては以下のビットマップをHexに直した文字列ファイルをファイル送信する。[ファイル][ファイル転送]で選択するか、ドラッグアンドドロップでファイル送信しますか?でファイル送信ボタンを押すかする。

sampi.hex:
42 4D 76 02 00 00 00 00 00 00 76 00 00 00 28 00
00 00 20 00 00 00 20 00 00 00 01 00 04 00 00 00
00 00 00 02 00 00 CE 0E 00 00 D8 0E 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 80
00 00 00 80 80 00 80 00 00 00 80 00 80 00 80 80
00 00 C0 C0 C0 00 80 80 80 00 00 00 FF 00 00 FF
00 00 00 FF FF 00 FF 00 00 00 FF 00 FF 00 FF FF
00 00 FF FF FF 00 CC CC CC CC CC CC CC CC 00 00
00 00 00 00 00 00 CC CC CC CC CC CC CC CC 00 00
00 00 00 00 00 00 CC CC CC CC CC CC CC CC 00 00
00 00 00 00 00 00 CC CC CC CC CC CC CC CC 00 00
00 00 00 00 00 00 CC CC CC CC CC CC CC CC 00 00
00 00 00 00 00 00 CC CC CC CC CC CC CC CC 00 00
00 00 00 00 00 00 CC CC CC CC CC CC CC CC 00 00
00 00 00 00 00 00 CC CC CC CC CC CC CC CC 00 00
00 00 00 00 00 00 CC CC CC CC CC CC CC CC 00 00
00 00 00 00 00 00 CC CC CC CC CC CC CC CC 00 00
00 00 00 00 00 00 CC CC CC CC CC CC CC CC 00 00
00 00 00 00 00 00 CC CC CC CC CC CC CC CC 00 00
00 00 00 00 00 00 CC CC CC CC CC CC CC CC 00 00
00 00 00 00 00 00 CC CC CC CC CC CC CC CC 00 00
00 00 00 00 00 00 CC CC CC CC CC CC CC CC 00 00
00 00 00 00 00 00 CC CC CC CC CC CC CC CC 00 00
00 00 00 00 00 00 99 99 99 99 99 99 99 99 AA AA
AA AA AA AA AA AA 99 99 99 99 99 99 99 99 AA AA
AA AA AA AA AA AA 99 99 99 99 99 99 99 99 AA AA
AA AA AA AA AA AA 99 99 99 99 99 99 99 99 AA AA
AA AA AA AA AA AA 99 99 99 99 99 99 99 99 AA AA
AA AA AA AA AA AA 99 99 99 99 99 99 99 99 AA AA
AA AA AA AA AA AA 99 99 99 99 99 99 99 99 AA AA
AA AA AA AA AA AA 99 99 99 99 99 99 99 99 AA AA
AA AA AA AA AA AA 99 99 99 99 99 99 99 99 AA AA
AA AA AA AA AA AA 99 99 99 99 99 99 99 99 AA AA
AA AA AA AA AA AA 99 99 99 99 99 99 99 99 AA AA
AA AA AA AA AA AA 99 99 99 99 99 99 99 99 AA AA
AA AA AA AA AA AA 99 99 99 99 99 99 99 99 AA AA
AA AA AA AA AA AA 99 99 99 99 99 99 99 99 AA AA
AA AA AA AA AA AA 99 99 99 99 99 99 99 99 AA AA
AA AA AA AA AA AA 99 99 99 99 99 99 99 99 AA AA
AA AA AA AA AA AA
INPUTとSerinだと点滅が23回と45回で違い、頻度もINPUTの方が長い点滅しかしないのと2種類の点滅をするSerinの違いがある。んー、INPUTが1行入力で、両方とも受信バッファあふれを起こしているのかな。バイナリファイルを送信してみたが、まったく点滅しなかったので、8ビットノンパリティ1ストップビットでも文字列しか受信できなかったか。もうXMODEMとか忘れた。

まあ文字列でも冗長になるだけで受信側でASC変換すればいいだけ。でもBASCOM-AVRのコマンドがどう変換するか変換しないのかはこれから調べる。とりあえず、再開する時に環境を整えるのにひどく苦労したのでとりあえずこの手順は残す。
by k1segawa | 2016-11-12 18:23 | arduino, AVR | Comments(0)

by k1segawa