Ach, sag doch gleich, daß Du das nur simuliert hast!
Nee, Jungs, richtige Tests macht man immer noch am besten auf
richtiger Hardware. ;-) Erst danach behaupten, daß es nicht
gehen würde...
Ja, ich denke schon, daß das volatile Dein Problem war, da
anonsten in der Hauptschleife die Variable c einfach nie
neu eingelesen wird. Sie wird einmal auf 0 gesetzt (das ist
der Initialwert, den sie standardmäßig hat -- da hilft auch
Deine erste Ausgabe auf das OCR-Register nichts, da es sofort
danach wieder mit 0 überschrieben wird) und dann innerhalb der
Schleife nie wieder neu gelesen, egal, was die UART-Interrupt-
Routine da empfangen hat.
»to toggle« heißt sowas wie ,,hin- und herschalten''. Also
genau das, was Du relativ umständlich mit Deinen if(...)
sbi/cbi gemacht hast, das kann man halt mit XOR (^) viel
einfacher erreichen. Bitweises Programmieren, wie man es bei
Controllern recht häufig braucht, ist in C etwas gewöhnungsbedürftig...
(das Löschen eines Bits mit &= ~... trifft das genauso).