SSブログ

I2C接続でトラブルが発生した [PIC32]

(2014.05.29)
PIC18F25k50で使っていたI2C(スレーブ)のプログラムをPIC32MX用に書き換えました。Raspi側もRaspi-1のJavaプログラムをRaspi-2に移植して準備完了!

動かしてみると・・・駄目です、I2C割り込みが発生しません。しかも、点滅するはずのLED(RA1ピン)が消えたままになっています。orz

デバッガで調べてみると、I2C1CON.ONを1にするとLEDが消え、0にすると点くことが確認出来ました。(<==ブレークしたままでも確認できた)

『あれ~、RA1ピンとI2C1って何か関係があるのか?』
”Peripheral Pin Select”との関連を調べましたが、何も見つかりません。

『おかしいな~』

テスターでRA1の電圧を測ってみると何か変な値です。(<==やけに低い)慌ててVddを測ってみると、1.5Vしかありません。orz


『あっ、PICkit3の電源供給能力(<==30mA)を越えていたんだ!』
”Vddが1.5VでもPIC32MXはそこそこ動く”というのも驚きです。
---------------------------------------------------------------------------
(2014.05.30)
”Vdd=1.5Vで動作する”というのは大嘘かもしれません。
誤計測の可能性があります。
---------------------------------------------------------------------------

Raspiから3.3Vを供給して、”一件落着”を期待したのですが、そうはなりませんでした。

電源を変えても、I2C1CON.ONを1にするとRA1の出力電圧が低下(<==1.3V程度)してLEDが消えてしまいます。

『え~、何が起きているんだ?』

Web検索を掛けて、PIC32MX1XX_2XXのERRATA(これ)に辿りつきました。
”Module: I/O Ports
Output High Voltage (VOH) on the RA0 and RA1
pins is not within the published data sheet
specification if the I2C1 module is enabled.”

”Disable slew rate control of the I2C1 module by
setting the DISSLW bit (I2C1CON<9>).”
”I2C1をエネーブルにすると、仕様の範囲に入らない”って、随分控えめな表現です。この不具合を解消するためには、DISSLWをセット必要があるようです。

確かに、I2C1CON.ONを1にしてLEDが消えても、I2C1CON.DISSLを1にするとLEDは点きました。(<==デバッガでブレークしたままで確認した)
I2Cのクロックを100kHzにするしかなさそうです。

RA1の問題は解決しましたが、Raspi-2とPIC32MXのI2C通信は未だ繋がりません。
orz

タフでなければ、やってられない!¥(^_^)
--------------------------------------------------------
PIC32MX1XX_2XXのERRATAには他にも色々書いてありました。
ADCの変換レートは500kSPS以下にしろとか何とか・・・

PIC32MX250F128Bはお試し程度に留めておくほうが良さそうです。
--------------------------------------------------------

にほんブログ村 IT技術ブログへ
にほんブログ村 ネットブログ コミュニティサイトへ
にほんブログ村 IT技術ブログ オープンソースへ


nice!(1)  コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

ロジアナの性能は期待外れだった [PIC32]

(2014.05.28)
ロジアナは、TIMER2で10MHzの転送トリガを作り、PORTBからメモリへDMA転送させる計画だったのですが、DMAのブロック転送終了割り込みをカウントしてみると、たかだか3Mバイト/秒くらいの性能しか出ていないことが判りました。

試しに、メモリ-メモリ間のDMA転送も行ってみましたが、転送レートに変化はありませんでした。不思議なのは、同時に動かしているAD変換データのDMA転送を止めても、転送レートが変化しない(たかだか3Mバイト/秒)ことです。

何か大きな間違いを”しでかして”いるのでしょうか?

にほんブログ村 IT技術ブログへ
にほんブログ村 ネットブログ コミュニティサイトへ
にほんブログ村 IT技術ブログ オープンソースへ


nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

リファレンス・マニュアルに書いてあった [PIC32]

