I2C communicatie


goeie dag allen.

ben momenteel een beetje aan het spelen met de i2c bus.

heb al het een en andere geprobeert wat prima werkte.

nu probeer ik door middel van een register aan tespreken. de button state van de slave tekrijgen.
de button state heb ik laten varen voor nu. en probeer de tekst yeah op de serial van de slave tekrijgen als alles werkt.
alleen lukt dat niet echt en zie niet echt wat ik fout doe.

ik krijg wel "a" en "b" op de serial. snap dus niet echt waar het mist gaat.
momenteel gebruik ik een pointer maar heb het ook met "return" geprobeert maar krijg het zelfde resultaat.

de state van de led terug sturen ging prima (allen de code mist)

master:
code: [select]
template<typename t> void send2(uint8_t adress, uint8_t reg, t val);

#include <wire.h>

uint32_t prevmillis;
uint8_t b;
uint32_t c = 1024;

void setup() {
  wire.begin(0);
  serial.begin(9600);
  //serial.settimeout(50);
}

void loop() {
  c++;
  if (millis() - prevmillis >= 1000) {
    prevmillis = millis();
    send2(1, 0, b = ~b); // led aan/uit op pro // return code al weg maar werkte prima.
    send2(1, 1, c); // counter op pro
    write2return8(1, 2); // spreek register aan om button state tekrijgen
  }
}


template<typename t> void send2(uint8_t adress, uint8_t reg, t val) {
  wire.begintransmission(adress);
  wire.write(reg);
  for (int8_t valsize = sizeof(val) - 1; valsize >= 0; valsize--) {
    wire.write(val >> valsize * 8);
  }
  wire.endtransmission();
}


uint8_t write2return8(uint8_t adress, uint8_t reg) {
  wire.begintransmission(adress);
  wire.write(reg);
  wire.endtransmission();
  wire.requestfrom(1, 1);
  while (wire.available()) {
    return  wire.read();
  }
}


slave:
code: [select]
template<typename t> void receive2 (uint8_t regin , uint8_t reg, uint8_t valsize, t& val);
#include <wire.h>

uint8_t led = 0;
uint32_t count;
uint8_t register2;
#define pin4 4
#define pin5 5
#define pin6 6
#define pin7 7

#define led13 13

void setup() {
  pinmode(led13, output);
  pinmode(pin4, input);
  pinmode(pin5, input);
  pinmode(pin6, input);
  pinmode(pin7, input);

  wire.begin(1);
  wire.onreceive(receiveevent);
  wire.onrequest(requestevent);
  serial.begin(9600);
}

void loop() {
  digitalwrite(led13, led);
  //serial.println(register2);
}

void receiveevent() {
  if (wire.available()) {
    uint8_t reg = wire.read();
    receive2(reg, 0, led);
    receive2(reg, 1, count);
    reg2(reg, 2, register2);
  }
}

void requestevent() {
  if (led == 0) {
    wire.write(0);
    serial.println("led uit");
  } else {
    wire.write(1);
    serial.println("led aan");
  }
  if (register2 == 0) {
    serial.println("yeah"); // zo dra register 2 == 0 print yeah maar werk niet! krijg wel en b in de serial.print
  }
}

template<typename t> void receive2 (uint8_t regin , uint8_t reg, t& val) {
  if (regin == reg) {
    for (uint8_t x = 0; x < sizeof(val); x++) {
      val = val << 8;
      val += wire.read();
    }
  }
}

uint8_t reg2(uint8_t regin, uint8_t reg, uint8_t& val) {
  if (regin == reg) {
    serial.println("a"); // print zodra regin == reg
    val = 1;
  } else {
    serial.println("b"); // print b zodra regin == reg
    val = 0;
  }
}

 en dit wat ik krijg op de serial port van de slave:
code: [select]
b
b
a
led aan
b
b
a
led uit
b
b
a
led aan

oke never mind tot zo ver. ik krijg nu dit op de serial.

code: [select]
b
a
led uit
yeah
b
b
a
led aan
yeah


ik heb dit verandert:
code: [select]
void reg2(uint8_t regin, uint8_t reg, uint8_t& val) {
  if (regin == reg) {
    serial.println("a"); // print zodra regin == reg
    val = 1; // <<<<
  } else {
    serial.println("b"); // print b zodra regin == reg
    val = 0; // <<<<
  }
}


naar

