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

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

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

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

Q&A

解決済

3回答

1651閲覧

PIC12F AD変換

raspypy

総合スコア247

C

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

0グッド

0クリップ

投稿2019/04/26 06:18

#AD変換のコード

PIC12FシリーズのAD変換の記述について教えてください。
コンパイラは、XC8を使用しています。

#教えてほしいこと~その①~
ADread = ADRESL + (ADRESH*256);

A/D変換は10bitの仕様です。
A/D変換のデータは、右詰の設定にしてあります。

ADRESLは、下位8bitのデータ
ADRESHは、上位2bitのデータとなります。

ADRESH*256というのは、何をしているのでしょうか。
256(0b100000000)の論理積をとってしまうと、すべて0になってしまう気がするのですが。

#教えてほしいこと~その②~
AD変換後の値を、↓の変数に格納していますが、
static unsigned int ADread

次のワーニングがでてしまいます。
warning: (373) implicit signed to unsigned conversion

signedに変更すれば済むのですが、
別の場所で、同じくAD変換した値を、unsigned char型に代入している個所があり、
今度はこちらにワーニングが出てしまいます。
static unsigned char tx_data;
tx_data = ADread >>8;

ワーニングへの対処法を教えて下さい。

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

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

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

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

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

guest

回答3

0

ベストアンサー

ADRESH*256というのは、何をしているのでしょうか。

ADread = (ADRESH << 8) | ADRESL 相当のことをしています。256でかけて、上位8ビットに当たるよう持ち上げているかんじです。

256(0b100000000)の論理積をとってしまうと、すべて0になってしまう気がするのですが。

論理積(AND)ではなく、この場合は論理和(OR)相当の操作です。ですので下位8ビットは0にはなりません。

別の場所で、同じくAD変換した値を、unsigned char型に代入している個所があり、

unsigned char側にキャストします。これで警告が消えるはずです。

C

1static unsigned char tx_data; 2tx_data = (unsigned char)(ADread >>8);

投稿2019/04/26 06:31

dodox86

総合スコア9183

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

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

raspypy

2019/04/26 08:06

①ADRESH*256について理解できました。 上位8bitにあたるように持ち上げているので、 変数ADreadは、2バイト(16bit)のデータという理解で合っていますでしょうか? ②ワーニングについて 次の記述にしてコンパイルしましたが、同じワーニングが出てしまいました。 static unsigned char tx_data; tx_data = (unsigned char)(ADread >>8); ワーニングが出ている個所は、次の2か所です。 ADread = (ADRESH << 8) | ADRESL; tx_data = (unsigned char)(ADread >>8);
dodox86

2019/04/26 08:21 編集

> 変数ADreadは、2バイト(16bit)のデータという理解で合っていますでしょうか? 取り扱い方次第ではありますが、XC8のint(unsigned int)は16ビットなので、おおむね良いと思います。 A/Dデータ自体は10ビットのデータでしょうから上位6ビットは使われないでしょうけど、16ビットと言うのはプログラムで扱う場合の便宜的な大きさですね。 > 次の記述にしてコンパイルしましたが、同じワーニングが出てしまいました。 こちらは失礼しました。回答した後で気がついたのですが、問題点としているところはADread = ADRESL + (ADRESH * 256); こちら側でしたね。 ADread = (unsigned int)(ADRESL + (ADRESH * 256)); /*ADread = (unsigned int)((ADRESH << 8) | ADRESL);*/ .... tx_data = (unsigned char)(ADread >> 8); /* ここは同じ */ でいかがですか。
raspypy

2019/04/26 10:39

ありがとうございました。 分かりやすい説明で助かりました。
guest

0

warning: (373) implicit signed to unsigned conversion

signedからunsignedに変換されたというワーニングです
こいつを出なくするには、明示的にunsignedでキャストします

ADread = (unsigned int)(ADRESL + (ADRESH*256));

unsigned char への代入も同様ですね

投稿2019/04/26 06:39

y_waiwai

総合スコア87747

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

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

0

256(0b100000000)の論理積

論理積(&)じゃないです。普通に256倍(8ビットシフト)してるだけです。

implicit signed to unsigned conversion

implicit(暗黙)
要するに明示的にキャストすれば黙ります。

投稿2019/04/26 06:36

ozwk

総合スコア13521

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問