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

このブログを検索

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

2009年6月20日土曜日

ATTINY13,ATTINY25,AT90S2313

AVRの8ピンマイコンATTINY13,ATTINY25,AT90S2313を使ってみました.
AT90S2313は外部発振のみ,ATTINY13とATTINY25は,外部発振と内部発振が使えます.
ATTINY13とATTINY25は,AD変換機能を持っています.
基本的なピン配置は同じなので,同じ書き込み回路が使えます.










ただし,AVRstudio4からISPmkIIを使って書き込みをする場合,AT90S2313は
デバイスの認識ができません.(しかし書き込みはできます)
1:RESRT
2:8MHzクリスタル
3:8MHzクリスタル
4:GND
5:MOSI
6:MISO
7:SCK
8:VCC

以下はPB0,PB1,PB2にLEDを付けたフラッシャーのプログラムです.
ATTINY13,ATTINY25,AT90S2313いずれでも動きます.
#include <avr/io.h>

void wait(int x);

int main( void )
{
DDRB=0B00000111; /* PortB0,1,2を出力に設定する */

for (;;) { /* 無限ループ */
PORTB=0B00000001;
wait(10);
PORTB=0B00000010;
wait(10);
PORTB=0B00000100;
wait(10);
}
}

void wait(int x){
int i,j;
for(i=1;i<x;i++){
for(j=1;j<20000;j++){
j=j;
}
}
}

次のプログラムはtiny13AでAD変換を行い,AD変換の値に比例して
LEDを点灯(調光)します
点灯時間の調整にはタイマ・カウンタのオーバーフローを利用しています.
//tiny13A用AD変換LED出力
//AD入力ADC2(PB4),LED出力PB0
#include <avr/io.h>

void delay(uint8_t t){
TCCR0B=0B00000011;//clk/64 (64分周)
TIFR0 |= 1<<TOV0;//TOV0クリア
TCNT0=255-t;
while(!(TIFR0 & (1<<TOV0))){}//カウンタがオーバーフローするまで待つ
}

int main( void )
{
uint8_t ad;
DDRB=0B00000001; /* PB0を出力に設定する */
ADMUX=0B00100010; //VCCが基準電圧 Left Adjust ADC2(PB4)
ADCSRA=0B10000110; //CK/64

while(1){
ADCSRA |= 1<<ADSC; //AD start
while(!(ADCSRA & (1<<ADIF))){} //ADCSRのビット4(ADIF)が1になるまで待つ
ad=ADCH;
PORTB |= 1<<0; //PB0セット
delay(ad);
PORTB &= ~(1<<0); //PB0クリア
delay(255-ad);
}//while(1)
}


次のプログラムはtiny25でAD変換を行い,AD変換の値に比例して
LEDを点灯(調光)します
点灯時間の調整にはタイマ・カウンタのオーバーフローを利用しています.
//tiny25用AD変換LED出力
//AD入力ADC2(PB4),LED出力PB0
#include <avr/io.h>

void delay(uint8_t t){
TCCR0B=0B00000011;//clk/64 (64分周)
TIFR |= 1<<TOV0;//TOV0クリア
TCNT0=255-t;
while(!(TIFR & (1<<TOV0))){}//カウンタがオーバーフローするまで待つ
}

int main( void )
{
uint8_t ad;
DDRB=0B00000001; /* PB0を出力に設定する */
ADMUX=0B00100010; //VCCが基準電圧 Left Adjust ADC2(PB4)
ADCSRA=0B10000110; //CK/64

while(1){
ADCSRA |= 1<<ADSC; //AD start
while(!(ADCSRA & (1<<ADIF))){} //ADCSRのビット4(ADIF)が1になるまで待つ
ad=ADCH;
PORTB |= 1<<0; //PB0セット
delay(ad);
PORTB &= ~(1<<0); //PB0クリア
delay(255-ad);
}//while(1)
}

次のプログラムはtiny25でAD変換を行い,AD変換の値に比例して
LEDを点灯(調光)します
点灯時間の調整には非同期高速PWMを利用しています.
OCR0Aに255を代入し,カウンタのTOPとし,
OCR0BにAD変換値を代入します
//非同期高速PWM動作のテストTINY13A
//TCNT0の高速PWM動作を使う
//出力OC0B COM0B1-0:10
//BOTTOM:0TOP:OCR0A WGM02-01:111
//カウンタ分周CLK/8 CS02-00:010
//AD入力ADC2(PB4)

#include <avr/io.h>

int main( void )
{
uint8_t ad;
DDRB=0B00000010; /* PB1 OC0Bを出力に設定する */
ADCSRA=0B10000110; //CK/64
TCCR0A=0B00100011;
TCCR0B=0B00001010;
OCR0A=0B11111111;

ADMUX=0B00100010; //VCCが基準電圧 Left Adjust ADC2(PB4)
while(1){
ADCSRA |= 1<<ADSC; //AD start
while(!(ADCSRA & (1<<ADIF))){} //ADCSRのビット4(ADIF)が1になるまで待つ
ad=ADCH;
OCR0B=ad;
}//while(1)
}