2012年9月7日金曜日

PIC32MX220F032B-04 A/D変換(ADC)を使う


秋月にてPIC32MX220F032Bが220円と大変安価かつDIPにて32bitマイコンが手に入るようになりました.
折角なので,PIC16FシリーズだけでなくPIC32MXも遊んでみようと試みようと
後閑さんの『高速・多機能を実現する pic32mx活用ガイドブック
を購入させていただきました.
大変良くまとまっています.PIC32MXをC32コンパイラで使うなら手元に置いておきたい.購入するべきです.
しかしながらPIC32MX340F256H用に書かれたものであり,PIC16Fシリーズで扱っていたCCS-Cなどと異なり,単純なコピー&ペーストを行っただけではコンパイルエラーになったり正しい動作が行われなかったりしまてしまいました.
ここではPIC32MX220F032B用に書き直して紹介していきたいと思います.

注意:私の提供する情報を元に何らかのトラブルが生じても責任を負いません.


<今回行うこと>
PIC32MX220F032BにてA/Dコンバータ機能の基本機能を扱えるようにします.
今回はAN5(7番ピン)でアナログ値を入力し,値の情報をシリアル通信で送信します.
ADコンバータが機能しているかどうかターミナルソフト「Tera Term」で確認します.

  • AN5(7番ピン)でA/D変換(ADC)を行う
  • UART1(RX):RB13で使用(受信割り込み)
    • "a"入力で A/D値,"v"入力で電圧値の表示選択を行う.
  • UART1(TX):RB15で使用(printf出力)
    • 50msec待機ごとに(50msec周期ではない)A/D値or電圧値を送信
<対象者>
PIC32MX220F032BでUARTを使う(受信割り込み)(printf出力)を理解した方

<用意するもの>
  • PIC32MX220F032BでUARTを使う(受信割り込み)(printf出力) の環境
    • パソコン(「MPLAB X IDE v1.30」と「C32 Cコンパイラv2.02」の環境で行いました)
    • PIC32MX220F032B(言うまでもないけど)
    • PICkit3(PICkit2でも書き込む方法があるらしい)
    • ブレッドボード(EIC-102が好きなのですが,単品で買える店が少ない)
    • ジャンパ線( EIC-102J付属品で良いと思う)
    • 抵抗 1k Ω(LED用),10k Ω(プルアップ用) 各1こ
    • コンデンサ 10uF 最低1こ (0.1uでも動作したが,「なし」では動作しなかった)
    • LED 1こ
    • Tera Term などといった通信ソフト
    • 3.3VレベルのUSBシリアル変換ケーブル 
  • 半固定抵抗
    • 0~3.3Vを出力するものであれば何を使用しても構いません
<資料>
最新版を探してきたつもりですが,検索かけ直して入手する方が良いと思います.
<配線>
特別解説すべきことはありません.私は図1に示すような配線を行いました.
図1 半固定抵抗の接続

<プログラム>
以下からソースコードをダウンロードできます.(リンク先にてCtrl+SでZIP保存)
※前回と異なり,ボーレートが57600bpsになっています.
設定事項は後閑さんの『高速・多機能を実現する pic32mx活用ガイドブック』に書かれています.
ただし,丸コピすると他のアナログピンを持つI/Oピンが機能しなくなるトラブルに見舞われました.
PIC32MX220F032Bデータシートを眺めてみると,AD1PCFGレジスタが存在しませんでした.
AD1PCFGレジスタに何か書き込む指令を行うと不具合の元になります.
また,AN5;RB3のI/Oポート設定を入力にするのを忘れないよう気をつけてください.

// ADC Configパラメータ定義
#define AD1CON1R ADC_MODULE_OFF | ADC_FORMAT_INTG16 | ADC_CLK_MANUAL | ADC_AUTO_SAMPLING_ON |ADC_SAMP_ON
#define AD1CON2R ADC_VREF_AVDD_AVSS | ADC_OFFSET_CAL_DISABLE | ADC_SCAN_OFF | ADC_SAMPLES_PER_INT_4 | ADC_ALT_BUF_OFF | ADC_ALT_INPUT_OFF
#define AD1CON3R ADC_SAMPLE_TIME_3 | ADC_CONV_CLK_SYSTEM | ADC_CONV_CLK_6Tcy
#define AD1PCFGR (0x0000)
#define AD1CSSLR SKIP_SCAN_ALL


    CloseADC10();
    SetChanADC10( ADC_CH0_NEG_SAMPLEA_NVREF | ADC_CH0_POS_SAMPLEA_AN5 );
    OpenADC10(AD1CON1R, AD1CON2R, AD1CON3R, AD1PCFGR, AD1CSSLR);
    EnableADC10();

