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はお試し程度に留めておくほうが良さそうです。
--------------------------------------------------------
PIC18F25k50で使っていたI2C(スレーブ)のプログラムをPIC32MX用に書き換えました。Raspi側もRaspi-1のJavaプログラムをRaspi-2に移植して準備完了!
動かしてみると・・・駄目です、I2C割り込みが発生しません。しかも、点滅するはずのLED(RA1ピン)が消えたままになっています。orz
デバッガで調べてみると、I2C1CON.ONを1にするとLEDが消え、0にすると点くことが確認出来ました。(<==ブレークしたままでも確認できた)
『あれ~、RA1ピンとI2C1って何か関係があるのか?』
”Peripheral Pin Select”との関連を調べましたが、何も見つかりません。
『おかしいな~』
テスターでRA1の電圧を測ってみると何か変な値です。(<==やけに低い)
『あっ、PICkit3の電源供給能力(<==30mA)を越えていたんだ!』
---------------------------------------------------------------------------
(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はお試し程度に留めておくほうが良さそうです。
--------------------------------------------------------
|
|
|
ロジアナの性能は期待外れだった [PIC32]
リファレンス・マニュアルに書いてあった [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通信が出来るようになれば、オシロとロジアナの道具立てが揃います。
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通信が出来るようになれば、オシロとロジアナの道具立てが揃います。
|
|
|
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回ごとに割り込みが入る設定にしている)が必要だったのです。
これで、”ADCIFが入りっぱなしになる件”は解決しました。
パチパチパチ~
現時点で抱えている問題は次の二つです。
(1)何故、TIMER3の割り込みプライオリティを0にすると、割り込みハンドラが呼び出されないのか?(<==割り込みプライオリティが1以上なら呼び出される)
(2)何故、ADCが1μSインターバルの変換開始トリガで動作出来ないのか?
(<==1.1μSインターバル以上なら動く)
TIMER3割り込みが1μSインターバルであることは、LEDチカチカ(強力なデバッグ・ツール)で確認しました。
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)
やれやれ
-------------------------------------------------------------------------------
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);
-------------------------------------------------------------------------------
|
|
|
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がそれらしく動いたのでデータ収集開始(停止)トリガをプログラムで制御する方式の可能性を調べてみました。
<テスト・プログラム>
このプログラムを動かすと<ここから><ここまで>の部分を1000000×200回実行する間、LEDが点滅します。その時間を測ると凡そ90秒(<==1回あたり0.45μ秒 凡そ60MIPS)でした。
ADCなら1MHzの変換レート、DMAも2MHzの転送レートまで、プログラムによるデータ収集開始(停止)の制御が可能であることを示す結果となりました。(<==本当か?)
秋月電子で買ってきた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の転送レートまで、プログラムによるデータ収集開始(停止)の制御が可能であることを示す結果となりました。(<==本当か?)
|
|
|
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チカチカ”も試してみました。
コードはMicrochip¥xc32¥v1.31¥examples¥plib_examples¥timer¥core_timer_int以下のものをほぼそのまま(<==少し手を入れた)使っています。
AポートのBit_0とBit_1でLEDチカチカを確認できたので、そろそろ”Lチカ”は卒業して次のステージに進もうと思います。
A/Dでデータ・サンプリングしてI2CでRaspiと繋げて・・・
むふふ(<==妄想が膨らんでいる)、楽しみ!
マニュアルをざっくり眺めて、気になった”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と繋げて・・・
むふふ(<==妄想が膨らんでいる)、楽しみ!
|
|
|
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チカ”は(何回やっても)とっても嬉しい瞬間です。
PIC32でLチカ
二日掛けてデバイス(<==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チカ”は(何回やっても)とっても嬉しい瞬間です。
PIC32でLチカ
|
|
|
PIC32MXを手に入れた [PIC32]
(2014.05.11)
久しぶりに秋葉原へ出かけ、新しいPIC(これ)を手に入れました。
PIC32MZシリーズの発売をずっと待っているのですが、昨年11月のプレスリリース以来音沙汰がありません。(<==StatusはFuture Productのまま)
PIC32に慣れておくのも良いと考え、お試しでPIC32MX250F128B(¥360@秋月電子)を二個買ってきました。残念ながら128kB Flashなので24bit漢字フォントを搭載することは出来ません。しかしデコーダ・プログラムを動かす位なら出来そうです。
早速ブレッド・ボード上で配線して、PICkit3を接続してみました。
首尾よくデバイスを認識したのですが、Programmingでエラー終了してしまいました。orz
Verifyエラーです。一体何が起きているのでしょうか?
デバイス・マニュアルを見直し、パスコンをpin近くに置いたりしましたが状況は変わりません。
動かないデバイスを前に頭を抱えました。
PIC32MXって扱いが難しいデバイスなのでしょうか?
(<==自分のミスに気がついていない)
ひとしきりジタバタした挙句ふと、Vddの配線に目が止まりました。
”あれ!Vddって14pinじゃ無かったような・・・”
漸く、自分の配線ミスに気がつきました。
Vddが正しく配線されていなくても、PICkit3はデバイスを認識して書き込みまで行っていたのです。
Vddを13pinに付け替え、問題なく書き込みが出来るようになりました。
PIC32MX250F128Bはブレッド・ボードでも動かせる、扱い易いデバイスでした。
やれやれ(お粗末)
久しぶりに秋葉原へ出かけ、新しい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はブレッド・ボードでも動かせる、扱い易いデバイスでした。
やれやれ(お粗末)
|
|
|
おっと、危ない! [PIC32]
(2014.03.09)
何気なく、PIC32MZの評価基板図を眺めていて『あっ!』
クリスタルと干渉している
クリスタルの外形線とPIC32MZのPADが干渉していることに気付きました。
危ない、危ない。
修正
DRCでパターンはチェック出来ますが、部品外形は目視でチェックしなければなりません。また、「実装のし易さ」なども配慮しておかないと、あとで後悔することになります。まだ暫くはちょこちょこ手直しが続きます。
何気なく、PIC32MZの評価基板図を眺めていて『あっ!』
クリスタルと干渉している
クリスタルの外形線とPIC32MZのPADが干渉していることに気付きました。
危ない、危ない。
修正
DRCでパターンはチェック出来ますが、部品外形は目視でチェックしなければなりません。また、「実装のし易さ」なども配慮しておかないと、あとで後悔することになります。まだ暫くはちょこちょこ手直しが続きます。
|
|
|
PIC32の開発に向けて準備を進めた [PIC32]
2014.03.03)
未だステータスが”Future Product(入手できない)”ですが、PIC32MZ(これです)の開発準備を進めています。
取り合えず回路図を描き、
評価基板回路図
基板まで設計してしまいました。\(^_^)
評価基板図
パッケージの外側から眺めれば、12MHzのクリスタルで動くありぶれたPICですが、
内部は200MHz近いクロックで動く高性能デバイス(300MIPS)です。
TQFP(0.5mmピッチ)の実装が親族SNS管理人にとって最大の難関です。
これをクリアするのための秘策がXYステージだったのですが、上部構造(ハンダコテetc.)の構想が揺らいで、一旦開発を中断しました。”基本は手ハンダでXYステージがそれを支援する”という新たな構想の下で開発を再開します。
さて、どうなるか?
未だステータスが”Future Product(入手できない)”ですが、PIC32MZ(これです)の開発準備を進めています。
取り合えず回路図を描き、
評価基板回路図
基板まで設計してしまいました。\(^_^)
評価基板図
パッケージの外側から眺めれば、12MHzのクリスタルで動くありぶれたPICですが、
内部は200MHz近いクロックで動く高性能デバイス(300MIPS)です。
TQFP(0.5mmピッチ)の実装が親族SNS管理人にとって最大の難関です。
これをクリアするのための秘策がXYステージだったのですが、上部構造(ハンダコテetc.)の構想が揺らいで、一旦開発を中断しました。”基本は手ハンダでXYステージがそれを支援する”という新たな構想の下で開発を再開します。
さて、どうなるか?
|
|
|