JH7UBCブログ

アマチュア無線 電子工作 家庭菜園など趣味のブログです

PIC12F1840 MCC ADC テスト

2021-05-19 11:54:02 | MPLAB X MCC
 PIC12F1840を使って、MCCを利用したADCテストをやってみました。
 PICを変更したのは、PIC12F1822では、メモリが足りなくなりそうだからです。
 アナログ入力ポートはRA0(AN0)とし、RA1,RA2をI2C通信に利用します。
 AN0の電圧を10kΩのボリュームで調整して、電圧の値をAQM0802Aに表示します。

 プロジェクトを作成して、MCCを開きます。
 System Moduleの設定は、INTOSC,FOSC,16MHzとしました。
 I2Cの設定とプログラムは、前の記事と同じです。
  今回は、ADC関係の設定だけ紹介します。
 Enable ADCにチェックを入れ、ADCを有効にします。
 ADC Clockは、F1シリーズでは、1us~9usの範囲で設定しますので、変換クロック(Tad)は、FOSC/16 = 1.0usとしました。従って、Conversion Timeは11.5usとなります。
 変換結果の格納方式(Result Alignment)は、右詰め(right)
 正参照電圧(Positive Reference)は、電源電圧(VDD)としました。

 Pin ManagerとPin Moduleに自動的にADCが設定されます。
 RA0にアナログポートAN0が設定されました。
 設定は、これだけです。

 プログラムは次のとおりです。
 ADCに関係するのは、main()の中のprintf()関数の中の
ADC_GetConversion(0)
だけです。なんだか拍子抜けするくらい簡単です。
---------------------------------------------------------
/*
* PIC12F1840 MCC ADC test
* 2021.05.18
* JH7UBC Keiji Hata
*/

#include "mcc_generated_files/mcc.h"
#include "mcc_generated_files/examples/i2c_master_example.h"

#define I2CLCD_AQM0802A 0x3e

//-------- send character ------------------------
void LCD_dat(char chr)
{
I2C_Write1ByteRegister(I2CLCD_AQM0802A, 0x40, chr);
__delay_us(30); // 30us
}

//-------- send command -------------------------
void LCD_cmd(char cmd)
{
I2C_Write1ByteRegister(I2CLCD_AQM0802A, 0x00, cmd);
if(cmd & 0xFC) // bit6 = 1
__delay_us(30); // 30us
else
__delay_ms(2); // 2ms Clear or Home
}

//-------- clear LCD--------------------------
void LCD_clr(void){
LCD_cmd(0x01);
}

//--------- Home -----------------------------
void LCD_home(void){
LCD_cmd(0x02);
}

//--------- Cursor X,Y -----------------------
void LCD_cursor(unsigned char x,unsigned char y){
if (y == 0)
LCD_cmd(0x80 + x);
if (y == 1)
LCD_cmd(0xc0 + x);
}

//-------- display strings -------------------------
void LCD_str(char *str){
while(*str)
LCD_dat(*str++); //pointer increment
}

//-------- write 1 character to LCD ----------------
void putch(unsigned char ch){
LCD_dat(ch);
}

//-------- LCD initialize ---------------------------
void LCD_init(){
__delay_ms(40); //40ms wait
LCD_cmd(0x38); //8bit,2line
LCD_cmd(0x39); //IS=1 : extention mode set
LCD_cmd(0x14); //Internal OSC Frequency
LCD_cmd(0x70); //Contrast set
LCD_cmd(0x56); //Power/ICON/Contrast Control
LCD_cmd(0x6C); //Follower control
__delay_ms(200);//200ms wait
LCD_cmd(0x38); //IS=0 : extention mode cancel
LCD_cmd(0x0C); //Display ON
LCD_cmd(0x01); //Clear Display
__delay_ms(2); //wait more than 1.08ms
}

void main()
{
// initialize the device
SYSTEM_Initialize();
// Enable the Global Interrupts
INTERRUPT_GlobalInterruptEnable();
// Enable the Peripheral Interrupts
INTERRUPT_PeripheralInterruptEnable();

//I2C_Initialize();
LCD_init();
char msg[] = "ADC TEST";
LCD_str(msg);

while (1)
{
LCD_cursor(2,1);
printf("%4d",ADC_GetConversion(0));
__delay_ms(100);
}
}
---------------------------------------------------------
 ブレッドボードです。
 VRの位置により、0~3Vの電圧が、0~1023の値で2行目に表示されました。