(2014.05.26)
TIMER3の割り込みプライオリティを0にすると、割り込みハンドラが呼び出されない件ですが、リファレンス・マニュアルに書いてありました。
”8.7.1Interrupt Group Priority
The user can assign a group priority ...
The user-selectable priority levels range from 1 (lowest) to 7 (highest). If an interrupt priority is set to zero, the interrupt vector is disabled for both interrupt and wake-up purposes. "
プライオリティを0にすると、割り込みベクタがディスエイブルになり、割り込みによるWake-upも出来なくなるようです。StatusレジスタのIPLが0以下にはならないのですから、プライオリティ0の割り込みハンドラが呼び出されないのは当然かも知れません。

Timer3を使うと1μSインターバルでAD変換出来ない件は謎のままですが、”Internal counter ends sampling”に代えれば1μSインターバルでAD変換出来ることが判ったので気にしないことにします。(<==親族SNS管理人はやり方さえ判れば拘らないタイプです)

あと、I2C通信が出来るようになれば、オシロとロジアナの道具立てが揃います。

にほんブログ村 IT技術ブログへ
にほんブログ村 ネットブログ コミュニティサイトへ
にほんブログ村 IT技術ブログ オープンソースへ


nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

AD変換が1Mサンプル/秒で動かない [PIC32]

(2014.05.23)
PIC32MX250F128B(<==1個360円@秋月電子)のプログラム開発は(PICkit3があれば)、手軽に始められます。周辺ライブラリが充実しているので、サンプル・プログラムを使ってADC、DMA、TIMERなどを試すとなんとなく”使えている気分”になって開発マインドが高揚します。しかし、自分で書いたプログラムに問題が起きて、リファレンス・マニュアル(<==個々の機能の詳細を記してある)に目を通してみると、32bitデバイスの”コワモテ”が姿を現し、気分が一気に引き締まります。

一頻り悩んで解決した問題の一つが”ADCIFが入りっぱなしになる件”です。
デバイス・マニュアルには”Persistemt Interrupt 頑固な割り込み”(確かにそうなんですが・・・orz)という記述しか見つかりませんでした

割り込み機能のリファレンス・マニュアルを読んで、ようやく解決しました。
”Persistent interrupts will remain active and the associated interrupt flag set until the issue causing the interrupt is serviced. An example would be an interrupt declaring data in a UART receive buffer. Until this data is read, the interrupt flag will remain set even if the flag is cleared in software. ”
”例えばUARTの受信割り込みは、レシ-ブ・バッファを読み出さないと割り込み要求はクリアできない”とか何とか書いてありました。

ADCの場合はADC1BUF0..7とADC1BUF8..Fの読み出し(AD変換8回ごとに割り込みが入る設定にしている)が必要だったのです。
<読み捨ててみた>
void __ISR(_ADC_VECTOR, ipl2) AdcHandler(void)
{
  register int rv1 asm ("t4");
  if( AD1CON2bits.BUFS == 0 )
  {
    rv1 = ADC1BUF8;
    rv1 = ADC1BUF9;
    rv1 = ADC1BUFA;
    rv1 = ADC1BUFB;
    rv1 = ADC1BUFC;
    rv1 = ADC1BUFD;
    rv1 = ADC1BUFE;
    rv1 = ADC1BUFF;
  }
  else
  {
    rv1 = ADC1BUF0;
    rv1 = ADC1BUF1;
    rv1 = ADC1BUF2;
    rv1 = ADC1BUF3;
    rv1 = ADC1BUF4;
    rv1 = ADC1BUF5;
    rv1 = ADC1BUF6;
    rv1 = ADC1BUF7;
  }
  mAD1ClearIntFlag();
}

これで、”ADCIFが入りっぱなしになる件”は解決しました。
パチパチパチ~

現時点で抱えている問題は次の二つです。
(1)何故、TIMER3の割り込みプライオリティを0にすると、割り込みハンドラが呼び出されないのか?(<==割り込みプライオリティが1以上なら呼び出される)
(2)何故、ADCが1μSインターバルの変換開始トリガで動作出来ないのか?
(<==1.1μSインターバル以上なら動く)

