Vielen Dank

typedef hab ich einfach falsch im Wiki verstanden aber nu klappts. Bitfelder kannte ich bis jetzt einfach nicht da ich sie noch nicht verwenden musste. Bis jetzt immer Arrays verwendet die mir hier auch sinnvoller erscheinen.

Wie will man denn was neues lernen ausser durch LearningByDoing? Wenn ich ein Buch gelesen habe werd ichs auch nicht gleich perfekt können. Der Code der bis jetzt steht funktioniert ja einwandfrei (vlt nicht besonders schön und gecodet aber funktioniert) und ist auch nur durch LerningByDoing entstanden.

Die Werte in struct_s.weather schreiben hab ich nun hinbekommen. Hab vergessen das die Werte dabei ja rechts mit dem LSB anfangen
Ist die Methode so i.O oder gibt es schönere um die Werte in die Struktur zu übernehmen?

Code:
#include "avr/io.h"
#include "function.h"
#include <avr/interrupt.h>

volatile uint16_t dcf_time = 0;			//Zählvariable DCF Pausen
uint8_t dcf_before = 1;					//DCF Signal zuvor
uint8_t dcf_flag = 0;					//DCF Signal aktuell
uint8_t dcf_ctr = 0;					//DCF Bitzähler
char dcf[60];							//Codiertes DCF Signal 59 bit
int temp;
int temp2[15];

struct
{
	int weather:15;
}dcf_s;

int main (void)
{

	//Port Konfiguration DCF77 Empfänger

	dcf_ddr &= ~(1<<dcf_bit);      //PinX als Eingang definieren
	dcf_port |= (1<<dcf_bit);      //Pullup Widerstand für diesen Pin aktivieren
	   


	//Debug Konfiguration, LED1, LED2


	DDRC |= (1<<0) | (1<<1);      //Bit0 PortC Ausgang
	PORTC |= (1<<0) | (1<<1);      //Led an PortC aus   

	//Timer 1 starten, Globale Interrups aktivieren
	init_timer();
	//USART initialisieren
	init_USART();

	/*###############################################
	#                                 			   #
	#   Hauptprogramm                 		       #
	#                                 			   #
	################################################*/
	while(1)
	{
    
		//##################### DEBUG ### LED1 zeigt DCF77 Signal#####################
		if (dcf_pin & (1<<dcf_bit))
			PORTC |= (1<<0);                     // Ausführen wenn HIGH
		else
			PORTC &= ~(1<<0);                     // Ausführen wenn LOW
	}
return 0; 
}





//Portzustand DCF77 einlesen und in dcf_flag schreiben
int get_dcf_bit()
{
	if (dcf_pin & (1<<dcf_bit))
	{
		dcf_flag = 1;

	}else{
		dcf_flag = 0;
	}
return(dcf_flag); 
}
   
SIGNAL (SIG_OUTPUT_COMPARE1A)
{
	PORTC ^= (1<<1);      //DEBUG Zeige Frequenz vom Timer-Interrupt an LED2
	get_dcf_bit();         //Pegel vom DCF Signal einlesen und in dcf_flag speichern
   
	if(dcf_flag == 1)      //Wenn DCF Signal HIGH > Zeit messen
	{
		if(dcf_flag == dcf_before)      //Führe aus, wenn sich Pegel nicht geändert hat
		{      
			dcf_time += 20;            //Zeit +20ms
		}else{                   //Führe aus bei Pegeländerung
			if(dcf_time > 770 && dcf_time < 830)		//Erkenne Pause von 800 ms = logisch 1
			{
				if(dcf_ctr <= 14)
				{
					dcf_s.weather |= (1<<dcf_ctr);
				}
				dcf[dcf_ctr] = '1';
				dcf_ctr++;
			}
			if(dcf_time > 870 && dcf_time < 930)		//Erkenne Pause von 900 ms = logisch 0
			{
				if(dcf_ctr <= 14)
				{
					dcf_s.weather &= ~(1<<dcf_ctr);
				}
				dcf[dcf_ctr] = '0';
				dcf_ctr++;
			}
			if(dcf_time > 1770 && dcf_time < 1830)		//Erkenne Pause von 1800 ms = logisch 1, Ende der Übertragung
			{
				if(dcf_ctr <= 14)
				{
					dcf_s.weather |= (1<<dcf_ctr);
				}
				dcf[dcf_ctr] = '1';
				temp = dcf_s.weather;
				itoa(temp,temp2,2);
				//sendUSART(dcf);
				//sendUSART("\r\n");
				sendUSART("Wetter: ");
				sendUSART(temp2);
				sendUSART("\r\n");
				dcf_ctr = 0;
			}
			if(dcf_time > 1870 && dcf_time < 1930)			//Erkenne Pause von 1900 ms = logisch 0, Ende der Übertragung
			{
				if(dcf_ctr <= 14)
				{
					dcf_s.weather &= ~(1<<dcf_ctr);
				}
				dcf[dcf_ctr] = '0';
				temp = dcf_s.weather;
				itoa(temp,temp2,2);
				//sendUSART(dcf);
				//sendUSART("\r\n");
				sendUSART("Wetter: ");
				sendUSART(temp2);
				sendUSART("\r\n");
				dcf_ctr = 0;
			}
			dcf_time = 0;            //Zeitvariable zurücksetzen
		}
	}
dcf_before = dcf_flag;            //Alten Pegel in der Variable dcf_before speichern
}