閲覧総計:&counter();  (本日:&counter(today);  昨日:&counter(yesterday);)~
*A/D値でLED点滅間隔変更(16F1827 XC8) [#k8e1c5c0]

アナログ値をデジタル値に変換するADC(Analog Digital Converter)機能を確認した。
【機能】可変抵抗器で作ったアナログ値を10bit(0-1023)のデジタル値に変換し、
その値でLEDの点滅間隔を0-1023ミリ秒の間で滑らかに変更する。
【ハマりポイント】
新しい16F1XXXは、旧16F系からADCに関するレジスターの設定が多々変更されて
いた。16F1827のデーターシートをひとつひとつ確認しながらプログラミングを
行った。
↓16F1827のデーターシート
http://akizukidenshi.com/download/pic16f1827.pdf
ワザ:16F1827は英語のデーターシートしかないので、日本語データーシートが
用意されている16F1827の姉妹機16F1938の日本語データーシートで内容を理解し
最終で16F1827のデーターシートで情報を確認する様にしている。 2014/1/2
↓16F1938の日本語データーシート
http://www.microchip.jp/docs/41364B_JP.pdf

|&attachref(TS3V0006.JPG,zoom,200x300,button){新しい写真添付};|&attachref(16F1827ピン配置.JPG,zoom,200x250,button){新しい写真添付};|

 /* アナログ入力テスト
  * A/D値で発光ダイオード(LED)の点滅間隔を変更する
  * PIC16F1827
  * XC8 v1.20
  * LED:RA1,RA2
  * 可変抵抗(10kΩ):RB4
  */
 #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 unsigned int read_a2d(unsigned char channel);
 extern void arg_delay_ms(unsigned int x);
 
 int main(void) {
     //使用変数の定義
     unsigned int temp; //ADC値の結果
 
     //PICの初期設定
     PORTA = 0b00000000; //PORTAの中身をきれいにする
     PORTB = 0b00000000; //PORTBの中身をきれいにする
     TRISA = 0b00000000; //PORTA全てを0:出力に設定
     TRISB = 0b00010000; //PORTBはRB4を1:入力に他を全て0:出力に設定
     OSCCON = 0b01110000; //PLL:OFF, 内部クロック8MHzで駆動
     ANSELA = 0b00000000; //RA4(AN4)-RA0(AN0)は全て0:デジタルI/Oとする
     ANSELB = 0b00010000; //RB4(AN8)のみ1:アナログ、他RB7(AN6)-RB1(AN11)は0:デジタルI/Oとす る
     
     //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点灯
     while(1) {
         //アナログデータの取得 10bit(0~1023)
         temp = read_a2d(8); //RB4(AN8)のアナログ値読み込み
 
         //LED点滅間隔が0-1023msecで滑らかに変更出来る
         LATAbits.LATA1 = 1; //RA1 LED ON
         arg_delay_ms(temp); //所定時間待つ
         LATAbits.LATA1 = 0; //RA1 LED OFF
         arg_delay_ms(temp); //所定時間待つ
     }
 }
 
 //引数のアナロポートの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--;
     }
 }

★この情報は役に立ちましたか?
#vote(はい[3],普通[0],いいえ[0])

#comment_nospam