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
Lesezeichen