アプリ版:「スタンプのみでお礼する」機能のリリースについて

AVRにCでプロプラムしてみようと思い、プログラムしてみています。
検索しても良くわからない事が幾つか有ったので質問させて下さい。

利用しているマイコンは2313です。

io.h内で各ペリフェラルのアドレスのような物を関連付けしている「_SFR_IO8()」っていうのと「_SFR_IO16()」っていう関数?の働きが良くわかりません。
printf()関数とか使えれば試せますが…

#define  PORTD  _SFR_IO8(0x12)

等となっているので、

_SFR_IO8(0x11) = 0x7f;
_SFR_IO8(0x12) = 0x7f;

と書けばエラーを出さずにコンパイル出来ますし実行できます。
ですが関数ですとこういった使い方が出来ないように思うのですが…
AVRに限らずC言語の機能の一部なのかも知れませんが今まで使った事が無い物なので無知でして、何方か知恵を貸していただけませんか?

A 回答 (2件)

AVRでは、I/O もメモリ空間上に割り当てられており(メモリマップドI/Oと言います)、


0x12番地がPORTDになっていますので、
0x12番地への書き込み=ポート出力、0x12からの読み込み=ポート入力になります。

一方、_SFR_IO8 は、さらに sfr_defs.h で
#define _SFR_IO8(io_addr) _MMIO_BYTE((io_addr) + __SFR_OFFSET)
と定義されています。また、__MIO_BYTE、_SFR_OFFSET は、
#define _MMIO_BYTE(mem_addr) (*(volatile uint8_t *)(mem_addr))
# define __SFR_OFFSET 0x00
となっているため、
PORTD=0x7f;
というコードは、最終的に、
(*(volatile uint8_t *)(0x12)) = 0x7f;
というコード、すなわちメモリ0x12番地への書き込みに置き換えられます。
そういう流れで「PORTD=0x7f;」というコードがポート出力処理されるコードになるわけです。

そういうマクロ定義を用意することで、Cのプログラム中で、例えばPORTDへの出力を
(*(volatile uint8_t *)(0x12)) = 0x7f;
のような意味不明な記述をしなくても、
PORTD=0x7f;
という意味がが分かりやすい記述ができるようになっているわけです。
    • good
    • 0
この回答へのお礼

回答有難うございます!!
一つ気になる事が有るのですが、sfr_defs.hをincludeしていないですし、io.h内(io2313.h)にもsfr_defs.hはincludeされていないようですが何処からincludeされているのでしょうか?

お礼日時:2011/04/24 01:16

> 一つ気になる事が有るのですが、sfr_defs.hをincludeしていないですし、


> io.h内(io2313.h)にもsfr_defs.hはincludeされていないようです

io.h 中に、
#include <avr/sfr_defs.h>
と言う記述があります。

あと、ATtiny2313 の場合のI/O設定は iotn2313.h です。io2313.h はAT90S2313の設定ファイル。

iotn1313.hも io.h 中で
#elif defined (__AVR_ATtiny2313__)
# include <avr/iotn2313.h>
といった感じでinlude されています。

また、プロジェクトの設定で ATtiny2313を選んでいると、 自動的に __AVR_ATtiny2313__ がdefineされるため、その時はio.hをincludえすると自動的にiotn2313.hもincludeされます。

そういう流れで、大元のCのプログラムからは、
プログラム側ではCPUの種類を意識することなく
#include <avr/io.h>
するだけでいいようになっているのです。
    • good
    • 0
この回答へのお礼

io.h内に有りました!!
検索かけて見つからなかったのはio2313.h内でした。

ご教授有難うございます!!

お礼日時:2011/04/24 03:09

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!