AVRで学ぶ、はじめてのマイコン 練習2をCで書き直し

AVRで学ぶ、はじめてのマイコン」の練習2を
C言語で書き直してみました。

---------------------------------------------------------

#include
#include

void wt( int );


ISR ( INT0_vect )
{
PORTB = 0b00000001;
wt(800);

PORTB = 0b00000010;
wt(800);

PORTB = 0b00000100;
wt(800);

PORTB = 0b00001000;
wt(800);

PORTB = 0b00010000;
wt(800);

PORTB = 0b00100000;
wt(800);

PORTB = 0b00000000;

}


int main( void )
{

DDRB = 0b00111111;
MCUCR = 0b00000011;
GIMSK = 0b01000000;

sei();

while(1){
wt(800);
}
}


void wt( int turn)
{
int i,j;
for(i = 0 ; i
for(j = 0; j<100 ; j++){

asm("nop") ;

}

}

return;

}


---------------------------------------------------------


これで、教科書と同じ動作をしました。


やはり、Cだと実行ファイルの容量が3倍になりますね。


アセンブラー:  370バイト

C     :1,114バイト



簡単なプログラムならアセンブラーで組んでもいいですが、


込み入ってくるとやっぱりC言語でしょう。


何か最適化する手段はあるのでしょうか。


因みに Win AVR を使っています。


ご存知の方教えてください (T_T)

AVRで学ぶ、はじめてのマイコン 練習1をCで書き直し

AVRで学ぶ、はじめてのマイコン」の練習1を
C言語で書き直してみました。

----------------------------------------------------
#include

void wt( int );

int main( void )
{

DDRB = 0b00111111;

while(1){
PORTB = 0b00000001;
wt(800);
PORTB = 0b00000010;
wt(800);
PORTB = 0b00000100;
wt(800);
PORTB = 0b00001000;
wt(800);
PORTB = 0b00010000;
wt(800);
PORTB = 0b00100000;
wt(800);

}
}

void wt( int turn)
{
int i,j;
for(i = 0 ; i
for(j = 0; j<250 ; j++){

asm("nop") ;

}

}

return;

}


----------------------------------------------------


非常にシンプルです。


動作は全く同じです。


但し生成されたファイルの大きさが全然違います。


アセンブラー:300バイト

C言語   :934バイト


3倍に膨張しました。このコンパイラーは一体何を付け加えた
のでしょう。

逆アセンブルする手段があったら見てみたいと思いますが、
かなり手間かかるだろうなぁ〜。


タグ:AVR

AVRで学ぶ、はじめてのマイコン 練習課題2

これが、練習課題2のプログラムの動作です。





一見練習1と何が違うの?ってところです。
練習1と違いは、ここの練習2では割り込み(インターラプト:interrupt)を利用しています。

Appendixの「リセットと割り込みベクタ」の表が助けてくれます。

順調にすすんでいます。



・・・しかし、スイッチを押すと2回繰り返すときがあります。

多分、スイッチ時のチャタリングが原因かな?
タグ:AVR マイコン
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。