DCF77 Funksignal auslesen
Hallo,
ich hab mir jetzt mal den DCF-Empfängerbusatz von Conrad zugelegt und versuche nun, mit dessen Hilfe zunächst einmal nur die einzelnen Bits des DCF-Signals einzulesen und über die serielle Schnittstelle auszugeben. Ich glaube ich mache beim einlesen nur ein paar Fehler oder aber ich habe den Wikipedia Artikel zum DCF-Signal etwas falsch interpretiert.
Hier erstmal mein Code:
Code:
#include <avr/io.h>
#define BAUD 9600UL
#include "../classes/rs232/UART/UART.h"
#include "../classes/time/time.h"
int main(void)
{
uint8_t i=0;
uint8_t c=0;
char dcf[60];
dcf[0]='\0';
DDRC&=~(1<<PC0); //EINGANG PC0
PORTC|=(1<<PC0); //PULLUP aktivieren
uart_init();
while(1)
{
if(i<=59)
{
while(!(PINC & (1<<PC0))) //wenn Signal (LOW) kommt
{
wait_msec(1);
c++;
}
if(c<=100) //100msec == 0
{
dcf[i]='0';
}
if(c<=200 && c>100) //200msec == 1
{
dcf[i]='1';
}
c=0;
i++;
}
else
{
dcf[i]='\0';
send(dcf);
i=0;
}
}
return 0;
}
Wikipedia habe ich so verstanden, dass wenn 100millisekunden ein LOW-Signal kommt, eine binärische 0 gesendet wird und ab 200millisekunden eine 1. Mein Problem ist nur, dass wenn ich das ganze laufen lasse fast immer die erste Stelle eine 1 ist und alle anderen Stellen eine 0. Was genau mache ich falsch? Kann mir bitte jemand sagen, wie man sowas am Besten machen könnte.
Gruß
cesupa
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
ich hab da mal was zusammengeschustert, leider funktionierts noch nicht ganz ordentlich. Erstmal wollte ich mir nur die Minuten ausgeben lassen, aber meistens erhalte ich da Werte um die 80 :-k Wenn ich mir die gemessenen Zeitabstände ausgeben lasse kommen da auch Werte zwischen 890 und 1100 raus, dabei müsste es doch so um die 800 und 900 rum liegen, oder? Jedenfalls haben auch ein paar Variationen nicht zum gewünschten Ergebnis geführt, eine korrekte Minutenanzeige hab ich bisher bloß 1, 2 mal hinbekommen. Ich glaube mal, dass mit meinem selbstgeschriebenen Timer was nicht stimmt, könnte einer von euch da mal einen Blick drüber werfen? Ich mach das ganze mit dem 8-Bit-Timer vom Atmega8 bei 16MHz, mit einem Interrupt, der jede ms ausgeführt werden soll, wird ein counter hochgezählt, der dann für die Messung des DCF-Signals verwendet wird. Wahrscheinlich läuft der counter nicht ordentlich...
Gruß
cesupa