質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

マイコン

マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

Q&A

解決済

3回答

660閲覧

RXマイコン,ピン(ポートではなく)のアドレスを知りたい→ビットフィールド?

ElecDove

総合スコア254

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

マイコン

マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

0グッド

0クリップ

投稿2018/09/25 02:42

いつもありがとうございます.

現在ルネサスのRXマイコンを用いた開発を行っています.

その際,関数に対してあるポートのあるピンを引数として与えたいのですが,
マイコンでは,「ピン」はビットフィールドであらわされているため,
そのピンのアドレスを取得することができません
(そのピンの存在するポートでしたら取得できますが…)

例えばですがこんな感じが目標です.

C

1main(){ 2 SetOutputMode(PORT1.DDR.BIT.B0); // PORT1の0番ピンを出力モードにする 3} 4 5void SetOutputMode(fuga* pin){ 6 //引数で与えられた「ピン」の方向レジスタを1にしたい. 7 *pin = 1; 8}

自力で考えた限りでは,
PORTのアドレス(unsigned char*)と,何ビット目かのマスク値(0b00000001)を渡して,1ならORで,0なら反転してANDしてやれば行けるような気がしますが,
冗長すぎて使い物にならない....
ビット番号とマスク値は固定なのであらかじめ定義してやってもいいのかもしれませんが…

何か良い方法はありますでしょうか
よろしくお願いします.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ElecDove

2018/09/25 03:03 編集

開発環境はCS+(無償評価版)、マイコンは4,5年前にR8Cから入門しました。普段はWin上のプログラムをC、Cpp、C#で書いています(六年目)
guest

回答3

0

defineマクロを使えば簡単にできそうですね。
#define SetOutputMode(pin) (pin = 1)

投稿2018/09/25 09:55

hillacken

総合スコア359

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ArduinoのpinMode(pin,mode)の実装

C

1void pinMode(uint8_t pin, uint8_t mode) 2{ 3 uint8_t bit = digitalPinToBitMask(pin); 4 uint8_t port = digitalPinToPort(pin); 5 volatile uint8_t *reg, *out; 6 7 if (port == NOT_A_PIN) return; 8 9 // JWS: can I let the optimizer do this? 10 reg = portModeRegister(port); 11 out = portOutputRegister(port); 12 13 if (mode == INPUT) { 14 uint8_t oldSREG = SREG; 15 cli(); 16 *reg &= ~bit; 17 *out &= ~bit; 18 SREG = oldSREG; 19 } else if (mode == INPUT_PULLUP) { 20 uint8_t oldSREG = SREG; 21 cli(); 22 *reg &= ~bit; 23 *out |= bit; 24 SREG = oldSREG; 25 } else { 26 uint8_t oldSREG = SREG; 27 cli(); 28 *reg |= bit; 29 SREG = oldSREG; 30 } 31}

ピン番号からアドレスとビットマスクを取ってきています。

投稿2018/09/25 03:33

ozwk

総合スコア13512

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ElecDove

2018/09/25 14:09

回答ありがとうございます 方針としてはy_waiwaiさんと同じに思えます. 天下のArduionがこの実装方法ということは やはり大体このあたりに落ち着くということでしょうか
guest

0

ベストアンサー

RXならルネサスのサイトでハードウエアマニュアルが公開されてますんで
DLしてきましょう。日本語ですぜ

また、開発環境は何をお使いでしょうか。ルネサスの統合環境であれば、自動生成で内蔵デバイスの定義ファイルが自動生成されます

んで、関数の引数にIOポートに一つのビットを与えたい、というのであれば、ポートアドレスとビット番号を引数に取らせるテでしょうか。
また、よくやるのは、ポート番号をそれぞれ定義して、アドレスとビット番号のテーブルを用意して、それでアクセスする、ってことをしますね

投稿2018/09/25 02:45

編集2018/09/25 03:00
y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ElecDove

2018/09/25 02:59

回答有り難うございます。 開発環境はCS+(無償評価版)を使っています。 ハードウェアマニュアルはDL,読んでいますすが、読み込みが足らないでしょうか…。 日本語マニュアル完備ということで迷わずRXを選びました 今回の疑問点は、共用体の中身を引数で渡したいところにあります。 方向レジスタの操作(ピン単位)は地べたに書けばできるのですが…。
y_waiwai

2018/09/25 03:01

回答を更新しました
ElecDove

2018/09/25 03:07

ありがとうございます。 >ポートアドレスとビット番号を引数に取らせる >ポート番号をそれぞれ定義して、アドレスとビット番号のテーブルを用意 大変参考になります。 ビットフィールドへのアクセスを言語上で実装してくれればいいのに…。→C言語
y_waiwai

2018/09/25 03:15

まあしかし、組み込みえんじにあの立場から言うと、IOのイニシャルに関わることまでもピンごとに行う、というのは考えもんだと思っとります。 無駄にコードが肥大するし、何よりもイニシャル漏れが怖いですね #読み書きするのはビットごとでいいんだけど
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問