Code:
      temperatur.temp=1623;   
      x.mag_x=1672122;  
      y.mag_y=1672312;  
      z.mag_z=1672312;
hier befüllst du in deinen unions die Double-Werte. Gut

In der timer-routine willst du sie schicken. in nehm als beispiel den ersten transmit-code, die anderen sind eigentlich genauso
Code:
void USART_Transmit()
{
    	while(!(UCSRA.5));     // warten, bis Buffer leer
     	temp1=temperatur.tempc[0];     // das erste byte des double
	UDR=temp1;                             // weg damit
    	while(!(UCSRA.5));     // wieder warten, bis Buffer leer
     	temp2=temperatur.tempc[1];     // das 2. byte des double
	UDR=temp2;                             // weg damit
    	while(!(UCSRA.5));     // wieder warten, bis Buffer leer
     	temp3=temperatur.tempc[2];     // das 3. byte des double
	UDR=temp3;                             // weg damit
    	while(!(UCSRA.5));     // wieder warten, bis Buffer leer
     	temp4=temperatur.tempc[3];     // das 4.  byte des double
	UDR=temp4;                             // weg damit
}
Da aber der Compiler bezahlt ist (nehm ich an), soll er was arbeiten. Das Gleiche, aber kompakter:

Code:
void USART_Transmit()
{
unsigned char i;
  for (i=0;i<4;i++)
  {
    	while(!(UCSRA.5));     
	UDR=temperatur.tempc[i];
  }
}
Verständlich ?