ES ordening
This commit is contained in:
@@ -0,0 +1,60 @@
|
||||
#include <Arduino.h>
|
||||
#include <Wire.h>
|
||||
|
||||
#define DEVICE_ADDRESS 0x50
|
||||
|
||||
// Virtual hardware registers
|
||||
uint8_t reg_INA = 0;
|
||||
uint8_t reg_INB = 0;
|
||||
uint8_t reg_pointer = 0; // acts as address register for reads
|
||||
|
||||
|
||||
|
||||
// Called when master writes data
|
||||
void receiveEvent(int howMany) {
|
||||
if (howMany < 1) return;
|
||||
|
||||
// First byte is always register address
|
||||
reg_pointer = Wire.read();
|
||||
howMany--;
|
||||
|
||||
if (howMany == 1) {
|
||||
// Second byte is data to write
|
||||
uint8_t value = Wire.read();
|
||||
if (reg_pointer == 0x21) {
|
||||
reg_INA = value;
|
||||
Serial.println("INA set");
|
||||
} else if (reg_pointer == 0x22) {
|
||||
reg_INB = value;
|
||||
Serial.println("INB set");
|
||||
} else {
|
||||
// Writes to read-only registers are ignored
|
||||
Serial.println("Write to read-only register ignored");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Called when master reads data
|
||||
void requestEvent() {
|
||||
uint8_t value = 0;
|
||||
|
||||
switch (reg_pointer) {
|
||||
case 0x21: value = reg_INA; break;
|
||||
case 0x22: value = reg_INB; break;
|
||||
case 0x23: value = min(reg_INA, reg_INB); break;
|
||||
case 0x24: value = max(reg_INA, reg_INB); break;
|
||||
default: value = 0xFF; break; // undefined register
|
||||
}
|
||||
|
||||
Wire.write(value);
|
||||
}
|
||||
|
||||
void setup() {
|
||||
Wire.begin(DEVICE_ADDRESS);
|
||||
Wire.onReceive(receiveEvent);
|
||||
Wire.onRequest(requestEvent);
|
||||
Serial.begin(9600);
|
||||
}
|
||||
|
||||
void loop() {
|
||||
}
|
||||
@@ -0,0 +1,65 @@
|
||||
#include <Arduino.h>
|
||||
#include <Wire.h>
|
||||
|
||||
#define SLAVE_ADDRESS 0x77
|
||||
|
||||
uint8_t registers[256] = {0}; // Simuleer registermap
|
||||
uint8_t regAddr = 0; // Registeradres voor read/write
|
||||
|
||||
void setup() {
|
||||
Wire.begin(SLAVE_ADDRESS);
|
||||
Wire.onReceive(receiveEvent);
|
||||
Wire.onRequest(requestEvent);
|
||||
Serial.begin(9600);
|
||||
Serial.println("Slave ready.");
|
||||
}
|
||||
|
||||
void loop() {
|
||||
}
|
||||
|
||||
// Ontvangen van master (write)
|
||||
void receiveEvent(int howMany) {
|
||||
if (howMany < 1) return;
|
||||
|
||||
regAddr = Wire.read(); // Eerste byte is altijd registeradres
|
||||
|
||||
if (howMany > 1) {
|
||||
// Daarna komen data bytes
|
||||
int bytesToRead = howMany - 1;
|
||||
for (int i = 0; i < bytesToRead; i++) {
|
||||
if (Wire.available()) {
|
||||
uint8_t val = Wire.read();
|
||||
registers[regAddr + i] = val;
|
||||
Serial.print("Reg ");
|
||||
Serial.print(regAddr + i);
|
||||
Serial.print(" written with ");
|
||||
Serial.println(val);
|
||||
}
|
||||
}
|
||||
|
||||
// Update min/max registers als 0x21 of 0x22 is gewijzigd
|
||||
if (regAddr == 0x21 || regAddr == 0x22) {
|
||||
uint8_t a = registers[0x21];
|
||||
uint8_t b = registers[0x22];
|
||||
registers[0x23] = (a < b) ? a : b; // MIN
|
||||
registers[0x24] = (a > b) ? a : b; // MAX
|
||||
|
||||
Serial.print("Updated MIN (0x23): ");
|
||||
Serial.println(registers[0x23]);
|
||||
Serial.print("Updated MAX (0x24): ");
|
||||
Serial.println(registers[0x24]);
|
||||
}
|
||||
}
|
||||
// else alleen registeradres ontvangen, niks schrijven (read setup)
|
||||
}
|
||||
|
||||
// Master vraagt data op (read)
|
||||
void requestEvent() {
|
||||
uint8_t val = registers[regAddr];
|
||||
Wire.write(val);
|
||||
|
||||
Serial.print("Sent reg ");
|
||||
Serial.print(regAddr, HEX);
|
||||
Serial.print(": ");
|
||||
Serial.println(val);
|
||||
}
|
||||
Reference in New Issue
Block a user