18Fシリーズに挑戦!
とりあえず16F88でのコアシステム完成を達成して、現在人柱実験進行中。
マンションの駐輪場に置いてカバーを掛けた「FZ1 FAZER」への装着。
って事で、完成品を持っていかれてしまったので、ブレイクしたブレッドボードに新たなチップを装填!
16F88のプログラム領域4kを使い切ってしまった事から、大容量のCPU探し。
秋月電子のHPを探していて、
おお〜っ!「8722」って128kもある!88の32倍じゃん!・・・・でも・・・・TQFPじゃダメじゃん!
おおっ!「4585」って48kあるな!これでも12倍!・・・・でも40ピンって・・・・デカ過ぎ!
そんな中で「PIC18F2550」が目に付いた。
プログラム容量が32kと8倍ではあるが、
・28ピンと小型(それでも88の1.5倍だけど!)
・I/O24本
・USBモジュール搭載
・A/D:10ch
・EUSART搭載
・TIMER3個
・内部クロック8MHz
と良い感じ。
特にUSB接続が可能なら、
・PCからのバスパワーによる電源確保でブレッドボード(開発)上でACアダプタ不要!
・USB出力によるデバッグが可能でRS232−Cのチップ&プログラムが不要!
・将来USBを介したCPUの更新が可能?(かも?)
って事でこれに決定。
と続けて秋月のHPを徘徊していると、
「PIC18F2550使用USBマイコンボード」なる秋月電子が製作したモジュールを発見!
■基板にUSBminiBコネクタ,マイコン,20MHz発振子を搭載してUSB機器を容易に製作できる様になっています
■基板サイズ40mm×18mmで28ピンICソケットに装着できる小型サイズです
■20MHz発振子を搭載し内部PLLで48MHzで動作。PICマイコンととしても高速高性能です
とまぁ、USBソケットも外部クロック20MHzもMCLRプルアップもVDD/VSSプルダウンも搭載したDIPピンタイプのモジュールなのだ!
スゲッ!ボード上で結構な配線から開放されそう・・・・♪
い、いかん・・・・サボリ癖がこんな処でも・・・・でもとっても魅力的♪
で、これに決定・・・・・。
T.開発言語の変更
「HI−TECH C」は18でも可能だと判ってはいるが、どうもマイクロチップ社が吸収してから待遇が悪い。
だからここは元からある「MPLAB C18」というC言語に切り替える事にした。
インストール後にとにかく簡単なソースをコピペして様子を見ようとコンパイルするもこんな結果に。(→)
ライブラリをリンクしてやらないとダメなようだ。
「Build Option」の「Directories」から「Library Search Path」で「MCC18のLib」の場所を指定してやる。
するとアッサリと成功!
このコンパイラはメモリユーズゲージは出してくれないようだ。
残念。
ちなみにライターもテスト。
しっかり反応している。
しかし最初に28ピンに差したらエラーになった。
どうも40ピンに差さないとダメなようである。
U.用意するもの
石の解析も3つ目になると事前に用意しておくべきデータシートが見えてくる。
先ずはこれ(→)
しかし秋月のマイコンボードだとこうなる。(→)
9ピンと10ピンは20MHzのクリスタルが実装済みだが、5.7V〜8Vの外部電圧入力を行いたい時は実装済みのレギュレータ(XC6206P502)を介して9ピンに接続する事が出来るようだ。
何故オシレータのピンを使えるのか?は知らん!
また外部レギュータを介して5V入力を行いたい時は、VDD(20ピン)に接続すればパスコン済みとなる。
今回はバイク(12V)だから実車実装時はVDDを介する事になる。
アナログ入力は0〜4と8〜11の10チャンネルだが、ポートAの5チャンネルもあれば十分だろうからポートBは全てデジタル出力として扱う事にする。
ポートCの6番7番は念の為にRS232−C用に確保しておこう。
ってな訳でデジ・アナ合計で19チャンネルもの使用が可能だ!
それから、
・上記を含んだデータ・シート
・変数定義を確認する為のヘッダーファイル
・秋月電子のA063_USBマイコンボード
・MPLABのHELPから抜粋したコンフィグレーション・ビット
そしてSFRマップ。
最後にレジスタ・サマリだ。
(なんちゅ〜デカさや!)
V.プログラムの移植
ディレーについて
C18言語では直接時間を指定するディレイの関数が無いらしい。
先ず、delays.hをインクルードする事で”Delay1TCY()”という1命令を基調とする時間割だし関数が使えるようになる。
周波数に対して「4サイクルで1命令」の基本から、
1命令に要する時間=1/(周波数/4)
となり、20MHzの場合は、
1/(20000000/4)=0.2マイクロ秒
となり、
1msのウェイトに必要な係数=5,000
10ms=50,000
100ms=500,000
1s=5,000,000
となる。
但し、引数は1〜255なので、こんな数値は扱えない。だから、
Delay10TCYx():10命令分で返す
Delay100TCYx():100命令分で返す
Delay1KTCYx():1000命令分で返す
Delay10KTCYx():10000命令分で返す
といった関数を用意している。
これより、
1ms=Delay1KTCYx(5)
10ms=Delay10KTCYx(5)
100ms=Delay10KTCYx(50)
0.5s=Delay10KTCYx(250)
1s=Delay10KTCYx(250)を2回
となる訳だ。
しかしこのディレイ絡みでちょっと混乱したのがUSB。
デモプロで上記を実行してもメチャメチャ速く動いてしまった。何で?
デモプロではコンフィグレーションに、
PLLDIV = 5
CPUDIV = OSC1_PLL2
FOSC = HSPLL_HS
とあったのだが、「USBモジュールを搭載しているが故に」の機能で、USBを基準としたPLLの様なのだ。
USBのフルスピードである48MHzに対して、4MHzの倍数のクロックしか割り当てられない。
つまり外部オシレータは12、16、20、24・・・・以外は搭載出来ない。(12MHz以下は内部8MHzで対応)
搭載クリスタルは20MHzだから/4で
PLLDIV = 5
は判る。
で、気付かなかったのが”CPUDIV = OSC1_PLL2”で「96MHzの除算って何?」って事。
FOSC = HSPLL_HS
とすると「USBのPLLをオシレータとして96MHzをCPUDIV = OSC1_PLL2で割った周波数にするよ」と言っていたのだ。
だから
PLLDIV = 5
CPUDIV = OSC1_PLL2
FOSC = HS
としてやる事で、
・外部クロックは20MHz
・内部クロックは/1で等価
・オシレータはPLLを使わない(USB−PLLでは無い!)
という意味になるようだ。
これでやっとマトモなディレイの完成。
でもたった数行のソースなのにまだ疑問が。
LATB ^= 0xff;
って何だ?・・・・って調べて驚いた。
PIC18シリーズはラッチレジスタなるものが存在して、ポート指定の代わりにこのレジスタを操作する事で代替出来るというのだ!
つまり
・物理ピンにアクセスする
・その値を取得してレジスタに渡す
・操作後に物理ピンンにアクセスする。
という工程を
・物理ピンの値をLATレジスタに記録する。
・操作後に物理ピンンにアクセスする。
として、ピンにアクセスする回数を減らしている。
これにより速い動作もミスする事なく稼働するという事なのだ。
またこのLATはビット毎の操作が可能で、
LATBbits.LATB1
とすると「LATBレジスタの1番を」という意味になる。
だから使い分けとしては、
・出力の操作は(特にビット操作はレジスタ記録を見れば良いから)LAT命令を、
・入力は(レジスタに書いてないから)PORT命令を、
となる。
つまり上記プログラムは「LATBレジスタをXORせよ」って事だったんだ!
だとしたらポートB全部なんて勿体無いから、
LATBbits.LATB7 ^= 1;
にすればいいんじゃん!
これでやっと「LEDチカチカ」プログラムの解析が終了!(先・・長げ〜な〜・・・・)
移植開始
もう面倒だからF88+HITECH−Cのソースをそのままコピペ!
迷わずコンパイル!エラーが止まらない涙も止まらない・・・・。
先ずは・・・・と、ANSEL=・・・・・そんなもんありませんエラー・・・・ハッハッ!
アナログ入力の設定
88と違うのはアナログが10チャンネルあるから8ビットでは表せない。
だからそもそもANSELといったレジスタが無い訳だ。
ADCON1のレジスタ
7bit | 6bit | 5bit | 4bit | 3bit | 2bit | 1bit | 0bit |
未使用 | 未使用 | VCFG1 | VCFG0 | PCFG3 | PCFG2 | PCFG1 | PCFG0 |
このPCFG3-0を使って、(A:アナログ/D:デジタル、AN7-5は未使用)
PCFG3-0 | AN12 | AN11 | AN10 | AN9 | AN8 | AN7 | AN6 | AN5 | AN4 | AN3 | AN2 | AN1 | AN0 |
0000 | A | A | A | A | A | A | A | A | A | A | A | A | A |
0001 | A | A | A | A | A | A | A | A | A | A | A | A | A |
0010 | A | A | A | A | A | A | A | A | A | A | A | A | A |
0011 | D | A | A | A | A | A | A | A | A | A | A | A | A |
0100 | D | D | A | A | A | A | A | A | A | A | A | A | A |
0101 | D | D | D | A | A | A | A | A | A | A | A | A | A |
0110 | D | D | D | D | A | A | A | A | A | A | A | A | A |
0111 | D | D | D | D | D | A | A | A | A | A | A | A | A |
1000 | D | D | D | D | D | D | A | A | A | A | A | A | A |
1001 | D | D | D | D | D | D | D | A | A | A | A | A | A |
1010 | D | D | D | D | D | D | D | D | A | A | A | A | A |
1011 | D | D | D | D | D | D | D | D | D | A | A | A | A |
1100 | D | D | D | D | D | D | D | D | D | D | A | A | A |
1101 | D | D | D | D | D | D | D | D | D | D | D | A | A |
1110 | D | D | D | D | D | D | D | D | D | D | D | D | A |
1111 | D | D | D | D | D | D | D | D | D | D | D | D | D |
の表に当てはめる。
取り敢えずAN1-0を使うので、
ADCON1=0b1101=0x0d
となる。
また基準電圧も88と逆になっていて、
VCFG1-0 | −電圧 | +電圧 |
00 | Vss | Vdd |
01 | Vss | Vref+ |
10 | Vref- | Vdd |
11 | Vref- | Vref+ |
と、今回も00ではあるが注意が必要。
ADCON0のチャンネルも同様に10チャンネル分あるのでレジスタも、
7bit | 6bit | 5bit | 4bit | 3bit | 2bit | 1bit | 0bit |
未使用 | 未使用 | CHS3 | CHS2 | CHS1 | CHS0 | GO/DONE | ADON |
と、88とは配置が違うので注意が必要!
チャンネルの設定は、
CHS3-0 | チャンネル |
0000 | AN0 |
0001 | AN1 |
0010 | AN2 |
0011 | AN3 |
0100 | AN4 |
1000 | AN8 |
1001 | AN9 |
1010 | AN10 |
1011 | AN11 |
1100 | AN12 |
となる。
ANSELの代わりと言っては何だが、新たにADCON2が存在する。
7bit | 6bit | 5bit | 4bit | 3bit | 2bit | 1bit | 0bit |
ADFM | 未使用 | ACQT2 | ACQT1 | ACQT0 | ADCS2 | ADCS1 | ADCS0 |
ADCSは88と同じ設定内容。
PICの周波数 | TOSC | ADCS2 | ADCS1 | ADCS0 |
00.00MHz〜01.25MHz | 2 | 0 | 0 | 0 |
01.25MHz〜02.50MHz | 4 | 1 | 0 | 0 |
02.50MHz〜05.00MHz | 8 | 0 | 0 | 1 |
05.00MHz〜10.00MHz | 16 | 1 | 0 | 1 |
10.00MHz〜20.00MHz | 32 | 0 | 1 | 0 |
20.00MHz〜40.00MHz | 64 | 1 | 1 | 0 |
ADFMも88と同じ。(→)
新たにデータ取得の為のコンデンサ蓄電時間(アクイジション時間)の設定が必要なようだ。
理屈は判らんが、充電時間は約13us以上を要するとの事なので、
ACQT2-0 | TAD |
000 | 0 |
001 | 2 |
010 | 4 |
011 | 6 |
100 | 8 |
101 | 12 |
110 | 16 |
111 | 20 |
TAD=クロック周期*TOSC
より、
0.05us*32=1.6us
となり、
TAD=13us/1.6us=8.215us≒8
となるらしい。
しかし「んなもん、十分に詰めりゃいいじゃんか!」の考えから、
TAD=12
として、
ACQT2-0=101
とする。
ピンの配置
アナログの設定が完了して次のエラーは「RB1」といった変数の話。
でもこれってピン番号だからそれを決定しながらじゃないと進まない。
だからここでピンの配置を行なう。
これからは逆にこれを見ながらプログラムを変更していく訳だ。
何も考えずにRC4-5をリレースイッチにしたらラッチエラーになった。
ヘッダーファイルを調べるとなんと!RC3-5はラッチが無い!
よく判らんがそういうものだと思う事にする。
(ってかRC3って存在してない!って事にここで気付く!)
PORTAは出来るだけアナログ用に取って置いて。
それでもまだ8個も余ってるもんねぇ〜!
さて次。
TRMT=・・・・・そんな定義は無い!エラー・・・・何で?
ヘッダーファイルにもデータシートにも定義があるし?
いろいろ参照して解ってきたのが「HI−TECH CとC18の言語の違い」って事。
例えばHI−TECH Cのヘッダー定義は、
-----------------------------------------------
volatile bit TX9D @ ((unsigned)&TXSTA*8)+0;
volatile bit TRMT @ ((unsigned)&TXSTA*8)+1;
bit BRGH @ ((unsigned)&TXSTA*8)+2;
bit SYNC @ ((unsigned)&TXSTA*8)+4;
bit TXEN @ ((unsigned)&TXSTA*8)+5;
bit TX9 @ ((unsigned)&TXSTA*8)+6;
bit CSRC @ ((unsigned)&TXSTA*8)+7;
-----------------------------------------------
となっていてTRMTがダイレクトに指定出来る。
しかしC18の場合は、
-----------------------------------------------
extern volatile near struct {
unsigned TX9D:1;
unsigned TRMT:1;
unsigned BRGH:1;
unsigned SENDB:1;
unsigned SYNC:1;
unsigned TXEN:1;
unsigned TX9:1;
unsigned CSRC:1;
} TXSTAbits;
-----------------------------------------------
となっていてTXSTAbits.TRMTとしないとダメだったんだ。
こりゃ、よくよくヘッダーファイルと首っ引きでコンバートしないとダメだな・・・・。
でも考えてみりゃ、こっちの方が変数の指定間違いが無くて好きだな。
次は、CHS0=、GODONE= ・・・・もう要領が判ればこっちのものだぞ!
ADCON0bits.CHS0=
ADCON0bits.GO_DONE= ・・・・・と。
EEADR= あれ?エラーじゃない?・・・・どうもビット指定の無いレジスタファイルはダイレクトに指定する様だ。
EEPGD= EECON1bits.EEPGD=
RD= EECON1bits.RD=
WREN= EECON1bits.WREN=
相変わらず、
EECON2=0x55;
EECON2=0xAA;
はおまじないとして必要な様である。
SWDTEN= WDTCONbits.SWDTEN=
などなど・・・・
こうしてコンバートを進めった結果。(→)
3083/16384=1/5.3
あれ?8倍じゃなかったっけ?
言語によってインクルードの容量もコンパイル定義も違うのかな?
でもまぁ、あと5倍のプログラムが組めるんだからヨシとしよう!
入力電源及びCPUの
・VDD/VSS
・MCLR
・OSC1/OSC2
を省いたブレッドパターン。
あれ?
センサーの電源がいるじゃん!
おっ!
余ってるピンから出力すれば無駄な回路が無くなるぞ!
超シンプル!
W.USB通信を行なう
結論から言うと「偶然成功した手品」状態で、全く理解していないまま実現している。
ハッキリ言って「何も考えずメチャクチャやったら出来た」状態の為、再現しようにも思いつきの連続だったものだから、最初からもう一度振り返ってみた。
しかし下記の方法で「本当にトラブルが無いのか?」については全く判らないので、参考にされる場合はあくまでも自己責任でお願いしますわい。
@USBフレームワークのダウンロード&インストール
MicroChip社のUSB Framework for PIC18, PIC24 & PIC32から「Microchip Application Libraries v2010-02-09 」をダウンロード&インストールする。
まぁ、これは問題ない。
USBのフレームワークというからOSに絡むコアシステムかと思いきやサンプル集だった。
しかしこのサンプル集、膨大過ぎてどれを見ればいいのか?全く判らん。
とにかく手当たり次第に展開してみる。
約一週間かけて400近いサンプルの中から関係ありそうな数十個をMPLABに掛けていくうちに
「USB Device - CDC - Serial Emulator」
の中の
「USB Device - CDC - Serial Emulator - C18 - PICDEM FSUSB.mcp」
を利用すればいいと判明した事と、そのプロジェクトの修正方法が導き出せた。
Aソースの変更
弄っているうちにオリジナルの「Microchip Solutions」の中が汚くなってしまうので、使用したい項目だけを別にコピーして使う。
a)「Microchip Solutions」の中から「Microchip」フォルダと「USB Device - CDC - Serial Emulator」フォルダを別の作業領域にコピーする。
b)「USB Device - CDC - Serial Emulator」→「USB Device - CDC - Serial Emulator - C18 - PICDEM FSUSB.mcp」をMPLABに展開する。
c)メニューのConfigure → Select Device で2550を選択。
d)main.c
コンフィグレーションの記述は4550用なので2550用に書き換える。
#if defined(PICDEM_FS_USB)〜#elif defined(PIC18F87J50_PIM)の間の記述を削除し、自分の記述に変える。
/** CONFIGURATION **************************************************/
#if defined(PICDEM_FS_USB) // Configuration bits for PICDEM FS USB Demo Board (based on PIC18F4550)
#pragma config PLLDIV = 5 // (20 MHz crystal on PICDEM FS USB board)
#pragma config CPUDIV = OSC1_PLL2
#pragma config USBDIV = 2 // Clock source from 96MHz PLL/2
#pragma config FOSC = HSPLL_HS
#pragma config FCMEN = OFF
・
・
・
#pragma config WRTC = OFF
// #pragma config WRTD = OFF
#pragma config EBTR0 = OFF
#pragma config EBTR1 = OFF
// #pragma config EBTR2 = OFF
// #pragma config EBTR3 = OFF
#pragma config EBTRB = OFF
#elif defined(PIC18F87J50_PIM) // Configuration bits for PIC18F87J50 FS USB Plug-In Module board
を、
/** CONFIGURATION **************************************************/
#if defined(PICDEM_FS_USB) // Configuration bits for PICDEM FS USB Demo Board (based on PIC18F4550)
#pragma config PLLDIV=5
#pragma config CPUDIV=OSC1_PLL2
#pragma config USBDIV=2
#pragma config FOSC=HS
//#pragma config FCMEM=
//#pragma config IESO=
#pragma config PWRT=ON
#pragma config BOR=OFF
#pragma config BORV=2
#pragma config VREGEN=ON
#pragma config WDT=ON
//#pragma config WDTPS=32768
#pragma config MCLRE=ON
#pragma config LPT1OSC=OFF
#pragma config PBADEN=OFF
//#pragma config CCP2MX=
#pragma config STVREN=OFF
#pragma config LVP=OFF
#pragma config XINST=OFF
#pragma config DEBUG=OFF
#pragma config CP0=OFF,CP1=OFF,CP2=OFF,CP3=OFF,CPB=OFF,CPD=OFF
#pragma config WRT0=OFF,WRT1=OFF,WRT2=OFF,WRT3=OFF,WRTB=OFF,WRTC=OFF,WRTD=OFF
#pragma config EBTR0=OFF,EBTR1=OFF,EBTR2=OFF,EBTR3=OFF,EBTRB=OFF
#elif defined(PIC18F87J50_PIM) // Configuration bits for PIC18F87J50 FS USB Plug-In Module board
と書き換える。
e)main.c
#include "./USB/usb.h" → #include "usb.h"
#include "./USB/usb_function_cdc.h" → #include "usb_function_cdc.h"
#include "./uart2.h" → #include "uart2.h"
f)usb_device.c
#include "./USB/USB.h" → #include "USB.h"
#include "./USB/usb_function_msd.h" → #include "usb_function_msd.h"
g)usb_descriptors.c
#include "./USB/usb.h" → #include "usb.h"
#include "./USB/usb_function_cdc.h" → #include "usb_function_cdc.h"
h)Project→BuildOptions→Projectの"include serch Path"と"Liblary serch Path"に
・"mcc18\lib"
・インストールしたフレームワーク内の
microchip\include
microchip\include\usb
を追加。
B各ファイルのソース変更
この時点でビルドするとこのエラーになる。(↓)(→)
HardwareProfile.h:105:Error [1099] "Demo board not defined.
Either define DEMO_BOARD for a custom board or select the correct processor for the demo board."
HardwareProfile.hで「該当するCPUが無い」と言っているのだ。
コピーした「CDC - Serial Emulator」フォルダの中の「HardwareProfile.h」を開いて、
#if defined(__18CXX)
#if defined(__18F4550)
#include "HardwareProfile - PICDEM FSUSB.h"
#elif defined(__18F87J50)
#include "HardwareProfile - PIC18F87J50 PIM.h"
#elif defined(__18F14K50)
#include "HardwareProfile - Low Pin Count USB Development Kit.h"
#elif defined(__18F46J50)
#include "HardwareProfile - PIC18F46J50 PIM.h"
#elif defined(__18F47J53)
#include "HardwareProfile - PIC18F47J53 PIM.h"
#endif
#endif
を、
#if defined(__18CXX)
#if defined(__18F2550)
#include "HardwareProfile - PICDEM FSUSB.h"
#elif defined(__18F87J50)
#include "HardwareProfile - PIC18F87J50 PIM.h"
#elif defined(__18F14K50)
#include "HardwareProfile - Low Pin Count USB Development Kit.h"
#elif defined(__18F46J50)
#include "HardwareProfile - PIC18F46J50 PIM.h"
#elif defined(__18F47J53)
#include "HardwareProfile - PIC18F47J53 PIM.h"
#endif
#endif
と、無理やり変更する!
これでターゲットが青色の"HardwareProfile - PICDEM FSUSB.h"に移る。
再びビルドすると今度は「LATDが無い」エラーが出るので、
同じフォルダ内の「HardwareProfile - PICDEM FSUSB.h」を開いて、
#define mInitAllLEDs() LATD &= 0xF0; TRISD &= 0xF0;
#define mLED_1 LATDbits.LATD0
#define mLED_2 LATDbits.LATD1
#define mLED_3 LATDbits.LATD2
#define mLED_4 LATDbits.LATD3
のLATD部分を変更する。
このソースを見ると、どうも、
A3,A4
B2-B7
C1,C4,C5
は使っている様なので、
B0,B1
C0,C2
当りに割り当ててみる。
またLATDのイニシャライズは要らないのでコメントアウトにする。
//#define mInitAllLEDs() LATD &= 0xF0; TRISD &= 0xF0;
#define mLED_1 LATBbits.LATB0
#define mLED_2 LATBbits.LATB1
#define mLED_3 LATCbits.LATC0
#define mLED_4 LATCbits.LATC2
もっとも、これらはLEDの設定なので、必要なければ全部コメントにしてもいいと思う。
再びここでビルドするとこうなる。(→)
コンパイルは成功したがライブラリのリンクで「CPUが違う!」と出ている。
エラーになったリンカーを調べると、
"D:\MPLAB\MPLAB_C18\MCC18\lib" "rm18f4550 - HID Bootload.lkr"
との記述があった。
このエラーの中で使っているリンカーはこれだけ。
何でHIDなの?の疑問はあるが気にせずrm18f4550 - HID Bootload.lkrを開く。
必要とするライブラリが、
FILES c018i.o
FILES clib.lib
FILES p18f4550.lib
とあったので、
FILES c018i.o
FILES clib.lib
FILES p18f2550.lib
と、無理やり変更する!
んで、またビルド。
「main.cの"mInitAllLEDs"ってなんだ?」エラー。
そっか。
さっき"HardwareProfile - PICDEM FSUSB.h"の中でコメントにしたんだ・・・・って事で、
void UserInit(void)
{
unsigned char i;
InitializeUSART();
・
・
・
mInitAllLEDs();
}//end UserInit
を、
void UserInit(void)
{
unsigned char i;
InitializeUSART();
・
・
・
// mInitAllLEDs();
}//end UserInit
とすると・・・・・
見事成功!!!???
こんな無理クリ戦法で本当にいいんだろうか???
ってな疑問が星の様に一杯チラ付きながらもCPUに焼いてみる。
USBを接続すると、ちょっと間を置いて「不明なデバイス」エラー。
この後何度もトライするものの同じ結果。
無理やりmchpcdc.infを認識させようとしたが「必要な情報がありません」エラー。
う〜ん・・・何が間違ってるんだろう・・・・。
いろいろググッてみた中に「そんな時は回路を見直してみよう」とあった。
え?回路?・・・そんなん関係あんのか?
確かに回路は斜傾センサーのままで何も弄ってない。
だって、レディ状態か?否か?なんて入力の話だよな・・・・んっ?・・・・入力?
斜傾センサーって連続してアナログ信号(電圧値)を出力してるよな?・・・・ま・さ・か・・・・。
って事で、3軸加速度センサーを回路から外してみたら、アッサリとパソコンがドライバを聞いてきた・・・・んとかよ・・・・・疲れた・・・・・・・。
コミュニケーションポート(COM4)
とあるので、ハイパーターミナルで設定する。
(ちなみにVista以降にハイパーターミナルは無いんだって?知らなかったよ!XPだって事が思い切りバレちまったぜぃ!←別に構わないけど!)
プログラム読むのが面倒臭いので、どうせ「クンロクイチハチノン」だろうと設定。
行けっ!・・・・・あれ?何も出ない・・・・・・何で?
何か自分で書かないとダメなのかな?・・・と、main.cの中を眺めると
main{
・
・
// Application-specific tasks.
// Application related code may be added here, or in the ProcessIO() function.
・
・
}
の記述を発見・・・・・そっか、ここに自分でプログラムを書け!ってか。
ってな訳で、
main{
・
・
putrsUSBUSART("CB1300SF\r\n");
・
・
}
と書いてみた結果が、この章の冒頭のハイパーターミナルの画像。
やっと通信が可能になった訳だ。いや〜長かった。
========================================================================================
んで、ここまで書いといて何だがUSB使うの止めた!
だって、ここまでの経緯見たっしょ。何?このインクルードの量!
main.c
usb_device.c
usb_function.c
usb_descriptors.c
uart2.h
Compiler.h
GenericTypeDefs.h
PICDEMFSUSB.h
HardwareProfile.h
HardwareProfile - PICDEM FSUSB.h
usb.h
usb_ch9.h
usb_common.h
usb_device.h
usb_function_cdc.h
usb_hal.h
usb_hal_pic18.h
usb_config.h
全部のヘッダーファイルを追って行ったらあと幾つ出てくるのか・・・・バッカじゃね〜の!?って数じゃん。
ちなみに”CB1300SF”の文字列を送信するだけのプログラムメモリ消費量は3599/16384で全メモリの約22%。
これは盗難防止アラーム2号機の全プログラムの117%に相当する。
こんなもん絶対に自分のプログラムに結合なんかさせてやんねっ!
今回やりたい事は「USBデバイス製品を開発する」って事じゃなくて「データ通信で数値を見たい」訳で、
これだったらシリアル通信の方がよっぽど軽いじゃん!って結論になる訳だ。
やっぱCPUのTXとRX空けといてよかった・・・・。
まぁ、このシリーズが一段落したらきっと作りたいムシが動いて「3軸加速度センサーを応用したUSB空間マウス」なんぞも作りたくなるだろうて。
その時のお勉強だと思えば安い労力であろう・・・・・ってな訳でUSB通信の話はこれでおしまい!
X.デバッグ再び
@シリアル通信の組み込み再び
プログラムを元に戻して実行するも、やはり動きがおかしい。
そりゃ、ピン配置を弄っちゃったから仕方が無いのだが、本当にセンサーが働いているのか?を見ないと気が納まらないので、ここはもう一度シリアルを接続する
USB通信しないならUSBの価値が無いので切り離す・・・・って事は、実装を意識した単発CPUとして扱う事にして内部クロックに切り替える。
コンフィグを、
PLLDIV = 2 Divide by 2 (8 MHz oscillator input)
FOSC = INTOSC_HS Internal oscillator, HS used by USB
に設定するまでも結構パズル状態。
当然電源供給も外部5Vに戻しながら、なんやかんや丸一日を費やし、最後になってOSCCONの設定を忘れている事を発見・・・・とほほだよ・・・・。
AUSARTの駆動
単文字の出力を確認したところでUSART仕様に変更する。
今はまだEUSARTまで頭が回らないのでとりあえず。
だからSPBRGHは使わないので0x00とする。
内部クロック8MHzに変更したから88と同じ設定の
8MHz、9600ボー(SPBRG=0x0C)にする。
つまり、
OpenUSART(USART_TX_INT_OFF & USART_RX_INT_OFF & USART_ASYNCH_MODE & USART_EIGHT_BIT &USART_CONT_RX & USART_BRGH_LOW, 12);
test="CB1300SF\r\n"
putsUSART(test);
で試しに出してみた。(→)
やっぱ文字列を出力できるのはうれしい!
これで一文字出力から開放されそうだ!
ここまでのブレッド状態。(→)
配線をジャンパーワイヤから線に変えたら随分とスッキリした。
(一ヶ月が過ぎて・・・・・)
えっと、どこから話そうかな・・・・。
この一ヶ月間というものリモコン用の電波に関するお勉強で掛かりっきりだった。
未だに方向性を決める理屈に関する結論が出ないのでここに書く訳にもいかず、従って回路からも離れていた状態。
まぁ、もう少し時間を掛けて電波理論を把握しない事には進めないのよ・・・・。
ところで、その合間に回路に通電してみるとシリアル通信の信号がおかしな事になってる。
回路を触るとデタラメな表示をするのだ。
接触不良?
でもブレッドボードのピンには繋がっているし・・・・。
数日後、息をひそめて極めてデリケートに触ると文字化けしない事が判明。
やっぱり触れることでの障害と判断してシリアル通信部分を分離して基板に固定する事にした。
D-sub9ピン(オス・メス)専用基板セット300円。
これにADM3202ANを載せる。
またUSBを未使用にした為、写真のように秋月モジュールを止めて、PIC18F2550に変更した。
さて、ここから再び無線の話に戻るのだが、これまでここに一緒に書いていた。
しかし、すでにもう(露光器同様に)結構なボリュームになっている。
バカデカくなって、とっても読みにくくなってきたので、分離する事にした。
上記までが2010年2月。
んで、再びここに戻ってきたのが2010年6月。
無線と格闘する事、約4ヶ月余り・・・・・疲れたよ・・・・・結論から言うと「ショップからの挑戦を返り討ちにしてくれたぜぃ!!」である。
まぁ、読んでみて下さいな・・・・
という訳で無線モジュールを制覇する!です。
また、リモコンを制した段階で、再び2550に戻る訳だが、そろそろこのページもデカくなってきた。
だから2550仕切り直しという意味でページを別に設けよう。
このページの続きは「2550完結編!」で。
|