今年最初の実験は、PIC12F675のA/Dコンバータを使うテストです。
AN0の電圧をA/D変化して、変換した数値(0~1023)をI2C LCD AQM0802Aに表示します。
回路図です。電源は、電池2本で3Vです。
ブレッドボードです。
AQM0802Aの表示に必要なI2C関係関数とLCD表示関数は、前の記事と同じです。
ここでは、main()のみ掲載します。
------------------------------------------------------------------
/* main program */
void main() {
CMCON = 0x07; //comparater disable
void main() {
CMCON = 0x07; //comparater disable
TRISIO = 0b00110001; //GP0,GP4,GP5 input GP1,GP2,GP3 output
ANSEL = 0b00000001; //select AN0
ADCON0bits.VCFG = 0; //Vref = VDD
ADCON0bits.ADFM = 1; //ADRES 右詰め
ADCON0bits.ADON = 1; //A/D converter ON
ANSELbits.ADCS0 = 1; //A/D変換クロック4MHz 16Tosc 4.0us
ANSELbits.ADCS1 = 0;
ANSELbits.ADCS2 = 1;
I2C_init(); //I2C initialize
LCD_init(); //LCD initialize
LCD_home();
printf("A/D TEST");
/* select AN0*/
ADCON0bits.CHS0 = 0;
ADCON0bits.CHS1 = 0;
while(1){
__delay_us(50); //wait 50us
ADCON0bits.GO_nDONE = 1; //A/D convert start
while(ADCON0bits.GO_nDONE); //wait for A/D convert complete
unsigned int val = ADRESH;
val = (val << 8) + ADRESL;
LCD_2line();
printf("%4d",val);
__delay_ms(500);
}
}
ANSEL = 0b00000001; //select AN0
ADCON0bits.VCFG = 0; //Vref = VDD
ADCON0bits.ADFM = 1; //ADRES 右詰め
ADCON0bits.ADON = 1; //A/D converter ON
ANSELbits.ADCS0 = 1; //A/D変換クロック4MHz 16Tosc 4.0us
ANSELbits.ADCS1 = 0;
ANSELbits.ADCS2 = 1;
I2C_init(); //I2C initialize
LCD_init(); //LCD initialize
LCD_home();
printf("A/D TEST");
/* select AN0*/
ADCON0bits.CHS0 = 0;
ADCON0bits.CHS1 = 0;
while(1){
__delay_us(50); //wait 50us
ADCON0bits.GO_nDONE = 1; //A/D convert start
while(ADCON0bits.GO_nDONE); //wait for A/D convert complete
unsigned int val = ADRESH;
val = (val << 8) + ADRESL;
LCD_2line();
printf("%4d",val);
__delay_ms(500);
}
}
------------------------------------------------
0.5secごとにA/Dコンバータの値を表示します。
/* main program */
void main() {
CMCON = 0x07; //comparater disable
void main() {
CMCON = 0x07; //comparater disable
TRISIO = 0b00110001; //GP0,GP4,GP5 input GP1,GP2,GP3 output
ANSEL = 0b00000001; //select AN0
ADCON0bits.VCFG = 0; //Vref = VDD
ADCON0bits.ADFM = 1; //ADRES 右詰め
ADCON0bits.ADON = 1; //A/D converter ON
ANSELbits.ADCS0 = 1; //A/D変換クロック4MHz 16Tosc 4.0us
ANSELbits.ADCS1 = 0;
ANSELbits.ADCS2 = 1;
I2C_init(); //I2C initialize
LCD_init(); //LCD initialize
LCD_home();
printf("A/D TEST");
/* select AN0*/
ADCON0bits.CHS0 = 0;
ADCON0bits.CHS1 = 0;
while(1){
__delay_us(50); //wait 50us
ADCON0bits.GO_nDONE = 1; //A/D convert start
while(ADCON0bits.GO_nDONE); //wait for A/D convert complete
unsigned int val = ADRESH;
val = (val << 8) + ADRESL;
LCD_2line();
printf("%4d",val);
__delay_ms(500);
}
}
ANSEL = 0b00000001; //select AN0
ADCON0bits.VCFG = 0; //Vref = VDD
ADCON0bits.ADFM = 1; //ADRES 右詰め
ADCON0bits.ADON = 1; //A/D converter ON
ANSELbits.ADCS0 = 1; //A/D変換クロック4MHz 16Tosc 4.0us
ANSELbits.ADCS1 = 0;
ANSELbits.ADCS2 = 1;
I2C_init(); //I2C initialize
LCD_init(); //LCD initialize
LCD_home();
printf("A/D TEST");
/* select AN0*/
ADCON0bits.CHS0 = 0;
ADCON0bits.CHS1 = 0;
while(1){
__delay_us(50); //wait 50us
ADCON0bits.GO_nDONE = 1; //A/D convert start
while(ADCON0bits.GO_nDONE); //wait for A/D convert complete
unsigned int val = ADRESH;
val = (val << 8) + ADRESL;
LCD_2line();
printf("%4d",val);
__delay_ms(500);
}
}
-------------------------------------
0.5secごとにA/Dコンバータの値(0~1023)をLCDに表示します。
今回、Vrefは、VDDとしていますが、しっかりとした電圧源に接続すれば、デジタル電圧計ができますね。
PIC12F675のプログラミング練習はこれくらいにして、新しいPICの品種に進みたいと思います。