Wenn Du in einem Register, das nur Interrupt-Flags enthält (TIFR,
GIFR...) ein Bit löschen willst (und das ginge sowieso nicht mit cbi,
selbst dann, wenn das Register im bitadressierbaren Bereich läge, da ein
Interrupt-Flag gelöscht wird, indem man eine eins hineinschreibt),
dann schreib einfach die Bitmaske, in der die zu löschenden Bits '1'
sind, mit out in das Register! Also wenn Du z.B. das OCF0 löschen
willst, dann einfach mit
ldi r16, (1 << OCF0)
out TIFR, r16
Da das Schreiben einer '0' sowieso keinen Effekt hat, funktioniert
das ganz hervorragend. Und in solchen Fällen: Finger weg von 'in ->
ori -> out'! Damit löschst Du alle Flags im Register, die zum
Zeitpunkt des Einlesens (in) gesetzt waren! Immer eine direkte
Zuweisung benutzen. Das gilt auch in C (also kein '|=' sondern ein
'=').
Im Datenblatt der AVRs steht übrigens auch noch, dass sbi und cbi
alle Bits im betreffenden Register betreffen! Wenn Du in einem
Register, das bitadressierbar ist und das gleichzeitig Interrupt-Flags
enthält (also z.B. ADCSR(A)) ein Bit mit sbi setzt, löschst Du
gleichzeitig alle Interrupt-Flags in diesem Register (also im Beispiel
das ADIF)!