• ベストアンサー

マイコンの特殊レジスタ定義

パナソニックのMN101というマイコンを使いたいのですが、特殊レジスタの定義方法がよくわかりません。 今までルネサスのマイコンを使っていて、ルネサスの方は#pragma addressと共用体をつかってバイトだけじゃなくてビット単位でレジスタに読み書き出来たのですが、パナソニックは#pragma addressが使えません。 サポートページでダウンロード出来る定義ファイルはバイト単位でしか読み書きできませんでした。 #pragma addressを使わずにビット単位で読み書きする方法を教えてください。 共用体で例えばPort1の中の1ビットをPort1.bit.b1みたいに読み書きする方法はわかったのですが、ルネサスのようにそれにP1_1と名前を付けて扱いたいです。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

Port1.bit.b1 というのが、メーカーの提供しているファイルに 定義されていればまず安全でしょう。 さて、 P1_1 という記述で、Port1.bit.b1 にアクセスするため には、単純に、 #define P1_1 Port1.bit.b1 とするだけです。 ルネサスのものも、#pragma address の指定はビット演算とは 直接関係ありません。(単に、固定アドレスであることを明示 しているだけです) ルネサスの定義ファイルの中でも、 union byte_def p1_addr; #define p1 p1_addr.byte #define p1_0 p1_addr.bit.b0 /* Port P10 bit */ のように指定されているのがわかると思います。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.4

ルネサスの場合、コンパイラでサポートされて、マニュアルにも載っているので安心ですが、そうでないコンパイラで無理にやるのは危険だと思います。 インライン関数やマクロとかで妥協するのが無難ではないかと思います。

全文を見る
すると、全ての回答が全文表示されます。
  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.2

#SFRの定義じゃなくてSFRへのアクセス方法の定義、ですよね? > 共用体で例えばPort1の中の1ビットをPort1.bit.b1みたいに読み書きする方法はわかったのですが、ルネサスのようにそれにP1_1と名前を付けて扱いたいです。 質問の目的がそこだけなら、普通にdefineすればいいのでは。 #define P1_1 (Port1.bit.b1) というふうに。 #ってHEWのSFWもビット単位アクセスは同じような共用体使ってたような……

全文を見る
すると、全ての回答が全文表示されます。
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.1