ConvertADC10();    // 変換開始
while(BusyADC10());   // 変換完了待ち(1チャネル分)
Result = ReadADC10(0);   // 変換結果読み出し


半固定抵抗を任意に回転させ,ターミナルで表示させると以下のようになりました.

Voltage = 2.155
Voltage = 2.155
Voltage = 2.145
A/Ddata =  665
A/Ddata =  665
A/Ddata =  665
A/Ddata =  668
値が±3程度で暴れ,見事に安定しません.これは,PIC32MX220F032BでLEDチカチカ(+入力)をするの 図2 推奨する最小接続部品構成 の指示に従っていないこと,電源が不安定であること,ブレッドボードを利用していることが原因と考えられます.場合によってはA/D変換速度を見直すべきでしょう.

追記:推奨する最小接続部品構成の指示に従ってみたところ,+1あるいは-1に収まりました.


ブログランキング・にほんブログ村へ

2012年9月2日日曜日

PIC32MX220F032B-03 UARTを使う(受信割り込み)(printf出力)


秋月にてPIC32MX220F032Bが220円と大変安価かつDIPにて32bitマイコンが手に入るようになりました.
折角なので,PIC16FシリーズだけでなくPIC32MXも遊んでみようと試みようと
後閑さんの『高速・多機能を実現する pic32mx活用ガイドブック
を購入させていただきました.
大変良くまとまっています.PIC32MXをC32コンパイラで使うなら手元に置いておきたい.購入するべきです.
しかしながらPIC32MX340F256H用に書かれたものであり,PIC16Fシリーズで扱っていたCCS-Cなどと異なり,単純なコピー&ペーストを行っただけではコンパイルエラーになったり正しい動作が行われなかったりしまてしまいました.
ここではPIC32MX220F032B用に書き直して紹介していきたいと思います.

注意:私の提供する情報を元に何らかのトラブルが生じても責任を負いません.


<今回行うこと>
PIC32MX220F032Bにてシリアル通信,UARTの基本機能を扱えるようにします.
Peripheral Pin Select (PPS) Peripheralと呼ばれる機能があり,これによってある程度UARTを使用するピンを指定することができます.
UART1で送信と受信を行います.送信はprintf出力を行えるようにし,受信では割り込み処理が行えるようにします.
シリアル通信が正常かどうか確認するため「Tera Term」を利用します.
  • UART1(RX):RB13で使用(受信割り込み)
    • "["の受信でカウントアップ,"]"でカウントダウンを行う
  • UART1(TX):RB15で使用(printf出力)
    • 50msec待機ごとに(50msec周期ではない)カウント数を送信


<対象者>
PIC32MX220F032BでLEDチカチカ(+入力)をするを理解した方


<用意するもの>
  • PIC32MX220F032BでLEDチカチカ(+入力)をするの環境
    • パソコン(「MPLAB X IDE v1.30」と「C32 Cコンパイラv2.02」の環境で行いました)
    • PIC32MX220F032B(言うまでもないけど)
    • PICkit3(PICkit2でも書き込む方法があるらしい)
    • ブレッドボード(EIC-102が好きなのですが,単品で買える店が少ない)
    • ジャンパ線( EIC-102J付属品で良いと思う)
    • 抵抗 1k Ω(LED用),10k Ω(プルアップ用) 各1こ
    • コンデンサ 10uF 最低1こ (0.1uでも動作したが,「なし」では動作しなかった)
    • LED 1こ
  • Tera Term などといった通信ソフト
  • 3.3VレベルのUSBシリアル変換ケーブル 

<資料>
最新版を探してきたつもりですが,検索かけ直して入手する方が良いと思います.

<配線>
  • 変換ケーブルの黒(GND)をブレッドボードのマイナス(GND)へ接続
  • 変換ケーブルの橙(TXD)をブレッドボードのRX(RB13,24ピン)へ接続
  • 変換ケーブルの黄(RXD)をブレッドボードのTX(RB15,26ピン)へ接続
TTL-232R-3V3を使用する場合には,図1に示すような配線になっていれば配線完了です.
図1 シリアル変換ケーブルの接続

