<紙>さんLOG

「パソコンヲタクの雑記帳」
 PC/Linux系/物理・化学で遊んでいます。
思いついたことを綴っています。

ロータリーエンコーダの入力

2008年08月08日 | PIC・マイコン
昨日までの累計アクセス数=6,316。 ご訪問頂き、ありがとうございます。         日記@BlogRanking


ロータリーエンコーダには「インクリメンタル方式」と、「アブソリュート方式」の2種類があります。
インクリメンタル方式は、軸が一定量回転するごとにパルスを出力します。

1回転でいくつのパルスを出力するかを分解能と呼びますが、20パルスあたりから5000パルスあたりまであります。
軸が回転するたびにパルスが出るので、軸が何度動いたか、何回転したかといった情報は、
パルスの数を数えることによって得ることができます。

ただ単にパルスが出るだけでは、回転方向の判断が付きませんので、
以下に示すような2相のパルスを出力するように作られています。



右回転では、A相が先にハイからローに変化する。左回転では、B相が先にハイからローに変化する。
つまり、A相がハイからローに変化した時点でのB相の値を見れば回転方向がわかります。

秋月電子通商で売っているのは、インクリメンタル方式のものでした。

端子はA相、B相、GND の3ヶからなっており、見た目はボリュームのようなものです。
これは、1回転(360度)で24パルスです。また、クリック付きです。

そこで、PICとは、10kohm プルアップで、
A相 ---> RB0/INT ( H -> L で割込発生 )
B相 ---> RB7   と繋ぎ、



割込方式でプログラムを作りました。(mikroBASICで)
INT 割込発生時に、先ずB相をチェックしておき、
チャッタリングが収まるまで(1mS)待って、RB0(A相)がローだったら正しい変化時点と判定する。


割込処理ルーチン部分だけ載せます。
(段付けの為、先頭に2B空白がある)
' --------------------- mikroBASIC ソースの一部
sub procedure interrupt ' --- RB0/INT interrupt H->L
 If PORTB.7 = 1 Then
  rl_dir = "R" ' H : Right
 Else
  rl_dir = "L" ' L : Left
 End If
 Delay_ms(1) ' debounce
 If PORTB.0 = 0 Then ' true H->L
  get_data = 1
 Else ' not ( L->H ) Pass
  get_data = 0
 End If
 ClearBit(INTCON,INTF) ' clear INTF
end sub
' ---------------------
以上、お役に立ちましたら幸いです。

お手数をおかけしますが、2クリック(投票を)して頂けるとうれしいです。 ⇒ 日記@BlogRanking
お引き立て頂き、「60代~日記@BlogRanking」で上位になれています。ありがとう御座います。


78K0マイコン:ブートローダ

2008年08月06日 | PIC・マイコン
昨日までの累計アクセス数=5,907。 ご訪問頂き、ありがとうございます。         日記@BlogRanking

78K0マイコンとは、トランジスタ技術8月号(まだ、最新号? 10日発売)の付録として付いている基板で、
PCから見れば、PIC(6) USB・Genで列挙した内の、CDCデバイスにあたります。
付録のままでも、PCにUSB(延長)ケーブルで繋いで使えます。

ちょっとしたプログラムを作れば、USB-IOもどきにすることができますね。

発売翌日の、JA1OHP さんのブログ小さなマイコンが雑誌の付録に付いてた ~ 動きました ~に刺激されて、
2週間遅れで買っていました。

活用例は、JJ1WKN さんのブログトラ技 付録 NEC 78K0 マイコン その1(続きあり)に詳しく載っています。

<紙>も、ツール(アセンブラ、Cコンパイラ、+α)をインストールして、
(最初に作ってみる)1秒毎のLED 点滅プログラムを CC78K0 コンパイラで作ってみました。

時間待ちとして、インラインアセンブラを使って NOP命令を入れてみたが、
リンカで .rel ファイルが無いとか出て悩みました。
結局、空の while ループで約1.4マイクロ秒が作れたので、それで誤魔化しています。

そして、トラ技BIOS対応のブートローダを作りました。(Active BASICで。)
プログラム名は、AB_78K0.abp です。(下記)

使い方は、CC78K0 でビルドした結果を a,hex とし、AB_78K0.exe と同じところに置く。
78K0 ボードを繋いでから、AB_78K0.exe を実行すると、a.hex が書き込まれて実行される。
というものです。
78K0 ボードは、COM8 と決めうちしています。(パラメータ化は可能ですね。)
a.hex の実行でUSB 通信する場合は、追加のコーディングをします。

AB_78K0.abp でのシリアルIO処理は、PC:PIC 接続[シリアル編]で作ったものを改造しました。


