PIC リンク集 改

2010-10-04 :  PIC・マイコン
当ブログのカテゴリ「PIC・マイコン」に関しては、記事が増えていません。
久々に、過去記事等を見返していたところ、
左欄の「リンク」に載せている、「PIC リンク集」は、2008-07-14 と、古くなっています。
記事中のリンク先も変わっている(切れている)ようです。

そこで、以下に up to date 版をまとめます。
(リンク切れサイトは削除しました)
----------------------------------------

PIC に関するリンク集です。

言語
mikroBasic
Great Cow BASIC
Swordfish BASIC
SDCC
C18
PIC Micro Controller Languages(言語大全)

ツール
MPLAB(本家)
Tiny PIC bootloader(ICSP)

ベンダ
Microchip 社(本家、チップ仕様)
マイクロチップ テクノロジー ジャパン(事例)

ショップ
秋月電子通商(チップ、ライタ)
ハーフマット(ライタ)

参考サイト
PS/2 プロトコル
YS電子工作ラボ(C18)
Lakeview Research(USB)
PIC18F2550(USB)使用例
水魚堂オンライン(回路図エディタ)
トランジスタ技術(雑誌)
HEXファイル仕様
赤外線リモコン仕様
バケさん(ActiveBasic、USB-IO)
千秋ゼミ[Swordfish UBS(PIC18)]


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

PIC 関連については、
参考で貼り付けている「gooあしあと」のキーワードにも散見されます。
何かの参考になりましたら、幸いです。     


見ていただきありがとうございました。
お帰りに投票して頂けると嬉しいです。 ⇒ blogram投票ボタン

日記@BlogRanking    