<プログラム>
以下からソースコードをダウンロードできます.(リンク先にてCtrl+SでZIP保存)
https://docs.google.com/open?id=0B25yKH5pEApFc0g2TS1vOEFmVjQ
まずはPPSの設定を行いましょう.
PIC32MX220F032Bデータシートのp145,「11.3 Pripheral Pin Select」を開きましょう.
TABLE11-1および11-2に具体的なピンの対応表が載っています.
以下のように宣言すれば使用できます.他のペリフェラルについても同様に設定を行えます.
     mPORTBSetPinsDigitalIn( BIT_13 );
     U1RXR = 0b0011;    //PIN RPB13 = RX
     mPORTBClearBits( BIT_15 );
     mPORTBSetPinsDigitalOut( BIT_15 );
     RPB15R = 0b0001;   //PIN RPB15 = TX

次にUARTの初期設定(割り込みに関する宣言を含む)を行います.
ボーレートが9600bpsと大変低速の設定にしています.お好みで変更してください.
     UARTConfigure(UART1, UART_ENABLE_PINS_TX_RX_ONLY);
     UARTSetFifoMode(UART1, UART_INTERRUPT_ON_TX_NOT_FULL | UART_INTERRUPT_ON_RX_NOT_EMPTY);
     UARTSetLineControl(UART1, UART_DATA_SIZE_8_BITS | UART_PARITY_NONE | UART_STOP_BITS_1);
     UARTSetDataRate(UART1, SYSCLK, 9600);
     UARTEnable(UART1, UART_ENABLE_FLAGS(UART_PERIPHERAL | UART_RX | UART_TX));
     
     INTEnable(INT_U1RX, INT_ENABLED);//INT_SOURCE_UART_RX(UART1)
     INTSetVectorPriority(INT_VECTOR_UART(UART1), INT_PRIORITY_LEVEL_2);
     INTSetVectorSubPriority(INT_VECTOR_UART(UART1), INT_SUB_PRIORITY_LEVEL_0);

以下の関数を宣言することによってUARTの送信をprintf関数で扱えるようになります.
ただし,printf関数はプログラムサイズが大変大きいので注意が必要です.
 void _mon_putc (char c)
 {
   while (U1STAbits.UTXBF);
   U1TXREG = c;
 }

