Weird overflow behavior of character type variable
I think it all boils down to:

 if(fiftymicros-data_time&gt;3)
 {
   data_time=fiftymicros;
   PORTC.F1=~PORTC.F1;
 }


I don't know how that compiler handles the &gt;3, but it may be performing a signed comparison.  So, here's the scenario:
Assume fiftymicros just incremented to 255, and data_time is 251 (these numbers could be slightly smaller and the result would be the same).  The if would be true so data_time would be set to 255.  Then interrupt() increments fiftymicros, which causes it to roll over to 0 (because fiftymicros is an unsigned char).  Now, all future calculations fiftymicros-data_time will result in a negative (signed) number, which will always be less than 3.

A simple solution would be:

 if(fiftymicros&gt;3)
 {
   fiftymicros=0;
   PORTC.F1=~PORTC.F1;
 }


If you still want data_time for other reasons, then add data_time+=fiftymicros; before fiftymicros=0;.