' ------------------------- AB_78K0.abp
#include "RS232Cdecl.sbp" ' RS232Ctest.sbp を含む
#prompt ' 無くてもいい
'
Dim hComm As HANDLE, a$ As String
Dim buf[255] As Byte, k As Long, v As Long
'
a$=GetOneselfFileNameStr() : a$=Left$(a$,Len(a$)-11)
ChDir(a$) ' 自分自身("AB_78K0.exe")のディレクトリへ
'
hComm=CommOpen("COM8",115200,8,0,1) ' オープンCOMポート=コネクト78K0
'
' ------------- トラ技BIOS 開始
buf[0]=13 : buf[1]=0 : WriteFile(hComm, buf, 1, VarPtr(k), ByVal 0)
Sleep(15) : ReadFile(hComm, buf, 255, VarPtr(k), ByVal 0)
'
' ------------- load   a.hex
buf[0]=&H6C : buf[1]=&H6F : buf[2]=&H61 : buf[3]=&H64 : buf[4]=13 : buf[5]=0
WriteFile(hComm, buf, 5, VarPtr(k), ByVal 0)
Sleep(15) : ReadFile(hComm, buf, 255, VarPtr(k), ByVal 0)
Open "a.hex" For Input As #1
While Not(Eof(1))
Input #1,a$
v=len(a$) : memcpy(buf,StrPtr(a$),v)
buf[v]=13 : v++ : buf[v]=0
WriteFile(hComm, buf, v, VarPtr(k), ByVal 0)
Wend
Close #1
Sleep(15) : ReadFile(hComm, buf, 255, VarPtr(k), ByVal 0)
'
' ------------- jmp f000
buf[0]=&H6A : buf[1]=&H6D : buf[2]=&H70 : buf[3]=32
buf[4]=&H66 : buf[5]=48 :buf[6]=48 : buf[7]=48 : buf[8]=13 : buf[9]=0
WriteFile(hComm, buf, 9, VarPtr(k), ByVal 0)
Sleep(15) : ReadFile(hComm, buf, 255, VarPtr(k), ByVal 0)
'
' ======= 78K0 とのIO処理は、ここに追加する ========
'
*fin:
CloseHandle(hComm) ' クローズCOMポート
End
'
' ----------------------------------------
Function GetOneselfFileNameStr() As String
Dim buf[255] As Byte, length As Long
length=GetModuleFileName(NULL,buf,MAX_PATH)
GetOneselfFileNameStr=ZeroString(length)
memcpy(StrPtr(GetOneselfFileNameStr),buf,length)
End Function
' ================================= End Prog. ==============
ReadFile はすべてダミー(バッファ・クリアの為)です。

お手数をおかけしますが、2クリック(投票を)して頂けるとうれしいです。 ⇒ 日記@BlogRanking
お引き立て頂き、「60代~日記@BlogRanking」で上位になれています。ありがとう御座います。

ロータリースイッチの入力

2008年08月05日 | PIC・マイコン
昨日までの累計アクセス数=5,690。 ご訪問頂き、ありがとうございます。    日記@BlogRanking
お引き立て頂き、「60代~日記@BlogRanking」で上位になれています。ありがとう御座います。
やっと、アクセス数(IP)の累計で2千を超えました。

さて、ロータリースイッチ(SW)といっても、例えば1回路8接点のようなものではなく、
正確にはエンコードSWのことです。
例えば0~7の8通りの状態を3ビットで表現するようなSWのことです。

純粋なロータリーSWの値の読み取りでは8ビット必要ですね。
で、エンコードSWの状態をPICで読み取る場合、下図左のようにデジタルで入力すると3ビット必要となる。
しかし、AD変換機能のあるPICで、右のようにアナログ入力にすると1ビットでできる。



共通側に 22kohm を繋ぎ、1、2、4 側にそれぞれ 10kohm、22kohm、47kohm を繋ぐとすると、

1~7の場合の合成抵抗値は、
1:10-----10.00kohm
2:22-----22.00kohm
3:(22,10) -- 6.88kohm
4:47-----47.00kohm
5:(47,10) -- 8.25kohm
6:(47,22) --14.99kohm
7:(47,22,10)- 6.00kohm  となり、

これと共通部分の 22kohm との電圧分割比は、
0:1.000
1:0.313
2:0.500
3:0.238
4:0.681
5:0.273
6:0.405
7:0.214 となる。

PICのAD変換機能は10ビット以上あるが、8ビットで考えると
0:255
1: 80
2:128
3: 61
4:174
5: 70
6:103
7: 55  である。

