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

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

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

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

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

受付中

I2Cを使ったArduinoのプログラムをPICのプログラムに書き換えたい。

tea_shark
tea_shark

総合スコア1

C

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

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0回答

0リアクション

0クリップ

450閲覧

投稿2022/04/10 08:51

前提

PICでジャイロセンサを使おうとしています。そこでArduinoのジャイロセンサのプログラムをPICのプログラムに書き換えようとしています。

該当のソースコード

Arduinoのプログラム

arduino

#include<Wire.h> // BMX055 加速度センサのI2Cアドレス #define Addr_Accl 0x19 // (JP1,JP2,JP3 = Openの時) // センサーの値を保存するグローバル変数 float xAccl = 0.00; float yAccl = 0.00; float zAccl = 0.00; void setup() { // Wire(Arduino-I2C)の初期化 Wire.begin(); // デバッグ用シリアル通信は9600bps Serial.begin(9600); //BMX055 初期化 BMX055_Init(); delay(300); } void loop() { Serial.println("--------------------------------------"); //BMX055 加速度の読み取り BMX055_Accl(); Serial.print("Accl= "); Serial.print(xAccl); Serial.print(","); Serial.print(yAccl); Serial.print(","); Serial.print(zAccl); Serial.println(""); delay(1000); } //=====================================================================================// void BMX055_Init() { //------------------------------------------------------------// Wire.beginTransmission(Addr_Accl); Wire.write(0x0F); // Select PMU_Range register Wire.write(0x03); // Range = +/- 2g Wire.endTransmission(); delay(100); //------------------------------------------------------------// Wire.beginTransmission(Addr_Accl); Wire.write(0x10); // Select PMU_BW register Wire.write(0x08); // Bandwidth = 7.81 Hz Wire.endTransmission(); delay(100); //------------------------------------------------------------// Wire.beginTransmission(Addr_Accl); Wire.write(0x11); // Select PMU_LPW register Wire.write(0x00); // Normal mode, Sleep duration = 0.5ms Wire.endTransmission(); delay(100); }

試したこと

PICのプログラム

C

#include "mcc_generated_files/mcc.h" #include "mcc_generated_files/examples/i2c_master_example.c" // BMX055 加速度センサのI2Cアドレス #define Addr_Accl 0x19 // (JP1,JP2,JP3 = Openの時) // センサーの値を保存するグローバル変数 float xAccl = 0.00; float yAccl = 0.00; float zAccl = 0.00; void BMX055_Init(void); void BMX055_Accl(void); void main(void) { // initialize the device SYSTEM_Initialize(); // Enable the Global Interrupts INTERRUPT_GlobalInterruptEnable(); // Enable the Peripheral Interrupts INTERRUPT_PeripheralInterruptEnable(); // Wire(Arduino-I2C)の初期化 I2C_Initialize(); //BMX055 初期化 BMX055_Init(); __delay_ms(300); while (1) { //BMX055 加速度の読み取り BMX055_Accl(); printf("Accl= "); printf(xAccl); printf(","); printf(yAccl); printf(","); printf(zAccl); printf("\n"); } } void BMX055_Init() { //------------------------------------------------------------// I2C_Open(Addr_Accl); I2C_WriteNBytes(Addr_Accl,0x0F,1); // Select PMU_Range register I2C_WriteNBytes(Addr_Accl,0x03,1); // Range = +/- 2g I2C_Close(); __delay_ms(100); //------------------------------------------------------------// I2C_Open(Addr_Accl); I2C_WriteNBytes(Addr_Accl,0x10,1); // Select PMU_BW register I2C_WriteNBytes(Addr_Accl,0x08,1); // Bandwidth = 7.81 Hz I2C_Close(); __delay_ms(100); //------------------------------------------------------------// I2C_Open(Addr_Accl); I2C_WriteNBytes(Addr_Accl,0x11,1); // Select PMU_LPW register I2C_WriteNBytes(Addr_Accl,0x00,1); // Normal mode, Sleep duration = 0.5ms I2C_Close(); __delay_ms(100); } void BMX055_Accl() { unsigned int data[6]; for (int i = 0; i < 6; i++) { I2C_Open(Addr_Accl); I2C_WriteNBytes((Addr_Accl,2 + i,1));// Select data register I2C_Close(); Wire.requestFrom(Addr_Accl, 1);// Request 1 byte of data // Read 6 bytes of data // xAccl lsb, xAccl msb, yAccl lsb, yAccl msb, zAccl lsb, zAccl msb if (Wire.available() == 1) data[i] = SSP1BUF; } // Convert the data to 12-bits xAccl = ((data[1] * 256) + (data[0] & 0xF0)) / 16; if (xAccl > 2047) xAccl -= 4096; yAccl = ((data[3] * 256) + (data[2] & 0xF0)) / 16; if (yAccl > 2047) yAccl -= 4096; zAccl = ((data[5] * 256) + (data[4] & 0xF0)) / 16; if (zAccl > 2047) zAccl -= 4096; xAccl = xAccl * 0.0098; // range = +/-2g yAccl = yAccl * 0.0098; // range = +/-2g zAccl = zAccl * 0.0098; // range = +/-2g }

Arduinoのプログラムをわかる範囲で書き換えました。変更点は下記の通りです。

  • Wire.beginTransmission(Addr_Accl); を I2C_Open(Addr_Accl); に変更
  • Serial.print(); を printf(); に変更
  • Wire.write(); を I2C_WriteNBytes(); に変更
  • Wire.endTransmission(); を I2C_Close(); に変更
  • data[i] = Wire.read(); を data[i] = SSP1BUF; に変更
  • delay(); を __delay_ms(); に変更

上記の変更はあっていますでしょうか?
また、

arduino

Wire.requestFrom();

arduino

Wire.available()

この2つのArduinoのコードをPICでのコードに書き換えるときに、
どのように変えればいいか分かりませんでした。

補足情報

MCCを利用しています。

どなたか教えてください。よろしくお願いします。

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

2022/04/10 08:53

こちらの質問が他のユーザーから「やってほしいことだけを記載した丸投げの質問」という指摘を受けました。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

C

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

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。