2016-09-28 20:09 | カテゴリ:PIC応用回路
プログラムメモリーも大きくなって、機能がアップした、PIC 16F1938です。

PIC16F1938.jpg

当然なんでしょうが、PIC16F876Aとは、全く設定が違っていて、はまりました。
反面教師で、皆さんのご参考にどうぞ。

続きは、、、

このミドルレンジのPICは、数年前にリリースされたもので、従来の16Fシリーズと比較して、メモリー容量や機能が大幅に強化されています。
私のとっての一番の理由は、プログラムメモリーが、二倍になった事です。
先日製作した、MIDIシーケンサーは、思った以上にプログラムメモリーを消費して、これ以上機能を追加できなくなりました。
そこで、この16F1シリーズを使用したかったのですが、現在使用している秋月のPICライターは対応していませんでした。

そこで、まず、PICKit3なるマイクロチップ社のライターを導入しました。
と言っても、互換機の「なんちゃって」版ですが。
それでもちゃんと接続ができて、問題なく使用できています。

16完成



さて、道具はそろいましたので、早速、秋月さんへPIC16F1938を注文。
到着して、16F876Aで作成したMIDIシーケンサー・プログラム(XC8)を変更し、16F1シリーズに対応できるようにします。

データシートを見ると、ピン配置は同じですが、機能が増えた分、設定をしないと動かないみたいです。

PIN配置


このPIN配置図を見るだけで、いかに多くの機能が詰め込まれているか、またそれをかなり柔軟に使い分けることができるか、がお分かりになると思います。

さて、プログラムをする際のPICの初期設定ですが、いろいろ、カット&トライして、なんとか動くようになりましたので、その際の設定をご紹介します。


設定の変更点をあげると、

AD変換ピンのアサイン、クロックの設定、が大きなところです。
また、今までの秋月PICライターとPICKit3のCONFIG設定の違いもありました。

まとめますと。

レジスター関連の設定(通常のPORT設定以外で)
これは、ANALOGを使用しない設定です。
すべてのポートはデジタル入出力になります。

  //---- PIC16F193X特有レジスタ設定 ---------------------------
OSCCON = 0b00000000; // HS
ANSELA = 0b00000000; // PORTAの設定(0=Digital I/O, 1=Analog in)
ANSELB = 0b00000000; // PORTBの設定(0=Digital I/O, 1=Analog in)
ADCON0 = 0b01110000; // AD ch 未接続
ADCON1 = 0b00000000; // 未使用にする
APFCON = 0b00000000;
CCP1CON = 0b00000000;
CCP2CON = 0b00000000;
CCP3CON = 0b00000000;
//--------------------------------------------------------------

上記をプログラム中に記載して、PICの設定としました。
上記以外の通常の設定(割込み、ポート設定など)は、旧PICと同じです。

TRISA = 0b00010000; //FootSW
TRISB = 0b11110000;
TRISC = 0b10011000; // RX=RC7,i2cは入力モードに設定
PORTC = 0;

//-----------------------
// PIC 割り込み処理設定
//-----------------------

//PortB変化割り込み使用しない
PIR1 = 0;
PIR2 = 0;
PIE1 = 0;
PIE2 = 0;
//-------------------------------------------------
// INTCONbits.RBIE = 1; // ポートB変化割り込み設定
//-------------------------------------------------
INTCONbits.GIE = 0; //グローバル割り込み指定(割り込み中断)

INTCONbits.TMR0IE = 1; // TMR0 のオーバーフロー割り込み
INTCONbits.INTE = 0; //外部割り込み(RB0/INT)割り込み指定ビット *
//INTCONbits.RBIE = 0; //ポートB変化割り込み指定
PIE1bits.TMR1IE = 0; //タイマー1オーバーフロー割り込み指定

//-----------------------------------------------------------
// 割り込みフラグリセット
//-----------------------------------------------------------
INTCONbits.TMR0IF = 0; //タイマー0割り込みフラグリセット
INTCONbits.INTF = 0; //外部割込み(RB0)の割り込みリセット *
//INTCONbits.RBIF = 0; //Bポート変化割り込みリセット
PIR1bits.TMR1IF = 0; //TMR1IF : TMR1オーバーフロー割り込みフラッグ

//-------------------------------------------------------------
// OPTIONレジスタ設定
//-------------------------------------------------------------
OPTION_REG = 0b10000100;
//OPTION_REGbits.PBPU = 1; //プルアップ使用しない
//OPTIONbits.INTEDG = 0; // PortB0の立下りで割り込み発生
//OPTIONbits.TCS = 0; // タイマー入力クロック指定(0)
//OPTIONbits.T0SE = 0; //タイマーカウントアップエッジ指定
//OPTIONbits.PSA = 0; //タイマープリスケーラーTMR0タイマーに使用指定
//OPTIONbits.PS2 = 0; //プリスケール
//OPTIONbits.PS1 = 0;
//OPTIONbits.PS0 = 0; //プリスケーラのスケール値


加えて、MPLABXには、PICKit3を使用する際に、CONFIGRATIONを設定するメニューがあります。
Mainメニューから、RUN->SetConfigrationBitで、設定可能内容が表示されます。

Configbit.jpg


ここで、各種設定をすれば、PICを書き込む際に指定項目が設定されます、と思っていたら、ここの設定はPICのプログラム中に書き込まなければならないのでした。
左の書き込みボタンをクリックして、プログラムの中に挿入する必要があります。

PLLEN.jpg


ここで、結構はまりました。

例えば、PLLの設定をPFFにしても、PICの動作が早い気がして、1秒のDELAYが、0.2-0.3秒になっています。
最後に、書き込みボタンに気づいて、それを設定したら、動作OKでした。(赤丸印)

下記のPLLENをOFFにします。


// PIC16F1938 Configuration Bit Settings
// 'C' source line config statements
// CONFIG1
#pragma config FOSC = HS
#pragma config WDTE = OFF
#pragma config PWRTE = ON
#pragma config MCLRE = ON
#pragma config CP = OFF
#pragma config CPD = OFF
#pragma config BOREN = ON
#pragma config CLKOUTEN = OFF
#pragma config IESO = ON
#pragma config FCMEN = ON


// CONFIG2
#pragma config WRT = OFF
#pragma config VCAPEN = OFF

#pragma config PLLEN = OFF // PLL Enable (4x PLL disabled)
~~~~~~~~~~~~~~~~
#pragma config STVREN = ON
#pragma config BORV = LO
#pragma config LVP = OFF

これを合わせてセットして、どうにかこうにか、PIC書き込みが成功しました。
動作もちゃんと確認できました。

これを元に、先日のMIDIシーケンサーをもう少し使いやすく改良していきます。


管理者のみに表示する