その17です。
ようやく完成したので、きたないソースですが公開します。
コンパイラは以前紹介したmikroBASIC Pro for AVRです。
最初はBASCOMで開発していましたが、途中からmikroBASIC Pro for AVRに変更しました。
同じBASICですが、だいぶ違いがあります。
日本語でコメントを入れてありますが、mikroBASICでは文字化けします。
また、スペースはブログの編集の都合で、全角スペースにしてありますので、そのままではコンパイルできません。
<仕様>
・受信時は表示より455kHz低い周波数を設定
(プログラムは送信時に455kHz高く設定)
・エンコーダー操作は受信時のみ
・送信時は各桁の小数点を表示
・周波数範囲は50.005-50.995MHz
・周波数ステップは5KHz
<ソース>
'50MHz PLL AM TRX 01-00 by JJ1WKN 2009-10-25
'AT Tiny2313 8MHz Internal RC OSC
'avrsp -PC1 -FL11100100 -W PLL.hex
program PLL
'ポート割り当て
'PortB
'Pin Port i/o
'12 PB0 O 7seg B
'13 PB1 O 7seg F
'14 PB2 O 7seg G
'15 PB3 O 7seg C
'16 PB4 O 7seg P
'17 PB5 O 7seg D
'18 PB6 O 7seg E
'19 PB7 O 7seg A
'PortA
'05 PA0 I ENC1
'04 PA1 I ENC2
'PortD
'02 PD0 O 桁1
'03 PD1 O 桁2
'06 PD2 O 桁3
'07 PD3 O PLL/Enable
'08 PD4 O PLL/Data
'09 PD5 O PLL/Clock
'11 PD6 I 送信/受信
'7セグLEDパターン
const LED7 as byte[10] = (
' AEDPCGFB
%11101011, '0
%00001001, '1
%11100101, '2
%10101101, '3
%00001111, '4
%10101110, '5
%11101110, '6
%10001011, '7
%11101111, '8
%10001111) '9
'変数
dim pb,kt,k1,k2,k3,j as byte
dim freq,pll,cmd,n as word
dim cnt,tmp,tx as bit
dim t0,t1,t2 as word
'表示周波数⇒3桁変換
sub procedure f2k()
t0 = freq / 100
k3 = t0
t1 = t0 * 100
t2 = freq - t1
t0 = t2 / 10
k2 = t0
t1 = t0 * 10
t2 = t2 - t1
k1 = t2
end sub
'周波数表示
sub procedure LedDisplay()
select case kt
case 1
pb = LED7[k1] '桁1
PortD = %00000110
case 2
pb = LED7[k2] '桁2
PortD = %00000101
case 3
pb = LED7[k3] '桁3
PortD = %00000011
end select
if tx=1 then '送信モード?
PortB = pb or %00010000 '送信表示 X.X.X.
else
PortB = pb
end if
kt = kt +1
if kt=4 then
kt = 1
end if
Delay_Ms(5)
end sub
'500ms ディレイ
sub procedure Delay500ms()
Delay_Ms(500)
end sub
'Clockパルス出力
sub procedure ClockPulse()
PortD.5 = 1 'ClockパルスHi
Delay_Us(10)
PortD.5 = 0 'ClockパルスLo
end sub
'PLL設定
sub procedure PllSet()
PortD.3 = 0 'Enable Lo
for j=15 to 0 step -1
cmd = pll
cmd = cmd >> j
cmd = cmd and 1
PortD.4 = cmd 'Data
ClockPulse()
next j
PortD.4 = cnt 'コントロールビット 1=div 0=freq
ClockPulse()
PortD.3 = 1 'Enableパルス Hi
Delay_Us(10)
PortD.3 = 0 'Enableパルス Lo
end sub
'LEDテスト
sub procedure LedTest()
PortB = 255 '8.
PortD = %00000011 'K3
Delay500ms()
PortD = %00000101 'K2
Delay500ms()
PortD = %00000110 'K1
Delay500ms()
end sub
'エンコーダーチェック
sub procedure EncoderCheck()
if PinA.1=0 then
Delay_Ms(3)
if PinA.1=0 then
if PinA.0=0 then
freq = freq-5
if freq=0 then '50.000
freq = 5 '50.005
end if
n = n-1
if n=10000 then '10000*5=50.000
n = 10001 '10001*5=50.005
end if
else
freq = Freq+5
if freq=1000 then '51.000
freq = 995 '50.995
end if
n = n+1
if n=10200 then '10200*5=51.000
n = 10199 '10199*5=50.995
end if
end if
pll = n
PllSet() 'PLL設定
f2k() '表示更新
for j=1 to 10 '表示だけ、エンコーダー無視
LedDisplay()
next j
end if
end if
end sub
main:
'入出力設定
DdrA = %00000000
DdrB = %11111111
DdrD = %00111111
LedTest()
kt = 1 '桁
freq = 620 '表示周波数 620kHz
'PLL分周比設定
pll = 2000 '10000kHz/5kHz=2000
cnt = 1 '分周比設定
PllSet()
n = 10033 '10033*5=50.165
pll = n
cnt = 0 '周波数設定
PllSet()
while TRUE '無限ループ
f2k() '周波数⇒3桁
tmp = PinD.6 '送信チャック
LedDisplay() 'チャタリング除去 5ms*2=10ms
LedDisplay()
if tmp=PinD.6 then 'チャタリング無し?
if tmp=0 then '送信 SW ON?
if tx=0 then '受信モード?
tx = 1 '受信⇒送信
pll = n+91 '+455kHz
cnt = 0
PllSet() '周波数設定
end if
'else 送信⇒送信
else
if tx=1 then '送信モード?
tx = 0 '送信⇒受信
pll = n
cnt = 0
PllSet() '周波数設定
end if
'else 受信⇒受信
EncoderCheck() 'エンコードチェック
end if
end if
wend
end.
ようやく完成したので、きたないソースですが公開します。
コンパイラは以前紹介したmikroBASIC Pro for AVRです。
最初はBASCOMで開発していましたが、途中からmikroBASIC Pro for AVRに変更しました。
同じBASICですが、だいぶ違いがあります。
日本語でコメントを入れてありますが、mikroBASICでは文字化けします。
また、スペースはブログの編集の都合で、全角スペースにしてありますので、そのままではコンパイルできません。
<仕様>
・受信時は表示より455kHz低い周波数を設定
(プログラムは送信時に455kHz高く設定)
・エンコーダー操作は受信時のみ
・送信時は各桁の小数点を表示
・周波数範囲は50.005-50.995MHz
・周波数ステップは5KHz
<ソース>
'50MHz PLL AM TRX 01-00 by JJ1WKN 2009-10-25
'AT Tiny2313 8MHz Internal RC OSC
'avrsp -PC1 -FL11100100 -W PLL.hex
program PLL
'ポート割り当て
'PortB
'Pin Port i/o
'12 PB0 O 7seg B
'13 PB1 O 7seg F
'14 PB2 O 7seg G
'15 PB3 O 7seg C
'16 PB4 O 7seg P
'17 PB5 O 7seg D
'18 PB6 O 7seg E
'19 PB7 O 7seg A
'PortA
'05 PA0 I ENC1
'04 PA1 I ENC2
'PortD
'02 PD0 O 桁1
'03 PD1 O 桁2
'06 PD2 O 桁3
'07 PD3 O PLL/Enable
'08 PD4 O PLL/Data
'09 PD5 O PLL/Clock
'11 PD6 I 送信/受信
'7セグLEDパターン
const LED7 as byte[10] = (
' AEDPCGFB
%11101011, '0
%00001001, '1
%11100101, '2
%10101101, '3
%00001111, '4
%10101110, '5
%11101110, '6
%10001011, '7
%11101111, '8
%10001111) '9
'変数
dim pb,kt,k1,k2,k3,j as byte
dim freq,pll,cmd,n as word
dim cnt,tmp,tx as bit
dim t0,t1,t2 as word
'表示周波数⇒3桁変換
sub procedure f2k()
t0 = freq / 100
k3 = t0
t1 = t0 * 100
t2 = freq - t1
t0 = t2 / 10
k2 = t0
t1 = t0 * 10
t2 = t2 - t1
k1 = t2
end sub
'周波数表示
sub procedure LedDisplay()
select case kt
case 1
pb = LED7[k1] '桁1
PortD = %00000110
case 2
pb = LED7[k2] '桁2
PortD = %00000101
case 3
pb = LED7[k3] '桁3
PortD = %00000011
end select
if tx=1 then '送信モード?
PortB = pb or %00010000 '送信表示 X.X.X.
else
PortB = pb
end if
kt = kt +1
if kt=4 then
kt = 1
end if
Delay_Ms(5)
end sub
'500ms ディレイ
sub procedure Delay500ms()
Delay_Ms(500)
end sub
'Clockパルス出力
sub procedure ClockPulse()
PortD.5 = 1 'ClockパルスHi
Delay_Us(10)
PortD.5 = 0 'ClockパルスLo
end sub
'PLL設定
sub procedure PllSet()
PortD.3 = 0 'Enable Lo
for j=15 to 0 step -1
cmd = pll
cmd = cmd >> j
cmd = cmd and 1
PortD.4 = cmd 'Data
ClockPulse()
next j
PortD.4 = cnt 'コントロールビット 1=div 0=freq
ClockPulse()
PortD.3 = 1 'Enableパルス Hi
Delay_Us(10)
PortD.3 = 0 'Enableパルス Lo
end sub
'LEDテスト
sub procedure LedTest()
PortB = 255 '8.
PortD = %00000011 'K3
Delay500ms()
PortD = %00000101 'K2
Delay500ms()
PortD = %00000110 'K1
Delay500ms()
end sub
'エンコーダーチェック
sub procedure EncoderCheck()
if PinA.1=0 then
Delay_Ms(3)
if PinA.1=0 then
if PinA.0=0 then
freq = freq-5
if freq=0 then '50.000
freq = 5 '50.005
end if
n = n-1
if n=10000 then '10000*5=50.000
n = 10001 '10001*5=50.005
end if
else
freq = Freq+5
if freq=1000 then '51.000
freq = 995 '50.995
end if
n = n+1
if n=10200 then '10200*5=51.000
n = 10199 '10199*5=50.995
end if
end if
pll = n
PllSet() 'PLL設定
f2k() '表示更新
for j=1 to 10 '表示だけ、エンコーダー無視
LedDisplay()
next j
end if
end if
end sub
main:
'入出力設定
DdrA = %00000000
DdrB = %11111111
DdrD = %00111111
LedTest()
kt = 1 '桁
freq = 620 '表示周波数 620kHz
'PLL分周比設定
pll = 2000 '10000kHz/5kHz=2000
cnt = 1 '分周比設定
PllSet()
n = 10033 '10033*5=50.165
pll = n
cnt = 0 '周波数設定
PllSet()
while TRUE '無限ループ
f2k() '周波数⇒3桁
tmp = PinD.6 '送信チャック
LedDisplay() 'チャタリング除去 5ms*2=10ms
LedDisplay()
if tmp=PinD.6 then 'チャタリング無し?
if tmp=0 then '送信 SW ON?
if tx=0 then '受信モード?
tx = 1 '受信⇒送信
pll = n+91 '+455kHz
cnt = 0
PllSet() '周波数設定
end if
'else 送信⇒送信
else
if tx=1 then '送信モード?
tx = 0 '送信⇒受信
pll = n
cnt = 0
PllSet() '周波数設定
end if
'else 受信⇒受信
EncoderCheck() 'エンコードチェック
end if
end if
wend
end.
もし 可能でしたら、貴方様の個人のメール
アドレスを 教えて頂けませんか。
多数の初歩的な質問を コメント欄に 掲示を お願いする事になりますと 大変に 恥ずかしい
思いを致します時があると思いますので。
よろしく お願い 致します。
ございました。
mikroBASIC Pro for AVRで無事にコンパイル
できました。これについても感謝しています。
あとは PLL2001とMC145157の入手方法も
教えてください。
また 50MHzの受信回路についても ご都合の
時に ご指導をお願い致します。
恐縮ですが私の無意味と思われます掲示は
消してください。 以上です。
いつもお世話になります。
PLL2001+AVR ATTINY2313 50MHz AM トランシーバの製作 その17の回路図を
公開して頂けませんか。
よろしくお願い致します。
nanohana_007@mail.goo.ne.jp
あけましておめでとうございます。
ひとつお伺いしますが、
.include "2313def.inc" とリストに定義して avrasm2.exe version 1995-2004 で
assembleしますと 次のerrorが現れます。
Preprocessoer, Syntax error, unexepected PPID, expecting PR_PART の
表示の error が現れます。
どうしてでしょうか。
avrasm2.exe version 1995-2008 を
探してしますが avrstdio 4.18 に
ありますでしょうか。
お時間がありましたら
教えて頂けますか。
以上 よろしくお願い致します。
石原健二