[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][JAMSAT Home]

[jamsat-bb:14924] JAMSAT Newsletter #218 訂正


JH1AOY 玉川です。
JAMSAT Newsletter #218
9.ロータリーエンコーダの角度表示と伝送
プログラムリストは12ビット、1エンコーダー用です。
記事と合わないものをミスで貼り付けしてしまいました。
お詫びしてここに記事に合致するものを掲載させていただきます。

' AKI-PIC877 PIC-BASIC
' 10bit gray code to binary code cnverter
' LCD Display AZ and EL Degrees
' Programed by JH1AOY, Masaji Tamagawa 2003.Nov.13
'
Dim a(10) As Byte, b(10) As Byte
Dim a1(10) As Word, b1(10) As Word
Dim bi As Word, ei As Word
Dim az(2) As Byte, el(2) As Byte, t1 As Byte
Dim const As Long
Dim azdisp As Long, eldisp As Long
'
'10bit Rotary Encorder t=(360/1024)*10,000,000 (0.3515625 deg step)=3515625
const=3515625 '3515625
'
' AZ Rotary Encorder
' PORT-D 入力設定 起動リセット時入力に設定されている
Input RD.0 '4 AZ Encorder 3bit
Input RD.1 '8 AZ Encorder 4bit
Input RD.2 '16 AZ Encorder 5bit
Input RD.3 '32 AZ Encorder 6bit
Input RD.4 '64 AZ Encorder 7bit
Input RD.5 '128 AZ Encorder 8bit
Input RD.6 '256 AZ Encorder 9bit
Input RD.7 '512 AZ Encorder 10bit
' PORT-E bit0-1 を入力に設定
Input RE.0 '1 AZ Encorder 2bit
Input RE.1 '2 AZ Encorder 1bit
'
'EL Rotary Encorder
' PORT-A bit0-5 を入力に設定
Input RA.0 '16 EL Encorder 5bit
Input RA.1 '32 EL Encorder 6bit
Input RA.2 '64 EL Encorder 7bit
Input RA.3 '128 EL Encorder 8bit
Input RA.4 '256 EL Encorder 9it
Input RA.5 '512 EL Encorder 10it
' PORT-C bit0-2 を入力に設定
Input RC.0 '2 EL Encorder 2bit
Input RC.1 '4 EL Encorder 3bit
Input RC.2 '8 EL Encorder 4bit
' PORT-E bit2 を入力に設定
Input RE.2 '1 EL Encorder 1bit
'
' LCD 初期化
	Initlcd
' PUTLCD "10bit ABS Angle"
loop:
' AZ 10bit Encorder upper 8bit value=az(1)
'
	az(1)=Peek (&H08)	' &H08はRDポート
		az(1)=az(1) ^ &Hff	'負論理のときこの行入れる
'
' AZ 10bit Encoder lower 2 bit value=az(0)
'
	az(0)=Peek (&H09)	' &H09はREポート
		az(0)=az(0) ^ &Hff '負論理のときこの行入れる
' EL 10bit Encorder
	el(1)=Peek(&H05) '&H05はRAポート
		el(1)=el(1) ^ &Hff '負論理のときこの行入れる
	el(0)=Peek(&H07) '&H07はRCポート
		el(0)=el(0) ^ &Hff '負論理のときこの行入れる
'
'DEBUG "x=",x,"   y=",y
'
		Gosub decode	' AZ EL gray to binary convert
'
			Gosub AZdisp '角度表示へ
					Gosub RS232 ' data をRS232ポートへ送信
'
				Sleep 150 ' 表示チラツキ防止タイムラグ
Goto loop
'
'AZ LCD Display
AZdisp:
	Clearlcd
	azdisp=(const*bi) 	' AZ=(1カウントあたりの角度 * カウント値)
	eldisp=(const*ei) 	' ELEL=(1カウントあたりの角度 * カウント値)
Debug "r=",const,"  bi=",bi,"   azdisp=",azdisp,"   ei=",ei,"
eldisp=",eldisp
'10bit 3515625*1024=3,600,000,000
' 3515625*1024=3,600,000,000 Long変数は最大 4,294,967,295 までの値
' INT(/10,000,000)=0
' 3515625 MOD 10,000,000=0.3515625
' INT(3,600,000,000/10,000,000)=360
' 3,600,000,000 MOD 10,000,000=0
' Encorder 1023 count時 359.6484375 と表示"
'
Putlcd  "AZ=",( azdisp/10000000) , ".", azdisp Mod 10000000  ' ," Deg."
	Setpos 0,1
Putlcd  "EL=",( eldisp/10000000) , ".", eldisp Mod 10000000  ' ," Deg."
'
Return
'
RS232: ' 9600bps, 8Bit, 1Stop, nonparity
'CHR$(&H0d)=CR先頭へ 、 chr$(&H0a)=LF行送り
	Serout pb9600,chr$(&H0d),chr$(&H0a)
	Serout pb9600,"AZ=",(azdisp/10000000),".", azdisp Mod
10000000,chr$(&H0d),chr$(&H0a)
	Serout pb9600,"EL=",(eldisp/10000000),".",eldisp Mod
10000000,chr$(&H0d),chr$(&H0a)
Return
'
decode:
'AZ Gray code to Binary code convert
'
'8 bit10=a(9)
	a(9)=az(1) & &H80
'	a(9)=a(9) ^ &H80 '半時計周りで角度増加のときこの行追加
	If a(9)=&H80 Then a1(9)=512 Else a1(9)=0
	If a(9)=&H80 Then t1=&H40 Else t1=0
