[戻る]
過去ログ [ 0001 ]
過去ログ:     ワード検索: 条件: 表示:

タイトル
記事No
投稿日
投稿者
参照先
PICとArduinoのI2C通信
320
: 15/08/23-17:04
コッペパン

初めて投稿させて頂きます。
1年程前にPICを買いましたが、それからあんまり触らずに放置していました。

今回、初めて、I2C通信をやってみようと思い、Arduinoをマスタpic12f1822をスレーブとした、マスタ受信のプログラムを書いてみました。
プログラムは、picから受け取った値(今回は0x55で固定)をArduinoがパソコンに表示する、というものにしたかったのですが、パソコンには22と0が交互に表示されるだけで55に関わる文字は全く出てきません。また、picから送られる値を0x55から0x34などにしても、同じく、22と0しか返って来ません。
プログラムは下に載せておきます。

僕は今回のミスは、

1、電子工作の実験室にも書いてあった、アドレスの受信というのはハードが自動で行ってくれるものだ、と思ってアドレス受信のプログラムを書かなかった事。

2、picが送信しかしないので、受信の時のプログラムを書かなかったこと。

3、その他

のどれかだと思っています。
1の時は、そのプログラム例を教えて頂けると嬉しいです。

物分かりもそんなに良くないので、何度も質問するかもしれませんが、アドバイスをお願いします。


**pic12f1822(スレーブ)プログラム**
#include<xc.h>
#include<pic12f1822.h>

#define _XTAL_FREQ 8000000

// CONFIG1
#pragma config FOSC = INTOSC // Oscillator Selection (INTOSC oscillator: I/O function on CLKIN pin)
#pragma config WDTE = OFF // Watchdog Timer Enable (WDT enabled)
#pragma config PWRTE = OFF // Power-up Timer Enable (PWRT enabled)
#pragma config MCLRE = ON // MCLR Pin Function Select (MCLR/VPP pin function is digital input)
#pragma config CP = OFF // Flash Program Memory Code Protection (Program memory code protection is disabled)
#pragma config CPD = OFF // Data Memory Code Protection (Data memory code protection is disabled)
#pragma config BOREN = OFF // Brown-out Reset Enable (Brown-out Reset enabled)
#pragma config CLKOUTEN = OFF // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)
#pragma config IESO = OFF // Internal/External Switchover (Internal/External Switchover mode is enabled)
#pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is enabled)

// CONFIG2
#pragma config WRT = OFF // Flash Memory Self-Write Protection (Write protection off)
#pragma config PLLEN = ON // PLL Enable (4x PLL enabled)
#pragma config STVREN = ON // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset)
#pragma config BORV = LO // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.)
#pragma config LVP = ON // Low-Voltage Programming Enable (Low-voltage programming enabled)O_OFF & FCMEN_OFF) ;

void InitI2C_Slave(int addres) ;
interrupt void I2C_write();


void main (void)
{
    OSCCON = 0b01110010 ; // 内部クロックは8MHzとする
    ANSELA = 0b00000000 ; // アナログ使用しない(すべてデジタルI/Oに割当てる)
    TRISA = 0b00001110 ; // ピンはRA1(SCL)/RA2(SDA)のみ入力(RA3は入力専用)
    PORTA = 0b00000000 ; // 出力ピンの初期化(全てLOWにする)

InitI2C_Slave(8);  // スレーブモードでの初期化、マイアドレスは8とする
while(1){
}
}

interrupt void I2C_write(void){
if(R_nW == 1){
SSPBUF = 0x55; //送信データセット
CKP = 1; //クロックを有功にする
SSP1IF = 0; //割り込みフラグピットクリア
}
while(!SSPSTATbits.P);  //ストップピット検出
}

void InitI2C_Slave(int address)
{
SSP1STAT= 0b10000000 ; // 標準速度モードに設定する(100kHz)
SSP1CON1= 0b00100110 ; // SDA/SCLピンはI2Cで使用し、スレーブモードとする
SSP1CON2bits.SEN = 1; // SCL制御(クロックストレッチ)を行う
SSP1ADD = address<<1 ; // マイアドレスの設定
SSP1MSK = 0b11111110 ; // アドレス比較用マスクデータ
SSP1IE = 1 ; // SSP(I2C)割り込みを許可する
BCL1IE = 1 ; // MSSP(I2C)バス衝突割り込みを許可する
PEIE = 1 ; // 周辺装置割り込みを許可する
GIE = 1 ; // 全割り込み処理を許可する
SSP1IF = 0 ; // SSP(I2C)割り込みフラグをクリアする
BCL1IF = 0 ; // MSSP(I2C)バス衝突割り込みフラグをクリアする
}

**Arduino(マスタ)プログラム**

#include <Wire.h>

#define I2C_READ_LENGTH 1
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
Wire.begin();
}

void loop() {
// put your main code here, to run repeatedly:
Wire.requestFrom(8,I2C_READ_LENGTH);
char i2cBuf[I2C_READ_LENGTH];

for(int i=0; i<I2C_READ_LENGTH; i++){
i2cBuf[i]=Wire.read();
Serial.println(i2cBuf[i],HEX);
}
delay(500);
}
▲pagetop

- WebForum -