ATMELのAT-Tiny26,ATmega,R8Cなどのワンチップマイコン,C言語,JAVAなどのプログラミング言語の入門のためのページです.サンプルプログラムを中心に紹介します.他にもLinixや数学ソフトなどの紹介も行います.

このブログを検索

あなたは 番目のお客様です.

2009年7月28日火曜日

ATmegaを使う

ATtiny26は,生産中止になったのでしょうか?現在は秋月でも扱っていません.tiny26なき今,AD変換をする場合どのAVRマイコンを選べば良いのでしょうか.
AD変換を行わないのであれば,ATtiny2313で問題ないと思います.パソコンとシリアル通信も可能です.
問題は,AD変換を行いたい場合です.ATtiny261,ATtiny461,ATtiny861がATtiny26の上位互換チップのようです.ただし2009年7月現在秋月電気でのこれらのチップの取り扱いはありません.調べると,これらのチップを扱っている店はいくつかあるようです.
この際ATmegaシリーズに移行するというのも良いと思います.ATmega8とATmega48,88,168,328のシリーズがあります.いずれもピン配置は同じです.mega8が最高16MHz,mega48-328が最高20MHzです.mega48-328の方がより高機能なのでしょうが,ほとんど同じです.tiny26になかった機能として,USART(シリアル通信)機能,TWI(2線シリアルインターフェース)つまりI2C機能を持っています.AD変換で得られたデータをI2Cで外部EEPROMに入れたり,PCと通信したりなど色々なことができそうです.


以下はATmega88用のLED点滅プログラムとAD変換を使った
LED調光プログラムです.

/*
とりあえずmega88でLEDピコピコ
PD0,1,2にLEDを接続,内部発振8MHz,
クロックの分周(Divide clock by 8 internally)なし
1,20,21,22ピンは無接続
mega168でも同様に動く
チップを変えるときはAVRStudioの
Project>Configuration Optionsで異なるチップを選ぶ
*/
#include <avr/io.h>
void wait(int x);
int main( void )
{
DDRD=0B00000111; /* PD0,1,2を出力に設定する */

for (;;) { /* 無限ループ */
PORTD=0B00000001;
wait(4); /* wait関数(waitルーチン)実行 */
PORTD=0B00000010;
wait(4); /* wait関数(waitルーチン)実行 */
PORTD=0B00000100;
wait(4); /* wait関数(waitルーチン)実行 */
}
}

void wait(int x){ /* 時間稼ぎ */
int i,j;
for(i=1;i<x;i++){
for(j=1;j<20000;j++){
j=j; /* dummy */
}
}
}


/*
C言語によるmega88用AD変換のテストプログラム
内部発振8MHzクロック分周なし
ADC0(PC0)は入力,可変抵抗の電圧を入力する
PD0は出力でLEDを接続する
ADCHの値に比例してPD0をオン,PD0をオフする
可変抵抗を変化させることによりLEDの明るさが変化する(調光)
ADCSR=0B11000000でAD変換がスタートし,ADIF=1でAD変換完了
AVCCとVCCを接続,AVGND(22ピン)とGNDを接続,AREFは無接続
AD変換の精度を確保するためにはADPS0-2で
A/D変換クロックを50-200kHzに設定する必要あり
CK=8MHzのときCK/64=125kHz
*/
#include <avr/io.h>
int main( void )
{
int16_t i,ad;
DDRC=0B00000000; /* PC0を入力に設定する */
DDRD=0B00000001; /* PD0を出力に設定する */
ADMUX=0B01100000; //AVCCが基準電圧Vref=2.56V Left Adjust ADC0(PC0)
ADCSRA=0B10000110; //CK/64
while(1){
ADCSRA |= 1<<ADSC; //AD start
while(!(ADCSRA & (1<<ADIF))){} //ADCSRのビット4(ADIF)が1になるまで待つ
ad=ADCH;
PORTD |= 1<<0; //PD0セット
for(i=0;i<ad;i++){}
PORTD &= ~(1<<0); //PD0クリア
for(i=ad;i<256;i++){}
}//while(1)
}
こちらはLED調光の写真です.