秋月にてPIC32MX220F032Bが220円と大変安価かつDIPにて32bitマイコンが手に入るようになりました.
折角なので,PIC16FシリーズだけでなくPIC32MXも遊んでみようと試みようと
後閑さんの『高速・多機能を実現する pic32mx活用ガイドブック』
を購入させていただきました.
大変良くまとまっています.PIC32MXをC32コンパイラで使うなら手元に置いておきたい.購入するべきです.
しかしながらPIC32MX340F256H用に書かれたものであり,PIC16Fシリーズで扱っていたCCS-Cなどと異なり,単純なコピー&ペーストを行っただけではコンパイルエラーになったり正しい動作が行われなかったりしまてしまいました.
ここではPIC32MX220F032B用に書き直して紹介していきたいと思います.
注意:私の提供する情報を元に何らかのトラブルが生じても責任を負いません.
<今回行うこと>
とりあえず,PIC32MX220F032BにてI/Oの基本機能を扱えるようにしたい.
つまりLEDチカチカだけでなく,INPUTも行います.
INPUTのHigh Lowの状態によって点滅周期が変わるようにします.
ここでは,RB5(14番ピン)を出力に,RB13(24番ピン)を入力とします.
<対象者>
既になにかしらのマイコンを弄った経験のある方であることを前提とします.
<用意するもの>
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こ
<資料>
最新版を探してきたつもりですが,検索かけ直して入手する方が良いと思います.
<配線>
とりあえず,データシートの4ページの下を見てみましょう.
| 図1 PIC32MX220F032Bのピン配置 |
私の愛用していたPIC16F88とは異なり,AVDDやらVCAPやらがあります.
どうすれば良いのかさっぱりですね.そこでデータシート27ページを開くと,
| 図2 推奨する最小接続部品構成 |
本当はこの程度抵抗なりコンデンサなり付けなければならないようですが,たかだかLEDをチカチカさせるだけなのにここまでしなくてはならないと思うとなんだか面倒です.
そこで,図3に示すような構成で試したところ,特に問題なく動作しました.
そこで,図3に示すような構成で試したところ,特に問題なく動作しました.
| 図3 LEDチカチカにおけるPIC32MX220F032Bの最小構成 ※左右端にある+ラインと-ラインはそれぞれ互いに接続されているものとしています. |
しかし,いくつかの部品を省いていますので場合によっては誤動作する可能性があります.
半透明で黄緑色に塗りつぶしている箇所にPICkit3の信号線を差し込みます.
半透明で黄緑色に塗りつぶしている箇所にPICkit3の信号線を差し込みます.
ブレッドボードのピンアサインとPICkit3のピンアサインは一致しませんので気をつけてください.
私は専用のコネクタを自作し,図4に示すように接続して利用しています.
私は専用のコネクタを自作し,図4に示すように接続して利用しています.
| 図4 PICとPICkit3との接続 |
以下からソースコードをダウンロードできます.(リンク先にてCtrl+SでZIP保存)
https://docs.google.com/open?id=0B25yKH5pEApFdE9mdFg3dzUyN0U
/*********************************************************************
*
* LEDチカチカ by Taku MIURA
*
*********************************************************************
* FileName: main.c
* Dependencies: plib.h
*
* Processor: PIC32MX
*
* Complier: MPLAB C32
* MPLAB X IDE v1.30
* Company: Microchip Technology Inc.
********************************************************************/
// pin_1 <<MCLR>>
// pin_2 PGED3
// pin_3 PGEC3
// pin_4 RB0
// pin_5 RB1
// pin_6 RB2
// pin_7 RB3
// pin_8 <<Vss>>
// pin_9 RA2
// pin_10 RA3
// pin_11 RB4
// pin_12 RA4
// pin_13 <<Vdd>>
// pin_14 RB5
// pin_15 <<Vbus>>
// pin_16 RB7
// pin_17 RB8
// pin_18 RB9
// pin_19 <<Vss>>
// pin_20 <<Vcap>>
// pin_21 RB10
// pin_22 RB11
// pin_23 <<VUSB3V3>>
// pin_24 RB13
// pin_25 RB14
// pin_26 RB15
// pin_27 <<AVss>>
// pin_28 <<AVdd>>
#include <plib.h>
#include <stdlib.h>
// SYSCLK = 40 MHz (8MHz Crystal/ FPLLIDIV * FPLLMUL / FPLLODIV)
// PBCLK = 40 MHz
#define SYSCLK 40000000L //システムクロック
#define SYSCLKdiv10MHz (SYSCLK/10000000) //ディレイ関数用
// Configuration Bit settings
// DEVCFG3:
#pragma config IOL1WAY = OFF // Peripheral Pin Select Configuration
// DEVCFG2:
#pragma config FPLLODIV = DIV_2 // PLL Output Divider
#pragma config UPLLEN = OFF // USB PLL Enabled
#pragma config UPLLIDIV = DIV_2 // USB PLL Input Divider
#pragma config FPLLMUL = MUL_20 // PLL Multiplier
#pragma config FPLLIDIV = DIV_2 // PLL Input Divider
// DEVCFG1:
#pragma config FWDTEN = OFF // Watchdog Timer
#pragma config WDTPS = PS1 // Watchdog Timer Postscale
#pragma config FCKSM = CSDCMD // Clock Switching & Fail Safe Clock Monitor
#pragma config FPBDIV = DIV_1 // Peripheral Clock divisor
#pragma config OSCIOFNC = OFF // CLKO Enable
#pragma config POSCMOD = OFF // Primary Oscillator
#pragma config IESO = OFF // Internal/External Switch-over
#pragma config FSOSCEN = OFF // Secondary Oscillator Enable (KLO was off)
#pragma config FNOSC = FRCPLL // Oscillator Selection
// DEVCFG0:
#pragma config CP = OFF // Code Protect
#pragma config BWP = ON // Boot Flash Write Protect
#pragma config PWP = OFF // Program Flash Write Protect
#pragma config ICESEL = ICS_PGx3 // ICE/ICD Comm Channel Select
#pragma config JTAGEN = OFF // JTAG Enable
#pragma config DEBUG = OFF // Background Debugger Enable
void delay_us(unsigned int usec);
void delay_ms(unsigned int msec);
int main(void)
{
//System Setting
SYSTEMConfigPerformance(SYSCLK); //システム最適設定
mJTAGPortEnable(DEBUG_JTAGPORT_OFF); //PORTA is used I/O, JTAG port must be disabled.
mPORTAClearBits( BIT_4 | BIT_3 | BIT_2 | BIT_1 | BIT_0 );
mPORTASetPinsDigitalOut( BIT_4 | BIT_3 | BIT_2 | BIT_1 | BIT_0 );
ConfigCNBPullups(CNB13_PULLUP_ENABLE);//RB13をプルアップ
mPORTBClearBits( BIT_5 ); //RB5をLowに
mPORTBSetPinsDigitalIn( BIT_13 ); //RB13を入力
mPORTBSetPinsDigitalOut( BIT_5 ); //RB5を出力
mPORTBSetBits( BIT_5 ); //RB5をHighに
delay_ms(2000); //2秒待機
mPORTBClearBits( BIT_5 ); //RB5をLowに
delay_ms(2000); //2秒待機
while(1)
{
mPORTBToggleBits( BIT_5 ); //RB5の出力状態を反転
if(mPORTBReadBits( BIT_13 )) //RB13の入力状態がhighなら1
delay_ms(500); //0.5秒待機
else
delay_ms(250); //0.25秒待機
}
}
/**********************************
* ディレイ関数 usec
**********************************/
void delay_us(unsigned int usec){
unsigned int i, delay;
delay = usec * SYSCLKdiv10MHz;
for(i=0; i<delay; i++){}
}
/**********************************
* ディレイ関数 msec
**********************************/
void delay_ms(unsigned int msec){
unsigned int i;
for(i=0; i<msec; i++)
delay_us(1000);
}
MPLABにて,(メニュー),OpenProjectで解凍したファルダを選択し,
図5のようにPICkit3を接続した状態でこのプロジェクトに対して右クリック,Runを選択.
これでコンパイルから書き込みまで行なってくれます.
ちなみに「Set as Main Project」を選択すると,キーボードのF6を押すだけでRunを実行します.
LEDが1秒周期で点滅し,RB13をジャンパ線でGNDに短絡させると0.5秒周期で点滅するはずです.
図5のようにPICkit3を接続した状態でこのプロジェクトに対して右クリック,Runを選択.
| 図5 MPLABにおけるRunの実行方法 |
これでコンパイルから書き込みまで行なってくれます.
ちなみに「Set as Main Project」を選択すると,キーボードのF6を押すだけでRunを実行します.
LEDが1秒周期で点滅し,RB13をジャンパ線でGNDに短絡させると0.5秒周期で点滅するはずです.
不明な点,ミスやご指摘等がありましたらコメント等で連絡ください.