'
'7 bit9=a(8)
	a(8)=az(1) & &H40
	a(8)=a(8) ^ t1
	If a(8)=&H40 Then a1(8)=256 Else a1(8)=0
	If a(8)=&H40 Then t1=&H20 Else t1=0
'
'6 bit8=a(7)
	a(7)=az(1) & &H20
	a(7)=a(7) ^ t1
	If a(7)=&H20 Then a1(7)=128 Else a1(7)=0
	If a(7)=&H20 Then t1=&H10 Else t1=0
'
'5 bit7=a(6)
	a(6)=az(1) & &H10
	a(6)=a(6) ^ t1
	If a(6)=&H10 Then a1(6)=64 Else a1(6)=0
	If a(6)=&H10 Then t1=&H08 Else t1=0
'
'4 bit6=a(5)
	a(5)=az(1) & &H08
	a(5)=a(5) ^ t1
	If a(5)=&H08 Then a1(5)=32 Else a1(5)=0
	If a(5)=&H08 Then t1=&H04 Else t1=0
'
'3 bit5=a(4)
	a(4)=az(1) & &H04
	a(4)=a(4) ^ t1
	If a(4)=&H04 Then a1(4)=16 Else a1(4)=0
	If a(4)=&H04 Then t1=&H02 Else t1=0
'
'2 bit4=a(3)
	a(3)=az(1) & &H02
	a(3)=a(3) ^ t1
	If a(3)=&H02 Then a1(3)=8 Else a1(3)=0
	If a(3)=&H02 Then t1=&H01 Else t1=0
'
'1 bit3=a(2)
	a(2)=az(1) & &H01
	a(2)=a(2) ^ t1
	If a(2)=&H01 Then a1(2)=4 Else a1(2)=0
	If a(2)=&H01 Then t1=&H02 Else t1=0
'--------------------
'2 bit2=a(2)
	a(1)=az(0) & &H02
	a(1)=a(1) ^ t1
	If a(1)=&H02 Then a1(1)=2 Else a1(1)=0
	If a(1)=&H02 Then t1=&H01 Else t1=0
'
'1 bit1=a(1)
	a(0)=az(0) & &H01
	a(0)=a(0) ^ t1
	If a(0)=&H01 Then a1(0)=1 Else a1(0)=0
'
	bi=a1(9)+a1(8)+a1(7)+a1(6)+a1(5)+a1(4)+a1(3)+a1(2)+a1(1)+a1(0) 'カウント値
の合計
'
'---------------------------------------------------------------------------
--------
'EL Gray code to Binary code convert
'8 bit10=b(9)
	b(9)=el(1) & &H20
'	b(9)=b(9) ^ &H20 '半時計周りで角度増加のときこの行追加
	If b(9)=&H20 Then b1(9)=512 Else b1(9)=0
	If b(9)=&H20 Then t1=&H10 Else t1=0
'
'7 bit9=b(8)
	b(8)=el(1) & &H10
	b(8)=b(8) ^ t1
	If b(8)=&H10 Then b1(8)=256 Else b1(8)=0
	If b(8)=&H10 Then t1=&H08 Else t1=0
'
'6 bit8=b(7)
	b(7)=el(1) & &H08
	b(7)=b(7) ^ t1
	If b(7)=&H08 Then b1(7)=128 Else b1(7)=0
	If b(7)=&H08 Then t1=&H04 Else t1=0
'
'5 bit7=b(6)
	b(6)=el(1) & &H04
	b(6)=b(6) ^ t1
	If b(6)=&H04 Then b1(6)=64 Else b1(6)=0
	If b(6)=&H04 Then t1=&H02 Else t1=0
'
'4 bit6=b(5)
	b(5)=el(1) & &H02
	b(5)=b(5) ^ t1
	If b(5)=&H02 Then b1(5)=32 Else b1(5)=0
	If b(5)=&H02 Then t1=&H01 Else t1=0
'
'3 bit5=b(4)
	b(4)=el(1) & &H01
	b(4)=b(4) ^ t1
	If b(4)=&H01 Then b1(4)=16 Else b1(4)=0
	If b(4)=&H01 Then t1=&H04 Else t1=0
'
'2 bit4=b(3)
	b(3)=el(0) & &H04
	b(3)=b(3) ^ t1
	If b(3)=&H04 Then b1(3)=8 Else b1(3)=0
	If b(3)=&H04 Then t1=&H02 Else t1=0
'
'1 bit3=b(2)
	b(2)=el(0) & &H02
	b(2)=b(2) ^ t1
	If b(2)=&H02 Then b1(2)=4 Else b1(2)=0
	If b(2)=&H02 Then t1=&H01 Else t1=0
'--------------------
'2 bit2=b(1)
	b(1)=el(0) & &H01
	b(1)=b(1) ^ t1
	If b(1)=&H01 Then b1(1)=2 Else b1(1)=0
	If b(1)=&H01 Then t1=&H04 Else t1=0
'
'1 bit1=b(0)
	b(0)=az(0) & &H04
	b(0)=b(0) ^ t1
	If b(0)=&H04 Then b1(0)=1 Else b1(0)=0
'
	ei=b1(9)+b1(8)+b1(7)+b1(6)+b1(5)+b1(4)+b1(3)+b1(2)+b1(1)+b1(0) 'カウント値
の合計
'
Return
'
End

--------------------------

JH1AOY, 玉川正次
PM95xh

-------------
JAMSAT BB Mailing List
http://www.jamsat.or.jp/infoserv/mlist.html