Darkside(https対応しました) |
2018年7月3日(火) 21:41
クロックが発振しLED点灯も可能になったので、今度はボタンを押している間だけ点灯させてみる。はい、危惧した通り反応がありません。
入力ピンに電圧を直接与えた場合の挙動が妙で、どうやら入力端子が浮いている感じ。そこで、スイッチ周りの配線をチェックし、ジャンパーを1本飛ばし忘れているのを発見。修正すると、ちゃんとボタンに反応してLEDが点滅するようになった。
これで、デジタル出力とデジタル入力の試験が終了。
ならばと、アナログ入力に進む。
2番ピンにボリュームが接続してある。その値を読み、LEDの点滅DUTYを変化させる。これも最初は案の定で、全く反応していない。
ADCは元のサンプルプログラムが12ビット1系統入力なのに対し、10ビット3系統入力に変更した。それだけに、一発で動く可能性は低いと思っていた。しかし、いざ動かないとなると、どこが悪いのか分からない。まずは、ハードを確認。ボリュームを動かすことで、2番ピンの電位は想定通りに変化するか?
これは、大丈夫だった。となると、問題はソフト側だ。
コンフィギュレーション・レジスターというのは、dsPIC 内部の配線接続を変更する。よって、内部の配線接続がどうなっているかを示すデーターシートのブロックダイヤグラムを見ることなくして、コンフィギュレーション・レジスターは設定できない。
今回は、AN0 と AN1 と AN2 をアナログ入力で使いたい。3系統という設定は無いので、いちおう AN3 まで含めた4系統で設定を行い、最後に AN3 は未使用という設定にする。

ブロックダイヤグラムを見なければ、AN0 → CH1、AN1 → CH2、AN2 → CH3、AN3 → CH0 という組み合わせしか選べないことにだって気付けない。コンフィギュレーション・レジスターの説明だけ見ても、何をどうすれば良いか分からないだろう。
念入りに設定を行い、無事にボリュームでLEDのDUTYを変化させることに成功。
void InitADC( void )
{
/* ADPCFG: ADC Port Configuration Register */
// Set all ports digital
AD1PCFGL = 0xFFFF;
AD1PCFGLbits.PCFG0 = 0; // AN0 analog
AD1PCFGLbits.PCFG1 = 0; // AN1 analog
AD1PCFGLbits.PCFG2 = 0; // AN2 analog
// デバイスアイドル中も変換する
AD1CON1bits.ADSIDL = 0;
/* Select 10-bit, 4 channel ADC operation */
AD1CON1bits.AD12B = 0;
/* 符号付き固定小数 Signed Fractional */
AD1CON1bits.FORM = 0; // サンプルプログラムでは3にする(符号付き固定小数) 電圧利用とかなら0にする(0 to 1023)
/* Internal Counter Ends Sampling and Starts Conversion */
AD1CON1bits.SSRC = 3;
/* 複数チャンネル同時サンプル */
AD1CON1bits.SIMSAM = 1;
/* Sampling begins immediately after last conversion */
AD1CON1bits.ASAM = 1;
// ADC サンプル有効化
AD1CON1bits.SAMP = 1;
// CH1=AN0 CH2=AN1 CH3=AN2 (CH0=AN3)
/* Vref = AVdd/AVss */
AD1CON2bits.VCFG = 0;
// CH0+スキャン入力
AD1CON2bits.CSCNA = 1;
/* 4 channel scan */
AD1CON2bits.CHPS = 3;
/* SMPI = 1 per interrupt */
AD1CON2bits.SMPI = 0;
// 常に0番地からバッファ書き込み
AD1CON2bits.BUFM = 0;
// Use MUX A */
AD1CON2bits.ALTS = 0;
/* Set Samples and bit conversion time */
AD1CON3 = 0x032F; //そのまま
/* CH1, CH2, CH3 negative input is VREFbit */
/* CH1 positive input is AN0, CH2 positive input is AN1, CH3 positive input is AN2 */
AD1CHS123 = 0x0000;
/* AN0,AN1,AN2 to Scan */
AD1CSSL = 0x0007; //そのまま
/* Channel select AN3 */
AD1CHS0 = 0x0003;
/* Reset ADC interrupt flag */
IFS0bits.AD1IF = 0;
/* Enable ADC interrupts, disable this interrupt if the DMA is enabled */
IEC0bits.AD1IE = 1;
/* Turn on ADC module */
AD1CON1bits.ADON = 1;
}
written by higashino [ドリル戦車] [この記事のURL] [コメントを書く] [コメント(0)] [TB(0)]
Generated by MySketch GE 1.4.1
Remodelling origin is MySketch 2.7.4