TIMER3割り込みが1μSインターバルであることは、LEDチカチカ(強力なデバッグ・ツール)で確認しました。
<こんな感じ>
void __ISR(_TIMER_3_VECTOR, ipl1) Timer3Handler(void)
{
    mT3ClearIntFlag();
    loop_count++;
    if( loop_count >1000000 )
    {
        mPORTAToggleBits(BIT_1);
        loop_count = 0;
    }
}


PBCLK=30MHz
ADCLK=PBCLK/2
Tad=66,7ns (<==1/15MHz)
Tsamp = 200ns (<==1us - 12Tad )

これで、ADの使用条件は満たしていると思うのですが・・・

謎です。

-------------------------------------------------------------------------------
(2014.05.24)
Conversion Trigger Source設定をTimer3から”Internal counter ends sampling”に代え、”Auto-sample Time”に2を設定したら1MHzサンプリングになりました。(1Tad=1/15MHz)

やれやれ
<こんな感じ>
//	#define PARAM1  ADC_FORMAT_INTG16 | ADC_CLK_TMR | ADC_AUTO_SAMPLING_ON 
        #define PARAM1  ADC_FORMAT_INTG16 | ADC_CLK_AUTO | ADC_AUTO_SAMPLING_ON
	#define PARAM2  ADC_VREF_AVDD_AVSS | ADC_OFFSET_CAL_DISABLE | ADC_SCAN_OFF | ADC_SAMPLES_PER_INT_8 | ADC_BUF_8 | ADC_ALT_INPUT_OFF
//	#define PARAM3  ADC_CONV_CLK_PB | ADC_CONV_CLK_Tcy2
	#define PARAM3  ADC_CONV_CLK_PB | ADC_CONV_CLK_Tcy2 | ADC_SAMPLE_TIME_2
	#define PARAM4	ENABLE_AN10_ANA
	#define PARAM5	SKIP_SCAN_ALL
	SetChanADC10( ADC_CH0_NEG_SAMPLEA_NVREF | ADC_CH0_POS_SAMPLEA_AN10 );
	OpenADC10( PARAM1, PARAM2, PARAM3, PARAM4, PARAM5 );
        ConfigIntADC10(ADC_INT_ON | ADC_INT_PRI_2 | ADC_INT_SUB_PRI_0);

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

にほんブログ村 IT技術ブログへ
にほんブログ村 ネットブログ コミュニティサイトへ
にほんブログ村 IT技術ブログ オープンソースへ


nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

60MIPSで動かしてみた [PIC32]

(2014.05.21)
秋月電子で買ってきた28pinSPDIPのPIC32MX250F128B(これです)を使って、1Mサンプル/秒のデジタル・オシロと10Mサンプル/秒のロジック・アナライザを作ろうとしています。
----------------------------------------------------------
これは大法螺でした。
後で大幅にスペック・ダウンします。
----------------------------------------------------------

<基本構想>
SYSCLK=60MHz(<==PIC内蔵クロックの2分周をPLLで15倍する)
PBCLK=30MHz
ADCクロック=15MHz
ADC AUTO SAMPLING設定 ON
PORTBからメモリへDMA転送
TIMER2(<==DMA転送用)とTIMER3(<==AD変換用)で、10MHzと1MHzのトリガ信号を生成する

動作確認はまだですが、ADとDMAがそれらしく動いたのでデータ収集開始(停止)トリガをプログラムで制御する方式の可能性を調べてみました。
<テスト・プログラム>
void __longramfunc__ test_loop(void)
{
    register int rv0 asm ("t4");
    register int rv1 asm ("t5");
    register int rv2 asm ("t6");
    rv0=0;
    rv2=0x12;
    while(rv0<1000000)
    {
<ここから>
        rv0++;
        rv1= mPORTBRead();
        if( rv1 == rv2 )break;
        if( mAD1GetIntFlag() != 0)
        {
            mAD1ClearIntFlag();
        }
<ここまで>
    }
}

void test(void)
{
    int loop;
    loop = 0;
    while((loop++)<200 )
    {
      mPORTAToggleBits(BIT_1);
      test_loop();
    }
}


このプログラムを動かすと<ここから><ここまで>の部分を1000000×200回実行する間、LEDが点滅します。その時間を測ると凡そ90秒(<==1回あたり0.45μ秒 凡そ60MIPS)でした。

