#define PIN_MOSFET 4 #define PWM_MAX 255 char rcv; char cmd; char s_enable = false; char s_endstop = false; int s_level = 0; void setup() { // disable prescaler TCA0.SPLIT.CTRLA = TCA_SINGLE_ENABLE_bm; pinMode(PIN_MOSFET, OUTPUT); digitalWrite(PIN_MOSFET, LOW); delay(500); Serial.begin(250000); // initial flush while (Serial.available()) { Serial.read(); } } void loop() { char cmd; char snd; if (Serial.available()) { rcv = Serial.read(); cmd = rcv & 0b11; if (cmd != 0b00) { if (cmd == 0b11) { s_enable = !s_enable; } else { s_level += cmd & 0b01 ? 1 : -1; s_level = min(max(s_level, 0), PWM_MAX); s_endstop = s_level == PWM_MAX; } if (s_enable) { analogWrite(PIN_MOSFET, s_level); } else { digitalWrite(PIN_MOSFET, 0); } } snd = ((rcv >> 2) & 0b00111111) | (s_endstop << 6) | (s_enable << 7); Serial.write(snd); } }