Hallo,

bin auch noch Anfänger und versuche gerade das DCF Signal zu verarbeiten. Ich Frage den Portzustand über einen Interrupt alle 20ms ab. Das erkennen der Pausen 800/900/1800/1900 klappt soweit auch sehr gut. Bekomme immer Werte +- 20 ms per RS232 am PC angezeigt.

Wie ich jetzt die Pausenlänge den 0/1en zuordnen soll usw. versteh ich jetzt aber net. Hab schon bissl was probiert aber nichts hat geklappt. Per if im Hauptprogramm mit <= und >= Abfragen hat das nicht geklappt. Wäre sehr nett wenn ihr mir da einen Tipp geben könntet und euch mal das Programm bis jetzt anschaut.

Lässt sich bestimmt einiges noch verbessern aber bin schonmal ganz glücklich das die richtigen Pausen erkannt werden ^^

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

volatile uint16_t dcf_time = 0;
uint8_t dcf_before = 1;
uint8_t dcf_flag = 0;
char dcf_t[4];


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
			itoa(dcf_time, dcf_t, 10);	
			sendUSART(dcf_t);
			sendUSART(" \r\n");
			dcf_time = 0;				//Zeitvariable zurücksetzen
		}
	}

	dcf_before = dcf_flag;				//Alten Pegel in der Variable dcf_before speichern
}
Hier mal ein Ausschnitt vom PC und den Zeiten
Code:
800 
920 
800 
880 
900 
900 
800 
900 
780 
900 
800 
880 
900 
880 
900 
880 
800 
880 
800 
800 
900 
900 
900 
920 
880 
800 
900 
900 
900 
900 
1900 
900 
800 
800 
880 
880
lg
Wasserkäfer