dsPIC33Fの基本動作から応用プログラムまでを学びます。

ホーム
16F18313
16F18325
16F18346
16F1619
Curiosity
---
---
    
12F1822
16F1455
16F1459
18F14K50
18F26J50
dsPIC
その他
Starter Kit for dsPIC にLCD表示を取り付け (ソフトウエア)

Starter Kit のハード改造で取り付けた、汎用入力とLCD用出力の動作確認のために、汎用入力に取り付けたボリュームの値をADCで読み、LCDにその10進値を表示するプログラムを作成しました。 内部クロック7.37MHzをPLLで80MHzにしてdsPICを最高速度の40MHz命令クロックで動作させています。 出力は、UARTで9600bpsのシリアルデータとして、出力します。 XBeeシリアル受信機 の本体部分に入力し結果を表示させています。

プロジェクトファイル

プロジェクトファイル dsP02_LCDADC.zip

/*********************************************************************
 AN4の電圧を12bit AD変換し、10進でシリアルLCDに文字表示
 変換は、プログラムでSAMPをクリアすると開始
 DMAは使用していない
*********************************************************************/

#define FCY 39613750UL    //7.37MHz clockから生成

#include <p33FJ256GP506.h>
#include <libpic30.h>
#include "L_sLCD.h"
#include <stdio.h>

// コンフィグラーション
_FGS(GWRP_OFF & GCP_OFF);
_FOSCSEL(FNOSC_FRC);
_FOSC(FCKSM_CSECMD & OSCIOFNC_ON & POSCMD_NONE);
_FWDT(FWDTEN_OFF);

// プロトタイプ
void Init_ADC(void);

int main (void){
    char msgDsp[21];
    unsigned int result;
    // ---------------------------------------------------
    // Fcy 40MHz動作のため内部クロックをPLLで80MHzにする
    // Fosc= Fin*M/(N1*N2), Fcy=Fosc/2 (25.2ns)
    // Fosc= 7.37M*43/(2*2)=79.2275Mhz
    PLLFBD=41;                        // M  = 43
    CLKDIVbits.PLLPOST=0;             // N1 = 2
    CLKDIVbits.PLLPRE=0;              // N2 = 2
    OSCTUN=0;
    __builtin_write_OSCCONH(0x01);    // FRCからPLLに切替
    __builtin_write_OSCCONL(0x01);
    while (OSCCONbits.COSC != 0b01);  // PLLの安定を待つ
    while (!OSCCONbits.LOCK);
    // ---------------------------------------------------
    Init_ADC();                       // AD変換の初期化
    // ---------------------------------------------------
    LCD_int();                        // LCD初期化
    LCD_posyx(1,0);                   // 2行目に表示
    LCD_str("A/D val = ");
    // --------------------------------------------
    while(1){
        AD1CON1bits.SAMP = 0;         // ADC開始
        while(!AD1CON1bits.DONE);     // 完了を待つ
        result = ADC1BUF0;            // 結果を取得
        LCD_posyx(1,10);              // 2行目に
        sprintf(msgDsp,"%4d",result); // 10進に変換し
        LCD_str(msgDsp);              // LCDに表示
        __delay_ms(200);
    }
}

// ******************* AD変換の初期化 ****************************
// ---------------------------------------------------------------
//  AD1CON1 =0x0404;
//    * 12 bit ADC、符号なし整数
//    * SAMPクリアで変換開始
//    * 変換終了でサンプル開始
// ---------------------------------------------------------------
void Init_ADC(void){
    _ADON    = 0;          // ADC OFF
    _ADSIDL  = 0;          // Idle時にも動作
    _ADDMABM = 0;          // Scatter/Gatherモード(DMAでないのでNA)
    _AD12B   = 1;          // 12bit ADC
    _FORM    = 0;          // 符号なし整数
    _SSRC    = 0;          // SAMPを[0]でサンプル終了し変換開始
    _SIMSAM  = 0;          // AD12B=[1]なのでNA
    _ASAM    = 1;          // 変換終了後すぐにサンプル開始
    _SAMP    = 0;          // サンプル終了し変換開始
// ---------------------------------------------------------------
//  AD1CON2 =0x0000;
//    * 基準電圧 AVdd : AVss ,
//    * channel 0 使用、スキャンなし
// ---------------------------------------------------------------
    _VCFG    = 0;          // VREF+:AVDD、VREF-:AVSS
    _CSCNA   = 0;          // スキャンしない
    _CHPS    = 0;          // AD12B=[1]なのでNA
    _SMPI    = 0;          // 変換後毎回+1(DMA使用しないのでNA)
    _BUFM    = 0;          // DMA転送は毎回バッファの先頭から
    _ALTS    = 0;          // 入力はSampleA回路のみ
// ---------------------------------------------------------------
//  AD1CON3 =0x0010;
//    * Tad=17*Tcy=428ns > 117.6ns
//    * 変換周期は、7.3us (141ksps)
// ---------------------------------------------------------------
    _ADRC    = 0;          // システムクロックを分周して使用
    _SAMC    = 0;          // SSRC=[1]なのでNA
    _ADCS    = 16;         // Tad=(16+1)*Tcy=428ns > 117.6ns
// ---------------------------------------------------------------
//  AD1CHS0 =0x0404;
//    * 入力 AN4
// ---------------------------------------------------------------
    _CH0NB   = 0;          // SampleBの負入力:VREF-
    _CH0SB   = 4;          // SampleBの正入力:AN4
    _CH0NA   = 0;          // SampleAの負入力:VREF-
    _CH0SA   = 4;          // SampleAの正入力:AN4

// ---------------------------------------------------------------
  AD1CSSL =0x0000;         // スキャンしない
// ---------------------------------------------------------------
  AD1PCFGL=0xFFEF;         // AN4 input is Analog
// ---------------------------------------------------------------
  _PCFG4   = 0;            // AN4をアナログ入力に設定
// ---------------------------------------------------------------
  AD1CON1bits.ADON =1;     // ADC ON
}