- ベストアンサー
AVRのC言語についての質問
- AVRのC言語について教えてください。利用しているマイコンは2313です。
- io.h内での_SFR_IO8()と_SFR_IO16()の働きについて理解できません。printf()関数は使えるのでしょうか?
- AVRやC言語の機能として使えるのかわからない物で、他にも理解できない部分があります。どなたか教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
> 一つ気になる事が有るのですが、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> するだけでいいようになっているのです。
その他の回答 (1)
- mtaka2
- ベストアンサー率73% (867/1179)
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; という意味がが分かりやすい記述ができるようになっているわけです。
お礼
回答有難うございます!! 一つ気になる事が有るのですが、sfr_defs.hをincludeしていないですし、io.h内(io2313.h)にもsfr_defs.hはincludeされていないようですが何処からincludeされているのでしょうか?
お礼
io.h内に有りました!! 検索かけて見つからなかったのはio2313.h内でした。 ご教授有難うございます!!