受信割り込みの冒頭だけ補足をします.
後閑さんの『高速・多機能を実現する pic32mx活用ガイドブック』と同様にmU1RXClearIntFlag();を入力するとコンパイルエラーとなります.何故かMX220Fでは未定義扱いになります.そのため,レジスタを直接いじる必要があります.IFS1bits.U1RXIF = 0;と入力すると無事に動作しました.
void __ISR(32, ipl2) U1RX_interrupt(void){
 char RcvData;

        IFS1bits.U1RXIF = 0;        //mU1RXClearIntFlag();  
 RcvData = getcUART1();

後閑さんのサンプルプログラムでは,動作停止や再開,カウントアップダウンが多少異なります.
そのあたりについては『高速・多機能を実現する pic32mx活用ガイドブック』を参考にしてみてください.


ブログランキング・にほんブログ村へ

2012年9月1日土曜日

PIC32MX220F032B-02 LEDチカチカ(各種タイマ割り込み)をする


秋月にてPIC32MX220F032Bが220円と大変安価かつDIPにて32bitマイコンが手に入るようになりました.
折角なので,PIC16FシリーズだけでなくPIC32MXも遊んでみようと試みようと
後閑さんの『高速・多機能を実現する pic32mx活用ガイドブック
を購入させていただきました.
大変良くまとまっています.PIC32MXをC32コンパイラで使うなら手元に置いておきたい.購入するべきです.
しかしながらPIC32MX340F256H用に書かれたものであり,PIC16Fシリーズで扱っていたCCS-Cなどと異なり,単純なコピー&ペーストを行っただけではコンパイルエラーになったり正しい動作が行われなかったりしまてしまいました.
ここではPIC32MX220F032B用に書き直して紹介していきたいと思います.


注意:私の提供する情報を元に何らかのトラブルが生じても責任を負いません.


<今回行うこと>
PIC32MX220F032BにてI/Oの基本機能を扱えるようにします.
タイマ1,タイマ2,タイマ3を16ビットモードで,
タイマ4,タイマ5をタイマ45の32ビットモードとして扱います.
タイマの割り込みが行えているかどうか確認するために,RA0~RA3にLEDを取り付けてそれぞれの割り込みが行われた際にそれに対応したI/Oポートの出力状態を反転することで可視化を図ります.
  • タイマ1:100msecごとにRA0の出力を反転
  • タイマ2:200msecごとにRA1の出力を反転
  • タイマ3:400msecごとにRA2の出力を反転
  • タイマ45:800msecごとにRA3の出力を反転
<対象者>
PIC32MX220F032BでLEDチカチカ(+入力)をするを理解した方

<用意するもの>

<配線>
RA0~RA3にLEDがそれぞれ点灯するようにLEDおよび抵抗を接続してください.
私がブレッドボードにて配線を行った例を図1に示します.

図1 配線例
ブレッドボードでLEDを使用しようとすると抵抗によってスペースの無駄ができてしまいます.
私はこれを大変嫌っており,チップ抵抗とチップLEDを組み合わせたミニボードを自作し利用しています.

<プログラム>
以下からソースコードをダウンロードできます.(リンク先にてCtrl+SでZIP保存)
https://docs.google.com/open?id=0B25yKH5pEApFRkVhWFJVUmY5c0E

前回のプログラムから以下を追加するだけです.

    //Timer1 Enable Setting     25nsec x 64 x 62500 = 100msec
    OpenTimer1(T1_ON | T1_SOURCE_INT | T1_PS_1_64, 62500);
    //Timer1 interrupt Setting
    ConfigIntTimer1(T1_INT_ON | T1_INT_PRIOR_2);

    //Timer2 Enable Setting     25nsec x 256 x 31250 = 200msec
    OpenTimer2(T2_ON | T2_SOURCE_INT | T2_PS_1_256, 31250);
    //Timer2 interrupt Setting
    ConfigIntTimer2(T2_INT_ON | T2_INT_PRIOR_2);

    //Timer3 Enable Setting     25nsec x 256 x 62500 = 400msec
    OpenTimer3(T3_ON | T3_SOURCE_INT | T3_PS_1_256, 62500);
    //Timer3 interrupt Setting
    ConfigIntTimer3(T3_INT_ON | T3_INT_PRIOR_2);

    //Timer45 Enable Setting     25nsec x 256 x 125000 = 800msec
    OpenTimer45(T45_ON | T45_SOURCE_INT | T45_PS_1_256, 156250);
    //Timer45 interrupt Setting
    ConfigIntTimer45(T45_INT_ON | T45_INT_PRIOR_2);

    //割り込み許可
    INTEnableSystemMultiVectoredInt();

 /**********************************
*  Timer1割り込み処理
**********************************/
void __ISR(4, ipl2) T1_interrupt(void){
    mT1ClearIntFlag(); //割り込みフラグクリア
    mPORTAToggleBits( BIT_0 );
}

/**********************************
*  Timer2割り込み処理
**********************************/
void __ISR(8, ipl2) T2_interrupt(void){
    mT2ClearIntFlag(); //割り込みフラグクリア
    mPORTAToggleBits( BIT_1 );
}

/**********************************
*  Timer3割り込み処理
**********************************/
void __ISR(12, ipl2) T3_interrupt(void){
    mT3ClearIntFlag(); //割り込みフラグクリア
    mPORTAToggleBits( BIT_2 );
}

/**********************************
*  Timer45割り込み処理
**********************************/
void __ISR(20, ipl2) T45_interrupt(void){
    mT5ClearIntFlag(); //割り込みフラグクリア
    mPORTAToggleBits( BIT_3 );
}






ブログランキング・にほんブログ村へ

MPLAB X IDEでの日本語コメントの文字化けについて

先ほどの「PIC32MX220F032BでLEDチカチカ(+入力)をする」で公開したソースコードをダウンロードすると,MPLAB X IDEにてコメント欄の日本語文字が認識されていないと思います.
設定を ISO-2022-JP にしてやると日本語を入力して保存しても文字化けせずに扱えます.
図1のようにプロジェクトを選択して右クリック後,Propertiesを選択します.

図1  Propertiesの選択


図2のようにPropertiesウィンドウ内の左メニューGeneralを選択し,EncodingをISO-2022-JPに変更します.

2013/01/06追記:「Shift JIS」でも問題ありません.

図2  Encodingの選択
以上です.


ブログランキング・にほんブログ村へ