Genau da brauche ich es 
Da ich aber mit digitalRead große Schwankungen in der Erkennung hatte muss ich das verwerfen. Wie hast nur du das geschafft???
Timing natürlich mit micros().
Und ISR Routinen laufen dann stabil im System, wenn sie KURZ laufen.
Das erreichst Du dadurch, dass sämtliche langlaufenden Aktionen NUR in der loop laufen, z.B. Auswertung von Funkprotokollen, aber nicht in der ISR!
Die ISR ermittelt die Länge der Impulse, dampft ggf. die Datenmenge ein, und speichert die Werte in einem Ringpuffer weg. Hinweis: Die Variablen des Ringpuffers müssen "volatile" deklariert werden, damit ein problemloser Zugriff auf korrekte Variablenbereiche sowohl von der ISR als auch von der loop aus möglich ist.
Beispielhafter Code für eine Interrupt-Behandlungsroutine zum Ermitteln von sowohl Low- als auch High-Impulsen, die Ringpuffer-Logik zum Wegspeichern der Daten muss dort eingefügt werden, wo die Kommentarzeilen stehen.
void rx433Handler()
{
static long rx433LineUp, rx433LineDown;
long LowVal, HighVal;
int rx433State = digitalRead(RX433DATAPIN); // current pin state
if (rx433State) // pin is now HIGH
{
rx433LineUp=micros(); // line went HIGH after being LOW at this time
LowVal=rx433LineUp - rx433LineDown; // calculate the LOW pulse time
// Hier ggf. viel zu kurze und viel zu lange Impulse verwerfen,
// sowie ggf. den LowVal ggf. auf int eindampfen (Speicherplatz!),
// oder ggf. auch direkt per Vergleich ermitteln, ob ein 1-Bit, 0-Bit oder Startbit empfangen wurde
// und den Wert zur Verarbeitung in der loop in einem Ringpuffer (volatile!) wegspeichern
}
else
{
rx433LineDown=micros(); // line went LOW after being HIGH
HighVal=rx433LineDown - rx433LineUp; // calculate the HIGH pulse time
// Hier ggf. viel zu kurze und viel zu lange Impulse verwerfen,
// sowie ggf. den HighVal ggf. auf int eindampfen (Speicherplatz!),
// oder ggf. auch direkt per Vergleich ermitteln, ob ein 1-Bit, 0-Bit oder Startbit empfangen wurde
// und den Wert zur Verarbeitung in der loop in einem Ringpuffer (volatile!) wegspeichern
}
}