これを並べ替えると
0:255
4:174
2:128
6:103
1:80
5:70
3:61
7:55  となり、
差の最小は3の場合と7の場合の差6である。

測定誤差は高々1(一定な電圧環境であれば8ビット分解能では誤差は無い?)であるから、
判定値を中間の値
58、65、75、92、115、151、224
とすれば、十分識別できることになる。

<紙>は、この方式で、電源ON又はRESET直後に値0~7を読み取り、
8種類のプログラムを起動するようなものを作ってみた。OK。メデタシメデタシ。

なお、エンコードSWには2種類あって、正論理のものと負論理のものがある。
この話しは、正論理(?)のものかな。


お手数をおかけしますが、2クリック(投票を)して頂けるとうれしいです。 ⇒ 日記@BlogRanking

USB-IO

2008年07月24日 | PIC・マイコン
昨日までの累計アクセス数=3,884。 ご訪問頂き、ありがとうございます。    日記@BlogRanking
皆様のお引き立てにより、「60代~日記@BlogRanking」で7~8位になりました。
まことにありがとう御座います。

USB-IOとは、PCとUSBケーブル(ストレートなもの)で繋いで、
8+4の合計12ピンでデジタル入出力が可能な基盤である。
ただし、電流容量的にはPCのパラレルポート(2mA)より小さい(1mA)。(12の内4ピンでは 15mA とれる。)

USB-IO復活プロジェクトに経緯が載っているが、現在では、Km2Netテクノキットから
「もの」が販売されていて、バケさんのHPに両社製品についての試用レポートがある。

PC:PIC 接続[パラレル編](1)で述べたようなPCからパラレルポートを制御することが、
パラレルポートの無いPCで(USBで)行える。

<紙>が PIC18F2550 を含めて、PICを手にしたのは、この USB-IO に刺激されてのことである。
PIC18F2550 なら、PORTA(6)、PORTB(8)、PORTC(5) の合計19ピンが使える。
しかも、デジタルに限らずアナログ入力にすることもできる。
また、電流容量的に見てもPCのパラレルポートより大きく、10mA とれる。

USB-IO は、PCから見れば、PIC(6) USB・Genで列挙した内の、HIDデバイス(汎用)にあたる。
PIC(7) USB・HID/CDCで作った、USBデバイス化PIC(HID汎用)に対して、
各ポートの入出力を制御するPCからのコマンドを受け付けて、
PIC内で処理をするようなプログラムにすれば、PIC18F2550 を USB-IO もどきにすることができる。
まだ、C18の勉強が足りなくて手がだせていない。残念。

お手数をおかけしますが、2クリック(投票を)して頂けるとうれしいです。(1日1回) ⇒ 日記@BlogRanking

PIC(18)言語仕様

2008年07月15日 | PIC・マイコン
                                             日記@BlogRanking
これまでに使ってみた言語について、PIC(14)で、
独断と偏見によるまとめを行ったが、追加のまとめを行う。
各言語については、PIC リンク集で、リンクしている。

Mikro BASIC(<紙>の略称:mB )
   IDE良くできている。ツールも便利
   大文字/小文字区別しない、 複文不可
   2進数:%11000011、 16進数:$C3、0xC3
   1文字:"A"、 文字列:"abc"
   Byte変数="A" 可

Great Cow BASIC( 略称:GCBC )
   バッチ処理プログラム
   大文字/小文字区別しない、 複文可
   2進数:b'11000011'、 16進数:0xC3
   1文字:"A"、 文字列:"abc"
   Byte変数="A" 可

Swordfish BASIC( 略称:SFBC )
   IDEは気が利いている
   大文字/小文字IDEが正してくれる、 複文不可
   2進数:%11000011、 16進数:$C3  (訂正:7月16日)
   1文字:"A"、 文字列:"abc"
   Byte変数="A" 可

SDCC
   バッチ処理プログラム
   大文字/小文字厳密に区別する、 複文可
   2進数:なし、 16進数:0xC3  (訂正:7月17日)
   1文字:'A'、 文字列:"abc"
   変数="A" 可

C18
   IDEは MPLAB
   大文字/小文字厳密に区別する、 複文可
   2進数:0b11000011、 16進数:0xC3
   1文字:'A'、 文字列:"abc"
   変数="A" 可

Active BASIC( 略称:AB  Windows ソフト用 )
   IDE良くできている
   大文字/小文字:予約語は区別しないがユーザ定義語は区別する、 複文可
   2進数:なし、 16進数:&HC3
   1文字:"A"、 文字列:"abc"
   変数=Asc("abc") と型区別する

自分用の備忘録だな。

お手数をおかけします。2クリック(投票を)お願いします ⇒ 日記@BlogRanking