さて今度こそ回路とプログラム!
とりあえず回路はこんな感じ

tiny13にはAD変換ができるI/Oポートが4つあります。4つのうち今回はADC2(PB4)を使用します。
右にある可変抵抗で電圧の大きさを変え、その値をAD変換でデジタルにします。
読み取った値をPB0からPB3に出力します。可変抵抗をいじくったら光るパターンが変わるよ。
本当は10bit分できるけどハードの仕様上4bitだけ。とりあえずAD変換してるよ!ってわかればいいかな。
それではメインのプログラム
/*
* AD_test.c
* ADCの結果をPORTBに出力するだけの回路
* Tiny13の仕様上4bit分のみ出力
* Created: 2014/05/17
* Author: longtail
*/
#define F_CPU 1000000UL //CL(クロック)を1MHz
#include <avr/io.h>
#include <util/delay.h> //wait関数
void Inthard(void);
int main(void){
Inthard();
while(1){
ADCSRA=ADCSRA | 0b01000000; //ADC Start
while(bit_is_set(ADCSRA,ADSC)); //ADSCが1の間繰り替えす
PORTB=ADC; //ADCの結果をxに格納
_delay_ms(100);
}
}
void Inthard(void){
DDRB=0b11101111; //PB4以外出力
PORTB=0b00000000;
ADMUX=0b00000010; //ADC2(PB4)を使用
ADCSRA=0b10000111; //ADEN=1 ADC許可 ADPS2~0=1 CL/128の速さでADCを行う
_delay_ms(5); //ちょっと待つ
}
これまでのと比べてずいぶん短め。やってることはちょっと濃い。
注目するところは2つ。まずは初期設定。
ADMUAX=0b00000010; //ADC2(PB4)を使用
ADCSRA=0b10000111; //ADEN=1 ADC許可 ADPS2~0=1 CL/128の速さでADCを行う
この2つのレジスタ(値を入れる箱)がAD変換の設定をするところ。今回つかったとこだけ説明します。
ADMUAXではMUX0,1(0bit,1bit目のこと(下から2ケタ分)特殊なレジスタには各bitごとに名前がついてる)だけ見ればOK。ここでどのピンを使うのか決めます。
MUXの値がそれぞれ
MUX1,MUX0=(0,0)=ADC0(PB5のこと)
=(0,1)=ADC1(PB2)
=(1,0)=ADC2(PB4)
=(1,1)=ADC3(PB3)
今回はPB4を使うのでMUX1,MUX0=(1,0)と設定します。というわけでADMUAX=0b00000010; となります。
つぎにここ ADCSRA。まずADEN(下から7bit目)ここを1にするとAD変換ができるようになります。こびとさんを起こします。次にADSC(下から6bit目)はここでは0のままでいいですが、1にするとAD変換をしてくれます。今回のプログラムだとメインプログラムのここ
ADCSRA=ADCSRA | 0b01000000; //ADC Start
でAD変換を開始します。ちなみにAD変換が終了すると勝手に0に戻ります。
ここの命令は
ADCSRA=0b11000111;
でもOK。もう一つ、ADPS2~0(下から0~2bit目)でAD変換をするタイミングを決めます。こんな感じで
ADPS2~0=(0,0,0) クロック/2の速さ
ADPS2~0=(0,0,1) クロック/2の速さ
ADPS2~0=(0,1,0) クロック/4の速さ
ADPS2~0=(0,1,1) クロック/8の速さ
ADPS2~0=(1,0,0) クロック/16の速さ
ADPS2~0=(1,0,1) クロック/32の速さ
ADPS2~0=(1,1,0) クロック/64の速さ
ADPS2~0=(1,1,1) クロック/128の速さ
早ければ早いほど瞬時にAD変換を行ってくれますが、早すぎるとちゃんとAD変換が出来なくなります。こびとがオーバーヒートしちゃう(´・ω・`)。クロックと相談しましょう。確か50kから200kHzぐらいにすればよかったかな?とりあえず余裕をもってクロック/128の速さで行います。
とりあえずこれだけの値を設定すればAD変換は出来ます。マイコンごとに設定が異なるのでそこは気を付けよう!
やっとこれで注目するとこ一つ目終わり。もう一個あるけど長くなるので一旦区切ります。
実は悩まされたのはこの次のやつ。
とりあえず続く