ADCなら1MHzの変換レート、DMAも2MHzの転送レートまで、プログラムによるデータ収集開始(停止)の制御が可能であることを示す結果となりました。(<==本当か?)

にほんブログ村 IT技術ブログへ
にほんブログ村 ネットブログ コミュニティサイトへ
にほんブログ村 IT技術ブログ オープンソースへ


nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

CORE TIMERを見つけた [PIC32]

(2014.05.15)
マニュアルをざっくり眺めて、気になった”CORE TIMER”ですが、(ここ)で見つけました。

資料の説明(<==2.2.3 CORE TIMER)によれば、実体はCP0(<==M4Kのコプロセッサ0)の”Count Register”と”Compare Register”で、2SYSCLKごとにCount RegisterがインクリメントしてCount Registerと一致したときに、CORE TIMER割り込みが発生するようです。

正体が判ったところで、CORE TIMERを使った”LEDチカチカ”も試してみました。

#define SYS_FREQ             (48000000L)
#define PB_DIV                 4
#define PRESCALE               256
#define TOGGLES_PER_SEC        1
#define T1_TICK               (SYS_FREQ/PB_DIV/PRESCALE/TOGGLES_PER_SEC)

#define CORE_TICK_RATE	       (SYS_FREQ/2/TOGGLES_PER_SEC)

void timer_init(void)
{
    OpenTimer1(T1_ON | T1_SOURCE_INT | T1_PS_1_256, T1_TICK);
    ConfigIntTimer1(T1_INT_ON | T1_INT_PRIOR_2);

    OpenCoreTimer(CORE_TICK_RATE);
    _CP0_BIC_DEBUG(_CP0_DEBUG_COUNTDM_MASK);
    mConfigIntCoreTimer((CT_INT_ON | CT_INT_PRIOR_2 | CT_INT_SUB_PRIOR_0));
}

void __ISR(_TIMER_1_VECTOR, ipl2) Timer1Handler(void)
{
    mT1ClearIntFlag();
    mPORTAToggleBits(BIT_0);
}

void __ISR(_CORE_TIMER_VECTOR, IPL2SOFT) CoreTimerHandler(void)
{
    mCTClearIntFlag();
    UpdateCoreTimer(CORE_TICK_RATE);
    mPORTAToggleBits(BIT_1);
}


コードはMicrochip¥xc32¥v1.31¥examples¥plib_examples¥timer¥core_timer_int以下のものをほぼそのまま(<==少し手を入れた)使っています。

AポートのBit_0とBit_1でLEDチカチカを確認できたので、そろそろ”Lチカ”は卒業して次のステージに進もうと思います。

A/Dでデータ・サンプリングしてI2CでRaspiと繋げて・・・
むふふ(<==妄想が膨らんでいる)、楽しみ!

にほんブログ村 IT技術ブログへ
にほんブログ村 ネットブログ コミュニティサイトへ
にほんブログ村 IT技術ブログ オープンソースへ


nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

PIC32MXが動き始めた [PIC32]

(2014.05.14)
二日掛けてデバイス(<==PIC32MX250F128B)とコンパイラ(<==XC32)の説明資料(これ)と(これ)に目を通しました。PIC18やXC8と共通する記述も多く、詳細な記述は読み飛ばして、概要の把握に努めました。

現時点で不明なのは”CORE TIMER”です。MIPSコアの機能らしいのですが、デバイスのマニュアルには割り込みベクタしか出てきません。orz

CORE TIMERの正体は気になりますが、何はともあれ判っている範囲で動かしてみることにしました。以下の場所にあるサンプル・コードを参考にして、PIC開発の常道”LEDチカチカ”をやってみました。

Microchip\xc32\v1.31\examples\plib_examples

『PIC32でLチカなんてやっても、面白くないだろう』って?
とんでもない!

Config bitを設定して、ポート、タイマ、割り込みを初期化して、タイマー割り込みハンドラでPORTの出力を反転して・・・
新しいデバイスでやる”Lチカ”は(何回やっても)とっても嬉しい瞬間です。
2014_0514_1.pngPIC32でLチカ

