--/--/--  --:--    スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
2007/12/07  19:48    テスト終了~
やっとテスト終わりました。
テスト中に思ったのは、せっかくこのBLOGにAVRを調べにきてくれる方に
AVRの情報を調べるには、ちょっと大変かなってことです。
なんせ、日常のことからマイコンまでいろいろ記事かいてますからw
というわけで、もう一度ちゃんとAVRにまとめた記事を書いて、
これからAVRの技術的な内容の記事は、
このBLOGのカテゴリで、「AVR」というカテゴリを新しくつくり、そのカテゴリにしようと思います。
まあそんな感じです。

続きはAVRマイコンを使っている人には朗報ですし、分からない人にはとことん分からない話。
見たい人だけ見てください。
さて、今日のテスト明けに早速部活動しましたが、
本日はレジスタのビット操作についてやりました。
H8マイコンでは、レジスタをビットごとに操作できます。

例)H8/3052の場合、P1.DR.BIT.B0 = 0;  a=P2.DR.BIT.B0; など

AVRでは基本的にビットごとの操作ができません。
なので、今までは、

#define sbi(PORT,BIT) PORT|=_BV(BIT)
#define cbi(PORT,BIT) PORT&=~_BV(BIT)
#define ibi(PORT, BIT) (bit_is_set(PORT,BIT)?1:0)

といったようにdefineを使用し関数的に、レジスタをビットごとに操作していました。

例)sbi(PORTD.PD0);  a=ibi(PINB,PB2); など

ですが、この方法だと、入力する際には変数に1か0が入るのでいいのですが、
出力の場合、1を出す場合sbi、0を出す場合cbiというように、関数的な出力でした。
この場合の欠点として、レジスタに1か0を入れるのではないため、
スイッチが押されたらLEDを点灯、押されてないときは消灯というようなプログラムを書くときに、わざわざif文を使用して、

if(ibi(PINB,PB2)==0)
{
    sbi(PORTD,PD0);
}
else
{
    cbi(PORTD,PD0);
}

というような長文になってしまいます。
しかし、H8でこのような文章を書くときには、

P1.DR.BIT.B0 = ~P2.DR.BIT.B0;

といったように一行で終わります。
これはプルアップした入力ポートの1か0かの情報が入ったDRのビットのデータ(1か0)を
NOTしてLEDの接続されているポートのDRのビットにデータをそのまま入れているからです。
この書き方はとても楽で、便利です。
なのでこの方法がAVRでもできないかと自分でヘッダファイルを書いて見ました。

途中、なぜAVRはこの便利な方法でヘッダファイルは書かれておらず、
すべてdefineで書かれているのかという疑問がありましたが、
先輩と話した結果、AVRはやはりH8に比べるとプログラムメモリの容量がすくないため、
このような書き方ができるようなヘッダファイルをつくると、IOの定義だけでメモリがいっぱいになってしまうから、という推測がなされました。
たしかにdefineだと、置き換えるので、必要なところだけ置き換わるだけで、
H8のように構造体と共用体でずらずら書くよりもメモリがぜんぜん使われません。
まあ、最近のAVRは容量が大きいものもあるので、構造体と共用体で書いても、
そこまでメインのプログラムの領域を圧迫することにはならないだろうというのが自分の考えです。

とりあえず、今よく使っている、ATMEGA8515のIOポート定義を書いてみました。
io_m8515.h いつも通り、.hではBLOGにアップロードできないので、.txtにしてあります。.hに直して使ってください。
.hにしたら、WinAVR/avr/include/にいれてください。#includeで使えます。
書き方は下記の通りです。

DDRの場合、
PA.DDR = 0xF0;
DDRは普通に16進数2文字入力しか対応してません。

PORTの場合、
PA.PORT.BYTE = 0xF0; バイト操作
PA.PORT.BIT.B0 = 1; ビット操作
PA.PORT.BIT.B0 = 0;

PINの場合、
a = PA.PIN.BYTE; バイト操作
a = PA.PIN.BIT.B0; ビット操作

といったように使用できます。
PAの部分は使用するポート名に合わせて、
(ポートAならPA、ポートBならPBのように。)
その次に操作したいレジスタ名、
(DDR、PORT、PINのどれか)
そのあとに、PORTとPINの場合は、バイト操作かビット操作を選ぶ
(バイト操作ならBYTE、ビット操作ならBIT)
そして、ビット操作なら操作したいビット番号を入力
(ビット0ならB0、ビット4ならB4のように)
簡単ですね。
この書き方はほぼH8/3052のIOポートの書き方に似せて作ってあります。
というよりも、H8/3052のヘッダファイルを参考につくりました。
便利ですので、使ってみてください。
まだ、ポートDとEしか8515で試していないのでほかのポートでもしかしたらうまく動かない場合があるかもしれませんが、ご了承を。

ヘッダファイルの中身を詳しくしりたい方がいましたら、コメントください。
ヘッダファイルの中身は構造体や共用体、ポインタなどちょっと難しい内容があります。

ちなみにこのヘッダファイルではIOポートしか定義していません。
なので、タイマのレジスタなどをビットごと操作することはできません。
なので、もしこのヘッダファイルを使う場合は、
#include<avr/io.h>
#include<io_8515.h>
というように、いつも使用する標準のio定義のヘッダファイルもincludeしてください。
もちろん、両方includeすれば、PORTD = 0x0F;でもPD.PORT.BYTE = 0x0F;でもしようできます。
もしこのヘッダファイルをincludeしてメインのプログラムを書く容量がない場合などは、includeしなければOKです。
とりあえず説明はこんなものかな?
長々書いてすいません。
また近いうちに、よく使うATtiny2313やATtiny45などのヘッダファイルもつくりたいと思います。
Secret

TrackBackURL
→http://amenotiyukizora.blog76.fc2.com/tb.php/151-7865a7a3
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。