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:
slave:
en dit wat ik krijg op de serial port van de slave:
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.
ik heb dit verandert:
naar
alleen op de master krijg ik 0 en 1 om en om
en heb ik dit aangepast.
naar
uiteraard heb ik in de loop ook "pin4state = digitalread(pin4);" toegevoegt.
en master heeft nu dit
of toe wel nieuwe code ;-)
master:
slave:
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
Post a Comment