PICを使い始めた初心者です。
現在、LM35を使用した温度センサーを作製しております。
最終目標は下記のデバイスを作製することです。
・LM35で1分ごとに温度データを測定
・読み取ったデータを温度に変換し、PIC(18F27Q84)に外付けしたEEPROM(24LC256)に保存
・温度データがEEPROMにある程度蓄積したところで、PCにUART接続し、モニターにデータを出力
現在、回路を作り、プログラムを作成しているところです。
まず初めに動作確認のため、温度を測定し、EEPROMへ保存、その保存したデータを即座にPCに出力できるよう下記のプログラムを作成しました。開発環境はMPLAB(v5.50)で、MCCを使用しております。
C
1#include "mcc_generated_files/mcc.h" 2#include <stdio.h> 3unsigned int adrs; 4unsigned int tempValue, temperature; 5 6void main(void) 7{ 8 SYSTEM_Initialize(); 9 10 while (1) 11 { 12 for(adrs = 0; adrs < 32767; adrs++){ 13 tempValue = ADC_GetSingleConversion(RA0); //LM35 is connected to RA) pin 14 temperature = (tempValue * 5 / 4096) * 100; //10bit ADC 15 I2C1_WriteNBytes(adrs, temperature, 1); 16 I2C1_ReadNBytes(adrs); 17 __delay_ms(60000); 18 } 19 } 20}
また、MCCで作成されたADCおよびI2Cに関するコードは下記のとおりです。
c
1adc_result_t ADC_GetSingleConversion(ADC_channel_t channel) 2{ 3 //Select the A/D channel 4 ADPCH = channel; 5 6 //Turn ON the ADC module 7 ADCON0bits.ON = 1; 8 9 //Disable the continuous mode 10 ADCON0bits.CONT = 0; 11 12 //Start the conversion 13 ADCON0bits.GO = 1; 14 15 //Wait for the conversion to finish 16 while(ADCON0bits.GO) 17 { 18 19 } 20 21 return ((adc_result_t) ((ADRESH << 8) + ADRESL)); 22} 23 24void I2C1_WriteNBytes(i2c1_address_t address, uint8_t* data, size_t len) 25{ 26 while(!I2C1_Open(address)); // sit here until we get the bus.. 27 I2C1_SetBuffer(data,len); 28 I2C1_SetAddressNackCallback(NULL,NULL); //NACK polling? 29 I2C1_MasterWrite(); 30 while(I2C1_BUSY == I2C1_Close()); // sit here until finished. 31} 32 33void I2C1_ReadNBytes(i2c1_address_t address, uint8_t *data, size_t len) 34{ 35 while(!I2C1_Open(address)); // sit here until we get the bus.. 36 I2C1_SetBuffer(data,len); 37 I2C1_MasterRead(); 38 while(I2C1_BUSY == I2C1_Close()); // sit here until finished. 39}
このコードをPICに書き込もうとしたところ、下記のエラーがでました。
error: (1098) conflicting declarations for variable "_I2C1_WriteNBytes" (mcc_generated_files/examples/i2c1_master_example.c:111)
このエラーは一つの関数に対して複数の定義を与えると発生するようですが、私のケースになぜ当てはまるのかわかりませんでした。
外付けEEPROMの記事をネットで探したのですが、MCCを使用しているものが見当たりませんでしたので、解決方法がわからず、こちらに投稿させていただいた次第です。
また、EEPROMへの書き込みかた、読み込み方についても、もしかしたら全く見当違いのコードになっているという懸念もございます。私の認識では、EEPROMのアドレスの一つに、一つの温度データを格納し、次のアドレスへ移動、そこに同じように温度データを格納していくことを繰り返すイメージを持っておりますが、もし間違っておりましたら、こちらもアドバイスいただきたく存じます。
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/01/27 17:55
2022/01/28 22:38