PIC32MXのデータ幅について

このQ&Aのポイント
  • PIC32MXは32ビットアドレス空間のCPUであり、内部レジスタ関連も32ビットです。
  • しかし、メモリ幅は8ビットであり、データメモリを参照すると1アドレス1バイトデータで表示されます。
  • このように、PIC32MXは32ビットのCPUであるが、メモリ幅は8ビットであると言えます。
回答を見る
  • ベストアンサー

pic32mxのデータ幅

初めてPIC32MXでプログラムを走らせようとしています。 MPLAB X IDEとXC32を使っています。 PIC18F等の8ビットCPUの経験はあります。 PIC32MXはアドレス幅32ビットデータ幅32ビットだと思ってプログラムを作り始めました。 デバックするところになって分からないことが出てきました。 XC32におけるint型のデータ幅は32ビット、unsigned char型は8ビットです。 プログラムで変数を定義するとunsigned char型は偶数アドレス、奇数アドレスそれぞで定義されます。 int型の配列を定義すると、偶数番地アドレスを先頭として4バイト単位で割り当てられます。 これは、PIC32MXがバイトアドレッシングCPUで4バイトアライメントということだと思います。(違ったらご指摘下さい。) 実際MPLAB X IDEでデータメモリを参照すると1アドレス1バイトデータで表示されます。 質問は、 PIC32MXは32ビットアドレス空間(実際に持っているROM、RMAサイズは別として) のCPUではあるが、メモリ幅は、8ビットというのではないだろうか? というものです。PIC32MXの内部レジスタ関連は32ビットなので32ビットCPUだとは思いますが、データシートにある「 32 ビットのネイティブデータ幅」という意味がわかりません。 実際のメモリ空間は、アドレス範囲 x 8ビットということでいいのでしょうか。 御教授いただけましたら幸いです。

  • a5900
  • お礼率66% (2/3)

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

  • ベストアンサー
  • koujikuu
  • ベストアンサー率43% (428/992)
回答No.1

PIC32MX は、32bitデータバスなので 一度に32bit(4バイト) のデータ読み書きが可能です またMIPSマイクロプロセッサは、32bit(ワード) , 16bit(ハーフワード) , 8bit(バイト) 単位のアクセスもできます MIPS データ転送命令 参照 http://ocw.kyushu-u.ac.jp/menu/faculty/09/4/10.pdf XC32 ユーザガイド より引用 ネイティブデータサイズ(Native Data Size) ネイティブトレースの場合、[Watch] ウィンドウで使用する変数のサイズは選択したデバイスのデータメモリと同じサイズ(PIC18 の場合は同じバイトサイズ、16 ビットデバイスの場合は同じワードサイズ) である必要がある

a5900
質問者

お礼

koujikuu様、 ご回答ありがとうございました。 よくわかりました。

a5900
質問者

補足

koujikuu様、 ご回答ありがとうございました。32ビットCPUが1度に32ビット値を扱えることは理解できます。知りたいのは、内蔵RAMサイズがアドレスx32ビットの大きさなのか、アドレスx8ビットなのかということです。 XC32のNative Data Sizeに関するからするとPIC32MXは1アドレス32ビットの幅の内蔵RAMを持つデバイスのようにも思えますが、MPLAB X IDEでData Memoryを参照させると1アドレス8ビットで表示されます。 これがXC32の仕様なのかPIC32MXの仕様なのかということです。 実際は1アドレス32ビット幅のメモリが実装されているが、XC32で下位互換を考えて、1アドレス8ビットでオブジェクトを作っているのかどちらでしょう。 http://www5d.biglobe.ne.jp/~noocyte/Programming/Alignment.html#AlignmentTolerantCPU こちらのページを見ると、32ビットCPUは8ビットCPU等との互換性を考え1アドレス8ビットのRAMが一般的であるようにも思えますが、いかがでしょう。

その他の回答 (1)

  • koujikuu
  • ベストアンサー率43% (428/992)
回答No.2