code: [select]
void reg2(uint8_t regin, uint8_t reg, uint8_t& val) {
  if (regin == reg) {
    serial.println("a"); // print zodra regin == reg
    val = 0; // <<<<
  } else {
    serial.println("b"); // print b zodra regin == reg
    val = 1; // <<<<
  }
}


alleen op de master krijg ik 0 en 1 om en om

code: [select]
1
0
1
0
1
0
1
0
1
0
1
0
1
0
1
0
1


en heb ik dit aangepast.
code: [select]
if (register2 == 0) {
    serial.println("yeah"); // zo dra register 2 == 0 print yeah maar werk niet! krijg wel en b in de serial.print
  }


naar

code: [select]
if (register2 == 0) {
    serial.println("yeah"); // zo dra register 2 == 0 print yeah maar werk niet! krijg wel en b in de serial.print
    wire.write(pin4state);
  }


uiteraard heb ik in de loop ook "pin4state = digitalread(pin4);" toegevoegt.

en master heeft nu dit

code: [select]
byte x = write2return8(1, 2); // spreek register aan om button state tekrijgen
    serial.println(x);


of toe wel nieuwe code ;-)

master:
code: [select]
template<typename t> void send2(uint8_t adress, uint8_t reg, t val);

#include <wire.h>

uint32_t prevmillis;
uint8_t b;
uint32_t c = 1024;

void setup() {
  wire.begin(0);
  serial.begin(9600);
  //serial.settimeout(50);
}

void loop() {
  c++;
  if (millis() - prevmillis >= 1000) {
    prevmillis = millis();
    send2(1, 0, b = ~b); // led aan/uit op pro // return code al weg maar werkte prima.
    send2(1, 1, c); // counter op pro
    byte x = write2return8(1, 2); // spreek register aan om button state tekrijgen
    serial.println(x);
  }
}


template<typename t> void send2(uint8_t adress, uint8_t reg, t val) {
  wire.begintransmission(adress);
  wire.write(reg);
  (int8_t valsize = sizeof(val) - 1; valsize >= 0; valsize--) {
    wire.write(val >> valsize * 8);
  }
  wire.endtransmission();
}


uint8_t write2return8(uint8_t adress, uint8_t reg) {
  wire.begintransmission(adress);
  wire.write(reg);
  wire.endtransmission();
  wire.requestfrom(1, 1);
  while (wire.available()) {
    return  wire.read();
  }
}


slave:
code: [select]
template<typename t> void receive2 (uint8_t regin , uint8_t reg, uint8_t valsize, t& val);
#include <wire.h>

uint8_t led = 0;
uint32_t count;
uint8_t register2;
#define pin4 4
#define pin5 5
#define pin6 6
#define pin7 7

uint8_t pin4state;

#define led13 13

void setup() {
  pinmode(led13, output);
  pinmode(pin4, input);
  pinmode(pin5, input);
  pinmode(pin6, input);
  pinmode(pin7, input);

  wire.begin(1);
  wire.onreceive(receiveevent);
  wire.onrequest(requestevent);
  serial.begin(9600);
}

void loop() {
  digitalwrite(led13, led);
  //serial.println(register2);
  pin4state = digitalread(pin4);
  serial.println(pin4state);
}

void receiveevent() {
  if (wire.available()) {
    uint8_t reg = wire.read();
    receive2(reg, 0, led);
    receive2(reg, 1, count);
    reg2(reg, 2, register2);
  }
}

void requestevent() {
  if (led == 0) {
    wire.write(0);
    serial.println("led uit");
  } else {
    wire.write(1);
    serial.println("led aan");
  }
  if (register2 == 0) {
    serial.println("yeah"); // zo dra register 2 == 0 print yeah maar werk niet! krijg wel en b in de serial.print
    wire.write(pin4state);
  }
}

template<typename t> void receive2 (uint8_t regin , uint8_t reg, t& val) {
  if (regin == reg) {
    (uint8_t x = 0; x < sizeof(val); x++) {
      val = val << 8;
      val += wire.read();
    }
  }
}

void reg2(uint8_t regin, uint8_t reg, uint8_t& val) {
  if (regin == reg) {
    serial.println("a"); // print zodra regin == reg
    val = 0;
  } else {
    serial.println("b"); // print b zodra regin == reg
    val = 1;
  }
}


Arduino Forum > International > Nederlands (Moderators: Jantje, JO3RI) > I2C communicatie


arduino

Comments

Popular posts from this blog

DHT11 Time out error using v0.4.1library

Sketch upload fails with Java error (___REMOVE___/bin/avrdude)!

Arduino Uno + KTY81/210 temperature sensor