mikroBasicの練習としてビーコン発生装置を作りました。
LEDピカピカでもいいのですが、少し実用的なものにしてみました。
PICはジャンク箱にあったPIC12F675を使用しましたが、基本的にLEDピカピカと同じなので、mikroBasicが対応していればどんなPICでもかまいません。
PIC12F675は10ビットA/Dコンバーター内蔵でこの手の用途には贅沢過ぎます。
作成した基板です。回路図は省略しますが、PIC、10kΩ、104、2SC1815と電源SWです。
先日作った136kHzCW送信機に組み込んでみました。
トランジスタのコレクタとエミッタをキー端子に接続します。
これでどこまで飛ぶかの実験が楽になります。
プログラムを上から順番に解説します。
最初はコメントです。
ポートの割り当てやハードの概要を書いておくと後で見たとき便利です。
この他にコンフィギュレーションに関する設定値も記述しておきますが、デバイス依存なのでここでは省略します。
アセンブラだとソースに記述するのですが、mikiroBasicではプロジェクトの設定値となります。
---ここから---
'CW Beacon 2009.03.07 JJ1WKN
'mikroBasic for PIC V6.0
'Device: PIC12F675
'OSC: 4.000MHz Internal
'HardWare:
' 1:Vdd +3.5V
' 8:Vss
' 7:GPIO.0 -10k ohm-B/Tr
' Tr:2SC1815Gr E/Tr-Vss C/Tr-Key
---ここまで---
プログラムの本体です。
定数を宣言します。
DELAY_1は短点、DELAY_3は長点の秒数です。
好みのスピードに設定してください。
DELAY_RXは次の送信までの待ち時間です。
1分おきに「VVV DE JJ1WKN」を送信します。
---ここから---
program CW1
const DELAY_1 as word = 200 '0.2s
const DELAY_3 as word = 600 '0.6s
const DELAY_RX as word = 34433 'fill to 60s
---ここまで---
dly_1()とdly_31()は短点、長点分の待ち時間を作ります。
Delay_msはmikroBasicに用意されているライブラリ関数で、「ms」単位で指定するだけで、正確な待ち時間を生成してくれるので便利です。
ところが、「Delay_ms()」は記述したところにその都度展開されるインラインライブラリなので、プログラムメモリ節約のため、procedureとして共通化します。
dly_1()とdly_3()はprocedureに引数で待ち時間を与えてもいいのですが、引数の受け渡しでメモリを消費しますので、分けました。
この当たりはどちらの方がメモリの消費が少ないかをアセンブルリストを見ながら決めて行きます。
---ここから---
sub procedure dly_1()
Delay_ms(DELAY_1)
end sub
sub procedure dly_3()
Delay_ms(DELAY_3)
end sub
---ここまで---
procedure key_1()とprocedure key_3()はGPIOの0ビット(7番ピン)を制御してキーイングを行います。
「1」を出力すると、7番ピンはVdd(ここでは3.5V)になり、10kΩ経由で接続されているトランジスタがONします。
すると、コレクタからエミッタへ電流が流れますので、送信機のキーに接続します。
---ここから---
sub procedure key_1()
GPIO.0 = 1
dly_1()
GPIO.0 = 0
dly_1()
end sub
sub procedure key_3()
GPIO.0 = 1
dly_3()
GPIO.0 = 0
dly_1()
end sub
---ここまで---
いよいよモールスコードの生成です。
プログラムメモリを節約するために、モールスコードを2つずつ区切ります。
例えば「1」は「・----」なので「・- -- -」=「AMT」となります。
このように分割すれば、5回のコールが3回で済みプログラムメモリを節約できます。
という訳で、2単位までで構成されるETIMANのコードを送信するprocedureです。
---ここから---
sub procedure tx_E() '*
key_1()
end sub
sub procedure tx_T() '-
key_3()
end sub
sub procedure tx_I() '**
key_1()
key_1()
end sub
sub procedure tx_M() '--
key_3()
key_3()
end sub
sub procedure tx_A() '*-
key_1()
key_3()
end sub
sub procedure tx_N() '-*
key_3()
key_1()
end sub
---ここまで---
後はビーコンで送信したい文章に出てくるコードを送信するprocedureを作ります。
「V」=「・・・-=「・・ ・-」=「IA」
コードの送信後にはdly_1()で短点1つ分の待ちを作ります。
---ここから---
sub procedure tx_V() '** *-
tx_I()
tx_A()
dly_1()
end sub
sub procedure tx_J() '*- --
tx_A()
tx_M()
dly_1()
end sub
sub procedure tx_D() '-* *
tx_N()
tx_E()
dly_1()
end sub
sub procedure tx_W() '*- -
tx_A()
tx_T()
dly_1()
end sub
sub procedure tx_K() '-* -
tx_N()
tx_T()
dly_1()
end sub
sub procedure tx_1() '*- -- -
tx_A()
tx_M()
tx_T()
dly_1()
end sub
---ここまで---
ここからがメインルーチンです。
パワーオンリセット後はここから実行されます。
最初に各種レジスタの初期設定を行います。
使用するPICのデバイスごとに違いますので、マニュアルを参考にして設定してください。
---ここから---
main:
CMCON = %00000111
TRISIO = %00101000
ANSEL = %00000000
---ここまで---
ここからがビーコンメッセージの送信です。
無限ループの中に、送信文を配置しています。
単語の区切りはdly_3()で長点1つ分空けます。
「ETIMAN」はコードの後に短点1つ分を追加しますが、この送信文では「E」と「N」は単語の最後に位置していますので省略しています。
メッセージ送信後は60秒になるまで待ちます。
待ち時間はmikoroBasicのデバッガーを動作させて時間を測定して、DELAY_RXの値を決めます。
---ここから---
while true
tx_V()
tx_V()
tx_V()
dly_3()
tx_D()
tx_E()
dly_3()
tx_J()
tx_J()
tx_1()
tx_W()
tx_K()
tx_N()
Delay_ms(DELAY_RX)
wend
end.
---ここまで---
LEDピカピカでもいいのですが、少し実用的なものにしてみました。
PICはジャンク箱にあったPIC12F675を使用しましたが、基本的にLEDピカピカと同じなので、mikroBasicが対応していればどんなPICでもかまいません。
PIC12F675は10ビットA/Dコンバーター内蔵でこの手の用途には贅沢過ぎます。
作成した基板です。回路図は省略しますが、PIC、10kΩ、104、2SC1815と電源SWです。
先日作った136kHzCW送信機に組み込んでみました。
トランジスタのコレクタとエミッタをキー端子に接続します。
これでどこまで飛ぶかの実験が楽になります。
プログラムを上から順番に解説します。
最初はコメントです。
ポートの割り当てやハードの概要を書いておくと後で見たとき便利です。
この他にコンフィギュレーションに関する設定値も記述しておきますが、デバイス依存なのでここでは省略します。
アセンブラだとソースに記述するのですが、mikiroBasicではプロジェクトの設定値となります。
---ここから---
'CW Beacon 2009.03.07 JJ1WKN
'mikroBasic for PIC V6.0
'Device: PIC12F675
'OSC: 4.000MHz Internal
'HardWare:
' 1:Vdd +3.5V
' 8:Vss
' 7:GPIO.0 -10k ohm-B/Tr
' Tr:2SC1815Gr E/Tr-Vss C/Tr-Key
---ここまで---
プログラムの本体です。
定数を宣言します。
DELAY_1は短点、DELAY_3は長点の秒数です。
好みのスピードに設定してください。
DELAY_RXは次の送信までの待ち時間です。
1分おきに「VVV DE JJ1WKN」を送信します。
---ここから---
program CW1
const DELAY_1 as word = 200 '0.2s
const DELAY_3 as word = 600 '0.6s
const DELAY_RX as word = 34433 'fill to 60s
---ここまで---
dly_1()とdly_31()は短点、長点分の待ち時間を作ります。
Delay_msはmikroBasicに用意されているライブラリ関数で、「ms」単位で指定するだけで、正確な待ち時間を生成してくれるので便利です。
ところが、「Delay_ms()」は記述したところにその都度展開されるインラインライブラリなので、プログラムメモリ節約のため、procedureとして共通化します。
dly_1()とdly_3()はprocedureに引数で待ち時間を与えてもいいのですが、引数の受け渡しでメモリを消費しますので、分けました。
この当たりはどちらの方がメモリの消費が少ないかをアセンブルリストを見ながら決めて行きます。
---ここから---
sub procedure dly_1()
Delay_ms(DELAY_1)
end sub
sub procedure dly_3()
Delay_ms(DELAY_3)
end sub
---ここまで---
procedure key_1()とprocedure key_3()はGPIOの0ビット(7番ピン)を制御してキーイングを行います。
「1」を出力すると、7番ピンはVdd(ここでは3.5V)になり、10kΩ経由で接続されているトランジスタがONします。
すると、コレクタからエミッタへ電流が流れますので、送信機のキーに接続します。
---ここから---
sub procedure key_1()
GPIO.0 = 1
dly_1()
GPIO.0 = 0
dly_1()
end sub
sub procedure key_3()
GPIO.0 = 1
dly_3()
GPIO.0 = 0
dly_1()
end sub
---ここまで---
いよいよモールスコードの生成です。
プログラムメモリを節約するために、モールスコードを2つずつ区切ります。
例えば「1」は「・----」なので「・- -- -」=「AMT」となります。
このように分割すれば、5回のコールが3回で済みプログラムメモリを節約できます。
という訳で、2単位までで構成されるETIMANのコードを送信するprocedureです。
---ここから---
sub procedure tx_E() '*
key_1()
end sub
sub procedure tx_T() '-
key_3()
end sub
sub procedure tx_I() '**
key_1()
key_1()
end sub
sub procedure tx_M() '--
key_3()
key_3()
end sub
sub procedure tx_A() '*-
key_1()
key_3()
end sub
sub procedure tx_N() '-*
key_3()
key_1()
end sub
---ここまで---
後はビーコンで送信したい文章に出てくるコードを送信するprocedureを作ります。
「V」=「・・・-=「・・ ・-」=「IA」
コードの送信後にはdly_1()で短点1つ分の待ちを作ります。
---ここから---
sub procedure tx_V() '** *-
tx_I()
tx_A()
dly_1()
end sub
sub procedure tx_J() '*- --
tx_A()
tx_M()
dly_1()
end sub
sub procedure tx_D() '-* *
tx_N()
tx_E()
dly_1()
end sub
sub procedure tx_W() '*- -
tx_A()
tx_T()
dly_1()
end sub
sub procedure tx_K() '-* -
tx_N()
tx_T()
dly_1()
end sub
sub procedure tx_1() '*- -- -
tx_A()
tx_M()
tx_T()
dly_1()
end sub
---ここまで---
ここからがメインルーチンです。
パワーオンリセット後はここから実行されます。
最初に各種レジスタの初期設定を行います。
使用するPICのデバイスごとに違いますので、マニュアルを参考にして設定してください。
---ここから---
main:
CMCON = %00000111
TRISIO = %00101000
ANSEL = %00000000
---ここまで---
ここからがビーコンメッセージの送信です。
無限ループの中に、送信文を配置しています。
単語の区切りはdly_3()で長点1つ分空けます。
「ETIMAN」はコードの後に短点1つ分を追加しますが、この送信文では「E」と「N」は単語の最後に位置していますので省略しています。
メッセージ送信後は60秒になるまで待ちます。
待ち時間はmikoroBasicのデバッガーを動作させて時間を測定して、DELAY_RXの値を決めます。
---ここから---
while true
tx_V()
tx_V()
tx_V()
dly_3()
tx_D()
tx_E()
dly_3()
tx_J()
tx_J()
tx_1()
tx_W()
tx_K()
tx_N()
Delay_ms(DELAY_RX)
wend
end.
---ここまで---
※コメント投稿者のブログIDはブログ作成者のみに通知されます