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
このブログが先日使えなくなった。なにも見えない。
音を立てずに消える。。。さすが忍者というべきか。
しかし、2日くらいして復活した。
「『忍者ツールズ』全サービスが表示不可となる障害復旧のお知らせ」
なるアナウンスが出ていて、こんなことが書いてあった。
1.ドメインが初期化された
2.DNSキャッシュの影響で最大72時間使えない
でも、何年か前にも、同じようなこと、してなかったかな???
ドメイン登録が切れる前に、レジストラから請求書を送ってきてくれたらいいんだが、普通はクレジットカード決済しかだめだったりする。で、切れる前にメールくらいは送ってくるのだが、決済を忘れるとドメインが消滅してしまうのだ。さらに都合の悪いことに、たいていのレジストラーは、ドメインが消滅したあと、偽の情報を長~い有効期限(2日くらい?)で登録しちゃうんで、急いでクレジットカード決済してドメイン復旧しても、インターネット全体ではなかなか回復しない。
ということを、今の担当者は知らなかったのだろう。不幸な時代だ。。。
ということはどうでもよくて、PIC16F1827+MikroCでADCを使う方法を今まで誤っていたので、メモを残そうと思ったが、書くの疲れたのでまた後日。
音を立てずに消える。。。さすが忍者というべきか。
しかし、2日くらいして復活した。
「『忍者ツールズ』全サービスが表示不可となる障害復旧のお知らせ」
なるアナウンスが出ていて、こんなことが書いてあった。
1.ドメインが初期化された
2.DNSキャッシュの影響で最大72時間使えない
でも、何年か前にも、同じようなこと、してなかったかな???
ドメイン登録が切れる前に、レジストラから請求書を送ってきてくれたらいいんだが、普通はクレジットカード決済しかだめだったりする。で、切れる前にメールくらいは送ってくるのだが、決済を忘れるとドメインが消滅してしまうのだ。さらに都合の悪いことに、たいていのレジストラーは、ドメインが消滅したあと、偽の情報を長~い有効期限(2日くらい?)で登録しちゃうんで、急いでクレジットカード決済してドメイン復旧しても、インターネット全体ではなかなか回復しない。
ということを、今の担当者は知らなかったのだろう。不幸な時代だ。。。
ということはどうでもよくて、PIC16F1827+MikroCでADCを使う方法を今まで誤っていたので、メモを残そうと思ったが、書くの疲れたのでまた後日。
PIC16F1827やPIC16F1938で、チップのリビジョンによって、動いたり、動かなかったりするぞ、ということがあった。古いチップだと動いて、新しいチップだと動かないので、チップのバグに違いない!と思っていたが、最近はMikroCの仕様(バグ)という気がしてきた。非同期シリアル(UART)を使うときに、MikroC標準関数でのボーレートの指定がうまく効かず、直接チップのレジスタを叩かなければ動かないことがあったので、以前の現象も本来やるべき初期化処理をMikroCがやっていないだけかもしれない。ということで、PIC16F1827やPIC16F1938は、チップ自体は悪くない、と今は思うようになった。
A/D変換の不具合だが、といあえずA/D変換直前にクロックを4MHzに落として、直後に16MHzに戻すことによって、なんとかなった。32MHzは8MHzをPLLで4逓倍するのだが、PLLは安定するのに時間がかかるため動的にクロックを変えるとやばそうと思ったので、32MHzをやめて16MHzにした。
さらにISCVの値をモニターするためのPWM出力の足を追加しようとしたが、別の不具合が。。。。
それは、
APFCONでCCP2をRB1からRC3へ切り替えたとき、CCP2を有効化するとRB1が0固定になる
というものだ。PIC 16F1938はPWMなどの機能を割り当てる足を切り替えることができて非常に便利なのだが、これが曲者。割り当てを変更したとき、たしかに変更は効くのだが、変更元の、機能を解除した足がバグってしまうようだ。
これはまだエラッタには出ていない。未知の不具合か??
仕方ない。APFCONの使用は諦めて、回路を変更して対応した。
ふぅ。。。これでなんとか完成。しかしこのPICの新シリーズ、性能とコストパフォーマンスは桁外れだが、バグの多さも桁外れ。まったく初心者向けではないのだが、初心者はPWMやA/D変換などはあまりしないと思うので、そういう意味では初心者向けなのかもしれない。
さらにISCVの値をモニターするためのPWM出力の足を追加しようとしたが、別の不具合が。。。。
それは、
APFCONでCCP2をRB1からRC3へ切り替えたとき、CCP2を有効化するとRB1が0固定になる
というものだ。PIC 16F1938はPWMなどの機能を割り当てる足を切り替えることができて非常に便利なのだが、これが曲者。割り当てを変更したとき、たしかに変更は効くのだが、変更元の、機能を解除した足がバグってしまうようだ。
これはまだエラッタには出ていない。未知の不具合か??
仕方ない。APFCONの使用は諦めて、回路を変更して対応した。
ふぅ。。。これでなんとか完成。しかしこのPICの新シリーズ、性能とコストパフォーマンスは桁外れだが、バグの多さも桁外れ。まったく初心者向けではないのだが、初心者はPWMやA/D変換などはあまりしないと思うので、そういう意味では初心者向けなのかもしれない。
とりあえずス口コソ試作版が完成したので、ほぼ同じ回路で作り直したところ、なんと、まったく動かない(動作開始後すぐにハングする)。。。。
どう見直しても、回路には問題がない。それにもかかわらず、動かない。。。。
年末より原因を調査していて、年明けてようやく原因が見つかった。
原因は、
「PICマイコンのバグ」
バグというと、不具合のように聞こえるが、まぁ確かに不具合といえば不具合なのだが、PICというマイコンは不具合のあることが前提で出荷されていて、不具合はErrataとして回避方法が公開されている。
今回遭遇した不具合はA/D変換の不具合で、回避方法は8MHz以下で動作させること、となっている。しかしこのス口コソは、一部掛け算のロジックを使っていて、32MHzじゃないと満足に動作しなかったりする。
さて、困った。。。
ここで気になるのが、10月に買ったマイコンだと問題が起きなくて、12月に買ったマイコンだと問題が起きたということ。12月に買ったマイコンのほうが古いのかも?と思って調べてみた。
PICのマイコンには、7桁のなぞの文字が印刷されている。これは缶詰の刻印とおなじで、製造時期をあらわしている。10月に買ったものには 105083H 、12月に買ったものは 1052QE5 と書いてある。これを意訳すると、 2010年第50週に製造開始したリビジョンのロット83H、2010年52週に製造開始したリビジョンのロットQE5、だとわかる。つまり、12月に買ったほうが新しくて、新しいほうが対策されているはずなのに動かないというなぞの現象が起きていることになる。
ということで、16F1938のErrataをよ~く読んでみた。
PIC16F1938にはSilicon Revision A1、A2という2種類が存在して、A1にはADC Conversion may not Complete というバグがあることがわかった。で、A2では解決しているのだが、A2の記述が追記されたのが2010年12月。。。。つまりあれだ、10月に買ったリビジョンは、まだADC Conversion may not Completeの対策もなにもやっていないということで、問題がありながらも(俺は気にしなかった)なんとなく動いていた。12月に買ったリビジョンはADC Conversion may not Completeの暫定対策として8MHzより高速ではA/D変換するとPICがハングするように(中途半端に動作しないように?)なっているようだ。
なんだこりゃ~
つまり、リビジョンA2が市場に出てくるのを待つか、1050NNN以前の古いリビジョンのものを探すしか方法はなさそうだ。。。。。
まぁ、要するに、PIC16F1827やPIC16F1938とか、超高性能、高機能なのに100円ちょっとで売っているのは、それ相応の理由があるってこと。今、16F88や16F648を使っている人は、まだこの新しいシリーズに手を出してはならない。。。。まだ早い!
PICは製品が安定するまでに数年かかるので、それまでは枯れた旧製品を使って開発しましょう。新製品は安くて高性能だけど、手を出すと今回の俺のように痛い目にあう。
後日追記:今、秋月で売っているのは修正済みバージョン。非常に安定している。もう16F88や16F648を新規で使うことはないだろう。。。
どう見直しても、回路には問題がない。それにもかかわらず、動かない。。。。
年末より原因を調査していて、年明けてようやく原因が見つかった。
原因は、
「PICマイコンのバグ」
バグというと、不具合のように聞こえるが、まぁ確かに不具合といえば不具合なのだが、PICというマイコンは不具合のあることが前提で出荷されていて、不具合はErrataとして回避方法が公開されている。
今回遭遇した不具合はA/D変換の不具合で、回避方法は8MHz以下で動作させること、となっている。しかしこのス口コソは、一部掛け算のロジックを使っていて、32MHzじゃないと満足に動作しなかったりする。
さて、困った。。。
ここで気になるのが、10月に買ったマイコンだと問題が起きなくて、12月に買ったマイコンだと問題が起きたということ。12月に買ったマイコンのほうが古いのかも?と思って調べてみた。
PICのマイコンには、7桁のなぞの文字が印刷されている。これは缶詰の刻印とおなじで、製造時期をあらわしている。10月に買ったものには 105083H 、12月に買ったものは 1052QE5 と書いてある。これを意訳すると、 2010年第50週に製造開始したリビジョンのロット83H、2010年52週に製造開始したリビジョンのロットQE5、だとわかる。つまり、12月に買ったほうが新しくて、新しいほうが対策されているはずなのに動かないというなぞの現象が起きていることになる。
ということで、16F1938のErrataをよ~く読んでみた。
PIC16F1938にはSilicon Revision A1、A2という2種類が存在して、A1にはADC Conversion may not Complete というバグがあることがわかった。で、A2では解決しているのだが、A2の記述が追記されたのが2010年12月。。。。つまりあれだ、10月に買ったリビジョンは、まだADC Conversion may not Completeの対策もなにもやっていないということで、問題がありながらも(俺は気にしなかった)なんとなく動いていた。12月に買ったリビジョンはADC Conversion may not Completeの暫定対策として8MHzより高速ではA/D変換するとPICがハングするように(中途半端に動作しないように?)なっているようだ。
なんだこりゃ~
つまり、リビジョンA2が市場に出てくるのを待つか、1050NNN以前の古いリビジョンのものを探すしか方法はなさそうだ。。。。。
まぁ、要するに、PIC16F1827やPIC16F1938とか、超高性能、高機能なのに100円ちょっとで売っているのは、それ相応の理由があるってこと。今、16F88や16F648を使っている人は、まだこの新しいシリーズに手を出してはならない。。。。まだ早い!
PICは製品が安定するまでに数年かかるので、それまでは枯れた旧製品を使って開発しましょう。新製品は安くて高性能だけど、手を出すと今回の俺のように痛い目にあう。
後日追記:今、秋月で売っているのは修正済みバージョン。非常に安定している。もう16F88や16F648を新規で使うことはないだろう。。。