Hi inka,

nicht schlecht.
Das kann so klappen, wobei ich die Änderungen nicht im Detail angesehen habe.

Die 4 in Register 30 ist ok:
Wenn kein IR-Signal anliegt, hat der Empfänger High-Pegel, daher ist deine Variable pb2_value binär = 0b00000100 (dezimal 4), das heißt, dass PINB2 (also Bit 2) gesetzt ist.
Wenn ein IR-Signal anliegt, ist das Bit nicht gesetzt, also Register 30 = 0.


Noch 2 Ideen/Vorschläge zu deiner tollen Umsetzung:

1. Mit pb2_value = (PINB & (1<<PINB2)); aktualisierst du den Wert bei jedem Durchlauf der Hauptschleife im Slave. Das kann man machen,- von der Programmstruktur her gehört das aber eher ans Ende der Funktion task_update().
Das Ergebnis ist dasselbe, aber das ganze "sauberer".

2. Grundsätzlich kann man das machen, dass man ein weiteres Register ergänzt. Es gibt noch einen weiteren Weg: Im Status-Byte (Register 1) sind noch Bits frei. Man könnte da ein weiteres Bit definieren:
Code:
// Some status bits with current settings and other things.
union {
     uint8_t byte;
    struct {
        uint8_t powerOn:1;
        uint8_t ACSactive:1;
        uint8_t watchDogTimer:1;
        uint8_t wdtRequest:1;
        uint8_t wdtRequestEnable:1;
        uint8_t IRreception:1;
        uint8_t unused:2;
    };
} status;
... und auch im Master auswerten. Das muss man aber nicht so machen.

Im Grunde zeigst du ja mit deiner Lösung, wie man den Base-Slave um eigene (Lese-)Funktionen erweitern kann. Klasse!
Genauso kann man auch zusätzliche Befehle definieren.