• メインページ
  • データ構造
  • ファイル
  • ファイル一覧
  • グローバル

OpenSSM/libdac.c

説明を見る。
00001 /**************************************************************************************************
00002     Title           : DAC Driver
00003     Programmer      : Yosuke FURUSAWA
00004     Copyright       : Copyright (C) 2010 Yosuke FURUSAWA.
00005     License         : 4-clause BSD License
00006     Since           : 2010/05/22
00007 
00008     Filename        : libdac.c
00009     Last up date    : 2010/05/23
00010     Kanji-Code      : Shift-JIS
00011     TAB Space       : 4
00012 
00013     Note            : Single Channel Output
00014 **************************************************************************************************/
00015 
00016 
00017 /*================================================================================================
00018 ヘッダファイルをインクルード
00019 =================================================================================================*/
00020 #include <p24FJ64GA002.h>
00021 
00022 #include "types.h"
00023 
00024 #include "librtc.h"
00025 #include "libdac.h"
00026 
00027 
00028 /*=================================================================================================
00029 マクロ定義
00030 =================================================================================================*/
00031 
00032 
00033 /*=================================================================================================
00034 グローバル変数
00035 =================================================================================================*/
00036 unsigned char dac = 0;
00037 
00038 
00039 /*=================================================================================================
00040 プロトタイプ宣言
00041 =================================================================================================*/
00042 
00043 
00044 /**************************************************************************************************
00045 DAC 初期化
00046 **************************************************************************************************/
00047 void DAC_init(void)
00048 {
00049     dac = 0;
00050 
00051 #if defined(DAC_STANDARD)
00052     /* 内蔵 4bit DAC : 精度が悪くて、思ったよりも全然使い物にならない... */
00053     CVRCON = 0b0000000011100000;
00054 
00055 
00056 #elif defined(DAC_PWM)
00057     /* PWMを想定して回路を設計していなかったので、出力が非線形すぎて使い物にならない (^^; */
00058     OC5CON = 0b0000000000000110;
00059     RPOR7bits.RP14R = 22;
00060 
00061 #elif defined(DAC_STDPWM)
00062     /* 内蔵 4bit DACを使って、PWM風に精度を拡張してみる... (^^;;; */
00063     CVRCON = 0b0000000011100000;
00064 
00065     /* Timer2に寄生する */
00066     OC4R   = 0x0001;
00067     OC4CON = 0b0000000000000001;
00068     IPC6bits.OC4IP = 5;
00069     IEC1bits.OC4IE = 1;
00070     IFS1bits.OC4IF = 0;
00071 
00072     OC5R   = PR2 >> 1;                      /* 50% Duty */
00073     OC5CON = 0b0000000000000001;
00074     IPC10bits.OC5IP = 5;
00075     IEC2bits.OC5IE  = 1;
00076     IFS2bits.OC5IF  = 0;
00077 
00078 #endif
00079 
00080     DAC_setvalue(0x80);
00081     return;
00082 }
00083 
00084 
00085 /**************************************************************************************************
00086 DAC出力設定
00087 **************************************************************************************************/
00088  void DAC_setvalue(unsigned char buf)
00089 {
00090     dac = buf;
00091 
00092 #if defined(DAC_STANDARD)
00093     CVRCONbits.CVR = dac >> 4;
00094 
00095 #elif defined(DAC_PWM)
00096     OC5RS = (long)((long)dac * (long)PR2) >> 8;
00097 
00098 #elif defined(DAC_STDPWM)
00099     OC5R  = (((dac & 0x0f) * PR2) >> 4) + 2;
00100 
00101 #endif
00102 
00103     return;
00104 }
00105 
00106 
00107 /**************************************************************************************************
00108 CVREFと OC4/5を使った PWMで精度を拡張
00109 **************************************************************************************************/
00110 #if defined(DAC_STDPWM)
00111 
00112 void __attribute__((interrupt, auto_psv)) _OC4Interrupt(void)
00113 {
00114     IFS1bits.OC4IF = 0;
00115     CVRCONbits.CVR = dac >> 4;
00116     OC4CON = 0b0000000000000001;
00117     return;
00118 }
00119 
00120 void __attribute__((interrupt, auto_psv)) _OC5Interrupt(void)
00121 {
00122     IFS2bits.OC5IF = 0;
00123     CVRCONbits.CVR--;
00124     OC5CON = 0b0000000000000001;
00125     return;
00126 }
00127 
00128 #endif
00129 
00130 

OpenSSMに対してThu Sep 9 2010 00:03:04に生成されました。  doxygen 1.7.1