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

このブログを検索

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

2008年7月19日土曜日

加速度センサを使う


加速度センサKXM52(秋月版)のX,Y2軸の加速度を
Tiny26で計測し液晶SC1602BSで表示します.
Tiny26は内部発振8MHzに設定します.
Int.RC Osc. 8MHz:Start-up time:6CK+64ms
注意:KXM52-1052の感度は,5Gに対してVCCの電圧変化とります.
下記プログラムでは,
4Gに対してVCCの電圧変化するような
プログラムになっていますので修正が必要です.

Tiny26とSC1602BSのピン接続は以下のとおりです.
PA0--RS
PA1
PA2--E
PA
3
GND
AVCC
PA4--DB4
PA5--DB5
PA6--DB6
PA7--DB7
GND--R/W,Vo,Vss
5V--Vdd
PB6(ADC9):OutX
PB5(ADC8):OutY

回路











ソースプログラム

#include <avr/io.h>
#include <avr/interrupt.h>
uint16_t a;//aは16ビット整数でマイクロ秒単位のカウントを行うa<65535

ISR (TIMER0_OVF0_vect){ //タイマカウンタ0のオーバーフローで呼ばれる
a+=256;
}
//マイクロ秒単位の待ち
void delay(uint16_t t){
TCNT0=0;
a=0;
while(a+TCNT0<t){}
}
void en(void){
PORTA|= 1<<2;
delay(20);
PORTA&=~(1<<2);
delay(20);
}

void cmnd(char i){
PORTA=i&(0B11110000);
en();
PORTA=(i<<4)&(0B11110000); //i<<4は4ビット左シフト &はビット間のAND
en();
delay(40);
}

//データの書き込み
void dat(char i){
PORTA=i&(0B11110000);
PORTA|= 1<<0; //RS:High
en();
PORTA=(i<<4)&(0B11110000);
PORTA|= 1<<0; //RS:High
en();
delay(40);
}

void disp(uint16_t ad){
uint16_t x;
if(ad<512){dat(0X2D);//-
ad=512-ad;}
else{dat(0X20);//SPACE
ad=ad-512;}
x=ad;
//-512 to 511 : -2 to +2 G
//x=(x*2000)/512; //bin to dec
x=(x*125)/32; //bin to dec
ad=x;
dat('0'+ad/1000);
ad%=1000;
dat(0X2E); //dot
dat('0'+ad/100);
ad%=100;
dat('0'+ad/10);
ad%=10;
dat('0'+ad);
dat(' '); //SPACE
dat('G'); //G
}

int main( void )
{
uint16_t i,ad;
DDRA = 0xFF;
DDRB=0X00; //全て入力
ADMUX=0B00101001; //AVCC LEFT ADJUST, ADC9
ADCSR=0B10000110; //SET ADCSR CK/64
TCCR0=0B00000010; // CK/8
TIMSK|= 1<<TOIE0; //T0 Ovf Int Enable
sei(); //All Int Enable

for(i=0;i<200;i++)delay(1000); //Wait 200ms
PORTA =0B00110000;
en();
delay(5000); //Wait 5ms
en();
delay(100); //Wait 100Us
en();
delay(50); //Wait 50Us
PORTA=0B00100000; //Function set
en();
delay(50); //Wait 50Us
cmnd(0B00101100); //N=1:2lines F=1:10dots
cmnd(0B00001100); //Display On Off Control
cmnd(0B00000110); //Entry Mode Increment

while(1){
cmnd(0B00000001); //Clear LCD
delay(2000); //Wait 2ms
ADMUX=0B00101001; //AVCC LEFT ADJUST, ADC9
ADCSR|= 1<<ADSC; //AD start
while(!(ADCSR & (1<<ADIF))){} //ADCSRのビット4(ADIF)が1になるまで待つ
ad=ADCL/64;
ad+=ADCH*4;
dat('X'); //X
dat(':'); //:
disp(ad);

cmnd(0XC0); //DDRAM=40 Lower Line
ADMUX=0B00101000; //AVCC LEFT ADJUST, ADC8(PB5)
ADCSR|= 1<<ADSC; //AD start
while(!(ADCSR & (1<<ADIF))){} //ADCSRのビット4(ADIF)が1になるまで待つ
ad=ADCL/64;
ad+=ADCH*4;
dat('Y'); //Y
dat(':'); //:
disp(ad);

for(i=0;i<500;i++)delay(1000); //Wait 500ms
}//while(1)
}