/******************************************************************************* * D/AコンバータにI2Cで接続して制御するサンプルプログラム1 * * * * メモ:DACのMCP4726を想定したプログラムです、DACのVOUTにはLEDを配線していす。 * * VDD=5V,VREF=3.3Vの配線を行っています。 * * 動作は、電源ON→5秒後全点灯(5V)→5秒後半点灯(3.3V)→5秒後消灯→終了 * * DACのEEPROMに書込む事は行っていません。 * * "skI2Clib.h"はマルチマスター対応ですが、このプログラムは未対応なので * * マルチマスター動作は不可です。 * * * * ============================================================================ * * VERSION DATE BY CHANGE/COMMENT * * ---------------------------------------------------------------------------- * * 1.00 2016-01-20 きむ茶工房(きむしげ) Create * * ============================================================================ * * PIC 12F1822 * * MPLAB X(v2.15) * * MPLAB(R) XC8 C Compiler Version 1.32 * *******************************************************************************/ #include #include "skI2Clib.h" #define DAC_ADRES 0x60 // D/Aコンバータのアドレス(MCP4726) #define _XTAL_FREQ 8000000 // 使用するPIC等により動作周波数値を設定する // コンフィギュレーション1の設定 #pragma config FOSC = INTOSC // 内部クロック使用する(INTOSC) #pragma config WDTE = OFF // ウオッチドッグタイマー無し(OFF) #pragma config PWRTE = ON // 電源ONから64ms後にプログラムを開始する(ON) #pragma config MCLRE = OFF // 外部リセット信号は使用せずにデジタル入力(RA3)ピンとする(OFF) #pragma config CP = OFF // プログラムメモリーを保護しない(OFF) #pragma config CPD = OFF // データメモリーを保護しない(OFF) #pragma config BOREN = ON // 電源電圧降下常時監視機能ON(ON) #pragma config CLKOUTEN = OFF // CLKOUTピンをRA4ピンで使用する(OFF) #pragma config IESO = OFF // 外部・内部クロックの切替えでの起動はなし(OFF) #pragma config FCMEN = OFF // 外部クロック監視しない(OFF) // コンフィギュレーション2の設定 #pragma config WRT = OFF // Flashメモリーを保護しない(OFF) #pragma config PLLEN = OFF // 動作クロックを32MHzでは動作させない(OFF) #pragma config STVREN = ON // スタックがオーバフローやアンダーフローしたらリセットをする(ON) #pragma config BORV = HI // 電源電圧降下常時監視電圧(2.5V)設定(HI) #pragma config LVP = OFF // 低電圧プログラミング機能使用しない(OFF) /******************************************************************************* * 割り込みの処理 * *******************************************************************************/ void interrupt InterFunction( void ) { InterI2C() ; // I2C関連の割り込み処理 } /******************************************************************************* * DACout(adres,value) * * D/Aコンバータにデータを出力する処理(EEPROMには書込まない) * * * * adres : 出力するデバイスのアドレスを指定します(0x60/0x61) * * value : 出力する電圧のステップ数を指定します(0-4095) * *******************************************************************************/ void DACout(char adres,int value) { union { char c[2] ; int i ; } dt ; int ans ; dt.i = value ; ans = I2C_Start(adres,RW_0); // スタートコンディションとアドレスを発行する if (ans == 0) { I2C_Send(dt.c[1] & 0x0f) ; // "Fast Mode","Normal Mode","data(D11-D8)" I2C_Send(dt.c[0]) ; // data(D7-D0) } I2C_Stop() ; // ストップコンディションを発行する } /******************************************************************************* * DACpowerdown(adres,stage) * * D/Aコンバータをパワーダウンさせる処理(EEPROMには書込まない) * * * * adres : 出力するデバイスのアドレスを指定します(0x60/0x61) * * stage : パワーダウンさせる段階を指定します(1/2/3) * * 1=1KΩの負荷抵抗にてGNDに設置させる場合に指定 * * 2=100(125)KΩの負荷抵抗にてGNDに設置させる場合に指定 * * 3=500(640)KΩの負荷抵抗にてGNDに設置させる場合に指定 * *******************************************************************************/ void DACpowerdown(char adres,char stage) { int ans ; ans = I2C_Start(adres,RW_0); // スタートコンディションとアドレスを発行する if (ans == 0) { I2C_Send(stage<<4) ; // "Fast Mode","PowerDown Mode","data(D11-D8)" I2C_Send(0x00) ; // data(D7-D0) dataは0とする } I2C_Stop() ; // ストップコンディションを発行する } /******************************************************************************* * DACconfigSet(adres,vref,g) * * コンフィギュレーションにデータをセットする処理(EEPROMには書込まない) * * この関数は、MCP4726用でMCP4725は利用出来ない * * * * adres : 出力するデバイスのアドレスを指定します(0x60) * * vref : 電圧リファレンスの設定です(1/2/3) * * 0/1=VDD 2=VREF(バッファ無し) 3=VREF(バッファ有り) * * g : 出力ゲインの設定です。(0=1x 1=2x) * *******************************************************************************/ void DACconfigSet(char adres,char vref,char g) { unsigned char c ; int ans ; ans = I2C_Start(adres,RW_0); // スタートコンディションとアドレスを発行する if (ans == 0) { c = 0x80 | (vref<<3) | g ; // パワーダウンは"Normal Mode"とする I2C_Send(c) ; // "Write Volatile Configuration Bits"の送信 } I2C_Stop() ; // ストップコンディションを発行する } /******************************************************************************* * メインの処理 * *******************************************************************************/ void main() { OPTION_REG = 0b00000000 ; // デジタルI/Oに内部プルアップ抵抗を使用する OSCCON = 0b01110010 ; // 内部クロックは8MHzとする ANSELA = 0b00000000 ; // アナログは使用しない(すべてデジタルI/Oに割当てる) TRISA = 0b00000110 ; // ピンはRA1(SCL)/RA2(SDA)のみ入力(RA3は入力専用) WPUA = 0b00000110 ; // RA1/RA2は内部プルアップ抵抗(I2C用)を指定する PORTA = 0b00000000 ; // 出力ピンの初期化(全てLOWにする) InitI2C_Master(0) ; // I2Cの初期化処理(100KHzの通信速度) __delay_ms(5000) ; DACout(DAC_ADRES,4095) ; // DACに4095(5V)を出力する(LED全灯) __delay_ms(5000) ; DACconfigSet(DAC_ADRES,2,0) ; // VDDからVREF(3.3V)に切換える(LED半灯) __delay_ms(5000) ; DACpowerdown(DAC_ADRES,3) ; // DACをパワーダウンさせる(LED消灯) while(1) { } }