SH7085のA/D変換器(その2)
ここでは、SH7085のA/D変換器の変換モードのスキャンモードについて説明する。
スキャンモードには、2つのモードがある。1つは、1サイクルスキャンモードで、指定されたチャネルすべてを1回変換して終了するモードである。2つ目は、連続スキャンモードである。連続スキャンモードは、指定されたチャネルをA/D変換し続けるモードである。この連続スキャンモードは、自動では終了しないので、プログラムで明示的にADSTビットを0にして停止させなければならない。
1サイクルスキャンモード
シングルモードとスキャンモード(1サイクルスキャンと連続スキャンの両方をさす)の切り替えは、ADCSRレジスタのADMビットで行う。
図1:ADCSRレジスタ
ADMは、AD Mode の略語でその名の通り、AD変換のモードを切り替えるビットである。ビットフィールドは、2ビットあり、00 ~ 11 までの4通りの設定が可能である。下記にそれぞれの設定の内容を示す。
- 00 : シングルモード
- 01 : 4チャネルスキャンモード
- 10 : 8チャネルスキャンモード(SH7085 では動作しない)
- 11 : 2チャネルスキャンモード
上記の設定のうち、00 以外の値を設定すると スキャンモードになる。SH7085 のスキャンモードでは、2チャネルスキャンモードか4チャネルスキャンモードを利用する。
2チャネルスキャンモードも4チャネルスキャンモードも必ず2チャネルや4チャネルA/D変換するのではなく、最大2チャネルまたは4チャネルをA/D変換するという意味である。どのチャネルをA/D変換するかは、ADCSRレジスタのCHビットで設定する。表1に2チャネルスキャンモードでのCH の設定、表2に4チャネルスキャンモードでのCHの設定を示す。
表1:2チャネルスキャンモードの設定
表2:4チャネルスキャンモードの設定
ADCSRレジスタのADM ビットを 00 以外のスキャンモードに設定したとしても、CH ビットの初期値が 0 なので、1チャネルしかA/D変換されないので注意が必要である。
また、ADM や CH ビットを設定するときは、必ずA/D 変換器が停止している状態で設定すること。つまり、ADST が 0 のときに設定を行うこと。
プログラム1:1サイクルスキャンモードのサンプルプログラム
1: #include "iodefine.h" 2: #define printf ((int (*)(const char *,...))0x00007c7c) 3: 4: void main(void) { 5: STB.CR4.BIT._AD0 = 0; 6: AD0.ADCSR.BIT.ADM = 3; 7: AD0.ADCSR.BIT.CH = 1; 8: AD0.ADCR.BIT.ADST = 1; 9: while(AD0.ADCR.BIT.ADST); 10: AD0.ADCSR.BIT.ADF = 0; 11: printf("ADDR0 = %04dnADDR1 = %04d n", AD0.ADDR0 >> 6, AD0.ADDR1 >> 6); 12: while(1); 13: }
6行目で2チャネルスキャンモードに設定している。ミームスのアナログジョイスティックは、上下左右方向の検出にAN0 と AN1 を使っているので、2チャネルの設定でA/D 変換が可能となる。7行目でAN0 と AN1 の2チャネルの設定を行っている。この行を忘れると AN0 しかA/D変換されないので、必ず設定すること。あとは、シングルモードと同じでA/D変換をスタートさせて、終了するのを待つだけである。
具体的な動作を下記の動画で確認すること。
動画1:プログラム1の動画
では、下記から1サイクルスキャンモードの演習用ワークスペースをダウンロードして演習を行うこと。
プログラムソースの ex1 は,サンプルプログラムである.
adc_1scan.zip
演習問題
下記は、A/D 変換の1サイクルスキャンモードを使った演習問題である。特に断りが無い限り、A/D変換のモードは1サイクルスキャンモードでAN0 と AN1 をA/D変換する2チャネルスキャンモードに設定すること。また、A/D変換の終了待ちについても特に指定が無い限り、ADST と ADF のどちらを使ってもよいこととする。
1.サンプルプログラム(ex1)をビルドし、動作を確認せよ.
2.プログラム1のサンプルプログラムを参考に、A/D 変換の終了待ちを ADF ビットで行うプログラムを作成せよ。(ex2)
動画2:演習問題2の動作
3.SW6 でA/D 変換を開始し、結果をhterm に表示するプログラムを作成せよ。(ex3)
動画3:演習問題3の動作
4.SW6 でA/D 変換を開始し、結果をLCD に表示するプログラムを作成せよ。(ex4)
動画4:演習問題4の動作
連続スキャンモード
連続スキャンモードに設定するには、ADCSR レジスタの ADCS ビットを 1 に設定すればよい。ADCS ビットは、0 で1サイクルスキャンモード、1 で連続スキャンモードを指定することができる。ただし、シングルモードで使う場合は、このビットは無効となり意味をなさない。
連続スキャンモードの注意点は、シングルモードや1サイクルスキャンモードのように、A/D変換が終了すると、ADST ビットが 0 にならない点である。
つまり、連続スキャンモードでは、A/D 変換の終了は、ADF ビットで確認するしかない。
プログラム2:連続スキャンモードのサンプルプログラム
1: #include "iodefine.h" 2: #define printf ((int (*)(const char *,...))0x00007c7c) 3: 4: void main(void) { 5: STB.CR4.BIT._AD0 = 0; 6: AD0.ADCSR.BIT.ADM = 3; 7: AD0.ADCSR.BIT.ADCS = 1; 8: AD0.ADCSR.BIT.CH = 1; 9: AD0.ADCR.BIT.ADST = 1; 10: while(1) { 11: while(!AD0.ADCSR.BIT.ADF); 12: AD0.ADCSR.BIT.ADF = 0; 13: printf("ADDR0 = %04dnADDR1 = %04d n", AD0.ADDR0 >> 6, AD0.ADDR1 >> 6); 14: }
上記のサンプルプログラムは、1サイクルスキャンモードとほぼ同じである。異なるのは、7行目のADCS ビットの設定のみである。動作を下記の動画1に示す。
動画1:プログラム2の動作
では、下記から連続スキャンモードの演習用ワークスペースをダウンロードして演習を行うこと。
プログラムソースの ex1 は,サンプルプログラムである.
adc_nscan.zip
演習問題
下記は、A/D 変換の連続スキャンモードを使った演習問題である。特に断りが無い限り、A/D変換のモードは連続スキャンモードでAN0 と AN1 をA/D変換する2チャネルスキャンモードに設定すること。
1.サンプルプログラム(ex1)をビルドし、動作を確認せよ.
2.SW6 でA/D 変換をスタートさせて、SW4 でストップさせるプログラムを作成せよ。(ex2)
動画2:演習問題2の動作
3.SW6 でA/D 変換をスタートさせて、SW4 でストップさせ、結果をLCD へ表示させるプログラムを作成せよ。(ex3)
動画3:演習問題3の動作
4.SW6でA/D 変換をスタートさせて、SW4 でストップさせ、結果をLCD へ表示させるプログラムを作成せよ。ただし、CMT1 を使って 10ms 500ms ごとに変換結果を取得するようにせよ。(ex4)
動画4:演習問題4の動作