秋月電子の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変換スタート
}
こんばんは、菅原です。
A/D チャネル選択レジスタA(ADANSA)の設定がないようですが、どうでしょう。。
私は初期化プログラムに初期化するI/O装置のレジスタを全てを書き込んでいます。
初期化とは関係の無いレジスタは、コメントアウトです。
このように全てをリストアップしておけば、漏れが有りません。
.
SYSTEM.MSTPCRA.BIT.MSTPA17= 0; でI/O装置の電源を入れてから少し待つようにしています。
マニュアルをじっくり調べていないけど、電源ONの直後ではI/O装置が安定していないと思って。
ビーコン菅原さん、すみませんでした。下記命令を転記時に消してしまいました。一応、ADANSAは設定しています。
S12AD.ADCSR.BIT.ADCS = 0x00; //シングルスキャンモード
S12AD.ADANSA.WORD = 0x0200; //AN009を有効にする
リカルドさん、「SYSTEM.MSTPCRA.BIT.MSTPA17= 0; でI/O装置の電源を入れてから少し待つようにしています。」ですが、確かマニュアルには数μS後に
とあった気がします。やはり、while文で確実に設定されるのを確認すると良いのでしょうか?
ソフトタイマーなら、次のようにすると良いですよ。
括弧で囲むと、その中だけで有効な変数になります。
コンパイラはたぶんレジスタに変数を割り当てるでしょう。
括弧が無いとwhileを抜けた後もその変数の値を保存しておくため、メモリを消費すると予想されます。
{
unsigned long T ; // タイマー用カウンタ
T = 0x1000 ; while (--T) ; //
RXは触った事ないのでアレですが
ぐぐったら↓が見つかりました
「RX220でAD変換(連続スキャンモード)を行う」
qiita.com/.../1b873c9de6b438f99749
ただ本件では
「シングルスキャンモード」
なのでご参考に成らないのかも知れません
でも、AD変換出来てるかどうかの確認するだけなら
連続スキャンのほうが簡単と思う
何しろタイマとかで待っての読込タイミングとか必要ないから
シングルスキャンでなければならないとかの条件があるなら別ですが
リカルドさん、ありがとうございます。タイマを導入しました。しかし、未だ動いていません。悲しいです。
lumiheartさん、ありがとうございます。アプリケーションノートはいろいろ調べて既に参考にしています。しかし、動きません。
シングルスキャンモードにこだわっているわけでありませんでしたので、連続スキャンモードでも試してみましたが、動いていません。
AD変換でこんなに苦戦しているのは、初めてです。
菅原です。
状況をもう少し詳しく教えていただけませんか?
・E1を使っていますか??
E1があればレジスタやメモリが簡単に見えるのでわかりやすいのですが。
・ADコンバータが動いていないとは
S12AD.ADCSR.BIT.ADST が 0にならないということでよいですか?
それとも、サンプリングした値が0x0000とか0XFFFFみたいな値になるとか??
ビーコン菅原さん、E1は使っていません。ADコンバータのレジスタを読み出しても0のままと言うことです。
ハード的には問題ないことは確認済みです。今予測しているのは、ADクロックが動いていないか、ADコンバータにデータ取込んでいないか、或いは、ADSTがスタートしていないかです。
一応、ADレジスタの値を7セグに表示しています。その値が変化していません。
次のようにして調べたらどうですか。
ADdata = S12AD.ADDR9;
S12AD.ADCSR.BIT.ADST = 1; //AD変換スタート
ここで S12AD.ADCSR.BIT.ADST が 1 になっているか調べる。
1になっていなければ全く動いていない。
他の方法としては、設定したレジスタを調べます。00とかFFだったり、書き込んだ値が保持されていないなどを調べます。
E1ないとつらいですねー(^_^;)
何かの機会にぜひ購入してください。
開発環境が限定されますが E2エミュレータLite も選択肢の一つだと思います。。
さて、7セグは何桁ありますか?
7セグの動作確認は完了していると考えていいですか? ・・つまり表示したい数値などを期待通り表示できていますか?