秋月電子のRX220CPUボードで温度測定の回路を作りました。ポートE端子のAN009に電圧を入力しADコンバータで温度の値を読み取るようにしています。しかし、ADコンバータが動いていないようです。いろいろ調べて試してみましたが、どうしても動かないため投稿しました。当初はさほど問題なくできると思っていましたが、以外にも苦慮しています。なお、下記に抜粋ですが、ADコンバータ設定から読み取りまでを示しますので、何卒ご教授願います。ADクロックが動いていないのか、AD変換がスタートしないのか全くわかりません。
#include <machine.h>#include "iodefine.h"
void portinit(void);void main(void);
void main(void){
portinit();
while(1) {
while( S12AD.ADCSR.BIT.ADST == 1){}; //変換中
ADdata = S12AD.ADDR9; S12AD.ADCSR.BIT.ADST = 1; //AD変換スタート
}}
////////////////////////////////////////////////////////////////////////////// port initialize I/O Port & Timer set 絶対に変更するな!!//////////////////////////////////////////////////////////////////////////
void portinit( void ){//////////// system set ///////////////////
SYSTEM.PRCR.WORD = 0xa50b; //クロックソース選択の保護の解除
SYSTEM.SCKCR.BIT.PCKD = 0x00; //PCKD 分周 setSYSTEM.SCKCR.BIT.PCKB = 0x02; //PCKB 4分周 setSYSTEM.SCKCR.BIT.ICK = 0x00; //システムクロック 分周 set
/*クロックソースの選択*/SYSTEM.SCKCR3.WORD = 0x0200; //大元のクロックにメインクロックを使用する。
/*クロックの元栓の設定*/SYSTEM.MOSCCR.BYTE = 0; //メインクロック発振器動作SYSTEM.SOSCCR.BYTE = 0; //サブクロック発振器動作
SYSTEM.MSTPCRA.BIT.MSTPA17= 0;
SYSTEM.PRCR.WORD = 0xa500; //クロックソース選択の保護の設定
/////////////////// AD変換設定 ////////////////////////////////////
PORTE.PDR.BYTE = 0x00; //入力端子設定 PORTE.PMR.BYTE = 0x00; //ポートE1 汎用入力 MPC.PWPR.BIT.B0WI = 1; //PFSWEビット書き込み許可 MPC.PWPR.BIT.PFSWE = 1; //PFSレジスタ書き込み許可 MPC.PE0PFS.BIT.ASEL = 1; MPC.PE1PFS.BIT.ASEL = 1; //アナログ端子設定 AN009 MPC.PE2PFS.BIT.ASEL = 1; MPC.PWPR.BIT.B0WI = 0; //PFSWEビット書き込み禁止 MPC.PWPR.BIT.PFSWE = 0; //PFSレジスタ書き込み禁止 S12AD.ADCSR.BIT.ADST = 1; //AD変換スタート
}
ちゃんさん NAKAといいます。
違ってたらごめんなさい!
ちらっと見ましたが、ピンファンクションの許可は、
MPC.PWPR.BIT.B0WI = 1; //PFSWEビット書き込み許可
ではなくて
MPC.PWPR.BIT.B0WI = 0; //PFSWEビット書き込み許可
じゃないでしょうか?
菅原です。
RX220でのソースです。
NAKAさんのご指摘ナイスです。
以前私が作ったRX220の PFSの設定部分です。
ポートは違うけど参考にしてください。
MPC.PWPR.BIT.B0WI = 0;
MPC.PWPR.BIT.PFSWE = 1;
MPC.P40PFS.BYTE = 0x80;
MPC.P41PFS.BYTE = 0x80;
MPC.P42PFS.BYTE = 0x80;
MPC.P46PFS.BYTE = 0x80;
MPC.PWPR.BYTE = 0x80;
わわいです。
まずは、A/Dのサンプルを動かしてみてはどうでしょうか。
それで動いてるのを確認しておいて、それから自分のプログラムのために修正していく、という手順を取っていけばわかりやすいかと思います
いきなり動かないとか言われても、プログラムが悪いのか、ハードが悪いのか、はたまたあなたの思い込みだけなのか、ということでお互い不毛だとおもいますが。
リカルドさん、ADST=1を調べたことがあります。動いていないような様子でしたが、はっきりと分かりませんでした。
理由としては、AD変換は数μsですので、一瞬で終わってしまうので、エミュレータがない状態では非常に難しい状況です。
ビーコン菅原さん、7セグは3ケタです。ちょうど12ビットの4ビットづつを表示するようにしています。
その結果、000表示です。
PFSの設定ありがとうございます。参考に試してみます。
NAKAさん、ご指摘通りです。実は昨日気付きまして修正しましたが、同じでした。
わいわいさん、サンプルを探していましたが良いサンプルがなく(RX220のサンプルが見つかりませんでした)他機種のサンンプルか或いは、AD変換に割込みを使ったサンプルで試してみます。
皆さん、ご教授いただきありがとうございます。試すのに時間が掛り返事が直ぐにできませんので、御了承願います。
また、その他にも何かありましたら、御願いいたします。
ADST=1とADST=0になっていることを確認できました。と言うことは、ADレジスタの値を読み出し方がおかしいのでしょうか?
現在、int ADdataで設定し、ADdata=S12AD.ADDR9 の読み出しを行っていますが、表示結果が3桁0表示となります。
このレジスタ値が読み出すことができていないのでしょうか?他のサンプルを見ても問題がないようですが?
ちゃんさん
ちなみにADdata=0x123;とかADdata=0xABC;と実数をいれたら、7segLEDはどのように表示されるのでしょうか?確認済ですか?
最初のコードだと、while(1){}でものすごく速くAD値を入れ替えていているため”000”とか”888”がちらついて見えているとか?
NAKAさん、ありがとうございます。いろいろアドバイスいただきなんとかレジスタの数値を表示することができました。後は、10進数に変換するだけです。ご教授いただきました、皆様に厚く御礼申し上げます。また、不明なことがありましたら、投稿いたしますので、ご教授の程御願いいたします。