• 追加された行はこの色です。
  • 削除された行はこの色です。
閲覧総計:&counter();  (本日:&counter(today);  昨日:&counter(yesterday);)~
 *A/D價でLEDの蓂るさ匾曬(PWM LCD表示 16F1827 XC8) [#nbfbd5fa]
 
 PICに液晶ディスプレー(LCD)が接続できる様になると、PICの動いている状態
 をビジュアルで確認出来る様になりとても便利です。
 PICの細かな動きが数値で確認できる様になり、細かい補正を行う事が可能に
 なります。
 LCDへの数値表示により、今回はADC値(50-1023)を-50補正しPWMのduty値
 (0-973)にするのが良い事の気付きがありました。
 
 機能:可変抵抗器のアナログ値をデジタル変換し、その値でPWMのduty値を変化
 させLEDの明るさをなめらかに変更する。また、dutycycle値、duty値をLCDに
 表示する。                 2014/1/11
 
 |&attachref(TS3V0016.JPG,zoom,200x300,button){新しい写真添付};|&attachref(duty17%のロジアナ画面.jpg,zoom,200x250,button){新しい写真添付};|&attachref(adc値でLED明るさ変更LCDに値表示プログラム画面.jpg,zoom,200x250,button){新しい写真添付};|
 
  /* A/D値で発光ダイオード(LED)の明るさをPWM機能で変更する
   * またPWMのduty値をI2C LCDに表示する
   * PIC16F1827
   * XC8 v1.20
   * LED:RA2,RA3
   * 可変抵抗(10kΩ):RB5
   * I2C SDA:SDA1(RB1) pin7
   * I2C SCL:SCL1(RB4) pin10
   */
  #include <xc.h>
  #pragma config FOSC = INTOSC, WDTE = OFF, BOREN = OFF, IESO = OFF, FCMEN = OFF
  #pragma config PLLEN = OFF, STVREN = OFF, LVP = OFF
  
  //__delay_us(), __delay_ms()へのクロック情報の設定
  #define _XTAL_FREQ 8000000 //PICのクロックをHzで設定(8MHz)
  
  //関数のプロトタイプ宣言
  extern void itostring(char digit, unsigned int data, char *buffer);
  extern unsigned int read_a2d(unsigned char channel);
  extern void arg_delay_ms(unsigned int x);
  
  void i2cByteWrite(char, char, char);    // i2c byte送信
  void i2cTxData(char);                   // i2c SSPBUF セット
  void LCD_dat(char);                     // 1文字表示
  void LCD_cmd(char);                     // コマンド出力
  void LCD_clr(void);                     // 全消去
  void LCD_int(void);                     // 初期化
  void LCD_str(char *);                   // 文字列表示
  void LCD_ROMstr(const char *);          // ROM文字列表示
  void LCD_posyx(char,char);              // カーソル位置指定
  void LCD_hex(char);                     // 16進文字変換表示
  
  int main(void) {
      //使用変数の定義
      unsigned int adc_val; //ADC値の結果(0-1023)
      unsigned int dutycycle; //PWM duty(0〜1000)
      unsigned char s_dutycycle[6]; //LCD表示用文字列
      unsigned int duty; //duty%値
      unsigned char s_duty[6]; //LCD表示用文字列
  
      //PICの初期設定
      PORTA = 0b00000000; //PORTAの中身をきれいにする
      PORTB = 0b00000000; //PORTBの中身をきれいにする
      TRISA = 0b00000000; //PORTA全てを0:出力に設定
      TRISB = 0b11111111; //PORTBは全て1:入力に設定
      ANSELA = 0b00000000; //RA4(AN4)-RA0(AN0)は全て0:デジタルI/Oとする
      ANSELB = 0b00100000; //RB5(AN7)のみ1:アナログ、他は0:デジタルI/Oとする
      OSCCON = 0b01110000; //PLL:OFF, 内部クロック8MHzで駆動
      OPTION_REGbits.nWPUEN = 0; // 0:PORTB内部プルアップ利用に設定
      WPUBbits.WPUB1 = 1; // RB1をI2C通信のウィークプルアップ
      WPUBbits.WPUB4 = 1; // RB4をI2C通信のウィークプルアップ
  
      //CCP3(RA3)へPWM信号を出力(Timer2使用)
      //PWM各種設定値の計算
      //クロック8MHz Tosc = 0.125μsの時
      //2000HzのPWM信号を発信する場合
      //
      //周期 = 2000Hz = 1/2000 = 500μs
      //(PR2の範囲は0〜255)
      //Timer2のプリスケール 4
      //周期 = (PR2 + 1) * 4 * Tosc * (Timer2のプリスケール値)であるから
      //PR2 = (周期 / (4 * Tosc * (Timer2のプリスケール値)) - 1
      //PR2 = (500 / (4 * 0.125 * 4)) - 1
      //PR2 = 249
      //
      //PWM分解能 DC1(Max)は
      //duty = DC1 * Tosc * (Timer2のプリスケール値)であるから
      //DC1 = duty / (Tosc * (Timer2のプリスケール値))
      //DC1(Max) = 500 / (0.125 * 4)
      //DC1(Max) = 1000
  
      //PWM各種条件設定
      //CCP3(RA3)へPWM信号を出力
      CCPTMRS = 0b00000000; //CCP3はTimer2使用に設定
      CCP3CON = 0b00001100; //PWMモードを使用する
      T2CON = 0b00000001; ////プリスケール 4に設定
      PR2 = 249; //PWM周波数2000Hzに設定
      TMR2 = 0; //Timer2カウンターをクリアー
      T2CONbits.TMR2ON = 1; //Timer2 ON
  
      //I2C通信の初期設定
      SSPCON1 = 0b00101000;          // I2Cマスターモード指定
      SSPSTAT = 0b00000000;          // I2C STATUSの設定
      SSPADD  = 19;                  // I2Cクロック周波数100KHz(=(19+1)*4/8MHz)
  
      //A2D変換開始
      ADCON1 = 0b10010000; //select right justify result, ADCS Fosc/8, A/D port configuratio  n 0
      ADCON0bits.ADON = 1; //ADON
  
      //メイン処理
      LATAbits.LATA2 = 1; //RA2:パワーオンを示すLED点灯(かつ照度比較用LED)
      LCD_int(); // LCD初期化
      LCD_ROMstr("duty val ="); // 1行目に表示
      LCD_posyx(1,0); // 2行目頭にカーソル移動
      LCD_ROMstr("duty% =");
  
      while(1) {
          //アナログデータの取得 10bit(0~1023)
          adc_val = read_a2d(7); //RB5(AN7)のアナログ値読み込み
          dutycycle = adc_val - 50; //ADC値をdutyに入力 -50は補正値
  
          //CCP3のdutycycle変更(LEDの明るさが変化する)
          //解像度10ビットのうち上位8ビットをCCPR3Lレジスタに格納
          CCPR3L = dutycycle >> 2;
          //解像度10ビットのうち下位2ビットをCCP3CONレジスタの4,5ビットへ格納
          CCP3CON |= (dutycycle & 0x0003) << 4;
  
          //duty値のLCD表示
          itostring(4, dutycycle, s_dutycycle); //数値の文字列への変換
          LCD_posyx(0,12); // 1行9文字目にカーソル移動
          LCD_str(s_dutycycle);
  
          duty = (dutycycle +5) / 10; //+5は四捨五入処理
          itostring(3, duty, s_duty); //数値の文字列への変換
          LCD_posyx(1,8); // 2行8文字目にカーソル移動
          LCD_str(s_duty); //duty%値の表示
          LCD_posyx(1,11); // 2行11文字目にカーソル移動
          LCD_ROMstr("%");
      }
  }
  
  /***************************************
  * int整数からASCII文字に変換
  ****************************************/
  void itostring(char digit, unsigned int data, char *buffer) {
      char i;
  
      buffer += digit;		     // 最後の数字位置
      *buffer = 0;                     //文字列終端
      for(i=digit; i>0; i--) {	     // 変換は下位から上位へ
          buffer--;		     // ポインター1
          *buffer = (data % 10) + '0'; // ASCIIへ
          data = data / 10;	     // 次の桁へ
      }
  }
  
  //引数のアナロポートのA2D変換(10bit仕様) 2014/1/2
  //PICC v9.81のsamplesフォルダ内のa2demo.cのプログラムを参考にアレンジ
  unsigned int read_a2d(unsigned char channel) {
      channel &= 0b00011111; //truncate channel to 5 bits
      ADCON0 &= 0b10000011; //clear current channel select
      ADCON0 |= (channel << 2); //apply the new channel select
      __delay_us(5); // アナログ変換情報が設定されるまで5μ秒待つ
      ADCON0bits.GO_nDONE = 1; // initiate conversion on the selected channel
      while (ADCON0bits.GO_nDONE) continue;
  
      return (ADRESH << 8) | ADRESL;
  }
  
  //待ち時間が変数設定できるarg_delay_ms()関数を定義
  //(__delay_ms()は引数に変数設定が出来ない為)
  void arg_delay_ms(unsigned int x) {
      while(x) {
          __delay_ms(1);
          x--;
      }
  }
  
  //-------- i2cで1byteデータを送信する -----------------------
  //  以下の引数が必要
  //  addr : Slaveのアドレス
  //  cont : Slaveへ制御コード
  //  data : 送信するデータ
  //  NACKやBus衝突などの対応は行っていない
  // -----------------------------------------------------------
  void i2cByteWrite(char addr, char cont, char data){
      SSPCON2bits.SEN = 1;           // Start condition 開始
      while(SSPCON2bits.SEN);        // Start condition 確認
      i2cTxData(addr);               // アドレス送信
      i2cTxData(cont);               // 制御コード送信
      i2cTxData(data);               // データ送信
      SSP1IF = 0;                    // 終了フラグクリア
      SSPCON2bits.PEN = 1;           // Stop condition 開始
      while(SSPCON2bits.PEN);        // Stop condition 確認
  }
  
  //-------- SSPBUFに1文字保存し送信終了を待つ -----------------
  void i2cTxData(char data){
      SSP1IF = 0;                    // 終了フラグクリア
      SSPBUF = data;                 // データセット
      while(!SSP1IF);                // 送信終了待ち
  }
  
  //-------- 1文字表示 --------------------------------------
  void LCD_dat(char chr){
      i2cByteWrite(0xA0, 0x80, chr);
      __delay_us(60);                // 60μsec
  }
  //-------- コマンド出力 --------------------------------------
  void LCD_cmd(char cmd){
      i2cByteWrite(0xA0, 0x00, cmd);
      if(cmd & 0xFC)                 // 上位6ビットに1がある命令
          __delay_us(60);            // 60usec
      else
          __delay_ms(3);             // 3msec ClearおよびHomeコマンド
  }
  //-------- 全消去 ------------------------------------------------
  void LCD_clr(void){
      LCD_cmd(0x01);                 //Clearコマンド出力
  }
  //-------- カーソル位置指定 --------------------------------------
  void LCD_posyx(char ypos, char xpos){
      unsigned char pcode;
      switch(ypos & 0x03){           // 縦位置を取得
          case 0: pcode=0x80;break;  // 1行目
          case 1: pcode=0xC0;break;  // 2行目
          case 2: pcode=0x94;break;  // 3行目
          case 3: pcode=0xD4;break;  // 4行目
      }
      LCD_cmd(pcode += xpos);        // 横位置を加える
  }
  //-------- 文字列出力 -----------------------------------------
  void LCD_str(char *str){
      while(*str)                    //文字列の終わり(00)まで継続
          LCD_dat(*str++);           //文字出力しポインタ+1
  }
  //-------- Rom 文字列出力 ------------------------------------
  void LCD_ROMstr(const char *str){
      while(*str)                    //文字列の終わり(00)まで継続
          LCD_dat(*str++);           //文字出力しポインタ+1
  }
  //-------- 16進文字変換表示 --------------------------------
  void LCD_hex(char c){
      const char hexch[] ="0123456789ABCDEF";
      LCD_dat(hexch[c >> 4]);        //上位4bit表示
      LCD_dat(hexch[c & 0xF]);       //下位4bit表示
  }
  
  //-------- 初期化 --------------------------------------
  void LCD_int(void){
      __delay_ms(100);               // 電源安定するまでの時間
      LCD_cmd(0x38);                 // 8bit 2行 表示命令モード
      LCD_cmd(0x0C);                 // Display on Cursor=0 Blink=0
      LCD_cmd(0x06);                 // Entry Inc/Dec=1 Shift=0
      LCD_cmd(0x01);                 // Clear Display
  }
 
 ★この情報は役に立ちましたか?
 #vote(はい[0],普通[0],いいえ[1])
 - 液晶ディスプレー→液晶ディスプレイ LED→LCD --  &new{2015-04-24 (金) 14:05:37};
 - http://www.coachcanadaoutlet.ca http://www.prada-outlet.us http://www.louboutinfemme-pascher.fr http://www.ralphlaurensale.eu.com http://www.jordan3.net http://www.louisvuitton-handbags.com.co http://www.poloralphlaurenhome.net http://www.abercrombie.net.co http://www.holister.name http://www.christian-louboutinoutlet.org http://www.rolexwatchesoutlet.us http://www.abercrombieandfitch.net.co http://www.coachoutletstoreonline.us.org http://www.katespade-outlet.us.com http://www.chanelhandbags.in.net http://www.longchamp-outlet.name http://www.jordan4.net http://www.raybans.name http://www.michaelkorsoutletus.eu.com http://www.louisvuittonoutlets.name http://www.airmax-nike.me.uk http://www.hollisterinc.name http://www.cheaptoms.us http://www.fendi.us.com http://www.michaelkorsoutlet-mk.eu.com http://www.hollister-clothing.net http://www.juicy-couture.us http://www.hollisterclothing.us http://www.pandorajewelry.net.co http://timberlandboots.hugeoff.net http://www.hollisterkids.net http://www.abercrombiestores.net http://www.louisvuittonoutlet-inc.us http://oakley.hugeoff.net http://www.ralph-lauren.net.co http://www.louis-vuitton.us.org http://www.louis--vuitton.us http://lululemon.suleymanaltun.com http://www.marc--jacobs.com http://www.airjordan-pascher.fr http://www.abercrombie.in.net http://www.louisvuitton-lvoutlet.me http://www.guccishoes.us.com http://www.coachoutlet.net.so http://www.michaelkorshandbags.com.so http://www.tory-burchoutlet.in.net http://www.rayban-sunglasses.com.co http://www.retrojordans.name http://www.concords11.com http://www.cheapjordansshoes.in.net http://www.p90xworkouts.us http://truereligion.officialbid.net http://www.guccioutlet.net.co http://burberry.stores.net.co http://www.michaelkorshandbags.eu.com http://www.edhardyclothing.in.net http://www.michaelkorsoutletonlinee.in.net http://www.chiflatiron.com.co http://www.oakleysunglassessale.in.net http://burberryoutlet.officialstore.com.co http://www.coachoutletstoreonline.eu.com http://www.gucci.net.co http://www.abercrombieandfitch.cc http://www.coach-outlet.us.com http://www.michaelkorsoutlet.net.so http://www.cocochaneluk.co.uk http://www.louisvuitton-outlet.us.com http://www.louisvuittonhandbags.net.co http://www.ralph-lauren-outlet.co http://www.louisvuittonuk.me.uk http://www.coach-outlet.us.org http://www.ray-bansunglasses.name http://www.louis-vuitton.net.co http://www.adidasshoes.name http://www.louis-vuittonoutlet.us.org http://www.true-religion-outlet.us.com http://www.michaelkorsonlineoutlet.in.net http://www.jordan13.org http://www.abercrombieoutlet.name http://www.kobeshoes.org http://www.hollister-co.net http://www.holisterclothingstore.com http://www.michaelkorsoutlet.com.so http://www.fitflops.org http://www.kobebryantshoes.name http://www.oakley-sunglasses.net.co http://www.kevindurantshoes.name http://www.pradauk.co.uk http://www.michaelkorsukpurse.co.uk http://www.gucci-outlet.org http://burberry.bidinc.org http://www.oakleysunglassescheap.name http://www.oakleysunglasses.us.com http://michaelkors.officialstore.com.co http://www.cheapsoccershoes.in.net http://www.coachoutlet-storeonline.in.net http://www.todsshoes.us http://www.jordan8.net http://www.christianlouboutinoutlet.org http://www.raybanglasses.me.uk http://www.abercrombieoutlet.us.com http://www.montblanc-pens.name http://www.christianlouboutin.name http://www.oakleysunglasses-wholesale.name http://www.raybansunglassesoutlet.name http://www.christianlouboutin-shoes.info http://www.raybansunglass.net.co http://www.ray-banoutlet.name http://www.michaelkors--outlet.in.net http://www.truereligion.eu.com http://www.coach-factoryoutlet.com.co http://www.outlet-celine.com http://www.christianlouboutinoutlet.com.co http://www.oakleysunglasses-outlet.name http://www.fitflop-shoes.us http://www.soccer-jerseys.us.com http://www.michaelkors.com.so http://www.todsoutlet.name http://www.cheap--nfljerseys.us.com http://www.abercrombie-fitch.cc http://www.tory-burch-outlet.name http://www.redchristianlouboutin.com http://www.hermes-birkin.us http://www.michaelkors-mkoutlet.in.net http://timberland.officialfree.net http://www.chanel-handbags.net.co http://www.christianlouboutinsale.name http://www.jordan11s.name http://www.pandorajewelry.name http://burberryoutlet.newestsite.net http://www.louisvuitton.us.com http://www.montblanc.com.co http://www.cheap-jordans.us.com http://www.toms--shoes.com http://beatsbydrdre.outletoff.net http://www.cheapjerseys-wholesale.us.com http://www.christianlouboutinsale.biz http://www.michael-korsoutletonline.eu.com http://www.abercrombiestore.org http://www.rayban-sunglasses.eu.com http://www.louis-vuittonhandbags.name http://www.oakley-sunglasses.com.co http://timberlandboots.dealsinc.net http://www.nike-airmax.me.uk http://www.jordan11.name http://www.saclongchamp--pascher.fr http://www.michaelkors-outlet.com.co http://www.gucci-outlet.name http://michaelkors.aphidsymposium.org http://www.cheaprolexwatches.name http://www.chanelbags.com.co http://www.toms-shoes.cc http://www.insanityworkout.com.co http://www.louisvuittonoutlet.net.co http://www.coachfactoryoutlet.com.so http://www.jordanretro.name http://coachoutlet.officialinc.net http://www.toms-outlet.com.co http://www.poloralph-lauren.net.co http://toryburchoutlet.stores.net.co http://www.michaelkorsbag.org.uk http://www.coachoutlet-factory.com.co http://www.dior-handbags.us http://chanelhandbags.newstore.com.co http://www.abercrombiekids.name http://www.coachfactoryoutletonline.eu.com http://www.jordan11concord.org http://www.abercrombie-fitch.com.co http://www.michaelkorsoutletclearance.in.net http://www.jordanconcords.net http://www.gucci-outlet.net.co http://www.lebronjames-shoes.net http://www.adidaswings.name http://www.celine-outlet.us http://www.hollisterclothing.info http://www.ghdhairstraighteners.com.co http://www.lebronjames-shoes.name http://www.oakleysunglasses-sale.in.net http://www.longchamphandbags.com.co http://truereligion.onlineinc.net.co http://www.hollisteroutlet.name http://www.katespade-handbags.eu.com http://www.ray-ban-sunglasses.org.uk http://www.jordan6.net -- [[2015711yuanyuan]] &new{2015-07-10 (金) 22:07:58};
 
 #comment_nospam