趣味の電子工作と釣りについて。電子工作は、おもに変換器作成。釣りはおもにトラウトの管釣り。
16F1827のADCにはバグがあって、回り道しないとハングすることは知っていたが、その回り道の方法が今まで間違っていた。
Errataには、ADCのクロックをFRCにするとGO/DONEを返さない(通常はハングに直結)のでFOSCを使え、と書いてある。なので、
ADCON1.ADCS0=1;
ADCON1.ADCS1=0;
ADCON1.ADCS2=0;
ADC_Read(0);
みたいな感じで使っていた。が、よ~くMikroCのマニュアルを読むと、ADC_Read(char channel)はFRC固定と書いてあった。つまり、いくらFOSCに指定しても、結局ADC_Readの中でFRCに変更されてしまうのだった。これでかな?ハングしまくっていたのは?
ということで、16F1827ではADC_Readは使用禁止。代わりに、ADC_Init、ADC_GetSampleを使用するべきである。まあ、下記のような関数を定義して、ADC_Readの代わりに使えばいいのかな?
unsigned int ADC_Read2(char channel)
{
unsigned int adc;
OSCCON=0b01110000; // 8MHz
ADC_Init();
ADCON1.ADCS0=1;
ADCON1.ADCS1=0;
ADCON1.ADCS2=0;
adc=ADC_Get_Sample(channel);
OSCCON=0b11110000; // 8MHz x 4
return adc;
}
いまのところハングしていないが、まだ様子見、といったところ。本当にこれでいいのかわからん。
もしもこれでいいなら、16F1938の場合にも有効かもしれない。
Errataには、ADCのクロックをFRCにするとGO/DONEを返さない(通常はハングに直結)のでFOSCを使え、と書いてある。なので、
ADCON1.ADCS0=1;
ADCON1.ADCS1=0;
ADCON1.ADCS2=0;
ADC_Read(0);
みたいな感じで使っていた。が、よ~くMikroCのマニュアルを読むと、ADC_Read(char channel)はFRC固定と書いてあった。つまり、いくらFOSCに指定しても、結局ADC_Readの中でFRCに変更されてしまうのだった。これでかな?ハングしまくっていたのは?
ということで、16F1827ではADC_Readは使用禁止。代わりに、ADC_Init、ADC_GetSampleを使用するべきである。まあ、下記のような関数を定義して、ADC_Readの代わりに使えばいいのかな?
unsigned int ADC_Read2(char channel)
{
unsigned int adc;
OSCCON=0b01110000; // 8MHz
ADC_Init();
ADCON1.ADCS0=1;
ADCON1.ADCS1=0;
ADCON1.ADCS2=0;
adc=ADC_Get_Sample(channel);
OSCCON=0b11110000; // 8MHz x 4
return adc;
}
いまのところハングしていないが、まだ様子見、といったところ。本当にこれでいいのかわからん。
もしもこれでいいなら、16F1938の場合にも有効かもしれない。
PR
この記事にコメントする