No.1 補足 データメモリ構成は、8ビット幅のメモリが 4っ並列に接続され 32ビット同時アクセスが可能と考えた方が良いです その為 アライメント制約があり32ビット境界をまたぐメモリアクセスは2回に分ける必要があり 命令により8ビットアクセス、16ビットアクセス、32ビットアクセス を選択します なお Data Memory は、Hex Display Width - One / Two / Four の表示幅の選択が可能です

関連するQ&A

  • PIC18F1320でwarningがでる

    PIC18F1320で MPLAB X IDE v3.26 XC 8です warningがでる warningがでてもプログラムは動く warningがでなくしたい LCD液晶表示装置を使うので8ビット符号なし整数型がいい 0から255の8ビット符号なし整数型しか使わない キャラクターコードをLATB(PORTB)に送るため プログラムで-1や256になったりしないよう制御してある #include <xc.h> CONFIG 省略 ほとんど省略 // EQU unsigned char TMRA=1; unsigned char TMRB=1;//など void main(void) { TMRA = TMRA - 20; TMRB = TMR+1;//など } newmain.c: warning: (xxx) conversion to shorter data type よろしくお願いします。

  • XC8でPIC18F2420にIDを書き込む方

    XC8でPIC18F2420にIDを書き込む方法 MPLAB C18 か HI-TECH C か覚えていないのですが MPLAD IDEだったと思いますMPLAD X IDEではない+ WARNINGは出ますがコンパイル、ビルドは出来ていた? MPLAD X IDEでMPLAB XC8 でIDを書き込む方法教えてください MPLAB C18 か HI-TECH Cのとき //ID #define ID "0000001" unsigned char rom idlocData_org[8] = ID; #pragma romdata overlay idocs = 0x200000 unsigned char rom idlocsData[8] = ID; #pragma romdata よろしくお願いします。

  • PIC16F1827のEEPROMへの書込み

    PCM V5.0(PIC用CCS社コンパイラ)を Mplab8.92に組込み、PICkit3を使ってプログラムしています。 PIC16F1827のEEPROMへの書込みがうまくいきません。 RAは入力ポートで固定してあります。 RBは出力ポートでLEDが接続してあります。 テストプログラムは一回のみの動作です。 実機で動作させると RAは固定してあるので当然(4)でLEDが点灯しますが、 実機からCPUを抜き取りMplab上でReadすると EEPROMのアドレス0,1,2は異なるデータであり 動作させるたびに違うデータが書込まれています。 しかし (1) a0=35h (2) a1=a6h (3) a2=93h と定数にすると EEPROMのアドレス0,1,2は正しいデータが 書込まれています。 Q1. a0,a1,a2をポート入力とする場合は CPU自体に何か設定する必要があるのでしょうか? それともプログラムに工夫が必要なのでしょうか? いままで使っていたPIC16F88では このようなことはなかったと思うのですが・・・。 ----- テストプログラム ----- a0 = RA; //(1) write_eeprom (0,a0); a1 = RA; //(2) write_eeprom (1,a1); a2 = RA; //(3) write_eeprom (2,a2); if (a0 == a1 && a1==a2) //(4) RB =255; else RB =0;

  • PIC16F819のADC機能について

     PIC16F819のA/D変換プログラムをC言語で作りたいのですが、参考になるサイトや本がないのでどこから手をつけていいのかまったく分かりません。  試しにPICC Compilerの期間限定版をダウンロードして、その中にあったサンプルプログラムを見てみました。PIC16F87X用のADCのサンプルプログラムがあったので、とりあえずMPLABでコンパイルしてみましたが、ADGOの部分でエラーが出てしまいました。どうもPIC16F819ではADGOが使用できないようですが、どうすれば改善されるのでしょうか?  分かる方がいましたら、御教授よろしくおねがいします。 サンプルプログラム #include <pic.h> __CONFIG(DEBUGEN&WDTDIS&LVPDIS); /***Sample code to set up the A2D module********/ void init_a2d(void){ ADCON0=0; ADCON1=0; ADON=1; } /***Return an 8 bit result**********************/ unsigned char read_a2d(unsigned char channel){ channel&=0x07; ADCON0&=0xC5; ADCON0|=(channel<<3); ADGO=1; while(ADGO)continue; return(ADRESH); } /***Main関数*************************************/ void main(void){ unsigned char x; init_a2d(); GIE=0; TRISB=0xF0; for(;;){ x=read_a2d(1); PORTB=(8>>(x>>6)); } }

  • ビット数とデータ幅について

    こんにちは。過去の質問も検索してみましたが、ドンピシャのものがなかったので、質問させていただきます。 現在、ARMの入門書を読みながらアナログデバイスのマイクロコントローラを勉強しています。このデバイスは32ビットなのですが、先入観で特定のアドレスを指定すると、32ビットのデータが出てくるものだと信じておったのですが、実は仮想的にそうしているだけで実際のレジスタ上では8ビット幅のようです。つまり、アドレス4個分使って32ビットのデータ幅を実現していると・・・ エンディアンというキーワードがあるようですね。 したがって、いまある多くのCPUといわれるものは、ミクロな視点からすると、一度に8ビットのデータにしかアクセスしていない、ということでいいのでしょうか?

  • PICでのアセンブリで、データレジスタについて教えて!

    PICでのアセンブリについて教えてください! 使用してるPICは18f452です。 PICのデータメモリを全部使いたいんです。 たとえばソースの冒頭で data_1 equ 0x00 data_2 equ 0x01 ・ ・ ・ data_n equ 0x0x とすべて宣言する方法がありますが、452のメモリは1500バイト以上あるのでこれを千行以上かくのは疲れます。。 そこでC言語で書くところの int data [1500]; for(,,,){ data[i] = xx; } という風に大容量のメモリを作り それに値をいれたり読み出したりしたいのですが・・。 これをアセンブラで書くにはどうしたらよいでしょうか?。

  • MplabのRead_EEPROM

    Mplab8.92+PICkit3でPICのプログラムをしています。 ポート入力をPIC内蔵のEEPROMに書込むようなプログラムを作り ターゲットボード上で動作させた後、PICをボードから抜き取り Mplab上でReadしViewメニューのEEPROMで見ると ポートの入力とは異なる値になっています。 (ボードの入力はプルアップした上で固定してあります。) しかし、A社のプログラマーでReadすると ポート入力がEEPROMに正しく書込まれています。 (A社のプログラマーはサポートのデバイスが少ないので 現実的には使えないのですが。) 色々試してみると プログラムとして、「PIC内蔵EEPROMデータメモリに初期値として書込んだデータ」は 正しく、書込み、読取できましたが ボード上で動作しないと確定しないようなデータ (ポートの入力、カウント回数・・・等) は、正しく書込まれている (プログラムの動作から確認すると) けれどもMplab上のReadでは正しく表示されませんでした。 MplabのReadとはこういうものなのでしょうか? (私の推測ではMplabのRead-View-EEPROMはCPUを実機で 動作させることなくパソコン上でシュミレーションするための もののように思えてきたのですが・・・) それとも、何か設定すれば可能になるならば 教えてください。 私の場合Mplabを使う場合 シュミレーションとかは使いません。 コンパイルしてCPUに書込み(Program)するだけです。

  • PICのprintfで5桁の整数を表示させたい

    PIC 16F688、mplab xc8を使っています。 LCDにprintfで5桁の整数を表示させたいのですが、65536以上はうまく表示できません。 5桁で99999を表示させるにはどうすればいいでしょうか? 例えば、このように書くと99999以上の数字が表示されてしまいますが、65535までは正常に表示されます。また、0も5桁で正常に表示されています。 unsigned short long a; a=99999; printf("%05.5lu",a); SLEEP(); printfの%lが悪いのか、%uが悪いのか、他の指定が有るのか分かりません。

  • PICのプログラムについて質問です

    使用するPICは16F84Aで、MPLAB IDEv8.88を使ってこのようなプログラムを作りました。 #include"pic.h" static void pic_init(); static void Delay_ms(unsigned char ms); static void Delay_1ms(); void main(){ pic_init(); while(1) { RB0 = 1 ; Delay_ms(250); Delay_ms(250); Delay_ms(250); RB0 = 0 ; Delay_ms(250); Delay_ms(250); Delay_ms(250); } static void pic_init() { // GPIO = 0b00000000; TRISA = 0xFF ; TRISB = 0x00 } static void Delay_ms(unsigned char ms) { unsigned char c; for (c=ms ; c>0 ; c--) { Delay_1ms(); } } static void Delay_1ms() { unsigned int cnt; unsigned int i; cnt = 76; for (i=0 ; i<cnt ; i++) { NOP(); } } ポートB0の出力を0から1にするプログラムなのですが、実行すると Error [314] C:\Users\moriwaki\Desktop\PIC program\step_test2.c; 52.24 ";" expected Error [254] C:\Users\moriwaki\Desktop\PIC program\step_test2.c; 77.0 undefined variable: "pic_init" ********** Build failed! ********** というエラーが出ます。このようなエラーが出る原因を教えて頂けないでしょうか。お願いします。

  • PICが動作しません。

    以前に加速度センサーとI2C通信のことで質問したものです。 基礎から勉強しているのですが、一番初めで躓きました。 PICが動作しません。 MPLAB IDE v8.88 CコンパイラはXC8です。 後閑さんの本「PICマイコンの基礎」で勉強しています。 PICが動作しません。 MPLAB IDE v8.88 CコンパイラはXC8です。 PICは16F1936です。 ライターはPICkit3です。 【現象】 本のプログラムで書き込みをしても PICが動作しません。 テスターで出力設定したピンの電圧を測定しても、出力がでません(0Vです) 【調べたこと】 1・ライターはエラーでは無さそうです。 「Programming/Verify complete」 と表示されます。 しかし、PICkit3の3番ピンをブレッドボードにさすと、 「Target Device ID (00000000) does not match expected Device ID (00002360).」 と出ます。 このままでは、書き込みも出来ないので、 「READ」を押してからだと、上記のIDエラーが解消され、書き込みができますが、動きません。 条件はわかりませんが、 「he following memory regions failed to program correctly: Program Memory Address: 00000000 Expected Value: 00003180 Received Value: 00000000」 というエラーもたまにでます。 2.PICは2つあるので、交換しても同じです。 【考察】 1.プログラムが間違っている (1)本のプログラムを何度も見直し+サポートページからコピペでしてます。 ただ、コンフィグレーション設定の「BORV19」と打つとコンパイルエラーが出ますので、入れていません。 →関係あるのでしょうか?これは「どの電圧まで下がったらリセットするか」なのと、デフォルトでも1.9なので関係ないと思います が・・・ 2.XC8のコンパイラが悪い? ヘッダファイルは「XC.h」と「htc.h」両方で試しました。 何か相性等があるのでしょうか。 【プログラム】 25ピンから電圧を出力するだけのプログラムに変更し確認しましたが動作しませんでした。 #include <xc.h> __CONFIG(FOSC_INTOSC & WDTE_OFF & PWRTE_ON & MCLRE_ON & CP_OFF & CPD_OFF & BOREN_ON & CLKOUTEN_ON & IESO_OFF & FCMEN_OFF); __CONFIG(WRT_OFF & PLLEN_OFF & STVREN_OFF & LVP_OFF); #define _XTAL_FREQ 8000000 // クロック周波数設定 void main(void) { OSCCON = 0x70; // 8MHz INTOSC ANSELB = 0; // PORTBをデジタルに設定 TRISB = 0; // PORTBすべて出力モード /** メインループ 永久ループ **/ while(1) { RB5=1; } } 私なりに色々とネットで調べても解決しませんでした。 長文で、大変失礼ですが、ご回答下さると幸いです。

専門家に質問してみよう