左欄の「blogram」ウィジットは、
本文末尾にある投票バナーと異なる機能(アクセスカウンタ機能)があったので、
表示時間が掛かりますが、復活させました。(汗;
なお、順序を若干並び替えました。
スポンサーサイト

USB TMC クラス?

2010-01-14 :  PIC・マイコン
ご訪問ありがとうございます。


或る測定器のデータ取り込みに関する話しです。

現在使っているものは、RS232C インタフェースのもので、
これを、USB・シリアル変換ケーブル(一例)で、USB に変換して、
PCに繋いでいる。(RS-232C ポートが無いPCなので)

今回の測定器は、インタフェースが、
  USB TMC(USB Test & Measurement Class)クラス
とありました。

USB のクラスについては、ブログを始めた頃に、
PIC(6) USB・Gen」で、以下のように纏めていました。

なお、プログラミングするには、さらに、宣言文(「ヘッダ」?)の要否がある。


それで、今回「TMC」クラスがあることを知りました。

ところで、TMC クラスって何?

USBTMCとは何ですか・・・」に書いてありました。
  GPIBのような通信をUSBデバイスと行うために、
  USBをベースに設計されたプロトコルです。
  ユーザーからは、USBデバイスはGPIBデバイスのように動作している
  ように見え、・・・
とのことですね。

つまり、PC等からみれば、
  CDC クラスは、RS232C と見え、
  TMC クラスは、GP-IB とみえる。
と云うことですね。

では、全部で幾つのクラスがあるの???
Approved Class Specification Documents 」に載っていました!

-----

CDC クラスについては、
PIC(7) USB・HID/CDC」や「78K0化(続き:新型PC化)」の如く、
「Active BASIC」で書けています。


TMC クラスについては、「Active BASIC」で書けるのかナ?

取り敢えず、C とか VB とか、かんとか、近いものを集めてみました。

GPIB/・・・/USBサンプルプログラム集(DL/AR/WT ...」(横河電機)
GPIBデバイスドライバ テストプログラムの一例」(プロエクシィ)
GP-IBによるPCへの測定データ転送」(京都大学 情報学研究科)
MCI サンプルプログラム一覧」(エムシーアイエンジニアリング)
GPIB制御プログラミング」(りーまん@関東以北)
Cプログラミング」(福井高専 電気工学科)

これらから、いろいろ勉強すれば(?)使えるものができるかな???

と云うことで、・・・・・          



見ていただきありがとうございました。
お帰りに投票して頂けると嬉しいです。 ⇒ 日記@BlogRanking

人気BlogRanking ⇒ 

P-NETBANKING ⇒ 

『mikroBASIC』

2008-09-16 :  PIC・マイコン
昨日までの累計アクセス数=15,355。 ご訪問頂きありがとうございます。         日記@BlogRanking


「あしあと解析」を見ましたら、以前、「PIC(14)言語比較」や「PIC(18)言語仕様」で書いた、
「mikroBASIC」についての検索が目立っていました。

改めて、コメントしたいと思います。

16F877A/873A、16F88、16F84A、12F683、16F648A(<紙>所有チップ)
などの14ビット系PIC向けには、お奨めできるBASICコンパイラだと思います。
体験版の制限はオブジェクトサイズが2KBまでですが、十分ではないでしょうか。

また、TinyBootloader(PIC(3)tiny bootloader)との相性がイマイチですが、
mikroElektronika製のブートローダもあります。

一方で、18F2550、18F452(<紙>所有チップ)などの16ビット系PIC向けには、
Swordfish BASIC がお奨めです。(もちろん、mikroBASIC も使えます。)

体験版の制限は、処理部分でなく使用するデータのサイズです。実質制限無し?

千秋ゼミ(Swordfish BASIC)が大変参考になります。

<紙>さんHP」に、PS/2マウス入力のプログラムを載せています。
(汚いでしょうが見てやって下さい。)


見ていただきありがとうございました。お帰りに投票して頂けるとありがたいです。 ⇒ 日記@BlogRanking
どうぞ宜しくお願い致します。

『ColdFire』マイコン

2008-09-03 :  PIC・マイコン
昨日までの累計アクセス数=12,421。 ご訪問頂きありがとうございます。         日記@BlogRanking

ColdFire とは、Freescale Semiconductor社のマイコン MCF52233 で、
Interface誌(2008年)9月号(既にバックナンバーになってしまいましたが)
に付録としてその基盤がついている。

<紙>が PIC で遊んでいて、欲しいなと思った、PICNIC(LAN接続できるPICマイコン)
に相当するのではないかと思って、雑誌を買った。結構な値段であったが。


ColdFire は、Ethernet に接続できる。つまり、LANが利用できる。
MCF52233 には256KBのフラッシュROMが内蔵されているが、付録基盤では、
その半分の128KBに、C言語インタプリタ(SilentC)とHTTPサーバが書き込まれている。

PCとは、telnetやtftpでの接続と、webブラウザでの接続が出来る。

付録基盤では最低限、(パルストランス内蔵)RJ-45モジュラ・ジャックと
DC 3.3V 供給用のDCジャックが必要である。部品を追加で買って、ハンダ付けした。
これで、PICNIC価格の半分を超えてしまった。


PCとColdfireをHUB経由で接続した。(下図)



通常、<紙>PCはDHCPを使っているが、一旦 192.168.1.2 に固定して作業した。
Coldfireには、仮のIPアドレス 192.168.1.10 が設定されている。


先ずは、telnetで接続して(ハイパーターミナルかTeraTermを使う)、組込コマンドが使えることを確認した。
dir
type ファイル名
load [ファイル名]
save [ファイル名]
list [行番号]
・・・
が使える。

本文の記事に従って、MACアドレスを設定した。
次にwebブラウザで接続しIPアドレスを設定するのだが、そのまま(192.168.1.10)使うことにした。

記事に載っているサンプルのホームページ index.htm と、処理プログラム Main をtftpで書き込んで、
webブラウザで接続すると、「内蔵の『加速度センサ』のアナログ値をAD変換した」数値が表示された。

つまり、付録基盤には MCF52233 と加速度センサーが載っており、
また、マイコン MCF52233 はAD変換機能も内蔵しているということだ。

これに、64ピン・コネクタ等を付けると、ブレッドボードでの実験ができる。
ソフト開発には、Cコンパイラが“おまけ”で付いている。
でも、いつになったら遊べるかな?


見ていただきありがとうございました。お帰りに投票して頂けるとありがたいです。 ⇒ 日記@BlogRanking
どうぞ宜しくお願い致します。

78K0マイコン:試行

2008-09-01 :  PIC・マイコン
昨日までの累計アクセス数=12,021。 ご訪問頂きありがとうございます。         日記@BlogRanking


以前、「78K0マイコン:ブートローダ」でブートローダを作りましたが、当時のテストは、
雑誌付録のプログラムで、基盤上のLEDを点滅させるモノでした。

78K0化(続き:新型PC化)」で設計した(エッ! ハイ、実は設計段階だったんです。)
モノを作るべく、製造段階に入りました。

78K0マイコン基盤に、(必須では無いが)「USB・Bレセプタクル」と、
これは必須である「28ピンDIP連結ソケット」をハンダ付けしました。

付属の開発ツール:CC78K0コンパイラとLK78K0リンカ等を用いて、
ポートP10、P11に繋いだLEDを点滅させるソフトを開発しました。

RAM上で動かすので、「RamStart.asm」とリンカ用「RAMAPP.dr」をプロジェクトにコピーして、
ソース上では、「trgbios.h」と「types.h」をインクルードするようにしました。(ソース全体は後ほど載せます。)

回路図は下図の通りです。

抵抗が、3K3 なのは、電流値を制限したためです。(暗いけど)


78K0マイコン用プログラムの仕様:
PCからUSB経由で1文字入力し、
文字が. ならば終了する。
文字がX ならば500ms毎、5回、P10ポートのLEDを点滅させる。
文字がx ならば250ms毎、10回、P10ポートのLEDを点滅させる。
文字がY ならば500ms毎、5回、P11ポートのLEDを点滅させる。
文字がy ならば250ms毎、10回、P11ポートのLEDを点滅させる。
それ以外は、無視する。
という単純なモノです。

テスト実行はOK。メデタシメデタシ。

見ていただきありがとうございました。お帰りに投票して頂けるとありがたいです。 ⇒ 日記@BlogRanking
どうぞ宜しくお願い致します。



78K0マイコン用Cソースは以下です。(段付けの為、先頭に2B空白がある。)
----------------------- a.c ----------------------------------------------
#pragma sfr
#include "types.h"
#include "trgbios.h"
void waitus(U16 vvv){ // vvv us のWAITを行う(正確には1.4usくらい)
 while(vvv--) ;
}
void waitms(U16 ww){ // ww ms のWAITを行う
 while(ww--) waitus(740);
}
void task1(){
 U8 i;
 for ( i=0 ; i<10 ; i++ ){  waitms(500); // 500 ms 時間待ち
  P1.0 ^= 0x01; // LED のポートP10を点滅
 }
}
void task2(){
 U8 i;
 for ( i=0 ; i<20 ; i++ ){  waitms(250); // 250 ms 時間待ち
  P1.0 ^= 0x01; // LED のポートP10を点滅
 }
}
void task3(){
 U8 i;
 for ( i=0 ; i<10 ; i++ ){  waitms(500); // 500 ms 時間待ち
  P1.1 ^= 0x01; // LED のポートP11を点滅
 }
}
void task4(){
 U8 i;
 for ( i=0 ; i<20 ; i++ ){  waitms(250); // 250 ms 時間待ち
  P1.1 ^= 0x01; // LED のポートP11を点滅
 }
}
void main() {
 PM1.0 = 0; // LED のポートP10を出力用にする
 PM1.1 = 0; // LED のポートP11を出力用にする
 while(1) {
  char c = trg_getc(); // USB から1 文字取得
  if(c == '.') break; // 文字が. ならば終了
  if(c == 'X') task1(); // 文字がX ならば500ms毎 P10
  if(c == 'x') task2(); // 文字がx ならば250ms毎 P10
  if(c == 'Y') task3(); // 文字がY ならば500ms毎 P11
  if(c == 'y') task4(); // 文字がy ならば250ms毎 P11
 }
}

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

ABV4(Active BASIC Ver.4)のアプリは、ブートローダ用のIO処理部分のみ載せる。
(段付けの為、先頭に2B空白がある。)
'
'
Dim ins$ As String, ots$ As String, j As Long, p As *Byte
'
' ======= 78K0 とのIO処理 ============
'
Do
 Input "コマンド=";ins$
 v=Len(ins$) : If v=2 Then *fin
 if v>0 Then p=StrPtr(ins$) : memcpy(buf,p,v)
 buf[v]=13 : v++ : buf[v]=0
 j=WriteFile(hComm, buf, v, VarPtr(k), ByVal 0) ' 書き出し
 Sleep(15)
 j=ReadFile(hComm, buf, 250, VarPtr(k), ByVal 0) ' 読み込み
 buf[k]=0 : ots$=MakeStr(buf)
 Print "受信文字列=";ots$
Loop
' ===================================================================

78K0化(続き:新型PC化)

2008-08-24 :  PIC・マイコン
昨日までの累計アクセス数=9,851。 ご訪問頂きありがとうございます。         日記@BlogRanking


PC1台化(続き:単純化)の結果、随分すっきりしたものになったが、ここでのPC(PCB)はパラレルポートが必須である。
だが、最近のPCにはパラレルポートが無いものが多い、特にノートPCでは。

(<紙>のメインマシンは、3年前に作ったペンティアム4HTだが、メインボードはintel社のD945Gで、)
(まだ、PS/2もシリアルポート/パラレルポートも付いている。さすがにISAバスは無いけど。)

そこで、パラレルポート無しでも使えるように、ということはUSBで動くようにアプリCを移植した。
ここで使ったのは、78K0マイコン:ブートローダで書いた、78K0マイコンである。
このためだけに、トラ技8月号を購入した。

アプリCを改造しアプリDにした。改造ポイントは、最初のアプリAと同じ serial on USB 方式でOK。
PCは新しい型のPC(PCA)でOK。
78K0マイコン用アプリは、USBからコマンドを入力しパラレルポートにパルスを出力するものを、
添付のC言語で新規に開発した。

HW構成は下図のようになる。



この78K0マイコン用ソフトでも、1マイクロ秒を作り出す方法で悩んだ。

そこで、C言語のアセンブラオブジェクトを出力するようにして、眺めていたら、
空のfor文で変数を2バイトとすると、1回当たり約1.4マイクロ秒くらいになるようだ。

なので、これで時間待ちループを作ることにした。1ミリ秒は約720回のループで作れる。
以上で、最近のPC(デスクトップでもノートPCでも)でも、USB経由で使えることになった。

見ていただきありがとうございました。お帰りに投票して頂けるとありがたいです。 ⇒ 日記@BlogRanking
どうぞ宜しくお願い致します。

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

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

PIC リンク集

2008-07-14 :  PIC・マイコン
                                              日記@BlogRanking
これまでの整理として、リンク集を作る。

言語
mikro BASIC
Great Cow BASIC
Swordfish BASIC
SDCC
C18
PIC Micro Controller Languages(言語大全)
Active BASIC(←これはWindows用です)

ツール
MPLAB(本家)
Tiny PIC bootloader(ICSP)

ベンダ
Microchip 社(本家、チップ仕様)
マイクロチップ テクノロジー ジャパン(事例)

お店
秋月電子通商(チップ、ライタ)
ハーフマット(ライタ)

参考サイト
PS/2プロトコル
Spency's PICBasic(Swordfish BASIC)
YS電子工作ラボ(C18)
Lakeview Research(USB)
PIC18F2550(USB)使用例
水魚堂オンライン(回路図エディタ)
トランジスタ技術(雑誌)
HEXファイル仕様1仕様2
赤外線リモコン仕様1仕様2
バケさん(ActiveBasic、USB-IO)
千秋ゼミ(Swordfish BASIC、UBW)

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

PIC(17)電源

2008-07-13 :  PIC・マイコン
                                                   日記@BlogRanking
PIC(4)で電源ラインを変更していたが、またまた電源ラインを変更することにした。
今度は、USBケーブルをバラして +5V とGND の2線を取り出し、直接ブレッドボードに挿している。

USB-232Cケーブルと合わせた概略回路図を示す。

これで、コネクタの抜き差し箇所が、PCへのUSBコネクタ1個のみとなった。


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

PIC(16)HEXパッチ

2008-07-11 :  PIC・マイコン
                                                   日記@BlogRanking

PIC(11)で説明したパッチ処理を、Active BASIC(V4)でコーディングしたものを示す。

mikroBASICのコンパイル結果の HEX ファイル名を指定すると、
Tiny Bootloaderの仕様にあった HEX ファイルに変換する。
(ファイル名の先頭に“_”をつけたファイルを作成する。)
(この EXE は同一ディレクトリにコピーしておいて実行する。)

(段付けのために、先頭に2B空白がある)
--------------------- < Patch-HEX.abp > ---------------------
#prompt
'
Dim f$ As String, a$ As String, b$ As String
'
Input "HEX file name(除く'.HEX')=";f$
Open f$+".HEX" For Input As #1
Input #1,a$
'
Print "First Line = ";a$
If Len(a$)<>43 Then Goto *err
If Left$(a$,9)<>":10000000" Then Goto *err
If Mid$(a$,14,4)<>"FF3F" Then Goto *err
'
Open "_"+f$+".HEX" For Output As #2
b$=Right$( Hex$( Val( "&H"+Right$(a$,2) ) + &HB3 ) , 2 )
a$=":100000008A01"+Mid$(a$,10,4)+Mid$(a$,18,24)+b$
'
Print "Chaged To -> ";a$
Print #2,a$
'
While Not(Eof(1))
 Input #1,a$
 Print #2,a$
Wend
Print "処理終了。"
Input "OK? ",a$
End
'
*err
Input "処理できません。";a$
End
'--------------------
汚いコーディングですが。

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

PIC:PIC 通信(2)I2C

2008-07-10 :  PIC・マイコン
                                              日記@BlogRanking
PIC:PIC間のI2C通信のコーディング例を示す。

Swordfish BASIC による Master の例。
---------------- <Swordfish BASIC> -- 18F -------------
I2C.Initialize // initialize I2C 100kHz

// send_I2C ----- 1Byte
I2C.Start ' issue start signal
I2C.WriteByte($D6) ' address of slave
I2C.WriteByte(aa) ' send data
I2C.Stop ' issue stop signal

// recv_I2C ----- 2Byte
I2C.Start
I2C.WriteByte($D7) ' address of slave
aa=I2C.ReadByte(I2C_ACKNOWLEDGE)
bb=I2C.ReadByte(I2C_NOT_ACKNOWLEDGE)
I2C.Stop
' ----------
これは、コンパイラ付属のサンプルと変わらないかも。


mikro BASIC による Slave の例。(受けた2バイトに1加えて返すもの)
(段付けのために、先頭に2B空白がある)
---------------- <mikro BASIC> ----- 16F --------------
Dim aa, bb, dummy As Byte
'
sub procedure I2Cslave_init
 SSPADD = $D6 ' Make our address D6 (7bit)
 SSPCON = $36 ' Set to I2C slave with 7-bit address
 TRISB.4 = 1 ' SCL (input)
 TRISB.1 = 1 ' SDA (input)
end sub
'
sub procedure WaitForPIR1SSPIFset ' Waits till interrupt flag is set
 do
 loop UNTIL TESTBIT(PIR1,SSPIF) = 1
end sub
'
sub function ReceiveByteI2C as BYTE ' Receives one byte via I2C
 SETBIT(SSPCON,CKP) ' Release clock
 WaitForPIR1SSPIFset
 RESULT = SSPBUF
 CLEARBIT(PIR1,SSPIF) ' Clear interrupt flag
end sub
'
sub procedure SendByteI2C(dim TByte as BYTE) ' Sends the TByte via I2C
 do
 loop UNTIL TESTBIT(SSPSTAT,BF) = 0 ' Wait for empty buffer
 NOP ' ???
 SSPBUF = TByte ' Put TByte in buffer
 NOP ' ???
 SETBIT(SSPCON,CKP) ' Release the clock. starts the transmission.
 WaitForPIR1SSPIFset
 CLEARBIT(PIR1,SSPIF) ' Clear interrupt flag
end sub
' ------------- Main -------------
I2Cslave_init
'
WaitForPIR1SSPIFset ' Wait for address match
dummy = SSPBUF ' Get rid of Address
aa = ReceiveByteI2C
bb = ReceiveByteI2C
Inc(aa)
Inc(bb)
SETBIT(SSPCON,CKP) ' Release clock
WaitForPIR1SSPIFset ' Wait for RepeatedStart
dummy = SSPBUF ' Get rid of Address
CLEARBIT(PIR1,SSPIF)
SendByteI2C(aa)
SendByteI2C(bb)
' ----------
mikro BASIC のフォーラムにあったものです。

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

PIC:PIC 通信(1)232C

2008-07-09 :  PIC・マイコン
                                                   日記@BlogRanking

PIC同士の接続については、1、2、3線シリアル・インターフェースが解りやすい。

このうちの、2線式2種類(RS232C、I2C)の接続例図を示す。

ピン名称については、RS232Cでは、Tx、Rx であり、I2Cでは、SCL、SDA である。
3線式のSPIでは、SCK、SDI、SDO で、1線では、DQ と呼ぶ。もちろん、もう1線 基準電位の GND を忘れてはいけない。

ちなみに、PS/2では、CL、DT で、USBでは、D+、D- である。
これらは、GND とさらに +5V ラインも必要だから4線式?

で、通信プログラムの、サンプルコーディングを示す。

RS232C通信のコーディング例 3つ(mikro BASIC、Great Cow BASIC、Swordfish BASIC)
対向はPCでもPICでも同じである。

(段付けのために、先頭に2B空白がある)
---------------- <mikro BASIC> ----- 16F/18F ----------
dim received_byte as byte ' Declare variable

Usart_Init(115200) ' Initialize USART module

if Usart_Data_Ready = 1 then ' If data is received
 received_byte = Usart_Read ' Read received data
end if

Usart_Write(received_byte) ' Send data via USART
' ----------


Forum → Contributors → Hardware USART Library と辿って得られた「usart.h」を流用している。
---------------- <Great Cow BASIC> ---- 16F -----------
dim received_byte ' Declare variable

initusart ' Initialize USART module 19200bps

received_byte=HserIn ' Read received data

HserTX(received_byte) ' Send data via USART
' ----------


(段付けのために、先頭に2B空白がある)
---------------- <Swordfish BASIC> -- 18F -------------
Include "USART.bas" ' Declare module
Include "ISRRX.bas"

Dim received_byte As Byte ' Declare variable

SetBaudrate(br115200) ' Initialize USART module

If ISRRX.DataAvailable Then ' If data is received
 received_byte=USART.ReadByte() ' Read received data
End If

USART.WriteByte(received_byte) ' Send data via USART
' ----------

コンパイラ付属のサンプルそのままかも。

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

PC:PIC 接続[シリアル編]

2008-07-08 :  PIC・マイコン
                                                   日記@BlogRanking
PCとPICをシリアル(RS232C)で接続するには、
このようなUSB・シリアル変換ケーブルを使うと、このようなRS232CインターフェースICが必要である。

世の中には、こういったRS-232C - TTLレベルの簡易変換方法もあるが。
<紙>は、UP12 USB-PDC Converterを使っている。
PDCコネクタを分解して、3線(Tx、Rx、GND)をブレッドボードに挿している。

そこで、Active BASICフォーラムにある、RS232C 通信用プログラムを参考に、
<紙>流のサブプログラム(インクルードファイル:RS232Cdecl.sbp)を作った。詳細は、後記。

上記からDLした、RS232Ctest.lzh に入っている、RS232Ctest.sbp を使う。
RS232Cdecl.sbp では、シリアルポートをオープンする関数 CommOpen を定義した。

CommOpen( Pcomm As String, Pbaud As Long, Psize As Long,
 Ppari As Long, Pstop As Long ) As HANDLE
'    Pcomm:"COM2"のようにポート名を指定する。
'    Pbaud:9600,19200,115200 等々、速度を指定する。
'    Psize:7 か 8 で、データ長(ビット数)を指定する。
'    Ppari:1 か 0 で、パリティの有無を指定する。
'    Pstop:1 か 2 で、ストップビット長を指定する。
'    戻り値は、COMポートのハンドルである。

これを用いたシリアル通信を行う、サンプルプログラムを示す。
PCのシリアルポート(Dサブ9ピン)でも、上記UP12でも同じように使える。
(エラー処理は省略する)
'------------------- < Active BASIC > -----------------
#include "RS232Ctest.sbp"
#include "RS232Cdecl.sbp"
#prompt
'
Dim hComm As HANDLE 'COMポートハンドル
Dim a$ As String, buf[20] As Byte, k As Long
'
hComm=CommOpen("COM2",115200,8,0,1) ' オープンCOMポート
'            COMポート名,Baud,Bits,Pari,Stop
'
buf[0]=&H41 : buf[1]=&H42 : buf[2]=0 : k=2 ' "AB"の2文字を送出する例。
WriteFile(hComm,buf,k,VarPtr(k),ByVal 0)
'
ReadFile(hComm, buf,20,VarPtr(k), ByVal 0) ' 受信文字列をプリントする例。
buf[k]=0 : Print "受信文字列=";MakeStr(buf)
'
CloseHandle(hComm) ' クローズ COMポート
End
' --------------------------------- プログラム終了。

<紙>はこのようなプログラムでPICと接続している。

RS232Cdecl.sbp のソースを示す。(段付けのために、先頭に2B空白がある)
'-------------------------------- < RS232Cdecl.sbp > -------------------
Function CommOpen( Pcomm As String, Pbaud As Long, Psize As Long,
  Ppari As Long, Pstop As Long ) As HANDLE 'シリアルポートをオープンする
Dim comname[10] As Byte, MsgD As *Byte
Dim a$ As String, hComm As HANDLE

comname[0]=0 : lstrcpy(comname,StrPtr(Pcomm)) '使用するポート
'ポートのオープン
hComm = CreateFile(comname, GENERIC_READ Or GENERIC_WRITE, 0, ByVal 0,
 OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)
If hComm = -1 Then
 MsgD=lstrcat(comname,"が使えません") 'ポートオープン失敗時
 MsgD[16]=0 : a$=MakeStr(MsgD) : Print a$
 Input "OK";a$
 End '強制終了
End If
CommOpen=hComm

'シリアル通信の設定
GetCommState(hComm, stDCB)
 stDCB.BaudRate = Pbaud '転送速度の指定(9600/115200,・・・)
 stDCB.ByteSize = Psize 'ビット長の指定(8/7)
 stDCB.fBitFields = &H1311 'バイナリモードON,Xon/Xoff制御ON,RTS強制起動,DTR強制起動
 stDCB.Parity = Ppari 'パリティの設定(0:パリティなし / 1:あり)
 stDCB.StopBits = Pstop - 1 'ストップビット数を指定(1/2 ビット)
 stDCB.XonChar = &H11
 stDCB.XoffChar = &H13
 stDCB.XonLim = 2048
 stDCB.XoffLim = 512
SetCommState(hComm, stDCB) '必要な部分だけ書き換える

'タイムアウトの設定
GetCommTimeouts(hComm,timeOut)
 timeOut.ReadIntervalTimeout = 10 '文字の読み込み待ち時間(10ms)
 timeOut.ReadTotalTimeoutMultiplier = 10 '読込の1文字あたりの時間(10ms)
 timeOut.ReadTotalTimeoutConstant = 2000 '読込の定数時間(2000ms)
 timeOut.WriteTotalTimeoutMultiplier = 0 '書込の1文字あたりの時間(0:タイムアウトしない)
 timeOut.WriteTotalTimeoutConstant = 0 '書込の定数時間(0:タイムアウトしない)
SetCommTimeouts(hComm, timeOut) 'タイムアウトの設定

End Function
'---------------------------------

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

PC:PIC 接続[パラレル編](2)

2008-07-07 :  PIC・マイコン
                                                日記@BlogRanking
PCからPICにデータを送信する方法として、パラレル通信がある。
処理速度の違いを吸収して、確実に通信する場合、ハンドシェィク通信を行う。

ハンドシェィクとは、握手であり、確実に送達を確認し合うことである。
処理の手順を要約すると、以下のようになる。

送出側(PC)
1.ビジーOFFを待つ。
2.データをセットする。
3.ストローブをONにする。
4.ビジーONになったら、ストローブをOFFにする。
以上で、1単位データ(8ビット=1バイト)を送出する。

受取側(PIC)
1.ストローブONを待つ。
2.ビジーをONにする。
3.データを取り込む。
4.ストローブOFFを待って、ビジーをOFFにする。
以上で、1単位データを受取る。

PCのパラレルポートでは、ストローブはピン#1、ビジーはピン#11、
データはピン#2~9(8ビット)を使う。
(初期値は、ストローブ/ビジーともOFFにする。)

Active BASICによるPC側の1バイト送出、サンプルプログラムを示す。

(エラー処理は省略する)
(段付けのために、先頭に2B空白がある)
'------------------- < Active BASIC > -----------------
' 直接I/O 制御関数群(InpB、OutB)宣言
Declare Function InpB Lib "VBIOSCM_DLL.DLL" Alias "_InpB@4" (ByVal Port As Integer) As Integer
Declare Sub OutB Lib "VBIOSCM_DLL.DLL" Alias "_OutB@8" (ByVal Port As Integer, ByVal dat As Integer)
' 直接I/O 制御 開始/終了処理(IOSCM_Start、IOSCM_Stop)宣言
Declare Function IOSCM_Start Lib "VBIOSCM_DLL.DLL" Alias "_IOSCM_Start@0" () As Integer
Declare Function IOSCM_Stop Lib "VBIOSCM_DLL.DLL" Alias "_IOSCM_Stop@0" () As Integer
#prompt
'
Dim addr As Integer
'
IOSCM_Start() ' IOSCM 開始処理をコール
addr=&H378 ' プリンタポート、環境にあわせて変更
'
OutB(addr+2,0) ' データポートを出力モードに設定
'
Out_Byte( Asc("A") ) ' ハンドシェィクによる1バイト送出
'
IOSCM_Stop() ' IOSCM 終了処理をコール
End ' プログラム終了。
'---------------- 1バイト送出サブルーチン
Sub Out_Byte ( data As Byte )
 While ( InpB(addr+1) and &H80 ) = 1
 Wend ' BUSY OFF を待つ
 OutB(addr,data) ' データをセットする
 OutB(addr+2,1) ' STROBE を ON にする
 While ( InpB(addr+1) and &H80 ) = 0
 Wend ' BUSY ON になったら
 OutB(addr+2,0) ' STROBE を OFF にする
End Sub
' -------------- プログラム終り
合計10ピンも使うので、40ピンPICでないと使えないかも。

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

PC:PIC 接続[パラレル編](1)

2008-07-06 :  PIC・マイコン
                                                   日記@BlogRanking
PCのパラレルポート(プリンタポート)を、ActiveBASIC (Ver.4)を用いて直接操作して、
PICと通信する方法をまとめる。

まず、プリンタポートの仕様は、AT互換機パラレルプリンターポートにある。
また、フリー百科事典『ウィキペディア(Wikipedia)』では、パラレルポートといった記述がある。
PCで利用することを考えると、これが分かりやすい。

ですが、Windows XP では、直接操作が許されていないので、IOSCM.SYSを使う。
実際に使うのはその内の、次の2ヶのみである。(メインプログラムと同じ場所に置いておく)
ioscm.sys、vbioscm_DLL.dll

メインプログラムでは、DLL の使用宣言をし、開始処理を呼び、IOを行う。

(段付けのために、先頭に2B空白がある)
'------------------- < Active BASIC > -----------------
' 直接I/O 制御関数群(InpB、OutB)宣言
Declare Function InpB Lib "VBIOSCM_DLL.DLL" Alias "_InpB@4" (ByVal Port As Integer) As Integer
Declare Sub OutB Lib "VBIOSCM_DLL.DLL" Alias "_OutB@8" (ByVal Port As Integer, ByVal dat As Integer)
' 直接I/O 制御 開始/終了処理(IOSCM_Start、IOSCM_Stop)宣言
Declare Function IOSCM_Start Lib "VBIOSCM_DLL.DLL" Alias "_IOSCM_Start@0" () As Integer
Declare Function IOSCM_Stop Lib "VBIOSCM_DLL.DLL" Alias "_IOSCM_Stop@0" () As Integer

Dim addr As Integer, ret As Integer ' 変数定義

ret=IOSCM_Start() ' IOSCM 開始処理をコール
If ret And 1 Then ' エラーの時は直接I/O制御不可のため終了
 Print "IOSCM Init Error!!"
 End
End If ' 以後は直接I/O 制御が可能になる
'
addr=&H378 ' プリンタポート、環境にあわせて変更
'
OutB(addr+2,&H0B) ' データポートを出力モードに設定する。コントロールポートは全てLowに。
OutB(addr,0) ' データポートを全てLowにする。

以下、
 OutB(addr,xxx) ' データポートへ xxx を出力する。
 xxx=InpB(addr+1) ' ステータスポートから入力する。
等で使える。

最後は、
*owari ' 終了
ret=IOSCM_Stop() ' IOSCM 終了処理をコール
End
となる。

なお、データポートを入力モードにするには、
OutB(addr+2,&H2B) ' 入力モードに設定する。コントロールポートは全てLowに。
である。


例えば、ピン#2(データポートの0ビット)をPICに繋いで、スイッチの代わりに使う。
OutB(addr+2,&H0B) ' データポートを出力モードに設定する。
OutB(addr,0) ' スイッチオフ。
OutB(addr,1) ' スイッチオン。
となる。

ついでに、PC上での時間待ちは Sleep(xx) 命令を使う。
xx は ミリ秒単位であるが、実際には15mS 単位に切り上げられる。

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

PIC(15)割込

2008-07-05 :  PIC・マイコン
                                              日記@BlogRanking
前回載せた、0.5秒毎のLED点滅プログラムを、
10mS 毎の TMR0 割込による方式に変えてみました。

なお、20MHz発信器では正確に10mSはだせません。9.984mS になります。
以下、SDCC を除く4言語分を載せます。

(段付けのために、先頭に2B空白がある)
(コメントの日本語がエラーに成るものがあるかもしれない)
(config 定義は正しくないかもしれない)

---------------- <mikro BASIC> ------------------------
' chip(16F873A)、clock(20MHz)、config は IDE で設定する。
program test
dim i as byte
sub procedure interrupt
 if INTCON.T0IF = 1 then ' TMR0 interrupt
  ClearBit(INTCON,T0IF) ' Claer T0IF
  TMR0 = 61 ' Next 10mS
  inc(i)
 end if
end sub
'-------------------
main:
 OPTION_REG = 0x87 ' Assign prescaler to TMR0 1:256
 TMR0 = 61 ' (256-61)=195 0.2us*195*256=9.984ms
 INTCON = %10100000 ' Enable TMRO interrupt
 TRISC.0 = 0 ' output
 PORTC.0 = 1 ' on
 i = 0
 while true
  if i > 49 then
   PORTC.0 = 1 - PORTC.0 ' toggle
   i = 0
  end if
 wend
end.


---------------- <Great Cow BASIC> --------------------
#chip 16F873A, 20 ' MHz
#option bootloader
#config HS_OSC, WDT_OFF
Dim i, xx As Byte ' As Byte は省略可。この文自体が省略可。
OPTION_REG = 0x87 ' Assign prescaler to TMR0 1:256
TMR0 = 61 ' (256-61)=195 0.2us*195*256=9.984ms
set INTCON.TMR0IE on ' Enable TMRO interrupt
set INTCON.GIE on
TRISC.0 = 0 ' output
PORTC.0 = 1 ' on
i = 0
do
 if i > 49 then
  xx = PORTC.0 ' toggle
  PORTC.0 = 1 - xx '
  i = 0
 end if
loop
'-------------------
sub Interrupt
 If INTCON.TMR0IF on then ' TMR0 Interrupt occurred
  set INTCON.TMR0IF off ' Clear the interrupt
  TMR0 = 61 ' Reset for Next 10mS
  i = i + 1
 End If
End sub


---------------- <Swordfish BASIC> --------------------
Device = 18F2550
Clock = 24 ' MHz
Config
 PLLDIV=5, CPUDIV=OSC3_PLL4, FOSC=HSPLL_HS, WDT=OFF
Dim TMR0ON As T0CON.7,
 T08BIT As T0CON.6,
 T0CS As T0CON.5,
 T0SE As T0CON.4,
 PSA As T0CON.3,
 TMR0IE As INTCON.5,
 TMR0IF As INTCON.2,
 TMR0 As TMR0L
Dim i As Byte
Interrupt TMR0_Interrupt()
 If TMR0IF = 1 Then // Check if a TMR0 Interrupt occurred
  TMR0IF = 0 // Clear the interrupt
  TMR0 = 22 // Next 10mS
  Inc(i)
 EndIf
End Interrupt
'----------------------
TMR0ON = 0 // Disable TMR0
T08BIT = 1 // Ensure TMR0 is working in 8 Bit mode
T0CS = 0 // Ensure TMR increments from internal clock
T0SE = 0 // Only used if external source is selected
PSA = 0 // Ensure the Clock source uses the Prescaler
T0CON.0 = 1 // Set the Prescaler bits
T0CON.1 = 1 // 1:256
T0CON.2 = 1 // (256-22)=234, 234*1/6*256=9.984mS
TMR0 = 22 // Set the TMR0 register
TMR0IE = 1 // Enable TMR0 Interrupts
Enable(TMR0_Interrupt) // Enable the TMR0 Interrupt Handler
TMR0ON = 1 // Enable TMR0 to increment
TRISC.0 = 0 ' output
PORTC.0 = 1 ' on
i = 0
While true
 If i > 49 then
  Toggle(PORTC.0) ' toggle
  i = 0
 Endif
Wend


---------------- <C18> -----------------------------
#include <p18cxxx.h> // PIC18F2550
#pragma config PLLDIV = 5
/*  その他 20MHz -> 24MHz */
#pragma interrupt ISR // 割込み宣言(優先順位使わない)
#pragma code ISR = 0x08 // 割込みベクタへのjmp命令セット
void Jump_ISR(void){
_asm goto ISR _endasm
}
#define LED0 PORTCbits.RC0 // LED 定義
#pragma udata
unsigned char i;
#pragma code
void main(){
 T0CON = 0b01000111;
   // TMR0ON = 0; ' Disable TMR0
   // T08BIT = 1; ' TMR0 is working in 8 Bit mode
   // T0CS = 0;  ' TMR increments from internal clock
   // T0SE = 0;  ' Only used external source
   // PSA = 0;   ' Ensure the Clock source uses the Prescaler
   // .2 = 1;   ' Prescaler bits
   // .1 = 1;   ' 1:256
   // .0 = 1;   ' (256-22)=234, 234*1/6*256=9.984mS
 TMR0L = 22; // Set the TMR0 register
 INTCONbits.TMR0IE = 1; // Enable TMR0 Interrupts
 T0CONbits.TMR0ON = 1;
 INTCONbits.GIE = 1;
 TRISCbits.TRISC0=0; // output
 LED0 = 1; // on
 i = 0
 while (1){
  if ( i > 49 ){
   if ( LED0 ) LED0=0; else LED0=1;
   i = 0;
  }
 }
}
//----------------------
void ISR(void){ // 割り込み関数
 if(INTCONbits.T0IF){ // タイマ0割り込み?
  INTCONbits.T0IF=0; // タイマ0割り込みフラグを0にする
  TMR0L = 22; // Re-Set the TMR0 register
  i ++ ;
 }
}
できるだけ、各言語の特徴を出したつもりです。

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

PIC(14)言語比較

2008-07-04 :  PIC・マイコン
                                                 日記@BlogRanking
これまでに使ってみた言語について、独断と偏見によるまとめを行います。

1.対象PIC、 2.有償/無償、 3.標準LIb、 4.寸評 でまとめる。
最後に入門用プログラム「0.5秒毎のLED点滅」ソースを示す。(順不同)

mikro BASIC
1.16F、18F 両用。
2.有償。Demo 版は 2kW まで。(18F では、3.5kB 位で引っ掛かった。)
3.標準Lib 多い。Forum にも数多くある。
4.オブジェクトサイズは大きい。特に LCD Lib。
 入門者向けには、適していると思う。16F でも 18F でも。
 サブルーチンの前方参照は不可。

Great Cow BASIC
1.16F、18F 両用。
2.フリーソフト。open source
3.標準Lib 少々あり。Forum にもある。
4.バグが多い。割込のサポートが弱い。データ型は2Bまで。
 宣言なしで変数が使えるのは、デバッグに時間が掛かる。
 熟知していれば、16F 用フリーBASIC としては良いと思う。
 18F では、使えないかも。
 サブルーチンの前方参照は可能。

Swordfish BASIC
1.18F 専用。
2.有償。SE(Special Edition) 版は、RAM 256B 以下が制限。
3.標準Lib 多い。Forum にも数多くある。
4.オブジェクトサイズは最適だと思う。
 USBは使えないが、18F 用ならほぼフリーで使える。
 サブルーチンの前方参照は不可。

SDCC
1.16F、18F 両用。(18F では、リンカでエラーとなった後使っていない)
2.フリーソフト。open source
3.標準Lib なし。ネットで探す。
4.オブジェクトサイズは特に大きい。特に BANKSEL が多すぎる。
 16F 用のC言語なら、mikroC demo 版で良いのではないか?
 (<紙>は使っていないが。)
 サブルーチンの前方参照にはプロトタイプ定義が必要。

C18
1.18F 専用。
2.有償。60 日間はフリー。以降は最適化なしになるだけ。
3.標準Lib 多い。Forum にも数多くある。
4.標準Lib は使いづらい。オブジェクトサイズは大きい。
 USBも含め、ほぼフリーで使える。さすが本家本元。
 サブルーチンの前方参照にはプロトタイプ定義が必要。

<紙>的には、
 16F --> mikro BASIC   & Great Cow BASIC
 18F --> Swordfish BASIC & C18     かな。

以下に、ソースを列挙する。
(段付けのために、先頭に2B空白がある)
(コメントの日本語がエラーに成るものがあるかもしれない)
(config 定義は正しくないかもしれない)

---------------- <mikro BASIC> ------------------------
' chip(16F877A)、clock(20MHz)、config は IDE で設定する。
program LED_Blink
main:
 TRISC.0 = 0 ' output
 PORTC.0 = 1 ' on
 while true
  PORTC.0 = 1 - PORTC.0 ' toggle
  delay_ms(500)
 wend
end.

---------------- <Great Cow BASIC> --------------------
#chip 16F877A, 20 ' MHz
#option bootloader
#config HS_OSC, WDT_OFF
Dim xx As Byte ' As Byte は省略可。この文自体が省略可。
TRISC.0 = 0 ' output
PORTC.0 = 1 ' on
do
 xx = PORTC.0 ' toggle
 PORTC.0 = 1 - xx '
 wait 50 10ms
loop

---------------- <Swordfish BASIC> --------------------
Device = 18F2550
Clock = 24 ' MHz
Config
  PLLDIV=5, CPUDIV=OSC3_PLL4, FOSC=HSPLL_HS, WDT=OFF
TRISC.0 = 0 ' output
PORTC.0 = 1 ' on
While true
 Toggle(PORTC.0) ' toggle
 DelayMS(500)
Wend

---------------- <SDCC> -------------------------------
#include <sdcc-lib.h>
#include <pic16f877a.h>
int at 0x2007 __config = _HS_OSC & _PWRTE_ON;
int ms, mcnt;
TRISC.0 = 0; // output
PORTC.0 = 1; // on
void main() {
 while (1) {
  PORTC ^= (1<<0); // toggle
  ms = 500;
  while ( ms -- )
   for ( mcnt = 0; 330 > mcnt; mcnt ++ );
 }       // 330 が正しく 1mS かどうかは怪しい
}

---------------- <C18> -----------------------------
#include <p18cxxx.h> // PIC18F2550
#pragma config PLLDIV = 5
/*
    その他 20MHz -> 24MHz
*/
#include <delays.h>
#define LED0 PORTCbits.RC0 // LED 定義
#pragma code
void main(){
 TRISCbits.TRISC0=0; // output
 LED0 = 1; // on
 while (1){
  if ( LED0 ) LED0=0; else LED0=1;
  Delay10KTCYx(150); /* Delay 250mS */
  Delay10KTCYx(150);
 }
}

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

PIC(13) GCBC

2008-07-03 :  PIC・マイコン
                                                日記@BlogRanking
 PIC16F をステて、PIC18F 一本でと思いながらも、まだ未練がある。
そんなときに、フリーのGreat Cow BASICに手を出してしまった。
 open-source で、PIC16F、PIC18F 両用である。
標準ライブラリはまあまあで、Forum にも若干ある。

だが、結論から言うと、欠点が多いBASIC 言語である。
1.バグが少なくない。
 <紙>が見つけた、重大なものの2件を後で示す。
2.変数は、殆どバイト型のみ。(ワード型も使えるが)
 宣言文で「As Byte」は省略可。
3.原始BASICのように、変数宣言しなくても使える。
 逆に言えば、デバッグ効率が落ちる。
4.割込処理が弱い。つまり、USBデバイスは作れない。

良いところは、
1.オブジェクトサイズが十分に小さい。
2.tiny bootloader に対応したオブジェクトを生成できる。
 (「#option bootloader」が追加されている。)
3.参照されるサブルーチンを後で記述できる。(前方参照可能)
 mikroBASIC や Swordfish BASIC は後方参照のみ可能。
 C言語では、プロトタイプが必要。
4.アセンブラを使うよりは、格段に生産性を高められる。


それで、chip をまた取り替えた。今度は、PIC16F873Aにグレードダウン。
と言っても、18F2550 を外して 16F873A を挿しただけですが。

で、これまでのうち9本を移植してみた。
バグに悩まされて、Swordfish の時とは逆に、1~2日に1本のペースだった。
バグを承知ならば、PIC16F 用には十分使えるかも。
(PIC18F は試していない。Swordfish BASIC がある。)


発見した重大なバグ2件は、「Forum」→「Compiler Problems」と辿って、
「BANKSEL is incorrect」
「IntOff is incorrect」
を見て下さい。(下手な英語ですが)

BANKSEL の件は、SDCCとは逆に最適化しようとしているようだが、
複雑(?)なif 文などの場合に生成が漏れてしまうようである。
if 文はなるべく単純化することで回避した。

IntOff/IntOn については、ついにコンパイラそのものを直してしまった。
FreeBASIC で書かれているので、FreeBASIC コンパイラをDLし、
Great Cow BASIC コンパイラソースを解読した。
これで、割込処理は安心して使えそうである。


最後に、オブジェクトが小さい一例を載せる。
<紙>の結果(概数)
------------------------------- ROM used -- 主な原因
16F877A + mikroBASIC(標準 LCD lib)1,700 Word  "LCD lib"
16F877A + mikroBASIC(自作 LCD lib)1,200 Word
16F877A + SDCC    (自作 LCD lib)1,800 Word  "BANKSEL"
18F2550 + Swordfish  (標準 LCD lib)(2,220Byte)
16F873A + Great Cow (標準 LCD lib)1,140 Word

これは、「Forum」→「Open Discussion」に載せている。

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

PIC(12) SFBC

2008-07-03 :  PIC・マイコン
                                                   日記@BlogRanking
Swordfish BASIC compiler を見つけた。
PIC18F 専用(PIC16F 版の予定はないとのこと)であるが、こんな記述がある。

 The Special Edition (SE) version of Swordfish is a free, fully functional
and non expiring version of the compiler.
 It includes everything you get with the commercial version, including the full list of supported microcontrollers and library source code.
 The compiler is only constrained in terms of the amount of RAM available during compilation.

つまり、データサイズの制限以外は完全フリーで使える。
さらに、オブジェクトサイズが比較対象に比べて格段に小さいと宣伝している。
これは、試してみたい。PIC16F はステてもいいかも。

で、ブレッドボード上、16F877A をはずして、18F2550 に取り替えた。

tiny bootloader は、以前のUSBデバイスのテストの時に書き込んである。

標準のLibが多いし、Forum にも幾つか有る。
それで、既存プログラムを毎日、1~2本ずつ移植してみた。
ADC、USART(<-->PC)、PWM、I2C(master)-RTC、CCP(赤外線リモコン)、割込みなど、計13本。

確かに、オブジェクトサイズは小さいと感じた。


一方で、mikroBASIC でのI2Cスレーブのサンプルソースを見つけたので、
PIC18F2550(master) <---> PIC16F88(slave) の通信実験も行った。
I2Cスレーブは、割込方式とポーリング方式の2種類を。

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

PIC(11) tinybld

2008-07-02 :  PIC・マイコン
                                                日記@BlogRanking
TinyBootloaderを、mikroBASICを使った PIC16F 用プログラムに
適用する場合について、整理しておきます。
 今日現在は、「tinybld197 May,2008」になっているが、
<紙>が使っているのは、「tinybld195 Sep.2007」です。


mikroBASIC が生成するHEXファイルの1行目は、例えば次のようになる。
:10-0000-00-2728-FF3F-FF3F-FF3F-0D30-0313-8312-FC00-03
( - は<紙>が判り易いように追加したもの)
一般形では、次のようになるはずです。
:10-0000-00-2???-FF3F-FF3F-FF3F-????-????-????-????-??

これにパッチをかけて、つぎのようにする。
:10-0000-00-8A01-2728-FF3F-FF3F-0D30-0313-8312-FC00-B6

つまり、0番地目の、2728(例です)の前に 8A01(=CLRF PCLATH)を挿入し、
1番地目の FF3F を消し、チェックサムの 03(例です)に B3 を加える。

これで、0番地から(3番地までが)
  goto main
だけなのが、
  CLRF PCLATH
  goto main
となる。

なお、HEXファイルの仕様については、ここか、ここが参考になります。

また、SDCC(Small Device C Compiler)を使うなら、
TinyBootloader の条件を満たすので、上記のことは不要です。

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

PIC(10) SDCC

2008-07-01 :  PIC・マイコン
                                                日記@BlogRanking
PIC16F877A & mikroBASIC で遊んでいたら、2kW の制限が気になりだした。

RTCを読んでLCDで表示し、時刻変更は赤外線リモコンでコントロールする
ようなものを作ると、1.7kW を超えてしまった。

で、どうするか?(14ビット/16ビット共通で探してみた。)

1.US$ 149 で購入する。
  ・・・ムリ。
2.フリーのBASICを探す。
  boostBASIC は?beta版なので機能無制限だが、期限付き 2008.5.1 迄。
  (現状は、期限なしで、2kW の制限が付いた。)
  気に入らないのは、ポート名が大文字ダメ小文字であること。(PORTC --> portc)
  ・・・却下。
3.PIC18F 専用のBASICなら、Swordfish Compiler がある。
  ・・・どうしよう?
4.C言語に移るか。
  SDCC(Small Device C Compiler)はどうか。・・・ライブラリが無い。

言語選定のためには、PIC Micro Controller Languages (古いような気がするが)がうってつけかも。


何れにしろ、mikroBASIC のライブラリから脱却し、自作することにした。
PIC16F877A 向け自分専用で、mikroBASIC 標準のものをパクって7種類作った。
LCD、USART、ADC、I2C(master)、PWM、Flash、EEPROM

この自作lib により、8本を書き換えてみた。上記は、1.2kW となった。
今しばらく、mikroBASIC が使える。(さらに、PIC18F2550 専用版も作った。)


そこで、これらをC(SDCC)言語版に書き換え、SDCCに挑戦してみた。

mikroBASIC &自作 lib 版を6本、PIC16F877A でSDCCに移植してみた。
結果、BANKSEL のオンパレードとなり、サイズが激増してしまった。

SDCC のobjサイズ = mikroBASIC の1.5倍 + 200W + ムダな include 分
(include すると、使っていなくてもオブジェクトが生成される。(当然ですか))

ということは、・・・振り出しに戻ったということだァ。4月が過ぎ去った。

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

PIC(9) mikroBASIC

2008-06-30 :  PIC・マイコン
                                                   日記@BlogRanking
今回は、mikroBASIC を使ってのいろいろな入出力の方法を纏めておく。

LED点滅:
  mikroBASIC 標準の delay_ms(500) と、
  PORTC.0 = 1 - PORTC.0 で、OK。

LCD表示:
  mikroBASIC 標準の LCD(4-bit interface) Library でOK。

RS232C通信:(対向はPCでもPICでも)
  mikroBASIC 標準の USART Library でOK。

I2C通信:(こちらがマスターの場合)
  mikroBASIC 標準の I2C Library でOK。
   RTCのアドレスは、$A2(読取)、$A3(書込)
   EEPROMのアドレスは、$A4(読取)、$A5(書込)

CdSでADC:
  mikroBASIC 標準の ADC Library を使う。
  22kohm との電圧分割では、0.62V~3.3V となった。
  3.1k~42.7kohm の変化(0.6k~1000kohm にはならなかった)。

赤外線リモコン受信:
  CCPのcapture モードでパルス長を計る。
  PPM(Pulse Position Modulation)の仕様は、これがよい。
  それと、これも参考になる。
  わたしは、PCのTVボード付属のリモコンで遊んでいる。
  家のエアコン用リモコンは仕様が違うようだ。

PS/2・KB入力:
  mikroBASIC 標準の PS/2 Library でOK。
  但し、割込は使えなくなる。
  こんなのもある。(PICが PS/2・KBになる。)
  やってみたものの1つ。

PS/2・マウス入力:
  通信プロトコルは、The PS/2 Mouse/Keyboard Protocolが親切。私にも理解できた。
  ここに、「The PS/2 Mouse Interface」なども載っている。
  とりあえず、割込なし wait 方式で作った。
  ここにある「TB055 Source Code - PS/2 to USB Mouse Translator」
  は、割込方式によるマウス入力である。
  これもやってみたいものである。

これらで3月が過ぎ去ったのである。

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

PIC(8) 回路図

2008-06-30 :  PIC・マイコン
                                                日記@BlogRanking
 各種 PIC デバイスを、mikroBASIC 及び C18 コンパイラで実験できた。
今度は、LCDに表示し、PCなしでも動くようにしたい。

 3ヶ月ぶりにアキバに行き、LCDと、40ピンの 16F877A を買った。
ついでに、赤外線受光素子、CdSセル、RTC、EEPROM も買った。

 ブレッドボードを整理し、16F877A に変えたので、先ずは、
(MPASMでアセンブルし)tiny bootloader ファームを書き込んだ。

で、テストは例によってLEDの off/on である。言語は、mikroBASIC。
次は、RS232CによるPCからの受信/返送信。
これらは、16F873A 用のソースを流用してOK。

 いよいよ、LCDを繋ぐ。ハンダ付けをしてと。
データは4ビットモードで十分。RWは使わず GND 固定。
mikroBASIC の LCD lib の説明に RW ピンのことが補足で書いてあった。
コントラストは・・・DIODE で GND に落としての輝度固定とした。
これは、Web検索で見つけた回路である。
いよいよ、本番。Mikroelektronika 社のサンプルでOKOK。


 こんな文章ばかりの blog では殺風景なので、回路図を入れることにした。
やはり、水魚堂さんのエディタでしょう。「水魚堂さん」ありがとう御座います。
ついでに、BLUEさんの lib もDLしPIC分を改造させていただきました。

やっと、回路が書けるようになりましたので、以下に載せます。
PIC16F877A で一通り実験するための、わたし的評価ボードです。



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

PIC(7) USB・HID/CDC

2008-06-29 :  PIC・マイコン
                                             日記@BlogRanking
 今度は、「HIDクラス」に挑戦した。
結局はマイクロチップ社のサンプルソースをDLするのだが。

その1:スタンダード(2ボタン)マウスエミュレータ
(マウスカーソルが円を描くように動くもの)

その2:インテリマウス化
(3ボタン目の追加)

その3:スクロールのエミュレーション

その4:KBのエミュレーション

PIC18F2550 を、これらUSBデバイス化するファームウェアを作るには、
「pic18Fusb.online.fr」が非常に参考になったのだが、
この Wiki は削除されたよう(フランス語はチンプンカンプンです。)

これらソースをC18でコンパイルし、tiny bootloader で書き込んで、
PICを、PCに繋ぐと、自動認識し、エミュレーションしてくれた。


 さらに、HID汎用デバイス用のファームウェアは、
「Jan Axelson's Lakeview Research」のUSBのページの中のHIDsのページ
からDLして、汎用デバイスクラスと同じ機能のものを作った。

PC側は、デバイスドライバは不要だが、
デバイスにアクセスするための関数定義は、インクルードファイルを用いた。


 さらにさらに、CDCクラスのファームウェアも、
マイクロチップ社のサンプルソースをDLする。
これを、汎用デバイスクラスのものと見比べながら修正した。

inf ファイルは添付されているので、それを使い、
PCソフトは、以前に作ってあったCOMxのIO用のものを若干修正して用いた。


 これで、PIC18F2550 をUSBデバイス化し、PCから通信することは、
3種類のクラス(汎用、CDC、HID汎用)とも一応完了した。
2月はこれで終わった。

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

PIC(6) USB・Gen

2008-06-29 :  PIC・マイコン
                                                日記@BlogRanking
さて、目標であったUSBデバイスへ挑戦する。

先ずは、mikroBASIC 組み込みの USB HID Library を使ったサンプルプログラムを
コンパイルしてみたが、demo版の制限でダメでした。

ネットであちこち探しまくっていたが、なんのことは無い、本家でよかったのだ。

マイクロチップ テクノロジー ジャパン社のHPにある、「PIC関係のリンク」に載っている
「USBコントローラ内蔵のPIC18F2550の使用例」が、ピッタリであった。

 早速動かしたいところだが、その前に、C18 コンパイラが必要だ。
C言語は知らないけど、何とかなるだろうと、インストールしMPLAB に登録した。

上記HPからDLしたものからクロック数の変更だけで、コンパイル/リンクし、
tiny bootloader で書き込み、添付のテストプログラムを動かした。

 Microchip社のUSBブートローダでなくても、tiny bootloader でも共存可能だ。
(当たり前の話だけど。リンカースクリプトが読めれば。
 マイクロチップ社のUSBブートローダは0番地から常駐し、
 ターゲットプログラムは 0x800 からになる。
 一方、tiny bootloader はROMの最上位番地に常駐する。)

で、このUSBデバイスは、デバイスクラスの分類では「汎用」なので、
デバイスドライバ(inf ファイルと、sys ファイル)が必要であり、
PCでプログラミングするなら、DLL が必要になる。

 その他のデバイスクラスとしては、CDC、HID、Mass Storage がある。
HIDクラスはさらに、「マウス」「KB」「汎用」に分かれる。

デバイスドライバなどの要否は、
       inf      sys     DLL
 汎用    要     要     要 : 上記の通り。
 CDC   要     不要 : システム標準でOK。(serial on usb)
 HID
  マウス  不要 : システムが入力デバイスで使用。(直接入力不可?)
  KB    不要 : システムが入力デバイスで使用。(直接入力不可?)
  汎用   不要   不要   不要*
   (訂正:* kernel32、hid.dll を使うので、宣言(ヘッダーファイル)は必要。)

 それで、このサンプルUSBデバイスを ActiveBASIC プログラムでアクセスしてみたい。
 同梱されていた、柏野政弘さん作のドライバでは、どうしても上手くいかない。
1回目はOKで、2回目はライト(PC->PIC)出来るが読み込みでストールする。

 悪戦苦闘の末、MICROCHIP社のmchpusb.sysなるデバイスドライバにすることにした。やっと、PCソフトも完成し、
PCからPIC(USB・汎用デバイス)への出力・入力が完成した。

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

PIC(5) 18F2550

2008-06-28 :  PIC・マイコン
                                             日記@BlogRanking
 これまでで、PIC16F は5種類入門できた(カナ)。
16F84A、12F683、16F648A、16F873A、16F88。

 再度、tiny bootloader の補足をしておく。

1.16F873A:tinybld16F873A.asm があったので、このままASMした。
 実はバグがあって、ターゲットプログラムが書き込まれないので悩んだ。
  bcf EECON1,EEPGD
 となっている行は間違いで、正しくは
  bsf EECON1,EEPGD
 である。 tinybld16F873.asm では正しい。

2.16F88:tinybld16F88_i8MHz __19200.HEX があるので、このまま使っている。


で、今度は 18F2550 に移ることにした。

 先ずは、tiny bootloader ファームウェアの準備であるが、
幸い、tinybld18F2550usb _20MHz_115200.HEX があったので、
このまま使うことにして、AKI-PICライタで書き込んだ。

 mikroBASIC のプログラムは、16F873A で作った、
PS/2・KB入力--232CでのPC出力 を移植した。
といっても修正することはほとんど無い。
chip 指定と config 指定。これは、IDEで。
ソースでは、全ピンデジタルとするため、ADCON1 指定と、
232Cでのボーレートを変えたので、Usart_Init のパラメータ変更。
以上でコンパイル&ゴー。 ---> 見事に文字化け。

相当悩んだ末、config ワードの問題と判明。
tiny bootloader のサンプルでは、
 PLLDIV_5_1L
 CPUDIV_OSC3_PLL4_1L
 USBDIV_2_1L
 FOSC_HSPLL_HS_1H
となっていた。これは、20MHzセラロックを用いたとき、
動作クロックは24MHzということである。
 --> mikroBASIC ソースを修正して。完動。

ここまでくれば、手持ち6chipとも使えるナ。

この後、16F873A で、
 マブチモータを、モータードライバ TA7291P 経由で正転・逆転制御。
制御入力はPS/2・KB -> OK。

PS/2・マウス入力--232CでPCへ出力 -> OK。

そうこうしているうちに、1月が過ぎ去った。

お手数をおかけします。2クリック(投票を)お願いします ⇒ 日記@BlogRanking
おきてがみ/blogram
blogram投票ボタン



おきてがみ

最新記事
カレンダー
01 | 2018/02 | 03
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 - - -
月別アーカイブ
カテゴリ
最新コメント
検索フォーム
リンク
プロフィール

<紙>

Author:<紙>
ようこそ。
「パソコンヲタクの雑記帳」
もろもろなことを綴っています。
パソコン ヲタクってねくら?
画像は kami でなく kani です。

カウンター(fc2、i2i) /Google Analytics


i2i(from 2010-08-24)
Total =
Today  =  
Yesterday=
アンチエイジング

Google Analytics
ブックマーク