にほんブログ村 IT技術ブログへ
にほんブログ村 ネットブログ コミュニティサイトへ
にほんブログ村 IT技術ブログ オープンソースへ


nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

PIC32MXを手に入れた [PIC32]

(2014.05.11)
久しぶりに秋葉原へ出かけ、新しいPIC(これ)を手に入れました。

PIC32MZシリーズの発売をずっと待っているのですが、昨年11月のプレスリリース以来音沙汰がありません。(<==StatusはFuture Productのまま)
PIC32に慣れておくのも良いと考え、お試しでPIC32MX250F128B(¥360@秋月電子)を二個買ってきました。残念ながら128kB Flashなので24bit漢字フォントを搭載することは出来ません。しかしデコーダ・プログラムを動かす位なら出来そうです。

早速ブレッド・ボード上で配線して、PICkit3を接続してみました。

*****************************************************

Connecting to MPLAB PICkit 3...
Firmware Suite Version.....01.28.72
Firmware type..............PIC32MX

Target detected
Device ID Revision = A1

Programming...
boot config memory
Address: 1fc00014 Expected Value: 275a0238 Received Value: 275a0028
Failed to program device


首尾よくデバイスを認識したのですが、Programmingでエラー終了してしまいました。orz
Verifyエラーです。一体何が起きているのでしょうか?

デバイス・マニュアルを見直し、パスコンをpin近くに置いたりしましたが状況は変わりません。
動かないデバイスを前に頭を抱えました。

PIC32MXって扱いが難しいデバイスなのでしょうか?
(<==自分のミスに気がついていない)

ひとしきりジタバタした挙句ふと、Vddの配線に目が止まりました。
”あれ!Vddって14pinじゃ無かったような・・・”

漸く、自分の配線ミスに気がつきました。
Vddが正しく配線されていなくても、PICkit3はデバイスを認識して書き込みまで行っていたのです。

Vddを13pinに付け替え、問題なく書き込みが出来るようになりました。
PIC32MX250F128Bはブレッド・ボードでも動かせる、扱い易いデバイスでした。

やれやれ(お粗末)

にほんブログ村 IT技術ブログへ
にほんブログ村 ネットブログ コミュニティサイトへ
にほんブログ村 IT技術ブログ オープンソースへ


nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

おっと、危ない! [PIC32]

(2014.03.09)
何気なく、PIC32MZの評価基板図を眺めていて『あっ!』
2014_0309_1.pngクリスタルと干渉している
クリスタルの外形線とPIC32MZのPADが干渉していることに気付きました。

危ない、危ない。
2014_0309_2.png修正
DRCでパターンはチェック出来ますが、部品外形は目視でチェックしなければなりません。また、「実装のし易さ」なども配慮しておかないと、あとで後悔することになります。まだ暫くはちょこちょこ手直しが続きます。

にほんブログ村 IT技術ブログへ
にほんブログ村 ネットブログ コミュニティサイトへ
にほんブログ村 IT技術ブログ オープンソースへ


nice!(1)  コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

PIC32の開発に向けて準備を進めた [PIC32]

2014.03.03)
未だステータスが”Future Product(入手できない)”ですが、PIC32MZ(これです)の開発準備を進めています。

取り合えず回路図を描き、
2014_0303_2.png評価基板回路図

基板まで設計してしまいました。\(^_^)
2014_0303_1.png評価基板図

パッケージの外側から眺めれば、12MHzのクリスタルで動くありぶれたPICですが、
内部は200MHz近いクロックで動く高性能デバイス(300MIPS)です。

TQFP(0.5mmピッチ)の実装が親族SNS管理人にとって最大の難関です。

これをクリアするのための秘策がXYステージだったのですが、上部構造(ハンダコテetc.)の構想が揺らいで、一旦開発を中断しました。”基本は手ハンダでXYステージがそれを支援する”という新たな構想の下で開発を再開します。

さて、どうなるか?

にほんブログ村 IT技術ブログへ
にほんブログ村 ネットブログ コミュニティサイトへ
にほんブログ村 IT技術ブログ オープンソースへ


nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。