ビット単位でレジスタにアクセスする一般的な方法はありません。 パナソニックのマイコン用のコンパイラは何を使っているのか知りませんが、(私が使ったことがある)GCCの場合、ビットフィールドを使ってレジスタにアクセスするのは危険です。 ビット演算とシフト演算を駆使して操作を行うようにしてください。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • マイコンのビット数とクロック数

    マイコンの勉強をしています.まだまだ初心者で,とてもくだらない質問かもしれないのですが,マイコンのビット数について尋ねさせて下さい. マイコンには8ビットマイコンとか16ビットマイコンとか32ビットマイコンとかありますよね.少し調べてみると,このnビットマイコンのnを,何と定めるかの厳格な定義はないようでレジスタの幅や内部データバスの幅などとなっているようですね(?) これはつまり,1回で処理出来る,通信できるデータの大きさという理解でよろしいのでしょうか?16ビットマイコンは8ビットマイコンより8ビット大きいデータを処理出来るわけですから,2の8乗倍で256倍の速さってことですか? と,いうことは,8ビットマイコン256MHzのマイコンは,16ビット1MHzのマイコンと同等の処理ができるということなのでしょうか? 回答お待ちしております.

  • I/Oレジスタアドレスを関数に引数として渡すには?

    C言語について質問があるので投稿させていただきました。 現在Renesas製 RXマイコンにてポート制御のプログラムを作成しています。 そこで一点分らない点がありましたのでご教授いただければ幸いです。 現在I/Oポートレジスタの入出力設定を行っています。 レジスタ値を書き換えるだけであれば下記の通りかと思います。 #define PORTA (*(volatile unsigned char *)0x0008C00A) PORTA = 0x01; レジスタアドレスを引数として関数に渡し関数内でレジスタ値を書き換えるにはどうすれば よろしいでしょうか。 void main(void) { setPinMode(PORTA); PORTA.PODR.BIT.B0 = 0x01; while(1); } void setPinMode(uint32_t* portNumber) { *portNumber = 0x01; } としていますが上手くいきません。 型がおかしい? ポインタってものが分かってない? など色々考えてはみたのですが何分初心者なので解決に至っておりません。 よろしければご教授の程よろしくお願いいたします。

  • マイコンと外部とのインターフェース

    マイコン初心者です。 マイコンと、外部デバイスとのインターフェースについて教えて下さい。 マイコンとフラッシュメモリ、UART(パラレル→シリアル変換)等を接続する場合、マイコンのアドレスバス、データバスなど外部バスをそれらデバイスへ接続して、アドレスを指定、データを読み書きするような回路を見てきました。 これと同じようなことを、アドレスバス、データバスがマイコンの外に出ていないタイプ(シングルチップマイコン?)でやろうとした場合、どういった制御方法があるのでしょうか? 汎用入出力ポートを駆使して制御するのでしょうか? それともシリアル(SPIやI2C)で制御できるようなデバイスを選択するべきなのでしょうか。 知識不足で不明瞭な質問かと思いますが、アドバイスよろしくお願いいたします。

  • H8マイコン スタック領域について

    スタック領域について教えて下さい。 [動作環境]  開発環境:ルネサス HEW Version 4.08  マイコン:ルネサス H8/1653  コンパイラ:H8SX,H8S,H8ファミリ用C/C++コンパイラパッケージ V7.00 HEWにて新規作成しますと、セクション定義にスタック領域(S)のアドレスと stacksct.h 内に スタック領域のサイズ #pragma stacksize 0x200 が自動で生成されると思います。 しかし、入手したH8/1653用のサンプルには #pragma stacksize のような サイズ指定がありませんでした。 [サンプル] (1)セクション定義やスタック領域のサイズ指定が無い (2)サブコマンドファイル(xxxx.sub)内でアドレスは設定されているが サイズの設定が無い。 -- サブコマンドファイル(xxxx.sub)-- START  CStart/00000000; START  P,C,D/00000400; START  B,R/00FF2000; START S/00FFC000; [質問]  質問1   (1)のスタック領域はどこに配置されるのでしょうか?  質問2   (2)のスタック領域は 00FFC000 を基準にどう確保   されるのでしょうか? (a)の方向へ確保?(b)の方向へ確保?          00F00000 (a)         ↑       00FFC000 (設定アドレス)         ↓       00FFFFFF (b)        質問3   (1)、(2)共にスタック領域と同時にヒープ領域も指定がありません。   これらは指定しなくても問題ないものなのでしょうか?   また、熟練者の方は指定しないものなのでしょうか? よろしくおねがいします。

  • マイコンによる電流制御

    とても勉強になるサイトなので、どんどん質問させて下さい。 電気設計に精通した皆様、宜しくお願い致します。 DCモータの駆動回路部分をマイコンにて電流制御したいです。 一番シンプルなのは、モータに直列に接続した電流検出用の抵抗から、Vsense信号を読み取ってマイコンに入力し、出力となるモータON信号にチョッピング(PWM制御)をかけるのが良いかと思っています。 この場合、マイコンにはどんな機能(ポート)があれば、それが可能なのですか?私としては、A/Dのポートを使えば出来るのかなぁというような感覚なのですが。ルネサスのマイコンなどでは、A/Dと併記でコンパレータと表記のあるポートなどもありました。何となくこれが最も適しているのかなぁとも思います。 初心者なので、認識がおかしいかもしれません。たくさんご指摘頂ければ幸いです。また、他にもっとシンプル(安価)な方法はありますか? 上記と併せてご教示頂けるとうれしいです。 どうか宜しくお願い致します。

  • H8マイコンでled制御

    H8/3052FのマイコンとAKI-H8-USBのキットを使用しています。 ledを制御する際に、通常はportのデータレジスタの該当ビットをlow(0)にしたときに消灯、high(1)に点灯となると思うのですが、 なぜか逆になります。つまりlowレベルのとき点灯します。 他に接続しているスイッチも逆になっているみたいです。 回路の組み立てがおかしいのでしょうか? 理由が分からず悩んでいました。 よろしくお願いします。

  • H8マイコンの書き込みエラーについてです。

    H8マイコンの書き込みエラーについてです。 H8/36087を使用してコンパイル完了となり、MOTファイルを書き込むのですが、書き込みエラーがでます。 エラー内容:「Err0040 ビットレート調整終了の合図を受信できませんでした」 このエラーに対して調べ、swの切り替え、ジャンパピンの設定、シリアルケーブル接続状態を確認したのですが、 それでも同じエラーがでます。 他に考えられる要素はないでしょうか? マイコンは、北斗電子ので、書き込みソフトは、付属のソフトとルネサスのflash development toolkitの二つを試してみたのですが駄目でした。 ちなみに、シリアル通信ポートは、RS232cケーブルの直接と、USBタイプの二つを試しても同じエラーがでました。

  • ルネサスエレクトロニクスRX610ポート設定

    ルネサスエレクトロニクスRX610の使用方法について教えて下さい。 RU610 「P27/PO7/(TIOCA5)/TIOCB5/SCK1」 のポートを、 I/Oポート(出力)として使用したいのですが、 シリアルコントロールレジスタ 0x0008824A  を 0x00 に設定。 データディレクションレジスタ  0x0008C002 を 0x80 に設定(※P27 出力) を設定してデータレジスタ 0x0008C022 の値を切り替えても(0x80 ⇔ 0x00) ポートの出力の論理(H/L)が切り替わりません。 ハードウェアマニュアルには、 TPU、SCI、PPG のレジスタの設定、およびP2.DDR.B7 ビットの設定で切り替わると記載されており、 TPU、PPG のレジスタの設定が不足しているのではないかと考え、色々確認しているのですが、 上手く行かず行き詰り状況です。 どのレジスタ(アドレス)をどのような値に設定すれば良いのかが、 お分かりの方がいらっしゃいましたらご回答頂けますか? 初歩的な内容であり、大変失礼致します。 知識不足の為恐れ入りますがどなたかご回答お願いします。

  • DTCのレジスタ情報設定方法についてご教示ください。

    DTCのレジスタ情報設定方法についてご教示ください。 はじめまして。 現在、SH7145マイコンを使って、DTC、SCIを使用したシリアル通信を 考えておりますが、以下の点で困っております。 転送情報を設定するために、 DTBRに転送情報の先頭アドレス上位16ビット、 DTCベクタアドレス(TXI_0 0x0000043A)に先頭アドレスの下位16ビット を設定しているのですが、0x0000043A番地にアドレスが設定されません。 HEWのデバッガを使用しており、0x0000043A番地を見るとFF FFのままです。 デバッガで0x0000043A番地に、直接下位16ビットの値を設定し、 0x0000043A番地を読みに行った場合には、設定した値を取得出来ました。 そこでプログラム中で正しくアドレスを設定する方法についてご教示ください。 また、DTCベクタアドレス(0x00000400番地から)はROMエリアになる事により、 HEWのビルドの設定等で対応することになるのでしょうか? 以上、よろしくお願いいたします。

  • 組み込みマイコンでのソフトウェアによるリセット

    組み込み用マイコン向けのファームウェアをC言語で 書いています. ここで, ソフトウェア側からマイコンにリセットをかけ るにはどのような方法があるでしょうか? ※マイコン自体には内部的なハードウェアリセットを行 う機能は無いものとします. 素人考えで思いつく限りだと: ・リセットを行う場所の関数からmainまですべて戻る 経路を作っておく. main (または, mainを呼び出すスタートアップルーチ ンの部分)をループにしておき, その始めで内蔵周辺 機能のレジスタやstatic領域のメモリをすべて初期化 するようなコードを ひたすらハードコーディングしておく. (※static領域のメモリ初期化はどのみち行うからよ いとして, 内蔵周辺機能のレジスタをひたすら初期化 するのが面倒に思われます) ・ウォッチドッグタイマ機能があれば, わざとカウン タをオーバーフローさせてハードウェアリセットをか ける. ・外部リセット端子に何らかの形で出力ポートを 接続しておいて, 自分でハードウェアリセットをかける. 上記のものでもやればそれなりに動作しそうな気は しますが, どういう方法が一般的なのか知らないため どうしてよいか悩んでいます. どのようにリセットを行うのがスマートであるか ご教示いただけませんでしょうか?