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言語の機能の一部なのかも知れませんが今まで使った事が無い物なので無知でして、何方か知恵を貸していただけませんか?
No.1
- 回答日時:
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されているのでしょうか?
No.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>
するだけでいいようになっているのです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- ドライブ・ストレージ SSDを追加したら昔のHDDがおかしくなった 4 2023/03/23 13:25
- ドライブ・ストレージ 家庭用のNASについて 2 2022/07/05 18:30
- ドライブ・ストレージ NASのHDDを同じ型式の別のNASに移設できますか? 4 2022/11/24 19:11
- Ruby 教えてください 2 2023/01/04 17:50
- ルーター・ネットワーク機器 WN-G300TVGR有線速度が遅い 3 2023/08/03 06:55
- その他(恋愛相談) 彼女に陰毛どのくらい処理して欲しいですか? 私はioはツルツルにしてVは自然に処理する程度に残してあ 5 2022/12/06 12:57
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 malloc関数を使ってください!お願いします! 最 1 2022/07/21 09:28
- SEX・性行為 えちえちのときの陰毛処理について質問です! 彼女がvio剃っていないと嫌ですか?毛量などは減らしたり 7 2023/02/06 20:06
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- その他(恋愛相談) 彼女に陰毛どのくらい処理して欲しいですか? 私はioはツルツルにしてVは自然に処理する程度に残してあ 2 2022/12/08 00:48
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
COBOLのピリオド
-
素数を探すプログラム…。
-
VBでContinueを使うには?
-
360度を超える角度
-
整数格子点を列挙するプログラム
-
fortran if文
-
c言語のプログラミング 2つの整...
-
Sublime Text 3でのFortranプロ...
-
JCLの基本について教えてください
-
正しい五十音順について
-
VBAで仕様書は書きますか?
-
C++ で、「)」が必要 というエ...
-
あるプログラムのコマンドライ...
-
Excelで4096点以上のFFTの方法
-
0除算して、落ちるプログラムと...
-
Excelに埋め込んだVBAのプログ...
-
VBAの再計算が反映されない件に...
-
PICマイコンのコピー(クローン...
-
排他的論理和 BCC(水平パリテ...
-
Dijkstraて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラミング
-
【JAVA】数字をひし形に出力す...
-
変数の値が勝手に変化する原因
-
ruby
-
JCLの基本について教えてください
-
値Xを入力し、その平方根を画面...
-
N88basicを用いたGPIB制御
-
COBOLのピリオド
-
ProC 固定SQLでNULLってどう表...
-
Fortran90についての質問です。
-
main関数終了時のreturnの意味は?
-
360度を超える角度
-
C言語 バッファについて。
-
3つの整数のうち奇数のみを表示...
-
Fortran "実引数の型が仮引数の...
-
Delphi 6 で 2進数→10進数変換
-
javaで整数nを入力し、それが素...
-
fortran if文
-
3次関数を作るプログラム
-
BASICプログラム入門 副書名 プ...
おすすめ情報